No description
  • JavaScript 93.4%
  • HTML 4.5%
  • PowerShell 2.1%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
wearyfax 5f29075a18 Drop corner detection on straight segments
Image Trace draws every outline with curves, so the straight-segment
sampling added for corner detection never ran on a traced sticker. A
traced L shape cut the same with and without it. This removes
geom.cornerPolylines, CORNER_STRAIGHT_GAP_MM and the straight-line L
tests, and puts smoothItem back on pathPolyline at 8 and 16 samples
per curve.

Hole measurement keeps its fix: measurePoly still samples every segment
at the hole pitch, so a 15 mm round hole measures 14.996 mm instead of
13.86 mm.
2026-10-15 10:44:28 -07:00
lib Drop corner detection on straight segments 2026-10-15 10:44:28 -07:00
test Drop corner detection on straight segments 2026-10-15 10:44:28 -07:00
.gitattributes Summa contour cut line generator for Illustrator 2026-08-18 21:34:58 -07:00
.gitignore Ignore local working notes in docs/ 2026-08-18 22:43:48 -07:00
README.md Name the folder in the Undo prompt and guard the Run button 2026-09-30 21:30:28 -07:00
Summa-Cut-Line-Tuning.html Summa contour cut line generator for Illustrator 2026-08-18 21:34:58 -07:00
SummaCutLines-Batch.jsx Name the folder in the Undo prompt and guard the Run button 2026-09-30 21:30:28 -07:00
SummaCutLines-Remove.jsx Remove every confirmation prompt 2026-08-19 00:23:41 -07:00
SummaCutLines.jsx Show each step in the progress window 2026-10-15 04:31:11 -07:00

Summa Cut Line Generator for Adobe Illustrator

Generates contour cut lines and bleed shapes for print-and-cut stickers from placed or embedded raster artwork, for a Summa plotter workflow.

Tested on Illustrator 2024 (28.1) on Windows. Targets CC 2024 and later.

What it does

For every placed or embedded raster image in the document:

  1. Silhouette. Traces the artwork with Image Trace, then resamples it at the smoothing pitch (default 0.5 mm) to remove trace wiggle. Artwork on an opaque background, meaning a white PNG or JPEG rather than a transparent one, is detected per image and the backdrop excluded. See Backgrounds.
  2. Cut line. The silhouette offset outward (default 1 mm), drawn as a closed path with a 0.25 pt stroke in a spot color named CutContour (magenta, overprinting) on a top CutContour layer. An image holding more than one separate piece gets a contour for each; see Min piece.
  3. Bleed shape (on by default). The silhouette offset further (default 2.0 mm, so 1 mm past the cut), filled black, on a Bleed layer behind the artwork. This stops white slivers at the cut edge when print and cut registration drift. RGB documents get true 0/0/0 rather than a CMYK conversion.
  4. FastCut rectangle (off by default). A rounded rectangle around each sticker at a set distance from its cut line, in its own spot color (FastCut, cyan). Use it to cut stickers out quickly, or with different blade settings, instead of following the contour. It stays inside the artboard.
  5. Artboard fit (on by default). Resizes each artboard to hug the geometry it contains, FastCut rectangles included.
  6. Sheet border (off by default). A through-cut rectangle around each fitted artboard in a second spot color (Thru-cut), for kiss-cut sheets.
  7. Validation. Reports and selects cut lines or FastCut rectangles closer than the minimum gap (default 3 mm), or overlapping. A sticker's own cut to FastCut spacing is deliberate and not flagged. Nothing is fixed automatically.

RGB and CMYK documents both work. Spot swatches and bleed fills are created in the document's own color space.

The script does not generate OPOS registration marks. Summa GoProduce or your RIP adds those at print time. The RIP finds cut paths by spot color name, case-sensitively, so CutContour and Thru-cut must match the actions your RIP is configured with.

Usage

  1. Open your gang sheet with the sticker images placed where you want them. Save first: the script makes many edits and single-step undo is not available.
  2. File > Scripts > Other Script..., then SummaCutLines.jsx. Keep the lib/ folder beside it.
  3. Set the options and press Run. Settings persist between runs. Nothing asks for confirmation, because nothing the script does is unrecoverable.
  4. Read the report for failures, spacing violations, and warnings. Anything flagged is also left selected in the document.

