Commit Graph
1161 Commits
Author SHA1 Message Date
Miguel Ángel 1776b42736 chore: release v0.8.195 (#6273) 2026-10-25 03:18:09 +00:00
James RussoandClaude Opus 5.5 7f19f2335a feat(studio): load GSAP from the CLI's bundled copy by default (#6256)
* feat(studio): load GSAP from the CLI's bundled copy by default

Studio preview now loads the GSAP, CustomEase and MotionPathPlugin scripts
it adds from files the CLI ships and serves same-origin at /api/vendor/npm,
instead of jsDelivr. HYPERFRAMES_GSAP_BASE_URL still wins when set, and a
composition on another GSAP version gets its plugin from jsDelivr.

Renders now honor HYPERFRAMES_GSAP_BASE_URL when they replace a missing
local GSAP script, and the setting accepts plain http only for loopback
hosts.

Closes #6205

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* refactor(studio): keep comment share flat for the GSAP local root

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(cli): find the installed gsap with node resolution when run from source

The Windows CI lane installs with the hoisted linker, so gsap is not under
packages/core/node_modules there.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(producer): load a nested composition's missing GSAP from the mirror

A sub-composition's missing local gsap/dist script was hoisted into the
render unchanged, so HYPERFRAMES_GSAP_BASE_URL (and the jsDelivr fallback)
only reached the entry document. Run the same rewrite on every
sub-composition before it is compiled, resolving its path the way the
inliner will hoist it.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-25 03:08:42 +00:00
Akshar Patel e2129c3915 fix(lint): allow scoped descendant zoom (#6254)
* fix(lint): allow scoped descendant zoom

* chore(lint): account for scoped zoom bundle size

* fix(lint): retain canvas zoom guard for runtime identity

* fix(lint): preserve runtime identity in selector functions

* fix(lint): retain identity across uncertain selector branches
2026-10-25 01:53:04 +00:00
Akshar Patel d44f67ac1d fix(core): preserve repeated stylesheet imports (#6250)
* fix(core): preserve repeated stylesheet imports

* docs(core): note repeated import bundle growth
2026-10-25 01:53:03 +00:00
Miguel Ángel 2e397dba59 chore: release v0.8.194 (#6269) 2026-10-24 22:17:19 -04:00
Abdullah M. Nazif e7169ae85b fix(cli): scope explicit preview port discovery (#6242)
* fix(cli): scope explicit preview port discovery

* fix(cli): scope preview lifecycle discovery

* fix(cli): report the selected preview and its owned log
2026-10-25 01:53:01 +00:00
Akshar Patel 5b752168c1 fix(parsers): keep each keyframe array on its own timing (#6240) 2026-10-25 01:26:22 +00:00
Akshar Patel 6e77d783c7 fix(core): scene shots keep their shell after leading comments (#6239) 2026-10-25 00:29:36 +00:00
Akshar Patel 17332cf0df fix(engine): concat resolves relative paths without dropping clips (#6238)
* fix(engine): concat resolves relative paths without dropping clips

* test(engine): terminate ffprobe options in concat regression
2026-10-25 00:29:23 +00:00
Akshar Patel 680f5d7465 fix(player): keep Next available for the final slide's reveals (#6233) 2026-10-25 00:29:08 +00:00
Akshar Patel 31e6ed2aed fix(sdk): keep added elements when reopening saved overrides (#6231)
* fix(sdk): keep added elements when reopening saved overrides

* fix(sdk): replay saved overrides in latest edit order

* fix(sdk): preserve saved positions after sibling edits

* test(sdk): cover child edits after base parent restoration
2026-10-25 00:28:49 +00:00
Akshar Patel 6a917780f5 fix(cli): emit valid JSON for filtered keyframes (#6228) 2026-10-25 00:28:42 +00:00
Akshar Patel f21c3e3e7e fix(lint): accept GLSL script blocks without JavaScript syntax errors (#6227) 2026-10-25 00:28:34 +00:00
Abdullah M. Nazif 0c3387b8be fix(producer): report unavailable frame checks in debug logs (#6200)
* fix(producer): report unavailable frame checks in debug logs

* chore: prepare conflict resolution against current main

* fix(producer): retain scoped diagnostics with current artifact handling
2026-10-25 00:28:25 +00:00
Akshar Patel 035a5c0ae1 fix(lint): accept final font-family descriptors without semicolons (#6085) 2026-10-25 00:27:51 +00:00
Akshar Patel 066bc51831 fix(producer): keep runtime media speed in exports (#5528)
* fix(producer): preserve runtime media playback rates

* fix(producer): preserve runtime-inserted speed ramps

* fix(producer): retain scene trims for discovered speed ramps
2026-10-25 00:25:04 +00:00
Abdullah M. Nazif 0289d96ac7 docs: protect skill edits during contributor setup (#5346)
* docs: protect skill edits during contributor setup

* docs: keep skill picker guidance beside its command

* chore: prepare conflict resolution against current main

* docs: preserve checkout skill installation guidance
2026-10-25 00:24:05 +00:00
Abdullah M. Nazif d6c20513d1 fix(render): align container Chrome with the CLI (#5338)
* fix(render): align container Chrome with the CLI

* chore: prepare conflict resolution against current main

* fix(render): retain Chrome visuals and current audio baselines
2026-10-25 00:23:52 +00:00
Abdullah M. Nazif ad41745ab1 fix(cli): preserve ducking gain when music starts later (#5318)
* fix(cli): preserve ducking gain when music starts later

* test(cli): keep ducking regressions standalone

* chore: prepare conflict resolution against current main

* chore: preserve reviewed fix on current main

* chore: prepare conflict resolution against current main

* fix(cli): refresh delayed music ducking against main
2026-10-25 00:22:08 +00:00
Abdullah M. Nazif f9d72a3f73 fix(cli): preserve distinct font URLs during capture (#5312)
* fix(cli): preserve distinct font URLs during capture

* fix(cli): preserve distinct font URLs during capture
2026-10-25 00:21:53 +00:00
Abdullah M. Nazif e5e2d6f1df fix(cli): include external video posters in project archives (#5309)
* fix(cli): include external video posters in project archives

* chore: prepare conflict resolution against current main

* fix(cli): retain poster localization with shared archive resolvers
2026-10-25 00:21:39 +00:00
Abdullah M. Nazif 39364ee4fb fix(cli): respect reference image orientation in grade comparisons (#5288)
* fix(cli): respect reference image orientation in grade comparisons

* chore: prepare conflict resolution against current main

* fix(cli): preserve oriented grade references with lazy image loading
2026-10-25 00:21:07 +00:00
Abdullah M. Nazif 9a517560a8 fix(cli): refresh item manifests when bypassing registry cache (#5256)
* fix(cli): refresh item manifests when bypassing registry cache

* chore: prepare conflict resolution against current main

* fix(cli): preserve registry refresh with bounded timeout fallback
2026-10-25 00:20:54 +00:00
James RussoandClaude Opus 5.5 f180ffca64 fix(cli): reap only orphaned browsers HyperFrames launched (#6251)
* fix(cli): reap only orphaned browsers HyperFrames launched

Orphan cleanup on preview and render killed every PPID-1 process of the
current user whose args named chrome-headless-shell or a Puppeteer temp
profile, which included detached browsers started by other tools.

Every HyperFrames Chrome launch now passes an inert
--hyperframes-owned-browser switch, and the reaper only kills PPID-1
processes that carry it as a whole argument.

Fixes #6203

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(core): serve the browser marker from its own subpath

The GCP image's BeginFrame contract step imports the engine's
browserManager straight from source before core's generated runtime
exists, so pulling the marker from the core root entry broke it.
A dependency-free @hyperframes/core/browser-marker subpath keeps that
import chain as light as it was.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* test(cli): expect the browser marker in the capture fallback launches

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* docs(cli): say orphan cleanup runs before preview and render

The cleanup only stops browsers HyperFrames launched, so the opt-out is
no longer needed to protect other tools' browsers.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-24 23:09:57 +00:00
Vance IngallsandClaude Sonnet 5.5 19374955c7 feat(studio): the blur panel turns on events with blur (#6255)
Blur finds movers by seeking, and only runs timeline callbacks while it
scans when data-motion-blur-events is on, so motion set from a render(t)
function (k3-promo's rods and pills) showed no blur. Subtle and Strong
now write the attribute and Off removes it.

Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-24 16:27:57 -07:00
Abdullah M. Nazif 1c14fbb542 fix(studio): allow a local GSAP dependency mirror (#6247) 2026-10-24 22:13:28 +00:00
Dante aefca2144c fix(cli): allow disabling orphan browser cleanup (#6213) 2026-10-24 22:13:25 +00:00
Ular Kimsanov 7224812143 docs(studio-app): show the app working, three new pages, today's UI (#6223)
* docs(studio-app): show the app working, three new pages, today's UI

* docs(studio-app): correct what the app does today (fact-checked against both repos' main)

Script: audio goes to HeyGen to transcribe; cuts wait in Pending video edits until Send; today's toolbar; suggested
cuts. Continue from Claude Code: Mac only, inside an agent session, catch-up after that hand-off, real output.
GitHub Copilot added. 4K price, 10-minute sign-in, Auto as the default, real sign-in errors, motion-guide limit,
the right-panel row. Looping clips pause and respect reduced motion.

* docs(studio-app): hold the Share page until Share launches (desktop-share is at 0%)

* docs(studio-app): Home screenshot from a regular account on b467 (Make, Reference, Script)

* Revert "docs(studio-app): hold the Share page until Share launches (desktop-share is at 0%)"

This reverts commit 201070ac7b7a551c5515c1a770be4a5e8ab36ab9.

* docs(studio-app): Export link label names its page

* docs(studio-app): where-is-it clips re-recorded on a regular account, b467

Staff-only items are gone (Pit Crew Academy, View as a user, the HyperFrames agent, Learn). # opens tools by typing;
the tools list and the @ menu match a regular account; the import clip ends before the folder list.

* docs(studio-app): new Script clip on a regular account: Cut, Pending video edits, Send 1 edit, 0:22 to 0:17

* docs(studio-app): Draw clip re-recorded on a regular account (Send 1 edit to Claude Code, 1 min 52 s edit)

* docs(studio-app): Export clip re-recorded on a regular account (1080p, 16 s); cloud rendering as the app shows it

* docs(studio-app): Video 1 change-a-clip demo re-recorded on a regular account (Up to $1.09 shown before Make)

* docs(studio-app): Share clips re-recorded on a regular account; the page mentions HeyGen's Checking step

* docs(studio-app): first-video demo re-recorded on a regular account (question cards, Send answer, 29 min storyboard, 10 min build)

* docs(studio-app): Reference page follows today's flow (the app reads the video, then Copy editing style or Video brief; What to swap); demo re-recorded on a regular account

* docs(studio-app): autoplaying demos start muted so browsers play them; Automatic updates in troubleshooting

* docs(studio-app): update home.jpg in place instead of replacing it

* docs(snippets): DocsVideo stops an autoplaying loop when Reduce Motion turns on mid-visit; play loads it again

* docs(studio-app): motion guides need the person's picture; drop a pending cut by deleting its row; remove two unused stills
2026-10-24 21:37:57 +00:00
Miguel Ángel 89081b9197 chore: release v0.8.193 (#6229) 2026-10-24 12:39:08 -04:00
Miguel Ángel c16b783f5e chore: release v0.8.192 (#6206) 2026-10-24 08:51:29 +00:00
Akshar Patel 316e723409 fix(cli): preserve caption arrays during transcript reimport (#6185) 2026-10-24 08:16:07 +00:00
Akshar Patel 73dda7191c fix(core): preserve images with commas in srcset URLs (#6192) 2026-10-24 08:16:02 +00:00
Akshar Patel 3596a7f22b fix(cli): report failed tag installations to scripts and agents (#6086)
* fix(cli): report failed tag installations to scripts and agents

* fix(cli): restore status markers in tag install summaries
2026-10-24 07:18:42 +00:00
Akshar Patel c9ab2796af fix(engine): repeat looped audio through its export slot (#6184) 2026-10-24 07:18:32 +00:00
Akshar Patel 629dd8fb76 fix(lint): ignore inactive mask declarations (#6186) 2026-10-24 07:18:27 +00:00
rumi7911 fa5dbd12c9 docs: clarify Claude Code plugin auto-update steps (#5120) 2026-10-24 04:11:48 +00:00
Miguel Ángel 0d104e6fca fix(cli): init never touches installed skills and no command removes one (#6168)
* fix(cli): init and skills update only touch HyperFrames skills; --skip-skills works

* fix(cli): init never touches installed skills and no command removes one

* fix(cli): shorten the init skills comment

* fix(cli): shorten the init skills comment

* fix(cli): the stale-skills notice reaches agents that run without a terminal

* test(cli): a run without a terminal now checks skills in the background

* fix(cli): the stale-skills notice also prints on --json runs
2026-10-24 04:08:29 +00:00
Miguel Ángel cf7266d815 chore: release v0.8.191 (#6170) 2026-10-24 01:40:50 +00:00
Jerrai 7a34d6fbe4 docs: align render, fps and transcribe docs with the CLI (#6166)
* docs: align render, fps and transcribe docs with the CLI

- docs/guides/rendering.mdx: default render quality is `looks` (CRF 16),
  not `standard`.
- docs/packages/cli.mdx, render --help (render.ts): default --output is the
  timestamped `renders/<project>_<YYYY-MM-DD>_<HH-MM-SS>.<ext>`.
- skills/hyperframes-cli/references/preview-render.md: local --fps accepts
  1-240 or a rational and defaults to the root data-fps, else 30; only
  lambda and cloudrun are limited to 24, 30, 60.
- skills/hyperframes-cli/references/lint-validate-inspect.md: snapshot
  --range is documented as START,END like every other reference.
- skills/media-use/references/audio.md, skills/media-use/audio/references/
  transcribe.md, skills/hyperframes/references/captions.md: name the entry
  point for each transcription default (transcribe.mjs prefers Parakeet;
  `hyperframes transcribe` uses Parakeet when installed, else the small.en
  whisper model).
- transcribe --model help text and docs/packages/cli.mdx: list `small` and
  `medium`, which the CLI already accepts.
- skills-manifest.json: regenerated hashes for the three skills touched.

— Jerrai

* docs: lambda and cloud run also accept 25 fps

Distributed renders accept 24, 25, 30 and 60 fps (DISTRIBUTED_FPS in
packages/core/src/distributedFps.ts).

- skills/hyperframes-cli/references/preview-render.md: the --fps note
  lists 24, 25, 30, 60 for lambda and cloudrun.
- skills/hyperframes-cli/references/lambda.md, cloudrun.md: --fps lists
  include 25.
- packages/cli/src/docs/rendering.md (`hyperframes docs rendering`): --fps
  said 24, 30 or 60 and --quality defaulted to standard; local render takes
  1-240 or a rational, default root data-fps else 30, and the default
  quality is looks.
- skills-manifest.json: regenerated hyperframes-cli hash.

— Jerrai

* chore(skills): regenerate skills manifest after formatting

The format hook rewrote skill markdown after the manifest hook had hashed
it, leaving the hyperframes-cli hash stale.

— Jerrai
2026-10-24 00:29:56 +00:00
Meghna VasudevaandClaude Opus 5.5 fb8aadad17 docs(cli): apply review notes from #5442 to open, timeline and history (#6110)
Note that the desktop hand-off in `open` is macOS-only for now, that
`timeline apply --plan` prints only a count without --json, and what
`history undo --who` reverts.

Refs #5386

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 00:27:59 +00:00
Vance IngallsandClaude Sonnet 5.5 ffc327b44c feat(studio): motion blur panel with Off / Subtle / Strong (#6112)
* feat(studio): motion blur panel with Off / Subtle / Strong

One three-way control in the right dock. Subtle is the default blur
(240 deg shutter, samples sized to the smear); Strong is 720 deg and 64
samples. Writes the root data-motion-blur attributes through the SDK so
renders match and undo works; reads live attributes from the preview.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* fix(studio): motion blur panel edits the file's own root

The edits were worked out against the preview DOM but written to the file,
so a stale preview (undo inside the hold, a slow reload) could save a level
other than the one picked. They are now computed inside the mutation from
the candidate's root. While locked to a sub-composition no level is shown.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* fix(studio): shorten the motion blur tab so the dock strip fits

Five tabs overflowed the default dock width by 10px and clipped a label
(Studio: load smoke). The tab is now titled Blur.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-23 17:29:42 -07:00
Miguel Ángel e48d5d4a5c chore: release v0.8.190 (#6158) 2026-10-23 21:54:34 +00:00
Vance IngallsandClaude Sonnet 5.5 79b57ab12d feat: automatic tier, 240°/32 defaults, check finding, and Studio stops opting out (#6108)
* feat: check names the filter fallback, the render log names the tier, Studio stops opting out

hyperframes check reports motion_blur_filter_fallback (info) with the reason capture could not
run and the way back to it. The engine's per-session log line gains tier=, and its pixel test
covers the fallback over a WebGL page. Studio no longer sends previewMotionBlur: every Chrome
can preview blur now, through the fallback where it lacks html-in-canvas; the server still
accepts false from an older Studio.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* feat(core): blur picks the cheaper filter tier when every mover only translates

The scan now notes whether any mover turns or scales (the linear part of its transform chain
changes) and whether it already forms a stacking context while it moves. When every mover only
translates, the filter tier draws as well as capture and costs about what no blur costs: on an
8 s bench shot a render took 7.0 s against 9.9 s with capture and 7.3 s with no blur. Anything
that turns or scales, or moves without a transform, stays on capture.

data-motion-blur-tier="capture" or "filter" forces a tier. The report says which one drew
and why (translation-only, tier-attribute); hyperframes check stays quiet for those two, which
are choices, not fallbacks. The pixel tests run the shared assertions through both tiers.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* docs(motion-blur): the two tiers, the tier attribute, and what changed in limits

The guide described blur turning off for WebGL, a root transform and similar. It now says the
filter tier draws instead, how the tier is chosen and forced, what each does with a turn or a
zoom, the measured cost of each, and which findings check emits. The skill note drops the
off-for-WebGL advice and the 1.7x figure.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* feat(core): blur defaults match a 240 degree shutter and at least 32 samples

The shutter opens 240 degrees by default (was 180) and each mover gets at least 32 taps (was
sized to the smear alone, down to 2), growing with the smear as before. These are the settings
the shutter blur Jake built uses; on the card whip the default render is now 51 dB from his
(34.6 dB at the old defaults). The guide's attribute table says so.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* chore(core): trim tier.ts comments to the ratchet

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* chore: allow deleting the Studio previewMotionBlur render test

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-23 14:20:17 -07:00
James Russo 2512642d09 feat(studio): add a preview seek bar (#6103)
* feat(studio): add a preview seek bar

* fix(studio): preserve preview height with the seek bar

* fix(studio): keep the preview seek thumb fully visible
2026-10-23 18:59:59 +00:00
Miguel Ángel b7e2278e24 chore: release v0.8.189 (#6140) 2026-10-23 18:13:30 +00:00
Miguel Ángel 8411956534 fix(cli): long projects check to completion: boxed resumable copies, --prepare-media, idle deadline (#6104)
* fix(cli): check copies hostile videos at the composition size, not the source size

* fix(cli): the check server serves the copy the page names with hf-proxy-box

* feat(cli): check --prepare-media makes the video copies alone, and a stopped copy resumes

A long source is copied in one-minute pieces that stay in the cache, so a copy
that is killed or runs out of time continues from its finished pieces.
check --prepare-media runs only that step: no browser, no report, a per-file
result as JSON, and exit 1 when a copy failed.

* fix(studio-server): keep finished copy pieces while their copy runs

The short limit for dead partial copies would delete the first pieces of a
long copy that is still encoding. Finished pieces now follow their own
one-hour limit and are never swept while their copy is in flight.

* refactor(studio-server): shorten two comments

The comment gate limits a comment line to 120 characters and a run to four lines.

* refactor(studio-server): drop comments the names already carry

The comment ratchet lets a file's comment share only go down.

* fix(cli): the check server pre-warms the copy the page asks for, not the source-size one

The server started a source-size copy of every hostile video next to Chrome on
each check, because its pre-warm passed no box while the page and the up-front
copy use the composition's box. The pre-warm now takes the same box, found by
the one helper the up-front copy uses.

* fix(cli): end a check on no progress, not on a 120 s wall clock

The check ended 120 s after Chrome was ready no matter what it was doing, so a
long project whose sampling and overlap pass each kept working still failed
(the overlap pass was one page call that reported nothing for its whole run).

The deadline is now an idle clock: every phase entered, every sample finished,
every overlap batch of eight times and every operation that settles restarts it,
and the check ends only after 120 s with none. The overlap grid is asked for in
batches so it can report between them.

* refactor(cli): shorten the idle deadline comment

The comment gate allows 120 characters on a comment line.

* test(cli): check's overlap grid runs in page tasks of at most 8 samples

* fix(cli): check test types for the cli lib, studio-server size budget for resumable copies
2026-10-23 16:32:28 +00:00
Miguel Ángel 3badc9bfa5 chore: release v0.8.188 (#6122) 2026-10-23 09:53:45 +00:00
Miguel Ángel 6fe83060d9 chore: release v0.8.187 (#6115) 2026-10-23 06:32:30 +00:00
Miguel Ángel 504ec2b307 feat(cli): lambda deploy renders on arm64 by default; --video-arch x86_64 keeps x86 (#6073)
* feat(aws-lambda): price arm64 chunk invocations at the arm64 rate

getRenderProgress takes chunkArchitecture, the architecture of the function
that renders chunks. RenderChunk invocations are priced at its per GB-second
rate, both inline and from a Distributed Map's output; plan, audio and
assemble stay at the x86 rate.

* feat(cli): render chunks on an arm64 function with lambda deploy --video-arch

--video-arch arm64 pushes the arm64 video function image to the stack's own
ECR repository and deploys the template with VideoImageUri set to its digest.
Outside a checkout the image is the one the installed adapter pins; inside a
checkout it must come from HYPERFRAMES_LAMBDA_VIDEO_IMAGE, built from that
checkout. The default stays x86_64, which always sends an empty VideoImageUri
so a redeploy drops a video function rather than keeping it.

destroy deletes the repository, render and progress price chunks at the arm64
rate, and policies lists the ECR actions.

* fix(cli): push the video image only to an ECR repository this stack tagged

* fix(cli): price the plan at the video function's rate now that it runs there

* feat(cli): lambda deploy renders on arm64 by default; --video-arch x86_64 keeps x86

* refactor(cli): drop two doc comments the names already carry
2026-10-23 05:45:49 +00:00
Miguel Ángel 6225271173 fix: preserve motion blur off through cloud render requests (#6087)
* fix: preserve motion blur off through cloud render requests

* fix: keep generated blur docs concise and format examples

* fix: freeze motion blur intent for distributed render workers
2026-10-22 23:54:54 +00:00