var AEUX = (function () { /// this is the publicObject for the script var JSON;JSON||(JSON={}); (function(){function k(a){return a<10?"0"+a:a}function o(a){p.lastIndex=0;return p.test(a)?'"'+a.replace(p,function(a){var c=r[a];return typeof c==="string"?c:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+a+'"'}function l(a,j){var c,d,h,m,g=e,f,b=j[a];b&&typeof b==="object"&&typeof b.toJSON==="function"&&(b=b.toJSON(a));typeof i==="function"&&(b=i.call(j,a,b));switch(typeof b){case "string":return o(b);case "number":return isFinite(b)?String(b):"null";case "boolean":case "null":return String(b);case "object":if(!b)return"null"; e+=n;f=[];if(Object.prototype.toString.apply(b)==="[object Array]"){m=b.length;for(c=0;c 0) { /// get the top stroke in the list var stroke = layer.stroke[0]; /// add stroke if enabled in Sketch textDoc.applyStroke = (stroke.enabled === 1); /// set stroke color textDoc.strokeColor = [stroke.color[0], stroke.color[1], stroke.color[2]]; /// set stroke width textDoc.strokeWidth = (stroke.width > 0) ? stroke.width : 0; //// if stroke fill is less than 100% opacity it needs a text animator if (stroke.opacity < 100) { // add a text animator var textOpacity = r('ADBE Text Properties')(4).addProperty('ADBE Text Animator'); // name it Text Opacity textOpacity.name = 'Text Opacity'; // add an opacity value var strokeOpacity = textOpacity('ADBE Text Animator Properties').addProperty('ADBE Text Stroke Opacity'); // set the opacity value strokeOpacity.setValue(stroke.opacity); } } } function setTextTracking() { /// if the tracking is larger than 1000 it needs a text animator if (layer.trackingAdjusted >= 1000 || layer.trackingAdjusted <= -1000) { var textTracking = r('ADBE Text Properties')(4).addProperty('ADBE Text Animator'); textTracking.name = 'Text tracking'; textTracking('ADBE Text Animator Properties').addProperty('ADBE Text Tracking Amount'); textTracking('ADBE Text Animator Properties')('ADBE Text Tracking Amount').setValue(layer.tracking); } else { /// can be set with text options textDoc.tracking = Math.floor(layer.trackingAdjusted); } } function paragraphJustification(num) { var paraStyle; switch (num) { case 1: paraStyle = ParagraphJustification.RIGHT_JUSTIFY; justificationOffset = layer.frame.width; break; case 2: paraStyle = ParagraphJustification.CENTER_JUSTIFY; justificationOffset = layer.frame.width/2; break; case 3: paraStyle = ParagraphJustification.FULL_JUSTIFY_LASTLINE_FULL; justificationOffset = layer.frame.width/2; break; default: paraStyle = ParagraphJustification.LEFT_JUSTIFY; } return paraStyle; } } //// group function aeGroup(layer, opt_parent) { /// if auto-precomp is enabled if (prefs.precompGroups || layer.type == 'Component') { // skip if an empty group if (layer.layers.length < 1) { return; } // find or create Groups folder groupFolder = createNamedFolder('Groups'); // create new comp var groupComp = app.project.items.addComp( nameInc(layer.name, app.project.items), Math.max(Math.round(layer.frame.width * compMult), 4), // x size Math.max(Math.round(layer.frame.height * compMult), 4), // y size 1, thisComp.duration, 60); // pixelAspect=1, duration=60sec, frameRate=60fps groupComp.bgColor = thisComp.bgColor; // set the bgColor groupComp.parentFolder = groupFolder; // move this to the groups folder var r = thisComp.layers.add(groupComp, thisComp.duration); // add to the main comp // temporarily switch thisComp var to the group precomp var mainComp = thisComp; thisComp = groupComp; // build layers within group filterTypes(layer.layers); // switch back to main comp thisComp = mainComp; // set transforms r.collapseTransformation = true; r('ADBE Transform Group')('ADBE Position').setValue( [(layer.frame.x + layer.frame.width/2) * compMult, (layer.frame.y + layer.frame.height/2) * compMult] ); // set position r('ADBE Transform Group')('ADBE Scale').setValue(layer.flip); // set scale r('ADBE Transform Group')('ADBE Rotate Z').setValue( layer.rotation ); r('ADBE Transform Group')('ADBE Opacity').setValue(layer.opacity); r.enabled = layer.isVisible; setMask(r, layer); addDropShadow(r, layer); addBlur(r, layer); addInnerShadow(r, layer); /// auto-precomp disabled - build layers in the main comp and parent to a controller layer } else { // skip if an empty group if (layer.layers.length < 1) { return; } // create a new empty shape layer var r = thisComp.layers.addShape(); // set it as a guide layer r.guideLayer = true; // layer name r.name = nameInc(layer.name, thisComp.layers); // increment label color labelColor = labelColor % 16 + 1; r.label = labelColor; // set the layer to shy r.shy = true; /// if the group layer has a parent if (opt_parent !== null) { // set the parent r.parent = opt_parent; // move the layer after the parent r.moveAfter(opt_parent); } // create a shape layer group r(2).addProperty('ADBE Vector Group'); r(2)(1).name = layer.name; // create a rectangle r(2)(1)(2).addProperty('ADBE Vector Shape - Rect'); r(2)(1)(2)(1)('ADBE Vector Rect Size').setValue( [layer.frame.width * compMult, layer.frame.height * compMult] ); r(2)(1)(2)(1)('ADBE Vector Rect Position').setValue( [(layer.frame.width * compMult)/2, (layer.frame.height * compMult)/2] ); /// give the rect a fill so it's selectable var fillColor = r(2)(1)(2).addProperty('ADBE Vector Graphic - Fill'); fillColor('ADBE Vector Fill Color').setValue([0,0,0,1]); // opacity to 0 to make an invisible fill fillColor('ADBE Vector Fill Opacity').setValue(0); /// stroked rectangle var strokeColor = r(2)(1)(2).addProperty('ADBE Vector Graphic - Stroke'); // color strokeColor('ADBE Vector Stroke Color').setValue([0.298,0.7569,0.9882,1]); // opacity to 50% strokeColor('ADBE Vector Stroke Opacity').setValue(50); // stroke width 1px strokeColor('ADBE Vector Stroke Width').setValue(1); // build layers within group filterTypes(layer.layers, r); // turn off the eyeball r.enabled = false; // set transforms r('ADBE Transform Group')('ADBE Anchor Point').setValue( [(layer.frame.width/2) * compMult, (layer.frame.height/2) * compMult] ); r('ADBE Transform Group')('ADBE Position').setValue( [(layer.frame.x + layer.frame.width/2) * compMult, (layer.frame.y + layer.frame.height/2) * compMult] ); r('ADBE Transform Group')('ADBE Rotate Z').setValue( layer.rotation ); r('ADBE Transform Group')('ADBE Scale').setValue(layer.flip); setMask(r, layer); } } //// parametric rectangle function aeRect(layer, opt_parent) { var r = initShapeLayer(layer, opt_parent); // create an empty group r(2).addProperty('ADBE Vector Group'); r(2)(1).name = layer.name; // create a rectangle shape r(2)(1)(2).addProperty('ADBE Vector Shape - Rect'); r(2)(1)(2)(1)('ADBE Vector Rect Size').setValue( [layer.frame.width, layer.frame.height] ); r(2)(1)(2)(1)('ADBE Vector Rect Roundness').setValue(layer.roundness); /// add layer elements addStroke(r, layer); addFill(r, layer); addDropShadow(r, layer); addBlur(r, layer); addInnerShadow(r, layer); setLayerBlendMode(r, layer); // set transforms r(2)(1)('ADBE Vector Transform Group')('ADBE Vector Scale').setValue([100*compMult, 100*compMult]); r(2)(1)('ADBE Vector Transform Group')('ADBE Vector Rotation').setValue(layer.rotation); r('ADBE Transform Group')('ADBE Position').setValue([ (layer.frame.x + layer.frame.width/2)*compMult, (layer.frame.y + layer.frame.height/2)*compMult]); r('ADBE Transform Group')('ADBE Opacity').setValue(layer.opacity); r('ADBE Transform Group')('ADBE Scale').setValue(layer.flip); setMask(r, layer); } //// parametric ellipse function aeEllipse(layer, opt_parent) { var r = initShapeLayer(layer, opt_parent); // create an empty group r(2).addProperty('ADBE Vector Group'); r(2)(1).name = layer.name; // create an ellipse shape r(2)(1)(2).addProperty('ADBE Vector Shape - Ellipse'); r(2)(1)(2)(1)('ADBE Vector Ellipse Size').setValue([layer.frame.width, layer.frame.height]); /// add layer elements addStroke(r, layer); addFill(r, layer); addDropShadow(r, layer); addBlur(r, layer); addInnerShadow(r, layer); setLayerBlendMode(r, layer); // set transforms r(2)(1)('ADBE Vector Transform Group')('ADBE Vector Scale').setValue([100*compMult, 100*compMult]); // set scale r(2)(1)('ADBE Vector Transform Group')('ADBE Vector Rotation').setValue(layer.rotation); r('ADBE Transform Group')('ADBE Position').setValue([ (layer.frame.x + layer.frame.width/2)*compMult, (layer.frame.y + layer.frame.height/2)*compMult]); // set position r('ADBE Transform Group')('ADBE Opacity').setValue(layer.opacity); // set opacity r('ADBE Transform Group')('ADBE Scale').setValue(layer.flip); setMask(r, layer); } //// path function aePath(layer, opt_parent) { // skip if no vertices if (!layer.path || layer.path.points.length < 1) { return; } var r = initShapeLayer(layer, opt_parent); /// create an empty group var group = r(2).addProperty('ADBE Vector Group'); r(2)(1).name = layer.name; // create a path group group(2).addProperty('ADBE Vector Shape - Group'); // create a vector object var pathProp = group(2)(1).property('ADBE Vector Shape'); // get vertex data var vertices = layer.path.points; // skip if no vertices if (vertices.length < 1) { return; } // assign path data to vector object var pathObj = { path: pathProp, points: layer.path.points, inTangents: layer.path.inTangents, outTangents: layer.path.outTangents, closed: layer.path.closed }; // var layerOffset = [0,0]; var layerOffset = [layer.frame.width/2, layer.frame.height/2]; // build path createStaticShape(pathObj, layerOffset); /// round corners if roundness greater than 0 if (layer.roundness > 0) { var rounding = Math.min(layer.roundness, Math.min(layer.frame.width, layer.frame.height)/2); var round = group(2).addProperty('ADBE Vector Filter - RC'); round('ADBE Vector RoundCorner Radius').setValue(rounding); } /// add layer elements addStroke(r, layer); addFill(r, layer); addDropShadow(r, layer); addBlur(r, layer); addInnerShadow(r, layer); setLayerBlendMode(r, layer); // set transforms var centeredPos = [(layer.frame.x + layer.frame.width/2) * compMult, (layer.frame.y + layer.frame.height/2) * compMult]; r('ADBE Transform Group')('ADBE Position').setValue( centeredPos ); group('ADBE Vector Transform Group')('ADBE Vector Rotation').setValue(layer.rotation); group('ADBE Vector Transform Group')('ADBE Vector Scale').setValue([100 * compMult, 100 * compMult]); r('ADBE Transform Group')('ADBE Opacity').setValue(layer.opacity); r('ADBE Transform Group')('ADBE Scale').setValue(layer.flip); setMask(r, layer); } //// compound path function aeCompound(layer, opt_parent) { var r = initShapeLayer(layer, opt_parent); /// create an empty group var group = r(2).addProperty('ADBE Vector Group'); group.name = layer.name; // var group = r(2)(1)(2).addProperty('ADBE Vector Group'); createCompoundShapes(group, layer); /// add layer elements if (!group(2)('ADBE Vector Filter - Merge')) { addMerge(group, layer.booleanOperation); } // add a merge paths if one isn't already there addStroke(r, layer); addFill(r, layer); addDropShadow(r, layer); addBlur(r, layer); addInnerShadow(r, layer); setLayerBlendMode(r, layer); // set transforms var centeredPos = [(layer.frame.x + layer.frame.width/2) * compMult, (layer.frame.y + layer.frame.height/2) * compMult] r(2)(1)('ADBE Vector Transform Group')('ADBE Vector Scale').setValue([100*compMult,100*compMult]); // r(2)(1)('ADBE Vector Transform Group')('ADBE Vector Rotation').setValue(layer.rotation); r('ADBE Transform Group')('ADBE Rotate Z').setValue( layer.rotation ); r('ADBE Transform Group')('ADBE Position').setValue( centeredPos ); r('ADBE Transform Group')('ADBE Opacity').setValue(layer.opacity); r('ADBE Transform Group')('ADBE Scale').setValue(layer.flip); setMask(r, layer); function createCompoundShapes(group, layer) { // loop through and build all shapes in a compound var layerCount = layer.layers.length || 1; for (var i = 0; i < layerCount; i++) { if (layer.layers[i] == undefined) { return } // no nested layers var shape = layer.layers[i]; // find the individual shape's offset with the compound var posOffset = [(layer.frame.width-shape.frame.width)/-2, (layer.frame.height-shape.frame.height)/-2]; // if a nested compound if (shape.type === 'CompoundShape') { var subGroup = group(2).addProperty('ADBE Vector Group'); subGroup.name = shape.name; subGroup('ADBE Vector Transform Group')('ADBE Vector Position').setValue(posOffset + [shape.frame.x, shape.frame.y]); createCompoundShapes(subGroup, shape); continue; } // if a rectangle if (shape.type === 'Rect' && prefs.parametrics) { var rect = group(2).addProperty('ADBE Vector Shape - Rect'); rect('ADBE Vector Rect Size').setValue([shape.frame.width, shape.frame.height]); rect('ADBE Vector Rect Position').setValue(posOffset + [shape.frame.x, shape.frame.y]); rect('ADBE Vector Rect Roundness').setValue(shape.roundness); } // if an ellipse if (shape.type === 'Ellipse' && prefs.parametrics){ var ellipse = group(2).addProperty('ADBE Vector Shape - Ellipse'); ellipse('ADBE Vector Ellipse Size').setValue([shape.frame.width, shape.frame.height]); ellipse('ADBE Vector Ellipse Position').setValue(posOffset + [shape.frame.x, shape.frame.y]); } // if a path if (shape.type === 'Path' || !prefs.parametrics) { var subGroup = needsSubGroup(group, shape); var vect = subGroup(2).addProperty('ADBE Vector Shape - Group'); if (shape.path.points.length < 1) { return; } var pathProp = vect.property('ADBE Vector Shape'); var vertices = shape.path.points; if (vertices.length < 1) {} var pathObj = { path: pathProp, points: shape.path.points, inTangents: shape.path.inTangents, outTangents: shape.path.outTangents, closed: shape.path.closed }; createStaticShape(pathObj, [layer.frame.width/2 - shape.frame.x, layer.frame.height/2 - shape.frame.y]); // round corners if (shape.roundness > 0) { var round = group(2).addProperty('ADBE Vector Filter - RC'); round('ADBE Vector RoundCorner Radius').setValue(shape.roundness); } } // add a merge paths after the last shape if (i == layer.layers.length-1) { addMerge(group, shape.booleanOperation); } } } //// compound functions //// function addMerge(group, bool) { // alert(layer.name + ' : ' + bool) var merge = group(2).addProperty('ADBE Vector Filter - Merge'); // add merge paths merge('ADBE Vector Merge Type').setValue(bool+2); // set merge type } function needsSubGroup(group, shape) { var subGroup = null; if (shape.rotation != 0 || (shape.flip[0] != 100 || shape.flip[1] != 100)) { subGroup = group(2).addProperty('ADBE Vector Group'); } if (subGroup) { subGroup('ADBE Vector Transform Group')('ADBE Vector Rotation').setValue(shape.rotation); subGroup('ADBE Vector Transform Group')('ADBE Vector Scale').setValue(shape.flip); return subGroup } return group; } } //// add symbol function aeSymbol(layer, opt_parent) { symbolFolder = createNamedFolder('Symbols'); // check if symbol exists var symbolPrecomp = createSymbol(layer); // add the symbol to comp var r = thisComp.layers.add(symbolPrecomp, symbolPrecomp.duration); // add symbol icon to layer name r.name = '\u21BB ' + layer.name; // enable continuous rasterize r.collapseTransformation = true; /// if the group layer has a parent if (opt_parent !== null) { // set the parent r.parent = opt_parent; // move the layer after the parent r.moveAfter(opt_parent); // set layer visibility (eyeball) r.enabled = (layer.isVisible && opt_parent.enabled ); } else { // increment label color labelColor = labelColor % 16 + 1; // set layer visibility (eyeball) r.enabled = layer.isVisible; } r.label = labelColor; /// add layer elements addDropShadow(r, layer); addBlur(r, layer); addInnerShadow(r, layer); setLayerBlendMode(r, layer); // set transforms // get the symbol size and compare it to the in-comp size for the scale value var scaleVal = [(100 * compMult) * (layer.frame.width/layer.symbolFrame.width) * (layer.flip[0]/100), (100 * compMult) * (layer.frame.height/layer.symbolFrame.height) * (layer.flip[1]/100)]; r('ADBE Transform Group')('ADBE Position').setValue( [(layer.frame.x + layer.frame.width/2) * compMult, (layer.frame.y + layer.frame.height/2) * compMult] ); r('ADBE Transform Group')('ADBE Scale').setValue(scaleVal); r('ADBE Transform Group')('ADBE Rotate Z').setValue( layer.rotation ); r('ADBE Transform Group')('ADBE Opacity').setValue(layer.opacity); setMask(r, layer); } //// import and add image function aeImage(layer, opt_parent) { imageFolder = createNamedFolder('Images'); // check if file is already imported var bmpImage = getItem(layer.id, FileSource, imageFolder); // if not imported if (bmpImage === null) { // set the file from directory var fileFound = false; var bmpFile; try { bmpFile = new ImportOptions(new File(layer.path + layer.id + '@4x.png')); fileFound = true; } catch (e) { try { // alert(sourcePath + '/' + layer.id + '@4x.png') if (hostApp == 'Sketch') { bmpFile = new ImportOptions(new File(sourcePath + '/' + layer.id + '@4x.png')); } if (hostApp == 'Figma') { bmpFile = new ImportOptions(new File(sourcePath + '/' + layer.id + '.png')); } fileFound = true; } catch (e) { returnMessage.push(6); //'Can't locate image file' bmpImage = app.project.importPlaceholder(layer.id + '.png', Math.round(layer.frame.width * 4), Math.round(layer.frame.height * 4), 60, 120); } } // import if (fileFound) { bmpImage = app.project.importFile(bmpFile); } // move to IMAGES folder bmpImage.parentFolder = imageFolder; // deselect bmpImage.selected = false; } var r = thisComp.layers.add(bmpImage); r.selected = false; r.name = layer.name; /// if the group layer has a parent if (opt_parent !== null) { // set the parent r.parent = opt_parent; // move the layer after the parent r.moveAfter(opt_parent); // set layer visibility (eyeball) r.enabled = (layer.isVisible && opt_parent.enabled ); } else { // increment label color labelColor = labelColor % 16 + 1; // set layer visibility (eyeball) r.enabled = layer.isVisible; } r.label = labelColor; /// add layer elements addDropShadow(r, layer); addInnerShadow(r, layer); setLayerBlendMode(r, layer); setMask(r, layer); // set transforms var centeredPos = [(layer.frame.x + layer.frame.width/2) * compMult, (layer.frame.y + layer.frame.height/2) * compMult]; r('ADBE Transform Group')('ADBE Position').setValue(centeredPos); r('ADBE Transform Group')('ADBE Scale').setValue([25*compMult,25*compMult]); // func to get image file from project function getItem(itemName, itemInstanceName, imageFolder) { if (imageFolder.numItems > 0) { for (var i = 1; i <= imageFolder.numItems; i ++) { var curItem = imageFolder.item(i); if (curItem.name === itemName || curItem.name === itemName + '.png') { if (curItem instanceof itemInstanceName || (curItem.mainSource !== 'undefined' && (curItem.mainSource instanceof itemInstanceName || curItem.mainSource instanceof PlaceholderSource) )) { return curItem; } } } } return null; } } ///////// create/import project elements ///////// /** create a symbol layer as precomp and add it to the comp @param {layer} obj - json layers from Sketch */ //// check if symbol exists, create if doesn't exist, return the symbol function createSymbol(layer) { /// reset variables var symbol; var symbolExists = false; /// check if not an override if (layer.id != 'override') { // loop through all items in the symbol folder for (var i = 1; i <= symbolFolder.items.length; i++) { // if the comment on the precomp matches the symbol id if (symbolFolder.item(i).comment === layer.masterId) { // set the var to true symbolExists = true; // define the symbol var to the found precomp symbol = symbolFolder.item(i); // stop all that looping break; } } } // create symbol if no existing symbol is found if (!symbolExists) { // create a new precomp and initialize it as var symbol symbol = app.project.items.addComp( layer.name, Math.max(Math.round(layer.symbolFrame.width), 4), Math.max(Math.round(layer.symbolFrame.height), 4), thisComp.pixelAspect, thisComp.duration, thisComp.frameRate); // move new precomp into the symbolFolder symbol.parentFolder = symbolFolder; // set the comment to the symbol id symbol.comment = layer.masterId; // set background color symbol.bgColor = [layer.bgColor[0], layer.bgColor[1], layer.bgColor[2]]; /// run layer filter for layers inside of symbol // temporarily store the main comp and comp size multiplier, then update vars for precomp var mainComp = thisComp; thisComp = symbol; var compMultStorage = compMult; compMult = 1; // build nested layers filterTypes(layer.layers, null); // reset main comp and comp size multiplier for the next layers compMult = compMultStorage; thisComp = mainComp; } return symbol; // return new symbol precomp } //// check if named project folder exists, create if doesn't exist, return the folder function createNamedFolder(folderNameStr) { /// reset variables var hasNamedFolder = false; // loop through all project items for (var i = 1; i <= app.project.numItems; i++) { // find folders if (app.project.item(i) instanceof FolderItem) { // check if it's name matches folderNameStr if (app.project.item(i).name == folderNameStr) { // set the var to true hasNamedFolder = true; // define the returned folder var to the found folder namedFolder = app.project.item(i); // stop all that looping break; } } } // if no symbol folder is found if (!hasNamedFolder) { // create a new folder namedFolder = app.project.items.addFolder(folderNameStr); } return namedFolder; } //// create comp from artboard data function aeArtboard(layer) { // skip the code if panel check box for new comp disabled if (prefs.newComp) { compMult = prefs.compScale; if (layer.size[0] * compMult > 30000) { returnMessage.push(3); //'Comp width 30,000+' return false; } if (layer.size[1] * compMult > 30000) { returnMessage.push(4); //'Comp height 30,000+' return false; } // create new comp thisComp = app.project.items.addComp( nameInc(layer.name, app.project.items), Math.max(Math.round(layer.size[0] * compMult), 4), Math.max(Math.round(layer.size[1] * compMult), 4), 1, 60, 60); // pixelAspect=1, duration=60sec, frameRate=60fps // set the comp background color to the artboard background color thisComp.bgColor = [layer.bgColor[0], layer.bgColor[1], layer.bgColor[2]]; } // above code is skipped so it gets the comp multiplier compMult = getCompMultiplier(layer.size[0]); return true; } ///////// create/add/set layer elements ///////// //// build generic shape layer with basic properties function initShapeLayer(layer, opt_parent) { // add empty shape layer var r = thisComp.layers.addShape(); // layer name r.name = layer.name; // deselect layer r.selected = false; /// if the group layer has a parent if (opt_parent !== null) { // set the parent r.parent = opt_parent; // move the layer after the parent r.moveAfter(opt_parent); // set layer visibility (eyeball) r.enabled = (layer.isVisible && opt_parent.enabled ); } else { // increment label color labelColor = labelColor % 16 + 1; // set layer visibility (eyeball) r.enabled = layer.isVisible; } r.label = labelColor; return r; } //// draw a path from coords/tangents and offset function createStaticShape(pathObj, layerOffset) { var pathValue = pathObj.path.value; pathValue.vertices = transformList(pathObj.points, layerOffset); pathValue.inTangents = pathObj.inTangents; pathValue.outTangents = pathObj.outTangents; pathValue.closed = pathObj.closed; pathObj.path.setValue(pathValue); /// move all path points by a 2d array function transformList(list, offset) { var transformedList = []; for (var i = 0; i < list.length; i++) { transformedList[i] = [ list[i][0] - offset[0], list[i][1] - offset[1] ]; } return transformedList; } } //// shape layer fill function addFill(r, layer) { /// skip if no fills if (layer.fill !== null) { // loop through multiple fill objects for (var i = layer.fill.length-1; i >= 0; i--) { // reset variables var aeBlendMode = 1; var fill; if (layer.fill[i].type == 'fill') { // add a fill element fill = r(2)(1)(2).addProperty('ADBE Vector Graphic - Fill'); // set color and visibility fill.enabled = layer.fill[i].enabled; fill("ADBE Vector Fill Color").setValue(layer.fill[i].color); fill("ADBE Vector Fill Opacity").setValue(layer.fill[i].opacity); } if (layer.fill[i].type == 'gradient') { var gradType; // linear if (layer.fill[i].gradType == 0) { gradType = 1; // radial } else if (layer.fill[i].gradType == 1) { gradType = 2; // linear as default } else { gradType = 1; returnMessage.push(2); // 'Angular gradients' } // add a gradient element fill = r(2)(1)(2).addProperty('ADBE Vector Graphic - G-Fill'); // set color and visibility fill("ADBE Vector Fill Opacity").setValue(layer.fill[i].opacity); fill('ADBE Vector Grad Type').setValue(gradType); fill('ADBE Vector Grad Start Pt').setValue(layer.fill[i].startPoint); fill('ADBE Vector Grad End Pt').setValue(layer.fill[i].endPoint); /// deselect layers before applying gradient preset ae_deselectProps(); fill.selected = true; applyGradientFfx('fill', false, layer.fill[i]); } // set blend mode fill("ADBE Vector Blend Mode").setValue(layer.fill[i].blendMode); } } } //// shape layer stroke function addStroke(r, layer) { /// skip if no strokes if (layer.stroke !== null) { // loop through multiple stroke objects for (var i = layer.stroke.length-1; i >= 0; i--) { if (layer.stroke[i].type == 'fill') { // add a fill element stroke = r(2)(1)(2).addProperty("ADBE Vector Graphic - Stroke"); // set color and visibility stroke.enabled = layer.stroke[i].enabled; stroke("ADBE Vector Stroke Color").setValue(layer.stroke[i].color); // set generic stroke props setStrokeProps(stroke, i); } if (layer.stroke[i].type == 'gradient') { stroke = r(2)(1)(2).addProperty('ADBE Vector Graphic - G-Stroke'); // set generic stroke props setStrokeProps(stroke, i); // set gradient props stroke('ADBE Vector Grad Type').setValue(layer.stroke[i].gradType); stroke('ADBE Vector Grad Start Pt').setValue(layer.stroke[i].startPoint); stroke('ADBE Vector Grad End Pt').setValue(layer.stroke[i].endPoint); /// deselect layers before applying gradient preset ae_deselectProps(); stroke.selected = true; applyGradientFfx('stroke', false, layer.stroke[i]); } // apply dashes if (layer.stroke[i].strokeDashes.length > 0) { var strokeDashes = layer.stroke[i].strokeDashes; for (var j = 1; j <= strokeDashes.length; j++) { countRound = Math.round(j/2); if (j-1 % 2 == 0) { stroke('ADBE Vector Stroke Dashes').addProperty('ADBE Vector Stroke Dash ' + (countRound)); stroke('ADBE Vector Stroke Dashes')('ADBE Vector Stroke Dash ' + (countRound)).setValue(strokeDashes[j-1]); } else { stroke('ADBE Vector Stroke Dashes').addProperty('ADBE Vector Stroke Gap ' + (countRound)); stroke('ADBE Vector Stroke Dashes')('ADBE Vector Stroke Gap ' + (countRound)).setValue(strokeDashes[j-1]); } } } } } function setStrokeProps(stroke, i) { stroke("ADBE Vector Stroke Opacity").setValue(layer.stroke[i].opacity); stroke("ADBE Vector Stroke Width").setValue(layer.stroke[i].width); stroke("ADBE Vector Stroke Line Cap").setValue(layer.stroke[i].cap + 1); stroke("ADBE Vector Stroke Line Join").setValue(layer.stroke[i].join + 1 ); } } //// dup mask layer, parent and set track matte function setMask(currentLayer, layerData) { /// reset variables var currentCompId = currentLayer.containingComp.id; var currentParentName = (currentLayer.parent) ? currentLayer.parent.name : 'comp'; var layerID = currentCompId + '_' + currentParentName; // remove the stored maskLayer because the currentLayer doesnt need it if (layerData.shouldBreakMaskChain) { maskLayer[layerID] = null; maskPosition = [0,0]; } // if the current comp has a mask layer if (maskLayer[layerID]) { try { maskLayer[layerID].enabled = false; var newMask = maskLayer[layerID].duplicate(); newMask.moveBefore(currentLayer); newMask.effectsActive = false; newMask.enabled = false; newMask.parent = maskLayer[layerID]; newMask.shy = true; newMask.name = '\u25A8 ' + newMask.name; try { newMask(2).addProperty('ADBE Vector Graphic - Fill'); } catch (e) {} // if not a shape layer newMask.locked = true; currentLayer.trackMatteType = TrackMatteType.ALPHA; } catch (e) {} } // define the mask layer if (layerData.hasClippingMask) { maskLayer[layerID] = currentLayer; maskPosition = currentLayer('ADBE Transform Group')('ADBE Position').value; } // check mask from figma if (layerData.isMask) { maskLayer[layerID] = currentLayer; maskPosition = currentLayer('ADBE Transform Group')('ADBE Position').value; } } //// create gradient ffx and apply it to layer function applyGradientFfx(type, dontTwirl, element) { /// file binary string var presetFiles = { template_grad2:"RIFX\x00\x00\n`FaFXhead\x00\x00\x00\x10\x00\x00\x00\x03\x00\x00\x00W\x00\x00\x00\x01\x00\x00\x00\x00LIST\x00\x00\n\n\n\n\nGradient Color Data\n\n\nAlpha Stops\n\n\nStops List\n\n\nStop-0\n\n\nStops Alpha\n\n\npoints[0].rampPoint\npoints[0].midPoint\npoints[0].opacity\n\n\n\n\n\nStop-1\n\n\nStops Alpha\n\n\npoints[1].rampPoint\npoints[1].midPoint\npoints[1].opacity\n\n\n\n\n\n\n\nStops Size\n2\n\n\n\n\nColor Stops\n\n\nStops List\n\n\nStop-0\n\n\nStops Color\n\n\npoints[0].rampPoint\npoints[0].midPoint\npoints[0].color[0]\npoints[0].color[1]\npoints[0].color[2]\n1\n\n\n\n\n\nStop-1\n\n\nStops Color\n\n\npoints[1].rampPoint\npoints[1].midPoint\npoints[1].color[0]\npoints[1].color[1]\npoints[1].color[2]\n1\n\n\n\n\n\n\n\nStops Size\n2\n\n\n\n\n\n\nGradient Colors\n1.0\n\n\n\n\n\n \n \n application/vnd.adobe.aftereffects.preset-animation\n Adobe After Effects CC 2014 (Macintosh)\n 2018-01-20T12:34:50-05:00\n 2018-01-20T12:34:50-05:00\n 2018-01-20T12:34:50-05:00\n xmp.iid:9f2e7e7b-65a7-49aa-beb9-509e3e6907bd\n xmp.did:9f2e7e7b-65a7-49aa-beb9-509e3e6907bd\n xmp.did:9f2e7e7b-65a7-49aa-beb9-509e3e6907bd\n \n \n \n created\n xmp.iid:9f2e7e7b-65a7-49aa-beb9-509e3e6907bd\n 2018-01-20T12:34:50-05:00\n Adobe After Effects CC 2014 (Macintosh)\n \n \n \n \n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", template_grad3:"RIFX\x00\x00\f\u0090FaFXhead\x00\x00\x00\x10\x00\x00\x00\x03\x00\x00\x00W\x00\x00\x00\x01\x00`\x00\x00LIST\x00\x00\flbescbeso\x00\x00\x008\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00`\x00\x00\x18\x00\x00\x00\x00\x00\x04\x00\x01\x00\x01\x07\u0080\x048?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\u00FF\u00FF\u00FF\u00FFLIST\x00\x00\x01\u0084tdsptdot\x00\x00\x00\x04\u00FF\u00FF\u00FF\u00FFtdpl\x00\x00\x00\x04\x00\x00\x00\x05LIST\x00\x00\x00@tdsitdix\x00\x00\x00\x04\u00FF\u00FF\u00FF\u00FFtdmn\x00\x00\x00(ADBE Root Vectors Group\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00LIST\x00\x00\x00@tdsitdix\x00\x00\x00\x04\x00\x00\x00\x00tdmn\x00\x00\x00(ADBE Vector Group\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00LIST\x00\x00\x00@tdsitdix\x00\x00\x00\x04\u00FF\u00FF\u00FF\u00FFtdmn\x00\x00\x00(ADBE Vectors Group\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00LIST\x00\x00\x00@tdsitdix\x00\x00\x00\x04\x00\x00\x00\x02tdmn\x00\x00\x00(ADBE Vector Graphic - G-Fill\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00LIST\x00\x00\x00@tdsitdix\x00\x00\x00\x04\u00FF\u00FF\u00FF\u00FFtdmn\x00\x00\x00(ADBE Vector Grad Colors\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tdsn\x00\x00\x00\x07Colors\x00\x00LIST\x00\x00\x00dtdsptdot\x00\x00\x00\x04\u00FF\u00FF\u00FF\u00FFtdpl\x00\x00\x00\x04\x00\x00\x00\x01LIST\x00\x00\x00@tdsitdix\x00\x00\x00\x04\u00FF\u00FF\u00FF\u00FFtdmn\x00\x00\x00(ADBE End of path sentinel\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00LIST\x00\x00\n\x18GCstLIST\x00\x00\x00\u00B0tdbstdsb\x00\x00\x00\x04\x00\x00\x00\x01tdsn\x00\x00\x00\x07Colors\x00\x00tdb4\x00\x00\x00|\u00DB\u0099\x00\x01\x00\x07\x00\x00\u00FF\u00FF\u00FF\u00FF\x00\x00`\x00?\x1A6\u00E2\u00EB\x1CC-?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00\x00\x01\x00\b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00cdat\x00\x00\x00\x04\x00\x00\x00\x00LIST\x00\x00\tTGCkyUtf8\x00\x00\tG\n\n\n\nGradient Color Data\n\n\nAlpha Stops\n\n\nStops List\n\n\nStop-0\n\n\nStops Alpha\n\n\npoints[0].rampPoint\npoints[0].midPoint\npoints[0].opacity\n\n\n\n\n\nStop-1\n\n\nStops Alpha\n\n\npoints[1].rampPoint\npoints[1].midPoint\npoints[1].opacity\n\n\n\n\n\nStop-2\n\n\nStops Alpha\n\n\npoints[2].rampPoint\npoints[2].midPoint\npoints[2].opacity\n\n\n\n\n\n\n\nStops Size\n3\n\n\n\n\nColor Stops\n\n\nStops List\n\n\nStop-0\n\n\nStops Color\n\n\npoints[0].rampPoint\npoints[0].midPoint\npoints[0].color[0]\npoints[0].color[1]\npoints[0].color[2]\n1\n\n\n\n\n\nStop-1\n\n\nStops Color\n\n\npoints[1].rampPoint\npoints[1].midPoint\npoints[1].color[0]\npoints[1].color[1]\npoints[1].color[2]\n1\n\n\n\n\n\nStop-2\n\n\nStops Color\n\n\npoints[2].rampPoint\npoints[2].midPoint\npoints[2].color[0]\npoints[2].color[1]\npoints[2].color[2]\n1\n\n\n\n\n\n\n\nStops Size\n3\n\n\n\n\n\n\nGradient Colors\n1.0\n\n\n\n\x00\n\n \n \n application/vnd.adobe.aftereffects.preset-animation\n Adobe After Effects CC 2014 (Macintosh)\n 2018-01-20T12:34:50-05:00\n 2018-01-20T12:34:50-05:00\n 2018-01-20T12:34:50-05:00\n xmp.iid:9f2e7e7b-65a7-49aa-beb9-509e3e6907bd\n xmp.did:9f2e7e7b-65a7-49aa-beb9-509e3e6907bd\n xmp.did:9f2e7e7b-65a7-49aa-beb9-509e3e6907bd\n \n \n \n created\n xmp.iid:9f2e7e7b-65a7-49aa-beb9-509e3e6907bd\n 2018-01-20T12:34:50-05:00\n Adobe After Effects CC 2014 (Macintosh)\n \n \n \n \n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", template_grad4:"RIFX\x00\x00\x0E\u00BEFaFXhead\x00\x00\x00\x10\x00\x00\x00\x03\x00\x00\x00W\x00\x00\x00\x01\x00`\x00\x00LIST\x00\x00\x0E\u009Abescbeso\x00\x00\x008\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00`\x00\x00\x18\x00\x00\x00\x00\x00\x04\x00\x01\x00\x01\x07\u0080\x048?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\u00FF\u00FF\u00FF\u00FFLIST\x00\x00\x01\u0084tdsptdot\x00\x00\x00\x04\u00FF\u00FF\u00FF\u00FFtdpl\x00\x00\x00\x04\x00\x00\x00\x05LIST\x00\x00\x00@tdsitdix\x00\x00\x00\x04\u00FF\u00FF\u00FF\u00FFtdmn\x00\x00\x00(ADBE Root Vectors Group\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00LIST\x00\x00\x00@tdsitdix\x00\x00\x00\x04\x00\x00\x00\x00tdmn\x00\x00\x00(ADBE Vector Group\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00LIST\x00\x00\x00@tdsitdix\x00\x00\x00\x04\u00FF\u00FF\u00FF\u00FFtdmn\x00\x00\x00(ADBE Vectors Group\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00LIST\x00\x00\x00@tdsitdix\x00\x00\x00\x04\x00\x00\x00\x02tdmn\x00\x00\x00(ADBE Vector Graphic - G-Fill\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00LIST\x00\x00\x00@tdsitdix\x00\x00\x00\x04\u00FF\u00FF\u00FF\u00FFtdmn\x00\x00\x00(ADBE Vector Grad Colors\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tdsn\x00\x00\x00\x07Colors\x00\x00LIST\x00\x00\x00dtdsptdot\x00\x00\x00\x04\u00FF\u00FF\u00FF\u00FFtdpl\x00\x00\x00\x04\x00\x00\x00\x01LIST\x00\x00\x00@tdsitdix\x00\x00\x00\x04\u00FF\u00FF\u00FF\u00FFtdmn\x00\x00\x00(ADBE End of path sentinel\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00LIST\x00\x00\fFGCstLIST\x00\x00\x00\u00B0tdbstdsb\x00\x00\x00\x04\x00\x00\x00\x01tdsn\x00\x00\x00\x07Colors\x00\x00tdb4\x00\x00\x00|\u00DB\u0099\x00\x01\x00\x07\x00\x00\u00FF\u00FF\u00FF\u00FF\x00\x00`\x00?\x1A6\u00E2\u00EB\x1CC-?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00\x00\x01\x00\b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00cdat\x00\x00\x00\x04\x00\x00\x00\x00LIST\x00\x00\x0B\u0082GCkyUtf8\x00\x00\x0Bv\n\n\n\nGradient Color Data\n\n\nAlpha Stops\n\n\nStops List\n\n\nStop-0\n\n\nStops Alpha\n\n\npoints[0].rampPoint\npoints[0].midPoint\npoints[0].opacity\n\n\n\n\n\nStop-1\n\n\nStops Alpha\n\n\npoints[1].rampPoint\npoints[1].midPoint\npoints[1].opacity\n\n\n\n\n\nStop-2\n\n\nStops Alpha\n\n\npoints[2].rampPoint\npoints[2].midPoint\npoints[2].opacity\n\n\n\n\n\nStop-3\n\n\nStops Alpha\n\n\npoints[3].rampPoint\npoints[3].midPoint\npoints[3].opacity\n\n\n\n\n\n\n\nStops Size\n4\n\n\n\n\nColor Stops\n\n\nStops List\n\n\nStop-0\n\n\nStops Color\n\n\npoints[0].rampPoint\npoints[0].midPoint\npoints[0].color[0]\npoints[0].color[1]\npoints[0].color[2]\n1\n\n\n\n\n\nStop-1\n\n\nStops Color\n\n\npoints[1].rampPoint\npoints[1].midPoint\npoints[1].color[0]\npoints[1].color[1]\npoints[1].color[2]\n1\n\n\n\n\n\nStop-2\n\n\nStops Color\n\n\npoints[2].rampPoint\npoints[2].midPoint\npoints[2].color[0]\npoints[2].color[1]\npoints[2].color[2]\n1\n\n\n\n\n\nStop-3\n\n\nStops Color\n\n\npoints[3].rampPoint\npoints[3].midPoint\npoints[3].color[0]\npoints[3].color[1]\npoints[3].color[2]\n1\n\n\n\n\n\n\n\nStops Size\n4\n\n\n\n\n\n\nGradient Colors\n1.0\n\n\n\n\n\n \n \n application/vnd.adobe.aftereffects.preset-animation\n Adobe After Effects CC 2014 (Macintosh)\n 2018-01-20T12:34:50-05:00\n 2018-01-20T12:34:50-05:00\n 2018-01-20T12:34:50-05:00\n xmp.iid:9f2e7e7b-65a7-49aa-beb9-509e3e6907bd\n xmp.did:9f2e7e7b-65a7-49aa-beb9-509e3e6907bd\n xmp.did:9f2e7e7b-65a7-49aa-beb9-509e3e6907bd\n \n \n \n created\n xmp.iid:9f2e7e7b-65a7-49aa-beb9-509e3e6907bd\n 2018-01-20T12:34:50-05:00\n Adobe After Effects CC 2014 (Macintosh)\n \n \n \n \n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", template_grad5:"RIFX\x00\x00\x11\u00E2FaFXhead\x00\x00\x00\x10\x00\x00\x00\x03\x00\x00\x00W\x00\x00\x00\x01\x00a\x00\x00LIST\x00\x00\x11\u00BEbescbeso\x00\x00\x008\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00`\x00\x00\x18\x00\x00\x00\x00\x00\x04\x00\x01\x00\x01\x07\u0080\x048?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\u00FF\u00FF\u00FF\u00FFLIST\x00\x00\x01\u0084tdsptdot\x00\x00\x00\x04\u00FF\u00FF\u00FF\u00FFtdpl\x00\x00\x00\x04\x00\x00\x00\x05LIST\x00\x00\x00@tdsitdix\x00\x00\x00\x04\u00FF\u00FF\u00FF\u00FFtdmn\x00\x00\x00(ADBE Root Vectors Group\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00LIST\x00\x00\x00@tdsitdix\x00\x00\x00\x04\x00\x00\x00\x00tdmn\x00\x00\x00(ADBE Vector Group\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00LIST\x00\x00\x00@tdsitdix\x00\x00\x00\x04\u00FF\u00FF\u00FF\u00FFtdmn\x00\x00\x00(ADBE Vectors Group\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00LIST\x00\x00\x00@tdsitdix\x00\x00\x00\x04\x00\x00\x00\x02tdmn\x00\x00\x00(ADBE Vector Graphic - G-Fill\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00LIST\x00\x00\x00@tdsitdix\x00\x00\x00\x04\u00FF\u00FF\u00FF\u00FFtdmn\x00\x00\x00(ADBE Vector Grad Colors\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tdsn\x00\x00\x00\x07Colors\x00\x00LIST\x00\x00\x00dtdsptdot\x00\x00\x00\x04\u00FF\u00FF\u00FF\u00FFtdpl\x00\x00\x00\x04\x00\x00\x00\x01LIST\x00\x00\x00@tdsitdix\x00\x00\x00\x04\u00FF\u00FF\u00FF\u00FFtdmn\x00\x00\x00(ADBE End of path sentinel\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00LIST\x00\x00\x0FjGCstLIST\x00\x00\x00\u00B0tdbstdsb\x00\x00\x00\x04\x00\x00\x00\x01tdsn\x00\x00\x00\x07Colors\x00\x00tdb4\x00\x00\x00|\u00DB\u0099\x00\x01\x00\x07\x00\x00\u00FF\u00FF\u00FF\u00FF\x00\x00`\x00?\x1A6\u00E2\u00EB\x1CC-?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00\x00\x01\x00\b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00cdat\x00\x00\x00\x04\x00\x00\x00\x00LIST\x00\x00\x0E\u00A6GCkyUtf8\x00\x00\x0E\u009A\n\n\n\nGradient Color Data\n\n\nAlpha Stops\n\n\nStops List\n\n\nStop-0\n\n\nStops Alpha\n\n\npoints[0].rampPoint\npoints[0].midPoint\npoints[0].opacity\n\n\n\n\n\nStop-1\n\n\nStops Alpha\n\n\npoints[1].rampPoint\npoints[1].midPoint\npoints[1].opacity\n\n\n\n\n\nStop-2\n\n\nStops Alpha\n\n\npoints[2].rampPoint\npoints[2].midPoint\npoints[2].opacity\n\n\n\n\n\nStop-3\n\n\nStops Alpha\n\n\npoints[3].rampPoint\npoints[3].midPoint\npoints[3].opacity\n\n\n\n\n\nStop-4\n\n\nStops Alpha\n\n\npoints[4].rampPoint\npoints[4].midPoint\npoints[4].opacity\n\n\n\n\n\nStop-5\n\n\nStops Alpha\n\n\npoints[4].rampPoint\npoints[4].midPoint\npoints[4].opacity\n\n\n\n\n\n\n\nStops Size\n6\n\n\n\n\nColor Stops\n\n\nStops List\n\n\nStop-0\n\n\nStops Color\n\n\npoints[0].rampPoint\npoints[0].midPoint\npoints[0].color[0]\npoints[0].color[1]\npoints[0].color[2]\n1\n\n\n\n\n\nStop-1\n\n\nStops Color\n\n\npoints[1].rampPoint\npoints[1].midPoint\npoints[1].color[0]\npoints[1].color[1]\npoints[1].color[2]\n1\n\n\n\n\n\nStop-2\n\n\nStops Color\n\n\npoints[2].rampPoint\npoints[2].midPoint\npoints[2].color[0]\npoints[2].color[1]\npoints[2].color[2]\n1\n\n\n\n\n\nStop-3\n\n\nStops Color\n\n\npoints[3].rampPoint\npoints[3].midPoint\npoints[3].color[0]\npoints[3].color[1]\npoints[3].color[2]\n1\n\n\n\n\n\nStop-4\n\n\nStops Color\n\n\npoints[4].rampPoint\npoints[4].midPoint\npoints[4].color[0]\npoints[4].color[1]\npoints[4].color[2]\n1\n\n\n\n\n\n\n\nStops Size\n5\n\n\n\n\n\n\nGradient Colors\n1.0\n\n\n\n\n\n \n \n application/vnd.adobe.aftereffects.preset-animation\n Adobe After Effects CC 2014 (Macintosh)\n 2018-01-20T12:34:50-05:00\n 2018-01-20T12:34:50-05:00\n 2018-01-20T12:34:50-05:00\n xmp.iid:9f2e7e7b-65a7-49aa-beb9-509e3e6907bd\n xmp.did:9f2e7e7b-65a7-49aa-beb9-509e3e6907bd\n xmp.did:9f2e7e7b-65a7-49aa-beb9-509e3e6907bd\n \n \n \n created\n xmp.iid:9f2e7e7b-65a7-49aa-beb9-509e3e6907bd\n 2018-01-20T12:34:50-05:00\n Adobe After Effects CC 2014 (Macintosh)\n \n \n \n \n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", template_grad6:"RIFX\x00\x00\x13\x1CFaFXhead\x00\x00\x00\x10\x00\x00\x00\x03\x00\x00\x00W\x00\x00\x00\x01\x00`\x00\x00LIST\x00\x00\x12\u00F8bescbeso\x00\x00\x008\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00`\x00\x00\x18\x00\x00\x00\x00\x00\x04\x00\x01\x00\x01\x07\u0080\x048?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\u00FF\u00FF\u00FF\u00FFLIST\x00\x00\x01\u0084tdsptdot\x00\x00\x00\x04\u00FF\u00FF\u00FF\u00FFtdpl\x00\x00\x00\x04\x00\x00\x00\x05LIST\x00\x00\x00@tdsitdix\x00\x00\x00\x04\u00FF\u00FF\u00FF\u00FFtdmn\x00\x00\x00(ADBE Root Vectors Group\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00LIST\x00\x00\x00@tdsitdix\x00\x00\x00\x04\x00\x00\x00\x00tdmn\x00\x00\x00(ADBE Vector Group\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00LIST\x00\x00\x00@tdsitdix\x00\x00\x00\x04\u00FF\u00FF\u00FF\u00FFtdmn\x00\x00\x00(ADBE Vectors Group\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00LIST\x00\x00\x00@tdsitdix\x00\x00\x00\x04\x00\x00\x00\x02tdmn\x00\x00\x00(ADBE Vector Graphic - G-Fill\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00LIST\x00\x00\x00@tdsitdix\x00\x00\x00\x04\u00FF\u00FF\u00FF\u00FFtdmn\x00\x00\x00(ADBE Vector Grad Colors\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tdsn\x00\x00\x00\x07Colors\x00\x00LIST\x00\x00\x00dtdsptdot\x00\x00\x00\x04\u00FF\u00FF\u00FF\u00FFtdpl\x00\x00\x00\x04\x00\x00\x00\x01LIST\x00\x00\x00@tdsitdix\x00\x00\x00\x04\u00FF\u00FF\u00FF\u00FFtdmn\x00\x00\x00(ADBE End of path sentinel\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00LIST\x00\x00\x10\u00A4GCstLIST\x00\x00\x00\u00B0tdbstdsb\x00\x00\x00\x04\x00\x00\x00\x01tdsn\x00\x00\x00\x07Colors\x00\x00tdb4\x00\x00\x00|\u00DB\u0099\x00\x01\x00\x07\x00\x00\u00FF\u00FF\u00FF\u00FF\x00\x00`\x00?\x1A6\u00E2\u00EB\x1CC-?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00\x00\x01\x00\b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00cdat\x00\x00\x00\x04\x00\x00\x00\x00LIST\x00\x00\x0F\u00E0GCkyUtf8\x00\x00\x0F\u00D4\n\n\n\nGradient Color Data\n\n\nAlpha Stops\n\n\nStops List\n\n\nStop-0\n\n\nStops Alpha\n\n\npoints[0].rampPoint\npoints[0].midPoint\npoints[0].opacity\n\n\n\n\n\nStop-1\n\n\nStops Alpha\n\n\npoints[1].rampPoint\npoints[1].midPoint\npoints[1].opacity\n\n\n\n\n\nStop-2\n\n\nStops Alpha\n\n\npoints[2].rampPoint\npoints[2].midPoint\npoints[2].opacity\n\n\n\n\n\nStop-3\n\n\nStops Alpha\n\n\npoints[3].rampPoint\npoints[3].midPoint\npoints[3].opacity\n\n\n\n\n\nStop-4\n\n\nStops Alpha\n\n\npoints[4].rampPoint\npoints[4].midPoint\npoints[4].opacity\n\n\n\n\n\nStop-5\n\n\nStops Alpha\n\n\npoints[5].rampPoint\npoints[5].midPoint\npoints[5].opacity\n\n\n\n\n\n\n\nStops Size\n6\n\n\n\n\nColor Stops\n\n\nStops List\n\n\nStop-0\n\n\nStops Color\n\n\npoints[0].rampPoint\npoints[0].midPoint\npoints[0].color[0]\npoints[0].color[1]\npoints[0].color[2]\n1\n\n\n\n\n\nStop-1\n\n\nStops Color\n\n\npoints[1].rampPoint\npoints[1].midPoint\npoints[1].color[0]\npoints[1].color[1]\npoints[1].color[2]\n1\n\n\n\n\n\nStop-2\n\n\nStops Color\n\n\npoints[2].rampPoint\npoints[2].midPoint\npoints[2].color[0]\npoints[2].color[1]\npoints[2].color[2]\n1\n\n\n\n\n\nStop-3\n\n\nStops Color\n\n\npoints[3].rampPoint\npoints[3].midPoint\npoints[3].color[0]\npoints[3].color[1]\npoints[3].color[2]\n1\n\n\n\n\n\nStop-4\n\n\nStops Color\n\n\npoints[4].rampPoint\npoints[4].midPoint\npoints[4].color[0]\npoints[4].color[1]\npoints[4].color[2]\n1\n\n\n\n\n\nStop-5\n\n\nStops Color\n\n\npoints[5].rampPoint\npoints[5].midPoint\npoints[5].color[0]\npoints[5].color[1]\npoints[5].color[2]\n1\n\n\n\n\n\n\n\nStops Size\n6\n\n\n\n\n\n\nGradient Colors\n1.0\n\n\n\n\n\n \n \n application/vnd.adobe.aftereffects.preset-animation\n Adobe After Effects CC 2014 (Macintosh)\n 2018-01-20T12:34:50-05:00\n 2018-01-20T12:34:50-05:00\n 2018-01-20T12:34:50-05:00\n xmp.iid:9f2e7e7b-65a7-49aa-beb9-509e3e6907bd\n xmp.did:9f2e7e7b-65a7-49aa-beb9-509e3e6907bd\n xmp.did:9f2e7e7b-65a7-49aa-beb9-509e3e6907bd\n \n \n \n created\n xmp.iid:9f2e7e7b-65a7-49aa-beb9-509e3e6907bd\n 2018-01-20T12:34:50-05:00\n Adobe After Effects CC 2014 (Macintosh)\n \n \n \n \n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", template_grad7:"RIFX\x00\x00\x15LFaFXhead\x00\x00\x00\x10\x00\x00\x00\x03\x00\x00\x00W\x00\x00\x00\x01\x00a\x00\x00LIST\x00\x00\x15(bescbeso\x00\x00\x008\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00`\x00\x00\x18\x00\x00\x00\x00\x00\x04\x00\x01\x00\x01\x07\u0080\x048?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\u00FF\u00FF\u00FF\u00FFLIST\x00\x00\x01\u0084tdsptdot\x00\x00\x00\x04\u00FF\u00FF\u00FF\u00FFtdpl\x00\x00\x00\x04\x00\x00\x00\x05LIST\x00\x00\x00@tdsitdix\x00\x00\x00\x04\u00FF\u00FF\u00FF\u00FFtdmn\x00\x00\x00(ADBE Root Vectors Group\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00LIST\x00\x00\x00@tdsitdix\x00\x00\x00\x04\x00\x00\x00\x00tdmn\x00\x00\x00(ADBE Vector Group\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00LIST\x00\x00\x00@tdsitdix\x00\x00\x00\x04\u00FF\u00FF\u00FF\u00FFtdmn\x00\x00\x00(ADBE Vectors Group\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00LIST\x00\x00\x00@tdsitdix\x00\x00\x00\x04\x00\x00\x00\x02tdmn\x00\x00\x00(ADBE Vector Graphic - G-Fill\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00LIST\x00\x00\x00@tdsitdix\x00\x00\x00\x04\u00FF\u00FF\u00FF\u00FFtdmn\x00\x00\x00(ADBE Vector Grad Colors\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tdsn\x00\x00\x00\x07Colors\x00\x00LIST\x00\x00\x00dtdsptdot\x00\x00\x00\x04\u00FF\u00FF\u00FF\u00FFtdpl\x00\x00\x00\x04\x00\x00\x00\x01LIST\x00\x00\x00@tdsitdix\x00\x00\x00\x04\u00FF\u00FF\u00FF\u00FFtdmn\x00\x00\x00(ADBE End of path sentinel\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00LIST\x00\x00\x12\u00D4GCstLIST\x00\x00\x00\u00B0tdbstdsb\x00\x00\x00\x04\x00\x00\x00\x01tdsn\x00\x00\x00\x07Colors\x00\x00tdb4\x00\x00\x00|\u00DB\u0099\x00\x01\x00\x07\x00\x00\u00FF\u00FF\u00FF\u00FF\x00\x00`\x00?\x1A6\u00E2\u00EB\x1CC-?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00\x00\x01\x00\b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00cdat\x00\x00\x00\x04\x00\x00\x00\x00LIST\x00\x00\x12\x10GCkyUtf8\x00\x00\x12\x03\n\n\n\nGradient Color Data\n\n\nAlpha Stops\n\n\nStops List\n\n\nStop-0\n\n\nStops Alpha\n\n\npoints[0].rampPoint\npoints[0].midPoint\npoints[0].opacity\n\n\n\n\n\nStop-1\n\n\nStops Alpha\n\n\npoints[1].rampPoint\npoints[1].midPoint\npoints[1].opacity\n\n\n\n\n\nStop-2\n\n\nStops Alpha\n\n\npoints[2].rampPoint\npoints[2].midPoint\npoints[2].opacity\n\n\n\n\n\nStop-3\n\n\nStops Alpha\n\n\npoints[3].rampPoint\npoints[3].midPoint\npoints[3].opacity\n\n\n\n\n\nStop-4\n\n\nStops Alpha\n\n\npoints[4].rampPoint\npoints[4].midPoint\npoints[4].opacity\n\n\n\n\n\nStop-5\n\n\nStops Alpha\n\n\npoints[5].rampPoint\npoints[5].midPoint\npoints[5].opacity\n\n\n\n\n\nStop-6\n\n\nStops Alpha\n\n\npoints[6].rampPoint\npoints[6].midPoint\npoints[6].opacity\n\n\n\n\n\n\n\nStops Size\n7\n\n\n\n\nColor Stops\n\n\nStops List\n\n\nStop-0\n\n\nStops Color\n\n\npoints[0].rampPoint\npoints[0].midPoint\npoints[0].color[0]\npoints[0].color[1]\npoints[0].color[2]\n1\n\n\n\n\n\nStop-1\n\n\nStops Color\n\n\npoints[1].rampPoint\npoints[1].midPoint\npoints[1].color[0]\npoints[1].color[1]\npoints[1].color[2]\n1\n\n\n\n\n\nStop-2\n\n\nStops Color\n\n\npoints[2].rampPoint\npoints[2].midPoint\npoints[2].color[0]\npoints[2].color[1]\npoints[2].color[2]\n1\n\n\n\n\n\nStop-3\n\n\nStops Color\n\n\npoints[3].rampPoint\npoints[3].midPoint\npoints[3].color[0]\npoints[3].color[1]\npoints[3].color[2]\n1\n\n\n\n\n\nStop-4\n\n\nStops Color\n\n\npoints[4].rampPoint\npoints[4].midPoint\npoints[4].color[0]\npoints[4].color[1]\npoints[4].color[2]\n1\n\n\n\n\n\nStop-5\n\n\nStops Color\n\n\npoints[5].rampPoint\npoints[5].midPoint\npoints[5].color[0]\npoints[5].color[1]\npoints[5].color[2]\n1\n\n\n\n\n\nStop-6\n\n\nStops Color\n\n\npoints[6].rampPoint\npoints[6].midPoint\npoints[6].color[0]\npoints[6].color[1]\npoints[6].color[2]\n1\n\n\n\n\n\n\n\nStops Size\n7\n\n\n\n\n\n\nGradient Colors\n1.0\n\n\n\n\n\n \n \n application/vnd.adobe.aftereffects.preset-animation\n Adobe After Effects CC 2014 (Macintosh)\n 2018-01-20T12:34:50-05:00\n 2018-01-20T12:34:50-05:00\n 2018-01-20T12:34:50-05:00\n xmp.iid:9f2e7e7b-65a7-49aa-beb9-509e3e6907bd\n xmp.did:9f2e7e7b-65a7-49aa-beb9-509e3e6907bd\n xmp.did:9f2e7e7b-65a7-49aa-beb9-509e3e6907bd\n \n \n \n created\n xmp.iid:9f2e7e7b-65a7-49aa-beb9-509e3e6907bd\n 2018-01-20T12:34:50-05:00\n Adobe After Effects CC 2014 (Macintosh)\n \n \n \n \n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", template_grad8:"RIFX\x00\x00\x17zFaFXhead\x00\x00\x00\x10\x00\x00\x00\x03\x00\x00\x00W\x00\x00\x00\x01\x00a\x00\x00LIST\x00\x00\x17Vbescbeso\x00\x00\x008\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00`\x00\x00\x18\x00\x00\x00\x00\x00\x04\x00\x01\x00\x01\x07\u0080\x048?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\u00FF\u00FF\u00FF\u00FFLIST\x00\x00\x01\u0084tdsptdot\x00\x00\x00\x04\u00FF\u00FF\u00FF\u00FFtdpl\x00\x00\x00\x04\x00\x00\x00\x05LIST\x00\x00\x00@tdsitdix\x00\x00\x00\x04\u00FF\u00FF\u00FF\u00FFtdmn\x00\x00\x00(ADBE Root Vectors Group\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00LIST\x00\x00\x00@tdsitdix\x00\x00\x00\x04\x00\x00\x00\x00tdmn\x00\x00\x00(ADBE Vector Group\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00LIST\x00\x00\x00@tdsitdix\x00\x00\x00\x04\u00FF\u00FF\u00FF\u00FFtdmn\x00\x00\x00(ADBE Vectors Group\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00LIST\x00\x00\x00@tdsitdix\x00\x00\x00\x04\x00\x00\x00\x02tdmn\x00\x00\x00(ADBE Vector Graphic - G-Fill\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00LIST\x00\x00\x00@tdsitdix\x00\x00\x00\x04\u00FF\u00FF\u00FF\u00FFtdmn\x00\x00\x00(ADBE Vector Grad Colors\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tdsn\x00\x00\x00\x07Colors\x00\x00LIST\x00\x00\x00dtdsptdot\x00\x00\x00\x04\u00FF\u00FF\u00FF\u00FFtdpl\x00\x00\x00\x04\x00\x00\x00\x01LIST\x00\x00\x00@tdsitdix\x00\x00\x00\x04\u00FF\u00FF\u00FF\u00FFtdmn\x00\x00\x00(ADBE End of path sentinel\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00LIST\x00\x00\x15\x02GCstLIST\x00\x00\x00\u00B0tdbstdsb\x00\x00\x00\x04\x00\x00\x00\x01tdsn\x00\x00\x00\x07Colors\x00\x00tdb4\x00\x00\x00|\u00DB\u0099\x00\x01\x00\x07\x00\x00\u00FF\u00FF\u00FF\u00FF\x00\x00`\x00?\x1A6\u00E2\u00EB\x1CC-?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00\x00\x01\x00\b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00cdat\x00\x00\x00\x04\x00\x00\x00\x00LIST\x00\x00\x14>GCkyUtf8\x00\x00\x142\n\n\n\nGradient Color Data\n\n\nAlpha Stops\n\n\nStops List\n\n\nStop-0\n\n\nStops Alpha\n\n\npoints[0].rampPoint\npoints[0].midPoint\npoints[0].opacity\n\n\n\n\n\nStop-1\n\n\nStops Alpha\n\n\npoints[1].rampPoint\npoints[1].midPoint\npoints[1].opacity\n\n\n\n\n\nStop-2\n\n\nStops Alpha\n\n\npoints[2].rampPoint\npoints[2].midPoint\npoints[2].opacity\n\n\n\n\n\nStop-3\n\n\nStops Alpha\n\n\npoints[3].rampPoint\npoints[3].midPoint\npoints[3].opacity\n\n\n\n\n\nStop-4\n\n\nStops Alpha\n\n\npoints[4].rampPoint\npoints[4].midPoint\npoints[4].opacity\n\n\n\n\n\nStop-5\n\n\nStops Alpha\n\n\npoints[5].rampPoint\npoints[5].midPoint\npoints[5].opacity\n\n\n\n\n\nStop-6\n\n\nStops Alpha\n\n\npoints[6].rampPoint\npoints[6].midPoint\npoints[6].opacity\n\n\n\n\n\nStop-7\n\n\nStops Alpha\n\n\npoints[7].rampPoint\npoints[7].midPoint\npoints[7].opacity\n\n\n\n\n\n\n\nStops Size\n8\n\n\n\n\nColor Stops\n\n\nStops List\n\n\nStop-0\n\n\nStops Color\n\n\npoints[0].rampPoint\npoints[0].midPoint\npoints[0].color[0]\npoints[0].color[1]\npoints[0].color[2]\n1\n\n\n\n\n\nStop-1\n\n\nStops Color\n\n\npoints[1].rampPoint\npoints[1].midPoint\npoints[1].color[0]\npoints[1].color[1]\npoints[1].color[2]\n1\n\n\n\n\n\nStop-2\n\n\nStops Color\n\n\npoints[2].rampPoint\npoints[2].midPoint\npoints[2].color[0]\npoints[2].color[1]\npoints[2].color[2]\n1\n\n\n\n\n\nStop-3\n\n\nStops Color\n\n\npoints[3].rampPoint\npoints[3].midPoint\npoints[3].color[0]\npoints[3].color[1]\npoints[3].color[2]\n1\n\n\n\n\n\nStop-4\n\n\nStops Color\n\n\npoints[4].rampPoint\npoints[4].midPoint\npoints[4].color[0]\npoints[4].color[1]\npoints[4].color[2]\n1\n\n\n\n\n\nStop-5\n\n\nStops Color\n\n\npoints[5].rampPoint\npoints[5].midPoint\npoints[5].color[0]\npoints[5].color[1]\npoints[5].color[2]\n1\n\n\n\n\n\nStop-6\n\n\nStops Color\n\n\npoints[6].rampPoint\npoints[6].midPoint\npoints[6].color[0]\npoints[6].color[1]\npoints[6].color[2]\n1\n\n\n\n\n\nStop-7\n\n\nStops Color\n\n\npoints[7].rampPoint\npoints[7].midPoint\npoints[7].color[0]\npoints[7].color[1]\npoints[7].color[2]\n1\n\n\n\n\n\n\n\nStops Size\n8\n\n\n\n\n\n\nGradient Colors\n1.0\n\n\n\n\n\n \n \n application/vnd.adobe.aftereffects.preset-animation\n Adobe After Effects CC 2014 (Macintosh)\n 2018-01-20T12:34:50-05:00\n 2018-01-20T12:34:50-05:00\n 2018-01-20T12:34:50-05:00\n xmp.iid:9f2e7e7b-65a7-49aa-beb9-509e3e6907bd\n xmp.did:9f2e7e7b-65a7-49aa-beb9-509e3e6907bd\n xmp.did:9f2e7e7b-65a7-49aa-beb9-509e3e6907bd\n \n \n \n created\n xmp.iid:9f2e7e7b-65a7-49aa-beb9-509e3e6907bd\n 2018-01-20T12:34:50-05:00\n Adobe After Effects CC 2014 (Macintosh)\n \n \n \n \n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", }; try { /// pick the right string for the number of gradient colors (up to 8) var gradLength = element.gradient.length; if (gradLength == 2) { fileString = presetFiles.template_grad2; } if (gradLength == 3) { fileString = presetFiles.template_grad3; } if (gradLength == 4) { fileString = presetFiles.template_grad4; } if (gradLength == 5) { fileString = presetFiles.template_grad5; } if (gradLength == 6) { fileString = presetFiles.template_grad6; } if (gradLength == 7) { fileString = presetFiles.template_grad7; } if (gradLength > 7) { fileString = presetFiles.template_grad8; } /// create ffx file var tempFile = createFile(fileString, 'grad.ffx', element); /// unable to create the file if (tempFile == null) { returnMessage.push(5); // 'Can't save preset file' return; } /// select properties and apply ffx fill = thisComp.selectedProperties[0]; var layer = fill.propertyGroup(fill.propertyDepth); fill.selected = true; layer.applyPreset(tempFile); layer.selected = false; } catch (e) { alert(e.toString() + "\nError on line: " + e.line.toString()); } } //// set layer blend mode function setLayerBlendMode(r, layer) { r.blendingMode = looseJsonParse(layer.blendMode); /// much safer than eval() function looseJsonParse(obj){ return Function('"use strict";return (' + obj + ')')(); } } //// add drop shadow effect function addDropShadow(r, layer) { try { if (layer.shadow != null) { // loop through multiple shadow objects for (var i = layer.shadow.length-1; i >= 0; i--) { // math stuff var x = layer.shadow[i].position[0]*compMult; var y = layer.shadow[i].position[1]*compMult; // pythagorean theorem dude var shadowDistance = Math.sqrt((x * x) + (y * y)); var shadowAngle = 90+(Math.atan(y/x) * (180/Math.PI)); // error catch to just define straight down shadowAngle = (isNaN(shadowAngle)) ? 180 : shadowAngle; // add drop shadow effect var shadowEffect = r("ADBE Effect Parade").addProperty("ADBE Drop Shadow"); shadowEffect("ADBE Drop Shadow-0001").setValue(layer.shadow[i].color); shadowEffect("ADBE Drop Shadow-0002").setValue(layer.shadow[i].color[3]*255); shadowEffect("ADBE Drop Shadow-0003").setValue(shadowAngle); shadowEffect("ADBE Drop Shadow-0004").setValue(shadowDistance); shadowEffect("ADBE Drop Shadow-0005").setValue(layer.shadow[i].blur*compMult); } } }catch(e) { alert(e.toString() + "\nError on line: " + e.line.toString()); } } //// add blur effect function addBlur(r, layer) { if (layer.blur != null) { // loop through multiple blur objects for (var i = layer.blur.length-1; i >= 0; i--) { /// Gaussian Blur if (layer.blur[i].type == 0) { blur = r.property('Effects').addProperty('ADBE Gaussian Blur 2'); blur.property('ADBE Gaussian Blur 2-0001').setValue(layer.blur[i].radius * compMult); return; } /// Motion Blur if (layer.blur[i].type == 1) { blur = r.property('Effects').addProperty('ADBE Motion Blur'); blur.property('ADBE Motion Blur-0001').setValue(layer.blur[i].direction); blur.property('ADBE Motion Blur-0002').setValue(layer.blur[i].radius * compMult); return; } /// Radial Blur if (layer.blur[i].type == 2) { blur = r.property('Effects').addProperty('ADBE Radial Blur'); blur.property('ADBE Radial Blur-0001').setValue(layer.blur[i].direction); blur.property('ADBE Radial Blur-0002').expression = 'transform.position'; blur.property('ADBE Radial Blur-0003').setValue(2); // style: zoom return; } } } } //// update settings of createAndApplyShadowFfx() function addInnerShadow(r, layer) { /// skip if no inner shadow if (layer.innerShadow != null) { // math stuff var x = layer.innerShadow[0].position[0]*compMult; var y = layer.innerShadow[0].position[1]*compMult; var shadowDistance = Math.sqrt((x * x) + (y * y)); // pythagorean theorem dude var shadowAngle = 180-(Math.atan(y/x) * (180/Math.PI)); // error catch to just define straight down shadowAngle = (isNaN(shadowAngle)) ? 180 : shadowAngle; // create ffx file createAndApplyShadowFfx(r); // set inner shadow properties r("ADBE Layer Styles")(3)("innerShadow/mode2").setValue(1); r("ADBE Layer Styles")(3)("innerShadow/color").setValue(layer.innerShadow[0].color); r("ADBE Layer Styles")(3)("innerShadow/opacity").setValue(layer.innerShadow[0].color[3]*100); r("ADBE Layer Styles")(3)("innerShadow/localLightingAngle").setValue(shadowAngle); r("ADBE Layer Styles")(3)("innerShadow/distance").setValue(shadowDistance); r("ADBE Layer Styles")(3)("innerShadow/blur").setValue(layer.innerShadow[0].blur * compMult); } } //// create inner shadow layer style ffx and apply it to layer function createAndApplyShadowFfx(layer) { var binaryString = "RIFX\x00\x00\f\nFaFXhead\x00\x00\x00\x10\x00\x00\x00\x03\x00\x00\x00Q\x00\x00\x00\b\x00\x7F\x00\x00LIST\x00\x00\x0B\u00E6bescbeso\x00\x00\x008\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00]\u00A8\x00\x1D\u00F8R\x00\x00\x00\x04\x00\x01\x00\x01\x07\u0080\x048?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\u00FF\u00FF\u00FF\u00FFLIST\x00\x00\x00\u00ACtdsptdot\x00\x00\x00\x04\u00FF\u00FF\u00FF\u00FFtdpl\x00\x00\x00\x04\x00\x00\x00\x02LIST\x00\x00\x00@tdsitdix\x00\x00\x00\x04\u00FF\u00FF\u00FF\u00FFtdmn\x00\x00\x00(ADBE Layer Styles\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00LIST\x00\x00\x00@tdsitdix\x00\x00\x00\x04\u00FF\u00FF\u00FF\u00FFtdmn\x00\x00\x00(innerShadow/enabled\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tdsn\x00\x00\x00\rInner Shadow\x00\x00LIST\x00\x00\x00dtdsptdot\x00\x00\x00\x04\u00FF\u00FF\u00FF\u00FFtdpl\x00\x00\x00\x04\x00\x00\x00\x01LIST\x00\x00\x00@tdsitdix\x00\x00\x00\x04\u00FF\u00FF\u00FF\u00FFtdmn\x00\x00\x00(ADBE End of path sentinel\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00LIST\x00\x00\ndtdgptdsb\x00\x00\x00\x04\x00\x00\x00\x01tdsn\x00\x00\x00\rInner Shadow\x00\x00tdmn\x00\x00\x00(innerShadow/mode2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00LIST\x00\x00\x00\u00CEtdbstdsb\x00\x00\x00\x04\x00\x00\x00\x01tdsn\x00\x00\x00\x02\x00\x00tdb4\x00\x00\x00|\u00DB\u0099\x00\x01\x00\x01\x00\x00\x00\x01\x00\x04\x00\x00]\u00A8?\x1A6\u00E2\u00EB\x1CC-?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00cdat\x00\x00\x00(@\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tdmn\x00\x00\x00(innerShadow/color\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00LIST\x00\x00\x01\x06tdbstdsb\x00\x00\x00\x04\x00\x00\x00\x01tdsn\x00\x00\x00\x02\x00\x00tdb4\x00\x00\x00|\u00DB\u0099\x00\x04\x00\x07\x00\x01\x00\x02\u00FF\u00FF\x00\x00]\u00A8?\x1A6\u00E2\u00EB\x1CC-?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00cdat\x00\x00\x00`@o\u00E0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tdmn\x00\x00\x00(innerShadow/opacity\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00LIST\x00\x00\x00\u00EEtdbstdsb\x00\x00\x00\x04\x00\x00\x00\x01tdsn\x00\x00\x00\x02\x00\x00tdb4\x00\x00\x00|\u00DB\u0099\x00\x01\x00\x01\x00\x00\u00FF\u00FF\u00FF\u00FF\x00\x00]\u00A8?\x1A6\u00E2\u00EB\x1CC-?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00\x00\x00\x00\b\t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00cdat\x00\x00\x00(@R\u00C0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tdum\x00\x00\x00\b\x00\x00\x00\x00\x00\x00\x00\x00tduM\x00\x00\x00\b@Y\x00\x00\x00\x00\x00\x00tdmn\x00\x00\x00(innerShadow/useGlobalAngle\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00LIST\x00\x00\x00\u00CEtdbstdsb\x00\x00\x00\x04\x00\x00\x00\x01tdsn\x00\x00\x00\x02\x00\x00tdb4\x00\x00\x00|\u00DB\u0099\x00\x01\x00\x01\x00\x00\x00\x01\x00\x04\x00\x00]\u00A8?\x1A6\u00E2\u00EB\x1CC-?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00cdat\x00\x00\x00(\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tdmn\x00\x00\x00(innerShadow/localLightingAngle\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00LIST\x00\x00\x00\u00CEtdbstdsb\x00\x00\x00\x04\x00\x00\x00\x01tdsn\x00\x00\x00\x02\x00\x00tdb4\x00\x00\x00|\u00DB\u0099\x00\x01\x00\x01\x00\x00\u00FF\u00FF\u00FF\u00FF\x00\x00]\u00A8?\x1A6\u00E2\u00EB\x1CC-?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00cdat\x00\x00\x00(@^\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tdmn\x00\x00\x00(innerShadow/distance\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00LIST\x00\x00\x00\u00EEtdbstdsb\x00\x00\x00\x04\x00\x00\x00\x01tdsn\x00\x00\x00\x02\x00\x00tdb4\x00\x00\x00|\u00DB\u0099\x00\x01\x00\x01\x00\x00\u00FF\u00FF\u00FF\u00FF\x00\x00]\u00A8?\x1A6\u00E2\u00EB\x1CC-?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00\x00\x00\x00\b\t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00cdat\x00\x00\x00(@\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tdum\x00\x00\x00\b\x00\x00\x00\x00\x00\x00\x00\x00tduM\x00\x00\x00\b@Y\x00\x00\x00\x00\x00\x00tdmn\x00\x00\x00(innerShadow/chokeMatte\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00LIST\x00\x00\x00\u00EEtdbstdsb\x00\x00\x00\x04\x00\x00\x00\x01tdsn\x00\x00\x00\x02\x00\x00tdb4\x00\x00\x00|\u00DB\u0099\x00\x01\x00\x01\x00\x00\u00FF\u00FF\u00FF\u00FF\x00\x00]\u00A8?\x1A6\u00E2\u00EB\x1CC-?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00\x00\x00\x00\b\t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00cdat\x00\x00\x00(\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tdum\x00\x00\x00\b\x00\x00\x00\x00\x00\x00\x00\x00tduM\x00\x00\x00\b@Y\x00\x00\x00\x00\x00\x00tdmn\x00\x00\x00(innerShadow/blur\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00LIST\x00\x00\x00\u00EEtdbstdsb\x00\x00\x00\x04\x00\x00\x00\x01tdsn\x00\x00\x00\x02\x00\x00tdb4\x00\x00\x00|\u00DB\u0099\x00\x01\x00\x01\x00\x00\u00FF\u00FF\u00FF\u00FF\x00\x00]\u00A8?\x1A6\u00E2\u00EB\x1CC-?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00\x00\x00\x00\b\t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00cdat\x00\x00\x00(@\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tdum\x00\x00\x00\b\x00\x00\x00\x00\x00\x00\x00\x00tduM\x00\x00\x00\b@Y\x00\x00\x00\x00\x00\x00tdmn\x00\x00\x00(innerShadow/noise\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00LIST\x00\x00\x00\u00EEtdbstdsb\x00\x00\x00\x04\x00\x00\x00\x01tdsn\x00\x00\x00\x02\x00\x00tdb4\x00\x00\x00|\u00DB\u0099\x00\x01\x00\x01\x00\x00\u00FF\u00FF\u00FF\u00FF\x00\x00]\u00A8?\x1A6\u00E2\u00EB\x1CC-?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00?\u00F0\x00\x00\x00\x00\x00\x00\x00\x00\x00\b\t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00cdat\x00\x00\x00(\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00tdum\x00\x00\x00\b\x00\x00\x00\x00\x00\x00\x00\x00tduM\x00\x00\x00\b@Y\x00\x00\x00\x00\x00\x00tdmn\x00\x00\x00(ADBE Group End\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\n \n \n application/vnd.adobe.aftereffects.preset-animation\n \n \n 2018-05-01T11:35:19-04:00\n 2018-05-01T11:35:19-04:00\n 2018-05-01T11:35:19-04:00\n \n \n xmp.iid:0280117407206811AB08D1F43F3BD514\n xmp.did:0280117407206811AB08D1F43F3BD514\n xmp.did:0280117407206811AB08D1F43F3BD514\n \n \n \n created\n xmp.iid:0280117407206811AB08D1F43F3BD514\n 2018-05-01T11:35:19-04:00\n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n" ; var fileName = 'InnerShadow.ffx'; var shadowPresetFile = new File(ffxFolder + '/' + fileName); if ( !shadowPresetFile.exists ) { shadowPresetFile = createFile(binaryString, fileName); } layer.selected = true; layer.applyPreset(shadowPresetFile); layer.selected = false; } ///////// file management ///////// //// check if AE prefs allow for writing files to disk function isAllowWriteFiles() { var securitySetting; try { // returns a 1 or 0 securitySetting = app.preferences.getPrefAsLong("Main Pref Section", "Pref_SCRIPTING_FILE_NETWORK_SECURITY"); return (securitySetting == 1); } catch (e) { return (false); } } //// create a file on disk from binary data function createFile(str, filename, element) { /// check if scripts are allowed to write files if (!(isAllowWriteFiles())) { alert ('In order to make ' + scriptName + ' work, you need to enable little preference in After Effects: \n\nAllow Scripts to Write Files and Access Network\n\nCheck that box and we\'ll be in business.'); try{ app.executeCommand(2359); } catch (e) { alert(e); } if (!isAllowWriteFiles()) { return null }; } var binaryString = ''; var lines = str.split('\n'); /// go through each line of the binary string for (var i = 0; i < lines.length; i++) { line = lines[i]; // find and replace with color data if (line.search(/points/) != -1) { str = eval('element.gradient.' + line.toString()).toFixed(8); line = '' + str + ''; } binaryString += (line + '\n'); } /// create file var exportFile = new File(ffxFolder + '/' + filename); exportFile.encoding = 'BINARY'; exportFile.open( 'w' ); exportFile.write( binaryString ); exportFile.close(); return exportFile; } ///////// guide functions ///////// //// toggle guide layer visibility function toggleGroupVisibility() { /// reset variables var guideViz; /// skip if no comp selected if (!setComp()) {return;} app.beginUndoGroup('Toggle Guide Layer Visibility'); /// loop through all layers for (var i = 1; i <= thisComp.layers.length; i++) { var currentLayer = thisComp.layer(i); /// check if layer is a guide if (currentLayer.guideLayer === true) { // find the visibility of the first guideLayer guideViz = currentLayer.enabled; /// quit looping break; } } /// loop through all layers for (var j = 1; j <= thisComp.layers.length; j++) { /// set var currentLayer var currentLayer = thisComp.layer(j); /// check if its a guideLayer if(currentLayer.guideLayer === true) { // set the layer to the inverse of the first found guideLayer currentLayer.enabled = !guideViz; } } } //// convert a guide and children layers to precomp function groupToPrecomp() { /// initialize if (!setComp()) { return; }; app.beginUndoGroup('Group to precomp'); /// create Groups folder if needed groupFolder = createNamedFolder('Groups'); /// quit if no layers selected MSG if (thisComp.selectedLayers.length < 1) { return; } /// get the selected layers var masterGroups = thisComp.selectedLayers; var nonParentedLayers = []; /// loop through all selected layer for (var i = 0; i < masterGroups.length; i++) { convertParentToPrecomp(masterGroups[i]); } // precomp loose layers precompLayers(nonParentedLayers); app.endUndoGroup(); function precompLayers(layers) { try { var precomp = thisComp.layers.precompose(layers, thisComp.layer(layers[0]).name, true); precomp.parentFolder = groupFolder; } catch (e) {} } function convertParentToPrecomp(masterGroup) { try { /// get info about the group parent var masterPos = masterGroup('ADBE Transform Group')('ADBE Position').value; var masterRot = masterGroup('ADBE Transform Group')('ADBE Rotate Z').value; var masterscale = masterGroup('ADBE Transform Group')('ADBE Scale').value / 100; var masterLabel = masterGroup.label; var masterName = masterGroup.name; var masterParent = masterGroup.parent; var masterIn = masterGroup.inPoint; var masterOut = masterGroup.outPoint; var masterTrackMatte = masterGroup.trackMatteType; // get the comp position masterGroup.parent = null; var masterCompPos = masterGroup('ADBE Transform Group')('ADBE Position').value; masterGroup.parent = masterParent; /// get the children of the group parent var groupLayers = [masterGroup.index]; getChildren(masterGroup, groupLayers); /// if layer has no children if (groupLayers.length < 2) { if (!masterParent) { // if layer doesn't have children or a parent add it to a list to precomp without nesting nonParentedLayers.push(masterGroup.index); } return; // quit } var isGroupLayer = (masterGroup.name.match('\u25BD')) ? true : false; // check if it's a group layer from Sketch/Figma if (isGroupLayer) { var bounds = masterGroup.sourceRectAtTime(thisComp.time, false); var masterSize = [Math.round(bounds.width * masterscale[0]), Math.round(bounds.height * masterscale[1])]; } else { var masterSize = [thisComp.width, thisComp.height]; } /// un-parent non-AEUX layers for (var i = 0; i < groupLayers.length; i++) { // thisComp.layer(groupLayers[i]).parent = null; } /// precompose the group parent and children var precomp = thisComp.layers.precompose(groupLayers, masterGroup.name, true); precomp.parentFolder = groupFolder; precomp.width = masterSize[0]; precomp.height = masterSize[1]; // reset group parent to comp center if (isGroupLayer) { precomp.layer(masterName)('ADBE Transform Group')('ADBE Position').setValue([precomp.width/2, precomp.height/2]); } precomp.label = masterLabel; // loop through all layers and un-parent precomp.layers[1]('ADBE Transform Group')('ADBE Rotate Z').setValue(0); // try to delete the top most group layer, if it's a mask then unlock and delete the top two layers if (isGroupLayer) { try { precomp.layers[1].remove(); } catch (e) { precomp.layers[1].locked = false; precomp.layers[1].remove(); precomp.layers[1].remove(); } } /// apply transforms from the group parent to the new precomp var newGroupLayer = thisComp.selectedLayers[0]; newGroupLayer.collapseTransformation = true; newGroupLayer.parent = masterParent; newGroupLayer.trackMatteType = masterTrackMatte; newGroupLayer('ADBE Transform Group')('ADBE Position').setValue(masterPos); newGroupLayer('ADBE Transform Group')('ADBE Rotate Z').setValue(masterRot); newGroupLayer.label = masterLabel; // set in and out points newGroupLayer.inPoint = masterIn; newGroupLayer.outPoint = masterOut; /// Reset the anchor point if (!isGroupLayer) { newGroupLayer('ADBE Transform Group')('ADBE Anchor Point').setValue(masterCompPos); } } catch (e) { } } } //// convert precomp to layers function precompToLayers() { /// initialize if (!setComp()) { return; }; labelColor = 0; prefs.precompGroups = false; compMult = 1; /// quit if no layers selected MSG if (thisComp.selectedLayers.length < 1) { return; } /// get the selected layers var precompMasters = thisComp.selectedLayers; app.beginUndoGroup('Group to precomp'); /// loop through all selected layer for (var i = 0; i < precompMasters.length; i++) { precompMaster = precompMasters[i]; var isGroupLayer = (precompMaster.name.match('\u25BD')) ? true : false; // check if it's a group layer from Sketch/Figma inPoint = precompMasters[i].inPoint; outPoint = precompMasters[i].outPoint; label = precompMasters[i].label; /// skip if not a comp MSG if (!(precompMasters[i].source instanceof CompItem)) { continue; } convertToGroupLayers(precompMasters[i], precompMasters[i].source.layers, isGroupLayer); if (isGroupLayer) { thisComp.selectedLayers[0].inPoint = inPoint; thisComp.selectedLayers[0].outPoint = outPoint; thisComp.selectedLayers[0].label = label; } } app.endUndoGroup(); function convertToGroupLayers(precompMaster, precompedLayers, isGroupLayer) { /// initialize group object var groupObj = [{ "type": "Group", "name": 'Group', "id": "", "frame": { "x": 0, "y": 0, "width": precompMaster.width, "height": precompMaster.height }, "isVisible": 1, "opacity": 100, "rotation": 0, "blendMode": 0, "flip": [ 100, 100 ], "hasClippingMask": 0, "shouldBreakMaskChain": 1, "layers": [0,0] }] /// store each layer with it's parent var parentList = []; var lockedList = []; /// run the filter to create the guide layer filterTypes(groupObj); /// The top layer is the new guide layer var r = thisComp.layer(1); r.enabled = true; r.parent = precompMaster.parent; /// set layer transforms r('ADBE Transform Group')('ADBE Anchor Point').setValue( precompMaster('ADBE Transform Group')('ADBE Anchor Point').value ); r('ADBE Transform Group')('ADBE Position').setValue( precompMaster('ADBE Transform Group')('ADBE Position').value ); r('ADBE Transform Group')('ADBE Rotate Z').setValue( precompMaster('ADBE Transform Group')('ADBE Rotate Z').value ); r('ADBE Transform Group')('ADBE Scale').setValue( precompMaster('ADBE Transform Group')('ADBE Scale').value ); /// copy layers from the precomp into the main comp for (var i = precompedLayers.length; i > 0; i--) { var nonParented = false; // store layer parent data parentList[i] = (precompedLayers[i].parent) ? precompedLayers[i].parent.index : null; lockedList[i] = (precompedLayers[i].locked) ? true : false; // unlock layers precompedLayers[i].locked = false; if (precompedLayers[i].parent) { precompedLayers[i].parent = null; // nonParentedPos = precompedLayers[i]('ADBE Transform Group')('ADBE Position').value; } precompedLayers[i].copyToComp(thisComp); thisComp.layer(1).setParentWithJump(r); thisComp.layer(1).moveAfter(r); } /// new layer to store all the child layer indexes var groupLayersList = [r.index]; getChildren(r, groupLayersList); /// loop through all child layer for (var j = groupLayersList.length-1; j >= 0; j--) { // move layers below the parent layer thisComp.layer(groupLayersList[j]).moveAfter(precompMaster); } /// re-parent layers for (var l = parentList.length-1; l > 0; l--) { // select new layers if (!isGroupLayer) { thisComp.layer(r.index + l).selected = true; } if (parentList[l]) { thisComp.layer(r.index + l).parent = thisComp.layer(r.index + parentList[l]) } } /// re-lock layers for (var m = lockedList.length-1; m > 0; m--) { if (lockedList[m]) { thisComp.layer(r.index + m).locked = true; } } if (!isGroupLayer) { // remove the generic group layer var mainIndex = r.index; r.remove() thisComp.layer(mainIndex).name = precompMaster.name; } /// remove precomp from work comp var precompSource = precompMaster.source; precompMaster.remove(); /// check if the precomp exists in mutiple comps if (precompSource.usedIn.length < 1) { /// remove precomp from project precompSource.remove(); } } } //// return an array of layer indexes that are children of the parent layer function getChildren(parent, layerList) { // returns an array of parent and all children // loop through all layers in the comp for (var i = 1; i <= thisComp.layers.length; i++) { layer = thisComp.layers[i]; // check if the layer is a child of the parent group layer if (layer.parent == parent) { // add to layer layerList.push(layer.index); // recurse for layers parented to this layer getChildren(layer, layerList); } } return layerList; } //// scan comp to find all group layers and delete them function deleteGroupLayers() { app.beginUndoGroup('Group to precomp') /// initialize if (!setComp()) { return; }; /// loop through all layers in comp for (var i = thisComp.layers.length; i > 0; i--) { layer = thisComp.layer(i); // if the layer name starts with ▽ if (layer.name.charAt(0) == '\u25BD' && layer.guideLayer) { layer.remove(); } } app.endUndoGroup(); } ///////// support functions ///////// //// deselect everything within a comp function ae_deselectProps() { var propLength = thisComp.selectedProperties.length; for (var i = 0; i < propLength; i++) { thisComp.selectedProperties[0].selected = false; } } //// increment the comp name based on existing project comps function nameInc(inputStr, itemGroup) { /// reset variables var activeLayer; var incName = inputStr; var activeCaps; var inputCaps = inputStr.toUpperCase(); for (var i = 1; i <= itemGroup.length; i++) { // loop through all layers activeLayer = itemGroup[i]; activeCaps = activeLayer.name.toUpperCase(); if (activeCaps === inputCaps) { // check if the name is the same as defined var lnSuf = parseInt(incName.match(/\d+$/)); // pull out the suffix if (!isNaN(lnSuf)) { // check if suffix is a number var numInc = parseInt(lnSuf) + 1; var lnCtrlName = activeLayer.name.split(/\d+$/)[0]; // grab the layer name contrller incName = lnCtrlName + numInc; // incriment incName = nameInc(incName, app.project.items); break; } else { incName = inputStr + ' 2'; // add a 2 if incrimenting from a basic name incName = nameInc(incName, app.project.items); break; } } } return incName; } //// open a browser and got to url function visitURL(url) { // create clickable links if ($.os.indexOf('Windows') != -1) { system.callSystem('cmd /c "' + Folder.commonFiles.parent.fsName + "\\Internet Explorer\\iexplore.exe" + '" ' + url); } else { var cmd = 'open "' + url + '"'; system.callSystem(cmd); } } ///////// scriptUI elements ///////// //// reset the progress bar back to zero function resetProgressDialog(str, hideProgressBar) { try { progressText.remove(0); } catch(e) {}; try { progressDialog.remove(1); } catch(e) {}; if (hideProgressBar) { } else { pbar = progressDialog.add ('progressbar', undefined, 0, 1); pbar.value = 0; pbar.preferredSize.width = 300; // pbar.value = 0; } progressText.add('statictext', undefined, str); progressDialog.layout.layout(true); progressDialog.show(); // open popup $.sleep(200); } //// Show update Ae panel dialog function updateAePanel(msgData) { var updateDialog = new Window ('dialog', 'Update Ae panel first'); updateDialog.alignChildren = 'fill'; var updateText = updateDialog.add('group'); updateText.alignChildren = ['center', 'center']; updateText.add('statictext', undefined, msgData.text, {multiline: true}); // updateText.preferredSize.width = 300; var buttonsGoup = updateDialog.add('group'); buttonsGoup.alignChildren = ['center', 'center']; var updateCancel = buttonsGoup.add('button', undefined, 'Cancel', {name:'cancel'}); var updateUrl = buttonsGoup.add('button', undefined, 'Download', {name:'ok'}); updateCancel.onClick = function() { updateDialog.hide(); } updateUrl.onClick = function() { visitURL(msgData.url); updateDialog.hide(); } updateDialog.show(); } //// Define save location for Figma images function downloadFigmaImages() { resetProgressDialog('Downloading Figma images', true); var filePath = Folder.selectDialog(['Download Figma images - Cancel to skip download and just build layers']); if (filePath == null) { // canceled progressDialog.hide(); return null }; return filePath.absoluteURI; } //// Progress bar popup as scriptUI var progressDialog = new Window ('palette', 'Hold on. One sec.'); progressDialog.alignChildren = 'fill'; var progressText = progressDialog.add('group'); progressText.minimumSize.width = 330; progressText.alignChildren = ['center', 'center']; ////// public functions ////// return { popup: function () { alert('yay'); }, buildLayers: function (compObj) { return buildLayers(compObj); }, toggleGroupVisibility: function () { toggleGroupVisibility() }, groupToPrecomp: function () { groupToPrecomp() }, precompToLayers: function () { precompToLayers() }, deleteGroupLayers: function () { deleteGroupLayers() }, updateAePanel: function (msgData) { return updateAePanel(msgData); }, downloadFigmaImages: function () { return downloadFigmaImages(); }, }; })();