SummaCutLines-Remove.jsx removes everything the script generated. It never touches your artwork.

Re-running either replaces previously generated cut and bleed shapes, which is the default and what you want after moving or rescaling stickers, or skips stickers that already have them, which is what you want after adding new stickers to a finished sheet.

Staying up to date

Install by cloning and the dialog can update itself:

git clone https://git.kemono.online/wearyfax/summa-cutline-generator.git SummaCutLines

The repository is public, so cloning and updating work anonymously over HTTPS with no account or key. Cloning over SSH behaves identically. The updater uses whichever remote the clone already has and never rewrites it.

The top row of the dialog shows the installed version. Check for updates fetches from the remote and reports either Up to date in green or N updates available in red. Hover the text for the newest commit. Update fast-forwards the clone and reopens the dialog running the new code. Nothing checks automatically, because the dialog opens on every run and a fetch costs seconds.

Requirements and limits:

  • Windows only. ExtendScript has no synchronous shell, so the updater drives git through a temporary batch file. The macOS equivalent needs an executable bit ExtendScript cannot set, so on macOS the buttons say so and you pull by hand.
  • git must be on PATH, and the branch must have an upstream.
  • Credential prompts are disabled (GIT_TERMINAL_PROMPT=0). A clone that needs authentication fails with a message instead of hanging on a console prompt nobody can see.
  • Updates are fast-forward only, so local edits are never overwritten. A diverging clone reports the failure and changes nothing.
  • A copy not installed with git says so and disables Update.

Corners

The defaults suit a drag knife, which trails on a swivel and cannot physically turn a sharp corner. Hence the 1 mm corner rounding.

A tangential head (Summa S Class 2 T series) lifts the blade, rotates it to the new heading and re-plunges, so it cuts a decisive corner better than an arc it has to rotate through. On those machines the rounding throws away the head's main advantage.

Contour style picks between the two.

Averaged is min curve radius 0, the drag-knife behaviour. Everything becomes one flowing curve and Corner radius applies. Use it where the outline has many short protrusions, such as fur, foliage or spatter, which would otherwise become dozens of separate corners for the head to stop at.

Accurate keeps corners where the artwork has them. Min curve radius sets the tightest curve still cut as a curve; anything tighter becomes a corner. Raising it declares more of the contour un-curvable, so the outline gets crisper and more faceted. Corner radius is disabled, since rounding would undo the corners.

The test applies to the radius the cut will have, not the silhouette's, because an outward offset opens convex curves up (R + offset) and closes concave ones down (R - offset). A 1.2 mm notch becomes a 0.2 mm one after a 1 mm offset, so judging the silhouette alone would miss exactly the features that pinch.

How the corner policy is produced

The offset does nearly all of it. An outward offset is a Minkowski sum with a disk of radius equal to the offset, which rounds every convex corner into an arc of exactly that radius and leaves every concave corner mathematically sharp. Interior corners come out hard, exterior corners uniformly rounded, and the result cannot self-intersect. That is the requirement, computed for free, so Offset Path uses round joins and nothing else.

Mitering was tried and removed. It projects a tip out by offset / sin(angle/2), which at 20 to 40 degrees is 1.5 to 5.8 mm of invented geometry radiating off every point.

Two passes support the offset:

  1. Corner detection runs on a low-passed copy of the contour, because the raw trace polyline carries pixel-level wiggle and a circumradius over a short window reads that as near-infinite curvature. Without it, ordinary edges get declared corners by the hundred and the cut comes out sawtoothed. Detection ignores convexity. Its only job is to stop the resampler replacing a feature with a chord, and the offset decides policy afterwards from whatever shape reaches it.
  2. The resampler lands a vertex exactly on each detected corner, since otherwise the smoothing pitch rounds it off first. Those anchors are pinned out of the low-pass.

Corners are detected on the traced outline twice, at 8 and at 16 samples per curve, and every corner either pass finds is kept. Image Trace draws small inside corners as short curves, which the coarse pass alone missed, so they came out as a flat at small offsets. Each pin sits on the sharpest point of its corner. Two pins less than 0.3 mm apart along the outline are one corner drawn as two bends, and become one pin.

