├── photoshop
├── export2EdgeAnimate
│ ├── exportToEdgeAnimateTest.jsx
│ ├── exportToEdgeAnimate.jsx
│ ├── readme.md
│ └── exportToEdgeAnimate.jsxbin
├── export2easelJS
│ ├── readme.md
│ ├── exportToEaselJS.jsx
│ └── exportToEaselJSPanel.jsx
├── template1.txt
├── template2.txt
├── replaceAllSmartObjectContents.jsx
├── generative-art-examples
│ ├── strips.jsx
│ └── polygon.jsx
├── PhotoshopCommons.jsx
├── PrimitiveShapes.jsx
├── LayerExporter.jsx
├── LayerDataExtractor.jsx
├── EaselJSExporter.jsx
└── SpriteExporter.jsx
├── illustrator
├── removeEmpyLayers
│ ├── remove.png
│ ├── readme.md
│ └── removeEmptyLayers.jsx
├── randomizeColors
│ ├── screenshot.png
│ ├── readme.md
│ └── randomizeColors.jsx
├── newLayerFromSel
│ ├── readme.md
│ └── newLayerFromSel.jsx
├── distribSelection2Layers
│ ├── readme.md
│ └── distribSelectionToLayers.jsx
├── export2EdgeAnimate
│ ├── export2AnimateTest.jsx
│ ├── readme.md
│ ├── export2Animate.jsx
│ └── export2Animate.jsxbin
├── export-layers-v1
│ ├── readme.md
│ ├── export-layers-panelscript.jsx
│ ├── export-layers.jsx
│ ├── LayerExporter.jsx
│ └── LayerDataExtractor.jsx
├── export-layers-v2
│ ├── readme.md
│ ├── tester.jsx
│ ├── Renamer.jsx
│ ├── ExportLayersAndData.jsx
│ ├── HTMLExporter.jsx
│ ├── AltLayerExporter.jsx
│ ├── DataExtractor.jsx
│ └── ExportLayersAndData.jsxbin
├── fillArtboardWithShape
│ ├── readme.md
│ └── fillArtboardWithShape.jsx
└── savelayerstoai
│ ├── readme.md
│ └── savelayerstoai.jsx
├── .gitignore
├── readme.md
├── flash-pro
└── createJS
│ ├── README.md
│ ├── easeljs-json.plugin.jsfl
│ └── easeljs2.plugin.jsfl
├── edgeanimate
└── EdgeAnimateImporter.jsx
└── common
├── Utils.jsx
└── json2.js
/photoshop/export2EdgeAnimate/exportToEdgeAnimateTest.jsx:
--------------------------------------------------------------------------------
1 | #include "exportToEdgeAnimate.jsx"
$.level = 0;
export2Animate();
--------------------------------------------------------------------------------
/illustrator/removeEmpyLayers/remove.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/davidderaedt/CSscripts/HEAD/illustrator/removeEmpyLayers/remove.png
--------------------------------------------------------------------------------
/illustrator/randomizeColors/screenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/davidderaedt/CSscripts/HEAD/illustrator/randomizeColors/screenshot.png
--------------------------------------------------------------------------------
/illustrator/newLayerFromSel/readme.md:
--------------------------------------------------------------------------------
1 | # New Layer From Selection
2 |
3 | Creates a new layer, and moves all selected elements to this new layer.
--------------------------------------------------------------------------------
/illustrator/distribSelection2Layers/readme.md:
--------------------------------------------------------------------------------
1 | # Distribute selection to layers
2 |
3 | Simply distribute the currently selected items across new layers
--------------------------------------------------------------------------------
/illustrator/export2EdgeAnimate/export2AnimateTest.jsx:
--------------------------------------------------------------------------------
1 | // This file is intended to test the EdgeAnimate exporter
2 | // outside the panel context
3 |
4 | #include "export2Animate.jsxbin"
5 |
6 | var useSVG = true;
7 |
8 | doExport(useSVG);
--------------------------------------------------------------------------------
/photoshop/export2easelJS/readme.md:
--------------------------------------------------------------------------------
1 | # Export To EaselJS
2 |
3 | Exports a naming-convention based PSD file to a spritesheet for use with EaselJS projects.
4 |
5 | Please refer to the CreateJS utils repo for downloads and for more informations.
6 |
--------------------------------------------------------------------------------
/photoshop/template1.txt:
--------------------------------------------------------------------------------
1 | //EaselJS Spritesheet
2 | if (!window.@{libName}) { window.@{libName} = {}; }
3 | (function(scope) {
4 | var spritesheetPath='@{folder}/@{imageName}.png';
5 |
6 | @{sprites}
7 |
8 | // Endofspritesdef
9 | }(window.@{libName}));
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 |
2 | photoshop/LiveCoding.jsx
3 |
4 | photoshop/test-ignore/
5 | illustrator/test-ignore/
6 |
7 | # OS generated files #
8 | ######################
9 | .DS_Store
10 | .DS_Store?
11 | ._*
12 | .Spotlight-V100
13 | .Trashes
14 | Icon?
15 | ehthumbs.db
16 | Thumbs.db
--------------------------------------------------------------------------------
/illustrator/export-layers-v1/readme.md:
--------------------------------------------------------------------------------
1 | # Export layers (Deprecated)
2 |
3 | This folder holds the previous methods I used for extracting data and exporting images from layers. It is now deprecated.
4 |
5 | Please use the new version, export-layers-v2, which is used for the Layer Exporter panel.
--------------------------------------------------------------------------------
/illustrator/removeEmpyLayers/readme.md:
--------------------------------------------------------------------------------
1 | # Remove empty layers
2 |
3 | Clean your AI file by recursively removing empty layers, or sublayers.
4 |
5 | [Download JSX file here](https://raw.github.com/davidderaedt/CSscripts/master/illustrator/removeEmpyLayers/removeEmptyLayers.jsx)
6 |
7 | 
--------------------------------------------------------------------------------
/illustrator/randomizeColors/readme.md:
--------------------------------------------------------------------------------
1 | # Randomize Colors
2 |
3 | Randomly applies fill and stroke colors from the selected swatches to all selected items.
4 |
5 | [Download](https://raw.github.com/davidderaedt/CSscripts/master/illustrator/randomizeColors/randomizeColors.jsx)
6 |
7 | 
--------------------------------------------------------------------------------
/illustrator/newLayerFromSel/newLayerFromSel.jsx:
--------------------------------------------------------------------------------
1 | #target illustrator
2 |
3 | var doc = app.activeDocument;
4 | var items = doc.selection;
5 |
6 | var n = items.length;
7 |
8 | var layer = doc.layers.add();
9 |
10 | for ( var i = n-1 ; i >=0 ; i--) {
11 | var item = items[i];
12 | item.move(layer,ElementPlacement.PLACEATBEGINNING);
13 | }
14 |
--------------------------------------------------------------------------------
/illustrator/export-layers-v2/readme.md:
--------------------------------------------------------------------------------
1 | #Layer Exporter
2 |
3 | Scripts used for Illustrator layer data extraction and image export.
4 |
5 | They were meant to be used in the context of the Layer Exporter Panel, loaded in their compiled JSXBIN form (see the panel source repo for more informations).
6 |
7 | However, it can still be used directly if you carefully respect the dependency tree. See tester.jsx for a sample.
--------------------------------------------------------------------------------
/illustrator/fillArtboardWithShape/readme.md:
--------------------------------------------------------------------------------
1 | # Fill artboard with shape
2 |
3 | Duplicates the selected item so that it completely covers the current artboard.
4 | Consider this as a simpler alternative to patterns, where shape remain directly accessible in the current layer.
5 |
6 | [Download JSX file here](https://raw.github.com/davidderaedt/CSscripts/master/illustrator/fillArtboardWithShape/fillArtboardWithShape.jsx)
7 |
8 |
--------------------------------------------------------------------------------
/readme.md:
--------------------------------------------------------------------------------
1 | Creative Cloud Scripts
2 | ---------
3 |
4 | Various scripts for Creative Cloud (fka Creative Suite) tools organized in a very simple framework.
5 |
6 | Scripts are organized by software (Photoshop, Illustrator, Flash Pro…). Inside each folder is a series of utilities declared as top-level object, usually defined inside function closures.
7 |
8 | Subfolders contain ready-to-use scripts. When available, end users should *always* use the compiled `jsxbin` version of the scripts since it includes dependencies.
9 |
10 |
--------------------------------------------------------------------------------
/illustrator/distribSelection2Layers/distribSelectionToLayers.jsx:
--------------------------------------------------------------------------------
1 | // (c) Copyright 2013 Adobe Systems, Inc. All rights reserved.
2 | // author David Deraedt
3 |
4 | // Distributes selected items across new layers
5 |
6 | #target illustrator
7 |
8 | var doc = app.activeDocument;
9 | var items = doc.selection;
10 |
11 | var n = items.length;
12 |
13 | for ( var i = n-1 ; i >=0 ; i--) {
14 |
15 | var item = items[i];
16 | var layer = doc.layers.add();
17 | item.move(layer,ElementPlacement.PLACEATBEGINNING);
18 | }
19 |
20 |
21 |
--------------------------------------------------------------------------------
/illustrator/export-layers-v2/tester.jsx:
--------------------------------------------------------------------------------
1 | #include ExportLayersAndData.jsx
2 |
3 | var imageParams = {
4 | precision: 1,
5 | svgFont: false,
6 | jpgQuality: 100,
7 | embedImages: true,
8 | svgCssPropLoc:0 // 0 = presentation att, 1 = style el, 2 = style att
9 | };
10 |
11 | var outputParams = {
12 | createJSON:true,
13 | toHTML:true,
14 | sepCss:true,
15 | toEdgeAnimate:false
16 | };
17 |
18 | var data = $.exportLayersAndData(imageParams, outputParams);
19 |
20 | //makeLog("IllustratorLayerExporter");
21 |
--------------------------------------------------------------------------------
/photoshop/template2.txt:
--------------------------------------------------------------------------------
1 | // @{spriteName}
2 | var @{spriteName} = function() {this.initialize();}
3 | @{spriteName}._SpriteSheet = new createjs.SpriteSheet(
4 | {
5 | images: [spritesheetPath],
6 | frames:@{frameData},
7 | animations: @{animationData}
8 | });
9 |
10 | var @{spriteName}_p = @{spriteName}.prototype = new createjs.BitmapAnimation();
11 | @{spriteName}_p.BitmapAnimation_initialize = @{spriteName}_p.initialize;
12 | @{spriteName}_p.initialize = function() {
13 | this.BitmapAnimation_initialize(@{spriteName}._SpriteSheet);
14 | this.paused = false;
15 | }
16 | scope.@{spriteName} = @{spriteName};
--------------------------------------------------------------------------------
/illustrator/savelayerstoai/readme.md:
--------------------------------------------------------------------------------
1 | # Save Layers to ai files
2 |
3 | This script saves each layer of an .ai file to its own, separate .ai file. By default, the content (aka page items) of the original layer will be transformed to layers itself in the new file, so that this script can be used recursively.
4 |
5 | This script can be useful in integration processes where only top level layers are considered (such as when working between AfterEffects and Illustrator or using Illustrator Layer Exporter).
6 |
7 | [Download JSX](https://raw.githubusercontent.com/davidderaedt/CSscripts/master/illustrator/savelayerstoai/savelayerstoai.jsx)
--------------------------------------------------------------------------------
/flash-pro/createJS/README.md:
--------------------------------------------------------------------------------
1 | Flash Pro CS6 EaselJS Plugins
2 | =================
3 |
4 |
5 | Install flash pro plugins simply by copying the JSFL files in
6 | */Applications/Adobe Flash CS6/Common/Configuration/Sprite Sheet Plugins*
7 | …or the equivalent path on Windows.
8 |
9 | `easeljs2` works just like the original exporter, except that it stores classes in an object (`myGame`, by default) rather than in the global `window` object and it exposes the spritesheet folder as a variable named `spritesheetPath` in the generated JS file.
10 |
11 | The JSFL file exposes various options at the top of the file, such as the default destination folder for the spritesheet, or the ability to get rid of methods which expose animations (see comments for more informations).
12 |
13 |
14 | `easeljs-json` simply exports all data in JSON format rather than in a javascript file.
15 |
16 |
--------------------------------------------------------------------------------
/photoshop/export2EdgeAnimate/exportToEdgeAnimate.jsx:
--------------------------------------------------------------------------------
1 | #include "../LayerDataExtractor.jsx"
#include "../LayerExporter.jsx"
#include "../../edgeanimate/EdgeAnimateImporter.jsx"
#target photoshop
function export2Animate(){
if ( app.documents.length == 0 ) return;
var doc = app.activeDocument;
// Switch to pixel units
var strtRulerUnits = app.preferences.rulerUnits;
if (strtRulerUnits != Units.PIXELS) {
app.preferences.rulerUnits = Units.PIXELS;
}
var itemsData = LayerDataExtractor.exportLayersData(doc, "PNG");
inspectArray(itemsData);
var anFile = File.openDialog ("Select the .an file of the destination Edge Animate project.");
if(!anFile) return;
var destFolder = anFile.parent;
var imgFolder = new Folder(destFolder.path +"/"+ destFolder.name + "/images/");
if(!imgFolder.exists) imgFolder.create();
LayerExporter.exportDocLayers(doc, imgFolder);
EdgeAnimateImporter.doImport(anFile, itemsData);
app.preferences.rulerUnits = strtRulerUnits;
}
--------------------------------------------------------------------------------
/photoshop/export2easelJS/exportToEaselJS.jsx:
--------------------------------------------------------------------------------
1 | // Test script for SpriteExporter and EaselJSExporter
2 |
3 | // enable double clicking from the Macintosh Finder or the Windows Explorer
4 | #target photoshop
5 |
6 | #include "../EaselJSExporter.jsx"
7 | #include "../SpriteExporter.jsx"
8 |
9 | // in case we double clicked the file
10 | app.bringToFront();
11 |
12 | // debug level: 0-2 (0:disable, 1:break on error, 2:break at beginning)
13 | $.level = 1;
14 |
15 |
16 |
17 | var libFileName = "spriteLib.js";
18 |
19 | // Check if we have a doc to work with
20 | if (app.documents.length == 0){
21 | alert ("No document opened");
22 | }
23 | else {
24 |
25 | // Let the user select its destination and save
26 | var destF = Folder.selectDialog ("Select Destination");
27 |
28 | if(destF){
29 | var folderName = destF.absoluteURI+"/";
30 | var fileDest = folderName + libFileName;
31 | SpriteExporter.doExport(app.activeDocument, EaselJSExporter, folderName, fileDest);
32 | }
33 | }
34 |
35 |
36 |
--------------------------------------------------------------------------------
/photoshop/replaceAllSmartObjectContents.jsx:
--------------------------------------------------------------------------------
1 |
2 |
3 | function replaceCurrentSO(filePath){
4 |
5 | var idplacedLayerReplaceContents = stringIDToTypeID( "placedLayerReplaceContents" );
6 | var desc = new ActionDescriptor();
7 | var idnull = charIDToTypeID( "null" );
8 | desc.putPath( idnull, new File(filePath) );
9 | executeAction( idplacedLayerReplaceContents, desc, DialogModes.NO );
10 | }
11 |
12 |
13 | function replaceAllSmartObjects(filePath) {
14 |
15 | var doc = app.activeDocument;
16 |
17 | var layers = doc.artLayers;
18 |
19 | var i;
20 | for (i = 0; i < layers.length; i++) {
21 | var l = layers[i];
22 | if (l.kind == LayerKind.SMARTOBJECT) {
23 | //log(l.name + ' is a smartObject');
24 | doc.activeLayer = l;
25 | replaceCurrentSO(filePath);
26 | }
27 | }
28 | }
29 |
30 |
31 | var path = "/Users/dderaedt/Creative Cloud Files/paperjs.png";
32 |
33 | replaceAllSmartObjects(path);
34 |
--------------------------------------------------------------------------------
/illustrator/export-layers-v1/export-layers-panelscript.jsx:
--------------------------------------------------------------------------------
1 | #include "LayerExporter.jsx"
2 |
3 | #target illustrator
4 |
5 | function exportLayers(exportType, destFolderPath) {
6 |
7 | if ( app.documents.length > 0 ) {
8 |
9 | var doc = app.activeDocument;
10 | var docFile = doc.fullName;
11 |
12 | if(!doc.saved){
13 | Window.alert("This script needs to modify your document. Please save it before running this script.");
14 | return;
15 | }
16 |
17 | var destFolder;
18 | if(!destFolderPath) destFolder = Folder.selectDialog ("Select Destination Folder");
19 | else destFolder = new Folder (destFolderPath);
20 |
21 | if(!destFolder) return;
22 |
23 |
24 | LayerExporter.exportLayers(doc, destFolder, exportType);
25 |
26 | // Close and reopen original
27 | // necessary since the script needs to modify the original file
28 | doc.close(SaveOptions.DONOTSAVECHANGES);
29 | doc = null;
30 | app.open(docFile);
31 |
32 | }
33 |
34 | }
35 |
36 | $.exportLayers = exportLayers;
--------------------------------------------------------------------------------
/photoshop/export2easelJS/exportToEaselJSPanel.jsx:
--------------------------------------------------------------------------------
1 | // Test script for SpriteExporter and EaselJSExporter
// enable double clicking from the Macintosh Finder or the Windows Explorer
#target photoshop
#include "../EaselJSExporter.jsx"
#include "../SpriteExporter.jsx"
// in case we double clicked the file
app.bringToFront();
// debug level: 0-2 (0:disable, 1:break on error, 2:break at beginning)
$.level = 1;
$.cjs_xport={};
$.cjs_xport.doExport = function (pPath) {
var libFileName = "spriteLib.js";
// Check if we have a doc to work with
if (app.documents.length == 0){
alert ("No document opened");
}
else {
// Let the user select its destination and save
var destF = new Folder(pPath) || Folder.selectDialog ("Select Destination");
if(destF){
var folderName = destF.absoluteURI+"/";
var fileDest = folderName + libFileName;
SpriteExporter.doExport(app.activeDocument, EaselJSExporter, folderName, fileDest);
}
}
}
--------------------------------------------------------------------------------
/illustrator/export-layers-v1/export-layers.jsx:
--------------------------------------------------------------------------------
1 | #include "LayerExporter.jsx"
2 |
3 | #include "LayerDataExtractor.jsx"
4 |
5 |
6 | #target illustrator
7 |
8 | function exportLayers(exportType) {
9 |
10 | if ( app.documents.length > 0 ) {
11 |
12 | var doc = app.activeDocument;
13 | var docFile = doc.fullName;
14 |
15 | if(!doc.saved){
16 | Window.alert("This script needs to modify your document. Please save it before running this script.");
17 | return;
18 | }
19 |
20 | var destFolder = Folder.selectDialog ("Select Destination Folder");
21 | if(!destFolder) return;
22 |
23 | /*
24 | var ldata = LayerDataExtractor.exportLayersData(doc, exportType);
25 | $.writeln(ldata);
26 | */
27 | LayerExporter.exportLayers(doc, destFolder, exportType);
28 |
29 | // Close and reopen original
30 | // necessary since the script needs to modify the original file
31 | doc.close(SaveOptions.DONOTSAVECHANGES);
32 | doc = null;
33 | app.open(docFile);
34 |
35 | }
36 |
37 | }
38 |
39 | exportLayers(ExportType.SVG);
--------------------------------------------------------------------------------
/photoshop/export2EdgeAnimate/readme.md:
--------------------------------------------------------------------------------
1 | # Photoshop To Edge Animate Exporter
2 |
3 |
4 | >WARNING: This is an early preview for an upcoming (unofficial) panel / extension. This script will modify the original .an file so please backup and use at you own risk!
5 |
6 | Feeling adventurous? You can try the panel here:
7 |
8 | [DOWNLOAD EDGE ANIMATE EXTENSION PREVIEW](https://dl.dropbox.com/u/112869/panel-and-testfiles.zip)
9 |
10 | ## Description
11 |
12 | This script exports the active Photoshop document to an Edge Animate project. Each layer is converted to a PNG file placed in the project's "images" folder. The project's `xxx_edge.js` dom array will also be modified to properly place each image onto the project's stage.
13 |
14 | The script is recursive, meaning that layer groups will be correctly parsed and converted to a corresponding group (div) in the Edge Animate project.
15 |
16 | ##Known issues
17 |
18 | * Adjustement layers are not supported
19 | * Text is always rasterized
20 | * Edge animate groups are placed in the top left corner of the stage and artificially scaled at 500px * 500px. Items should however be correctly positionned
--------------------------------------------------------------------------------
/photoshop/generative-art-examples/strips.jsx:
--------------------------------------------------------------------------------
1 | #target photoshop
2 |
3 |
4 | (function (){
5 |
6 | if (app.documents.length==0) return;
7 |
8 | var doc = app.activeDocument;
9 | doc.artLayers.add();
10 |
11 | var docW = doc.width.value;
12 | var docH = doc.height.value;
13 |
14 | var colWidth = 6;
15 |
16 | var n = docW / colWidth;
17 |
18 | var opacity = 100;
19 |
20 | for ( var i = 0 ; i < n ; i ++){
21 |
22 | var x = i*colWidth;
23 | var red = Math.ceil(Math.random()*255);
24 | var light = (red/2) + Math.ceil(Math.random()*red/2);
25 | var sh = docH;
26 | drawRect(x, 0, colWidth, sh, [red, light, light, opacity]);
27 |
28 | }
29 |
30 | doc.selection.deselect();
31 |
32 | function drawRect(x, y, w, h, color){
33 |
34 | $.writeln (color);
35 | var region = [[x, y], [x+w, y], [x+w, y+h], [x, y+h]];
36 | doc.selection.select(region);
37 | var fillColor = new SolidColor();
38 | fillColor.rgb.red = color[0];
39 | fillColor.rgb.green = color[1];
40 | fillColor.rgb.blue = color[2];
41 | doc.selection.fill(fillColor, ColorBlendMode.NORMAL, color[3], false);
42 | }
43 |
44 |
45 | })();
--------------------------------------------------------------------------------
/illustrator/removeEmpyLayers/removeEmptyLayers.jsx:
--------------------------------------------------------------------------------
1 | var logStr="";
2 | function log(pStr){
3 | logStr+=pStr+"";
4 | }
5 |
6 | var removable;
7 |
8 | function main(){
9 |
10 | if ( app.documents.length == 0 ) {
11 | return;
12 | }
13 |
14 | doStuff();
15 |
16 | return logStr;
17 | }
18 |
19 |
20 |
21 |
22 | function doStuff() {
23 |
24 | var doc = app.activeDocument;
25 | var docLayers = doc.layers;
26 |
27 | removable = [];
28 | markAsRemovableIn(docLayers);
29 | removeLayers(removable);
30 | }
31 |
32 |
33 | function markAsRemovableIn(layers) {
34 |
35 | var lCount = layers.length;
36 |
37 | var i;
38 | for ( i = 0 ; i < lCount; i++){
39 |
40 | var layer = layers[i];
41 |
42 | if(layer.layers.length > 0){
43 | markAsRemovableIn(layer.layers);
44 | } else if(layer.pageItems.length==0) {
45 | removable.push(layer);
46 | }
47 |
48 | }
49 |
50 | }
51 |
52 | function removeLayers(layers) {
53 |
54 | var lCount = layers.length;
55 |
56 | var i;
57 | for ( i = 0 ; i < lCount; i++) {
58 | var layer = layers[i];
59 | layer.remove();
60 |
61 | }
62 | }
63 |
64 |
65 |
66 |
67 | main();
68 |
--------------------------------------------------------------------------------
/illustrator/randomizeColors/randomizeColors.jsx:
--------------------------------------------------------------------------------
1 | var logStr="";
2 | function log(pStr){
3 | logStr+=pStr+"";
4 | }
5 |
6 | function main(){
7 |
8 | if ( app.documents.length == 0 ) {
9 | return;
10 | }
11 |
12 | doStuff();
13 |
14 | return logStr;
15 | }
16 |
17 |
18 | function doStuff() {
19 |
20 | var doc = app.activeDocument;
21 | var canRect = doc.artboards[0].artboardRect;
22 | var boardW = canRect[2];
23 | var boardH = -canRect[3];
24 |
25 | var swatches = doc.swatches.getSelected();
26 |
27 | if(doc.selection.length==0) {
28 | alert("No items selected");
29 | } else if(swatches.length == 0) {
30 | alert("Please select swatches");
31 | } else {
32 | randomizeColor(doc.selection, swatches);
33 | }
34 |
35 | }
36 |
37 | function randomizeColor (items, swatches) {
38 |
39 | var count = items.length;
40 |
41 | for (i = 0; i < count ; i++) {
42 | var c = items[i];
43 | var swatchIndex = Math.round( Math.random() * ( swatches.length - 1 ) );
44 | c.fillColor = swatches[ swatchIndex ].color;
45 |
46 | var swatchIndex2 = Math.round( Math.random() * ( swatches.length - 1 ) );
47 | c.strokeColor = swatches[ swatchIndex2 ].color;
48 | }
49 | }
50 |
51 | main();
52 |
--------------------------------------------------------------------------------
/illustrator/export-layers-v2/Renamer.jsx:
--------------------------------------------------------------------------------
1 | function appendToSelNames(suffix) {
2 |
3 |
4 | var items = app.selection;
5 | var n = items.length;
6 |
7 | for ( var i = 0; i < n ; i ++) {
8 | var item = items[i];
9 | var index = item.name.lastIndexOf(".");
10 |
11 | if (index == -1){
12 | item.name += suffix;
13 | }
14 | else {
15 | var firstPart = item.name.substr(0, index);
16 | //log += firstPart + suffix+", ";
17 | item.name = firstPart + suffix;
18 | }
19 |
20 | }
21 |
22 | // forces refresh
23 | app.selection=[];
24 | }
25 |
26 |
27 | function appendToAllLayers(suffix){
28 |
29 | var doc = app.activeDocument;
30 | var n = doc.layers.length;
31 | for ( var i = 0; i < n ; i ++) {
32 |
33 | var layer = doc.layers[i];
34 | var index = layer.name.lastIndexOf(".");
35 |
36 | if (index == -1){
37 | layer.name += suffix;
38 | }
39 | else {
40 | var firstPart = layer.name.substr(0, index);
41 | //log += firstPart + suffix+", ";
42 | layer.name = firstPart + suffix;
43 | }
44 | }
45 |
46 |
47 | }
48 |
49 | //appendToSelNames(".svg");
50 | //appendToAllLayers("");
--------------------------------------------------------------------------------
/illustrator/export2EdgeAnimate/readme.md:
--------------------------------------------------------------------------------
1 | Illustrator to Edge Animate exporter
2 | ---------
3 |
4 | >WARNING: This script is meant to be used by an upcoming (unofficial) panel / extension. If you are not a developer, you probably want to use the extension directly:
5 |
6 | [DOWNLOAD THE PANEL HERE](https://dl.dropbox.com/u/112869/IllustratorEdgeAnimateExporter.zxp)
7 |
8 | The underlying script exports the active Illustrator document to an Edge Animate project. Each layer is converted to a SVG or PNG file placed in the project's "images" folder. The project's `xxx_edge.js` dom array will also be modified to properly place each image onto the project's stage.
9 |
10 | Note that only top level layers are exported. Each layer's content is flattened to a bitmap (PNG24) or vector (SVG) data, whatever its content. If your file doesn't use layers, consider using my `distributeSelectionToLayers.jsx` script which does exaclty that.
11 |
12 |
13 | Known Issues
14 |
15 | * Hidden layers will be ignored by the animate project but still exported in the image folder
16 | * SVG export is slow, much slower than PNG.
17 |
18 | Possible roadmap
19 |
20 | * Symbols conversion (AI symbol to Animate symbol)
21 | * Optionnaly export artboard size to stage size
22 | * Optionnaly export in a div/group
23 | * Allow sub-layers / sub-items grouped into divs/groups
24 | * … your idea go here !
25 |
--------------------------------------------------------------------------------
/illustrator/export2EdgeAnimate/export2Animate.jsx:
--------------------------------------------------------------------------------
1 | #include "../../edgeanimate/EdgeAnimateImporter.jsx"
2 | #include "../export-layers-v1/LayerDataExtractor.jsx"
3 | #include "../export-layers-v1/LayerExporter.jsx"
4 |
5 | #target illustrator
6 |
7 | function doExport(useSVG) {
8 |
9 | if ( app.documents.length > 0 ) {
10 |
11 | var doc = app.activeDocument;
12 | var docFile = doc.fullName;
13 |
14 | if(!doc.saved){
15 | Window.alert("This script needs to modify your document. Please save it before running this script.");
16 | return;
17 | }
18 |
19 | var anFile = File.openDialog ("Select the .an file of the destination Edge Animate project.");
20 | if(!anFile) return;
21 |
22 |
23 | var exportType = useSVG ? ExportType.SVG : ExportType.PNG24;
24 |
25 |
26 | var itemsData = LayerDataExtractor.exportLayersData(doc, exportType);
27 | $.writeln(itemsData);
28 |
29 | var destFolder = anFile.parent;
30 | var imgFolder = new Folder(destFolder.path +"/"+ destFolder.name + "/images/");
31 | if(!imgFolder.exists) imgFolder.create();
32 | var dest = imgFolder.absoluteURI+"/";
33 |
34 | LayerExporter.exportLayers(doc, imgFolder, exportType);
35 |
36 | EdgeAnimateImporter.doImport(anFile, itemsData);
37 |
38 |
39 | // Close and reopen original
40 | // (necessary since the script needs to modify the original file)
41 | doc.close(SaveOptions.DONOTSAVECHANGES);
42 | doc = null;
43 | app.open(docFile);
44 |
45 | }
46 |
47 | }
--------------------------------------------------------------------------------
/illustrator/fillArtboardWithShape/fillArtboardWithShape.jsx:
--------------------------------------------------------------------------------
1 | var logStr="";
2 | function log(pStr){
3 | logStr+=pStr+"";
4 | }
5 |
6 | function main(){
7 |
8 | if ( app.documents.length == 0 ) {
9 | $.writeln("No active doc");
10 | return;
11 | }
12 |
13 | drawStuff();
14 |
15 | return logStr;
16 | }
17 |
18 |
19 | function drawStuff() {
20 |
21 | var doc = app.activeDocument;
22 | var canRect = doc.artboards[doc.artboards.getActiveArtboardIndex()].artboardRect;
23 | var boardW = canRect[2] - canRect[0];
24 | var boardH = -canRect[3] + canRect[1];
25 |
26 |
27 | if(doc.selection.length == 0) {
28 | alert("Nothing selected");
29 | } else {
30 | fillWithItem(app.activeDocument.selection[0], boardW, boardH);
31 | }
32 |
33 | }
34 |
35 |
36 | function fillWithItem(shape, width, height) {
37 |
38 | var itemWidth = shape.width;
39 | var itemHeight = shape.height;
40 |
41 | var col;
42 | var row;
43 | var colCount = Math.ceil(width / itemWidth) ;
44 | var rowCount = Math.ceil(height / itemHeight) ;
45 |
46 | var count = 0;
47 |
48 |
49 | for (col = 0; col < colCount ; col++) {
50 |
51 | for (row = 0; row < rowCount ; row++) {
52 |
53 | var c = shape.duplicate(app.activeDocument, ElementPlacement.PLACEATEND);
54 |
55 | var xpos = col * itemWidth;
56 | var ypos = (row * itemHeight) * -1;
57 |
58 | c.position = [xpos, ypos];
59 |
60 | count++;
61 | }
62 | }
63 | log( count + " shapes created");
64 | }
65 |
66 |
67 | main();
68 |
--------------------------------------------------------------------------------
/photoshop/PhotoshopCommons.jsx:
--------------------------------------------------------------------------------
1 |
function selectVisibleIn(layer){
var idsetd = charIDToTypeID( "setd" );
var desc2 = new ActionDescriptor();
var idnull = charIDToTypeID( "null" );
var ref1 = new ActionReference();
var idChnl = charIDToTypeID( "Chnl" );
var idfsel = charIDToTypeID( "fsel" );
ref1.putProperty( idChnl, idfsel );
desc2.putReference( idnull, ref1 );
var idT = charIDToTypeID( "T " );
var ref2 = new ActionReference();
var idChnl = charIDToTypeID( "Chnl" );
var idChnl = charIDToTypeID( "Chnl" );
var idTrsp = charIDToTypeID( "Trsp" );
ref2.putEnumerated( idChnl, idChnl, idTrsp );
var idLyr = charIDToTypeID( "Lyr " );
ref2.putName( idLyr, layer.name );
desc2.putReference( idT, ref2 );
executeAction( idsetd, desc2, DialogModes.NO );
}
function selectVisibleInVector(layer) {
var idsetd = charIDToTypeID( "setd" );
var desc29 = new ActionDescriptor();
var idnull = charIDToTypeID( "null" );
var ref30 = new ActionReference();
var idChnl = charIDToTypeID( "Chnl" );
var idfsel = charIDToTypeID( "fsel" );
ref30.putProperty( idChnl, idfsel );
desc29.putReference( idnull, ref30 );
var idT = charIDToTypeID( "T " );
var ref31 = new ActionReference();
var idPath = charIDToTypeID( "Path" );
var idPath = charIDToTypeID( "Path" );
var idvectorMask = stringIDToTypeID( "vectorMask" );
ref31.putEnumerated( idPath, idPath, idvectorMask );
var idLyr = charIDToTypeID( "Lyr " );
ref31.putName( idLyr, layer.name );
desc29.putReference( idT, ref31 );
var idVrsn = charIDToTypeID( "Vrsn" );
desc29.putInteger( idVrsn, 1 );
var idvectorMaskParams = stringIDToTypeID( "vectorMaskParams" );
desc29.putBoolean( idvectorMaskParams, true );
executeAction( idsetd, desc29, DialogModes.NO );
}
--------------------------------------------------------------------------------
/photoshop/generative-art-examples/polygon.jsx:
--------------------------------------------------------------------------------
1 | #target photoshop
2 |
3 | #include "../PrimitiveShapes.jsx"
4 |
5 | (function (){
6 |
7 | if (app.documents.length==0) return;
8 |
9 | var doc = app.activeDocument;
10 | var l = doc.artLayers.add();
11 |
12 | var docW = doc.width.value;
13 | var docH = doc.height.value;
14 |
15 | var colWidth = 6;
16 |
17 | var n = 10;
18 |
19 |
20 | var x1 = 0;
21 | var y1 = 0;
22 | var x2 = 0;
23 | var y2 = 0;
24 | var coords=[];
25 |
26 | for ( var i = 0 ; i < n ; i ++){
27 |
28 | x1 = x2;
29 | y1 = y2;
30 | x2 = Math.random() * docW;
31 | y2 = Math.random() * docH;
32 |
33 | //drawLine(doc, "p"+i, [x1, y1], [x2, y2]);
34 |
35 |
36 | var p = [x2, y2];
37 | var pt = new PathPointInfo();
38 | pt.anchor = p;
39 | pt.leftDirection = p;
40 | pt.rightDirection = p;
41 | pt.kind = PointKind.CORNERPOINT;
42 | coords.push(pt);
43 |
44 | }
45 |
46 |
47 | var p = drawPolygon(doc, "poly", {r:255, g:255, b:255, a:100}, coords);
48 |
49 | pathtoVectorMask() ;
50 | })();
51 |
52 |
53 | function pathtoVectorMask() {
54 | function cTID(s) { return app.charIDToTypeID(s); };
55 | function sTID(s) { return app.stringIDToTypeID(s); };
56 |
57 | var desc27 = new ActionDescriptor();
58 | var ref11 = new ActionReference();
59 | ref11.putClass( cTID('Path') );
60 | desc27.putReference( cTID('null'), ref11 );
61 | var ref12 = new ActionReference();
62 | ref12.putEnumerated( cTID('Path'), cTID('Path'), sTID('vectorMask') );
63 | desc27.putReference( cTID('At '), ref12 );
64 | var ref13 = new ActionReference();
65 | ref13.putEnumerated( cTID('Path'), cTID('Ordn'), cTID('Trgt') );
66 | desc27.putReference( cTID('Usng'), ref13 );
67 | executeAction( cTID('Mk '), desc27, DialogModes.NO );
68 | };
--------------------------------------------------------------------------------
/photoshop/PrimitiveShapes.jsx:
--------------------------------------------------------------------------------
1 | function drawLine(doc, name, start, stop) {
2 |
3 | var startPoint = new PathPointInfo();
4 | startPoint.anchor = start;
5 | startPoint.leftDirection = start;
6 | startPoint.rightDirection = start;
7 | startPoint.kind = PointKind.CORNERPOINT;
8 |
9 | var stopPoint = new PathPointInfo();
10 | stopPoint.anchor = stop;
11 | stopPoint.leftDirection = stop;
12 | stopPoint.rightDirection = stop;
13 | stopPoint.kind = PointKind.CORNERPOINT;
14 |
15 |
16 | var spi = new SubPathInfo();
17 | spi.closed = false;
18 | spi.operation = ShapeOperation.SHAPEADD;
19 | spi.entireSubPath = [startPoint, stopPoint];
20 | var line = doc.pathItems.add(name, [spi]);
21 | line.strokePath(ToolType.PENCIL);
22 | line.remove();
23 | }
24 |
25 |
26 | function drawPolygon(doc, name, color, coords){
27 |
28 | var spi = new SubPathInfo();
29 | spi.closed = false;
30 | spi.operation = ShapeOperation.SHAPEADD;
31 | spi.entireSubPath = coords;
32 | var poly = doc.pathItems.add(name, [spi]);
33 | poly.strokePath(ToolType.PENCIL);
34 | var c = new SolidColor();
35 | c.rgb.red = color.r;
36 | c.rgb.green = color.g;
37 | c.rgb.blue = color.b;
38 | poly.fillPath (c, ColorBlendMode.NORMAL, color.a, false, 0, true, true);
39 | //poly.remove();
40 | return poly;
41 | }
42 |
43 |
44 | function drawRect(doc, name, color, x, y, w, h){
45 |
46 | var tl = createCornerPoint([x, y]);
47 | var tr = createCornerPoint([x+w, y]);
48 | var br = createCornerPoint([x+w, y+h]);
49 | var bl = createCornerPoint([x, y+h]);
50 | var coords = [tl, tr, br, bl];
51 |
52 | drawPolygon(doc, name, color, coords);
53 |
54 | function createCornerPoint(pAnchor){
55 | var p = new PathPointInfo();
56 | p.rightDirection = p.leftDirection = p.anchor = pAnchor;
57 | p.kind = PointKind.CORNERPOINT;
58 | return p;
59 | }
60 |
61 | }
--------------------------------------------------------------------------------
/photoshop/LayerExporter.jsx:
--------------------------------------------------------------------------------
1 | // (c) Copyright 2013 Adobe Systems, Inc. All rights reserved.
// author David Deraedt
#include "../common/Utils.jsx"
var LayerExporter = (function () {
/**
Exports all layers of a given document to properly sized PNG files
@public
@param {Document} doc The document to export
@param {Folder} destFolder The destination folder for the image files
*/
function exportDocLayers(doc, destFolder){
var destPath = destFolder.path +"/"+ destFolder.name+"/";
var docName = normalizeName(getFileNamePart(doc.name));
exportLayers(doc.layers, destPath, docName);
}
function exportLayers(layers, destPath, prefix){
var n = layers.length;
var j;
for ( j = 0 ; j < n ; j++){
var l = layers[j];
var fileName = prefix + "-" + normalizeName(l.name);
log(l.name);
// ignore invisible
if(l.visible == false) continue;
//groups
if(l instanceof ArtLayer==false) {
exportLayers(l.layers, destPath, prefix);
continue;
}
if(l.kind == LayerKind.SOLIDFILL) {
l.rasterize (RasterizeType.SHAPE);
}
// ignore adjustment layers and other weird stuffs I don't get
else if(l.kind != LayerKind.NORMAL && l.kind != LayerKind.TEXT) {
log(l.name + " ignored because kind is " + l.kind);
continue;
}
// ignore empty
if(l.bounds[2]==0) continue;
app.activeDocument.activeLayer = l;
exportImage(app.activeDocument, l, destPath, fileName);
}
}
function exportImage(doc, l, destPath, fileName) {
selectVisibleIn (l);
doc.selection.copy();
var bounds = doc.selection.bounds;
var x = bounds[0].value;
var y = bounds[1].value;
var w = bounds[2].value - x;
var h = bounds[3].value - y;
var newDoc = app.documents.add(w, h, 72, l.name, NewDocumentMode.RGB, DocumentFill.TRANSPARENT);
newDoc.paste();
var pngSaveOptions = new PNGSaveOptions();
var saveFile = new File (destPath + fileName + ".png");
newDoc.saveAs(saveFile, pngSaveOptions, true, Extension.LOWERCASE);
newDoc.close(SaveOptions.DONOTSAVECHANGES);
newDoc = null;
}
var obj = {};
obj.exportDocLayers = exportDocLayers;
return obj;
}());
--------------------------------------------------------------------------------
/photoshop/LayerDataExtractor.jsx:
--------------------------------------------------------------------------------
1 | // (c) Copyright 2013 Adobe Systems, Inc. All rights reserved.
// author David Deraedt
#include "../common/Utils.jsx"
#include "PhotoshopCommons.jsx"
var LayerDataExtractor = (function () {
/**
Exports all layers data of a given document to an array of objects
describing items and positions
@public
@param {Document} doc The document to export
@param {String} exportType Determines if layers should be converted to JPG or PNG files
(This value should use ExportType constants)
*/
var docName="";
var exportType;
function exportLayersData(doc, exportType){
docName = normalizeName(getFileNamePart(doc.name));
exportType = exportType;
var itemsData = processLayers(doc.layers, doc);
return itemsData;
}
function processLayers(layers, doc) {
var itemsData = [];
var n = layers.length;
var j;
for ( j = n-1 ; j >= 0 ; j--){
var l = layers[j];
// ignore invisible
if(l.visible == false) continue;
log(l.name + "is art layers? " + (l instanceof ArtLayer));
//groups
if(l instanceof ArtLayer==false) {
var groupData = processGroup(l);
itemsData.push(groupData);
groupData.items = processLayers(l.layers, doc);
continue;
}
// ignore adjustment layers
if(l.kind != LayerKind.NORMAL && l.kind != LayerKind.TEXT && l.kind != LayerKind.SOLIDFILL) continue;
// ignore empty
if(l.bounds[2]==0) continue;
var itemData = processLayer(l, doc);
itemsData.push(itemData);
}
return itemsData;
}
function processLayer(l, doc) {
doc.activeLayer = l;
var fileName = docName + "-" + normalizeName(l.name);
if(l.kind == LayerKind.SOLIDFILL) selectVisibleInVector (l);
else selectVisibleIn (l);
var sel = doc.selection;
var px = sel.bounds[0].value;
var py = sel.bounds[1].value;
var pw = sel.bounds[2].value - px;
var ph = sel.bounds[3].value - py;
var itemData = {
x: px,
y: py,
width: pw,
height: ph,
name: fileName,
ext: "png"
};
return itemData;
}
function processGroup(l) {
var name = normalizeName(l.name);
var groupData = {
x: 0,
y: 0,
width: 500,
height: 500,
name: name,
ext: null,
items:[]
};
return groupData;
}
var obj = {};
obj.exportLayersData = exportLayersData;
return obj;
}());
--------------------------------------------------------------------------------
/illustrator/export-layers-v2/ExportLayersAndData.jsx:
--------------------------------------------------------------------------------
1 | #include AltLayerExporter.jsx
2 | #include DataExtractor.jsx
3 | #include ../../common/Utils.jsx
4 | #include ../../common/json2.js
5 | #include "../../edgeanimate/EdgeAnimateImporter.jsx"
6 | #include HTMLExporter.jsx
7 |
8 | $.exportLayersAndData = function (imageParams, outputParams, destFolder, ignoreHidden, doc) {
9 |
10 | if(!doc) doc = app.activeDocument;
11 | if(!ignoreHidden) ignoreHidden=true;
12 |
13 | if(!destFolder) destFolder = Folder.selectDialog ("Select Destination Folder");
14 | if(!destFolder) return;
15 |
16 | if(!outputParams){
17 | outputParams = {
18 | createJSON:false,
19 | toHTML:false,
20 | sepCss:false,
21 | toEdgeAnimate:false
22 | }
23 | }
24 |
25 | //safe naming
26 | var reg = new RegExp("\\s", "g");
27 | var namingFunc = function(lname) {
28 | return lname.replace(reg, "-");
29 | };
30 |
31 | // name-to-file-type logic
32 | function readLayerParams(lName) {
33 |
34 | var obj = {
35 | name:lName,
36 | exportType: null,
37 | svgFont: imageParams.svgFont,
38 | jpgQuality: imageParams.jpgQuality,
39 | precision: imageParams.precision,
40 | embedImages: imageParams.embedImages,
41 | svgCssPropLoc: imageParams.svgCssPropLoc
42 | };
43 |
44 | var nameParts = lName.split(".");
45 |
46 | if(nameParts.length > 1) obj.exportType = nameParts[1];
47 |
48 | obj.name = namingFunc(nameParts[0]);
49 |
50 | return obj;
51 | }
52 |
53 |
54 | AltLayerExporter.exportLayers(app.activeDocument, destFolder, ignoreHidden, readLayerParams);
55 |
56 | var data = DataExtractor.getLayersCoords(doc, readLayerParams, ignoreHidden);
57 |
58 | if(outputParams.createJSON){
59 | var text = JSON.stringify(data, null, '\t');
60 | var filepath = destFolder.absoluteURI + "/data.json";
61 | saveTextFile(text, filepath);
62 | }
63 |
64 | if(outputParams.toHTML){
65 | var htmlFolder = destFolder.parent;
66 | HTMLExporter.generateFrom(data, htmlFolder, destFolder.name, outputParams.sepCss);
67 | }
68 |
69 | if(outputParams.toEdgeAnimate){
70 | var anFile = File.openDialog ("Select the .an file of the destination Edge Animate project.");
71 | if(anFile) EdgeAnimateImporter.doImport(anFile, data.layers);
72 | }
73 |
74 | return data;
75 | }
76 |
--------------------------------------------------------------------------------
/illustrator/savelayerstoai/savelayerstoai.jsx:
--------------------------------------------------------------------------------
1 | var doc = app.activeDocument;
2 |
3 | //params
4 | promoteToLayers = true; // will transform each item to a layer
5 |
6 | if (documents.length > 0){
7 |
8 | var saveOpts = new IllustratorSaveOptions();
9 |
10 | saveOpts.embedLinkedFiles = true;
11 | saveOpts.fontSubsetThreshold = 0.0
12 | saveOpts.pdfCompatible = false;
13 |
14 | var count = doc.layers.length;
15 |
16 | var originalFilePath = doc.path;
17 | var originalFile = new File(originalFilePath);
18 |
19 |
20 | var fileList = [];
21 |
22 | // duplicate as many docs as layers
23 | for (i=0; i < count; i++){
24 |
25 | var index = i;
26 | var layer = doc.layers[i];
27 |
28 | if(layer.locked) layer.locked = false;
29 | if(!layer.visible) layer.visible = true;
30 |
31 | docName = layer.name+".ai";
32 | var newFile = new File ( doc.path + "/" + docName );
33 | doc.saveAs( newFile, saveOpts );
34 | fileList.push(newFile);
35 |
36 | }
37 |
38 | // open the docs
39 | for(var j = 0 ; j < count ; j++){
40 |
41 | var file = fileList[j];
42 | app.open (file);
43 |
44 | var curDoc = app.activeDocument;
45 | var layerKillList = [];
46 |
47 | // mark all layers but the one we want to keep
48 | for( var k = 0 ; k < count ; k++){
49 | if(k!=j) layerKillList.push(curDoc.layers[k]);
50 | }
51 | // remove them
52 | for( var l = 0 ; l < layerKillList.length ; l++) {
53 | layerKillList[l].remove();
54 | }
55 |
56 | if(promoteToLayers) {
57 | // promote items to layers
58 | promoteItemsToLayers(curDoc, curDoc.layers[0]);
59 | // remove the last (empty) layer
60 | curDoc.layers[curDoc.layers.length-1].remove();
61 | }
62 |
63 | curDoc.save();
64 |
65 | }
66 |
67 | alert("done!");
68 | }
69 |
70 |
71 | function promoteItemsToLayers(doc, layer){
72 |
73 | var items = layer.pageItems;
74 |
75 | var n = items.length;
76 |
77 | for ( var a = n-1 ; a >=0 ; a--) {
78 |
79 | var item = items[a];
80 | var wasLocked = item.locked;
81 | var wasHidden = item.hidden;
82 |
83 | if(wasLocked) item.locked = false;
84 | if(wasHidden) item.hidden = false;
85 |
86 | var newlayer = doc.layers.add();
87 | item.move(newlayer,ElementPlacement.PLACEATBEGINNING);
88 |
89 | if(wasLocked) newlayer.locked = true;
90 | if(wasHidden) newlayer.visible = false;
91 |
92 | newlayer.name = item.name;
93 | }
94 | }
95 |
--------------------------------------------------------------------------------
/illustrator/export-layers-v1/LayerExporter.jsx:
--------------------------------------------------------------------------------
1 | // (c) Copyright 2013 Adobe Systems, Inc. All rights reserved.
2 | // author David Deraedt
3 |
4 | #include "../../common/Utils.jsx"
5 |
6 | var LayerExporter = (function () {
7 |
8 | /**
9 | Exports all layers of a given document to properly sized PNG or SVG files
10 | Warning: this script will modify the original file!
11 | @public
12 | @param {Document} doc The document to export
13 | @param {Folder} destFolder The destination folder for the image files
14 | @param {String} exportType Determines if layers should be converted to SVG or PNG files
15 | (This value should use ExportType constants)
16 | @param {Rect} customBounds A rectangle which determines the output file size.
17 | If null, the layer visible bounds are used.
18 | */
19 |
20 | function exportLayers(doc, destFolder, defaultExportType, customBounds){
21 |
22 | var destPath = destFolder.path +"/"+ destFolder.name+"/";
23 |
24 | var artboard = doc.artboards[0];
25 | var originRect = artboard.artboardRect;
26 |
27 | var docName = normalizeName(getFileNamePart(doc.name));
28 |
29 | var n = doc.layers.length;
30 |
31 | var j;
32 |
33 | setLayersVisibility(doc, false);
34 |
35 | for ( j = 0 ; j < n ; j++){
36 |
37 | var l = doc.layers[j];
38 |
39 | l.visible = true;
40 | l.locked = false;
41 |
42 | //ignore empty layers
43 | if(l.pageItems.length==0) continue;
44 | // also ignore items which width==0 (points etc)
45 | if(doc.visibleBounds[0] == doc.visibleBounds[2]) continue;
46 |
47 |
48 | if(customBounds) artboard.artboardRect = customBounds;
49 | else artboard.artboardRect = doc.visibleBounds;
50 |
51 | var fileName = docName + "-" + normalizeName(l.name);
52 |
53 | var exportType = defaultExportType;
54 | var nameEnd = l.name.substr(l.name.length-4);
55 | if(nameEnd ==".png") exportType = ExportType.PNG24;
56 | if(nameEnd ==".svg") exportType = ExportType.SVG;
57 |
58 |
59 | exportImage(doc, destPath + fileName, exportType);
60 |
61 | l.visible = false;
62 | }
63 |
64 | artboard.artboardRect = originRect;
65 |
66 | setLayersVisibility(doc, true);
67 | }
68 |
69 |
70 |
71 | function exportImage(doc, dest, exportType) {
72 |
73 | var options;
74 |
75 | if(exportType == ExportType.SVG) {
76 | options = new ExportOptionsSVG();
77 | options.embedRasterImages = true;
78 | }
79 | else if (exportType == ExportType.PNG24){
80 | options = new ExportOptionsPNG24();
81 | }
82 |
83 | var fileSpec = new File(dest);
84 |
85 | doc.exportFile( fileSpec, exportType, options );
86 |
87 | }
88 |
89 |
90 | var obj = {};
91 | obj.exportLayers = exportLayers;
92 | return obj;
93 |
94 | }());
95 |
--------------------------------------------------------------------------------
/edgeanimate/EdgeAnimateImporter.jsx:
--------------------------------------------------------------------------------
1 | // (c) Copyright 2013 Adobe Systems, Inc. All rights reserved.
2 | // author David Deraedt
3 |
4 | #include "../common/Utils.jsx"
5 |
6 | var EdgeAnimateImporter = (function () {
7 |
8 |
9 | /**
10 | Imports the given itemsData array to a given EdgeAnimate project
11 | The project's xxx_edge.js dom array will also be modified to properly place
12 | each image onto the project's stage.
13 | Warning: this script will modify the original an file
14 | @public
15 | @param {File} anFile The destination Edge Animate project file
16 | @param {Array} itemsData Array of item objects as exported by LayerDataExtractor
17 | */
18 |
19 | function importToAnimate(anFile, itemsData){
20 |
21 | var destFolder = anFile.parent;
22 |
23 | var anName = getFileNamePart(anFile.name);
24 |
25 | var imgFolder = new Folder(destFolder.path +"/"+ destFolder.name + "/images/");
26 | if(!imgFolder.exists) imgFolder.create();
27 | var dest = imgFolder.absoluteURI+"/";
28 |
29 | var outputTxt = processItems(itemsData);
30 |
31 | // edge animate code generation
32 | //log("OUTPUT: " + outputTxt);
33 | var edgeFile = new File(destFolder.absoluteURI+"/" + anName + "_edge.js");
34 | var edgeFileString = getFileString(edgeFile.absoluteURI);
35 | var newFileString = edgeFileString.replace("dom: [", "dom: [" + outputTxt);
36 | saveTextFile(newFileString, edgeFile);
37 |
38 | }
39 |
40 |
41 | function processItems(itemsData){
42 |
43 | var outputTxt = "";
44 |
45 | var n = itemsData.length;
46 |
47 | for ( var j = n-1 ; j >= 0 ; j--){
48 |
49 | var item = itemsData[j];
50 |
51 | if ( (!item.filename) && item.items) {
52 | // TODO: correct group coords
53 | outputTxt += outputGroupData(item.name, item.x, item.y, item.width, item.height);
54 | outputTxt += processItems(item.items);
55 | outputTxt += "]},";
56 | }
57 | else outputTxt += addItemData(item);
58 | }
59 |
60 | return outputTxt;
61 | }
62 |
63 |
64 | function addItemData(item){
65 |
66 | var txt = "";
67 |
68 | txt += "\t\t{\n\t\t\tid:'" + item.name + "',\n";
69 | txt += "\t\t\ttype:'image',\n";
70 | txt += "\t\t\trect:[" + "'" + item.x + "', '" + item.y + "', '" + item.width + "px', '" + item.height + "px', " + "'auto','auto'],\n";
71 | txt += "\t\t\tfill:[\"rgba(0,0,0,0)\",im+\"" + item.filename +"\",'0px','0px'" + "]\n";
72 | txt += "\t\t},\n";
73 | return txt;
74 | }
75 |
76 |
77 | function outputGroupData(name, x, y, w, h){
78 |
79 | var txt = "";
80 |
81 | txt += "\t\t{\n\t\t\tid:'" + name + "',\n";
82 | txt += "\t\t\ttype:'group',\n";
83 | txt += "\t\t\trect:[" + "'" + x + "', '" + y + "', '" + w + "px', '" + h + "px', " + "'auto','auto'],\n";
84 | txt += "\t\tc:[\n";
85 | return txt;
86 | }
87 |
88 |
89 | var obj = {};
90 | obj.doImport = importToAnimate;
91 | return obj;
92 |
93 | }());
94 |
95 |
--------------------------------------------------------------------------------
/illustrator/export-layers-v1/LayerDataExtractor.jsx:
--------------------------------------------------------------------------------
1 | // (c) Copyright 2013 Adobe Systems, Inc. All rights reserved.
2 | // author David Deraedt
3 |
4 | #include "../../common/Utils.jsx"
5 |
6 | var LayerDataExtractor = (function () {
7 |
8 | /**
9 | Exports all layers data of a given document to an array of objects
10 | describing items and positions
11 | Warning: this script will modify the original file!
12 | @public
13 | @param {Document} doc The document to export
14 | @param {String} exportType Determines if layers should be converted to SVG or PNG files
15 | (This value should use ExportType constants)
16 | */
17 |
18 | function exportLayersData(doc, exportType){
19 |
20 |
21 | var docName = normalizeName(getFileNamePart(doc.name));
22 |
23 | var itemsData = [];
24 |
25 | var n = doc.layers.length;
26 |
27 | var j;
28 |
29 | for ( j = n-1 ; j >= 0 ; j--){
30 |
31 | var l = doc.layers[j];
32 |
33 | l.locked = false;
34 |
35 | if(l.pageItems.length==0) continue;
36 | // TODO : ignoring invisible should be optional
37 | if(l.visible == false) continue;
38 |
39 | var fileName = docName + "-" + normalizeName(l.name);
40 |
41 | // In order to group items, we need to select them
42 | l.hasSelectedArtwork = true;
43 |
44 | // Need to group since there is no way to get the position of an item collection
45 | if(doc.selection.length>1) {
46 | item = groupSelection(l);
47 | // TODO ungroup
48 | } else {
49 | item = doc.selection[0];
50 | }
51 |
52 | // unselect
53 | doc.selection = null;
54 |
55 |
56 | var itemData = getItemData(item, fileName, exportType);
57 |
58 | itemsData.push(itemData);
59 | }
60 |
61 |
62 | return itemsData;
63 |
64 | }
65 |
66 |
67 |
68 | function groupSelection(layer){
69 |
70 | var sel = app.activeDocument.selection;
71 | var newGroup = layer.groupItems.add();
72 | //log(layer.name + ':' + sel.length);
73 | for ( i = 0; i < sel.length; i++ ) {
74 | var newItem = sel[i];
75 | newItem.moveToEnd( newGroup );
76 | }
77 | return newGroup;
78 | }
79 |
80 |
81 |
82 |
83 | function getItemData(item, name, exportType){
84 |
85 | var pos = item.position;
86 |
87 | if(app.coordinateSystem == CoordinateSystem.DOCUMENTCOORDINATESYSTEM){
88 | pos = app.activeDocument.convertCoordinate (item.position, CoordinateSystem.DOCUMENTCOORDINATESYSTEM, CoordinateSystem.ARTBOARDCOORDINATESYSTEM);
89 | }
90 |
91 | var ext = "png";
92 | if (exportType==ExportType.SVG) ext = "svg";
93 |
94 | return {
95 | x: (pos[0]).toFixed(2),
96 | y: (pos[1]).toFixed(2)*-1,
97 | width: item.width.toFixed(2),
98 | height: item.height.toFixed(2),
99 | name: name,
100 | ext: ext
101 | };
102 | }
103 |
104 |
105 | var obj = {};
106 | obj.exportLayersData = exportLayersData;
107 | return obj;
108 |
109 | }());
110 |
--------------------------------------------------------------------------------
/common/Utils.jsx:
--------------------------------------------------------------------------------
1 | // (c) Copyright 2012 Adobe Systems, Inc. All rights reserved.
2 | // Written by David Deraedt
3 |
4 | function clog(pText){
5 | $.writeln(pText);
6 | }
7 |
8 |
9 | var _logtxt="";
10 | function flog(pText){
11 | _logtxt+=pText+"\n";
12 | }
13 | function makeLog(pAppName){
14 | var supportDir = new Folder(Folder.userData.absoluteURI+"/"+pAppName);
15 | if(!supportDir.exists) supportDir.create();
16 | var _logFile = new File(supportDir.absoluteURI+"/log.txt");
17 | saveTextFile(_logtxt, _logFile);
18 | }
19 |
20 | function inspectObj(obj){
21 | var txt = "";
22 | for (var z in obj) {
23 | txt += z + ":" + obj[z] + "\n";
24 | }
25 | return txt;
26 | }
27 |
28 |
29 | function inspectArray(pArray){
30 |
31 | var n = pArray.length;
32 |
33 | for ( var i = 0 ; i < n ; i ++){
34 | var obj = pArray[i];
35 | log(inspectObj(obj));
36 | log("***");
37 | }
38 |
39 | }
40 |
41 |
42 | function processTemplate(template, rep) {
43 |
44 | var txt = template;
45 |
46 | for( var z in rep) {
47 |
48 | var reg = new RegExp("@{"+z+"}", "g");
49 | txt = txt.replace (reg, rep[z]);
50 | }
51 |
52 | return txt;
53 | }
54 |
55 |
56 |
57 | function normalizeName(name){
58 |
59 | var reg = new RegExp("\\s", "g");
60 | return name.replace(reg, "_");
61 | }
62 |
63 |
64 | function setLayersVisibility(doc, visible) {
65 |
66 | var n = doc.layers.length;
67 | for ( var i = 0 ; i < n ; i++){
68 | var l = doc.layers[i];
69 | l.visible = visible;
70 | }
71 | }
72 |
73 |
74 | /*
75 |
76 | FILE UTILS
77 | */
78 |
79 | function getFileString(path){
80 |
81 | var txt ="" ;
82 | var file = new File(path);
83 | if(!file.exists){
84 | alert("no such file");
85 | }
86 | else{
87 | file.open("r");
88 | txt = file.read();
89 | file.close();
90 | return txt;
91 | }
92 | }
93 |
94 | function getFileNamePart(filename){
95 | var index = filename.lastIndexOf (".");
96 | return filename.substring (0, index);
97 |
98 | }
99 |
100 | function getFileNameExtPart(filename){
101 | var index = filename.lastIndexOf (".");
102 | return filename.substring (index+1);
103 | }
104 |
105 |
106 |
107 | // hack to get the script parent
108 | function getParentDir() {
109 | var where;
110 | try {
111 | var FORCEERROR = FORCERRROR;
112 | }
113 | catch( err ) {
114 | where = File(err.fileName);
115 | }
116 | return where.parent;
117 | }
118 |
119 |
120 | function saveTextFile(pText, filepath) {
121 |
122 | // get OS specific linefeed
123 | var fileLineFeed;
124 | if ($.os.search(/windows/i) != -1) {
125 | fileLineFeed = "Windows";
126 | } else {
127 | fileLineFeed = "Unix";
128 | }
129 |
130 |
131 | fileOut = new File(filepath);
132 | fileOut.lineFeed = fileLineFeed;
133 | fileOut.open("w", "TEXT", "????");
134 | fileOut.write(pText);
135 | fileOut.close();
136 | }
137 |
138 |
139 |
--------------------------------------------------------------------------------
/photoshop/EaselJSExporter.jsx:
--------------------------------------------------------------------------------
1 | // (c) Copyright 2012 Adobe Systems, Inc. All rights reserved.
2 | // Written by David Deraedt
3 |
4 | #include "../common/Utils.jsx"
5 |
6 | // An EASELJS data exporter for use with SpriteExporter
7 |
8 | var EaselJSExporter = (function () {
9 |
10 | // Default frequency for all animations
11 | var defaultFrequency = 4;
12 |
13 | // Path to the folder containing the spriteSheets, relative to the HTML page
14 | var spriteSheetFolder = "sprites";
15 |
16 | // Library name (the object holding sprite classes in the window object).
17 | var libName = "spriteLib";
18 |
19 |
20 | var le = "\n";
21 | var spriteName ="";
22 | var animsTxt = "";
23 | var frameTxt = "";
24 | var outputTxt = "";
25 | var spritesTxt ="";
26 | var imageName="";
27 |
28 | var exporter={};
29 |
30 | var template1;
31 | var template2;
32 |
33 |
34 | exporter.beginExport = function (pImageName){
35 |
36 | imageName = pImageName;
37 |
38 | var where;
39 | try {
40 | var FORCEERROR = FORCERRROR;
41 | }
42 | catch( err ) {
43 | where = File(err.fileName);
44 | }
45 | var dir = where.parent;
46 |
47 | template1 = getFileString(dir + "/template1.txt");
48 | template2 = getFileString(dir + "/template2.txt");
49 |
50 | }
51 |
52 |
53 | exporter.addSprite = function(name){
54 | spriteName=name;
55 | animsTxt = "";
56 | framesTxt = "";
57 | }
58 |
59 | exporter.addAnimation = function(name){
60 |
61 | animsTxt += le+"\t" + name + ":{ frames:[";
62 | }
63 |
64 | exporter.addFrame = function(frameCount, name, destx, desty, w, h){
65 | // Add frames : x, y, width, height, imageIndex, regX, regY
66 | framesTxt += le+"\t[" + destx + ", " + desty + ", " + w + ", " + h + ", 0, 0, 0],";
67 |
68 | // Add frame index to animation data
69 | animsTxt += frameCount + ", ";
70 |
71 | // Multiply frames as specified by the name
72 | var sepIndex = name.indexOf(" x");
73 | if(sepIndex>-1) {
74 | var repeat = Number(name.slice(sepIndex+2));
75 | for (var j = 0 ; j < repeat-1 ; j++) animsTxt += frameCount + ", ";
76 | }
77 | }
78 |
79 |
80 | exporter.endAnimation = function(){
81 | animsTxt += "], frequency:" + defaultFrequency + ", next:true},";
82 | }
83 |
84 |
85 | exporter.exportSprite = function(){
86 |
87 | var data={
88 | spriteName: spriteName,
89 | frameData: "[" + framesTxt + "]",
90 | animationData: "{" + animsTxt + "}"
91 | };
92 |
93 | spritesTxt += processTemplate(template2, data) + le;
94 |
95 | }
96 |
97 |
98 | exporter.endExport = function () {
99 |
100 | var data = {
101 | libName: libName,
102 | imageName: imageName,
103 | folder: spriteSheetFolder,
104 | sprites: spritesTxt
105 | };
106 |
107 | outputTxt = processTemplate(template1, data);
108 | }
109 |
110 | exporter.getOutput = function(){
111 | return outputTxt;
112 | }
113 |
114 | return exporter;
115 |
116 | }());
117 |
--------------------------------------------------------------------------------
/flash-pro/createJS/easeljs-json.plugin.jsfl:
--------------------------------------------------------------------------------
1 | /*
2 | This FlashPro plugin will export spritesheet
3 | data for createJS as JSON file
4 | */
5 |
6 | function getPluginInfo(lang)
7 | {
8 | pluginInfo = new Object();
9 | pluginInfo.id = "easeljs-json";
10 | pluginInfo.name = "easeljs-json";
11 | pluginInfo.ext = "json";
12 | pluginInfo.capabilities = new Object();
13 | pluginInfo.capabilities.canRotate = false;
14 | pluginInfo.capabilities.canTrim = true;
15 | pluginInfo.capabilities.canShapePad = true;
16 | pluginInfo.capabilities.canBorderPad = true;
17 | pluginInfo.capabilities.canStackDuplicateFrames = true;
18 | return pluginInfo;
19 | }
20 |
21 | var helperFunctions = null;
22 | var symbolItem = null;
23 | var symbolName = null;
24 | var globalMeta = null;
25 | var frameData = "";
26 | var firstSymbol = true;
27 |
28 | function initializeVars()
29 | {
30 | helperFunctions = null;
31 | symbolItem = null;
32 | symbolName = null;
33 | frameData = "";
34 | }
35 |
36 | function DetermineAnimationData()
37 | {
38 | var labelLayer = null;
39 | var controlLayer = null;
40 | var layers = symbolItem.timeline.layers;
41 |
42 | var i;
43 | for (i = 0; i < layers.length; i++)
44 | {
45 | cmpName = layers[i].name.toLowerCase();
46 | if (cmpName == "labels")
47 | labelLayer = layers[i];
48 |
49 | if (cmpName == "control")
50 | controlLayer = layers[i];
51 | }
52 |
53 | helperFunctions = null;
54 |
55 | if (labelLayer == null)
56 | return ""
57 |
58 | var labelFrame = null;
59 | var controlFrame = null;
60 | var labelIndex = 0;
61 | var controlIndex = 0;
62 | var frameNumber = 0;
63 | var hitSpan = false;
64 | var endFrameNumber = 0;
65 |
66 | var s = "";
67 |
68 | while (labelIndex < labelLayer.frames.length)
69 | {
70 | labelFrame = labelLayer.frames[labelIndex++];
71 | if (controlLayer)
72 | controlFrame = controlLayer.frames[controlIndex++];
73 |
74 |
75 | if (labelFrame.name != null)
76 | {
77 | if (hitSpan)
78 | s += ", \n";
79 | else
80 | s += "{\n";
81 |
82 | endFrameNumber = frameNumber + labelFrame.duration - 1;
83 | beginFrame = frameNumber;
84 | endFrame = endFrameNumber;
85 | s += '"'+labelFrame.name + "\":[" + beginFrame + "," + endFrame;
86 |
87 | if (controlFrame != null && controlFrame.name != null && controlFrame.name.length != 0) {
88 | s += ", " + "\"" + controlFrame.name + "\"]";
89 | }
90 | else {
91 | s += ", true]";
92 | }
93 |
94 |
95 | frameNumber = endFrameNumber + 1;
96 | labelIndex = frameNumber;
97 | controlIndex = labelIndex;
98 |
99 | if (!hitSpan)
100 | helperFunctions = "";
101 |
102 | hitSpan = true;
103 | }
104 | }
105 |
106 | if (hitSpan)
107 | s += "\n}";
108 |
109 |
110 | return s;
111 | }
112 |
113 | function endSymbol(meta)
114 | {
115 | var s = "";
116 | if (symbolItem != null)
117 | {
118 | symbolName = symbolName.replace(/\s+/g,"_");
119 |
120 | if(firstSymbol==false) {
121 | s += ",\n";
122 | }
123 | firstSymbol=false;
124 |
125 | s += '\n"'+symbolName+'":{';
126 |
127 |
128 | var animationData = DetermineAnimationData();
129 |
130 | s += "\"images\": [\"" + meta.image + "\"],\n "
131 | if (animationData != null && animationData.length != 0)
132 | {
133 | s += "\"frames\": [\n" + frameData + "],\n ";
134 | s += "\"animations\":" + animationData + "\n";
135 | }
136 | else
137 | {
138 | s += "\"frames\": [" + frameData + "]\n";
139 | }
140 |
141 | s+='\n}\n';
142 |
143 | // cleanup
144 | initializeVars();
145 | }
146 | return s;
147 | }
148 |
149 | function beginExport(meta)
150 | {
151 | initializeVars();
152 | startFrameNumber = 0;
153 | globalMeta = meta;
154 | return "{\n";
155 | }
156 |
157 | function frameExport(frame)
158 | {
159 | var s = "";
160 | if (symbolName != frame.symbolName)
161 | {
162 | s = endSymbol(globalMeta);
163 |
164 | symbolItem = frame.symbol;
165 | symbolName = frame.symbolName;
166 | }
167 | else
168 | {
169 | frameData += ",\n";
170 | }
171 |
172 | frameData += "[" + frame.frame.x + "," + frame.frame.y + "," + frame.frame.w + "," + frame.frame.h + ",0,";
173 | if (frame.trimmed)
174 | {
175 | frameData += (frame.registrationPoint.x - frame.offsetInSource.x) + "," + (frame.registrationPoint.y - frame.offsetInSource.y);
176 | }
177 | else
178 | {
179 | frameData += frame.registrationPoint.x + "," + frame.registrationPoint.y;
180 | }
181 | frameData += "]";
182 |
183 | return s;
184 | }
185 |
186 | function endExport(meta)
187 | {
188 | var s = endSymbol(globalMeta);
189 |
190 | globalMeta = null;
191 |
192 | s += "}\n\n";
193 |
194 | return s;
195 | }
196 |
--------------------------------------------------------------------------------
/illustrator/export-layers-v2/HTMLExporter.jsx:
--------------------------------------------------------------------------------
1 | var HTMLExporter = (function () {
2 |
3 |
4 | var le = "\n";
5 | var tab = "\t";
6 | var imgFolderName="images";
7 | var createSizeProps=true;
8 | var separateCSS;
9 |
10 |
11 | function generateFrom(compData, destFolder, pImgFolderName, pSepCSS){
12 |
13 | imgFolderName = pImgFolderName;
14 | separateCSS = pSepCSS;
15 |
16 | output = processData(compData);
17 |
18 |
19 | var htmlFile = new File(destFolder.absoluteURI+"/index.html");
20 | saveTextFile(output.html, htmlFile);
21 |
22 | if(pSepCSS){
23 | var cssFile = new File(destFolder.absoluteURI+"/styles.css");
24 | saveTextFile(output.css, cssFile);
25 | }
26 |
27 | }
28 |
29 |
30 | function processData(data){
31 |
32 | var itemsData = data.layers;
33 | var compName = data.name.split(".")[0];
34 |
35 | var txtData = processItems(itemsData, "");
36 |
37 | var htmlTxt="";
38 | var mainDiv = '
' + le + txtData.html + le + "
" + le;
39 |
40 | if(separateCSS){
41 | htmlTxt=""+le+""+le+""+le+""+le+""+le+""+le+mainDiv+le+""+le+"";
42 | }
43 | else {
44 | htmlTxt=""+le+""+le+""+le+""+le+mainDiv+le+""+le+"";
45 | }
46 |
47 | return {
48 | html:htmlTxt,
49 | css:txtData.css
50 | }
51 | }
52 |
53 |
54 | function processItems(itemsData, stab){
55 |
56 | var htmltxt = "";
57 | var cssTx = "";
58 |
59 | for (var i=itemsData.length-1; i>=0 ; i--){
60 |
61 | var item = itemsData[i];
62 | var isDiv = (item.type=="div");
63 | var isText = (item.type =="txt");
64 | if(!item.visible) continue;
65 |
66 | if (isDiv) {
67 | htmltxt += stab + '\t' ;
68 | if(item.items.length>0){
69 | var subData = processItems(item.items, stab+tab);
70 | htmltxt += le + subData.html + tab + "
" + le;
71 | cssTx += subData.css + le;
72 | }
73 | else htmltxt += stab + "" + le;
74 | } else if (isText) {
75 | var find = '\r';
76 | var re = new RegExp(find, 'g');
77 | var htmlTxt = item.text.replace(re, "
");
78 | htmltxt += stab + tab + '' + htmlTxt + '
' + le;
79 | }
80 |
81 | else {
82 | htmltxt += stab + tab + '
' + le;
83 | }
84 |
85 |
86 | // CSS
87 | cssTx += getCSS(item, isDiv, isText);
88 | }
89 |
90 |
91 | return {html:htmltxt, css:cssTx};
92 |
93 | }
94 |
95 | function getCSS(item, isDiv, isText){
96 | var cssTxt ="";
97 | cssTxt += "#" + item.name + "{" + le;
98 | cssTxt += tab + "position:absolute;" + le;
99 | cssTxt += tab + "left:"+ Math.round(item.x) + "px;" + le;
100 | cssTxt += tab + "top:" + Math.round(item.y) + "px;" + le;
101 |
102 | if(createSizeProps){
103 | cssTxt += tab + "width:" + Math.round(item.width) + "px;" + le;
104 | cssTxt += tab + "height:" + Math.round(item.height) + "px;" + le;
105 | }
106 |
107 | if(item.bgdColor){
108 | cssTxt += tab + "background-color:" + item.bgdColor + ";" + le;
109 | if(item.opacity) cssTxt += tab + "opacity:" + item.opacity + ";" + le;
110 | }
111 |
112 |
113 | if(isText) {
114 | cssTxt += tab + "font-family:" + item.fontFamily + ";" + le;
115 | cssTxt += tab + "font-size:" + item.fontSize + ";" + le;
116 | cssTxt += tab + "color:" + item.fontColor + ";" + le;
117 | cssTxt += tab + "font-weight:" + item.fontStyle + ";" + le;
118 | if(item.align !="left") cssTxt += tab + "text-align:" + item.align + ";" + le;
119 | cssTxt += tab + "margin:0px;" + le;
120 | }
121 |
122 |
123 | cssTxt += "}" + le + le;
124 |
125 | return cssTxt;
126 |
127 | }
128 |
129 | var obj = {};
130 | obj.generateFrom = generateFrom;
131 | return obj;
132 |
133 | }());
--------------------------------------------------------------------------------
/photoshop/SpriteExporter.jsx:
--------------------------------------------------------------------------------
1 | // (c) Copyright 2012 Adobe Systems, Inc. All rights reserved.
2 | // Written by David Deraedt
3 | // PHOTOSHOP SPRITESHEET EXPORTER
4 |
5 | #include "../common/Utils.jsx"
6 |
7 |
8 | var SpriteExporter = (function () {
9 |
10 |
11 | var layerIndex = 0 ;
12 | var totalFrames = 0;
13 | var exporter;
14 |
15 | /**
16 | * Parses a phothoshop document to create spritesheets
17 | * using a data exporter object
18 | * @srcDoc photoshop document to parse
19 | * @pExporter data exporter
20 | * @imgFolderDestination path to the folder of the image file to be created
21 | * @dataFileDestination path to the data file to be created
22 | */
23 |
24 | function doExport (srcDoc, pExporter, imgFolderDestination, dataFileDestination) {
25 |
26 | exporter = pExporter;
27 |
28 | // Switch to pixel units
29 | var strtRulerUnits = app.preferences.rulerUnits;
30 | if (strtRulerUnits != Units.PIXELS) {
31 | app.preferences.rulerUnits = Units.PIXELS;
32 | }
33 |
34 | // Sprite size
35 | var w = srcDoc.width ;
36 | var h = srcDoc.height ;
37 |
38 | // Get the total number of layers
39 | getTotalLayers(srcDoc.layers);
40 | //$.writeln("totalFrames: " + totalFrames);
41 |
42 | // Compute Sheet size
43 | var cols = Math.ceil(Math.sqrt(totalFrames));
44 | var rows = Math.ceil(totalFrames/cols);
45 | //$.writeln("total rows: " + rows);
46 |
47 | // Create a copy of the current doc
48 | var destDoc = srcDoc.duplicate("tmp", false);
49 |
50 | // Make it the size of the sprite
51 | destDoc.resizeCanvas (cols*w, rows*h, AnchorPosition.TOPLEFT);
52 |
53 | // Select this new doc
54 | app.activeDocument = destDoc;
55 |
56 | // Get the spriteSheet name from the document name
57 | var imageName = srcDoc.name.split(".")[0];
58 |
59 | // Start data output
60 | exporter.beginExport(imageName);
61 |
62 |
63 | // Process each sprite
64 | for (var i = 0 ; i < destDoc.layerSets.length ; i++) {
65 | var spriteSet = destDoc.layerSets[i];
66 | //$.writeln("set: " + i + "> " + spriteSet.allLocked);
67 | if(spriteSet.allLocked) spriteSet.allLocked = false;
68 | if(spriteSet.visible == false) spriteSet.visible = true;
69 |
70 | var destName = spriteSet.name;
71 | processSprite(destDoc, spriteSet.layerSets, destName, cols, rows, w, h);
72 | }
73 |
74 | // End data output
75 | exporter.endExport();
76 |
77 | // save the image file
78 | savePng(destDoc, imgFolderDestination + imageName + ".png" );
79 |
80 | // save the data file
81 | saveTextFile(exporter.getOutput(), dataFileDestination );
82 |
83 | // Close doc
84 | destDoc.close(SaveOptions.DONOTSAVECHANGES);
85 |
86 | // Release refs
87 | srcDoc = null;
88 | destDoc = null;
89 |
90 | // Restore orginal unit preferences
91 | if (strtRulerUnits != app.preferences.rulerUnits) {
92 | app.preferences.rulerUnits = strtRulerUnits;
93 | }
94 |
95 | }
96 |
97 |
98 |
99 | function getTotalLayers(layerList){
100 |
101 | for (var i = 0 ; i < layerList.length ; i++) {
102 | var layer = layerList[i];
103 |
104 | if(layer.typename=="LayerSet") {
105 | getTotalLayers(layer.layers);
106 | }
107 | else {
108 | totalFrames++;
109 | }
110 | }
111 |
112 | return totalFrames;
113 | }
114 |
115 |
116 | function processSprite(doc, layerSets, destName, cols, rows, w, h) {
117 |
118 | // stores the frame count for this sprite
119 | var frameCount = 0 ;
120 |
121 | exporter.addSprite(destName);
122 |
123 | // Parse all animation layer sets
124 | for( var n = 0 ; n < layerSets.length ; n++){
125 |
126 | var set = layerSets[n];
127 | set.allLocked=false;
128 | var setName = set.name;
129 | //$.writeln("Set: " + setName);
130 |
131 | exporter.addAnimation(setName);
132 |
133 | // Parse all frame layers
134 | for( var i = 0 ; i < set.layers.length ; i++){
135 |
136 | var layer = set.layers[i];
137 | //$.writeln("layer: " + layer.name);
138 |
139 | // discard text layers
140 | if (layer.kind == LayerKind.TEXT) {
141 | layerIndex++;
142 | frameCount++;
143 | continue;
144 | }
145 |
146 | // select the next layer
147 | doc.activeLayer = layer;
148 | doc.activeLayer.allLocked=false;
149 |
150 | // move the sprite layer
151 | var destx = (layerIndex % cols) * w;
152 | var desty = (Math.floor(layerIndex/cols)) * h;
153 | doc.activeLayer.translate(destx, desty);
154 |
155 | // export frame data
156 | exporter.addFrame(frameCount, layer.name, Number(destx), Number(desty), Number(w), Number(h));
157 |
158 | layerIndex++;
159 | frameCount++;
160 | }
161 |
162 | exporter.endAnimation();
163 | }
164 |
165 | // add Data to exporter
166 | exporter.exportSprite();
167 | }
168 |
169 |
170 |
171 | function savePng(doc, filepath) {
172 |
173 | var pngFile = new File(filepath);
174 | var pngFileOptions = new PNGSaveOptions();
175 | doc.saveAs (pngFile, pngFileOptions, true, Extension.LOWERCASE);
176 | }
177 |
178 |
179 | return {doExport:doExport};
180 |
181 | }());
182 |
183 |
184 |
--------------------------------------------------------------------------------
/illustrator/export-layers-v2/AltLayerExporter.jsx:
--------------------------------------------------------------------------------
1 | // (c) Copyright 2013 Adobe Systems, Inc. All rights reserved.
2 | // author David Deraedt
3 |
4 | var AltLayerExporter = (function () {
5 |
6 | /**
7 | Exports all layers of a given document to properly sized PNG, JPEG or SVG files
8 | @public
9 | @param {Document} doc The document to export
10 | @param {Folder} destFolder The destination folder for the image files
11 | @param {String} exportType Determines if layers should be converted to SVG, JPG or PNG files
12 | @param {Boolean} ignoreInvisible Determines if invisible layers should be ignored
13 | @param {Function} getLayerParams function taking the layer name as a parameter and returning export params
14 | */
15 |
16 | function exportLayers(doc, destFolder, ignoreInvisible, getExportParams) {
17 |
18 | var n = doc.layers.length;
19 |
20 | var j;
21 |
22 | var destDoc = app.documents.add(DocumentColorSpace.RGB);
23 |
24 | for ( j = 0; j < n; j++){
25 |
26 | var l = doc.layers[j];
27 |
28 | if (ignoreInvisible && l.visible == false) continue;
29 |
30 | var isLocked = l.locked;
31 | if(isLocked) l.locked = false;
32 |
33 | //ignore empty layers
34 | if(l.pageItems.length==0) continue;
35 |
36 | // also ignore items which width==0 (points etc)
37 | if(doc.visibleBounds[0] == doc.visibleBounds[2]) continue;
38 |
39 |
40 | var exportParams = getExportParams(l.name);
41 |
42 | // export the layer itself if an eportType was specified
43 | if (exportParams && exportParams.exportType){
44 | copyLayer(l, destDoc);
45 | destDoc.artboards[0].artboardRect = destDoc.visibleBounds;
46 | exportImage(destDoc, destFolder, exportParams);
47 | destDoc.activeLayer.pageItems.removeAll();
48 | }
49 |
50 |
51 | // parse items
52 | for (var i = 0 ; i < l.pageItems.length ; i++){
53 | var item = l.pageItems[i];
54 | //flog("Processing " + item.name + " data");
55 | if (ignoreInvisible && item.hidden) continue;
56 | exportParams = getExportParams(item.name);
57 | // export item if an eportType was specified
58 | if(exportParams && exportParams.exportType){
59 | item.duplicate(destDoc.activeLayer, ElementPlacement.PLACEATEND);
60 | destDoc.artboards[0].artboardRect = destDoc.visibleBounds;
61 | exportImage(destDoc, destFolder, exportParams);
62 | destDoc.activeLayer.pageItems.removeAll();
63 | }
64 | }
65 |
66 |
67 | if(isLocked) l.locked = true;
68 |
69 | }
70 |
71 | destDoc.close(SaveOptions.DONOTSAVECHANGES);
72 |
73 | }
74 |
75 |
76 | function copyLayer( l, destDoc) {
77 |
78 | var n = l.pageItems.length;
79 | for (var i = 0; i < n; i++){
80 | l.pageItems[i].duplicate(destDoc.activeLayer, ElementPlacement.PLACEATEND);
81 | }
82 |
83 | }
84 |
85 |
86 |
87 | function exportImage(doc, destFolder, exportParams) {
88 |
89 | var dest = destFolder.path + "/" + destFolder.name + "/" + exportParams.name + "." + exportParams.exportType;
90 |
91 | var options;
92 | var exportType = exportParams.exportType.toLowerCase();
93 | var eType;
94 |
95 | if(exportType == "svg") {
96 | eType = ExportType.SVG;
97 | options = new ExportOptionsSVG();
98 | options.coordinatePrecision = exportParams.precision; // 3 by default
99 | options.embedRasterImages = exportParams.embedImages;
100 | options.fontType = SVGFontType.OUTLINEFONT;
101 | if(exportParams.svgFont) {
102 | options.fontType = SVGFontType.SVGFONT;
103 | options.fontSubsetting = SVGFontSubsetting.None;
104 | }
105 | if(doc.variables.length>0) {
106 | options.includeVariablesAndDatasets = true;
107 | }
108 | var cssPropLoc = SVGCSSPropertyLocation.PRESENTATIONATTRIBUTES;
109 | if(exportParams.svgCssPropLoc == 1 ) cssPropLoc =SVGCSSPropertyLocation.STYLEELEMENTS;
110 | else if (exportParams.svgCssPropLoc == 2 ) cssPropLoc =SVGCSSPropertyLocation.STYLEATTRIBUTES;
111 | options.cssProperties = cssPropLoc;
112 | options.documentEncoding = SVGDocumentEncoding.UTF8;
113 |
114 | } else if (exportType == "png") {
115 | eType = ExportType.PNG24;
116 | options = new ExportOptionsPNG24();
117 | options.artBoardClipping=true;
118 |
119 | } else if (exportType == "jpg") {
120 | eType = ExportType.JPEG;
121 | options = new ExportOptionsJPEG();
122 | options.qualitySetting = exportParams.jpgQuality;
123 | options.artBoardClipping=true;
124 | } else {
125 | // unsupported exportTypes are ignored
126 | return;
127 | }
128 |
129 | var fileSpec = new File(dest);
130 |
131 | doc.exportFile( fileSpec, eType, options );
132 | }
133 |
134 |
135 | var obj = {};
136 | obj.exportLayers = exportLayers;
137 | return obj;
138 |
139 | }());
140 |
141 |
--------------------------------------------------------------------------------
/flash-pro/createJS/easeljs2.plugin.jsfl:
--------------------------------------------------------------------------------
1 | /*Options*/
2 |
3 | // The directory where your sheets are stored, relative to your HTML file
4 | var imageDirectory="sprites/";
5 | // Whether or not you want to expose animations as functions
6 | var useHelperFunctions = true;
7 | // The global object in which to store sprite classes.
8 | // e.g. window.myGame.DarkKnight, where DarkKnight is your MovieClip
9 | var libObjName = "myGame";
10 |
11 | /*End of options*/
12 |
13 | function getPluginInfo(lang)
14 | {
15 | pluginInfo = new Object();
16 | pluginInfo.id = "easeljs2";
17 | pluginInfo.name = "easeljs2";
18 | pluginInfo.ext = "js";
19 | pluginInfo.capabilities = new Object();
20 | pluginInfo.capabilities.canRotate = false;
21 | pluginInfo.capabilities.canTrim = true;
22 | pluginInfo.capabilities.canShapePad = true;
23 | pluginInfo.capabilities.canBorderPad = true;
24 | pluginInfo.capabilities.canStackDuplicateFrames = true;
25 | return pluginInfo;
26 | }
27 | var helperFunctions = null;
28 | var symbolItem = null;
29 | var symbolName = null;
30 | var globalMeta = null;
31 | var frameData = "";
32 |
33 | function initializeVars()
34 | {
35 | helperFunctions = null;
36 | symbolItem = null;
37 | symbolName = null;
38 | frameData = "";
39 | }
40 |
41 | function DetermineAnimationData()
42 | {
43 | var labelLayer = null;
44 | var controlLayer = null;
45 | var layers = symbolItem.timeline.layers;
46 |
47 | var i;
48 | for (i = 0; i < layers.length; i++)
49 | {
50 | cmpName = layers[i].name.toLowerCase();
51 | if (cmpName == "labels")
52 | labelLayer = layers[i];
53 |
54 | if (cmpName == "control")
55 | controlLayer = layers[i];
56 | }
57 |
58 | helperFunctions = null;
59 |
60 | if (labelLayer == null)
61 | return ""
62 |
63 | var labelFrame = null;
64 | var controlFrame = null;
65 | var labelIndex = 0;
66 | var controlIndex = 0;
67 | var frameNumber = 0;
68 | var hitSpan = false;
69 | var endFrameNumber = 0;
70 |
71 | var s = "";
72 |
73 | while (labelIndex < labelLayer.frames.length)
74 | {
75 | labelFrame = labelLayer.frames[labelIndex++];
76 | if (controlLayer)
77 | controlFrame = controlLayer.frames[controlIndex++];
78 |
79 |
80 | if (labelFrame.name != null)
81 | {
82 | if (hitSpan)
83 | s += ", ";
84 | else
85 | s += "{";
86 |
87 | endFrameNumber = frameNumber + labelFrame.duration - 1;
88 | beginFrame = frameNumber;
89 | endFrame = endFrameNumber;
90 | s += labelFrame.name + ":[" + beginFrame + "," + endFrame;
91 | if (controlFrame != null && controlFrame.name != null && controlFrame.name.length != 0)
92 | s += ", " + "\"" + controlFrame.name + "\"]";
93 | else
94 | s += ", true]";
95 |
96 | frameNumber = endFrameNumber + 1;
97 | labelIndex = frameNumber;
98 | controlIndex = labelIndex;
99 |
100 | if (!hitSpan)
101 | helperFunctions = "";
102 |
103 | if(useHelperFunctions) {
104 | helperFunctions += symbolName + "_p." + labelFrame.name + " = function(){\n";
105 | helperFunctions += "\tthis.gotoAndPlay(\""+labelFrame.name+"\");\n";
106 | helperFunctions += "}\n";
107 | }
108 |
109 | hitSpan = true;
110 | }
111 | }
112 |
113 | if (hitSpan)
114 | s += "}";
115 |
116 |
117 | return s;
118 | }
119 |
120 | function endSymbol(meta)
121 | {
122 | var s = "";
123 | if (symbolItem != null)
124 | {
125 | symbolName = symbolName.replace(/\s+/g,"_");
126 |
127 | var animationData = DetermineAnimationData();
128 | var proto = symbolName + "_p";
129 |
130 | s += "\nvar "+symbolName + " = function() {\n";
131 | s += "\tthis.initialize();\n"
132 | s += "}\n";
133 |
134 | s += symbolName + "._SpriteSheet = new createjs.SpriteSheet({images: [spritesheetPath], "
135 | if (animationData != null && animationData.length != 0)
136 | {
137 | s += "frames: [" + frameData + "], ";
138 | s += " animations: " + animationData + "});\n";
139 | }
140 | else
141 | {
142 | s += "frames: [" + frameData + "]});\n";
143 | }
144 |
145 | s += "var " + proto + " = " + symbolName + ".prototype = new createjs.BitmapAnimation();\n";
146 | s += "" + proto + ".BitmapAnimation_initialize = " + proto + ".initialize;\n";
147 | s += "" + proto + ".initialize = function() {\n"
148 | s += "\tthis.BitmapAnimation_initialize(" + symbolName + "._SpriteSheet);\n";
149 | s += "\tthis.paused = false;\n";
150 | s += "}\n";
151 |
152 | if (helperFunctions != null)
153 | s += helperFunctions;
154 |
155 | s += "scope." + symbolName + " = " + symbolName + ";\n";
156 |
157 | // cleanup
158 | initializeVars();
159 | }
160 | return s;
161 | }
162 |
163 | function beginExport(meta)
164 | {
165 | initializeVars();
166 | startFrameNumber = 0;
167 | globalMeta = meta;
168 |
169 | var str = "if (!window."+libObjName+") { window."+libObjName+" = {}; }\n(function(scope) {\n";
170 | str += "var spritesheetPath = \""+imageDirectory+meta.image+"\";\n";
171 |
172 | return str;
173 | }
174 |
175 | function frameExport(frame)
176 | {
177 | var s = "";
178 | if (symbolName != frame.symbolName)
179 | {
180 | s = endSymbol(globalMeta);
181 |
182 | symbolItem = frame.symbol;
183 | symbolName = frame.symbolName;
184 | }
185 | else
186 | {
187 | frameData += ",";
188 | }
189 |
190 | frameData += "[" + frame.frame.x + "," + frame.frame.y + "," + frame.frame.w + "," + frame.frame.h + ",0,";
191 | if (frame.trimmed)
192 | {
193 | frameData += (frame.registrationPoint.x - frame.offsetInSource.x) + "," + (frame.registrationPoint.y - frame.offsetInSource.y);
194 | }
195 | else
196 | {
197 | frameData += frame.registrationPoint.x + "," + frame.registrationPoint.y;
198 | }
199 | frameData += "]";
200 |
201 | return s;
202 | }
203 |
204 | function endExport(meta)
205 | {
206 | var s = endSymbol(globalMeta);
207 |
208 | globalMeta = null;
209 |
210 | s += "}(window."+libObjName+"));\n\n";
211 |
212 | return s;
213 | }
214 |
--------------------------------------------------------------------------------
/illustrator/export-layers-v2/DataExtractor.jsx:
--------------------------------------------------------------------------------
1 | var DataExtractor = (function () {
2 |
3 |
4 | function convertPos(point) {
5 | if (app.coordinateSystem === CoordinateSystem.DOCUMENTCOORDINATESYSTEM) {
6 | point = app.activeDocument.convertCoordinate(point, CoordinateSystem.DOCUMENTCOORDINATESYSTEM, CoordinateSystem.ARTBOARDCOORDINATESYSTEM);
7 | }
8 | return point;
9 | }
10 |
11 |
12 |
13 | function getItemCoords(item) {
14 |
15 | //flog("getItemCoords() " + item.name);
16 |
17 | var vb = item.visibleBounds;
18 |
19 |
20 | var p1 = convertPos([vb[0], vb[1]]);
21 | var p2 = convertPos([vb[2], vb[3]]);
22 |
23 | var coords = {
24 | x: (p1[0]).toFixed(2),
25 | y: (p1[1] * -1).toFixed(2),
26 | r: (p2[0]).toFixed(2),
27 | b: (p2[1] * -1).toFixed(2)
28 | };
29 | coords.width = (item.width).toFixed(2);//(coords.r-coords.x).toFixed(2);//
30 | coords.height = (item.height).toFixed(2);//(coords.b-coords.y).toFixed(2);
31 |
32 | return coords;
33 | }
34 |
35 |
36 | function getItemsCoords(items) {
37 |
38 | var coords = getItemCoords(items[0]);
39 |
40 | var gcoords = coords;
41 |
42 | var maxRight = right;
43 | var maxBottom = bottom;
44 |
45 | var count = items.length;
46 |
47 | for (var i = 1; i < count; i++) {
48 |
49 | coords = getItemCoords(items[i]);
50 |
51 | var right = coords.x + coords.width;
52 | var bottom = coords.y + coords.height;
53 | //logtxt += coords.x + " vs " + gcoords.x +"\n" ;
54 | if(parseFloat(coords.x) < parseFloat(gcoords.x)) gcoords.x = coords.x;
55 | if(parseFloat(coords.y) < parseFloat(gcoords.y)) gcoords.y = coords.y;
56 |
57 | if(parseFloat(coords.r) > parseFloat(gcoords.r)) gcoords.r = coords.r;
58 | if(parseFloat(coords.b) > parseFloat(gcoords.b)) gcoords.b = coords.b;
59 | }
60 |
61 |
62 | gcoords.width = (gcoords.r - gcoords.x).toFixed(2);
63 | gcoords.height = (gcoords.b - gcoords.y).toFixed(2);
64 |
65 |
66 | return gcoords;
67 |
68 | }
69 |
70 |
71 | function getLayersCoords(doc, getLayerParams, ignoreHidden) {
72 |
73 | var i = doc.artboards.getActiveArtboardIndex();
74 | var artb = doc.artboards[i];
75 |
76 | var data = {
77 | name:doc.name,
78 | width: Math.ceil(artb.artboardRect[2] - artb.artboardRect[0]),
79 | height: Math.ceil(artb.artboardRect[1] - artb.artboardRect[3]),
80 | layers:[]
81 | };
82 |
83 | var count = doc.layers.length;
84 |
85 | for (var i = 0 ; i < count ; i++){
86 |
87 | var l = doc.layers[i];
88 |
89 | if(ignoreHidden && l.visible ==false) continue;
90 |
91 | var params = getLayerParams(l.name);
92 |
93 | if(params == null) continue;
94 | if(l.pageItems.length==0) continue;
95 |
96 | var d = getItemsCoords(l.pageItems);
97 | d.layername = l.name;
98 | d.name = params.name;
99 |
100 | if(params.exportType){
101 | d.type = params.exportType;
102 | d.filename = params.name + "." + params.exportType;
103 | } else{
104 | d.type="div";
105 | }
106 |
107 | d.visible = l.visible;
108 |
109 | // export items data
110 | d.items=[];
111 | for ( var j = 0 ; j < l.pageItems.length ; j++){
112 |
113 | var item = l.pageItems[j];
114 |
115 | if(ignoreHidden && item.hidden) continue;
116 |
117 | // image file (aka normal) items
118 | if(item.name.indexOf(".")>0){
119 |
120 | var itemParams = getLayerParams(item.name);
121 |
122 | var it = getItemCoords(item);
123 | it.x -= d.x;
124 | it.y -= d.y;
125 | it.layername = item.name;
126 | it.name = itemParams.name;
127 | it.type = itemParams.exportType;
128 | it.filename = itemParams.name + "." + itemParams.exportType;
129 | it.visible = ! item.hidden;
130 | d.items.push(it);
131 |
132 | }
133 |
134 | // other (aka special) items
135 | else {
136 |
137 | // "background" items are just meant to specify the background color of the parent layer
138 | if(item.name =="#bgd") {
139 | var col ;
140 | if(item.fillColor.typename =="SpotColor") col = item.fillColor.spot.color;
141 | else col = item.fillColor;
142 | d.bgdColor = colTohex(col);
143 | if(item.opacity<100) d.opacity = item.opacity /100;
144 | }
145 |
146 | // text items carry text info over to the desc file
147 | else if (item.name.indexOf("=text")>0) {
148 | var it = getItemCoords(item);
149 | it.type="txt";
150 | it.name = item.name.split("=")[0];
151 | it.x -= d.x;
152 | it.y -= d.y;
153 | var tf = item;
154 | var tr = tf.textRange;
155 | var ca = tr.characterAttributes;
156 | it.fontSize = ca.size;
157 |
158 | var col ;
159 | if(ca.fillColor.typename =="SpotColor") col = ca.fillColor.spot.color;
160 | else col = ca.fillColor
161 |
162 | it.fontColor = colTohex(col);
163 | it.fontFamily = ca.textFont.family;
164 | it.fontStyle = ca.textFont.style;
165 | var align ="left";
166 | if( tr.paragraphAttributes.justification==Justification.RIGHT) align = "right";
167 | if( tr.paragraphAttributes.justification==Justification.CENTER) align = "center";
168 | it.align = align;
169 | it.text=tf.contents;
170 | d.items.push(it);
171 | }
172 | }
173 | }
174 |
175 | data.layers.push(d);
176 | }
177 |
178 | return data;
179 |
180 | }
181 |
182 | function colTohex(col){
183 |
184 | function toHex(c) {
185 | var rhex = c.toString(16);
186 | return rhex.length === 1 ? "0" + rhex : rhex;
187 | }
188 | return "#" + toHex(col.red) + toHex(col.green) + toHex(col.blue);
189 | }
190 |
191 | var o = {};
192 | o.getLayersCoords = getLayersCoords;
193 | o.getItemsCoords = getItemsCoords;
194 |
195 | return o;
196 |
197 | }());
198 |
199 |
--------------------------------------------------------------------------------
/illustrator/export2EdgeAnimate/export2Animate.jsxbin:
--------------------------------------------------------------------------------
1 | @JSXBIN@ES@2.0@MyBbyBnAhCMDbyBn0ABJEnAEXzHjXjSjJjUjFjMjOBfjzBhECfRBVzFjQiUjFjYjU
DfAffABD40BhAB0AzDjMjPjHEAFMKbyBn0ADJLnASzDjUjYjUFAneAftLMbyNn0ABJNnASFACzBhLGn
CGCGCGVzBjaHfBnneBhaQzAIfVzDjPjCjKJfCVHfBnnnneBKnnntfAVHfBVJfCyBIfZPnAVFf0ADF40
BiAH4B0AiAJ40BhABCAzKjJjOjTjQjFjDjUiPjCjKKAQMTbyBn0ACJVnASzBjOLAXzGjMjFjOjHjUjI
MfVzGjQiBjSjSjBjZNfDnftaXbYn0ADJYnASJCQIfVNfDVzBjJOfBnftJZnAEjEfRBEjKfRBVJfCfff
fJganAEjEfRBFeDhKhKhKffAVOfBAVLfAByBzBhcPAEO4B0AiAN40BhAJ4C0AiAL40BiABDAzMjJjOj
TjQjFjDjUiBjSjSjBjZQAgdMhAbyBn0ADJhCnASFAVzIjUjFjNjQjMjBjUjFRfDnftLhEbhGn0ACJhG
nASzDjSjFjHSCEjzGiSjFjHiFjYjQTfRCCGCGnVHfBeCiAjbnnneBjdFeBjHftnftJhHnASFAEXzHjS
jFjQjMjBjDjFUfVFfARCVSfCQIfVzDjSjFjQVfEVHfBffnffAVHfBVVfEyBIfZhKnAVFf0AFF40BiAH
4B0AiAR40BhAV4B0AhAS4C0AiACDAzPjQjSjPjDjFjTjTiUjFjNjQjMjBjUjFWAhLMhPbyBn0ACJhRn
ASSAEjTfRCFeCicjTFeBjHftnftZhSnAEXUfVzEjOjBjNjFXfBRCVSfAFeBifffACX40BhAS40BiABB
AzNjOjPjSjNjBjMjJjajFiOjBjNjFYAhTMhWbyBn0ACJhYnASLAXMfXzGjMjBjZjFjSjTZfVzDjEjPj
DgafDnftahZbhan0ACJhanASzBjMgbCQIfXZfVgafDVOfBnftJhbnABXzHjWjJjTjJjCjMjFgcfVgbf
CVgcfEnfAVOfBAVLfAByBPAFO4B0AiAgb4C0AiAgc4B0AhAL40BiAga40BhACDAzTjTjFjUiMjBjZjF
jSjTiWjJjTjJjCjJjMjJjUjZgdAhdMiFbyBn0ADJiHnASFAneAftJiInASzEjGjJjMjFgeBEjzEiGjJ
jMjFgffRBVzEjQjBjUjIhAfCftnftOiJbyiKn0ABJiKnAEjzFjBjMjFjSjUhBfRBFeMjOjPhAjTjVjD
jIhAjGjJjMjFffAhzBhBhCXzGjFjYjJjTjUjThDfVgefBbiNn0AEJiNnAEXzEjPjQjFjOhEfVgefBRB
FeBjSffJiOnASFAEXzEjSjFjBjEhFfVgefBnfnffJiPnAEXzFjDjMjPjTjFhGfVgefBnfZiQnAVFf0A
DF40BiAge4B0AiAhA40BhABCAzNjHjFjUiGjJjMjFiTjUjSjJjOjHhHAiSMiUbyBn0ACJiVnASzFjJj
OjEjFjYhIAEXzLjMjBjTjUiJjOjEjFjYiPjGhJfVzIjGjJjMjFjOjBjNjFhKfBRBFeBhOffnftZiWnA
EXzJjTjVjCjTjUjSjJjOjHhLfVhKfBRCFdAVhIfAffAChK40BhAhI40BiABBAzPjHjFjUiGjJjMjFiO
jBjNjFiQjBjSjUhMAiYMiabyBn0ACJibnAShIAEXhJfVhKfBRBFeBhOffnftZicnAEXhLfVhKfBRBCG
VhIfAnndBffAChK40BhAhI40BiABBAzSjHjFjUiGjJjMjFiOjBjNjFiFjYjUiQjBjSjUhNAidMjCbyB
n0ACgjEbyBn0ABJjFnASzKiGiPiSiDiFiFiSiSiPiShOBjzKiGiPiSiDiFiSiSiSiPiShPfnftABnzD
jFjSjShQnbyBn0ABJjInASzFjXjIjFjSjFhRyBEjgffRBXzIjGjJjMjFiOjBjNjFhSfjhQfffnffZjK
nAXzGjQjBjSjFjOjUhTfVhRf0AChO4B0AiAhR40BiAACAzMjHjFjUiQjBjSjFjOjUiEjJjShUAjLMjO
byBn0AGOjSbyjTn0ABJjTnASzMjGjJjMjFiMjJjOjFiGjFjFjEhVAneHiXjJjOjEjPjXjTffACzChBh
dhWEXzGjTjFjBjSjDjIhXfXzCjPjThYfjCfRBYHjXjJjOjEjPjXjTBjJffnndyBbyjVn0ABJjVnAShV
AneEiVjOjJjYffJjZnABjzHjGjJjMjFiPjVjUhZfEjgffRBVzIjGjJjMjFjQjBjUjIhafCftnfJjanA
BXzIjMjJjOjFiGjFjFjEhbfjhZfVhVfAnfJjbnAEXhEfjhZfRDFeBjXFeEiUiFiYiUFeEhfhfhfhfff
JjcnAEXzFjXjSjJjUjFhcfjhZfRBVDfBffJjdnAEXhGfjhZfnfADhV40BiAha4B0AhAD40BhACBAzMj
TjBjWjFiUjFjYjUiGjJjMjFhdAjeMDbyBn0ABJEnAEXBfjCfRBVDfAffABD40BhAB0AEAFMKbyBn0AD
JLnASFAneAftLMbyNn0ABJNnASFACGnCGCGCGVHfBnneBhaQIfVJfCVHfBnnnneBKnnntfAVHfBVJfC
yBIfZPnAVFf0ADF40BiAH4B0AiAJ40BhABCAKAQMTbyBn0ACJVnASLAXMfVNfDnftaXbYn0ADJYnASJ
CQIfVNfDVOfBnftJZnAEjEfRBEjKfRBVJfCffffJganAEjEfRBFeDhKhKhKffAVOfBAVLfAByBPAEO4
B0AiAN40BhAJ4C0AiAL40BiABDAQAgdMhAbyBn0ADJhCnASFAVRfDnftLhEbhGn0ACJhGnASSCEjTfR
CCGCGnVHfBeCiAjbnnneBjdFeBjHftnftJhHnASFAEXUfVFfARCVSfCQIfVVfEVHfBffnffAVHfBVVf
EyBIfZhKnAVFf0AFF40BiAH4B0AiAR40BhAV4B0AhAS4C0AiACDAWAhLMhPbyBn0ACJhRnASSAEjTfR
CFeCicjTFeBjHftnftZhSnAEXUfVXfBRCVSfAFeBifffACX40BhAS40BiABBAYAhTMhWbyBn0ACJhYn
ASLAXMfXZfVgafDnftahZbhan0ACJhanASgbCQIfXZfVgafDVOfBnftJhbnABXgcfVgbfCVgcfEnfAV
OfBAVLfAByBPAFO4B0AiAgb4C0AiAgc4B0AhAL40BiAga40BhACDAgdAhdMiFbyBn0ADJiHnASFAneA
ftJiInASgeBEjgffRBVhAfCftnftOiJbyiKn0ABJiKnAEjhBfRBFeMjOjPhAjTjVjDjIhAjGjJjMjFf
fAhhCXhDfVgefBbiNn0AEJiNnAEXhEfVgefBRBFeBjSffJiOnASFAEXhFfVgefBnfnffJiPnAEXhGfV
gefBnfZiQnAVFf0ADF40BiAge4B0AiAhA40BhABCAhHAiSMiUbyBn0ACJiVnAShIAEXhJfVhKfBRBFe
BhOffnftZiWnAEXhLfVhKfBRCFdAVhIfAffAChK40BhAhI40BiABBAhMAiYMiabyBn0ACJibnAShIAE
XhJfVhKfBRBFeBhOffnftZicnAEXhLfVhKfBRBCGVhIfAnndBffAChK40BhAhI40BiABBAhNAidMjCb
yBn0ACgjEbyBn0ABJjFnAShOBjhPfnftABnhQnbyBn0ABJjInAShRyBEjgffRBXhSfjhQfffnffZjKn
AXhTfVhRf0AChO4B0AiAhR40BiAACAhUAjLMjObyBn0AGOjSbyjTn0ABJjTnAShVAneHiXjJjOjEjPj
XjTffAChWEXhXfXhYfjCfRBYHjXjJjOjEjPjXjTBjJffnndyBbyjVn0ABJjVnAShVAneEiVjOjJjYff
JjZnABjhZfEjgffRBVhafCftnfJjanABXhbfjhZfVhVfAnfJjbnAEXhEfjhZfRDFeBjXFeEiUiFiYiU
FeEhfhfhfhfffJjcnAEXhcfjhZfRBVDfBffJjdnAEXhGfjhZfnfADhV40BiAha4B0AhAD40BhACBAhd
AjeMDbyBn0ABJEnAEXBfjCfRBVDfAffABD40BhAB0AEAFMKbyBn0ADJLnASFAneAftLMbyNn0ABJNnA
SFACGnCGCGCGVHfBnneBhaQIfVJfCVHfBnnnneBKnnntfAVHfBVJfCyBIfZPnAVFf0ADF40BiAH4B0A
iAJ40BhABCAKAQMTbyBn0ACJVnASLAXMfVNfDnftaXbYn0ADJYnASJCQIfVNfDVOfBnftJZnAEjEfRB
EjKfRBVJfCffffJganAEjEfRBFeDhKhKhKffAVOfBAVLfAByBPAEO4B0AiAN40BhAJ4C0AiAL40BiAB
DAQAgdMhAbyBn0ADJhCnASFAVRfDnftLhEbhGn0ACJhGnASSCEjTfRCCGCGnVHfBeCiAjbnnneBjdFe
BjHftnftJhHnASFAEXUfVFfARCVSfCQIfVVfEVHfBffnffAVHfBVVfEyBIfZhKnAVFf0AFF40BiAH4B
0AiAR40BhAV4B0AhAS4C0AiACDAWAhLMhPbyBn0ACJhRnASSAEjTfRCFeCicjTFeBjHftnftZhSnAEX
UfVXfBRCVSfAFeBifffACX40BhAS40BiABBAYAhTMhWbyBn0ACJhYnASLAXMfXZfVgafDnftahZbhan
0ACJhanASgbCQIfXZfVgafDVOfBnftJhbnABXgcfVgbfCVgcfEnfAVOfBAVLfAByBPAFO4B0AiAgb4C
0AiAgc4B0AhAL40BiAga40BhACDAgdAhdMiFbyBn0ADJiHnASFAneAftJiInASgeBEjgffRBVhAfCft
nftOiJbyiKn0ABJiKnAEjhBfRBFeMjOjPhAjTjVjDjIhAjGjJjMjFffAhhCXhDfVgefBbiNn0AEJiNn
AEXhEfVgefBRBFeBjSffJiOnASFAEXhFfVgefBnfnffJiPnAEXhGfVgefBnfZiQnAVFf0ADF40BiAge
4B0AiAhA40BhABCAhHAiSMiUbyBn0ACJiVnAShIAEXhJfVhKfBRBFeBhOffnftZiWnAEXhLfVhKfBRC
FdAVhIfAffAChK40BhAhI40BiABBAhMAiYMiabyBn0ACJibnAShIAEXhJfVhKfBRBFeBhOffnftZicn
AEXhLfVhKfBRBCGVhIfAnndBffAChK40BhAhI40BiABBAhNAidMjCbyBn0ACgjEbyBn0ABJjFnAShOB
jhPfnftABnhQnbyBn0ABJjInAShRyBEjgffRBXhSfjhQfffnffZjKnAXhTfVhRf0AChO4B0AiAhR40B
iAACAhUAjLMjObyBn0AGOjSbyjTn0ABJjTnAShVAneHiXjJjOjEjPjXjTffAChWEXhXfXhYfjCfRBYH
jXjJjOjEjPjXjTBjJffnndyBbyjVn0ABJjVnAShVAneEiVjOjJjYffJjZnABjhZfEjgffRBVhafCftn
fJjanABXhbfjhZfVhVfAnfJjbnAEXhEfjhZfRDFeBjXFeEiUiFiYiUFeEhfhfhfhfffJjcnAEXhcfjh
ZfRBVDfBffJjdnAEXhGfjhZfnfADhV40BiAha4B0AhAD40BhACBAhdAjeMGbyBn0ABOIbKn0ARJKnAS
gaAXzOjBjDjUjJjWjFiEjPjDjVjNjFjOjUhefjzDjBjQjQhffnftJLnASzHjEjPjDiGjJjMjFiABXzI
jGjVjMjMiOjBjNjFiBfVgafAnftONbOn0ACJOnAEXhBfjzGiXjJjOjEjPjXiCfRBFeiViUjIjJjThAj
TjDjSjJjQjUhAjOjFjFjEjThAjUjPhAjNjPjEjJjGjZhAjZjPjVjShAjEjPjDjVjNjFjOjUhOhAiQjM
jFjBjTjFhAjTjBjWjFhAjJjUhAjCjFjGjPjSjFhAjSjVjOjOjJjOjHhAjUjIjJjThAjTjDjSjJjQjUh
OffZPnAnAhhCXzFjTjBjWjFjEiDfVgafAnJSnASzGjBjOiGjJjMjFiECEXzKjPjQjFjOiEjJjBjMjPj
HiFfjgffRBFehciTjFjMjFjDjUhAjUjIjFhAhOjBjOhAjGjJjMjFhAjPjGhAjUjIjFhAjEjFjTjUjJj
OjBjUjJjPjOhAiFjEjHjFhAiBjOjJjNjBjUjFhAjQjSjPjKjFjDjUhOffnftOTZTnAnAhhCViEfCnJW
nASzKjFjYjQjPjSjUiUjZjQjFiGDdVzGjVjTjFiTiWiHiHfIXzDiTiWiHiIfjzKiFjYjQjPjSjUiUjZ
jQjFiJfXzFiQiOiHhShUiKfjiJfnftJZnASzJjJjUjFjNjTiEjBjUjBiLEEXzQjFjYjQjPjSjUiMjBj
ZjFjSjTiEjBjUjBiMfjzSiMjBjZjFjSiEjBjUjBiFjYjUjSjBjDjUjPjSiNfRCVgafAViGfDffnftJg
anAEXBfjCfRBViLfEffJgcnASzKjEjFjTjUiGjPjMjEjFjSiOFXhTfViEfCnftJgdnASzJjJjNjHiGj
PjMjEjFjSiPGEjzGiGjPjMjEjFjSiQfRBCGCGCGXhAfViOfFnneBhPXXfViOfFnnnneIhPjJjNjBjHj
FjThPftnftOgeJgenAEXzGjDjSjFjBjUjFiRfViPfGnfAhhCXhDfViPfGnJgfnASzEjEjFjTjUiSHCG
XzLjBjCjTjPjMjVjUjFiViSiJiTfViPfGnneBhPnftJhBnAEXzMjFjYjQjPjSjUiMjBjZjFjSjTiUfj
zNiMjBjZjFjSiFjYjQjPjSjUjFjSiVfRDVgafAViPfGViGfDffJhDnAEXzIjEjPiJjNjQjPjSjUiWfj
zTiFjEjHjFiBjOjJjNjBjUjFiJjNjQjPjSjUjFjSiXfRCViEfCViLfEffJhInAEXhGfVgafARBXzQiE
iPiOiPiUiTiBiWiFiDiIiBiOiHiFiTiYfjzLiTjBjWjFiPjQjUjJjPjOjTiZfffJhJnASgaAnbffJhK
nAEXhEfjhffRBViAfBffACzBheiaXMfXzJjEjPjDjVjNjFjOjUjTibfjhffnndAnAJiH40BhAiA4B0A
iAiE4C0AiAiL4E0AiAiO4F0AiAiP4G0AiAiS4H0AiAiG4D0AiAga40BiABIAzIjEjPiFjYjQjPjSjUi
cAhODJFnASiXyBENyBnAMFbyBnAEMSbyBn0AKJUnASiOAXhTfViEfInftJWnASzGjBjOiOjBjNjFidB
EjhMfRBXXfViEfIffnftJYnASiPCEjiQfRBCGCGCGXhAfViOfAnneBhPXXfViOfAnnnneIhPjJjNjBj
HjFjThPftnftOZJZnAEXiRfViPfCnfAhhCXhDfViPfCnJganASiSDCGXiTfViPfCnneBhPnftJgcnAS
zJjPjVjUjQjVjUiUjYjUieEEjzMjQjSjPjDjFjTjTiJjUjFjNjTiffRBViLfJffnftJhAnASzIjFjEj
HjFiGjJjMjFjAFEjgffRBCGCGCGXiTfViOfAnneBhPVidfBnnnneIifjFjEjHjFhOjKjTftnftJhBnA
SzOjFjEjHjFiGjJjMjFiTjUjSjJjOjHjBGEjhHfRBXiTfVjAfFffnftJhCnASzNjOjFjXiGjJjMjFiT
jUjSjJjOjHjCHEXUfVjBfGRCFeGjEjPjNhahAibCGnViefEeGjEjPjNhahAibnffnftJhDnAEjhdfRC
VjCfHVjAfFffAKiE40BhAiL4B0AhAiO40BiAid4B0AiAiP4C0AiAie4E0AiAjA4F0AiAiS4D0AiAjB4
G0AiAjC4H0AiACIAzPjJjNjQjPjSjUiUjPiBjOjJjNjBjUjFjDAhFMhIbyBn0AEJhKnASieAneAftJh
MnASLBXMfViLfEnftahObhQn0ACJhQnASzEjJjUjFjNjEDQIfViLfEVzBjKjFfCnftOhSbhUn0ADJhU
nASieACGnEjzPjPjVjUjQjVjUiHjSjPjVjQiEjBjUjBjGfRFXXfVjEfDFdAFdAFd2nUBFd2nUBffnnn
tfJhVnASieACGnEjiffRBXzFjJjUjFjNjTjHfVjEfDffnnntfJhWnASieACGnnneDidjdhMntfAXjHf
VjEfDJhYnASieACGnEjzLjBjEjEiJjUjFjNiEjBjUjBjIfRBVjEfDffnnntfAVjFfCAVLfBByBPZhbn
AVief0AFjE4D0AiAjF4C0AiAiL40BhAie40BiAL4B0AiABEAifAhcMhfbyBn0AHJiBnASFAneAftJiD
nASFACGnCGCGnXXfVjEfBeLJJjbKJJJjJjEhahHnnneDhHhMKnnntfJiEnASFACGnnneRJJJjUjZjQj
FhahHjJjNjBjHjFhHhMKntfJiFnASFACGnCGCGCGCGCGCGCGCGCGnXzBjYjJfVjEfBeKJJJjSjFjDjU
haibhHnnneEhHhMhAhHXzBjZjKfVjEfBnnnneEhHhMhAhHXzFjXjJjEjUjIjLfVjEfBnnnneGjQjYhH
hMhAhHXzGjIjFjJjHjIjUjMfVjEfBnnnneFjQjYhHhMhAnneQhHjBjVjUjPhHhMhHjBjVjUjPhHidhM
KnnntfJiGnASFACGnCGCGCGCGCGnXXfVjEfBegdJJJjGjJjMjMhaibhCjSjHjCjBhIhQhMhQhMhQhMh
QhJhChMjJjNhLhCnnneBhOXzDjFjYjUjNfVjEfBnnnneNhChMhHhQjQjYhHhMhHhQjQjYhHnneCidKn
nntfJiHnASFACGnnneFJJjdhMKntfZiInAVFf0ACjE40BhAF40BiABBAjIAiJMiMbyBn0AGJiOnASFA
neAftJiQnASFACGnCGCGnVXfBeLJJjbKJJJjJjEhahHnnneDhHhMKnnntfJiRnASFACGnnneRJJJjUj
ZjQjFhahHjHjSjPjVjQhHhMKntfJiSnASFACGnCGCGCGCGCGCGCGCGCGnVjJfCeKJJJjSjFjDjUhaib
hHnnneEhHhMhAhHVjKfDnnnneEhHhMhAhHVzBjXjOfEnnnneGjQjYhHhMhAhHVzBjIjPfFnnnneFjQj
YhHhMhAnneQhHjBjVjUjPhHhMhHjBjVjUjPhHidhMKnnntfJiTnASFACGnnneGJJjDhaibKntfZiUnA
VFf0AGjP4E0AhAjJ4B0AhAX40BhAjO4D0AhAjK4C0AhAF40BiAFBAjGAiVDJiYnASJAWzGiPjCjKjFj
DjUjQAnftJiZnABXiWfVJfAjjDfnfZianAVJf0ABJ40BiAABAICicnfnftJFnASiNyBENyBnAMFbyBn
ADMRbyBn0AFJUnASzHjEjPjDiOjBjNjFjRAEjYfRBEjhMfRBXXfVgafHffffnftJWnASiLBAnnftJYn
ASLCXMfXZfVgafHnftKgcbgen0AKJgenASgbEQIfXZfVgafHVjFfDnftJhAnABXzGjMjPjDjLjFjEjS
fVgbfEncffOhCDhCnAIfACzChdhdjTXMfXzJjQjBjHjFiJjUjFjNjTjUfVgbfEnndAnOhEDhEnAIfAC
jTXgcfVgbfEnncfnJhGnAShSFCGCGVjRfAnneBhNEjYfRBXXfVgbfEffnnnftJhJnABXzSjIjBjTiTj
FjMjFjDjUjFjEiBjSjUjXjPjSjLjVfVgbfEnctfOhMbyhNn0ABJhNnABjjEfEjzOjHjSjPjVjQiTjFj
MjFjDjUjJjPjOjWfRBVgbfEffnfACiaXMfXzJjTjFjMjFjDjUjJjPjOjXfVgafHnndBbyhQn0ABJhQn
ABjjEfXzBhQjYfXjXfVgafHnfJhUnABXjXfVgafHnbfJhXnASzIjJjUjFjNiEjBjUjBjZGEjzLjHjFj
UiJjUjFjNiEjBjUjBjafRDjjEfVhSfFViGfIffnftJhZnAEXzEjQjVjTjIjbfViLfBRBVjZfGffASjF
DCzBhNjcVLfCnndBnffCzChehdjdVjFfDnndATjFDyBtZhdnAViLfBAJjZ4G0AiAjF4D0AiAhS4F0Ai
AiL4B0AiAgb4E0AiAiG4B0AhAjR40BiAL4C0AiAga40BhACHAiMAhfMiDbyBn0AEJiFnASzDjTjFjMj
eAXjXfXhefjhffnftJiGnASzIjOjFjXiHjSjPjVjQjfBEXzDjBjEjEkAfXzKjHjSjPjVjQiJjUjFjNj
TkBfVzFjMjBjZjFjSkCfDnfnftaiIbiJn0ACJiJnASzHjOjFjXiJjUjFjNkDCQIfVjefAjOfnftJiKn
AEXzJjNjPjWjFiUjPiFjOjEkEfVkDfCRBVjffBffAjOfAXMfVjefAByBPZiMnAVjffBAEkC40BhAjf4
B0AiAkD4C0AiAje40BiABDAjWAiNMiSbyBn0AFJiUnASzDjQjPjTkFAXzIjQjPjTjJjUjJjPjOkGfVj
EfCnftOiWbyiXn0ABJiXnASkFAEXzRjDjPjOjWjFjSjUiDjPjPjSjEjJjOjBjUjFkHfXhefjhffRDXk
GfVjEfCXzYiEiPiDiViNiFiOiUiDiPiPiSiEiJiOiBiUiFiTiZiTiUiFiNkIfjzQiDjPjPjSjEjJjOj
BjUjFiTjZjTjUjFjNkJfXzYiBiSiUiCiPiBiSiEiDiPiPiSiEiJiOiBiUiFiTiZiTiUiFiNkKfjkJff
fnffACjTXzQjDjPjPjSjEjJjOjBjUjFiTjZjTjUjFjNkLfjhffXkIfjkJfnnnJianASjNBneDjQjOjH
ftOibJibnASjNBneDjTjWjHffACjTViGfEXiIfjiJfnnnZidnAWjQGjJEXzHjUjPiGjJjYjFjEkMfXj
YfVkFfARBFdCffjKCzBhKkNEXkMfXzBhRkOfVkFfARBFdCffnndyBjLEXkMfXjLfVjEfCRBFdCffjME
XkMfXjMfVjEfCRBFdCffXVXfDjNVjNfBAFX4B0AhAjE40BhAkF40BiAjN4B0AiAiG4C0AhADCAjaAjF
DJjInASJAWjQAnftJjJnABXiMfVJfAjiMfnfZjKnAVJf0ABJ40BiAABAICjMnfnftJFnASiVyBENyBn
AMFbyBnACMTbyBn0AJJVnASzIjEjFjTjUiQjBjUjIkPACGCGCGXhAfViOfLnneBhPXXfViOfLnnnneB
hPnftJXnASzIjBjSjUjCjPjBjSjEkQBXjYfXzJjBjSjUjCjPjBjSjEjTkRfVgafKnftJYnASzKjPjSj
JjHjJjOiSjFjDjUkSCXzMjBjSjUjCjPjBjSjEiSjFjDjUkTfVkQfBnftJganASjRDEjYfRBEjhMfRBX
XfVgafKffffnftJgcnASLEXMfXZfVgafKnftJhAnAEjgdfRCVgafKFcfffahCbhEn0ANJhEnASgbGQI
fXZfVgafKVjFfFnftJhGnABXgcfVgbfGnctfJhHnABXjSfVgbfGncffOhKDhKnAIfACjTXMfXjUfVgb
fGnndAnOhMDhMnAIfACjTXjYfXzNjWjJjTjJjCjMjFiCjPjVjOjEjTkUfVgafKXzBhSkVfXkUfVgafK
nnnOhPJhPnABXkTfVkQfBVzMjDjVjTjUjPjNiCjPjVjOjEjTkWfNnfAVkWfNJhQnABXkTfVkQfBXkUf
VgafKnfJhSnAShSHCGCGVjRfDnneBhNEjYfRBXXfVgbfGffnnnftJhUnASiGIVzRjEjFjGjBjVjMjUi
FjYjQjPjSjUiUjZjQjFkXfMnftJhVnASzHjOjBjNjFiFjOjEkYJEXzGjTjVjCjTjUjSkZfXXfVgbfGR
BCjcXMfXXfVgbfGnndEffnftOhWJhWnASiGIXiKfjiJfnffACjTVkYfJnneEhOjQjOjHnOhXJhXnASi
GIXiIfjiJfnffACjTVkYfJnneEhOjTjWjHnJhanAEjzLjFjYjQjPjSjUiJjNjBjHjFkafRDVgafKCGV
kPfAVhSfHnnViGfIffJhcnABXgcfVgbfGncffAVjFfFAVLfEByBPJhfnABXkTfVkQfBVkSfCnfJiBnA
EjgdfRCVgafKFctffAOkP40BiAjF4F0AiAhS4H0AiAiO4B0AhAkX4C0AhAgb4G0AiAkW4D0AhAkQ4B0
AiAkS4C0AiAkY4J0AiAiG4I0AiAjR4D0AiAL4E0AiAga40BhAEKAiUAiCMiGbyBn0ADOiKbiLn0ACJi
LnASzHjPjQjUjJjPjOjTkbAEjzQiFjYjQjPjSjUiPjQjUjJjPjOjTiTiWiHkcfntnffJiMnABXzRjFj
NjCjFjEiSjBjTjUjFjSiJjNjBjHjFjTkdfVkbfAnctfACjTViGfEXiIfjiJfnnOiObyiPn0ABJiPnAS
kbAEjzSiFjYjQjPjSjUiPjQjUjJjPjOjTiQiOiHhShUkefntnffACjTViGfEXiKfjiJfnnnJiSnASzI
jGjJjMjFiTjQjFjDkfBEjgffRBViSfDftnftJiUnAEXzKjFjYjQjPjSjUiGjJjMjFlAfVgafCRDVkff
BViGfEVkbfAffAFkb40BiAiS4B0AhAiG4C0AhAkf4B0AiAga40BhADCAkaAiWDJiZnASJAWjQAnftJi
anABXiUfVJfAjiUfnfZibnAVJf0ABJ40BiAABAICidnfnftADiX40BiAiV4C0AiAiN4B0AiAADAIByB
--------------------------------------------------------------------------------
/photoshop/export2EdgeAnimate/exportToEdgeAnimate.jsxbin:
--------------------------------------------------------------------------------
1 | @JSXBIN@ES@2.0@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
iUjZjQjFiJiEhffRBFeEjTjFjUjEffnftJFnASzFjEjFjTjDhSiABEjzQiBjDjUjJjPjOiEjFjTjDjS
jJjQjUjPjSiBfntnftJGnASzGjJjEjOjVjMjMiCCEjhffRBFeEjOjVjMjMffnftJHnASzEjSjFjGhRi
DDEjzPiBjDjUjJjPjOiSjFjGjFjSjFjOjDjFiEfntnftJInASzGjJjEiDjIjOjMiFEEjhffRBFeEiDj
IjOjMffnftJJnASzGjJjEjGjTjFjMiGFEjhffRBFeEjGjTjFjMffnftJKnAEXzLjQjVjUiQjSjPjQjF
jSjUjZiHfViDfDRCViFfEViGfFffJLnAEXzMjQjVjUiSjFjGjFjSjFjOjDjFiIfViAfBRCViCfCViDf
DffJMnASzDjJjEiUiJGEjhffRBFeEiUhAhAhAffnftJNnASzEjSjFjGhSiKHEjiEfntnftJOnASiFEE
jhffRBFeEiDjIjOjMffnftJPnASiFEEjhffRBFeEiDjIjOjMffnftJQnASzGjJjEiUjSjTjQiLIEjhf
fRBFeEiUjSjTjQffnftJRnAEXzNjQjVjUiFjOjVjNjFjSjBjUjFjEiMfViKfHRDViFfEViFfEViLfIf
fJSnASzFjJjEiMjZjSiNJEjhffRBFeEiMjZjShAffnftJTnAEXzHjQjVjUiOjBjNjFiOfViKfHRCViN
fJXXfVzFjMjBjZjFjSiPfKffJUnAEXiIfViAfBRCViJfGViKfHffJWnAEjzNjFjYjFjDjVjUjFiBjDj
UjJjPjOiQfRDVhefAViAfBXzCiOiPiRfjzLiEjJjBjMjPjHiNjPjEjFjTiSfffALiF4E0AiAiG4F0Ai
AiJ4G0AiAiK4H0AiAiL4I0AiAiN4J0AiAiP40BhAhe40BiAiA4B0AiAiC4C0AiAiD4D0AiABKAzPjTj
FjMjFjDjUiWjJjTjJjCjMjFiJjOiTAXMgabyBn0AWJgcnASheAEjhffRBFeEjTjFjUjEffnftJgdnAS
zGjEjFjTjDhShZiUBEjiBfntnftJgenASiCCEjhffRBFeEjOjVjMjMffnftJgfnASzFjSjFjGhThQiV
DEjiEfntnftJhAnASiFEEjhffRBFeEiDjIjOjMffnftJhBnASiGFEjhffRBFeEjGjTjFjMffnftJhCn
AEXiHfViVfDRCViFfEViGfFffJhDnAEXiIfViUfBRCViCfCViVfDffJhEnASiJGEjhffRBFeEiUhAhA
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
DFeBjXFeEiUiFiYiUFeEhfhfhfhfffJjcnAEXhcfjhZfRBVDfBffJjdnAEXhGfjhZfnfADD40BhAha4
B0AhAhV40BiACBAhdAjeMHbyBn0AOOKZKnAnACzChdhdifXMfXzJjEjPjDjVjNjFjOjUjTjAfjzDjBj
QjQjBfnndAnJMnASgaAXzOjBjDjUjJjWjFiEjPjDjVjNjFjOjUjCfjjBfnftJPnASzOjTjUjSjUiSjV
jMjFjSiVjOjJjUjTjDBXzKjSjVjMjFjSiVjOjJjUjTjEfXzLjQjSjFjGjFjSjFjOjDjFjTjFfjjBfnf
tOQbyRn0ABJRnABXjEfXjFfjjBfXzGiQiJiYiFiMiTjGfjzFiVjOjJjUjTjHfnfAChWVjDfBXjGfjjH
fnnnJVnASzJjJjUjFjNjTiEjBjUjBjICEXzQjFjYjQjPjSjUiMjBjZjFjSjTiEjBjUjBjJfjzSiMjBj
ZjFjSiEjBjUjBiFjYjUjSjBjDjUjPjSjKfRCVgafAFeDiQiOiHffnftJXnAEjQfRBVjIfCffJganASz
GjBjOiGjJjMjFjLDEXzKjPjQjFjOiEjJjBjMjPjHjMfjgffRBFehciTjFjMjFjDjUhAjUjIjFhAhOjB
jOhAjGjJjMjFhAjPjGhAjUjIjFhAjEjFjTjUjJjOjBjUjJjPjOhAiFjEjHjFhAiBjOjJjNjBjUjFhAj
QjSjPjKjFjDjUhOffnftOgbZgbnAnAhhCVjLfDnJgdnASzKjEjFjTjUiGjPjMjEjFjSjNEXhTfVjLfD
nftJgenASzJjJjNjHiGjPjMjEjFjSjOFEjzGiGjPjMjEjFjSjPfRBCGCGCGXhAfVjNfEnneBhPXXfVj
NfEnnnneIhPjJjNjBjHjFjThPftnftOgfJgfnAEXzGjDjSjFjBjUjFjQfVjOfFnfAhhCXhDfVjOfFnJ
hCnAEXzPjFjYjQjPjSjUiEjPjDiMjBjZjFjSjTjRfjzNiMjBjZjFjSiFjYjQjPjSjUjFjSjSfRCVgaf
AVjOfFffJhEnAEXzIjEjPiJjNjQjPjSjUjTfjzTiFjEjHjFiBjOjJjNjBjUjFiJjNjQjPjSjUjFjSjU
fRCVjLfDVjIfCffJhGnABXjEfXjFfjjBfVjDfBnfAGjD4B0AiAjN4E0AiAjI4C0AiAjL4D0AiAjO4F0
AiAga40BiAAGAzOjFjYjQjPjSjUhSiBjOjJjNjBjUjFjVAhIDJHnASjKyBENyBnAMHbyBnAEMVbyBn0
AEJXnABjzHjEjPjDiOjBjNjFjWfEjYfRBEjhMfRBXXfVgafBffffnfJYnASzKjFjYjQjPjSjUiUjZjQ
jFjXCVjXfCnffJganASjIAEjzNjQjSjPjDjFjTjTiMjBjZjFjSjTjYfRCXZfVgafBVgafBffnftZgcn
AVjIf0ADjX4B0AhAjI40BiAga40BhACBAjJAgdMhAbyBn0AEJhCnASjIAAnnftJhEnASLBXMfVZfGnf
tKhIbhKn0AIJhKnASgbDQIfVZfGVzBjKjZfCnftOhNDhNnAIfACifXgcfVgbfDnncfnJhPnAEjEfRBC
GCGXXfVgbfDnnePjJjThAjBjSjUhAjMjBjZjFjSjThfhACzKjJjOjTjUjBjOjDjFjPjGjaVgbfDjzIi
BjSjUiMjBjZjFjSjbfnnnnffOhRbhTn0AEJhTnASzJjHjSjPjVjQiEjBjUjBjcEEjzMjQjSjPjDjFjT
jTiHjSjPjVjQjdfRBVgbfDffnftJhUnAEXzEjQjVjTjIjefVjIfARBVjcfEffJhVnABXzFjJjUjFjNj
TjffVjcfEEjjYfRCXZfVgbfDVgafHffnfDhWnAIfACifCjaVgbfDjjbfnnnncfnOhaDhanAIfAUzChG
hGkAUkAChWXzEjLjJjOjEkBfVgbfDXzGiOiPiSiNiBiMkCfjzJiMjBjZjFjSiLjJjOjEkDfnnChWXkB
fVgbfDXzEiUiFiYiUkEfjkDfnnnnChWXkBfVgbfDXzJiTiPiMiJiEiGiJiMiMkFfjkDfnnnnnOheDhe
nAIfACifXzBhSkGfXzGjCjPjVjOjEjTkHfVgbfDnndAnJiAnASzIjJjUjFjNiEjBjUjBkIFEjzMjQjS
jPjDjFjTjTiMjBjZjFjSkJfRCVgbfDVgafHffnftJiCnAEXjefVjIfARBVkIfFffASjZCCzBhNkKVLf
BnndBnffCzChehdkLVjZfCnndATjZCyBtZiGnAVjIf0AIkI4F0AiAjZ4C0AiAZ40BhAgb4D0AiAjI40
BiAjc4E0AiAL4B0AiAga4B0AhACGAjYAiHMiLbyBn0AKJiNnABXzLjBjDjUjJjWjFiMjBjZjFjSkMfV
gafIVgbfHnfJiPnAShSACGCGjjWfnneBhNEjYfRBXXfVgbfHffnnnftOiRJiRnAEjiefRBVgbfHffAC
ifXkBfVgbfHXkFfjkDfnnJiSnAEjiTfRBVgbfHffJiUnASzDjTjFjMkNBXzJjTjFjMjFjDjUjJjPjOk
OfVgafInftJiWnASzCjQjYkPCXzFjWjBjMjVjFkQfXzBhQkRfXkHfVkNfBnftJiXnASzCjQjZkSDXkQ
fXzBhRkTfXkHfVkNfBnftJiYnASzCjQjXkUECkKXkQfXkGfXkHfVkNfBVkPfCnnnftJiZnASzCjQjIk
VFCkKXkQfXzBhTkWfXkHfVkNfBVkSfDnnnftJicnASkIGWzGiPjCjKjFjDjUkXGzBjYkYVkPfCzBjZk
ZVkSfDzFjXjJjEjUjIkaVkUfEzGjIjFjJjHjIjUkbVkVfFXVhSfAzDjFjYjUkcFeDjQjOjHnftZjGnA
VkIfGAJkI4G0AiAkP4C0AiAkU4E0AiAkV4F0AiAhS40BiAgb40BhAkS4D0AiAkN4B0AiAga4B0AhACH
AkJAjHMjKbyBn0ADJjMnASXAEjYfRBXXfVgbfCffnftJjOnASjcBWkXHkYFdAkZFdAkaFd2nUBkbFd2
nUBXVXfAkcFbjfAnnftZjYnAVjcfBADX40BiAgb40BhAjc4B0AiABCAjdAjaEJSnASjWAneAftJjdnA
SJCWkXAnftJjenABXjJfVJfCjjJfnfZjfnAVJfCADjW40BiAjX4B0AiAJ4C0AiAADAICkBnfnftJFnA
SjSyBENyBnAMFbyBnADMPbyBn0ADJRnASzIjEjFjTjUiQjBjUjIkdACGCGCGXhAfVjNfDnneBhPXXfV
jNfDnnnneBhPnftJTnASjWBEjYfRBEjhMfRBXXfVgafCffffnftJVnAEjzMjFjYjQjPjSjUiMjBjZjF
jSjTkefRDXZfVgafCVkdfAVjWfBffAEjN4B0AhAjW4B0AiAkd40BiAga40BhACCAjRAWMgabyBn0ACJ
gdnASLAXMfVZfEnftahBbhDn0AJJhDnASgbCQIfVZfEVjZfBnftJhFnAShSDCGCGVzGjQjSjFjGjJjY
kffGnneBhNEjYfRBXXfVgbfCffnnnftJhHnAEjEfRBXXfVgbfCffOhKDhKnAIfACifXgcfVgbfCnncf
nOhNbhOn0ACJhOnAEjkefRDXZfVgbfCVkdfFVkffGffDhPnAIfACifCjaVgbfCjjbfnnnncfnOhTbyh
Un0ABJhUnAEXzJjSjBjTjUjFjSjJjajFlAfVgbfCRBXzFiTiIiBiQiFlBfjzNiSjBjTjUjFjSjJjajF
iUjZjQjFlCfffACifXkBfVgbfCXkFfjkDfnnOhYbhZn0ACJhZnAEjEfRBCGCGXXfVgbfCnneZhAjJjH
jOjPjSjFjEhAjCjFjDjBjVjTjFhAjLjJjOjEhAjJjThAXkBfVgbfCnnffDhanAIfAUkAChWXkBfVgbf
CXkCfjkDfnnChWXkBfVgbfCXkEfjkDfnnnnnOhfDhfnAIfACifXkGfXkHfVgbfCnndAnJiBnABXkMfX
jCfjjBfVgbfCnfJiEnAEjzLjFjYjQjPjSjUiJjNjBjHjFlDfREXjCfjjBfVgbfCVkdfFVhSfDffAVjZ
fBAVLfAByBPAHkf4C0AhAjZ4B0AiAhS4D0AiAZ40BhAgb4C0AiAkd4B0AhAL40BiADEAkeAiJMiNbyB
n0AOJiPnAEjiTfRBVgbfJffJiQnAEXzEjDjPjQjZlEfXkOfVgafInfJiRnASkHAXkHfXkOfVgafInft
JiSnASkYBXkQfXkRfVkHfAnftJiTnASkZCXkQfXkTfVkHfAnftJiUnASzBjXlFDCkKXkQfXkGfVkHfA
VkYfBnnnftJiVnASzBjIlGECkKXkQfXkWfVkHfAVkZfCnnnftJiXnASzGjOjFjXiEjPjDlHFEXzDjBj
EjElIfXjAfjjBfRGVlFfDVlGfEFdiIXXfVgbfJXzDiSiHiClJfjzPiOjFjXiEjPjDjVjNjFjOjUiNjP
jEjFlKfXzLiUiSiBiOiTiQiBiSiFiOiUlLfjzMiEjPjDjVjNjFjOjUiGjJjMjMlMfffnftJiYnAEXzF
jQjBjTjUjFlNfVlHfFnfJianASzOjQjOjHiTjBjWjFiPjQjUjJjPjOjTlOGEjzOiQiOiHiTjBjWjFiP
jQjUjJjPjOjTlPfntnftJibnASzIjTjBjWjFiGjJjMjFlQHEjgffRBCGCGVkdfKVhSfLnnnneEhOjQj
OjHftnftJicnAEXzGjTjBjWjFiBjTlRfVlHfFREVlQfHVlOfGFctXzJiMiPiXiFiSiDiBiTiFlSfjzJ
iFjYjUjFjOjTjJjPjOlTfffJidnAEXhGfVlHfFRBXzQiEiPiOiPiUiTiBiWiFiDiIiBiOiHiFiTlUfj
zLiTjBjWjFiPjQjUjJjPjOjTlVfffJienASlHFnbffAMlG4E0AiAkY4B0AiAlF4D0AiAkZ4C0AiAkH4
0BiAhS4D0AhAlO4G0AiAgb4B0AhAlQ4H0AiAlH4F0AiAkd4C0AhAga40BhAEIAlDAifDJjCnASJAWkX
AnftJjDnABXjRfVJfAjjRfnfZjEnAVJf0ABJ40BiAABAICjGnfnftJFnASjUyBENyBnAMFbyBnAEMSb
yBn0AKJUnASjNAXhTfVjLfInftJWnASzGjBjOiOjBjNjFlWBEjhMfRBXXfVjLfIffnftJYnASjOCEjj
PfRBCGCGCGXhAfVjNfAnneBhPXXfVjNfAnnnneIhPjJjNjBjHjFjThPftnftOZJZnAEXjQfVjOfCnfA
hhCXhDfVjOfCnJganASzEjEjFjTjUlXDCGXzLjBjCjTjPjMjVjUjFiViSiJlYfVjOfCnneBhPnftJgc
nASzJjPjVjUjQjVjUiUjYjUlZEEjzMjQjSjPjDjFjTjTiJjUjFjNjTlafRBVjIfJffnftJhAnASzIjF
jEjHjFiGjJjMjFlbFEjgffRBCGCGCGXlYfVjNfAnneBhPVlWfBnnnneIifjFjEjHjFhOjKjTftnftJh
BnASzOjFjEjHjFiGjJjMjFiTjUjSjJjOjHlcGEjhHfRBXlYfVlbfFffnftJhCnASzNjOjFjXiGjJjMj
FiTjUjSjJjOjHldHEXUfVlcfGRCFeGjEjPjNhahAibCGnVlZfEeGjEjPjNhahAibnffnftJhDnAEjhd
fRCVldfHVlbfFffAKlc4G0AiAld4H0AiAjN40BiAlX4D0AiAjI4B0AhAjL40BhAlW4B0AiAjO4C0AiA
lZ4E0AiAlb4F0AiACIAzPjJjNjQjPjSjUiUjPiBjOjJjNjBjUjFleAhFMhIbyBn0AEJhKnASlZAneAf
tJhMnASLBXMfVjIfEnftahObhQn0ACJhQnASzEjJjUjFjNlfDQIfVjIfEVjZfCnftOhSbhUn0ADJhUn
ASlZACGnEjzPjPjVjUjQjVjUiHjSjPjVjQiEjBjUjBmAfRFXXfVlffDFdAFdAFd2nUBFd2nUBffnnnt
fJhVnASlZACGnEjlafRBXjffVlffDffnnntfJhWnASlZACGnnneDidjdhMntfAXjffVlffDJhYnASlZ
ACGnEjzLjBjEjEiJjUjFjNiEjBjUjBmBfRBVlffDffnnntfAVjZfCAVLfBByBPZhbnAVlZf0AFlf4D0
AiAjZ4C0AiAjI40BhAlZ40BiAL4B0AiABEAlaAhcMhfbyBn0AHJiBnASFAneAftJiDnASFACGnCGCGn
XXfVlffBeLJJjbKJJJjJjEhahHnnneDhHhMKnnntfJiEnASFACGnnneRJJJjUjZjQjFhahHjJjNjBjH
jFhHhMKntfJiFnASFACGnCGCGCGCGCGCGCGCGCGnXkYfVlffBeKJJJjSjFjDjUhaibhHnnneEhHhMhA
hHXkZfVlffBnnnneEhHhMhAhHXkafVlffBnnnneGjQjYhHhMhAhHXkbfVlffBnnnneFjQjYhHhMhAnn
eQhHjBjVjUjPhHhMhHjBjVjUjPhHidhMKnnntfJiGnASFACGnCGCGCGCGCGnXXfVlffBegdJJJjGjJj
MjMhaibhCjSjHjCjBhIhQhMhQhMhQhMhQhJhChMjJjNhLhCnnneBhOXkcfVlffBnnnneNhChMhHhQjQ
jYhHhMhHhQjQjYhHnneCidKnnntfJiHnASFACGnnneFJJjdhMKntfZiInAVFf0ACF40BiAlf40BhABB
AmBAiJMiMbyBn0AGJiOnASFAneAftJiQnASFACGnCGCGnVXfBeLJJjbKJJJjJjEhahHnnneDhHhMKnn
ntfJiRnASFACGnnneRJJJjUjZjQjFhahHjHjSjPjVjQhHhMKntfJiSnASFACGnCGCGCGCGCGCGCGCGC
GnVkYfCeKJJJjSjFjDjUhaibhHnnneEhHhMhAhHVkZfDnnnneEhHhMhAhHVlFfEnnnneGjQjYhHhMhA
hHVlGfFnnnneFjQjYhHhMhAnneQhHjBjVjUjPhHhMhHjBjVjUjPhHidhMKnnntfJiTnASFACGnnneGJ
JjDhaibKntfZiUnAVFf0AGlG4E0AhAkY4B0AhAX40BhAF40BiAlF4D0AhAkZ4C0AhAFBAmAAiVDJiYn
ASJAWkXAnftJiZnABXjTfVJfAjlefnfZianAVJf0ABJ40BiAABAICicnfnftADjS4B0AiAjK40BiAjU
4C0AiAADAIByB
--------------------------------------------------------------------------------
/common/json2.js:
--------------------------------------------------------------------------------
1 | /*
2 | json2.js
3 | 2013-05-26
4 |
5 | Public Domain.
6 |
7 | NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
8 |
9 | See http://www.JSON.org/js.html
10 |
11 |
12 | This code should be minified before deployment.
13 | See http://javascript.crockford.com/jsmin.html
14 |
15 | USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
16 | NOT CONTROL.
17 |
18 |
19 | This file creates a global JSON object containing two methods: stringify
20 | and parse.
21 |
22 | JSON.stringify(value, replacer, space)
23 | value any JavaScript value, usually an object or array.
24 |
25 | replacer an optional parameter that determines how object
26 | values are stringified for objects. It can be a
27 | function or an array of strings.
28 |
29 | space an optional parameter that specifies the indentation
30 | of nested structures. If it is omitted, the text will
31 | be packed without extra whitespace. If it is a number,
32 | it will specify the number of spaces to indent at each
33 | level. If it is a string (such as '\t' or ' '),
34 | it contains the characters used to indent at each level.
35 |
36 | This method produces a JSON text from a JavaScript value.
37 |
38 | When an object value is found, if the object contains a toJSON
39 | method, its toJSON method will be called and the result will be
40 | stringified. A toJSON method does not serialize: it returns the
41 | value represented by the name/value pair that should be serialized,
42 | or undefined if nothing should be serialized. The toJSON method
43 | will be passed the key associated with the value, and this will be
44 | bound to the value
45 |
46 | For example, this would serialize Dates as ISO strings.
47 |
48 | Date.prototype.toJSON = function (key) {
49 | function f(n) {
50 | // Format integers to have at least two digits.
51 | return n < 10 ? '0' + n : n;
52 | }
53 |
54 | return this.getUTCFullYear() + '-' +
55 | f(this.getUTCMonth() + 1) + '-' +
56 | f(this.getUTCDate()) + 'T' +
57 | f(this.getUTCHours()) + ':' +
58 | f(this.getUTCMinutes()) + ':' +
59 | f(this.getUTCSeconds()) + 'Z';
60 | };
61 |
62 | You can provide an optional replacer method. It will be passed the
63 | key and value of each member, with this bound to the containing
64 | object. The value that is returned from your method will be
65 | serialized. If your method returns undefined, then the member will
66 | be excluded from the serialization.
67 |
68 | If the replacer parameter is an array of strings, then it will be
69 | used to select the members to be serialized. It filters the results
70 | such that only members with keys listed in the replacer array are
71 | stringified.
72 |
73 | Values that do not have JSON representations, such as undefined or
74 | functions, will not be serialized. Such values in objects will be
75 | dropped; in arrays they will be replaced with null. You can use
76 | a replacer function to replace those with JSON values.
77 | JSON.stringify(undefined) returns undefined.
78 |
79 | The optional space parameter produces a stringification of the
80 | value that is filled with line breaks and indentation to make it
81 | easier to read.
82 |
83 | If the space parameter is a non-empty string, then that string will
84 | be used for indentation. If the space parameter is a number, then
85 | the indentation will be that many spaces.
86 |
87 | Example:
88 |
89 | text = JSON.stringify(['e', {pluribus: 'unum'}]);
90 | // text is '["e",{"pluribus":"unum"}]'
91 |
92 |
93 | text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t');
94 | // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
95 |
96 | text = JSON.stringify([new Date()], function (key, value) {
97 | return this[key] instanceof Date ?
98 | 'Date(' + this[key] + ')' : value;
99 | });
100 | // text is '["Date(---current time---)"]'
101 |
102 |
103 | JSON.parse(text, reviver)
104 | This method parses a JSON text to produce an object or array.
105 | It can throw a SyntaxError exception.
106 |
107 | The optional reviver parameter is a function that can filter and
108 | transform the results. It receives each of the keys and values,
109 | and its return value is used instead of the original value.
110 | If it returns what it received, then the structure is not modified.
111 | If it returns undefined then the member is deleted.
112 |
113 | Example:
114 |
115 | // Parse the text. Values that look like ISO date strings will
116 | // be converted to Date objects.
117 |
118 | myData = JSON.parse(text, function (key, value) {
119 | var a;
120 | if (typeof value === 'string') {
121 | a =
122 | /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
123 | if (a) {
124 | return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
125 | +a[5], +a[6]));
126 | }
127 | }
128 | return value;
129 | });
130 |
131 | myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
132 | var d;
133 | if (typeof value === 'string' &&
134 | value.slice(0, 5) === 'Date(' &&
135 | value.slice(-1) === ')') {
136 | d = new Date(value.slice(5, -1));
137 | if (d) {
138 | return d;
139 | }
140 | }
141 | return value;
142 | });
143 |
144 |
145 | This is a reference implementation. You are free to copy, modify, or
146 | redistribute.
147 | */
148 |
149 | /*jslint evil: true, regexp: true */
150 |
151 | /*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply,
152 | call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
153 | getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
154 | lastIndex, length, parse, prototype, push, replace, slice, stringify,
155 | test, toJSON, toString, valueOf
156 | */
157 |
158 |
159 | // Create a JSON object only if one does not already exist. We create the
160 | // methods in a closure to avoid creating global variables.
161 |
162 | if (typeof JSON !== 'object') {
163 | JSON = {};
164 | }
165 |
166 | (function () {
167 | 'use strict';
168 |
169 | function f(n) {
170 | // Format integers to have at least two digits.
171 | return n < 10 ? '0' + n : n;
172 | }
173 |
174 | if (typeof Date.prototype.toJSON !== 'function') {
175 |
176 | Date.prototype.toJSON = function () {
177 |
178 | return isFinite(this.valueOf())
179 | ? this.getUTCFullYear() + '-' +
180 | f(this.getUTCMonth() + 1) + '-' +
181 | f(this.getUTCDate()) + 'T' +
182 | f(this.getUTCHours()) + ':' +
183 | f(this.getUTCMinutes()) + ':' +
184 | f(this.getUTCSeconds()) + 'Z'
185 | : null;
186 | };
187 |
188 | String.prototype.toJSON =
189 | Number.prototype.toJSON =
190 | Boolean.prototype.toJSON = function () {
191 | return this.valueOf();
192 | };
193 | }
194 |
195 | var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
196 | escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
197 | gap,
198 | indent,
199 | meta = { // table of character substitutions
200 | '\b': '\\b',
201 | '\t': '\\t',
202 | '\n': '\\n',
203 | '\f': '\\f',
204 | '\r': '\\r',
205 | '"' : '\\"',
206 | '\\': '\\\\'
207 | },
208 | rep;
209 |
210 |
211 | function quote(string) {
212 |
213 | // If the string contains no control characters, no quote characters, and no
214 | // backslash characters, then we can safely slap some quotes around it.
215 | // Otherwise we must also replace the offending characters with safe escape
216 | // sequences.
217 |
218 | escapable.lastIndex = 0;
219 | return escapable.test(string) ? '"' + string.replace(escapable, function (a) {
220 | var c = meta[a];
221 | return typeof c === 'string'
222 | ? c
223 | : '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
224 | }) + '"' : '"' + string + '"';
225 | }
226 |
227 |
228 | function str(key, holder) {
229 |
230 | // Produce a string from holder[key].
231 |
232 | var i, // The loop counter.
233 | k, // The member key.
234 | v, // The member value.
235 | length,
236 | mind = gap,
237 | partial,
238 | value = holder[key];
239 |
240 | // If the value has a toJSON method, call it to obtain a replacement value.
241 |
242 | if (value && typeof value === 'object' &&
243 | typeof value.toJSON === 'function') {
244 | value = value.toJSON(key);
245 | }
246 |
247 | // If we were called with a replacer function, then call the replacer to
248 | // obtain a replacement value.
249 |
250 | if (typeof rep === 'function') {
251 | value = rep.call(holder, key, value);
252 | }
253 |
254 | // What happens next depends on the value's type.
255 |
256 | switch (typeof value) {
257 | case 'string':
258 | return quote(value);
259 |
260 | case 'number':
261 |
262 | // JSON numbers must be finite. Encode non-finite numbers as null.
263 |
264 | return isFinite(value) ? String(value) : 'null';
265 |
266 | case 'boolean':
267 | case 'null':
268 |
269 | // If the value is a boolean or null, convert it to a string. Note:
270 | // typeof null does not produce 'null'. The case is included here in
271 | // the remote chance that this gets fixed someday.
272 |
273 | return String(value);
274 |
275 | // If the type is 'object', we might be dealing with an object or an array or
276 | // null.
277 |
278 | case 'object':
279 |
280 | // Due to a specification blunder in ECMAScript, typeof null is 'object',
281 | // so watch out for that case.
282 |
283 | if (!value) {
284 | return 'null';
285 | }
286 |
287 | // Make an array to hold the partial results of stringifying this object value.
288 |
289 | gap += indent;
290 | partial = [];
291 |
292 | // Is the value an array?
293 |
294 | if (Object.prototype.toString.apply(value) === '[object Array]') {
295 |
296 | // The value is an array. Stringify every element. Use null as a placeholder
297 | // for non-JSON values.
298 |
299 | length = value.length;
300 | for (i = 0; i < length; i += 1) {
301 | partial[i] = str(i, value) || 'null';
302 | }
303 |
304 | // Join all of the elements together, separated with commas, and wrap them in
305 | // brackets.
306 |
307 | v = partial.length === 0
308 | ? '[]'
309 | : gap
310 | ? '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']'
311 | : '[' + partial.join(',') + ']';
312 | gap = mind;
313 | return v;
314 | }
315 |
316 | // If the replacer is an array, use it to select the members to be stringified.
317 |
318 | if (rep && typeof rep === 'object') {
319 | length = rep.length;
320 | for (i = 0; i < length; i += 1) {
321 | if (typeof rep[i] === 'string') {
322 | k = rep[i];
323 | v = str(k, value);
324 | if (v) {
325 | partial.push(quote(k) + (gap ? ': ' : ':') + v);
326 | }
327 | }
328 | }
329 | } else {
330 |
331 | // Otherwise, iterate through all of the keys in the object.
332 |
333 | for (k in value) {
334 | if (Object.prototype.hasOwnProperty.call(value, k)) {
335 | v = str(k, value);
336 | if (v) {
337 | partial.push(quote(k) + (gap ? ': ' : ':') + v);
338 | }
339 | }
340 | }
341 | }
342 |
343 | // Join all of the member texts together, separated with commas,
344 | // and wrap them in braces.
345 |
346 | v = partial.length === 0
347 | ? '{}'
348 | : gap
349 | ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}'
350 | : '{' + partial.join(',') + '}';
351 | gap = mind;
352 | return v;
353 | }
354 | }
355 |
356 | // If the JSON object does not yet have a stringify method, give it one.
357 |
358 | if (typeof JSON.stringify !== 'function') {
359 | JSON.stringify = function (value, replacer, space) {
360 |
361 | // The stringify method takes a value and an optional replacer, and an optional
362 | // space parameter, and returns a JSON text. The replacer can be a function
363 | // that can replace values, or an array of strings that will select the keys.
364 | // A default replacer method can be provided. Use of the space parameter can
365 | // produce text that is more easily readable.
366 |
367 | var i;
368 | gap = '';
369 | indent = '';
370 |
371 | // If the space parameter is a number, make an indent string containing that
372 | // many spaces.
373 |
374 | if (typeof space === 'number') {
375 | for (i = 0; i < space; i += 1) {
376 | indent += ' ';
377 | }
378 |
379 | // If the space parameter is a string, it will be used as the indent string.
380 |
381 | } else if (typeof space === 'string') {
382 | indent = space;
383 | }
384 |
385 | // If there is a replacer, it must be a function or an array.
386 | // Otherwise, throw an error.
387 |
388 | rep = replacer;
389 | if (replacer && typeof replacer !== 'function' &&
390 | (typeof replacer !== 'object' ||
391 | typeof replacer.length !== 'number')) {
392 | throw new Error('JSON.stringify');
393 | }
394 |
395 | // Make a fake root object containing our value under the key of ''.
396 | // Return the result of stringifying the value.
397 |
398 | return str('', {'': value});
399 | };
400 | }
401 |
402 |
403 | // If the JSON object does not yet have a parse method, give it one.
404 |
405 | if (typeof JSON.parse !== 'function') {
406 | JSON.parse = function (text, reviver) {
407 |
408 | // The parse method takes a text and an optional reviver function, and returns
409 | // a JavaScript value if the text is a valid JSON text.
410 |
411 | var j;
412 |
413 | function walk(holder, key) {
414 |
415 | // The walk method is used to recursively walk the resulting structure so
416 | // that modifications can be made.
417 |
418 | var k, v, value = holder[key];
419 | if (value && typeof value === 'object') {
420 | for (k in value) {
421 | if (Object.prototype.hasOwnProperty.call(value, k)) {
422 | v = walk(value, k);
423 | if (v !== undefined) {
424 | value[k] = v;
425 | } else {
426 | delete value[k];
427 | }
428 | }
429 | }
430 | }
431 | return reviver.call(holder, key, value);
432 | }
433 |
434 |
435 | // Parsing happens in four stages. In the first stage, we replace certain
436 | // Unicode characters with escape sequences. JavaScript handles many characters
437 | // incorrectly, either silently deleting them, or treating them as line endings.
438 |
439 | text = String(text);
440 | cx.lastIndex = 0;
441 | if (cx.test(text)) {
442 | text = text.replace(cx, function (a) {
443 | return '\\u' +
444 | ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
445 | });
446 | }
447 |
448 | // In the second stage, we run the text against regular expressions that look
449 | // for non-JSON patterns. We are especially concerned with '()' and 'new'
450 | // because they can cause invocation, and '=' because it can cause mutation.
451 | // But just to be safe, we want to reject all unexpected forms.
452 |
453 | // We split the second stage into 4 regexp operations in order to work around
454 | // crippling inefficiencies in IE's and Safari's regexp engines. First we
455 | // replace the JSON backslash pairs with '@' (a non-JSON character). Second, we
456 | // replace all simple value tokens with ']' characters. Third, we delete all
457 | // open brackets that follow a colon or comma or that begin the text. Finally,
458 | // we look to see that the remaining characters are only whitespace or ']' or
459 | // ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.
460 |
461 | if (/^[\],:{}\s]*$/
462 | .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')
463 | .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']')
464 | .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
465 |
466 | // In the third stage we use the eval function to compile the text into a
467 | // JavaScript structure. The '{' operator is subject to a syntactic ambiguity
468 | // in JavaScript: it can begin a block or an object literal. We wrap the text
469 | // in parens to eliminate the ambiguity.
470 |
471 | j = eval('(' + text + ')');
472 |
473 | // In the optional fourth stage, we recursively walk the new structure, passing
474 | // each name/value pair to a reviver function for possible transformation.
475 |
476 | return typeof reviver === 'function'
477 | ? walk({'': j}, '')
478 | : j;
479 | }
480 |
481 | // If the text is not JSON parseable, then a SyntaxError is thrown.
482 |
483 | throw new SyntaxError('JSON.parse');
484 | };
485 | }
486 | }());
487 |
--------------------------------------------------------------------------------
/illustrator/export-layers-v2/ExportLayersAndData.jsxbin:
--------------------------------------------------------------------------------
1 | @JSXBIN@ES@2.0@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
iTXhLfVhKfDnncfnnnJgdnASzIjJjTiMjPjDjLjFjEiUEXzGjMjPjDjLjFjEiVfVhKfDnftOgeJgenA
BXiVfVhKfDncffAViUfEnOhBDhBnAWfACiTXgafXzJjQjBjHjFiJjUjFjNjTiWfVhKfDnndAnOhEDhE
nAWfACiTXzBhQiXfXzNjWjJjTjJjCjMjFiCjPjVjOjEjTiYfVhJfIXzBhSiZfXiYfVhJfInnnJhHnAS
zMjFjYjQjPjSjUiQjBjSjBjNjTiaFEVzPjHjFjUiFjYjQjPjSjUiQjBjSjBjNjTibfLRBXhGfVhKfDf
fnftOhKbhLn0AEJhLnAEjzJjDjPjQjZiMjBjZjFjSicfRCVhKfDViKfCffJhMnABXzMjBjSjUjCjPjB
jSjEiSjFjDjUidfXiXfXzJjBjSjUjCjPjBjSjEjTiefViKfCXiYfViKfCnfJhNnAEjzLjFjYjQjPjSj
UiJjNjBjHjFiffRDViKfCVzKjEjFjTjUiGjPjMjEjFjSjAfJViafFffJhOnAEXzJjSjFjNjPjWjFiBj
MjMjBfXiWfXzLjBjDjUjJjWjFiMjBjZjFjSjCfViKfCnfAUiRViafFXzKjFjYjQjPjSjUiUjZjQjFjD
fViafFnnnahTbhUn0AEJhUnASzEjJjUjFjNjEHQWfXiWfVhKfDVgcfGnftOhWDhWnAWfAUiRViSfKXz
GjIjJjEjEjFjOjFfVjEfHnnnJhXnASiaFEVibfLRBXhGfVjEfHffnffOhZbhan0AEJhanAEXzJjEjVj
QjMjJjDjBjUjFjGfVjEfHRCXjCfViKfCXzKiQiMiBiDiFiBiUiFiOiEjHfjzQiFjMjFjNjFjOjUiQjM
jBjDjFjNjFjOjUjIfffJhbnABXidfXiXfXiefViKfCXiYfViKfCnfJhcnAEjiffRDViKfCVjAfJViaf
FffJhdnAEXjBfXiWfXjCfViKfCnfAUiRViafFXjDfViafFnnnAVgcfGAXgafXiWfVhKfDByBgeOiCJi
CnABXiVfVhKfDnctfAViUfEnAViQfBAVZfAByBgeJiGnAEXhSfViKfCRBXzQiEiPiOiPiUiTiBiWiFi
DiIiBiOiHiFiTjJfjzLiTjBjWjFiPjQjUjJjPjOjTjKfffAMgc4G0AiAjA4B0AhAiS4C0AhAib4D0Ah
AjE4H0AiAiK4C0AiAiQ4B0AiAiU4E0AiAia4F0AiAhK4D0AiAZ40BiAhJ40BhAEIAzMjFjYjQjPjSjU
iMjBjZjFjSjTjLAiIMiLbyBn0ACJiNnASZAXgafXiWfVhKfCnftaiObyiPn0ABJiPnAEXjGfQWfXiWf
VhKfCVgcfBRCXjCfViKfDXjHfjjIfffAVgcfBAVZfAByBgeAEgc4B0AiAiK4B0AhAhK40BhAZ40BiAC
CAicAiSMiWbyBn0AFJiYnASzEjEjFjTjUjMACGCGCGCGCGCGXhOfVjAfHnneBhPXhGfVjAfHnnnneBh
PXhGfViafInnnneBhOXjDfViafInnnftJibnASjDCEXzLjUjPiMjPjXjFjSiDjBjTjFjNfXjDfViafI
nfnftOiebifn0ALJifnASzFjFiUjZjQjFjODXzDiTiWiHjPfjzKiFjYjQjPjSjUiUjZjQjFjQfnffJj
AnASzHjPjQjUjJjPjOjTjRBEjzQiFjYjQjPjSjUiPjQjUjJjPjOjTiTiWiHjSfntnffJjBnABXzTjDj
PjPjSjEjJjOjBjUjFiQjSjFjDjJjTjJjPjOjTfVjRfBXzJjQjSjFjDjJjTjJjPjOjUfViafInfJjCnA
BXzRjFjNjCjFjEiSjBjTjUjFjSiJjNjBjHjFjTjVfVjRfBXzLjFjNjCjFjEiJjNjBjHjFjTjWfViafI
nfJjDnABXzIjGjPjOjUiUjZjQjFjXfVjRfBXzLiPiViUiMiJiOiFiGiPiOiUjYfjzLiTiWiHiGjPjOj
UiUjZjQjFjZfnfOjEbjFn0ACJjFnABXjXfVjRfBXzHiTiWiHiGiPiOiUjafjjZfnfJjGnABXzOjGjPj
OjUiTjVjCjTjFjUjUjJjOjHjbfVjRfBXzEiOjPjOjFjcfjzRiTiWiHiGjPjOjUiTjVjCjTjFjUjUjJj
OjHjdfnfAXzHjTjWjHiGjPjOjUjefViafInOjIbyjJn0ABJjJnABXzgbjJjOjDjMjVjEjFiWjBjSjJj
BjCjMjFjTiBjOjEiEjBjUjBjTjFjUjTjffVjRfBnctfACzBhekAXgafXzJjWjBjSjJjBjCjMjFjTkBf
VhJfGnndAnJjLnASzKjDjTjTiQjSjPjQiMjPjDkCEXzWiQiSiFiTiFiOiUiBiUiJiPiOiBiUiUiSiJi
CiViUiFiTkDfjzWiTiWiHiDiTiTiQjSjPjQjFjSjUjZiMjPjDjBjUjJjPjOkEfnftOjMJjMnASkCEXz
NiTiUiZiMiFiFiMiFiNiFiOiUiTkFfjkEfnffACiTXzNjTjWjHiDjTjTiQjSjPjQiMjPjDkGfViafIn
ndBOjNJjNnASkCEXzPiTiUiZiMiFiBiUiUiSiJiCiViUiFiTkHfjkEfnffACiTXkGfViafInndCnJjO
nABXzNjDjTjTiQjSjPjQjFjSjUjJjFjTkIfVjRfBVkCfEnfJjPnABXzQjEjPjDjVjNjFjOjUiFjOjDj
PjEjJjOjHkJfVjRfBXzEiViUiGhYkKfjzTiTiWiHiEjPjDjVjNjFjOjUiFjOjDjPjEjJjOjHkLfnfAC
iTVjDfCnneDjTjWjHOjRbjSn0ADJjSnASjODXzFiQiOiHhShUkMfjjQfnffJjTnASjRBEjzSiFjYjQj
PjSjUiPjQjUjJjPjOjTiQiOiHhShUkNfntnffJjUnABXzQjBjSjUiCjPjBjSjEiDjMjJjQjQjJjOjHk
OfVjRfBnctfACiTVjDfCnneDjQjOjHOjWbjXn0AEJjXnASjODXzEiKiQiFiHkPfjjQfnffJjYnASjRB
EjzRiFjYjQjPjSjUiPjQjUjJjPjOjTiKiQiFiHkQfntnffJjZnABXzOjRjVjBjMjJjUjZiTjFjUjUjJ
jOjHkRfVjRfBXzKjKjQjHiRjVjBjMjJjUjZkSfViafInfJjanABXkOfVjRfBnctfACiTVjDfCnneDjK
jQjHbyjdn0ABZjdnAnJkAnASzIjGjJjMjFiTjQjFjDkTFEjRfRBVjMfAftnftJkCnAEXzKjFjYjQjPj
SjUiGjJjMjFkUfVhJfGRDVkTfFVjOfDVjRfBffAJjA4B0AhAkT4F0AiAia4C0AhAjD4C0AiAjR4B0Ai
AjM40BiAjO4D0AiAkC4E0AiAhJ40BhADGAifAkDDJkGnASXAWzGiPjCjKjFjDjUkVAnftJkHnABXjLf
VXfAjjLfnfZkInAVXf0ABX40BiAABAWCkKnfnftJAnASzNiEjBjUjBiFjYjUjSjBjDjUjPjSkWyBENy
BnAMAbyBnAFMDbyBn0ACOEbyFn0ABJFnASzFjQjPjJjOjUkXAEXzRjDjPjOjWjFjSjUiDjPjPjSjEjJ
jOjBjUjFkYfXzOjBjDjUjJjWjFiEjPjDjVjNjFjOjUkZfjiNfRDVkXfAXzYiEiPiDiViNiFiOiUiDiP
iPiSiEiJiOiBiUiFiTiZiTiUiFiNkafjzQiDjPjPjSjEjJjOjBjUjFiTjZjTjUjFjNkbfXzYiBiSiUi
CiPiBiSiEiDiPiPiSiEiJiOiBiUiFiTiZiTiUiFiNkcfjkbfffnffACzDhdhdhdkdXzQjDjPjPjSjEj
JjOjBjUjFiTjZjTjUjFjNkefjiNfXkafjkbfnnnZHnAVkXf0ABkX40BhAB0AzKjDjPjOjWjFjSjUiQj
PjTkfAIMMbyBn0AHJQnASzCjWjClAAXiYfVjEfEnftJTnASzCjQhRlBBEjkffRBARCXiXfVlAfAXzBh
RlCfVlAfAfffnftJUnASzCjQhSlDCEjkffRBARCXiZfVlAfAXzBhTlEfVlAfAfffnftJWnASzGjDjPj
PjSjEjTlFDWkVEzBjYlGEXzHjUjPiGjJjYjFjElHfXiXfVlBfBRBFdCffzBjZlIEXlHfCzBhKlJXlCf
VlBfBnndyBRBFdCffzBjSlKEXlHfXiXfVlDfCRBFdCffzBjClLEXlHfClJXlCfVlDfCnndyBRBFdCff
nftJgcnABXzFjXjJjEjUjIlMfVlFfDEXlHfXlMfVjEfERBFdCffnfJgdnABXzGjIjFjJjHjIjUlNfVl
FfDEXlHfXlNfVjEfERBFdCffnfZgfnAVlFfDAFjE40BhAlA40BiAlB4B0AiAlD4C0AiAlF4D0AiABEA
zNjHjFjUiJjUjFjNiDjPjPjSjEjTlOAhAMhDbyBn0AJJhFnASlFAEjlOfRBXiXfVzFjJjUjFjNjTlPf
IffnftJhHnASzHjHjDjPjPjSjEjTlQBVlFfAnftJhJnASzIjNjBjYiSjJjHjIjUlRCVzFjSjJjHjIjU
lSfGnftJhKnASzJjNjBjYiCjPjUjUjPjNlTDVzGjCjPjUjUjPjNlUfHnftJhMnASzFjDjPjVjOjUlVE
XgafVlPfInftahObhQn0AHJhQnASlFAEjlOfRBQWfVlPfIVgcfFffnffJhSnASlSGCGXlGfVlFfAXlM
fVlFfAnnnftJhTnASlUHCGXlIfVlFfAXlNfVlFfAnnnftOhVJhVnABXlGfVlQfBXlGfVlFfAnfACgeE
jzKjQjBjSjTjFiGjMjPjBjUlWfRBXlGfVlFfAffEjlWfRBXlGfVlQfBffnnnOhWJhWnABXlIfVlQfBX
lIfVlFfAnfACgeEjlWfRBXlIfVlFfAffEjlWfRBXlIfVlQfBffnnnOhYJhYnABXlKfVlQfBXlKfVlFf
AnfACkAEjlWfRBXlKfVlFfAffEjlWfRBXlKfVlQfBffnnnOhZJhZnABXlLfVlQfBXlLfVlFfAnfACkA
EjlWfRBXlLfVlFfAffEjlWfRBXlLfVlQfBffnnnAVgcfFBVlVfEByBgeJhdnABXlMfVlQfBEXlHfCzB
hNlXXlKfVlQfBXlGfVlQfBnnRBFdCffnfJhenABXlNfVlQfBEXlHfClXXlLfVlQfBXlIfVlQfBnnRBF
dCffnfZiBnAVlQfBAJgc4F0AiAlS4G0AiAlV4E0AiAlU4H0AiAlP40BhAlF40BiAlQ4B0AiAlR4C0Ai
AlT4D0AiABIAzOjHjFjUiJjUjFjNjTiDjPjPjSjEjTlYAiDMiGbyBn0AGJiInASgcAEXzWjHjFjUiBj
DjUjJjWjFiBjSjUjCjPjBjSjEiJjOjEjFjYlZfXiefVhJfQnfnftJiJnASzEjBjSjUjClaBQWfXiefV
hJfQVgcfAnftJiLnASzEjEjBjUjBlbCWkVEhGXhGfVhJfQlMEXzEjDjFjJjMlcfjzEiNjBjUjIldfRB
ClXXiZfXidfVlafBXiXfXidfVlafBnnfflNEXlcfjldfRBClXXlCfXidfVlafBXlEfXidfVlafBnnff
hIAnnftJiSnASlVDXgafXhIfVhJfQnftaiUbiWn0ANJiWnAShKEQWfXhIfVhJfQVgcfAnftOiYDiYnA
WfAUiRVzMjJjHjOjPjSjFiIjJjEjEjFjOlefSCiTXhLfVhKfEnncfnnnJianASzGjQjBjSjBjNjTlfF
EVzOjHjFjUiMjBjZjFjSiQjBjSjBjNjTmAfRRBXhGfVhKfEffnftOicDicnAWfACiTVlffFnnbnOidD
idnAWfACiTXgafXiWfVhKfEnndAnJifnASzBjEmBGEjlYfRBXiWfVhKfEffnftJjAnABXzJjMjBjZjF
jSjOjBjNjFmCfVmBfGXhGfVhKfEnfJjBnABXhGfVmBfGXhGfVlffFnfOjDbjEn0ACJjEnABXzEjUjZj
QjFmDfVmBfGXjDfVlffFnfJjFnABXhWfVmBfGCGCGXhGfVlffFnneBhOXjDfVlffFnnnfAXjDfVlffF
byjHn0ABJjHnABXmDfVmBfGneDjEjJjWfJjKnABXhLfVmBfGXhLfVhKfEnfJjNnABXlPfVmBfGAnnfa
jObjQn0ADJjQnASjEIQWfXiWfVhKfEViQfHnftOjSDjSnAWfAUiRVlefSXjFfVjEfInnnOjVbjXn0AK
JjXnASzKjJjUjFjNiQjBjSjBjNjTmEJEVmAfRRBXhGfVjEfIffnftJjZnASzCjJjUmFKEjlOfRBVjEf
IffnftJjanABXlGfVmFfKClXnXlGfVmBfGnnntJjbnABXlIfVmFfKClXnXlIfVmBfGnnntJjcnABXmC
fVmFfKXhGfVjEfInfJjdnABXhGfVmFfKXhGfVmEfJnfJjenABXmDfVmFfKXjDfVmEfJnfJjfnABXhWf
VmFfKCGCGXhGfVmEfJnneBhOXjDfVmEfJnnnfJkAnABXhLfVmFfKhOXjFfVjEfInfJkBnAEXzEjQjVj
TjImGfXlPfVmBfGRBVmFfKffACkAEXzHjJjOjEjFjYiPjGmHfXhGfVjEfIRBFeBhOffnndAbykJn0AB
OkJbkKn0ADOkLJkLnASzDjDjPjMmILXzFjDjPjMjPjSmJfXzEjTjQjPjUmKfXzJjGjJjMjMiDjPjMjP
jSmLfVjEfInffACiTXzIjUjZjQjFjOjBjNjFmMfXmLfVjEfInneJiTjQjPjUiDjPjMjPjSJkMnASmIL
XmLfVjEfInffJkNnABXzIjCjHjEiDjPjMjPjSmNfVmBfGEjzIjDjPjMiUjPjIjFjYmOfRBVmIfLffnf
OkOJkOnABXzHjPjQjBjDjJjUjZmPfVmBfGCzBhPmQXmPfVjEfInndjEnfACgeXmPfVjEfInndjEnACi
TXhGfVjEfInneEhDjCjHjEOkSbkTn0ATJkTnASmFKEjlOfRBVjEfIffnftJkUnABXmDfVmFfKneDjUj
YjUfJkVnABXhGfVmFfKXiXfEXzFjTjQjMjJjUmRfXhGfVjEfIRBFeBhdffnfJkWnABXlGfVmFfKClXn
XlGfVmBfGnnntJkXnABXlIfVmFfKClXnXlIfVmBfGnnntJkYnASzCjUjGmSMVjEfInftJkZnASzCjUj
SmTNXzJjUjFjYjUiSjBjOjHjFmUfVmSfMnftJkanASzCjDjBmVOXzTjDjIjBjSjBjDjUjFjSiBjUjUj
SjJjCjVjUjFjTmWfVmTfNnftJkbnABXzIjGjPjOjUiTjJjajFmXfVmFfKXzEjTjJjajFmYfVmVfOnfO
keJkenASmILXmJfXmKfXmLfVmVfOnffACiTXmMfXmLfVmVfOnneJiTjQjPjUiDjPjMjPjSJkfnASmIL
XmLfVmVfOnffJlBnABXzJjGjPjOjUiDjPjMjPjSmZfVmFfKEjmOfRBVmIfLffnfJlCnABXzKjGjPjOj
UiGjBjNjJjMjZmafVmFfKXzGjGjBjNjJjMjZmbfXzIjUjFjYjUiGjPjOjUmcfVmVfOnfJlDnABXzJjG
jPjOjUiTjUjZjMjFmdfVmFfKXzFjTjUjZjMjFmefXmcfVmVfOnfJlEnASzFjBjMjJjHjOmfPneEjMjF
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
--------------------------------------------------------------------------------