Min corner angle (default 30 degrees) is the sharpest interior corner the script will cut to a point. Anything sharper is left as the offset made it, slightly blunt, rather than merged to a spike. Below roughly 20 degrees the in and out cuts overlap and the sticker will not weed. The real figure depends on your blade, media and laminate, so sweep it on your own stock.

The manual's 0.2% and 0.25 mm accuracy figure describes media-advance tracking over a plot, in the section on length calibration. It does not describe the precision of two cuts meeting at a corner, so it is not the basis for this number.

Remove spurs (on by default) deletes zero-width spikes: an anchor the path runs out to and comes straight back from. Adobe's Offset Path and Pathfinder Add are not bit-deterministic and occasionally emit one, standing off the contour with nothing in the artwork to explain it. The blade would travel out and back along a single line. The threshold is Min corner angle, so nothing removed was ever cuttable, and every removal is named in the report.

The same switch covers a second spike from the same source. At small offsets it runs back to the artwork edge and is too wide for the angle test to catch: about 31 degrees at a 0.1 mm offset. No real point of an outward offset is closer to the artwork than the offset, so a sharp point within half of it is removed and named in the report as well. The check is off below a 0.05 mm offset, and in Averaged style with a corner radius, since that rounding pulls the cut inward on purpose. These are the only passes that delete geometry on a rule, which is why they have a switch.

Faceting on smooth borders

Adobe's Offset Path replaces a bezier segment with a straight line whenever the segment bulges less than roughly 0.002 pt from its own chord. That threshold depends on both the anchor spacing and the local radius, so a flat, gently curved border hits it at any fine resample pitch. In itself the substitution is harmless: a thousandth of a millimetre.

It became visible because the anchor-reduction pass then joined those lines into chords millimetres long. It removed one anchor at a time, each judged against whatever its neighbours happened to be at that moment, which has no bound at all: drop an anchor 0.04 mm off its neighbours and the next is judged across a span twice as long. Measured on a 256 ppi sticker, that turned runs of 0.8 mm segments into chords of 7.2, 7.0, 6.3, 4.9 and 4.7 mm, bowing up to 0.23 mm off a border with no flat on it. Reduction now uses Douglas-Peucker over each whole run, so every dropped anchor is within 0.05 mm of the line that replaces it, however many go.

Short straight segments still appear, and are harmless. If a border still looks faceted, raise Smoothing rather than lowering it.

Anchor welding

Anchors closer together than 0.025 mm are dropped on every run, in either contour style. That is the cutter's addressable resolution (manual 6.2.6), so anything finer is below what the machine can act on. The cutter also does its own vector concatenation and curve smoothing, which micro-segment noise feeds unpredictably. decimate() cannot do this job, because it only removes anchors whose neighbouring segments are both straight, which after smoothing is never true.

Overcut and knife offset are deliberately not handled. Both are machine settings: overcut is 0 to 10 in roughly 0.1 mm units, knife offset is the tangential calibration. Baking either into path geometry would double up with the cutter's own correction.

Backgrounds

Sticker art arrives two ways, and they need opposite handling.

Transparent PNG, the normal case. The artwork is traced on a white background for its dark regions, and in robust mode again on a black background so white or pale artwork shows up too.

Opaque background, a PNG or JPEG on a flat colour. Rasterizing it on black does nothing, because the background is not transparent: backdrop and artwork fuse into one light region covering the whole image, and the cut line collapses to a rectangle around the image edge. Such art is traced in a single pass just below the backdrop, so everything darker than it, pale artwork included, becomes the silhouette while the backdrop merges with the rasterize padding and is discarded.

The backdrop does not have to be white. Its lightness is measured off four corner patches of the image itself and the trace threshold set just under the median, so a coloured or off-white backdrop cuts the same as a white one. What cannot be separated is artwork lighter than the backdrop it sits on. Supply a transparent PNG when a sticker has a white outline.

Judge a backdrop by how dark it converts, not by how bright it looks. Measured across ten backdrops: a mid grey converts to 128 and a saturated red 200/40/40 to 72, dark enough that only fairly dark artwork still separates from it.

The Background setting picks between them:

Mode Behaviour
Auto-detect (default) Decided per image. A traced region covering the image's own corners can only be a backdrop, so the black-background pass is discarded and the opaque route taken. Needs Robust silhouette on, since that pass is also the detector. Without it, Transparent is assumed.
Transparent Pre-1.3.0 behaviour, no detection. Use if Auto misfires.
Opaque/white Every image has a flat light backdrop. Single pass, no detection.
White border Transparent stickers with a white border already in the artwork. The script ignores the border and cuts at the usual offset from the artwork inside it. Single pass, no detection. White artwork touching the border goes with it.

Pick White border when a sticker arrives with its own white outline and the cut should hug the art. Rasterized on white, the border, the transparent area and the padding merge into one region, which the script discards the same way it discards an opaque backdrop. Everything darker than Background whiteness stays in the silhouette, pale artwork included.

Detection costs no extra pass: the black-background pass runs first and doubles as the probe.

An alpha channel proves nothing. A flattened white-background export usually still has one, fully opaque, and Illustrator reports channels=4, transparent=true for it exactly as it does for real transparency. Detection reads the rendered pixels for that reason.

What this cannot do

White artwork touching a white background, such as a white keyline or die-cut border on a white backdrop. The two are one connected region of the same colour, so no threshold separates them and the outline is lost. Supply a transparent PNG for that art. The script warns whenever it detects an opaque background, because this is the case it silently damages.

Drop shadows are included in the silhouette and cannot be excluded by threshold. A shadow is darker than the pale artwork beside it, so any threshold low enough to drop the shadow drops the pale artwork first. Remove the shadow from the source image if you do not want it inside the cut.

Batch

SummaCutLines-Batch.jsx turns a folder of sticker PNGs into finished .ai files, one per PNG. It sizes each sticker from its file name, cuts it with the main script, embeds the image and saves the result beside the PNGs or in a subfolder you name. Run it like the main script, with lib/ beside it.

The window lists what will happen to every PNG before you run. Cutline settings... opens the usual settings dialog. The batch keeps its own copy of the settings in %APPDATA%\SummaCutLines\batch, so your normal settings stay as they are. Whatever you pick there, the batch turns Reuse traced silhouettes on, sets Existing generated items to Replace and turns Fit artboards on, and tells you when it had to change one. Sizing depends on the first two. Each sticker starts on a Letter-sized document, so without fitting, the art can hang off the artboard. Save into subfolder keeps test runs apart: a new name makes a full new set.

Colour

Before the first run, set Edit > Color Settings: RGB working space Display P3, RGB policy Preserve Embedded Profiles. What happens to a PNG then depends on the colour information it carries.

A PNG with none is placed into a new RGB document. The document takes the working space, so the pixels are read as Display P3 and nothing is converted. The saved file carries Adobe's image P3 profile.

A PNG with only the small sRGB marker chunk is handled the same way, because Illustrator ignores that marker and would otherwise open the file with no profile at all. The report adds a warning for each one, since its pixels are read as Display P3 rather than sRGB.

A PNG with a full embedded ICC profile (an iCCP chunk) is opened directly and keeps its own profile. Placing it into a Display P3 document would convert it. If that PNG is open in Illustrator, the batch fails it and asks you to close it first, rather than saving and closing your document.

Every file is saved with its profile embedded and every image embedded, so it can go to the RIP on its own.

Size and skipping

Each PNG's name gives its size in inches, height first: Mejiro Ryan (5.4 X 4.4).png. A lowercase x, a × and a trailing in or inches also work. The visible art, not the transparent canvas, is scaled evenly until its longer side equals the larger number.

To measure the art, the batch cuts the sticker once at its placed size and reads the size of the traced outline. It scales the image to match, then cuts again. If the scale is between 0.8 and 1.25, the second run reuses the traced outline, scaled with the image. Outside that range it traces again, because a big enlargement would stretch a trace made at a lower effective resolution.

A PNG with no size in its name is skipped, and so is one whose .ai already exists in the output folder. Existing .ai files are never opened or changed.

Undo

Undo last batch deletes the files the most recent batch made, but only those whose size and modified time are unchanged since. It asks first, naming the output folder and how many files it will delete. A file you have edited is kept and dropped from the list. A file Undo cannot delete, usually because it is open in Illustrator, is kept and stays on the list, so a later Undo can try again.

A batch that runs to the end closes its list. The next batch starts a new one, even into the same folder, so Undo never reaches back into a batch that already finished.

Each file goes on the list as soon as it is saved. If Illustrator stops partway through a batch, the list stays open. Restart Illustrator and run the batch again into the same folder: files already made are skipped, the new ones join the open list, and Undo covers the whole batch.

Settings reference

Setting Default Notes
Cut offset 1.0 mm Distance from artwork edge to cut line.
Corner radius 1.0 mm Drag-knife minimum; 0 disables rounding. Disabled in Accurate style.
Contour style Averaged Averaged is min curve radius 0. Accurate keeps artwork corners. See Corners.
Min curve radius 0 (off) Accurate style: a cut-path curve tighter than this becomes a hard corner. Raise to sharpen more aggressively.
Min corner angle 30° Sharpest interior corner cut to a point, and the threshold for spur removal. Blade and material dependent; sweep it on your own stock.
Remove spurs on Deletes zero-width spikes left by the offset, and spikes it draws back to the artwork edge at small offsets. Removals are listed in the report.
Smoothing 0.5 mm Silhouette resample pitch. Higher is smoother with less contour detail; 0 disables. Affects cut and bleed alike. Do not go below about 0.4 mm: Offset Path returns straight segments where a curve bulges less than roughly 0.002 pt from its chord, and a fine pitch guarantees that, so the cut comes back faceted. Measured on a smooth 256 ppi sticker: 46% of the cut perimeter was straight at 0.25 mm against 21% at 0.5 mm.
Cut spot name CutContour Case-sensitive; must match the RIP action.
Bleed on, 2.0 mm Measured from the artwork edge, so 1 mm past the cut.
Bleed fill Black Black, White or custom CMYK. RGB documents get native RGB (black = 0/0/0).
Background Auto-detect Auto-detect, Transparent, Opaque/white or White border. See Backgrounds.
Background whiteness 250 Opaque backdrops and White border only. White border traces at exactly this value. For opaque backdrops it is a ceiling rather than the value used: the backdrop is measured and the trace runs just under whatever it turns out to be, so off-white and coloured backdrops need no adjustment. Lower this to force a darker cutoff when artwork sits very close to its backdrop in tone.
Robust silhouette on Second trace pass on a black background. Required for white or light artwork edges, and doubles as the opaque-background detector. Roughly 2x slower.
Threshold 200 Transparent artwork only. Pixels darker than this count as artwork (1 to 254). Raise if pale art is missed, lower if shadows are included.
Min detail 0.5 mm Traced specks below this size are ignored.
Min piece 5.0 mm Smallest SEPARATE piece that earns its own cut contour, as a square of this side. One image holding two characters far enough apart that the offset never joins them gets a contour for each. Below this a detached part is treated as a fleck of artwork and excluded, with a warning. Absolute rather than a proportion, so one big sticker and one small one in the same image are both kept.
Trace resolution 300 ppi 150 ppi is faster and coarser. 600 ppi is four times the pixels of 300, so roughly four times the trace time.
FastCut off, 3 mm, r 2.54 mm Rounded rectangle around each sticker at the set distance from the cut line, spot FastCut.
Fit artboards on Resize each artboard to the geometry it contains, FastCut included.
Sheet border off, 3 mm Through-cut rectangle per fitted artboard, spot Thru-cut.
Min gap 3.0 mm Summa guidance: 3 to 4 mm between stickers, 5 mm for narrow shapes.
Reuse traced silhouettes on Keeps each traced silhouette in a hidden layer. Tracing is about 79% of a run and is unaffected by the offset, smoothing and corner settings, so reusing it makes retuning those nearly instant. Re-traces by itself if the artwork moves or resizes, or any trace setting changes.
Existing generated items Replace Replace regenerates them; Skip leaves stickers that already have them alone.
Debug log off Records every step and its timing, flushing after each line, so a crash still leaves the last action on disk.

Settings are stored at %APPDATA%\SummaCutLines\settings.json.

Production notes (Summa)

  • Drag knives cannot cut detail smaller than about 0.5 mm, or corners sharper than about 1 mm radius. Hence the rounding and min-detail defaults. On a tangential head both are pessimistic: switch the contour style to Accurate and drop Min detail toward 0.25 mm.
  • Summa OPOS tracking tolerance is roughly ±0.25 mm. The 1 mm cut offset plus 1.5 mm of printed bleed absorbs that.
  • Export for the RIP as PDF. Check in Acrobat Output Preview that CutContour separates onto its own spot plate and that the cut stroke overprints.
  • Keep stickers 3 mm apart or more. The script flags violations but does not move artwork.

Known limitations

  • Raster artwork only. Vector stickers are not processed.
  • Clipping masks. A raster inside a clipping mask is traced at its full size, so clipped-away pixels are included. The script warns. Crop the image itself instead of masking it.
  • Soft shadows and semi-transparent edges lighter than the threshold are excluded from the silhouette. Raise the threshold to include them.
  • White artwork on a white background cannot be separated from it, and drop shadows on an opaque background cannot be excluded. See What this cannot do.
  • Disjoint artwork in one image is cut as separate pieces, one contour each, provided each piece is at least Min piece across. Smaller detached parts are excluded with a warning. Two characters on one transparent background is a supported case; a stray fleck of artwork is not.
  • The trace reads rendered pixels, not the alpha channel. Mid-gray artwork at the edge could in principle straddle both trace passes, but the default thresholds (200 and 60) leave no blind band, so each pass covers the other.
  • No automatic nesting or layout. Arrange stickers yourself.

Project layout

SummaCutLines.jsx          entry point: dialog, batch driver, report
SummaCutLines-Remove.jsx   removes all generated items (the "undo")
SummaCutLines-Batch.jsx    folder of PNGs -> finished .ai files, with undo
lib/                       modules (json, constants, log, geom, settings,
                           ai plumbing, trace, pipeline, validate, update, ui)
lib/batch.jsx              batch logic that needs no document: names, colour
                           tag, scale, folder plan, report, undo list
lib/batch-run.jsx          batch Illustrator work: open, size, cut, save, undo
test/probe.jsx             API behaviour probes (run first on a new Illustrator)
test/e2e.jsx               headless end-to-end test (57 assertions)
test/white-bg.jsx          opaque-background regression test (8 assertions)
test/trace-cache.jsx       silhouette cache and invalidation (10 assertions)
test/corner-policy.jsx     per-corner interior/exterior policy (14 assertions)
test/resample.jsx          corner-preserving resample (11 assertions)
test/corner-detect.jsx     corner pins on tips, notches and real traced outlines (59 assertions)
test/offset-spurs.jsx      spikes the offset draws back to the artwork (4 assertions)
test/spurs.jsx             zero-width spur removal (14 assertions)
test/update.jsx            self-update batch text and parsing (20 assertions)
test/ui-smoke.jsx          dialog construction and size
test/cream-bg.jsx          non-white opaque backdrop (13 assertions)
test/white-border.jsx      transparent art with a baked-in white border (6 assertions)
test/batch-names.jsx       batch name parsing, colour tag, scale, warnings, undo
                           rule, undo list (51 assertions in Illustrator, 42 in Node)
test/batch-e2e.jsx         batch run, skip, colour, embed, size, outline reuse,
                           undo, subfolder (35 assertions)
test/probe-batch.jsx       one-off probes the batch design rests on (not in the suite)
test/run-pure.js           runs a pure suite in Node: node test/run-pure.js test/batch-names.jsx
test/fixtures/iccp-srgb.png  PNG with a full embedded sRGB profile, for batch-e2e
test/run-tests.ps1         suite runner, restarts Illustrator as it goes
test/fixtures.md           fixture sheet description

Run the suites with:

.\test\run-tests.ps1                    # every suite
.\test\run-tests.ps1 white-bg cream-bg  # named suites only

Close Illustrator first. The runner starts its own instance and shuts it down at the end, and it refuses to run while one is already open so it can never take down a session holding unsaved work.

It also restarts Illustrator between suites, which is not optional. Illustrator leaks memory on every rasterize-and-trace and stops answering scripts at around a gigabyte of working set: DoJavaScriptFile then fails with RPC_E_SERVERFAULT while ordinary COM reads still succeed, and it stays that way until the process is killed. On a machine where Illustrator starts at 825 MB that is about four full pipeline runs. Document creation and closing are not the problem, tracing is. The runner watches the working set and recycles before it gets there.

A single suite can still be run by hand, which is fine as long as it is one:

$ai = New-Object -ComObject Illustrator.Application
$ai.DoJavaScriptFile("C:\path\to\test\e2e.jsx")
# results: test\e2e-results.txt, inspectable document: test\e2e-output.ai