From 836d0255df76a2dc9f516e7a082ccc3c15dea592 Mon Sep 17 00:00:00 2001 From: Transaction Science Date: Sat, 24 Oct 2026 20:31:28 -0400 Subject: [PATCH 01/38] wai packaging stack: #426, #438 and #452's GPU tier, squashed onto main MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit One squashed history of three stacked PRs, onto main at b16816671: - #426 (wai/pack-efficiency): a title's whole AV1 ladder in one package over one integer base; several floor rungs (packaging §7.1), a re-pack from a parent (§11.5), a floor that is the ladder's own CMAF (§7.7), a floor-only profile (§7.8), a streaming pack (§11.4), and the independent verifier at scale (§9.4). - #438 (wai/cross-fabric): each pack and verify step on the fabric with the least measured energy (§11.6); the `fabrics` member of measurement claims (jwp-receipts §2.4.8, energy-measurement §6.3); the wai-pack-gpu crate; `wai-pack fabric`; `wai-pack floor-decode`. - #452 (wai/gpu-int-tier), its GPU-tier part only: claiming decode-equivalence on a GPU (determinism-tiers §5), the WGSL integer semantics suite, the rules check on naga's IR, and the kernels' shift masks and min(max()) clamps. Left out, by the review's split (EN-C takes it over): #452's platform decode in dispatch, its commits 6ad92e2e8, 8695bc75f and fed8694f4 and its CHANGELOG entry: extensions/platform-decode.md, platform-decode-conformance/, wai::platform_decode, wai-web's platform_decode bundle and demo, and its two SPEC.md sentences. #438's research note is not carried as written: it is rewritten as wai/research/cross-fabric.md, with hardware named by architecture, PCI id and OS version, and every table marked as one run. floor_decode.rs and a wai_pack.rs comment name the platform's media engine and a full-length film the same way. wai/CHANGELOG.md is the union of both sides' entries, the stack's first. Co-Authored-By: Claude Opus 5.5 --- .github/workflows/wai-ops-gpu.yml | 35 +- .github/workflows/wai-pack.yml | 101 +- wai/CHANGELOG.md | 153 +++ wai/claim-conformance/README.md | 8 + wai/claim-conformance/claim_verify.py | 53 +- wai/claim-conformance/vectors.json | 158 +++ wai/extensions/determinism-tiers.md | 149 ++- wai/extensions/energy-measurement.md | 40 + wai/extensions/jwp-receipts.md | 33 +- wai/extensions/packaging.md | 413 +++++-- wai/http-conformance/http_verify.py | 26 +- wai/pack-conformance/README.md | 46 +- .../cmaf-mutations/expected.json | 30 + .../floor-listing-altered/LISTING | 47 + .../floor-listing-altered/floor.listing | 12 + .../floor-listing-missing/LISTING | 46 + .../segment-not-the-supplied-one/LISTING | 46 + .../dash/classic.mpd | 24 + ...b93d0fcd58511bb34550b2f4d7b29431df9ad9.m4s | Bin 0 -> 2225 bytes .../hls/classic/master.m3u8 | 5 + .../hls/legacy/master.m3u8 | 5 + .../hls/mobile/master.m3u8 | 6 + .../hls/tv/master.m3u8 | 6 + .../moq/catalog.json | 1 + wai/pack-conformance/cmaf_diff.py | 148 +++ .../ladder-mutations/expected.json | 35 + .../floor-under-the-component-s-name/LISTING | 46 + ...846a2b0d530ea2e44260af66ddc51ad14ce07f.m4s | Bin 0 -> 1127 bytes ...92fdd2aa86db43ccdc684b69c51a688856a0db.m4s | Bin 0 -> 1127 bytes ...659d88613f6d0d360485effe3751504cefbb74.m4s | Bin 0 -> 2248 bytes ...d45c4c0274b0460f6abc8f54940ac378165833.m4s | Bin 0 -> 2526 bytes ...7189e7bed63e12e34e9ed4d9bf96a101d864a9.m4s | Bin 0 -> 1695 bytes .../floor/v/init.mp4 | Bin 0 -> 628 bytes .../ladder-mutations/floors-swapped/LISTING | 46 + .../floors-swapped/dash/classic.mpd | 41 + ...659d88613f6d0d360485effe3751504cefbb74.m4s | Bin 0 -> 2248 bytes ...b33fd445037d6538b445bcc76431f9c9f91c5b.m4s | Bin 0 -> 2400 bytes .../floors-swapped/hls/classic/floor-hi.m3u8 | 18 + .../floors-swapped/hls/classic/floor-lo.m3u8 | 18 + .../floors-swapped/hls/classic/master.m3u8 | 7 + .../floors-swapped/hls/legacy/master.m3u8 | 7 + .../floors-swapped/hls/mobile/master.m3u8 | 8 + .../floors-swapped/hls/tv/master.m3u8 | 8 + .../floors-swapped/index-v.wsix | Bin 0 -> 2368 bytes .../floors-swapped/package.receipt.json | 1 + .../master-lists-one-floor/LISTING | 46 + .../hls/classic/master.m3u8 | 5 + wai/pack-conformance/mutations/expected.json | 18 + .../floor-only-piece-with-derived-from.wsix | Bin 0 -> 960 bytes .../mutations/index/floor-only-piece.wsix | Bin 0 -> 960 bytes .../mutations/index/piece-kind-none.wsix | Bin 0 -> 1088 bytes wai/pack-conformance/pack_verify.py | 1011 +++++++++++++--- .../package-mutations/expected.json | 25 + .../metered-claim-another-figure/LISTING | 36 + ...84b5d45994dd713e7576673f2.measurement.json | 1 + .../package.receipt.json | 1 + .../metered-claim-missing/LISTING | 35 + .../package.receipt.json | 1 + .../metered-fabrics-unknown-step/LISTING | 36 + ...84b5d45994dd713e7576673f2.measurement.json | 1 + .../package.receipt.json | 1 + .../package-mutations/metered-fabrics/LISTING | 36 + ...84b5d45994dd713e7576673f2.measurement.json | 1 + .../metered-fabrics/package.receipt.json | 1 + .../package-mutations/metered/LISTING | 36 + ...84b5d45994dd713e7576673f2.measurement.json | 1 + .../metered/package.receipt.json | 1 + .../packs/video-cmaf-01/floor/hi/init.mp4 | Bin 0 -> 788 bytes .../packs/video-cmaf-01/floor/hi/seg_0000.m4s | Bin 0 -> 2217 bytes .../packs/video-cmaf-01/floor/hi/seg_0001.m4s | Bin 0 -> 873 bytes .../packs/video-cmaf-01/floor/hi/seg_0002.m4s | Bin 0 -> 2092 bytes .../packs/video-cmaf-01/floor/hi/seg_0003.m4s | Bin 0 -> 873 bytes .../packs/video-cmaf-01/floor/hi/seg_0004.m4s | Bin 0 -> 1860 bytes .../packs/video-cmaf-01/floor/lo/init.mp4 | Bin 0 -> 788 bytes .../packs/video-cmaf-01/floor/lo/seg_0000.m4s | Bin 0 -> 2138 bytes .../packs/video-cmaf-01/floor/lo/seg_0001.m4s | Bin 0 -> 1019 bytes .../packs/video-cmaf-01/floor/lo/seg_0002.m4s | Bin 0 -> 1940 bytes .../packs/video-cmaf-01/floor/lo/seg_0003.m4s | Bin 0 -> 1019 bytes .../packs/video-cmaf-01/floor/lo/seg_0004.m4s | Bin 0 -> 1467 bytes .../packs/video-cmaf-01/key.hex | 1 + .../packs/video-cmaf-01/package/LISTING | 47 + .../video-cmaf-01/package/dash/classic.mpd | 41 + .../video-cmaf-01/package/dash/mobile.mpd | 21 + .../packs/video-cmaf-01/package/dash/tv.mpd | 27 + .../packs/video-cmaf-01/package/floor.listing | 12 + ...bf6669ce8edec06fd7cd0961a01d2aaf720889.m4s | Bin 0 -> 2217 bytes ...9c039141d261dd65212035e96bb157783423c1.m4s | Bin 0 -> 1860 bytes ...d0f6263b9e06ee0af1e8269ce4f20d5cb3653d.m4s | Bin 0 -> 2092 bytes ...84fadf8c165c5e16e864629b194dc46290387e.m4s | Bin 0 -> 873 bytes ...2abbabad528b294b15a1d7bf9b635761c584f8.m4s | Bin 0 -> 873 bytes .../video-cmaf-01/package/floor/hi/init.mp4 | Bin 0 -> 788 bytes ...df17537e5c31accca37390c391a7c1d27353af.m4s | Bin 0 -> 2138 bytes ...f54529725c36a4ead953b1fbfbbee14d4e79a8.m4s | Bin 0 -> 1940 bytes ...dec11761813f995d11dc9779c5f9b039d59b73.m4s | Bin 0 -> 1467 bytes ...fc023f911b4e9e94b65770393c4df6d705b5e8.m4s | Bin 0 -> 1019 bytes ...e830f785b38a56c81aee1f4c86f2e8f9115fcc.m4s | Bin 0 -> 1019 bytes .../video-cmaf-01/package/floor/lo/init.mp4 | Bin 0 -> 788 bytes .../package/hls/classic/floor-hi.m3u8 | 18 + .../package/hls/classic/floor-lo.m3u8 | 18 + .../package/hls/classic/master.m3u8 | 7 + .../package/hls/legacy/master.m3u8 | 7 + .../package/hls/mobile/master.m3u8 | 8 + .../package/hls/mobile/wai-v.m3u8 | 20 + .../video-cmaf-01/package/hls/mobile/wai.m3u8 | 7 + .../video-cmaf-01/package/hls/tv/master.m3u8 | 8 + .../video-cmaf-01/package/hls/tv/wai-v.m3u8 | 17 + .../video-cmaf-01/package/hls/tv/wai.m3u8 | 7 + .../packs/video-cmaf-01/package/index-v.wsix | Bin 0 -> 2368 bytes .../video-cmaf-01/package/moq/catalog.json | 1 + ...95df64b7e216f3a0c9ba82006133bb9b6d7f16.wai | Bin 0 -> 2648 bytes ...371966b50573602a200dd7bb04e0d90889326d.wai | Bin 0 -> 39826 bytes ...eaf207cfa63f490212b69389fba4d72f62c60f.wai | Bin 0 -> 2569 bytes ...19c2f6fbfc5a0cb97754e871c1c23a99bdb481.wai | Bin 0 -> 25514 bytes ...a0240598b914dbf2cabe545aa001e8de12d365.wai | Bin 0 -> 9950 bytes ...973edd35e5266cf850fe2f38f77536ac803912.wai | Bin 0 -> 2251 bytes ...56e9dca50c327423fcfd2a98f4c342d1dbfaf9.wai | Bin 0 -> 1380 bytes ...d007436368e8d20467fdec2a1eebbb84b03bf2.wai | Bin 0 -> 35882 bytes ...0c01f2570ba4be1c0af26105e092dfccf90d30.wai | Bin 0 -> 2503 bytes ...b9b53cfbd4b3f058730e62512ca9f0f6ef2ea3.wai | Bin 0 -> 2351 bytes ...aba164078a1bd4780e21d72cbf2234928272ec.wai | Bin 0 -> 1234 bytes ...cc14fd00abbf601c61286a612089b4a53a195a.wai | Bin 0 -> 1858 bytes .../package/package.receipt.json | 1 + .../packs/video-cmaf-01/package/plan-v.txt | 5 + .../packs/video-cmaf-01/package/policy.json | 1 + .../packs/video-cmaf-01/package/policy.toml | 55 + .../video-cmaf-01/package/stages/legacy.json | 1 + .../video-cmaf-01/package/stages/mobile.json | 1 + .../video-cmaf-01/package/stages/tv.json | 1 + .../packs/video-cmaf-01/policy.toml | 55 + .../video-floor-only-01/floor/hi/init.mp4 | Bin 0 -> 788 bytes .../video-floor-only-01/floor/hi/seg_0000.m4s | Bin 0 -> 2217 bytes .../video-floor-only-01/floor/hi/seg_0001.m4s | Bin 0 -> 873 bytes .../video-floor-only-01/floor/hi/seg_0002.m4s | Bin 0 -> 2092 bytes .../video-floor-only-01/floor/hi/seg_0003.m4s | Bin 0 -> 873 bytes .../video-floor-only-01/floor/hi/seg_0004.m4s | Bin 0 -> 1860 bytes .../video-floor-only-01/floor/lo/init.mp4 | Bin 0 -> 788 bytes .../video-floor-only-01/floor/lo/seg_0000.m4s | Bin 0 -> 2138 bytes .../video-floor-only-01/floor/lo/seg_0001.m4s | Bin 0 -> 1019 bytes .../video-floor-only-01/floor/lo/seg_0002.m4s | Bin 0 -> 1940 bytes .../video-floor-only-01/floor/lo/seg_0003.m4s | Bin 0 -> 1019 bytes .../video-floor-only-01/floor/lo/seg_0004.m4s | Bin 0 -> 1467 bytes .../packs/video-floor-only-01/key.hex | 1 + .../packs/video-floor-only-01/package/LISTING | 33 + .../package/dash/classic.mpd | 41 + .../video-floor-only-01/package/floor.listing | 12 + ...bf6669ce8edec06fd7cd0961a01d2aaf720889.m4s | Bin 0 -> 2217 bytes ...9c039141d261dd65212035e96bb157783423c1.m4s | Bin 0 -> 1860 bytes ...d0f6263b9e06ee0af1e8269ce4f20d5cb3653d.m4s | Bin 0 -> 2092 bytes ...84fadf8c165c5e16e864629b194dc46290387e.m4s | Bin 0 -> 873 bytes ...2abbabad528b294b15a1d7bf9b635761c584f8.m4s | Bin 0 -> 873 bytes .../package/floor/hi/init.mp4 | Bin 0 -> 788 bytes ...df17537e5c31accca37390c391a7c1d27353af.m4s | Bin 0 -> 2138 bytes ...f54529725c36a4ead953b1fbfbbee14d4e79a8.m4s | Bin 0 -> 1940 bytes ...dec11761813f995d11dc9779c5f9b039d59b73.m4s | Bin 0 -> 1467 bytes ...fc023f911b4e9e94b65770393c4df6d705b5e8.m4s | Bin 0 -> 1019 bytes ...e830f785b38a56c81aee1f4c86f2e8f9115fcc.m4s | Bin 0 -> 1019 bytes .../package/floor/lo/init.mp4 | Bin 0 -> 788 bytes .../package/hls/all/master.m3u8 | 7 + .../package/hls/classic/floor-hi.m3u8 | 18 + .../package/hls/classic/floor-lo.m3u8 | 18 + .../package/hls/classic/master.m3u8 | 7 + .../video-floor-only-01/package/index-v.wsix | Bin 0 -> 1648 bytes .../package/moq/catalog.json | 1 + ...1de2c311a3cd586379d1dea5c235d1b47fde60.wai | Bin 0 -> 2204 bytes ...b2bce45815d3ee881f238b48fae8140e9d88e6.wai | Bin 0 -> 1952 bytes ...fa3a5eaa7dde3aa6b4c3ccfdcb23e710f15d28.wai | Bin 0 -> 935 bytes ...ad4f574212ee1e6addaa99a73ab22258de73fa.wai | Bin 0 -> 1559 bytes ...4b16b69a0fc1e375bea6515cabc4bcf71a29ad.wai | Bin 0 -> 2052 bytes ...64aa67d530dc54ae2bad562dc3235f7ebffc9a.wai | Bin 0 -> 1081 bytes ...0b081b8fad0552739024df229481e73d4cd341.wai | Bin 0 -> 2270 bytes ...d64669760e1f7358553731de7ba9dafac01796.wai | Bin 0 -> 2349 bytes .../package/package.receipt.json | 1 + .../video-floor-only-01/package/plan-v.txt | 5 + .../video-floor-only-01/package/policy.json | 1 + .../video-floor-only-01/package/policy.toml | 38 + .../package/stages/all.json | 1 + .../packs/video-floor-only-01/policy.toml | 38 + .../packs/video-floor-only-02/floor/hi.obu | Bin 0 -> 6575 bytes .../packs/video-floor-only-02/floor/lo.obu | Bin 0 -> 6243 bytes .../packs/video-floor-only-02/key.hex | 1 + .../packs/video-floor-only-02/package/LISTING | 32 + .../package/dash/classic.mpd | 41 + ...2a2ff65b0f75d9d4b1ad78f3ebffb886a74be6.m4s | Bin 0 -> 981 bytes ...5de0902f941a3c6a000295714f7cab193aa6cf.m4s | Bin 0 -> 981 bytes ...b33fd445037d6538b445bcc76431f9c9f91c5b.m4s | Bin 0 -> 2400 bytes ...01dc69170ecb4240dffd2e86808ddf87baa12a.m4s | Bin 0 -> 2605 bytes ...7996d7f89e75d105f0dc71c9841bb96e6cd0fc.m4s | Bin 0 -> 2088 bytes .../package/floor/hi/init.mp4 | Bin 0 -> 628 bytes ...846a2b0d530ea2e44260af66ddc51ad14ce07f.m4s | Bin 0 -> 1127 bytes ...92fdd2aa86db43ccdc684b69c51a688856a0db.m4s | Bin 0 -> 1127 bytes ...659d88613f6d0d360485effe3751504cefbb74.m4s | Bin 0 -> 2248 bytes ...d45c4c0274b0460f6abc8f54940ac378165833.m4s | Bin 0 -> 2526 bytes ...7189e7bed63e12e34e9ed4d9bf96a101d864a9.m4s | Bin 0 -> 1695 bytes .../package/floor/lo/init.mp4 | Bin 0 -> 628 bytes .../package/hls/all/master.m3u8 | 7 + .../package/hls/classic/floor-hi.m3u8 | 18 + .../package/hls/classic/floor-lo.m3u8 | 18 + .../package/hls/classic/master.m3u8 | 7 + .../video-floor-only-02/package/index-v.wsix | Bin 0 -> 1648 bytes .../package/moq/catalog.json | 1 + ...1de2c311a3cd586379d1dea5c235d1b47fde60.wai | Bin 0 -> 2204 bytes ...b2bce45815d3ee881f238b48fae8140e9d88e6.wai | Bin 0 -> 1952 bytes ...fa3a5eaa7dde3aa6b4c3ccfdcb23e710f15d28.wai | Bin 0 -> 935 bytes ...ad4f574212ee1e6addaa99a73ab22258de73fa.wai | Bin 0 -> 1559 bytes ...4b16b69a0fc1e375bea6515cabc4bcf71a29ad.wai | Bin 0 -> 2052 bytes ...64aa67d530dc54ae2bad562dc3235f7ebffc9a.wai | Bin 0 -> 1081 bytes ...0b081b8fad0552739024df229481e73d4cd341.wai | Bin 0 -> 2270 bytes ...d64669760e1f7358553731de7ba9dafac01796.wai | Bin 0 -> 2349 bytes .../package/package.receipt.json | 1 + .../video-floor-only-02/package/plan-v.txt | 5 + .../video-floor-only-02/package/policy.json | 1 + .../video-floor-only-02/package/policy.toml | 37 + .../package/stages/all.json | 1 + .../packs/video-floor-only-02/policy.toml | 37 + .../packs/video-ladder-01/floor/hi.obu | Bin 0 -> 6575 bytes .../packs/video-ladder-01/floor/lo.obu | Bin 0 -> 6243 bytes .../packs/video-ladder-01/key.hex | 1 + .../packs/video-ladder-01/package/LISTING | 46 + .../video-ladder-01/package/dash/classic.mpd | 41 + .../video-ladder-01/package/dash/mobile.mpd | 21 + .../packs/video-ladder-01/package/dash/tv.mpd | 27 + ...2a2ff65b0f75d9d4b1ad78f3ebffb886a74be6.m4s | Bin 0 -> 981 bytes ...5de0902f941a3c6a000295714f7cab193aa6cf.m4s | Bin 0 -> 981 bytes ...b33fd445037d6538b445bcc76431f9c9f91c5b.m4s | Bin 0 -> 2400 bytes ...01dc69170ecb4240dffd2e86808ddf87baa12a.m4s | Bin 0 -> 2605 bytes ...7996d7f89e75d105f0dc71c9841bb96e6cd0fc.m4s | Bin 0 -> 2088 bytes .../video-ladder-01/package/floor/hi/init.mp4 | Bin 0 -> 628 bytes ...846a2b0d530ea2e44260af66ddc51ad14ce07f.m4s | Bin 0 -> 1127 bytes ...92fdd2aa86db43ccdc684b69c51a688856a0db.m4s | Bin 0 -> 1127 bytes ...659d88613f6d0d360485effe3751504cefbb74.m4s | Bin 0 -> 2248 bytes ...d45c4c0274b0460f6abc8f54940ac378165833.m4s | Bin 0 -> 2526 bytes ...7189e7bed63e12e34e9ed4d9bf96a101d864a9.m4s | Bin 0 -> 1695 bytes .../video-ladder-01/package/floor/lo/init.mp4 | Bin 0 -> 628 bytes .../package/hls/classic/floor-hi.m3u8 | 18 + .../package/hls/classic/floor-lo.m3u8 | 18 + .../package/hls/classic/master.m3u8 | 7 + .../package/hls/legacy/master.m3u8 | 7 + .../package/hls/mobile/master.m3u8 | 8 + .../package/hls/mobile/wai-v.m3u8 | 20 + .../package/hls/mobile/wai.m3u8 | 7 + .../package/hls/tv/master.m3u8 | 8 + .../video-ladder-01/package/hls/tv/wai-v.m3u8 | 17 + .../video-ladder-01/package/hls/tv/wai.m3u8 | 7 + .../video-ladder-01/package/index-v.wsix | Bin 0 -> 2368 bytes .../video-ladder-01/package/moq/catalog.json | 1 + ...371966b50573602a200dd7bb04e0d90889326d.wai | Bin 0 -> 39826 bytes ...269ea591df681ced90b05d97e0df106b49b08e.wai | Bin 0 -> 2569 bytes ...a8bb86c174409cb625157784e18c5e5559a381.wai | Bin 0 -> 2503 bytes ...19c2f6fbfc5a0cb97754e871c1c23a99bdb481.wai | Bin 0 -> 25514 bytes ...a0240598b914dbf2cabe545aa001e8de12d365.wai | Bin 0 -> 9950 bytes ...ca88bcc463ceac47f109c8c155e34bb1a6f37d.wai | Bin 0 -> 1380 bytes ...f66cbb814cde679bceb1ae37f0765308ddee72.wai | Bin 0 -> 2251 bytes ...d007436368e8d20467fdec2a1eebbb84b03bf2.wai | Bin 0 -> 35882 bytes ...75efdc77163602b4a1dabcff080e5ea28b9946.wai | Bin 0 -> 2648 bytes ...22fc0bed42baeb3488f00dfe3567056a7009c5.wai | Bin 0 -> 1858 bytes ...43dfb76fcc3884c607b744c8a53fa6a1728580.wai | Bin 0 -> 1234 bytes ...cb754ce6bd8dcd2e03ecfc41359cad989b15f7.wai | Bin 0 -> 2351 bytes .../package/package.receipt.json | 1 + .../packs/video-ladder-01/package/plan-v.txt | 5 + .../packs/video-ladder-01/package/policy.json | 1 + .../packs/video-ladder-01/package/policy.toml | 54 + .../package/stages/legacy.json | 1 + .../package/stages/mobile.json | 1 + .../video-ladder-01/package/stages/tv.json | 1 + .../packs/video-ladder-01/policy.toml | 54 + .../packs/video-repack-01/floor/hi.obu | Bin 0 -> 6575 bytes .../packs/video-repack-01/floor/lo.obu | Bin 0 -> 6243 bytes .../packs/video-repack-01/key.hex | 1 + .../packs/video-repack-01/package/LISTING | 46 + .../video-repack-01/package/dash/classic.mpd | 41 + .../video-repack-01/package/dash/mobile.mpd | 21 + .../packs/video-repack-01/package/dash/tv.mpd | 27 + ...2a2ff65b0f75d9d4b1ad78f3ebffb886a74be6.m4s | Bin 0 -> 981 bytes ...5de0902f941a3c6a000295714f7cab193aa6cf.m4s | Bin 0 -> 981 bytes ...b33fd445037d6538b445bcc76431f9c9f91c5b.m4s | Bin 0 -> 2400 bytes ...01dc69170ecb4240dffd2e86808ddf87baa12a.m4s | Bin 0 -> 2605 bytes ...7996d7f89e75d105f0dc71c9841bb96e6cd0fc.m4s | Bin 0 -> 2088 bytes .../video-repack-01/package/floor/hi/init.mp4 | Bin 0 -> 628 bytes ...846a2b0d530ea2e44260af66ddc51ad14ce07f.m4s | Bin 0 -> 1127 bytes ...92fdd2aa86db43ccdc684b69c51a688856a0db.m4s | Bin 0 -> 1127 bytes ...659d88613f6d0d360485effe3751504cefbb74.m4s | Bin 0 -> 2248 bytes ...d45c4c0274b0460f6abc8f54940ac378165833.m4s | Bin 0 -> 2526 bytes ...7189e7bed63e12e34e9ed4d9bf96a101d864a9.m4s | Bin 0 -> 1695 bytes .../video-repack-01/package/floor/lo/init.mp4 | Bin 0 -> 628 bytes .../package/hls/classic/floor-hi.m3u8 | 18 + .../package/hls/classic/floor-lo.m3u8 | 18 + .../package/hls/classic/master.m3u8 | 7 + .../package/hls/legacy/master.m3u8 | 7 + .../package/hls/mobile/master.m3u8 | 8 + .../package/hls/mobile/wai-v.m3u8 | 20 + .../package/hls/mobile/wai.m3u8 | 7 + .../package/hls/tv/master.m3u8 | 8 + .../video-repack-01/package/hls/tv/wai-v.m3u8 | 17 + .../video-repack-01/package/hls/tv/wai.m3u8 | 7 + .../video-repack-01/package/index-v.wsix | Bin 0 -> 2368 bytes .../video-repack-01/package/moq/catalog.json | 1 + ...371966b50573602a200dd7bb04e0d90889326d.wai | Bin 0 -> 39826 bytes ...269ea591df681ced90b05d97e0df106b49b08e.wai | Bin 0 -> 2569 bytes ...a8bb86c174409cb625157784e18c5e5559a381.wai | Bin 0 -> 2503 bytes ...19c2f6fbfc5a0cb97754e871c1c23a99bdb481.wai | Bin 0 -> 25514 bytes ...a0240598b914dbf2cabe545aa001e8de12d365.wai | Bin 0 -> 9950 bytes ...ca88bcc463ceac47f109c8c155e34bb1a6f37d.wai | Bin 0 -> 1380 bytes ...f66cbb814cde679bceb1ae37f0765308ddee72.wai | Bin 0 -> 2251 bytes ...d007436368e8d20467fdec2a1eebbb84b03bf2.wai | Bin 0 -> 35882 bytes ...75efdc77163602b4a1dabcff080e5ea28b9946.wai | Bin 0 -> 2648 bytes ...22fc0bed42baeb3488f00dfe3567056a7009c5.wai | Bin 0 -> 1858 bytes ...43dfb76fcc3884c607b744c8a53fa6a1728580.wai | Bin 0 -> 1234 bytes ...cb754ce6bd8dcd2e03ecfc41359cad989b15f7.wai | Bin 0 -> 2351 bytes .../package/package.receipt.json | 1 + .../packs/video-repack-01/package/plan-v.txt | 5 + .../packs/video-repack-01/package/policy.json | 1 + .../packs/video-repack-01/package/policy.toml | 54 + .../package/stages/legacy.json | 1 + .../package/stages/mobile.json | 1 + .../video-repack-01/package/stages/tv.json | 1 + .../packs/video-repack-01/parent | 1 + .../packs/video-repack-01/policy.toml | 54 + wai/pack-conformance/policy_diff.py | 12 + .../staged-mutations/expected.json | 5 + wai/pack-conformance/supplied_cmaf.py | 64 + wai/pack-conformance/supplied_floor.py | 111 +- wai/research/cross-fabric.md | 339 ++++++ wai/wai-ops-gpu/Cargo.lock | 1 + wai/wai-ops-gpu/Cargo.toml | 6 + wai/wai-ops-gpu/browser/index.html | 12 +- wai/wai-ops-gpu/browser/run.mjs | 21 +- .../browser/semantics_reference.mjs | 26 + wai/wai-ops-gpu/browser/src/lib.rs | 80 ++ wai/wai-ops-gpu/src/bin/wai-wgsl-vectors.rs | 28 + wai/wai-ops-gpu/src/device.rs | 30 +- wai/wai-ops-gpu/src/kernels.rs | 17 +- wai/wai-ops-gpu/src/lib.rs | 2 + wai/wai-ops-gpu/src/semantics.rs | 925 ++++++++++++++ wai/wai-ops-gpu/src/wgsl/arith.wgsl | 22 +- wai/wai-ops-gpu/src/wgsl/ops32.wgsl | 9 +- wai/wai-ops-gpu/src/wgsl/semantics.wgsl | 125 ++ wai/wai-ops-gpu/tests/mutants.rs | 2 +- wai/wai-ops-gpu/tests/semantics.rs | 113 ++ wai/wai-ops-gpu/tests/wgsl_rules.rs | 486 ++++++++ wai/wai-pack-gpu/Cargo.lock | 1063 +++++++++++++++++ wai/wai-pack-gpu/Cargo.toml | 34 + wai/wai-pack-gpu/src/lib.rs | 502 ++++++++ wai/wai-pack-gpu/src/wgsl/blake3.wgsl | 145 +++ wai/wai-pack-gpu/src/wgsl/motion.wgsl | 131 ++ wai/wai-pack-gpu/src/wgsl/sse.wgsl | 41 + wai/wai-pack-gpu/tests/concurrent.rs | 47 + wai/wai-pack-gpu/tests/kernels.rs | 79 ++ wai/wai-pack-gpu/tests/mutants.rs | 86 ++ wai/wai-pack-gpu/tests/support/mod.rs | 170 +++ wai/wai-pack/Cargo.lock | 888 +++++++++++++- wai/wai-pack/Cargo.toml | 12 + wai/wai-pack/src/av1.rs | 173 ++- wai/wai-pack/src/bin/wai_pack.rs | 315 ++++- wai/wai-pack/src/catalog.rs | 157 ++- wai/wai-pack/src/classify.rs | 11 +- wai/wai-pack/src/cmaf_read.rs | 416 +++++++ wai/wai-pack/src/encode.rs | 11 +- wai/wai-pack/src/fabric.rs | 612 ++++++++++ wai/wai-pack/src/fabric_meter.rs | 456 +++++++ wai/wai-pack/src/files.rs | 398 ++++++ wai/wai-pack/src/floor.rs | 260 +++- wai/wai-pack/src/floor_decode.rs | 268 +++++ wai/wai-pack/src/golden.rs | 317 ++++- wai/wai-pack/src/lib.rs | 11 +- wai/wai-pack/src/live.rs | 2 +- wai/wai-pack/src/pack.rs | 800 +++++++++++-- wai/wai-pack/src/policy.rs | 73 +- wai/wai-pack/src/verify.rs | 295 ++++- wai/wai-pack/tests/cmaf.rs | 174 +++ wai/wai-pack/tests/fabric.rs | 314 +++++ wai/wai-pack/tests/floor_only.rs | 109 ++ wai/wai-pack/tests/ladder.rs | 157 +++ wai/wai-pack/tests/pack_alloc.rs | 95 ++ wai/wai-pack/tests/packs.rs | 29 + wai/wai-pack/tests/refusals.rs | 39 + wai/wai-pack/tests/repack.rs | 135 +++ wai/wai-rs/src/claim_receipt.rs | 262 +++- .../src/claim_receipt/corpus/session.rs | 1 + wai/wai-rs/src/energy_figure.rs | 20 + wai/wai-rs/src/http_binding/dash.rs | 34 +- .../src/http_binding/tests_playlists.rs | 19 +- wai/wai-rs/src/int_video_enc.rs | 94 +- wai/wai-rs/src/key_log/corpus.rs | 1 + wai/wai-rs/src/stage_index.rs | 33 +- wai/wai-rs/src/stage_index/tests.rs | 17 + wai/wgsl-conformance/.gitattributes | 2 + wai/wgsl-conformance/README.md | 37 + wai/wgsl-conformance/integer.jsonl | 56 + 388 files changed, 15800 insertions(+), 717 deletions(-) create mode 100644 wai/pack-conformance/cmaf-mutations/expected.json create mode 100644 wai/pack-conformance/cmaf-mutations/floor-listing-altered/LISTING create mode 100644 wai/pack-conformance/cmaf-mutations/floor-listing-altered/floor.listing create mode 100644 wai/pack-conformance/cmaf-mutations/floor-listing-missing/LISTING create mode 100644 wai/pack-conformance/cmaf-mutations/segment-not-the-supplied-one/LISTING create mode 100644 wai/pack-conformance/cmaf-mutations/segment-not-the-supplied-one/dash/classic.mpd create mode 100644 wai/pack-conformance/cmaf-mutations/segment-not-the-supplied-one/floor/hi/103573aca98afc526a45518dc6b93d0fcd58511bb34550b2f4d7b29431df9ad9.m4s create mode 100644 wai/pack-conformance/cmaf-mutations/segment-not-the-supplied-one/hls/classic/master.m3u8 create mode 100644 wai/pack-conformance/cmaf-mutations/segment-not-the-supplied-one/hls/legacy/master.m3u8 create mode 100644 wai/pack-conformance/cmaf-mutations/segment-not-the-supplied-one/hls/mobile/master.m3u8 create mode 100644 wai/pack-conformance/cmaf-mutations/segment-not-the-supplied-one/hls/tv/master.m3u8 create mode 100644 wai/pack-conformance/cmaf-mutations/segment-not-the-supplied-one/moq/catalog.json create mode 100644 wai/pack-conformance/cmaf_diff.py create mode 100644 wai/pack-conformance/ladder-mutations/expected.json create mode 100644 wai/pack-conformance/ladder-mutations/floor-under-the-component-s-name/LISTING create mode 100644 wai/pack-conformance/ladder-mutations/floor-under-the-component-s-name/floor/v/589ad79210bff258db68916876846a2b0d530ea2e44260af66ddc51ad14ce07f.m4s create mode 100644 wai/pack-conformance/ladder-mutations/floor-under-the-component-s-name/floor/v/6bba50408f894d0e9d5516a53992fdd2aa86db43ccdc684b69c51a688856a0db.m4s create mode 100644 wai/pack-conformance/ladder-mutations/floor-under-the-component-s-name/floor/v/acd166807d05fe4f512407f717659d88613f6d0d360485effe3751504cefbb74.m4s create mode 100644 wai/pack-conformance/ladder-mutations/floor-under-the-component-s-name/floor/v/d0f68eb18af5b67736ddccd97ed45c4c0274b0460f6abc8f54940ac378165833.m4s create mode 100644 wai/pack-conformance/ladder-mutations/floor-under-the-component-s-name/floor/v/d550ebb204adf0b5a7f310c7d07189e7bed63e12e34e9ed4d9bf96a101d864a9.m4s create mode 100644 wai/pack-conformance/ladder-mutations/floor-under-the-component-s-name/floor/v/init.mp4 create mode 100644 wai/pack-conformance/ladder-mutations/floors-swapped/LISTING create mode 100644 wai/pack-conformance/ladder-mutations/floors-swapped/dash/classic.mpd create mode 100644 wai/pack-conformance/ladder-mutations/floors-swapped/floor/hi/acd166807d05fe4f512407f717659d88613f6d0d360485effe3751504cefbb74.m4s create mode 100644 wai/pack-conformance/ladder-mutations/floors-swapped/floor/lo/2f93f0ad449f9cc881b7816c6ab33fd445037d6538b445bcc76431f9c9f91c5b.m4s create mode 100644 wai/pack-conformance/ladder-mutations/floors-swapped/hls/classic/floor-hi.m3u8 create mode 100644 wai/pack-conformance/ladder-mutations/floors-swapped/hls/classic/floor-lo.m3u8 create mode 100644 wai/pack-conformance/ladder-mutations/floors-swapped/hls/classic/master.m3u8 create mode 100644 wai/pack-conformance/ladder-mutations/floors-swapped/hls/legacy/master.m3u8 create mode 100644 wai/pack-conformance/ladder-mutations/floors-swapped/hls/mobile/master.m3u8 create mode 100644 wai/pack-conformance/ladder-mutations/floors-swapped/hls/tv/master.m3u8 create mode 100644 wai/pack-conformance/ladder-mutations/floors-swapped/index-v.wsix create mode 100644 wai/pack-conformance/ladder-mutations/floors-swapped/package.receipt.json create mode 100644 wai/pack-conformance/ladder-mutations/master-lists-one-floor/LISTING create mode 100644 wai/pack-conformance/ladder-mutations/master-lists-one-floor/hls/classic/master.m3u8 create mode 100644 wai/pack-conformance/mutations/index/floor-only-piece-with-derived-from.wsix create mode 100644 wai/pack-conformance/mutations/index/floor-only-piece.wsix create mode 100644 wai/pack-conformance/mutations/index/piece-kind-none.wsix create mode 100644 wai/pack-conformance/package-mutations/metered-claim-another-figure/LISTING create mode 100644 wai/pack-conformance/package-mutations/metered-claim-another-figure/claims/01d891a6690096d3de7c8e7cec802cb95f82deb84b5d45994dd713e7576673f2.measurement.json create mode 100644 wai/pack-conformance/package-mutations/metered-claim-another-figure/package.receipt.json create mode 100644 wai/pack-conformance/package-mutations/metered-claim-missing/LISTING create mode 100644 wai/pack-conformance/package-mutations/metered-claim-missing/package.receipt.json create mode 100644 wai/pack-conformance/package-mutations/metered-fabrics-unknown-step/LISTING create mode 100644 wai/pack-conformance/package-mutations/metered-fabrics-unknown-step/claims/01d891a6690096d3de7c8e7cec802cb95f82deb84b5d45994dd713e7576673f2.measurement.json create mode 100644 wai/pack-conformance/package-mutations/metered-fabrics-unknown-step/package.receipt.json create mode 100644 wai/pack-conformance/package-mutations/metered-fabrics/LISTING create mode 100644 wai/pack-conformance/package-mutations/metered-fabrics/claims/01d891a6690096d3de7c8e7cec802cb95f82deb84b5d45994dd713e7576673f2.measurement.json create mode 100644 wai/pack-conformance/package-mutations/metered-fabrics/package.receipt.json create mode 100644 wai/pack-conformance/package-mutations/metered/LISTING create mode 100644 wai/pack-conformance/package-mutations/metered/claims/01d891a6690096d3de7c8e7cec802cb95f82deb84b5d45994dd713e7576673f2.measurement.json create mode 100644 wai/pack-conformance/package-mutations/metered/package.receipt.json create mode 100644 wai/pack-conformance/packs/video-cmaf-01/floor/hi/init.mp4 create mode 100644 wai/pack-conformance/packs/video-cmaf-01/floor/hi/seg_0000.m4s create mode 100644 wai/pack-conformance/packs/video-cmaf-01/floor/hi/seg_0001.m4s create mode 100644 wai/pack-conformance/packs/video-cmaf-01/floor/hi/seg_0002.m4s create mode 100644 wai/pack-conformance/packs/video-cmaf-01/floor/hi/seg_0003.m4s create mode 100644 wai/pack-conformance/packs/video-cmaf-01/floor/hi/seg_0004.m4s create mode 100644 wai/pack-conformance/packs/video-cmaf-01/floor/lo/init.mp4 create mode 100644 wai/pack-conformance/packs/video-cmaf-01/floor/lo/seg_0000.m4s create mode 100644 wai/pack-conformance/packs/video-cmaf-01/floor/lo/seg_0001.m4s create mode 100644 wai/pack-conformance/packs/video-cmaf-01/floor/lo/seg_0002.m4s create mode 100644 wai/pack-conformance/packs/video-cmaf-01/floor/lo/seg_0003.m4s create mode 100644 wai/pack-conformance/packs/video-cmaf-01/floor/lo/seg_0004.m4s create mode 100644 wai/pack-conformance/packs/video-cmaf-01/key.hex create mode 100644 wai/pack-conformance/packs/video-cmaf-01/package/LISTING create mode 100644 wai/pack-conformance/packs/video-cmaf-01/package/dash/classic.mpd create mode 100644 wai/pack-conformance/packs/video-cmaf-01/package/dash/mobile.mpd create mode 100644 wai/pack-conformance/packs/video-cmaf-01/package/dash/tv.mpd create mode 100644 wai/pack-conformance/packs/video-cmaf-01/package/floor.listing create mode 100644 wai/pack-conformance/packs/video-cmaf-01/package/floor/hi/14cdbe56c8f57b1427ab9c2a9ebf6669ce8edec06fd7cd0961a01d2aaf720889.m4s create mode 100644 wai/pack-conformance/packs/video-cmaf-01/package/floor/hi/759f476ce9e9b003d7d797060f9c039141d261dd65212035e96bb157783423c1.m4s create mode 100644 wai/pack-conformance/packs/video-cmaf-01/package/floor/hi/d3616b6368fc800ce421a492fbd0f6263b9e06ee0af1e8269ce4f20d5cb3653d.m4s create mode 100644 wai/pack-conformance/packs/video-cmaf-01/package/floor/hi/e5583297b1456e46366fe3317784fadf8c165c5e16e864629b194dc46290387e.m4s create mode 100644 wai/pack-conformance/packs/video-cmaf-01/package/floor/hi/eb559df9571de1869981ca82672abbabad528b294b15a1d7bf9b635761c584f8.m4s create mode 100644 wai/pack-conformance/packs/video-cmaf-01/package/floor/hi/init.mp4 create mode 100644 wai/pack-conformance/packs/video-cmaf-01/package/floor/lo/0e0407f5a552e405846a411627df17537e5c31accca37390c391a7c1d27353af.m4s create mode 100644 wai/pack-conformance/packs/video-cmaf-01/package/floor/lo/10b19654062fa37b83c082c922f54529725c36a4ead953b1fbfbbee14d4e79a8.m4s create mode 100644 wai/pack-conformance/packs/video-cmaf-01/package/floor/lo/2c484c9bead2b261ac1a18c2aedec11761813f995d11dc9779c5f9b039d59b73.m4s create mode 100644 wai/pack-conformance/packs/video-cmaf-01/package/floor/lo/a855b2701af4e7c8c912448be9fc023f911b4e9e94b65770393c4df6d705b5e8.m4s create mode 100644 wai/pack-conformance/packs/video-cmaf-01/package/floor/lo/c29687008dafdf251b2ca962c3e830f785b38a56c81aee1f4c86f2e8f9115fcc.m4s create mode 100644 wai/pack-conformance/packs/video-cmaf-01/package/floor/lo/init.mp4 create mode 100644 wai/pack-conformance/packs/video-cmaf-01/package/hls/classic/floor-hi.m3u8 create mode 100644 wai/pack-conformance/packs/video-cmaf-01/package/hls/classic/floor-lo.m3u8 create mode 100644 wai/pack-conformance/packs/video-cmaf-01/package/hls/classic/master.m3u8 create mode 100644 wai/pack-conformance/packs/video-cmaf-01/package/hls/legacy/master.m3u8 create mode 100644 wai/pack-conformance/packs/video-cmaf-01/package/hls/mobile/master.m3u8 create mode 100644 wai/pack-conformance/packs/video-cmaf-01/package/hls/mobile/wai-v.m3u8 create mode 100644 wai/pack-conformance/packs/video-cmaf-01/package/hls/mobile/wai.m3u8 create mode 100644 wai/pack-conformance/packs/video-cmaf-01/package/hls/tv/master.m3u8 create mode 100644 wai/pack-conformance/packs/video-cmaf-01/package/hls/tv/wai-v.m3u8 create mode 100644 wai/pack-conformance/packs/video-cmaf-01/package/hls/tv/wai.m3u8 create mode 100644 wai/pack-conformance/packs/video-cmaf-01/package/index-v.wsix create mode 100644 wai/pack-conformance/packs/video-cmaf-01/package/moq/catalog.json create mode 100644 wai/pack-conformance/packs/video-cmaf-01/package/objects/08797901ff55d0bb4afba5cffe95df64b7e216f3a0c9ba82006133bb9b6d7f16.wai create mode 100644 wai/pack-conformance/packs/video-cmaf-01/package/objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai create mode 100644 wai/pack-conformance/packs/video-cmaf-01/package/objects/399048a078b0f2983149266a44eaf207cfa63f490212b69389fba4d72f62c60f.wai create mode 100644 wai/pack-conformance/packs/video-cmaf-01/package/objects/618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481.wai create mode 100644 wai/pack-conformance/packs/video-cmaf-01/package/objects/61c7c3b7ccab07ed01df5b0d7ca0240598b914dbf2cabe545aa001e8de12d365.wai create mode 100644 wai/pack-conformance/packs/video-cmaf-01/package/objects/a236e9070d10fd09342cafdbf6973edd35e5266cf850fe2f38f77536ac803912.wai create mode 100644 wai/pack-conformance/packs/video-cmaf-01/package/objects/a3ae43406f9966487b6c5f5a4d56e9dca50c327423fcfd2a98f4c342d1dbfaf9.wai create mode 100644 wai/pack-conformance/packs/video-cmaf-01/package/objects/c2ce1907255a041c388afd06ccd007436368e8d20467fdec2a1eebbb84b03bf2.wai create mode 100644 wai/pack-conformance/packs/video-cmaf-01/package/objects/c5253efe2949669bb9df01d9f60c01f2570ba4be1c0af26105e092dfccf90d30.wai create mode 100644 wai/pack-conformance/packs/video-cmaf-01/package/objects/c81171fa53998cfe94207ad66ab9b53cfbd4b3f058730e62512ca9f0f6ef2ea3.wai create mode 100644 wai/pack-conformance/packs/video-cmaf-01/package/objects/dea0f6415f639fca99d91a0341aba164078a1bd4780e21d72cbf2234928272ec.wai create mode 100644 wai/pack-conformance/packs/video-cmaf-01/package/objects/f467872fe8d3cd1f60f832c997cc14fd00abbf601c61286a612089b4a53a195a.wai create mode 100644 wai/pack-conformance/packs/video-cmaf-01/package/package.receipt.json create mode 100644 wai/pack-conformance/packs/video-cmaf-01/package/plan-v.txt create mode 100644 wai/pack-conformance/packs/video-cmaf-01/package/policy.json create mode 100644 wai/pack-conformance/packs/video-cmaf-01/package/policy.toml create mode 100644 wai/pack-conformance/packs/video-cmaf-01/package/stages/legacy.json create mode 100644 wai/pack-conformance/packs/video-cmaf-01/package/stages/mobile.json create mode 100644 wai/pack-conformance/packs/video-cmaf-01/package/stages/tv.json create mode 100644 wai/pack-conformance/packs/video-cmaf-01/policy.toml create mode 100644 wai/pack-conformance/packs/video-floor-only-01/floor/hi/init.mp4 create mode 100644 wai/pack-conformance/packs/video-floor-only-01/floor/hi/seg_0000.m4s create mode 100644 wai/pack-conformance/packs/video-floor-only-01/floor/hi/seg_0001.m4s create mode 100644 wai/pack-conformance/packs/video-floor-only-01/floor/hi/seg_0002.m4s create mode 100644 wai/pack-conformance/packs/video-floor-only-01/floor/hi/seg_0003.m4s create mode 100644 wai/pack-conformance/packs/video-floor-only-01/floor/hi/seg_0004.m4s create mode 100644 wai/pack-conformance/packs/video-floor-only-01/floor/lo/init.mp4 create mode 100644 wai/pack-conformance/packs/video-floor-only-01/floor/lo/seg_0000.m4s create mode 100644 wai/pack-conformance/packs/video-floor-only-01/floor/lo/seg_0001.m4s create mode 100644 wai/pack-conformance/packs/video-floor-only-01/floor/lo/seg_0002.m4s create mode 100644 wai/pack-conformance/packs/video-floor-only-01/floor/lo/seg_0003.m4s create mode 100644 wai/pack-conformance/packs/video-floor-only-01/floor/lo/seg_0004.m4s create mode 100644 wai/pack-conformance/packs/video-floor-only-01/key.hex create mode 100644 wai/pack-conformance/packs/video-floor-only-01/package/LISTING create mode 100644 wai/pack-conformance/packs/video-floor-only-01/package/dash/classic.mpd create mode 100644 wai/pack-conformance/packs/video-floor-only-01/package/floor.listing create mode 100644 wai/pack-conformance/packs/video-floor-only-01/package/floor/hi/14cdbe56c8f57b1427ab9c2a9ebf6669ce8edec06fd7cd0961a01d2aaf720889.m4s create mode 100644 wai/pack-conformance/packs/video-floor-only-01/package/floor/hi/759f476ce9e9b003d7d797060f9c039141d261dd65212035e96bb157783423c1.m4s create mode 100644 wai/pack-conformance/packs/video-floor-only-01/package/floor/hi/d3616b6368fc800ce421a492fbd0f6263b9e06ee0af1e8269ce4f20d5cb3653d.m4s create mode 100644 wai/pack-conformance/packs/video-floor-only-01/package/floor/hi/e5583297b1456e46366fe3317784fadf8c165c5e16e864629b194dc46290387e.m4s create mode 100644 wai/pack-conformance/packs/video-floor-only-01/package/floor/hi/eb559df9571de1869981ca82672abbabad528b294b15a1d7bf9b635761c584f8.m4s create mode 100644 wai/pack-conformance/packs/video-floor-only-01/package/floor/hi/init.mp4 create mode 100644 wai/pack-conformance/packs/video-floor-only-01/package/floor/lo/0e0407f5a552e405846a411627df17537e5c31accca37390c391a7c1d27353af.m4s create mode 100644 wai/pack-conformance/packs/video-floor-only-01/package/floor/lo/10b19654062fa37b83c082c922f54529725c36a4ead953b1fbfbbee14d4e79a8.m4s create mode 100644 wai/pack-conformance/packs/video-floor-only-01/package/floor/lo/2c484c9bead2b261ac1a18c2aedec11761813f995d11dc9779c5f9b039d59b73.m4s create mode 100644 wai/pack-conformance/packs/video-floor-only-01/package/floor/lo/a855b2701af4e7c8c912448be9fc023f911b4e9e94b65770393c4df6d705b5e8.m4s create mode 100644 wai/pack-conformance/packs/video-floor-only-01/package/floor/lo/c29687008dafdf251b2ca962c3e830f785b38a56c81aee1f4c86f2e8f9115fcc.m4s create mode 100644 wai/pack-conformance/packs/video-floor-only-01/package/floor/lo/init.mp4 create mode 100644 wai/pack-conformance/packs/video-floor-only-01/package/hls/all/master.m3u8 create mode 100644 wai/pack-conformance/packs/video-floor-only-01/package/hls/classic/floor-hi.m3u8 create mode 100644 wai/pack-conformance/packs/video-floor-only-01/package/hls/classic/floor-lo.m3u8 create mode 100644 wai/pack-conformance/packs/video-floor-only-01/package/hls/classic/master.m3u8 create mode 100644 wai/pack-conformance/packs/video-floor-only-01/package/index-v.wsix create mode 100644 wai/pack-conformance/packs/video-floor-only-01/package/moq/catalog.json create mode 100644 wai/pack-conformance/packs/video-floor-only-01/package/objects/1ca09f3aa9346effeebfc1bd101de2c311a3cd586379d1dea5c235d1b47fde60.wai create mode 100644 wai/pack-conformance/packs/video-floor-only-01/package/objects/420b3bb3485cfea7ad941b0cf9b2bce45815d3ee881f238b48fae8140e9d88e6.wai create mode 100644 wai/pack-conformance/packs/video-floor-only-01/package/objects/6528538927505ec6ed34d97843fa3a5eaa7dde3aa6b4c3ccfdcb23e710f15d28.wai create mode 100644 wai/pack-conformance/packs/video-floor-only-01/package/objects/808567682e2687d0f431e2d2dead4f574212ee1e6addaa99a73ab22258de73fa.wai create mode 100644 wai/pack-conformance/packs/video-floor-only-01/package/objects/95f784de520ecef9127c1758264b16b69a0fc1e375bea6515cabc4bcf71a29ad.wai create mode 100644 wai/pack-conformance/packs/video-floor-only-01/package/objects/afa7e0ae4f4c7545824836249064aa67d530dc54ae2bad562dc3235f7ebffc9a.wai create mode 100644 wai/pack-conformance/packs/video-floor-only-01/package/objects/bac29f2cf9f5bbc85f3095d0eb0b081b8fad0552739024df229481e73d4cd341.wai create mode 100644 wai/pack-conformance/packs/video-floor-only-01/package/objects/cf65056c087382fe4be2f6cb56d64669760e1f7358553731de7ba9dafac01796.wai create mode 100644 wai/pack-conformance/packs/video-floor-only-01/package/package.receipt.json create mode 100644 wai/pack-conformance/packs/video-floor-only-01/package/plan-v.txt create mode 100644 wai/pack-conformance/packs/video-floor-only-01/package/policy.json create mode 100644 wai/pack-conformance/packs/video-floor-only-01/package/policy.toml create mode 100644 wai/pack-conformance/packs/video-floor-only-01/package/stages/all.json create mode 100644 wai/pack-conformance/packs/video-floor-only-01/policy.toml create mode 100644 wai/pack-conformance/packs/video-floor-only-02/floor/hi.obu create mode 100644 wai/pack-conformance/packs/video-floor-only-02/floor/lo.obu create mode 100644 wai/pack-conformance/packs/video-floor-only-02/key.hex create mode 100644 wai/pack-conformance/packs/video-floor-only-02/package/LISTING create mode 100644 wai/pack-conformance/packs/video-floor-only-02/package/dash/classic.mpd create mode 100644 wai/pack-conformance/packs/video-floor-only-02/package/floor/hi/04c948608aaa7b5d78ad5355042a2ff65b0f75d9d4b1ad78f3ebffb886a74be6.m4s create mode 100644 wai/pack-conformance/packs/video-floor-only-02/package/floor/hi/06d5cd79ba3860cccdc252fe915de0902f941a3c6a000295714f7cab193aa6cf.m4s create mode 100644 wai/pack-conformance/packs/video-floor-only-02/package/floor/hi/2f93f0ad449f9cc881b7816c6ab33fd445037d6538b445bcc76431f9c9f91c5b.m4s create mode 100644 wai/pack-conformance/packs/video-floor-only-02/package/floor/hi/420ae4c941bba6e12a6c7fdb7d01dc69170ecb4240dffd2e86808ddf87baa12a.m4s create mode 100644 wai/pack-conformance/packs/video-floor-only-02/package/floor/hi/576b7d2156c2b595bf48bf34f67996d7f89e75d105f0dc71c9841bb96e6cd0fc.m4s create mode 100644 wai/pack-conformance/packs/video-floor-only-02/package/floor/hi/init.mp4 create mode 100644 wai/pack-conformance/packs/video-floor-only-02/package/floor/lo/589ad79210bff258db68916876846a2b0d530ea2e44260af66ddc51ad14ce07f.m4s create mode 100644 wai/pack-conformance/packs/video-floor-only-02/package/floor/lo/6bba50408f894d0e9d5516a53992fdd2aa86db43ccdc684b69c51a688856a0db.m4s create mode 100644 wai/pack-conformance/packs/video-floor-only-02/package/floor/lo/acd166807d05fe4f512407f717659d88613f6d0d360485effe3751504cefbb74.m4s create mode 100644 wai/pack-conformance/packs/video-floor-only-02/package/floor/lo/d0f68eb18af5b67736ddccd97ed45c4c0274b0460f6abc8f54940ac378165833.m4s create mode 100644 wai/pack-conformance/packs/video-floor-only-02/package/floor/lo/d550ebb204adf0b5a7f310c7d07189e7bed63e12e34e9ed4d9bf96a101d864a9.m4s create mode 100644 wai/pack-conformance/packs/video-floor-only-02/package/floor/lo/init.mp4 create mode 100644 wai/pack-conformance/packs/video-floor-only-02/package/hls/all/master.m3u8 create mode 100644 wai/pack-conformance/packs/video-floor-only-02/package/hls/classic/floor-hi.m3u8 create mode 100644 wai/pack-conformance/packs/video-floor-only-02/package/hls/classic/floor-lo.m3u8 create mode 100644 wai/pack-conformance/packs/video-floor-only-02/package/hls/classic/master.m3u8 create mode 100644 wai/pack-conformance/packs/video-floor-only-02/package/index-v.wsix create mode 100644 wai/pack-conformance/packs/video-floor-only-02/package/moq/catalog.json create mode 100644 wai/pack-conformance/packs/video-floor-only-02/package/objects/1ca09f3aa9346effeebfc1bd101de2c311a3cd586379d1dea5c235d1b47fde60.wai create mode 100644 wai/pack-conformance/packs/video-floor-only-02/package/objects/420b3bb3485cfea7ad941b0cf9b2bce45815d3ee881f238b48fae8140e9d88e6.wai create mode 100644 wai/pack-conformance/packs/video-floor-only-02/package/objects/6528538927505ec6ed34d97843fa3a5eaa7dde3aa6b4c3ccfdcb23e710f15d28.wai create mode 100644 wai/pack-conformance/packs/video-floor-only-02/package/objects/808567682e2687d0f431e2d2dead4f574212ee1e6addaa99a73ab22258de73fa.wai create mode 100644 wai/pack-conformance/packs/video-floor-only-02/package/objects/95f784de520ecef9127c1758264b16b69a0fc1e375bea6515cabc4bcf71a29ad.wai create mode 100644 wai/pack-conformance/packs/video-floor-only-02/package/objects/afa7e0ae4f4c7545824836249064aa67d530dc54ae2bad562dc3235f7ebffc9a.wai create mode 100644 wai/pack-conformance/packs/video-floor-only-02/package/objects/bac29f2cf9f5bbc85f3095d0eb0b081b8fad0552739024df229481e73d4cd341.wai create mode 100644 wai/pack-conformance/packs/video-floor-only-02/package/objects/cf65056c087382fe4be2f6cb56d64669760e1f7358553731de7ba9dafac01796.wai create mode 100644 wai/pack-conformance/packs/video-floor-only-02/package/package.receipt.json create mode 100644 wai/pack-conformance/packs/video-floor-only-02/package/plan-v.txt create mode 100644 wai/pack-conformance/packs/video-floor-only-02/package/policy.json create mode 100644 wai/pack-conformance/packs/video-floor-only-02/package/policy.toml create mode 100644 wai/pack-conformance/packs/video-floor-only-02/package/stages/all.json create mode 100644 wai/pack-conformance/packs/video-floor-only-02/policy.toml create mode 100644 wai/pack-conformance/packs/video-ladder-01/floor/hi.obu create mode 100644 wai/pack-conformance/packs/video-ladder-01/floor/lo.obu create mode 100644 wai/pack-conformance/packs/video-ladder-01/key.hex create mode 100644 wai/pack-conformance/packs/video-ladder-01/package/LISTING create mode 100644 wai/pack-conformance/packs/video-ladder-01/package/dash/classic.mpd create mode 100644 wai/pack-conformance/packs/video-ladder-01/package/dash/mobile.mpd create mode 100644 wai/pack-conformance/packs/video-ladder-01/package/dash/tv.mpd create mode 100644 wai/pack-conformance/packs/video-ladder-01/package/floor/hi/04c948608aaa7b5d78ad5355042a2ff65b0f75d9d4b1ad78f3ebffb886a74be6.m4s create mode 100644 wai/pack-conformance/packs/video-ladder-01/package/floor/hi/06d5cd79ba3860cccdc252fe915de0902f941a3c6a000295714f7cab193aa6cf.m4s create mode 100644 wai/pack-conformance/packs/video-ladder-01/package/floor/hi/2f93f0ad449f9cc881b7816c6ab33fd445037d6538b445bcc76431f9c9f91c5b.m4s create mode 100644 wai/pack-conformance/packs/video-ladder-01/package/floor/hi/420ae4c941bba6e12a6c7fdb7d01dc69170ecb4240dffd2e86808ddf87baa12a.m4s create mode 100644 wai/pack-conformance/packs/video-ladder-01/package/floor/hi/576b7d2156c2b595bf48bf34f67996d7f89e75d105f0dc71c9841bb96e6cd0fc.m4s create mode 100644 wai/pack-conformance/packs/video-ladder-01/package/floor/hi/init.mp4 create mode 100644 wai/pack-conformance/packs/video-ladder-01/package/floor/lo/589ad79210bff258db68916876846a2b0d530ea2e44260af66ddc51ad14ce07f.m4s create mode 100644 wai/pack-conformance/packs/video-ladder-01/package/floor/lo/6bba50408f894d0e9d5516a53992fdd2aa86db43ccdc684b69c51a688856a0db.m4s create mode 100644 wai/pack-conformance/packs/video-ladder-01/package/floor/lo/acd166807d05fe4f512407f717659d88613f6d0d360485effe3751504cefbb74.m4s create mode 100644 wai/pack-conformance/packs/video-ladder-01/package/floor/lo/d0f68eb18af5b67736ddccd97ed45c4c0274b0460f6abc8f54940ac378165833.m4s create mode 100644 wai/pack-conformance/packs/video-ladder-01/package/floor/lo/d550ebb204adf0b5a7f310c7d07189e7bed63e12e34e9ed4d9bf96a101d864a9.m4s create mode 100644 wai/pack-conformance/packs/video-ladder-01/package/floor/lo/init.mp4 create mode 100644 wai/pack-conformance/packs/video-ladder-01/package/hls/classic/floor-hi.m3u8 create mode 100644 wai/pack-conformance/packs/video-ladder-01/package/hls/classic/floor-lo.m3u8 create mode 100644 wai/pack-conformance/packs/video-ladder-01/package/hls/classic/master.m3u8 create mode 100644 wai/pack-conformance/packs/video-ladder-01/package/hls/legacy/master.m3u8 create mode 100644 wai/pack-conformance/packs/video-ladder-01/package/hls/mobile/master.m3u8 create mode 100644 wai/pack-conformance/packs/video-ladder-01/package/hls/mobile/wai-v.m3u8 create mode 100644 wai/pack-conformance/packs/video-ladder-01/package/hls/mobile/wai.m3u8 create mode 100644 wai/pack-conformance/packs/video-ladder-01/package/hls/tv/master.m3u8 create mode 100644 wai/pack-conformance/packs/video-ladder-01/package/hls/tv/wai-v.m3u8 create mode 100644 wai/pack-conformance/packs/video-ladder-01/package/hls/tv/wai.m3u8 create mode 100644 wai/pack-conformance/packs/video-ladder-01/package/index-v.wsix create mode 100644 wai/pack-conformance/packs/video-ladder-01/package/moq/catalog.json create mode 100644 wai/pack-conformance/packs/video-ladder-01/package/objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai create mode 100644 wai/pack-conformance/packs/video-ladder-01/package/objects/482fbbb9b39bdb9cbf00515f94269ea591df681ced90b05d97e0df106b49b08e.wai create mode 100644 wai/pack-conformance/packs/video-ladder-01/package/objects/4ab8f747d181632f342a4887b0a8bb86c174409cb625157784e18c5e5559a381.wai create mode 100644 wai/pack-conformance/packs/video-ladder-01/package/objects/618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481.wai create mode 100644 wai/pack-conformance/packs/video-ladder-01/package/objects/61c7c3b7ccab07ed01df5b0d7ca0240598b914dbf2cabe545aa001e8de12d365.wai create mode 100644 wai/pack-conformance/packs/video-ladder-01/package/objects/6ce13c9ef6872caeb7fbe71661ca88bcc463ceac47f109c8c155e34bb1a6f37d.wai create mode 100644 wai/pack-conformance/packs/video-ladder-01/package/objects/b7bf0717e968d7b6be473785c9f66cbb814cde679bceb1ae37f0765308ddee72.wai create mode 100644 wai/pack-conformance/packs/video-ladder-01/package/objects/c2ce1907255a041c388afd06ccd007436368e8d20467fdec2a1eebbb84b03bf2.wai create mode 100644 wai/pack-conformance/packs/video-ladder-01/package/objects/cf842ef3058d3c54d56c0ea3e075efdc77163602b4a1dabcff080e5ea28b9946.wai create mode 100644 wai/pack-conformance/packs/video-ladder-01/package/objects/d382ba093b0595c44a43dc3aad22fc0bed42baeb3488f00dfe3567056a7009c5.wai create mode 100644 wai/pack-conformance/packs/video-ladder-01/package/objects/f525b4450c29153dde0b43e4d143dfb76fcc3884c607b744c8a53fa6a1728580.wai create mode 100644 wai/pack-conformance/packs/video-ladder-01/package/objects/f7f7f4d6af777bfcce09cdda5ecb754ce6bd8dcd2e03ecfc41359cad989b15f7.wai create mode 100644 wai/pack-conformance/packs/video-ladder-01/package/package.receipt.json create mode 100644 wai/pack-conformance/packs/video-ladder-01/package/plan-v.txt create mode 100644 wai/pack-conformance/packs/video-ladder-01/package/policy.json create mode 100644 wai/pack-conformance/packs/video-ladder-01/package/policy.toml create mode 100644 wai/pack-conformance/packs/video-ladder-01/package/stages/legacy.json create mode 100644 wai/pack-conformance/packs/video-ladder-01/package/stages/mobile.json create mode 100644 wai/pack-conformance/packs/video-ladder-01/package/stages/tv.json create mode 100644 wai/pack-conformance/packs/video-ladder-01/policy.toml create mode 100644 wai/pack-conformance/packs/video-repack-01/floor/hi.obu create mode 100644 wai/pack-conformance/packs/video-repack-01/floor/lo.obu create mode 100644 wai/pack-conformance/packs/video-repack-01/key.hex create mode 100644 wai/pack-conformance/packs/video-repack-01/package/LISTING create mode 100644 wai/pack-conformance/packs/video-repack-01/package/dash/classic.mpd create mode 100644 wai/pack-conformance/packs/video-repack-01/package/dash/mobile.mpd create mode 100644 wai/pack-conformance/packs/video-repack-01/package/dash/tv.mpd create mode 100644 wai/pack-conformance/packs/video-repack-01/package/floor/hi/04c948608aaa7b5d78ad5355042a2ff65b0f75d9d4b1ad78f3ebffb886a74be6.m4s create mode 100644 wai/pack-conformance/packs/video-repack-01/package/floor/hi/06d5cd79ba3860cccdc252fe915de0902f941a3c6a000295714f7cab193aa6cf.m4s create mode 100644 wai/pack-conformance/packs/video-repack-01/package/floor/hi/2f93f0ad449f9cc881b7816c6ab33fd445037d6538b445bcc76431f9c9f91c5b.m4s create mode 100644 wai/pack-conformance/packs/video-repack-01/package/floor/hi/420ae4c941bba6e12a6c7fdb7d01dc69170ecb4240dffd2e86808ddf87baa12a.m4s create mode 100644 wai/pack-conformance/packs/video-repack-01/package/floor/hi/576b7d2156c2b595bf48bf34f67996d7f89e75d105f0dc71c9841bb96e6cd0fc.m4s create mode 100644 wai/pack-conformance/packs/video-repack-01/package/floor/hi/init.mp4 create mode 100644 wai/pack-conformance/packs/video-repack-01/package/floor/lo/589ad79210bff258db68916876846a2b0d530ea2e44260af66ddc51ad14ce07f.m4s create mode 100644 wai/pack-conformance/packs/video-repack-01/package/floor/lo/6bba50408f894d0e9d5516a53992fdd2aa86db43ccdc684b69c51a688856a0db.m4s create mode 100644 wai/pack-conformance/packs/video-repack-01/package/floor/lo/acd166807d05fe4f512407f717659d88613f6d0d360485effe3751504cefbb74.m4s create mode 100644 wai/pack-conformance/packs/video-repack-01/package/floor/lo/d0f68eb18af5b67736ddccd97ed45c4c0274b0460f6abc8f54940ac378165833.m4s create mode 100644 wai/pack-conformance/packs/video-repack-01/package/floor/lo/d550ebb204adf0b5a7f310c7d07189e7bed63e12e34e9ed4d9bf96a101d864a9.m4s create mode 100644 wai/pack-conformance/packs/video-repack-01/package/floor/lo/init.mp4 create mode 100644 wai/pack-conformance/packs/video-repack-01/package/hls/classic/floor-hi.m3u8 create mode 100644 wai/pack-conformance/packs/video-repack-01/package/hls/classic/floor-lo.m3u8 create mode 100644 wai/pack-conformance/packs/video-repack-01/package/hls/classic/master.m3u8 create mode 100644 wai/pack-conformance/packs/video-repack-01/package/hls/legacy/master.m3u8 create mode 100644 wai/pack-conformance/packs/video-repack-01/package/hls/mobile/master.m3u8 create mode 100644 wai/pack-conformance/packs/video-repack-01/package/hls/mobile/wai-v.m3u8 create mode 100644 wai/pack-conformance/packs/video-repack-01/package/hls/mobile/wai.m3u8 create mode 100644 wai/pack-conformance/packs/video-repack-01/package/hls/tv/master.m3u8 create mode 100644 wai/pack-conformance/packs/video-repack-01/package/hls/tv/wai-v.m3u8 create mode 100644 wai/pack-conformance/packs/video-repack-01/package/hls/tv/wai.m3u8 create mode 100644 wai/pack-conformance/packs/video-repack-01/package/index-v.wsix create mode 100644 wai/pack-conformance/packs/video-repack-01/package/moq/catalog.json create mode 100644 wai/pack-conformance/packs/video-repack-01/package/objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai create mode 100644 wai/pack-conformance/packs/video-repack-01/package/objects/482fbbb9b39bdb9cbf00515f94269ea591df681ced90b05d97e0df106b49b08e.wai create mode 100644 wai/pack-conformance/packs/video-repack-01/package/objects/4ab8f747d181632f342a4887b0a8bb86c174409cb625157784e18c5e5559a381.wai create mode 100644 wai/pack-conformance/packs/video-repack-01/package/objects/618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481.wai create mode 100644 wai/pack-conformance/packs/video-repack-01/package/objects/61c7c3b7ccab07ed01df5b0d7ca0240598b914dbf2cabe545aa001e8de12d365.wai create mode 100644 wai/pack-conformance/packs/video-repack-01/package/objects/6ce13c9ef6872caeb7fbe71661ca88bcc463ceac47f109c8c155e34bb1a6f37d.wai create mode 100644 wai/pack-conformance/packs/video-repack-01/package/objects/b7bf0717e968d7b6be473785c9f66cbb814cde679bceb1ae37f0765308ddee72.wai create mode 100644 wai/pack-conformance/packs/video-repack-01/package/objects/c2ce1907255a041c388afd06ccd007436368e8d20467fdec2a1eebbb84b03bf2.wai create mode 100644 wai/pack-conformance/packs/video-repack-01/package/objects/cf842ef3058d3c54d56c0ea3e075efdc77163602b4a1dabcff080e5ea28b9946.wai create mode 100644 wai/pack-conformance/packs/video-repack-01/package/objects/d382ba093b0595c44a43dc3aad22fc0bed42baeb3488f00dfe3567056a7009c5.wai create mode 100644 wai/pack-conformance/packs/video-repack-01/package/objects/f525b4450c29153dde0b43e4d143dfb76fcc3884c607b744c8a53fa6a1728580.wai create mode 100644 wai/pack-conformance/packs/video-repack-01/package/objects/f7f7f4d6af777bfcce09cdda5ecb754ce6bd8dcd2e03ecfc41359cad989b15f7.wai create mode 100644 wai/pack-conformance/packs/video-repack-01/package/package.receipt.json create mode 100644 wai/pack-conformance/packs/video-repack-01/package/plan-v.txt create mode 100644 wai/pack-conformance/packs/video-repack-01/package/policy.json create mode 100644 wai/pack-conformance/packs/video-repack-01/package/policy.toml create mode 100644 wai/pack-conformance/packs/video-repack-01/package/stages/legacy.json create mode 100644 wai/pack-conformance/packs/video-repack-01/package/stages/mobile.json create mode 100644 wai/pack-conformance/packs/video-repack-01/package/stages/tv.json create mode 100644 wai/pack-conformance/packs/video-repack-01/parent create mode 100644 wai/pack-conformance/packs/video-repack-01/policy.toml create mode 100644 wai/pack-conformance/supplied_cmaf.py create mode 100644 wai/research/cross-fabric.md create mode 100644 wai/wai-ops-gpu/browser/semantics_reference.mjs create mode 100644 wai/wai-ops-gpu/src/bin/wai-wgsl-vectors.rs create mode 100644 wai/wai-ops-gpu/src/semantics.rs create mode 100644 wai/wai-ops-gpu/src/wgsl/semantics.wgsl create mode 100644 wai/wai-ops-gpu/tests/semantics.rs create mode 100644 wai/wai-ops-gpu/tests/wgsl_rules.rs create mode 100644 wai/wai-pack-gpu/Cargo.lock create mode 100644 wai/wai-pack-gpu/Cargo.toml create mode 100644 wai/wai-pack-gpu/src/lib.rs create mode 100644 wai/wai-pack-gpu/src/wgsl/blake3.wgsl create mode 100644 wai/wai-pack-gpu/src/wgsl/motion.wgsl create mode 100644 wai/wai-pack-gpu/src/wgsl/sse.wgsl create mode 100644 wai/wai-pack-gpu/tests/concurrent.rs create mode 100644 wai/wai-pack-gpu/tests/kernels.rs create mode 100644 wai/wai-pack-gpu/tests/mutants.rs create mode 100644 wai/wai-pack-gpu/tests/support/mod.rs create mode 100644 wai/wai-pack/src/cmaf_read.rs create mode 100644 wai/wai-pack/src/fabric.rs create mode 100644 wai/wai-pack/src/fabric_meter.rs create mode 100644 wai/wai-pack/src/files.rs create mode 100644 wai/wai-pack/src/floor_decode.rs create mode 100644 wai/wai-pack/tests/cmaf.rs create mode 100644 wai/wai-pack/tests/fabric.rs create mode 100644 wai/wai-pack/tests/floor_only.rs create mode 100644 wai/wai-pack/tests/ladder.rs create mode 100644 wai/wai-pack/tests/pack_alloc.rs create mode 100644 wai/wai-pack/tests/repack.rs create mode 100644 wai/wgsl-conformance/.gitattributes create mode 100644 wai/wgsl-conformance/README.md create mode 100644 wai/wgsl-conformance/integer.jsonl diff --git a/.github/workflows/wai-ops-gpu.yml b/.github/workflows/wai-ops-gpu.yml index dfea03d12..d78eacc2e 100644 --- a/.github/workflows/wai-ops-gpu.yml +++ b/.github/workflows/wai-ops-gpu.yml @@ -5,19 +5,25 @@ name: wai-ops-gpu integer operators on GPUs # (64- and 128-bit arithmetic built from 32-bit words), and the integer decoders with # their graphs on the device (wai-rs `ops_gpu`). # -# - metal (the `macos` runner, whose host has a GPU): the arithmetic probe on a +# - metal (the `macos` runner, whose host has a GPU): WGSL's integer semantics +# (wai/wgsl-conformance, determinism-tiers §5, Claiming the tier on a GPU), the +# committed vectors and SplitMix64 cases of every operation, with an edited kernel +# refused at discovery; the arithmetic probe on a # million cases; every graph vector of wai/ops-conformance that the subset covers, # at both widths, against the committed results and the interpreter; the shader # mutants, every one of which the corpus must catch; every committed vector and # refusal fixture of every capability that runs a wai-ops/1 graph, the jpegai/v1 # inputs included, against the decode on the CPU; and the corpus again in a # headless browser's WebGPU, the kernels compiled by the browser's own WGSL -# compiler. WAI_OPS_GPU_EXPECT declares the one adapter the host must offer, and +# compiler, with the semantics suite there and its vectors held to the reference +# compiled to wasm32, in the page and under Node. WAI_OPS_GPU_EXPECT declares the one adapter the host must offer, and # WAI_OPS_GPU_REQUIRE makes an absent adapter a failure, never a skip; each step # then requires the report lines with their counts, so a filtered or empty run # fails too. -# - checks (`linux`, a container with no GPU): the crate and its tests build, the -# device tests print SKIPPED and pass, and the same tests under +# - checks (`linux`, a container with no GPU): the crate and its tests build; the +# WGSL rules on naga's IR (tests/wgsl_rules.rs) and the committed semantics vectors +# against the reference, which need no adapter, pass; the device tests print SKIPPED +# and pass, and the same tests under # WAI_OPS_GPU_REQUIRE=1 fail: an absent adapter is not a pass. The browser module # builds for wasm32-unknown-unknown; the bench tool builds. # @@ -36,6 +42,7 @@ on: - 'wai/wai-ops-gpu/**' - 'wai/wai-ops/**' - 'wai/ops-conformance/**' + - 'wai/wgsl-conformance/**' # The decoders whose graphs run on the device, and what they decode. - 'wai/wai-rs/Cargo.toml' - 'wai/wai-rs/Cargo.lock' @@ -120,7 +127,7 @@ jobs: fi else grep -q '^ops-gpu corpus: SKIPPED' "$rep" || { echo "::error::the corpus test printed neither a result nor SKIPPED"; exit 1; } - if WAI_OPS_GPU_REQUIRE=1 cargo test --locked --release --test corpus --test arith --test mutants > "$RUNNER_TEMP/require.log" 2>&1; then + if WAI_OPS_GPU_REQUIRE=1 cargo test --locked --release --test corpus --test arith --test mutants --test semantics > "$RUNNER_TEMP/require.log" 2>&1; then echo "::error::with no adapter, the device tests passed under WAI_OPS_GPU_REQUIRE=1"; exit 1 fi grep -q 'WAI_OPS_GPU_REQUIRE is set' "$RUNNER_TEMP/require.log" \ @@ -165,16 +172,21 @@ jobs: : > "$WAI_OPS_GPU_REPORT" nice -n 10 cargo test --locked --release -- --nocapture --test-threads=1 2>&1 | tee "$log" k=gpu-metal-0 - # Six tests in four binaries: the library's one, arith's two, corpus's two and - # mutants' one, none filtered, ignored or failed. + # Sixteen tests in six binaries: the library's four, arith's two, corpus's two, + # mutants' one, semantics' three and wgsl_rules' four, none filtered, ignored or + # failed. ran=$(awk '/^test result: ok\. [0-9]+ passed; 0 failed; 0 ignored; 0 measured; 0 filtered out/ { n += $4 } END { print n + 0 }' "$log") - [ "$ran" = 6 ] || { echo "::error::$ran tests ran and passed, not 6"; exit 1; } + [ "$ran" = 16 ] || { echo "::error::$ran tests ran and passed, not 16"; exit 1; } ! grep -q '^test result: FAILED' "$log" || { echo "::error::a test failed"; exit 1; } grep -qxF "ops-gpu adapters: as declared ($k)" "$WAI_OPS_GPU_REPORT" || { echo "::error::the adapters found are not $k"; exit 1; } grep -qE "^ops-gpu arith: key=$k .* cases=[0-9]+ words=[0-9]+ equal$" "$WAI_OPS_GPU_REPORT" || { echo "::error::no probe result for $k"; exit 1; } grep -qE "^ops-gpu corpus: key=$k .* acc32 vectors=[1-9][0-9]* decodes=[1-9][0-9]*; acc64 vectors=[1-9][0-9]* decodes=[1-9][0-9]*; .* mismatches=0 errors=0 " "$WAI_OPS_GPU_REPORT" \ || { echo "::error::no equal corpus run for $k"; exit 1; } grep -qxF "ops-gpu mutants: key=$k killed 18 of 18" "$WAI_OPS_GPU_REPORT" || { echo "::error::a mutant survived on $k, or the mutant test did not run"; exit 1; } + grep -qE "^ops-gpu semantics: key=$k .* committed=[1-9][0-9]* cases=[1-9][0-9]* guarded=[1-9][0-9]* differ=0 " "$WAI_OPS_GPU_REPORT" \ + || { echo "::error::no run of WGSL's integer semantics on $k with every guarded case equal"; exit 1; } + grep -qE "^ops-gpu semantics mutant: key=$k refused: the WGSL semantics suite: rem_i32 " "$WAI_OPS_GPU_REPORT" \ + || { echo "::error::the edited semantics kernel was not refused on $k"; exit 1; } - name: The jpegai/v1 inputs shell: bash run: bash wai/tools/wai_jpegai_fetch_e2e_inputs.sh "$RUNNER_TEMP/jpegai" @@ -238,7 +250,14 @@ jobs: nice -n 10 cargo build --locked --release --target wasm32-unknown-unknown t="${CARGO_TARGET_DIR:-target}" wasm-bindgen --target web --out-dir pkg --out-name wai_ops_gpu_browser "$t/wasm32-unknown-unknown/release/wai_ops_gpu_browser.wasm" + # The committed semantics vectors against the reference compiled to wasm32, + # under Node, with no GPU. + node semantics_reference.mjs log="$RUNNER_TEMP/browser.log" nice -n 10 node run.mjs 2>&1 | tee "$log" grep -qE '^browser webgpu: key=gpu-webgpu-[0-9a-f]+ .* acc32 vectors=[1-9][0-9]* decodes=[1-9][0-9]*; acc64 vectors=[1-9][0-9]* decodes=[1-9][0-9]*; .* mismatches=0 errors=0$' "$log" \ || { echo "::error::no equal corpus run on a GPU adapter in the browser"; exit 1; } + grep -qE '^wasm reference: target=wasm32 .* cases=[1-9][0-9]* equal$' "$log" \ + || { echo "::error::the semantics vectors are not the wasm32 reference's in the page"; exit 1; } + grep -qE '^browser webgpu semantics: key=gpu-webgpu-[0-9a-f]+ .* guarded=[1-9][0-9]* differ=0 ' "$log" \ + || { echo "::error::no run of WGSL's integer semantics on a GPU adapter in the browser with every guarded case equal"; exit 1; } diff --git a/.github/workflows/wai-pack.yml b/.github/workflows/wai-pack.yml index d1eca1656..2af5fb42e 100644 --- a/.github/workflows/wai-pack.yml +++ b/.github/workflows/wai-pack.yml @@ -6,7 +6,11 @@ name: wai-pack # - legs: on each architecture of the fleet, clippy with float arithmetic denied (no # float decides anything in a package), the tests in release with a floor on how many # each target lists, and the corpus recomputed by the crate: the golden packages -# packed again byte for byte and verified, every mutation's reason. +# packed again byte for byte and verified, every mutation's reason. On the macOS leg, +# whose host has a GPU, the steps a GPU runs (packaging §11.6): wai-pack-gpu's kernels +# against their references and every edited kernel caught, and wai-pack's fabric +# differential (every golden packed on the GPU byte for byte, every verdict the CPU's), +# an absent adapter a failure there (WAI_PACK_GPU_REQUIRE), never a skip. # - independent: the corpus recomputed by its second implementation, written in Python # from the extension text and sharing no code with wai-pack, the golden packages # verified and re-derived from their sources among it (every refinement layer and @@ -20,7 +24,8 @@ name: wai-pack # # Push filters match the push's delta, so every path a build or a verifier reads is # listed: the crate, the wai crate it builds on, the corpus, the BLAKE3, integer payload, -# staged-delivery and staged-measurement verifiers and the registry export pack_verify.py +# staged-delivery and staged-measurement verifiers, the claim verifier (a metered +# package's claim) and the OER verifier it imports, the registry export pack_verify.py # reads, and this file. concurrency: @@ -31,10 +36,13 @@ on: pull_request: paths: - 'wai/wai-pack/**' + - 'wai/wai-pack-gpu/**' - 'wai/wai-rs/**' - 'wai/pack-conformance/**' - 'wai/claim-conformance/_blake3.py' - 'wai/claim-conformance/_ed25519.py' + - 'wai/claim-conformance/claim_verify.py' + - 'wai/oer-conformance/oer2_verify.py' - 'wai/int-payload-conformance/int_payload_verify.py' - 'wai/staged-conformance/staged_verify.py' - 'wai/staged-measure-conformance/sim_verify.py' @@ -126,11 +134,17 @@ jobs: echo "$target: $n tests (floor $floor)" [ "$n" -ge "$floor" ] || { echo "::error::$target lists $n tests, under its floor of $floor"; fail=1; } done <<'EOF' - --lib 34 + --lib 39 + --test=cmaf 4 --test=conformance 1 - --test=packs 7 + --test=fabric 3 + --test=floor_only 2 + --test=ladder 3 + --test=pack_alloc 1 + --test=packs 8 --test=review 9 - --test=refusals 5 + --test=refusals 6 + --test=repack 3 --test=scenecut 3 --test=source_alloc 1 --test=staged 10 @@ -141,6 +155,36 @@ jobs: working-directory: wai/wai-pack run: cargo run --release --locked --bin wai-pack -- conformance check ../pack-conformance + # The steps a GPU runs (packaging §11.6), on the one leg whose host has a GPU. Each + # test prints the adapter it ran on; the step requires those lines, so a run that + # found no adapter, or filtered the tests away, fails. + - name: wai-pack-gpu, clippy and its kernels against their references (Metal) + if: matrix.os == 'macos' + shell: bash + working-directory: wai/wai-pack-gpu + env: + WAI_PACK_GPU_REQUIRE: '1' + run: | + set -euo pipefail + cargo clippy --locked --all-targets -- -D warnings + cargo test --release --locked -- --nocapture 2>&1 | tee "$RUNNER_TEMP/gpu.txt" + grep -q 'motion search, 54 frames, every vector the text' "$RUNNER_TEMP/gpu.txt" + grep -q 'every hash the reference crate' "$RUNNER_TEMP/gpu.txt" + [ "$(grep -c '^caught: ' "$RUNNER_TEMP/gpu.txt")" -ge 12 ] + - name: wai-pack's fabric differential on the GPU (Metal) + if: matrix.os == 'macos' + shell: bash + working-directory: wai/wai-pack + env: + WAI_PACK_GPU_REQUIRE: '1' + run: | + set -euo pipefail + cargo clippy --locked --all-targets --features gpu,fabric-meter -- -D warnings + cargo test --release --locked --features gpu --test fabric -- --nocapture 2>&1 | tee "$RUNNER_TEMP/fabric.txt" + grep -q 'the search on the GPU: ' "$RUNNER_TEMP/fabric.txt" + grep -q 'verdicts, each the CPU' "$RUNNER_TEMP/fabric.txt" + grep -q 'test result: ok. 7 passed' "$RUNNER_TEMP/fabric.txt" + independent: name: wai-pack · independent verifier (Python) needs: relevant @@ -163,6 +207,12 @@ jobs: working-directory: wai shell: bash run: python3 pack-conformance/pack_verify.py pack-conformance + # The same checks with the hashes and decodes run ahead in worker processes + # (--jobs): every check and its reason are the serial run's. + - name: pack_verify.py --jobs 2 + working-directory: wai + shell: bash + run: python3 pack-conformance/pack_verify.py --jobs 2 pack-conformance - name: Install Rust 1.98.0 shell: bash run: | @@ -207,6 +257,13 @@ jobs: set -euo pipefail python3 ../pack-conformance/stage_diff.py target/debug/wai-pack 1 1000 python3 ../pack-conformance/stage_diff.py target/release/wai-pack 2 3000 + # The supplied CMAF reader differentially (packaging §7.7): seeded alterations of a + # media muxer's segments and of §7.6's writer's, every verdict and accepted segment's + # samples of wai-pack's reader equal to pack_verify.py's. + - name: cmaf_diff.py, wai-pack against pack_verify.py + shell: bash + working-directory: wai/wai-pack + run: python3 ../pack-conformance/cmaf_diff.py target/release/wai-pack 1 3000 # A still's reader differentially: the zlib library's own streams, dynamic blocks # built on each of RFC 1951's and zlib's code-set rules, and their alterations, every # verdict of wai-pack's reader equal to pack_verify.py's, which inflates with @@ -232,27 +289,31 @@ jobs: SUDO=""; [ "$(id -u)" -ne 0 ] && SUDO="sudo" $SUDO apt-get update -qq $SUDO apt-get install -y -qq ffmpeg - # Test 14: the golden's init.mp4 and its fragments, in its floor playlist's order, - # read as one AV1 track of every frame of the source, with a key frame at each piece - # start of the plan and nowhere else, and decode without an error. + # Test 14: each golden floor's init.mp4 and its fragments, in its floor playlist's + # order, read as one AV1 track of every frame of the source, with a key frame at each + # piece start of the plan and nowhere else, and decode without an error; a ladder + # golden has one floor playlist per floor rung (packaging §7.1), each read so. - name: The goldens' floors read and decode shell: bash working-directory: wai/pack-conformance/packs run: | set -euo pipefail - for g in video-base-01 video-staged-01; do + for g in video-base-01 video-staged-01 video-ladder-01 video-cmaf-01 video-floor-only-02; do ( cd "$g/package" - tmp=$(mktemp -d) - cat floor/v/init.mp4 $(grep -v '^#' hls/classic/floor-v.m3u8 | sed 's#^\.\./\.\./##') > "$tmp/floor.mp4" - ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=codec_name,width,height,nb_read_frames -of default=nw=1 "$tmp/floor.mp4" | tee "$tmp/probe.txt" - grep -qx 'codec_name=av1' "$tmp/probe.txt" - grep -qx 'nb_read_frames=200' "$tmp/probe.txt" - keys=$(ffprobe -v error -select_streams v:0 -show_entries packet=pts,flags -of csv=p=0 "$tmp/floor.mp4" | awk -F, '$2 ~ /K/ {print $1}' | tr '\n' ' ') - want=$(tr '\n' ' ' < plan-v.txt) - echo "$g key frames: $keys" - [ "$keys" = "$want" ] || { echo "::error::$g: key frames at $keys; the plan says $want"; exit 1; } - ffmpeg -v error -xerror -i "$tmp/floor.mp4" -f null - - echo "$g: the floor reads as one AV1 track of 200 frames, a key frame at each piece start" ) + for pl in hls/classic/floor-*.m3u8; do + f=$(basename "$pl" .m3u8); f=${f#floor-} + tmp=$(mktemp -d) + cat "floor/$f/init.mp4" $(grep -v '^#' "$pl" | sed 's#^\.\./\.\./##') > "$tmp/floor.mp4" + ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=codec_name,width,height,nb_read_frames -of default=nw=1 "$tmp/floor.mp4" | tee "$tmp/probe.txt" + grep -qx 'codec_name=av1' "$tmp/probe.txt" + grep -qx 'nb_read_frames=200' "$tmp/probe.txt" + keys=$(ffprobe -v error -select_streams v:0 -show_entries packet=pts,flags -of csv=p=0 "$tmp/floor.mp4" | awk -F, '$2 ~ /K/ {print $1}' | tr '\n' ' ') + want=$(tr '\n' ' ' < plan-v.txt) + echo "$g $f key frames: $keys" + [ "$keys" = "$want" ] || { echo "::error::$g $f: key frames at $keys; the plan says $want"; exit 1; } + ffmpeg -v error -xerror -i "$tmp/floor.mp4" -f null - + echo "$g $f: the floor reads as one AV1 track of 200 frames, a key frame at each piece start" + done ) done licences: diff --git a/wai/CHANGELOG.md b/wai/CHANGELOG.md index 9fca10580..14f8cd47f 100644 --- a/wai/CHANGELOG.md +++ b/wai/CHANGELOG.md @@ -6,6 +6,159 @@ wire format may change and such changes are recorded here. ## v0.4.0 — current +### GPUs: when `decode-equivalence` may be claimed, and WGSL's integer semantics on every adapter + +- **Claiming the tier on a GPU** ([determinism-tiers](extensions/determinism-tiers.md) + §5). A decoder claims `decode-equivalence` for output whose graphs ran on a GPU only + when every shader module that ran them is integer only (no floating-point type, so no + reassociation or fusion can change a result), uses no subgroup or quad operation and + enables no extension, has no result that depends on scheduling (one atomic kind, its + result unused; no out-of-bounds access), and is translated with the translator's integer + guards on: signed arithmetic through unsigned, guarded division and remainder, `abs` and + negation of the most negative value. Where the translator does not produce WGSL's + result, the module does not reach the operation: naga 30.0.1 passes shift amounts to + MSL, HLSL and SPIR-V unreduced and writes integer `clamp` as MSL's `clamp`, so every + shift amount is masked below 32 and every `clamp` has literal bounds in order. Before an + adapter runs a graph it passes WGSL's integer semantics vectors and the implementation's + probe; the claim names the adapter and the translator. +- **WGSL's integer semantics vectors** (`wgsl-conformance/`). Every integer operation WGSL + defines on `i32`, `u32` and their two-component vectors, at the cases WGSL defines at run + time and MSL, HLSL and SPIR-V leave open, each result written from the WGSL text + (Candidate Recommendation Draft, 21 October 2026). Cases the kernels never reach are + marked `unguarded`: reported, not deciding. +- **`wai-ops-gpu`.** Discovery runs the semantics suite on each adapter after the + arithmetic probe, and refuses an adapter that differs on a guarded case. Every run-time + shift amount in the kernels is now masked (`& 31u`) and the two run-time clamps are + `min(max(…))`; WGSL gives the same result either way, and the translated code is then + defined on every backend. `tests/wgsl_rules.rs` holds every shipped module to the + conditions on naga's IR and in its MSL and HLSL translations, with planted violations + refused; the browser page runs the suite through the browser's WGSL compiler and checks + the vectors against the reference compiled to wasm32. Measured on Metal, a browser's + WebGPU, Vulkan on two vendors' GPUs on Linux and Windows, and DX12 on both on Windows: + every guarded case equal, every unguarded one too, and the capability corpora decoding + with their graphs on the device to the CPU decode's bytes. + +### Packaging: each step on the fabric that does it with the least energy + +- **Steps and fabrics** ([packaging](extensions/packaging.md) §11.6). The computations of + a pack and a verify are named steps (`source-read`, `segment`, `base-search`, + `base-code`, `refine-code`, `sse`, `object-hash`, `digest`, `floor-read`, + `floor-decode`, `index`, `io`, and `source-decode` before a pack), and each may run on a + CPU, a GPU, a media engine or a neural engine. Every step is defined in integers (and + AV1 decoding by its decoding process), so where it runs changes no byte of a package + and no verdict: §11.2 holds across fabrics. A packager runs a step on a backend only + after it has given the reference's output on qualifying inputs; a verifier computes a + check on another fabric only where the package states the value it compares with, and + decides any mismatch again on the reference. No hardware encoder computes a WAI step; a + floor encoded on one is a §7.5 floor. A floor states no decoded-output digest, so a + hardware decode never decides a floor verdict. +- **The fabric record** ([jwp-receipts](extensions/jwp-receipts.md) §2.4.8, + [energy-measurement](extensions/energy-measurement.md) §6.3). A measurement claim may + carry `fabrics`: each step with every fabric that ran it and its backend, and the + figure divided into one share per fabric, attributed `task` (the operating system's + account of the work's own energy) or `rail` (the fabric's whole rail, the work its sole + user). A rail shared with other work is never divided by busy time. `fabrics` is the one + claim member that is absent rather than null, so every existing claim and package keeps + its bytes. New reasons: `measurement_fabric_unknown`, `measurement_fabric_order`, + `measurement_fabric_unmetered`, `measurement_fabric_unused`, `measurement_fabric_sum`. +- **wai-pack** places each call of a step on the fabric whose measured cost for its size + is least (`--fabric cpu|gpu|auto:`, `wai-pack fabric list|calibrate`), the + CPU on a tie, where unmeasured, and for every call another fabric does not take. With + feature `gpu`, the motion search, SSE and the object hashes run on a GPU through + **wai-pack-gpu**, exact integer WGSL kernels through wgpu (Metal, Vulkan, DX12). With + feature `fabric-meter` on macOS, `--meter fabric` meters a pack per fabric without + privileges and writes the claim's fabric record. `wai-pack floor-decode` decodes a + package's floors with libdav1d or the media engine and prints each piece's digest, for + comparing decoders. The Python verifiers stay on the CPU and share no code with wai-rs; + `claim_verify.py` and `pack_verify.py` read the fabric record. +- **Conformance.** Claim vectors of the fabric record appended after the existing ones, which a test + pins by digest. wai-pack-gpu's kernels are held to references transcribed from the text + and every edited kernel is caught; wai-pack's fabric differential packs every golden on + a GPU byte for byte and gives every package and staged mutation the CPU's verdict. + +### Packaging: a title's whole ladder in one package + +- **Several floor rungs per package** ([packaging](extensions/packaging.md) §7.1). A + component may have any number of floor rungs; each piece then has one floor object per + floor rung, in ladder order, all over one base, so the base of a ladder is coded once. + Each floor rung has a **floor name**: the component's id when it has one floor rung (so + existing packages are unchanged, byte for byte), the rung's id when it has several. The + name names the supplied stream (`.obu`, §7.3), the CMAF files (`floor//`, + §7.6), the floor playlist (`hls/classic/floor-.m3u8`), the DASH representation + (`-floor`) and the MoQ track (`/floor`); a floor name that cannot be one path + segment, or two equal in any case, is refused (`pack-id`). The classical master lists one + variant per floor rung; with several, `dash/classic.mpd` carries each representation's + codecs and size on the representation. The verifier holds the *k*-th floor entry of each + piece to the *k*-th floor rung. +- **A re-pack from a parent** (§11.5). A packer may take every piece's base and + refinements from an earlier package instead of coding them (`wai-pack pack + --base-from `), so a title's integer base is coded once and taken by every + package made from the same source after it. It refuses a parent that does not verify + (`repack-parent-invalid`), one whose pieces, kinds, rungs, parameters or deadlines are + not this pack's (`repack-parent-mismatch`), and one whose prefixes do not reconstruct + this source with the SSE their entries state (`repack-source-mismatch`). Its receipt + names the parent with parent kind `re-pack`, and its other files are those of a pack + that codes. A verifier holding the parent checks the re-pack against it (`wai-pack + verify --parent`). +- **A floor that is the ladder's own CMAF segments** (§7.7). With + `floor.supplied_form = "cmaf"` (absent, the OBU form; existing policy digests are + unchanged), a supplied floor is an existing ladder's `init.mp4` and media segments, one + segment per piece, read box by box: the floor's temporal units are the samples, each + with a temporal delimiter before it. The package's floor files are the ladder's files, + byte for byte, named by their SHA-256, and the package carries the supplied floor's + listing (`floor.listing`), whose SHA-256 the policy pins, so the receipt binds every + byte of the ladder. A server can hold those files once for the classic site and the + package. New refusals: `floor-cmaf-malformed`, `floor-cmaf-timing`, `floor-cmaf-pieces`. + `wai-pack pack --link-supplied` writes them as hard links to the supplied files. +- **A floor-only profile** (§7.8). A component of `profile = "floor-only"` is its floor + rungs alone: no integer base, no refinement, no source (`policy-floor-only` + otherwise). Its pieces are its first floor rung's media segments (the CMAF form) or + shown key frames (the OBU form), each at most `max_ms` (`floor-piece-length`); each piece + is its floor objects, which present no base and so carry no `derived_from`, and its kind + is `none` (stage index kind 6). It attests delivery: the receipt binds every floor + object and the supplied floor's bytes, and the verifier holds them to the AV1 stream's + structure and the CMAF files; it states no decoded output, no fidelity to a source and + no primary. The stage index now requires a floor's `derived_from` exactly when its piece + has a base (`floor-derived-from`). +- **The independent verifier at scale** (`pack_verify.py`). Each object is hashed once, + and `http_verify.resolve_uri` finds an object by its content id rather than by hashing + every object for every URI. `--jobs N` runs every object's hash and every base's decode + and layers in N worker processes, piece by piece, ahead of checks that are unchanged in + order and reason. `--native-blake3` takes BLAKE3 from the `blake3` module after it + agrees with the pure implementation on the published vectors (opt-in: that module is + the implementation wai-rs links). `--package ` verifies one package without its + sources or its key. **The measurement claim is checked** (§9.4): the claim corpus's + verifier reads it, and it is held to the receipt's figure, class, evidence and signer, so + a correctly metered package passes; `package-mutations/` gains a metered package (`ok`), + a claim about another figure (`measurement-claim-invalid`) and none + (`measurement-claim-missing`). +- **§7.3: key-frame sequence headers** (an informative note). A floor taken from an + existing ladder needs a sequence header in every key-frame unit; a producer that puts + one back must put back the stream's own first sequence header, byte for byte, not the + sample entry's `av1C` header, which can differ in its tool flags and is refused + (`floor-av1-malformed`). `tests/refusals.rs` holds the rule. +- **The DASH renderer** (`wai::http_binding::dash`) writes a representation's own + `@codecs`, `@width` and `@height` when given, and an adaptation set's `@codecs` only when + every representation shares it. +- **A streaming on-demand packer** (§11.4). The packer reads the source twice, a frame + at a time, once to cut it and once to code it, and each floor stream a temporal unit at + a time, and `wai-pack pack` writes each file into its directory as it is made, reading + objects back for the catalogs. What it holds no longer grows with the title, but for a + record per piece and per entry and a byte per frame per floor; a refusal removes what it + wrote. `--jobs ` codes n pieces at once, each alone, so the package is the same for + any n. A source that does not read the same twice is refused (`pack-source-changed`). + `tests/pack_alloc.rs` packs a source eight times as long in the same peak memory. +- **Conformance.** `packs/video-ladder-01/` (two floors, one at half size, over + `video-base-01`'s bases, which are the same objects), `ladder-mutations/`, + `packs/video-repack-01/` (the ladder re-packed from `video-base-01`), + `packs/video-cmaf-01/` and `cmaf-mutations/` (the ladder's streams as a muxer's fMP4 + segments), `packs/video-floor-only-01/` and `-02/` (both forms, no base), index cases of + a piece of floors alone, `tests/ladder.rs`, `tests/repack.rs`, `tests/cmaf.rs`, + `tests/floor_only.rs`, and the independent + verifier `pack_verify.py`, with a box reader of its own, which re-derives every golden + from its sources and checks the re-pack against its parent. `supplied_floor.py` writes + one stream per floor rung; `supplied_cmaf.py` the CMAF form. + ### `wai.media.upscale`: super-resolution as an exact derivation, residuals against it, and an account of sink-made pictures - **The extension** ([exact-upscale](extensions/exact-upscale.md)) registers the record diff --git a/wai/claim-conformance/README.md b/wai/claim-conformance/README.md index 31933c47a..b7086d78c 100644 --- a/wai/claim-conformance/README.md +++ b/wai/claim-conformance/README.md @@ -136,6 +136,14 @@ the figure with its class. The vectors cover: - **The labelled delivery leaf:** an `energy` claim against an object whose leaf carries a class, agreeing, and disagreeing in figure, class or evidence; an `OnChipCounter` label with no filtering state reads as `Unknown`. +- **The fabric record (§2.4.8 rule 6, energy-measurement §6.3),** appended after every + earlier vector, which a test pins by digest: accepted, a figure divided between the CPU + (`task`) and a GPU (`rail`) over steps that ran on each; at step 2, a record written + `null` (a report without one has no member), a step with a member it does not define, + an empty backend and a share written as a string; at step 4, a fabric and an + attribution outside §6.3, a share divided by GPU time (which names no attribution), + steps out of order, a fabric twice, no step, a step on an unmetered fabric, a share on + a fabric no step ran on, and shares that do not sum to the figure. ## What a party observed of a stage set: `stage` and `delivery-gap` diff --git a/wai/claim-conformance/claim_verify.py b/wai/claim-conformance/claim_verify.py index a0098ecad..e202ea771 100644 --- a/wai/claim-conformance/claim_verify.py +++ b/wai/claim-conformance/claim_verify.py @@ -220,6 +220,13 @@ GAP_REASONS = ("delivery-timeout", "discretion", "not-received") # §2.4.11 BRACKET = ["idle", "busy", "window_us", "completions", "in_flight", "opening"] SUMMARY = ["n", "mean_uw", "sd_uw", "live_intervals", "longest_live_run"] BUILD = ["profile", "toolchain", "target"] +# §2.4.8's fabric record (energy-measurement §6.3): the one member of a claim that is absent +# rather than null, so a report sealed before it existed keeps its bytes. +FABRIC_RECORD = ["steps", "shares"] +FABRIC_STEP = ["step", "fabric", "backend"] +FABRIC_SHARE = ["fabric", "joules_micro", "attribution"] +FABRICS = ["cpu", "gpu", "media", "neural"] +ATTRIBUTIONS = ["rail", "task"] PREDICTION = ["predictor", "descriptor_hash", "predicted_joules_micro"] # energy-measurement §6.1: profile -> (subject_type, carries several figures, an Ed25519 # key signs the figure, names a group). @@ -399,7 +406,7 @@ def check_body(cls, b): else: raise Reject(2, "field_type") return - members(b, BODY[cls], 2) + members(b, BODY[cls] + (["fabrics"] if cls == "measurement" and "fabrics" in b else []), 2) if cls == "reconstruct-session": check_session_body(b) return @@ -489,6 +496,8 @@ def check_body(cls, b): need(bd["toolchain"] is None or isinstance(bd["toolchain"], str), 2) need(bd["target"] is None or is_token(bd["target"]), 2) need(b["power_reader"] is None or isinstance(b["power_reader"], str), 2) + if "fabrics" in b: + check_fabric_shape(b["fabrics"]) else: need(is_uri(b["vocabulary"]), 2) for k in ("op_requested", "op_committed", "op_delivered"): @@ -1410,6 +1419,46 @@ def acquisition(b): need(u is None and f is None and ref is None, 4, ev) +def check_fabric_shape(f): + """§2.4.8's fabric record at step 2: an object of `steps` and `shares`, every row of + one an object of its members before any row's values, the terms tokens, a backend a + non-empty string, a share's figure an integer. Never null.""" + need(isinstance(f, dict), 2) + members(f, FABRIC_RECORD, 2) + for key, cols in (("steps", FABRIC_STEP), ("shares", FABRIC_SHARE)): + rows = f[key] + need(isinstance(rows, list), 2) + for row in rows: + need(isinstance(row, dict), 2) + members(row, cols, 2) + for row in rows: + if key == "steps": + need(all(isinstance(row[k], str) for k in cols), 2) + need(is_token(row["step"]) and is_token(row["fabric"]) and row["backend"] != "", 2) + else: + need(isinstance(row["fabric"], str) and isinstance(row["attribution"], str), 2) + need(is_token(row["fabric"]) and is_token(row["attribution"]) and is_int(row["joules_micro"]), 2) + + +def fabric_rules(f, joules): + """§2.4.8 rule 6: the vocabularies of energy-measurement §6.3, the order (steps by + term then fabric, shares by fabric, each once, neither empty), every fabric a step + names metered, every share's fabric running a step, and the shares summing to the + figure.""" + st, sh = f["steps"], f["shares"] + need(all(s["fabric"] in FABRICS for s in st) and all(s["fabric"] in FABRICS and s["attribution"] in ATTRIBUTIONS for s in sh), + 4, "measurement_fabric_unknown") + keys = [(s["step"].encode(), FABRICS.index(s["fabric"])) for s in st] + ranks = [FABRICS.index(s["fabric"]) for s in sh] + need(st and sh and all(a < b for a, b in zip(keys, keys[1:])) and all(a < b for a, b in zip(ranks, ranks[1:])), + 4, "measurement_fabric_order") + metered = {s["fabric"] for s in sh} + ran = {s["fabric"] for s in st} + need(ran <= metered, 4, "measurement_fabric_unmetered") + need(metered <= ran, 4, "measurement_fabric_unused") + need(sum(s["joules_micro"] for s in sh) == joules, 4, "measurement_fabric_sum") + + def class_rules(c): """§3.1 step 4 — §2.4.5-§2.4.7 and §2.6.""" cls, b = c["class"], c["body"] @@ -1435,6 +1484,8 @@ def class_rules(c): 4, "measurement_no_power_reader") if b["bracket"] is not None: bracket_rules(b["bracket"], b["joules_micro"], b["energy_provenance"], b["energy_uncertainty"]) + if "fabrics" in b: + fabric_rules(b["fabrics"], b["joules_micro"]) elif cls == "operating-point": figure_rules(c) pts = [b[k] for k in ("op_requested", "op_committed", "op_delivered")] diff --git a/wai/claim-conformance/vectors.json b/wai/claim-conformance/vectors.json index 23f5a1233..cbde2b137 100644 --- a/wai/claim-conformance/vectors.json +++ b/wai/claim-conformance/vectors.json @@ -23534,6 +23534,164 @@ "step": 4, "reason": "session_switch_invalid" } + }, + { + "name": "measurement_fabrics_accept", + "about": "a ModelBased figure of 9,000 uJ divided by fabric: the motion search ran on the CPU and on a GPU, the base's coding on the CPU, the object hashes on the GPU; the CPU's share is the task's own and the GPU's its whole rail, the work its sole user, and the shares sum to the figure", + "procedure": "claim", + "receipt": "{\"body\":{\"bracket\":null,\"build\":{\"profile\":\"release\",\"target\":\"x86_64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.98.0 (example)\"},\"energy_calibration_ref\":null,\"energy_counter_filtering\":null,\"energy_provenance\":\"ModelBased\",\"energy_uncertainty\":null,\"fabrics\":{\"shares\":[{\"attribution\":\"task\",\"fabric\":\"cpu\",\"joules_micro\":6500},{\"attribution\":\"rail\",\"fabric\":\"gpu\",\"joules_micro\":2500}],\"steps\":[{\"backend\":\"claim-conformance: a cpu backend\",\"fabric\":\"cpu\",\"step\":\"base-code\"},{\"backend\":\"claim-conformance: a cpu backend\",\"fabric\":\"cpu\",\"step\":\"base-search\"},{\"backend\":\"claim-conformance: a gpu backend\",\"fabric\":\"gpu\",\"step\":\"base-search\"},{\"backend\":\"claim-conformance: a gpu backend\",\"fabric\":\"gpu\",\"step\":\"object-hash\"}]},\"figure_index\":null,\"figure_profile\":\"moq-jwp:claim-link\",\"group\":null,\"joules_micro\":9000,\"power_reader\":\"reader:example\"},\"class\":\"measurement\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":1,\"sig\":\"ade1d72401ae9890ddb985640c3939d4a7366a47ff8ec64dd9d3a1b197f160bdbf5e5d54a45d464b86d981762c8d8b70c189ba67d6f0fe0f0fa3498829949200\",\"signer_id\":\"did:example:meter\",\"signer_pubkey\":\"a09aa5f47a6759802ff955f8dc2d2a14a5c99d23be97f864127ff9383455a4f0\",\"subject\":\"a2316cae02860ddb6643af9b2213dcc4768867fbcd46e32e17ad7aabccf8758e\",\"subject_type\":\"receipt\"}", + "context": { + "figure": { + "claim": "{\"body\":{\"coverage\":\"Whole\",\"energy_calibration_ref\":null,\"energy_counter_filtering\":null,\"energy_provenance\":\"ModelBased\",\"energy_uncertainty\":null,\"grade\":\"derived\",\"joules_micro\":9000,\"method\":\"https://transaction.science/wai/extensions/energy-measurement\",\"oer_receipt\":null,\"work_unit\":\"subpixel\",\"work_units\":49152},\"class\":\"energy\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"81c6ff685f4bf15dc35e0ca55e9823d274185c5ac26299e3c803d90f51fc7b82f87151748d2ed4d755c04ece8a3b77b166f97ddf5e0810da11fd9d96663e1e06\",\"signer_id\":\"did:example:meter\",\"signer_pubkey\":\"a09aa5f47a6759802ff955f8dc2d2a14a5c99d23be97f864127ff9383455a4f0\",\"subject\":\"5bb20a10b980be8c6d95915394f6e89cd49c16d0f5e94cd87c0ec6ce37bcfc5e\",\"subject_type\":\"object\"}" + } + }, + "expected": { + "outcome": "accept", + "link_hash": "18e3adfd42cfe7e95a5cab676508039a3228201cc9b8dfab627a7a13b3acec59" + } + }, + { + "name": "measurement_fabrics_null", + "about": "a fabric record written null: a report without one has no member, so it has one canonical form", + "procedure": "claim", + "receipt": "{\"body\":{\"bracket\":null,\"build\":{\"profile\":\"release\",\"target\":\"x86_64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.98.0 (example)\"},\"energy_calibration_ref\":null,\"energy_counter_filtering\":null,\"energy_provenance\":\"ModelBased\",\"energy_uncertainty\":null,\"fabrics\":null,\"figure_index\":null,\"figure_profile\":\"moq-jwp:claim-link\",\"group\":null,\"joules_micro\":9000,\"power_reader\":\"reader:example\"},\"class\":\"measurement\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":1,\"sig\":\"d08ee5e9f8b1725316150be5e8eb2c3aa44dd384abf55ce6cb23497cc8f24533a5a4c7b9b54b1df0d51de1308b1a931220f06f3679261c1595a73c19bddbbf05\",\"signer_id\":\"did:example:meter\",\"signer_pubkey\":\"a09aa5f47a6759802ff955f8dc2d2a14a5c99d23be97f864127ff9383455a4f0\",\"subject\":\"a2316cae02860ddb6643af9b2213dcc4768867fbcd46e32e17ad7aabccf8758e\",\"subject_type\":\"receipt\"}", + "expected": { + "outcome": "reject", + "step": 2, + "reason": "field_type" + } + }, + { + "name": "measurement_fabric_step_unknown_member", + "about": "a step carrying its work count: a step is its term, fabric and backend", + "procedure": "claim", + "receipt": "{\"body\":{\"bracket\":null,\"build\":{\"profile\":\"release\",\"target\":\"x86_64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.98.0 (example)\"},\"energy_calibration_ref\":null,\"energy_counter_filtering\":null,\"energy_provenance\":\"ModelBased\",\"energy_uncertainty\":null,\"fabrics\":{\"shares\":[{\"attribution\":\"task\",\"fabric\":\"cpu\",\"joules_micro\":6500},{\"attribution\":\"rail\",\"fabric\":\"gpu\",\"joules_micro\":2500}],\"steps\":[{\"backend\":\"claim-conformance: a cpu backend\",\"fabric\":\"cpu\",\"step\":\"base-code\",\"units\":48},{\"backend\":\"claim-conformance: a cpu backend\",\"fabric\":\"cpu\",\"step\":\"base-search\"},{\"backend\":\"claim-conformance: a gpu backend\",\"fabric\":\"gpu\",\"step\":\"base-search\"},{\"backend\":\"claim-conformance: a gpu backend\",\"fabric\":\"gpu\",\"step\":\"object-hash\"}]},\"figure_index\":null,\"figure_profile\":\"moq-jwp:claim-link\",\"group\":null,\"joules_micro\":9000,\"power_reader\":\"reader:example\"},\"class\":\"measurement\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":1,\"sig\":\"bf3b79d56a0f330542dd44835a796c0c85de6d1ca93552c2a4602813fb0f3587628823095c8960a499c0c83378ad2656226153e79faa0a279014f27c1239350e\",\"signer_id\":\"did:example:meter\",\"signer_pubkey\":\"a09aa5f47a6759802ff955f8dc2d2a14a5c99d23be97f864127ff9383455a4f0\",\"subject\":\"a2316cae02860ddb6643af9b2213dcc4768867fbcd46e32e17ad7aabccf8758e\",\"subject_type\":\"receipt\"}", + "expected": { + "outcome": "reject", + "step": 2, + "reason": "unknown_member" + } + }, + { + "name": "measurement_fabric_backend_empty", + "about": "a step whose backend is the empty string", + "procedure": "claim", + "receipt": "{\"body\":{\"bracket\":null,\"build\":{\"profile\":\"release\",\"target\":\"x86_64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.98.0 (example)\"},\"energy_calibration_ref\":null,\"energy_counter_filtering\":null,\"energy_provenance\":\"ModelBased\",\"energy_uncertainty\":null,\"fabrics\":{\"shares\":[{\"attribution\":\"task\",\"fabric\":\"cpu\",\"joules_micro\":6500},{\"attribution\":\"rail\",\"fabric\":\"gpu\",\"joules_micro\":2500}],\"steps\":[{\"backend\":\"claim-conformance: a cpu backend\",\"fabric\":\"cpu\",\"step\":\"base-code\"},{\"backend\":\"\",\"fabric\":\"cpu\",\"step\":\"base-search\"},{\"backend\":\"claim-conformance: a gpu backend\",\"fabric\":\"gpu\",\"step\":\"base-search\"},{\"backend\":\"claim-conformance: a gpu backend\",\"fabric\":\"gpu\",\"step\":\"object-hash\"}]},\"figure_index\":null,\"figure_profile\":\"moq-jwp:claim-link\",\"group\":null,\"joules_micro\":9000,\"power_reader\":\"reader:example\"},\"class\":\"measurement\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":1,\"sig\":\"8315dbdc55a7579bda8af4d6e6c74ecae852f1a1479d20b3b0062997be76032500cf3cbe78bd62fe901b5963177932a86afc74a9d921d956f681ef476705e60b\",\"signer_id\":\"did:example:meter\",\"signer_pubkey\":\"a09aa5f47a6759802ff955f8dc2d2a14a5c99d23be97f864127ff9383455a4f0\",\"subject\":\"a2316cae02860ddb6643af9b2213dcc4768867fbcd46e32e17ad7aabccf8758e\",\"subject_type\":\"receipt\"}", + "expected": { + "outcome": "reject", + "step": 2, + "reason": "field_type" + } + }, + { + "name": "measurement_fabric_share_not_integer", + "about": "a share written as a string", + "procedure": "claim", + "receipt": "{\"body\":{\"bracket\":null,\"build\":{\"profile\":\"release\",\"target\":\"x86_64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.98.0 (example)\"},\"energy_calibration_ref\":null,\"energy_counter_filtering\":null,\"energy_provenance\":\"ModelBased\",\"energy_uncertainty\":null,\"fabrics\":{\"shares\":[{\"attribution\":\"task\",\"fabric\":\"cpu\",\"joules_micro\":\"6500\"},{\"attribution\":\"rail\",\"fabric\":\"gpu\",\"joules_micro\":2500}],\"steps\":[{\"backend\":\"claim-conformance: a cpu backend\",\"fabric\":\"cpu\",\"step\":\"base-code\"},{\"backend\":\"claim-conformance: a cpu backend\",\"fabric\":\"cpu\",\"step\":\"base-search\"},{\"backend\":\"claim-conformance: a gpu backend\",\"fabric\":\"gpu\",\"step\":\"base-search\"},{\"backend\":\"claim-conformance: a gpu backend\",\"fabric\":\"gpu\",\"step\":\"object-hash\"}]},\"figure_index\":null,\"figure_profile\":\"moq-jwp:claim-link\",\"group\":null,\"joules_micro\":9000,\"power_reader\":\"reader:example\"},\"class\":\"measurement\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":1,\"sig\":\"96617e85e614ab1af4b8973282d845bab99fcf5dc5a6c9842f588519b44da16ec805f9cb18c3e5c96634aed04389bde11cc8e961a51ad2e918b00d971183330e\",\"signer_id\":\"did:example:meter\",\"signer_pubkey\":\"a09aa5f47a6759802ff955f8dc2d2a14a5c99d23be97f864127ff9383455a4f0\",\"subject\":\"a2316cae02860ddb6643af9b2213dcc4768867fbcd46e32e17ad7aabccf8758e\",\"subject_type\":\"receipt\"}", + "expected": { + "outcome": "reject", + "step": 2, + "reason": "field_type" + } + }, + { + "name": "measurement_fabric_unknown", + "about": "a share on a fabric energy-measurement 6.3 does not name", + "procedure": "claim", + "receipt": "{\"body\":{\"bracket\":null,\"build\":{\"profile\":\"release\",\"target\":\"x86_64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.98.0 (example)\"},\"energy_calibration_ref\":null,\"energy_counter_filtering\":null,\"energy_provenance\":\"ModelBased\",\"energy_uncertainty\":null,\"fabrics\":{\"shares\":[{\"attribution\":\"task\",\"fabric\":\"cpu\",\"joules_micro\":6500},{\"attribution\":\"rail\",\"fabric\":\"fpga\",\"joules_micro\":2500}],\"steps\":[{\"backend\":\"claim-conformance: a cpu backend\",\"fabric\":\"cpu\",\"step\":\"base-code\"},{\"backend\":\"claim-conformance: a cpu backend\",\"fabric\":\"cpu\",\"step\":\"base-search\"},{\"backend\":\"claim-conformance: a gpu backend\",\"fabric\":\"gpu\",\"step\":\"base-search\"},{\"backend\":\"claim-conformance: a gpu backend\",\"fabric\":\"gpu\",\"step\":\"object-hash\"}]},\"figure_index\":null,\"figure_profile\":\"moq-jwp:claim-link\",\"group\":null,\"joules_micro\":9000,\"power_reader\":\"reader:example\"},\"class\":\"measurement\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":1,\"sig\":\"4b6524608520fccdf643c5cb3dedd95d9a9458cfddf5db5a4aba9633914b21e1ddf6459ffac2430852dbe3dc7fec8fb6462a74315de2ff10401ac8cde1121a0c\",\"signer_id\":\"did:example:meter\",\"signer_pubkey\":\"a09aa5f47a6759802ff955f8dc2d2a14a5c99d23be97f864127ff9383455a4f0\",\"subject\":\"a2316cae02860ddb6643af9b2213dcc4768867fbcd46e32e17ad7aabccf8758e\",\"subject_type\":\"receipt\"}", + "expected": { + "outcome": "reject", + "step": 4, + "reason": "measurement_fabric_unknown" + } + }, + { + "name": "measurement_fabric_attribution_unknown", + "about": "a share attributed by a method energy-measurement 6.3 does not name", + "procedure": "claim", + "receipt": "{\"body\":{\"bracket\":null,\"build\":{\"profile\":\"release\",\"target\":\"x86_64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.98.0 (example)\"},\"energy_calibration_ref\":null,\"energy_counter_filtering\":null,\"energy_provenance\":\"ModelBased\",\"energy_uncertainty\":null,\"fabrics\":{\"shares\":[{\"attribution\":\"task\",\"fabric\":\"cpu\",\"joules_micro\":6500},{\"attribution\":\"estimate\",\"fabric\":\"gpu\",\"joules_micro\":2500}],\"steps\":[{\"backend\":\"claim-conformance: a cpu backend\",\"fabric\":\"cpu\",\"step\":\"base-code\"},{\"backend\":\"claim-conformance: a cpu backend\",\"fabric\":\"cpu\",\"step\":\"base-search\"},{\"backend\":\"claim-conformance: a gpu backend\",\"fabric\":\"gpu\",\"step\":\"base-search\"},{\"backend\":\"claim-conformance: a gpu backend\",\"fabric\":\"gpu\",\"step\":\"object-hash\"}]},\"figure_index\":null,\"figure_profile\":\"moq-jwp:claim-link\",\"group\":null,\"joules_micro\":9000,\"power_reader\":\"reader:example\"},\"class\":\"measurement\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":1,\"sig\":\"b402e8284b7ddb0e8d9ce8a95efe11e7b149e77bbbbc952bfe0b1c4529df7e20a4a3ca99fba81950c12cf6aca951ea4612d31e7724d294ce43eea50a64a8d407\",\"signer_id\":\"did:example:meter\",\"signer_pubkey\":\"a09aa5f47a6759802ff955f8dc2d2a14a5c99d23be97f864127ff9383455a4f0\",\"subject\":\"a2316cae02860ddb6643af9b2213dcc4768867fbcd46e32e17ad7aabccf8758e\",\"subject_type\":\"receipt\"}", + "expected": { + "outcome": "reject", + "step": 4, + "reason": "measurement_fabric_unknown" + } + }, + { + "name": "measurement_fabric_time_share", + "about": "a shared GPU rail divided by its users' GPU time: busy time does not apportion energy, so energy-measurement 6.3 names no such attribution", + "procedure": "claim", + "receipt": "{\"body\":{\"bracket\":null,\"build\":{\"profile\":\"release\",\"target\":\"x86_64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.98.0 (example)\"},\"energy_calibration_ref\":null,\"energy_counter_filtering\":null,\"energy_provenance\":\"ModelBased\",\"energy_uncertainty\":null,\"fabrics\":{\"shares\":[{\"attribution\":\"task\",\"fabric\":\"cpu\",\"joules_micro\":6500},{\"attribution\":\"time-share\",\"fabric\":\"gpu\",\"joules_micro\":2500}],\"steps\":[{\"backend\":\"claim-conformance: a cpu backend\",\"fabric\":\"cpu\",\"step\":\"base-code\"},{\"backend\":\"claim-conformance: a cpu backend\",\"fabric\":\"cpu\",\"step\":\"base-search\"},{\"backend\":\"claim-conformance: a gpu backend\",\"fabric\":\"gpu\",\"step\":\"base-search\"},{\"backend\":\"claim-conformance: a gpu backend\",\"fabric\":\"gpu\",\"step\":\"object-hash\"}]},\"figure_index\":null,\"figure_profile\":\"moq-jwp:claim-link\",\"group\":null,\"joules_micro\":9000,\"power_reader\":\"reader:example\"},\"class\":\"measurement\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":1,\"sig\":\"1c27953daed7fa881dee0608475b91b85a25dd63c84000e4042b7f99e56c43aa6aaa9deced4e8cc35e69d07288656146763fca5365c4eaab5f60cd4c91ba4d02\",\"signer_id\":\"did:example:meter\",\"signer_pubkey\":\"a09aa5f47a6759802ff955f8dc2d2a14a5c99d23be97f864127ff9383455a4f0\",\"subject\":\"a2316cae02860ddb6643af9b2213dcc4768867fbcd46e32e17ad7aabccf8758e\",\"subject_type\":\"receipt\"}", + "expected": { + "outcome": "reject", + "step": 4, + "reason": "measurement_fabric_unknown" + } + }, + { + "name": "measurement_fabric_steps_out_of_order", + "about": "the motion search listed before the base's coding: steps are in byte order of their terms", + "procedure": "claim", + "receipt": "{\"body\":{\"bracket\":null,\"build\":{\"profile\":\"release\",\"target\":\"x86_64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.98.0 (example)\"},\"energy_calibration_ref\":null,\"energy_counter_filtering\":null,\"energy_provenance\":\"ModelBased\",\"energy_uncertainty\":null,\"fabrics\":{\"shares\":[{\"attribution\":\"task\",\"fabric\":\"cpu\",\"joules_micro\":6500},{\"attribution\":\"rail\",\"fabric\":\"gpu\",\"joules_micro\":2500}],\"steps\":[{\"backend\":\"claim-conformance: a cpu backend\",\"fabric\":\"cpu\",\"step\":\"base-search\"},{\"backend\":\"claim-conformance: a cpu backend\",\"fabric\":\"cpu\",\"step\":\"base-code\"},{\"backend\":\"claim-conformance: a gpu backend\",\"fabric\":\"gpu\",\"step\":\"base-search\"},{\"backend\":\"claim-conformance: a gpu backend\",\"fabric\":\"gpu\",\"step\":\"object-hash\"}]},\"figure_index\":null,\"figure_profile\":\"moq-jwp:claim-link\",\"group\":null,\"joules_micro\":9000,\"power_reader\":\"reader:example\"},\"class\":\"measurement\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":1,\"sig\":\"d3d12b97d54fa252120ad54a1e1799c4648beedf078dc37223093ac6cd3d666e1ad61b399e1be0fe8d042697583fa3ad8085f1e0842fe88fe8e4b4abb623a505\",\"signer_id\":\"did:example:meter\",\"signer_pubkey\":\"a09aa5f47a6759802ff955f8dc2d2a14a5c99d23be97f864127ff9383455a4f0\",\"subject\":\"a2316cae02860ddb6643af9b2213dcc4768867fbcd46e32e17ad7aabccf8758e\",\"subject_type\":\"receipt\"}", + "expected": { + "outcome": "reject", + "step": 4, + "reason": "measurement_fabric_order" + } + }, + { + "name": "measurement_fabric_share_twice", + "about": "two shares on the CPU: a fabric has one share", + "procedure": "claim", + "receipt": "{\"body\":{\"bracket\":null,\"build\":{\"profile\":\"release\",\"target\":\"x86_64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.98.0 (example)\"},\"energy_calibration_ref\":null,\"energy_counter_filtering\":null,\"energy_provenance\":\"ModelBased\",\"energy_uncertainty\":null,\"fabrics\":{\"shares\":[{\"attribution\":\"task\",\"fabric\":\"cpu\",\"joules_micro\":6500},{\"attribution\":\"task\",\"fabric\":\"cpu\",\"joules_micro\":2500}],\"steps\":[{\"backend\":\"claim-conformance: a cpu backend\",\"fabric\":\"cpu\",\"step\":\"base-code\"}]},\"figure_index\":null,\"figure_profile\":\"moq-jwp:claim-link\",\"group\":null,\"joules_micro\":9000,\"power_reader\":\"reader:example\"},\"class\":\"measurement\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":1,\"sig\":\"fbec2c55c3d7a36f0d3f2093e25c31c5a55bd9e19b3c6f8879aa8dc266e1092fdecb2489f2bafb89fc5abbdf6adf643fc5d59d367fff38d2dd0bfdb4eab86008\",\"signer_id\":\"did:example:meter\",\"signer_pubkey\":\"a09aa5f47a6759802ff955f8dc2d2a14a5c99d23be97f864127ff9383455a4f0\",\"subject\":\"a2316cae02860ddb6643af9b2213dcc4768867fbcd46e32e17ad7aabccf8758e\",\"subject_type\":\"receipt\"}", + "expected": { + "outcome": "reject", + "step": 4, + "reason": "measurement_fabric_order" + } + }, + { + "name": "measurement_fabric_no_step", + "about": "shares with no step: a record says where the work ran", + "procedure": "claim", + "receipt": "{\"body\":{\"bracket\":null,\"build\":{\"profile\":\"release\",\"target\":\"x86_64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.98.0 (example)\"},\"energy_calibration_ref\":null,\"energy_counter_filtering\":null,\"energy_provenance\":\"ModelBased\",\"energy_uncertainty\":null,\"fabrics\":{\"shares\":[{\"attribution\":\"task\",\"fabric\":\"cpu\",\"joules_micro\":6500},{\"attribution\":\"rail\",\"fabric\":\"gpu\",\"joules_micro\":2500}],\"steps\":[]},\"figure_index\":null,\"figure_profile\":\"moq-jwp:claim-link\",\"group\":null,\"joules_micro\":9000,\"power_reader\":\"reader:example\"},\"class\":\"measurement\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":1,\"sig\":\"b45a7c64df5a376493f0136630ef1080c55c7c966f02eb5410b390c09340812c862a90b7b12703fdb953e58ab665ca55341b1eeb87afc1d5bda68a65a6b9d80e\",\"signer_id\":\"did:example:meter\",\"signer_pubkey\":\"a09aa5f47a6759802ff955f8dc2d2a14a5c99d23be97f864127ff9383455a4f0\",\"subject\":\"a2316cae02860ddb6643af9b2213dcc4768867fbcd46e32e17ad7aabccf8758e\",\"subject_type\":\"receipt\"}", + "expected": { + "outcome": "reject", + "step": 4, + "reason": "measurement_fabric_order" + } + }, + { + "name": "measurement_fabric_unmetered", + "about": "a step on the GPU with a share on the CPU alone: a fabric that ran work has a share", + "procedure": "claim", + "receipt": "{\"body\":{\"bracket\":null,\"build\":{\"profile\":\"release\",\"target\":\"x86_64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.98.0 (example)\"},\"energy_calibration_ref\":null,\"energy_counter_filtering\":null,\"energy_provenance\":\"ModelBased\",\"energy_uncertainty\":null,\"fabrics\":{\"shares\":[{\"attribution\":\"task\",\"fabric\":\"cpu\",\"joules_micro\":9000}],\"steps\":[{\"backend\":\"claim-conformance: a cpu backend\",\"fabric\":\"cpu\",\"step\":\"base-code\"},{\"backend\":\"claim-conformance: a cpu backend\",\"fabric\":\"cpu\",\"step\":\"base-search\"},{\"backend\":\"claim-conformance: a gpu backend\",\"fabric\":\"gpu\",\"step\":\"base-search\"},{\"backend\":\"claim-conformance: a gpu backend\",\"fabric\":\"gpu\",\"step\":\"object-hash\"}]},\"figure_index\":null,\"figure_profile\":\"moq-jwp:claim-link\",\"group\":null,\"joules_micro\":9000,\"power_reader\":\"reader:example\"},\"class\":\"measurement\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":1,\"sig\":\"0296dfdd393715cf081ae36dd7e1046345e41489c38a50e44c51ba7fac0f7456d03b5fd8508372517df2bfe583f813394f2f7fd8edaa9d6b68c3daf24a1c1001\",\"signer_id\":\"did:example:meter\",\"signer_pubkey\":\"a09aa5f47a6759802ff955f8dc2d2a14a5c99d23be97f864127ff9383455a4f0\",\"subject\":\"a2316cae02860ddb6643af9b2213dcc4768867fbcd46e32e17ad7aabccf8758e\",\"subject_type\":\"receipt\"}", + "expected": { + "outcome": "reject", + "step": 4, + "reason": "measurement_fabric_unmetered" + } + }, + { + "name": "measurement_fabric_unused", + "about": "a share on the GPU while every step ran on the CPU", + "procedure": "claim", + "receipt": "{\"body\":{\"bracket\":null,\"build\":{\"profile\":\"release\",\"target\":\"x86_64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.98.0 (example)\"},\"energy_calibration_ref\":null,\"energy_counter_filtering\":null,\"energy_provenance\":\"ModelBased\",\"energy_uncertainty\":null,\"fabrics\":{\"shares\":[{\"attribution\":\"task\",\"fabric\":\"cpu\",\"joules_micro\":6500},{\"attribution\":\"rail\",\"fabric\":\"gpu\",\"joules_micro\":2500}],\"steps\":[{\"backend\":\"claim-conformance: a cpu backend\",\"fabric\":\"cpu\",\"step\":\"base-code\"},{\"backend\":\"claim-conformance: a cpu backend\",\"fabric\":\"cpu\",\"step\":\"base-search\"}]},\"figure_index\":null,\"figure_profile\":\"moq-jwp:claim-link\",\"group\":null,\"joules_micro\":9000,\"power_reader\":\"reader:example\"},\"class\":\"measurement\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":1,\"sig\":\"a538aac1de0c7d1c8b50b141ae9e4d8a272264451e15e4736e62126d33f50c3f69e577e33a1b39a07862412718cb7f5f1a009bc38ed96f3297540db4a8bd270e\",\"signer_id\":\"did:example:meter\",\"signer_pubkey\":\"a09aa5f47a6759802ff955f8dc2d2a14a5c99d23be97f864127ff9383455a4f0\",\"subject\":\"a2316cae02860ddb6643af9b2213dcc4768867fbcd46e32e17ad7aabccf8758e\",\"subject_type\":\"receipt\"}", + "expected": { + "outcome": "reject", + "step": 4, + "reason": "measurement_fabric_unused" + } + }, + { + "name": "measurement_fabric_sum", + "about": "shares of 6,500 and 2,499 uJ under a figure of 9,000: the shares divide the figure", + "procedure": "claim", + "receipt": "{\"body\":{\"bracket\":null,\"build\":{\"profile\":\"release\",\"target\":\"x86_64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.98.0 (example)\"},\"energy_calibration_ref\":null,\"energy_counter_filtering\":null,\"energy_provenance\":\"ModelBased\",\"energy_uncertainty\":null,\"fabrics\":{\"shares\":[{\"attribution\":\"task\",\"fabric\":\"cpu\",\"joules_micro\":6500},{\"attribution\":\"rail\",\"fabric\":\"gpu\",\"joules_micro\":2499}],\"steps\":[{\"backend\":\"claim-conformance: a cpu backend\",\"fabric\":\"cpu\",\"step\":\"base-code\"},{\"backend\":\"claim-conformance: a cpu backend\",\"fabric\":\"cpu\",\"step\":\"base-search\"},{\"backend\":\"claim-conformance: a gpu backend\",\"fabric\":\"gpu\",\"step\":\"base-search\"},{\"backend\":\"claim-conformance: a gpu backend\",\"fabric\":\"gpu\",\"step\":\"object-hash\"}]},\"figure_index\":null,\"figure_profile\":\"moq-jwp:claim-link\",\"group\":null,\"joules_micro\":9000,\"power_reader\":\"reader:example\"},\"class\":\"measurement\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":1,\"sig\":\"7528210f3893e4066c79e478bd771fb9dff22ead676a08e86b76a89a0cb37b1fc041d1391250cdca436ad14f1e4a4efa22937c2c1a0f5eb480dea1f954cee201\",\"signer_id\":\"did:example:meter\",\"signer_pubkey\":\"a09aa5f47a6759802ff955f8dc2d2a14a5c99d23be97f864127ff9383455a4f0\",\"subject\":\"a2316cae02860ddb6643af9b2213dcc4768867fbcd46e32e17ad7aabccf8758e\",\"subject_type\":\"receipt\"}", + "expected": { + "outcome": "reject", + "step": 4, + "reason": "measurement_fabric_sum" + } } ] } diff --git a/wai/extensions/determinism-tiers.md b/wai/extensions/determinism-tiers.md index 42615920c..3fd731d1b 100644 --- a/wai/extensions/determinism-tiers.md +++ b/wai/extensions/determinism-tiers.md @@ -531,31 +531,42 @@ shows, by fabric: (integer-operators §7.3). The host makes the interpreter's run-time checks before the device runs anything, and a `check` tensor that leaves its range refuses the decode at its operator. The driver's stage operators stay on the CPU, and so does a graph with an - operator outside `wai-ops/1-i32`. The tier is met for those graphs on each adapter and - backend below, where a run reproduced, at both widths, every graph vector of - integer-operators §14.1 and §14.2 that `wai-ops/1-i32` covers (§6): + operator outside `wai-ops/1-i32`. The tier is claimed for those graphs only under the + conditions of *Claiming the tier on a GPU* (below), which the crate meets, and only on + an adapter where a run, on the kernel text of this revision, gave WGSL's result for + every guarded case of the integer semantics suite, the host's result for every word of + the arithmetic probe, and the interpreter's outputs, at both widths, for every graph + vector of integer-operators §14.1 and §14.2 that `wai-ops/1-i32` covers (§6). That is + each adapter and backend below: - Metal, on the integrated GPU of an arm64 desktop (macOS 27.0.1); - a browser's WebGPU on that same GPU, the kernels compiled by the browser's own WGSL compiler (Chromium 148 and a Chromium-based browser at 155, headless); - Vulkan, on a discrete GPU of PCI vendor 0x10de, device 0x28e1 (driver 595.84), and on an integrated GPU of PCI vendor 0x8086, device 0xa7a0 (Mesa 25.2.8), in one Linux x86_64 host; - - Vulkan, on an integrated GPU of PCI vendor 0x1002, device 0x1586 (Mesa 26.0.8), - Linux x86_64. + - Vulkan and DX12, on a discrete GPU of PCI vendor 0x10de, device 0x1f15 (Vulkan driver + 591.74, DX12 driver 32.0.15.9174), and on an integrated GPU of PCI vendor 0x8086, + device 0x9a49 (Vulkan, and DX12 driver 31.0.101.3222), in one Windows x86_64 host. The + DX12 backend translates the kernels to HLSL, compiled for shader model 5.1. On each of these but the browser, the capability corpora (integer-operators §14.4) - also decoded with their graphs on the device: every committed vector and refusal - fixture of `wai.neural.int_hyper`, `wai.video.int_hyper`, `wai.audio.int_codec`, + also decoded with their graphs on the device, as §6 records: every committed vector and + refusal fixture of `wai.neural.int_hyper`, `wai.video.int_hyper`, `wai.audio.int_codec`, `wai.splat.int_codec`, `wai.neural.int_synth` and `wai.neural.int_mlicpp` gave the bytes, or the refusal code, of the decode on the CPU, and every graph the device ran - gave the interpreter's outputs. A software Vulkan driver (llvmpipe, on both Linux hosts) - gave the same results; it runs on the CPU. Nothing is claimed for an adapter, a backend - or a driver version that is not listed; DX12 was not run. `wai.image.jpegai`'s scale - graphs (`hs_y`, `hs_uv`, at `acc32`) and hyper decoders and context stages (`rec_y`, - `rec_uv`, at `acc64`) ran on each of these devices but the browser with the - interpreter's outputs, so its `entropy-consistency` claim (§5) holds with its scale - path there. Its synthesis graphs use operators outside `wai-ops/1-i32` and ran on the - CPU. + gave the interpreter's outputs. Software adapters, which run on the CPU, gave the same + results: a software Vulkan driver (llvmpipe) on the Linux host, and the software DX12 + adapter (PCI vendor 0x1414) on the Windows host. An integrated GPU of PCI vendor 0x1002, + device 0x1586 (Mesa 26.0.8, Linux x86_64) reproduced the graph vectors and the + capability corpora on the kernel text before this revision, which differs from it only + in the shift masks and the two clamps that *Claiming the tier on a GPU* requires; the + semantics suite has not run there, and the tier is not claimed on it until a run of + this revision's kernels passes there. Nothing is claimed for an adapter, a backend or + a driver version that is not listed. `wai.image.jpegai`'s scale graphs (`hs_y`, + `hs_uv`, at `acc32`) and hyper decoders and context stages (`rec_y`, `rec_uv`, at + `acc64`) ran on each of these devices but the browser with the interpreter's outputs, + so its `entropy-consistency` claim (§5) holds with its scale path there. Its synthesis + graphs use operators outside `wai-ops/1-i32` and ran on the CPU. - **NPU.** No decoder of these capabilities runs on one in this revision, and the tier is not claimed there. A network evaluated in floating point on a GPU or NPU does not meet it (§1). @@ -568,6 +579,105 @@ digest, a reconstruction or an energy figure to it. Content that the application decrypts itself, as in Lane B of SPEC §6.5, is decoded like any plaintext, and the tier holds for it as it does for plaintext. +### Claiming the tier on a GPU + +`decode-equivalence` holds on a GPU only where the shader that runs a decoder's graphs, +the translation of that shader into the backend's language, and the device all keep the +integer arithmetic the capability's registration fixes. The texts read here are WGSL, W3C +Candidate Recommendation Draft, 21 October 2026, and naga 30.0.1, the translator wgpu +30.0.1 compiles WGSL with. + +WGSL defines each integer operation at run time, the cases that are errors when the +operands are known before the shader runs included (WGSL §8.8, §8.10, §17.5): addition, +subtraction, multiplication and negation of a concrete integer type are modulo 2^32; +`e1 / 0` is `e1`, and `e1 % 0` is 0; the most negative `i32` divided by −1 is itself, and +its remainder 0; a shift amount is taken modulo 32; an integer `clamp(e, low, high)` is +`min(max(e, low), high)`; a bit field's offset and count are clamped to the word. The +languages a WGSL module is translated into leave some of these open: MSL and HLSL leave +signed overflow undefined, and MSL, HLSL and SPIR-V leave a zero divisor, the most +negative value divided by −1, a shift by the width or more, and a `clamp` whose bounds are +out of order undefined or to the implementation. Floating point is open even in WGSL: an +implementation may reassociate operations, and may fuse them where the result is at least +as accurate (WGSL §15.7.5). A subgroup operation's result depends on its subgroup, whose +size is a power of two from 4 to 128 that the device compiler chooses, whose invocations +have no defined relationship to `local_invocation_index`, and of whose invocations only +the active ones take part (WGSL §15.5, §15.6.3). An out-of-bounds access has several +permitted outcomes (WGSL §6.5.7). + +So a decoder **MAY** claim `decode-equivalence` for output whose graphs ran on a GPU only +when every condition below holds for every shader module that ran them, on that adapter, +in that process. Otherwise the output is the GPU's, and no tier is claimed for it. + +1. **Integer only.** Every scalar type in the module, of every declaration and of every + expression, is `bool`, `i32` or `u32`; every literal is of one of them; every + conversion is between them. No floating-point type appears for any purpose, an index + or a loop bound included. With no floating-point operation, no reassociation or fusion + an implementation may make changes a result: integer addition and multiplication + modulo 2^32 give the same value in any order. +2. **No subgroup or quad operation, and no extension.** The module enables nothing + (`enable`) and calls no subgroup or quad built-in. +3. **No result depends on scheduling.** Each output word is written by one invocation and + read by no other invocation of the same dispatch. An atomic operation is one whose + final value does not depend on the order in which invocations reach it (`atomicOr`, + `atomicAnd`, `atomicMin`, `atomicMax`, `atomicAdd`, `atomicSub`), and the value it + returns is not used. No access is out of bounds. +4. **The translation gives WGSL's results.** A translation into a language that leaves an + integer result open produces WGSL's result for each operation the module uses: signed + addition, subtraction, multiplication and negation evaluated in unsigned arithmetic + and reinterpreted; division and remainder through a guard that substitutes the divisor + 1 where WGSL's result is the dividend, and remainder 0; the absolute value of the most + negative value, itself. naga 30.0.1 does all of these in MSL and HLSL (its `naga_div`, + `naga_mod`, `naga_neg` and `naga_abs`, and signed arithmetic through unsigned); in + SPIR-V, whose integer addition, subtraction, multiplication and negation wrap, it + guards division and remainder. In MSL and SPIR-V the division guards are written only + while its integer-division checks are on; in HLSL always. A host + **MUST NOT** turn a translator's guards off: in wgpu, a module created unchecked, or + `ShaderRuntimeChecks::int_div_checks` false. Where a translator does not produce + WGSL's result for an operation, the module **MUST NOT** reach that operation on the + operands concerned. naga 30.0.1 passes a shift amount to MSL, HLSL and SPIR-V without + reducing it modulo 32, and writes an integer `clamp` as MSL's `clamp`; so every shift + amount in the module is a literal below 32 or masked below 32 (`e & 31u`), and every + `clamp` has literal bounds in order, another bound being written + `min(max(e, low), high)`. +5. **The adapter passes the conformance suite first.** Before an adapter runs any graph of + the decode, in the same process, it gives WGSL's result for every case of the integer + semantics vectors (`wai/wgsl-conformance/integer.jsonl`) that the file marks guarded, + and for further cases of each operation that the implementation draws, and the host's + result for every word of the implementation's probe of the wider arithmetic it builds + from 32-bit words. And the implementation has reproduced, on that adapter, backend and + driver, every graph vector of integer-operators §14.1 and §14.2 its subset covers, at + each width it runs (integer-operators §12, *Evidence for a fabric*). An adapter that + differs on any guarded case or probe word runs no graph. +6. **The claim names what ran.** A receipt or report of a GPU decode at this tier names + the adapter (backend, PCI vendor and device, driver) and the translator and its + release. + +The semantics vectors cover every integer operation WGSL defines on `i32`, `u32` and +two-component vectors of them, with the edge cases above: every pair of a set of values +at and near the edges of both types for the arithmetic, division and remainder, every +shift amount from 0 to 40 and the extremes past it, and bit fields at and past the word. +They mark as unguarded the cases item 4 keeps a module from, a shift amount of 32 or more +and `clamp` bounds out of order, whose result is the hardware's through naga 30.0.1. A run +reports what each adapter gives on them; a difference there does not refuse the adapter, +since no module at this tier reaches one. The file is written from WGSL's definitions by +`wai_ops_gpu::semantics::reference` and checked against it natively, and against the same +reference compiled to wasm32, under Node and in a browser page. + +`wai/wai-ops-gpu` meets these conditions. `tests/wgsl_rules.rs` holds every shipped module +to items 1–4 on naga's IR: the types and literals; a closed list of expressions and +built-in functions; the one atomic operation, `atomicOr`, and its unused result; the +bindings, with no workgroup or private memory and no barrier; the shift masks and `clamp` +bounds; that every integer operation a kernel uses is one the semantics suite runs; and +naga's guard helpers in each module's MSL and HLSL translations, which disappear from the +MSL with its division checks turned off. It also holds the crate to the checked +module-creation call, and shows each planted violation (a floating-point value, `f16`, a +subgroup reduction, an `atomicAdd`, an atomic's result read, workgroup memory and a +barrier, an unmasked shift, a `clamp` with run-time bounds) refused by the rule it +breaks. Discovery runs item 5's suite and probe on each adapter before it runs a graph; +`tests/semantics.rs` shows every adapter refused when the suite's remainder is written by +hand, `a - (a / b) * b`, which gives `a` where WGSL gives 0. In a browser, +`wai-ops-gpu/browser` runs the same suite through the browser's own WGSL compiler. + ## 6. Evidence status What the repository demonstrates, claim by claim, as of 2026-09-27 (main at @@ -603,7 +713,7 @@ task list has no Windows task after that day. The Windows results below are hist | `wai.neural.int_hyper` and `wai.video.int_hyper` at full model scale (the pretrained `mbt2018_mean`, exported to integers): the Rust decode reproduces the export tool's integer reference byte for byte (synthesis, hyper-decoder, the whole conditional bitstream, an eight-frame clip), and costs at most 1 dB against the same model's float decode on one pinned photograph | `wai-sota-vectors.yml` regenerates the vectors on the runner from pinned inputs (the photograph's pixels and the checkpoint's bytes by SHA-256, the Python stack by version) and runs both tests with `WAI_REQUIRE_SOTA_VECTORS=1`, under which a missing vector fails instead of skipping. The job also fails on any skip banner in the test log, and runs `require_vectors_rule.rs`, which checks that without the switch a variable naming absent or incomplete inputs fails as well. Rust is checked against the export of the same run on the same machine: the vectors come from float computation, and some of them differed between machines and between runs, so none of their hashes is pinned and none is compared across machines. The workflow has run on the forge's Linux runner (x86_64 hardware) and passed on every run since 2026-09-28 | `wai-rs/tests/int_hyper_synth.rs`, `int_video_sota_keyframe.rs`, `require_vectors_rule.rs`; `.github/workflows/wai-sota-vectors.yml` | | `wai.audio.int_codec`, `wai.splat.int_codec` | committed vectors that never skip. Their frozen hashes are the output of an independent Python integer reference, computed when the vectors were exported (`tools/wai_int_audio_export.py`, `tools/wai_int_splat_export.py`); no Python runs in CI. The conformance workflow's fast-kernel steps enable `audio_int` and `splat_int` and, in debug and release builds, decode both vectors against those hashes under the reference kernels and every fast-kernel policy (`tests/int_kernels_vectors.rs`); that passed on the forge's Linux x86_64, Linux arm64 and macOS arm64 runners for the landing chain's head `7cfcecfa` (run 745, 2026-09-30). The same steps also name `tests/int_audio.rs` and `tests/int_splat.rs`, which check each vector against the same hash and against its own metadata (sample count; attribute count, tensor size and grid side); Cargo declares each with its feature as a required feature, so a step that names it without that feature fails instead of running nothing. This row records no forge run of those two | `wai-rs/tests/int_audio.rs`, `int_splat.rs`, `int_kernels_vectors.rs`; `.github/workflows/wai-conformance.yml` | | `wai.neural.int_mlicpp` on its committed vector (synthetic seeded weights; a 64×64 image, 8 latent channels in 4 slices): the decode reproduces the export tool's independent integer reference byte for byte — the RGB, and every scale bucket and symbol of the latent stream in coding order (512 symbols over all 16 buckets of the scale table, 47 of the symbols coded by the rANS escape) — under the reference kernels and under the fast kernels on 1, 2, 3, 5 and all available threads; one integer unit changed in each of four chosen parameters, one on each path that feeds a value (a hyper-decoder weight, an entropy-network weight, a mean-head bias, a synthesis weight), changes the image; a header whose shapes the model cannot produce, or on which a network would form a buffer over the cap, is refused before anything is allocated (`tests/int_mlicpp_preflight.rs`, which counts allocations); damaged payloads are refused or decode, and never panic in an overflow-checked build | measured 2026-09-29 with rustc 1.98.0 on the source of the change that added this row: macOS arm64 native (the wai-rs tests, with overflow checks on and off; the `byte-exact-conformance` golden, release) and wasm32-wasip2 under wasmtime 49.0.1 (the same tests and golden, release; on wasm the fast kernels run single-threaded as portable scalar code, and `usize` is 32-bit). All pinned hashes matched on both. Not measured: x86_64 — the development machine has no x86_64 translation layer installed, and an x86_64-apple-darwin build of the golden compiles but cannot execute there — nor Linux or Windows. The golden runs on every leg of the byte-exact matrix (`wai-conformance.yml`, `wai-byte-equality.yml`) and `tests/int_mlicpp.rs` on every leg of `wai-conformance.yml` in both profiles. Both passed on the forge's Linux x86_64, Linux arm64 and macOS arm64 runners for the landing chain's head `7cfcecfa` (run 745, 2026-09-30); there is no Windows leg. The dispatch through `decode_envelope_strict` (the prior pinning the one-file model bundle, the strict gate) runs in `wai-neural-gates.yml`. The weights are synthetic, so nothing here measures compression quality | `wai-rs/tests/int_mlicpp.rs`, `wai-rs/tests/int_mlicpp_preflight.rs`, `byte-exact-conformance/src/int_mlicpp_golden.rs`, `wai-rs/tests/neural_native_decode.rs`; `tools/wai_int_mlicpp_export.py` | -| `wai-ops/1-i32` graphs on GPUs (`wai/wai-ops-gpu`, §5): each device's arithmetic agrees with 128-bit host arithmetic on every probe case; every graph vector of `ops-conformance/` that the subset covers gives the interpreter's outputs or refusal code, at `acc32` and at `acc64`; the integer decoders, with their graphs on the device, give the CPU decode's bytes or refusal codes on every committed vector and refusal fixture, and every graph the device runs gives the interpreter's outputs | measured 2026-10-20 and 2026-10-21 with rustc 1.98.0 and wgpu 30.0.1, release builds, on the source of the change that added this row, on the adapters §5 lists: Metal on macOS 27.0.1 (arm64); headless Chromium 148, and a Chromium-based browser at 155, on that GPU; Vulkan on Linux x86_64 with the 0x10de and 0x8086 adapters (driver 595.84, Mesa 25.2.8) and, on another host, with the 0x1002 adapter (Mesa 26.0.8); and llvmpipe on both Linux hosts. On each, the probe (`tests/arith.rs`) agreed on every word of 1,051,757 cases, and the corpus (`tests/corpus.rs`) ran 813 vectors (1,104 decodes) on the 32-bit kernels and 1,426 (1,921 decodes) on the 64-bit ones, 212 of the decodes refusals, with no difference; 209 graphs use an operator outside the subset and ran on the CPU, and 95 vectors are refused at load. Run on the 32-bit kernels, 330 of the 613 graphs whose certificate does not meet `acc32` gave other results, so the width a graph runs at is the certificate's. Eighteen edits of one kernel expression each (a rounding shift or its addend off by one, a tie rule, a clamp bound moved by one, a dropped carry or cross term, a sign rule, a post bias, an index rule; `tests/mutants.rs`) were each caught by the corpus on every adapter, and an edited product by the probe. `wai-rs/tests/ops_gpu.rs` decoded the committed vectors and refusal fixtures of the six capabilities §5 names, the world renderer's two vectors and `wai.image.jpegai`'s `jpegai/v1` codestream, comparing every graph the device ran with the interpreter as well as each decode's bytes; none differed. The browser leg ran the corpus, not the decoders. `wai-ops-gpu.yml` runs the Metal and browser legs on the `macos` runner, where an absent adapter fails; this row records no forge run of it yet. No other workflow runs a GPU leg of these tests | `wai-ops-gpu/tests/`, `wai-ops-gpu/browser/`, `wai-rs/tests/ops_gpu.rs`; `.github/workflows/wai-ops-gpu.yml` | +| `wai-ops/1-i32` graphs on GPUs (`wai/wai-ops-gpu`, §5, *Claiming the tier on a GPU*): every shipped module meets items 1–4 on naga's IR; each device gives WGSL's result for every guarded case of the integer semantics suite and agrees with 128-bit host arithmetic on every probe case; every graph vector of `ops-conformance/` that the subset covers gives the interpreter's outputs or refusal code, at `acc32` and at `acc64`; the integer decoders, with their graphs on the device, give the CPU decode's bytes or refusal codes on every committed vector and refusal fixture, and every graph the device runs gives the interpreter's outputs | measured 2026-10-22 with rustc 1.98.0 and wgpu 30.0.1 (naga 30.0.1), release builds, on the source of the change that added *Claiming the tier on a GPU*, on the adapters §5 lists: Metal on macOS 27.0.1 (arm64); headless Chromium 148, and a Chromium-based browser at 155, on that GPU; Vulkan on Linux x86_64 with the 0x10de and 0x8086 adapters (driver 595.84, Mesa 25.2.8) and llvmpipe; Vulkan and DX12 on Windows x86_64 with the 0x10de and 0x8086 adapters, and DX12 with the software adapter (PCI vendor 0x1414). `tests/wgsl_rules.rs` passed, its nine planted violations each refused by the rule named. On each native adapter, the semantics suite (`tests/semantics.rs`) gave WGSL's result for every one of 254,464 cases, the 25,088 committed and 4,096 SplitMix64 cases of each operation: 231,690 guarded, and the 22,774 unguarded too (a shift amount of 32 or more, `clamp` bounds out of order), so on these adapters the hardware's result there was WGSL's; the browser legs ran 82,432 cases with none differing, and the committed file reproduced under the reference compiled to wasm32, in the page and under Node 26. The probe (`tests/arith.rs`) agreed on every word of 1,051,757 cases; the corpus (`tests/corpus.rs`) ran 813 vectors (1,104 decodes) on the 32-bit kernels and 1,426 (1,921 decodes) on the 64-bit ones, 212 of the decodes refusals, with no difference; 209 graphs use an operator outside the subset and ran on the CPU, and 95 vectors are refused at load. Run on the 32-bit kernels, the graphs whose certificate does not meet `acc32` gave other results on some of them, so the width a graph runs at is the certificate's. Eighteen edits of one kernel expression each (`tests/mutants.rs`) were each caught by the corpus on every adapter, an edited product by the probe, and a remainder written by hand by the semantics suite at discovery. `wai-rs/tests/ops_gpu.rs` decoded the committed vectors and refusal fixtures of the six capabilities §5 names, the world renderer's two vectors and `wai.image.jpegai`'s `jpegai/v1` codestream on Metal and on the Linux host's Vulkan adapters, comparing every graph the device ran with the interpreter as well as each decode's bytes; none differed; the same on the Windows host's Vulkan and DX12 adapters and on its software DX12 adapter. The browser legs ran the corpus and the semantics suite, not the decoders. Before this change the kernels differed only in the shift masks and the two clamps; on that text, the same tests but the semantics suite passed on 2026-10-20 and 2026-10-21 on Metal (macOS 27.0.1, arm64), the browser at 148 and 155, the Linux host's adapters, and an integrated GPU of PCI vendor 0x1002, device 0x1586 (Mesa 26.0.8), on which nothing has run since. `wai-ops-gpu.yml` runs the Metal and browser legs on the `macos` runner, where an absent adapter fails; this row records no forge run of it yet. No other workflow runs a GPU leg of these tests | `wai-ops-gpu/tests/`, `wai-ops-gpu/browser/`, `wai-rs/tests/ops_gpu.rs`, `wgsl-conformance/`; `.github/workflows/wai-ops-gpu.yml` | So at `entropy-consistency`, WAI's JPEG AI symbol decode is demonstrated across architectures (x86_64 against arm64) once the distribution indices are given; the @@ -623,9 +733,10 @@ arm64 and on wasm32-wasip2 (a 32-bit target), measured on the development machin it also passed on the byte-exact matrix's Linux x86_64, Linux arm64 and macOS arm64 legs in run 745. On GPUs, the committed vectors of `int_hyper` (and its video keyframe), `int_codec` audio and splat, `int_synth` and `int_mlicpp` decode with their graphs on -the device to the CPU decode's bytes on each adapter §5 lists, measured by hand on small -vectors; the `wai-ops-gpu` workflow repeats it on one of them, with no forge run -recorded yet. +the device to the CPU decode's bytes on each adapter §5 lists but the browser, measured by +hand on small vectors, after each adapter gave WGSL's integer semantics on every guarded +case; the `wai-ops-gpu` workflow repeats it on one of them, with no forge run recorded +yet. For the JPEG AI exact decoder's pinned reconstruction (§5), identity across machines rests on construction, and on one comparison: a single codestream on the diff --git a/wai/extensions/energy-measurement.md b/wai/extensions/energy-measurement.md index 4cbb0ae3b..1a11b7f46 100644 --- a/wai/extensions/energy-measurement.md +++ b/wai/extensions/energy-measurement.md @@ -1026,6 +1026,46 @@ and, under a hardware class, that the rail was live and the ratio is at least 1 (jwp-receipts §2.4.8). It does not check the values, which cannot be re-measured (§5). +### 6.3 A figure divided by fabric + +Work can run on more than one kind of processor, a **fabric**: `cpu`, `gpu`, +`media` (a hardware video engine) or `neural` (a neural-network engine). A +`measurement` report MAY carry a **fabric record** (jwp-receipts §2.4.8, +`fabrics`): the steps of the work, each with every fabric that ran it and the +backend that did, and the figure divided into one **share** per fabric that ran +a step. The figure is the sum of its shares, and its class (§2) is the class of +the whole: a share is no measurement of its own. + +Each share states how its energy was attributed to the work: + +- `task`: the operating system's account of the work's own energy on that + fabric, as it accounts a task's use of the processors (on the reference + hosts, the kernel's per-task CPU energy, `ri_energy_nj` of + `proc_pid_rusage`, read by the process for itself), which other work on the + host does not enter; +- `rail`: the fabric's whole rail over the span, in which the work was the + fabric's sole user, at least 99% of the busy time every user of the fabric + accrued over it; a share that is exactly 0 because the work spent no time on + the fabric is also `rail`. + +No attribution divides a rail that other work shared by its users' busy time. +Busy time does not apportion energy: a GPU kernel that keeps the GPU busy at a +low clock and one that keeps it busy at a high clock accrue the same time and +draw very differently, and a division by GPU time has been measured to charge +a decode three to fifteen times the GPU energy it drew alone +(`jouleclaw-energy`, `process_gpu`). Where a fabric that ran a step was shared +and its rail cannot be attributed, the span has no fabric record: the producer +meters it otherwise (§3's bracket, over the whole figure), or seals it +unmetered. So does a span that ran a step on a fabric with no live counter: on +the reference hosts (macOS 27 on arm64) the media engine and the neural engine +have none an unprivileged process can read. + +The record says where the work ran and what each fabric drew; it changes +nothing a figure's verifier checks of the figure itself (§6.2). Which fabric +ran a step changes no output of a step whose output its specification fixes +([packaging](packaging.md) §11, its steps and fabrics), so a record is a statement about energy, not +about what was produced. + ## 7. Worked example `wai.video.int_motion`, real-footage vector, 8 frames of 96×96 RGB, release diff --git a/wai/extensions/jwp-receipts.md b/wai/extensions/jwp-receipts.md index 08cd932e1..ffda6bb89 100644 --- a/wai/extensions/jwp-receipts.md +++ b/wai/extensions/jwp-receipts.md @@ -315,7 +315,11 @@ one such statement — a class-scoped `body` under a `class` discriminator — on one envelope. Required members. A claim has no optional members: a nullable member -is present and `null`, so one claim has one canonical form. +is present and `null`, so one claim has one canonical form. There is one +exception, a `measurement` claim's `fabrics` (§2.4.8): it is absent when the +claim does not divide its figure by fabric and is never `null`, so a claim +sealed before the member existed keeps its bytes and its link hash, and one +claim still has one canonical form. | field | type | meaning | |---|---|---| @@ -678,6 +682,7 @@ receipt's identity for every other profile. | `bracket` | object or `null` | For a figure obtained under energy-measurement §3: `{ "idle": summary, "busy": summary, "window_us": integer, "completions": integer, "in_flight": integer, "opening": "from-rest" or "running" }`, a summary being `{ "n": integer, "mean_uw": integer, "sd_uw": integer, "live_intervals": integer, "longest_live_run": integer }` as energy-measurement §6.2 defines them. `null` otherwise. | | `build` | object | `{ "profile": "release" or "debug", "toolchain": string or null, "target": term or null }`: the build of the code measured (energy-measurement §5, §8). `release` is an optimised build (for a Rust build, `opt-level` 2, 3, `s` or `z`, whatever its profile is named); any other build is `debug`. A finer vocabulary is a new registration. | | `power_reader` | string or `null` | The reader of the power interface (energy-measurement §8). Required under a hardware class (rule 4). | +| `fabrics` | object, or absent | Where the work the figure covers ran, and the figure divided by fabric (energy-measurement §6.3): `{ "steps": [step, ...], "shares": [share, ...] }`. A step is `{ "step": term, "fabric": term, "backend": string }`: a step of the work, in the vocabulary of the document that defines the figure's receipt (for `wai:video-package-receipt-id`, the steps of [packaging](packaging.md) §11), a fabric that ran it, and the implementation and device that did, a non-empty string. A share is `{ "fabric": term, "joules_micro": integer, "attribution": term }`. Absent, the claim does not divide its figure; never `null` (§2.4). | A report carries none of what follows from its values: neither the §4 ratio nor its verdict, which every reader derives (energy-measurement §6.2). A bracket @@ -723,6 +728,18 @@ Rules, checked at §3.1 step 4 in this order: **MUST** be the bracket's (`measurement_window_mismatch`), and the declared `relative_ppm` **MUST** be at least the least `p` the bracket supports (energy-measurement §6.2) (`measurement_declaration_below_bracket`). +6. Where `fabrics` is present, in this order: + - every fabric is `cpu`, `gpu`, `media` or `neural`, and every attribution `task` + or `rail` (energy-measurement §6.3) (`measurement_fabric_unknown`); + - there is at least one step and one share; the steps are in the order of their + `step`, in byte order, and then of their fabric, in the order just given, each pair + once; and the shares are in the order of their fabric, each fabric once + (`measurement_fabric_order`); + - every fabric a step names has a share (`measurement_fabric_unmetered`): a fabric + that ran work is metered; + - every share's fabric runs a step (`measurement_fabric_unused`); + - the shares sum to `joules_micro` (`measurement_fabric_sum`): the record divides + the figure, and the figure's class covers every share. **Against the figure** (§3.1 step 6). The context is the receipt the claim names, verified under its own profile's rules; for `moq-jwp:object`, that is @@ -1942,9 +1959,14 @@ order listed. 2. **Body.** A `body` that is not an object is `field_type`. Otherwise it is checked against the class's member table (for a lawful-basis body, the table of the record that `record`, read first, names; see - §2.4.6): a member absent is `missing_required_field`, an additional + §2.4.6): a member absent is `missing_required_field` (but a + `measurement` body's `fabrics`, which may be absent, §2.4), an additional member is `unknown_member`, and then, in the table's order, a member - that is not of the type the table gives it is `field_type`. That is + that is not of the type the table gives it is `field_type`; a `fabrics` + that is `null` is `field_type`, and within it, as in a bracket, a member + absent is `missing_required_field` and an additional one `unknown_member` + (`steps` before `shares`, each array's rows read for their members before + its rows' values). That is a wrong JSON type; an integer that is not one of §2.4.3; a byte string that is not lowercase hex, two digits a byte, or a hash that is not 64 of them; a value outside an enumeration this extension @@ -2095,6 +2117,11 @@ and never folds it in: confirmation changes the outcome of no step here. | 4 | `measurement_figure_mismatch` | `joules_micro` is not the figure the bracket gives | | 4 | `measurement_window_mismatch` | under a hardware class, the declared window is not the bracket's | | 4 | `measurement_declaration_below_bracket` | under a hardware class, `relative_ppm` is below the least the bracket supports | +| 4 | `measurement_fabric_unknown` | a fabric record names a fabric other than `cpu`, `gpu`, `media` and `neural`, or an attribution other than `task` and `rail` | +| 4 | `measurement_fabric_order` | a fabric record with no step or no share, its steps not in the order of their step and fabric, or its shares not in the order of their fabric, or a pair or a fabric twice | +| 4 | `measurement_fabric_unmetered` | a fabric record's step runs on a fabric the record gives no share | +| 4 | `measurement_fabric_unused` | a fabric record's share is on a fabric no step of it runs on | +| 4 | `measurement_fabric_sum` | a fabric record's shares do not sum to `joules_micro` | | 4 | `operating_point_empty_point` | a point is present with no member | | 4 | `operating_point_delivered_alone` | `op_delivered` is present without `op_committed` | | 4 | `operating_point_incomplete` | `op_requested` or `op_committed` is present without `op_delivered` | diff --git a/wai/extensions/packaging.md b/wai/extensions/packaging.md index 287b0aae7..1a4b02359 100644 --- a/wai/extensions/packaging.md +++ b/wai/extensions/packaging.md @@ -4,11 +4,16 @@ > this extension fixes what a verifier recomputes. This revision defines the policy, > its digest and what it may ask a packager to emit (§3), how a source is cut into > pieces (§4), the objects a packager writes, refinements and stills among them, and a -> piece's ladder (§5), the stage index (§6), the floor (§7), what each class is offered +> piece's ladder (§5), the stage index (§6), the floor, one or several, supplied as OBU +> streams or as an existing ladder's CMAF files (§7), what each class is offered > over HTTP and MoQ and how its delivery is simulated (§8), the package receipt and live -> windows (§9), and the package and its verification (§11). Reference impl: `wai-pack` — +> windows (§9), the package, its verification and a re-pack from a parent (§11), and +> where each step of a pack or a verify may run (§11.6). +> Reference impl: `wai-pack` — > `policy`, `capcheck`, `source`, `scenecut`, `classify`, `plan`, `encode`, `png`, -> `floor`, `cmaf`, `catalog`, `pack`, `live`, `delivery`, `verify`; in `wai-rs`, the +> `floor`, `cmaf`, `cmaf_read`, `catalog`, `files`, `pack`, `live`, `delivery`, `verify`, +> `fabric`, `fabric_meter`, `floor_decode`, and `wai-pack-gpu` for the steps a GPU runs; +> in `wai-rs`, the > encoder `int_video_enc`, the refinement encoder `staged::wir1`, the stage index > `stage_index`, the receipt `package` and the delivery simulator `stage_measure::sim`; > the corpus [`pack-conformance/`](../pack-conformance/). Keywords **MUST**, **MUST NOT**, @@ -32,8 +37,15 @@ where it names them. - **Class**: a delivery profile the policy names. - **Moment**: a declared span of presentation time with tags. - **Floor**: a rendition in a standard codec, for sinks that lack the primary. +- **Floor name**: the name a floor rung's files and catalog entries carry (§7.1): its + component's id when the component has one floor rung, the rung's id when it has + several. - **Timebase** of a component: `num / den` units per second. For video one unit is one frame; for audio, one sample. +- **Step**: one of the computations of a pack or a verify (§11.6), such as the base's + motion search or an object's content hash. +- **Fabric**: the kind of processor a step runs on: `cpu`, `gpu`, `media` (a hardware + video engine) or `neural` (a neural-network engine) (§11.6). ## 3. Policy @@ -81,6 +93,7 @@ absent table reads as empty. | `component.media` | string | required | `video`, `image`, `audio`, `world`, `feed`, `avatar`, `film` | | `component.source` | string | absent | | | `component.timebase` | table | required | members `num`, `den`, each 1 to `2^32 − 1`, required | +| `component.profile` | string | absent | `floor-only` (§7.8); absent, the standard profile | | `segmentation.target_ms` | integer | 2000 | | | `segmentation.min_ms` | integer | 1000 | | | `segmentation.max_ms` | integer | 4000 | | @@ -99,6 +112,7 @@ absent table reads as empty. | `ladder.params` | table | empty | by capability, below | | `floor.supplied_listing` | string | absent | 64 lowercase hexadecimal digits | | `floor.extra_keyframes` | boolean | `false` | | +| `floor.supplied_form` | string | absent | `cmaf` (§7.7); absent, the OBU form (§7.3) | | `live.layer_lag_ms` | array of integers | one 0 per layer | §3.4 | | `class` | array of tables | empty | | | `class.id` | string | required | 1 to 255 bytes | @@ -157,15 +171,17 @@ first that fails is the refusal: chain of `refines` returns to a rung it passed (`policy-refines-cycle`); every chain stays in its component and ends at a base (`policy-refines-base`); no rung is refined twice (`policy-refines-branch`). -8. Every component has a base rung (`policy-no-base`). +8. Every component has a base rung (`policy-no-base`), but a floor-only one (§7.8), which + has no base and no refinement rung, no `source`, and at least one floor rung + (`policy-floor-only`). 9. A rung's **layer** is 0 for a base or a floor, and one more than the rung it refines for a refinement; the policy has one more layer than its highest rung layer. No class's and no rule's `max_layer` exceeds the highest (`policy-class-layer`). 10. A rule's `then.ladder` names known rungs, all of one component, each once: - exactly one base, every refinement over a rung it names (so its layers are a chain - from that base), and every floor rung of the component (every piece has a floor, - §7.1) (`policy-rule-ladder`). + exactly one base (none, for a floor-only component), every refinement over a rung it + names (so its layers are a chain from that base), and every floor rung of the + component (every piece has a floor, §7.1) (`policy-rule-ladder`). 11. `live.layer_lag_ms` has one entry per layer, the first 0, the entries non-decreasing (`policy-layer-lag`). 12. The deadline values (`defaults.deadline_ms` and every rule's `then.deadline_ms`) @@ -205,8 +221,9 @@ no reference outside the piece, and no later object of the package references in it. **4.2** Piece boundaries are a pure function of the source frames and the effective -policy. Where the policy names `wai.pack.scenecut/1`, the boundaries **MUST** be those -§4.3 computes. The list of piece starts, in timebase units, is the **plan**, and its +policy; a floor-only component's, which has no source, of its first floor rung (§7.8). +Where the policy names `wai.pack.scenecut/1`, the boundaries of a component with a +source **MUST** be those §4.3 computes. The list of piece starts, in timebase units, is the **plan**, and its digest is BLAKE3("wai:pack-plan\x01" ‖ u64 LE n ‖ n × u64 LE start) @@ -475,7 +492,7 @@ bytes are zero. | 8 | 4 | `duration`, in timebase units | | 12 | 4 | `first_entry`, window-relative | | 16 | 2 | `n_entries` | -| 18 | 1 | `kind`: 0 natural, 1 static, 2 synthetic, 3 motion_high (§4.6), 4 world segment, 5 audio | +| 18 | 1 | `kind`: 0 natural, 1 static, 2 synthetic, 3 motion_high (§4.6), 4 world segment, 5 audio, 6 none (a floor-only component's piece, which no source classifies, §7.8) | | 19 | 1 | flags: bit 0 scene cut, bit 1 forced at `max` (§4.3), bit 2 started by a cue, bit 3 aligned to the lead (§4.5) | | 20 | 4 | `rules`: bit *i* set when rule *i* matched the piece (§8.1) | | 24 | 4 | `moments`: bit *i* set when the piece lies in moment *i* (§8.1) | @@ -562,7 +579,9 @@ of these, checked in this order: (`layer-gap`); its tier (§6.4: `tier-entropy-passthrough`, `tier-weakest`, then `tier-mismatch`); a non-zero `prefix_digest` with a tier other than decode-equivalence (`digest-without-tier`); a deadline on an entry that is not a - refinement (`deadline-role`); a floor without flag bit 2 (`floor-derived-from`); a + refinement (`deadline-role`); a floor whose flag bit 2 is not set exactly when its + piece has a base, so a floor presents its piece's base and a piece of floors alone + presents none (`floor-derived-from`); a content hash an earlier entry has at another length (`dup-length`); the duplicate flag other than set exactly when an earlier entry has the content hash (`dup-flag`). 3. Class by class: a flag with no meaning (`class-flags`); a plan value other than @@ -615,12 +634,18 @@ and one without the source cannot. A floor's `sse` is `2^64 − 1`. **7.1** Every piece of a video, image or audio component **MUST** have a floor rendition in a capability of SPEC §5's mandatory floor or recommended set; a packager refuses a video component with no floor rung (`floor-missing`). A film or world package SHOULD -have one. This revision packs a supplied AV1 floor (`wai.video.av1` or -`wai.video.av1.lossless`, `source = "supplied"`). +have one. A component may have several floor rungs: each piece then has one floor object +per floor rung, in ladder order (§5.7), so one package carries a ladder of standard-codec +renditions over one base, which is coded once. Each floor rung has a floor name (§2): the +component's id when the component has one floor rung, the rung's id when it has several. +A floor name names files (§7.3, §7.6, §8.3), so one that cannot be one path segment of a +listing, or two floor names of a package equal once `A`–`Z` are mapped to `a`–`z`, are +refused (`pack-id`, §11.1). This revision packs supplied AV1 floors (`wai.video.av1` or +`wai.video.av1.lossless`, `source = "supplied"`), one stream per floor rung. **7.2** *Floor objects.* Each piece's floor is one object of the floor rung's capability -(§5.2), whose manifest carries `derived_from` (SPEC §7.1, *Derived renditions*) naming -the piece's base: `motif` the base's content hash, `motif_capability` its capability, +(§5.2), whose manifest carries `derived_from` (SPEC §7.1, *Derived renditions*), but in a +floor-only component (§7.8), naming the piece's base: `motif` the base's content hash, `motif_capability` its capability, `renderer` the floor's maker, and `settings` `BLAKE3("wai:render-settings\x01" ‖ JCS(settings))` (§3.6). For a supplied floor, `renderer` is `supplied@` and the settings are `{"source": "supplied", "supplied_listing": @@ -633,13 +658,15 @@ sequence header's maximum frame height and width, the component's timebase `num` `den`), then each temporal unit as a `u32` little-endian length and its bytes as the stream holds them. -**7.3** *A supplied floor* is a directory holding, per video component, `.obu`: an -AV1 stream in the low-overhead OBU format (every OBU with its size field), one temporal -unit per source frame. Its listing (SPEC §3.1) of every file is pinned by the policy's -`floor.supplied_listing`. A packager **MUST** refuse, before it writes anything: +**7.3** *A supplied floor* is a directory holding, per floor rung of a video component, +`.obu` (§7.1): an AV1 stream in the low-overhead OBU format (every OBU with +its size field), one temporal unit per source frame. Its listing (SPEC §3.1) of every +file is pinned by the policy's `floor.supplied_listing`. A packager **MUST** refuse, +before it writes anything, the directory and then each floor rung's stream in ladder +order: - a directory whose listing does not hash to `floor.supplied_listing` - (`floor-listing-mismatch`), and a component with no stream in it + (`floor-listing-mismatch`), and a floor rung with no stream in it (`floor-stream-missing`); - a stream that does not split into temporal units each holding a frame, whose first unit holds no sequence header, with a sequence header whose bytes differ from the @@ -652,6 +679,18 @@ unit per source frame. Its listing (SPEC §3.1) of every file is pinned by the p `KEY_FRAME` and `show_frame` 1, or the sequence uses the reduced still-picture header; a unit that shows an existing frame does not. +*Key-frame sequence headers (informative).* A floor taken from an existing ladder without +re-encoding (its CMAF samples demuxed to this form, each with its temporal delimiter put +back) needs a sequence header in every unit that starts at a shown key frame. Where a +ladder's key-frame samples lack one, a producer that puts one back must put back the +stream's own first sequence header OBU, byte for byte, after each such unit's temporal +delimiter: §7.3 refuses any other bytes (`floor-av1-malformed`). The sequence header in +the ladder's sample entry (`av1C`) is not always the stream's: an encoder may write it +before it settles its coding tools, so that it differs from the in-band one in its tool +flags, and a stream with that header put back is refused. The packager writes its own +`av1C` from the in-band header (§7.6). A ladder whose key frames carry no in-band header +cannot be taken in the CMAF form (§7.7), whose units are its samples as they are. + The plan a supplied floor is made against is the **keyframe plan**, the file `plan-.txt`: each piece's first frame in decimal, one per line, each line ended by a line feed. Its pieces' starts are the plan of §4.2, and `wai-pack plan` writes it from the @@ -663,10 +702,10 @@ no tier or `replicate` claim covers it. **7.5** A floor produced by an encoder that is not a pure function of its input (§11) **MUST** name that encoder and its version in `derived_from.renderer`. -**7.6** *CMAF.* The floor of a video component is also written as CMAF files, which no -stage index lists: `floor//init.mp4`, and one fragment per piece, -`floor//.m4s`. Box layouts are ISO/IEC 14496-12's, with the -AV1 binding's sample entry; every integer is big-endian and every time 0: +**7.6** *CMAF.* Each floor rung's floor is also written as CMAF files, which no stage +index lists: `floor//init.mp4`, and one fragment per piece, +`floor//.m4s`. Box layouts are ISO/IEC 14496-12's, +with the AV1 binding's sample entry; every integer is big-endian and every time 0: - `init.mp4`: `ftyp` (major brand `cmfc`, minor version 0, compatible `cmfc`, `iso6`, `av01`), then `moov` holding `mvhd` (version 0, timescale `tb_num`, rate 1, volume 1, @@ -692,6 +731,100 @@ AV1 binding's sample entry; every integer is big-endian and every time 0: The codecs string of the floor is the AV1 binding's short form, `av01...`. +**7.7** *A supplied CMAF floor.* With `floor.supplied_form = "cmaf"`, a supplied floor is +an existing ladder's CMAF files rather than OBU streams: per floor rung of floor name *f* +(§7.1), a directory `/` holding `init.mp4` and the floor's media segments, which are +every other file of `/`, each named `*.m4s` and in no directory below it, in byte order +of their names, at least one. The floor's temporal units are the segments' samples, in +order, each a temporal unit without its temporal delimiter: a unit is the two bytes +`0x12 0x00` (a temporal delimiter OBU with its size field and no extension) followed by the +sample. Boxes are ISO/IEC 14496-12's; a box's 32-bit size is at least 8, a size of 1 is the +64-bit size that follows its type (at least 16), and a size of 0 is refused; a box's +children tile its body: + +- `init.mp4`: its top-level boxes tile the file; one `moov`, holding one `trak` and one + `mvex`; the `trak`'s `tkhd` names the track, its `mdia`'s `mdhd` gives the timescale + *T*, its `hdlr` is of handler type `vide`, and its `stsd` holds one sample entry, of type + `av01`; an `edts`, where the `trak` has one, holds an `elst` of one entry, at media + time 0 and rate 1; and the `mvex` holds one `trex`, of the track, whose defaults a + sample takes. +- a media segment: its top-level boxes tile the file: boxes of the types `styp`, `sidx`, + `prft`, `emsg`, `free` and `skip`, then one or more `moof`, each followed by an `mdat`, + and nothing else. A `moof` holds an `mfhd` and one `traf`, and nothing else; the `traf` + holds one `tfhd` of the track, one `tfdt` and one or more `trun`, and nothing else; the + `tfhd`'s flags are among `0x2`, `0x8`, `0x10`, `0x20` and `0x20000` (no base data + offset, no empty duration); each `trun`'s are among `0x1`, `0x4`, `0x100`, `0x200`, + `0x400` and `0x800`, `0x1` (its data offset) among them. A sample's duration, size and + flags are its `trun`'s (the first sample's flags its first-sample flags where the `trun` + gives them), else the `tfhd`'s defaults, else the `trex`'s; its bytes start at the + `moof`'s first byte plus its `trun`'s data offset, a run's samples one after another, + and lie in the `mdat` after the `moof`. + +A packager **MUST** refuse, before it writes anything, after the directory's listing +(§7.3), floor rung by floor rung in ladder order and segment by segment in order: + +1. a floor rung with no `/init.mp4` (`floor-stream-missing`); another file of `/` + that is not a media segment, or no media segment (`floor-cmaf-malformed`); +2. an `init.mp4` that is not the above (`floor-cmaf-malformed`), or whose timescale is 0 + or whose edit list is another (`floor-cmaf-timing`); +3. a media segment that is not the above, or that holds a sample of no bytes + (`floor-cmaf-malformed`), or a sample with a composition offset other than 0 or a + `moof` whose decode time is not where the one before it ended (`floor-cmaf-timing`), + each where it is read; then one whose first sample is not a sync sample + (`sample_is_non_sync_sample` set) (`floor-cmaf-malformed`); then a sample that does + not last one frame (`duration · num = T · den`), or a segment whose first decode time + is not the frame where the segment before it ended, the first at frame 0 + (`dts · num = frame · T · den`) (`floor-cmaf-timing`); then its units, as §7.3 reads a + stream's (`floor-av1-malformed`, a unit's own faults held to the end); +4. then, as §7.3: a unit count other than the source's frames (`floor-frame-count`), and + the faults held back (`floor-av1-malformed`); +5. other than one media segment per piece of the plan, each holding exactly its piece's + frames (`floor-cmaf-pieces`); +6. a key frame §7.3 refuses (`floor-keyframe-mismatch`). + +The floor's CMAF files are then the supplied ones, byte for byte: `floor//init.mp4` +the supplied `init.mp4`, and per piece `floor//.m4s` its media segment (§7.6's +writer is not used), which §8.3's playlists and MPDs list. The package also carries the +supplied floor's listing as `floor.listing`: its SHA-256 is `floor.supplied_listing`, which +the policy digest, and so the receipt, binds, and it names each of the ladder's files by +its SHA-256, so the receipt binds the ladder's bytes. A server may hold those files once, +for the ladder and the package alike (by a hard link, or by their content address): they +are the same bytes. The floor objects carry the units as §7.2 frames them, as in the OBU +form. + +**7.8** *The floor-only profile.* A component of `profile = "floor-only"` is its floor +rungs alone: no base, no refinement and no source (§3.4 item 8). It is for a library that +delivers its standard-codec renditions as WAI objects, each named by its content hash, +listed in a signed stage index and bound to a signed receipt, without the integer lane. + +- *Its pieces* are its first floor rung's: in the CMAF form (§7.7), one piece per media + segment; in the OBU form (§7.3), one piece from each of the stream's shown key frames + to the next, the stream's first unit one (`floor-keyframe-mismatch` otherwise), and the + first floor rung's unit count is the component's frame count. A piece of more than + `max_ms` (§4.4) is refused (`floor-piece-length`); `min_ms` and `target_ms` do not + apply, and the scene-cut segmenter does not run. Every other floor rung is held to those + pieces as §7.3 and §7.7 hold a floor to a plan. A piece's kind is `none` (§6.2), its + flags 0; a rule that states `when.piece_kind` matches none of them, and its moments are + §8.1's. +- *Its objects*: each piece has one floor object per floor rung (§7.1) and nothing else. + A floor object presents no base, so its manifest is §5.2's for its capability with no + `derived_from`, and its entry's flag bit 2 is clear (§6.3); everything else is §7.2's. + Every class lists the floor only (§8.1): no catalog lists a WAI object, the MoQ catalog + is the floors' tracks, and the package has no WAI playlist or MPD. +- *What it attests*: the receipt signs the policy, so the supplied floor's listing, and + the stage index, so every floor object's content hash, length and capability; a + verifier recomputes the dedup counts, holds every object to its hash and to §7.2's + framing, its units to the AV1 stream's structure (temporal units, one per frame, + sequence headers, shown key frames at the piece starts), and the CMAF files to the + units (§7.6) or, in the CMAF form, to the ladder's bytes through `floor.listing` + (§7.7). A sink that checks an object's hash against the index receives the bytes the + signer packed, or refuses them. +- *What it does not attest*: a floor states no tier (§7.4): no decoded-output digest is + stated or checked, so nothing says what a decoder makes of the units; there is no + source, so no `sse` and no fidelity to anything; there is no primary, so no + `replicate` claim; and the pieces are not classified. It attests delivery, not + pictures. + ## 8. Classes, catalogs and delivery **8.1** *What a class lists.* The stages listed for a class are a pure function of the @@ -704,7 +837,8 @@ catalog bytes. `e_ms > from_ms`. Rule *i* matches it when each condition the rule states holds: its kind is in `when.piece_kind`, and a tag of a moment it lies in is in `when.moment_tag`. Matching rules fold in document order (§3.4). -- A floor-only class lists the floor (`0xFF`). Otherwise the class lists +- A floor-only class lists the floor (`0xFF`), and every class lists only the floor of a + piece with no base, a floor-only component's (§7.8). Otherwise the class lists `min(max_layer, the rules' then.max_layer, the piece's highest layer)`; under `max_kbps`, while the listed prefix needs more than `max_kbps`, that is `ceil(8 · bytes · num / (1000 · duration · den))` kilobits per second over the bytes of @@ -737,18 +871,20 @@ second; a variant's `BANDWIDTH` is the largest over the pieces it lists and `AVERAGE-BANDWIDTH` the rate of all their bytes over all their durations. A floor variant's bytes per piece are its fragment's; a WAI variant's are the listed bases' and refinements', over the pieces its HTTP view lists (above). Every playlist -line ends with a line feed. For component *c*, of frame size `W×H`, whose floor has -codecs string *F* and maximum frame size `FW×FH`: +line ends with a line feed. For component *c*, of frame size `W×H`, and each of its +floor rungs, in ladder order, of floor name *f* (§7.1), codecs string *F* and maximum +frame size `FW×FH`: - `hls/classic/master.m3u8`: `#EXTM3U`, `#EXT-X-VERSION:7`, - `#EXT-X-INDEPENDENT-SEGMENTS`, `#EXT-X-STREAM-INF:BANDWIDTH=,AVERAGE-BANDWIDTH=,CODECS="F",RESOLUTION=FWxFH`, - `../classic/floor-.m3u8`: a URI that names the same playlist from every class's + `#EXT-X-INDEPENDENT-SEGMENTS`, then per floor rung + `#EXT-X-STREAM-INF:BANDWIDTH=,AVERAGE-BANDWIDTH=,CODECS="F",RESOLUTION=FWxFH` and + `../classic/floor-.m3u8`: a URI that names the same playlist from every class's directory, so each class's master differs from this one only by the session-data line, as [http-delivery](http-delivery.md) §11.1 and §11.8 require. -- `hls/classic/floor-.m3u8`: `#EXTM3U`, `#EXT-X-VERSION:7`, +- `hls/classic/floor-.m3u8`, per floor rung: `#EXTM3U`, `#EXT-X-VERSION:7`, `#EXT-X-TARGETDURATION:`, `#EXT-X-MEDIA-SEQUENCE:0`, `#EXT-X-PLAYLIST-TYPE:VOD`, - `#EXT-X-INDEPENDENT-SEGMENTS`, `#EXT-X-MAP:URI="../../floor//init.mp4"`, then per - piece `#EXTINF:,` and `../../floor//.m4s`, then `#EXT-X-ENDLIST`. + `#EXT-X-INDEPENDENT-SEGMENTS`, `#EXT-X-MAP:URI="../../floor//init.mp4"`, then per + piece `#EXTINF:,` and `../../floor//.m4s`, then `#EXT-X-ENDLIST`. - `hls//master.m3u8`: the classical master, byte for byte, with, when the class lists a WAI object over HTTP, `#EXT-X-SESSION-DATA:DATA-ID="science.transaction.wai.multivariant",VALUE="wai.m3u8"` after `#EXT-X-INDEPENDENT-SEGMENTS`, and no other change. @@ -759,8 +895,9 @@ codecs string *F* and maximum frame size `FW×FH`: `#EXT-X-STREAM-INF:BANDWIDTH=,AVERAGE-BANDWIDTH=,CODECS="",X-WAI-FLOOR="",RESOLUTION=WxH`, `wai-.m3u8`. The union and the floor are [http-delivery](http-delivery.md) §4.2's over the objects the class lists. -- `hls//wai-.m3u8`: the floor playlist's lines without `#EXT-X-MAP`, adjacent - to it ([http-delivery](http-delivery.md) §11.2); per piece, `#EXT-X-GAP` when the +- `hls//wai-.m3u8`: the first floor rung's playlist's lines without + `#EXT-X-MAP`, adjacent to it ([http-delivery](http-delivery.md) §11.2) and so to every + floor rung's, which list the same pieces; per piece, `#EXT-X-GAP` when the class's HTTP view lists nothing of it (a floor-only piece, or one whose base is not of the default base capability), `#EXTINF:,`, each refinement the class lists, in entry order, as `#WAI-LAYER:N=,URI="../../objects/.wai#n="`, @@ -778,10 +915,13 @@ over the component's whole duration and its target duration, `` and ``, indented by two spaces a level: - `dash/classic.mpd`: `` - holding `` with - ``: ``, + holding, per floor rung, `` with + ``: ``, a `SegmentTimeline` of one `` per - piece, and one `` per piece. + piece, and one `` per piece. With + several floor rungs, the `AdaptationSet` carries no `codecs`, `width` or `height`, and + each `Representation` carries its own after `bandwidth`: + ``. - `dash/.mpd`, when the class's HTTP view lists a WAI object: `` holding ``, @@ -819,9 +959,10 @@ does not hold. A sink receives every track a track depends on (moq-streaming-for §4.1), so a dependency is all of them. A refinement track carries `wai_delivery_timeout_ms` (§8.6), a catalog field this extension defines under the `wai_` prefix of moq-streaming-format §4. The base track has `altGroup` 1 when the component has -a floor: the floor is a track `/floor` of `packaging` `"cmaf"`, in the same namespace, -with `altGroup` 1, `renderGroup` 1, `codec`, `width` and `height`, and a sink that -selects the floor subscribes to no layer track. The receipts tracks follow, one per media +a floor: each floor rung's floor, in ladder order, is a track `/floor` for its floor +name *f* (§7.1), of `packaging` `"cmaf"`, in the same namespace, with `altGroup` 1, +`renderGroup` 1, `codec`, `width` and `height`, and a sink that selects a floor +subscribes to no layer track. The receipts tracks follow, one per media track in its order, each `{"isLive": false, "name": "/receipts", "namespace", "packaging": "wai-receipts"}`. The catalog passes moq-streaming-format §4.1's check, and a packager writes no other. A package holds no receipt: the publisher signs each track's @@ -956,7 +1097,8 @@ figure and class that do not cohere, or a legacy label (`receipt-energy`); a sig that does not verify (`receipt-signature`). **9.2** Live windows chain by the parent link with parent kind `live-window`. A re-pack -of an earlier package **MAY** name it with parent kind `re-pack`. +of an earlier package **MAY** name it with parent kind `re-pack`, and one that takes its +bases and refinements from it **MUST** (§11.5). The reference live packer (`wai-pack live`, `wai_pack::live`) takes a source a frame at a time, cuts it with the segmenter of §4.3, which decides a frame once `lookahead_frames` @@ -1041,23 +1183,29 @@ royalty-free by its standards body"; it is not a freedom-to-operate opinion. policy.toml policy.json plan-.txt index-.wsix package.receipt.json objects/.wai … - floor//init.mp4 floor//.m4s … + floor//init.mp4 floor//.m4s … (per floor rung, of floor name f) + floor.listing (a supplied CMAF floor's listing, §7.7) hls/classic/… hls//… dash/… moq/catalog.json stages/.json claims/.measurement.json (a metered package) LISTING `policy.toml` is the policy as given; `policy.json` its effective canonical JSON (§3.2). `LISTING` is the listing (SPEC §3.1) of every other file, and its SHA-256 is the -**pack digest**. A component or class id that cannot be one path segment of a listing, -two class ids equal once `A`–`Z` are mapped to `a`–`z`, and a class named `classic` in -any case (ids name paths, and paths fold case) are refused (`pack-id`). +**pack digest**. A component or class id or a floor name (§7.1) that cannot be one path +segment of a listing, two class ids or two floor names equal once `A`–`Z` are mapped to +`a`–`z`, and a class named `classic` in any case (ids name paths, and paths fold case) +are refused (`pack-id`). **11.2** *Re-pack equivalence.* Given the same source bytes, effective policy, supplied floor, signing key and packager identity, a conforming reference packager **MUST** -produce byte-identical package files on every machine, except the energy figure and -measurement claim of a metered package and floor objects §7.5 covers. A verifier +produce byte-identical package files on every machine and whichever fabric runs each +step (§11.6), except the energy figure and measurement claim of a metered package and +floor objects §7.5 covers. A verifier **MAY** pack again and compare listings. A packager whose identity differs is not held -to this. +to this. A re-pack from a parent (§11.5) is held to it with the parent among its inputs; +and where the parent was packed by a conforming packager from the same source under base +and refinement rungs of the same capabilities and parameters, its files are those of a +pack that codes every piece, but for its receipt's parent and so `LISTING`. **11.3** *Verification.* A verifier of a package, without its sources, applies these checks in this order and refuses at the first that fails; a check that reads files a @@ -1077,7 +1225,7 @@ failed check names is not applied: effective canonical JSON, `royalty_free_only` forced on where `policy.json` says `true` (`policy-json-mismatch`; an override never turns it off, §3.2, so a `policy.json` that says `false` over a `policy.toml` that says `true` is refused - here); its ids can name files (`pack-id`, §11.1); and under that effective policy it + here); its ids and floor names can name files (`pack-id`, §11.1); and under that effective policy it asks for nothing a packager may not emit (§3.6's reason; under `royalty_free_only`, a patent-pool floor is `license-refused`). 5. The receipt's components are the policy's, by id, in order, each of the policy's @@ -1089,18 +1237,20 @@ failed check names is not applied: class are the component's; its string table is the component's id, the class ids in policy order, then each capability at its first use; its class records are the policy's classes, in order, with their `max_layer`, floor-only flag and `max_kbps`; - every piece's kind is one a video piece has; its rules and moments are §8.1's from + every piece's kind is one a video piece has, `none` exactly in a floor-only + component (§7.8); its rules and moments are §8.1's from its kind and span; its entries are the rungs of its ladder (§5.7), by role, - capability and layer: its base, each refinement in layer order, each floor; each + capability and layer: its base, each refinement in layer order, each floor (a + floor-only component's, its floors alone); each refinement's deadline is its plan's (§8.6); and its class plan is §8.1's from its entries; - the plan file holds the index's starts and its digest is the header's (`plan-mismatch`); - every entry's object is present (`object-missing`) and keeps the object rules of §6.3, its counted bytes included; - - before any frame is decoded, each piece's floor object, where the policy has a floor - rung and the object's payload reads as §7.2's framing, holds one unit per frame of - its piece (`floor-object-mismatch`); + - before any frame is decoded, each piece's floor objects, where the policy has floor + rungs and an object's payload reads as §7.2's framing, hold one unit per frame of + their piece (`floor-object-mismatch`); - every base and refinement, in entry order: a base decodes by its capability (a still is a PNG §5.7 reads, its one frame held for the piece), or it is `prefix-digest`; its manifest is the one §5.2 states for its piece's frames and its @@ -1111,61 +1261,184 @@ failed check names is not applied: does not apply, ends the check; - then every decode-equivalent prefix decodes to its `prefix_digest` (`prefix-digest`); - - when all of that holds, the floor: per piece, one floor object of the floor rung's - capability whose renderer, settings, framing header, unit count and target are - §7.2's (`floor-object-mismatch`) and which presents the piece's base - (`floor-motif-mismatch`); its units each one temporal unit holding a frame, the - first of the first piece carrying a sequence header, every sequence header the - first's bytes, every shown key frame carrying one (`floor-av1-malformed`); each - piece opening on a shown key frame, and no other unit being one unless the policy - allows extra key frames (`floor-keyframe-mismatch`); and the CMAF files are the - ones its temporal units give (§7.6, `floor-cmaf-mismatch`); + - when all of that holds, the floors, floor rung by floor rung in ladder order: per + piece, one floor object per floor rung, the rung's the *k*-th floor entry for the + *k*-th floor rung, of the rung's capability, whose renderer, settings, framing + header, unit count and target are §7.2's (`floor-object-mismatch`) and which + presents the piece's base (`floor-motif-mismatch`), or, in a floor-only component, + which carries no `derived_from` (`floor-object-mismatch`); its units each one temporal unit + holding a frame, the first of the rung's first piece carrying a sequence header, + every sequence header the first's bytes, every shown key frame carrying one + (`floor-av1-malformed`); each piece opening on a shown key frame, and no other unit + being one unless the policy allows extra key frames (`floor-keyframe-mismatch`); and + the rung's CMAF files are the ones its temporal units give (§7.6, + `floor-cmaf-mismatch`); or, for a supplied floor in the CMAF form (§7.7), `floor.listing` + is a listing that hashes to `floor.supplied_listing`, `floor//init.mp4` is the file + of its line `/init.mp4` and reads as §7.7's initialization segment, and the + listing's media segments of `/`, in its order, are one per piece, piece *k*'s + `floor//.m4s`, reading as §7.7's media segment, opening on a sync + sample, each sample one frame and the first at the piece's start, its samples the + piece's floor units without their temporal delimiters (`floor-cmaf-mismatch`); - then the catalogs are the ones the index, the objects and the floor give, and an index no catalog can be written for (a start past `2^53 − 1`) is refused (`catalog-mismatch`). 7. A metered package's measurement claim (§9.4: `measurement-claim-missing`, - `measurement-claim-invalid`); an object file no entry names (`object-unlisted`); a + `measurement-claim-invalid`, a fabric record naming a step this extension does not + define, §11.6, among the latter); an object file no entry names (`object-unlisted`); a catalog file past the ones given (`catalog-unexpected`); any other file (`unexpected-file`). **11.4** *What this revision packs.* The reference packager packs one video component: bases of `wai.video.int_motion` (§5.5, §5.6) and stills of `wai.image.png` (§5.7); refinements of `wai.video.int_refine` over an `int_motion` base (§5.4); each piece by its -ladder, a rule's ladder subset included (§5.7); and a supplied AV1 floor (§7.3). Its live -packer packs the same pieces in windows, without a floor (§9.2). It refuses by name, +ladder, a rule's ladder subset included (§5.7); and a supplied AV1 floor per floor rung, +one or several (§7.1), in the OBU form (§7.3) or the CMAF form (§7.7); and floor-only +components (§7.8). Its live +packer packs the same pieces in windows, without a floor (§9.2). It runs `base-search`, +`sse` and `object-hash` on a GPU that qualifies, where it is built to and asked to, and +every other step on the CPU (§11.6). It refuses by name, before writing anything, what it does not pack yet: another medium (`pack-media-unsupported`), a floor to encode (`pack-floor-encode-unsupported`), and a rung of a capability it does not encode, or a refinement over a base it does not refine (`pack-capability-unsupported:`, every one naming the capability of the rung it does not pack); and a component with no source (`pack-source-missing`) or whose source's frame rate is not its timebase (`pack-source-rate`). Where its own work fails it -refuses by name too, and writes nothing: an encode the encoder refuses, such as a piece +refuses by name too, and leaves nothing written (a file it wrote before the refusal is +removed): an encode the encoder refuses, such as a piece past the samples it holds, or an object it wrote that does not count (`pack-encode`); a piece past `2^32 − 1` units (`pack-piece-length`); catalogs it cannot write, the case §11.3 refuses as `catalog-mismatch` (`pack-catalog`); a meter that was asked for and gives no figure, a span too short to reach a microjoule or a figure past `2^64 − 1` (`pack-meter`, never an unmetered package in its place); a measurement claim it cannot -write (`pack-measurement-claim`); and a listing it cannot write (`pack-listing`). It +write (`pack-measurement-claim`); a listing it cannot write (`pack-listing`); and a source +that does not read the same twice (`pack-source-changed`) or a supplied floor stream that +does not (`floor-listing-mismatch`): it reads each a frame or a temporal unit at a time, +once to cut and check it and once to code it, and holds neither whole. What it holds is +not a function of the source's length but for a record per piece and per entry and a byte +per frame of each floor (whether it starts at a key frame): the frames of the pieces it +codes at once, which it chooses, each piece coded alone (§4.1), so the package is the same +for any number; one piece of each floor; and, for the catalogs, one object at a time, +read back from where it wrote it. Each file is written whole as it is made. It writes a package only into a directory that is new or holds nothing, and refuses any other before it packs (`pack-out-not-empty`): written among another package's files, it would leave behind the ones it does not write. +**11.5** *Re-pack from a parent.* A packager **MAY** take every piece's base and +refinements from an earlier package, its **parent**, instead of coding them, so a +component's integer base is coded once and taken by every package made from the same +source after it. It reads the source as for a pack that codes (§4: its pieces and their +kinds, §4.3, §4.6, are this source's), and then, before it writes anything, **MUST** +refuse: + +1. a parent that does not verify as §11.3 verifies a package (`repack-parent-invalid`, + with the reason the parent fails for); +2. a parent with no component of the component's id, media and timebase, or whose pieces + are not this source's, piece by piece: another number of pieces, or a piece of + another start, duration, flags or kind, or whose ladder (§5.7, under the parent's + policy) codes its base and refinements in rungs of other capabilities or other + parameters (§3.3) than this policy's ladder for the piece, in layer order, or with + another deadline (§8.6) (`repack-parent-mismatch`); +3. a piece whose prefixes, each the parent's base decoded and its refinements applied in + layer order by a staged-delivery §4 sink, do not reconstruct this source with the + `sse` the parent's entry states (§6.6) (`repack-source-mismatch`): a parent packed + from another source. + +It then writes, for each piece, the parent's base and refinement objects and their +entries' fields (§6.2: content hash, lengths, capability, role, layer, tier, prefix +digest, `sse`, deadline) in place of coding them, and the floors as it would; its +receipt names the parent's receipt with parent kind `re-pack` (§9.1). A verifier holding +the parent **MAY** check a re-pack against it: the parent verifies +(`repack-parent-invalid`), the re-pack's receipt names the parent's receipt with parent +kind `re-pack`, and each component's pieces are the parent's, piece by piece, of the same +start, duration, kind and flags, whose base and refinement entries are the parent's +entries, every field the same but the entry's place in its index: the entry it refines +counted from its piece's first entry, and the duplicate flag, which an index's own +entries decide (`repack-parent-mismatch`). A re-pack holds no source of its parent's +bases; what binds a reused base to this source is the third check, and what binds it to +the parent is the receipt. + +**11.6** *Steps and fabrics.* The steps of a pack and a verify are named by these terms: + +| Step | What it computes | +|---|---| +| `source-decode` | a source's frames from a coded rendition, before a pack, by a producer's tool (§4.7 reads the result) | +| `source-read` | a source's frames or samples (§4.7) | +| `segment` | the pieces (§4.3) and their kinds (§4.6) | +| `base-search` | the integer base's motion search (§5.5) | +| `base-code` | the rest of the integer base (§5.5), its step (§5.6) and a still (§5.7) | +| `refine-code` | refinement layers, each applied by the reference sink (§5.4) | +| `sse` | an entry's `sse` (§6.6) | +| `object-hash` | an object's content hash (§5.3) | +| `digest` | the SHA-256 digests: decoded-output digests (§6.5), listings, file names | +| `floor-read` | a supplied floor's units, CMAF boxes and listing (§7.3, §7.7) | +| `floor-decode` | a floor's units decoded to pictures (item 4 below) | +| `index` | the stage indexes, catalogs, receipt and claim (§6, §8, §9) | +| `io` | reading and writing files | + +Every step is a function of its inputs, defined in integers (and `floor-decode` by the +AV1 decoding process), and none names a fabric: + +1. *Packages.* A packager **MAY** run a step on any fabric whose output is the step's + for every input. It **MUST NOT** run a step on a backend that has not given the + reference implementation's output on the qualifying inputs before it is used (the + reference packager's: the frame pairs of `wai_pack::fabric::qualifying_frames` for + the motion search, and seeded inputs for SSE and BLAKE3, on each device it opens), nor + at all on one that computes otherwise than the step's definition, such as in floating + point where the step is defined in integers, or with a learned approximation. A + backend that cannot take a call (a size, a lost device) leaves it to the CPU, with the + same output. So §11.2 holds across fabrics: the package files are the same bytes + whichever fabric ran each step, and only a metered package's measurement claim says + where they ran. +2. *Verdicts.* A verifier's verdict and its reason are functions of the package + (§11.3). A verifier **MAY** compute a check on another fabric where the package states + the value the check compares with, such as an object's content hash: a match shows + that the fabric computed the check, and a mismatch **MUST** be computed again on the + reference implementation before it is reported. Every other check runs on a backend + held to the reference's output as item 1 holds a packager's. A verdict that changes + with the fabric is the verifier's fault, never the package's. +3. *Hardware encoders.* A hardware encoder's output depends on the chip, its firmware + and driver, and its settings, and no rule fixes it, so no step of this extension is + computed by one. A floor a packager is given is an input, whatever made it (§7.3, + §7.7); a floor a packager encodes on such hardware is one §7.5 covers, whose + `derived_from.renderer` names the encoder, its version, and the device and driver that + ran it, and §11.2 does not hold its bytes. +4. *Decoding a floor.* The AV1 decoding process fixes every output sample of a stream + whose sequence header has `film_grain_params_present` 0, and of every stream before + film grain is applied (AV1 §7.2), so conformant decoders on any fabric give the same + pictures of a floor's units. A floor states no decoded-output digest (§7.4), so a + decode of it has no stated value to compare with: a verifier that decodes floors + **MUST NOT** refuse a package for what a decoder other than the reference gives, nor + read a hardware decoder's error or concealment as a verdict. A hardware decoder's + frames may be held in a wider format than the stream's bit depth (a 10-bit sample + shifted into the high bits of a 16-bit word); a reader of them recovers each sample + exactly or refuses the frame, and never rounds. (Informative: `wai-pack floor-decode` + reports each piece's digest from either decoder, for comparing them.) +5. *The fabric record.* A metered package's measurement claim **MAY** carry a fabric + record (jwp-receipts §2.4.8, energy-measurement §6.3): each step the metered span ran, + with every fabric that ran it and its backend, and the figure's share on each. Its + steps are this section's terms (§11.3 step 7). An unmetered package carries no claim, + so no record: which fabric ran a step is not part of the package, and two packages + that differ only in where their steps ran are the same files. + ## 12. Reasons | Reason | Where | |---|---| | `policy-toml` (not UTF-8, a byte-order mark, not TOML 1.0, nesting past 32), `policy-float`, `policy-datetime`, `policy-negative`, `policy-integer-range` | §3.2 | | `policy-unknown-key`, `policy-missing-key`, `policy-type`, `policy-value`, `policy-schema` | §3.3 | -| `policy-too-many-components`, `policy-too-many-rungs`, `policy-too-many-classes`, `policy-too-many-rules`, `policy-too-many-moments`, `policy-duplicate-id`, `policy-lead`, `policy-open-gop`, `policy-piece-bounds`, `policy-ladder-component`, `policy-refines-role`, `policy-dangling-refines`, `policy-refines-cycle`, `policy-refines-base`, `policy-refines-branch`, `policy-no-base`, `policy-class-layer`, `policy-rule-ladder`, `policy-layer-lag`, `policy-too-many-deadlines`, `policy-deadline-unreachable` | §3.4 | +| `policy-too-many-components`, `policy-too-many-rungs`, `policy-too-many-classes`, `policy-too-many-rules`, `policy-too-many-moments`, `policy-duplicate-id`, `policy-lead`, `policy-open-gop`, `policy-piece-bounds`, `policy-ladder-component`, `policy-refines-role`, `policy-dangling-refines`, `policy-refines-cycle`, `policy-refines-base`, `policy-refines-branch`, `policy-no-base`, `policy-floor-only`, `policy-class-layer`, `policy-rule-ladder`, `policy-layer-lag`, `policy-too-many-deadlines`, `policy-deadline-unreachable` | §3.4 | | `capability-unknown`, `capability-not-payload`, `capability-candidate`, `capability-role`, `license-unclassified`, `license-refused`, each naming the capability (and the licence label) | §3.6 | | `y4m-header`, `y4m-interlaced`, `y4m-colorspace`, `y4m-size-change`, `y4m-truncated`, `wav-format`, `wav-truncated` | §4.7 | | `index-magic`, `index-version`, `index-truncated`, `index-reserved`, `index-media-class`, `index-role`, `index-tier`, `index-string`, `index-trailing` | §6.2 | | `index-timebase`, `window-start`, `piece-order`, `piece-entries`, `piece-kind`, `entry-flags`, `entry-order`, `layer-role`, `refines-outside-window`, `refines-mismatch`, `layer-gap`, `tier-entropy-passthrough`, `tier-weakest`, `tier-mismatch`, `digest-without-tier`, `deadline-role`, `floor-derived-from`, `dup-length`, `dup-flag`, `class-plan`, `class-flags` | §6.3, §6.4 | | `object-length`, `object-hash`, `non-envelope-entry`, `object-lengths`, `object-capability`, `object-refines`, `object-derived-from` | §6.3 | | `floor-missing`, `floor-listing-mismatch`, `floor-stream-missing`, `floor-av1-malformed`, `floor-frame-count`, `floor-keyframe-mismatch` | §7.1, §7.3 | +| `floor-stream-missing`, `floor-cmaf-malformed`, `floor-cmaf-timing`, `floor-cmaf-pieces` | §7.7 | +| `floor-keyframe-mismatch`, `floor-piece-length` | §7.8 | | `floor-object-mismatch`, `floor-motif-mismatch`, `floor-av1-malformed`, `floor-keyframe-mismatch`, `floor-cmaf-mismatch`, against a package | §11.3 | | `receipt-json`, `receipt-version`, `receipt-index-count`, `receipt-index-digest`, `receipt-stage-root`, `receipt-component`, `receipt-policy-digest`, `receipt-counts`, `receipt-parent-kind`, `receipt-energy`, `receipt-signature` | §9.1 | | `measurement-claim-missing`, `measurement-claim-invalid` | §9.4 | | `unexpected-file`, `listing-missing`, `listing-mismatch`, `policy-digest-mismatch`, `policy-json-mismatch`, `policy-component-mismatch`, `index-missing`, `index-policy-mismatch`, `plan-mismatch`, `object-missing`, `object-manifest`, `prefix-digest`, `catalog-mismatch`, `catalog-unexpected`, `object-unlisted` | §11.3 | | `pack-id`, `pack-source-missing`, `pack-source-rate`, `pack-media-unsupported`, `pack-floor-encode-unsupported`, `pack-capability-unsupported` (naming the capability) | §11.1, §11.4 | -| `pack-encode`, `pack-piece-length`, `pack-catalog`, `pack-meter`, `pack-measurement-claim`, `pack-listing`, `pack-out-not-empty` | §11.4 | +| `pack-encode`, `pack-piece-length`, `pack-catalog`, `pack-meter`, `pack-measurement-claim`, `pack-listing`, `pack-source-changed`, `pack-out-not-empty` | §11.4 | +| `repack-parent-invalid`, `repack-parent-mismatch`, `repack-source-mismatch` | §11.5 | diff --git a/wai/http-conformance/http_verify.py b/wai/http-conformance/http_verify.py index e28253049..a463b92bb 100644 --- a/wai/http-conformance/http_verify.py +++ b/wai/http-conformance/http_verify.py @@ -70,8 +70,26 @@ def blake3(b): return B3.blake3(b) +# Each object's content hash, computed once: an object resolved many times (resolve_uri, +# once per URI that names it) is hashed once. A caller that has checked an object's hash +# against its own record may seed it (seed_content_hash). +_CONTENT_HASH = {} + + def content_hash(env): - return blake3(DOMAIN + env) + h = _CONTENT_HASH.get(env) + if h is None: + h = _CONTENT_HASH[env] = blake3(DOMAIN + env) + return h + + +def seed_content_hash(env, h): + """Record an object's content hash that the caller has computed and checked.""" + _CONTENT_HASH[env] = h + + +def forget_content_hashes(): + _CONTENT_HASH.clear() # ------------------------------------------------------------------ the registry @@ -3035,7 +3053,11 @@ def resolve_uri(objs, uri): name = base.rsplit("/", 1)[-1] if name.endswith(".wai") and re.fullmatch(r"[0-9a-f]{64}", name[:-4]): cid = name[:-4] - b = next((b for b in objs.values() if cid is not None and content_hash(b).hex() == cid), None) + # An object held under its own content id is found by name, its hash checked; any + # other by its content hash, each object hashed once (content_hash). + b = objs.get(f"{cid}.wai") if cid is not None else None + if b is None or content_hash(b).hex() != cid: + b = next((b for b in objs.values() if cid is not None and content_hash(b).hex() == cid), None) if b is None: raise SystemExit("http_verify: %s names no corpus object" % uri) return b diff --git a/wai/pack-conformance/README.md b/wai/pack-conformance/README.md index 375ff2408..2f26ee8c0 100644 --- a/wai/pack-conformance/README.md +++ b/wai/pack-conformance/README.md @@ -57,6 +57,43 @@ packages (§6–§11), and their delivery over a simulated link (§8.9). written by `supplied_floor.py`. The bumper's base, layers and floor are one object each; the still's piece is carried over HTTP by the floor (§8.3) and over MoQ on the base track. +- `packs/video-ladder-01/` — a golden package of two floor rungs over one base (§7.1): + the fixture and base rung of `video-base-01`, so its bases are that package's objects, + and two supplied AV1 streams, `floor/hi.obu` at the fixture's size and `floor/lo.obu` + at half its width and height, each written by `supplied_floor.py` (`--scale lo=2`). + Each piece has its base and one floor object per floor rung; each floor has its own + CMAF files under its floor name (`floor/hi/`, `floor/lo/`), its own floor playlist and + MoQ track, and the classical master, every class's master and `dash/classic.mpd` list + both. +- `packs/video-repack-01/` — a re-pack golden (§11.5): `video-ladder-01`'s policy under + another asset id and its supplied floor, packed with every piece's base taken from the + parent its file `parent` names, `video-base-01`, rather than coded. Its objects are + `video-ladder-01`'s; its receipt names `video-base-01`'s receipt as the package it + re-packs (parent kind `re-pack`); and each piece's base entry is the parent's, field for + field. Both verifiers check it against its parent. +- `packs/video-cmaf-01/` — a golden whose supplied floor is in the CMAF form (§7.7): + `video-ladder-01`'s policy with `floor.supplied_form = "cmaf"`, and its two streams as a + media muxer wrote them, `floor//init.mp4` and `floor//seg_.m4s`, one + segment per piece, by `supplied_cmaf.py` (ffmpeg's HLS muxer, `-c copy`). The package's + floor files are those files, byte for byte, under their SHA-256; `floor.listing` is the + supplied floor's listing; and each floor object holds its piece's samples, which are the + OBU form's temporal units of the same streams. +- `cmaf-mutations/` — the CMAF golden altered, in `package-mutations/`'s layout: itself + (`ok`); a segment replaced by one of the same samples, a `free` box before it, under its + own SHA-256; `floor.listing` altered; and without it (each `floor-cmaf-mismatch`). +- `packs/video-floor-only-01/` and `packs/video-floor-only-02/` — floor-only goldens + (§7.8): a component of `profile = "floor-only"` with the ladder's two floor rungs and no + base or source, the floor in the CMAF form (`video-cmaf-01`'s files) and in the OBU form + (`video-ladder-01`'s streams). Their pieces are the first floor's segments or shown key + frames, the ladder golden's plan; each piece is its two floor objects, which carry no + `derived_from` and hold the ladder golden's units, of kind `none`; no class lists a WAI + object. +- `ladder-mutations/` — packages a verifier must refuse or accept (§11.3), each the + ladder golden altered (re-sealed with its key where the receipt or `LISTING` alone + would catch it), in `package-mutations/`'s layout: the golden itself (`ok`); piece 2's + two floor objects swapped (`floor-object-mismatch`); the second floor's CMAF files + under the component's name (`floor-cmaf-mismatch`); and a classical master listing one + floor of two (`catalog-mismatch`). - `mutations/` — stage indexes, objects and version-2 receipts, and `expected.json`: each case's reason (§6.2–§6.4, §9.1), a well-formed case of each kind among them, and three receipts carrying a signature only a verifier that checks the equation @@ -86,7 +123,9 @@ packages (§6–§11), and their delivery over a simulated link (§8.9). window past 32 KiB, bytes after the zlib stream, and its Adler-32. And one dynamic block of literals twice: with a lone distance code of one bit, read (the one incomplete code set the zlib library takes), and of two bits, refused. -- `staged-mutations/` — the staged golden altered and re-sealed with its key, in the +- `staged-mutations/` — the staged golden itself (`ok`: verified without its sources, + every layer's prefix digest held to it), and the staged golden altered and re-sealed + with its key, in the layout of `package-mutations/`: a refinement on another deadline than its plan's, a piece missing its top layer, a still where the policy's rule now gives the piece the default ladder (each `index-policy-mismatch`), a top layer coded again at another step @@ -115,7 +154,10 @@ packages (§6–§11), and their delivery over a simulated link (§8.9). off among them), a missing or corrupted object, a live window no catalog can be written for, floor objects that do not open on a key frame or are not §7.2's, files and directories a strict read finds, and a receipt file that is not its canonical - form; and one the verifier must accept (an extra key frame the policy allows). + form; and those the verifier must accept (an extra key frame the policy allows, and a + metered package, §9.4: the golden re-sealed with a 500 mW model meter over one second + and its measurement claim, every member fixed), with a claim about another figure + (`measurement-claim-invalid`) and none (`measurement-claim-missing`). The fixtures are not committed. `wai-pack fixture gen ` writes each from its definition (`wai-pack/src/fixture.rs`), every byte an integer function of the frame diff --git a/wai/pack-conformance/cmaf-mutations/expected.json b/wai/pack-conformance/cmaf-mutations/expected.json new file mode 100644 index 000000000..b6544e5fb --- /dev/null +++ b/wai/pack-conformance/cmaf-mutations/expected.json @@ -0,0 +1,30 @@ +{ + "pack": "video-cmaf-01", + "cases": [ + { + "name": "ok", + "reason": "ok", + "remove": [] + }, + { + "name": "segment-not-the-supplied-one", + "reason": "floor-cmaf-mismatch", + "remove": [ + "floor/hi/14cdbe56c8f57b1427ab9c2a9ebf6669ce8edec06fd7cd0961a01d2aaf720889.m4s", + "hls/classic/floor-hi.m3u8" + ] + }, + { + "name": "floor-listing-altered", + "reason": "floor-cmaf-mismatch", + "remove": [] + }, + { + "name": "floor-listing-missing", + "reason": "floor-cmaf-mismatch", + "remove": [ + "floor.listing" + ] + } + ] +} diff --git a/wai/pack-conformance/cmaf-mutations/floor-listing-altered/LISTING b/wai/pack-conformance/cmaf-mutations/floor-listing-altered/LISTING new file mode 100644 index 000000000..cd376b57e --- /dev/null +++ b/wai/pack-conformance/cmaf-mutations/floor-listing-altered/LISTING @@ -0,0 +1,47 @@ +688cb303ccb16fcdd21c8cb681f936ba813829e71fbf15df0ccb28b04c134447 dash/classic.mpd +a3aa7658db9b85a9d9a1fed977825189f75c5adad0f5fdfcd70ebd604824c138 dash/mobile.mpd +3f520749a6d2f231cddfd17804ee3629439f3678515e424c44e36cff54d89de9 dash/tv.mpd +4e4d6d55b352c17da028bcbf8d314cdd1f9bb1406367008710788665727dcffa floor.listing +14cdbe56c8f57b1427ab9c2a9ebf6669ce8edec06fd7cd0961a01d2aaf720889 floor/hi/14cdbe56c8f57b1427ab9c2a9ebf6669ce8edec06fd7cd0961a01d2aaf720889.m4s +759f476ce9e9b003d7d797060f9c039141d261dd65212035e96bb157783423c1 floor/hi/759f476ce9e9b003d7d797060f9c039141d261dd65212035e96bb157783423c1.m4s +d3616b6368fc800ce421a492fbd0f6263b9e06ee0af1e8269ce4f20d5cb3653d floor/hi/d3616b6368fc800ce421a492fbd0f6263b9e06ee0af1e8269ce4f20d5cb3653d.m4s +e5583297b1456e46366fe3317784fadf8c165c5e16e864629b194dc46290387e floor/hi/e5583297b1456e46366fe3317784fadf8c165c5e16e864629b194dc46290387e.m4s +eb559df9571de1869981ca82672abbabad528b294b15a1d7bf9b635761c584f8 floor/hi/eb559df9571de1869981ca82672abbabad528b294b15a1d7bf9b635761c584f8.m4s +a8a19ef9cd4d540037ef298097bbc5317de6a99690c8c4a745cc867c034208d6 floor/hi/init.mp4 +0e0407f5a552e405846a411627df17537e5c31accca37390c391a7c1d27353af floor/lo/0e0407f5a552e405846a411627df17537e5c31accca37390c391a7c1d27353af.m4s +10b19654062fa37b83c082c922f54529725c36a4ead953b1fbfbbee14d4e79a8 floor/lo/10b19654062fa37b83c082c922f54529725c36a4ead953b1fbfbbee14d4e79a8.m4s +2c484c9bead2b261ac1a18c2aedec11761813f995d11dc9779c5f9b039d59b73 floor/lo/2c484c9bead2b261ac1a18c2aedec11761813f995d11dc9779c5f9b039d59b73.m4s +a855b2701af4e7c8c912448be9fc023f911b4e9e94b65770393c4df6d705b5e8 floor/lo/a855b2701af4e7c8c912448be9fc023f911b4e9e94b65770393c4df6d705b5e8.m4s +c29687008dafdf251b2ca962c3e830f785b38a56c81aee1f4c86f2e8f9115fcc floor/lo/c29687008dafdf251b2ca962c3e830f785b38a56c81aee1f4c86f2e8f9115fcc.m4s +6dd501e27365ce9ef90576771aad73de4d200362e6974551847afc3c90604344 floor/lo/init.mp4 +ebdc7e40aecbe8b61124ac78f233b0dfaf2a8c5674d3fc9bb023935de1d9b6cb hls/classic/floor-hi.m3u8 +66f5eb8b89b80e7da839b23f39665eb85480c6a725fa29d93556efee673c1b9e hls/classic/floor-lo.m3u8 +d793737b69231eface4951001e65b3c52cba864f231246a41e64d49c77ebdc97 hls/classic/master.m3u8 +d793737b69231eface4951001e65b3c52cba864f231246a41e64d49c77ebdc97 hls/legacy/master.m3u8 +8c3b5e2b18192b383c8df8675acd435b861a2585bc6eaf0c09292754f44a8cef hls/mobile/master.m3u8 +c4044eca76959c9f87230484a2b207fb12c0bcaedb8d921eab806014fca53cb8 hls/mobile/wai-v.m3u8 +60a6378f46afc9308dc4ac4d138602b16568577616ea0bf4526b142d86899151 hls/mobile/wai.m3u8 +8c3b5e2b18192b383c8df8675acd435b861a2585bc6eaf0c09292754f44a8cef hls/tv/master.m3u8 +ff4edf2929e380d205c1c74156621185feec53d593ffa968b8dfaf0d05448bcd hls/tv/wai-v.m3u8 +5d42147b308330913c3d9c8a868ca83ce4d3f3e460da8d84c84014eb24aaf9d7 hls/tv/wai.m3u8 +649330bcfaaee54f802f6b4ddf6e459daca8bb0e8df86c87a9d6bd0d65cd09ea index-v.wsix +68f00abff5ef19f074d510f8cce4592afc2a1d4981a87663965a46dc8bcbe1d3 moq/catalog.json +9f381e2ab764b5e14770b00503c1c90b9c22ba22f87464b2869a70644af11939 objects/08797901ff55d0bb4afba5cffe95df64b7e216f3a0c9ba82006133bb9b6d7f16.wai +07e98fb9ef9ff3fa6bf04f9078da2a3d2423e586feea1061256131a1d1fbb943 objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai +d5f9cdd996920e07339b79093b9e4e5cb4237f1780f268220cc6f89c79aea90a objects/399048a078b0f2983149266a44eaf207cfa63f490212b69389fba4d72f62c60f.wai +cfb71256ef44758ea279846a8938823994d321abce83ef73afd2ed269a8e0259 objects/618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481.wai +f3eedf9eb2870c0160801397412e7a4c3aca4a6e16f1a69a276e1356d38c9220 objects/61c7c3b7ccab07ed01df5b0d7ca0240598b914dbf2cabe545aa001e8de12d365.wai +d03f0813c266294f84483cfe4db177d094c06b95ab3a8471d6b2ec53401f05a7 objects/a236e9070d10fd09342cafdbf6973edd35e5266cf850fe2f38f77536ac803912.wai +2316616549f7f92dc29e34fe656c332c9f4a1e20f4be26396976407acc792ba4 objects/a3ae43406f9966487b6c5f5a4d56e9dca50c327423fcfd2a98f4c342d1dbfaf9.wai +b2a40a9a8cec3dcaf6c92a07d6765203c412c57ec879b7e33a52eabb2e74609d objects/c2ce1907255a041c388afd06ccd007436368e8d20467fdec2a1eebbb84b03bf2.wai +6d665f1bef3784cbb428abc28724f74fa83c8f2bc812828621c93c5514b6dc0e objects/c5253efe2949669bb9df01d9f60c01f2570ba4be1c0af26105e092dfccf90d30.wai +0acecba00acc28e313805189fd826ad3a9fab1fe69727ef2d5999fc543426289 objects/c81171fa53998cfe94207ad66ab9b53cfbd4b3f058730e62512ca9f0f6ef2ea3.wai +f3bd9cbe3c2518c997a4d1d3a32145a04f55ef53e0b5760a6ce6aa5e14fe06a7 objects/dea0f6415f639fca99d91a0341aba164078a1bd4780e21d72cbf2234928272ec.wai +d22c4f8ac8a5de43bbec6be04ea8b6da72f2bd133f8f57a31607362670178c68 objects/f467872fe8d3cd1f60f832c997cc14fd00abbf601c61286a612089b4a53a195a.wai +f1f4e32ba9f76e36431d97e0fd52b9025075f553bf6b9f63c484d60573c8ea90 package.receipt.json +517630d9bee1f5559baff3bb3e642f6aa7b5276226f6e3bdba4f3f9724794859 plan-v.txt +428e24f9e1c62fc5590ce3d3a6239a5c274dcfc1391a2ea2abe8dc0562da7d20 policy.json +9d2b4c15ac17ee074f646d0b1ed11ef56557f633ff67a3e6a6d0eb4dd1596548 policy.toml +2f5807b891b8eb0a44b76c4303487be1dcf19e111f06f6c642e14b81c85d7c4d stages/legacy.json +8695fff48ca86321c5198e3a8cf660ccba208df4f40fd1907e76c64a52674cf5 stages/mobile.json +6ae56077cfc368a59489233eeee6ee7fd97437821822637ac62096ab93c85286 stages/tv.json diff --git a/wai/pack-conformance/cmaf-mutations/floor-listing-altered/floor.listing b/wai/pack-conformance/cmaf-mutations/floor-listing-altered/floor.listing new file mode 100644 index 000000000..1875b8922 --- /dev/null +++ b/wai/pack-conformance/cmaf-mutations/floor-listing-altered/floor.listing @@ -0,0 +1,12 @@ +a8a19ef9cd4d540037ef298097bbc5317de6a99690c8c4a745cc867c034208d6 hi/init.mp4 +14cdbe56c8f57b1427ab9c2a9ebf6669ce8edec06fd7cd0961a01d2aaf720889 hi/seg_0000.m4s +e5583297b1456e46366fe3317784fadf8c165c5e16e864629b194dc46290387e hi/seg_0001.m4s +d3616b6368fc800ce421a492fbd0f6263b9e06ee0af1e8269ce4f20d5cb3653d hi/seg_0002.m4s +eb559df9571de1869981ca82672abbabad528b294b15a1d7bf9b635761c584f8 hi/seg_0003.m4s +759f476ce9e9b003d7d797060f9c039141d261dd65212035e96bb157783423c1 hi/seg_0004.m4s +6dd501e27365ce9ef90576771aad73de4d200362e6974551847afc3c90604344 lo/init.mp4 +0e0407f5a552e405846a411627df17537e5c31accca37390c391a7c1d27353af lo/seg_0000.m4s +c29687008dafdf251b2ca962c3e830f785b38a56c81aee1f4c86f2e8f9115fcc lo/seg_0001.m4s +10b19654062fa37b83c082c922f54529725c36a4ead953b1fbfbbee14d4e79a8 lo/seg_0002.m4s +a855b2701af4e7c8c912448be9fc023f911b4e9e94b65770393c4df6d705b5e8 lo/seg_0003.m4s +20484c9bead2b261ac1a18c2aedec11761813f995d11dc9779c5f9b039d59b73 lo/seg_0004.m4s diff --git a/wai/pack-conformance/cmaf-mutations/floor-listing-missing/LISTING b/wai/pack-conformance/cmaf-mutations/floor-listing-missing/LISTING new file mode 100644 index 000000000..3efd7408d --- /dev/null +++ b/wai/pack-conformance/cmaf-mutations/floor-listing-missing/LISTING @@ -0,0 +1,46 @@ +688cb303ccb16fcdd21c8cb681f936ba813829e71fbf15df0ccb28b04c134447 dash/classic.mpd +a3aa7658db9b85a9d9a1fed977825189f75c5adad0f5fdfcd70ebd604824c138 dash/mobile.mpd +3f520749a6d2f231cddfd17804ee3629439f3678515e424c44e36cff54d89de9 dash/tv.mpd +14cdbe56c8f57b1427ab9c2a9ebf6669ce8edec06fd7cd0961a01d2aaf720889 floor/hi/14cdbe56c8f57b1427ab9c2a9ebf6669ce8edec06fd7cd0961a01d2aaf720889.m4s +759f476ce9e9b003d7d797060f9c039141d261dd65212035e96bb157783423c1 floor/hi/759f476ce9e9b003d7d797060f9c039141d261dd65212035e96bb157783423c1.m4s +d3616b6368fc800ce421a492fbd0f6263b9e06ee0af1e8269ce4f20d5cb3653d floor/hi/d3616b6368fc800ce421a492fbd0f6263b9e06ee0af1e8269ce4f20d5cb3653d.m4s +e5583297b1456e46366fe3317784fadf8c165c5e16e864629b194dc46290387e floor/hi/e5583297b1456e46366fe3317784fadf8c165c5e16e864629b194dc46290387e.m4s +eb559df9571de1869981ca82672abbabad528b294b15a1d7bf9b635761c584f8 floor/hi/eb559df9571de1869981ca82672abbabad528b294b15a1d7bf9b635761c584f8.m4s +a8a19ef9cd4d540037ef298097bbc5317de6a99690c8c4a745cc867c034208d6 floor/hi/init.mp4 +0e0407f5a552e405846a411627df17537e5c31accca37390c391a7c1d27353af floor/lo/0e0407f5a552e405846a411627df17537e5c31accca37390c391a7c1d27353af.m4s +10b19654062fa37b83c082c922f54529725c36a4ead953b1fbfbbee14d4e79a8 floor/lo/10b19654062fa37b83c082c922f54529725c36a4ead953b1fbfbbee14d4e79a8.m4s +2c484c9bead2b261ac1a18c2aedec11761813f995d11dc9779c5f9b039d59b73 floor/lo/2c484c9bead2b261ac1a18c2aedec11761813f995d11dc9779c5f9b039d59b73.m4s +a855b2701af4e7c8c912448be9fc023f911b4e9e94b65770393c4df6d705b5e8 floor/lo/a855b2701af4e7c8c912448be9fc023f911b4e9e94b65770393c4df6d705b5e8.m4s +c29687008dafdf251b2ca962c3e830f785b38a56c81aee1f4c86f2e8f9115fcc floor/lo/c29687008dafdf251b2ca962c3e830f785b38a56c81aee1f4c86f2e8f9115fcc.m4s +6dd501e27365ce9ef90576771aad73de4d200362e6974551847afc3c90604344 floor/lo/init.mp4 +ebdc7e40aecbe8b61124ac78f233b0dfaf2a8c5674d3fc9bb023935de1d9b6cb hls/classic/floor-hi.m3u8 +66f5eb8b89b80e7da839b23f39665eb85480c6a725fa29d93556efee673c1b9e hls/classic/floor-lo.m3u8 +d793737b69231eface4951001e65b3c52cba864f231246a41e64d49c77ebdc97 hls/classic/master.m3u8 +d793737b69231eface4951001e65b3c52cba864f231246a41e64d49c77ebdc97 hls/legacy/master.m3u8 +8c3b5e2b18192b383c8df8675acd435b861a2585bc6eaf0c09292754f44a8cef hls/mobile/master.m3u8 +c4044eca76959c9f87230484a2b207fb12c0bcaedb8d921eab806014fca53cb8 hls/mobile/wai-v.m3u8 +60a6378f46afc9308dc4ac4d138602b16568577616ea0bf4526b142d86899151 hls/mobile/wai.m3u8 +8c3b5e2b18192b383c8df8675acd435b861a2585bc6eaf0c09292754f44a8cef hls/tv/master.m3u8 +ff4edf2929e380d205c1c74156621185feec53d593ffa968b8dfaf0d05448bcd hls/tv/wai-v.m3u8 +5d42147b308330913c3d9c8a868ca83ce4d3f3e460da8d84c84014eb24aaf9d7 hls/tv/wai.m3u8 +649330bcfaaee54f802f6b4ddf6e459daca8bb0e8df86c87a9d6bd0d65cd09ea index-v.wsix +68f00abff5ef19f074d510f8cce4592afc2a1d4981a87663965a46dc8bcbe1d3 moq/catalog.json +9f381e2ab764b5e14770b00503c1c90b9c22ba22f87464b2869a70644af11939 objects/08797901ff55d0bb4afba5cffe95df64b7e216f3a0c9ba82006133bb9b6d7f16.wai +07e98fb9ef9ff3fa6bf04f9078da2a3d2423e586feea1061256131a1d1fbb943 objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai +d5f9cdd996920e07339b79093b9e4e5cb4237f1780f268220cc6f89c79aea90a objects/399048a078b0f2983149266a44eaf207cfa63f490212b69389fba4d72f62c60f.wai +cfb71256ef44758ea279846a8938823994d321abce83ef73afd2ed269a8e0259 objects/618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481.wai +f3eedf9eb2870c0160801397412e7a4c3aca4a6e16f1a69a276e1356d38c9220 objects/61c7c3b7ccab07ed01df5b0d7ca0240598b914dbf2cabe545aa001e8de12d365.wai +d03f0813c266294f84483cfe4db177d094c06b95ab3a8471d6b2ec53401f05a7 objects/a236e9070d10fd09342cafdbf6973edd35e5266cf850fe2f38f77536ac803912.wai +2316616549f7f92dc29e34fe656c332c9f4a1e20f4be26396976407acc792ba4 objects/a3ae43406f9966487b6c5f5a4d56e9dca50c327423fcfd2a98f4c342d1dbfaf9.wai +b2a40a9a8cec3dcaf6c92a07d6765203c412c57ec879b7e33a52eabb2e74609d objects/c2ce1907255a041c388afd06ccd007436368e8d20467fdec2a1eebbb84b03bf2.wai +6d665f1bef3784cbb428abc28724f74fa83c8f2bc812828621c93c5514b6dc0e objects/c5253efe2949669bb9df01d9f60c01f2570ba4be1c0af26105e092dfccf90d30.wai +0acecba00acc28e313805189fd826ad3a9fab1fe69727ef2d5999fc543426289 objects/c81171fa53998cfe94207ad66ab9b53cfbd4b3f058730e62512ca9f0f6ef2ea3.wai +f3bd9cbe3c2518c997a4d1d3a32145a04f55ef53e0b5760a6ce6aa5e14fe06a7 objects/dea0f6415f639fca99d91a0341aba164078a1bd4780e21d72cbf2234928272ec.wai +d22c4f8ac8a5de43bbec6be04ea8b6da72f2bd133f8f57a31607362670178c68 objects/f467872fe8d3cd1f60f832c997cc14fd00abbf601c61286a612089b4a53a195a.wai +f1f4e32ba9f76e36431d97e0fd52b9025075f553bf6b9f63c484d60573c8ea90 package.receipt.json +517630d9bee1f5559baff3bb3e642f6aa7b5276226f6e3bdba4f3f9724794859 plan-v.txt +428e24f9e1c62fc5590ce3d3a6239a5c274dcfc1391a2ea2abe8dc0562da7d20 policy.json +9d2b4c15ac17ee074f646d0b1ed11ef56557f633ff67a3e6a6d0eb4dd1596548 policy.toml +2f5807b891b8eb0a44b76c4303487be1dcf19e111f06f6c642e14b81c85d7c4d stages/legacy.json +8695fff48ca86321c5198e3a8cf660ccba208df4f40fd1907e76c64a52674cf5 stages/mobile.json +6ae56077cfc368a59489233eeee6ee7fd97437821822637ac62096ab93c85286 stages/tv.json diff --git a/wai/pack-conformance/cmaf-mutations/segment-not-the-supplied-one/LISTING b/wai/pack-conformance/cmaf-mutations/segment-not-the-supplied-one/LISTING new file mode 100644 index 000000000..2da60b651 --- /dev/null +++ b/wai/pack-conformance/cmaf-mutations/segment-not-the-supplied-one/LISTING @@ -0,0 +1,46 @@ +489923f27fa22f927813026d34acb69177b5eb042a513e8855b6bfaca1c80a1a dash/classic.mpd +a3aa7658db9b85a9d9a1fed977825189f75c5adad0f5fdfcd70ebd604824c138 dash/mobile.mpd +3f520749a6d2f231cddfd17804ee3629439f3678515e424c44e36cff54d89de9 dash/tv.mpd +03ab06e026880875581952f91232405077be9a522dbf739b6a9d093458369710 floor.listing +103573aca98afc526a45518dc6b93d0fcd58511bb34550b2f4d7b29431df9ad9 floor/hi/103573aca98afc526a45518dc6b93d0fcd58511bb34550b2f4d7b29431df9ad9.m4s +759f476ce9e9b003d7d797060f9c039141d261dd65212035e96bb157783423c1 floor/hi/759f476ce9e9b003d7d797060f9c039141d261dd65212035e96bb157783423c1.m4s +d3616b6368fc800ce421a492fbd0f6263b9e06ee0af1e8269ce4f20d5cb3653d floor/hi/d3616b6368fc800ce421a492fbd0f6263b9e06ee0af1e8269ce4f20d5cb3653d.m4s +e5583297b1456e46366fe3317784fadf8c165c5e16e864629b194dc46290387e floor/hi/e5583297b1456e46366fe3317784fadf8c165c5e16e864629b194dc46290387e.m4s +eb559df9571de1869981ca82672abbabad528b294b15a1d7bf9b635761c584f8 floor/hi/eb559df9571de1869981ca82672abbabad528b294b15a1d7bf9b635761c584f8.m4s +a8a19ef9cd4d540037ef298097bbc5317de6a99690c8c4a745cc867c034208d6 floor/hi/init.mp4 +0e0407f5a552e405846a411627df17537e5c31accca37390c391a7c1d27353af floor/lo/0e0407f5a552e405846a411627df17537e5c31accca37390c391a7c1d27353af.m4s +10b19654062fa37b83c082c922f54529725c36a4ead953b1fbfbbee14d4e79a8 floor/lo/10b19654062fa37b83c082c922f54529725c36a4ead953b1fbfbbee14d4e79a8.m4s +2c484c9bead2b261ac1a18c2aedec11761813f995d11dc9779c5f9b039d59b73 floor/lo/2c484c9bead2b261ac1a18c2aedec11761813f995d11dc9779c5f9b039d59b73.m4s +a855b2701af4e7c8c912448be9fc023f911b4e9e94b65770393c4df6d705b5e8 floor/lo/a855b2701af4e7c8c912448be9fc023f911b4e9e94b65770393c4df6d705b5e8.m4s +c29687008dafdf251b2ca962c3e830f785b38a56c81aee1f4c86f2e8f9115fcc floor/lo/c29687008dafdf251b2ca962c3e830f785b38a56c81aee1f4c86f2e8f9115fcc.m4s +6dd501e27365ce9ef90576771aad73de4d200362e6974551847afc3c90604344 floor/lo/init.mp4 +66f5eb8b89b80e7da839b23f39665eb85480c6a725fa29d93556efee673c1b9e hls/classic/floor-lo.m3u8 +9329fd005fc0e4926a3bc3d19f35b67fb6990c916b8a39cde128d8cf8b3dcf25 hls/classic/master.m3u8 +9329fd005fc0e4926a3bc3d19f35b67fb6990c916b8a39cde128d8cf8b3dcf25 hls/legacy/master.m3u8 +b650f6ffe5e31f29507e563fe104d5d45bf063fe553021047c35a6e0e35e9333 hls/mobile/master.m3u8 +c4044eca76959c9f87230484a2b207fb12c0bcaedb8d921eab806014fca53cb8 hls/mobile/wai-v.m3u8 +60a6378f46afc9308dc4ac4d138602b16568577616ea0bf4526b142d86899151 hls/mobile/wai.m3u8 +b650f6ffe5e31f29507e563fe104d5d45bf063fe553021047c35a6e0e35e9333 hls/tv/master.m3u8 +ff4edf2929e380d205c1c74156621185feec53d593ffa968b8dfaf0d05448bcd hls/tv/wai-v.m3u8 +5d42147b308330913c3d9c8a868ca83ce4d3f3e460da8d84c84014eb24aaf9d7 hls/tv/wai.m3u8 +649330bcfaaee54f802f6b4ddf6e459daca8bb0e8df86c87a9d6bd0d65cd09ea index-v.wsix +f56f7b8a585c4e85c4382eb163d8d6639284ddb2e7f2799715fa63120e7c0036 moq/catalog.json +9f381e2ab764b5e14770b00503c1c90b9c22ba22f87464b2869a70644af11939 objects/08797901ff55d0bb4afba5cffe95df64b7e216f3a0c9ba82006133bb9b6d7f16.wai +07e98fb9ef9ff3fa6bf04f9078da2a3d2423e586feea1061256131a1d1fbb943 objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai +d5f9cdd996920e07339b79093b9e4e5cb4237f1780f268220cc6f89c79aea90a objects/399048a078b0f2983149266a44eaf207cfa63f490212b69389fba4d72f62c60f.wai +cfb71256ef44758ea279846a8938823994d321abce83ef73afd2ed269a8e0259 objects/618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481.wai +f3eedf9eb2870c0160801397412e7a4c3aca4a6e16f1a69a276e1356d38c9220 objects/61c7c3b7ccab07ed01df5b0d7ca0240598b914dbf2cabe545aa001e8de12d365.wai +d03f0813c266294f84483cfe4db177d094c06b95ab3a8471d6b2ec53401f05a7 objects/a236e9070d10fd09342cafdbf6973edd35e5266cf850fe2f38f77536ac803912.wai +2316616549f7f92dc29e34fe656c332c9f4a1e20f4be26396976407acc792ba4 objects/a3ae43406f9966487b6c5f5a4d56e9dca50c327423fcfd2a98f4c342d1dbfaf9.wai +b2a40a9a8cec3dcaf6c92a07d6765203c412c57ec879b7e33a52eabb2e74609d objects/c2ce1907255a041c388afd06ccd007436368e8d20467fdec2a1eebbb84b03bf2.wai +6d665f1bef3784cbb428abc28724f74fa83c8f2bc812828621c93c5514b6dc0e objects/c5253efe2949669bb9df01d9f60c01f2570ba4be1c0af26105e092dfccf90d30.wai +0acecba00acc28e313805189fd826ad3a9fab1fe69727ef2d5999fc543426289 objects/c81171fa53998cfe94207ad66ab9b53cfbd4b3f058730e62512ca9f0f6ef2ea3.wai +f3bd9cbe3c2518c997a4d1d3a32145a04f55ef53e0b5760a6ce6aa5e14fe06a7 objects/dea0f6415f639fca99d91a0341aba164078a1bd4780e21d72cbf2234928272ec.wai +d22c4f8ac8a5de43bbec6be04ea8b6da72f2bd133f8f57a31607362670178c68 objects/f467872fe8d3cd1f60f832c997cc14fd00abbf601c61286a612089b4a53a195a.wai +f1f4e32ba9f76e36431d97e0fd52b9025075f553bf6b9f63c484d60573c8ea90 package.receipt.json +517630d9bee1f5559baff3bb3e642f6aa7b5276226f6e3bdba4f3f9724794859 plan-v.txt +428e24f9e1c62fc5590ce3d3a6239a5c274dcfc1391a2ea2abe8dc0562da7d20 policy.json +9d2b4c15ac17ee074f646d0b1ed11ef56557f633ff67a3e6a6d0eb4dd1596548 policy.toml +2f5807b891b8eb0a44b76c4303487be1dcf19e111f06f6c642e14b81c85d7c4d stages/legacy.json +8695fff48ca86321c5198e3a8cf660ccba208df4f40fd1907e76c64a52674cf5 stages/mobile.json +6ae56077cfc368a59489233eeee6ee7fd97437821822637ac62096ab93c85286 stages/tv.json diff --git a/wai/pack-conformance/cmaf-mutations/segment-not-the-supplied-one/dash/classic.mpd b/wai/pack-conformance/cmaf-mutations/segment-not-the-supplied-one/dash/classic.mpd new file mode 100644 index 000000000..844c42e97 --- /dev/null +++ b/wai/pack-conformance/cmaf-mutations/segment-not-the-supplied-one/dash/classic.mpd @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wai/pack-conformance/cmaf-mutations/segment-not-the-supplied-one/floor/hi/103573aca98afc526a45518dc6b93d0fcd58511bb34550b2f4d7b29431df9ad9.m4s b/wai/pack-conformance/cmaf-mutations/segment-not-the-supplied-one/floor/hi/103573aca98afc526a45518dc6b93d0fcd58511bb34550b2f4d7b29431df9ad9.m4s new file mode 100644 index 0000000000000000000000000000000000000000..ed7fdd945510a301870020c0306f09bae7bd864e GIT binary patch literal 2225 zcmZ8hX;4#F6uyZ8o(LtO7$9tMM^yTFMXOAJh^W*uhzeG5BLyNTI}u?<^tF{31ccF% zRTjY_BBMo%=ukAMAmhj)h@j$tS{&<$D-;lAdTw|jAwN#;$@iUezVDv*5`+*TjSUGw z2wB9*5~CyHf71POMuilE-W~Kg+YW^$aFoe%BFq*P3%C6KB5VdwIw1dN(v?1 z2x(|AQwlXKu`E`CacddI*=RZBfY;J+Sgu0 zQHx+RNj$jg=E#2&6%<(>ptN)!U2-TfWntmc0{eBPXN2u3qM)0010nOA>YF1K17?;( zt0m+44F{jc>_~1&t|L8K6zj^jeT z01RhL)Z^XNgztUqlS4wi^;EmpqSH5ZgCW~Vqbfs}yLVT3^}!}*)lV_nwgHK|#K%Nc zhuJi2ayHwbKTspyS!9*8#lN}_=FR084V7#3E5|k@JQRcce1doKy{4mDYX9jb*tO^K zof9;0<^H2~(`Oa~;UE;;Zqg84!}VEjzN0BKaxp6Mx6lyhUEd#ta>q$Ss%zAcADjAD zJqLo+@&m6^a^kLx-}OhpC^gm4ljI*g^o9U;o^+Io7kHMubfT{k@MTjC^|T~=4~4BvkSj%tB;I1^u z%K~bFx5#$e&T-g-Cn~(x2E4kh{`-!tf8$5FhHdbat3_NK^o$8p#6yc0$LOnOB!QaJ z+vj=qQ37%u!7ISCuokv(Irn6ye({Kh9M+V9yJR=45z=%*!3!1x}QKYiVd`xAlMtfO37I_B{6oBud)$1OVIUPkk7 z|FOdw-KD!1z+5m}zg3&-?d*`ONUs1BQjSrtHsf+J z_vUNtI+WlQX%nY%j+H0@-=iZVn%j6GAMkJ;iIOkLyNf|Ok`Yip$PV_-it%9z)*sC% tsF_09qxmo>R!5-LYwa)=mgxxO)vmcp!!wE3x&eM%-TNws(_We@{|C<=Yo-7I literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/cmaf-mutations/segment-not-the-supplied-one/hls/classic/master.m3u8 b/wai/pack-conformance/cmaf-mutations/segment-not-the-supplied-one/hls/classic/master.m3u8 new file mode 100644 index 000000000..3bd645250 --- /dev/null +++ b/wai/pack-conformance/cmaf-mutations/segment-not-the-supplied-one/hls/classic/master.m3u8 @@ -0,0 +1,5 @@ +#EXTM3U +#EXT-X-VERSION:7 +#EXT-X-INDEPENDENT-SEGMENTS +#EXT-X-STREAM-INF:BANDWIDTH=8152,AVERAGE-BANDWIDTH=7583,CODECS="av01.0.00M.08",RESOLUTION=32x18 +../classic/floor-lo.m3u8 diff --git a/wai/pack-conformance/cmaf-mutations/segment-not-the-supplied-one/hls/legacy/master.m3u8 b/wai/pack-conformance/cmaf-mutations/segment-not-the-supplied-one/hls/legacy/master.m3u8 new file mode 100644 index 000000000..3bd645250 --- /dev/null +++ b/wai/pack-conformance/cmaf-mutations/segment-not-the-supplied-one/hls/legacy/master.m3u8 @@ -0,0 +1,5 @@ +#EXTM3U +#EXT-X-VERSION:7 +#EXT-X-INDEPENDENT-SEGMENTS +#EXT-X-STREAM-INF:BANDWIDTH=8152,AVERAGE-BANDWIDTH=7583,CODECS="av01.0.00M.08",RESOLUTION=32x18 +../classic/floor-lo.m3u8 diff --git a/wai/pack-conformance/cmaf-mutations/segment-not-the-supplied-one/hls/mobile/master.m3u8 b/wai/pack-conformance/cmaf-mutations/segment-not-the-supplied-one/hls/mobile/master.m3u8 new file mode 100644 index 000000000..560e7e8ed --- /dev/null +++ b/wai/pack-conformance/cmaf-mutations/segment-not-the-supplied-one/hls/mobile/master.m3u8 @@ -0,0 +1,6 @@ +#EXTM3U +#EXT-X-VERSION:7 +#EXT-X-INDEPENDENT-SEGMENTS +#EXT-X-SESSION-DATA:DATA-ID="science.transaction.wai.multivariant",VALUE="wai.m3u8" +#EXT-X-STREAM-INF:BANDWIDTH=8152,AVERAGE-BANDWIDTH=7583,CODECS="av01.0.00M.08",RESOLUTION=32x18 +../classic/floor-lo.m3u8 diff --git a/wai/pack-conformance/cmaf-mutations/segment-not-the-supplied-one/hls/tv/master.m3u8 b/wai/pack-conformance/cmaf-mutations/segment-not-the-supplied-one/hls/tv/master.m3u8 new file mode 100644 index 000000000..560e7e8ed --- /dev/null +++ b/wai/pack-conformance/cmaf-mutations/segment-not-the-supplied-one/hls/tv/master.m3u8 @@ -0,0 +1,6 @@ +#EXTM3U +#EXT-X-VERSION:7 +#EXT-X-INDEPENDENT-SEGMENTS +#EXT-X-SESSION-DATA:DATA-ID="science.transaction.wai.multivariant",VALUE="wai.m3u8" +#EXT-X-STREAM-INF:BANDWIDTH=8152,AVERAGE-BANDWIDTH=7583,CODECS="av01.0.00M.08",RESOLUTION=32x18 +../classic/floor-lo.m3u8 diff --git a/wai/pack-conformance/cmaf-mutations/segment-not-the-supplied-one/moq/catalog.json b/wai/pack-conformance/cmaf-mutations/segment-not-the-supplied-one/moq/catalog.json new file mode 100644 index 000000000..0c04f421b --- /dev/null +++ b/wai/pack-conformance/cmaf-mutations/segment-not-the-supplied-one/moq/catalog.json @@ -0,0 +1 @@ +{"tracks":[{"altGroup":1,"isLive":false,"name":"v/l0","namespace":"video-cmaf-01","packaging":"wai","renderGroup":1,"role":"video","wai_capabilities":["wai.video.int_motion"],"wai_determinism":"decode-equivalence","wai_receipt_alias":2923025889890445,"wai_receipts":true,"wai_receipts_track":"v/l0/receipts","wai_staged":{"layer":0,"lead_ms":null,"set":"v"}},{"altGroup":1,"codec":"av01.0.00M.08","height":18,"name":"lo/floor","namespace":"video-cmaf-01","packaging":"cmaf","renderGroup":1,"width":32},{"isLive":false,"name":"v/l0/receipts","namespace":"video-cmaf-01","packaging":"wai-receipts"}],"version":1} diff --git a/wai/pack-conformance/cmaf_diff.py b/wai/pack-conformance/cmaf_diff.py new file mode 100644 index 000000000..6bbaa1572 --- /dev/null +++ b/wai/pack-conformance/cmaf_diff.py @@ -0,0 +1,148 @@ +#!/usr/bin/env python3 +"""The supplied CMAF reader differentially (extensions/packaging.md §7.7): wai-pack's +(`wai-pack cmaf-verdict`) against pack_verify.py's, which shares no code with it, on +seeded alterations of real files. The files are the CMAF golden's floor (a media muxer's +initialization and media segments, packs/video-cmaf-01/floor/) and §7.6's writer's (the +ladder golden's package, packs/video-ladder-01/package/floor/). Each case alters the +initialization segment or one media segment: a byte flipped in its first boxes, a 32-bit +field overwritten at a box boundary, the file cut short, a box's size changed, a box +inserted at the top level or in a moof, the init's timescale or edit list altered, or a +segment's moof and mdat repeated. Every verdict (ok, floor-cmaf-malformed or +floor-cmaf-timing), and for an accepted segment its samples (offset, length, duration, +flags, decode time), must agree, and no reader may panic. + + python3 cmaf_diff.py +""" +import hashlib +import os +import random +import subprocess +import sys +import tempfile + +HERE = os.path.dirname(os.path.abspath(__file__)) +sys.path.insert(0, HERE) +import pack_verify as PV # noqa: E402 + + +def py_init(b): + try: + return "ok", PV.cmaf_init(b) + except PV.CmafFault as x: + return x.code, None + except Exception as x: # a reader must refuse, never fail otherwise + return f"CRASH {type(x).__name__}", None + + +def py_segment(b, init): + try: + s = PV.cmaf_segment(b, init) + except PV.CmafFault as x: + return (x.code, 0, "-") + except Exception as x: + return (f"CRASH {type(x).__name__}", 0, "-") + text = "".join(f"{a},{n},{d},{f},{t};" for a, n, d, f, t in s) + return ("ok", len(s), hashlib.sha256(text.encode()).hexdigest()) + + +def boxes(b, start, end): + try: + return PV.bmff_boxes(b, start, end) + except PV.CmafFault: + return [] + + +def alter(rng, b): + b = bytearray(b) + top = boxes(b, 0, len(b)) + k = rng.randrange(8) + if k == 6: + # The times: an init's timescale or its edit list's media time, at their offsets. + for kind, off in ((b"mdhd", 20), (b"elst", 20), (b"elst", 16)): + at = bytes(b).find(kind) + if at >= 0 and rng.random() < 0.5 and at + off + 4 <= len(b): + b[at + off:at + off + 4] = rng.choice([0, 1, 2, rng.randrange(1 << 32)]).to_bytes(4, "big") + return bytes(b) + k = 0 + if k == 7: + # A media segment's moof and mdat repeated: the second's decode time is the first's. + pairs = [i for i, x in enumerate(top) if x[0] == b"moof" and i + 1 < len(top) and top[i + 1][0] == b"mdat"] + if pairs: + i = rng.choice(pairs) + b += b[top[i][1]:top[i + 1][3]] + return bytes(b) + k = 0 + if k == 0 and b: + b[rng.randrange(min(len(b), 400))] ^= 1 << rng.randrange(8) + elif k == 1 and top: + x = rng.choice(top) + inner = boxes(b, x[2], x[3]) if x[0] in (b"moov", b"moof", b"trak", b"traf", b"mdia", b"minf", b"stbl", b"mvex") else [] + y = rng.choice(inner) if inner and rng.random() < 0.7 else x + at = y[1] + rng.choice([8, 12, 16, 20, 24]) + if at + 4 <= len(b): + b[at:at + 4] = rng.choice([0, 1, 7, 0xFFFFFFFF, rng.randrange(1 << 32)]).to_bytes(4, "big") + elif k == 2 and len(b) > 8: + del b[rng.randrange(8, len(b)):] + elif k == 3 and top: + x = rng.choice(top) + b[x[1]:x[1] + 4] = max(0, (x[3] - x[1]) + rng.choice([-9, -1, 1, 4, 8, -(x[3] - x[1])])).to_bytes(4, "big") + elif k == 4 and top: + kind = rng.choice([b"free", b"skip", b"uuid", b"styp", b"mdat", b"moof"]) + box = (8 + 4).to_bytes(4, "big") + kind + bytes(4) + at = rng.choice([x[1] for x in top] + [len(b)]) + b[at:at] = box + elif top: + moofs = [x for x in top if x[0] == b"moof"] + if moofs: + x = rng.choice(moofs) + inner = boxes(b, x[2], x[3]) + at = rng.choice([y[1] for y in inner] + [x[3]]) + kind = rng.choice([b"sbgp", b"free", b"tfdt", b"trun"]) + box = (8 + 8).to_bytes(4, "big") + kind + bytes(8) + b[at:at] = box + b[x[1]:x[1] + 4] = (x[3] - x[1] + len(box)).to_bytes(4, "big") + return bytes(b) + + +def main(argv): + if len(argv) != 4: + print(__doc__) + return 2 + wai_pack, seed, n = argv[1], int(argv[2]), int(argv[3]) + rng = random.Random(seed) + root = os.path.join(HERE, "packs") + sets = [] + for d in (os.path.join(root, "video-cmaf-01", "floor", "hi"), os.path.join(root, "video-cmaf-01", "floor", "lo"), + os.path.join(root, "video-ladder-01", "package", "floor", "hi")): + names = sorted(os.listdir(d)) + sets.append((PV.load(os.path.join(d, "init.mp4")), [PV.load(os.path.join(d, x)) for x in names if x.endswith(".m4s")])) + bad, seen = 0, {} + with tempfile.TemporaryDirectory() as tmp: + for c in range(n): + init, segs = rng.choice(sets) + seg = rng.choice(segs) + if rng.random() < 0.25: + init = alter(rng, init) + else: + seg = alter(rng, seg) + ip, sp = os.path.join(tmp, "init.mp4"), os.path.join(tmp, "seg.m4s") + open(ip, "wb").write(init) + open(sp, "wb").write(seg) + out = subprocess.run([wai_pack, "cmaf-verdict", ip, sp], capture_output=True, text=True).stdout.splitlines() + iv, pi = py_init(init) + want = [f"init\t{iv}"] + if iv == "ok": + v = py_segment(seg, pi) + want.append(f"{sp}\t{v[0]}\t{v[1]}\t{v[2]}") + verdict = want[-1].split("\t")[1] + seen[verdict] = seen.get(verdict, 0) + 1 + if out != want or any("PANIC" in x or "CRASH" in x for x in out + want): + bad += 1 + if bad <= 10: + print(f"case {c}: wai-pack {out}, pack_verify {want}") + print(f"cmaf_diff: {n - bad}/{n} cases agree; verdicts {dict(sorted(seen.items()))}") + return 0 if bad == 0 else 1 + + +if __name__ == "__main__": + sys.exit(main(sys.argv)) diff --git a/wai/pack-conformance/ladder-mutations/expected.json b/wai/pack-conformance/ladder-mutations/expected.json new file mode 100644 index 000000000..459c1583e --- /dev/null +++ b/wai/pack-conformance/ladder-mutations/expected.json @@ -0,0 +1,35 @@ +{ + "pack": "video-ladder-01", + "cases": [ + { + "name": "ok", + "reason": "ok", + "remove": [] + }, + { + "name": "floors-swapped", + "reason": "floor-object-mismatch", + "remove": [ + "floor/hi/2f93f0ad449f9cc881b7816c6ab33fd445037d6538b445bcc76431f9c9f91c5b.m4s", + "floor/lo/acd166807d05fe4f512407f717659d88613f6d0d360485effe3751504cefbb74.m4s" + ] + }, + { + "name": "floor-under-the-component-s-name", + "reason": "floor-cmaf-mismatch", + "remove": [ + "floor/lo/589ad79210bff258db68916876846a2b0d530ea2e44260af66ddc51ad14ce07f.m4s", + "floor/lo/6bba50408f894d0e9d5516a53992fdd2aa86db43ccdc684b69c51a688856a0db.m4s", + "floor/lo/acd166807d05fe4f512407f717659d88613f6d0d360485effe3751504cefbb74.m4s", + "floor/lo/d0f68eb18af5b67736ddccd97ed45c4c0274b0460f6abc8f54940ac378165833.m4s", + "floor/lo/d550ebb204adf0b5a7f310c7d07189e7bed63e12e34e9ed4d9bf96a101d864a9.m4s", + "floor/lo/init.mp4" + ] + }, + { + "name": "master-lists-one-floor", + "reason": "catalog-mismatch", + "remove": [] + } + ] +} diff --git a/wai/pack-conformance/ladder-mutations/floor-under-the-component-s-name/LISTING b/wai/pack-conformance/ladder-mutations/floor-under-the-component-s-name/LISTING new file mode 100644 index 000000000..3f9313343 --- /dev/null +++ b/wai/pack-conformance/ladder-mutations/floor-under-the-component-s-name/LISTING @@ -0,0 +1,46 @@ +c5203585fea0962de941d258789157a0590e18b62a2e5d1facbd11e1cfd1ddb9 dash/classic.mpd +a3aa7658db9b85a9d9a1fed977825189f75c5adad0f5fdfcd70ebd604824c138 dash/mobile.mpd +3f520749a6d2f231cddfd17804ee3629439f3678515e424c44e36cff54d89de9 dash/tv.mpd +04c948608aaa7b5d78ad5355042a2ff65b0f75d9d4b1ad78f3ebffb886a74be6 floor/hi/04c948608aaa7b5d78ad5355042a2ff65b0f75d9d4b1ad78f3ebffb886a74be6.m4s +06d5cd79ba3860cccdc252fe915de0902f941a3c6a000295714f7cab193aa6cf floor/hi/06d5cd79ba3860cccdc252fe915de0902f941a3c6a000295714f7cab193aa6cf.m4s +2f93f0ad449f9cc881b7816c6ab33fd445037d6538b445bcc76431f9c9f91c5b floor/hi/2f93f0ad449f9cc881b7816c6ab33fd445037d6538b445bcc76431f9c9f91c5b.m4s +420ae4c941bba6e12a6c7fdb7d01dc69170ecb4240dffd2e86808ddf87baa12a floor/hi/420ae4c941bba6e12a6c7fdb7d01dc69170ecb4240dffd2e86808ddf87baa12a.m4s +576b7d2156c2b595bf48bf34f67996d7f89e75d105f0dc71c9841bb96e6cd0fc floor/hi/576b7d2156c2b595bf48bf34f67996d7f89e75d105f0dc71c9841bb96e6cd0fc.m4s +58c598174eed554cd0d1bc8abedca8c9d51d992c8e3b963bcb7574da4983ed9f floor/hi/init.mp4 +589ad79210bff258db68916876846a2b0d530ea2e44260af66ddc51ad14ce07f floor/v/589ad79210bff258db68916876846a2b0d530ea2e44260af66ddc51ad14ce07f.m4s +6bba50408f894d0e9d5516a53992fdd2aa86db43ccdc684b69c51a688856a0db floor/v/6bba50408f894d0e9d5516a53992fdd2aa86db43ccdc684b69c51a688856a0db.m4s +acd166807d05fe4f512407f717659d88613f6d0d360485effe3751504cefbb74 floor/v/acd166807d05fe4f512407f717659d88613f6d0d360485effe3751504cefbb74.m4s +d0f68eb18af5b67736ddccd97ed45c4c0274b0460f6abc8f54940ac378165833 floor/v/d0f68eb18af5b67736ddccd97ed45c4c0274b0460f6abc8f54940ac378165833.m4s +d550ebb204adf0b5a7f310c7d07189e7bed63e12e34e9ed4d9bf96a101d864a9 floor/v/d550ebb204adf0b5a7f310c7d07189e7bed63e12e34e9ed4d9bf96a101d864a9.m4s +640cd81c83baefbe13e8ccc2bf577395c6602885cc73e201ca34dc267e7f0a48 floor/v/init.mp4 +bfa98255d682517f58df4073bc71fdb3fcca120fc33d16e4aca873392476c586 hls/classic/floor-hi.m3u8 +ad81674ac359096ebed255a26a40e82858e53e9754702429e59d72898df33812 hls/classic/floor-lo.m3u8 +3fd88f9dcf835edf0fcca8dff8371d2b4e897ac097fc85901477c950c0da7996 hls/classic/master.m3u8 +3fd88f9dcf835edf0fcca8dff8371d2b4e897ac097fc85901477c950c0da7996 hls/legacy/master.m3u8 +09e75f55cb7ea829a4e630404d2ab540e8be0dbb1c4365dc30802359b658aed9 hls/mobile/master.m3u8 +c4044eca76959c9f87230484a2b207fb12c0bcaedb8d921eab806014fca53cb8 hls/mobile/wai-v.m3u8 +60a6378f46afc9308dc4ac4d138602b16568577616ea0bf4526b142d86899151 hls/mobile/wai.m3u8 +09e75f55cb7ea829a4e630404d2ab540e8be0dbb1c4365dc30802359b658aed9 hls/tv/master.m3u8 +ff4edf2929e380d205c1c74156621185feec53d593ffa968b8dfaf0d05448bcd hls/tv/wai-v.m3u8 +5d42147b308330913c3d9c8a868ca83ce4d3f3e460da8d84c84014eb24aaf9d7 hls/tv/wai.m3u8 +a5140df0bf1f82b88335c13789502298a952b350ad45dfcfcd249b2b9a263a71 index-v.wsix +c310c5a4ae14df691a1a37a6c34e90243ed72be1e8f725d38f1babe1f6866b21 moq/catalog.json +07e98fb9ef9ff3fa6bf04f9078da2a3d2423e586feea1061256131a1d1fbb943 objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai +2f5bd830d841eb122c63ae57a15442075478fd522ce55b6f9bcbe41acd51d8ae objects/482fbbb9b39bdb9cbf00515f94269ea591df681ced90b05d97e0df106b49b08e.wai +0057633252a2c2ed5f71fe14ca78075c8e89fc6675a08335ac90f0e56032b825 objects/4ab8f747d181632f342a4887b0a8bb86c174409cb625157784e18c5e5559a381.wai +cfb71256ef44758ea279846a8938823994d321abce83ef73afd2ed269a8e0259 objects/618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481.wai +f3eedf9eb2870c0160801397412e7a4c3aca4a6e16f1a69a276e1356d38c9220 objects/61c7c3b7ccab07ed01df5b0d7ca0240598b914dbf2cabe545aa001e8de12d365.wai +1a6f30fdc000f258c948470386d84beef2ba5a84e922c355093837ae21fd573c objects/6ce13c9ef6872caeb7fbe71661ca88bcc463ceac47f109c8c155e34bb1a6f37d.wai +b773dac63c9d2d9980d0d249ea956e03065c1ae40d17c512df29b690c0c820ef objects/b7bf0717e968d7b6be473785c9f66cbb814cde679bceb1ae37f0765308ddee72.wai +b2a40a9a8cec3dcaf6c92a07d6765203c412c57ec879b7e33a52eabb2e74609d objects/c2ce1907255a041c388afd06ccd007436368e8d20467fdec2a1eebbb84b03bf2.wai +cc8a6fc59be29bd33d96fb30ea9e5a30a5aa367a82da9c5784cbadce63396f62 objects/cf842ef3058d3c54d56c0ea3e075efdc77163602b4a1dabcff080e5ea28b9946.wai +01b596b672de3352adb3e01b34fcddfeff975f4ee1d0b88dde160ac10c9bf929 objects/d382ba093b0595c44a43dc3aad22fc0bed42baeb3488f00dfe3567056a7009c5.wai +9d9ae296558ce7f7d644ad0ca3af65eb4fc98d03b0bd6d7a8fc821fc952e86c1 objects/f525b4450c29153dde0b43e4d143dfb76fcc3884c607b744c8a53fa6a1728580.wai +3d573ee482f8187b0e3bc839aeea0f51a67144588d6d207e8466fea91a0c5b34 objects/f7f7f4d6af777bfcce09cdda5ecb754ce6bd8dcd2e03ecfc41359cad989b15f7.wai +bd6086051d0452449da8a90f426f454fee368b4794f7c294218a410ded8d9088 package.receipt.json +517630d9bee1f5559baff3bb3e642f6aa7b5276226f6e3bdba4f3f9724794859 plan-v.txt +d1cf1bd28a06f3a9d695dd64331cb56cf793818e9e9e6cec620183d9dce37b2d policy.json +4ba48d04e5c8e72336e32307b27b4371c96f20f7abf959ac1c1d344ccb9a8106 policy.toml +813329d5521ab5891bb86d29b362e448fae4247c949384b0687d66966546c4fe stages/legacy.json +ca8e0059a23311d7690a0519f85dfb48883721c817cd8fe1cd481cabe14b0032 stages/mobile.json +8bc9c9da674b4765ead0e41d54852ac105161e9638e7ae705e3982847b069e4c stages/tv.json diff --git a/wai/pack-conformance/ladder-mutations/floor-under-the-component-s-name/floor/v/589ad79210bff258db68916876846a2b0d530ea2e44260af66ddc51ad14ce07f.m4s b/wai/pack-conformance/ladder-mutations/floor-under-the-component-s-name/floor/v/589ad79210bff258db68916876846a2b0d530ea2e44260af66ddc51ad14ce07f.m4s new file mode 100644 index 0000000000000000000000000000000000000000..78b5c886674e2dbd93fd45b08573c5214c082bb5 GIT binary patch literal 1127 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 J3Z`r-_#X%x5%B;3 literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/ladder-mutations/floor-under-the-component-s-name/floor/v/d0f68eb18af5b67736ddccd97ed45c4c0274b0460f6abc8f54940ac378165833.m4s b/wai/pack-conformance/ladder-mutations/floor-under-the-component-s-name/floor/v/d0f68eb18af5b67736ddccd97ed45c4c0274b0460f6abc8f54940ac378165833.m4s new file mode 100644 index 0000000000000000000000000000000000000000..6adf8fdfddb9f43c4eda7bcb3dc4a4a5518f1282 GIT binary patch literal 2526 zcmZ`(Yfuwc7+sbW!qWsWgd{+)fLH~07V4lzO>NbV4=Pp}WDp556kEb0#zzND*IGpy zsI(|*QL$<(T18Z#Qguv_Y6?D}7DXb8DB9YNf)4a)?YEnd{nDA{2l@E!`OZ1_+#C8YTu-NHMj$gr`edrK~Fxzy@0e)hSU zgG;lE=jKe>5-UxKo|4#7TKTtY`oxcVO0_3PXInJFU+)I&EFRa;lyc~o{3M2sq+Cr5 zLAbSnS0h0%M7^bewodQA-ewL?mQ>H45kE?P@skf}B_(hX4C5G*A>0mrplb6gj{o7O zOV?uB{!r3>lp868KFb7*3{g}|2T?+Sj|lZF@`3qBk3>CUXc^@x6z^5rgjvGi_KfI` z8!^YKO|+Eq7D=ehJXJ?Z%YE{}zDOYSRmx25{FJ<+aKPiqhHy1Kk`fVBi86kuxwvmm z8*ur#xZhpIPe`}59|#|;?4%`B04W?eVjtL`Bzle?DoH&KL=u6Ic#tQu{N~v{k5*7p zFl?|BZP-iP$+(r@o%?ZK&h?uWbRZ=I%Uk#%>y-n~4vW=vFr`3_A(mi4TIE)^HPj?Z zEnEUIggCpt#c0Ik9+gj{n_)D}%v*=iu=A76sq=D^u9+l%F?0YmigfQw=Os@^Bm_W0 z;R5f$YP(Gsl3PE|B=^s#>xUgg3dP&{ZAM4rk(Ad9o#S72*4!~2@G;K*EdIWS z!35>(FZiOOv-a!9E9FNGO4^^I9TvGu^nK7ST293wXKaM2dFNMo`PG_z8PK1AT!HQG zWtVgPyF7M7wDHc)6xWu$?(4oWVNn$5O!|+vx_mfzmBSh*emNv#V=C-pso(-|- zzgEV^Wg5Qj#>IjjpqQ?dsOIw-9jlNug+TiaV$Y>EzTMXv{)F{DlXUME*|UQ;;3XwC zHSbuT3@dL6yr0{6j0|jfWT}=EmNc1wYPL|k8&N$t5m#@3Sm!!~jSR$aOY!!L@^5xW z#qCiW;B6*2>s#)@jh&CgK_Vz#u=@QqY5*^AXmc^N48g5h=uqYS1Wjn~y1hKVh5>kz zL)n&E0z9o`hn@|dC63$7Kb|x>n6>i%#B=$ z12>xV;gmW02y;g4xe)RC&7hD$R7@-5lRo;^EJ!nxbh~P6a(L;`)5M9V>L}385_sRS zudq+z)5a4KBNnAuBM(GOg$I}|6ju$;L8w-Zbqpz~`q5a^UoZ|X*t}BAZ=OZ;(dU?rCb!_9kb$|A5g*lx= yi~F5!xUnfs`I14B4!hGkq_~7SzAZYO@~EmG7+3LP?C!#fdY7*730?O%TKz9K{6yUV literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/ladder-mutations/floor-under-the-component-s-name/floor/v/d550ebb204adf0b5a7f310c7d07189e7bed63e12e34e9ed4d9bf96a101d864a9.m4s b/wai/pack-conformance/ladder-mutations/floor-under-the-component-s-name/floor/v/d550ebb204adf0b5a7f310c7d07189e7bed63e12e34e9ed4d9bf96a101d864a9.m4s new file mode 100644 index 0000000000000000000000000000000000000000..5c06ef47a465a0b1f6802d80907cf89f7a8c472a GIT binary patch literal 1695 zcmZQzV6w=~&rf4uU=YYn%SZvzAi&DNz@$)8ln53t0f{q##TkL5NJ&~s35Wp&3m6y} zzmyb}<}om^gM>AJdL4i?i2WR*4a}BcglGbhl1OY3B(@?FTO5gvtXBp}To?yi3P~K7 zIml{|%||v9Ssa;-tOgfb8p#dFYKSohIed`y;$kD4DTZV(G8;J@kj+6BM-G2vy~yT6 z*(~X~DTyUqT)^05Qh$_Nb3no92BQGOY#^7rfoWT(uGSs>wEWQUN1Ue1Dhy@k^6mfC zH7#0jFEeB8{qM2MSyO6 z49yA*4^;l`x@=%1ZotCGf-HVtJ87R~On{M)0UHxX155)$14E~Rk-Py13$Fk~tQ%xb z`4ZjY>{?lg*rScdJrB$?5;frB5M1DZu;reK@3MZNV<2b-t3W#JpyihgOP4@QCp0u1v5rJ#C%_O}6rgc#W$CL@HJj3f+1m^ePJK?q%5 z#U*NeWnlu)DPkc|POPYOI}^^AQfc20jl*NyNuAS7dJ3Lwf^p(c@2PGs=|Up|&O006TcZ;t=~ literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/ladder-mutations/floor-under-the-component-s-name/floor/v/init.mp4 b/wai/pack-conformance/ladder-mutations/floor-under-the-component-s-name/floor/v/init.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..d419e7893b423b9190462bd07734f8d65d2f1cfc GIT binary patch literal 628 zcmaJ72wlj--P?G~v~>ZbEg8c>oz#gjkv{w=`HjkN|b0NVI}qD>5;-$JpC X@ML@i0XNF!FA&0NA34waI@sGks3|>p literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/ladder-mutations/floors-swapped/LISTING b/wai/pack-conformance/ladder-mutations/floors-swapped/LISTING new file mode 100644 index 000000000..9fe69e397 --- /dev/null +++ b/wai/pack-conformance/ladder-mutations/floors-swapped/LISTING @@ -0,0 +1,46 @@ +00ebf8e21ba74af068445c05138d2523c801d9d27d364e1377b518540bc8b34d dash/classic.mpd +a3aa7658db9b85a9d9a1fed977825189f75c5adad0f5fdfcd70ebd604824c138 dash/mobile.mpd +3f520749a6d2f231cddfd17804ee3629439f3678515e424c44e36cff54d89de9 dash/tv.mpd +04c948608aaa7b5d78ad5355042a2ff65b0f75d9d4b1ad78f3ebffb886a74be6 floor/hi/04c948608aaa7b5d78ad5355042a2ff65b0f75d9d4b1ad78f3ebffb886a74be6.m4s +06d5cd79ba3860cccdc252fe915de0902f941a3c6a000295714f7cab193aa6cf floor/hi/06d5cd79ba3860cccdc252fe915de0902f941a3c6a000295714f7cab193aa6cf.m4s +420ae4c941bba6e12a6c7fdb7d01dc69170ecb4240dffd2e86808ddf87baa12a floor/hi/420ae4c941bba6e12a6c7fdb7d01dc69170ecb4240dffd2e86808ddf87baa12a.m4s +576b7d2156c2b595bf48bf34f67996d7f89e75d105f0dc71c9841bb96e6cd0fc floor/hi/576b7d2156c2b595bf48bf34f67996d7f89e75d105f0dc71c9841bb96e6cd0fc.m4s +acd166807d05fe4f512407f717659d88613f6d0d360485effe3751504cefbb74 floor/hi/acd166807d05fe4f512407f717659d88613f6d0d360485effe3751504cefbb74.m4s +58c598174eed554cd0d1bc8abedca8c9d51d992c8e3b963bcb7574da4983ed9f floor/hi/init.mp4 +2f93f0ad449f9cc881b7816c6ab33fd445037d6538b445bcc76431f9c9f91c5b floor/lo/2f93f0ad449f9cc881b7816c6ab33fd445037d6538b445bcc76431f9c9f91c5b.m4s +589ad79210bff258db68916876846a2b0d530ea2e44260af66ddc51ad14ce07f floor/lo/589ad79210bff258db68916876846a2b0d530ea2e44260af66ddc51ad14ce07f.m4s +6bba50408f894d0e9d5516a53992fdd2aa86db43ccdc684b69c51a688856a0db floor/lo/6bba50408f894d0e9d5516a53992fdd2aa86db43ccdc684b69c51a688856a0db.m4s +d0f68eb18af5b67736ddccd97ed45c4c0274b0460f6abc8f54940ac378165833 floor/lo/d0f68eb18af5b67736ddccd97ed45c4c0274b0460f6abc8f54940ac378165833.m4s +d550ebb204adf0b5a7f310c7d07189e7bed63e12e34e9ed4d9bf96a101d864a9 floor/lo/d550ebb204adf0b5a7f310c7d07189e7bed63e12e34e9ed4d9bf96a101d864a9.m4s +640cd81c83baefbe13e8ccc2bf577395c6602885cc73e201ca34dc267e7f0a48 floor/lo/init.mp4 +49c1a6c22b80524c40e9509fd3c93ab4a7c1a470f4ff6df188aefe656a940a88 hls/classic/floor-hi.m3u8 +cdb43220dbeebd408a3a221829c819ca5fb7c38682f3e63ebe2039648d4ce34d hls/classic/floor-lo.m3u8 +cf34fb5f72042d09e651c8f21b68affb966bdbe55422e70c0d9d66d1a228a0af hls/classic/master.m3u8 +cf34fb5f72042d09e651c8f21b68affb966bdbe55422e70c0d9d66d1a228a0af hls/legacy/master.m3u8 +d40a6303c71682889899b2044f2d321dfd1f42b268abed0671109c61e0a67ad1 hls/mobile/master.m3u8 +c4044eca76959c9f87230484a2b207fb12c0bcaedb8d921eab806014fca53cb8 hls/mobile/wai-v.m3u8 +60a6378f46afc9308dc4ac4d138602b16568577616ea0bf4526b142d86899151 hls/mobile/wai.m3u8 +d40a6303c71682889899b2044f2d321dfd1f42b268abed0671109c61e0a67ad1 hls/tv/master.m3u8 +ff4edf2929e380d205c1c74156621185feec53d593ffa968b8dfaf0d05448bcd hls/tv/wai-v.m3u8 +5d42147b308330913c3d9c8a868ca83ce4d3f3e460da8d84c84014eb24aaf9d7 hls/tv/wai.m3u8 +555648a512bc2da29e24dd6c2c4c2c245fb65d05a1228a8185dbb36d94299b46 index-v.wsix +c310c5a4ae14df691a1a37a6c34e90243ed72be1e8f725d38f1babe1f6866b21 moq/catalog.json +07e98fb9ef9ff3fa6bf04f9078da2a3d2423e586feea1061256131a1d1fbb943 objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai +2f5bd830d841eb122c63ae57a15442075478fd522ce55b6f9bcbe41acd51d8ae objects/482fbbb9b39bdb9cbf00515f94269ea591df681ced90b05d97e0df106b49b08e.wai +0057633252a2c2ed5f71fe14ca78075c8e89fc6675a08335ac90f0e56032b825 objects/4ab8f747d181632f342a4887b0a8bb86c174409cb625157784e18c5e5559a381.wai +cfb71256ef44758ea279846a8938823994d321abce83ef73afd2ed269a8e0259 objects/618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481.wai +f3eedf9eb2870c0160801397412e7a4c3aca4a6e16f1a69a276e1356d38c9220 objects/61c7c3b7ccab07ed01df5b0d7ca0240598b914dbf2cabe545aa001e8de12d365.wai +1a6f30fdc000f258c948470386d84beef2ba5a84e922c355093837ae21fd573c objects/6ce13c9ef6872caeb7fbe71661ca88bcc463ceac47f109c8c155e34bb1a6f37d.wai +b773dac63c9d2d9980d0d249ea956e03065c1ae40d17c512df29b690c0c820ef objects/b7bf0717e968d7b6be473785c9f66cbb814cde679bceb1ae37f0765308ddee72.wai +b2a40a9a8cec3dcaf6c92a07d6765203c412c57ec879b7e33a52eabb2e74609d objects/c2ce1907255a041c388afd06ccd007436368e8d20467fdec2a1eebbb84b03bf2.wai +cc8a6fc59be29bd33d96fb30ea9e5a30a5aa367a82da9c5784cbadce63396f62 objects/cf842ef3058d3c54d56c0ea3e075efdc77163602b4a1dabcff080e5ea28b9946.wai +01b596b672de3352adb3e01b34fcddfeff975f4ee1d0b88dde160ac10c9bf929 objects/d382ba093b0595c44a43dc3aad22fc0bed42baeb3488f00dfe3567056a7009c5.wai +9d9ae296558ce7f7d644ad0ca3af65eb4fc98d03b0bd6d7a8fc821fc952e86c1 objects/f525b4450c29153dde0b43e4d143dfb76fcc3884c607b744c8a53fa6a1728580.wai +3d573ee482f8187b0e3bc839aeea0f51a67144588d6d207e8466fea91a0c5b34 objects/f7f7f4d6af777bfcce09cdda5ecb754ce6bd8dcd2e03ecfc41359cad989b15f7.wai +96b7f835515e95018d614ac326d03538b055a9ac2d3a52fac97e9f2dc29dc63b package.receipt.json +517630d9bee1f5559baff3bb3e642f6aa7b5276226f6e3bdba4f3f9724794859 plan-v.txt +d1cf1bd28a06f3a9d695dd64331cb56cf793818e9e9e6cec620183d9dce37b2d policy.json +4ba48d04e5c8e72336e32307b27b4371c96f20f7abf959ac1c1d344ccb9a8106 policy.toml +813329d5521ab5891bb86d29b362e448fae4247c949384b0687d66966546c4fe stages/legacy.json +ca8e0059a23311d7690a0519f85dfb48883721c817cd8fe1cd481cabe14b0032 stages/mobile.json +8bc9c9da674b4765ead0e41d54852ac105161e9638e7ae705e3982847b069e4c stages/tv.json diff --git a/wai/pack-conformance/ladder-mutations/floors-swapped/dash/classic.mpd b/wai/pack-conformance/ladder-mutations/floors-swapped/dash/classic.mpd new file mode 100644 index 000000000..1e82eeab4 --- /dev/null +++ b/wai/pack-conformance/ladder-mutations/floors-swapped/dash/classic.mpd @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wai/pack-conformance/ladder-mutations/floors-swapped/floor/hi/acd166807d05fe4f512407f717659d88613f6d0d360485effe3751504cefbb74.m4s b/wai/pack-conformance/ladder-mutations/floors-swapped/floor/hi/acd166807d05fe4f512407f717659d88613f6d0d360485effe3751504cefbb74.m4s new file mode 100644 index 0000000000000000000000000000000000000000..8747edc9f9e4a78b5be8d70f34948261b2a63000 GIT binary patch literal 2248 zcmZ`(Yfw{17+pdLDX%6F1B6EchJc{V&K08q6}2d+2;t=jrYHpwsz?g4fZFz=mhu#a zhel8+w1W>Eb)Zrzj)p=7tM!p$3kn)2pjD}~Le)AQy7wj~%MbJ8=F8dhedp}iy#au6 zES;DVRXN z+tD{wPwLv}+Ra4QL_Gyq?T*zvtaij|d#uKL?J(RKt8pBkgX3@G<34deI3M>T#&mHl zFANu9^<1pR`7Ria&&PXlKCX*&Vly4ET8Py+|7|$FU;Iq* zeDM6|>*li@(vuUF78d9hF+4}o_o_w2un7m$qMw$4VfH*WqUiG8foFLtOED*;@s;uu z)lkLvCGBRr6-OeU4E`d&=#@Q_+u+lrc)9Lm_|2r@cUtC$`kd|cOaEe`t5i~aiXAwn zDiiWFbwFS)DzL zuE%sK`X7llAGg%}ym~^d_?Ro+8u8m=m4EYoR%_i-pBW-$y5yRN=8r92?xkDVd@EpNP-@7$-HSGfrJRM7;IAC3K%5tba}Oh z-;~%l_nRHCJuS0arm%6zp!5f z9#pd?yOF+)NT9xLhWXeQqsFDp;8Ar4 zA?c_=@rapL(hr@M4Fz#szpoEP+w|h_ z{c?<)AA|q&IL{Un66h@wboc5OD3dp~XO!;nKl=9(Y4m#AoWYA#eQ~mdQoNcJ#f=FzM(Jyr~oqh8)D<$(4vlwm<^PQ z3|)eFgErk^k==73W^Bzi-!EUHe*n3`0KItoeBJHK`NOH`-X$2ci>ctXIh_H*s0W^x z8cc(-UMN0DK(ATimN!R0+bdj7c*76Dp`dbI)Kr^WMe}5ibWMrYF;um{E5rWDSQck2 J3Z`r-_#X%x5%B;3 literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/ladder-mutations/floors-swapped/floor/lo/2f93f0ad449f9cc881b7816c6ab33fd445037d6538b445bcc76431f9c9f91c5b.m4s b/wai/pack-conformance/ladder-mutations/floors-swapped/floor/lo/2f93f0ad449f9cc881b7816c6ab33fd445037d6538b445bcc76431f9c9f91c5b.m4s new file mode 100644 index 0000000000000000000000000000000000000000..ec55da7e89f760ac0144c11755cf3e9561226eb0 GIT binary patch literal 2400 zcmZQzVA_zIpP$CSz#x#DmXQLaL4cWofoVobQ6gBp1SHM`7H0&KA|+`lB_IYAgaXy( zloXZbF)*-$gpGjw9Y7k$W>SG@1F;!I7$KTKq!JPvSzH-OTo{Qhjl?EKTpovdSsdaj zIK<_M5Jy%ci9hQl0O;eg9t^&G831-aG8%wy#kV%$aZ0I58H;^ zl*AG)E?_ERTK{o&ya9*NR2Bh-*+4Eg1JhkSsZ(8N8l=i*ER)^%Ke~)_P5uS1Zn4&` zIcJNyKE0EFs%8Jm*Fd&OJ9XEL`faTNexYicUhLQ(Yn!p43}x zZr*LnxJ=OW=tqw|A66x`-zYCW60gMYl;?7Ko7Bv=aVPVOO?9doL)3Sjd%y2RAs>g7 zzhb5Na+7s4b0*p~)O==JU|Rhk*GoidLz`%;gv$3ES!wxgOQ!hSZ~mje`r*NfRmVSN zsPbvJ{16DLIlX7%^{>Y*t_2u>US+&3`jBhx+`TR9lCI?LI-DStcsN=2!s7)Gr4t`V zAKx%H%EGNMR%T*1m*-v6i{+1QALJ5{n6TaIU;0Cx2MfMEUYQ!&<5K$jg_QZX$BP~` z@4fohS=-_A<3PWRX{iUka&;-Q{+(MMJEh&VKCm|ShSrB&;%lxbbWOHqE@MpGDyeH` z>Hp?$*}^EZuKTa5RWA9@YO8zyGfZ33?b6?MhTh9;e%7SH8izH-NOsp}IN3NX9_% zAc|XWyE*GK9^_`c`|@2EP=gW^`_lx3J#9b@Dl9x-SAd1OL9ujCa{FZ&Lx~-mP3J= z!h?n9FOm@lwHO>sTc3sk6?<_A&P6gw0Vw2yYM+9Un1LUveVg9$CoXXS#zp|DRqJo{ z3YwXNf-MNuLIt3kL*O=bgR=6n*yK76>k}z%$EO3;hoRdkZV-WL=N8HRdy5l5p&W&3 zse+N5K@8kFa4O%_q`g8>b9UPDr*$8WMF6$L!R-d81W=G9CZL4s>4P7`X1&b^xjl(t Ln*9Vs_%#6l=bT(r literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/ladder-mutations/floors-swapped/hls/classic/floor-hi.m3u8 b/wai/pack-conformance/ladder-mutations/floors-swapped/hls/classic/floor-hi.m3u8 new file mode 100644 index 000000000..40aecdff8 --- /dev/null +++ b/wai/pack-conformance/ladder-mutations/floors-swapped/hls/classic/floor-hi.m3u8 @@ -0,0 +1,18 @@ +#EXTM3U +#EXT-X-VERSION:7 +#EXT-X-TARGETDURATION:3 +#EXT-X-MEDIA-SEQUENCE:0 +#EXT-X-PLAYLIST-TYPE:VOD +#EXT-X-INDEPENDENT-SEGMENTS +#EXT-X-MAP:URI="../../floor/hi/init.mp4" +#EXTINF:2.400, +../../floor/hi/420ae4c941bba6e12a6c7fdb7d01dc69170ecb4240dffd2e86808ddf87baa12a.m4s +#EXTINF:1.000, +../../floor/hi/04c948608aaa7b5d78ad5355042a2ff65b0f75d9d4b1ad78f3ebffb886a74be6.m4s +#EXTINF:2.000, +../../floor/hi/acd166807d05fe4f512407f717659d88613f6d0d360485effe3751504cefbb74.m4s +#EXTINF:1.000, +../../floor/hi/06d5cd79ba3860cccdc252fe915de0902f941a3c6a000295714f7cab193aa6cf.m4s +#EXTINF:1.600, +../../floor/hi/576b7d2156c2b595bf48bf34f67996d7f89e75d105f0dc71c9841bb96e6cd0fc.m4s +#EXT-X-ENDLIST diff --git a/wai/pack-conformance/ladder-mutations/floors-swapped/hls/classic/floor-lo.m3u8 b/wai/pack-conformance/ladder-mutations/floors-swapped/hls/classic/floor-lo.m3u8 new file mode 100644 index 000000000..aebf60714 --- /dev/null +++ b/wai/pack-conformance/ladder-mutations/floors-swapped/hls/classic/floor-lo.m3u8 @@ -0,0 +1,18 @@ +#EXTM3U +#EXT-X-VERSION:7 +#EXT-X-TARGETDURATION:3 +#EXT-X-MEDIA-SEQUENCE:0 +#EXT-X-PLAYLIST-TYPE:VOD +#EXT-X-INDEPENDENT-SEGMENTS +#EXT-X-MAP:URI="../../floor/lo/init.mp4" +#EXTINF:2.400, +../../floor/lo/d0f68eb18af5b67736ddccd97ed45c4c0274b0460f6abc8f54940ac378165833.m4s +#EXTINF:1.000, +../../floor/lo/6bba50408f894d0e9d5516a53992fdd2aa86db43ccdc684b69c51a688856a0db.m4s +#EXTINF:2.000, +../../floor/lo/2f93f0ad449f9cc881b7816c6ab33fd445037d6538b445bcc76431f9c9f91c5b.m4s +#EXTINF:1.000, +../../floor/lo/589ad79210bff258db68916876846a2b0d530ea2e44260af66ddc51ad14ce07f.m4s +#EXTINF:1.600, +../../floor/lo/d550ebb204adf0b5a7f310c7d07189e7bed63e12e34e9ed4d9bf96a101d864a9.m4s +#EXT-X-ENDLIST diff --git a/wai/pack-conformance/ladder-mutations/floors-swapped/hls/classic/master.m3u8 b/wai/pack-conformance/ladder-mutations/floors-swapped/hls/classic/master.m3u8 new file mode 100644 index 000000000..02be4ba12 --- /dev/null +++ b/wai/pack-conformance/ladder-mutations/floors-swapped/hls/classic/master.m3u8 @@ -0,0 +1,7 @@ +#EXTM3U +#EXT-X-VERSION:7 +#EXT-X-INDEPENDENT-SEGMENTS +#EXT-X-STREAM-INF:BANDWIDTH=10440,AVERAGE-BANDWIDTH=8903,CODECS="av01.0.00M.08",RESOLUTION=64x36 +../classic/floor-hi.m3u8 +#EXT-X-STREAM-INF:BANDWIDTH=9600,AVERAGE-BANDWIDTH=8875,CODECS="av01.0.00M.08",RESOLUTION=32x18 +../classic/floor-lo.m3u8 diff --git a/wai/pack-conformance/ladder-mutations/floors-swapped/hls/legacy/master.m3u8 b/wai/pack-conformance/ladder-mutations/floors-swapped/hls/legacy/master.m3u8 new file mode 100644 index 000000000..02be4ba12 --- /dev/null +++ b/wai/pack-conformance/ladder-mutations/floors-swapped/hls/legacy/master.m3u8 @@ -0,0 +1,7 @@ +#EXTM3U +#EXT-X-VERSION:7 +#EXT-X-INDEPENDENT-SEGMENTS +#EXT-X-STREAM-INF:BANDWIDTH=10440,AVERAGE-BANDWIDTH=8903,CODECS="av01.0.00M.08",RESOLUTION=64x36 +../classic/floor-hi.m3u8 +#EXT-X-STREAM-INF:BANDWIDTH=9600,AVERAGE-BANDWIDTH=8875,CODECS="av01.0.00M.08",RESOLUTION=32x18 +../classic/floor-lo.m3u8 diff --git a/wai/pack-conformance/ladder-mutations/floors-swapped/hls/mobile/master.m3u8 b/wai/pack-conformance/ladder-mutations/floors-swapped/hls/mobile/master.m3u8 new file mode 100644 index 000000000..9cdb3e5eb --- /dev/null +++ b/wai/pack-conformance/ladder-mutations/floors-swapped/hls/mobile/master.m3u8 @@ -0,0 +1,8 @@ +#EXTM3U +#EXT-X-VERSION:7 +#EXT-X-INDEPENDENT-SEGMENTS +#EXT-X-SESSION-DATA:DATA-ID="science.transaction.wai.multivariant",VALUE="wai.m3u8" +#EXT-X-STREAM-INF:BANDWIDTH=10440,AVERAGE-BANDWIDTH=8903,CODECS="av01.0.00M.08",RESOLUTION=64x36 +../classic/floor-hi.m3u8 +#EXT-X-STREAM-INF:BANDWIDTH=9600,AVERAGE-BANDWIDTH=8875,CODECS="av01.0.00M.08",RESOLUTION=32x18 +../classic/floor-lo.m3u8 diff --git a/wai/pack-conformance/ladder-mutations/floors-swapped/hls/tv/master.m3u8 b/wai/pack-conformance/ladder-mutations/floors-swapped/hls/tv/master.m3u8 new file mode 100644 index 000000000..9cdb3e5eb --- /dev/null +++ b/wai/pack-conformance/ladder-mutations/floors-swapped/hls/tv/master.m3u8 @@ -0,0 +1,8 @@ +#EXTM3U +#EXT-X-VERSION:7 +#EXT-X-INDEPENDENT-SEGMENTS +#EXT-X-SESSION-DATA:DATA-ID="science.transaction.wai.multivariant",VALUE="wai.m3u8" +#EXT-X-STREAM-INF:BANDWIDTH=10440,AVERAGE-BANDWIDTH=8903,CODECS="av01.0.00M.08",RESOLUTION=64x36 +../classic/floor-hi.m3u8 +#EXT-X-STREAM-INF:BANDWIDTH=9600,AVERAGE-BANDWIDTH=8875,CODECS="av01.0.00M.08",RESOLUTION=32x18 +../classic/floor-lo.m3u8 diff --git a/wai/pack-conformance/ladder-mutations/floors-swapped/index-v.wsix b/wai/pack-conformance/ladder-mutations/floors-swapped/index-v.wsix new file mode 100644 index 0000000000000000000000000000000000000000..77547f145ef3f0f51aefcba4e5acf27be2a4a083 GIT binary patch literal 2368 zcmWF!_KaX;U|^60Vi3&=#QZ?a2E@!joM~}C@uIq)a|T<``V5sBdt>TFS&x2|<~Uv; zV&;6zq7SHqBoLAQN9z%HdWxZd`IfsPV!5IZ1b3P=-dFj%X`$G@)LAcZ8D;~OU;k#C2}gY$N4)vr<}OT;$0NG4X{x_Z?Ex{?4tSwXD zdC#0U&-RMc`mBA~mb-2r-|+I~!tkvT*BZbow?Wlkm<44(sq-y*pILitLayfUEq+k? z{!Y1=8Pk@9xAy$!;EP+-J<~0M3spVHepZm}AV&}ZKM{;=yK{kHHdp*kq+_;a`^vup5|P7aBoog1firy!lqMG*2%J+hT+g(m9wO_Wd zsI}n|G@Oy`rzHG8!x9eE0XYwC=6!3|S-1W7bFsuz9ea)>pIhVpk@LjC(8t~zmwm2H z0cB_)pqBlupiG7Y4xN)^SB+wkvFQ5CcIE=Rb8^OuODySs-)PCb-rcgn`jb`=5%{q}Pt` z?iU-A^-Z)q+BdA&-FC3VVa_&H(ejpuJ#nFtiyMzq+5Q)3_7j`_VbKN;e`tWvEBzze z4-S7&VN3)7xfcXr8YI?y`?9!u?KBS`kH0#BWeW|b^>DM?bg_uKYWvf0^VW9} zU;|+3|3wmNpl#pJF8(s(`nG-U=B+2cWq$Vp94Os*7RC{N7PE6Yqt Z&DYD!D~Zp|FUic$<3$opEHeaI0{}#XGzkCz literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/ladder-mutations/floors-swapped/package.receipt.json b/wai/pack-conformance/ladder-mutations/floors-swapped/package.receipt.json new file mode 100644 index 000000000..5fb9a0c0f --- /dev/null +++ b/wai/pack-conformance/ladder-mutations/floors-swapped/package.receipt.json @@ -0,0 +1 @@ +{"asset_id":"video-ladder-01","components":[{"id":"v","index":"index-v.wsix","index_digest":"fc97f47085f5d79c5ac12f3ce965a6523929b3161091256f545bf6b520cb3017","media_class":"video","stage_root":"c9825fa6105cd5a41a142e11be3d6bf85421ca1547f580315cb5542f1a2de268"}],"energy_provenance":null,"grant":{"capability":"wai.video.package","funds_ceiling":null,"grant_hash":"0000000000000000000000000000000000000000000000000000000000000000","joule_ceiling_micro":null},"joules_micro":0,"kind":"package","packager":"builtin:wai-pack@0.1.0","parent_kind":"none","parent_receipt_hash":null,"policy_digest":"6938df61d1274e43680652af682498bd5c7f1505c5f51b08c770143643c6388e","receipt_hash":"42c2905ad0aabfe3c1d00caa9ecc73a089e289cd01f356ed5c60ce38395663e6","sig":"2f39ed2b68c18fce1278711711bc0cde4634403ae38b2c65dd1f64944acbbdcdd723490f017376c8c017871ef64b6c7a4d6e394851fe4ebed38dd2c84309a602","signer_id":"did:key:z6MkqahniHbtvRDna9jmc9dSMo88FCuKnuujLKxbWyK4682w","signer_pubkey":"a558bae731bbba29b0b2308493514f6ec8a51ab40409cce9e3afafecca787224","stored_bytes":127966,"total_bytes":140530,"total_entries":15,"unique_objects":12,"version":2,"work_units":15} \ No newline at end of file diff --git a/wai/pack-conformance/ladder-mutations/master-lists-one-floor/LISTING b/wai/pack-conformance/ladder-mutations/master-lists-one-floor/LISTING new file mode 100644 index 000000000..3497529b9 --- /dev/null +++ b/wai/pack-conformance/ladder-mutations/master-lists-one-floor/LISTING @@ -0,0 +1,46 @@ +c5203585fea0962de941d258789157a0590e18b62a2e5d1facbd11e1cfd1ddb9 dash/classic.mpd +a3aa7658db9b85a9d9a1fed977825189f75c5adad0f5fdfcd70ebd604824c138 dash/mobile.mpd +3f520749a6d2f231cddfd17804ee3629439f3678515e424c44e36cff54d89de9 dash/tv.mpd +04c948608aaa7b5d78ad5355042a2ff65b0f75d9d4b1ad78f3ebffb886a74be6 floor/hi/04c948608aaa7b5d78ad5355042a2ff65b0f75d9d4b1ad78f3ebffb886a74be6.m4s +06d5cd79ba3860cccdc252fe915de0902f941a3c6a000295714f7cab193aa6cf floor/hi/06d5cd79ba3860cccdc252fe915de0902f941a3c6a000295714f7cab193aa6cf.m4s +2f93f0ad449f9cc881b7816c6ab33fd445037d6538b445bcc76431f9c9f91c5b floor/hi/2f93f0ad449f9cc881b7816c6ab33fd445037d6538b445bcc76431f9c9f91c5b.m4s +420ae4c941bba6e12a6c7fdb7d01dc69170ecb4240dffd2e86808ddf87baa12a floor/hi/420ae4c941bba6e12a6c7fdb7d01dc69170ecb4240dffd2e86808ddf87baa12a.m4s +576b7d2156c2b595bf48bf34f67996d7f89e75d105f0dc71c9841bb96e6cd0fc floor/hi/576b7d2156c2b595bf48bf34f67996d7f89e75d105f0dc71c9841bb96e6cd0fc.m4s +58c598174eed554cd0d1bc8abedca8c9d51d992c8e3b963bcb7574da4983ed9f floor/hi/init.mp4 +589ad79210bff258db68916876846a2b0d530ea2e44260af66ddc51ad14ce07f floor/lo/589ad79210bff258db68916876846a2b0d530ea2e44260af66ddc51ad14ce07f.m4s +6bba50408f894d0e9d5516a53992fdd2aa86db43ccdc684b69c51a688856a0db floor/lo/6bba50408f894d0e9d5516a53992fdd2aa86db43ccdc684b69c51a688856a0db.m4s +acd166807d05fe4f512407f717659d88613f6d0d360485effe3751504cefbb74 floor/lo/acd166807d05fe4f512407f717659d88613f6d0d360485effe3751504cefbb74.m4s +d0f68eb18af5b67736ddccd97ed45c4c0274b0460f6abc8f54940ac378165833 floor/lo/d0f68eb18af5b67736ddccd97ed45c4c0274b0460f6abc8f54940ac378165833.m4s +d550ebb204adf0b5a7f310c7d07189e7bed63e12e34e9ed4d9bf96a101d864a9 floor/lo/d550ebb204adf0b5a7f310c7d07189e7bed63e12e34e9ed4d9bf96a101d864a9.m4s +640cd81c83baefbe13e8ccc2bf577395c6602885cc73e201ca34dc267e7f0a48 floor/lo/init.mp4 +bfa98255d682517f58df4073bc71fdb3fcca120fc33d16e4aca873392476c586 hls/classic/floor-hi.m3u8 +ad81674ac359096ebed255a26a40e82858e53e9754702429e59d72898df33812 hls/classic/floor-lo.m3u8 +3d8ca6988d54790388e062f4ed37b3f73fd6904aefa5ed88014125e51aaf5429 hls/classic/master.m3u8 +3fd88f9dcf835edf0fcca8dff8371d2b4e897ac097fc85901477c950c0da7996 hls/legacy/master.m3u8 +09e75f55cb7ea829a4e630404d2ab540e8be0dbb1c4365dc30802359b658aed9 hls/mobile/master.m3u8 +c4044eca76959c9f87230484a2b207fb12c0bcaedb8d921eab806014fca53cb8 hls/mobile/wai-v.m3u8 +60a6378f46afc9308dc4ac4d138602b16568577616ea0bf4526b142d86899151 hls/mobile/wai.m3u8 +09e75f55cb7ea829a4e630404d2ab540e8be0dbb1c4365dc30802359b658aed9 hls/tv/master.m3u8 +ff4edf2929e380d205c1c74156621185feec53d593ffa968b8dfaf0d05448bcd hls/tv/wai-v.m3u8 +5d42147b308330913c3d9c8a868ca83ce4d3f3e460da8d84c84014eb24aaf9d7 hls/tv/wai.m3u8 +a5140df0bf1f82b88335c13789502298a952b350ad45dfcfcd249b2b9a263a71 index-v.wsix +c310c5a4ae14df691a1a37a6c34e90243ed72be1e8f725d38f1babe1f6866b21 moq/catalog.json +07e98fb9ef9ff3fa6bf04f9078da2a3d2423e586feea1061256131a1d1fbb943 objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai +2f5bd830d841eb122c63ae57a15442075478fd522ce55b6f9bcbe41acd51d8ae objects/482fbbb9b39bdb9cbf00515f94269ea591df681ced90b05d97e0df106b49b08e.wai +0057633252a2c2ed5f71fe14ca78075c8e89fc6675a08335ac90f0e56032b825 objects/4ab8f747d181632f342a4887b0a8bb86c174409cb625157784e18c5e5559a381.wai +cfb71256ef44758ea279846a8938823994d321abce83ef73afd2ed269a8e0259 objects/618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481.wai +f3eedf9eb2870c0160801397412e7a4c3aca4a6e16f1a69a276e1356d38c9220 objects/61c7c3b7ccab07ed01df5b0d7ca0240598b914dbf2cabe545aa001e8de12d365.wai +1a6f30fdc000f258c948470386d84beef2ba5a84e922c355093837ae21fd573c objects/6ce13c9ef6872caeb7fbe71661ca88bcc463ceac47f109c8c155e34bb1a6f37d.wai +b773dac63c9d2d9980d0d249ea956e03065c1ae40d17c512df29b690c0c820ef objects/b7bf0717e968d7b6be473785c9f66cbb814cde679bceb1ae37f0765308ddee72.wai +b2a40a9a8cec3dcaf6c92a07d6765203c412c57ec879b7e33a52eabb2e74609d objects/c2ce1907255a041c388afd06ccd007436368e8d20467fdec2a1eebbb84b03bf2.wai +cc8a6fc59be29bd33d96fb30ea9e5a30a5aa367a82da9c5784cbadce63396f62 objects/cf842ef3058d3c54d56c0ea3e075efdc77163602b4a1dabcff080e5ea28b9946.wai +01b596b672de3352adb3e01b34fcddfeff975f4ee1d0b88dde160ac10c9bf929 objects/d382ba093b0595c44a43dc3aad22fc0bed42baeb3488f00dfe3567056a7009c5.wai +9d9ae296558ce7f7d644ad0ca3af65eb4fc98d03b0bd6d7a8fc821fc952e86c1 objects/f525b4450c29153dde0b43e4d143dfb76fcc3884c607b744c8a53fa6a1728580.wai +3d573ee482f8187b0e3bc839aeea0f51a67144588d6d207e8466fea91a0c5b34 objects/f7f7f4d6af777bfcce09cdda5ecb754ce6bd8dcd2e03ecfc41359cad989b15f7.wai +bd6086051d0452449da8a90f426f454fee368b4794f7c294218a410ded8d9088 package.receipt.json +517630d9bee1f5559baff3bb3e642f6aa7b5276226f6e3bdba4f3f9724794859 plan-v.txt +d1cf1bd28a06f3a9d695dd64331cb56cf793818e9e9e6cec620183d9dce37b2d policy.json +4ba48d04e5c8e72336e32307b27b4371c96f20f7abf959ac1c1d344ccb9a8106 policy.toml +813329d5521ab5891bb86d29b362e448fae4247c949384b0687d66966546c4fe stages/legacy.json +ca8e0059a23311d7690a0519f85dfb48883721c817cd8fe1cd481cabe14b0032 stages/mobile.json +8bc9c9da674b4765ead0e41d54852ac105161e9638e7ae705e3982847b069e4c stages/tv.json diff --git a/wai/pack-conformance/ladder-mutations/master-lists-one-floor/hls/classic/master.m3u8 b/wai/pack-conformance/ladder-mutations/master-lists-one-floor/hls/classic/master.m3u8 new file mode 100644 index 000000000..1742325fb --- /dev/null +++ b/wai/pack-conformance/ladder-mutations/master-lists-one-floor/hls/classic/master.m3u8 @@ -0,0 +1,5 @@ +#EXTM3U +#EXT-X-VERSION:7 +#EXT-X-INDEPENDENT-SEGMENTS +#EXT-X-STREAM-INF:BANDWIDTH=10440,AVERAGE-BANDWIDTH=9055,CODECS="av01.0.00M.08",RESOLUTION=64x36 +../classic/floor-hi.m3u8 diff --git a/wai/pack-conformance/mutations/expected.json b/wai/pack-conformance/mutations/expected.json index 2d9e302a9..ad22a5645 100644 --- a/wai/pack-conformance/mutations/expected.json +++ b/wai/pack-conformance/mutations/expected.json @@ -96,6 +96,24 @@ "index": "index/floor-without-derived-from.wsix", "reason": "floor-derived-from" }, + { + "name": "floor-only-piece", + "kind": "index", + "index": "index/floor-only-piece.wsix", + "reason": "ok" + }, + { + "name": "floor-only-piece-with-derived-from", + "kind": "index", + "index": "index/floor-only-piece-with-derived-from.wsix", + "reason": "floor-derived-from" + }, + { + "name": "piece-kind-none", + "kind": "index", + "index": "index/piece-kind-none.wsix", + "reason": "ok" + }, { "name": "entry-flag-unknown", "kind": "index", diff --git a/wai/pack-conformance/mutations/index/floor-only-piece-with-derived-from.wsix b/wai/pack-conformance/mutations/index/floor-only-piece-with-derived-from.wsix new file mode 100644 index 0000000000000000000000000000000000000000..965257d42a6a1b9c2738c8efcf53c515b69224c9 GIT binary patch literal 960 zcmWF!_KaX;U|^60Vi3&)#H>&Z;xiHeKqVvr6Xg?m(PPP&#ct(74xAt{biN_Y2; z?@cW0em34N7URlyU;cXNs<1OCTRA9i~-uuM6UfW(Cpt)mpSW& z){XTZ4hN;4>A5a0xnR@2RjvD1*qhLapSyn9wWEa>$UiKg&_|DGG;?8GnEy+l=CH#g zptR!-&->4ew4S(5-ktTt*JZ#OLOhWaj6gix#D(W#*;wBB@O*GlZB2057nz`v3p{ literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/mutations/index/floor-only-piece.wsix b/wai/pack-conformance/mutations/index/floor-only-piece.wsix new file mode 100644 index 0000000000000000000000000000000000000000..b3e502adbc6ceeb5af67c3ba4d792a621a0b66a7 GIT binary patch literal 960 zcmWF!_KaX;U|^60Vi3&)#H>&Z;xiHeKqVvr6Xg?m(PPP&#ct(74xAt{biN_Y2; z?@cW0em34N7URlyU;cXNs<1OCTRA9i~-uuM6UfW(Cpt)mpSW& z){XTZ4hN;4>A5a0xnR@2RjvD1*qhLapSyn9wWEa>$UiKg&_|DGG;?8GnEy+l=CH#g zptR!-&->4ew4S(5-ktTXl`tq~_~o=9R?f=9gsV=b?)hrKV-(rSc-FO)N8nmwY%gF66;wm=RQh1?)P6DwsIP{VYJt!~k?KLYkqz#G>zRq}x(~9iRRQO_aFI z==MWYSM;ZRzd`K;l_WOKO~{IY`u+m}C=5Ut1lS1xka`f922su+fM(uOi!~fu<)0mU zw>$M&?&OB2HpOk%;#>P=81%(*=62h!6oFX;)eoYWfqno9-vLGf0qfZzw*UX{0JZl7 zk~tt|_5BIQl2Z~IB&~cuooBf#_**pV-jkE6zrPD@laLhYKWTzyKgbxM{Y>QA{{qea z9d((rUTED|@8NJz>Y1MF;*twC?OWBle}%mXo%p%ymt8wrc!B)G0t$UlWD)^j{x5-= z!;Yqh*!YJz17se^@8AFc(!_>8uK0J{;d%d=k=7H}$-A@O+GbCyJevOfvw~%nkE3cv zbDXgj%>T&tQ`7&9@RSS*7+7>OGL$hfl$41ulqY8Dm1U-+=IdqVmBi=fmt^MWp^Fx! Rre)@(@*=5CEHi|d2LK*l&SwAs literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/pack_verify.py b/wai/pack-conformance/pack_verify.py index 3e637f56d..20ac55f7c 100644 --- a/wai/pack-conformance/pack_verify.py +++ b/wai/pack-conformance/pack_verify.py @@ -57,9 +57,27 @@ from their specifications, reads the capability registry from its published expo verified as above without its inputs, and refused with the reason the corpus gives it (the first check that fails), or accepted where the corpus says `ok`. - python3 pack_verify.py + python3 pack_verify.py [--jobs N] [--native-blake3] + python3 pack_verify.py [--jobs N] [--native-blake3] --package Exit status 0 only if every vector verifies. Python 3.11 or later (tomllib). + +At scale (a package of a full title), two options make the same checks faster: + +- `--jobs N` hashes every object and decodes every base and its layers in N worker + processes, each piece alone, before the checks run; the checks, their order and their + reasons are the serial run's, reading the workers' content hashes and prefix digests + where the serial run computes them. Each object is hashed once, and each URI a playlist + names is resolved by content id (http_verify.resolve_uri), not by hashing every object. +- `--native-blake3` takes BLAKE3 from the `blake3` module, which binds the BLAKE3 team's + Rust implementation, the one wai-rs links, so the hashes are no longer computed by code + independent of wai-rs; it is taken only after it agrees with the pure implementation + here on the published BLAKE3 vectors (../http-conformance/blake3_vectors.json) and on + generated inputs of every chunk boundary, and refused otherwise. + +`--package ` verifies one package as §11.3 does, without its sources, as a +publisher's verifier does (the receipt's signature by its own key, §9.1, since no +`key.hex` sits beside it). """ import hashlib import itertools @@ -87,6 +105,52 @@ sys.path.insert(0, os.path.join(HERE, "..", "http-conformance")) import http_verify as HV # noqa: E402 HV.load_registry() +# --jobs: worker processes for the hashes and decodes run ahead of the checks; 1 runs none. +JOBS = 1 +NATIVE = False +_POOL = None + + +def _worker_init(native): + if native: + use_native_blake3() + + +def pool(): + """The worker processes (--jobs), each with this run's BLAKE3.""" + global _POOL + if _POOL is None and JOBS > 1: + import multiprocessing + _POOL = multiprocessing.get_context("spawn").Pool(JOBS, initializer=_worker_init, initargs=(NATIVE,)) + return _POOL + + +def use_native_blake3(): + """--native-blake3: the blake3 module, only where it agrees with the pure BLAKE3 on the + published vectors and on inputs at and around every chunk and block boundary.""" + global blake3 + try: + import blake3 as nb + except ImportError: + raise SystemExit("pack_verify: --native-blake3, but no blake3 module is installed") + + def native(b): + return nb.blake3(b).digest() + vec = json.load(open(os.path.join(HERE, "..", "http-conformance", "blake3_vectors.json"))) + for c in vec["cases"]: + data = bytes(i % 251 for i in range(c["input_len"])) + if native(data).hex() != c["hash"][:64] or blake3(data).hex() != c["hash"][:64]: + raise SystemExit(f"pack_verify: the native BLAKE3 disagrees on the {c['input_len']}-byte vector") + for n in [0, 1, 63, 64, 65, 1023, 1024, 1025, 2048, 4095, 4096, 4097, 16385, 65537]: + data = bytes((i * 131 + n) % 256 for i in range(n)) + if native(data) != blake3(data): + raise SystemExit(f"pack_verify: the native BLAKE3 disagrees on a {n}-byte input") + import _blake3 + global NATIVE + _blake3.blake3 = native + blake3 = native + NATIVE = True + MAX_INTEGER = (1 << 53) - 1 # The longest manifest a reader must accept (SPEC §2, *Reader limits*). MANIFEST_MAX = 1 << 27 @@ -318,7 +382,7 @@ def read_policy(doc): raise top.err("policy-missing-key", "component") comps = [] for c in top.tables("component"): - c.keys(["id", "media", "source", "timebase"]) + c.keys(["id", "media", "source", "timebase", "profile"]) m = {"id": c.ident("id")} media = c.string_req("media") if media not in MEDIA: @@ -330,6 +394,12 @@ def read_policy(doc): tb = c.table_req("timebase") tb.keys(["num", "den"]) m["timebase"] = {"num": tb.uint_in("num", 1, U32, None), "den": tb.uint_in("den", 1, U32, None)} + # §7.8: "floor-only", a component of floor rungs alone; absent, the standard profile. + pf = c.string("profile") + if pf is not None: + if pf != "floor-only": + raise c.err("policy-value", "profile") + m["profile"] = pf comps.append(m) P["component"] = comps s = top.table("segmentation") @@ -364,7 +434,7 @@ def read_policy(doc): ladder.append(m) P["ladder"] = ladder f = top.table("floor") - f.keys(["supplied_listing", "extra_keyframes"]) + f.keys(["supplied_listing", "extra_keyframes", "supplied_form"]) fl = {} sl = f.string("supplied_listing") if sl is not None: @@ -372,6 +442,12 @@ def read_policy(doc): raise f.err("policy-value", "supplied_listing") fl["supplied_listing"] = sl fl["extra_keyframes"] = f.boolean("extra_keyframes", False) + # §7.7: "cmaf", the supplied floor in the CMAF form; absent, the OBU form (§7.3). + sf = f.string("supplied_form") + if sf is not None: + if sf != "cmaf": + raise f.err("policy-value", "supplied_form") + fl["supplied_form"] = sf P["floor"] = fl lv = top.table("live") lv.keys(["layer_lag_ms"]) @@ -514,7 +590,13 @@ def constrain(P, lag): if first_dup(r["refines"] for r in P["ladder"] if "refines" in r) is not None: no("policy-refines-branch") for c in P["component"]: - if not any(r["component"] == c["id"] and r["role"] == "base" for r in P["ladder"]): + def has(role, c=c): + return any(r["component"] == c["id"] and r["role"] == role for r in P["ladder"]) + if c.get("profile") == "floor-only": + # §7.8: floor rungs alone, and no source. + if has("base") or has("refinement") or "source" in c or not has("floor"): + no("policy-floor-only") + elif not has("base"): no("policy-no-base") n = max(layers(P).values(), default=0) + 1 if any(c["max_layer"] > n - 1 for c in P["class"]): @@ -527,8 +609,10 @@ def constrain(P, lag): rs = [by.get(i) for i in ids] # One component, each rung once, exactly one base, every refinement over a # rung it names, and every floor rung of its component (§3.4 item 10). + fo = rs and all(rs) and any(c["id"] == rs[0]["component"] and c.get("profile") == "floor-only" for c in P["component"]) + # A floor-only component's ladder is its floor rungs, every one (§7.8). ok = rs and all(rs) and all(x["component"] == rs[0]["component"] for x in rs) \ - and len(set(ids)) == len(ids) and sum(x["role"] == "base" for x in rs) == 1 \ + and len(set(ids)) == len(ids) and sum(x["role"] == "base" for x in rs) == (0 if fo else 1) \ and all(x.get("refines", ids[0]) in ids for x in rs) \ and all(f["id"] in ids for f in P["ladder"] if f["component"] == rs[0]["component"] and f["role"] == "floor") if not ok: @@ -1173,7 +1257,8 @@ MEDIA_CLASSES = ["video", "image", "audio", "world", "feed", "avatar", "film"] ROLES = ["base", "refinement", "floor", "snapshot", "ops", "receipt", "asset"] BASE, REFINEMENT, FLOOR = 0, 1, 2 NO_REFINES = 0xFFFFFFFF -PIECE_KINDS = KINDS + ["world", "audio"] +# §6.2: 6, none, is a floor-only component's piece, which no source classifies (§7.8). +PIECE_KINDS = KINDS + ["world", "audio", "none"] ENTRY_DUP, ENTRY_DERIVED = 2, 4 TIER_NAMES = [None, "entropy-consistency", "decode-equivalence"] @@ -1335,7 +1420,10 @@ def index_rules(ix): raise Refused("digest-without-tier") if e["deadline"] and not refinement: raise Refused("deadline-role") - if e["role"] == FLOOR and not e["flags"] & ENTRY_DERIVED: + # A floor presents its piece's base; a piece with no base has floors that present + # nothing (§6.3, §7.8). + has_base = any(x["role"] == BASE for x in E[pc["first_entry"]:pc["first_entry"] + pc["n_entries"]]) + if e["role"] == FLOOR and bool(e["flags"] & ENTRY_DERIVED) != has_base: raise Refused("floor-derived-from") earlier = [x for x in E[:i] if x["hash"] == e["hash"]] if any(x["byte_len"] != e["byte_len"] for x in earlier): @@ -1633,12 +1721,13 @@ def refines_ok(ix, i, rf): return all(p in below for p in producers) and E[e["refines"]]["hash"].hex() in producers -def object_rules(ix, i, data): - """§6.3, with the objects in hand: entry i's object, the first rule broken is the refusal.""" +def object_rules(ix, i, data, hashed=None): + """§6.3, with the objects in hand: entry i's object, the first rule broken is the refusal. + `hashed` is its content hash where a worker computed it (--jobs).""" e = ix["entries"][i] if len(data) != e["byte_len"]: raise Refused("object-length") - if content_hash(data) != e["hash"]: + if (hashed if hashed is not None else content_hash(data)) != e["hash"]: raise Refused("object-hash") env = read_envelope(data) if env is None: @@ -2495,6 +2584,219 @@ def without_delimiters(obu_list): return b"".join(whole for t, whole, _ in obu_list if t != OBU_TD) +# ---------------------------------------------------------------- a supplied CMAF floor (§7.7) + + +class CmafFault(Exception): + """§7.7: floor-cmaf-malformed (its boxes) or floor-cmaf-timing (its times).""" + def __init__(self, code, why): + super().__init__(f"{why} ({code})") + self.code = code + + +def cm_bad(why): + return CmafFault("floor-cmaf-malformed", why) + + +def bmff_boxes(b, start, end): + """ISO/IEC 14496-12's boxes tiling b[start:end]: (type, box start, body start, box end). + A size of 0 and a size below its header are refused; a size of 1 is the 64-bit size.""" + out, at = [], start + while at < end: + if at + 8 > end: + raise cm_bad(f"a box header runs past the end at byte {at}") + size, kind, head = int.from_bytes(b[at:at + 4], "big"), b[at + 4:at + 8], 8 + if size == 1: + if at + 16 > end: + raise cm_bad("a 64-bit box size runs past the end") + size, head = int.from_bytes(b[at + 8:at + 16], "big"), 16 + if size < 16: + raise cm_bad(f"a 64-bit box size below 16 at byte {at}") + elif size == 0: + raise cm_bad(f"a box of size 0 at byte {at}") + elif size < 8: + raise cm_bad(f"a box size below 8 at byte {at}") + if at + size > end: + raise cm_bad(f"a box runs past its parent at byte {at}") + out.append((kind, at, at + head, at + size)) + at += size + return out + + +def bmff_one(bs, kind, within): + v = [x for x in bs if x[0] == kind] + if len(v) != 1: + raise cm_bad(f"{within} holds {len(v)} {kind.decode('latin-1')} boxes, not one") + return v[0] + + +def be_at(b, at, n, end): + if at + n > end: + raise cm_bad(f"a field runs past its box at byte {at}") + return int.from_bytes(b[at:at + n], "big") + + +def version(b, body, end): + """A full box's version, its first byte, read inside the box.""" + return be_at(b, body, 4, end) >> 24 + + +def cmaf_init(b): + """§7.7's init.mp4: one moov of one trak and an mvex; tkhd's track, mdhd's timescale (at + least 1), a vide handler, one av01 sample entry, an edit list (if any) of one entry at + media time 0 and rate 1, and trex's defaults for that track. Returns (track, timescale, + (duration, size, flags)).""" + top = bmff_boxes(b, 0, len(b)) + _, _, mb, me = bmff_one(top, b"moov", "init.mp4") + mv = bmff_boxes(b, mb, me) + _, _, tb, te = bmff_one(mv, b"trak", "moov") + _, _, xb, xe = bmff_one(mv, b"mvex", "moov") + tk = bmff_boxes(b, tb, te) + _, _, hb, he = bmff_one(tk, b"tkhd", "trak") + track = be_at(b, hb + 4 + (16 if version(b, hb, he) == 1 else 8), 4, he) + ed = [x for x in tk if x[0] == b"edts"] + if ed: + _, _, eb, ee = bmff_one(bmff_boxes(b, ed[0][2], ed[0][3]), b"elst", "edts") + n = be_at(b, eb + 4, 4, ee) + if version(b, eb, ee) == 1: + mt, rate = be_at(b, eb + 16, 8, ee), be_at(b, eb + 24, 4, ee) + mt = mt - (1 << 64) if mt >> 63 else mt + else: + mt, rate = be_at(b, eb + 12, 4, ee), be_at(b, eb + 16, 4, ee) + mt = mt - (1 << 32) if mt >> 31 else mt + if n != 1 or mt != 0 or rate != 0x00010000: + raise CmafFault("floor-cmaf-timing", "an edit list other than one entry at media time 0 and rate 1") + _, _, db, de = bmff_one(tk, b"mdia", "trak") + md = bmff_boxes(b, db, de) + _, _, kb, ke = bmff_one(md, b"mdhd", "mdia") + ts = be_at(b, kb + 4 + (16 if version(b, kb, ke) == 1 else 8), 4, ke) + if ts == 0: + raise CmafFault("floor-cmaf-timing", "a timescale of 0") + _, _, lb, le_ = bmff_one(md, b"hdlr", "mdia") + if lb + 12 > le_ or b[lb + 8:lb + 12] != b"vide": + raise cm_bad("the track's handler is not vide") + _, _, ib, ie = bmff_one(md, b"minf", "mdia") + _, _, sb, se = bmff_one(bmff_boxes(b, ib, ie), b"stbl", "minf") + _, _, db2, de2 = bmff_one(bmff_boxes(b, sb, se), b"stsd", "stbl") + if be_at(b, db2 + 4, 4, de2) != 1: + raise cm_bad("a sample description of other than one entry") + entries = bmff_boxes(b, db2 + 8, de2) + if len(entries) != 1 or entries[0][0] != b"av01": + raise cm_bad("the sample description is not one av01 entry") + _, _, rb, re_ = bmff_one(bmff_boxes(b, xb, xe), b"trex", "mvex") + version(b, rb, re_) + if be_at(b, rb + 4, 4, re_) != track: + raise cm_bad("trex names another track than tkhd") + return track, ts, (be_at(b, rb + 12, 4, re_), be_at(b, rb + 16, 4, re_), be_at(b, rb + 20, 4, re_)) + + +PRELUDE = (b"styp", b"sidx", b"prft", b"emsg", b"free", b"skip") + + +def cmaf_segment(b, init): + """§7.7's media segment: prelude boxes, then moof/mdat pairs; each moof an mfhd and one + traf of tfhd (the init's track, no base data offset or empty duration), tfdt and truns + with data offsets; each sample's duration, size and flags its trun's, else tfhd's, else + trex's, its bytes in the mdat after its moof, no composition offset but 0, no sample of + no bytes; each moof's decode time where the one before it ended. Returns the samples as + (offset, length, duration, flags, decode time).""" + track, _, (dd, ds, df) = init + top = bmff_boxes(b, 0, len(b)) + first = next((i for i, x in enumerate(top) if x[0] == b"moof"), None) + if first is None: + raise cm_bad("a segment with no moof") + if any(x[0] not in PRELUDE for x in top[:first]): + raise cm_bad("a box before the first moof that is not a prelude box") + rest = top[first:] + if len(rest) % 2 or any(rest[i][0] != b"moof" or rest[i + 1][0] != b"mdat" for i in range(0, len(rest), 2)): + raise cm_bad("after the first moof, other than moof and mdat pairs") + out, nxt = [], None + for i in range(0, len(rest), 2): + (_, ms, mb, me), (_, _, ab, ae) = rest[i], rest[i + 1] + mo = bmff_boxes(b, mb, me) + bmff_one(mo, b"mfhd", "moof") + if any(x[0] not in (b"mfhd", b"traf") for x in mo): + raise cm_bad("a moof holding other than mfhd and traf") + _, _, fb, fe = bmff_one(mo, b"traf", "moof") + tr = bmff_boxes(b, fb, fe) + if any(x[0] not in (b"tfhd", b"tfdt", b"trun") for x in tr): + raise cm_bad("a traf holding other than tfhd, tfdt and trun") + _, _, hb, he = bmff_one(tr, b"tfhd", "traf") + tf = be_at(b, hb, 4, he) & 0xFFFFFF + if tf & ~(0x02 | 0x08 | 0x10 | 0x20 | 0x020000): + raise cm_bad(f"tfhd flags {tf:#x}") + if be_at(b, hb + 4, 4, he) != track: + raise cm_bad("a tfhd of another track") + at = hb + 8 + vals = {} + for bit, name in ((0x02, "sdi"), (0x08, "dur"), (0x10, "size"), (0x20, "flags")): + if tf & bit: + vals[name] = be_at(b, at, 4, he) + at += 4 + d_dur, d_size, d_flags = vals.get("dur", dd), vals.get("size", ds), vals.get("flags", df) + _, _, tb, te = bmff_one(tr, b"tfdt", "traf") + dts = be_at(b, tb + 4, 8 if version(b, tb, te) == 1 else 4, te) + if nxt is not None and nxt != dts: + raise CmafFault("floor-cmaf-timing", "a moof whose decode time is not where the one before it ended") + runs = [x for x in tr if x[0] == b"trun"] + if not runs: + raise cm_bad("a traf with no trun") + for _, _, rb, re_ in runs: + rf = be_at(b, rb, 4, re_) & 0xFFFFFF + if rf & ~(0x01 | 0x04 | 0x100 | 0x200 | 0x400 | 0x800) or not rf & 0x01: + raise cm_bad(f"trun flags {rf:#x}") + n = be_at(b, rb + 4, 4, re_) + off = be_at(b, rb + 8, 4, re_) + off = off - (1 << 32) if off >> 31 else off + at = rb + 12 + first_flags = None + if rf & 0x04: + first_flags, at = be_at(b, at, 4, re_), at + 4 + per = sum(1 for bit in (0x100, 0x200, 0x400, 0x800) if rf & bit) + if at + 4 * per * n > re_: + raise cm_bad("trun shorter than its samples") + data = ms + off + for k in range(n): + def f(bit): + nonlocal at + if not rf & bit: + return None + v = be_at(b, at, 4, re_) + at += 4 + return v + dur, size, own, cto = f(0x100), f(0x200), f(0x400), f(0x800) + dur = d_dur if dur is None else dur + size = d_size if size is None else size + flags = (first_flags if first_flags is not None else own) if k == 0 else own + flags = d_flags if flags is None else flags + if cto: + raise CmafFault("floor-cmaf-timing", "a sample whose composition time is not its decode time") + if size == 0: + raise cm_bad("a sample of no bytes") + if data < ab or data + size > ae: + raise cm_bad("a sample's bytes outside the mdat after its moof") + out.append((data, size, dur, flags, dts)) + data += size + dts += dur + nxt = dts + if not out: + raise cm_bad("a segment with no sample") + return out + + +def cmaf_times(samples, timescale, num, den, start): + """§7.7: every sample one frame long, the first at frame `start`'s decode time.""" + if any(s[2] * num != timescale * den for s in samples): + raise CmafFault("floor-cmaf-timing", "a sample that does not last one frame") + if samples[0][4] * num != start * timescale * den: + raise CmafFault("floor-cmaf-timing", f"a segment that does not start at frame {start}") + + +def cmaf_units(b, samples): + """§7.7: each sample a temporal unit without its temporal delimiter.""" + return [b"\x12\x00" + b[at:at + n] for at, n, _, _, _ in samples] + + # ---------------------------------------------------------------- classes and catalogs (§8) @@ -2554,6 +2856,13 @@ def piece_ladder(P, cid, then): return base, chain, [r for r in mine if r["role"] == "floor"] +def floor_names(P, cid): + """§7.1: the component's floor rungs, in ladder order, each with its floor name: the + component's id when it has one floor rung, the rung's id when it has several.""" + rungs = [r for r in P["ladder"] if r["component"] == cid and r["role"] == "floor"] + return [(r, cid if len(rungs) == 1 else r["id"]) for r in rungs] + + def default_base_cap(P, cid): """§5.7: the capability of a component's first base rung, which its HTTP views carry.""" return next((r["capability"] for r in P["ladder"] if r["component"] == cid and r["role"] == "base"), "") @@ -2623,13 +2932,15 @@ def codecs_value(objects): return "wai1." + "|".join(alt(*a) for a in union), "wai1." + "|".join(alt(*a) for a in floor) -def render_catalogs(P, ix, c, floor, size, policy_hex): +def render_catalogs(P, ix, c, floors, size, policy_hex): """§8.3–§8.8 for one component c: every catalog file as the index, the objects and the - floor give it. floor: (codecs, width, height, [(fragment name, bytes)]); size: (W, H).""" + floors give it. floors: per floor rung in ladder order, (floor name, codecs, width, + height, [(fragment name, bytes)]); size: (W, H).""" num, den = ix["tb"] pieces, plan = ix["pieces"], ix["plan"] - F, FW, FH, frags = floor - W, H = size + # A floor-only component has no base and no frame size of its own (§7.8); only a WAI + # view, which lists none of it, names that size. + W, H = size or (0, 0) first_piece, first_start = ix["first_piece"], pieces[0]["start"] total = sum(pc["duration"] for pc in pieces) tgt = max(-(-pc["duration"] * den // num) for pc in pieces) @@ -2642,18 +2953,24 @@ def render_catalogs(P, ix, c, floor, size, policy_hex): """(BANDWIDTH, AVERAGE-BANDWIDTH) over (bytes, units) pairs.""" return (max(bps(n, d, num, den) for n, d in per), bps(sum(n for n, _ in per), sum(d for _, d in per), num, den)) - fb, fa = rates([(len(fr), pc["duration"]) for (_, fr), pc in zip(frags, pieces)]) head = ["#EXTM3U", "#EXT-X-VERSION:7", "#EXT-X-INDEPENDENT-SEGMENTS"] - inf = f'#EXT-X-STREAM-INF:BANDWIDTH={fb},AVERAGE-BANDWIDTH={fa},CODECS="{F}",RESOLUTION={FW}x{FH}' - # The floor variant's URI resolves from hls/classic/ and from every class's directory - # alike, so a class's master is the classical one with at most one line added. - out["hls/classic/master.m3u8"] = text(head + [inf, f"../classic/floor-{c}.m3u8"]) + # One variant per floor rung, in ladder order. A variant's URI resolves from + # hls/classic/ and from every class's directory alike, so a class's master is the + # classical one with at most one line added. + variants, fbw = [], {} + for fname, F, FW, FH, frags in floors: + fb, fa = rates([(len(fr), pc["duration"]) for (_, fr), pc in zip(frags, pieces)]) + fbw[fname] = fb + variants += [f'#EXT-X-STREAM-INF:BANDWIDTH={fb},AVERAGE-BANDWIDTH={fa},CODECS="{F}",RESOLUTION={FW}x{FH}', + f"../classic/floor-{fname}.m3u8"] + out["hls/classic/master.m3u8"] = text(head + variants) media = ["#EXTM3U", "#EXT-X-VERSION:7", f"#EXT-X-TARGETDURATION:{tgt}", "#EXT-X-MEDIA-SEQUENCE:0", "#EXT-X-PLAYLIST-TYPE:VOD", "#EXT-X-INDEPENDENT-SEGMENTS"] - lines = media + [f'#EXT-X-MAP:URI="../../floor/{c}/init.mp4"'] - for (name, _), pc in zip(frags, pieces): - lines += [f"#EXTINF:{ms_text(pc['duration'], num, den)},", f"../../floor/{c}/{name}"] - out[f"hls/classic/floor-{c}.m3u8"] = text(lines + ["#EXT-X-ENDLIST"]) + for fname, _, _, _, frags in floors: + lines = media + [f'#EXT-X-MAP:URI="../../floor/{fname}/init.mp4"'] + for (name, _), pc in zip(frags, pieces): + lines += [f"#EXTINF:{ms_text(pc['duration'], num, den)},", f"../../floor/{fname}/{name}"] + out[f"hls/classic/floor-{fname}.m3u8"] = text(lines + ["#EXT-X-ENDLIST"]) mpd_head = ['', '', @@ -2664,27 +2981,36 @@ def render_catalogs(P, ix, c, floor, size, policy_hex): return [" "] + \ [f' ' for k in ks] + [" "] - lines = mpd_head + [ - f' ', - f' ', f' ', - f' '] + timeline(range(len(pieces))) - lines += [f' ' for name, _ in frags] - out["dash/classic.mpd"] = text(lines + [" ", " "] + mpd_tail) + # One Representation per floor rung: with one, its codecs and size are the set's; with + # several, each Representation's. + one = len(floors) == 1 + _, F0, FW0, FH0, _ = floors[0] + own_attrs = f' codecs="{F0}" width="{FW0}" height="{FH0}"' if one else "" + lines = mpd_head + [f' '] + for fname, F, FW, FH, frags in floors: + attrs = "" if one else f' codecs="{F}" width="{FW}" height="{FH}"' + lines += [f' ', + f' ', + f' '] + timeline(range(len(pieces))) + lines += [f' ' for name, _ in frags] + lines += [" ", " "] + out["dash/classic.mpd"] = text(lines + mpd_tail) E = ix["entries"] # §8.3: an HTTP view lists a piece only where its base is of the component's default # base capability (http-delivery §4.2: no variant mixes bases with nothing in common). base_cap = default_base_cap(P, c) - bases = [next(e for e in E[pc["first_entry"]:pc["first_entry"] + pc["n_entries"]] if e["role"] == BASE) for pc in pieces] + # A floor-only piece has no base (§7.8), and an HTTP view lists nothing of it. + bases = [next((e for e in E[pc["first_entry"]:pc["first_entry"] + pc["n_entries"]] if e["role"] == BASE), None) for pc in pieces] for ci, cl in enumerate(P["class"]): name, row = cl["id"], plan[ci] lists = [listed(ix, k, row[k]) for k in range(len(pieces))] - http = [lists[k] if bases[k]["cap"] == base_cap else [] for k in range(len(pieces))] + http = [lists[k] if bases[k] is not None and bases[k]["cap"] == base_cap else [] for k in range(len(pieces))] wai = any(http) lines = head[:] if wai: lines.append('#EXT-X-SESSION-DATA:DATA-ID="science.transaction.wai.multivariant",VALUE="wai.m3u8"') - out[f"hls/{name}/master.m3u8"] = text(lines + [inf, f"../classic/floor-{c}.m3u8"]) + out[f"hls/{name}/master.m3u8"] = text(lines + variants) views = [] for k, pc in enumerate(pieces): v = {"dur": pc["duration"], "p": first_piece + k, "start": pc["start"], "stages": []} @@ -2750,7 +3076,7 @@ def render_catalogs(P, ix, c, floor, size, policy_hex): out[f"dash/{name}.mpd"] = text(lines + mpd_tail) has_floor = any(e["role"] == FLOOR for e in E) out["moq/catalog.json"] = render_moq(c, E, P["live"]["layer_lag_ms"], P["defaults"]["deadline_ms"], - (F, FW, FH) if has_floor else None, P["asset_id"]) + [(f[0], f[1], f[2], f[3]) for f in floors] if has_floor else [], P["asset_id"]) return out @@ -2760,14 +3086,14 @@ def receipt_alias(ns, name): return int.from_bytes(blake3(b"wai:pack-receipt-alias\x01" + ns.encode() + b"\x00" + name.encode())[:8], "little") & MAX_INTEGER -def render_moq(c, E, lag, default_deadline, floor, ns): +def render_moq(c, E, lag, default_deadline, floors, ns): """§8.4: moq/catalog.json, the component's bases and refinements as a stage set of moq-streaming-format §4.1. One track per (layer, deadline), by layer, then deadline ascending, of namespace `ns`; each depends on every track carrying an entry below one of its own down its chain; each with wai_staged, receipts declared with its alias and a - receipts track of its own; then the floor (cmaf, altGroup 1 with the base track), then - the receipts tracks. floor: (codecs, width, height) or None. The catalog must pass - §4.1's check (staged_verify.py's).""" + receipts track of its own; then each floor (cmaf, `/floor`, altGroup 1 with + the base track), then the receipts tracks. floors: (floor name, codecs, width, height) + per floor rung in ladder order. The catalog must pass §4.1's check (staged_verify.py's).""" keys = sorted({(e["layer"], e["deadline"]) for e in E if e["role"] in (BASE, REFINEMENT)}) def name(key): @@ -2800,12 +3126,12 @@ def render_moq(c, E, lag, default_deadline, floor, ns): t["wai_determinism"] = TIER_NAMES[weakest] if layer: t["wai_delivery_timeout_ms"] = max(0, deadline - (lag[layer] if layer < len(lag) else 0)) - elif floor is not None: + elif floors: t["altGroup"] = 1 tracks.append(t) - if floor is not None: - tracks.append({"altGroup": 1, "codec": floor[0], "height": floor[2], "name": f"{c}/floor", "namespace": ns, - "packaging": "cmaf", "renderGroup": 1, "width": floor[1]}) + for fname, codec, fw, fh in floors: + tracks.append({"altGroup": 1, "codec": codec, "height": fh, "name": f"{fname}/floor", "namespace": ns, + "packaging": "cmaf", "renderGroup": 1, "width": fw}) tracks += [{"namespace": ns, "name": f"{name(k)}/receipts", "packaging": "wai-receipts", "isLive": False} for k in keys] if len({receipt_alias(ns, name(k)) for k in keys}) != len(keys): raise ValueError("two tracks' receipt aliases are equal") @@ -2891,9 +3217,21 @@ class Held: return itertools.repeat(self.frame, self.n) +class Decoded: + """A prefix a worker decoded (--jobs): its clip digest (§6.5) and its frame count, + not its frames.""" + def __init__(self, digest, n): + self.digest, self.n = digest, n + + def __len__(self): + return self.n + + def prefix_digest_of(frames): """SPEC §7's clip digest, each frame's SHA-256 fed in turn: a still's frame, held, is hashed once and its digest fed for every frame, a block of them at a time (§5.7).""" + if isinstance(frames, Decoded): + return frames.digest h = hashlib.sha256() if isinstance(frames, Held): d = hashlib.sha256(frames.frame).digest() @@ -2913,10 +3251,48 @@ def clip_digest(frames): return hashlib.sha256(b"".join(hashlib.sha256(f).digest() for f in frames)).digest() +def work_hash(path): + """A worker's object (--jobs): its content hash (jwp-receipts §2.1).""" + return content_hash(load(path)) + + +def work_chain(task): + """A worker's piece (--jobs): its base decoded, or a still held, and each layer applied + in entry order, every prefix's clip digest, as the serial run computes them; at the + first that fails, which (the base, or the j-th layer) and why, in the serial run's words. + task: (capability, frames, [(path, manifest length)], base first).""" + cap, n, objs = task + payloads = [load(p)[12 + ml:] for p, ml in objs] + try: + if cap == "wai.image.png": + pw, ph, rgb = png_frame(payloads[0]) + frames = Held(rgb, n) + else: + wv = IPV.parse_wiv1(payloads[0], 0) + frames, pw, ph = IPV.decode_wiv1_k0(wv), wv["w"], wv["h"] + except (IPV.Refused, ValueError, TypeError, IndexError, struct.error, zlib.error) as x: + return ("base", str(x)) + digests = [prefix_digest_of(frames)] + for p in payloads[1:]: + try: + frames = wir1_apply(p, frames) + except (SV.Refused, KeyError, IndexError, struct.error) as x: + return ("layer", len(digests), str(x), pw, ph, digests) + digests.append(prefix_digest_of(frames)) + return ("ok", pw, ph, digests) + + def verify_pack(rep, d, name, pkg=None, inputs=True): """packs//: package/ (or `pkg`) verified in §11.3's order, without the source; then, with `inputs`, the package's inputs: policy.toml as given, and what only the source decides (the plan, each base's sse and step) and the supplied floor.""" + try: + verify_pack_once(rep, d, name, pkg, inputs) + finally: + HV.forget_content_hashes() + + +def verify_pack_once(rep, d, name, pkg, inputs): root = os.path.join(d, "packs", name) pkg = pkg or os.path.join(root, "package") tag = f"packs/{name}" @@ -2977,6 +3353,11 @@ def verify_pack(rep, d, name, pkg=None, inputs=True): cls = [c["id"].lower() for c in P["class"]] ok = all(segment_ok(i) for i in ids) and len(set(cls)) == len(cls) and "classic" not in cls rep.check(ok, f"{tag}: component and class ids are path segments, class ids distinct in any case, none `classic` (pack-id)") + if not ok: + return + names = [n for c in P["component"] for _, n in floor_names(P, c["id"])] + ok = all(segment_ok(n) for n in names) and len({n.lower() for n in names}) == len(names) + rep.check(ok, f"{tag}: floor names (§7.1) are path segments, distinct in any case (pack-id)") if not ok: return # §3.6 under the effective policy: royalty_free_only as policy.json states it. @@ -3004,10 +3385,21 @@ def verify_pack(rep, d, name, pkg=None, inputs=True): except Refused as e: rep.check(False, f"{tag}: the receipt against its indexes ({e.code})") return - seed = bytes.fromhex(load(os.path.join(root, "key.hex")).decode().strip()) - pk, sig = ed25519_from_seed(seed, r["payload"]) - rep.check(pk.hex() == j["signer_pubkey"], f"{tag}: the receipt's signer is the package key") - rep.check(sig.hex() == j["sig"], f"{tag}: the signature is the package key's over the payload (§11.2)") + # A golden's own key re-signs its payload (§11.2); a package verified without its key + # (--package) has its signature checked by verify_receipt_v2 alone (§9.1). + if os.path.exists(os.path.join(root, "key.hex")): + seed = bytes.fromhex(load(os.path.join(root, "key.hex")).decode().strip()) + pk, sig = ed25519_from_seed(seed, r["payload"]) + rep.check(pk.hex() == j["signer_pubkey"], f"{tag}: the receipt's signer is the package key") + rep.check(sig.hex() == j["sig"], f"{tag}: the signature is the package key's over the payload (§11.2)") + # A re-pack golden names the golden it takes its bases from (§11.5); every other golden + # has no parent. + if inputs: + parent = os.path.join(root, "parent") + if os.path.exists(parent): + verify_repack(rep, d, tag, j, ixs, load(parent).decode().strip()) + else: + rep.check(j["parent_kind"] == "none", f"{tag}: the golden names no parent (§9.2)") named = {"LISTING", "policy.toml", "policy.json", "package.receipt.json"} | {c["index"] for c in j["components"]} for c, ix in zip(j["components"], ixs): @@ -3020,9 +3412,12 @@ def verify_pack(rep, d, name, pkg=None, inputs=True): # §9.4: a metered package publishes its measurement claim; an unmetered one, none. claim = f"claims/{j['receipt_hash']}.measurement.json" - if j["joules_micro"]: + if j["energy_provenance"] is not None: rep.check(claim in files, f"{tag}: a metered package's measurement claim (measurement-claim-missing)") - rep.check(False, f"{tag}: this verifier does not check a measurement claim (measurement-claim-invalid)") + if claim in files: + why = measurement_claim_fault(load(os.path.join(pkg, claim)), j) + rep.check(why is None, f"{tag}: the measurement claim verifies and is about the receipt's figure: {why} " + f"(measurement-claim-invalid)") named.add(claim) else: rep.check(not any(p.startswith("claims/") for p in others), @@ -3036,6 +3431,76 @@ def verify_pack(rep, d, name, pkg=None, inputs=True): rep.check(not other, f"{tag}: other files: {other} (unexpected-file)") +def measurement_claim_fault(b, j): + """§9.4: a metered package's claim, `claims/.measurement.json`, read by the + claim corpus's own verifier (../claim-conformance/claim_verify.py: jwp-receipts §3.1 + steps 1-4, its signature among them, and step 5, a first claim naming no parent), then + checked against the receipt as jwp-receipts §2.4.8 and energy-measurement §6.1 check a + measurement claim against the figure it names (step 6): a `measurement` claim about the + receipt (subject type receipt, subject the receipt's hash), of figure profile + `wai:video-package-receipt-id`, which has no figure index and no group, whose figure + is the receipt's (joules, class and evidence) and whose signer is the receipt's. + None when it holds; else what fails.""" + import claim_verify as CV + try: + c = CV.verify_claim(b.decode("utf-8")) + CV.check_chain(c, None) + except (CV.Reject, UnicodeError) as x: + return f"the claim does not verify ({x})" + f = c["body"] + if c["class"] != "measurement" or c["subject_type"] != "receipt" or c["subject"] != j["receipt_hash"]: + return "not a measurement claim about this receipt" + if f["figure_profile"] != "wai:video-package-receipt-id" or f["figure_index"] is not None or f["group"] is not None: + return "not of the package receipt's figure profile, or with an index or a group" + if f["joules_micro"] != j["joules_micro"]: + return f"a figure of {f['joules_micro']} uJ, the receipt's {j['joules_micro']}" + if f["energy_provenance"] != j["energy_provenance"] or any(f.get(k) != j.get(k) for k in EVIDENCE_MEMBERS): + return "another acquisition class or evidence than the receipt's" + if c["signer_pubkey"] != j["signer_pubkey"]: + return "signed by another key than the receipt's" + # A package's fabric record (jwp-receipts §2.4.8) names the steps of §11.6. + bad = [s["step"] for s in f.get("fabrics", {"steps": []})["steps"] if s["step"] not in PACK_STEPS] + if bad: + return f"a fabric record naming {bad[0]}, which is not a step of §11.6" + return None + + +# §11.6: the steps of a pack or a verify, as a measurement claim's fabric record names them. +PACK_STEPS = ("source-decode", "source-read", "segment", "base-search", "base-code", "refine-code", "sse", + "object-hash", "digest", "floor-read", "floor-decode", "index", "io") + + +def repack_fields(ix, k): + """§11.5: piece k's base and refinement entries, every field but the entry's place in its + index: the entry it refines counted from its piece's first, its flags but the duplicate + flag.""" + pc = ix["pieces"][k] + out = [] + for e in ix["entries"][pc["first_entry"]:pc["first_entry"] + pc["n_entries"]]: + if e["role"] not in (BASE, REFINEMENT): + continue + out.append((e["hash"], e["byte_len"], e["cap"], e["role"], e["layer"], e["tier"], e["flags"] & ~ENTRY_DUP, + e["deadline"], e["prefix"], e["sse"], e["man_len"], e["payload_len"], + None if e["refines"] == NO_REFINES else e["refines"] - pc["first_entry"])) + return out + + +def verify_repack(rep, d, tag, j, ixs, parent): + """§11.5: a re-pack against its parent, the golden packs//: its receipt names the + parent's receipt as the package it re-packs, and each component's pieces are the + parent's, piece by piece, their base and refinement entries the parent's.""" + pdir = os.path.join(d, "packs", parent, "package") + pr = read_receipt(load(os.path.join(pdir, "package.receipt.json")))["json"] + rep.check(j["parent_kind"] == "re-pack" and j["parent_receipt_hash"] == pr["receipt_hash"], + f"{tag}: the receipt names packs/{parent}'s receipt as the package it re-packs (§11.5) (repack-parent-mismatch)") + for c, ix in zip(j["components"], ixs): + pix = parse_index(load(os.path.join(pdir, c["index"]))) + same = len(ix["pieces"]) == len(pix["pieces"]) and all( + (a["start"], a["duration"], a["kind"], a["flags"]) == (b["start"], b["duration"], b["kind"], b["flags"]) + and repack_fields(ix, k) == repack_fields(pix, k) for k, (a, b) in enumerate(zip(ix["pieces"], pix["pieces"]))) + rep.check(same, f"{tag} {c['id']}: every piece's base and refinements are packs/{parent}'s (§11.5) (repack-parent-mismatch)") + + class Capture(Report): """A report that keeps what fails, in order, and prints nothing.""" def __init__(self): @@ -3135,15 +3600,20 @@ def index_against_policy(P, comp, c, ix): long = next((k for k, pc in enumerate(ix["pieces"]) if pc["duration"] > mx), None) if long is not None: return f"piece {long}: past the policy's max_ms" + floor_only = comp.get("profile") == "floor-only" for k, pc in enumerate(ix["pieces"]): - if pc["kind"] >= len(KINDS): - return f"piece {k}: a kind a video piece does not have" + # A floor-only component's pieces are of kind none, which no other piece is (§7.8). + if (pc["kind"] == PIECE_KINDS.index("none")) != floor_only or (not floor_only and pc["kind"] >= len(KINDS)): + return f"piece {k}: a kind a piece of this component does not have" rb, mb, then = piece_then(P, ix, k) if (rb, mb) != (pc["rules"], pc["moments"]): return f"piece {k}: the rules and moments" - base, chain, floors = piece_ladder(P, c["id"], then) - want = [(BASE, base["capability"], 0)] + [(REFINEMENT, r["capability"], j + 1) for j, r in enumerate(chain)] \ - + [(FLOOR, r["capability"], 0) for r in floors] + if floor_only: + want = [(FLOOR, r["capability"], 0) for r, _ in floor_names(P, c["id"])] + else: + base, chain, floors = piece_ladder(P, c["id"], then) + want = [(BASE, base["capability"], 0)] + [(REFINEMENT, r["capability"], j + 1) for j, r in enumerate(chain)] \ + + [(FLOOR, r["capability"], 0) for r in floors] mine = E[pc["first_entry"]:pc["first_entry"] + pc["n_entries"]] if [(e["role"], e["cap"], e["layer"]) for e in mine] != want: return f"piece {k}: its entries are not the rungs of its ladder" @@ -3185,6 +3655,9 @@ def verify_component(rep, tag, root, pkg, files, P, j, c, ix, inputs=True): # Every entry's object (§6.3), the decode-equivalent prefixes (§6.5). objs, mans, decoded = {}, {}, {} + # --jobs: every object's content hash computed ahead, once per file, in the workers. + present = sorted({f"objects/{e['hash'].hex()}.wai" for e in E} & set(files)) + hashes = dict(zip(present, pool().map(work_hash, [os.path.join(pkg, p) for p in present], 1))) if pool() else {} for i, e in enumerate(E): path = f"objects/{e['hash'].hex()}.wai" named.add(path) @@ -3193,7 +3666,9 @@ def verify_component(rep, tag, root, pkg, files, P, j, c, ix, inputs=True): continue objs[i] = load(os.path.join(pkg, path)) try: - mans[i] = object_rules(ix, i, objs[i]) + mans[i] = object_rules(ix, i, objs[i], hashes.get(path)) + # The object's hash is its entry's: http_verify resolves it without hashing it. + HV.seed_content_hash(objs[i], e["hash"]) rep.check(True, f"{t}: entry {i}: the object rules (§6.3)") except Refused as x: rep.check(False, f"{t}: entry {i}: the object rules (§6.3) ({x.code})") @@ -3204,21 +3679,44 @@ def verify_component(rep, tag, root, pkg, files, P, j, c, ix, inputs=True): if any(r["component"] == c["id"] and r["role"] == "floor" for r in P["ladder"]): own = owners(ix) for k, pc in enumerate(pieces): - fl = [i for i in range(len(E)) if own[i] == k and E[i]["role"] == FLOOR] - fp = floor_payload(objs[fl[0]][12 + E[fl[0]]["man_len"]:]) if len(fl) == 1 else None - if fp is not None and len(fp[5]) != pc["duration"]: - rep.check(False, f"{t}: piece {k}: {len(fp[5])} floor units for {pc['duration']} frames, before any frame " - f"is decoded (floor-object-mismatch)") - return named | unreached(files, c['id']) + for i in [i for i in range(len(E)) if own[i] == k and E[i]["role"] == FLOOR]: + fp = floor_payload(objs[i][12 + E[i]["man_len"]:]) + if fp is not None and len(fp[5]) != pc["duration"]: + rep.check(False, f"{t}: piece {k}: {len(fp[5])} floor units for {pc['duration']} frames, before any " + f"frame is decoded (floor-object-mismatch)") + return named | unreached(files, c['id']) size = None own = owners(ix) stage = {} # entry index → the frames of the prefix it completes, decoded + # --jobs, without the sources (which re-derive from the frames themselves): each piece's + # base decoded and its layers applied in the workers, ahead, piece by piece; the checks + # below read their digests in the serial run's order. + chains = {} + if pool() and not inputs: + tasks = {} + for k, pc in enumerate(pieces): + mine = range(pc["first_entry"], pc["first_entry"] + pc["n_entries"]) + b = [i for i in mine if E[i]["role"] == BASE] + if b: + chain = [b[0]] + [i for i in mine if E[i]["role"] == REFINEMENT] + tasks[k] = (E[b[0]]["cap"], pc["duration"], [(os.path.join(pkg, f"objects/{E[i]['hash'].hex()}.wai"), E[i]["man_len"]) for i in chain]) + chains = dict(zip(tasks, pool().map(work_chain, list(tasks.values()), 1))) + layer_of = {} for i, e in enumerate(E): ml = e["man_len"] payload = objs[i][12 + ml:] k = own[i] n = pieces[k]["duration"] - if e["role"] == BASE: + if e["role"] == BASE and k in chains: + res = chains[k] + if res[0] == "base": + rep.check(False, f"{t}: entry {i}: the base does not decode ({res[1]}) (prefix-digest)") + return named | unreached(files, c['id']) + pw, ph, digests = (res[1], res[2], res[3]) if res[0] == "ok" else (res[3], res[4], res[5]) + frames = Decoded(digests[0], n) + stage[i] = frames + layer_of[k] = 0 + elif e["role"] == BASE: try: if e["cap"] == "wai.image.png": # §5.7: a still, its one frame held for the piece: the frame and its @@ -3233,6 +3731,7 @@ def verify_component(rep, tag, root, pkg, files, P, j, c, ix, inputs=True): return named | unreached(files, c['id']) decoded.setdefault(e["hash"], (wv, frames)) stage[i] = frames + if e["role"] == BASE: size = size or (pw, ph) # §5.2: the reference packager's base manifest, as SPEC §3 orders it. want = {"wai": "1.0", "media": comp["media"], "intent": "replicate", @@ -3249,6 +3748,14 @@ def verify_component(rep, tag, root, pkg, files, P, j, c, ix, inputs=True): "target": None} rep.check(objs[i][8:8 + ml] == json.dumps(want, separators=(",", ":")).encode(), f"{t}: entry {i}: the refinement's manifest is §5.4's (object-manifest)") + if k in chains: + res = chains[k] + layer_of[k] += 1 + if res[0] == "layer" and res[1] == layer_of[k]: + rep.check(False, f"{t}: entry {i}: the layer does not apply to the stage below it ({res[2]}) (prefix-digest)") + return named | unreached(files, c['id']) + stage[i] = Decoded((res[3] if res[0] == "ok" else res[5])[layer_of[k]], n) + continue try: stage[i] = wir1_apply(payload, stage[e["refines"]]) except (SV.Refused, KeyError, IndexError, struct.error) as x: @@ -3259,75 +3766,100 @@ def verify_component(rep, tag, root, pkg, files, P, j, c, ix, inputs=True): rep.check(prefix_digest_of(stage[i]) == e["prefix"], f"{t}: entry {i}: the prefix decodes to its prefix_digest (prefix-digest)") - # The floor objects (§7.2) and the CMAF files their temporal units give (§7.6). - rung = next((r for r in P["ladder"] if r["component"] == c["id"] and r["role"] == "floor"), None) + # The floor objects (§7.2) and the CMAF files their temporal units give (§7.6), floor + # rung by floor rung in ladder order: the k-th floor entry of each piece is rung k's. sup = P["floor"].get("supplied_listing") settings = blake3(b"wai:render-settings\x01" + jcs({"source": "supplied", "supplied_listing": sup}).encode()).hex() \ if sup else None - seq = seq_obu = None - units_of, frags = [], [] + rungs = floor_names(P, c["id"]) own = owners(ix) - for k, pc in enumerate(pieces): - mine = [i for i in range(len(E)) if own[i] == k] - bases = [i for i in mine if E[i]["role"] == BASE] - fl = [i for i in mine if E[i]["role"] == FLOOR] - rep.check(len(bases) == 1 and rung is not None and len(fl) == 1 and E[fl[0]]["cap"] == rung["capability"], - f"{t}: piece {k}: one base, and one floor object of the floor rung's capability (§5, §7.2) (floor-object-mismatch)") - if len(bases) != 1 or len(fl) != 1: - return named | unreached(files, c['id']) - base, i = bases[0], fl[0] - df = mans[i]["derived_from"] - rep.check(df["motif"] == E[base]["hash"].hex() and df["motif_capability"] == E[base]["cap"], - f"{t}: piece {k}: the floor presents its piece's base (floor-motif-mismatch)") - rep.check(sup is not None and df["renderer"] == f"supplied@{sup}" and df["settings"] == settings, - f"{t}: piece {k}: a supplied floor's renderer and settings (§7.2) (floor-object-mismatch)") - fp = floor_payload(objs[i][12 + E[i]["man_len"]:]) - if fp is None: - rep.check(False, f"{t}: piece {k}: the floor payload is not §7.2's framing (floor-object-mismatch)") - return named | unreached(files, c['id']) - rep.check(len(fp[5]) == pc["duration"], f"{t}: piece {k}: one temporal unit per frame (floor-object-mismatch)") - try: - units = [obus(u) for u in fp[5]] - if any(not o or o[0][0] != OBU_TD or sum(x[0] == OBU_TD for x in o) != 1 or unit_frame(o) is None for o in units): - raise Malformed("a unit that is not one temporal unit holding a frame") - if seq is None: - seq_obu = next((whole for typ, whole, _ in units[0] if typ == OBU_SEQ), None) if units else None - if seq_obu is None: - raise Malformed("the first unit holds no sequence header") - seq = sequence_header(obus(seq_obu)[0][2]) - # §7.3 against the package: every sequence header the first's bytes, a shown key - # frame with one. - for o in units: - if any(typ == OBU_SEQ and whole != seq_obu for typ, whole, _ in o): - raise Malformed("a sequence header other than the first") - if shown_key(o, seq) and not any(typ == OBU_SEQ for typ, _, _ in o): - raise Malformed("a shown key frame without a sequence header") - except Malformed as x: - rep.check(False, f"{t}: piece {k}: the floor payload ({x}) (floor-av1-malformed)") - return named | unreached(files, c['id']) - rep.check(fp[:5] == (pc["duration"], seq["max_h"], seq["max_w"], num, den), - f"{t}: piece {k}: the floor payload's n, h, w, fps_num and fps_den (§7.2) (floor-object-mismatch)") - rep.check(mans[i].get("target") == {"frames": pc["duration"], "h": seq["max_h"], "w": seq["max_w"]}, - f"{t}: piece {k}: the floor's target is its piece's frames and its size (§5.2, §7.2) (floor-object-mismatch)") - keys = [shown_key(o, seq) for o in units] - ok = bool(keys) and keys[0] and (P["floor"]["extra_keyframes"] or not any(keys[1:])) - rep.check(ok, f"{t}: piece {k}: it opens on a shown key frame, with no other unless the policy allows (floor-keyframe-mismatch)") - if not ok: - return named | unreached(files, c['id']) - units_of.append(fp[5]) - frag = fragment(ix["first_piece"] + k, pc["start"], den, [(without_delimiters(o), shown_key(o, seq)) for o in units]) - frags.append((hashlib.sha256(frag).hexdigest() + ".m4s", frag)) - init = init_mp4(num, seq["max_w"], seq["max_h"], av1c(seq, seq_obu)) - for p, want in [("init.mp4", init)] + frags: - path = f"floor/{c['id']}/{p}" - named.add(path) - rep.check(path in files and load(os.path.join(pkg, path)) == want, - f"{t}: {path} is the one the floor's temporal units give (floor-cmaf-mismatch)") + floors, units_of = [], {} + for fk, (rung, fname) in enumerate(rungs if rungs else [(None, c["id"])]): + seq = seq_obu = None + units_of[fname], frags = [], [] + for k, pc in enumerate(pieces): + mine = [i for i in range(len(E)) if own[i] == k] + bases = [i for i in mine if E[i]["role"] == BASE] + fl = [i for i in mine if E[i]["role"] == FLOOR] + floor_only = comp.get("profile") == "floor-only" + ok = len(bases) == (0 if floor_only else 1) and rung is not None and len(fl) == len(rungs) \ + and E[fl[fk]]["cap"] == rung["capability"] + rep.check(ok, f"{t}: piece {k}: one base (none, floor-only), and one floor object of each floor rung's " + f"capability (§5, §7.2, §7.8) (floor-object-mismatch)") + if not ok: + return named | unreached(files, c['id']) + i = fl[fk] + if floor_only: + # §7.8: a floor that presents no base names no motif. + rep.check(mans[i].get("derived_from") is None, + f"{t}: piece {k}: a floor-only floor carries no derived_from (§7.8) (floor-object-mismatch)") + else: + base = bases[0] + df = mans[i]["derived_from"] + rep.check(df["motif"] == E[base]["hash"].hex() and df["motif_capability"] == E[base]["cap"], + f"{t}: piece {k}: the floor presents its piece's base (floor-motif-mismatch)") + rep.check(sup is not None and df["renderer"] == f"supplied@{sup}" and df["settings"] == settings, + f"{t}: piece {k}: a supplied floor's renderer and settings (§7.2) (floor-object-mismatch)") + fp = floor_payload(objs[i][12 + E[i]["man_len"]:]) + if fp is None: + rep.check(False, f"{t}: piece {k}: the floor payload is not §7.2's framing (floor-object-mismatch)") + return named | unreached(files, c['id']) + rep.check(len(fp[5]) == pc["duration"], f"{t}: piece {k}: one temporal unit per frame (floor-object-mismatch)") + try: + units = [obus(u) for u in fp[5]] + if any(not o or o[0][0] != OBU_TD or sum(x[0] == OBU_TD for x in o) != 1 or unit_frame(o) is None for o in units): + raise Malformed("a unit that is not one temporal unit holding a frame") + if seq is None: + seq_obu = next((whole for typ, whole, _ in units[0] if typ == OBU_SEQ), None) if units else None + if seq_obu is None: + raise Malformed("the first unit holds no sequence header") + seq = sequence_header(obus(seq_obu)[0][2]) + except Malformed as x: + rep.check(False, f"{t}: piece {k}: the floor payload ({x}) (floor-av1-malformed)") + return named | unreached(files, c['id']) + # The object's own members against the floor's sequence header (§7.2), before + # its units are held to it (§11.3's order). + rep.check(fp[:5] == (pc["duration"], seq["max_h"], seq["max_w"], num, den), + f"{t}: piece {k}: the floor payload's n, h, w, fps_num and fps_den (§7.2) (floor-object-mismatch)") + rep.check(mans[i].get("target") == {"frames": pc["duration"], "h": seq["max_h"], "w": seq["max_w"]}, + f"{t}: piece {k}: the floor's target is its piece's frames and its size (§5.2, §7.2) (floor-object-mismatch)") + try: + # §7.3 against the package: every sequence header the first's bytes, a shown + # key frame with one. + for o in units: + if any(typ == OBU_SEQ and whole != seq_obu for typ, whole, _ in o): + raise Malformed("a sequence header other than the first") + if shown_key(o, seq) and not any(typ == OBU_SEQ for typ, _, _ in o): + raise Malformed("a shown key frame without a sequence header") + except Malformed as x: + rep.check(False, f"{t}: piece {k}: the floor payload ({x}) (floor-av1-malformed)") + return named | unreached(files, c['id']) + keys = [shown_key(o, seq) for o in units] + ok = bool(keys) and keys[0] and (P["floor"]["extra_keyframes"] or not any(keys[1:])) + rep.check(ok, f"{t}: piece {k}: it opens on a shown key frame, with no other unless the policy allows (floor-keyframe-mismatch)") + if not ok: + return named | unreached(files, c['id']) + units_of[fname].append(fp[5]) + if not P["floor"].get("supplied_form"): + frag = fragment(ix["first_piece"] + k, pc["start"], den, [(without_delimiters(o), shown_key(o, seq)) for o in units]) + frags.append((hashlib.sha256(frag).hexdigest() + ".m4s", frag)) + if P["floor"].get("supplied_form") == "cmaf": + # §7.7: the ladder's own files, read, not rebuilt. + frags = cmaf_package_files(rep, t, pkg, files, P, fname, pieces, units_of[fname], num, den, named) + if frags is None: + return named | unreached(files, c['id']) + else: + init = init_mp4(num, seq["max_w"], seq["max_h"], av1c(seq, seq_obu)) + for p, want in [("init.mp4", init)] + frags: + path = f"floor/{fname}/{p}" + named.add(path) + rep.check(path in files and load(os.path.join(pkg, path)) == want, + f"{t}: {path} is the one the floor's temporal units give (floor-cmaf-mismatch)") + floors.append((fname, av1_codecs(seq), seq["max_w"], seq["max_h"], frags)) # The catalogs (§8.3–§8.8). try: - cats = render_catalogs(P, ix, c["id"], (av1_codecs(seq), seq["max_w"], seq["max_h"], frags), size, - j["policy_digest"]) + cats = render_catalogs(P, ix, c["id"], floors, size, j["policy_digest"]) except (ValueError, OverflowError) as x: # A time or count past the canonical range (a start past 2^53 − 1): no catalog can # be written for this index (§11.3). @@ -3337,19 +3869,93 @@ def verify_component(rep, tag, root, pkg, files, P, j, c, ix, inputs=True): named.add(path) rep.check(path in files and load(os.path.join(pkg, path)) == cats[path], f"{t}: {path} is the one the index, the objects and the floor give (catalog-mismatch)") - http_views(rep, t, c["id"], cats, {f"{e['hash'].hex()}.wai": objs[i] for i, e in enumerate(E)}) + http_views(rep, t, c["id"], floors[0][0], cats, {f"{e['hash'].hex()}.wai": objs[i] for i, e in enumerate(E)}) if inputs: verify_sources(rep, t, root, P, comp, ix, stage, units_of, objs) return named -def http_views(rep, t, c, cats, objmap): +def read_listing(b): + """SPEC §3.1: a listing's lines as (path, SHA-256 hex), or None when it is not one.""" + if not b or not b.endswith(b"\n"): + return None + out = [] + for line in b[:-1].split(b"\n"): + if len(line) < 67 or line[64:66] != b" " or not re.fullmatch(rb"[0-9a-f]{64}", line[:64]): + return None + try: + out.append((line[66:].decode("ascii"), line[:64].decode())) + except UnicodeError: + return None + paths = [p for p, _ in out] + if not all(all(segment_ok(x) for x in p.split("/")) for p in paths) or paths != sorted(paths, key=lambda p: p.encode()) \ + or len(set(paths)) != len(paths) or len({p.lower() for p in paths}) != len(paths) \ + or any(q.startswith(p + "/") for p in paths for q in paths): + return None + return out + + +def cmaf_package_files(rep, t, pkg, files, P, fname, pieces, units_of, num, den, named): + """§7.7, §11.3: a floor rung's CMAF files in the CMAF form, bound to the receipt by the + supplied floor's listing: floor.listing hashes to floor.supplied_listing and is a + listing; floor//init.mp4 is its line for /init.mp4 and an initialization segment + §7.7 reads; the listing's media segments of /, in its order, one per piece, piece k's + floor//.m4s, §7.7's boxes, opening on a sync sample, a frame a sample from + the piece's start, its samples the piece's floor units without their temporal + delimiters (floor-cmaf-mismatch). Returns each piece's (fragment name, bytes), or None + at the first that fails.""" + named.add("floor.listing") + lb = load(os.path.join(pkg, "floor.listing")) if "floor.listing" in files else b"" + lines = read_listing(lb) + ok = lines is not None and hashlib.sha256(lb).hexdigest() == P["floor"].get("supplied_listing") + rep.check(ok, f"{t}: floor.listing is a listing hashing to floor.supplied_listing (§7.7) (floor-cmaf-mismatch)") + if not ok: + return None + shas = dict(lines) + init_name = f"{fname}/init.mp4" + segs = [p for p, _ in lines if p.startswith(f"{fname}/") and p != init_name] + init_path = f"floor/{fname}/init.mp4" + named.add(init_path) + try: + ib = load(os.path.join(pkg, init_path)) if init_path in files else None + init = cmaf_init(ib) if ib is not None and shas.get(init_name) == hashlib.sha256(ib).hexdigest() else None + except CmafFault: + init = None + rep.check(init is not None, f"{t}: {init_path} is the supplied {init_name}, an initialization segment §7.7 reads (floor-cmaf-mismatch)") + if init is None: + return None + ok = len(segs) == len(pieces) and all(p.endswith(".m4s") and "/" not in p[len(fname) + 1:] for p in segs) + rep.check(ok, f"{t}: {fname}/ holds one media segment per piece in floor.listing (floor-cmaf-mismatch)") + if not ok: + return None + frags = [] + for k, (pc, seg) in enumerate(zip(pieces, segs)): + path = f"floor/{fname}/{shas[seg]}.m4s" + named.add(path) + b = load(os.path.join(pkg, path)) if path in files else None + try: + sm = cmaf_segment(b, init) if b is not None and hashlib.sha256(b).hexdigest() == shas[seg] else None + if sm is not None: + cmaf_times(sm, init[1], num, den, pc["start"]) + except CmafFault: + sm = None + ok = sm is not None and not sm[0][3] & 0x00010000 and cmaf_units(b, sm) == units_of[k] + rep.check(ok, f"{t}: {path}: the supplied {seg}, opening on a sync sample, a frame a sample from piece {k}'s start, " + f"its samples the piece's floor units (§7.7) (floor-cmaf-mismatch)") + if not ok: + return None + frags.append((path.rsplit("/", 1)[1], b)) + return frags + + +def http_views(rep, t, c, first_floor, cats, objmap): """§8.3 read by http-delivery's own verifier (http_verify.py): each class's WAI media - playlist adjacent to the classical one, the union and floor of the objects it lists + playlist adjacent to the classical one (the first floor's; every floor's has the + pieces' durations), the union and floor of the objects it lists (an object listed twice is one, a layer joins every occurrence of its base, http-delivery §4.2) equal to its master's CODECS and X-WAI-FLOOR, and its MPD adjacent to the classical MPD.""" - floor_text = cats[f"hls/classic/floor-{c}.m3u8"].decode() + floor_text = cats[f"hls/classic/floor-{first_floor}.m3u8"].decode() for path in sorted(cats): m = re.fullmatch(r"hls/([^/]+)/wai-" + re.escape(c) + r"\.m3u8", path) if not m: @@ -3387,6 +3993,14 @@ def verify_sources(rep, t, root, P, comp, ix, stage, units_of, objs): refinement's bytes and reconstruction (§5.4), and every entry's sse (§6.6); and the supplied floor (§7.3). `stage` is each entry's prefix as the package decodes.""" num, den = comp["timebase"]["num"], comp["timebase"]["den"] + if comp.get("profile") == "floor-only": + # §7.8: no source; the pieces are the first floor rung's, every piece at most + # max_ms, and the supplied floor as §7.3 and §7.7 check it. + mx = units_from_ms(P["segmentation"]["max_ms"], num, den) + rep.check(all(pc["duration"] <= mx for pc in ix["pieces"]) and all(pc["flags"] == 0 for pc in ix["pieces"]), + f"{t}: every floor-only piece at most max_ms, with no flag (§7.8) (floor-piece-length)") + verify_supplied_floor(rep, t, root, P, comp, ix, range(sum(pc["duration"] for pc in ix["pieces"])), num, den, units_of) + return source = comp.get("source", "") name = source[:-len(".y4m")] if not source.endswith(".y4m") or fixture_spans(name) is None: @@ -3453,39 +4067,114 @@ def verify_sources(rep, t, root, P, comp, ix, stage, units_of, objs): f"{t}: entry {i}: sse against the source (§6.6)") below = nxt - # The supplied floor (§7.3): its listing, its temporal units and its key frames. + verify_supplied_floor(rep, t, root, P, comp, ix, frames, num, den, units_of) + + +def verify_supplied_floor(rep, t, root, P, comp, ix, frames, num, den, units_of): + """The supplied floor (§7.3, §7.7): its listing, then each floor rung's stream or CMAF + files, its temporal units and its key frames, against the index's pieces; a floor-only + component's first floor rung decides them (§7.8): its shown key frames, in the OBU + form, are exactly the pieces' starts. `frames` has one element per source frame.""" + # The supplied floor (§7.3): its listing, then each floor rung's stream, its temporal + # units and its key frames. sup = os.path.join(root, "floor") names = tree(sup) rep.check(hashlib.sha256(listing(sup, names)).hexdigest() == P["floor"].get("supplied_listing"), f"{t}: the supplied floor's listing hashes to floor.supplied_listing (floor-listing-mismatch)") - stream = f"{comp['id']}.obu" - if stream not in names: - rep.check(False, f"{t}: no {stream} in the supplied floor (floor-stream-missing)") + for _, fname in floor_names(P, comp["id"]): + if P["floor"].get("supplied_form") == "cmaf": + verify_supplied_cmaf(rep, t, sup, names, fname, ix, frames, num, den, P, units_of) + continue + stream = f"{fname}.obu" + if stream not in names: + rep.check(False, f"{t}: no {stream} in the supplied floor (floor-stream-missing)") + return + try: + units = temporal_units(load(os.path.join(sup, stream))) + if not units or not any(typ == OBU_SEQ for typ, _, _ in units[0][1]): + raise Malformed("the first unit holds no sequence header") + first = next(whole for typ, whole, _ in units[0][1] if typ == OBU_SEQ) + seq = sequence_header(obus(first)[0][2]) + for u, o in units: + if unit_frame(o) is None: + raise Malformed("a unit holding no frame") + if any(typ == OBU_SEQ and whole != first for typ, whole, _ in o): + raise Malformed("a sequence header other than the first") + if shown_key(o, seq) and not any(typ == OBU_SEQ for typ, _, _ in o): + raise Malformed("a shown key frame without a sequence header") + rep.check(True, f"{t}: {stream} splits into temporal units, each a frame (floor-av1-malformed)") + except Malformed as x: + rep.check(False, f"{t}: {stream} ({x}) (floor-av1-malformed)") + return + rep.check(len(units) == len(frames), f"{t}: {stream}: one temporal unit per source frame (floor-frame-count)") + keys = [f for f, (_, o) in enumerate(units) if shown_key(o, seq)] + starts = [pc["start"] for pc in ix["pieces"]] + plans = comp.get("profile") == "floor-only" and fname == floor_names(P, comp["id"])[0][1] + ok = set(starts) <= set(keys) and (P["floor"]["extra_keyframes"] and not plans or keys == starts) + rep.check(ok, f"{t}: {stream}: shown key frames at the piece starts {starts}, and only there: {keys} (floor-keyframe-mismatch)") + rep.check([[u for u, _ in units[pc["start"]:pc["start"] + pc["duration"]]] for pc in ix["pieces"]] == units_of[fname], + f"{t}: each floor object of {fname} holds its piece's temporal units of {stream} (§7.2)") + + +def verify_supplied_cmaf(rep, t, sup, names, fname, ix, frames, num, den, P, units_of): + """§7.7, the supplied floor in the CMAF form: /init.mp4 (floor-stream-missing), the + other files of / media segments in byte order (floor-cmaf-malformed); each segment's + boxes, a sync sample first (floor-cmaf-malformed), every sample one frame and each + segment starting where the one before ended (floor-cmaf-timing); the samples as + temporal units (floor-av1-malformed), one per source frame (floor-frame-count); one + segment per piece, holding its frames (floor-cmaf-pieces); the key frames + (floor-keyframe-mismatch); and each floor object holding its piece's segment's units.""" + init_name = f"{fname}/init.mp4" + if init_name not in names: + rep.check(False, f"{t}: no {init_name} in the supplied floor (floor-stream-missing)") + return + segs = [n for n in names if n.startswith(f"{fname}/") and n != init_name] + bad = [n for n in segs if "/" in n[len(fname) + 1:] or not n.endswith(".m4s")] + rep.check(segs and not bad, f"{t}: {fname}/ holds init.mp4 and media segments only: {bad} (floor-cmaf-malformed)") + if not segs or bad: return try: - units = temporal_units(load(os.path.join(sup, stream))) - if not units or not any(typ == OBU_SEQ for typ, _, _ in units[0][1]): + init = cmaf_init(load(os.path.join(sup, init_name))) + per_seg, at = [], 0 + for n in segs: + b = load(os.path.join(sup, n)) + sm = cmaf_segment(b, init) + if sm[0][3] & 0x00010000: + raise CmafFault("floor-cmaf-malformed", f"{n}: a segment that does not open on a sync sample") + cmaf_times(sm, init[1], num, den, at) + per_seg.append((n, at, cmaf_units(b, sm))) + at += len(sm) + rep.check(True, f"{t}: {fname}/'s CMAF files read as §7.7's (floor-cmaf-malformed, floor-cmaf-timing)") + except CmafFault as x: + rep.check(False, f"{t}: {fname}/: {x}") + return + units = [u for _, _, us in per_seg for u in us] + try: + parsed = [obus(u) for u in units] + if any(not o or o[0][0] != OBU_TD or sum(x[0] == OBU_TD for x in o) != 1 or unit_frame(o) is None for o in parsed): + raise Malformed("a sample that is not one temporal unit holding a frame") + first = next((whole for typ, whole, _ in parsed[0] if typ == OBU_SEQ), None) + if first is None: raise Malformed("the first unit holds no sequence header") - first = next(whole for typ, whole, _ in units[0][1] if typ == OBU_SEQ) seq = sequence_header(obus(first)[0][2]) - for u, o in units: - if unit_frame(o) is None: - raise Malformed("a unit holding no frame") + for o in parsed: if any(typ == OBU_SEQ and whole != first for typ, whole, _ in o): raise Malformed("a sequence header other than the first") if shown_key(o, seq) and not any(typ == OBU_SEQ for typ, _, _ in o): raise Malformed("a shown key frame without a sequence header") - rep.check(True, f"{t}: the supplied stream splits into temporal units, each a frame (floor-av1-malformed)") + rep.check(True, f"{t}: {fname}/'s samples are temporal units, each a frame (floor-av1-malformed)") except Malformed as x: - rep.check(False, f"{t}: the supplied stream ({x}) (floor-av1-malformed)") + rep.check(False, f"{t}: {fname}/'s samples ({x}) (floor-av1-malformed)") return - rep.check(len(units) == len(frames), f"{t}: one temporal unit per source frame (floor-frame-count)") - keys = [f for f, (_, o) in enumerate(units) if shown_key(o, seq)] + rep.check(len(units) == len(frames), f"{t}: {fname}/: one sample per source frame (floor-frame-count)") starts = [pc["start"] for pc in ix["pieces"]] + rep.check([(a, len(us)) for _, a, us in per_seg] == [(pc["start"], pc["duration"]) for pc in ix["pieces"]], + f"{t}: {fname}/: one media segment per piece, holding its frames (floor-cmaf-pieces)") + keys = [f for f, o in enumerate(parsed) if shown_key(o, seq)] ok = set(starts) <= set(keys) and (P["floor"]["extra_keyframes"] or keys == starts) - rep.check(ok, f"{t}: shown key frames at the piece starts {starts}, and only there: {keys} (floor-keyframe-mismatch)") - rep.check([[u for u, _ in units[pc["start"]:pc["start"] + pc["duration"]]] for pc in ix["pieces"]] == units_of, - f"{t}: each floor object holds its piece's temporal units of the supplied stream (§7.2)") + rep.check(ok, f"{t}: {fname}/: shown key frames at the piece starts {starts}, and only there: {keys} (floor-keyframe-mismatch)") + rep.check([us for _, _, us in per_seg] == units_of[fname], + f"{t}: each floor object of {fname} holds its piece's media segment's samples (§7.7)") def mutation_verdict(m, c, used): @@ -3771,8 +4460,8 @@ def verify(d): ix = parse_index(load(os.path.join(d, c["index"]))) index_rules(ix) f = c["floor"] - got = render_moq(ix["component"], ix["entries"], c["layer_lag_ms"], c["default_deadline"], (f["codec"], f["w"], f["h"]), - c["namespace"]) + got = render_moq(ix["component"], ix["entries"], c["layer_lag_ms"], c["default_deadline"], + [(ix["component"], f["codec"], f["w"], f["h"])], c["namespace"]) rep.check(got == c["moq"].encode(), f"{c['index']}: the MoQ catalog §8.4 gives") names = {t["name"] for t in json.loads(got)["tracks"]} rep.check(all(x in names for t in json.loads(got)["tracks"] for x in t.get("depends", [])), @@ -3802,14 +4491,40 @@ def verify(d): verify_package_mutations(rep, d) # staged-mutations/: the staged golden altered (§5.4, §5.7, §6.5, §8.6). verify_package_mutations(rep, d, "staged-mutations") + # ladder-mutations/: the ladder golden altered (§7.1: several floor rungs). + verify_package_mutations(rep, d, "ladder-mutations") + # cmaf-mutations/: the CMAF golden altered (§7.7: the receipt binds the supplied bytes). + verify_package_mutations(rep, d, "cmaf-mutations") return rep def main(argv): - if len(argv) != 2: + global JOBS + args = argv[1:] + package = None + while args and args[0].startswith("--"): + if args[0] == "--jobs" and len(args) > 1 and args[1].isdigit() and int(args[1]) >= 1: + JOBS, args = int(args[1]), args[2:] + elif args[0] == "--native-blake3": + use_native_blake3() + args = args[1:] + elif args[0] == "--package" and len(args) > 1: + package, args = args[1], args[2:] + else: + print(__doc__) + return 2 + if package is not None: + if args: + print(__doc__) + return 2 + rep = Report() + verify_pack(rep, HERE, "--package", pkg=package, inputs=False) + print(f"pack_verify: {rep.checked - rep.failures}/{rep.checked} checks hold") + return 0 if rep.failures == 0 else 1 + if len(args) != 1: print(__doc__) return 2 - rep = verify(argv[1]) + rep = verify(args[0]) check_reader_limit(rep) print(f"pack_verify: {rep.checked - rep.failures}/{rep.checked} checks hold") return 0 if rep.failures == 0 else 1 diff --git a/wai/pack-conformance/package-mutations/expected.json b/wai/pack-conformance/package-mutations/expected.json index e1842869e..ac38988bf 100644 --- a/wai/pack-conformance/package-mutations/expected.json +++ b/wai/pack-conformance/package-mutations/expected.json @@ -282,6 +282,31 @@ "reason": "receipt-json", "remove": [] }, + { + "name": "metered", + "reason": "ok", + "remove": [] + }, + { + "name": "metered-claim-another-figure", + "reason": "measurement-claim-invalid", + "remove": [] + }, + { + "name": "metered-claim-missing", + "reason": "measurement-claim-missing", + "remove": [] + }, + { + "name": "metered-fabrics", + "reason": "ok", + "remove": [] + }, + { + "name": "metered-fabrics-unknown-step", + "reason": "measurement-claim-invalid", + "remove": [] + }, { "name": "empty-directory", "reason": "unexpected-file", diff --git a/wai/pack-conformance/package-mutations/metered-claim-another-figure/LISTING b/wai/pack-conformance/package-mutations/metered-claim-another-figure/LISTING new file mode 100644 index 000000000..da0b0dbe2 --- /dev/null +++ b/wai/pack-conformance/package-mutations/metered-claim-another-figure/LISTING @@ -0,0 +1,36 @@ +9414f625ee38f54eb010a003c262ec5ed1ffc95b82510dc032da065846ff4b9b claims/01d891a6690096d3de7c8e7cec802cb95f82deb84b5d45994dd713e7576673f2.measurement.json +91b8aba2292191f2046eb841fe6fcb7b214826cecd9e06a3c193a68e7089e144 dash/classic.mpd +a3aa7658db9b85a9d9a1fed977825189f75c5adad0f5fdfcd70ebd604824c138 dash/mobile.mpd +3f520749a6d2f231cddfd17804ee3629439f3678515e424c44e36cff54d89de9 dash/tv.mpd +04c948608aaa7b5d78ad5355042a2ff65b0f75d9d4b1ad78f3ebffb886a74be6 floor/v/04c948608aaa7b5d78ad5355042a2ff65b0f75d9d4b1ad78f3ebffb886a74be6.m4s +06d5cd79ba3860cccdc252fe915de0902f941a3c6a000295714f7cab193aa6cf floor/v/06d5cd79ba3860cccdc252fe915de0902f941a3c6a000295714f7cab193aa6cf.m4s +2f93f0ad449f9cc881b7816c6ab33fd445037d6538b445bcc76431f9c9f91c5b floor/v/2f93f0ad449f9cc881b7816c6ab33fd445037d6538b445bcc76431f9c9f91c5b.m4s +420ae4c941bba6e12a6c7fdb7d01dc69170ecb4240dffd2e86808ddf87baa12a floor/v/420ae4c941bba6e12a6c7fdb7d01dc69170ecb4240dffd2e86808ddf87baa12a.m4s +99a24de04f7be9fc21097e69d2d61b222e458b1f93b8082026a9874aeb9f4c15 floor/v/99a24de04f7be9fc21097e69d2d61b222e458b1f93b8082026a9874aeb9f4c15.m4s +58c598174eed554cd0d1bc8abedca8c9d51d992c8e3b963bcb7574da4983ed9f floor/v/init.mp4 +289bfcb09eb25124ac19597bc624371c34bea00aa1011ced9372d96b5e14b2bd hls/classic/floor-v.m3u8 +3026d7f11005e34ff66298175777ee6806d649cf9d5c1467aaa4fb00ac5987e6 hls/classic/master.m3u8 +3026d7f11005e34ff66298175777ee6806d649cf9d5c1467aaa4fb00ac5987e6 hls/legacy/master.m3u8 +c5902f61ffaf77f940c4d3dc6e850340aaaeb3f433e4541f935c32443c50b341 hls/mobile/master.m3u8 +c4044eca76959c9f87230484a2b207fb12c0bcaedb8d921eab806014fca53cb8 hls/mobile/wai-v.m3u8 +60a6378f46afc9308dc4ac4d138602b16568577616ea0bf4526b142d86899151 hls/mobile/wai.m3u8 +c5902f61ffaf77f940c4d3dc6e850340aaaeb3f433e4541f935c32443c50b341 hls/tv/master.m3u8 +ff4edf2929e380d205c1c74156621185feec53d593ffa968b8dfaf0d05448bcd hls/tv/wai-v.m3u8 +5d42147b308330913c3d9c8a868ca83ce4d3f3e460da8d84c84014eb24aaf9d7 hls/tv/wai.m3u8 +0b65400d0bbde57ed6a2c19d90cb72ec753de0e76165e4f286acfd5a7bda14d2 index-v.wsix +115e8e1e7ee0765de9bd2f71576cae01ce6576a5ce2a24f3374879eb74d9a6af moq/catalog.json +07e98fb9ef9ff3fa6bf04f9078da2a3d2423e586feea1061256131a1d1fbb943 objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai +4d583d03292b77f9d46b02f2c80a774b1cda1b07df38243d18fe586b82eaca60 objects/35c7a45323b7afe979c123fa885f35cc55fabd2a1954759aebe4b95dbc76361f.wai +cfb71256ef44758ea279846a8938823994d321abce83ef73afd2ed269a8e0259 objects/618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481.wai +f3eedf9eb2870c0160801397412e7a4c3aca4a6e16f1a69a276e1356d38c9220 objects/61c7c3b7ccab07ed01df5b0d7ca0240598b914dbf2cabe545aa001e8de12d365.wai +9fdf29f5c9536d1f7701c791328d656ef725ba9b8cb3760bdb00f5a503c69338 objects/761c4649427c51796a2b699568775765b209ee80d2f4fc1cf040838c6724aa2d.wai +a3135205d3139b39409d4e4e2aafed2c042797d293a9f9fc8664467165336e25 objects/7cc2b824ad6105abfccae27093190311b6a2348842e571684b021a213341b94a.wai +3c66c0b25b759cd1fe6245d282ba928441b873d62e4ac62c95260e45a80fff77 objects/8f748dc64787b5c5ece081270c8559277f926322dd6ddc345306b8231f2d1752.wai +b2a40a9a8cec3dcaf6c92a07d6765203c412c57ec879b7e33a52eabb2e74609d objects/c2ce1907255a041c388afd06ccd007436368e8d20467fdec2a1eebbb84b03bf2.wai +4a2370c37281e64f30cb66a4bd7125854d6280855e90f00229b177bd70af3d8c package.receipt.json +517630d9bee1f5559baff3bb3e642f6aa7b5276226f6e3bdba4f3f9724794859 plan-v.txt +a497fdf29528c4744ce8548e3b430d6311f15c10ca2a4cb548fb9958d3d98f07 policy.json +d667cfa0c1e4e52f254f3a89a80cb0d3b6be0d833c40c8b44f60be33765859b0 policy.toml +59b343802800c815390b840da3ee6981367b495a30d8a1952f6484d04271caf9 stages/legacy.json +b7514cb869338126e4785943a4624e9dbfa44464fa450c55341b7931bd9c19f9 stages/mobile.json +33898452413a8fe209fb6b158bfd1e9b06a74fc3ab7639810522a586a4aa6ac6 stages/tv.json diff --git a/wai/pack-conformance/package-mutations/metered-claim-another-figure/claims/01d891a6690096d3de7c8e7cec802cb95f82deb84b5d45994dd713e7576673f2.measurement.json b/wai/pack-conformance/package-mutations/metered-claim-another-figure/claims/01d891a6690096d3de7c8e7cec802cb95f82deb84b5d45994dd713e7576673f2.measurement.json new file mode 100644 index 000000000..07001fc41 --- /dev/null +++ b/wai/pack-conformance/package-mutations/metered-claim-another-figure/claims/01d891a6690096d3de7c8e7cec802cb95f82deb84b5d45994dd713e7576673f2.measurement.json @@ -0,0 +1 @@ +{"body":{"bracket":null,"build":{"profile":"release","target":null,"toolchain":null},"energy_calibration_ref":null,"energy_counter_filtering":null,"energy_provenance":"ModelBased","energy_uncertainty":null,"figure_index":null,"figure_profile":"wai:video-package-receipt-id","group":null,"joules_micro":500001,"power_reader":"model:500mW"},"class":"measurement","issued_at":"2026-10-21T00:00:00Z","kind":"claim","parent_receipt_hash":null,"seq":0,"sig":"d6935698b54a44f0ff253340fe62334f30a2e8de5d4ab277496e67e666e621b87fdbd558867a7d64f5be637c9388f0cd5696d7629ad87fe89bf09194e0a35500","signer_id":"did:key:z6MkfMo6gxqdBhaHMNnmfhgZFBjpCDTkmJMJLoypsBZS9PwD","signer_pubkey":"0d7550754e0800a5d237eef5826035766b9b3e5a15868a940ab289958788e3b0","subject":"01d891a6690096d3de7c8e7cec802cb95f82deb84b5d45994dd713e7576673f2","subject_type":"receipt"} \ No newline at end of file diff --git a/wai/pack-conformance/package-mutations/metered-claim-another-figure/package.receipt.json b/wai/pack-conformance/package-mutations/metered-claim-another-figure/package.receipt.json new file mode 100644 index 000000000..a59cb6c3b --- /dev/null +++ b/wai/pack-conformance/package-mutations/metered-claim-another-figure/package.receipt.json @@ -0,0 +1 @@ +{"asset_id":"video-base-01","components":[{"id":"v","index":"index-v.wsix","index_digest":"5ffc2be3f21af79078a1158e3d669e4268a35b0ca61a6e73ff252fdf38f346d0","media_class":"video","stage_root":"bd0c7799633b108cf9ccb0c7a4cedbdf6173a83470d3d96b94d075c03e0db7b6"}],"energy_provenance":"ModelBased","grant":{"capability":"wai.video.package","funds_ceiling":null,"grant_hash":"0000000000000000000000000000000000000000000000000000000000000000","joule_ceiling_micro":null},"joules_micro":500000,"kind":"package","packager":"builtin:wai-pack@0.1.0","parent_kind":"none","parent_receipt_hash":null,"policy_digest":"e1c131d56798eb840e22736076d74908bca2b7585aeae7e4bb1698218c01a35e","receipt_hash":"01d891a6690096d3de7c8e7cec802cb95f82deb84b5d45994dd713e7576673f2","sig":"eb052a53c735830304a6c74230dcc348ca6d0c8110497e916407062da83e627db36ba165167ed217e451a26dfa1f5b5e21cf766725063c4532df82ff9d949604","signer_id":"did:key:z6MkfMo6gxqdBhaHMNnmfhgZFBjpCDTkmJMJLoypsBZS9PwD","signer_pubkey":"0d7550754e0800a5d237eef5826035766b9b3e5a15868a940ab289958788e3b0","stored_bytes":119779,"total_bytes":130963,"total_entries":10,"unique_objects":8,"version":2,"work_units":10} \ No newline at end of file diff --git a/wai/pack-conformance/package-mutations/metered-claim-missing/LISTING b/wai/pack-conformance/package-mutations/metered-claim-missing/LISTING new file mode 100644 index 000000000..67b4a1e2b --- /dev/null +++ b/wai/pack-conformance/package-mutations/metered-claim-missing/LISTING @@ -0,0 +1,35 @@ +91b8aba2292191f2046eb841fe6fcb7b214826cecd9e06a3c193a68e7089e144 dash/classic.mpd +a3aa7658db9b85a9d9a1fed977825189f75c5adad0f5fdfcd70ebd604824c138 dash/mobile.mpd +3f520749a6d2f231cddfd17804ee3629439f3678515e424c44e36cff54d89de9 dash/tv.mpd +04c948608aaa7b5d78ad5355042a2ff65b0f75d9d4b1ad78f3ebffb886a74be6 floor/v/04c948608aaa7b5d78ad5355042a2ff65b0f75d9d4b1ad78f3ebffb886a74be6.m4s +06d5cd79ba3860cccdc252fe915de0902f941a3c6a000295714f7cab193aa6cf floor/v/06d5cd79ba3860cccdc252fe915de0902f941a3c6a000295714f7cab193aa6cf.m4s +2f93f0ad449f9cc881b7816c6ab33fd445037d6538b445bcc76431f9c9f91c5b floor/v/2f93f0ad449f9cc881b7816c6ab33fd445037d6538b445bcc76431f9c9f91c5b.m4s +420ae4c941bba6e12a6c7fdb7d01dc69170ecb4240dffd2e86808ddf87baa12a floor/v/420ae4c941bba6e12a6c7fdb7d01dc69170ecb4240dffd2e86808ddf87baa12a.m4s +99a24de04f7be9fc21097e69d2d61b222e458b1f93b8082026a9874aeb9f4c15 floor/v/99a24de04f7be9fc21097e69d2d61b222e458b1f93b8082026a9874aeb9f4c15.m4s +58c598174eed554cd0d1bc8abedca8c9d51d992c8e3b963bcb7574da4983ed9f floor/v/init.mp4 +289bfcb09eb25124ac19597bc624371c34bea00aa1011ced9372d96b5e14b2bd hls/classic/floor-v.m3u8 +3026d7f11005e34ff66298175777ee6806d649cf9d5c1467aaa4fb00ac5987e6 hls/classic/master.m3u8 +3026d7f11005e34ff66298175777ee6806d649cf9d5c1467aaa4fb00ac5987e6 hls/legacy/master.m3u8 +c5902f61ffaf77f940c4d3dc6e850340aaaeb3f433e4541f935c32443c50b341 hls/mobile/master.m3u8 +c4044eca76959c9f87230484a2b207fb12c0bcaedb8d921eab806014fca53cb8 hls/mobile/wai-v.m3u8 +60a6378f46afc9308dc4ac4d138602b16568577616ea0bf4526b142d86899151 hls/mobile/wai.m3u8 +c5902f61ffaf77f940c4d3dc6e850340aaaeb3f433e4541f935c32443c50b341 hls/tv/master.m3u8 +ff4edf2929e380d205c1c74156621185feec53d593ffa968b8dfaf0d05448bcd hls/tv/wai-v.m3u8 +5d42147b308330913c3d9c8a868ca83ce4d3f3e460da8d84c84014eb24aaf9d7 hls/tv/wai.m3u8 +0b65400d0bbde57ed6a2c19d90cb72ec753de0e76165e4f286acfd5a7bda14d2 index-v.wsix +115e8e1e7ee0765de9bd2f71576cae01ce6576a5ce2a24f3374879eb74d9a6af moq/catalog.json +07e98fb9ef9ff3fa6bf04f9078da2a3d2423e586feea1061256131a1d1fbb943 objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai +4d583d03292b77f9d46b02f2c80a774b1cda1b07df38243d18fe586b82eaca60 objects/35c7a45323b7afe979c123fa885f35cc55fabd2a1954759aebe4b95dbc76361f.wai +cfb71256ef44758ea279846a8938823994d321abce83ef73afd2ed269a8e0259 objects/618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481.wai +f3eedf9eb2870c0160801397412e7a4c3aca4a6e16f1a69a276e1356d38c9220 objects/61c7c3b7ccab07ed01df5b0d7ca0240598b914dbf2cabe545aa001e8de12d365.wai +9fdf29f5c9536d1f7701c791328d656ef725ba9b8cb3760bdb00f5a503c69338 objects/761c4649427c51796a2b699568775765b209ee80d2f4fc1cf040838c6724aa2d.wai +a3135205d3139b39409d4e4e2aafed2c042797d293a9f9fc8664467165336e25 objects/7cc2b824ad6105abfccae27093190311b6a2348842e571684b021a213341b94a.wai +3c66c0b25b759cd1fe6245d282ba928441b873d62e4ac62c95260e45a80fff77 objects/8f748dc64787b5c5ece081270c8559277f926322dd6ddc345306b8231f2d1752.wai +b2a40a9a8cec3dcaf6c92a07d6765203c412c57ec879b7e33a52eabb2e74609d objects/c2ce1907255a041c388afd06ccd007436368e8d20467fdec2a1eebbb84b03bf2.wai +4a2370c37281e64f30cb66a4bd7125854d6280855e90f00229b177bd70af3d8c package.receipt.json +517630d9bee1f5559baff3bb3e642f6aa7b5276226f6e3bdba4f3f9724794859 plan-v.txt +a497fdf29528c4744ce8548e3b430d6311f15c10ca2a4cb548fb9958d3d98f07 policy.json +d667cfa0c1e4e52f254f3a89a80cb0d3b6be0d833c40c8b44f60be33765859b0 policy.toml +59b343802800c815390b840da3ee6981367b495a30d8a1952f6484d04271caf9 stages/legacy.json +b7514cb869338126e4785943a4624e9dbfa44464fa450c55341b7931bd9c19f9 stages/mobile.json +33898452413a8fe209fb6b158bfd1e9b06a74fc3ab7639810522a586a4aa6ac6 stages/tv.json diff --git a/wai/pack-conformance/package-mutations/metered-claim-missing/package.receipt.json b/wai/pack-conformance/package-mutations/metered-claim-missing/package.receipt.json new file mode 100644 index 000000000..a59cb6c3b --- /dev/null +++ b/wai/pack-conformance/package-mutations/metered-claim-missing/package.receipt.json @@ -0,0 +1 @@ +{"asset_id":"video-base-01","components":[{"id":"v","index":"index-v.wsix","index_digest":"5ffc2be3f21af79078a1158e3d669e4268a35b0ca61a6e73ff252fdf38f346d0","media_class":"video","stage_root":"bd0c7799633b108cf9ccb0c7a4cedbdf6173a83470d3d96b94d075c03e0db7b6"}],"energy_provenance":"ModelBased","grant":{"capability":"wai.video.package","funds_ceiling":null,"grant_hash":"0000000000000000000000000000000000000000000000000000000000000000","joule_ceiling_micro":null},"joules_micro":500000,"kind":"package","packager":"builtin:wai-pack@0.1.0","parent_kind":"none","parent_receipt_hash":null,"policy_digest":"e1c131d56798eb840e22736076d74908bca2b7585aeae7e4bb1698218c01a35e","receipt_hash":"01d891a6690096d3de7c8e7cec802cb95f82deb84b5d45994dd713e7576673f2","sig":"eb052a53c735830304a6c74230dcc348ca6d0c8110497e916407062da83e627db36ba165167ed217e451a26dfa1f5b5e21cf766725063c4532df82ff9d949604","signer_id":"did:key:z6MkfMo6gxqdBhaHMNnmfhgZFBjpCDTkmJMJLoypsBZS9PwD","signer_pubkey":"0d7550754e0800a5d237eef5826035766b9b3e5a15868a940ab289958788e3b0","stored_bytes":119779,"total_bytes":130963,"total_entries":10,"unique_objects":8,"version":2,"work_units":10} \ No newline at end of file diff --git a/wai/pack-conformance/package-mutations/metered-fabrics-unknown-step/LISTING b/wai/pack-conformance/package-mutations/metered-fabrics-unknown-step/LISTING new file mode 100644 index 000000000..cc1ce69ce --- /dev/null +++ b/wai/pack-conformance/package-mutations/metered-fabrics-unknown-step/LISTING @@ -0,0 +1,36 @@ +6b414a7fc1d9ee44a40aa79b9c3338d04ec00dbfbf88d39f5965ce65a6804890 claims/01d891a6690096d3de7c8e7cec802cb95f82deb84b5d45994dd713e7576673f2.measurement.json +91b8aba2292191f2046eb841fe6fcb7b214826cecd9e06a3c193a68e7089e144 dash/classic.mpd +a3aa7658db9b85a9d9a1fed977825189f75c5adad0f5fdfcd70ebd604824c138 dash/mobile.mpd +3f520749a6d2f231cddfd17804ee3629439f3678515e424c44e36cff54d89de9 dash/tv.mpd +04c948608aaa7b5d78ad5355042a2ff65b0f75d9d4b1ad78f3ebffb886a74be6 floor/v/04c948608aaa7b5d78ad5355042a2ff65b0f75d9d4b1ad78f3ebffb886a74be6.m4s +06d5cd79ba3860cccdc252fe915de0902f941a3c6a000295714f7cab193aa6cf floor/v/06d5cd79ba3860cccdc252fe915de0902f941a3c6a000295714f7cab193aa6cf.m4s +2f93f0ad449f9cc881b7816c6ab33fd445037d6538b445bcc76431f9c9f91c5b floor/v/2f93f0ad449f9cc881b7816c6ab33fd445037d6538b445bcc76431f9c9f91c5b.m4s +420ae4c941bba6e12a6c7fdb7d01dc69170ecb4240dffd2e86808ddf87baa12a floor/v/420ae4c941bba6e12a6c7fdb7d01dc69170ecb4240dffd2e86808ddf87baa12a.m4s +99a24de04f7be9fc21097e69d2d61b222e458b1f93b8082026a9874aeb9f4c15 floor/v/99a24de04f7be9fc21097e69d2d61b222e458b1f93b8082026a9874aeb9f4c15.m4s +58c598174eed554cd0d1bc8abedca8c9d51d992c8e3b963bcb7574da4983ed9f floor/v/init.mp4 +289bfcb09eb25124ac19597bc624371c34bea00aa1011ced9372d96b5e14b2bd hls/classic/floor-v.m3u8 +3026d7f11005e34ff66298175777ee6806d649cf9d5c1467aaa4fb00ac5987e6 hls/classic/master.m3u8 +3026d7f11005e34ff66298175777ee6806d649cf9d5c1467aaa4fb00ac5987e6 hls/legacy/master.m3u8 +c5902f61ffaf77f940c4d3dc6e850340aaaeb3f433e4541f935c32443c50b341 hls/mobile/master.m3u8 +c4044eca76959c9f87230484a2b207fb12c0bcaedb8d921eab806014fca53cb8 hls/mobile/wai-v.m3u8 +60a6378f46afc9308dc4ac4d138602b16568577616ea0bf4526b142d86899151 hls/mobile/wai.m3u8 +c5902f61ffaf77f940c4d3dc6e850340aaaeb3f433e4541f935c32443c50b341 hls/tv/master.m3u8 +ff4edf2929e380d205c1c74156621185feec53d593ffa968b8dfaf0d05448bcd hls/tv/wai-v.m3u8 +5d42147b308330913c3d9c8a868ca83ce4d3f3e460da8d84c84014eb24aaf9d7 hls/tv/wai.m3u8 +0b65400d0bbde57ed6a2c19d90cb72ec753de0e76165e4f286acfd5a7bda14d2 index-v.wsix +115e8e1e7ee0765de9bd2f71576cae01ce6576a5ce2a24f3374879eb74d9a6af moq/catalog.json +07e98fb9ef9ff3fa6bf04f9078da2a3d2423e586feea1061256131a1d1fbb943 objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai +4d583d03292b77f9d46b02f2c80a774b1cda1b07df38243d18fe586b82eaca60 objects/35c7a45323b7afe979c123fa885f35cc55fabd2a1954759aebe4b95dbc76361f.wai +cfb71256ef44758ea279846a8938823994d321abce83ef73afd2ed269a8e0259 objects/618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481.wai +f3eedf9eb2870c0160801397412e7a4c3aca4a6e16f1a69a276e1356d38c9220 objects/61c7c3b7ccab07ed01df5b0d7ca0240598b914dbf2cabe545aa001e8de12d365.wai +9fdf29f5c9536d1f7701c791328d656ef725ba9b8cb3760bdb00f5a503c69338 objects/761c4649427c51796a2b699568775765b209ee80d2f4fc1cf040838c6724aa2d.wai +a3135205d3139b39409d4e4e2aafed2c042797d293a9f9fc8664467165336e25 objects/7cc2b824ad6105abfccae27093190311b6a2348842e571684b021a213341b94a.wai +3c66c0b25b759cd1fe6245d282ba928441b873d62e4ac62c95260e45a80fff77 objects/8f748dc64787b5c5ece081270c8559277f926322dd6ddc345306b8231f2d1752.wai +b2a40a9a8cec3dcaf6c92a07d6765203c412c57ec879b7e33a52eabb2e74609d objects/c2ce1907255a041c388afd06ccd007436368e8d20467fdec2a1eebbb84b03bf2.wai +4a2370c37281e64f30cb66a4bd7125854d6280855e90f00229b177bd70af3d8c package.receipt.json +517630d9bee1f5559baff3bb3e642f6aa7b5276226f6e3bdba4f3f9724794859 plan-v.txt +a497fdf29528c4744ce8548e3b430d6311f15c10ca2a4cb548fb9958d3d98f07 policy.json +d667cfa0c1e4e52f254f3a89a80cb0d3b6be0d833c40c8b44f60be33765859b0 policy.toml +59b343802800c815390b840da3ee6981367b495a30d8a1952f6484d04271caf9 stages/legacy.json +b7514cb869338126e4785943a4624e9dbfa44464fa450c55341b7931bd9c19f9 stages/mobile.json +33898452413a8fe209fb6b158bfd1e9b06a74fc3ab7639810522a586a4aa6ac6 stages/tv.json diff --git a/wai/pack-conformance/package-mutations/metered-fabrics-unknown-step/claims/01d891a6690096d3de7c8e7cec802cb95f82deb84b5d45994dd713e7576673f2.measurement.json b/wai/pack-conformance/package-mutations/metered-fabrics-unknown-step/claims/01d891a6690096d3de7c8e7cec802cb95f82deb84b5d45994dd713e7576673f2.measurement.json new file mode 100644 index 000000000..92216c412 --- /dev/null +++ b/wai/pack-conformance/package-mutations/metered-fabrics-unknown-step/claims/01d891a6690096d3de7c8e7cec802cb95f82deb84b5d45994dd713e7576673f2.measurement.json @@ -0,0 +1 @@ +{"body":{"bracket":null,"build":{"profile":"release","target":null,"toolchain":null},"energy_calibration_ref":null,"energy_counter_filtering":null,"energy_provenance":"ModelBased","energy_uncertainty":null,"fabrics":{"shares":[{"attribution":"task","fabric":"cpu","joules_micro":500000}],"steps":[{"backend":"cpu: the reference implementation","fabric":"cpu","step":"base-code"},{"backend":"cpu: the reference implementation","fabric":"cpu","step":"lunch"}]},"figure_index":null,"figure_profile":"wai:video-package-receipt-id","group":null,"joules_micro":500000,"power_reader":"model:500mW"},"class":"measurement","issued_at":"2026-10-21T00:00:00Z","kind":"claim","parent_receipt_hash":null,"seq":0,"sig":"3d1c9daf255ffd4eded9a09f2ed4d9376ff7a94a28e179e2961aa354255aa3bcca287ac7d201a610fa5f87a527fb31718729fddd5982cb3fe2398a4b1e884806","signer_id":"did:key:z6MkfMo6gxqdBhaHMNnmfhgZFBjpCDTkmJMJLoypsBZS9PwD","signer_pubkey":"0d7550754e0800a5d237eef5826035766b9b3e5a15868a940ab289958788e3b0","subject":"01d891a6690096d3de7c8e7cec802cb95f82deb84b5d45994dd713e7576673f2","subject_type":"receipt"} \ No newline at end of file diff --git a/wai/pack-conformance/package-mutations/metered-fabrics-unknown-step/package.receipt.json b/wai/pack-conformance/package-mutations/metered-fabrics-unknown-step/package.receipt.json new file mode 100644 index 000000000..a59cb6c3b --- /dev/null +++ b/wai/pack-conformance/package-mutations/metered-fabrics-unknown-step/package.receipt.json @@ -0,0 +1 @@ +{"asset_id":"video-base-01","components":[{"id":"v","index":"index-v.wsix","index_digest":"5ffc2be3f21af79078a1158e3d669e4268a35b0ca61a6e73ff252fdf38f346d0","media_class":"video","stage_root":"bd0c7799633b108cf9ccb0c7a4cedbdf6173a83470d3d96b94d075c03e0db7b6"}],"energy_provenance":"ModelBased","grant":{"capability":"wai.video.package","funds_ceiling":null,"grant_hash":"0000000000000000000000000000000000000000000000000000000000000000","joule_ceiling_micro":null},"joules_micro":500000,"kind":"package","packager":"builtin:wai-pack@0.1.0","parent_kind":"none","parent_receipt_hash":null,"policy_digest":"e1c131d56798eb840e22736076d74908bca2b7585aeae7e4bb1698218c01a35e","receipt_hash":"01d891a6690096d3de7c8e7cec802cb95f82deb84b5d45994dd713e7576673f2","sig":"eb052a53c735830304a6c74230dcc348ca6d0c8110497e916407062da83e627db36ba165167ed217e451a26dfa1f5b5e21cf766725063c4532df82ff9d949604","signer_id":"did:key:z6MkfMo6gxqdBhaHMNnmfhgZFBjpCDTkmJMJLoypsBZS9PwD","signer_pubkey":"0d7550754e0800a5d237eef5826035766b9b3e5a15868a940ab289958788e3b0","stored_bytes":119779,"total_bytes":130963,"total_entries":10,"unique_objects":8,"version":2,"work_units":10} \ No newline at end of file diff --git a/wai/pack-conformance/package-mutations/metered-fabrics/LISTING b/wai/pack-conformance/package-mutations/metered-fabrics/LISTING new file mode 100644 index 000000000..472110750 --- /dev/null +++ b/wai/pack-conformance/package-mutations/metered-fabrics/LISTING @@ -0,0 +1,36 @@ +4c26bc6aa2694b67430cf49ce8632588c97927c6c776d62295704036a3049d38 claims/01d891a6690096d3de7c8e7cec802cb95f82deb84b5d45994dd713e7576673f2.measurement.json +91b8aba2292191f2046eb841fe6fcb7b214826cecd9e06a3c193a68e7089e144 dash/classic.mpd +a3aa7658db9b85a9d9a1fed977825189f75c5adad0f5fdfcd70ebd604824c138 dash/mobile.mpd +3f520749a6d2f231cddfd17804ee3629439f3678515e424c44e36cff54d89de9 dash/tv.mpd +04c948608aaa7b5d78ad5355042a2ff65b0f75d9d4b1ad78f3ebffb886a74be6 floor/v/04c948608aaa7b5d78ad5355042a2ff65b0f75d9d4b1ad78f3ebffb886a74be6.m4s +06d5cd79ba3860cccdc252fe915de0902f941a3c6a000295714f7cab193aa6cf floor/v/06d5cd79ba3860cccdc252fe915de0902f941a3c6a000295714f7cab193aa6cf.m4s +2f93f0ad449f9cc881b7816c6ab33fd445037d6538b445bcc76431f9c9f91c5b floor/v/2f93f0ad449f9cc881b7816c6ab33fd445037d6538b445bcc76431f9c9f91c5b.m4s +420ae4c941bba6e12a6c7fdb7d01dc69170ecb4240dffd2e86808ddf87baa12a floor/v/420ae4c941bba6e12a6c7fdb7d01dc69170ecb4240dffd2e86808ddf87baa12a.m4s +99a24de04f7be9fc21097e69d2d61b222e458b1f93b8082026a9874aeb9f4c15 floor/v/99a24de04f7be9fc21097e69d2d61b222e458b1f93b8082026a9874aeb9f4c15.m4s +58c598174eed554cd0d1bc8abedca8c9d51d992c8e3b963bcb7574da4983ed9f floor/v/init.mp4 +289bfcb09eb25124ac19597bc624371c34bea00aa1011ced9372d96b5e14b2bd hls/classic/floor-v.m3u8 +3026d7f11005e34ff66298175777ee6806d649cf9d5c1467aaa4fb00ac5987e6 hls/classic/master.m3u8 +3026d7f11005e34ff66298175777ee6806d649cf9d5c1467aaa4fb00ac5987e6 hls/legacy/master.m3u8 +c5902f61ffaf77f940c4d3dc6e850340aaaeb3f433e4541f935c32443c50b341 hls/mobile/master.m3u8 +c4044eca76959c9f87230484a2b207fb12c0bcaedb8d921eab806014fca53cb8 hls/mobile/wai-v.m3u8 +60a6378f46afc9308dc4ac4d138602b16568577616ea0bf4526b142d86899151 hls/mobile/wai.m3u8 +c5902f61ffaf77f940c4d3dc6e850340aaaeb3f433e4541f935c32443c50b341 hls/tv/master.m3u8 +ff4edf2929e380d205c1c74156621185feec53d593ffa968b8dfaf0d05448bcd hls/tv/wai-v.m3u8 +5d42147b308330913c3d9c8a868ca83ce4d3f3e460da8d84c84014eb24aaf9d7 hls/tv/wai.m3u8 +0b65400d0bbde57ed6a2c19d90cb72ec753de0e76165e4f286acfd5a7bda14d2 index-v.wsix +115e8e1e7ee0765de9bd2f71576cae01ce6576a5ce2a24f3374879eb74d9a6af moq/catalog.json +07e98fb9ef9ff3fa6bf04f9078da2a3d2423e586feea1061256131a1d1fbb943 objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai +4d583d03292b77f9d46b02f2c80a774b1cda1b07df38243d18fe586b82eaca60 objects/35c7a45323b7afe979c123fa885f35cc55fabd2a1954759aebe4b95dbc76361f.wai +cfb71256ef44758ea279846a8938823994d321abce83ef73afd2ed269a8e0259 objects/618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481.wai +f3eedf9eb2870c0160801397412e7a4c3aca4a6e16f1a69a276e1356d38c9220 objects/61c7c3b7ccab07ed01df5b0d7ca0240598b914dbf2cabe545aa001e8de12d365.wai +9fdf29f5c9536d1f7701c791328d656ef725ba9b8cb3760bdb00f5a503c69338 objects/761c4649427c51796a2b699568775765b209ee80d2f4fc1cf040838c6724aa2d.wai +a3135205d3139b39409d4e4e2aafed2c042797d293a9f9fc8664467165336e25 objects/7cc2b824ad6105abfccae27093190311b6a2348842e571684b021a213341b94a.wai +3c66c0b25b759cd1fe6245d282ba928441b873d62e4ac62c95260e45a80fff77 objects/8f748dc64787b5c5ece081270c8559277f926322dd6ddc345306b8231f2d1752.wai +b2a40a9a8cec3dcaf6c92a07d6765203c412c57ec879b7e33a52eabb2e74609d objects/c2ce1907255a041c388afd06ccd007436368e8d20467fdec2a1eebbb84b03bf2.wai +4a2370c37281e64f30cb66a4bd7125854d6280855e90f00229b177bd70af3d8c package.receipt.json +517630d9bee1f5559baff3bb3e642f6aa7b5276226f6e3bdba4f3f9724794859 plan-v.txt +a497fdf29528c4744ce8548e3b430d6311f15c10ca2a4cb548fb9958d3d98f07 policy.json +d667cfa0c1e4e52f254f3a89a80cb0d3b6be0d833c40c8b44f60be33765859b0 policy.toml +59b343802800c815390b840da3ee6981367b495a30d8a1952f6484d04271caf9 stages/legacy.json +b7514cb869338126e4785943a4624e9dbfa44464fa450c55341b7931bd9c19f9 stages/mobile.json +33898452413a8fe209fb6b158bfd1e9b06a74fc3ab7639810522a586a4aa6ac6 stages/tv.json diff --git a/wai/pack-conformance/package-mutations/metered-fabrics/claims/01d891a6690096d3de7c8e7cec802cb95f82deb84b5d45994dd713e7576673f2.measurement.json b/wai/pack-conformance/package-mutations/metered-fabrics/claims/01d891a6690096d3de7c8e7cec802cb95f82deb84b5d45994dd713e7576673f2.measurement.json new file mode 100644 index 000000000..2f0b235e0 --- /dev/null +++ b/wai/pack-conformance/package-mutations/metered-fabrics/claims/01d891a6690096d3de7c8e7cec802cb95f82deb84b5d45994dd713e7576673f2.measurement.json @@ -0,0 +1 @@ +{"body":{"bracket":null,"build":{"profile":"release","target":null,"toolchain":null},"energy_calibration_ref":null,"energy_counter_filtering":null,"energy_provenance":"ModelBased","energy_uncertainty":null,"fabrics":{"shares":[{"attribution":"task","fabric":"cpu","joules_micro":500000}],"steps":[{"backend":"cpu: the reference implementation","fabric":"cpu","step":"base-code"},{"backend":"cpu: the reference implementation","fabric":"cpu","step":"object-hash"}]},"figure_index":null,"figure_profile":"wai:video-package-receipt-id","group":null,"joules_micro":500000,"power_reader":"model:500mW"},"class":"measurement","issued_at":"2026-10-21T00:00:00Z","kind":"claim","parent_receipt_hash":null,"seq":0,"sig":"9888011d5eee7d70fe6f5671e2ad170c05d503b0977bfeacbd23bfb80bd27b95d54ba165c6b4066ce677217b949c5b4da10e251e6c857457c1743f122b9da90f","signer_id":"did:key:z6MkfMo6gxqdBhaHMNnmfhgZFBjpCDTkmJMJLoypsBZS9PwD","signer_pubkey":"0d7550754e0800a5d237eef5826035766b9b3e5a15868a940ab289958788e3b0","subject":"01d891a6690096d3de7c8e7cec802cb95f82deb84b5d45994dd713e7576673f2","subject_type":"receipt"} \ No newline at end of file diff --git a/wai/pack-conformance/package-mutations/metered-fabrics/package.receipt.json b/wai/pack-conformance/package-mutations/metered-fabrics/package.receipt.json new file mode 100644 index 000000000..a59cb6c3b --- /dev/null +++ b/wai/pack-conformance/package-mutations/metered-fabrics/package.receipt.json @@ -0,0 +1 @@ +{"asset_id":"video-base-01","components":[{"id":"v","index":"index-v.wsix","index_digest":"5ffc2be3f21af79078a1158e3d669e4268a35b0ca61a6e73ff252fdf38f346d0","media_class":"video","stage_root":"bd0c7799633b108cf9ccb0c7a4cedbdf6173a83470d3d96b94d075c03e0db7b6"}],"energy_provenance":"ModelBased","grant":{"capability":"wai.video.package","funds_ceiling":null,"grant_hash":"0000000000000000000000000000000000000000000000000000000000000000","joule_ceiling_micro":null},"joules_micro":500000,"kind":"package","packager":"builtin:wai-pack@0.1.0","parent_kind":"none","parent_receipt_hash":null,"policy_digest":"e1c131d56798eb840e22736076d74908bca2b7585aeae7e4bb1698218c01a35e","receipt_hash":"01d891a6690096d3de7c8e7cec802cb95f82deb84b5d45994dd713e7576673f2","sig":"eb052a53c735830304a6c74230dcc348ca6d0c8110497e916407062da83e627db36ba165167ed217e451a26dfa1f5b5e21cf766725063c4532df82ff9d949604","signer_id":"did:key:z6MkfMo6gxqdBhaHMNnmfhgZFBjpCDTkmJMJLoypsBZS9PwD","signer_pubkey":"0d7550754e0800a5d237eef5826035766b9b3e5a15868a940ab289958788e3b0","stored_bytes":119779,"total_bytes":130963,"total_entries":10,"unique_objects":8,"version":2,"work_units":10} \ No newline at end of file diff --git a/wai/pack-conformance/package-mutations/metered/LISTING b/wai/pack-conformance/package-mutations/metered/LISTING new file mode 100644 index 000000000..ecc747b37 --- /dev/null +++ b/wai/pack-conformance/package-mutations/metered/LISTING @@ -0,0 +1,36 @@ +a2ef584d432d2a1a1af10cb9d342c0fecbb2c05d72fc054d3792a7ab4bacdce6 claims/01d891a6690096d3de7c8e7cec802cb95f82deb84b5d45994dd713e7576673f2.measurement.json +91b8aba2292191f2046eb841fe6fcb7b214826cecd9e06a3c193a68e7089e144 dash/classic.mpd +a3aa7658db9b85a9d9a1fed977825189f75c5adad0f5fdfcd70ebd604824c138 dash/mobile.mpd +3f520749a6d2f231cddfd17804ee3629439f3678515e424c44e36cff54d89de9 dash/tv.mpd +04c948608aaa7b5d78ad5355042a2ff65b0f75d9d4b1ad78f3ebffb886a74be6 floor/v/04c948608aaa7b5d78ad5355042a2ff65b0f75d9d4b1ad78f3ebffb886a74be6.m4s +06d5cd79ba3860cccdc252fe915de0902f941a3c6a000295714f7cab193aa6cf floor/v/06d5cd79ba3860cccdc252fe915de0902f941a3c6a000295714f7cab193aa6cf.m4s +2f93f0ad449f9cc881b7816c6ab33fd445037d6538b445bcc76431f9c9f91c5b floor/v/2f93f0ad449f9cc881b7816c6ab33fd445037d6538b445bcc76431f9c9f91c5b.m4s +420ae4c941bba6e12a6c7fdb7d01dc69170ecb4240dffd2e86808ddf87baa12a floor/v/420ae4c941bba6e12a6c7fdb7d01dc69170ecb4240dffd2e86808ddf87baa12a.m4s +99a24de04f7be9fc21097e69d2d61b222e458b1f93b8082026a9874aeb9f4c15 floor/v/99a24de04f7be9fc21097e69d2d61b222e458b1f93b8082026a9874aeb9f4c15.m4s +58c598174eed554cd0d1bc8abedca8c9d51d992c8e3b963bcb7574da4983ed9f floor/v/init.mp4 +289bfcb09eb25124ac19597bc624371c34bea00aa1011ced9372d96b5e14b2bd hls/classic/floor-v.m3u8 +3026d7f11005e34ff66298175777ee6806d649cf9d5c1467aaa4fb00ac5987e6 hls/classic/master.m3u8 +3026d7f11005e34ff66298175777ee6806d649cf9d5c1467aaa4fb00ac5987e6 hls/legacy/master.m3u8 +c5902f61ffaf77f940c4d3dc6e850340aaaeb3f433e4541f935c32443c50b341 hls/mobile/master.m3u8 +c4044eca76959c9f87230484a2b207fb12c0bcaedb8d921eab806014fca53cb8 hls/mobile/wai-v.m3u8 +60a6378f46afc9308dc4ac4d138602b16568577616ea0bf4526b142d86899151 hls/mobile/wai.m3u8 +c5902f61ffaf77f940c4d3dc6e850340aaaeb3f433e4541f935c32443c50b341 hls/tv/master.m3u8 +ff4edf2929e380d205c1c74156621185feec53d593ffa968b8dfaf0d05448bcd hls/tv/wai-v.m3u8 +5d42147b308330913c3d9c8a868ca83ce4d3f3e460da8d84c84014eb24aaf9d7 hls/tv/wai.m3u8 +0b65400d0bbde57ed6a2c19d90cb72ec753de0e76165e4f286acfd5a7bda14d2 index-v.wsix +115e8e1e7ee0765de9bd2f71576cae01ce6576a5ce2a24f3374879eb74d9a6af moq/catalog.json +07e98fb9ef9ff3fa6bf04f9078da2a3d2423e586feea1061256131a1d1fbb943 objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai +4d583d03292b77f9d46b02f2c80a774b1cda1b07df38243d18fe586b82eaca60 objects/35c7a45323b7afe979c123fa885f35cc55fabd2a1954759aebe4b95dbc76361f.wai +cfb71256ef44758ea279846a8938823994d321abce83ef73afd2ed269a8e0259 objects/618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481.wai +f3eedf9eb2870c0160801397412e7a4c3aca4a6e16f1a69a276e1356d38c9220 objects/61c7c3b7ccab07ed01df5b0d7ca0240598b914dbf2cabe545aa001e8de12d365.wai +9fdf29f5c9536d1f7701c791328d656ef725ba9b8cb3760bdb00f5a503c69338 objects/761c4649427c51796a2b699568775765b209ee80d2f4fc1cf040838c6724aa2d.wai +a3135205d3139b39409d4e4e2aafed2c042797d293a9f9fc8664467165336e25 objects/7cc2b824ad6105abfccae27093190311b6a2348842e571684b021a213341b94a.wai +3c66c0b25b759cd1fe6245d282ba928441b873d62e4ac62c95260e45a80fff77 objects/8f748dc64787b5c5ece081270c8559277f926322dd6ddc345306b8231f2d1752.wai +b2a40a9a8cec3dcaf6c92a07d6765203c412c57ec879b7e33a52eabb2e74609d objects/c2ce1907255a041c388afd06ccd007436368e8d20467fdec2a1eebbb84b03bf2.wai +4a2370c37281e64f30cb66a4bd7125854d6280855e90f00229b177bd70af3d8c package.receipt.json +517630d9bee1f5559baff3bb3e642f6aa7b5276226f6e3bdba4f3f9724794859 plan-v.txt +a497fdf29528c4744ce8548e3b430d6311f15c10ca2a4cb548fb9958d3d98f07 policy.json +d667cfa0c1e4e52f254f3a89a80cb0d3b6be0d833c40c8b44f60be33765859b0 policy.toml +59b343802800c815390b840da3ee6981367b495a30d8a1952f6484d04271caf9 stages/legacy.json +b7514cb869338126e4785943a4624e9dbfa44464fa450c55341b7931bd9c19f9 stages/mobile.json +33898452413a8fe209fb6b158bfd1e9b06a74fc3ab7639810522a586a4aa6ac6 stages/tv.json diff --git a/wai/pack-conformance/package-mutations/metered/claims/01d891a6690096d3de7c8e7cec802cb95f82deb84b5d45994dd713e7576673f2.measurement.json b/wai/pack-conformance/package-mutations/metered/claims/01d891a6690096d3de7c8e7cec802cb95f82deb84b5d45994dd713e7576673f2.measurement.json new file mode 100644 index 000000000..e320e2364 --- /dev/null +++ b/wai/pack-conformance/package-mutations/metered/claims/01d891a6690096d3de7c8e7cec802cb95f82deb84b5d45994dd713e7576673f2.measurement.json @@ -0,0 +1 @@ +{"body":{"bracket":null,"build":{"profile":"release","target":null,"toolchain":null},"energy_calibration_ref":null,"energy_counter_filtering":null,"energy_provenance":"ModelBased","energy_uncertainty":null,"figure_index":null,"figure_profile":"wai:video-package-receipt-id","group":null,"joules_micro":500000,"power_reader":"model:500mW"},"class":"measurement","issued_at":"2026-10-21T00:00:00Z","kind":"claim","parent_receipt_hash":null,"seq":0,"sig":"8e4df4a0568d61e153cd7eca9e8664dc69b11202d8999138b639ffa77f7ade7de212a2b31d3a7977861ab176286a77633257a17d0919c5e04a9d2741b85fc807","signer_id":"did:key:z6MkfMo6gxqdBhaHMNnmfhgZFBjpCDTkmJMJLoypsBZS9PwD","signer_pubkey":"0d7550754e0800a5d237eef5826035766b9b3e5a15868a940ab289958788e3b0","subject":"01d891a6690096d3de7c8e7cec802cb95f82deb84b5d45994dd713e7576673f2","subject_type":"receipt"} \ No newline at end of file diff --git a/wai/pack-conformance/package-mutations/metered/package.receipt.json b/wai/pack-conformance/package-mutations/metered/package.receipt.json new file mode 100644 index 000000000..a59cb6c3b --- /dev/null +++ b/wai/pack-conformance/package-mutations/metered/package.receipt.json @@ -0,0 +1 @@ +{"asset_id":"video-base-01","components":[{"id":"v","index":"index-v.wsix","index_digest":"5ffc2be3f21af79078a1158e3d669e4268a35b0ca61a6e73ff252fdf38f346d0","media_class":"video","stage_root":"bd0c7799633b108cf9ccb0c7a4cedbdf6173a83470d3d96b94d075c03e0db7b6"}],"energy_provenance":"ModelBased","grant":{"capability":"wai.video.package","funds_ceiling":null,"grant_hash":"0000000000000000000000000000000000000000000000000000000000000000","joule_ceiling_micro":null},"joules_micro":500000,"kind":"package","packager":"builtin:wai-pack@0.1.0","parent_kind":"none","parent_receipt_hash":null,"policy_digest":"e1c131d56798eb840e22736076d74908bca2b7585aeae7e4bb1698218c01a35e","receipt_hash":"01d891a6690096d3de7c8e7cec802cb95f82deb84b5d45994dd713e7576673f2","sig":"eb052a53c735830304a6c74230dcc348ca6d0c8110497e916407062da83e627db36ba165167ed217e451a26dfa1f5b5e21cf766725063c4532df82ff9d949604","signer_id":"did:key:z6MkfMo6gxqdBhaHMNnmfhgZFBjpCDTkmJMJLoypsBZS9PwD","signer_pubkey":"0d7550754e0800a5d237eef5826035766b9b3e5a15868a940ab289958788e3b0","stored_bytes":119779,"total_bytes":130963,"total_entries":10,"unique_objects":8,"version":2,"work_units":10} \ No newline at end of file diff --git a/wai/pack-conformance/packs/video-cmaf-01/floor/hi/init.mp4 b/wai/pack-conformance/packs/video-cmaf-01/floor/hi/init.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..af7fc6d9dc1201185942fa2d43659adcbca8bc7d GIT binary patch literal 788 zcmaJ;%}N6?5T4eHlpc!oP^5yHkxY*w%za9wEC3|Z zjyYl(TW60>Q~>ZP3lCS^w^EbD1f6S9?*#m6MMZpO#P^$r(@D)S*^GRek-KUw1c=HBzQiMCwDUp^dvvq%KhFVIdHksP8>Z6g@-b<#weN zx2OY?Iiyn2-?IUmal6U(CFV5#2z8FP^wmEZ~=>RxocGNrU JM4hO6@D04WTgd|^S%E+gAg)}k;O-a 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 literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-cmaf-01/floor/hi/seg_0003.m4s b/wai/pack-conformance/packs/video-cmaf-01/floor/hi/seg_0003.m4s new file mode 100644 index 0000000000000000000000000000000000000000..ac02ab23e272a47b2c108501e3683748b9190b9d GIT binary patch literal 873 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 R>B5Q!))e@JZhjgg{~xLLQIG%t literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-cmaf-01/floor/lo/seg_0001.m4s b/wai/pack-conformance/packs/video-cmaf-01/floor/lo/seg_0001.m4s new file mode 100644 index 0000000000000000000000000000000000000000..74171d12cf37630911486c49494280811c03c617 GIT binary patch literal 1019 zcmZQzV2~&-sVvAXPRU>Z0uY^BoLK>6niOZIR4{@B85kHDg!~)8EbUKV3Q7Q_nb(8l zAd(Dca`W@kfN}!4X&EU{HB3NyOG!~8NL;1_B+kTO0b~R9?rs3mhKvwPL`u?9N}%>J zFhK07DJd$=V_;xn1*($-;wvD-fWQ!lb%EFfh}D2t1Pu!V`HDcS0i~6JGzf#lK^UYS zB(DU-azHE%<-_EGG}GhUl*AG)E}#sP`lH;M0}4jUA`Hq73=9oGAyM;+kXjA4yW8*o zx3K+??`@;*7$O??lr6zX+lcW2P!TgQI2m0JI9_0Q5a^s1cxk6W<;96idhh3Lo|kyQ z#<+KJOMKb^BO@awh9pK7xV;A5}$Y=(60j#dC!AQ`EgTa4AFGAg1BY7iE zhUO0&!OC0@0Ii75$~f67(myLZ*7D~*vnxhwMqG?671zLezzWW0801cVcY~2T&Pl4G z=ODjDxbYnmTcAPQK)3#a8ss>E;a>P29d?^djY)#)ljYR&jTDV|fDX4u7<5Ky^9LTj zrcIlc&9Ry6_D=Z$Pzf*4AMOYW^+#Ieht)s=vL5M%IP)dN-li7lXzINZH(Aqlt( H!9ptmp!5D3 literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-cmaf-01/floor/lo/seg_0002.m4s b/wai/pack-conformance/packs/video-cmaf-01/floor/lo/seg_0002.m4s new file mode 100644 index 0000000000000000000000000000000000000000..537675bb8b0778d248e219010d0f66ec0f021573 GIT binary patch literal 1940 zcmY*Z2~d+q6yAggDOVGWA%r6VLqJew=NBV_^(qP~LO65;QrrWys&zW{?Vp%HX5Q@Xd*6HC_ulRwgpf$5 z&(~^n>TCo*vTAfW2H1w{a?}PEaU#S*9tkwFn=#w6G6(P@r&uJbLl!3sYjSh5AjH#T zWveX^}JLo5r4K%b@7Tlo;O@R;>^>((N~9s@WEQX<%} zf!`3AKbROS089Yp1?CAxd}G0UtSj-4Jd-?vCvk$8fe}nFm=tV07&-fbk+>9$oC%KP zkiF2llDeec$ohV87J*5u{}?AF4I*wM$B}Uy`GhAQvV}#NKkEd z&wuuKW3Rkd9v65Txlmb5KL~dk@CdOT>e+H z7(&L^p*BZ_95+zouq#i9i>!eyQgnNV<4_y$yGzB!Yj%96UrxY!*Sj)`k9nvrQEZRo zQDW@DavI2FT%|;8r}wu_8+vXP^l||%U~~UEW{0ami;&~SAGW(%cbQ8n{xt$t1R_7P z2UJj64Du@MuFeV7oPxW1b6pACXSBwpFjqgDxKbL1Gp=#tAyxHF&*ff`!ab=p%*Mav ztyE?XWm@0}U^@-2uydSWjvnl2rsU0gU_3I8>+m6KjEqMRnlhFOz;Z5s#}MOYI(F%Z z-=FqSvi6o- zmrb6WpI)BvHM`^|(13078AzK+l{Ea_Im#PTwg#9vT-kf6-!uJPlYZw4Xgb`coJK(0 z(-f0o20aS9ZgS0%)Iw8JH240~+NDQIFpx#q^^%wA6IN)NBd>#LMUEEw>$Gim(^O~i z=DrfS2RfeGXoO3cZdXc%a{a;C=!2d$?|n)`;TfaFUf=dnx4@021bB8O8L<&QBc_Y$ zs3``{F~5<;6M00`hgl*|@E69~?h|6{gwmQyq2k zKw|hY7iBOd#7dh0X4ZZF_f{vHDPNp4nz!dMJy%k<ST7AcDK-sO9$&n~M$Ozc zSF!Lww&T5)?c=+u%#g8kgbbL95*|UCjho4EUf;eoWpMtgurFW2KY+?6fC*kZReSA1 z;XpRLyL20ODH*)k&=Ms{x*c@B-eIQhh4zDV_{=g^yuAWOUhym{1b>Kj&aAYInxy$x d9UU?#=9ihhVrwP^=XyRG)bR$BaMrS-{{i%-AIJaz literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-cmaf-01/floor/lo/seg_0003.m4s b/wai/pack-conformance/packs/video-cmaf-01/floor/lo/seg_0003.m4s new file mode 100644 index 0000000000000000000000000000000000000000..90c0b6fca9da987db67ab71168d964f8216d7550 GIT binary patch literal 1019 zcmZQzV2~&-sVvAXPRU>Z0uY^BoLK>6niOZIR4{@B85kHDg!~)8tfU7J8q5KTGcd0Q z$w39rfPM{qzxG%mWY(3rIbMJ zV_<;TQ&Un@n#aJv#0pd=3B*^JfCLa20xYVN!pTTXR6cNLhqI*@1zf0VpJDUJ+8O!FG51 z{r?uWAM(9z)Ez@ajB3L3=aaG(*iH;G^o5dkxB3Uyv_3x z57-#@E^diWJ78pF#Kh19SIp?Za7n3WcOz%~#Rs7R6GPtU7I{hYF`l})v~&pz?^dxp zdmk$n7^xUBGqO0qEttS?Uu*lqt=A7+-6a40h*4mV<_zJS1|uOO7ACe1h$^6S92nXa zfMTpH92XS8P6LazIRM4jIJhNT5Mq4?fMVj9t@(ODTMTSfY3Wyf0n+-G*hNX>|gk)`4qSPxji*$ji+$?tA3a>qGI zRrDO>w+J`BV`2+5h#TnEUr>V_CotR#-=o8Bv#BvjP<^tTdcKjO5f9Me_6UQ{C~f}0 z!`HNF)3P}>lil7aKL9G>1^UAsVa8p1S83T9OIw?^upj;Kifyq3&EWn!zkf>3br^S8Fz zEv+wQUaXh;-V}1eNXAH*h2zu@s0yGT?|629TK(j&mrd)21|vx$5e{xC8>lQW&@c3P ztos<2dSV06Zczc=q!fh4+p8+BHWdGHOp7>n`Lntb&<|n^{;PVx3Lvos6cUHK7cL|L JcOh74B>+Y4|7HLH literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-cmaf-01/floor/lo/seg_0004.m4s b/wai/pack-conformance/packs/video-cmaf-01/floor/lo/seg_0004.m4s new file mode 100644 index 0000000000000000000000000000000000000000..1948711274de584a9063db08f1762ed597159934 GIT binary patch literal 1467 zcmZ9K2}~1d6vw|A2B=uIMS2Z~#V8V1a2Q#(f-$IQ)S%X*y3r+;TDl^XVbv)oHh_Ecpo`68A`iB@z+> zcpif(!Bk*TVDVrIFwA1WhWm^L@8>wid7Q)EANy;g19E%KoqpS9#^-mnPHG-^ zuVg;^RwHZtv}}38j>eqM_fKzx>VMD3SA}q_oC)DMgu<@D_Bgabje16XJav;{6%0jC zf!zI#;p~JTv}`03Mv6H90=PSsYIX!8qJ~Jk%!&J~I+$!NS`(|xy;OF2CST9WmanOnrxdD-K|Uow9;#KhntSrGJQFOBwb-xa6--*N{QdWb4BO>+dHRM-F7c z@13HSPt^LhiEGipR;-qd>aScAcE1xUr<39LB|_!h2TT4eg1bC3Tl~S>z;pLzyjXWa z6y4!geaFoyzM}!%St9ZO)j}&*YEvf6o}-r4`YGt%X-$tz=>a|m)&CO6`Tt(ovpxgh C<9&w! literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-cmaf-01/key.hex b/wai/pack-conformance/packs/video-cmaf-01/key.hex new file mode 100644 index 000000000..f1f5c260b --- /dev/null +++ b/wai/pack-conformance/packs/video-cmaf-01/key.hex @@ -0,0 +1 @@ +dd0a68c39958d90953634b6c1070e75dc5a5900d134e53f6b0dd35f0cec7abaa diff --git a/wai/pack-conformance/packs/video-cmaf-01/package/LISTING b/wai/pack-conformance/packs/video-cmaf-01/package/LISTING new file mode 100644 index 000000000..117677835 --- /dev/null +++ b/wai/pack-conformance/packs/video-cmaf-01/package/LISTING @@ -0,0 +1,47 @@ +688cb303ccb16fcdd21c8cb681f936ba813829e71fbf15df0ccb28b04c134447 dash/classic.mpd +a3aa7658db9b85a9d9a1fed977825189f75c5adad0f5fdfcd70ebd604824c138 dash/mobile.mpd +3f520749a6d2f231cddfd17804ee3629439f3678515e424c44e36cff54d89de9 dash/tv.mpd +03ab06e026880875581952f91232405077be9a522dbf739b6a9d093458369710 floor.listing +14cdbe56c8f57b1427ab9c2a9ebf6669ce8edec06fd7cd0961a01d2aaf720889 floor/hi/14cdbe56c8f57b1427ab9c2a9ebf6669ce8edec06fd7cd0961a01d2aaf720889.m4s +759f476ce9e9b003d7d797060f9c039141d261dd65212035e96bb157783423c1 floor/hi/759f476ce9e9b003d7d797060f9c039141d261dd65212035e96bb157783423c1.m4s +d3616b6368fc800ce421a492fbd0f6263b9e06ee0af1e8269ce4f20d5cb3653d floor/hi/d3616b6368fc800ce421a492fbd0f6263b9e06ee0af1e8269ce4f20d5cb3653d.m4s +e5583297b1456e46366fe3317784fadf8c165c5e16e864629b194dc46290387e floor/hi/e5583297b1456e46366fe3317784fadf8c165c5e16e864629b194dc46290387e.m4s +eb559df9571de1869981ca82672abbabad528b294b15a1d7bf9b635761c584f8 floor/hi/eb559df9571de1869981ca82672abbabad528b294b15a1d7bf9b635761c584f8.m4s +a8a19ef9cd4d540037ef298097bbc5317de6a99690c8c4a745cc867c034208d6 floor/hi/init.mp4 +0e0407f5a552e405846a411627df17537e5c31accca37390c391a7c1d27353af floor/lo/0e0407f5a552e405846a411627df17537e5c31accca37390c391a7c1d27353af.m4s +10b19654062fa37b83c082c922f54529725c36a4ead953b1fbfbbee14d4e79a8 floor/lo/10b19654062fa37b83c082c922f54529725c36a4ead953b1fbfbbee14d4e79a8.m4s +2c484c9bead2b261ac1a18c2aedec11761813f995d11dc9779c5f9b039d59b73 floor/lo/2c484c9bead2b261ac1a18c2aedec11761813f995d11dc9779c5f9b039d59b73.m4s +a855b2701af4e7c8c912448be9fc023f911b4e9e94b65770393c4df6d705b5e8 floor/lo/a855b2701af4e7c8c912448be9fc023f911b4e9e94b65770393c4df6d705b5e8.m4s +c29687008dafdf251b2ca962c3e830f785b38a56c81aee1f4c86f2e8f9115fcc floor/lo/c29687008dafdf251b2ca962c3e830f785b38a56c81aee1f4c86f2e8f9115fcc.m4s +6dd501e27365ce9ef90576771aad73de4d200362e6974551847afc3c90604344 floor/lo/init.mp4 +ebdc7e40aecbe8b61124ac78f233b0dfaf2a8c5674d3fc9bb023935de1d9b6cb hls/classic/floor-hi.m3u8 +66f5eb8b89b80e7da839b23f39665eb85480c6a725fa29d93556efee673c1b9e hls/classic/floor-lo.m3u8 +d793737b69231eface4951001e65b3c52cba864f231246a41e64d49c77ebdc97 hls/classic/master.m3u8 +d793737b69231eface4951001e65b3c52cba864f231246a41e64d49c77ebdc97 hls/legacy/master.m3u8 +8c3b5e2b18192b383c8df8675acd435b861a2585bc6eaf0c09292754f44a8cef hls/mobile/master.m3u8 +c4044eca76959c9f87230484a2b207fb12c0bcaedb8d921eab806014fca53cb8 hls/mobile/wai-v.m3u8 +60a6378f46afc9308dc4ac4d138602b16568577616ea0bf4526b142d86899151 hls/mobile/wai.m3u8 +8c3b5e2b18192b383c8df8675acd435b861a2585bc6eaf0c09292754f44a8cef hls/tv/master.m3u8 +ff4edf2929e380d205c1c74156621185feec53d593ffa968b8dfaf0d05448bcd hls/tv/wai-v.m3u8 +5d42147b308330913c3d9c8a868ca83ce4d3f3e460da8d84c84014eb24aaf9d7 hls/tv/wai.m3u8 +649330bcfaaee54f802f6b4ddf6e459daca8bb0e8df86c87a9d6bd0d65cd09ea index-v.wsix +68f00abff5ef19f074d510f8cce4592afc2a1d4981a87663965a46dc8bcbe1d3 moq/catalog.json +9f381e2ab764b5e14770b00503c1c90b9c22ba22f87464b2869a70644af11939 objects/08797901ff55d0bb4afba5cffe95df64b7e216f3a0c9ba82006133bb9b6d7f16.wai +07e98fb9ef9ff3fa6bf04f9078da2a3d2423e586feea1061256131a1d1fbb943 objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai +d5f9cdd996920e07339b79093b9e4e5cb4237f1780f268220cc6f89c79aea90a objects/399048a078b0f2983149266a44eaf207cfa63f490212b69389fba4d72f62c60f.wai +cfb71256ef44758ea279846a8938823994d321abce83ef73afd2ed269a8e0259 objects/618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481.wai +f3eedf9eb2870c0160801397412e7a4c3aca4a6e16f1a69a276e1356d38c9220 objects/61c7c3b7ccab07ed01df5b0d7ca0240598b914dbf2cabe545aa001e8de12d365.wai +d03f0813c266294f84483cfe4db177d094c06b95ab3a8471d6b2ec53401f05a7 objects/a236e9070d10fd09342cafdbf6973edd35e5266cf850fe2f38f77536ac803912.wai +2316616549f7f92dc29e34fe656c332c9f4a1e20f4be26396976407acc792ba4 objects/a3ae43406f9966487b6c5f5a4d56e9dca50c327423fcfd2a98f4c342d1dbfaf9.wai +b2a40a9a8cec3dcaf6c92a07d6765203c412c57ec879b7e33a52eabb2e74609d objects/c2ce1907255a041c388afd06ccd007436368e8d20467fdec2a1eebbb84b03bf2.wai +6d665f1bef3784cbb428abc28724f74fa83c8f2bc812828621c93c5514b6dc0e objects/c5253efe2949669bb9df01d9f60c01f2570ba4be1c0af26105e092dfccf90d30.wai +0acecba00acc28e313805189fd826ad3a9fab1fe69727ef2d5999fc543426289 objects/c81171fa53998cfe94207ad66ab9b53cfbd4b3f058730e62512ca9f0f6ef2ea3.wai +f3bd9cbe3c2518c997a4d1d3a32145a04f55ef53e0b5760a6ce6aa5e14fe06a7 objects/dea0f6415f639fca99d91a0341aba164078a1bd4780e21d72cbf2234928272ec.wai +d22c4f8ac8a5de43bbec6be04ea8b6da72f2bd133f8f57a31607362670178c68 objects/f467872fe8d3cd1f60f832c997cc14fd00abbf601c61286a612089b4a53a195a.wai +f1f4e32ba9f76e36431d97e0fd52b9025075f553bf6b9f63c484d60573c8ea90 package.receipt.json +517630d9bee1f5559baff3bb3e642f6aa7b5276226f6e3bdba4f3f9724794859 plan-v.txt +428e24f9e1c62fc5590ce3d3a6239a5c274dcfc1391a2ea2abe8dc0562da7d20 policy.json +9d2b4c15ac17ee074f646d0b1ed11ef56557f633ff67a3e6a6d0eb4dd1596548 policy.toml +2f5807b891b8eb0a44b76c4303487be1dcf19e111f06f6c642e14b81c85d7c4d stages/legacy.json +8695fff48ca86321c5198e3a8cf660ccba208df4f40fd1907e76c64a52674cf5 stages/mobile.json +6ae56077cfc368a59489233eeee6ee7fd97437821822637ac62096ab93c85286 stages/tv.json diff --git a/wai/pack-conformance/packs/video-cmaf-01/package/dash/classic.mpd b/wai/pack-conformance/packs/video-cmaf-01/package/dash/classic.mpd new file mode 100644 index 000000000..737f43910 --- /dev/null +++ b/wai/pack-conformance/packs/video-cmaf-01/package/dash/classic.mpd @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wai/pack-conformance/packs/video-cmaf-01/package/dash/mobile.mpd b/wai/pack-conformance/packs/video-cmaf-01/package/dash/mobile.mpd new file mode 100644 index 000000000..d3340daa2 --- /dev/null +++ b/wai/pack-conformance/packs/video-cmaf-01/package/dash/mobile.mpd @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/wai/pack-conformance/packs/video-cmaf-01/package/dash/tv.mpd b/wai/pack-conformance/packs/video-cmaf-01/package/dash/tv.mpd new file mode 100644 index 000000000..f0817bb2c --- /dev/null +++ b/wai/pack-conformance/packs/video-cmaf-01/package/dash/tv.mpd @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wai/pack-conformance/packs/video-cmaf-01/package/floor.listing b/wai/pack-conformance/packs/video-cmaf-01/package/floor.listing new file mode 100644 index 000000000..1e4f809b4 --- /dev/null +++ b/wai/pack-conformance/packs/video-cmaf-01/package/floor.listing @@ -0,0 +1,12 @@ +a8a19ef9cd4d540037ef298097bbc5317de6a99690c8c4a745cc867c034208d6 hi/init.mp4 +14cdbe56c8f57b1427ab9c2a9ebf6669ce8edec06fd7cd0961a01d2aaf720889 hi/seg_0000.m4s +e5583297b1456e46366fe3317784fadf8c165c5e16e864629b194dc46290387e hi/seg_0001.m4s +d3616b6368fc800ce421a492fbd0f6263b9e06ee0af1e8269ce4f20d5cb3653d hi/seg_0002.m4s +eb559df9571de1869981ca82672abbabad528b294b15a1d7bf9b635761c584f8 hi/seg_0003.m4s +759f476ce9e9b003d7d797060f9c039141d261dd65212035e96bb157783423c1 hi/seg_0004.m4s +6dd501e27365ce9ef90576771aad73de4d200362e6974551847afc3c90604344 lo/init.mp4 +0e0407f5a552e405846a411627df17537e5c31accca37390c391a7c1d27353af lo/seg_0000.m4s +c29687008dafdf251b2ca962c3e830f785b38a56c81aee1f4c86f2e8f9115fcc lo/seg_0001.m4s +10b19654062fa37b83c082c922f54529725c36a4ead953b1fbfbbee14d4e79a8 lo/seg_0002.m4s +a855b2701af4e7c8c912448be9fc023f911b4e9e94b65770393c4df6d705b5e8 lo/seg_0003.m4s +2c484c9bead2b261ac1a18c2aedec11761813f995d11dc9779c5f9b039d59b73 lo/seg_0004.m4s diff --git a/wai/pack-conformance/packs/video-cmaf-01/package/floor/hi/14cdbe56c8f57b1427ab9c2a9ebf6669ce8edec06fd7cd0961a01d2aaf720889.m4s b/wai/pack-conformance/packs/video-cmaf-01/package/floor/hi/14cdbe56c8f57b1427ab9c2a9ebf6669ce8edec06fd7cd0961a01d2aaf720889.m4s new file mode 100644 index 0000000000000000000000000000000000000000..3d6538a6af6748967bd9291736570490687c81b0 GIT binary patch literal 2217 zcmZ8h3pA8z82;vO@F&)=8jRa?m&*SBRa?%uB$aI)sc1_#vo2AtnZ!A%e|MQih*Kxm zT%wia)T)&_R*j0BPA-wCbf{LR?W8M|^S%E+gAg)}k;O-a z#{`BT_``d6OlTY&9b!TQ<9HZEh=+{UGvlYJ|9~cUphX|i1j*YH9vK-750%dAu-&mxq@_~b*v~|=J$55SMW#q zakoIBUQnAxwWL_~mu*$jmee#Q zgOGMB%ma1?wY=4@emLg;tX6)OcBRcIK98?XH_1&l`nvSlyV4evHbF9KmG^9Y7dk3_ z=<;{!E~8B;lCLjNV_W(yW7NiMKs05{_4JPR1dQy93~jogtr zZH^GYm>@q?aQe1Lg^q3#1B8&TZ#c*m)T|hOvT2%N0Q4dVoIat) zv#So<``9a+0=>o5xYwf6Hg!QDtI43_fi8FLF8An#NzSU960~&#a_w|ICaFv$7?|X2 zLZ{E4Gw&!gPuSvH)eHUR^7RJGIRA>#4RH@$!G1nzc=A10Q59_S=_bUr5eOaPIJn}# zQS0e5i-52di*7e^MCVXl=9}*r+L&653VlsE;=I%Qqae4N3^aa?YU*QS->T<8P-=PL zbxMlgmHxZ-Fa)Ki26~e8qnp+s;0}|CQt$xJQkPEjRsgt*(I}br9A_US7zXeDG{dO_ZnqS3u~mUC^xZC;tgZ@jcweSDt(zxFYuID zZQD5pb8trm_gaBhmDPRUzV&bXDAy1=PX%hk#R2!|P(>`1c<}YUaxF>JnASGWy_XhI z>qx_V+zWf*2$yqCW@r};yUAfpo@zNTcja|>U>V?E8vf-L+5`A~@z$`f^S$;$4A&f2eJueg>UEkEA~1v}XQD&kyQVj=_I7pecm{8f3IKfAXd|6&wz z@Ny$e>=%^jlA$)_rdY|Hu6390UVw0cgm#NM*VEB1U6ED}A%gjOJ?f0(#hjb3aq1A# zuuz>im3^#O3HTlj8_C>;3weNtX;>70N!ncm))B0M>Or;>JIlw0Xc&JK>!4x^WRK=U mqkS3%H6Ck+u(3?TAh%}CRR*3(tlACmSfG+U~z zbTLb_vZ*#pZ8aa@t}`)dKC^a6DK9bEs`n0)U@}8y`ZGOA_Vgc>s*hX^?Nr*a|sV4<3|I@G!wN z@QV$@2?h%tQb z4Gahh!&REg_NSv1B4b<5$ssV!y_lO9U-ndQcv1c6ye)5#>MQ5H5>X8yl25FSgW|4q z4(6u7}5d;!QvpztH@;Wf;8G7 z|8CL+fz#h<{rGdt=I6=xbhw?X4_imh?KrB>^~!rb6vr!#T9bd@sx;K-es;c7T1>ql0>XDby`ZB(6 z##l$dK+>?-x;w3fo_^A$@xTt%a)Th=yPEX+m}h6&iyUdoNztvxWM_zIlWC@_x?2H;W@rEfAO1 z{S?~nm$I?>$(70z(POHS`_AN~?r_l^$#X;0}>M_mEnr7!Fvv#v7#~1RP;Xv9K9+L~QUR zC8hv)s8oVNCCWue1bfOjR)oP_di~2k2fps1pJjrn0g2$jVgif$`Fj^o@XhbC>GNIjE z3mOH9ENJ&<3)DJ7r$M6YREJS0196-1W%^wjS5aB6HVW z9PlWjcy{gZkjtaceX_>f4z#|uWP&O+`y z4y#=^nM*_FgX3$N7N|8?ZiGayNhV+i1VYGE0|@#Zf=-MsQo`4)jpLGtxtY3u`-FxH z(G}UvBPl9&*k*M-Wvl+Ep9=Qyu^7X41#2sqYDt9hkwp`hOxvSAcst!saQFl0{nGU+`VL+9DXwf6Vgn}m>JXzl8oBtF`BSUOBRXIMwXOeOq?~uOp;pOvQ$GYwxl#s z+e(h4l%x{|VuVV{!u6oSZBq;V4?g;b)@_(9OPk6MwmJ|1wi0UrSp0U1m% z4frtv!$MOnLH!I2(@*Mb&Dva3F&)O6HKk&6mS#OsO*Cuv|5SzspV)VThwaS-V`86) z{=}N2(P{WP)iQ}#p{EB>^09&9H82&~MWI2(V5tw0I~K58l&vT`xv0$i_`hMv(<&3% zd~+CC%6-2kDPQ-^?zVM*z6>_c;6>LLrPpSO{DZ7d^wia}oCl6Ocx*3dxmoGq+ZC3p zva@HE__V(7%Ms^#XNI`+wGZ{J+jfDMdc5+AenI@jxf?B=z0t3RTaClhcAxsC^T}W7 zf||^;Uy#b^{3`?A=lUxmw>;P&zr4l*>NdEuHk-YtclGrIIo~ez`xSHRZ@y~iNi?Lg z1GpO(9(JtS6PNFXZhoUv%HO1x`5LjSvyHQuR>N`Trn74g?F?|Q`M}ZcSC>~bzmAz> zXyf^owtVxAbNTlNn+5G6hc^`twP6>R$W-TlsEWKRtG^V%7GH{*-_}*yX)5jtYpzy> z3cM1-&GK{fd^-5IHvIXhNsq?NJMH{&ZKs{Obg1h{bWpD6`jH;?!lAB%>df=^Mm>1K zJ6(bPF@@2MgL+C!?NQZ+@SR(hqz8T%{=l}s-lXy_NBNVBRx(L^iZ$P9QNYX5y6>-K1s{n9emcj>xCJI?HX(n2Z>k4qT5%3qmKm}EFY>YP#6 zp!#siWJgMD?cJ=u19gjeA9M9m2n0V)a=Wg;AyLZVE?9N|{cZg0)q) zAAt0oO+61q^3Wb$MIAzi^{DhxA#RqAuwVlk1Kx^5E%RS^%X_~QHUhRGhuwG!ZzTgZ z4Jrv_<52U-10$05qpo>?J(Hx{8HKmv5OdgwOdY5khfwf(mxW7Nqow86rP11bPC&t+ zOs5axiWtNcW`cleIMlI~_w#yIp@-ll3ixag^+&uJgIK_3lM!<;hYlYtyZEFVsp5Il zjLgx;!zd=3Ma&$6n8Dm8Le@uK9-ot%^hq7h`jkLmLDub#z+~HnduCk?->nUFt*P`~{kY&tw7ZARZ=F>yKIU@~6WE5va7@9w9nxAqH3bW1%VA%> zhBrijYX_ACF>&beo`2#KB^Y-BF_Q=}hT+LfV>jnfEZtPHjes0L&=VvGpH2wt3r9Yo{g zRi{a90P#x>!&QX8avHb=p3wf*HXN$S^j>M;ck<%R_sL(wRKfjFs06^Vo`2YX_ literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-cmaf-01/package/floor/hi/e5583297b1456e46366fe3317784fadf8c165c5e16e864629b194dc46290387e.m4s b/wai/pack-conformance/packs/video-cmaf-01/package/floor/hi/e5583297b1456e46366fe3317784fadf8c165c5e16e864629b194dc46290387e.m4s new file mode 100644 index 0000000000000000000000000000000000000000..7385852449e2f4b49345f9fdc6b5f563b472b1a3 GIT binary patch literal 873 zcmZQzV2~&-sVvAXPRU>Z0uY^BoLK>6niOZIR4{@B85kHDg!~)8EbUKV3Q7Q_nPow8 z5J`qJx%v5NKskZjw2Ty}8YUpUrKBhkBra0|5@%wt0J4F4cQ*iOV@8N2A|+`lB~beq z7$El4loXZbF)%Q(0@XHahRfhpY=T$zlkI=My_9BFe|T@M>?|Fl zZ3;%}MvM=D%9w!x%IMm_=)iFP$^E+P%j6%w)~mCskv85?d2%h9%tpiD{y}?M(h?Rxof&$nQu)0>D5E}=#gbPBb2`I!a zz?+cK3~~xs6-bDK!GA?BLRF2CiV-J6^M{RKRjvns?zkjSr|_PU@z|Y;r43&yPn|y> z$s-Tc$i>J~aSfp{2Pni1bl5M1@gN}{pu6l5sxp8=yg+xkBUFKe_)y&i65>a7R|e4E z0uNyB0=s_B2O}*bK}P0J8-V5uIDn#GgyG71CY7gmji1^2AFmeL-*I2`?)?XHi8gVp zK>b2YY*km_YFQW}fMUWd9H)LDi3I?~L^!ymY|z9+1$dKE(8RZ0uY^BoLK>6niOZIR4{@B85kHDg!~)8tfU7J8q5KTGce17 zvsVONc&0}C-Vg;&`1mY`9KmrJifmjoWMUb#Ckd2Jh(D=x5AbmPWdXdcmu|0Z~j#0MQH)YXFL|FtK$YiM2Nv2^z7oa9mITTLMxPcD)g)kl@!~=AfJwjCmP>2`kE_Z|~kPsiLyFfzxsP4)D z`di=u%w1sD&-q}aWhBVR{AmNwd;teg^ouZDS5N03S2DyHkxY*w%za9wEC3|Z zjyYl(TW60>Q~>ZP3lCS^w^EbD1f6S9?*#m6MMZpO#P^$r(@D)S*^GRek-KUw1c=HBzQiMCwDUp^dvvq%KhFVIdHksP8>Z6g@-b<#weN zx2OY?Iiyn2-?IUmal6U(CFV5#2z8FP^wmEZ~=>RxocGNrU JM4hO6@D04WTgdC-zYpnte zR9Y0Zs93cXts*K=DLN)dH3dIViy{$4EZW+R0uJq9j$`rQL%fB8wSi>?3D9M#bXFIl^pC~SY1idq7(O1hGH6lY)K+M6h5m6hl2|k7l7f zGUVHFP>mf2@j+O2UT8%;P(PY$kE1>6LoquqREIbrT(qJ*_-;*Vl~U*F2|Ik!fO?Zr zLVm^KV%4zq!tfiO5i(-=?3dGuro0fm*Yjsi%c-N<{Gz^wxY)M36J<%~m-Ome4;Acr zy!&y6?#uegPt;?R1`NvUhTT10>dRWw=Q7#3=4Q>J1^pX*a*qi|E<`>^*;jj>)gIFJ zpLWH4V^r9bmVvTsJFa$kOiQ@9V02AZ>EfK3JK_YXF|(7}%d7t#rNEwX@M{z1$A^oqeEJb7 zA=oUoy^g{u%KxZxa#qe(E4!iww3AcDj8;X1|4qTyvH zPeebVNFm|L;T@D)fziO=u8f%O+p(u=jii9^=JJUWW>j}-`_K5JLs2l$S0XfaF)d$WB zJgXlT`&RZ=kfB60moF`}HG&-Xt`sTu44$r(Ycm@ax8#8LxO)PM7Io#>=qLi!V=gCc#2ehAt}iU_F_ zGbCYJ-lg?ke)T3_3h<{pu>#tCYp><{_j>FHY2#g)iEplb%h!Ed;>u{infVI01`T|8 znS&Y)ek~+pTN<2Wjw`3{pN}E+->g7#8SU5Iu!`LeBj!o?vSo}$r>gj^ArO8WJ8-p= z2@iHeJVV?U;O>1~n|AO9yad?xwmn-?AoC8}`-OFmfr2AXELY>4vQ{IEO5pJJJB@mD zM%t(cSr^i>~x{cC+cVw3JbrdzH{fsImOSD79kY08MZ7{c390tgvc)!Yh3>61$rf|@Ga z?S?f-*9*o*l4hK1AOJg)?S0>tK~Lhd<};BKR;F8`jzrFZ2bjg-)!6$$REyFw8Rysh zWT+d;p9&Z3eJ3nP-^rS=vv@AA!}B62kmCv|$*x=8VFv2C3?TZjjlwrJ`Q`5&px~No zoX{Zk+UmXXxaNnO{~p*0eOd<={eQaY_V#qics*YMr_(v0Xob4JD?Xn3q-F>vu4ll| R>B5Q!))e@JZhjgg{~xLLQIG%t literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-cmaf-01/package/floor/lo/10b19654062fa37b83c082c922f54529725c36a4ead953b1fbfbbee14d4e79a8.m4s b/wai/pack-conformance/packs/video-cmaf-01/package/floor/lo/10b19654062fa37b83c082c922f54529725c36a4ead953b1fbfbbee14d4e79a8.m4s new file mode 100644 index 0000000000000000000000000000000000000000..537675bb8b0778d248e219010d0f66ec0f021573 GIT binary patch literal 1940 zcmY*Z2~d+q6yAggDOVGWA%r6VLqJew=NBV_^(qP~LO65;QrrWys&zW{?Vp%HX5Q@Xd*6HC_ulRwgpf$5 z&(~^n>TCo*vTAfW2H1w{a?}PEaU#S*9tkwFn=#w6G6(P@r&uJbLl!3sYjSh5AjH#T zWveX^}JLo5r4K%b@7Tlo;O@R;>^>((N~9s@WEQX<%} zf!`3AKbROS089Yp1?CAxd}G0UtSj-4Jd-?vCvk$8fe}nFm=tV07&-fbk+>9$oC%KP zkiF2llDeec$ohV87J*5u{}?AF4I*wM$B}Uy`GhAQvV}#NKkEd z&wuuKW3Rkd9v65Txlmb5KL~dk@CdOT>e+H z7(&L^p*BZ_95+zouq#i9i>!eyQgnNV<4_y$yGzB!Yj%96UrxY!*Sj)`k9nvrQEZRo zQDW@DavI2FT%|;8r}wu_8+vXP^l||%U~~UEW{0ami;&~SAGW(%cbQ8n{xt$t1R_7P z2UJj64Du@MuFeV7oPxW1b6pACXSBwpFjqgDxKbL1Gp=#tAyxHF&*ff`!ab=p%*Mav ztyE?XWm@0}U^@-2uydSWjvnl2rsU0gU_3I8>+m6KjEqMRnlhFOz;Z5s#}MOYI(F%Z z-=FqSvi6o- zmrb6WpI)BvHM`^|(13078AzK+l{Ea_Im#PTwg#9vT-kf6-!uJPlYZw4Xgb`coJK(0 z(-f0o20aS9ZgS0%)Iw8JH240~+NDQIFpx#q^^%wA6IN)NBd>#LMUEEw>$Gim(^O~i z=DrfS2RfeGXoO3cZdXc%a{a;C=!2d$?|n)`;TfaFUf=dnx4@021bB8O8L<&QBc_Y$ zs3``{F~5<;6M00`hgl*|@E69~?h|6{gwmQyq2k zKw|hY7iBOd#7dh0X4ZZF_f{vHDPNp4nz!dMJy%k<ST7AcDK-sO9$&n~M$Ozc zSF!Lww&T5)?c=+u%#g8kgbbL95*|UCjho4EUf;eoWpMtgurFW2KY+?6fC*kZReSA1 z;XpRLyL20ODH*)k&=Ms{x*c@B-eIQhh4zDV_{=g^yuAWOUhym{1b>Kj&aAYInxy$x d9UU?#=9ihhVrwP^=XyRG)bR$BaMrS-{{i%-AIJaz literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-cmaf-01/package/floor/lo/2c484c9bead2b261ac1a18c2aedec11761813f995d11dc9779c5f9b039d59b73.m4s b/wai/pack-conformance/packs/video-cmaf-01/package/floor/lo/2c484c9bead2b261ac1a18c2aedec11761813f995d11dc9779c5f9b039d59b73.m4s new file mode 100644 index 0000000000000000000000000000000000000000..1948711274de584a9063db08f1762ed597159934 GIT binary patch literal 1467 zcmZ9K2}~1d6vw|A2B=uIMS2Z~#V8V1a2Q#(f-$IQ)S%X*y3r+;TDl^XVbv)oHh_Ecpo`68A`iB@z+> zcpif(!Bk*TVDVrIFwA1WhWm^L@8>wid7Q)EANy;g19E%KoqpS9#^-mnPHG-^ zuVg;^RwHZtv}}38j>eqM_fKzx>VMD3SA}q_oC)DMgu<@D_Bgabje16XJav;{6%0jC zf!zI#;p~JTv}`03Mv6H90=PSsYIX!8qJ~Jk%!&J~I+$!NS`(|xy;OF2CST9WmanOnrxdD-K|Uow9;#KhntSrGJQFOBwb-xa6--*N{QdWb4BO>+dHRM-F7c z@13HSPt^LhiEGipR;-qd>aScAcE1xUr<39LB|_!h2TT4eg1bC3Tl~S>z;pLzyjXWa z6y4!geaFoyzM}!%St9ZO)j}&*YEvf6o}-r4`YGt%X-$tz=>a|m)&CO6`Tt(ovpxgh C<9&w! literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-cmaf-01/package/floor/lo/a855b2701af4e7c8c912448be9fc023f911b4e9e94b65770393c4df6d705b5e8.m4s b/wai/pack-conformance/packs/video-cmaf-01/package/floor/lo/a855b2701af4e7c8c912448be9fc023f911b4e9e94b65770393c4df6d705b5e8.m4s new file mode 100644 index 0000000000000000000000000000000000000000..90c0b6fca9da987db67ab71168d964f8216d7550 GIT binary patch literal 1019 zcmZQzV2~&-sVvAXPRU>Z0uY^BoLK>6niOZIR4{@B85kHDg!~)8tfU7J8q5KTGcd0Q z$w39rfPM{qzxG%mWY(3rIbMJ zV_<;TQ&Un@n#aJv#0pd=3B*^JfCLa20xYVN!pTTXR6cNLhqI*@1zf0VpJDUJ+8O!FG51 z{r?uWAM(9z)Ez@ajB3L3=aaG(*iH;G^o5dkxB3Uyv_3x z57-#@E^diWJ78pF#Kh19SIp?Za7n3WcOz%~#Rs7R6GPtU7I{hYF`l})v~&pz?^dxp zdmk$n7^xUBGqO0qEttS?Uu*lqt=A7+-6a40h*4mV<_zJS1|uOO7ACe1h$^6S92nXa zfMTpH92XS8P6LazIRM4jIJhNT5Mq4?fMVj9t@(ODTMTSfY3Wyf0n+-G*hNX>|gk)`4qSPxji*$ji+$?tA3a>qGI zRrDO>w+J`BV`2+5h#TnEUr>V_CotR#-=o8Bv#BvjP<^tTdcKjO5f9Me_6UQ{C~f}0 z!`HNF)3P}>lil7aKL9G>1^UAsVa8p1S83T9OIw?^upj;Kifyq3&EWn!zkf>3br^S8Fz zEv+wQUaXh;-V}1eNXAH*h2zu@s0yGT?|629TK(j&mrd)21|vx$5e{xC8>lQW&@c3P ztos<2dSV06Zczc=q!fh4+p8+BHWdGHOp7>n`Lntb&<|n^{;PVx3Lvos6cUHK7cL|L JcOh74B>+Y4|7HLH literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-cmaf-01/package/floor/lo/c29687008dafdf251b2ca962c3e830f785b38a56c81aee1f4c86f2e8f9115fcc.m4s b/wai/pack-conformance/packs/video-cmaf-01/package/floor/lo/c29687008dafdf251b2ca962c3e830f785b38a56c81aee1f4c86f2e8f9115fcc.m4s new file mode 100644 index 0000000000000000000000000000000000000000..74171d12cf37630911486c49494280811c03c617 GIT binary patch literal 1019 zcmZQzV2~&-sVvAXPRU>Z0uY^BoLK>6niOZIR4{@B85kHDg!~)8EbUKV3Q7Q_nb(8l zAd(Dca`W@kfN}!4X&EU{HB3NyOG!~8NL;1_B+kTO0b~R9?rs3mhKvwPL`u?9N}%>J zFhK07DJd$=V_;xn1*($-;wvD-fWQ!lb%EFfh}D2t1Pu!V`HDcS0i~6JGzf#lK^UYS zB(DU-azHE%<-_EGG}GhUl*AG)E}#sP`lH;M0}4jUA`Hq73=9oGAyM;+kXjA4yW8*o zx3K+??`@;*7$O??lr6zX+lcW2P!TgQI2m0JI9_0Q5a^s1cxk6W<;96idhh3Lo|kyQ z#<+KJOMKb^BO@awh9pK7xV;A5}$Y=(60j#dC!AQ`EgTa4AFGAg1BY7iE zhUO0&!OC0@0Ii75$~f67(myLZ*7D~*vnxhwMqG?671zLezzWW0801cVcY~2T&Pl4G z=ODjDxbYnmTcAPQK)3#a8ss>E;a>P29d?^djY)#)ljYR&jTDV|fDX4u7<5Ky^9LTj zrcIlc&9Ry6_D=Z$Pzf*4AMOYW^+#Ieht)s=vL5M%IP)dN-li7lXzINZH(Aqlt( H!9ptmp!5D3 literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-cmaf-01/package/floor/lo/init.mp4 b/wai/pack-conformance/packs/video-cmaf-01/package/floor/lo/init.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..2f94c3ac72712cf4e59f6bcae567664aede847ef GIT binary patch literal 788 zcmaJ;%}N6?5T4ds=|M^lMS6%((1Vt)KRp+`^dNXr5WK`DrAs%>vPpxAh`xaD;ahm{ zDLncNg2y_O?YglRhs}Q9H}hq(n*jhewzp|)^f5pc2yykf>qRO(iZJ)7v~~cHC^r#^ zWi-wny{G`-Q^qfW=@mUFo$FW?H+ ziLpKteyQJE(MrS|YfOpt|9<}FckWL_k}Z3Hi-jyW;RR|vI4|JR2ivI^~;& zpV<+4tt~Q19tx`0=UKv*{N32=1o^YErWgo$9%yKY6k*Ri!|=C#W--C8VA zw782-o}do38mj8fhq`}d$Tm}MQbg)QYtvYNok)G4HlsoyHc{UNnkafkI>_xRCvQ+Q zn|Y*C(Lb;Op9{+|ajB$7s%?iOz_DdKP3e|?VlU3;+7VSm~Xi&B9<%qKyar?<9(ICn-+@gOP%!smti(g31+aX z5UOC}AoqjZ%gn$8@&+7)LRm&Y8saBr6!~_jJV-w$5Tol~0F~DO(mY^!RQ)PtQqDdT zkEwr@+MASWE}6EKwKzdbf%p1umIpUEI*oEC&4wBPrTzl}3y{qO<$vQT(h{6v$=WjY zo%hU%^K7q3t0;lx1U+f{+986G;hrU71kL$ zMQ(pOwJ#)U0pp8%LYGtTsX^Qei*%4*ki-AK^EBtugL{L@CkQ1y5;mQhvQC!mM9j-I zD-BfYG=lYYCNxQb4Sw`)6&-~;yI1b9xK!9vNCE@>q9bz7gJRw;4 zD|lwlzbOh;*RpnQwfTKz^M{CHzNA2%l^?#n*ITSlW%~or>?bz;!=eoy{?GuSSNcb` z9~}Om!k7pEaxVzL${%vmKeg;fPydO1T%G%R>O!+EnAJ8(9{TqCPZZD2@{kvW2M<}z z+`FZ5RWihru;Lcv7v%D%HAt-a_GNMR+G!p>9)EQL%N80=>)~d(>0%Le)%K_1=B@7{ zzy`q5|BEElKwD(?lATxJFQEL(4N*D8R}! z7$20ZQ(zn*4UBhmB@7JzK@bdpl4VQ`C1q?3x%o+%IjL+6IjQN1$(14u<%yYkWtl0d Y`FfdoCGolWC7Jnoyhx&nWriSY0Dbf>DF6Tf literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-cmaf-01/package/moq/catalog.json b/wai/pack-conformance/packs/video-cmaf-01/package/moq/catalog.json new file mode 100644 index 000000000..a1f4775a6 --- /dev/null +++ b/wai/pack-conformance/packs/video-cmaf-01/package/moq/catalog.json @@ -0,0 +1 @@ +{"tracks":[{"altGroup":1,"isLive":false,"name":"v/l0","namespace":"video-cmaf-01","packaging":"wai","renderGroup":1,"role":"video","wai_capabilities":["wai.video.int_motion"],"wai_determinism":"decode-equivalence","wai_receipt_alias":2923025889890445,"wai_receipts":true,"wai_receipts_track":"v/l0/receipts","wai_staged":{"layer":0,"lead_ms":null,"set":"v"}},{"altGroup":1,"codec":"av01.0.00M.08","height":36,"name":"hi/floor","namespace":"video-cmaf-01","packaging":"cmaf","renderGroup":1,"width":64},{"altGroup":1,"codec":"av01.0.00M.08","height":18,"name":"lo/floor","namespace":"video-cmaf-01","packaging":"cmaf","renderGroup":1,"width":32},{"isLive":false,"name":"v/l0/receipts","namespace":"video-cmaf-01","packaging":"wai-receipts"}],"version":1} diff --git a/wai/pack-conformance/packs/video-cmaf-01/package/objects/08797901ff55d0bb4afba5cffe95df64b7e216f3a0c9ba82006133bb9b6d7f16.wai b/wai/pack-conformance/packs/video-cmaf-01/package/objects/08797901ff55d0bb4afba5cffe95df64b7e216f3a0c9ba82006133bb9b6d7f16.wai new file mode 100644 index 0000000000000000000000000000000000000000..65f62269aea73787a501fbeec0ac428bbca5d7bc GIT binary patch literal 2648 zcmZ{kdr%Ws6vmerF(Q;l5hNhQtq-I~?{1P!!thd2(J~Yt_*U3tH?j%|gorYTOCJ_+gWV-sYUy>*X<&7bgEhdq8B5b(w=5F{q_i4PEFdYR z5-1gNxsp)HNv(F5CRa)+m4dKLG=nu7Vbd8f zEg@GhN*O5!Dj?S?3Av0?5^61}f}tc$(KKMyas{l$$Ve8}Q;=##Nl4XFH3e9Lkx`aG z8fn8K7A_F~2V zH?ZsCE!UzkPI>q||5uyO41Tz^^O@$x%cI3d2hA{-dTNAh*2cIU;N!$?CDr-grn@%p zTkYgICZr~$D}F}V>e7NL-IlnVYTq+I5u;YfRsAn6!|F;_h6^&HJzl4z&AfR)mS0%a zRrSy4$2GsOeX%j>Q8bhk|})6NWinhf{&?ChXcvm+D*HNe^rC z_LEUVttKBJbP(E`8uGlSB}BFpQ4*`c4>$@$Cc7+Gf)YlD<||r~!dol+tezo2By@4J z^IU7c{c-NDEKgsn?hTwo?qyLt$)yC>t&guKAqHnRFObj6b?ch(VDI-sg95DazTg{) z*nERGoZl1vNlQOCl}N^mtrjofhLuhg^Oo9od2S&lqI~K z8f)1>b;^>vaa#b2_4~T9Q)z|MTM)EAYN-eMc*~-LF>MlSSwAqW_N$hzPsO5cN39P# zx=LU|d%*<*+LL&+=2G9B*$Gu`sKRieb4LYFSJ^dn`K>4fH&W!j`86M1r44*{4mB3& z<|SLsi(WR$|d_jvr7<?C-Dl4 zhlBmqR_gXT`pHgmRBV|4yoKFphSAurE7zf`H$|~oy*Te z;W0wzFMJUZR$tgSBD&4r${+?)MD9B+*)0qfz~fstZ*VO8FfI=bI@XTT;yCdvm8n2# zTpzlFeva??I~(5zt~TM+V+k70G#grPXZr{FUO@jdGwi@buxxASAMp_`?ODh$vkzB! zc~{V^=l=@P4{CNFv>4|R7k*#hhtTKR;3T%)>|-O2twVF0Z-X0a8_XnOdfuUW6ui)e z*DD`rT(!z1u};+w&`H+K_I7slQ*_hD&mOuJ$LrDL)mU-l2D`;IWQJX8nR4v%VblO4 zaJ**kc+lKLs|pVyM6J;IfxRAjWb3(Se1FLz_fmU#$CmYb%&39IeaeRozj$~%Qd9br z-t#$kQ5gc$*$VewnkK=*gWa7ZT5OuFa<9J2cxNO^ZRk_@bj+kq9?RIL@V3(vPnyuq TGwnLIT#A;Zm7VLJc$@zN6b$1i literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-cmaf-01/package/objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai b/wai/pack-conformance/packs/video-cmaf-01/package/objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai new file mode 100644 index 0000000000000000000000000000000000000000..b15b5310886cf0f3076b32c2b77264e58fd7b1d0 GIT binary patch literal 39826 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

YmH;T^6RA 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 literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-cmaf-01/package/objects/618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481.wai b/wai/pack-conformance/packs/video-cmaf-01/package/objects/618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481.wai new file mode 100644 index 0000000000000000000000000000000000000000..04de3f1885449c337a118064bc77123ef3814311 GIT binary patch literal 25514 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 LNgU4&(V+hW7Cne_ literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-cmaf-01/package/objects/a236e9070d10fd09342cafdbf6973edd35e5266cf850fe2f38f77536ac803912.wai b/wai/pack-conformance/packs/video-cmaf-01/package/objects/a236e9070d10fd09342cafdbf6973edd35e5266cf850fe2f38f77536ac803912.wai new file mode 100644 index 0000000000000000000000000000000000000000..cb34695f2dda5026c7ee1917e92a753c01890855 GIT binary patch literal 2251 zcmZ`&dsGxv7#~)IjfZD>EiYG=$&^~$?#%AY&Ms*9I2egQ$5g_{GP8S^24xqPmCb|5 zrpFgVZ4Xm|Gzg1Mnj}z~Jj-+BB!Wm!P05p%nH5;1SXOs;Y8L+Jk9*F{{J!t^xZgLc z7iJK{ei&AcJ6Rq#;Dj3B$#@Yo^DKHR+v9TsooO{@cYifm@M(P)Py zn|M1c^5W&Vi7jS1ek1SLjH(f(+DoBk%Lu$888_LiX5PWuth}`VHp3&0WeBfVL}mORb10qBqh+(AN;|Y7AJC3;OE(pxw9uReG%N>b2uPY? z0HdQQhR{=_MNg0#QVS@c({WJGQY2~SEIN&zqglNf=rvl3(a?Gw;knUL=y0IWrHGcG zbY@0NQa}$V3qw#^njts~sYk6OOS3G19Hm2QW-SSko{r?q458sP91S30*3zDfbg=dU zhz3%QTkLERM6_Cvj6a1NG;}iV#0|8zqT*%%h9zMbHXEHZbYjs#lg5H27#5BN1))dD z(Xl!skdk+&$*?+X8-^)cFy$px-petHuGKI2mmF)$GQD*9GF_GB?mia!X09`Tytm?w ztJr-BHFzake{FQ^M)Nm^gOWxfC`Z!G{D`r1%O7!TM&Lk6B3Qp_Xx6%|$HyAO>oa$J zowsG%!gtzTHQ0w=sPOL|IJ9~GqjjI1iB2sVnbwzJIUl;fH7jBCFutm?%%;P|#-!TZ6+16Xt6e&t@OE;PvFnSARBWv40914~o|(I+ z-4y=&EQMcELDv2T5KXNwys+%V+4VK%XhqYOPxmDDS~^=++#dZq>OnY>mX|#*INp#q zR6R(wRtAq)G6zGxeQl>-%Q@=mk>hByFI(lT+hKPHi9Z%LBdrtY{&+~H*X<%*JGfPhy3fFXe z`+no=c@ys27n=3s&8-az)%yB(kN*|6s-V0g+vymT564>FiJ!O5lwzk-mhO5&k^Ek3 zuQSltcq;+zK{!UngK0f33=25tSp&2-Qf%;QU7zz->Y^1yv``WO{Qdl=lvH)d1t=T@ zNTe=LHzq+WF09HmM?i2O^$(Q^NVNwX7#;obhE}R$4fBatvA!6gvu}wBn^8# z&BsykfB+_)LE1_j&d!*a!@I27!8AJBDM9w|1>oSG#!UQmh#v&016+vuL@ z=F32fIElpGDgJ9^o*y4gI11pBz-#&cs%=+d-(=U!*)Our_753v_E{OeFXOSzoAO0B zbEIK=M}2UP*q0=eYo8VX&uqF?S2VYq-WK~FQpTO?o75*pPsR?ejPU_oOB~~3lX{X- z#0f+IOf?BKLbQhgDcY-cp(X1v;?lsaWqp4SXO1=Gzh8R(l|r{7 zedaw|>l31<+RlGi5K;j~wC&yIo?jRD|M`J)?e8I9s|$boP4%T}pyj9ThUJ&e*+mh< z)HL}I30!kPs+h*h)%($r;ESDf)9Rt_Uk<%BJ#6JCJGY$e5os2P5nUdy`QpGAx;+!< z`R~`;Pt6ttlwgrko|@ymW3NE}?tSf72>Rl9biFZt$Js8CdI@%*|D10YN)bqx1YVL& z0+I#hB#^Nr!_1 z8`{!ebU(X1XvsQJFjE;-E7Z9>A(e9l!TUiLcHqP$f|IrrWmzq<=$w>OAKs}reSU74 F>mR0bu}=U1 literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-cmaf-01/package/objects/a3ae43406f9966487b6c5f5a4d56e9dca50c327423fcfd2a98f4c342d1dbfaf9.wai b/wai/pack-conformance/packs/video-cmaf-01/package/objects/a3ae43406f9966487b6c5f5a4d56e9dca50c327423fcfd2a98f4c342d1dbfaf9.wai new file mode 100644 index 0000000000000000000000000000000000000000..47c02f7c0adcdd04a24a1b2823f5706528ad0381 GIT binary patch literal 1380 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 bxgBY@5%KXhDVueAQ1qo2i}6y{*ZjOI^HwNn literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-cmaf-01/package/objects/c5253efe2949669bb9df01d9f60c01f2570ba4be1c0af26105e092dfccf90d30.wai b/wai/pack-conformance/packs/video-cmaf-01/package/objects/c5253efe2949669bb9df01d9f60c01f2570ba4be1c0af26105e092dfccf90d30.wai new file mode 100644 index 0000000000000000000000000000000000000000..f09447b3f922c9f1dec0de9f4d9b1cf378eb5211 GIT binary patch literal 2503 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 DKF1hx literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-cmaf-01/package/objects/f467872fe8d3cd1f60f832c997cc14fd00abbf601c61286a612089b4a53a195a.wai b/wai/pack-conformance/packs/video-cmaf-01/package/objects/f467872fe8d3cd1f60f832c997cc14fd00abbf601c61286a612089b4a53a195a.wai new file mode 100644 index 0000000000000000000000000000000000000000..37b7e5f13399a4f274df111ebb1d372150576596 GIT binary patch literal 1858 zcmZ{jeNYr-9LM*L11>^^OU~nX>D&w*Lwt7k_U&*SFm%Krhf1`m9N4{mRyW{|j^ltq z>`-z*EMF#?h(wtjB}i!|r!l9O(`;%=8&k{|Fq9@IoHVUeYBYQ94xfc)`s10Kz0dRg z{=UE8Z+BIGA$8h75DjFlq>(O?$^m3HSqT+QLQerrfnM~idHm4hM}PQWRfXo3{4jjU ztH6p3Em4I6o zd7gDbfv4P*n`R_Yloi=2P?4<2s`P)tq3%k#LT%mGL#PA)u1zvNp3 z(Lx$X)hAU#Wa|Xk0;={Mt3Yh%pnNEf{p{7RCLg$iBWVcL_z}kG0q;T zTo-cC=L|_iCwhE1X#A*k-rS-2s<&j-$V2SjIx1u5)X)Fk{N@YEpT-zg58qk6&tzKi zlbQ>I%0S*19qp}gTNq>8N)uQ{UCViQZf9mzf$&J|2TS`qTMX5kOJ*~+_cmSW_+iDh zL;Z>Kf9y)+k>Pp;PXD_45w6v_6Hg+22x)I3Aq7E-$J zm%6idbQhh!J9;X%>>C$MjS1Q#&C*s76ABVU+)31Akl5%TF3tMq@M(}1r89uZV46sW zpO8NjUo5spu?55#&A|s^B1p749*dGkf!Q=ADN5SH&b52yRhKtr*j9hp^i^S~D?D-w zL8pKObMo#yz50*Nr}l2e(Gruaphbs6he9e`lo^%U!BmGm^nHXzD$G3C{cA?u)->ad zl<19QkVNcy+CHvF={8|tF~nbX>tI8ARAB?tjpm#0>)>>6LQ3vHcNvarHBCvrHO|qn zhEjh&m|yuMc*yKB6dlE(O-%k-ir2JgHzEr?BLnG$dH==3=ZvdqctH*`>i!JH(k zvrY%a8PUO|g1HX+v9BYbEr`}_-F|r5q0o+%E3h(~*i~ZFl~p)m&V-0anR=$@64WDt z$r1G=^nW7aH`X~h;>ElBUJ?CI096cAmA z1FM!8<1Z%Zs&kj0|E?T=i-iS=_o9}OFJhszF literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-cmaf-01/package/package.receipt.json b/wai/pack-conformance/packs/video-cmaf-01/package/package.receipt.json new file mode 100644 index 000000000..a3c5c253b --- /dev/null +++ b/wai/pack-conformance/packs/video-cmaf-01/package/package.receipt.json @@ -0,0 +1 @@ +{"asset_id":"video-cmaf-01","components":[{"id":"v","index":"index-v.wsix","index_digest":"826e8554322dd535930f822c863f9fd51b609a82006f4ae14cfcdb6b97c4d0d2","media_class":"video","stage_root":"e31fe8e71bd0afaaa9a6a9294203d9a57d9a2925d9bf761ca7acd22e047ae34e"}],"energy_provenance":null,"grant":{"capability":"wai.video.package","funds_ceiling":null,"grant_hash":"0000000000000000000000000000000000000000000000000000000000000000","joule_ceiling_micro":null},"joules_micro":0,"kind":"package","packager":"builtin:wai-pack@0.1.0","parent_kind":"none","parent_receipt_hash":null,"policy_digest":"e12e58d39aa275ce422973435ff58aa70c4a7f1dca1958aee507fad458743adb","receipt_hash":"9e8eb989cbf451c8c17f4cce653a385cf80ab38ed10cf0e29d6e14bba51e760f","sig":"690967e5c99530f332714137e515551c9ce9deada03ed91a13b08149967918429455b04dd15e4c90b015c88eb1a0754f916de57f049094af409cd2439a6a180f","signer_id":"did:key:z6MkfikoLLY6JqXALCaUNmhSCdjtb8Nc3JQU4CioucVJcWS4","signer_pubkey":"12d3e959dc5e44fa2706d7eaf13f0a08af19209accae28933c2e8c512bfb3a89","stored_bytes":127966,"total_bytes":140530,"total_entries":15,"unique_objects":12,"version":2,"work_units":15} \ No newline at end of file diff --git a/wai/pack-conformance/packs/video-cmaf-01/package/plan-v.txt b/wai/pack-conformance/packs/video-cmaf-01/package/plan-v.txt new file mode 100644 index 000000000..c7196c34c --- /dev/null +++ b/wai/pack-conformance/packs/video-cmaf-01/package/plan-v.txt @@ -0,0 +1,5 @@ +0 +60 +85 +135 +160 diff --git a/wai/pack-conformance/packs/video-cmaf-01/package/policy.json b/wai/pack-conformance/packs/video-cmaf-01/package/policy.json new file mode 100644 index 000000000..65f7012a8 --- /dev/null +++ b/wai/pack-conformance/packs/video-cmaf-01/package/policy.json @@ -0,0 +1 @@ +{"asset_id":"video-cmaf-01","class":[{"floor_only":false,"id":"tv","max_layer":0},{"floor_only":false,"id":"mobile","max_kbps":100,"max_layer":0},{"floor_only":true,"id":"legacy","max_layer":0}],"classify":{"motion_high_milli":9000,"static_mad_milli":300,"static_permille":5,"synthetic_bins":12},"component":[{"id":"v","media":"video","source":"video-base-01.y4m","timebase":{"den":1,"num":25}}],"defaults":{"deadline_ms":1500},"floor":{"extra_keyframes":false,"supplied_form":"cmaf","supplied_listing":"03ab06e026880875581952f91232405077be9a522dbf739b6a9d093458369710"},"ladder":[{"capability":"wai.video.int_motion","component":"v","id":"b0","params":{"block":16,"max_sse_px_milli":30000,"mv_precision":1,"q_candidates":[16,12,8],"search":4},"role":"base"},{"capability":"wai.video.av1","component":"v","id":"hi","params":{"source":"supplied"},"role":"floor"},{"capability":"wai.video.av1","component":"v","id":"lo","params":{"source":"supplied"},"role":"floor"}],"lead":"v","live":{"layer_lag_ms":[0]},"moment":[],"royalty_free_only":true,"rule":[],"schema":"wai.pack.policy/1","segmentation":{"closed":true,"cut_abs_permille":300,"cut_rel_permille":3000,"cut_window":8,"lookahead_frames":6,"max_ms":4000,"min_ms":1000,"scene_cut":"wai.pack.scenecut/1","target_ms":2000}} \ No newline at end of file diff --git a/wai/pack-conformance/packs/video-cmaf-01/package/policy.toml b/wai/pack-conformance/packs/video-cmaf-01/package/policy.toml new file mode 100644 index 000000000..3d37355bd --- /dev/null +++ b/wai/pack-conformance/packs/video-cmaf-01/package/policy.toml @@ -0,0 +1,55 @@ +schema = "wai.pack.policy/1" +asset_id = "video-cmaf-01" +royalty_free_only = true +lead = "v" + +[[component]] +id = "v" +media = "video" +source = "video-base-01.y4m" + +[component.timebase] +num = 25 +den = 1 + +[segmentation] +target_ms = 2000 +min_ms = 1000 +max_ms = 4000 + +[[ladder]] +id = "b0" +component = "v" +capability = "wai.video.int_motion" +role = "base" +params = { block = 16, search = 4, mv_precision = 1, q_candidates = [16, 12, 8], max_sse_px_milli = 30000 } + +[[ladder]] +id = "hi" +component = "v" +capability = "wai.video.av1" +role = "floor" +params = { source = "supplied" } + +[[ladder]] +id = "lo" +component = "v" +capability = "wai.video.av1" +role = "floor" +params = { source = "supplied" } + +[floor] +supplied_form = "cmaf" +supplied_listing = "03ab06e026880875581952f91232405077be9a522dbf739b6a9d093458369710" + +[[class]] +id = "tv" +max_layer = 0 + +[[class]] +id = "mobile" +max_kbps = 100 + +[[class]] +id = "legacy" +floor_only = true diff --git a/wai/pack-conformance/packs/video-cmaf-01/package/stages/legacy.json b/wai/pack-conformance/packs/video-cmaf-01/package/stages/legacy.json new file mode 100644 index 000000000..0a7faedee --- /dev/null +++ b/wai/pack-conformance/packs/video-cmaf-01/package/stages/legacy.json @@ -0,0 +1 @@ +{"class":"legacy","components":{"v":{"pieces":[{"dur":60,"floor_only":true,"p":0,"stages":[],"start":0},{"dur":25,"floor_only":true,"p":1,"stages":[],"start":60},{"dur":50,"floor_only":true,"p":2,"stages":[],"start":85},{"dur":25,"floor_only":true,"p":3,"stages":[],"start":135},{"dur":40,"floor_only":true,"p":4,"stages":[],"start":160}]}},"policy_digest":"e12e58d39aa275ce422973435ff58aa70c4a7f1dca1958aee507fad458743adb"} diff --git a/wai/pack-conformance/packs/video-cmaf-01/package/stages/mobile.json b/wai/pack-conformance/packs/video-cmaf-01/package/stages/mobile.json new file mode 100644 index 000000000..d1e9b65fe --- /dev/null +++ b/wai/pack-conformance/packs/video-cmaf-01/package/stages/mobile.json @@ -0,0 +1 @@ +{"class":"mobile","components":{"v":{"media_playlist":"../hls/mobile/wai-v.m3u8","pieces":[{"dur":60,"floor_only":true,"p":0,"stages":[],"start":0},{"dur":25,"p":1,"stages":[{"bytes":9950,"h":"61c7c3b7ccab07ed01df5b0d7ca0240598b914dbf2cabe545aa001e8de12d365","layer":0}],"start":60},{"dur":50,"floor_only":true,"p":2,"stages":[],"start":85},{"dur":25,"p":3,"stages":[{"bytes":9950,"h":"61c7c3b7ccab07ed01df5b0d7ca0240598b914dbf2cabe545aa001e8de12d365","layer":0}],"start":135},{"dur":40,"floor_only":true,"p":4,"stages":[],"start":160}]}},"policy_digest":"e12e58d39aa275ce422973435ff58aa70c4a7f1dca1958aee507fad458743adb"} diff --git a/wai/pack-conformance/packs/video-cmaf-01/package/stages/tv.json b/wai/pack-conformance/packs/video-cmaf-01/package/stages/tv.json new file mode 100644 index 000000000..dfd23b59c --- /dev/null +++ b/wai/pack-conformance/packs/video-cmaf-01/package/stages/tv.json @@ -0,0 +1 @@ +{"class":"tv","components":{"v":{"media_playlist":"../hls/tv/wai-v.m3u8","pieces":[{"dur":60,"p":0,"stages":[{"bytes":39826,"h":"24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d","layer":0}],"start":0},{"dur":25,"p":1,"stages":[{"bytes":9950,"h":"61c7c3b7ccab07ed01df5b0d7ca0240598b914dbf2cabe545aa001e8de12d365","layer":0}],"start":60},{"dur":50,"p":2,"stages":[{"bytes":35882,"h":"c2ce1907255a041c388afd06ccd007436368e8d20467fdec2a1eebbb84b03bf2","layer":0}],"start":85},{"dur":25,"p":3,"stages":[{"bytes":9950,"h":"61c7c3b7ccab07ed01df5b0d7ca0240598b914dbf2cabe545aa001e8de12d365","layer":0}],"start":135},{"dur":40,"p":4,"stages":[{"bytes":25514,"h":"618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481","layer":0}],"start":160}]}},"policy_digest":"e12e58d39aa275ce422973435ff58aa70c4a7f1dca1958aee507fad458743adb"} diff --git a/wai/pack-conformance/packs/video-cmaf-01/policy.toml b/wai/pack-conformance/packs/video-cmaf-01/policy.toml new file mode 100644 index 000000000..3d37355bd --- /dev/null +++ b/wai/pack-conformance/packs/video-cmaf-01/policy.toml @@ -0,0 +1,55 @@ +schema = "wai.pack.policy/1" +asset_id = "video-cmaf-01" +royalty_free_only = true +lead = "v" + +[[component]] +id = "v" +media = "video" +source = "video-base-01.y4m" + +[component.timebase] +num = 25 +den = 1 + +[segmentation] +target_ms = 2000 +min_ms = 1000 +max_ms = 4000 + +[[ladder]] +id = "b0" +component = "v" +capability = "wai.video.int_motion" +role = "base" +params = { block = 16, search = 4, mv_precision = 1, q_candidates = [16, 12, 8], max_sse_px_milli = 30000 } + +[[ladder]] +id = "hi" +component = "v" +capability = "wai.video.av1" +role = "floor" +params = { source = "supplied" } + +[[ladder]] +id = "lo" +component = "v" +capability = "wai.video.av1" +role = "floor" +params = { source = "supplied" } + +[floor] +supplied_form = "cmaf" +supplied_listing = "03ab06e026880875581952f91232405077be9a522dbf739b6a9d093458369710" + +[[class]] +id = "tv" +max_layer = 0 + +[[class]] +id = "mobile" +max_kbps = 100 + +[[class]] +id = "legacy" +floor_only = true diff --git a/wai/pack-conformance/packs/video-floor-only-01/floor/hi/init.mp4 b/wai/pack-conformance/packs/video-floor-only-01/floor/hi/init.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..af7fc6d9dc1201185942fa2d43659adcbca8bc7d GIT binary patch literal 788 zcmaJ;%}N6?5T4eHlpc!oP^5yHkxY*w%za9wEC3|Z zjyYl(TW60>Q~>ZP3lCS^w^EbD1f6S9?*#m6MMZpO#P^$r(@D)S*^GRek-KUw1c=HBzQiMCwDUp^dvvq%KhFVIdHksP8>Z6g@-b<#weN zx2OY?Iiyn2-?IUmal6U(CFV5#2z8FP^wmEZ~=>RxocGNrU JM4hO6@D04WTgd|^S%E+gAg)}k;O-a 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 literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-floor-only-01/floor/hi/seg_0003.m4s b/wai/pack-conformance/packs/video-floor-only-01/floor/hi/seg_0003.m4s new file mode 100644 index 0000000000000000000000000000000000000000..ac02ab23e272a47b2c108501e3683748b9190b9d GIT binary patch literal 873 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 R>B5Q!))e@JZhjgg{~xLLQIG%t literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-floor-only-01/floor/lo/seg_0001.m4s b/wai/pack-conformance/packs/video-floor-only-01/floor/lo/seg_0001.m4s new file mode 100644 index 0000000000000000000000000000000000000000..74171d12cf37630911486c49494280811c03c617 GIT binary patch literal 1019 zcmZQzV2~&-sVvAXPRU>Z0uY^BoLK>6niOZIR4{@B85kHDg!~)8EbUKV3Q7Q_nb(8l zAd(Dca`W@kfN}!4X&EU{HB3NyOG!~8NL;1_B+kTO0b~R9?rs3mhKvwPL`u?9N}%>J zFhK07DJd$=V_;xn1*($-;wvD-fWQ!lb%EFfh}D2t1Pu!V`HDcS0i~6JGzf#lK^UYS zB(DU-azHE%<-_EGG}GhUl*AG)E}#sP`lH;M0}4jUA`Hq73=9oGAyM;+kXjA4yW8*o zx3K+??`@;*7$O??lr6zX+lcW2P!TgQI2m0JI9_0Q5a^s1cxk6W<;96idhh3Lo|kyQ z#<+KJOMKb^BO@awh9pK7xV;A5}$Y=(60j#dC!AQ`EgTa4AFGAg1BY7iE zhUO0&!OC0@0Ii75$~f67(myLZ*7D~*vnxhwMqG?671zLezzWW0801cVcY~2T&Pl4G z=ODjDxbYnmTcAPQK)3#a8ss>E;a>P29d?^djY)#)ljYR&jTDV|fDX4u7<5Ky^9LTj zrcIlc&9Ry6_D=Z$Pzf*4AMOYW^+#Ieht)s=vL5M%IP)dN-li7lXzINZH(Aqlt( H!9ptmp!5D3 literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-floor-only-01/floor/lo/seg_0002.m4s b/wai/pack-conformance/packs/video-floor-only-01/floor/lo/seg_0002.m4s new file mode 100644 index 0000000000000000000000000000000000000000..537675bb8b0778d248e219010d0f66ec0f021573 GIT binary patch literal 1940 zcmY*Z2~d+q6yAggDOVGWA%r6VLqJew=NBV_^(qP~LO65;QrrWys&zW{?Vp%HX5Q@Xd*6HC_ulRwgpf$5 z&(~^n>TCo*vTAfW2H1w{a?}PEaU#S*9tkwFn=#w6G6(P@r&uJbLl!3sYjSh5AjH#T zWveX^}JLo5r4K%b@7Tlo;O@R;>^>((N~9s@WEQX<%} zf!`3AKbROS089Yp1?CAxd}G0UtSj-4Jd-?vCvk$8fe}nFm=tV07&-fbk+>9$oC%KP zkiF2llDeec$ohV87J*5u{}?AF4I*wM$B}Uy`GhAQvV}#NKkEd z&wuuKW3Rkd9v65Txlmb5KL~dk@CdOT>e+H z7(&L^p*BZ_95+zouq#i9i>!eyQgnNV<4_y$yGzB!Yj%96UrxY!*Sj)`k9nvrQEZRo zQDW@DavI2FT%|;8r}wu_8+vXP^l||%U~~UEW{0ami;&~SAGW(%cbQ8n{xt$t1R_7P z2UJj64Du@MuFeV7oPxW1b6pACXSBwpFjqgDxKbL1Gp=#tAyxHF&*ff`!ab=p%*Mav ztyE?XWm@0}U^@-2uydSWjvnl2rsU0gU_3I8>+m6KjEqMRnlhFOz;Z5s#}MOYI(F%Z z-=FqSvi6o- zmrb6WpI)BvHM`^|(13078AzK+l{Ea_Im#PTwg#9vT-kf6-!uJPlYZw4Xgb`coJK(0 z(-f0o20aS9ZgS0%)Iw8JH240~+NDQIFpx#q^^%wA6IN)NBd>#LMUEEw>$Gim(^O~i z=DrfS2RfeGXoO3cZdXc%a{a;C=!2d$?|n)`;TfaFUf=dnx4@021bB8O8L<&QBc_Y$ zs3``{F~5<;6M00`hgl*|@E69~?h|6{gwmQyq2k zKw|hY7iBOd#7dh0X4ZZF_f{vHDPNp4nz!dMJy%k<ST7AcDK-sO9$&n~M$Ozc zSF!Lww&T5)?c=+u%#g8kgbbL95*|UCjho4EUf;eoWpMtgurFW2KY+?6fC*kZReSA1 z;XpRLyL20ODH*)k&=Ms{x*c@B-eIQhh4zDV_{=g^yuAWOUhym{1b>Kj&aAYInxy$x d9UU?#=9ihhVrwP^=XyRG)bR$BaMrS-{{i%-AIJaz literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-floor-only-01/floor/lo/seg_0003.m4s b/wai/pack-conformance/packs/video-floor-only-01/floor/lo/seg_0003.m4s new file mode 100644 index 0000000000000000000000000000000000000000..90c0b6fca9da987db67ab71168d964f8216d7550 GIT binary patch literal 1019 zcmZQzV2~&-sVvAXPRU>Z0uY^BoLK>6niOZIR4{@B85kHDg!~)8tfU7J8q5KTGcd0Q z$w39rfPM{qzxG%mWY(3rIbMJ zV_<;TQ&Un@n#aJv#0pd=3B*^JfCLa20xYVN!pTTXR6cNLhqI*@1zf0VpJDUJ+8O!FG51 z{r?uWAM(9z)Ez@ajB3L3=aaG(*iH;G^o5dkxB3Uyv_3x z57-#@E^diWJ78pF#Kh19SIp?Za7n3WcOz%~#Rs7R6GPtU7I{hYF`l})v~&pz?^dxp zdmk$n7^xUBGqO0qEttS?Uu*lqt=A7+-6a40h*4mV<_zJS1|uOO7ACe1h$^6S92nXa zfMTpH92XS8P6LazIRM4jIJhNT5Mq4?fMVj9t@(ODTMTSfY3Wyf0n+-G*hNX>|gk)`4qSPxji*$ji+$?tA3a>qGI zRrDO>w+J`BV`2+5h#TnEUr>V_CotR#-=o8Bv#BvjP<^tTdcKjO5f9Me_6UQ{C~f}0 z!`HNF)3P}>lil7aKL9G>1^UAsVa8p1S83T9OIw?^upj;Kifyq3&EWn!zkf>3br^S8Fz zEv+wQUaXh;-V}1eNXAH*h2zu@s0yGT?|629TK(j&mrd)21|vx$5e{xC8>lQW&@c3P ztos<2dSV06Zczc=q!fh4+p8+BHWdGHOp7>n`Lntb&<|n^{;PVx3Lvos6cUHK7cL|L JcOh74B>+Y4|7HLH literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-floor-only-01/floor/lo/seg_0004.m4s b/wai/pack-conformance/packs/video-floor-only-01/floor/lo/seg_0004.m4s new file mode 100644 index 0000000000000000000000000000000000000000..1948711274de584a9063db08f1762ed597159934 GIT binary patch literal 1467 zcmZ9K2}~1d6vw|A2B=uIMS2Z~#V8V1a2Q#(f-$IQ)S%X*y3r+;TDl^XVbv)oHh_Ecpo`68A`iB@z+> zcpif(!Bk*TVDVrIFwA1WhWm^L@8>wid7Q)EANy;g19E%KoqpS9#^-mnPHG-^ zuVg;^RwHZtv}}38j>eqM_fKzx>VMD3SA}q_oC)DMgu<@D_Bgabje16XJav;{6%0jC zf!zI#;p~JTv}`03Mv6H90=PSsYIX!8qJ~Jk%!&J~I+$!NS`(|xy;OF2CST9WmanOnrxdD-K|Uow9;#KhntSrGJQFOBwb-xa6--*N{QdWb4BO>+dHRM-F7c z@13HSPt^LhiEGipR;-qd>aScAcE1xUr<39LB|_!h2TT4eg1bC3Tl~S>z;pLzyjXWa z6y4!geaFoyzM}!%St9ZO)j}&*YEvf6o}-r4`YGt%X-$tz=>a|m)&CO6`Tt(ovpxgh C<9&w! literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-floor-only-01/key.hex b/wai/pack-conformance/packs/video-floor-only-01/key.hex new file mode 100644 index 000000000..d5721a934 --- /dev/null +++ b/wai/pack-conformance/packs/video-floor-only-01/key.hex @@ -0,0 +1 @@ +9775a49bc0d2b258d9ef766516894be1dda63647f1a68a264d1c63d30aa3b4a1 diff --git a/wai/pack-conformance/packs/video-floor-only-01/package/LISTING b/wai/pack-conformance/packs/video-floor-only-01/package/LISTING new file mode 100644 index 000000000..7af1ca5b9 --- /dev/null +++ b/wai/pack-conformance/packs/video-floor-only-01/package/LISTING @@ -0,0 +1,33 @@ +688cb303ccb16fcdd21c8cb681f936ba813829e71fbf15df0ccb28b04c134447 dash/classic.mpd +03ab06e026880875581952f91232405077be9a522dbf739b6a9d093458369710 floor.listing +14cdbe56c8f57b1427ab9c2a9ebf6669ce8edec06fd7cd0961a01d2aaf720889 floor/hi/14cdbe56c8f57b1427ab9c2a9ebf6669ce8edec06fd7cd0961a01d2aaf720889.m4s +759f476ce9e9b003d7d797060f9c039141d261dd65212035e96bb157783423c1 floor/hi/759f476ce9e9b003d7d797060f9c039141d261dd65212035e96bb157783423c1.m4s +d3616b6368fc800ce421a492fbd0f6263b9e06ee0af1e8269ce4f20d5cb3653d floor/hi/d3616b6368fc800ce421a492fbd0f6263b9e06ee0af1e8269ce4f20d5cb3653d.m4s +e5583297b1456e46366fe3317784fadf8c165c5e16e864629b194dc46290387e floor/hi/e5583297b1456e46366fe3317784fadf8c165c5e16e864629b194dc46290387e.m4s +eb559df9571de1869981ca82672abbabad528b294b15a1d7bf9b635761c584f8 floor/hi/eb559df9571de1869981ca82672abbabad528b294b15a1d7bf9b635761c584f8.m4s +a8a19ef9cd4d540037ef298097bbc5317de6a99690c8c4a745cc867c034208d6 floor/hi/init.mp4 +0e0407f5a552e405846a411627df17537e5c31accca37390c391a7c1d27353af floor/lo/0e0407f5a552e405846a411627df17537e5c31accca37390c391a7c1d27353af.m4s +10b19654062fa37b83c082c922f54529725c36a4ead953b1fbfbbee14d4e79a8 floor/lo/10b19654062fa37b83c082c922f54529725c36a4ead953b1fbfbbee14d4e79a8.m4s +2c484c9bead2b261ac1a18c2aedec11761813f995d11dc9779c5f9b039d59b73 floor/lo/2c484c9bead2b261ac1a18c2aedec11761813f995d11dc9779c5f9b039d59b73.m4s +a855b2701af4e7c8c912448be9fc023f911b4e9e94b65770393c4df6d705b5e8 floor/lo/a855b2701af4e7c8c912448be9fc023f911b4e9e94b65770393c4df6d705b5e8.m4s +c29687008dafdf251b2ca962c3e830f785b38a56c81aee1f4c86f2e8f9115fcc floor/lo/c29687008dafdf251b2ca962c3e830f785b38a56c81aee1f4c86f2e8f9115fcc.m4s +6dd501e27365ce9ef90576771aad73de4d200362e6974551847afc3c90604344 floor/lo/init.mp4 +d793737b69231eface4951001e65b3c52cba864f231246a41e64d49c77ebdc97 hls/all/master.m3u8 +ebdc7e40aecbe8b61124ac78f233b0dfaf2a8c5674d3fc9bb023935de1d9b6cb hls/classic/floor-hi.m3u8 +66f5eb8b89b80e7da839b23f39665eb85480c6a725fa29d93556efee673c1b9e hls/classic/floor-lo.m3u8 +d793737b69231eface4951001e65b3c52cba864f231246a41e64d49c77ebdc97 hls/classic/master.m3u8 +a7c6facb1be1ed1ebd49547e3860e999064c601c591a54035bd0ec91ca9c9865 index-v.wsix +ad5de743a1febe108739ddc6bee8d3ffdbe70c59a655192f2a55493e0ee0a213 moq/catalog.json +238862ef3eff0ee32abe02d8f470f514bb447a51a1f328d496a2cc552e6fe486 objects/1ca09f3aa9346effeebfc1bd101de2c311a3cd586379d1dea5c235d1b47fde60.wai +74bc950940597f0b96e9b5a87e719171df0b7743d448b0bb9aba17e556a77178 objects/420b3bb3485cfea7ad941b0cf9b2bce45815d3ee881f238b48fae8140e9d88e6.wai +8bc999fab324b1c90dc03387d1687ce89cc5f6f64fb818d528b3b6a06dc3d771 objects/6528538927505ec6ed34d97843fa3a5eaa7dde3aa6b4c3ccfdcb23e710f15d28.wai +8e1749bd5a12a09e05eab464e0d4f03a8c4ba9a841acb9719e56d287e928f347 objects/808567682e2687d0f431e2d2dead4f574212ee1e6addaa99a73ab22258de73fa.wai +8fea2404d5d7e251328fc7b725bf067031f7712de54bfba24d51376ff67cbc08 objects/95f784de520ecef9127c1758264b16b69a0fc1e375bea6515cabc4bcf71a29ad.wai +3e9d5d3f281f366a2056ce2ddac7c75a06bf378a29024b842953247804da9c05 objects/afa7e0ae4f4c7545824836249064aa67d530dc54ae2bad562dc3235f7ebffc9a.wai +82a7b68f2613b043a11b16431713d03ebf59333c5edc20e1ed6631bbb80c714a objects/bac29f2cf9f5bbc85f3095d0eb0b081b8fad0552739024df229481e73d4cd341.wai +ba45cdd651843f80f2a5f8a3b71bfbd64621b4680edee0100136cb22d8303eca objects/cf65056c087382fe4be2f6cb56d64669760e1f7358553731de7ba9dafac01796.wai +07805c170c6b9dcd37afb2c41a45a8e95c1ad645eba6464858d6c898107cde2f package.receipt.json +517630d9bee1f5559baff3bb3e642f6aa7b5276226f6e3bdba4f3f9724794859 plan-v.txt +747e62660a0bd9b39548798b731f46f488e76e9911bbe9b742b3dc3a3b319094 policy.json +2ec22fbee9ce044ccabc1cd03053cb3717330bd471475e395974dde0da8f7eee policy.toml +41f6cb903dd1a4fa14ae95f8286ad3877d9c40ce09c1df0915fcdd25516a4c24 stages/all.json diff --git a/wai/pack-conformance/packs/video-floor-only-01/package/dash/classic.mpd b/wai/pack-conformance/packs/video-floor-only-01/package/dash/classic.mpd new file mode 100644 index 000000000..737f43910 --- /dev/null +++ b/wai/pack-conformance/packs/video-floor-only-01/package/dash/classic.mpd @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wai/pack-conformance/packs/video-floor-only-01/package/floor.listing b/wai/pack-conformance/packs/video-floor-only-01/package/floor.listing new file mode 100644 index 000000000..1e4f809b4 --- /dev/null +++ b/wai/pack-conformance/packs/video-floor-only-01/package/floor.listing @@ -0,0 +1,12 @@ +a8a19ef9cd4d540037ef298097bbc5317de6a99690c8c4a745cc867c034208d6 hi/init.mp4 +14cdbe56c8f57b1427ab9c2a9ebf6669ce8edec06fd7cd0961a01d2aaf720889 hi/seg_0000.m4s +e5583297b1456e46366fe3317784fadf8c165c5e16e864629b194dc46290387e hi/seg_0001.m4s +d3616b6368fc800ce421a492fbd0f6263b9e06ee0af1e8269ce4f20d5cb3653d hi/seg_0002.m4s +eb559df9571de1869981ca82672abbabad528b294b15a1d7bf9b635761c584f8 hi/seg_0003.m4s +759f476ce9e9b003d7d797060f9c039141d261dd65212035e96bb157783423c1 hi/seg_0004.m4s +6dd501e27365ce9ef90576771aad73de4d200362e6974551847afc3c90604344 lo/init.mp4 +0e0407f5a552e405846a411627df17537e5c31accca37390c391a7c1d27353af lo/seg_0000.m4s +c29687008dafdf251b2ca962c3e830f785b38a56c81aee1f4c86f2e8f9115fcc lo/seg_0001.m4s +10b19654062fa37b83c082c922f54529725c36a4ead953b1fbfbbee14d4e79a8 lo/seg_0002.m4s +a855b2701af4e7c8c912448be9fc023f911b4e9e94b65770393c4df6d705b5e8 lo/seg_0003.m4s +2c484c9bead2b261ac1a18c2aedec11761813f995d11dc9779c5f9b039d59b73 lo/seg_0004.m4s diff --git a/wai/pack-conformance/packs/video-floor-only-01/package/floor/hi/14cdbe56c8f57b1427ab9c2a9ebf6669ce8edec06fd7cd0961a01d2aaf720889.m4s b/wai/pack-conformance/packs/video-floor-only-01/package/floor/hi/14cdbe56c8f57b1427ab9c2a9ebf6669ce8edec06fd7cd0961a01d2aaf720889.m4s new file mode 100644 index 0000000000000000000000000000000000000000..3d6538a6af6748967bd9291736570490687c81b0 GIT binary patch literal 2217 zcmZ8h3pA8z82;vO@F&)=8jRa?m&*SBRa?%uB$aI)sc1_#vo2AtnZ!A%e|MQih*Kxm zT%wia)T)&_R*j0BPA-wCbf{LR?W8M|^S%E+gAg)}k;O-a z#{`BT_``d6OlTY&9b!TQ<9HZEh=+{UGvlYJ|9~cUphX|i1j*YH9vK-750%dAu-&mxq@_~b*v~|=J$55SMW#q zakoIBUQnAxwWL_~mu*$jmee#Q zgOGMB%ma1?wY=4@emLg;tX6)OcBRcIK98?XH_1&l`nvSlyV4evHbF9KmG^9Y7dk3_ z=<;{!E~8B;lCLjNV_W(yW7NiMKs05{_4JPR1dQy93~jogtr zZH^GYm>@q?aQe1Lg^q3#1B8&TZ#c*m)T|hOvT2%N0Q4dVoIat) zv#So<``9a+0=>o5xYwf6Hg!QDtI43_fi8FLF8An#NzSU960~&#a_w|ICaFv$7?|X2 zLZ{E4Gw&!gPuSvH)eHUR^7RJGIRA>#4RH@$!G1nzc=A10Q59_S=_bUr5eOaPIJn}# zQS0e5i-52di*7e^MCVXl=9}*r+L&653VlsE;=I%Qqae4N3^aa?YU*QS->T<8P-=PL zbxMlgmHxZ-Fa)Ki26~e8qnp+s;0}|CQt$xJQkPEjRsgt*(I}br9A_US7zXeDG{dO_ZnqS3u~mUC^xZC;tgZ@jcweSDt(zxFYuID zZQD5pb8trm_gaBhmDPRUzV&bXDAy1=PX%hk#R2!|P(>`1c<}YUaxF>JnASGWy_XhI z>qx_V+zWf*2$yqCW@r};yUAfpo@zNTcja|>U>V?E8vf-L+5`A~@z$`f^S$;$4A&f2eJueg>UEkEA~1v}XQD&kyQVj=_I7pecm{8f3IKfAXd|6&wz z@Ny$e>=%^jlA$)_rdY|Hu6390UVw0cgm#NM*VEB1U6ED}A%gjOJ?f0(#hjb3aq1A# zuuz>im3^#O3HTlj8_C>;3weNtX;>70N!ncm))B0M>Or;>JIlw0Xc&JK>!4x^WRK=U mqkS3%H6Ck+u(3?TAh%}CRR*3(tlACmSfG+U~z zbTLb_vZ*#pZ8aa@t}`)dKC^a6DK9bEs`n0)U@}8y`ZGOA_Vgc>s*hX^?Nr*a|sV4<3|I@G!wN z@QV$@2?h%tQb z4Gahh!&REg_NSv1B4b<5$ssV!y_lO9U-ndQcv1c6ye)5#>MQ5H5>X8yl25FSgW|4q z4(6u7}5d;!QvpztH@;Wf;8G7 z|8CL+fz#h<{rGdt=I6=xbhw?X4_imh?KrB>^~!rb6vr!#T9bd@sx;K-es;c7T1>ql0>XDby`ZB(6 z##l$dK+>?-x;w3fo_^A$@xTt%a)Th=yPEX+m}h6&iyUdoNztvxWM_zIlWC@_x?2H;W@rEfAO1 z{S?~nm$I?>$(70z(POHS`_AN~?r_l^$#X;0}>M_mEnr7!Fvv#v7#~1RP;Xv9K9+L~QUR zC8hv)s8oVNCCWue1bfOjR)oP_di~2k2fps1pJjrn0g2$jVgif$`Fj^o@XhbC>GNIjE z3mOH9ENJ&<3)DJ7r$M6YREJS0196-1W%^wjS5aB6HVW z9PlWjcy{gZkjtaceX_>f4z#|uWP&O+`y z4y#=^nM*_FgX3$N7N|8?ZiGayNhV+i1VYGE0|@#Zf=-MsQo`4)jpLGtxtY3u`-FxH z(G}UvBPl9&*k*M-Wvl+Ep9=Qyu^7X41#2sqYDt9hkwp`hOxvSAcst!saQFl0{nGU+`VL+9DXwf6Vgn}m>JXzl8oBtF`BSUOBRXIMwXOeOq?~uOp;pOvQ$GYwxl#s z+e(h4l%x{|VuVV{!u6oSZBq;V4?g;b)@_(9OPk6MwmJ|1wi0UrSp0U1m% z4frtv!$MOnLH!I2(@*Mb&Dva3F&)O6HKk&6mS#OsO*Cuv|5SzspV)VThwaS-V`86) z{=}N2(P{WP)iQ}#p{EB>^09&9H82&~MWI2(V5tw0I~K58l&vT`xv0$i_`hMv(<&3% zd~+CC%6-2kDPQ-^?zVM*z6>_c;6>LLrPpSO{DZ7d^wia}oCl6Ocx*3dxmoGq+ZC3p zva@HE__V(7%Ms^#XNI`+wGZ{J+jfDMdc5+AenI@jxf?B=z0t3RTaClhcAxsC^T}W7 zf||^;Uy#b^{3`?A=lUxmw>;P&zr4l*>NdEuHk-YtclGrIIo~ez`xSHRZ@y~iNi?Lg z1GpO(9(JtS6PNFXZhoUv%HO1x`5LjSvyHQuR>N`Trn74g?F?|Q`M}ZcSC>~bzmAz> zXyf^owtVxAbNTlNn+5G6hc^`twP6>R$W-TlsEWKRtG^V%7GH{*-_}*yX)5jtYpzy> z3cM1-&GK{fd^-5IHvIXhNsq?NJMH{&ZKs{Obg1h{bWpD6`jH;?!lAB%>df=^Mm>1K zJ6(bPF@@2MgL+C!?NQZ+@SR(hqz8T%{=l}s-lXy_NBNVBRx(L^iZ$P9QNYX5y6>-K1s{n9emcj>xCJI?HX(n2Z>k4qT5%3qmKm}EFY>YP#6 zp!#siWJgMD?cJ=u19gjeA9M9m2n0V)a=Wg;AyLZVE?9N|{cZg0)q) zAAt0oO+61q^3Wb$MIAzi^{DhxA#RqAuwVlk1Kx^5E%RS^%X_~QHUhRGhuwG!ZzTgZ z4Jrv_<52U-10$05qpo>?J(Hx{8HKmv5OdgwOdY5khfwf(mxW7Nqow86rP11bPC&t+ zOs5axiWtNcW`cleIMlI~_w#yIp@-ll3ixag^+&uJgIK_3lM!<;hYlYtyZEFVsp5Il zjLgx;!zd=3Ma&$6n8Dm8Le@uK9-ot%^hq7h`jkLmLDub#z+~HnduCk?->nUFt*P`~{kY&tw7ZARZ=F>yKIU@~6WE5va7@9w9nxAqH3bW1%VA%> zhBrijYX_ACF>&beo`2#KB^Y-BF_Q=}hT+LfV>jnfEZtPHjes0L&=VvGpH2wt3r9Yo{g zRi{a90P#x>!&QX8avHb=p3wf*HXN$S^j>M;ck<%R_sL(wRKfjFs06^Vo`2YX_ literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-floor-only-01/package/floor/hi/e5583297b1456e46366fe3317784fadf8c165c5e16e864629b194dc46290387e.m4s b/wai/pack-conformance/packs/video-floor-only-01/package/floor/hi/e5583297b1456e46366fe3317784fadf8c165c5e16e864629b194dc46290387e.m4s new file mode 100644 index 0000000000000000000000000000000000000000..7385852449e2f4b49345f9fdc6b5f563b472b1a3 GIT binary patch literal 873 zcmZQzV2~&-sVvAXPRU>Z0uY^BoLK>6niOZIR4{@B85kHDg!~)8EbUKV3Q7Q_nPow8 z5J`qJx%v5NKskZjw2Ty}8YUpUrKBhkBra0|5@%wt0J4F4cQ*iOV@8N2A|+`lB~beq z7$El4loXZbF)%Q(0@XHahRfhpY=T$zlkI=My_9BFe|T@M>?|Fl zZ3;%}MvM=D%9w!x%IMm_=)iFP$^E+P%j6%w)~mCskv85?d2%h9%tpiD{y}?M(h?Rxof&$nQu)0>D5E}=#gbPBb2`I!a zz?+cK3~~xs6-bDK!GA?BLRF2CiV-J6^M{RKRjvns?zkjSr|_PU@z|Y;r43&yPn|y> z$s-Tc$i>J~aSfp{2Pni1bl5M1@gN}{pu6l5sxp8=yg+xkBUFKe_)y&i65>a7R|e4E z0uNyB0=s_B2O}*bK}P0J8-V5uIDn#GgyG71CY7gmji1^2AFmeL-*I2`?)?XHi8gVp zK>b2YY*km_YFQW}fMUWd9H)LDi3I?~L^!ymY|z9+1$dKE(8RZ0uY^BoLK>6niOZIR4{@B85kHDg!~)8tfU7J8q5KTGce17 zvsVONc&0}C-Vg;&`1mY`9KmrJifmjoWMUb#Ckd2Jh(D=x5AbmPWdXdcmu|0Z~j#0MQH)YXFL|FtK$YiM2Nv2^z7oa9mITTLMxPcD)g)kl@!~=AfJwjCmP>2`kE_Z|~kPsiLyFfzxsP4)D z`di=u%w1sD&-q}aWhBVR{AmNwd;teg^ouZDS5N03S2DyHkxY*w%za9wEC3|Z zjyYl(TW60>Q~>ZP3lCS^w^EbD1f6S9?*#m6MMZpO#P^$r(@D)S*^GRek-KUw1c=HBzQiMCwDUp^dvvq%KhFVIdHksP8>Z6g@-b<#weN zx2OY?Iiyn2-?IUmal6U(CFV5#2z8FP^wmEZ~=>RxocGNrU JM4hO6@D04WTgdC-zYpnte zR9Y0Zs93cXts*K=DLN)dH3dIViy{$4EZW+R0uJq9j$`rQL%fB8wSi>?3D9M#bXFIl^pC~SY1idq7(O1hGH6lY)K+M6h5m6hl2|k7l7f zGUVHFP>mf2@j+O2UT8%;P(PY$kE1>6LoquqREIbrT(qJ*_-;*Vl~U*F2|Ik!fO?Zr zLVm^KV%4zq!tfiO5i(-=?3dGuro0fm*Yjsi%c-N<{Gz^wxY)M36J<%~m-Ome4;Acr zy!&y6?#uegPt;?R1`NvUhTT10>dRWw=Q7#3=4Q>J1^pX*a*qi|E<`>^*;jj>)gIFJ zpLWH4V^r9bmVvTsJFa$kOiQ@9V02AZ>EfK3JK_YXF|(7}%d7t#rNEwX@M{z1$A^oqeEJb7 zA=oUoy^g{u%KxZxa#qe(E4!iww3AcDj8;X1|4qTyvH zPeebVNFm|L;T@D)fziO=u8f%O+p(u=jii9^=JJUWW>j}-`_K5JLs2l$S0XfaF)d$WB zJgXlT`&RZ=kfB60moF`}HG&-Xt`sTu44$r(Ycm@ax8#8LxO)PM7Io#>=qLi!V=gCc#2ehAt}iU_F_ zGbCYJ-lg?ke)T3_3h<{pu>#tCYp><{_j>FHY2#g)iEplb%h!Ed;>u{infVI01`T|8 znS&Y)ek~+pTN<2Wjw`3{pN}E+->g7#8SU5Iu!`LeBj!o?vSo}$r>gj^ArO8WJ8-p= z2@iHeJVV?U;O>1~n|AO9yad?xwmn-?AoC8}`-OFmfr2AXELY>4vQ{IEO5pJJJB@mD zM%t(cSr^i>~x{cC+cVw3JbrdzH{fsImOSD79kY08MZ7{c390tgvc)!Yh3>61$rf|@Ga z?S?f-*9*o*l4hK1AOJg)?S0>tK~Lhd<};BKR;F8`jzrFZ2bjg-)!6$$REyFw8Rysh zWT+d;p9&Z3eJ3nP-^rS=vv@AA!}B62kmCv|$*x=8VFv2C3?TZjjlwrJ`Q`5&px~No zoX{Zk+UmXXxaNnO{~p*0eOd<={eQaY_V#qics*YMr_(v0Xob4JD?Xn3q-F>vu4ll| R>B5Q!))e@JZhjgg{~xLLQIG%t literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-floor-only-01/package/floor/lo/10b19654062fa37b83c082c922f54529725c36a4ead953b1fbfbbee14d4e79a8.m4s b/wai/pack-conformance/packs/video-floor-only-01/package/floor/lo/10b19654062fa37b83c082c922f54529725c36a4ead953b1fbfbbee14d4e79a8.m4s new file mode 100644 index 0000000000000000000000000000000000000000..537675bb8b0778d248e219010d0f66ec0f021573 GIT binary patch literal 1940 zcmY*Z2~d+q6yAggDOVGWA%r6VLqJew=NBV_^(qP~LO65;QrrWys&zW{?Vp%HX5Q@Xd*6HC_ulRwgpf$5 z&(~^n>TCo*vTAfW2H1w{a?}PEaU#S*9tkwFn=#w6G6(P@r&uJbLl!3sYjSh5AjH#T zWveX^}JLo5r4K%b@7Tlo;O@R;>^>((N~9s@WEQX<%} zf!`3AKbROS089Yp1?CAxd}G0UtSj-4Jd-?vCvk$8fe}nFm=tV07&-fbk+>9$oC%KP zkiF2llDeec$ohV87J*5u{}?AF4I*wM$B}Uy`GhAQvV}#NKkEd z&wuuKW3Rkd9v65Txlmb5KL~dk@CdOT>e+H z7(&L^p*BZ_95+zouq#i9i>!eyQgnNV<4_y$yGzB!Yj%96UrxY!*Sj)`k9nvrQEZRo zQDW@DavI2FT%|;8r}wu_8+vXP^l||%U~~UEW{0ami;&~SAGW(%cbQ8n{xt$t1R_7P z2UJj64Du@MuFeV7oPxW1b6pACXSBwpFjqgDxKbL1Gp=#tAyxHF&*ff`!ab=p%*Mav ztyE?XWm@0}U^@-2uydSWjvnl2rsU0gU_3I8>+m6KjEqMRnlhFOz;Z5s#}MOYI(F%Z z-=FqSvi6o- zmrb6WpI)BvHM`^|(13078AzK+l{Ea_Im#PTwg#9vT-kf6-!uJPlYZw4Xgb`coJK(0 z(-f0o20aS9ZgS0%)Iw8JH240~+NDQIFpx#q^^%wA6IN)NBd>#LMUEEw>$Gim(^O~i z=DrfS2RfeGXoO3cZdXc%a{a;C=!2d$?|n)`;TfaFUf=dnx4@021bB8O8L<&QBc_Y$ zs3``{F~5<;6M00`hgl*|@E69~?h|6{gwmQyq2k zKw|hY7iBOd#7dh0X4ZZF_f{vHDPNp4nz!dMJy%k<ST7AcDK-sO9$&n~M$Ozc zSF!Lww&T5)?c=+u%#g8kgbbL95*|UCjho4EUf;eoWpMtgurFW2KY+?6fC*kZReSA1 z;XpRLyL20ODH*)k&=Ms{x*c@B-eIQhh4zDV_{=g^yuAWOUhym{1b>Kj&aAYInxy$x d9UU?#=9ihhVrwP^=XyRG)bR$BaMrS-{{i%-AIJaz literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-floor-only-01/package/floor/lo/2c484c9bead2b261ac1a18c2aedec11761813f995d11dc9779c5f9b039d59b73.m4s b/wai/pack-conformance/packs/video-floor-only-01/package/floor/lo/2c484c9bead2b261ac1a18c2aedec11761813f995d11dc9779c5f9b039d59b73.m4s new file mode 100644 index 0000000000000000000000000000000000000000..1948711274de584a9063db08f1762ed597159934 GIT binary patch literal 1467 zcmZ9K2}~1d6vw|A2B=uIMS2Z~#V8V1a2Q#(f-$IQ)S%X*y3r+;TDl^XVbv)oHh_Ecpo`68A`iB@z+> zcpif(!Bk*TVDVrIFwA1WhWm^L@8>wid7Q)EANy;g19E%KoqpS9#^-mnPHG-^ zuVg;^RwHZtv}}38j>eqM_fKzx>VMD3SA}q_oC)DMgu<@D_Bgabje16XJav;{6%0jC zf!zI#;p~JTv}`03Mv6H90=PSsYIX!8qJ~Jk%!&J~I+$!NS`(|xy;OF2CST9WmanOnrxdD-K|Uow9;#KhntSrGJQFOBwb-xa6--*N{QdWb4BO>+dHRM-F7c z@13HSPt^LhiEGipR;-qd>aScAcE1xUr<39LB|_!h2TT4eg1bC3Tl~S>z;pLzyjXWa z6y4!geaFoyzM}!%St9ZO)j}&*YEvf6o}-r4`YGt%X-$tz=>a|m)&CO6`Tt(ovpxgh C<9&w! literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-floor-only-01/package/floor/lo/a855b2701af4e7c8c912448be9fc023f911b4e9e94b65770393c4df6d705b5e8.m4s b/wai/pack-conformance/packs/video-floor-only-01/package/floor/lo/a855b2701af4e7c8c912448be9fc023f911b4e9e94b65770393c4df6d705b5e8.m4s new file mode 100644 index 0000000000000000000000000000000000000000..90c0b6fca9da987db67ab71168d964f8216d7550 GIT binary patch literal 1019 zcmZQzV2~&-sVvAXPRU>Z0uY^BoLK>6niOZIR4{@B85kHDg!~)8tfU7J8q5KTGcd0Q z$w39rfPM{qzxG%mWY(3rIbMJ zV_<;TQ&Un@n#aJv#0pd=3B*^JfCLa20xYVN!pTTXR6cNLhqI*@1zf0VpJDUJ+8O!FG51 z{r?uWAM(9z)Ez@ajB3L3=aaG(*iH;G^o5dkxB3Uyv_3x z57-#@E^diWJ78pF#Kh19SIp?Za7n3WcOz%~#Rs7R6GPtU7I{hYF`l})v~&pz?^dxp zdmk$n7^xUBGqO0qEttS?Uu*lqt=A7+-6a40h*4mV<_zJS1|uOO7ACe1h$^6S92nXa zfMTpH92XS8P6LazIRM4jIJhNT5Mq4?fMVj9t@(ODTMTSfY3Wyf0n+-G*hNX>|gk)`4qSPxji*$ji+$?tA3a>qGI zRrDO>w+J`BV`2+5h#TnEUr>V_CotR#-=o8Bv#BvjP<^tTdcKjO5f9Me_6UQ{C~f}0 z!`HNF)3P}>lil7aKL9G>1^UAsVa8p1S83T9OIw?^upj;Kifyq3&EWn!zkf>3br^S8Fz zEv+wQUaXh;-V}1eNXAH*h2zu@s0yGT?|629TK(j&mrd)21|vx$5e{xC8>lQW&@c3P ztos<2dSV06Zczc=q!fh4+p8+BHWdGHOp7>n`Lntb&<|n^{;PVx3Lvos6cUHK7cL|L JcOh74B>+Y4|7HLH literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-floor-only-01/package/floor/lo/c29687008dafdf251b2ca962c3e830f785b38a56c81aee1f4c86f2e8f9115fcc.m4s b/wai/pack-conformance/packs/video-floor-only-01/package/floor/lo/c29687008dafdf251b2ca962c3e830f785b38a56c81aee1f4c86f2e8f9115fcc.m4s new file mode 100644 index 0000000000000000000000000000000000000000..74171d12cf37630911486c49494280811c03c617 GIT binary patch literal 1019 zcmZQzV2~&-sVvAXPRU>Z0uY^BoLK>6niOZIR4{@B85kHDg!~)8EbUKV3Q7Q_nb(8l zAd(Dca`W@kfN}!4X&EU{HB3NyOG!~8NL;1_B+kTO0b~R9?rs3mhKvwPL`u?9N}%>J zFhK07DJd$=V_;xn1*($-;wvD-fWQ!lb%EFfh}D2t1Pu!V`HDcS0i~6JGzf#lK^UYS zB(DU-azHE%<-_EGG}GhUl*AG)E}#sP`lH;M0}4jUA`Hq73=9oGAyM;+kXjA4yW8*o zx3K+??`@;*7$O??lr6zX+lcW2P!TgQI2m0JI9_0Q5a^s1cxk6W<;96idhh3Lo|kyQ z#<+KJOMKb^BO@awh9pK7xV;A5}$Y=(60j#dC!AQ`EgTa4AFGAg1BY7iE zhUO0&!OC0@0Ii75$~f67(myLZ*7D~*vnxhwMqG?671zLezzWW0801cVcY~2T&Pl4G z=ODjDxbYnmTcAPQK)3#a8ss>E;a>P29d?^djY)#)ljYR&jTDV|fDX4u7<5Ky^9LTj zrcIlc&9Ry6_D=Z$Pzf*4AMOYW^+#Ieht)s=vL5M%IP)dN-li7lXzINZH(Aqlt( H!9ptmp!5D3 literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-floor-only-01/package/floor/lo/init.mp4 b/wai/pack-conformance/packs/video-floor-only-01/package/floor/lo/init.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..2f94c3ac72712cf4e59f6bcae567664aede847ef GIT binary patch literal 788 zcmaJ;%}N6?5T4ds=|M^lMS6%((1Vt)KRp+`^dNXr5WK`DrAs%>vPpxAh`xaD;ahm{ zDLncNg2y_O?YglRhs}Q9H}hq(n*jhewzp|)^f5pc2yykf>qRO(iZJ)7v~~cHC^r#^ zWi-wny{G`-Q^qfW=@mUFo$FW?H+ ziLpKteyQJE(MrS|YfOpt|9<}FckWL_k}Z3Hi-jyW;RR|vI4|JR2ivI^~;& zpV<+4tt~Q19tx`0=UKv*{N32=1o^YErWgo$9%yKY6k*Ri!|=C#W--C8VA zw782-o}do38mj8fhq`}d$Tm}MQbg)QYtvYNok)G4HlsoyHc{UNnkafkI>_xRCvQ+Q zn|Y*C(Lb;Op9{+|ajB$7s%?iOz_DdKP3e|?VlU3;+F4q`?b)_OVtSOR1b(d_SWQPh4U|~ zxK*|Htd?y#eCF?I<>vw)V>On85)u%A(iR9%YX4_YBqM?K%O9-s_bGL4@-S1Gkg_WM zs==L*b=qsgbPp@X*X{o^%MujnKtL_~TcQ4en99H)vtYi}N|U_*@AenISPJ VhnJx|F;lNBGbJ@&FR{#!0RWa@SLFZz literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-floor-only-01/package/moq/catalog.json b/wai/pack-conformance/packs/video-floor-only-01/package/moq/catalog.json new file mode 100644 index 000000000..308f10183 --- /dev/null +++ b/wai/pack-conformance/packs/video-floor-only-01/package/moq/catalog.json @@ -0,0 +1 @@ +{"tracks":[{"altGroup":1,"codec":"av01.0.00M.08","height":36,"name":"hi/floor","namespace":"video-floor-only-01","packaging":"cmaf","renderGroup":1,"width":64},{"altGroup":1,"codec":"av01.0.00M.08","height":18,"name":"lo/floor","namespace":"video-floor-only-01","packaging":"cmaf","renderGroup":1,"width":32}],"version":1} diff --git a/wai/pack-conformance/packs/video-floor-only-01/package/objects/1ca09f3aa9346effeebfc1bd101de2c311a3cd586379d1dea5c235d1b47fde60.wai b/wai/pack-conformance/packs/video-floor-only-01/package/objects/1ca09f3aa9346effeebfc1bd101de2c311a3cd586379d1dea5c235d1b47fde60.wai new file mode 100644 index 0000000000000000000000000000000000000000..a00277606fdbd954a40c14da7ef28e8cca8569d4 GIT binary patch literal 2204 zcmZ9MdpuNW7{|{{g9&NI2h9v>=8$A2dt62uHq(+tVzjv|DZ?Dhr!kWuiZIJk4Yk;k zlBjJZAL*hbmFT8qTiw)FTGncHA!<=cyJyUP-s9{a?`P&czvuTn-{*awb3&K-I#fdt zln$qgrLX{Yut#7XoPbKCVr-Wpm7of2FO?^w@?`9R65Sw^#)y+qO^`x@%GN2-#EnuV znlPoO!!hCw;%KQ%n!Fi{#!}i(rLY&LIKUY^I7T6tNRy=sxl|qp3)12BQn>_+`%g_4 zE8|eCN;({?6eplbuz-*7;CNWzap<<Cn9BLt)kN}-z-*u)f!oOJTsQQUsJ*3+*qqM)4Tz^w4?_&Ag=F7U|- za~tX!8``k_5;yH+?KOj9`Q-(htpq-*ug5z~BQy7$`MLMmpINT;Ip@D5Rnhs^Mtm*| z*F#)>R8}Bo^Wr1Ub$ew+OI2Im z=~nX7dlLLiSSRvKa~am-GE4J$4TpCHdenbn>kRi)*R;KjpKoOA^`5qB%dHDV4@cWv zyF^a!YMdG(E-z0gzxaJ!^!`c`r!fl83O>j6@_H)A`i`Q(1zsB`23U*7`VRHvTzoL;$raw~3krxYL0d-k)mA!_ z<*AXowl2>K%7}bqH{3L*_C8zvquY!WlK2dBk;{_6*OMs+!(G(Bzf8Bj8@Mko^Ua44 zF4Oz&WSzr`D)$drdZjzh9eCDGDv6XSMz8Zj6(vfe2~zLu#^&-*XXfnOByG5#`&W=& z8TXTJ@$UNf55=4?t7S%Rxupf$otVWA!xKv$y!3EHb&dwCppR`SPJ7;5U2fF8?U3(B z@{R4v@I1~p1+M3PrKYj-KVLy&m#l1n9y2VDZR+{kVq z=4fULQ`iWFM47HUU6Z(;(>U8|+?w_6P5uxKWY8s3Rns!4Rr9qOI0%(8i#AQ^tnE4o z83@e14o7oU1KgTMQ*9s}(WlZYg*Zf(rB+}fhBPx|8!ogjdgYTem?3NdP9rv}7Xqg-Nv}5s50G)RH7yYnGIgX@E2ywTxhh=2oUE+2sYG># zT!7n*GK)TnyW{6+-R1}bYb6sGy0>wE+Q=;NbbYM?UKZBW4|qttjn)ez7ND7YP33Oi z89cf2R+@O>OcP7h({UA^VlJ_}Ft#>@1;S}1boIpB^9xd|0jc}NkQ&s7$$I@!c>O$J zwx$@4R!<4}npt?pJbTZ=fzepcU)l*`Y^e0z!?^hx>fveoYj54F&qW+_EyNtemS*O> z36JTHZSe1*;P7^A*3}!hECN0rR1wU;g{OP}mM2PZpFNRVr1|P$lWK|}fLo>EeiFT3 z5(T<-Bm#>pv@QnXOr-p+LneuNQHYmwA!0@Wqbm`!M^r%)(GLhgMFEi$0Y-Ns=eg(E zp&>SbCxCG&5jBdTMKwW|6>1K&1-zuRSX*HFif!gD!VfJIOrjTbpraEP>T`TT4gF7F zzAbM8UT?BqHw_PA15zJ~;pDWWt#*)*pW7b{jDA#l`Lx_@Aovq$*eq=eW=H^$=G5S9 z@nIpjc@Yuh_~RXPm&N#1tRmvDL655eN519*RuvhONp-s+@ow7#h(i8H1Zsv6iB2;w zT}+C?Z!w&R#D=w<%th7!n5nn)R5rJov#>1oNPp(=^)OI&Eg(~AW)eSIaTMXcZncht S>>E_zy+%VN9)Hz>y zfl3hq^1%Qu1aiO(I2940Z#hUREJNQBsREWN&<|O#d=nxTDPU8PEEV3Ak_BgOMzY`x zGp+)~BDv@%WD}y;idLhPTr&k%loJ5vaX_(5nu;h8nG}&qK)wpxh)7e>x^JjLlqG>t z6&0A4CCY%aL4FX#0XKmBKpqEFf_z?3Ufv5U0Psis`k*HqJ#Of+K#vUx02}~oYxI$H z)>xSWQRjWIqyd${HUMBX0IWfF;;*jE_V_*I%=1k#;(bFyypkA=_PpKk1f_7SBk$-4 zFx{&RED%*aHW;7PKR9jeKkOK+@P8q6G)AU+>%fYaObhx8G09 z-L~jdv$_npbc+o>nR#sM!ljjece#XS3|s2G(yrTusXe_6r@=J^IWnf!L#AgYjP!o! zSxzbvcx8hh(&Iydez=%k_?gFC60YPe4A;JhL*PKU(=hwCt3*%o4Oiiw$*m|?Q9l1yz^vQ z_)B8SYao~4O2dc2v3ZiW8=@V#NZY;1F zPK)lfeRQaZznuF%vW~(|TW~I^vEUi`-#Ly4p39o6*uk48xs*|6-uJzG{+9Qb*n(@2! z-;dQd)-c)0Rli^SV!uYB%8OMhdg%jhQjPb`Mh_}*B_wLck4(I4J#QiZjtkoSWJw|4Wa>uS2Bo_ z&K0Y3>qcMS3}IjebjZPi@=#0^v>$%5o+8IRI+3Wx(*&C2inTdGbh4fO7y)RbVr%gx zS2S2YfhFKg3^dp;1kgTCcfy-Ire;ZS$CO+kPdtJ7HnbiZBnN81C*j>O#eW6O^y8xw zc7{L_<+1RaS|JN~5L@P3jCSGy8GdxT;PZ{kieigH3Y08KRs1!B?WLi2EYrD}A^ zbSWT}lAojhIuLEF5njl?ejr`L6l|z$rb!J4`5K%rh%j&3T0)37)wXahCd7so;I_@% ztb4Ph`_muFq<6OWx#@4;vTw6{8eVE^Rt)xK;UfI0X@s*eE?+1VPh;ll`16d-y*6H5 ze82Yfu@lqmS6?m4y{5xy!tjV{lUE@=@I@Na1a$xZdgZ}Bm;eh}%%X?JneW&v&|Q46 z`C$O>-k3{Oiu?9!?KpJ=P~F`}%z}jjktE6>Z4$u2nEfF^gze`^%zf%N8`J6>y|47_ zE{=}$i&-MOqinn?(BV#&QEewQgp;<3XQgMAHBFIwHM>?=N36#Mqgl=sSe@DwlI4d9 geh0+>)h&|SWu~O&1NoVGC8>EOK!Kvvf}G6c z#FA8yqWqN9ocN;D!qUv5)LgK9wNi3oL1I#7PG(6ZP&Lp?6pe@x(X+?>-sl`fGMy5JS8A?{hW;#mcN>*kj zwY8s_7#Jjh?o|O|2OtKq8G+aoh=mxqxPTPX`j4~Y4LFQcMHrMF7#JFWLPiocTn4XV z6TGsYZ2$Z1r8Kkp!+UdOXXzMiQ_u!V3o#g}8!Tn2Z%usnFhEF3lm!hl1zJp zD8w{DBUToU3kqP%!FpQZ5^NmY5-tddCb$H<0B=G@GswAM9S8{y2LBbk2pu&V5IaZ5{P{>8dAR9Zj4Tz`5QgNyCAfiJ_=T_* zA;AOmfjvS;23!X(&i~2MuLpYpEdw( z7jR$@VF02l>zP!Z-Zg$^>wmmjXn)6j(YyB_$R*muvBJ#~Vq&Yh0@uO95CNAFX5l#X w14$+TE+fLhEoFmMMpS?|DFv&H7=!<+9;`CrC~jt92oQ((M%YLK&29S}0Llfxm;e9( literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-floor-only-01/package/objects/808567682e2687d0f431e2d2dead4f574212ee1e6addaa99a73ab22258de73fa.wai b/wai/pack-conformance/packs/video-floor-only-01/package/objects/808567682e2687d0f431e2d2dead4f574212ee1e6addaa99a73ab22258de73fa.wai new file mode 100644 index 0000000000000000000000000000000000000000..c05dd73373233ac8cf948929975396d9ba8c56eb GIT binary patch literal 1559 zcmWG{^fX+-z`#(gRGyfrWTj-NXP~5`l$)B8nF!>SWu~O&1NoVGC8>EOK!Kvvf}G6c z#FA8yqWqN9ocN;D!qUv5)LgK9wNi3oL1I#7PG(6ZP&Lp?6pe@x(X+?>-sl`fGCI&i68A?`$7CK7hN>;{3 zwYABt3=A4T_X+{A0uW0AF(VMa1Y#iuE-oO&r2Z(k=756H4MqWm*+4FL1JkxnU9CI% zY5Aeyk2p=2RT#?7<=g+OYg)A6US`JF``=@iv#_{5PP0yJNV(#0c;?hjwjN`q?l2Yu zFT=Nbi?wFUskvAPvu^NMKf8mmxGPlMSYl<{vzgaI-kx#o{Gqsd?&-=`s}cjgH8xeA zz4>`Qk6DsTOXK@Tp=A-eE?e6rf4g+4d`yu8GkaLOuG zlDR<&>{%l*1Lgw_3=C`+fSzn%XjWi&pz?3mWdmu5thfOSBMY+ZeeI-umN5Zh5NRO; zHYSb+m}Z6shE4@#h>W}e2MezNM5Y^La`_V7;_O;kiP)o!$2||s0|mJdgOR8K7l+^i z2ZZhSOnjI1!=1(>AZE~kki4_wKw7Gk97L;>0iS}@fs0^Sunme^7QT_K=$B^tAPP|- zXdu8aKTry)ALzO^xP%ZR`@>{}M3W3ehlGI$6UWCj2#L$9xJ0e5EKGnqSB!;M@GDdv z7+7~CKkcxBJ68hempX*x?eNgDUXi(*rHTg;UI9g4tHOfPe7LL<6Z_Kygr#S1f1knM05?>Hh3D%Eglq&{LXAUk z>IZ~G0bD{uK+L29ArT-82{=guEd{9~C%_Wj4Z!FYo4AXA$AL*}Dhf|yMJG@wBG7?!L?xW$EG-kA%CP@DqS<;KK*R{){w#>1#{+3>vR>B93DVk9`H zc)Y9M%prZ~zNC4BU%_&Gx} MC$j8;FCWVs0PuF4$^ZZW literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-floor-only-01/package/objects/95f784de520ecef9127c1758264b16b69a0fc1e375bea6515cabc4bcf71a29ad.wai b/wai/pack-conformance/packs/video-floor-only-01/package/objects/95f784de520ecef9127c1758264b16b69a0fc1e375bea6515cabc4bcf71a29ad.wai new file mode 100644 index 0000000000000000000000000000000000000000..bb025eae3d696fae715f856387dbf1720b828d8a GIT binary patch literal 2052 zcmY*ZX;4#F7=45YDO-~m0|X@D83F=k9s!~T>sAz0gs^A@Q!pk0UWFuvC}5<0sHLpJ zfD3L=YzNm-2dcH|Xed;$T9*`CP|#pStxKgURqJ%@TjG84<4)$~ob%mtzVF`q$(#id z`ymLjz=diQR=^Qb1P+Juby`%7f2~EeIs^WV>diX68UMqiGv=WhwOL1y3|d`YmPxmI z4QkTmleh)esEz8CXdY@V#@TpDDOp0QUK;_Igu@zxUW=MhgC5oAzzPez3e{_Io&zE_(FJF8);p-W`xR9G0 z{=*2qlfT|7k_|brpzA?6|$J&1)M6>wl;|Ic}YCNAjbA zUsY#93f~sDgtZ!9Ejo~RMKkn4TX=lf(VnRMFQ0VQNU9F9W(+sh3VF7=7uf{~hn@t> z=b7s6_{p3Rvw^d-zWB|Z(^GqyzNxz}-$;rJ)@Nv5zL<&@baY2wO6xTCJrHH>bGQ96 z|B2POnj_XF{XVr(acHAUd(-r=x3cWf>We|PKP&ud1uZ9}n&bly{m#9$CvJK%l3HC* z>oRSYoA}M_T$}bEzH^dlgIDqM$CiFcza$~(1mrb|Of3^4&Q=V9T(072t1t+IJX>#Q za%PUZ>DAhGR9=SpQ#2oh>BMx{z0`9y-0_!zedm#XY3q9_NCs1Mz!iJiY1vG97pa22Fb#fijkU$j?>w@2R z?d$q(mG-lMl*eHGeVCSNfnPq;lQT*Ko!jk|wf|ay&Igb4ISs48mI6FTEe%|l+`ufo zyUXA~OZ~^DSq5em0Af^Oc#|izS@x?MZhB|=D)>9oG0@|{j(4HRPF5Si-Y~;;cm=)p z*(~V6*3&Y{>7Ag>Vy4IFeg}hSGcPP{yoBl&j7V6Vts^8zcFVmdaZkoW;g&D92ep)^ zcmA4y6i7kWi7JtA~P#AeUDeYVs7jpY4#RF6I^uoY~Tw zu8fq!6gvP3hnko8IM}$STcIXno#x{oGkIKH!ucSI6^KYdHqzY0==tgYmvl;Yn zh&i@5IqI;xGDJXe_=pnNBj+~|cyCpzJ&-~tA}M2C^*zSs37eOmObCV2nInEcv3nxi0rQwoJNIZwKmS@0ldj;P7PtXQbM#uzOS5@PZuaSFgZZrvmm! z%C+N7*Ups<<$`;V37l0CBefTG#0XPv2cKlPD_-Q71Ce$n54VR2iFSWu~O&1NoVGC8>EOK!Kvvf}G6c z#FA8yqWqN9ocN;D!qUv5)LgK9wNi3oL1I#7PG(6ZP&Lp?6pe@x(X+?>-sl`fGMy5JS8A?`$7CK7hN>;{3 zwY9Cx3=EP$_X+{A0uY1Pj6iG*#6k>QTtJFR{ZVes0R9O zr1yT_=6Q(+Y>aysx5TF%FoS3@GGbzAf@@)PV7R2zv%8Tq{^EmBfr%k+bc?*C`4~^# zTw1z>g?FpioxP703p5})Rg9P!SsdV&O<=gMwSD2%>j$oGlK+0hD6mI!hHy@U7(}g* z5epMr2ShEv18^C30p5g+W{@|*diokf zA@&FwaWMF==tbz6s|=BlH{xVy{;(0O#q|Kt0nu3*CtF4OXJyA){@iDFMGK-#&4`PU zrQ#Y`KUmq>41?Us?`|-1$2mz=^c>{32sgfCVhcBv8|bTFP(vLjFx(5@qr+~qsWC}V zeX^W-zAD5}MI#=d7wr*-o>AKTfrqbY)23x}Y$m(CQ+@zf$P4tbJHouX_O8;hGnTeC zZDBw9;T79r3Ai`;Py?VFF2RrL|1Nlt2|R%L-vJZ>69nL%5M*Tjv;pBdUiIXfDKoCH z32(act==#|1>y+>BOxZXsw)U(7e9Y%tKHK2Qs%{asqal8Clny+WQ>GaI8Ob5sso0} z9nbDhtDpS!vT5DWAPZ3=X(YnIEoB2$!|1?pq0eL8$FS5B8{lpd72r)uK^Ss-RmIhY q;y;dQ5yvinR#$@iR*b=aRS#I11ISZ-a0zj^pU@;E;JyG$tONihvl;FH literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-floor-only-01/package/objects/bac29f2cf9f5bbc85f3095d0eb0b081b8fad0552739024df229481e73d4cd341.wai b/wai/pack-conformance/packs/video-floor-only-01/package/objects/bac29f2cf9f5bbc85f3095d0eb0b081b8fad0552739024df229481e73d4cd341.wai new file mode 100644 index 0000000000000000000000000000000000000000..2bc6503c3b1b5bb339d6339816d26458e8d23b42 GIT binary patch literal 2270 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 LNB;T4GU@*TnaWI= literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-floor-only-02/key.hex b/wai/pack-conformance/packs/video-floor-only-02/key.hex new file mode 100644 index 000000000..cb349a425 --- /dev/null +++ b/wai/pack-conformance/packs/video-floor-only-02/key.hex @@ -0,0 +1 @@ +969470be8f2e8fbb31f18a2e3ede613cc2817cbe2fa7a7f8ccb3bd60826044ac diff --git a/wai/pack-conformance/packs/video-floor-only-02/package/LISTING b/wai/pack-conformance/packs/video-floor-only-02/package/LISTING new file mode 100644 index 000000000..37a7b0010 --- /dev/null +++ b/wai/pack-conformance/packs/video-floor-only-02/package/LISTING @@ -0,0 +1,32 @@ +c5203585fea0962de941d258789157a0590e18b62a2e5d1facbd11e1cfd1ddb9 dash/classic.mpd +04c948608aaa7b5d78ad5355042a2ff65b0f75d9d4b1ad78f3ebffb886a74be6 floor/hi/04c948608aaa7b5d78ad5355042a2ff65b0f75d9d4b1ad78f3ebffb886a74be6.m4s +06d5cd79ba3860cccdc252fe915de0902f941a3c6a000295714f7cab193aa6cf floor/hi/06d5cd79ba3860cccdc252fe915de0902f941a3c6a000295714f7cab193aa6cf.m4s +2f93f0ad449f9cc881b7816c6ab33fd445037d6538b445bcc76431f9c9f91c5b floor/hi/2f93f0ad449f9cc881b7816c6ab33fd445037d6538b445bcc76431f9c9f91c5b.m4s +420ae4c941bba6e12a6c7fdb7d01dc69170ecb4240dffd2e86808ddf87baa12a floor/hi/420ae4c941bba6e12a6c7fdb7d01dc69170ecb4240dffd2e86808ddf87baa12a.m4s +576b7d2156c2b595bf48bf34f67996d7f89e75d105f0dc71c9841bb96e6cd0fc floor/hi/576b7d2156c2b595bf48bf34f67996d7f89e75d105f0dc71c9841bb96e6cd0fc.m4s +58c598174eed554cd0d1bc8abedca8c9d51d992c8e3b963bcb7574da4983ed9f floor/hi/init.mp4 +589ad79210bff258db68916876846a2b0d530ea2e44260af66ddc51ad14ce07f floor/lo/589ad79210bff258db68916876846a2b0d530ea2e44260af66ddc51ad14ce07f.m4s +6bba50408f894d0e9d5516a53992fdd2aa86db43ccdc684b69c51a688856a0db floor/lo/6bba50408f894d0e9d5516a53992fdd2aa86db43ccdc684b69c51a688856a0db.m4s +acd166807d05fe4f512407f717659d88613f6d0d360485effe3751504cefbb74 floor/lo/acd166807d05fe4f512407f717659d88613f6d0d360485effe3751504cefbb74.m4s +d0f68eb18af5b67736ddccd97ed45c4c0274b0460f6abc8f54940ac378165833 floor/lo/d0f68eb18af5b67736ddccd97ed45c4c0274b0460f6abc8f54940ac378165833.m4s +d550ebb204adf0b5a7f310c7d07189e7bed63e12e34e9ed4d9bf96a101d864a9 floor/lo/d550ebb204adf0b5a7f310c7d07189e7bed63e12e34e9ed4d9bf96a101d864a9.m4s +640cd81c83baefbe13e8ccc2bf577395c6602885cc73e201ca34dc267e7f0a48 floor/lo/init.mp4 +3fd88f9dcf835edf0fcca8dff8371d2b4e897ac097fc85901477c950c0da7996 hls/all/master.m3u8 +bfa98255d682517f58df4073bc71fdb3fcca120fc33d16e4aca873392476c586 hls/classic/floor-hi.m3u8 +ad81674ac359096ebed255a26a40e82858e53e9754702429e59d72898df33812 hls/classic/floor-lo.m3u8 +3fd88f9dcf835edf0fcca8dff8371d2b4e897ac097fc85901477c950c0da7996 hls/classic/master.m3u8 +cfa7d9a1a9c8a22d9ac1e22e4874b8a23e6ac5505077faf89dd70e65d3b4145a index-v.wsix +ddec2072b2b70d5df4c6295f7e0b3f7d9b649a3d524a341f8fd6f98a2ea0db89 moq/catalog.json +238862ef3eff0ee32abe02d8f470f514bb447a51a1f328d496a2cc552e6fe486 objects/1ca09f3aa9346effeebfc1bd101de2c311a3cd586379d1dea5c235d1b47fde60.wai +74bc950940597f0b96e9b5a87e719171df0b7743d448b0bb9aba17e556a77178 objects/420b3bb3485cfea7ad941b0cf9b2bce45815d3ee881f238b48fae8140e9d88e6.wai +8bc999fab324b1c90dc03387d1687ce89cc5f6f64fb818d528b3b6a06dc3d771 objects/6528538927505ec6ed34d97843fa3a5eaa7dde3aa6b4c3ccfdcb23e710f15d28.wai +8e1749bd5a12a09e05eab464e0d4f03a8c4ba9a841acb9719e56d287e928f347 objects/808567682e2687d0f431e2d2dead4f574212ee1e6addaa99a73ab22258de73fa.wai +8fea2404d5d7e251328fc7b725bf067031f7712de54bfba24d51376ff67cbc08 objects/95f784de520ecef9127c1758264b16b69a0fc1e375bea6515cabc4bcf71a29ad.wai +3e9d5d3f281f366a2056ce2ddac7c75a06bf378a29024b842953247804da9c05 objects/afa7e0ae4f4c7545824836249064aa67d530dc54ae2bad562dc3235f7ebffc9a.wai +82a7b68f2613b043a11b16431713d03ebf59333c5edc20e1ed6631bbb80c714a objects/bac29f2cf9f5bbc85f3095d0eb0b081b8fad0552739024df229481e73d4cd341.wai +ba45cdd651843f80f2a5f8a3b71bfbd64621b4680edee0100136cb22d8303eca objects/cf65056c087382fe4be2f6cb56d64669760e1f7358553731de7ba9dafac01796.wai +24c0a3b5c168705e24651303e9c7a4da733cd7bf05972dfb795c7020511021ee package.receipt.json +517630d9bee1f5559baff3bb3e642f6aa7b5276226f6e3bdba4f3f9724794859 plan-v.txt +59ac061dd4cf2b1d6bfbd90f3b928fb52d996877e1612d2e77520e55a4566ba6 policy.json +d352b112ede244612448bd216ece0553ead1c5af1542d874bc7ef5b5b546fd27 policy.toml +c421d0d94d97977ac1ec994510317d67f54cb947cec3464afd08e7dbefbc854a stages/all.json diff --git a/wai/pack-conformance/packs/video-floor-only-02/package/dash/classic.mpd b/wai/pack-conformance/packs/video-floor-only-02/package/dash/classic.mpd new file mode 100644 index 000000000..0bc509f7c --- /dev/null +++ b/wai/pack-conformance/packs/video-floor-only-02/package/dash/classic.mpd @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wai/pack-conformance/packs/video-floor-only-02/package/floor/hi/04c948608aaa7b5d78ad5355042a2ff65b0f75d9d4b1ad78f3ebffb886a74be6.m4s b/wai/pack-conformance/packs/video-floor-only-02/package/floor/hi/04c948608aaa7b5d78ad5355042a2ff65b0f75d9d4b1ad78f3ebffb886a74be6.m4s new file mode 100644 index 0000000000000000000000000000000000000000..7e5a29203e5ad8907861e9d0bba3c074652aaabe GIT binary patch literal 981 zcmZQzU~I|F&rf4uU=YYn%SZvzAi%`Hz?f4~ln53t0f_@efPfK*MM~0AN`ZD>)ul4GzYNU-fRG!?;WVklSNXUqZ zp$V!GsKJ4u>kCkfnUTc-q8TFA02E_kV(UN>Yi}?TG-74pxS#;G1gx$VD8$CWE#ZO? zY61$e3-BgnG=rQ1Rs|B`VDMkji%?Z#q+-O$(EMQ|Se5GmpgS%J)G54YWIT4KVrj#d z%2VghNAk!6HF7bsR9r)7%mE5<10D7YVLV8P2k0()gsKdn5HHYO?g&*NAwE=hfrR)` z-IW3Kx4;9KyTGoW^T9~VNRW~F(*~gV0uBr!z*Ng{Wj&M1)4RscZ2gZ{3+?Z?FM9X> z1Gz+-I98y3Attt}D{!?e3=u#vVHS>4Kaj)%fMOyX+)_4ZVxj`PNhxSzVhsMPdeFqg SQQX7A5MU&1B!On{J_i6~LX$%P literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-floor-only-02/package/floor/hi/06d5cd79ba3860cccdc252fe915de0902f941a3c6a000295714f7cab193aa6cf.m4s b/wai/pack-conformance/packs/video-floor-only-02/package/floor/hi/06d5cd79ba3860cccdc252fe915de0902f941a3c6a000295714f7cab193aa6cf.m4s new file mode 100644 index 0000000000000000000000000000000000000000..3e21af5bfbf09877f851ca6abe777d4380b6af59 GIT binary patch literal 981 zcmZQzU~I|F&rf4uU=YYn%SZvzAi%=Fz?f4~ln53t0f{q##TkL5NJ&~s35Wp&?Lf5- zB}Juq3=HfbVM!pr2S|h1#t>~_wk9J)6NnTcf-Q`sh8VUQiRy_l6WN_QNaiDpQ^FR7 zn8_5Fo03?<#RUu*ru83Z#~W}MsfsWtJ1{Ub0ELVsY`6?w#U^-VKiU5G+e>L?^@sQ7 z%Ffa;+NNNnZp8QisEj!S7~ZZ8j1COvpWLszzD)k{YrQ(F8foJVl_z&I8Lka75;9_9 zXo4yPYH(oa`T`VVW@K@IXoiS20L56C*gBBJ+8c}njaXSYE+~L40jp~T3bAo;OSm9} znt(#=0=x+s%^;_MRe^*!82nfCB2?8FsTgrGG=JC#R^@sC=#EPQbqenp8IRqmSlaNV z^3?hBkv#H1ja-Z@71t0NbAUqJK!^Q87!MNS0lLc`p(+C?#0zwnJ35N03S2DSG@1F;!I7$KTKq!JPvSzH-OTo{Qhjl?EKTpovdSsdaj zIK<_M5Jy%ci9hQl0O;eg9t^&G831-aG8%wy#kV%$aZ0I58H;^ zl*AG)E?_ERTK{o&ya9*NR2Bh-*+4Eg1JhkSsZ(8N8l=i*ER)^%Ke~)_P5uS1Zn4&` zIcJNyKE0EFs%8Jm*Fd&OJ9XEL`faTNexYicUhLQ(Yn!p43}x zZr*LnxJ=OW=tqw|A66x`-zYCW60gMYl;?7Ko7Bv=aVPVOO?9doL)3Sjd%y2RAs>g7 zzhb5Na+7s4b0*p~)O==JU|Rhk*GoidLz`%;gv$3ES!wxgOQ!hSZ~mje`r*NfRmVSN zsPbvJ{16DLIlX7%^{>Y*t_2u>US+&3`jBhx+`TR9lCI?LI-DStcsN=2!s7)Gr4t`V zAKx%H%EGNMR%T*1m*-v6i{+1QALJ5{n6TaIU;0Cx2MfMEUYQ!&<5K$jg_QZX$BP~` z@4fohS=-_A<3PWRX{iUka&;-Q{+(MMJEh&VKCm|ShSrB&;%lxbbWOHqE@MpGDyeH` z>Hp?$*}^EZuKTa5RWA9@YO8zyGfZ33?b6?MhTh9;e%7SH8izH-NOsp}IN3NX9_% zAc|XWyE*GK9^_`c`|@2EP=gW^`_lx3J#9b@Dl9x-SAd1OL9ujCa{FZ&Lx~-mP3J= z!h?n9FOm@lwHO>sTc3sk6?<_A&P6gw0Vw2yYM+9Un1LUveVg9$CoXXS#zp|DRqJo{ z3YwXNf-MNuLIt3kL*O=bgR=6n*yK76>k}z%$EO3;hoRdkZV-WL=N8HRdy5l5p&W&3 zse+N5K@8kFa4O%_q`g8>b9UPDr*$8WMF6$L!R-d81W=G9CZL4s>4P7`X1&b^xjl(t Ln*9Vs_%#6l=bT(r literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-floor-only-02/package/floor/hi/420ae4c941bba6e12a6c7fdb7d01dc69170ecb4240dffd2e86808ddf87baa12a.m4s b/wai/pack-conformance/packs/video-floor-only-02/package/floor/hi/420ae4c941bba6e12a6c7fdb7d01dc69170ecb4240dffd2e86808ddf87baa12a.m4s new file mode 100644 index 0000000000000000000000000000000000000000..a246e72beae3b37d64c24c831a41f58e23f0cb74 GIT binary patch literal 2605 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 literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-floor-only-02/package/floor/hi/init.mp4 b/wai/pack-conformance/packs/video-floor-only-02/package/floor/hi/init.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..0b3ade2588318c8374e2813c379f92328998bc05 GIT binary patch literal 628 zcmaJ(|3il#OZDrXHF*9Xt4iVyflo2Lr+O&i_bGHW)? zR{&~y95}iJXIX&p%jQpQGF?B~?~xj%c7FFx1BxQB@bmZMan=XA(#B}71zfv-;*cAH bzj}3s&}4iCt=&kQ??7UsT;x3O>uhg-8t^^c literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-floor-only-02/package/floor/lo/589ad79210bff258db68916876846a2b0d530ea2e44260af66ddc51ad14ce07f.m4s b/wai/pack-conformance/packs/video-floor-only-02/package/floor/lo/589ad79210bff258db68916876846a2b0d530ea2e44260af66ddc51ad14ce07f.m4s new file mode 100644 index 0000000000000000000000000000000000000000..78b5c886674e2dbd93fd45b08573c5214c082bb5 GIT binary patch literal 1127 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 J3Z`r-_#X%x5%B;3 literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-floor-only-02/package/floor/lo/d0f68eb18af5b67736ddccd97ed45c4c0274b0460f6abc8f54940ac378165833.m4s b/wai/pack-conformance/packs/video-floor-only-02/package/floor/lo/d0f68eb18af5b67736ddccd97ed45c4c0274b0460f6abc8f54940ac378165833.m4s new file mode 100644 index 0000000000000000000000000000000000000000..6adf8fdfddb9f43c4eda7bcb3dc4a4a5518f1282 GIT binary patch literal 2526 zcmZ`(Yfuwc7+sbW!qWsWgd{+)fLH~07V4lzO>NbV4=Pp}WDp556kEb0#zzND*IGpy zsI(|*QL$<(T18Z#Qguv_Y6?D}7DXb8DB9YNf)4a)?YEnd{nDA{2l@E!`OZ1_+#C8YTu-NHMj$gr`edrK~Fxzy@0e)hSU zgG;lE=jKe>5-UxKo|4#7TKTtY`oxcVO0_3PXInJFU+)I&EFRa;lyc~o{3M2sq+Cr5 zLAbSnS0h0%M7^bewodQA-ewL?mQ>H45kE?P@skf}B_(hX4C5G*A>0mrplb6gj{o7O zOV?uB{!r3>lp868KFb7*3{g}|2T?+Sj|lZF@`3qBk3>CUXc^@x6z^5rgjvGi_KfI` z8!^YKO|+Eq7D=ehJXJ?Z%YE{}zDOYSRmx25{FJ<+aKPiqhHy1Kk`fVBi86kuxwvmm z8*ur#xZhpIPe`}59|#|;?4%`B04W?eVjtL`Bzle?DoH&KL=u6Ic#tQu{N~v{k5*7p zFl?|BZP-iP$+(r@o%?ZK&h?uWbRZ=I%Uk#%>y-n~4vW=vFr`3_A(mi4TIE)^HPj?Z zEnEUIggCpt#c0Ik9+gj{n_)D}%v*=iu=A76sq=D^u9+l%F?0YmigfQw=Os@^Bm_W0 z;R5f$YP(Gsl3PE|B=^s#>xUgg3dP&{ZAM4rk(Ad9o#S72*4!~2@G;K*EdIWS z!35>(FZiOOv-a!9E9FNGO4^^I9TvGu^nK7ST293wXKaM2dFNMo`PG_z8PK1AT!HQG zWtVgPyF7M7wDHc)6xWu$?(4oWVNn$5O!|+vx_mfzmBSh*emNv#V=C-pso(-|- zzgEV^Wg5Qj#>IjjpqQ?dsOIw-9jlNug+TiaV$Y>EzTMXv{)F{DlXUME*|UQ;;3XwC zHSbuT3@dL6yr0{6j0|jfWT}=EmNc1wYPL|k8&N$t5m#@3Sm!!~jSR$aOY!!L@^5xW z#qCiW;B6*2>s#)@jh&CgK_Vz#u=@QqY5*^AXmc^N48g5h=uqYS1Wjn~y1hKVh5>kz zL)n&E0z9o`hn@|dC63$7Kb|x>n6>i%#B=$ z12>xV;gmW02y;g4xe)RC&7hD$R7@-5lRo;^EJ!nxbh~P6a(L;`)5M9V>L}385_sRS zudq+z)5a4KBNnAuBM(GOg$I}|6ju$;L8w-Zbqpz~`q5a^UoZ|X*t}BAZ=OZ;(dU?rCb!_9kb$|A5g*lx= yi~F5!xUnfs`I14B4!hGkq_~7SzAZYO@~EmG7+3LP?C!#fdY7*730?O%TKz9K{6yUV literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-floor-only-02/package/floor/lo/d550ebb204adf0b5a7f310c7d07189e7bed63e12e34e9ed4d9bf96a101d864a9.m4s b/wai/pack-conformance/packs/video-floor-only-02/package/floor/lo/d550ebb204adf0b5a7f310c7d07189e7bed63e12e34e9ed4d9bf96a101d864a9.m4s new file mode 100644 index 0000000000000000000000000000000000000000..5c06ef47a465a0b1f6802d80907cf89f7a8c472a GIT binary patch literal 1695 zcmZQzV6w=~&rf4uU=YYn%SZvzAi&DNz@$)8ln53t0f{q##TkL5NJ&~s35Wp&3m6y} zzmyb}<}om^gM>AJdL4i?i2WR*4a}BcglGbhl1OY3B(@?FTO5gvtXBp}To?yi3P~K7 zIml{|%||v9Ssa;-tOgfb8p#dFYKSohIed`y;$kD4DTZV(G8;J@kj+6BM-G2vy~yT6 z*(~X~DTyUqT)^05Qh$_Nb3no92BQGOY#^7rfoWT(uGSs>wEWQUN1Ue1Dhy@k^6mfC zH7#0jFEeB8{qM2MSyO6 z49yA*4^;l`x@=%1ZotCGf-HVtJ87R~On{M)0UHxX155)$14E~Rk-Py13$Fk~tQ%xb z`4ZjY>{?lg*rScdJrB$?5;frB5M1DZu;reK@3MZNV<2b-t3W#JpyihgOP4@QCp0u1v5rJ#C%_O}6rgc#W$CL@HJj3f+1m^ePJK?q%5 z#U*NeWnlu)DPkc|POPYOI}^^AQfc20jl*NyNuAS7dJ3Lwf^p(c@2PGs=|Up|&O006TcZ;t=~ literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-floor-only-02/package/floor/lo/init.mp4 b/wai/pack-conformance/packs/video-floor-only-02/package/floor/lo/init.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..d419e7893b423b9190462bd07734f8d65d2f1cfc GIT binary patch literal 628 zcmaJ72wlj--P?G~v~>ZbEg8c>oz#gjkv{w=`HjkN|b0NVI}qD>5;-$JpC X@ML@i0XNF!FA&0NA34waI@sGks3|>p literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-floor-only-02/package/hls/all/master.m3u8 b/wai/pack-conformance/packs/video-floor-only-02/package/hls/all/master.m3u8 new file mode 100644 index 000000000..5fb4ccb7c --- /dev/null +++ b/wai/pack-conformance/packs/video-floor-only-02/package/hls/all/master.m3u8 @@ -0,0 +1,7 @@ +#EXTM3U +#EXT-X-VERSION:7 +#EXT-X-INDEPENDENT-SEGMENTS +#EXT-X-STREAM-INF:BANDWIDTH=10440,AVERAGE-BANDWIDTH=9055,CODECS="av01.0.00M.08",RESOLUTION=64x36 +../classic/floor-hi.m3u8 +#EXT-X-STREAM-INF:BANDWIDTH=9016,AVERAGE-BANDWIDTH=8723,CODECS="av01.0.00M.08",RESOLUTION=32x18 +../classic/floor-lo.m3u8 diff --git a/wai/pack-conformance/packs/video-floor-only-02/package/hls/classic/floor-hi.m3u8 b/wai/pack-conformance/packs/video-floor-only-02/package/hls/classic/floor-hi.m3u8 new file mode 100644 index 000000000..d6ac7336d --- /dev/null +++ b/wai/pack-conformance/packs/video-floor-only-02/package/hls/classic/floor-hi.m3u8 @@ -0,0 +1,18 @@ +#EXTM3U +#EXT-X-VERSION:7 +#EXT-X-TARGETDURATION:3 +#EXT-X-MEDIA-SEQUENCE:0 +#EXT-X-PLAYLIST-TYPE:VOD +#EXT-X-INDEPENDENT-SEGMENTS +#EXT-X-MAP:URI="../../floor/hi/init.mp4" +#EXTINF:2.400, +../../floor/hi/420ae4c941bba6e12a6c7fdb7d01dc69170ecb4240dffd2e86808ddf87baa12a.m4s +#EXTINF:1.000, +../../floor/hi/04c948608aaa7b5d78ad5355042a2ff65b0f75d9d4b1ad78f3ebffb886a74be6.m4s +#EXTINF:2.000, +../../floor/hi/2f93f0ad449f9cc881b7816c6ab33fd445037d6538b445bcc76431f9c9f91c5b.m4s +#EXTINF:1.000, +../../floor/hi/06d5cd79ba3860cccdc252fe915de0902f941a3c6a000295714f7cab193aa6cf.m4s +#EXTINF:1.600, +../../floor/hi/576b7d2156c2b595bf48bf34f67996d7f89e75d105f0dc71c9841bb96e6cd0fc.m4s +#EXT-X-ENDLIST diff --git a/wai/pack-conformance/packs/video-floor-only-02/package/hls/classic/floor-lo.m3u8 b/wai/pack-conformance/packs/video-floor-only-02/package/hls/classic/floor-lo.m3u8 new file mode 100644 index 000000000..628e70c2b --- /dev/null +++ b/wai/pack-conformance/packs/video-floor-only-02/package/hls/classic/floor-lo.m3u8 @@ -0,0 +1,18 @@ +#EXTM3U +#EXT-X-VERSION:7 +#EXT-X-TARGETDURATION:3 +#EXT-X-MEDIA-SEQUENCE:0 +#EXT-X-PLAYLIST-TYPE:VOD +#EXT-X-INDEPENDENT-SEGMENTS +#EXT-X-MAP:URI="../../floor/lo/init.mp4" +#EXTINF:2.400, +../../floor/lo/d0f68eb18af5b67736ddccd97ed45c4c0274b0460f6abc8f54940ac378165833.m4s +#EXTINF:1.000, +../../floor/lo/6bba50408f894d0e9d5516a53992fdd2aa86db43ccdc684b69c51a688856a0db.m4s +#EXTINF:2.000, +../../floor/lo/acd166807d05fe4f512407f717659d88613f6d0d360485effe3751504cefbb74.m4s +#EXTINF:1.000, +../../floor/lo/589ad79210bff258db68916876846a2b0d530ea2e44260af66ddc51ad14ce07f.m4s +#EXTINF:1.600, +../../floor/lo/d550ebb204adf0b5a7f310c7d07189e7bed63e12e34e9ed4d9bf96a101d864a9.m4s +#EXT-X-ENDLIST diff --git a/wai/pack-conformance/packs/video-floor-only-02/package/hls/classic/master.m3u8 b/wai/pack-conformance/packs/video-floor-only-02/package/hls/classic/master.m3u8 new file mode 100644 index 000000000..5fb4ccb7c --- /dev/null +++ b/wai/pack-conformance/packs/video-floor-only-02/package/hls/classic/master.m3u8 @@ -0,0 +1,7 @@ +#EXTM3U +#EXT-X-VERSION:7 +#EXT-X-INDEPENDENT-SEGMENTS +#EXT-X-STREAM-INF:BANDWIDTH=10440,AVERAGE-BANDWIDTH=9055,CODECS="av01.0.00M.08",RESOLUTION=64x36 +../classic/floor-hi.m3u8 +#EXT-X-STREAM-INF:BANDWIDTH=9016,AVERAGE-BANDWIDTH=8723,CODECS="av01.0.00M.08",RESOLUTION=32x18 +../classic/floor-lo.m3u8 diff --git a/wai/pack-conformance/packs/video-floor-only-02/package/index-v.wsix b/wai/pack-conformance/packs/video-floor-only-02/package/index-v.wsix new file mode 100644 index 0000000000000000000000000000000000000000..3338fc15ba3171fd49ba3a368aa1cc0e872d0be2 GIT binary patch literal 1648 zcmWF!_KaX;U|^60Vi3&=#9Tnk4CSjHKW)dty*A`xK;08 zSIF83R7MhrNdKeth&w&SP{4f4T@kTd(FcM%O&ag3{N1!rY+vfE7q|?wfl4qju%Re{ ziG$qF1jeZHp-|OEK$-=Md^=Pgq#vXc-TVbmc?}@Vfkpm&Dr*i$annEVN8e6|U31GU zF4q`?b)_OVtSOR1b(d_SWQPh4U|~ zxK*|Htd?y#eCF?I<>vw)V>On85)u%A(iR9%YX4_YBqM?K%O9-s_bGL4@-S1Gkg_WM zs==L*b=qsgbPp@X*X{o^%MujnKtL_~TcQ4en99H)vtYi}N|U_*@AenISPJ VhnJx|F;lNBGbJ@&FR{#!0RT_OSBC%q literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-floor-only-02/package/moq/catalog.json b/wai/pack-conformance/packs/video-floor-only-02/package/moq/catalog.json new file mode 100644 index 000000000..90091605e --- /dev/null +++ b/wai/pack-conformance/packs/video-floor-only-02/package/moq/catalog.json @@ -0,0 +1 @@ +{"tracks":[{"altGroup":1,"codec":"av01.0.00M.08","height":36,"name":"hi/floor","namespace":"video-floor-only-02","packaging":"cmaf","renderGroup":1,"width":64},{"altGroup":1,"codec":"av01.0.00M.08","height":18,"name":"lo/floor","namespace":"video-floor-only-02","packaging":"cmaf","renderGroup":1,"width":32}],"version":1} diff --git a/wai/pack-conformance/packs/video-floor-only-02/package/objects/1ca09f3aa9346effeebfc1bd101de2c311a3cd586379d1dea5c235d1b47fde60.wai b/wai/pack-conformance/packs/video-floor-only-02/package/objects/1ca09f3aa9346effeebfc1bd101de2c311a3cd586379d1dea5c235d1b47fde60.wai new file mode 100644 index 0000000000000000000000000000000000000000..a00277606fdbd954a40c14da7ef28e8cca8569d4 GIT binary patch literal 2204 zcmZ9MdpuNW7{|{{g9&NI2h9v>=8$A2dt62uHq(+tVzjv|DZ?Dhr!kWuiZIJk4Yk;k zlBjJZAL*hbmFT8qTiw)FTGncHA!<=cyJyUP-s9{a?`P&czvuTn-{*awb3&K-I#fdt zln$qgrLX{Yut#7XoPbKCVr-Wpm7of2FO?^w@?`9R65Sw^#)y+qO^`x@%GN2-#EnuV znlPoO!!hCw;%KQ%n!Fi{#!}i(rLY&LIKUY^I7T6tNRy=sxl|qp3)12BQn>_+`%g_4 zE8|eCN;({?6eplbuz-*7;CNWzap<<Cn9BLt)kN}-z-*u)f!oOJTsQQUsJ*3+*qqM)4Tz^w4?_&Ag=F7U|- za~tX!8``k_5;yH+?KOj9`Q-(htpq-*ug5z~BQy7$`MLMmpINT;Ip@D5Rnhs^Mtm*| z*F#)>R8}Bo^Wr1Ub$ew+OI2Im z=~nX7dlLLiSSRvKa~am-GE4J$4TpCHdenbn>kRi)*R;KjpKoOA^`5qB%dHDV4@cWv zyF^a!YMdG(E-z0gzxaJ!^!`c`r!fl83O>j6@_H)A`i`Q(1zsB`23U*7`VRHvTzoL;$raw~3krxYL0d-k)mA!_ z<*AXowl2>K%7}bqH{3L*_C8zvquY!WlK2dBk;{_6*OMs+!(G(Bzf8Bj8@Mko^Ua44 zF4Oz&WSzr`D)$drdZjzh9eCDGDv6XSMz8Zj6(vfe2~zLu#^&-*XXfnOByG5#`&W=& z8TXTJ@$UNf55=4?t7S%Rxupf$otVWA!xKv$y!3EHb&dwCppR`SPJ7;5U2fF8?U3(B z@{R4v@I1~p1+M3PrKYj-KVLy&m#l1n9y2VDZR+{kVq z=4fULQ`iWFM47HUU6Z(;(>U8|+?w_6P5uxKWY8s3Rns!4Rr9qOI0%(8i#AQ^tnE4o z83@e14o7oU1KgTMQ*9s}(WlZYg*Zf(rB+}fhBPx|8!ogjdgYTem?3NdP9rv}7Xqg-Nv}5s50G)RH7yYnGIgX@E2ywTxhh=2oUE+2sYG># zT!7n*GK)TnyW{6+-R1}bYb6sGy0>wE+Q=;NbbYM?UKZBW4|qttjn)ez7ND7YP33Oi z89cf2R+@O>OcP7h({UA^VlJ_}Ft#>@1;S}1boIpB^9xd|0jc}NkQ&s7$$I@!c>O$J zwx$@4R!<4}npt?pJbTZ=fzepcU)l*`Y^e0z!?^hx>fveoYj54F&qW+_EyNtemS*O> z36JTHZSe1*;P7^A*3}!hECN0rR1wU;g{OP}mM2PZpFNRVr1|P$lWK|}fLo>EeiFT3 z5(T<-Bm#>pv@QnXOr-p+LneuNQHYmwA!0@Wqbm`!M^r%)(GLhgMFEi$0Y-Ns=eg(E zp&>SbCxCG&5jBdTMKwW|6>1K&1-zuRSX*HFif!gD!VfJIOrjTbpraEP>T`TT4gF7F zzAbM8UT?BqHw_PA15zJ~;pDWWt#*)*pW7b{jDA#l`Lx_@Aovq$*eq=eW=H^$=G5S9 z@nIpjc@Yuh_~RXPm&N#1tRmvDL655eN519*RuvhONp-s+@ow7#h(i8H1Zsv6iB2;w zT}+C?Z!w&R#D=w<%th7!n5nn)R5rJov#>1oNPp(=^)OI&Eg(~AW)eSIaTMXcZncht S>>E_zy+%VN9)Hz>y zfl3hq^1%Qu1aiO(I2940Z#hUREJNQBsREWN&<|O#d=nxTDPU8PEEV3Ak_BgOMzY`x zGp+)~BDv@%WD}y;idLhPTr&k%loJ5vaX_(5nu;h8nG}&qK)wpxh)7e>x^JjLlqG>t z6&0A4CCY%aL4FX#0XKmBKpqEFf_z?3Ufv5U0Psis`k*HqJ#Of+K#vUx02}~oYxI$H z)>xSWQRjWIqyd${HUMBX0IWfF;;*jE_V_*I%=1k#;(bFyypkA=_PpKk1f_7SBk$-4 zFx{&RED%*aHW;7PKR9jeKkOK+@P8q6G)AU+>%fYaObhx8G09 z-L~jdv$_npbc+o>nR#sM!ljjece#XS3|s2G(yrTusXe_6r@=J^IWnf!L#AgYjP!o! zSxzbvcx8hh(&Iydez=%k_?gFC60YPe4A;JhL*PKU(=hwCt3*%o4Oiiw$*m|?Q9l1yz^vQ z_)B8SYao~4O2dc2v3ZiW8=@V#NZY;1F zPK)lfeRQaZznuF%vW~(|TW~I^vEUi`-#Ly4p39o6*uk48xs*|6-uJzG{+9Qb*n(@2! z-;dQd)-c)0Rli^SV!uYB%8OMhdg%jhQjPb`Mh_}*B_wLck4(I4J#QiZjtkoSWJw|4Wa>uS2Bo_ z&K0Y3>qcMS3}IjebjZPi@=#0^v>$%5o+8IRI+3Wx(*&C2inTdGbh4fO7y)RbVr%gx zS2S2YfhFKg3^dp;1kgTCcfy-Ire;ZS$CO+kPdtJ7HnbiZBnN81C*j>O#eW6O^y8xw zc7{L_<+1RaS|JN~5L@P3jCSGy8GdxT;PZ{kieigH3Y08KRs1!B?WLi2EYrD}A^ zbSWT}lAojhIuLEF5njl?ejr`L6l|z$rb!J4`5K%rh%j&3T0)37)wXahCd7so;I_@% ztb4Ph`_muFq<6OWx#@4;vTw6{8eVE^Rt)xK;UfI0X@s*eE?+1VPh;ll`16d-y*6H5 ze82Yfu@lqmS6?m4y{5xy!tjV{lUE@=@I@Na1a$xZdgZ}Bm;eh}%%X?JneW&v&|Q46 z`C$O>-k3{Oiu?9!?KpJ=P~F`}%z}jjktE6>Z4$u2nEfF^gze`^%zf%N8`J6>y|47_ zE{=}$i&-MOqinn?(BV#&QEewQgp;<3XQgMAHBFIwHM>?=N36#Mqgl=sSe@DwlI4d9 geh0+>)h&|SWu~O&1NoVGC8>EOK!Kvvf}G6c z#FA8yqWqN9ocN;D!qUv5)LgK9wNi3oL1I#7PG(6ZP&Lp?6pe@x(X+?>-sl`fGMy5JS8A?{hW;#mcN>*kj zwY8s_7#Jjh?o|O|2OtKq8G+aoh=mxqxPTPX`j4~Y4LFQcMHrMF7#JFWLPiocTn4XV z6TGsYZ2$Z1r8Kkp!+UdOXXzMiQ_u!V3o#g}8!Tn2Z%usnFhEF3lm!hl1zJp zD8w{DBUToU3kqP%!FpQZ5^NmY5-tddCb$H<0B=G@GswAM9S8{y2LBbk2pu&V5IaZ5{P{>8dAR9Zj4Tz`5QgNyCAfiJ_=T_* zA;AOmfjvS;23!X(&i~2MuLpYpEdw( z7jR$@VF02l>zP!Z-Zg$^>wmmjXn)6j(YyB_$R*muvBJ#~Vq&Yh0@uO95CNAFX5l#X w14$+TE+fLhEoFmMMpS?|DFv&H7=!<+9;`CrC~jt92oQ((M%YLK&29S}0Llfxm;e9( literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-floor-only-02/package/objects/808567682e2687d0f431e2d2dead4f574212ee1e6addaa99a73ab22258de73fa.wai b/wai/pack-conformance/packs/video-floor-only-02/package/objects/808567682e2687d0f431e2d2dead4f574212ee1e6addaa99a73ab22258de73fa.wai new file mode 100644 index 0000000000000000000000000000000000000000..c05dd73373233ac8cf948929975396d9ba8c56eb GIT binary patch literal 1559 zcmWG{^fX+-z`#(gRGyfrWTj-NXP~5`l$)B8nF!>SWu~O&1NoVGC8>EOK!Kvvf}G6c z#FA8yqWqN9ocN;D!qUv5)LgK9wNi3oL1I#7PG(6ZP&Lp?6pe@x(X+?>-sl`fGCI&i68A?`$7CK7hN>;{3 zwYABt3=A4T_X+{A0uW0AF(VMa1Y#iuE-oO&r2Z(k=756H4MqWm*+4FL1JkxnU9CI% zY5Aeyk2p=2RT#?7<=g+OYg)A6US`JF``=@iv#_{5PP0yJNV(#0c;?hjwjN`q?l2Yu zFT=Nbi?wFUskvAPvu^NMKf8mmxGPlMSYl<{vzgaI-kx#o{Gqsd?&-=`s}cjgH8xeA zz4>`Qk6DsTOXK@Tp=A-eE?e6rf4g+4d`yu8GkaLOuG zlDR<&>{%l*1Lgw_3=C`+fSzn%XjWi&pz?3mWdmu5thfOSBMY+ZeeI-umN5Zh5NRO; zHYSb+m}Z6shE4@#h>W}e2MezNM5Y^La`_V7;_O;kiP)o!$2||s0|mJdgOR8K7l+^i z2ZZhSOnjI1!=1(>AZE~kki4_wKw7Gk97L;>0iS}@fs0^Sunme^7QT_K=$B^tAPP|- zXdu8aKTry)ALzO^xP%ZR`@>{}M3W3ehlGI$6UWCj2#L$9xJ0e5EKGnqSB!;M@GDdv z7+7~CKkcxBJ68hempX*x?eNgDUXi(*rHTg;UI9g4tHOfPe7LL<6Z_Kygr#S1f1knM05?>Hh3D%Eglq&{LXAUk z>IZ~G0bD{uK+L29ArT-82{=guEd{9~C%_Wj4Z!FYo4AXA$AL*}Dhf|yMJG@wBG7?!L?xW$EG-kA%CP@DqS<;KK*R{){w#>1#{+3>vR>B93DVk9`H zc)Y9M%prZ~zNC4BU%_&Gx} MC$j8;FCWVs0PuF4$^ZZW literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-floor-only-02/package/objects/95f784de520ecef9127c1758264b16b69a0fc1e375bea6515cabc4bcf71a29ad.wai b/wai/pack-conformance/packs/video-floor-only-02/package/objects/95f784de520ecef9127c1758264b16b69a0fc1e375bea6515cabc4bcf71a29ad.wai new file mode 100644 index 0000000000000000000000000000000000000000..bb025eae3d696fae715f856387dbf1720b828d8a GIT binary patch literal 2052 zcmY*ZX;4#F7=45YDO-~m0|X@D83F=k9s!~T>sAz0gs^A@Q!pk0UWFuvC}5<0sHLpJ zfD3L=YzNm-2dcH|Xed;$T9*`CP|#pStxKgURqJ%@TjG84<4)$~ob%mtzVF`q$(#id z`ymLjz=diQR=^Qb1P+Juby`%7f2~EeIs^WV>diX68UMqiGv=WhwOL1y3|d`YmPxmI z4QkTmleh)esEz8CXdY@V#@TpDDOp0QUK;_Igu@zxUW=MhgC5oAzzPez3e{_Io&zE_(FJF8);p-W`xR9G0 z{=*2qlfT|7k_|brpzA?6|$J&1)M6>wl;|Ic}YCNAjbA zUsY#93f~sDgtZ!9Ejo~RMKkn4TX=lf(VnRMFQ0VQNU9F9W(+sh3VF7=7uf{~hn@t> z=b7s6_{p3Rvw^d-zWB|Z(^GqyzNxz}-$;rJ)@Nv5zL<&@baY2wO6xTCJrHH>bGQ96 z|B2POnj_XF{XVr(acHAUd(-r=x3cWf>We|PKP&ud1uZ9}n&bly{m#9$CvJK%l3HC* z>oRSYoA}M_T$}bEzH^dlgIDqM$CiFcza$~(1mrb|Of3^4&Q=V9T(072t1t+IJX>#Q za%PUZ>DAhGR9=SpQ#2oh>BMx{z0`9y-0_!zedm#XY3q9_NCs1Mz!iJiY1vG97pa22Fb#fijkU$j?>w@2R z?d$q(mG-lMl*eHGeVCSNfnPq;lQT*Ko!jk|wf|ay&Igb4ISs48mI6FTEe%|l+`ufo zyUXA~OZ~^DSq5em0Af^Oc#|izS@x?MZhB|=D)>9oG0@|{j(4HRPF5Si-Y~;;cm=)p z*(~V6*3&Y{>7Ag>Vy4IFeg}hSGcPP{yoBl&j7V6Vts^8zcFVmdaZkoW;g&D92ep)^ zcmA4y6i7kWi7JtA~P#AeUDeYVs7jpY4#RF6I^uoY~Tw zu8fq!6gvP3hnko8IM}$STcIXno#x{oGkIKH!ucSI6^KYdHqzY0==tgYmvl;Yn zh&i@5IqI;xGDJXe_=pnNBj+~|cyCpzJ&-~tA}M2C^*zSs37eOmObCV2nInEcv3nxi0rQwoJNIZwKmS@0ldj;P7PtXQbM#uzOS5@PZuaSFgZZrvmm! z%C+N7*Ups<<$`;V37l0CBefTG#0XPv2cKlPD_-Q71Ce$n54VR2iFSWu~O&1NoVGC8>EOK!Kvvf}G6c z#FA8yqWqN9ocN;D!qUv5)LgK9wNi3oL1I#7PG(6ZP&Lp?6pe@x(X+?>-sl`fGMy5JS8A?`$7CK7hN>;{3 zwY9Cx3=EP$_X+{A0uY1Pj6iG*#6k>QTtJFR{ZVes0R9O zr1yT_=6Q(+Y>aysx5TF%FoS3@GGbzAf@@)PV7R2zv%8Tq{^EmBfr%k+bc?*C`4~^# zTw1z>g?FpioxP703p5})Rg9P!SsdV&O<=gMwSD2%>j$oGlK+0hD6mI!hHy@U7(}g* z5epMr2ShEv18^C30p5g+W{@|*diokf zA@&FwaWMF==tbz6s|=BlH{xVy{;(0O#q|Kt0nu3*CtF4OXJyA){@iDFMGK-#&4`PU zrQ#Y`KUmq>41?Us?`|-1$2mz=^c>{32sgfCVhcBv8|bTFP(vLjFx(5@qr+~qsWC}V zeX^W-zAD5}MI#=d7wr*-o>AKTfrqbY)23x}Y$m(CQ+@zf$P4tbJHouX_O8;hGnTeC zZDBw9;T79r3Ai`;Py?VFF2RrL|1Nlt2|R%L-vJZ>69nL%5M*Tjv;pBdUiIXfDKoCH z32(act==#|1>y+>BOxZXsw)U(7e9Y%tKHK2Qs%{asqal8Clny+WQ>GaI8Ob5sso0} z9nbDhtDpS!vT5DWAPZ3=X(YnIEoB2$!|1?pq0eL8$FS5B8{lpd72r)uK^Ss-RmIhY q;y;dQ5yvinR#$@iR*b=aRS#I11ISZ-a0zj^pU@;E;JyG$tONihvl;FH literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-floor-only-02/package/objects/bac29f2cf9f5bbc85f3095d0eb0b081b8fad0552739024df229481e73d4cd341.wai b/wai/pack-conformance/packs/video-floor-only-02/package/objects/bac29f2cf9f5bbc85f3095d0eb0b081b8fad0552739024df229481e73d4cd341.wai new file mode 100644 index 0000000000000000000000000000000000000000..2bc6503c3b1b5bb339d6339816d26458e8d23b42 GIT binary patch literal 2270 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 LNB;T4GU@*TnaWI= literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-ladder-01/key.hex b/wai/pack-conformance/packs/video-ladder-01/key.hex new file mode 100644 index 000000000..602576559 --- /dev/null +++ b/wai/pack-conformance/packs/video-ladder-01/key.hex @@ -0,0 +1 @@ +92baad1b286358f32cf2996070c85a60ab85af6055432d4a754a4fde64fcbe09 diff --git a/wai/pack-conformance/packs/video-ladder-01/package/LISTING b/wai/pack-conformance/packs/video-ladder-01/package/LISTING new file mode 100644 index 000000000..3ac875157 --- /dev/null +++ b/wai/pack-conformance/packs/video-ladder-01/package/LISTING @@ -0,0 +1,46 @@ +c5203585fea0962de941d258789157a0590e18b62a2e5d1facbd11e1cfd1ddb9 dash/classic.mpd +a3aa7658db9b85a9d9a1fed977825189f75c5adad0f5fdfcd70ebd604824c138 dash/mobile.mpd +3f520749a6d2f231cddfd17804ee3629439f3678515e424c44e36cff54d89de9 dash/tv.mpd +04c948608aaa7b5d78ad5355042a2ff65b0f75d9d4b1ad78f3ebffb886a74be6 floor/hi/04c948608aaa7b5d78ad5355042a2ff65b0f75d9d4b1ad78f3ebffb886a74be6.m4s +06d5cd79ba3860cccdc252fe915de0902f941a3c6a000295714f7cab193aa6cf floor/hi/06d5cd79ba3860cccdc252fe915de0902f941a3c6a000295714f7cab193aa6cf.m4s +2f93f0ad449f9cc881b7816c6ab33fd445037d6538b445bcc76431f9c9f91c5b floor/hi/2f93f0ad449f9cc881b7816c6ab33fd445037d6538b445bcc76431f9c9f91c5b.m4s +420ae4c941bba6e12a6c7fdb7d01dc69170ecb4240dffd2e86808ddf87baa12a floor/hi/420ae4c941bba6e12a6c7fdb7d01dc69170ecb4240dffd2e86808ddf87baa12a.m4s +576b7d2156c2b595bf48bf34f67996d7f89e75d105f0dc71c9841bb96e6cd0fc floor/hi/576b7d2156c2b595bf48bf34f67996d7f89e75d105f0dc71c9841bb96e6cd0fc.m4s +58c598174eed554cd0d1bc8abedca8c9d51d992c8e3b963bcb7574da4983ed9f floor/hi/init.mp4 +589ad79210bff258db68916876846a2b0d530ea2e44260af66ddc51ad14ce07f floor/lo/589ad79210bff258db68916876846a2b0d530ea2e44260af66ddc51ad14ce07f.m4s +6bba50408f894d0e9d5516a53992fdd2aa86db43ccdc684b69c51a688856a0db floor/lo/6bba50408f894d0e9d5516a53992fdd2aa86db43ccdc684b69c51a688856a0db.m4s +acd166807d05fe4f512407f717659d88613f6d0d360485effe3751504cefbb74 floor/lo/acd166807d05fe4f512407f717659d88613f6d0d360485effe3751504cefbb74.m4s +d0f68eb18af5b67736ddccd97ed45c4c0274b0460f6abc8f54940ac378165833 floor/lo/d0f68eb18af5b67736ddccd97ed45c4c0274b0460f6abc8f54940ac378165833.m4s +d550ebb204adf0b5a7f310c7d07189e7bed63e12e34e9ed4d9bf96a101d864a9 floor/lo/d550ebb204adf0b5a7f310c7d07189e7bed63e12e34e9ed4d9bf96a101d864a9.m4s +640cd81c83baefbe13e8ccc2bf577395c6602885cc73e201ca34dc267e7f0a48 floor/lo/init.mp4 +bfa98255d682517f58df4073bc71fdb3fcca120fc33d16e4aca873392476c586 hls/classic/floor-hi.m3u8 +ad81674ac359096ebed255a26a40e82858e53e9754702429e59d72898df33812 hls/classic/floor-lo.m3u8 +3fd88f9dcf835edf0fcca8dff8371d2b4e897ac097fc85901477c950c0da7996 hls/classic/master.m3u8 +3fd88f9dcf835edf0fcca8dff8371d2b4e897ac097fc85901477c950c0da7996 hls/legacy/master.m3u8 +09e75f55cb7ea829a4e630404d2ab540e8be0dbb1c4365dc30802359b658aed9 hls/mobile/master.m3u8 +c4044eca76959c9f87230484a2b207fb12c0bcaedb8d921eab806014fca53cb8 hls/mobile/wai-v.m3u8 +60a6378f46afc9308dc4ac4d138602b16568577616ea0bf4526b142d86899151 hls/mobile/wai.m3u8 +09e75f55cb7ea829a4e630404d2ab540e8be0dbb1c4365dc30802359b658aed9 hls/tv/master.m3u8 +ff4edf2929e380d205c1c74156621185feec53d593ffa968b8dfaf0d05448bcd hls/tv/wai-v.m3u8 +5d42147b308330913c3d9c8a868ca83ce4d3f3e460da8d84c84014eb24aaf9d7 hls/tv/wai.m3u8 +a5140df0bf1f82b88335c13789502298a952b350ad45dfcfcd249b2b9a263a71 index-v.wsix +c310c5a4ae14df691a1a37a6c34e90243ed72be1e8f725d38f1babe1f6866b21 moq/catalog.json +07e98fb9ef9ff3fa6bf04f9078da2a3d2423e586feea1061256131a1d1fbb943 objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai +2f5bd830d841eb122c63ae57a15442075478fd522ce55b6f9bcbe41acd51d8ae objects/482fbbb9b39bdb9cbf00515f94269ea591df681ced90b05d97e0df106b49b08e.wai +0057633252a2c2ed5f71fe14ca78075c8e89fc6675a08335ac90f0e56032b825 objects/4ab8f747d181632f342a4887b0a8bb86c174409cb625157784e18c5e5559a381.wai +cfb71256ef44758ea279846a8938823994d321abce83ef73afd2ed269a8e0259 objects/618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481.wai +f3eedf9eb2870c0160801397412e7a4c3aca4a6e16f1a69a276e1356d38c9220 objects/61c7c3b7ccab07ed01df5b0d7ca0240598b914dbf2cabe545aa001e8de12d365.wai +1a6f30fdc000f258c948470386d84beef2ba5a84e922c355093837ae21fd573c objects/6ce13c9ef6872caeb7fbe71661ca88bcc463ceac47f109c8c155e34bb1a6f37d.wai +b773dac63c9d2d9980d0d249ea956e03065c1ae40d17c512df29b690c0c820ef objects/b7bf0717e968d7b6be473785c9f66cbb814cde679bceb1ae37f0765308ddee72.wai +b2a40a9a8cec3dcaf6c92a07d6765203c412c57ec879b7e33a52eabb2e74609d objects/c2ce1907255a041c388afd06ccd007436368e8d20467fdec2a1eebbb84b03bf2.wai +cc8a6fc59be29bd33d96fb30ea9e5a30a5aa367a82da9c5784cbadce63396f62 objects/cf842ef3058d3c54d56c0ea3e075efdc77163602b4a1dabcff080e5ea28b9946.wai +01b596b672de3352adb3e01b34fcddfeff975f4ee1d0b88dde160ac10c9bf929 objects/d382ba093b0595c44a43dc3aad22fc0bed42baeb3488f00dfe3567056a7009c5.wai +9d9ae296558ce7f7d644ad0ca3af65eb4fc98d03b0bd6d7a8fc821fc952e86c1 objects/f525b4450c29153dde0b43e4d143dfb76fcc3884c607b744c8a53fa6a1728580.wai +3d573ee482f8187b0e3bc839aeea0f51a67144588d6d207e8466fea91a0c5b34 objects/f7f7f4d6af777bfcce09cdda5ecb754ce6bd8dcd2e03ecfc41359cad989b15f7.wai +bd6086051d0452449da8a90f426f454fee368b4794f7c294218a410ded8d9088 package.receipt.json +517630d9bee1f5559baff3bb3e642f6aa7b5276226f6e3bdba4f3f9724794859 plan-v.txt +d1cf1bd28a06f3a9d695dd64331cb56cf793818e9e9e6cec620183d9dce37b2d policy.json +4ba48d04e5c8e72336e32307b27b4371c96f20f7abf959ac1c1d344ccb9a8106 policy.toml +813329d5521ab5891bb86d29b362e448fae4247c949384b0687d66966546c4fe stages/legacy.json +ca8e0059a23311d7690a0519f85dfb48883721c817cd8fe1cd481cabe14b0032 stages/mobile.json +8bc9c9da674b4765ead0e41d54852ac105161e9638e7ae705e3982847b069e4c stages/tv.json diff --git a/wai/pack-conformance/packs/video-ladder-01/package/dash/classic.mpd b/wai/pack-conformance/packs/video-ladder-01/package/dash/classic.mpd new file mode 100644 index 000000000..0bc509f7c --- /dev/null +++ b/wai/pack-conformance/packs/video-ladder-01/package/dash/classic.mpd @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wai/pack-conformance/packs/video-ladder-01/package/dash/mobile.mpd b/wai/pack-conformance/packs/video-ladder-01/package/dash/mobile.mpd new file mode 100644 index 000000000..d3340daa2 --- /dev/null +++ b/wai/pack-conformance/packs/video-ladder-01/package/dash/mobile.mpd @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/wai/pack-conformance/packs/video-ladder-01/package/dash/tv.mpd b/wai/pack-conformance/packs/video-ladder-01/package/dash/tv.mpd new file mode 100644 index 000000000..f0817bb2c --- /dev/null +++ b/wai/pack-conformance/packs/video-ladder-01/package/dash/tv.mpd @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wai/pack-conformance/packs/video-ladder-01/package/floor/hi/04c948608aaa7b5d78ad5355042a2ff65b0f75d9d4b1ad78f3ebffb886a74be6.m4s b/wai/pack-conformance/packs/video-ladder-01/package/floor/hi/04c948608aaa7b5d78ad5355042a2ff65b0f75d9d4b1ad78f3ebffb886a74be6.m4s new file mode 100644 index 0000000000000000000000000000000000000000..7e5a29203e5ad8907861e9d0bba3c074652aaabe GIT binary patch literal 981 zcmZQzU~I|F&rf4uU=YYn%SZvzAi%`Hz?f4~ln53t0f_@efPfK*MM~0AN`ZD>)ul4GzYNU-fRG!?;WVklSNXUqZ zp$V!GsKJ4u>kCkfnUTc-q8TFA02E_kV(UN>Yi}?TG-74pxS#;G1gx$VD8$CWE#ZO? zY61$e3-BgnG=rQ1Rs|B`VDMkji%?Z#q+-O$(EMQ|Se5GmpgS%J)G54YWIT4KVrj#d z%2VghNAk!6HF7bsR9r)7%mE5<10D7YVLV8P2k0()gsKdn5HHYO?g&*NAwE=hfrR)` z-IW3Kx4;9KyTGoW^T9~VNRW~F(*~gV0uBr!z*Ng{Wj&M1)4RscZ2gZ{3+?Z?FM9X> z1Gz+-I98y3Attt}D{!?e3=u#vVHS>4Kaj)%fMOyX+)_4ZVxj`PNhxSzVhsMPdeFqg SQQX7A5MU&1B!On{J_i6~LX$%P literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-ladder-01/package/floor/hi/06d5cd79ba3860cccdc252fe915de0902f941a3c6a000295714f7cab193aa6cf.m4s b/wai/pack-conformance/packs/video-ladder-01/package/floor/hi/06d5cd79ba3860cccdc252fe915de0902f941a3c6a000295714f7cab193aa6cf.m4s new file mode 100644 index 0000000000000000000000000000000000000000..3e21af5bfbf09877f851ca6abe777d4380b6af59 GIT binary patch literal 981 zcmZQzU~I|F&rf4uU=YYn%SZvzAi%=Fz?f4~ln53t0f{q##TkL5NJ&~s35Wp&?Lf5- zB}Juq3=HfbVM!pr2S|h1#t>~_wk9J)6NnTcf-Q`sh8VUQiRy_l6WN_QNaiDpQ^FR7 zn8_5Fo03?<#RUu*ru83Z#~W}MsfsWtJ1{Ub0ELVsY`6?w#U^-VKiU5G+e>L?^@sQ7 z%Ffa;+NNNnZp8QisEj!S7~ZZ8j1COvpWLszzD)k{YrQ(F8foJVl_z&I8Lka75;9_9 zXo4yPYH(oa`T`VVW@K@IXoiS20L56C*gBBJ+8c}njaXSYE+~L40jp~T3bAo;OSm9} znt(#=0=x+s%^;_MRe^*!82nfCB2?8FsTgrGG=JC#R^@sC=#EPQbqenp8IRqmSlaNV z^3?hBkv#H1ja-Z@71t0NbAUqJK!^Q87!MNS0lLc`p(+C?#0zwnJ35N03S2DSG@1F;!I7$KTKq!JPvSzH-OTo{Qhjl?EKTpovdSsdaj zIK<_M5Jy%ci9hQl0O;eg9t^&G831-aG8%wy#kV%$aZ0I58H;^ zl*AG)E?_ERTK{o&ya9*NR2Bh-*+4Eg1JhkSsZ(8N8l=i*ER)^%Ke~)_P5uS1Zn4&` zIcJNyKE0EFs%8Jm*Fd&OJ9XEL`faTNexYicUhLQ(Yn!p43}x zZr*LnxJ=OW=tqw|A66x`-zYCW60gMYl;?7Ko7Bv=aVPVOO?9doL)3Sjd%y2RAs>g7 zzhb5Na+7s4b0*p~)O==JU|Rhk*GoidLz`%;gv$3ES!wxgOQ!hSZ~mje`r*NfRmVSN zsPbvJ{16DLIlX7%^{>Y*t_2u>US+&3`jBhx+`TR9lCI?LI-DStcsN=2!s7)Gr4t`V zAKx%H%EGNMR%T*1m*-v6i{+1QALJ5{n6TaIU;0Cx2MfMEUYQ!&<5K$jg_QZX$BP~` z@4fohS=-_A<3PWRX{iUka&;-Q{+(MMJEh&VKCm|ShSrB&;%lxbbWOHqE@MpGDyeH` z>Hp?$*}^EZuKTa5RWA9@YO8zyGfZ33?b6?MhTh9;e%7SH8izH-NOsp}IN3NX9_% zAc|XWyE*GK9^_`c`|@2EP=gW^`_lx3J#9b@Dl9x-SAd1OL9ujCa{FZ&Lx~-mP3J= z!h?n9FOm@lwHO>sTc3sk6?<_A&P6gw0Vw2yYM+9Un1LUveVg9$CoXXS#zp|DRqJo{ z3YwXNf-MNuLIt3kL*O=bgR=6n*yK76>k}z%$EO3;hoRdkZV-WL=N8HRdy5l5p&W&3 zse+N5K@8kFa4O%_q`g8>b9UPDr*$8WMF6$L!R-d81W=G9CZL4s>4P7`X1&b^xjl(t Ln*9Vs_%#6l=bT(r literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-ladder-01/package/floor/hi/420ae4c941bba6e12a6c7fdb7d01dc69170ecb4240dffd2e86808ddf87baa12a.m4s b/wai/pack-conformance/packs/video-ladder-01/package/floor/hi/420ae4c941bba6e12a6c7fdb7d01dc69170ecb4240dffd2e86808ddf87baa12a.m4s new file mode 100644 index 0000000000000000000000000000000000000000..a246e72beae3b37d64c24c831a41f58e23f0cb74 GIT binary patch literal 2605 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 literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-ladder-01/package/floor/hi/init.mp4 b/wai/pack-conformance/packs/video-ladder-01/package/floor/hi/init.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..0b3ade2588318c8374e2813c379f92328998bc05 GIT binary patch literal 628 zcmaJ(|3il#OZDrXHF*9Xt4iVyflo2Lr+O&i_bGHW)? zR{&~y95}iJXIX&p%jQpQGF?B~?~xj%c7FFx1BxQB@bmZMan=XA(#B}71zfv-;*cAH bzj}3s&}4iCt=&kQ??7UsT;x3O>uhg-8t^^c literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-ladder-01/package/floor/lo/589ad79210bff258db68916876846a2b0d530ea2e44260af66ddc51ad14ce07f.m4s b/wai/pack-conformance/packs/video-ladder-01/package/floor/lo/589ad79210bff258db68916876846a2b0d530ea2e44260af66ddc51ad14ce07f.m4s new file mode 100644 index 0000000000000000000000000000000000000000..78b5c886674e2dbd93fd45b08573c5214c082bb5 GIT binary patch literal 1127 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 J3Z`r-_#X%x5%B;3 literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-ladder-01/package/floor/lo/d0f68eb18af5b67736ddccd97ed45c4c0274b0460f6abc8f54940ac378165833.m4s b/wai/pack-conformance/packs/video-ladder-01/package/floor/lo/d0f68eb18af5b67736ddccd97ed45c4c0274b0460f6abc8f54940ac378165833.m4s new file mode 100644 index 0000000000000000000000000000000000000000..6adf8fdfddb9f43c4eda7bcb3dc4a4a5518f1282 GIT binary patch literal 2526 zcmZ`(Yfuwc7+sbW!qWsWgd{+)fLH~07V4lzO>NbV4=Pp}WDp556kEb0#zzND*IGpy zsI(|*QL$<(T18Z#Qguv_Y6?D}7DXb8DB9YNf)4a)?YEnd{nDA{2l@E!`OZ1_+#C8YTu-NHMj$gr`edrK~Fxzy@0e)hSU zgG;lE=jKe>5-UxKo|4#7TKTtY`oxcVO0_3PXInJFU+)I&EFRa;lyc~o{3M2sq+Cr5 zLAbSnS0h0%M7^bewodQA-ewL?mQ>H45kE?P@skf}B_(hX4C5G*A>0mrplb6gj{o7O zOV?uB{!r3>lp868KFb7*3{g}|2T?+Sj|lZF@`3qBk3>CUXc^@x6z^5rgjvGi_KfI` z8!^YKO|+Eq7D=ehJXJ?Z%YE{}zDOYSRmx25{FJ<+aKPiqhHy1Kk`fVBi86kuxwvmm z8*ur#xZhpIPe`}59|#|;?4%`B04W?eVjtL`Bzle?DoH&KL=u6Ic#tQu{N~v{k5*7p zFl?|BZP-iP$+(r@o%?ZK&h?uWbRZ=I%Uk#%>y-n~4vW=vFr`3_A(mi4TIE)^HPj?Z zEnEUIggCpt#c0Ik9+gj{n_)D}%v*=iu=A76sq=D^u9+l%F?0YmigfQw=Os@^Bm_W0 z;R5f$YP(Gsl3PE|B=^s#>xUgg3dP&{ZAM4rk(Ad9o#S72*4!~2@G;K*EdIWS z!35>(FZiOOv-a!9E9FNGO4^^I9TvGu^nK7ST293wXKaM2dFNMo`PG_z8PK1AT!HQG zWtVgPyF7M7wDHc)6xWu$?(4oWVNn$5O!|+vx_mfzmBSh*emNv#V=C-pso(-|- zzgEV^Wg5Qj#>IjjpqQ?dsOIw-9jlNug+TiaV$Y>EzTMXv{)F{DlXUME*|UQ;;3XwC zHSbuT3@dL6yr0{6j0|jfWT}=EmNc1wYPL|k8&N$t5m#@3Sm!!~jSR$aOY!!L@^5xW z#qCiW;B6*2>s#)@jh&CgK_Vz#u=@QqY5*^AXmc^N48g5h=uqYS1Wjn~y1hKVh5>kz zL)n&E0z9o`hn@|dC63$7Kb|x>n6>i%#B=$ z12>xV;gmW02y;g4xe)RC&7hD$R7@-5lRo;^EJ!nxbh~P6a(L;`)5M9V>L}385_sRS zudq+z)5a4KBNnAuBM(GOg$I}|6ju$;L8w-Zbqpz~`q5a^UoZ|X*t}BAZ=OZ;(dU?rCb!_9kb$|A5g*lx= yi~F5!xUnfs`I14B4!hGkq_~7SzAZYO@~EmG7+3LP?C!#fdY7*730?O%TKz9K{6yUV literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-ladder-01/package/floor/lo/d550ebb204adf0b5a7f310c7d07189e7bed63e12e34e9ed4d9bf96a101d864a9.m4s b/wai/pack-conformance/packs/video-ladder-01/package/floor/lo/d550ebb204adf0b5a7f310c7d07189e7bed63e12e34e9ed4d9bf96a101d864a9.m4s new file mode 100644 index 0000000000000000000000000000000000000000..5c06ef47a465a0b1f6802d80907cf89f7a8c472a GIT binary patch literal 1695 zcmZQzV6w=~&rf4uU=YYn%SZvzAi&DNz@$)8ln53t0f{q##TkL5NJ&~s35Wp&3m6y} zzmyb}<}om^gM>AJdL4i?i2WR*4a}BcglGbhl1OY3B(@?FTO5gvtXBp}To?yi3P~K7 zIml{|%||v9Ssa;-tOgfb8p#dFYKSohIed`y;$kD4DTZV(G8;J@kj+6BM-G2vy~yT6 z*(~X~DTyUqT)^05Qh$_Nb3no92BQGOY#^7rfoWT(uGSs>wEWQUN1Ue1Dhy@k^6mfC zH7#0jFEeB8{qM2MSyO6 z49yA*4^;l`x@=%1ZotCGf-HVtJ87R~On{M)0UHxX155)$14E~Rk-Py13$Fk~tQ%xb z`4ZjY>{?lg*rScdJrB$?5;frB5M1DZu;reK@3MZNV<2b-t3W#JpyihgOP4@QCp0u1v5rJ#C%_O}6rgc#W$CL@HJj3f+1m^ePJK?q%5 z#U*NeWnlu)DPkc|POPYOI}^^AQfc20jl*NyNuAS7dJ3Lwf^p(c@2PGs=|Up|&O006TcZ;t=~ literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-ladder-01/package/floor/lo/init.mp4 b/wai/pack-conformance/packs/video-ladder-01/package/floor/lo/init.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..d419e7893b423b9190462bd07734f8d65d2f1cfc GIT binary patch literal 628 zcmaJ72wlj--P?G~v~>ZbEg8c>oz#gjkv{w=`HjkN|b0NVI}qD>5;-$JpC X@ML@i0XNF!FA&0NA34waI@sGks3|>p literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-ladder-01/package/hls/classic/floor-hi.m3u8 b/wai/pack-conformance/packs/video-ladder-01/package/hls/classic/floor-hi.m3u8 new file mode 100644 index 000000000..d6ac7336d --- /dev/null +++ b/wai/pack-conformance/packs/video-ladder-01/package/hls/classic/floor-hi.m3u8 @@ -0,0 +1,18 @@ +#EXTM3U +#EXT-X-VERSION:7 +#EXT-X-TARGETDURATION:3 +#EXT-X-MEDIA-SEQUENCE:0 +#EXT-X-PLAYLIST-TYPE:VOD +#EXT-X-INDEPENDENT-SEGMENTS +#EXT-X-MAP:URI="../../floor/hi/init.mp4" +#EXTINF:2.400, +../../floor/hi/420ae4c941bba6e12a6c7fdb7d01dc69170ecb4240dffd2e86808ddf87baa12a.m4s +#EXTINF:1.000, +../../floor/hi/04c948608aaa7b5d78ad5355042a2ff65b0f75d9d4b1ad78f3ebffb886a74be6.m4s +#EXTINF:2.000, +../../floor/hi/2f93f0ad449f9cc881b7816c6ab33fd445037d6538b445bcc76431f9c9f91c5b.m4s +#EXTINF:1.000, +../../floor/hi/06d5cd79ba3860cccdc252fe915de0902f941a3c6a000295714f7cab193aa6cf.m4s +#EXTINF:1.600, +../../floor/hi/576b7d2156c2b595bf48bf34f67996d7f89e75d105f0dc71c9841bb96e6cd0fc.m4s +#EXT-X-ENDLIST diff --git a/wai/pack-conformance/packs/video-ladder-01/package/hls/classic/floor-lo.m3u8 b/wai/pack-conformance/packs/video-ladder-01/package/hls/classic/floor-lo.m3u8 new file mode 100644 index 000000000..628e70c2b --- /dev/null +++ b/wai/pack-conformance/packs/video-ladder-01/package/hls/classic/floor-lo.m3u8 @@ -0,0 +1,18 @@ +#EXTM3U +#EXT-X-VERSION:7 +#EXT-X-TARGETDURATION:3 +#EXT-X-MEDIA-SEQUENCE:0 +#EXT-X-PLAYLIST-TYPE:VOD +#EXT-X-INDEPENDENT-SEGMENTS +#EXT-X-MAP:URI="../../floor/lo/init.mp4" +#EXTINF:2.400, +../../floor/lo/d0f68eb18af5b67736ddccd97ed45c4c0274b0460f6abc8f54940ac378165833.m4s +#EXTINF:1.000, +../../floor/lo/6bba50408f894d0e9d5516a53992fdd2aa86db43ccdc684b69c51a688856a0db.m4s +#EXTINF:2.000, +../../floor/lo/acd166807d05fe4f512407f717659d88613f6d0d360485effe3751504cefbb74.m4s +#EXTINF:1.000, +../../floor/lo/589ad79210bff258db68916876846a2b0d530ea2e44260af66ddc51ad14ce07f.m4s +#EXTINF:1.600, +../../floor/lo/d550ebb204adf0b5a7f310c7d07189e7bed63e12e34e9ed4d9bf96a101d864a9.m4s +#EXT-X-ENDLIST diff --git a/wai/pack-conformance/packs/video-ladder-01/package/hls/classic/master.m3u8 b/wai/pack-conformance/packs/video-ladder-01/package/hls/classic/master.m3u8 new file mode 100644 index 000000000..5fb4ccb7c --- /dev/null +++ b/wai/pack-conformance/packs/video-ladder-01/package/hls/classic/master.m3u8 @@ -0,0 +1,7 @@ +#EXTM3U +#EXT-X-VERSION:7 +#EXT-X-INDEPENDENT-SEGMENTS +#EXT-X-STREAM-INF:BANDWIDTH=10440,AVERAGE-BANDWIDTH=9055,CODECS="av01.0.00M.08",RESOLUTION=64x36 +../classic/floor-hi.m3u8 +#EXT-X-STREAM-INF:BANDWIDTH=9016,AVERAGE-BANDWIDTH=8723,CODECS="av01.0.00M.08",RESOLUTION=32x18 +../classic/floor-lo.m3u8 diff --git a/wai/pack-conformance/packs/video-ladder-01/package/hls/legacy/master.m3u8 b/wai/pack-conformance/packs/video-ladder-01/package/hls/legacy/master.m3u8 new file mode 100644 index 000000000..5fb4ccb7c --- /dev/null +++ b/wai/pack-conformance/packs/video-ladder-01/package/hls/legacy/master.m3u8 @@ -0,0 +1,7 @@ +#EXTM3U +#EXT-X-VERSION:7 +#EXT-X-INDEPENDENT-SEGMENTS +#EXT-X-STREAM-INF:BANDWIDTH=10440,AVERAGE-BANDWIDTH=9055,CODECS="av01.0.00M.08",RESOLUTION=64x36 +../classic/floor-hi.m3u8 +#EXT-X-STREAM-INF:BANDWIDTH=9016,AVERAGE-BANDWIDTH=8723,CODECS="av01.0.00M.08",RESOLUTION=32x18 +../classic/floor-lo.m3u8 diff --git a/wai/pack-conformance/packs/video-ladder-01/package/hls/mobile/master.m3u8 b/wai/pack-conformance/packs/video-ladder-01/package/hls/mobile/master.m3u8 new file mode 100644 index 000000000..5f049c978 --- /dev/null +++ b/wai/pack-conformance/packs/video-ladder-01/package/hls/mobile/master.m3u8 @@ -0,0 +1,8 @@ +#EXTM3U +#EXT-X-VERSION:7 +#EXT-X-INDEPENDENT-SEGMENTS +#EXT-X-SESSION-DATA:DATA-ID="science.transaction.wai.multivariant",VALUE="wai.m3u8" +#EXT-X-STREAM-INF:BANDWIDTH=10440,AVERAGE-BANDWIDTH=9055,CODECS="av01.0.00M.08",RESOLUTION=64x36 +../classic/floor-hi.m3u8 +#EXT-X-STREAM-INF:BANDWIDTH=9016,AVERAGE-BANDWIDTH=8723,CODECS="av01.0.00M.08",RESOLUTION=32x18 +../classic/floor-lo.m3u8 diff --git a/wai/pack-conformance/packs/video-ladder-01/package/hls/mobile/wai-v.m3u8 b/wai/pack-conformance/packs/video-ladder-01/package/hls/mobile/wai-v.m3u8 new file mode 100644 index 000000000..949e945a2 --- /dev/null +++ b/wai/pack-conformance/packs/video-ladder-01/package/hls/mobile/wai-v.m3u8 @@ -0,0 +1,20 @@ +#EXTM3U +#EXT-X-VERSION:7 +#EXT-X-TARGETDURATION:3 +#EXT-X-MEDIA-SEQUENCE:0 +#EXT-X-PLAYLIST-TYPE:VOD +#EXT-X-INDEPENDENT-SEGMENTS +#EXT-X-GAP +#EXTINF:2.400, +../../objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai#n=39826 +#EXTINF:1.000, +../../objects/61c7c3b7ccab07ed01df5b0d7ca0240598b914dbf2cabe545aa001e8de12d365.wai#n=9950 +#EXT-X-GAP +#EXTINF:2.000, +../../objects/c2ce1907255a041c388afd06ccd007436368e8d20467fdec2a1eebbb84b03bf2.wai#n=35882 +#EXTINF:1.000, +../../objects/61c7c3b7ccab07ed01df5b0d7ca0240598b914dbf2cabe545aa001e8de12d365.wai#n=9950 +#EXT-X-GAP +#EXTINF:1.600, +../../objects/618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481.wai#n=25514 +#EXT-X-ENDLIST diff --git a/wai/pack-conformance/packs/video-ladder-01/package/hls/mobile/wai.m3u8 b/wai/pack-conformance/packs/video-ladder-01/package/hls/mobile/wai.m3u8 new file mode 100644 index 000000000..66fa8dc50 --- /dev/null +++ b/wai/pack-conformance/packs/video-ladder-01/package/hls/mobile/wai.m3u8 @@ -0,0 +1,7 @@ +#EXTM3U +#EXT-X-VERSION:7 +#EXT-X-INDEPENDENT-SEGMENTS +#EXT-X-SESSION-DATA:DATA-ID="science.transaction.wai.class",VALUE="mobile" +#EXT-X-SESSION-DATA:DATA-ID="science.transaction.wai.stages",URI="../../stages/mobile.json" +#EXT-X-STREAM-INF:BANDWIDTH=79600,AVERAGE-BANDWIDTH=79600,CODECS="wai1.video.int_motion",X-WAI-FLOOR="wai1.video.int_motion",RESOLUTION=64x36 +wai-v.m3u8 diff --git a/wai/pack-conformance/packs/video-ladder-01/package/hls/tv/master.m3u8 b/wai/pack-conformance/packs/video-ladder-01/package/hls/tv/master.m3u8 new file mode 100644 index 000000000..5f049c978 --- /dev/null +++ b/wai/pack-conformance/packs/video-ladder-01/package/hls/tv/master.m3u8 @@ -0,0 +1,8 @@ +#EXTM3U +#EXT-X-VERSION:7 +#EXT-X-INDEPENDENT-SEGMENTS +#EXT-X-SESSION-DATA:DATA-ID="science.transaction.wai.multivariant",VALUE="wai.m3u8" +#EXT-X-STREAM-INF:BANDWIDTH=10440,AVERAGE-BANDWIDTH=9055,CODECS="av01.0.00M.08",RESOLUTION=64x36 +../classic/floor-hi.m3u8 +#EXT-X-STREAM-INF:BANDWIDTH=9016,AVERAGE-BANDWIDTH=8723,CODECS="av01.0.00M.08",RESOLUTION=32x18 +../classic/floor-lo.m3u8 diff --git a/wai/pack-conformance/packs/video-ladder-01/package/hls/tv/wai-v.m3u8 b/wai/pack-conformance/packs/video-ladder-01/package/hls/tv/wai-v.m3u8 new file mode 100644 index 000000000..8d1c2efe8 --- /dev/null +++ b/wai/pack-conformance/packs/video-ladder-01/package/hls/tv/wai-v.m3u8 @@ -0,0 +1,17 @@ +#EXTM3U +#EXT-X-VERSION:7 +#EXT-X-TARGETDURATION:3 +#EXT-X-MEDIA-SEQUENCE:0 +#EXT-X-PLAYLIST-TYPE:VOD +#EXT-X-INDEPENDENT-SEGMENTS +#EXTINF:2.400, +../../objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai#n=39826 +#EXTINF:1.000, +../../objects/61c7c3b7ccab07ed01df5b0d7ca0240598b914dbf2cabe545aa001e8de12d365.wai#n=9950 +#EXTINF:2.000, +../../objects/c2ce1907255a041c388afd06ccd007436368e8d20467fdec2a1eebbb84b03bf2.wai#n=35882 +#EXTINF:1.000, +../../objects/61c7c3b7ccab07ed01df5b0d7ca0240598b914dbf2cabe545aa001e8de12d365.wai#n=9950 +#EXTINF:1.600, +../../objects/618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481.wai#n=25514 +#EXT-X-ENDLIST diff --git a/wai/pack-conformance/packs/video-ladder-01/package/hls/tv/wai.m3u8 b/wai/pack-conformance/packs/video-ladder-01/package/hls/tv/wai.m3u8 new file mode 100644 index 000000000..47679d0e9 --- /dev/null +++ b/wai/pack-conformance/packs/video-ladder-01/package/hls/tv/wai.m3u8 @@ -0,0 +1,7 @@ +#EXTM3U +#EXT-X-VERSION:7 +#EXT-X-INDEPENDENT-SEGMENTS +#EXT-X-SESSION-DATA:DATA-ID="science.transaction.wai.class",VALUE="tv" +#EXT-X-SESSION-DATA:DATA-ID="science.transaction.wai.stages",URI="../../stages/tv.json" +#EXT-X-STREAM-INF:BANDWIDTH=143528,AVERAGE-BANDWIDTH=121122,CODECS="wai1.video.int_motion",X-WAI-FLOOR="wai1.video.int_motion",RESOLUTION=64x36 +wai-v.m3u8 diff --git a/wai/pack-conformance/packs/video-ladder-01/package/index-v.wsix b/wai/pack-conformance/packs/video-ladder-01/package/index-v.wsix new file mode 100644 index 0000000000000000000000000000000000000000..9f10add88ce849120a16b096d26800ba3d4479bf GIT binary patch literal 2368 zcmWF!_KaX;U|^60Vi3&=#QZ?a2E@!joM~}C@uIq)a|T<``V5sBdt>TFS&x2|<~Uv; zV&;6zq7SHqBoLAQN9z%HdWxZd`IfsPV!5IZ1b3P=-dFj%X`$G@)LAcZ8D;~OU;k#C2}gY$N4)vr<}OT;$0NG4X{x_Z?Ex{?4tSwXD zdC#0U&-RMc`mBA~mb-2r-|+I~!tkvT*BZbow?Wlkm<44(sq-y*pILitLayfUEq+k? z{!Y1=8Pk@9xAy$!;EP+-J<~0M3spVHepZm}AV&}ZKM{;=yK{kHHdp*kq+_;a`^vup5|P7aBoog1firy!lqMG*2%J+hT+g(m9wO_Wd zsI}n|G@Oy`rzHG8!x9eE0XYwC=6!3|S-1W7bFsuz9ea)>pIhVpk@LjC(8t~zmwm2H z0cB_)pqBlupiG7Y4xN)^SB+wkvFQ5CcIE=Rb8^OuODySs-)PCb-rcgn`jb`% zTVG!N=N#wRTXCmLeV*;@J*&t3=8vQ4oV7D%i+8YI?y`?9!u?KBS`kH0#BWeW|b^>DM?bg_uKYWvf0^VW9} zU;|+3|3wmNpl#pJF8(s(`nG-U=B+2cWq$Vp94Os*7RC{N7PE6Yqt Z&DYD!D~Zp|FUic$<3$opEHeaI0|2#VGzkCz literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-ladder-01/package/moq/catalog.json b/wai/pack-conformance/packs/video-ladder-01/package/moq/catalog.json new file mode 100644 index 000000000..cb914abd4 --- /dev/null +++ b/wai/pack-conformance/packs/video-ladder-01/package/moq/catalog.json @@ -0,0 +1 @@ +{"tracks":[{"altGroup":1,"isLive":false,"name":"v/l0","namespace":"video-ladder-01","packaging":"wai","renderGroup":1,"role":"video","wai_capabilities":["wai.video.int_motion"],"wai_determinism":"decode-equivalence","wai_receipt_alias":4716788767000716,"wai_receipts":true,"wai_receipts_track":"v/l0/receipts","wai_staged":{"layer":0,"lead_ms":null,"set":"v"}},{"altGroup":1,"codec":"av01.0.00M.08","height":36,"name":"hi/floor","namespace":"video-ladder-01","packaging":"cmaf","renderGroup":1,"width":64},{"altGroup":1,"codec":"av01.0.00M.08","height":18,"name":"lo/floor","namespace":"video-ladder-01","packaging":"cmaf","renderGroup":1,"width":32},{"isLive":false,"name":"v/l0/receipts","namespace":"video-ladder-01","packaging":"wai-receipts"}],"version":1} diff --git a/wai/pack-conformance/packs/video-ladder-01/package/objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai b/wai/pack-conformance/packs/video-ladder-01/package/objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai new file mode 100644 index 0000000000000000000000000000000000000000..b15b5310886cf0f3076b32c2b77264e58fd7b1d0 GIT binary patch literal 39826 zcmZs>1yof**FHYy(p@6mNOz|qNC+sQAcAy*NJvPFqKKjhQi>ogC9RSYf`niojUe3( z(%kbq=X<}q{{G+fxz;#m_I~Esd*;m9vu7^X&R>-L000Q)4zP9QR^pZvli(KN_HcA? zwMAO~t`3f#NZa+6uj4IWMBwA-b<@?}*4GgQc{(`WwDxiI_H*@d^!OirFt@#}m#v-a zO;_JQ1dULN{SSp0LSXIT>Ferwi#t?=+urk*gDcu_z2(fU6wK}JddmTU|NlY0wm!~| zh|OSbCm&l6$J^XWauOokF5F7eaw6OTNJ}O(^v5dzu3a>hgdhM^kWug=MGYy`|68_U z7-m48(SLYI!AA-qQiza3j1+gIq$6b)DcT4}B2w0nqJ#mUjuHUAEdYLD0pNfExQUc3 zqzoZt8!0eS06@V1TkrrD#vsxY82^7HFw#P`SQxeZ|KZRlTpJ&pz^ERr(f+tLPLHcm zIr@y&C@-#{eQ+35hCbsg;qWLwT2MW%Kk6gSFPuL(|Is!Mi_`sIcvOe-p*pli+h{@C zIA3tS;l_sIP#HP`)IQFCoG+*j`TUkLq!LqtB=;CN)uVpl@HpR4?0=8xbI-Pp|*H?|=Dmc5!or z_Q%a1szdwYY~c7&EXs`*^nVnGvx~O>n;+HvYahknWN3}@|LZ^6LOF5%gUWE+ zIDc?@95=2%+D85R@A2aB|N4${kM&q0cB6T2LOe zA1cH3Lvc7?(Hf^mpK*3@zTkLqHEw)pjq>6A#BrlIw4hx7dHRn82dy`?SF0Hus9j6 zKd#?@<5AmaLH|d6M0wFZ|Ls4nAF4;OxEhuJ>kG~fZccGyLpf0yju(f+@uD?uK2UxX zhmHZQ|LudyaK557+Q!Y(zy724P)?Ot0P;X@n^ec7kql_}4g|Y@lYx=pRglT0092k? z1Dfa&NblSP#CM7d6WTKlv3$P(85;{ieuU{I%AIG4jiR>1%Ejd|l6@yT+E$tb1fR^{ za;K#uriM=V$+S0YXz~NDiEMx!N{s>f_JglWfS6U))-Bg!g3QU+joSOy~+h&jK2z- z;Bf)25K1ud?J78&poM-}g+r4*7SPS-yC9Ur7rJ==A{4{600!GK!C!)E(#A7Vm{G$x z?wj%9`+|(4ni>0~@OWb$p|?LH{C(r~7W;Y*97qxie;p5iWhk>?!qozJn^p{1`aS~k z^6DVERUKdxWq_#RJ!t(x1|$~T-Fr4EjQ8ui)7BjE#5Qm4(%~)M4t<^814Z#*Km-P5ebS4RX`h& z91tfs1>W2&fGUDBA_+1*@CFYd$ zy{UX2_PMOSuP*os?$?WlxvFa6?f5eI7OMq_q>=-M%ckIC7!Np}FarTUi=iCiF6g^$ zHbkKr4qfY?hgPj9p&Y5T^7X>Y&}zOP$*kTdne!upFoST=PV=J9NcD*bd_vd^GqvA_ zDa`}mQie+S*6YvkV|!Xq*~tkU#vK4Dha(s`bc60pc|Zys#n4{1JLK@z1gbr@fG)gx z4-(2Hpds!9;(2LDh%d1d8n((>T3(cg>GRl5yiC$yEf*VD-*@Zad{a3b7#$8*x`k(%6}lb$5;>>r%QG!{4z8sU`3>yswuLf z#ED6-H$K!3b>@Dlp$3bUnH?164#R&GlHq3W99YMtAHKV515R{Rz>7;SKztk@nEGY` z;-*cIu~Z@NA_-#5B*mDFS3-s!pCG%vU65JZd|E|2=K$c*!dKAvi9P7b?h3pq$ZI@BlNqiSJpdUciYB5-9xeK;7QUMcFDe#L^16~!xz`G(A6lDB? z1cf2Y%WJY2(Nb*^{ukU3{p=P4$t|C4@!R9rrKZ8Zw^VrGh&P-L67l-5^ZTB|#;$Hy zj&dFjAo&b0=H|e1&qM%QdoqZMdJf1)4MDB677$9k3OL&R!181^ys%?G2b>WEQ3x*@utA z+X1lQ2ejJ($oKFJh>B7pu}>3RWH=rV5DtI|HUNQw~D_enC0{G>~BIQ%G#n z;4k0xzu4UlW{hjT)gH6aF8gT_4!HIk!Qs23V>?hLTVRH^{e@^9mmrE88j!vSJ=E9Kn6i^adZHb=j&&g`I7-~t zh6CO_t72Wd06%@=xywIUe<;5@ihO6w$hVD!^V~jyMRi(`gb4vQ*2zFYUJ@9|od<;P zRly&oeu)0@IMgLAig{A82ffeChLRFtko(qmxGUE2Wc#EKn>$5y{PReVxM!CfZa(Jl zXKS>Arz79*P_Zn)FMce+gL)_MVPh6p%=!Uxgl_>Nf)qeX`VG_yaDkCh8xSkz3nT?{ z!CHHOjsH0udu ze*Pf)#1U+eSPT~JHo@Y(NH8?`5>Qj+f|!yj;AbR^>|nmY!yy$+46vE1dU+LLzoZ3{LNsehTlZHyWA0XUY>(3N0;_`9mZjQl0`W2#{qnF zE(<_vg~)!F1D3d7AUog?Vs8sr%5WiT>NRMo`2q9-_%LBTyZ8a6(@m^n zxDI?be*#Q?T&_ylLZ|Gl!GrJuAHqXt$oK-W(`~C|bHP(T}mN&>;g@F%MiC|?p2lP6cfh)^u zAZOq%;9}y${5Cv|3Gb;S>+$1&8ajv#)T)1-U z)2tceU8ZrZcc=@B|X`8j<~{0oGZNMq-99 z@_r)$6_qv+OyvYCSrnk8@G}zUTA+J7?~&NI4uw5kg@zkMp_p9_sDY#KTe#t?qlfx) zSa$C4Exkc*I5T3!=eX7wX3VSJZJC%l_IW-BGqx`wG3hUyQ#c2HIz9)(gRhZ%=>_QP zWe1O2MUi!6i0q{u5VSZC70PWxRg*UeAFE-Y$6`T>&yqTJI|(CvzN#JY#f4?qTzwqL9=DO$`UPa`(E(=KNI*cKiez;%$UK{1=>nMF)IXpNzq3%VIDisso?Wi?Cs~G`AiPxYPH<{yNT{WbMV{3zwkkL z8>l7z1L}0TfcCX8@T+$S)aK6ua90GRTnYf(O!vUS#s*}6A7E4xR!LZ2t3zP$5%fr5 z01Do0DVcp4bBrHId$5=V!SAN(-KH$fVI|*p*y{`|@QcCU*geAlA@ zx{C*qtxh0usS2^d2N@HFfG76?KviKWU^|h<=+yM#G4}02I)T5NFZb^qNqM+6T6vkn zieb`3zlwijmp=<+iQG$u^S%)$_as#HDIsNp&^LKbNW@qaT027t zy^!h!de;U)P`N0SzpG3vH+%__{#}eGGO}wGt1J)K7oWza@&cPGdV)s6@;2DK#UEL# zsjz?a0J0A?AbF)Skn~gn616g*l}H7cWL$ydb?l&y%gxY813gqP>j+WxUWeSDZ-dv* zR3J$e&X54+w6d@_C40|#$LKMyso?36WD4gMV)#-3~Xc=hoVl8F0d-2(A^9;M#tyF!f*0zciDh*t(Be6?pPO}T?S2YQ`$&k{ zc(t(Ir7L+#VLOyVID^D^Mm?S;sAzQK7yMt~yvITHVj!E%-u;FaVB0&{K< zTh2Y`cHkIvqca7nZ_+{Xv^l6-mjY5UzBS0QSF*E_J&kp{n!VFC%1<2PK8)Qai*#Lz zCI4&0?Qj%ZxB(x+iwOS_dMf**f~ryUQW@51*Xz0x+w zk-N6Ly#G9W(X{yJ#B3kSC2O32{hl7IdvG7gn?|vN&s|^=ZyR{*g9E6MmIh-?Qb@jc zjC^-~P)u47lIOERG*1Yi?^O38-TNb8&8{7cJ-SY~vL}PVZ!(0go*sr2r%xT@nWy5D z-lc^%$iGN_%yfbIxD*a*#fOm?I1ST`9Kx6ACxKYd9C$(*362j_kvLllvcJk9XD$aI zLEsKba|fU&ip&^MaZ1b&_wUe(HW%a(%ofQoLUF=KJ&6t9P1&uQ(IuglV1eBOQ#X?m zRAJaSblaI}3Hwlr9G-c91y;^8fY;c50)~bKB=3+!{4NJElue*l6ASV!f`FR*Ghk`b z0rcd1!J7I{BGZfc$iATuRouC_^L1zoYxgwyFpJv~mMmMr9-G!7bFU2#KRX4NZ~=th z1mRbPJ&^o0?WQH5jHZD~55%FGIS=RpGZt+6@*wsYpf>LNP?%m3Ae`6$SNGNl!!J5Q z^e@$(m@qy#GFKnP+AmmbXAc>{U0v(gN6v>QPhR=L@~jWw>*|THU1=w>Xa9n!%r5~^ z0tIk2<23j_dJ2j#^M!aQOd$Nb5L8^qjKslkBqoMIBhj^hFU_C)cg+oGrH9^ZX`1%v z$s2k&-JNf@ms6U6EnX1bdR}lqWtRk(Bqt)dSq^gEDniziBuKsK3iKk}z>Aa{Nc^xs z-uY#qW!DD@tN%gP>k1M>0+1N84Bg$)f*hZnS4%1jhhEO(;g1WR7W}t523SgyWM9#f-$hpx5DiQjMyjxyq z{FN)DT7C(Vv@VAT81@0aejiB^{}ZU{?J~Kur_-yPUU&EnvOUM=R|!tpNW(=2caHY; z#;_E#NO8m>amoNrPn-e1-c4W$gXRV`fRSw)`SxhQ(BTUthrJC_<8qL_hz!HoWk--C z%#P7gbcN2jzK6uR$y@@@|HTrY3fPyAyJBWL>K_-Bo2R$|PgI2m{ zA3nJqw)OM+G}fB}|FFqoisV|g7;H;*Ye%Ad6^TztNF2caBzc;zOXTeyJSdF;ana5j<`*CKg%Fp|UG2V$bb$iD3i zf*y(^d6YN6{w;>=_gFDHibP0^$|D}OI|3uO1d; z4Ym<`3J)j{!X=q=*e!Dz7%$iWE{f4mnO6!#S3G4f!lkZICA2fFv_dL(UWSkWU~nv`2dk{=A}sw7V=Iqnpbh-@O_9 zB2FNFTj1@)(RU20w?TDVvcT>I3}5 zUJ3*}^aKlYuaR6_7U(dLBl$Q#a;K7y+?%~c-Uk}X<00;+HBjc}E*Llv#d~mXN=QOW zXBpEFmV$(rv zy%?Z=o(JqSvjU}IV{m$V2?`r4fQT4`F<$v|kiz>6DCEm|h-D<{*@jycws?gWX2(Cf zO=qYAv*#_(*DPtk_bbB>$eLHN^DA7N4Fmvr+a*?7D7&(aPAPhjO`UU z#Mp0WG*#wM0gb9e8PgC6{qEdj46$LQWeLZJhrX9w7a z6|>k(l|AJ9u!YZa^#X>I4xl|4h3wl?AX|6|h>ZwAKdpShtGG~5Sy&F57DSPAku#CY z!Xcy`sP0DSUkok!MbW+v{&Qk%&q;APmkoA*d2{nCy&!DS{$p!NbP|?%HVH4CLC(M? zlOSfT67)WZ0-GC;L2XSXGDqlsWQF7g$>3pV7Su+7h4MnAF?-Cd$h{3CB&)#dPjPSu zQ&=@`%(p{^Ss&@zqdK5_KGG-!%YUqeZ>Uee!kO#vq{1$|e{K%RJI)|`PaFuma}TU8 z%OUq1LdZ8qhs@C*;8BziIKMB8+;ONNwJ~6}97XOr zx*?6jd`OEX3}VfxhrZb|LFY!6$ecnwA&y@Oe`OX);GQ6AOdmD0EyX;E-%Y3u7roTp z-N*lfJ5Yhf|2+djGVm$kv#Jp=zUHJ1~gNUyUP+NA&dp1)JKeo zk!pq(C77V&#khenKc}s%@g3})a*iEZax%*Pm~pI%svE52CI$%p>RE71-Eh z8#YQT0pf>KAV%ySFg5W2%uMBAaY_J{ zXyX8P-l2BZFYG;Ty**{W9lRi7EVeh~3>&YVGu)$WhAp`@i=45y;me5yNE|9a;$H`H zUl0up4L=~?Mk|Q9Y>b@oo`QF|Nr0Ag2CTJ+BX_WEBy~dqkTRbu^_cefUZfcV>=3KI z`zncqz`te&OC=Y2zhvPGjCWD&Z&l;s|J?IlblFF2^Z~8CNl-_O#6QbOE%{X>pCN`k!nS}f%@@F6NercOcp%?G1W1f2 z1@?V|fB?KEzG};gxoRbE^Iqx?q`g-<{Hr(ZC?#lMYqxV2E6rHk9+;{K#}I1nUzVhR z@AM$Kjh`A^5Mc__I%j~GXFrj9CmKkXsSjiqjRCE}Gti8}9T0HqJ}}Vw2AXsTkZ(?y zKoEPMjs6Sii+U9`x(e!>`bYeW;S z2*^dwjTyi{P7#vG>;^I4hJn~2BXp-W72I^V1qw6X0~w`tz}f(j8n72Y;bR9Jl|=8L za}}L7)|o9Q&BVp~50j|jS5k9}B83-Vnf2&hlk`O-Zv4hlS?S?9VOBWyNFDA_PK1Sz@R1zw50WdZz?EAv@B+Ug*lMPRY}6^B?xuUlS&jj! zlZBCePZi1kh5$iRC6fQO0@bkua>H0tNXsq8@6#^pZvNOQ*tN$DCX&5P`ZA0i9*}&a zvA%W_HWpt&VmB3R`S}`Ld@KQf*fK)Sc8uUjpa2w&6^KHG5y?4)Ap5vl zFgRO)*g*C`^-v=Jn!6C!IpI&Pt6K;0>|5Aa6%MTX$1AY?EE#S4>k=ep>%hxFNZyot zgf+Bshi~{=z>W6KV5n3K62enP&J)29v8xJ{*|3lNwn7eZoeoCw%XOglkrhe|lO+1^ z5(|AtHUr+F?A>^|B`i-(=8^VYc{u(J@=X+0C4Lq3f^+onVZ-zp>=v^%{H#D8X0{Xr z_suVY>!cXSJVy!o`}sE1m!XXONX7tp^&A396(k4G`iz|An?SmlAhDjYG4yU{=q)W1 z{XVh$E>`pN_pM92S7H8hx46_kh`{6gb}&~N1KcT02+Jl2!Ffo$8v8JStRYs&X+jF3 zR4D_XNeD8_p+V*+2uKLjgF%8ppqD%hKDoCOl=@gfp7sf9&;8_23Lj5l(}n4dyyhmb zBS;RTsB8$U$H&1RzHVUawJ^x{poP3=N8~py2e5LjA6QipKzGe{L8T7zXKzj1(BvW? z@?Ihl8(lz;VFlSsYk=g5I$>aLlk`_LYe1FnIEtQ=66ABDue*;u!@yOR_7Mnf-^Ld+|m?|x=Nzq{|QJrcib zU-?5b?Uz$c2jl#%iSb#dP5Jy2r3I z+&IQ(ln5G9CS`O;B0DY=FW4tFR62)mk+i#FY-e6CJG3-2`q)GJRLT*l7)KJ9;Q8OL zJ{+@s(|l2vF+o_vGf%zXva;yx6R9*=l@k6gG5_Z-Z`?WEUl*(|a8X+dMkhu6X>!(Z zTCKXe+QcV7JJwRfA^hdTd~}z_=}=SA8SmDp%xF(vWoJ?EdifhHOIe;7pDY+3;*$t) zS3l-E9r$Rd=*>2RfPR(R+$m9Yucyk+zWsAwM&WCU+0Rn6>laxC(_{2IH|(g1ud9Mj z-@SW_Bj2P?HOm!0vFxMbA&?pQkmZuy8ZyI{n0nzyTC~yAprE=k`sv$0g6>>6Z|~k& zTk;`K{QZFh0jN0`yFzTPRn}x<2y zb6a#D2ldtvVeUv-kQ(uL5vLcYz38FJ-Z%Mj^lqvEU$9~N<6Bebn(s-;JZTdTR+9v2 zBqh7OQ_VBYv)gVg^?Z2Hk(XSo@i}O|m)_@91u>iXqh@W=*KWtWz} z#ryeg^Bk!OIXOH5W~Nm_J5Pp@~!r?K>G5Xb2_9V<&)!?ozq0Ie&J#{w_KD|U$Z%c?QEd`T9& zX_~S=f4+OdbV)YhcZ~L#4;5D}n8@!cwV$596?~TF+?N?{rpvri8P)B65=W1w9*h!@ z^=x)XpZTF8-f5fhMA;51DKovos*!wG%HNVW_n{xl*{(BIEvn2CA;Sz;|9G$eT@lpL%*t`gnwgOfj;PGYwI|+C z)Y~cisx3zrKQb;rNPCgznD$bR)&}d<8=H6wJ2#x4D!cevcwGve?Eb6e{C>Bax!H}0!a2l0Z}9g!v_0=>rZaYG*KjvnoV$W;s&wks)V1f$Z~NKs z#>6LeP1aADa;Th+u0F@)%6eOq;c}Bx$mi!<-ZPVUFWnmJ8BT1CgU8KeCV0!vZmXoX zwr@F~U{bw>1A87=C!H10N#o;kc6Rz27klOo+ikNuy=ys)!b{f5L@V-{4yQhAkh`z) zxlVnMCmCz%_@<=u^6DlgPD4sz@z1(`X+%g>Dc+A2(e%o%;eERaywRg>Zeqzi>GX80 z#sw@FQe0<~uL(ea$wG)uR2f5m%1qzN<>O_Wus{kk>_sSk?pxN%>74CWzC#(2o|^ZY zSq?G_u3?`@i+czyMFe->T@r1Gw9%Ry&``e~U$sKx&Z+g%x=T`rD*CNZU3`b`z}k+B zF2gl3p@EijYQ`(X5>;|#xm4_|A}fT#iuFf)pFNlvmTQY6qYS0p^3U(#H-C3yJ6;M} z$4}~utkR5fGI-K5E*dL9{3bqzC`!%$T8-4De1-O0!gs4HIsMl$X)ogY`HN(LaQdW< zhkcQnhWt9;8P#BBmMZ$b@PHsk@=MddC_7)(T(W+g)m@`Q;ro%_MT9Js#{-b>gB>2ri{PmUQq~s zz!6yyd?mXy#uPS}CzsI&HA)x>vep@&ez|6yEskd@s{m^z`iDL<7G{i;_85N zZxhExf4wiu@woi*{H>%D&7kQ6!;u@_oOis{y6f~8V4AGuaB~NekDYQKM{Um=UzQkK zxIj6Z0MQ$;&a6YYmA=uzxQm z@wBv{xh-SP#pA1Vd=^c-&xGCekUv^aA0!Z`v8z(n&#Rx$|Hv6_wnp{y@wCGgwkuzz zq<;L=h^!V_WT;&H86k4QTu+$Hq{9EsIq6L9th{2MpKF@#Rki}_=r101e#-Cnm2?G* zAC%i4*~IG5QiYEO5HVWU?3|aGHlo>^DWZ`1d1hERRYo)aH06_5{!R(aWojuEm$$U8 zy;(LpcN{SM_&w3QP{}7t&34-oJk1upH;>|E-?cHe(S_~nr&;8d+b$;l6vijFzFDXr zBun|Luv0v9gTtu0Z6{rc&vi#|T>4yg!o!lu zK&Oa^(YGwUCR3@NUnAB_M7Q&UZyjtiu2ir|Z$@1Xv1aUl)TZkq^N{O91x-js!j#{1 z0cT$0X;b=)Jj=8YAHjE^qL_s7dfdIhHSLRi`R^QHk~ZvC-^L*zwvv2lw(`|HXX&Eu zrcK6Z?P7Gfr%;vDrk2bic&L*8w>3)GbMV3R^n<1Q>-6{Xe1*t@qi^J|61z}^HTs=8 zeT{{TXxvuntb}MdH~kM6c1Y~PB>{`zlD!oH_j!`I49>gjt? zr^jkdBtzl+4+}Q}?R+Wwi5B>%Zgr@QCAh2j9#hxmU)u~wf3DWi_40MzBVMPUN$0Je z8$T2A%y*ypqEG^jzme;edmJS=YMPo>uXmkvkU8efgUK^t5A(uF6@{jb%5yRWQ=WNl z@ywM?oV6%Bg;g`2;*k*^81ojt5P0PWr;T-+KRMSqN$QKQE@)sMx%Zmsa~bT{=n(W6 zXpho3lqkAH8;qCIO=!An{iN#Ei;(q>5y(-h6%{eMy zbo!52TlSp`#q3{-;2S0^?#V;Hwg%3fnPZXF81=eSk^)}y>7{4?{c(SAZa>fL?|dV% zNTOi-Hnp5$){dO_VqY0uLwBX~-&g)ZEhSQ->I1_LpI+F^r}b*lwg&}2FPpgi82T~V z^lGE0|B=J|tM~!++=+;t+)44>Q#7BivHqd^_U6SeURCLSWi31&)6M9L(MKoDk2Gs4 z>y=vds|_T2DfvB431*yA9_3Ye(v>2x)^KCP@=wW)kk%8o0iE(I+8;bkhgdtNnQZUr zh;0o&P}WkYZMauKq2^7wmp~R{vHr#G0-p(ApT->%o1Y{)w)szpjT}c9BDPO^CNroM zyw}uv(%bqq-_yyc#;dyJlGhl2T&Vsg&7Z!fmSJyiNZOgC|G|#tejG0|aj=~M{^5b;S3%2M=H(Bdi~duRs!l3nlF!)Hb3@$Y305zar7ortI);5 z<#$Vs>xr*9Yu@lm5cTnGw+Ju%1IAKCHwo??@o72{?x`!Qb2T4IeqJy*e7(u)XKoR8 zFD`>QjmBG!gUYW$eUD(uvz2yw>5U%KL-|O8zOWKf7x|oG`@zx&p9SL8I_YTq&GBV5 z6yvLlLiC(<=dEwts;bUng4oF)tsXqG zqSG{$kTv=opZsU~wR|sCUWRn(x7p>`>g9ykbNnf~{rOl~@57bD?u3H`_zNp%!~LqR zHuYdOOM|%Ki_C_7yN{hsWcgTJF9xq$4u|VGIUUS}+F#HX9*;a1JUU@pdHXfB6YCqp z;-POWN7ueDq?UaC8R(zBy9=QpR0Aozdh)7kC9JP z!h0zb`!Ojx|^(!EatRblR4XTepoNTa(!Lv$t7 z!qq~~@y)jK&RcW58Ho~64mb4n_P#MrFOKpJvXM8O4qfikZgAisDg0BUSVWUod+W-6 z#@dqtnm+_Y;tv=qX*kKgH?XUGecvlz;Hmc2aKNjX@bFpWg`=YJM{G*o5wB^YWQ|4L z%r*R@+COS8CJ&gTR0qA7)DV?1*-%xba8-Nb6q+gjtDdo)KzG8{N|p5?)w{nl0jqL~ z;bm`sKgyPA3I5DV$l`tfZtS`e{YJJR7nuX`m6XV6s_1JUpQ#<$S?PNaZ)D~7Bu?f~-))pw^wm*(>0i>kx|vZ}#IAeCyRweb zYbk1ekKLW?3Tr9n+cysO^*1M3Ds!kCw4!Gr3dB5iFS)PA6KNi4tHF-w-Ccf&& z#JEF(7g7V|?CKRU>)%Res<>jwQ?aW&p40xMyTB^XYv6W;>au@d<>2M4V&2Dk6IT}) z&xFy%Q*o_wPj0{bB)l^mbq&K|KX{Z_1ceWsgW;f;Ta)H~T!FuqTD3ox2 z!R>w4cMhpI?vDHXeS4Y1Yj&-h-c@-Y@3R@UYkmAAS>deV(>|>bcQoT9??Xh{bi{Mv zx?Wy*6caz`iiAwkgM(^%t#l1Rb;?<(sZOzIBt|>GN)ex^3Hf+x|>mXEMU3v{M_t zaPzx+caVQ8$Mbz@e46<}Jjd;8)`x^;>E&wI@5z6$PxZZd>ge!F8W~@9e!x_0pO}{t z)~1`6ctpw1zmh2Hwc5sI*DeiHXKi-zOW}OdmI*IY2M-GA?}gvY<<+}teF^V&{9|^q zYEO?JQL8|1x^-?@sgT4e<%yz5?|dH*q20p8Csg>CtFO=<_=$SI*KS~_Kr+>ls}%aS zCnCR@#x*A-9B!MlP?y^~nLV6ptY-YY+rn)yHQPh_)?Ik2WT&{0L$kGmrQ!N&(j6kh zy0SB_F9pe6Y>sj+#D+QbRR~-lT)VgVrHJ&>?AwV+7vhpY?1lVQKJLg&?w$^v(o_j; z0WBMqkj^_i4Mi@?=S}y&xW2;5tfbpr)H>I%mT}*-P+%sbI@)TPm#V^rQ{Ja6AVw#m zE^f|&w(g>k8rU9i6Hfm`Y^lI9HtTKDoY_YR&*whlU@V4How|4Vh!tb6my{+`ZcP!S= z7?@AJBcZ@nR%B>UQRe$*{;F*cS`hb1m&s8JBLsG+#)Z8luEazexGYI z=}X+=c!!n0JS(MQr%_>2O3OlOvLSo(SKzq*SY6)dJM<-#%ap23lA1-Xtz^6j58?%t z+j?5g>9nZC+!wm3zaeV2-QyMPC@&e84w9rT-;_sW#I=Z@`mubA`e&f3Hj}HNU_$kD zi1yi=?_%k`K20g)@qfDWyn5%P)aTGd_X_Wu&Q=YsIMs`#y`iB+{X}yw>GWXPLt-6B z;v7$!h^_lQSIso?2Q*e39VsCSrk4kwzkmCVxkBvD<1Vi<*ZRW)o_<3Q>fA)P+eYJb z1!ac?oDU5zUwMGXF_6l$+EX)d_rlBA`yBQ5+rOQtjr&-6T53D^KfVm6KkL12^REnE>KKzJ91sm?o+x*aJ3lga_O$Vx$wu#s-QlkA#FLV(=odN<^t8>mWtx`o+2^t#CU)bY&oOCI;tFB>s* zoYT2~1N@A>81?O5m+bLj?8g%F+R4Ibd0pYgBSd9QMK72Cjg6YVb3K_Zu~3%Gbh$q< z5k4VUD@ZaPek@S%t>jm3kN=f#f9sOFYmtlxgV+_GfyXTDM?a5QH9 z?#<1;t4^<&Zv{LbUwfkp`;V0{t>1aXWi(~Uf9V!ezCdBH@y9yx{0`BRIOex~DTk&I z4coozF3tXBKSF;N?M&4c2Bge#e1EwcjWlIZLR}j zLZQarI*}tj-oCin8>!mD-Wk{}?Uk}hO*UtP0JW)JZN#JQ%O{Lq%&w@f#$KQK_41>6 za1efUM%miaf%L4;CjGPD-gP`K?|CY6+Ic}w?c9f}&2}cnq|PhuYb`Bx{X@$>WM8;m z^sbjt$T9p7X}8G!K9Y?Un20=fdGsh-)phKrx3ZNWrD(a#LAas6+J|k^yASn?J|4MW z-MwP;uY3jO=Jb-hs9}BcaA5D% z>HF*7gxa*8ylc;R=$3QcU7=X)Mar?JDXY!Upwyb_6=s<*D~`;%&(b~?Fpcl&t&ztK zp|2CEX$SW%C0U)|GfrjN{dolE4&M0dE?97bwyf^mMzZ<$#Hj~i<>@}^KW~&CAMQ@w znyr~A?~oXqaaHxax+BYZijvuyWSrGfs^`+sQLFUpr4H8wvPzM_PoWI{%-eOF9`{{G&y~3?b4JW&0~-254O!RDzz64-j%={9cL$2|FWE+ znbM&D6iH*#`ue;56_pk@FZm@6OUwNJXBlO(PqnqX8!ZeUREE`_V|0p+4_*#>bxo|* zeIoB!eVItksT#d<7w?~?^-UJVLD#7-4jom6Tzw&))}b!*TyO4{h`&@*j^ktI0%uLD zy8S~o@{rjJ_D*jNcZII1J$rQiFC{8zk0Z&X! zvdp6vebpSh5DU%nYwI_@^)DX0t5+i*Y3;mRmUNb}mno)8bKGVt`5}4IdN<2V({&T~ z&v~{x>}v*EtQ<9h)DuqBK3;7D&pvXV&pnxS_>7H^XQA7YUH-yHB*pLue$3oz+NFE{ z>!P!AFL#-cYmI4(FrymB<5Rn4nF-EYsRwCu&mSc*5<~PfQ-Sg^B9arY)oC6Fd3`$F z$n@h=;WI5jG~(9ZnyFv6w#4b|EX9Aj%H&eaquH;F>6c{g1?;CR@DsczPqiS-^p}cc zJg+xU{fklY+#gm}(FaR=RM$r*33$07?lsbK(v@42WVX3Wwxc;K?ff_2)r&3GTpM@Y zq2%|UE_pFj6_Y=1D^Y;?QfL%F6J36(LS_49?SkLwu)cVqeP{V6Pf1hFPnTI5%E=~g z_Q+lczFq%e3`3dW^FCK4i;|7gKJ&r7h?|N(j}u?Lmx|G~3-2jkC(bcfrY)#538O9Q3rE;pm%=0pnxqhT%#;FUvQYXE-!alJ!$Kg zkidS~aQ_>{8H$7FRMf+P-u&FpyBRpmF*l2S#)UeEYQ)v^{PEsd`ERyU%H94P(63n` z9e*W%m||jHOy@eYq@C^s&x+XR@>02-6(VnjZVR6MllJuVTzFZ$mCly+=!Hd}5f%eU zvEL`YvTWlYw@P&$W@40$@)d8CcgqnqPgr_?TU>qswm#j!OBQ>}X6Gd$Vm?;7uTVjt zMXD*J=RCM)Z>@3Ws@DK-+P&((vgFs`kD52ibLq=`WI5b$Xu7X@ zs#(^KI#$)q@{~plcDiIQ^kk@+^7JRKTl+p}sVV8p^VMk-;Z%rpgcli98!)$f%Wf8T z8|!heUU+0wdSBH&eCK_M)+7H#f`OrlS>Fo&K>NuKrLX1p9BEnR&N#^nEOUF_J?3F- zN$F%X;a7{!-p;mEC)D51mnGL`KNvo1#5^c-J60`*k*u|ksh+Z?X|%lV-XkchVIV2S zl)dwfuK2y*G{`f?jFe!d`;5semR^#{x(bHccIU$WHCYDR&#EA z{W{;#(dm01Oy%^}A9xj!MG9_d=y2ML@BHFnfH6T-x1>q*pGKE&+}@uKVdxrWzb7X7 zv`Bu_>AL25p~%+FvhiyyX5H%;DvR?jFM^_6)f}~oN>b*@Kc*6LEnhWJj^%xI$@7zV z0E1A&;a9ouQTGQqp=qUr(T9b_PN8M;M1Ra~$aT2AGjH86d)#YqqBi^PZ1iXIm+PB4 zFD&lpeeHT)N-y$vFH%tHdj^d`8ug}Rm=p&#pXpIy@1{O!h*3#j!;N5euV1=(Ruzs# zleQE;FHII6-1@{fp)QxiK;8e8`|!8j{`Bw9{c}9rABj_Jn7tA@IM}Bmcj+@;Igk}y z{wT~_9jnr*#o)AHgQAKPe1`pB4su+1^UONbyRD?+LD`o^GqP z9GSjjMIH7iO0|#pTuacbvDUSx)^8WIUdx-{9}Etjg9CcIX!ZmWoVAqudmE%9jwB*^ z-zF%&`KIt-teO8|Kl`5bgv$Cm!94{&ZO;oT@de^vIJ@rNCbg>`psV{FlWOZPLNL8b z*xu~Cb}M;%ttcwpcoU;eWWXExZhzfTpQ=Q?n9A|Vv&ZJ|+&@!2=8L@|+0J}QaFXWE zy$daO1n(_ZS6^slBmBBbs(8x3!0LHar-t;R0gKmzbE%$BjE9{?EK;b!*Wj?%C z{BJ$$j0|~XEi!)CB)b1ByrO2NBSS<%d5pz=9NoThW`yZ&T5+V>>=nw%l97~=nWM4L z@SR5s8Tc=UW{L_=y`8xC`I%~?O=Yo5#;178+n0@=(|xa>n{qNu5A%g4Q~Jh{n6wY`u; zuZBlR@@eL_qK4r?kH&?!dMpKbN}cO%eO2}YMhU9>DsBgH@PL-&nP^)g=BEj+3IkoX+Gekv zZEp@6I?ksnmQpEv+cJvM{?m|=AZoT#zIE%BS^=LJ{)XB{OXSdmN!QT0agBarqqa-i zi!tLbf5g1FU2=tMd9|{!{ZP$MVYRz~O_dBcx=E9>+enFH!i49C%*n{eJv8kquM?^c zF|ElycfVol{^Z!d#@dj@S^U0V*J@MT&?YDK(GRlL&0CmDlK0*5U0O3Pa+F3@@ueIm zus)$Q8lpduowfhub@3h5eGLi0dUqZHy@ZE8cTIe1Znx526MyU1I`Zsw8-BD?QbK@% z8m;n=2HPQwVR_Ck&G!~j++m?zB(7AC&IrCsjl6s#iu{58$JwXETybR+KZoK^npJ%b zh}{3m1WKLPkCv;q`YHQHzgVK3_5DNs+T5m&oxXLxAAFSJ)(Pq<@|LG*%q0SYwVzf! z$$WA6N0Nx^%(sQn*%=X{gn)yJjx&o!zn>(Sxfy>AiKl39b`TI5o+=fz$t!ZGy?nfr zz5c?gR)^Gzk?q)4XN~>jN4K4r&E#?GX!O<5^5w;@te2lYginT>mVT$st6mg;FjR|& zU1$-Ns@P0S>0>8q&u%zRrE$Zhb5_ZA)|%xFr-JJbl{S;PXH>L==LPJ~e02Hoh_3(8 zOaf+b5`SP~dolcykD>6HCzp4J31&mdu3LQc{LvFd_w<`p%%A{wY`j!L2Ir>t>go8n zh=GMrQ}wV$^HjOM_1lh97ngeHdG7UWCw-yQCF+nQ zV)@c_b+XQdI*_)DqEb!G-RRTMs|u56c0IA;vUT=^7v#m0O4DR5@+&k~GZTjQi@_xu zn?gB*jojfex+!VHRxg(#7b2^mv?Y_?!?5)4>`Bp7FE~Q$sXhEsQ%k6f4@Nvv**Emh zUw4Zdk$&;@^7{41&6YO}$~_#z9SIelKIFA>aeR-xsquF;GuV4nC#>}24026pX-e&yc4- zJQ=22hO&!gTuhYF=%xX!e4xIr!TLiOXaIxbc-)XdaY44Y`#tPw8*Y5evVDx|klD~O zMZJj2%|Y1N$}i-gC5w4Qq)4U!KnedX!DY4WzZ2;@ArFRbijDMVa~EQ-Mr?;a#sN(s zmYaO@{pFvFaRcpO>EF|!?f4?C*MuiMq7y$m`s=w?O^B3PT0qW_-=0Qmg>HT_nl}6W z9_Z94%$v;pXkf;J(x6y57WJC8V zE)|~wz~pH|k=-mDxy9W_8g;A6=dg)!FtGE}fg%KnrvRq=Zpz{wSi^-tGzv%4mMtWw zmfSjO=CMkx-1ed86w;idYNKewQ|P=JnKyFQR$|SqxLn}<@C2(oW zWzb!Sqi?**zqY3B4fg!%u6q#R=PN~V}-0nRSD=C9Y48iYXF(jKbFQ7aoTnq z4|D9dep)mGGOWuAL~skiD1<4o-_Ce@ZN-i0Qbgmt7@GW#LP7>kbee=u&>;B;#SQBH z9Uvq7aW(W@f);v2g%s#OiE6o(SN7>eKH1sREcx7|x7(nvvAtVGMqRFc4NC9RX_$n8 zmFgbNWg^L>hBf6TnI4t(>VvnQq5$6;OzNu}JRbt48&xWFoL_&RV;a^WBs=Hbwu@bm z-oeG~ReIZ6u7R!pSdw>?5K}B1z5w}2oRRYKTJnk};fK`9E&SQ(?<~9s{Nrn$pxFD56_WgT58Q z`*n7YTjbrJbHGD?CkxT;s1CQoI}_)NIp6>4Q;_K4%@!!2OM8xpSuj7QORF9H$y*Vt z;YdjnLWz^qZCh>#B5pc4&_E|phiclqq>yOINiRdqX?O&R8k_k|NLdy7v&-2`#SQTh z7Kqws>6Upro%!Ua)R-~LnN~;Ftp&j$-yAK(po$0`uN%7LBKXN8GTBO4FKGhI*J)7n zH@XwEBJ#uc&muckrt^5%SRkD{i zax^oCAieGrzFMu+<82Y$ib_&8=(J7Tai+Z*s?Z|SP|HywfK;|wLz&AzTRgsP3UEs2 zSInZBU1O28b?*77n$cLb#c$qkl+vefkP6q;f7Ob;O5UfHw;Vmcnc1B*7HXhYJ0Zdx zECnHQ(lhLH%;B5Cfp(P_?V$3_h*xkF8<^RFro{8e&3%8MTqP=fx%IN)_mmIPdKB{a zw*PC0w?mP>&w;l|A~lZUDyO?glHFzZaj6WFUW(_$d*U1+J#c^BI*^_UuVY3Qc}iR2J!bzfwIR;uv-nx{MWZaHuZ#yO(bF8? zNT6aWNhzl?l8p4MTn;8@8LbHu$?pF`k?|r#AaxImb=m7B<+^I0!5b^wB7W6hsO0M2 zj-JeBQ&6&zuzGE!qne8rm`6cK7hs%QPYaCfS=h$AJQU5l+h1c|7DG?c_G@ld=G{So^?DxXw%bvk>oKuJy(CUMQM(72lB!$IXXnqtQ)l zcX7SDzoJXN;Pm2J{o6V0jXD*(VGUT!Qjpq;J2*bvude=^iR`B9E@`rofc`~=#T07W zCB|paC=dY)gY`>ACIGRVIwT1YVw~Jkq(mcHkV-@GZ65&zfV{}U&iW8dUKSbes^DLF ze`n@7UFPTScEU8k6}-gdbI@I(qVx5J>RGNKnCl>M3r+3$DNpU6SHAJcU;1-!$k$P?M#9h-$sCN%CaF^chO`tTz!(RdFgtwYd~uHukM{NVa{ zJ@PzzK`lJ0^PSz+iO6w(1EgREqePkDjc6ozkSi#!lb602r%CPdDdrvMEtJ2-7i4Li z@qhd}-LcayVr3jR{kyfxY^|jNa}IMlc-`?AvKr-ykEdE0^G_7-5pr%|gXQTLQNo;uW18s%0uy!_T(k(ciJ>d2Ot=Hfk%oah=Q ze_EhkP2n0aoWkiSHlwu(&(OhmNX-i?Q)f~MQ~V0NU*<;tr*`bmM-zM{O5Yv(J9H2F zS~w42oF)XKsI<$C3Tn%@5+^7@CCCPmj|KKLWl$^DX~_l(R>VPyuFJj2usC{av#^8I zxI3pEaYfbC>z|Z1yOWYu{e+3X&Hxo?HH7hpi63qa>Sir}`#S{#PKvk6Jgxo)l8>bz zXKlMJXSX7#LHt|+j2u#LI4=Ep(q1R7dCs_-A@RDMtjV_kWQ(xK1m3tRK*i(NG17@f z6Wo)6@??{TfTb%OG8BS4ArK7ujW-Gq=B0GeSX&hGBn_%N^My$%h_*5fRgVpvm~D+) zc&CRsReynR2v(-Djv9=E-g!6zdp_onQ}s&L(edq{=+IF%`$zC-hap?ic+rL*U5&GR zFpo!KDfxl^Dpo@4M$4$fZO5l3FWFy&`$=a^#AIJsJOMNP6HJyLtIbNASU0I0jV6y~ zMPpu&sZgT^l-KQFAdw?TWZ!G>#(Kfk7gDj@l#$JdEW00;llbXyHgCWCtAf#JqX#o@ z<>5b#@)Sf8gf8{F2ge-{^_ebv#({>@Qgm|)l07)fqrrUDB7Bv zGwC^U?$?Pdb-&IRx3F^6-$FC5dUEHM=aOgQSNL89 zgsmScjO#-~7-xzB(X{%7VO|dP?+LK&(J%Ly8$d>fj9IXKE)D9?2# z<=byd&~c$9DatK+p3W=MtB@PLSxuPzI9WT%g*FXsNOXY>>MSM=D^o^B)#a@f@V9T2 z??oC4fRy)vg&uj>)?j68#@0g-<>|`qe>XmfRn8DcXn^ki8VeuY(8wOrv|81A)O2wt z4>$G~Pp51@H9{l6aKeZx5Fsk2m7@^rt}Y5rSPHH%(-n<#Q7CZ-;-$vESk@OHQpJMk zkbqqRP4owst`sSF@}+=6L9nann=d2DUe9I(J+N9rHW6NcG=-VoQnhe#$9&^JH#R`w zJ&t(n?S%>*n8w^0XhN`O<2JAQT3)8~>2*W%)6z8orsRas=~b27S}^8pDs#H~2A2nc zgdr=AfXsl}BEG1NGYJHFk}0po&b9?Ab-def6a$r>s1|0Kq&am0bexN%R^af{TWF7$ zRlKIgLLet>Rqenn{$W=MT%G&icEU-hwXb=&ahf_p-U`MwbsL+ayXzc)f1oqANS7<; z=6fopPuDpVO=aF&gaQ_hE!b&Fwm&yiP5S_}b*=UiyXYlwEi{<}=aK&ID8}NvTpYl! z)e&o65b6q5W*q!-r|meDL$HTfX7wa>Q=Psq81X^Fm=GQ(w3mhFYfkxLt?~o=aXXO> zWN~dOFw~KCgK`qj%ECPq>{_4;b*|6_-HNvBX$N#^dkjcohuiB;ygct?iGM1{ULzFX zF}p8oHU&kpb^WJ?d!-s!4?S7NH~6OzULurkfu6_kbkIRm#CZe~vP%lDHYnbvaPHDc zA`(<*qB#s1i|aa5ug8}$@0l{4@kXCuCQrQLV2JDu3C3zDnjcut#qPac!_U%KM8~{gPTP^E78hs#Q+3s-4x^oks3^kP8Ypw?#FM5+dRbZS5l6! zAd|_&5Fp!{@HKO{u9=5JGub$P(-6#cjoG1-Z<|G%Z{ic=Ff!B$;{{~WvLM@uwAR#NwVOtqh$UhlGO@Pbf#`eb`#$h-6Lv$ZvC|3OE#WUZZc|W zFn}DweWZ)>Ncj55tw_XtRni-Sgm6e&&@>H)l9|mPXYqLk+D#4NVja<2{2y#Ha^M9< z8gC~~KE$^H?vQdraWSRbFO09Q-8GmZXxsCESJaUBDW6IwRyvjwS7Ub8W-Bb{D4mz^ z;EV@rnv<_c#fiM^1WESMoPn&CZ*iA9V-(gf;-+N?a3qOGrN{1}oP1M0fu0V9Ri8{8 z2+YGsRs2#J5p2!hcl*{|-xvZF5z-B6J)&1++Hj|+b(=K+WS-1MYwoH_|Vb5F$h>J+}g{8aKD4U0AGf0UZZ^wF) z%~}e!99%Br&6vEs3eIgHKZW0IYHiIm!e@nM+>ncgPsl_ZoI-7t5dFU&l8M`iXb>S< zMgj90hb3}SY3*Ptn}^s>6Am&bP;%kD2$Kw?Ce^nJx_5JVJ!e1(Z#h1>=9A=|p6Cf0 zK{@NzLa+s+#C)GE>8tCAx`wwa2@J94E>SJNi5oYQk_&vROVi ze+st2A@Yihvn|LpNovX8z!z&Oo|?wL&3u2}+|ixKrwZ^=CQjF2tijwUWpt^KA*0{S zZDKiKqG>o!YSL_!0*J-=%VpF!*j`nc?bs}wUqtvr9aq_t$LIyCvyiG-*x>!0;s-j* zxPt<2SOdTlCJ7x^m$O+pCVl|5P!YYEzt^%EQ-vcIS3)(&!-gZ@%It$4;)wV9l4s-xvgvY{kK!bX^E9f&xI9iqo&q66<)IA6M)^zRnz()?M^RJ}n zYtG-xkrH1>Q!hRWEXXT`)V;i@TM<$q6s6@BH|-lAZQIIaps`(Diy9Eh?4*~YLL|Kv za10>rLa>~vG@MP@$6z_3P3cHa1(OD%F8K~G%%1gJhr@1y-d$QJc8O{ZHPX0jekgtqWkWqSPQaG z%yHf|!Qy%?iJF7k#qa<@cW_SNGy_7)8QCAn5*u29m(hbiW6dE{UFIb;F!xP;!PT3h zq>u@;3n${ex?}txhLvc_>lPtN&XYI88g6t_uY?+tnLaKfFVjk&YwJRMe|eA+#6_48 z$XH*(eZ0r>uzGiOLL46|^N-$lUYv0%eZ<&9jcx--HJ5j(~K}WtemvdtUd3%|);1zL;Q&&@~IoWH%N$nzR zls(1uCbi`)bW~Spy3CK^-i@CPw9eQ7xpRo9;7HZb`34IjH%`z#aJrnGoI)Y1R4{s< zYk448lSQ&K*4>&sR)yb{Evki1Hu!;eL)p&a)$;~I^=<+atbw39vdDN6u{_qjrT@4n zd63QCSZ3q{K6xqaX0W$-#5PMDyDIU@S7Of3)y?was{CRDZnhpip#` zVpr2!1jVbTPn-zH$m5rv0sx+d*N@z=Y1#9jb!Mp5oSto#ZGi-$mVf&is|S3&xZ^s& zpmV=6A6J0;q8he1m(I80WMwxYCbStJpU*FRUj0S!z#2M3O;KwzV*XQFIj{+4;Vrt7 zYZFBDg?Wi|>?)Lkyu=c8#mquBG!P@Pk&-Pt{Rw;mX)21}h6GN;8L)Q|@E1F<;WM%2 z&8$b3YpZ8TDzYr+uIZ&zJ>@BYsh*RlpdZ{hC+l~nNOLJ;Y%^}mW+S!M(#l}sOaMLz zxUs*T8uosr(!M`8;O{rYl_BFq{;5;!k972#lMx3fjQPXQ7*HV=w77_2tR7FGu)rGo z6ZoJtXKoBy-OgwKXQ5jC%X;c)m2S0aegkig;9nT@r64P>vI9AAX;Bo~AU zb{CyA!@V4vh$$i8S4Cc-~Ytu z?oKZkK@K5Nu`*b$zJw)dXoC7Bx zB6((((KD4!Ed$wM;+3leov_BWl5K0pp*if}#+AN_sl3_HDOqhulQf2>r)A&0?R-50 zxv0u(I4Uh<0^79gRhwOlY$zjGXV%}s=TatbR&MbYMTECm(1|x!NzECMbt&b~4I&KN zqbKYJ;~9w=?{Nc!y}KT$KZ#|IBE31o*Tui`(w97!-6uX9YC1MY#^?hiHZXqs;+j7r zP-YbNrk5tVjRxlU8sF@xFEZTeUvqwp2f087fF5O?CNk=RHHPzzN*mo?tPNcS*{tWB z(_ZF6u-1N9NJNlQ$FB~lLj@A4i>sReS+nKNN$O`9g}UTDHO<)dgJM<*&xrC5Vxq~+ z(@lDIl@rW>@ok}Ilk6@;90oB=;c}))yuBGBz|W=pZQ*c56CRzQOrUkFmm8`w-oQ^& z*-#`3xW00989@GZB(@#1%2e_HRH!)LH~Er1_9C>m3>ID#)ekQ!dCh>=wbMiBp~UN=s`^|7)1!H;WQZxB!6)3&o<(~=2* zFoq7CVUBZhng#~hz`P#fvE3MND1lx|M4^l89<_OVVo{$!jV6LD9|GgEgO@id{Q%uO z&TC&>KvE4vS?If$b{&@va8b9hvM`%c0ZVV`5@quhqoV!p14Rf7D*Q*@!ry zAkcfE6x$GW-R5rMrt(h?GY-XgVaCc=cRz6d%s)fICwWB!@Qsm&++2t0#LpxTK|nI3 zwEUeVY7V1NjH0~v>ZsJO_=rwx5y;xB^wGlu6rqocOQQlbc-+7kHmvw}Jd`@BQtWT&Y|_bGBqG zdj>zEz?su%(FSDSCN^HT{WBNSn}OxSpaZ)p6BFfDO&M;f>$`9S0Jfn3XI)aVP&)I>pT1+8OuyW+{Xzk+N0PFlY6eiA-xehWh2S(O=4I% zI%Y@a-*9c}9?wnXPnp-jS-nsw^3M_W)7rB45siusvnz$PLcFfpw)j5eJXzHFwe3VV zeWM+UhcEc=BEEuNX|RunC>2CUv^TP{lh|Hpup$N>ye_$^iVJ}8&Y5xC%_!+_6=_h` zX@-hVpB%Ei)#_X@*UZkofgq2Cmv88TTsNDiR1l$NeVb6_N9M!eyz(vUNeNj4@cNTg z=hzSxg+j-E8F{sC6lr&)YIq7$1d&Y%?e0fIz7{(JMqcjSt#LK(h0jdpgk3iY1%~xBy8U=51e`g6vGW zGynzIBrpJbNQi;O)R)uuD)l!>7=?0B#isEZNLN9GixbiHOd9nDru{;q=wXXx3(#Wa zJF*m|5=F^q)TRt0U7zWyd8-pxMI`ebZ(2OxA0R)auTrCpWcBqy5eNeAoScKbUVWBy z_1o2W7@+kqY_wLCv8M*=>FfN+KiN!_ zKv6nu;>fF^kH|);)kSoJCgf_?(dcg}y=gi?NvR(+3ax=2#5ms{8>qoGo0sV{)TGP@ zf)G$~l3xwm+N)N^h9Gw(Po)c^iwqGsh0s{yNVv?q8X;$VCHP~{+&JJWy+iHHap2!Y z`oXIeNVDftTUG*)sf?EG=KvmyeuL#V%pimKDqsf9z^z{Rpxvp#~B6Noqa;KG0NwiCr2SsP$lK0;*&4K{Qq+ha9A|Sp=7n+Z9)4aVBG~l*i;RBYk-o)MZ+JBnr6dPPu;2zA{bSd zJ=#mQ+hul+!3`$AXU-3V;VT&NF*6ksrt^~JnBn-Q3X`&Kjq}aTU@(85!narQrt=mT zb2tST5S$e7mq`#?2o5< z&8|&TPA)F{&PA5n(HA(S{;Xi2w%Z~P_`Yb8Fmu`Yh$ur5Jopx~g+~%{muq;|SFLBE zDe4ACRPV`~D-AVjNP)Jqt-{tJZdh+thUm71Pi$1D9Gl*4X8h9NVcmGiPOF@O=)r4Q zEyq`n=LYp=C5%b0Pt!T&Hc($NN6f-}!5$nsJ)VYrQu1ptJ`1k-*IA&>>kAy22xZ5j5<>M%SjsRRwfviUqE z;$;gD>8*?5v@Ltab*cLGJDl0eJZB0+&Wd@!5ul?Lf}CmW;Q$fIJ`i=a)3}^^cIty+ zf8`P*84!~fU_Fb6XhoBlD(ZwBlFJHNB_@SjSxbws^ySrTpGl0ZOuN?KBc`FFU4E?2#|Eq#aZqw6 zDAFQIKd2syMECd`oB;GJJgU30ww%K8RT9YM1o1G(s=I46Y ze7Cu(e3n&|JFy1>TByjfMY}~anQ~76?j@SOy=<27hw;P-kx|v^>5NQyc9P5EUH8qm z*vYysR&7WBE|z6HTBfMqN5KkIp{Qrv8B|qH*%oPFBYBC%C#Ss%R5XJn*etQ{nraL~ zPmAz&jpL_E+UT%oBoIIIKGZ^&e?Xt5qY_Xiyu^x0l+s-{?Eop-O1>yP7+Txp!(I?{rRXc(+WUJoU7`~hBl*u!Za&z5O;jFo< zVz#IKnKqY|h8nUeHr_A4%W|}1sg(fQB%@;aLwac-Xt3+JvF&Gq_i{LfV0Zz`BC4z8 z*mMSF#;qLZbn;|YN4DB6l;e~BmZ>`8<$ngPIw?-!($UWfi-HBMK9m+?e$y?iblsVV zXuuObR`jDC&hPR57KH4>DNDza;=UUoGl*i4i*-?YVK3O+x^xa(pB1t=fpFoInJW%@ z(e^m8&1w6^eb{BWWgdX-*w(LAMe&h77uY~397VS+>~;oDtrtW$VAS$*UwhCF8#|?s z8KcL*emDxj?~#&-kPv80j4!A1P)Xgst}=;f>QqLYy^f*I0&a(756~*PxgNK6a=5zd zZVXtvR>2m711!Piusk&06=W{yQG+iAeuxQ2C}xCzdNGh_qLlwsFHV{gn9T*~{Oyu8 zwOV6BAss3*pl`GE*Ue%#=6QG{8l@}1EZ|xzd(yrCCaR|7C)s=Yk=P2|;^p!x(>&~% z3n42hrG7 zf6HU4sI8zYW%LiZjl^51>%k(|;k0<=P$Cn}(YU-_7B1`zym+WYF6DIBZpg8xLf|t& zx?e0_!b#)gH7P@U68^pc7v5RsDa>bGur-*a>JIf|a2nKck@i-)l0V`y-}V}C&pkYf zl-Pq>*?)ryWMwGQKWgMaz-sZQI`R~_X&xBc>YdL_8#XRx!!}mAfdnV?(M2)tKzas0 zwi*pO4Bq}fH5Ml^5e|r)G;78XB5bP0>TnCv4{* zR6sqKhZ8c$9d!R8o&?3;>fB*S!5DigP@RWiLda8|w~3QP+Gq?QbMu zBLrRcFpQEE@T15X5Tpvtm{8;ZenJ^5dXyVt{XZVu$@C!?$(h{!M+h29nfXJ1#pS$X z&NN2QDao4pH@lypXUi7qAl3}k*H2x~xtJZYS2Bh}kWoVKi#`g-EOSA<)y;mp+9}66 zIL_cntm13m4Ja4Xpnc%txc#JocqP}nJ1bY#l># z@vv7*AwGxt5Xg?S2?a2s>y9$owq#k`@dvT(?m;pTpt#a<@16ya%x zcd1?HV$<`fDa&jef<>OCw7MfL5%s8P8(5PraeD>j$17(7az7ZbeeZ$vlLGjBP%|@a zGdan}JQok6w~90%DkElUL$$!`sMRRX=nS2U@!vvErC|}vBkCjA>a!@>kE(V*mCmQx+UceK|j^`cKdFOCkCPj7fN7)uP-SyvH$|+y-YSLlyH~&_6(wqzG01Hm zS-E*`P~xpq5Q4L~Jqqy*e19jPZWwow;f_TwB}q(7bOxPa2d0v~RtLCLD?vz_-9+s$ z5k~Gn%nWc@HcS3ubj^j()9S_WxD529!>zIt9M|e+W1BPmLgV=EE*1dmH0o zDZ<8R?xGKkc7gvMsR7=r?`^sU6ICD-b2}^kP3NxZa^v_4b<1QScA5L64wee<&}X*j_H$;blSC6xb0DUV7JOfHHT| zPLSy*Lcx=$Jef`vZG^hYvQ3lU;R^^8o!7EMcCG<;Yu%ZlwNR4~z-bIS ziDv+Yo(ew0<%~HXckJ|*d_y5FCm=?9$Oo={C;W&#>5d4x)fAz5B4)^MS4xu2BY)7l z>#o7|WEQiEGD#?NPN}L{vO*rb(5^AiRoo{{@psw|WUMZFJ!Tc*EGXbmUf1MHoQ2)G z;Q3xclIg~{e=!veQ+gA!$6vM^RO*PZ8*|F%#74PO`b>y5?Bjf6%k;tu(-k>9TsmQ; zf(Kf{3aBEBhBV-9h+@~xRRNG$Gckd)(Tx^|_ouHDq zhcrMD?>T9`c5Nh_M%F(m7C`!*0w618aJu$ApL_!%aq465GIX2Oe=*$k-4Cv-hyW{N!8i^iORkLUA{lZKbLr4zUlQ8S zX(sWKfc#sFJb!EL$|{v(`(SX8I&Ct89U@Yd(8#jeZ?ZUR3#gZaok2K zv@=KvkifN$Yo;B$GJr)G&FQhHXaBaeaW9}UFeftSQIuSm`5m+9?ti$~k`Tmx?uL=7 za$9;xbQa=s=0esgIv1z(uL7x6@pHTsvWajWtb4i1A68$%w2ufGhHW&%rcO zPtjz9%Kym>m2HV~a2jA}Ta%Jf6=FziDe8>&6iTsQKch3fJ*LX;y-PqTOd5tWtHlNU z;$$swSVKjdRg$;WAKq0aMfMI}u>lVxm4#XLw}E75s%09%F=QO3=OhtLYKqdM%+Uk| zFKw<8TgkC^ABA}f%)ATKCquL4}6m!z$pseFsNnqK|*VLF+I;H_TK@IIJjy zL8CF&1%+{9wxZVijzX>_`BjUlHA$qql~!THleQ1!)w;{Mx~iorC;!$9^6dfgb@Ley z4xeqQj*PlPCR5<%e$DBC6G`&zfyXmCW{R)KaYFJapV@c`&On{m-g0&ZSX5v)mw*G<6LMYpLrBsOd4j|jgaT;9myeXWMANFYoXrcz;KdK%@B$8hVdPp7yU z8SZq{8G#$PCMUWr%)$QjUtEmt{IJ23d7Dfw2I$tg)RcLv1Wt zm~Vwp+;ca|8X#fvb$DL_XsuAar9G`%j^h1=bnoBIW@j?B+P4u6JMjV4TsNZAV1+~H z>`Im|2Z@AHN1SCjcY3w5n69n0D^5OXgEP@yn8a}fNXw!T>#lD-y-F*&;q$3b?vxy? z_Dm~n-2`=9A%EM_{Doh{At~ej&5@W;C^6=&tvT%NmvuRW6tmE&GX&(mhwH|?*3G-c z=>T5M8$RL!-`ZCMDC;_97!=EdppKn6`7*+s7QDF)WxJG&7B-Y{g-)qm>j>WXjC>=-Kh$*c*(hA+Igzle?gQ9-lCi(BO zBkm|4iqt!t)^1h(Ir}j#a%Cy=&pYUIiB|~qBBKIR#?TnUcBh>e6j6|t=zEPCxFTZU zJeoTTq5>`MyjpyqvI{WTd_F)B@Nhh-3g;s|t7HYTlvGW@e81(Jtx=fMt7kbAH=M(% zy+?!bt)wWvpr~(Zvk^ zs{A6bd{@AU0wBkb=VIpxJvw}joIb3HDoE2*B_iY1ZFD>bawzczNqD0EWAcg2RD~>O zL45z_SVqXiqUQ)7EC$eJslprGw(H^YiA*-OkR0WFsQx>nXMv0{5t@yKxtDmuPC+{GtBm|*g-$|lIb}^#vH*nbv@hX5q zf}ZhHnlR%LA^O@&IkPOx<=leR-Cp^X1l$qUoP#@O(=t1o3B2io|={tei^(@S@R3Tlg{Y&|6o!Ty2b1iS|X*cWg;u zrvEmp=EPmsfdy5n-EyUl_qpUQ71yMCeEzsU&hO2>Uym1XX0e70?A?t{L&GQGr8!dY zt_<$!ZKl{_UEztQo6HJ}AO_X{6)+=^$!2tZ7Z_ zv_X}>-)+S}NFeGiC2gUFr4$&ujk2U7`dzizL7Q~aiO@m=Q7Y$DFe-tmbKnHy-^x**piE=HqF zMn)NajKe*_l3q=dw6Muo9hNJ5!Bw8vBfW*lE(H!^^$u(&?5`?+NZC8)(9~qIO6)5- z(*eCY6{q*yYi0<^0|_bzXZ66ZUtqvd3>&F|Fk4f#j`ga)8L? zZ)KO3kz|B2zMcq}A~aN9FV#AEAm8nk-c3tQWLK$FngTqiz=l`H}l_h7Q*dX8C4c`+S zF^loR#YV$#nc7KwsB|tdGsU*fF3L>jn|M@OUjmH-L1Rwt#-=B@*yk27x_6=oEyGJeeFgd=5fqLiO9!DJ(JvKogj*dfpN@v28zvaj{!(_q^v>}i`yp2HK zH|k*m`cN(&aag_j-Ys{VoKr0_H*TrTzR|{nxTWUVUGL8K$=#_?*8q+(OHn-OIUQu- zucURi5J4`SHSn(YxoKQhP;B|h$;&cr-k z2ip{mh&MKdyBuJ`-lGWSr7##3ZMS%E4VDI1~^3IOC zt|1M%YC()!kqc8FQFT3nFrC&ns;yLu-A78S)o|wn@6sgUd4qZah@DAGSC*TU$aBml9xaMAP}iJl zlzVc`MTELu`lWPqGKw5UWkC5s0~3J^o=w9Rs!!BB z$2OH>PSmB3R+$8`A?bFOpc%YB_ z;AkXal6gp!f4;`ea@j11WHfRfgpI>dVVKy{CXKSupi(2=WsEx6JOP50&YR&}Ulcs* z@A5vtu9vIHG0A{?bfz^^gKMjKMMW#bW1ApDdXbDQ?RA^og}u8{?M-9rEPg_qcsJP< zX76;)r95f4O`e+4Z@}n;xkrP@WQVfpW)N>aN+a8`f))zkU?9@PF@Vh$^B zCSkOozUjXFeV&Rf@Gaf_3t%9pd*ZMn{3nf#o;LN-$ynrhDTQjfzDC_y z&7gZ|vS$oZJI^o3srcpBPi&b5(Nju-LoJ}rc=G$Rq^_=T6hvpp$Pn=?sg#jGzoE~F zoK>8?>P4sE7qFB4jw2HVgLYxUyo4w!SaZ8qxobu;cQLX|kJN?~W8m*Cnr!ctDIrdW z#fhLwNwvh5g!5&HeSa8NXMkEH7xW3ofnzO{5_~|FJdw*#5BW5HIqJ*&tPr+$cbn!? zXaGD@(y8W6D?9(C5>di(=37&EVxGFy8ur|3ro0MBeBf;=gr+J2En=aWmVQ(VJknzS zJQTV}qsKdEK$&NJ*@kT>p2S=1p^Xv?GOP_}51o=cSZ~qyh-sJ+razL>y*G9rrTNrL zY$y~Lv`5y)9e1y}ad^z-CDcBgoH5E=1FKI#169AFcpuDYV9LYTYvm4oFR+PL&VACv zswq8EyOoe~4T4$RwB}UUvuZe-Bm7B|Iotp`&h9#6TO0=o7{x557{1X5slq-WIkEoH zdHAS(`U7_iMMoaX!8@nVtR^%Z6FZz=LF*?QCijf2R*U>H+XZ;Zq^aBmR7a)uQ>1Rv zKg89!A_NM&$<=K!WUdo5%*J=!r$CX-K*Dkl`XXfs8j$G`0iU+)FPrbY8!)k1<>jEOuF+J~zk^TL)

YmH;T^6RA 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 literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-ladder-01/package/objects/4ab8f747d181632f342a4887b0a8bb86c174409cb625157784e18c5e5559a381.wai b/wai/pack-conformance/packs/video-ladder-01/package/objects/4ab8f747d181632f342a4887b0a8bb86c174409cb625157784e18c5e5559a381.wai new file mode 100644 index 0000000000000000000000000000000000000000..cf1710435b2925d643182d2b65e219d87159a714 GIT binary patch literal 2503 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 LNgU4&(V+hW7Cne_ literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-ladder-01/package/objects/6ce13c9ef6872caeb7fbe71661ca88bcc463ceac47f109c8c155e34bb1a6f37d.wai b/wai/pack-conformance/packs/video-ladder-01/package/objects/6ce13c9ef6872caeb7fbe71661ca88bcc463ceac47f109c8c155e34bb1a6f37d.wai new file mode 100644 index 0000000000000000000000000000000000000000..93381e7ad632b0c62b0c50b41f138aa51d44d249 GIT binary patch literal 1380 zcmZ{heQXnD9LJw_wJRGPUH9S`AmxS@an8Hv?s|7i39UL6`~#OvXJVv0ch7V5WNl~H zjp1l4!=jNfN9G@kQ4)g~#YAU;5aUZ~q6Ud38w_9Kkj9rpjll^CsL|-tyLk;J{_*5q zzMtRs_xt{y-smRotOI}%W+yV3PKN7XnRX^Yuz~2;kby~xejCXQNoMGeH0kd%G?XD_ zD1}L1EKMFAG}0tt>LZMX`jKk%8JS&_rj{M1MF$$WbBY8xLC`f?ggJx>7D6mi6-5>}3Fo<<2m zZK2rC#F#OqoNncWPK&krLW9Xo`IVgA73Ct`XrWR*bZ1fzC|BLdDaV{h+S5}PgE?>pG@^R4O4E9xAl zzdSPdlFNIddH&sR*YvNmD%Zj)hbv+?n*bNqpM3Ge=f!h{)mJ}&-D5XTHT310E!GcR zPWMw5O9zaACj+)}oy#*5Fh@3(eGyx6dum(mtSI9}TdDSWx5f9CW12PNxhAVmJ@kMr zuNk`FUZ3ZCXoH{jq2ood93=zSCYEF6>e3gOfJ|Q#V?sYv58E zabv~w6Xw{$(z?+?;pOMUlXqQgE7_ozCceAkcYb5nid9ob@}tMAKV109eYnMrS$FLM z_S?d;Yx6&Cugq8aH-Dsj0TVtuM7^Wx(sX4yZ&2I)?9`mQp)hylaqhmgR)_%fJKc}X zRj}F1SN3I(=YL%J!yBzvM|(~MEN&%iaCuJuw#d<)%x~I%>9z0v+8oYL=T=$Fa@gpp zZ4ECnjtH0;zvuN|A0Vfu?U|Zp5~Nf=IUytx`|5>ss4_Emdr7_a@Vwz#skNo-;GQ z@B2OO_szPcS;S}nhE?J&M!?NDp#^vCaFzR>{$686oh;%q4Ktn?3 zyGSSFD1vApl{oKUN+6;&fK>c>+^nZkaTji;3{_Qkf-o!v!?5}2WS|p|4w^I;D#Nfy zEF=Uy%1%r)Sb$vjV3q=Fz;8`^*{8WQ~{pitci=S%v_xafLlCfC>N&KboCGL4iQh!AR{e*1e!vc;v+Ky_=&RhIc*JaPlSfE8i{7JF18E9e-JI z)?B>4>#Gl%-zb>!+`HULPqwx9ldXO$qmN`g zy=`luhik)6VP9yAfBaGNnP#Z%+uo*C zS1&pw5%bJ6g^!C|3qZP*#>dtF&*Pz2x~Z0RBfZ}reS3DqnveEuztAVqERiC*yhEV$b7}~;;NA48zsSPbxgfj=k|tFFBAp;1ah#$r>7B|v7fHUX;Z}JrJeoo Me$}~43oG3J19W+`r2qf` literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-ladder-01/package/objects/c2ce1907255a041c388afd06ccd007436368e8d20467fdec2a1eebbb84b03bf2.wai b/wai/pack-conformance/packs/video-ladder-01/package/objects/c2ce1907255a041c388afd06ccd007436368e8d20467fdec2a1eebbb84b03bf2.wai new file mode 100644 index 0000000000000000000000000000000000000000..2ab2cbd490b9f5789d5eb043cffbb31dac0dda3c GIT binary patch literal 35882 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 bxgBY@5%KXhDVueAQ1qo2i}6y{*ZjOI^HwNn literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-ladder-01/package/objects/cf842ef3058d3c54d56c0ea3e075efdc77163602b4a1dabcff080e5ea28b9946.wai b/wai/pack-conformance/packs/video-ladder-01/package/objects/cf842ef3058d3c54d56c0ea3e075efdc77163602b4a1dabcff080e5ea28b9946.wai new file mode 100644 index 0000000000000000000000000000000000000000..5b4b092ebb2bec1dc52fe1987b91ef15cd29ee73 GIT binary patch literal 2648 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 literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-ladder-01/package/objects/f525b4450c29153dde0b43e4d143dfb76fcc3884c607b744c8a53fa6a1728580.wai b/wai/pack-conformance/packs/video-ladder-01/package/objects/f525b4450c29153dde0b43e4d143dfb76fcc3884c607b744c8a53fa6a1728580.wai new file mode 100644 index 0000000000000000000000000000000000000000..f91d83f963f2032c6a6f7f40d71290e2af675b0d GIT binary patch literal 1234 zcmZ{h-ERz07{hL{HZy0wHx(<<2sdrq;DYU$IcMxdcekda)V9rr z2oe4PAD2WV(z@Y7f-9mo6&h|-D@uY3^$`(?#JjW1s8lj1Gw1x?=Xu}f%${vKg{L8e ziri6Rb16^)iUVliAq=wdrV}pGezTe=<=GnxOw03pJf}}B4XV3-7O4N1z+=8TO-pmoy-Bd}l0yqCN+uigp D%T*i5 literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-ladder-01/package/objects/f7f7f4d6af777bfcce09cdda5ecb754ce6bd8dcd2e03ecfc41359cad989b15f7.wai b/wai/pack-conformance/packs/video-ladder-01/package/objects/f7f7f4d6af777bfcce09cdda5ecb754ce6bd8dcd2e03ecfc41359cad989b15f7.wai new file mode 100644 index 0000000000000000000000000000000000000000..ccf6489fc6a4df75c3b252aa792e7bce90cffe23 GIT binary patch literal 2351 zcmZ`(X;c$e7#$WN1+;(|6i~tl0ReMfCOcY1i-L*>xKxmWlUZ;oBr!w*(Karntik~o z+_2alT#tIRTB{z7#ky4Mg4&9rq7}6+)v8pjr^mjT!58__A9Hdh_ulWj_xs+wPezSX zUUb2*61S)}#_%LF&E(}+nK^Sg zE0ZtaB{)S|NF$fW*@__>mQ)BO6y!W5zAzT2%qE(%ab^=|%EjYK@Y$S+hP-Z+W~|&i zhR$KF=6oK_H`_QC!W2O(Npt)9`-1W;>rEX_~^ zsbm&57=YPz>bUA!4vk5Y-j0yT+tgvsvTnkLg(DAg+prKg<0SMNp zVO0dnD7AW$)aW%T6+vpW1~p0RXg#fC^hUkLz*0I|qa$?&B@6VF!N5%AECofhlB5}0tp%jfV9=|TI)c^Hlu<+KU>_PbFfd9&7^ID~ z<}z?0B{*v(^BGuH17h)6c$`unix=W?Dq`WnR8I^eFbwmDj|@Ho-~%^}J%f)w=H&%{ zTqAGiFL20+TQ0uXTKMXXx%PTKbyCHV1#M3jHF$^nCT@Ifo7Zr??uV-Vz2;k1r#)=H zm~|+s@NIEZOtaQuWdF58g@Xm&s(16z37i>ZDw#Sj$ zG1l7K!Gs&Inf=z(6~DQCP|=*zj$b%4={H?N+_ohidm0TfZwa=m>U2cwALYR{K~4Jro$grC$Jf0py?)u1r92cD0Q-e6X(C1EgKT+%le6bB_K~CH{NCbj_zl-NBN&qVP zSf_%&+cW>ljYVw|Bn@zt{I%UFrIBB$dvCukC(yF0qoU>?2h#P2aXxp#S*T?Y3{v9+ zP7SGdUvy`!*~cjj>6vCa+SMQwqtXtC+;4Zu=B)Z_fjI->q-!$lXvSej--Qw;S!F@J zaaYgIna4ifT%YtWd(-F>7`5T573}f6NZ>XOfRch^#Q6K-mOy12y-K zPuMp@r7F&@Cckm5_!)TvD55|-)|!>x_5Gnxu}&}`P)Iv}B+jipeLXPy!&ckMnP^CA zl+KPpLs#}Bk{!sc)|rjhhh~(v?n#i`d(t?4YXv|i^v+ED_Y$HgZ5=J&fF>Q+Gt94s zWp^^O4uHk&6>@)UN5*akTIq0S8h(_Q?;l9m6xi_5LOW_TqGzDX%Rajl(A(Z$%o_kk z)$*%yzzaagTR%+Wl#Z53ho^Q=9%cz&lxVn{+83Si1g!DQc>xxrbJ0N^>*{&k*SX)Q z-Mg-NKDc>eykqD?OG_@&C%OClE0!1ZsVLNViQjs$uy850r^Gm_%enFZ=NFxfoQYBy zCfpMtAmu$za5vXO>WA&xn5N$Dof;J+a-<*?*%S8H9(H&3S@TBaJnSg2^(j5+&#K{@R_;}q@MnsNnVW(UnX)UsJ#kL zES=IhE?4o@D|FXoA$tPl!rsOUM@nzaLf=6)a#qQ&w4>_6z( BnjioG literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-ladder-01/package/package.receipt.json b/wai/pack-conformance/packs/video-ladder-01/package/package.receipt.json new file mode 100644 index 000000000..232e4656d --- /dev/null +++ b/wai/pack-conformance/packs/video-ladder-01/package/package.receipt.json @@ -0,0 +1 @@ +{"asset_id":"video-ladder-01","components":[{"id":"v","index":"index-v.wsix","index_digest":"901134f541a31eed733c22e4e471abd9530566cb54d945b6c86843bb5bcc85cb","media_class":"video","stage_root":"56ff2237e4654a894ebefb9d0588092806b71c58ee502aa43624bba633cd4bf2"}],"energy_provenance":null,"grant":{"capability":"wai.video.package","funds_ceiling":null,"grant_hash":"0000000000000000000000000000000000000000000000000000000000000000","joule_ceiling_micro":null},"joules_micro":0,"kind":"package","packager":"builtin:wai-pack@0.1.0","parent_kind":"none","parent_receipt_hash":null,"policy_digest":"6938df61d1274e43680652af682498bd5c7f1505c5f51b08c770143643c6388e","receipt_hash":"8ffbff73ab3b6a07c2e9645965a0bf8537bb9023e6b478186d9d9a399e343f3f","sig":"66e04ae9335a32844b7e1f83fad3d05005d296c6e69638e026d543df0596bf5066862df13ce6c4bf80b8dab32f67a0e72811e1227821857c29f9be45faf14c0a","signer_id":"did:key:z6MkqahniHbtvRDna9jmc9dSMo88FCuKnuujLKxbWyK4682w","signer_pubkey":"a558bae731bbba29b0b2308493514f6ec8a51ab40409cce9e3afafecca787224","stored_bytes":127966,"total_bytes":140530,"total_entries":15,"unique_objects":12,"version":2,"work_units":15} \ No newline at end of file diff --git a/wai/pack-conformance/packs/video-ladder-01/package/plan-v.txt b/wai/pack-conformance/packs/video-ladder-01/package/plan-v.txt new file mode 100644 index 000000000..c7196c34c --- /dev/null +++ b/wai/pack-conformance/packs/video-ladder-01/package/plan-v.txt @@ -0,0 +1,5 @@ +0 +60 +85 +135 +160 diff --git a/wai/pack-conformance/packs/video-ladder-01/package/policy.json b/wai/pack-conformance/packs/video-ladder-01/package/policy.json new file mode 100644 index 000000000..2dbbeffda --- /dev/null +++ b/wai/pack-conformance/packs/video-ladder-01/package/policy.json @@ -0,0 +1 @@ +{"asset_id":"video-ladder-01","class":[{"floor_only":false,"id":"tv","max_layer":0},{"floor_only":false,"id":"mobile","max_kbps":100,"max_layer":0},{"floor_only":true,"id":"legacy","max_layer":0}],"classify":{"motion_high_milli":9000,"static_mad_milli":300,"static_permille":5,"synthetic_bins":12},"component":[{"id":"v","media":"video","source":"video-base-01.y4m","timebase":{"den":1,"num":25}}],"defaults":{"deadline_ms":1500},"floor":{"extra_keyframes":false,"supplied_listing":"d795df9202fb5f32fe168aa585332a5694ad7d8d7e8b859fc7d57a791f08c990"},"ladder":[{"capability":"wai.video.int_motion","component":"v","id":"b0","params":{"block":16,"max_sse_px_milli":30000,"mv_precision":1,"q_candidates":[16,12,8],"search":4},"role":"base"},{"capability":"wai.video.av1","component":"v","id":"hi","params":{"source":"supplied"},"role":"floor"},{"capability":"wai.video.av1","component":"v","id":"lo","params":{"source":"supplied"},"role":"floor"}],"lead":"v","live":{"layer_lag_ms":[0]},"moment":[],"royalty_free_only":true,"rule":[],"schema":"wai.pack.policy/1","segmentation":{"closed":true,"cut_abs_permille":300,"cut_rel_permille":3000,"cut_window":8,"lookahead_frames":6,"max_ms":4000,"min_ms":1000,"scene_cut":"wai.pack.scenecut/1","target_ms":2000}} \ No newline at end of file diff --git a/wai/pack-conformance/packs/video-ladder-01/package/policy.toml b/wai/pack-conformance/packs/video-ladder-01/package/policy.toml new file mode 100644 index 000000000..07e11d953 --- /dev/null +++ b/wai/pack-conformance/packs/video-ladder-01/package/policy.toml @@ -0,0 +1,54 @@ +schema = "wai.pack.policy/1" +asset_id = "video-ladder-01" +royalty_free_only = true +lead = "v" + +[[component]] +id = "v" +media = "video" +source = "video-base-01.y4m" + +[component.timebase] +num = 25 +den = 1 + +[segmentation] +target_ms = 2000 +min_ms = 1000 +max_ms = 4000 + +[[ladder]] +id = "b0" +component = "v" +capability = "wai.video.int_motion" +role = "base" +params = { block = 16, search = 4, mv_precision = 1, q_candidates = [16, 12, 8], max_sse_px_milli = 30000 } + +[[ladder]] +id = "hi" +component = "v" +capability = "wai.video.av1" +role = "floor" +params = { source = "supplied" } + +[[ladder]] +id = "lo" +component = "v" +capability = "wai.video.av1" +role = "floor" +params = { source = "supplied" } + +[floor] +supplied_listing = "d795df9202fb5f32fe168aa585332a5694ad7d8d7e8b859fc7d57a791f08c990" + +[[class]] +id = "tv" +max_layer = 0 + +[[class]] +id = "mobile" +max_kbps = 100 + +[[class]] +id = "legacy" +floor_only = true diff --git a/wai/pack-conformance/packs/video-ladder-01/package/stages/legacy.json b/wai/pack-conformance/packs/video-ladder-01/package/stages/legacy.json new file mode 100644 index 000000000..f75b26874 --- /dev/null +++ b/wai/pack-conformance/packs/video-ladder-01/package/stages/legacy.json @@ -0,0 +1 @@ +{"class":"legacy","components":{"v":{"pieces":[{"dur":60,"floor_only":true,"p":0,"stages":[],"start":0},{"dur":25,"floor_only":true,"p":1,"stages":[],"start":60},{"dur":50,"floor_only":true,"p":2,"stages":[],"start":85},{"dur":25,"floor_only":true,"p":3,"stages":[],"start":135},{"dur":40,"floor_only":true,"p":4,"stages":[],"start":160}]}},"policy_digest":"6938df61d1274e43680652af682498bd5c7f1505c5f51b08c770143643c6388e"} diff --git a/wai/pack-conformance/packs/video-ladder-01/package/stages/mobile.json b/wai/pack-conformance/packs/video-ladder-01/package/stages/mobile.json new file mode 100644 index 000000000..a17df1d90 --- /dev/null +++ b/wai/pack-conformance/packs/video-ladder-01/package/stages/mobile.json @@ -0,0 +1 @@ +{"class":"mobile","components":{"v":{"media_playlist":"../hls/mobile/wai-v.m3u8","pieces":[{"dur":60,"floor_only":true,"p":0,"stages":[],"start":0},{"dur":25,"p":1,"stages":[{"bytes":9950,"h":"61c7c3b7ccab07ed01df5b0d7ca0240598b914dbf2cabe545aa001e8de12d365","layer":0}],"start":60},{"dur":50,"floor_only":true,"p":2,"stages":[],"start":85},{"dur":25,"p":3,"stages":[{"bytes":9950,"h":"61c7c3b7ccab07ed01df5b0d7ca0240598b914dbf2cabe545aa001e8de12d365","layer":0}],"start":135},{"dur":40,"floor_only":true,"p":4,"stages":[],"start":160}]}},"policy_digest":"6938df61d1274e43680652af682498bd5c7f1505c5f51b08c770143643c6388e"} diff --git a/wai/pack-conformance/packs/video-ladder-01/package/stages/tv.json b/wai/pack-conformance/packs/video-ladder-01/package/stages/tv.json new file mode 100644 index 000000000..f2b8286b1 --- /dev/null +++ b/wai/pack-conformance/packs/video-ladder-01/package/stages/tv.json @@ -0,0 +1 @@ +{"class":"tv","components":{"v":{"media_playlist":"../hls/tv/wai-v.m3u8","pieces":[{"dur":60,"p":0,"stages":[{"bytes":39826,"h":"24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d","layer":0}],"start":0},{"dur":25,"p":1,"stages":[{"bytes":9950,"h":"61c7c3b7ccab07ed01df5b0d7ca0240598b914dbf2cabe545aa001e8de12d365","layer":0}],"start":60},{"dur":50,"p":2,"stages":[{"bytes":35882,"h":"c2ce1907255a041c388afd06ccd007436368e8d20467fdec2a1eebbb84b03bf2","layer":0}],"start":85},{"dur":25,"p":3,"stages":[{"bytes":9950,"h":"61c7c3b7ccab07ed01df5b0d7ca0240598b914dbf2cabe545aa001e8de12d365","layer":0}],"start":135},{"dur":40,"p":4,"stages":[{"bytes":25514,"h":"618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481","layer":0}],"start":160}]}},"policy_digest":"6938df61d1274e43680652af682498bd5c7f1505c5f51b08c770143643c6388e"} diff --git a/wai/pack-conformance/packs/video-ladder-01/policy.toml b/wai/pack-conformance/packs/video-ladder-01/policy.toml new file mode 100644 index 000000000..07e11d953 --- /dev/null +++ b/wai/pack-conformance/packs/video-ladder-01/policy.toml @@ -0,0 +1,54 @@ +schema = "wai.pack.policy/1" +asset_id = "video-ladder-01" +royalty_free_only = true +lead = "v" + +[[component]] +id = "v" +media = "video" +source = "video-base-01.y4m" + +[component.timebase] +num = 25 +den = 1 + +[segmentation] +target_ms = 2000 +min_ms = 1000 +max_ms = 4000 + +[[ladder]] +id = "b0" +component = "v" +capability = "wai.video.int_motion" +role = "base" +params = { block = 16, search = 4, mv_precision = 1, q_candidates = [16, 12, 8], max_sse_px_milli = 30000 } + +[[ladder]] +id = "hi" +component = "v" +capability = "wai.video.av1" +role = "floor" +params = { source = "supplied" } + +[[ladder]] +id = "lo" +component = "v" +capability = "wai.video.av1" +role = "floor" +params = { source = "supplied" } + +[floor] +supplied_listing = "d795df9202fb5f32fe168aa585332a5694ad7d8d7e8b859fc7d57a791f08c990" + +[[class]] +id = "tv" +max_layer = 0 + +[[class]] +id = "mobile" +max_kbps = 100 + +[[class]] +id = "legacy" +floor_only = true diff --git a/wai/pack-conformance/packs/video-repack-01/floor/hi.obu b/wai/pack-conformance/packs/video-repack-01/floor/hi.obu new file mode 100644 index 0000000000000000000000000000000000000000..a75994f85ee7aae7ced1b3713dd2d8bf9514231f GIT binary patch literal 6575 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 LNB;T4GU@*TnaWI= literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-repack-01/key.hex b/wai/pack-conformance/packs/video-repack-01/key.hex new file mode 100644 index 000000000..a96d52610 --- /dev/null +++ b/wai/pack-conformance/packs/video-repack-01/key.hex @@ -0,0 +1 @@ +8b961c20169b07e8cb3f95ffb999a577064ed11dafa170e74aee28902fc72b53 diff --git a/wai/pack-conformance/packs/video-repack-01/package/LISTING b/wai/pack-conformance/packs/video-repack-01/package/LISTING new file mode 100644 index 000000000..392e46d95 --- /dev/null +++ b/wai/pack-conformance/packs/video-repack-01/package/LISTING @@ -0,0 +1,46 @@ +c5203585fea0962de941d258789157a0590e18b62a2e5d1facbd11e1cfd1ddb9 dash/classic.mpd +a3aa7658db9b85a9d9a1fed977825189f75c5adad0f5fdfcd70ebd604824c138 dash/mobile.mpd +3f520749a6d2f231cddfd17804ee3629439f3678515e424c44e36cff54d89de9 dash/tv.mpd +04c948608aaa7b5d78ad5355042a2ff65b0f75d9d4b1ad78f3ebffb886a74be6 floor/hi/04c948608aaa7b5d78ad5355042a2ff65b0f75d9d4b1ad78f3ebffb886a74be6.m4s +06d5cd79ba3860cccdc252fe915de0902f941a3c6a000295714f7cab193aa6cf floor/hi/06d5cd79ba3860cccdc252fe915de0902f941a3c6a000295714f7cab193aa6cf.m4s +2f93f0ad449f9cc881b7816c6ab33fd445037d6538b445bcc76431f9c9f91c5b floor/hi/2f93f0ad449f9cc881b7816c6ab33fd445037d6538b445bcc76431f9c9f91c5b.m4s +420ae4c941bba6e12a6c7fdb7d01dc69170ecb4240dffd2e86808ddf87baa12a floor/hi/420ae4c941bba6e12a6c7fdb7d01dc69170ecb4240dffd2e86808ddf87baa12a.m4s +576b7d2156c2b595bf48bf34f67996d7f89e75d105f0dc71c9841bb96e6cd0fc floor/hi/576b7d2156c2b595bf48bf34f67996d7f89e75d105f0dc71c9841bb96e6cd0fc.m4s +58c598174eed554cd0d1bc8abedca8c9d51d992c8e3b963bcb7574da4983ed9f floor/hi/init.mp4 +589ad79210bff258db68916876846a2b0d530ea2e44260af66ddc51ad14ce07f floor/lo/589ad79210bff258db68916876846a2b0d530ea2e44260af66ddc51ad14ce07f.m4s +6bba50408f894d0e9d5516a53992fdd2aa86db43ccdc684b69c51a688856a0db floor/lo/6bba50408f894d0e9d5516a53992fdd2aa86db43ccdc684b69c51a688856a0db.m4s +acd166807d05fe4f512407f717659d88613f6d0d360485effe3751504cefbb74 floor/lo/acd166807d05fe4f512407f717659d88613f6d0d360485effe3751504cefbb74.m4s +d0f68eb18af5b67736ddccd97ed45c4c0274b0460f6abc8f54940ac378165833 floor/lo/d0f68eb18af5b67736ddccd97ed45c4c0274b0460f6abc8f54940ac378165833.m4s +d550ebb204adf0b5a7f310c7d07189e7bed63e12e34e9ed4d9bf96a101d864a9 floor/lo/d550ebb204adf0b5a7f310c7d07189e7bed63e12e34e9ed4d9bf96a101d864a9.m4s +640cd81c83baefbe13e8ccc2bf577395c6602885cc73e201ca34dc267e7f0a48 floor/lo/init.mp4 +bfa98255d682517f58df4073bc71fdb3fcca120fc33d16e4aca873392476c586 hls/classic/floor-hi.m3u8 +ad81674ac359096ebed255a26a40e82858e53e9754702429e59d72898df33812 hls/classic/floor-lo.m3u8 +3fd88f9dcf835edf0fcca8dff8371d2b4e897ac097fc85901477c950c0da7996 hls/classic/master.m3u8 +3fd88f9dcf835edf0fcca8dff8371d2b4e897ac097fc85901477c950c0da7996 hls/legacy/master.m3u8 +09e75f55cb7ea829a4e630404d2ab540e8be0dbb1c4365dc30802359b658aed9 hls/mobile/master.m3u8 +c4044eca76959c9f87230484a2b207fb12c0bcaedb8d921eab806014fca53cb8 hls/mobile/wai-v.m3u8 +60a6378f46afc9308dc4ac4d138602b16568577616ea0bf4526b142d86899151 hls/mobile/wai.m3u8 +09e75f55cb7ea829a4e630404d2ab540e8be0dbb1c4365dc30802359b658aed9 hls/tv/master.m3u8 +ff4edf2929e380d205c1c74156621185feec53d593ffa968b8dfaf0d05448bcd hls/tv/wai-v.m3u8 +5d42147b308330913c3d9c8a868ca83ce4d3f3e460da8d84c84014eb24aaf9d7 hls/tv/wai.m3u8 +4f7eb4c2a9e8b3d7dc271612457f50945ce6b2543ce7ba81c53b231f2c0182ad index-v.wsix +8fc573e6d71f2ed7d22bf048eea5cb3dba0a62cd441c24d9740fc1838b3812d1 moq/catalog.json +07e98fb9ef9ff3fa6bf04f9078da2a3d2423e586feea1061256131a1d1fbb943 objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai +2f5bd830d841eb122c63ae57a15442075478fd522ce55b6f9bcbe41acd51d8ae objects/482fbbb9b39bdb9cbf00515f94269ea591df681ced90b05d97e0df106b49b08e.wai +0057633252a2c2ed5f71fe14ca78075c8e89fc6675a08335ac90f0e56032b825 objects/4ab8f747d181632f342a4887b0a8bb86c174409cb625157784e18c5e5559a381.wai +cfb71256ef44758ea279846a8938823994d321abce83ef73afd2ed269a8e0259 objects/618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481.wai +f3eedf9eb2870c0160801397412e7a4c3aca4a6e16f1a69a276e1356d38c9220 objects/61c7c3b7ccab07ed01df5b0d7ca0240598b914dbf2cabe545aa001e8de12d365.wai +1a6f30fdc000f258c948470386d84beef2ba5a84e922c355093837ae21fd573c objects/6ce13c9ef6872caeb7fbe71661ca88bcc463ceac47f109c8c155e34bb1a6f37d.wai +b773dac63c9d2d9980d0d249ea956e03065c1ae40d17c512df29b690c0c820ef objects/b7bf0717e968d7b6be473785c9f66cbb814cde679bceb1ae37f0765308ddee72.wai +b2a40a9a8cec3dcaf6c92a07d6765203c412c57ec879b7e33a52eabb2e74609d objects/c2ce1907255a041c388afd06ccd007436368e8d20467fdec2a1eebbb84b03bf2.wai +cc8a6fc59be29bd33d96fb30ea9e5a30a5aa367a82da9c5784cbadce63396f62 objects/cf842ef3058d3c54d56c0ea3e075efdc77163602b4a1dabcff080e5ea28b9946.wai +01b596b672de3352adb3e01b34fcddfeff975f4ee1d0b88dde160ac10c9bf929 objects/d382ba093b0595c44a43dc3aad22fc0bed42baeb3488f00dfe3567056a7009c5.wai +9d9ae296558ce7f7d644ad0ca3af65eb4fc98d03b0bd6d7a8fc821fc952e86c1 objects/f525b4450c29153dde0b43e4d143dfb76fcc3884c607b744c8a53fa6a1728580.wai +3d573ee482f8187b0e3bc839aeea0f51a67144588d6d207e8466fea91a0c5b34 objects/f7f7f4d6af777bfcce09cdda5ecb754ce6bd8dcd2e03ecfc41359cad989b15f7.wai +d7031e1c023b1329f38d3d3fe35a7f82801a0b0db0e777ae0738d6c9fc2cff18 package.receipt.json +517630d9bee1f5559baff3bb3e642f6aa7b5276226f6e3bdba4f3f9724794859 plan-v.txt +e82149a73c47b4616d2dfbb43d47b0f2e38f6044868ef27f171b5e310f10bd84 policy.json +f9944f8f431f512496fdba587d90cc9bad4801a98e28d95522123bc24cadb084 policy.toml +7ef94e8fe74a6e68543a965544cf440420020347b47e9c6f48d5e3b121bf627b stages/legacy.json +57d38e0987db1ca04fbb0dffb724b5237aa15e21247bc459c25f771070794fab stages/mobile.json +89ffbd0ef534b5c102a335a2de3ecdc9129180e975ba2af498f1c1c935bc862e stages/tv.json diff --git a/wai/pack-conformance/packs/video-repack-01/package/dash/classic.mpd b/wai/pack-conformance/packs/video-repack-01/package/dash/classic.mpd new file mode 100644 index 000000000..0bc509f7c --- /dev/null +++ b/wai/pack-conformance/packs/video-repack-01/package/dash/classic.mpd @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wai/pack-conformance/packs/video-repack-01/package/dash/mobile.mpd b/wai/pack-conformance/packs/video-repack-01/package/dash/mobile.mpd new file mode 100644 index 000000000..d3340daa2 --- /dev/null +++ b/wai/pack-conformance/packs/video-repack-01/package/dash/mobile.mpd @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/wai/pack-conformance/packs/video-repack-01/package/dash/tv.mpd b/wai/pack-conformance/packs/video-repack-01/package/dash/tv.mpd new file mode 100644 index 000000000..f0817bb2c --- /dev/null +++ b/wai/pack-conformance/packs/video-repack-01/package/dash/tv.mpd @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wai/pack-conformance/packs/video-repack-01/package/floor/hi/04c948608aaa7b5d78ad5355042a2ff65b0f75d9d4b1ad78f3ebffb886a74be6.m4s b/wai/pack-conformance/packs/video-repack-01/package/floor/hi/04c948608aaa7b5d78ad5355042a2ff65b0f75d9d4b1ad78f3ebffb886a74be6.m4s new file mode 100644 index 0000000000000000000000000000000000000000..7e5a29203e5ad8907861e9d0bba3c074652aaabe GIT binary patch literal 981 zcmZQzU~I|F&rf4uU=YYn%SZvzAi%`Hz?f4~ln53t0f_@efPfK*MM~0AN`ZD>)ul4GzYNU-fRG!?;WVklSNXUqZ zp$V!GsKJ4u>kCkfnUTc-q8TFA02E_kV(UN>Yi}?TG-74pxS#;G1gx$VD8$CWE#ZO? zY61$e3-BgnG=rQ1Rs|B`VDMkji%?Z#q+-O$(EMQ|Se5GmpgS%J)G54YWIT4KVrj#d z%2VghNAk!6HF7bsR9r)7%mE5<10D7YVLV8P2k0()gsKdn5HHYO?g&*NAwE=hfrR)` z-IW3Kx4;9KyTGoW^T9~VNRW~F(*~gV0uBr!z*Ng{Wj&M1)4RscZ2gZ{3+?Z?FM9X> z1Gz+-I98y3Attt}D{!?e3=u#vVHS>4Kaj)%fMOyX+)_4ZVxj`PNhxSzVhsMPdeFqg SQQX7A5MU&1B!On{J_i6~LX$%P literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-repack-01/package/floor/hi/06d5cd79ba3860cccdc252fe915de0902f941a3c6a000295714f7cab193aa6cf.m4s b/wai/pack-conformance/packs/video-repack-01/package/floor/hi/06d5cd79ba3860cccdc252fe915de0902f941a3c6a000295714f7cab193aa6cf.m4s new file mode 100644 index 0000000000000000000000000000000000000000..3e21af5bfbf09877f851ca6abe777d4380b6af59 GIT binary patch literal 981 zcmZQzU~I|F&rf4uU=YYn%SZvzAi%=Fz?f4~ln53t0f{q##TkL5NJ&~s35Wp&?Lf5- zB}Juq3=HfbVM!pr2S|h1#t>~_wk9J)6NnTcf-Q`sh8VUQiRy_l6WN_QNaiDpQ^FR7 zn8_5Fo03?<#RUu*ru83Z#~W}MsfsWtJ1{Ub0ELVsY`6?w#U^-VKiU5G+e>L?^@sQ7 z%Ffa;+NNNnZp8QisEj!S7~ZZ8j1COvpWLszzD)k{YrQ(F8foJVl_z&I8Lka75;9_9 zXo4yPYH(oa`T`VVW@K@IXoiS20L56C*gBBJ+8c}njaXSYE+~L40jp~T3bAo;OSm9} znt(#=0=x+s%^;_MRe^*!82nfCB2?8FsTgrGG=JC#R^@sC=#EPQbqenp8IRqmSlaNV z^3?hBkv#H1ja-Z@71t0NbAUqJK!^Q87!MNS0lLc`p(+C?#0zwnJ35N03S2DSG@1F;!I7$KTKq!JPvSzH-OTo{Qhjl?EKTpovdSsdaj zIK<_M5Jy%ci9hQl0O;eg9t^&G831-aG8%wy#kV%$aZ0I58H;^ zl*AG)E?_ERTK{o&ya9*NR2Bh-*+4Eg1JhkSsZ(8N8l=i*ER)^%Ke~)_P5uS1Zn4&` zIcJNyKE0EFs%8Jm*Fd&OJ9XEL`faTNexYicUhLQ(Yn!p43}x zZr*LnxJ=OW=tqw|A66x`-zYCW60gMYl;?7Ko7Bv=aVPVOO?9doL)3Sjd%y2RAs>g7 zzhb5Na+7s4b0*p~)O==JU|Rhk*GoidLz`%;gv$3ES!wxgOQ!hSZ~mje`r*NfRmVSN zsPbvJ{16DLIlX7%^{>Y*t_2u>US+&3`jBhx+`TR9lCI?LI-DStcsN=2!s7)Gr4t`V zAKx%H%EGNMR%T*1m*-v6i{+1QALJ5{n6TaIU;0Cx2MfMEUYQ!&<5K$jg_QZX$BP~` z@4fohS=-_A<3PWRX{iUka&;-Q{+(MMJEh&VKCm|ShSrB&;%lxbbWOHqE@MpGDyeH` z>Hp?$*}^EZuKTa5RWA9@YO8zyGfZ33?b6?MhTh9;e%7SH8izH-NOsp}IN3NX9_% zAc|XWyE*GK9^_`c`|@2EP=gW^`_lx3J#9b@Dl9x-SAd1OL9ujCa{FZ&Lx~-mP3J= z!h?n9FOm@lwHO>sTc3sk6?<_A&P6gw0Vw2yYM+9Un1LUveVg9$CoXXS#zp|DRqJo{ z3YwXNf-MNuLIt3kL*O=bgR=6n*yK76>k}z%$EO3;hoRdkZV-WL=N8HRdy5l5p&W&3 zse+N5K@8kFa4O%_q`g8>b9UPDr*$8WMF6$L!R-d81W=G9CZL4s>4P7`X1&b^xjl(t Ln*9Vs_%#6l=bT(r literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-repack-01/package/floor/hi/420ae4c941bba6e12a6c7fdb7d01dc69170ecb4240dffd2e86808ddf87baa12a.m4s b/wai/pack-conformance/packs/video-repack-01/package/floor/hi/420ae4c941bba6e12a6c7fdb7d01dc69170ecb4240dffd2e86808ddf87baa12a.m4s new file mode 100644 index 0000000000000000000000000000000000000000..a246e72beae3b37d64c24c831a41f58e23f0cb74 GIT binary patch literal 2605 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 literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-repack-01/package/floor/hi/init.mp4 b/wai/pack-conformance/packs/video-repack-01/package/floor/hi/init.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..0b3ade2588318c8374e2813c379f92328998bc05 GIT binary patch literal 628 zcmaJ(|3il#OZDrXHF*9Xt4iVyflo2Lr+O&i_bGHW)? zR{&~y95}iJXIX&p%jQpQGF?B~?~xj%c7FFx1BxQB@bmZMan=XA(#B}71zfv-;*cAH bzj}3s&}4iCt=&kQ??7UsT;x3O>uhg-8t^^c literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-repack-01/package/floor/lo/589ad79210bff258db68916876846a2b0d530ea2e44260af66ddc51ad14ce07f.m4s b/wai/pack-conformance/packs/video-repack-01/package/floor/lo/589ad79210bff258db68916876846a2b0d530ea2e44260af66ddc51ad14ce07f.m4s new file mode 100644 index 0000000000000000000000000000000000000000..78b5c886674e2dbd93fd45b08573c5214c082bb5 GIT binary patch literal 1127 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 J3Z`r-_#X%x5%B;3 literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-repack-01/package/floor/lo/d0f68eb18af5b67736ddccd97ed45c4c0274b0460f6abc8f54940ac378165833.m4s b/wai/pack-conformance/packs/video-repack-01/package/floor/lo/d0f68eb18af5b67736ddccd97ed45c4c0274b0460f6abc8f54940ac378165833.m4s new file mode 100644 index 0000000000000000000000000000000000000000..6adf8fdfddb9f43c4eda7bcb3dc4a4a5518f1282 GIT binary patch literal 2526 zcmZ`(Yfuwc7+sbW!qWsWgd{+)fLH~07V4lzO>NbV4=Pp}WDp556kEb0#zzND*IGpy zsI(|*QL$<(T18Z#Qguv_Y6?D}7DXb8DB9YNf)4a)?YEnd{nDA{2l@E!`OZ1_+#C8YTu-NHMj$gr`edrK~Fxzy@0e)hSU zgG;lE=jKe>5-UxKo|4#7TKTtY`oxcVO0_3PXInJFU+)I&EFRa;lyc~o{3M2sq+Cr5 zLAbSnS0h0%M7^bewodQA-ewL?mQ>H45kE?P@skf}B_(hX4C5G*A>0mrplb6gj{o7O zOV?uB{!r3>lp868KFb7*3{g}|2T?+Sj|lZF@`3qBk3>CUXc^@x6z^5rgjvGi_KfI` z8!^YKO|+Eq7D=ehJXJ?Z%YE{}zDOYSRmx25{FJ<+aKPiqhHy1Kk`fVBi86kuxwvmm z8*ur#xZhpIPe`}59|#|;?4%`B04W?eVjtL`Bzle?DoH&KL=u6Ic#tQu{N~v{k5*7p zFl?|BZP-iP$+(r@o%?ZK&h?uWbRZ=I%Uk#%>y-n~4vW=vFr`3_A(mi4TIE)^HPj?Z zEnEUIggCpt#c0Ik9+gj{n_)D}%v*=iu=A76sq=D^u9+l%F?0YmigfQw=Os@^Bm_W0 z;R5f$YP(Gsl3PE|B=^s#>xUgg3dP&{ZAM4rk(Ad9o#S72*4!~2@G;K*EdIWS z!35>(FZiOOv-a!9E9FNGO4^^I9TvGu^nK7ST293wXKaM2dFNMo`PG_z8PK1AT!HQG zWtVgPyF7M7wDHc)6xWu$?(4oWVNn$5O!|+vx_mfzmBSh*emNv#V=C-pso(-|- zzgEV^Wg5Qj#>IjjpqQ?dsOIw-9jlNug+TiaV$Y>EzTMXv{)F{DlXUME*|UQ;;3XwC zHSbuT3@dL6yr0{6j0|jfWT}=EmNc1wYPL|k8&N$t5m#@3Sm!!~jSR$aOY!!L@^5xW z#qCiW;B6*2>s#)@jh&CgK_Vz#u=@QqY5*^AXmc^N48g5h=uqYS1Wjn~y1hKVh5>kz zL)n&E0z9o`hn@|dC63$7Kb|x>n6>i%#B=$ z12>xV;gmW02y;g4xe)RC&7hD$R7@-5lRo;^EJ!nxbh~P6a(L;`)5M9V>L}385_sRS zudq+z)5a4KBNnAuBM(GOg$I}|6ju$;L8w-Zbqpz~`q5a^UoZ|X*t}BAZ=OZ;(dU?rCb!_9kb$|A5g*lx= yi~F5!xUnfs`I14B4!hGkq_~7SzAZYO@~EmG7+3LP?C!#fdY7*730?O%TKz9K{6yUV literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-repack-01/package/floor/lo/d550ebb204adf0b5a7f310c7d07189e7bed63e12e34e9ed4d9bf96a101d864a9.m4s b/wai/pack-conformance/packs/video-repack-01/package/floor/lo/d550ebb204adf0b5a7f310c7d07189e7bed63e12e34e9ed4d9bf96a101d864a9.m4s new file mode 100644 index 0000000000000000000000000000000000000000..5c06ef47a465a0b1f6802d80907cf89f7a8c472a GIT binary patch literal 1695 zcmZQzV6w=~&rf4uU=YYn%SZvzAi&DNz@$)8ln53t0f{q##TkL5NJ&~s35Wp&3m6y} zzmyb}<}om^gM>AJdL4i?i2WR*4a}BcglGbhl1OY3B(@?FTO5gvtXBp}To?yi3P~K7 zIml{|%||v9Ssa;-tOgfb8p#dFYKSohIed`y;$kD4DTZV(G8;J@kj+6BM-G2vy~yT6 z*(~X~DTyUqT)^05Qh$_Nb3no92BQGOY#^7rfoWT(uGSs>wEWQUN1Ue1Dhy@k^6mfC zH7#0jFEeB8{qM2MSyO6 z49yA*4^;l`x@=%1ZotCGf-HVtJ87R~On{M)0UHxX155)$14E~Rk-Py13$Fk~tQ%xb z`4ZjY>{?lg*rScdJrB$?5;frB5M1DZu;reK@3MZNV<2b-t3W#JpyihgOP4@QCp0u1v5rJ#C%_O}6rgc#W$CL@HJj3f+1m^ePJK?q%5 z#U*NeWnlu)DPkc|POPYOI}^^AQfc20jl*NyNuAS7dJ3Lwf^p(c@2PGs=|Up|&O006TcZ;t=~ literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-repack-01/package/floor/lo/init.mp4 b/wai/pack-conformance/packs/video-repack-01/package/floor/lo/init.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..d419e7893b423b9190462bd07734f8d65d2f1cfc GIT binary patch literal 628 zcmaJ72wlj--P?G~v~>ZbEg8c>oz#gjkv{w=`HjkN|b0NVI}qD>5;-$JpC X@ML@i0XNF!FA&0NA34waI@sGks3|>p literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-repack-01/package/hls/classic/floor-hi.m3u8 b/wai/pack-conformance/packs/video-repack-01/package/hls/classic/floor-hi.m3u8 new file mode 100644 index 000000000..d6ac7336d --- /dev/null +++ b/wai/pack-conformance/packs/video-repack-01/package/hls/classic/floor-hi.m3u8 @@ -0,0 +1,18 @@ +#EXTM3U +#EXT-X-VERSION:7 +#EXT-X-TARGETDURATION:3 +#EXT-X-MEDIA-SEQUENCE:0 +#EXT-X-PLAYLIST-TYPE:VOD +#EXT-X-INDEPENDENT-SEGMENTS +#EXT-X-MAP:URI="../../floor/hi/init.mp4" +#EXTINF:2.400, +../../floor/hi/420ae4c941bba6e12a6c7fdb7d01dc69170ecb4240dffd2e86808ddf87baa12a.m4s +#EXTINF:1.000, +../../floor/hi/04c948608aaa7b5d78ad5355042a2ff65b0f75d9d4b1ad78f3ebffb886a74be6.m4s +#EXTINF:2.000, +../../floor/hi/2f93f0ad449f9cc881b7816c6ab33fd445037d6538b445bcc76431f9c9f91c5b.m4s +#EXTINF:1.000, +../../floor/hi/06d5cd79ba3860cccdc252fe915de0902f941a3c6a000295714f7cab193aa6cf.m4s +#EXTINF:1.600, +../../floor/hi/576b7d2156c2b595bf48bf34f67996d7f89e75d105f0dc71c9841bb96e6cd0fc.m4s +#EXT-X-ENDLIST diff --git a/wai/pack-conformance/packs/video-repack-01/package/hls/classic/floor-lo.m3u8 b/wai/pack-conformance/packs/video-repack-01/package/hls/classic/floor-lo.m3u8 new file mode 100644 index 000000000..628e70c2b --- /dev/null +++ b/wai/pack-conformance/packs/video-repack-01/package/hls/classic/floor-lo.m3u8 @@ -0,0 +1,18 @@ +#EXTM3U +#EXT-X-VERSION:7 +#EXT-X-TARGETDURATION:3 +#EXT-X-MEDIA-SEQUENCE:0 +#EXT-X-PLAYLIST-TYPE:VOD +#EXT-X-INDEPENDENT-SEGMENTS +#EXT-X-MAP:URI="../../floor/lo/init.mp4" +#EXTINF:2.400, +../../floor/lo/d0f68eb18af5b67736ddccd97ed45c4c0274b0460f6abc8f54940ac378165833.m4s +#EXTINF:1.000, +../../floor/lo/6bba50408f894d0e9d5516a53992fdd2aa86db43ccdc684b69c51a688856a0db.m4s +#EXTINF:2.000, +../../floor/lo/acd166807d05fe4f512407f717659d88613f6d0d360485effe3751504cefbb74.m4s +#EXTINF:1.000, +../../floor/lo/589ad79210bff258db68916876846a2b0d530ea2e44260af66ddc51ad14ce07f.m4s +#EXTINF:1.600, +../../floor/lo/d550ebb204adf0b5a7f310c7d07189e7bed63e12e34e9ed4d9bf96a101d864a9.m4s +#EXT-X-ENDLIST diff --git a/wai/pack-conformance/packs/video-repack-01/package/hls/classic/master.m3u8 b/wai/pack-conformance/packs/video-repack-01/package/hls/classic/master.m3u8 new file mode 100644 index 000000000..5fb4ccb7c --- /dev/null +++ b/wai/pack-conformance/packs/video-repack-01/package/hls/classic/master.m3u8 @@ -0,0 +1,7 @@ +#EXTM3U +#EXT-X-VERSION:7 +#EXT-X-INDEPENDENT-SEGMENTS +#EXT-X-STREAM-INF:BANDWIDTH=10440,AVERAGE-BANDWIDTH=9055,CODECS="av01.0.00M.08",RESOLUTION=64x36 +../classic/floor-hi.m3u8 +#EXT-X-STREAM-INF:BANDWIDTH=9016,AVERAGE-BANDWIDTH=8723,CODECS="av01.0.00M.08",RESOLUTION=32x18 +../classic/floor-lo.m3u8 diff --git a/wai/pack-conformance/packs/video-repack-01/package/hls/legacy/master.m3u8 b/wai/pack-conformance/packs/video-repack-01/package/hls/legacy/master.m3u8 new file mode 100644 index 000000000..5fb4ccb7c --- /dev/null +++ b/wai/pack-conformance/packs/video-repack-01/package/hls/legacy/master.m3u8 @@ -0,0 +1,7 @@ +#EXTM3U +#EXT-X-VERSION:7 +#EXT-X-INDEPENDENT-SEGMENTS +#EXT-X-STREAM-INF:BANDWIDTH=10440,AVERAGE-BANDWIDTH=9055,CODECS="av01.0.00M.08",RESOLUTION=64x36 +../classic/floor-hi.m3u8 +#EXT-X-STREAM-INF:BANDWIDTH=9016,AVERAGE-BANDWIDTH=8723,CODECS="av01.0.00M.08",RESOLUTION=32x18 +../classic/floor-lo.m3u8 diff --git a/wai/pack-conformance/packs/video-repack-01/package/hls/mobile/master.m3u8 b/wai/pack-conformance/packs/video-repack-01/package/hls/mobile/master.m3u8 new file mode 100644 index 000000000..5f049c978 --- /dev/null +++ b/wai/pack-conformance/packs/video-repack-01/package/hls/mobile/master.m3u8 @@ -0,0 +1,8 @@ +#EXTM3U +#EXT-X-VERSION:7 +#EXT-X-INDEPENDENT-SEGMENTS +#EXT-X-SESSION-DATA:DATA-ID="science.transaction.wai.multivariant",VALUE="wai.m3u8" +#EXT-X-STREAM-INF:BANDWIDTH=10440,AVERAGE-BANDWIDTH=9055,CODECS="av01.0.00M.08",RESOLUTION=64x36 +../classic/floor-hi.m3u8 +#EXT-X-STREAM-INF:BANDWIDTH=9016,AVERAGE-BANDWIDTH=8723,CODECS="av01.0.00M.08",RESOLUTION=32x18 +../classic/floor-lo.m3u8 diff --git a/wai/pack-conformance/packs/video-repack-01/package/hls/mobile/wai-v.m3u8 b/wai/pack-conformance/packs/video-repack-01/package/hls/mobile/wai-v.m3u8 new file mode 100644 index 000000000..949e945a2 --- /dev/null +++ b/wai/pack-conformance/packs/video-repack-01/package/hls/mobile/wai-v.m3u8 @@ -0,0 +1,20 @@ +#EXTM3U +#EXT-X-VERSION:7 +#EXT-X-TARGETDURATION:3 +#EXT-X-MEDIA-SEQUENCE:0 +#EXT-X-PLAYLIST-TYPE:VOD +#EXT-X-INDEPENDENT-SEGMENTS +#EXT-X-GAP +#EXTINF:2.400, +../../objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai#n=39826 +#EXTINF:1.000, +../../objects/61c7c3b7ccab07ed01df5b0d7ca0240598b914dbf2cabe545aa001e8de12d365.wai#n=9950 +#EXT-X-GAP +#EXTINF:2.000, +../../objects/c2ce1907255a041c388afd06ccd007436368e8d20467fdec2a1eebbb84b03bf2.wai#n=35882 +#EXTINF:1.000, +../../objects/61c7c3b7ccab07ed01df5b0d7ca0240598b914dbf2cabe545aa001e8de12d365.wai#n=9950 +#EXT-X-GAP +#EXTINF:1.600, +../../objects/618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481.wai#n=25514 +#EXT-X-ENDLIST diff --git a/wai/pack-conformance/packs/video-repack-01/package/hls/mobile/wai.m3u8 b/wai/pack-conformance/packs/video-repack-01/package/hls/mobile/wai.m3u8 new file mode 100644 index 000000000..66fa8dc50 --- /dev/null +++ b/wai/pack-conformance/packs/video-repack-01/package/hls/mobile/wai.m3u8 @@ -0,0 +1,7 @@ +#EXTM3U +#EXT-X-VERSION:7 +#EXT-X-INDEPENDENT-SEGMENTS +#EXT-X-SESSION-DATA:DATA-ID="science.transaction.wai.class",VALUE="mobile" +#EXT-X-SESSION-DATA:DATA-ID="science.transaction.wai.stages",URI="../../stages/mobile.json" +#EXT-X-STREAM-INF:BANDWIDTH=79600,AVERAGE-BANDWIDTH=79600,CODECS="wai1.video.int_motion",X-WAI-FLOOR="wai1.video.int_motion",RESOLUTION=64x36 +wai-v.m3u8 diff --git a/wai/pack-conformance/packs/video-repack-01/package/hls/tv/master.m3u8 b/wai/pack-conformance/packs/video-repack-01/package/hls/tv/master.m3u8 new file mode 100644 index 000000000..5f049c978 --- /dev/null +++ b/wai/pack-conformance/packs/video-repack-01/package/hls/tv/master.m3u8 @@ -0,0 +1,8 @@ +#EXTM3U +#EXT-X-VERSION:7 +#EXT-X-INDEPENDENT-SEGMENTS +#EXT-X-SESSION-DATA:DATA-ID="science.transaction.wai.multivariant",VALUE="wai.m3u8" +#EXT-X-STREAM-INF:BANDWIDTH=10440,AVERAGE-BANDWIDTH=9055,CODECS="av01.0.00M.08",RESOLUTION=64x36 +../classic/floor-hi.m3u8 +#EXT-X-STREAM-INF:BANDWIDTH=9016,AVERAGE-BANDWIDTH=8723,CODECS="av01.0.00M.08",RESOLUTION=32x18 +../classic/floor-lo.m3u8 diff --git a/wai/pack-conformance/packs/video-repack-01/package/hls/tv/wai-v.m3u8 b/wai/pack-conformance/packs/video-repack-01/package/hls/tv/wai-v.m3u8 new file mode 100644 index 000000000..8d1c2efe8 --- /dev/null +++ b/wai/pack-conformance/packs/video-repack-01/package/hls/tv/wai-v.m3u8 @@ -0,0 +1,17 @@ +#EXTM3U +#EXT-X-VERSION:7 +#EXT-X-TARGETDURATION:3 +#EXT-X-MEDIA-SEQUENCE:0 +#EXT-X-PLAYLIST-TYPE:VOD +#EXT-X-INDEPENDENT-SEGMENTS +#EXTINF:2.400, +../../objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai#n=39826 +#EXTINF:1.000, +../../objects/61c7c3b7ccab07ed01df5b0d7ca0240598b914dbf2cabe545aa001e8de12d365.wai#n=9950 +#EXTINF:2.000, +../../objects/c2ce1907255a041c388afd06ccd007436368e8d20467fdec2a1eebbb84b03bf2.wai#n=35882 +#EXTINF:1.000, +../../objects/61c7c3b7ccab07ed01df5b0d7ca0240598b914dbf2cabe545aa001e8de12d365.wai#n=9950 +#EXTINF:1.600, +../../objects/618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481.wai#n=25514 +#EXT-X-ENDLIST diff --git a/wai/pack-conformance/packs/video-repack-01/package/hls/tv/wai.m3u8 b/wai/pack-conformance/packs/video-repack-01/package/hls/tv/wai.m3u8 new file mode 100644 index 000000000..47679d0e9 --- /dev/null +++ b/wai/pack-conformance/packs/video-repack-01/package/hls/tv/wai.m3u8 @@ -0,0 +1,7 @@ +#EXTM3U +#EXT-X-VERSION:7 +#EXT-X-INDEPENDENT-SEGMENTS +#EXT-X-SESSION-DATA:DATA-ID="science.transaction.wai.class",VALUE="tv" +#EXT-X-SESSION-DATA:DATA-ID="science.transaction.wai.stages",URI="../../stages/tv.json" +#EXT-X-STREAM-INF:BANDWIDTH=143528,AVERAGE-BANDWIDTH=121122,CODECS="wai1.video.int_motion",X-WAI-FLOOR="wai1.video.int_motion",RESOLUTION=64x36 +wai-v.m3u8 diff --git a/wai/pack-conformance/packs/video-repack-01/package/index-v.wsix b/wai/pack-conformance/packs/video-repack-01/package/index-v.wsix new file mode 100644 index 0000000000000000000000000000000000000000..89d0ff7ae8b2fd2fa902b027934800cc5069c4a1 GIT binary patch literal 2368 zcmWF!_KaX;U|^60Vi3&=#QZ?a2E@!jta!VkdjZ4T7x%kDcnw-)3+g0(@6Fh{=isUA znf)IR1aJVAkOU&q|7bnpPERouFyC@lL@ZbIf#6P)#``LNH!T#~mpbbOF2ih~63k#% zAymP{LGA~+mzjYH0`K+REDvsSbQ( zJMWnj=hM{;=yK{kHHar+kq+_;a`^vup5|P7aBoog1firy!lqMG*2%J+hT+g(m9wO_Wd zsI}n|G@Oy`rzHG8!x9eE0XYwC=6!3|S-1W7bFsuz9ea)>pIhVpk@LjC(8t~zmwm2H z0cB_)pqBlupiG7Y4xN)^SB+wkvFQ5CcIE=Rb8^OuODySs-)PCb-rcgn`jb`% zTVG!N=N#wRTXCmLeV*;@J*&t3=8vQ4oV7D%i+8YI?y`?9!u?KBS`kH0#BWeW|b^>DM?bg_uKYWvf0^VW9} zU;|+3|3wmNpl#pJF8(s(`nG-U=B+2cWq$Vp94Os*7RC{N7PE6Yqt Z&DYD!D~Zp|FUic$<3$opEHeaI0|1aAH>v;t literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-repack-01/package/moq/catalog.json b/wai/pack-conformance/packs/video-repack-01/package/moq/catalog.json new file mode 100644 index 000000000..406272968 --- /dev/null +++ b/wai/pack-conformance/packs/video-repack-01/package/moq/catalog.json @@ -0,0 +1 @@ +{"tracks":[{"altGroup":1,"isLive":false,"name":"v/l0","namespace":"video-repack-01","packaging":"wai","renderGroup":1,"role":"video","wai_capabilities":["wai.video.int_motion"],"wai_determinism":"decode-equivalence","wai_receipt_alias":4731536367675475,"wai_receipts":true,"wai_receipts_track":"v/l0/receipts","wai_staged":{"layer":0,"lead_ms":null,"set":"v"}},{"altGroup":1,"codec":"av01.0.00M.08","height":36,"name":"hi/floor","namespace":"video-repack-01","packaging":"cmaf","renderGroup":1,"width":64},{"altGroup":1,"codec":"av01.0.00M.08","height":18,"name":"lo/floor","namespace":"video-repack-01","packaging":"cmaf","renderGroup":1,"width":32},{"isLive":false,"name":"v/l0/receipts","namespace":"video-repack-01","packaging":"wai-receipts"}],"version":1} diff --git a/wai/pack-conformance/packs/video-repack-01/package/objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai b/wai/pack-conformance/packs/video-repack-01/package/objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai new file mode 100644 index 0000000000000000000000000000000000000000..b15b5310886cf0f3076b32c2b77264e58fd7b1d0 GIT binary patch literal 39826 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

YmH;T^6RA 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 literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-repack-01/package/objects/4ab8f747d181632f342a4887b0a8bb86c174409cb625157784e18c5e5559a381.wai b/wai/pack-conformance/packs/video-repack-01/package/objects/4ab8f747d181632f342a4887b0a8bb86c174409cb625157784e18c5e5559a381.wai new file mode 100644 index 0000000000000000000000000000000000000000..cf1710435b2925d643182d2b65e219d87159a714 GIT binary patch literal 2503 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 LNgU4&(V+hW7Cne_ literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-repack-01/package/objects/6ce13c9ef6872caeb7fbe71661ca88bcc463ceac47f109c8c155e34bb1a6f37d.wai b/wai/pack-conformance/packs/video-repack-01/package/objects/6ce13c9ef6872caeb7fbe71661ca88bcc463ceac47f109c8c155e34bb1a6f37d.wai new file mode 100644 index 0000000000000000000000000000000000000000..93381e7ad632b0c62b0c50b41f138aa51d44d249 GIT binary patch literal 1380 zcmZ{heQXnD9LJw_wJRGPUH9S`AmxS@an8Hv?s|7i39UL6`~#OvXJVv0ch7V5WNl~H zjp1l4!=jNfN9G@kQ4)g~#YAU;5aUZ~q6Ud38w_9Kkj9rpjll^CsL|-tyLk;J{_*5q zzMtRs_xt{y-smRotOI}%W+yV3PKN7XnRX^Yuz~2;kby~xejCXQNoMGeH0kd%G?XD_ zD1}L1EKMFAG}0tt>LZMX`jKk%8JS&_rj{M1MF$$WbBY8xLC`f?ggJx>7D6mi6-5>}3Fo<<2m zZK2rC#F#OqoNncWPK&krLW9Xo`IVgA73Ct`XrWR*bZ1fzC|BLdDaV{h+S5}PgE?>pG@^R4O4E9xAl zzdSPdlFNIddH&sR*YvNmD%Zj)hbv+?n*bNqpM3Ge=f!h{)mJ}&-D5XTHT310E!GcR zPWMw5O9zaACj+)}oy#*5Fh@3(eGyx6dum(mtSI9}TdDSWx5f9CW12PNxhAVmJ@kMr zuNk`FUZ3ZCXoH{jq2ood93=zSCYEF6>e3gOfJ|Q#V?sYv58E zabv~w6Xw{$(z?+?;pOMUlXqQgE7_ozCceAkcYb5nid9ob@}tMAKV109eYnMrS$FLM z_S?d;Yx6&Cugq8aH-Dsj0TVtuM7^Wx(sX4yZ&2I)?9`mQp)hylaqhmgR)_%fJKc}X zRj}F1SN3I(=YL%J!yBzvM|(~MEN&%iaCuJuw#d<)%x~I%>9z0v+8oYL=T=$Fa@gpp zZ4ECnjtH0;zvuN|A0Vfu?U|Zp5~Nf=IUytx`|5>ss4_Emdr7_a@Vwz#skNo-;GQ z@B2OO_szPcS;S}nhE?J&M!?NDp#^vCaFzR>{$686oh;%q4Ktn?3 zyGSSFD1vApl{oKUN+6;&fK>c>+^nZkaTji;3{_Qkf-o!v!?5}2WS|p|4w^I;D#Nfy zEF=Uy%1%r)Sb$vjV3q=Fz;8`^*{8WQ~{pitci=S%v_xafLlCfC>N&KboCGL4iQh!AR{e*1e!vc;v+Ky_=&RhIc*JaPlSfE8i{7JF18E9e-JI z)?B>4>#Gl%-zb>!+`HULPqwx9ldXO$qmN`g zy=`luhik)6VP9yAfBaGNnP#Z%+uo*C zS1&pw5%bJ6g^!C|3qZP*#>dtF&*Pz2x~Z0RBfZ}reS3DqnveEuztAVqERiC*yhEV$b7}~;;NA48zsSPbxgfj=k|tFFBAp;1ah#$r>7B|v7fHUX;Z}JrJeoo Me$}~43oG3J19W+`r2qf` literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-repack-01/package/objects/c2ce1907255a041c388afd06ccd007436368e8d20467fdec2a1eebbb84b03bf2.wai b/wai/pack-conformance/packs/video-repack-01/package/objects/c2ce1907255a041c388afd06ccd007436368e8d20467fdec2a1eebbb84b03bf2.wai new file mode 100644 index 0000000000000000000000000000000000000000..2ab2cbd490b9f5789d5eb043cffbb31dac0dda3c GIT binary patch literal 35882 zcmZ^}1yogE&^LSz-60_%h+vUYQqmw@0)l{)fPjQ_gHnpp3J3xclG4&8A>AD+T@p$+ z_nhzC=l$+lzW?>Sx`sJ>_HSnPJ$vujv*%uY8D+jI004YhJ}@T~-K@}{=ayFXrY=^_?zS#g4*%2d%W7fnWd6j~ z-qy_KClV!+hlxtr~CM^=9>R*UD3mbU1It)n%om@liHt)nFZ|GzO+Vfu@#BX3PR%K0C2bs04*p0V1xj` z1)%|i1YiINLZ}QO7$E=vk^caIjkM5&en$Vr$S`fR3wUYqk|d8zZ^4mG)H6qH#`P| z@qxx*@c)}_bRU|~eP}}KVel9qXpWI%IL0ofjnT(o(Q-^5#@>H98vE~<(ES*~*g?0^ zcF=z@gt7g<*+<*M`1$XcFt#!F&}}pZ)BfM=V|=0eF#gaSGwy$N{%aqji^2b^gXzQQ zV8(&rXuIfVj1C5m;TZY9`u~mvgG2XYp3zU}XSD49W&dA$Xdf7TjKBZ-z~Iq#(HJyg zo-scD^@|w`hGX>bV zbTD{K8-qjh|6b!M_`%39cntrqO|%^C4@3XOVcHnq82cDJnxipjIfl?}jDHLs zGd_$xv>fw{=I9niAA`mCK=)(%Fjx!*WB*@lVITmsqx`vl@RI-ll+E!3`koa7MTL69 zoAd>+nTs-j{VNv0GwT37VnO1&I(^{G)j8B@4f7uCgF^9^KZUc~)8YE%BY45c5guE- z3^cvc0l+*rz{#i^aH)R*W_hQ8bj|*bMcWC`yZk+rsO@z~EOG=QchQ5BdGleyCz=2@ zohtZha~L$ybt8UdSqy$qC52SW8~4KnFTq*fk71?6F38OM6dIsagD4+J8QQQc>Wuga*D#Jl%i8#=MG6D1~ za{=E4&!!A;=QmaUp*X)cLeh>DxqI$(3(+vWss$L5!{FMd?O1Qy7=0&idwGesfHth}!{^0(07zmBG^+OkNtSa!0mX#2^VT8ArhdEo zt7pvNi$?}fnR_uLGjSVE!as)jl$PL6Q!w!2Odlkk{EWO;7LdQb;Y|AH0YS)c*PhmT z3u>;$5OUP~2JJpofh%j?!gn`h0qhzTu;g_NXzKO|Yac8Ena*}l$;Ud!qHI4<98;FC zg5omFs|3Mggd_lGi6XK`Ujj~y>43&pUXbEt+QctcW!#tDw8nWpzfn8_k0Gh1aj4VS z1)d!@haFnw0GzG&fab_|aP)o&81;96%z1JSv>4XLH%MDL`P}^sl4;6>qVNBN*X7G# z=EyB%?rs2BeGY)yUJfv?_Y@raq|%uB?i6gF(7j~H1f#sPWuOxG7RWqf3A)W|2V*^u z1#q-X0WJP$klw!t%;vmAckh$MK7pDb8Ru=Rqrh_(=$6TAcr>pU9!x()-jgB#kgxz) z;&wnC=|{ljo++5^F>_L#dKDVBDTT^y`%&@qjL^%KbttA@9{yJF8cuvH4q*Rw1Fdr+ z!Ofr*TzH?Wx*Zr{;|Ih&H8HT5g-O#O#L14r**QvkoEHiW_zaV^?ZF(T5d6zU6^TvC09g1Gn5{|$<~#zx2W0V} z-f`fT&67(IBWnjTCN3yh!2}+VR)?upuK_p&p#Vqsdk|}07VoLxYmoGE`)O`Z41O~C z7HaSoKg4+U3bDTgTgBXhL!L7N{-mk^*k=#K%cmiGf**AJcA3RMYYh9ifL?-3WE~|X z{{%XR+2Ge$Y%uuV4c1yW0phWJo>3|4@(*PDq)NXrI>X>StVsawy{< zA=F#g9=8_`tmuS+mxn+LmLqUWxd?Fa{R`|hhJvUW&a>yCqeiB8iQo?(U&4Imuc6^& zX1F#$1$LrRK;|L>NX#k&9=OnfB;^JfmZrxz!!lwyU*?uju%Qyf9n%Lr$v{DF&#GXq zxmK9RbQo|O@C83k=L78dbAWY()cNMZE7Al9gJZhMArItc#O{b^}*a6lMi-95DQ#gmi58ka8LiU{m@~(`5 z`0Kv`6)GW6-8c^nJs`_3fGMEA-9(W5)j+5rABKF{q+q;EDF8?58G!e)9Bd$%0!^vs zN%HB6z-PrQgvk{L$7SBU5DtGe@}3~r<;ew1I8q5;i$u@$699W2IqS~VL7sN06xAqI ze2dZu(GhDpNK)P$ni_o%sopV$6^=X*5=COHJ&@GafyCKfQ0ejr>3-ZeXf!;9O0jT5 z-I3%)*0>LpQ%wO2WiG+5nSR2zj%I+BSmgZj?*yEU)&cuW6_7gbGnhbTb!CB%9KJ)Y z1U-1@4*jaQfGQq^AsHVxfWu{t#PDo@V15N~k$UhJW^Ts?64)VjwhdJIya-Gb9}YVU zHNcV|{b40V31rQ3BYQO#z%qk?O;HoD`t2lmb*6ytW$H`F%x4^RcwGr1O;|+EB6T=c zA{TbTMc!4H3s}n>jl`SVSRwPN;7-aKVf;wWQSj_{RQQr7OdXaB%NNf<4V3OM_&^u& zVF-ZYX#hUUF~H-v@`w9t2Jw2S*qhUF5~z6>2YSfc0qJ*9z#b?=SOR+!urD$Kzq`kR z4NCi1*uO);EaE4}<`jboBqrw&>YX1P6_oAXZc-lwG|A?XwWWhvhA>Ed?VurpX7EbS{D>f`lObqv5J+ zE*{t;4tmsyQo9gKsvM-s)&Q9={DHP3RbXotE}gQ)&2nX>b-`nKV*I6y#s31ivjgL36KfO275T?1~Y6sQ0tBa z(8mKU=rbi5+!y>5wix^jpAO)Fcj`@%Gkz5074slYo$CRMv#qi2kqI0L_>dv-NdShl zKEe^4H{lX~C-_Dm+J_Oc2HOFxcSN9E{a$*lAsz0n+Z84vJ+HlAi53uEuNUMfwhLpg ze}%h++hE%m04!}ruh~Lio>l~0OuKhH|7n2asr$$|p4To4uj&c3VY>`T8Ckw6iYNNLN`Z@FwMc$e0FK>I zBJ{fw3r@>!;FyHhoH-XMK-rW9aC~GrthQALzZ7HuC|4c=Ae}j&_O%SS&AtviRPhGq z%ZtFLV++bZGN|FIfTvLEoFB3$ZotjLvhWef4FG5A6*70l0Dki|(A&e6P4Srxj@^_H zMAABh+Us_POKRT08QaaU>edrjN>>AkXB+?)T@)~zkO;89aRI+$$AW~?N@V31Kfc?@9c~|eihA^j=xfAA?dj{WTA_kmpDYe@h zRXb7#S=G@(mlgA%kS!)yDOUiAXVb7!@C6{Tr;OxJiD33-C^7fx6evhtMJ(TYe#)1^ zgUp>S{BAA>?o?oezh&tmxv~l}cSyW>2?LC@D&SP*o7C31FStQlFCm?bR@BD>56EJH z7QV%M0^LYmgHs>v0oOvr!QAbn#jUVe}(X!7wJcoNiJK2S0MF%xM+;x{88s=Z@K z_%0oi%OdYJ#u#WMEkyDTQcw~PNN3;0XBAb>;d z2r8M^fr|Q(L^k#LU>EBOieUTr(1{s@_Z1{zzr04M9g7k^oi>8+nj0dY*$?0#Oa_`F z*}!YU4}N=}GLtAg!E%1~?*6ftN zP1G`#3=#*bphV_LsF1`D#?90Lup5v#fHMhZg|~rNFE3$zplJq``7DTSMz0?FAF@Ms zOpTD*b{woW*91G9j>4qc%-}Dl=RkZ&El}651G4{33DP>qBjf)l9WpIM4;S#?g>t^U zhK3mFVHGhUc>5U=&v@SeAFh`JOGi7T!24BvHS9hxnIIeM=#%Y{WQ{3wy}c0T*+@lv zEW=o~L&*BOgRG@s;1+u#&_MbK%$ix-;l__1Kb$LpDt=C&y3_)pN5~$(v+fK}2^7IM z^v8f8Tscs1{{x7{!iXiv{SFLu94F-pxp81XH3nUN@EpF*R0xN2PC$}IX0WZZIP#vn z05_v}z$1AIxWaX`$ef5vKB3?~X4g#zb*MQ*nO0;v-Ide(JRWqm!}iqKdF1Ly|)P*szM2@-Q_{f_?JNK9~Ll$(Y(cc_ZJAC;zN~# zJLgBsHc;`ecTlJ75)@F?0}rI5@2A&5f@{7=zW*J`mA8QR;sKz!az3d2fjRa0-+9PS znHRa|ezj;22z$6|jNwL~rchc#H%-FehcYuT6X_fr z_xu8W!-TAl5KrWM$p>(nok05py>oX*RqIUecnEhI$@$yNk-AMTB&8<;@6{K=jpf3~ zI=4Z5Aom>E37ov}A#hx_A9bI#bmz?IDwO}F5Slq)gfp7I!Ph-T;VhYTV9r+nWWh}b z<|oF00iH*o!sZZ2fE{nzA#eqj3^auf`*R>qsyT=)RT$1@Luxizz5s`E4S)}jf_uJ8 zgx^cM!Gk6*!d~doVKtK_go5iJp~gJ8OW_QDzdZxT;Ee;H-@E{B*?tGqE=>X8p${YJ_fWtNeSgN7{o$N~SpY{`zm3}dV z_7Vq?JFO_(v7G~}%x%I+Q!n6tX+j`rQVRfwf`NF;PN2SD1SD`>2DLr0f0F!OMLp#G zj$)q@gn|R;ku~lF>xh-W42Q^FK1CmVRnURlYtIPBj55J%A3I680Lxc}HX8L3t1d1>)P`H}XxLN@it~Mi`0kasHz3Uw|V5@SCYsR%qrYA~8`kV*j**?tKw=3j-ncenxU ztyp9o3fIJx9R1J29nTov*8$fbpFIeU%AKJ@dMtpd}69U2j&QJsrXBv?^$UMMy z7)y+``3szpWq=^%jzc?G6AD^Mhh{3)pyISDnC^NxykA5DGJ8Kj>JeRl8b2k-=dB`b z=Sx5^VT9U|FzrQ+28lw3Ec7tlH$ymMBn1viMD`Ic5<7mCfTN*JL|n;L;CL%7K6SLi zp3cS$H2%a4F0}4K>KA{Y-e76u?tc})QS(M>LtVh4-T?4XJ3hbkwk(PG$~|bpwi`vg z#SD!Q#3Fe_KayvnV4{&__`@~;q7GgISS(+F4>+$usJ-bxX61nfn~)FG^YjE2C8-Gw z5)42(`+_jHV-jpXhRijNAxQjT5CrFsamk{_K{d)96s1tsPUT&0C`vg3qH&prlyldR zcryoovpPY}>^q=~e<9#}?hINC%7VV^Q{YfuRKbn;3yAugJ|r5MiJaMNFd6PWI56)n z68EiuM(*!Ooo52cW%mhm_@==wt5KB3`uC&r16HJN7zH)3&q0*9XYi}kRXBBu5Uk(g z0gr9sf%$|Dz%H2{kK4=>&4S7%dP}QRiBxkIFsp}_zhOJlNNBTP8cJ~}0 zy?1aiHTLyID7zy+p1gR$tJppEEw}JR+G0>!>8eCDz@Y>hb zJQIM0A?EiUNS;Xuhdv*MeN=zKnp;D_+neUddMZWo0$y-`&KIS>sg8e#5+Bm%l|}CH zAK~iqdSrc1KuWoUz)vk%Bu|b&>Jj8%ouVTc?Ek!}(4PQ1@NqCiZHWynQ?(=YSSDD# z-yAMz_k;cQ*O2;!1yWmR0Y|gL@z+e$K;0eIeN-f=Vo2IHbT};lr?X|jEi^}vJoPo$ zGv+c-o*|BWh91B@83nAz?g9xl1J39NiDq#J|7N8O{F}-!WsH@ww5jq(R4+?x-vCzz10OW7lcUd2Fdq_ ztO4hr-vAdQelXvH9CfEQ;$Y5-@Tg zoCx1I6>Mr}fDFh~&kHQ^;2KIBqz)4VzdHK^sfek;)r5DDxj^DgSUoa#13)^T>YJ8} zZ$!QLCl3ATGlzhRHnO*0Lyl){Nd2=4HvCor*IXz(26^lLfOx_$!SlpeaJ)Hpx@{)#pS*qMIn=@S8{-tq`dV)gyQFR@hMT z2fS+Z0IBgu0`YB~fZ97*(1zvd;idD`=(O)0kV9w>@;Ue**7iPV$mk&wpTgmHoT>o! z&U+xyvL00YkV{Z!ItgAE!-eE+llRqS2B6(?eIz%{hFfVCAmX`)$oCX-NbFZf<^nk@ zl1G6Lj61~+y(Xlh31pM=Te%n5cvm1^_Lq=j9S1xcb_Rc(T7jKTw}JC@FEB>76~IAq zgBh#)J5D{d*h3K|hhxZGJ6dMIFS~z3%Q8kVrz0((Yl7T!^6HVA=>&j!6^*9=mVr-( z@u4d>YWJF!d7<^8FOZP`HneHo2IqaLM!pNVio{GVugT zvE?G)8FjT>+8%-Mk>dWmwu|IkRbp~C7 z%iB%iLy~%!XAVa0kOrVJc|4e{x{vQQ(GK1gw#VE_yYy}Vuntira?)}v(SBN zX{63z0AP;=0h-!{z)}JY=xWv(x7oUd7cdnL<>!x}jEybEe3zJegt42$brV1%OGgR ziM=w(4;ud-+M#!x(-)pyhOlZM!(m%*;AgnMA@=XYu*nD^vc|)ayLl#3qgw+;MJIt4 zS8Lwv;bsE5j8;e}p&O<3@DUV8JqgJNa=_?1{P^N!@R1o8IK@^9HgsJki4P3|HI%0I zdW>ZSvoGC-gRu;dxcMH*hjyUAU&lzzl=lC87Z+9qxSx}O9~D25@w{mU6E|rfN~1Q2 zI(!9HW@bv9U#Covoip(|ry;5&ZA84)@wiT7;yI0^fTxlU&rPXNrPZSoyNhj3T}dr` zpSU!cJRV*vaeh|&cdPfWSotaI8~>IJ^j-{k>Eqkk&Kn~!tDgCuXyN0RC%Z+L<4noC z#r!LLD`F0rj+g|r2fp7R{JEAOt+pd}30&qGz5X_!49Hl2H^pZ^Qg6+LcTNVk`&$Rp1qe z^I2*5nW@L2udt0mRb|?@pzfCHi40U?yVvjRECa8hZ!xtIljW?O9yu=7RDM zV+n&*pPYaAb>T7SBglBOg?VAledqV{PS=nrz1EtE5Z8yv?TWgxDvSX#w?;a5A6&=?nlI`gw;OnlUzaw>9VVwCAd(VkJt*Jj&(l%S-9t=F z(TUS$^%|Qg%-J*A6(F}!ekjS`{OheL^i9aNpojE0g|7U5QAb((a( zwYz7P*hoCy3u^a`lnCi$y{B2r()wOySMCQHa1Uv~k`*v<-5r zh@d1x92BD+8IGW@GMHmg?r@({f%Tj9e0Igw>@>HfR24bF9_~|CuehPpq@tSwu@+cM zhb0nrqMueem`dC->&PCz?Hc4cy6?>v#B88}E&Aw8TI}0^3ag&xW+PB#maNMaB#i>^ z|J}`#TssUd_qB-L+s}+X|5W3yeUyL1IC%KA!6jL+Eh%Z)C}cq)^KOD%;+Btkoy_xF zNv;8hjNI98zFWR~&)Df4KJoL$YhOw?sa%gElEmuAD@NSV{E^|)&w`!8 z{Ar0C+O2$M<3#ft_ek8kuF_h@R-dd{aciC5kAJBb?t3Ti_UhAA@fsOT+;?$C=Xe&` zxta=X^e?fRS}4rO?DY4-M`E@#C>hR}1op2!k`BSC1E;Qfe7rFJ%oyS3V$JhPO-5nR z5F%7QAI}I8*fh{4xftN95@9^K{6sRKW9e`0Vhw4cMt^KOyIqsMSN=iNr<+dd3hw?A znqfqw&+uO}SNgmXkO0USHko?}uMS7Mcon$(C@V5$LouXOP#j6)C7*FHWW^-hyW_vy z=2gjE#XOwX@BP^B`#@gNO{KC8k}S?fIW7-zk((r}M^D(BrPB^6&xbvAu!YHMI5Kar zP;|VJQuOfA+-<^p%1CjQDzk2ZK#nF{AjFc~w;&Id?2c_juJlBE?eo`-vl;tvuW@Oh zHOcOc=4I2WSNHBb>%A!~-+Ifsew*;j*QflowIbJL#TkMa|2+JOo1|u!qZq%q2CR3P zXSi_s+a>3|du740Op%ovg)<;&tK5AcbKvq*>!j&D8`)MK_cJs3>6vTl`j7es>$_+x z`iiVxGi`_w{a~9US!Jv(OfsX^ddtKS7ip(swwv>$Wcle3^Pz-IZsp(&kxnxGjkn6t zhj(~B|0ZC{#FaVeC3VKBsZjTFsBF$p7SbV7(W$RS3iJa-_h!dS5}ovE2&rq`q$bZhtt&P?w3v<}Qua{dV27ADZ)D`c?)Nx`Pkei|t0p#`(TXiE zMCjbud9yronoZYclYEV%K~gFyCJN`qtF&>4^x8|;t(FcxT;}YYtIai`xh3XEvK@!D*5_iVd;}=H*^XDCJW^W${Kd5iA{cal9 z8mRXLchhn2N~t)5(w9fGS=~0YHMC#%M|Gw5vUTp_{XBS^EobNM$9c>i_7$SQwiw+0 zHd`S3jp1DIM6=kgEvm9}PUTj#p_W;dk!$+6$SK7wls=Yeu$n&OV;295Jk$R74T9`! zST*+~MuhAi?RB{`&)+*9BsPDwa@|ZjXJixC`5;~A2`fvv&%rtN>3o+c`Oe>Q@d9bp z$hse*+xC&A@sEW=rq#;`oO4g89DYZ+ceR-U<$X-)*_NW0csNf6E^W1L9G>Z6Wz3T_ zTFzw~;)%y!qB+OO3K9<&^f3xArS7K@nK7-OdS(*kwX5>^f?^8_EVSD7p~3F+}tu6g;#T67~Ji^*tnYyfH9x_VVv`Q?UWC z_)P+X&x`S8n`DQSbf=>grQk6<{6iwuV1iYZo{Qv=5N@1HenC8P;bAy;Ze2L@WRPvz z&RPLWk+?Xmx{CBZxd{nG24;1HV`l4g^gnru+(nx0Hg)b-&Zk&?*=USr6?^7 zH9NA(41DXC>K&r>RUJ!IdqcOHCgcr1&%$uqb1q|}n!EhLZw6y`%MPlr#YjcyGZ?#C z^7~1UA0(Yq7D~x+^w(yVJ)2(nEB=S0^^S>nx_eBHCGP;m3%`V$H@}xW9SK?=o%v(@ zm)g3GsOFJTuH)WLzUZXJtq6m)$q$`&r2fw$`Mlmt&TNu%c$OZ^1$k<$%I206rx&(| z5gtCRG1#FGn|+a9Wa=?RUlznx#n>4^bP|)?+DR?^Zo>J|rZH9`+eNXa_+h5JCd((f zGw|w-#N5K%ufrvlFItjTwF~zTm^!y?rKeLZruhzR``p)6&3-6}WLkl5;0_(R% zn|0H)r=j92UeDM}OzqYBch&zKev`$kkTuuKKM45xd!H01_mck|&UfW*d@qN=rR?Pq zFN#0Bpu4YcG@U@G@+G>mT-0N~nQ|V_gcS}BCF`#oRl41AVM{3yiir;-`kWsL7EDoQ zKyR*6F%f-!jq_|rk`jNeS(;Cu!aFpu{G1@{y~mi$?-rKYnQhYBIeNV>yz9D#`ju*~ zZ<`x!$E4SZyikoUDbo*ixsE(KiiMv|2zF_fynXWrB~5jQ3)#-x*zw1+2#aX-WA7EUF}TLU%qmtxWGX+lzh#wUeD#0 zfxgsNxgbIlGLG~nSDd5I(+79YZP@qs9JC`Y{-)BQh@uBMej4czb~-&9{Ls&FqPMl{ zHU2S(P+IDGbghU*(x~vO!D81LA{&SMt5!3`mZE<@rkn=whVlCyCtlNZKdiauOE)sy zpL^x*wE=AbuOo}iwcW0O_w#0|4ErsgyL)=I-kpibNQFq{JK&@Y3LR%S^_@EA=Kpo& zvRY_ORKnpWvM@PBH61@)J0{4CwmMucXP_)i9xQze(J{r5sc!SWsC@2I!?XMP(Z#pp zo5Ztt?IWb)=_C4$;^%~#p^mt(MAR1BjRpAU6!sZjP#>w18?28(x;gq$KJ1N`rYP!7(-JBh#uV<7m83Vxwz6&8oR`GCnxUgQ(Yd;O^-5C8o?+t+tQ1#q2SKBwou zn(8UCMzuCCDxqLrJ4R3OW@3f;kzJZK--Sc-xTcPJgVGOfVPeskYotHCH4bBN{evHn zMF_uEOEDJ1qE$66k(S7AwOP<^H$IM@fqZwz0?!TWCAi4eI#;53Ux!xWi?h8o^2Sdq zNLqh064g~86CziabTUCt@LlpUj&~24?&A2=PsP<-8DgKFk63RWv*PSA9wr}TrJ4qP zo~~`#7o)BpcsKFDa?GnOhr*_DEX1KiUmR;8VU3>1a?f{Cwx?F)b9$l*Yq!qd_f5fc zXRq-;iz&F$F*l}H6?3&MG(Ma;(3jc_^Cf|)28Dk<(+?w_x zr7uPp{B5g_dvZfaXlBi#s5^Wtbfr&gcid#$?(DO%^^28UX<;j=JKil%c`A_Op1*nK zc<)aqCmLffyeB}&Y zq=qyPCGb(2*~Swe#s6hXvcDl7spw;2pL4!b;r#MaI;Z$WX)J3b>-pvLL!md?@NrB; zR9C}ZGJed1lK`a`5;1ZX6HgeHo^tY!Gtvz11<>?yY`ncrxKxk)H1ToctNUsLq(j|g z5>#x(=L^i=wXX2k#5ebv|XN`UYAxY*+C;MCbw!(KTbh0@TWxP`kPr1y%b z%l_cMIrUImb{?XU>dG=Lmr7_cxIAu%no1)4(7lo7Dq=dJS5(!iUJjrN@6**zfTS{k zlkUvZwlkMD79vvPtc%ersi+_#?ys4(IG9?*+SEzkFy}eJl&6da`KzLZX|dfrQwtIu-?ew6 zyvj$9Q~Xzox0Vx&IHQ4N9(VfN0RpH_FF$DY??fUVpJ{QC{p_^Yb7{wNN_gKU87w8{#%|X=X8soTXoRwZhjKLy=Z)X?46xnP@L*ux9*u2dA&|0kDf+qhy z)7x_UJN88%X^Bte@b=73mBjfjJsw;{zD+%=RPWoq;(CK~AiRN_%!yLNduKIR{=+`8 zU$v+tzQ}2jb2TnWv*>rl2d|fp==Rb{<+D9byWaSh?^ky#&~rTDejCHl>-O+yStvYd zebk%krH>m;K;)Ok2*+RM5=L*2_;#L(@&(9Nj*ioocl{CYKczXpqhT+4%fKZJ#D7q6LE|=zhJ_3(diw@~K-*!lT;pt9>*$K~Jil zh|Lwu$H5s|V3_mwnSTy2t4=qUeGt|8mV@8bj{aUm0M1%88Tq}@J|W86z3W%5tjq7T zx4bFfnPtVPo%2xjAi4d>kKr%3Sn6LpgWF@?WgQLp**KPT>N;f_iKee6lDep6f8)L@ zz!pvRozi{hr=cV9z#?*nz{iBSbt~a8B<^XWMUl%-Arp7A_vXo2X?60RK1*lRy7H$* zzp5Dkl%|a=f+T@lD%+@B4sJhQ*np~zbU!*v1kua znAP5Cpj20MH3f*VevK59(^fq0E!x4=w~-nVEU{UyI($vTqxE4oX2?fwtfgn9`pPTq z{LCAJ>HtZwJ?YBQTjey9wCgy(tz6|CO0nG(?3mVP-rzjbJX&MSJs#S5Q>Xs+Qu(Zb zrj~PM&d;t-+Qkv3pVuum$eSo|CyV!A5X0jh)yq%VL<{@0+aihSS;St#+Ygs+DZ{zSi z&(d-HrVj@%?s3xm)#2yV)m)YCR@=4r7jT?;!0GK+g#ETMG+aOp^#qh9-$$nF}b{MJ1CSMTvle(4L!dE#vkPVez*Zg#HP#SpPGWVD4#tI zNezgy!}W4u4oqKYcz+U-k$gqLRFGyT|A)jw4${!yxjkP63y;Dcb-F|_Cz2+U6Xut5 z6R4(SJ!$qc<0r7!^_lJHTzla`cz+6RJ@O1~(h=30Yt_CKK)ajf46do+V)*W0QI3U$s3M}=toPfpCQ zoe7jVzOWqpoK4vLE8lV>X^n5`d!Vt-HdbxB;Vl248~^3`OyVH%gPk!GW>T8Jv61sf zi(~wmK38v^tvb_juYP&i2roz0F|n;0Za!t-bJPCDO-?puA#-RE{%*R)H(kECD3Nej zLhguvPo+nd@=mUASXlI0#S1}v6zSexV<88p!oK({zDgeaX(`k(iR>wd@arny;}5MW z+p(LEvKTfEdCIzc7GTPP`I_l@F$r?mF7ysgfVnn`*wfmkyGe_Jz(*~D)RHoZSm0jz zmFTve{<%$a4R(3AeGzBwIo~@_Lr*j1R!HP$qpu_VA9h%O5dFDQ)0Y$UgOr^CwiNV5 zt-2}n_AQcs4<;ZSnRD*jsqbuEd?^0)6u;%#`;Ea|u05L1OtMj&s6Kh^B7wV{Vk`=F zN5^Y4CHB``uM!45djHGrR+`bRtyf}X9|>m8*YWdqQzMTu2kss`u?$nf5_Y|#=}s|q zc5b`$T;4xyYtrK6{yGg$fIok|e?*JvR&B#uoKl0Z4?^Uj01AYbvOOg7tu^O;pQK6sM05h==^pB-rK@+~m!yP|M_ zU-b7FuVV8G4esU$2#w7?79(fIhBqIwP3J>e#ge9q!j!$1 zni6=#s-%C{Nh#MTk70`voxaFaF>Wi{eBoCR$bdUT$03??eeBm2ucl#@W&w%YVmmj} zn&vHKw#QWRw-yQvy$SFx6X|@h{Z8<0tAG66?UH>pF0WUfE&KB2Q#Zff!%ZU+$im+v z`p)d1OzZmo@15mo?r1$LbBOF^#~RNK`XL{&TU2#>L*1x!`_{)+!u>zQ#P@coakxk< zi7ARVK7P~t^J(ID_cT?Ch5=KrUHQjzD@bC8SXhNJ=0+*rl*?(D z^oPAB@_0PI{As;TncdKb3+=I%hd%fVQ&%@|JEO544hR(XR{Y()ZnF0?H$A@BQJVD@ zRlSv9ru8qw-07~p_F5^wlcm4Pz8`(DL|D@9QO=~kSa8AG@yhn)nO{E$ueotPZX@ZJQhoXUwUNX>F|V~>*0JZIGGM>fXR8f| zVA~(pNinv%^iT@62D8H}{+47VjiWjSodW%LfkQmPKQRwZZ(I@LcGZy8>|;^=z)O7k zefg72kf(fr#5|L%u-(1J36A)$%2h3&Y=`vk@e*#guK7+7T;}z_rc;uZk%9ANx?A49 z`r9gH4Kg|E>U8~Ge(C)TYx-gCCn6^KFSqy#xjcj39kW=rfBce{A6NM7w$BgYb5Z=S z216CMR)5vnn)l#&hkoCk=^yx3u{#R>p$t2)Ypu{2CP?83ytdrC{L{fqBOUKNBC zzQZ@K1t%En8rY>=`<_$dm<;bBv68*A(4lPj9C!Y1YF`A* z&lCQz9=J^OMVj65%scuI{xrY;;S+(qEMel-F3tiD37+ha6X~+GAhd?SQYLJ47a-f&O=%tZDb9gGlbM*O2cer)1%s zbK!uibuk-gz#1l^lNh`(Na9U5ixU;7l~-4PvDdLnH6Hl3{I_iEE}s$EA|ZBf>FYZ2 z2lzMJ+e_F~kr;Nszr1h@NrfY$= zUTHY2Z~dPVU1(0;ZCn2nl3FQyUwR4q+3x}_TCA$&Qt}$`^`@Tvz|f0?`Y`m`!99+DV*8xjMN@z?!71Nnfe>awf8HquGACaZ!(z%78za>+J87#;YIqjs8Z!SZHKl1X;_bh3*>BC{iH#|RYy`(G)!sT7^A5Pi7N>(dtoT}zUA(@tMXfa6W_|0iQF8lme z%Qp2=qv&nZg7Xn;8%vVYF(0Pmr1e;H0V#8~OD?9yx4(u{-0M^~#tyP&6Ccd+cdM0j z=o}g^N_HX*6_c{H$5swQ5zz=So?NjYzICxjwQ_4am9n-qxhTPWF)#EeYV)(}YtGw$ z@~MsqeUAD{v0jQQwtVh2jY@k(5UFOV|Fh~BdAnqTI{ue-h70B`F0+=M^E{VJiB&%( z{QR89J5M{_n7M2E8m9A1mLS^XyIpOLO zX;3w7`8A>Y$8x62Uvvmh`>$LZo-_P#iFV&)mTyAw%~U7q8SP;swX(hI>t_chf325f zn@QGYDI7^|bm)G%hmvp~9x+3y+Cz2~m!$P28}y8oLa2TVZ!QjBrk8jp_KfjJH~6P1 zkZzD_#h5`d^VwN{Tbj~#*pB+)5BJK#`A!+?yE0|TcbngbB$vDi`jTvtsTkk>KtrgV zc=x{ey$TiI)+Gn}StCf~2>SMU@?Dp#G- z9+k4cX`cD?IG@ore@TwG^lYy52TAKB>7bG(%?(Sp0|HUX;S2xk`-OgsrfGumOfL$l zJx(5RCtKND&aqdXOnt9>^EBSKC3D_ZM*la1L<;dH7cJ>cY(|}}%7^y{FOQefw-q_z zGiL5)C0>wl{8moXyDON?BoTHlVElbvsH)6_tBLt;{m+8;f-NC}hl$(RaqA8Cn~d=v zulyv;TmPnhRt4{vK+fGqKgo(MBmcC~1GVET|I^e*l_JX!h z`lQC7`ZnHliGP(g)nSF9`cJOHvfwn%DZjjEkEx2TDQriY6_xh5ps)`+Q9TlSg25fz zxOj8vs}G8`**Zw%Ia>S1Lvjc=W=g^@aM^?ieyk8bmdfAH7zvrd+Kg<^ed#*QIk~;3waLd<@@o#``Bc09vs$-i?9T7)c!&TVFVsT9jwI8Gr_Bmt`lGRL}a-u+MW=~#MRtHlmY zgI44kMy*eq`@ge|*QS3bf&Q4Klzpa5?b|IepWOh(IYx{kyW63s65q=Tg3WIB6Oqm_(pS z2ej`o@xrn?JTD-3!E9qhic-%^1$!3<_8BLurPa^FZQ+bcCgBbpydy>!ruwmt2oFIr zEB8pmj>>M84sUH#9Y7NmL}KVe0-L)a&stJA1oy4Io(o-=99@Gm+c!yccPMYL2g)^6 z@o2jK{_@&FWc z^0Snn-Aj8DRNxu+$pi}|Px6<`0u^!My>NOpmUxgK!{x4@JO!*!-?9X1gAhdNmXvz7Jff*vu-6)ccu1P9j&?7`#=>x;4n#Rk z+7iEi6U0*nfFKF0W}>`;pkj z{FJ>GanJ`~q@qK{RfO*J#zS^-X|>ku3*-AZ(~0iEG}8!XwPPcgXcmbZZ9JL7kLY}| z?aQ2Kw#cFn(~u4#U*X5To}e%$6LU7R%*B5`Ns;W+36ScS2~A}r_vGnWBtyKux;V`w zQO%A>EbSbQ4jE?0@y1~h;@J{fc;-pp$Q;|B3xVWiP3Jaj!VxV4waP1ttqo1rgSRAp zcnC;%5`uqtSOx#m_iT+;m(WTU3p(OC_^wee_7OT9buxYf=sYC;26*`YswC1|zHGvr zMjkykdbHi`Lvyu49LlJ2v#TS43E8Du@PcO}$s*C5#Q7YcBa~A;jZK$zD*bXuqcR38 z&+3S7>44(b;^x%Fm2W84@;$=6HYr)H$GDSb_^#F&ZzlQ%&O&Ti?o@ZV$l>F=h)x)P z_V!8J(3?#c^lCKCPTv_haW=J6mkf=_w3B7A{B&*=uFe;O+rK==(v18mWL)9Q@L6Ig z7U80#?eiSZ+4_CE4ddB}1I5JvbnX{d39L%&Lg)0&);Z>T$!#!id{dm}gms*7V&|BQ zZr#8j=AFe(kYZdu3q5Ji*M5@CAVvo00j+g?^3wPYrPMXWE?$I}+aAQ=(Vnbuzhrf9 z3SL6-^PWjll*RT}sEcnsy4UC;%czLpl7unquvF$UlDv7yjs*k4P>YS)pUK6{Ux_$3 z5jfx(8(q)5XTs3ui3NQGM<=xYbTDy0>P55GQ_>xcje~64~Oz91Hhl3_8RZ@fWxel)J3XtxYmnG zp~K6qPdWh?+<~G4if@G^aNT_?@{HaiDZ;C^pSWp+KKI!gPrJ)w5E-yum|V18`Q5s; zI|iDxpT8exY%wy>3PD+xweG|1%)uM*3>1f+LouQTn|5DCynE$+JpDQ-!+H{p0~hEK zsr`lP1(3}EYFyVdO;$+x`aiNzJSWNq7E0Q;ui2{ZVUUhv!JiCs5Mf#SLFhTcI%<%7 zC0#b{4WA&X<_JqWJAu~>)`~mB_bX9F#|NBkF9Qcv*c5NH z^e%W@UuuXM^TH-h>O9Ylq8aq}aiOFia3nENmSG6Sz zM<*VJ!>zIn>EAE>#ebEWcU zu+oONI$)9%-dU&*jl!^MW;nLBS(*kzOjkl_I;7Pw3sJg^)!Uhr`nNGZ{a%$qC$4$M z(i7441nE@~P&m`|;bDT#&8H?2RgyB*inOpk|M?fj4H@H7fXhVzYa}%!ebVR*HQS2`hM# zO+p_&s3k#IFvf9c2PG(~$DIUGwFEto#fzceai*Q_K)VKlOukaseVd>C8O zAW0sy8wj4t20L}`lmCjinBOVBuSl@mVNs_+1mH6;qcqi&4(n&P5#6@@%2q*iK3}uj z0}x}B%Vq;Ew_(P5XkacE+}4}8>XJ6im)P$3?DEQSF7kVdJ2c8xT#p7ARUY-FGK&@` zvAi0SGSYau<1@0V{VoI{34=|~B=Ob>gd6aU-{pz2vno)@Vq3>A!{XL5fGH=>vY3&u z-+Oq|Ub?-Ra``?i5@-XC-R3aGte5ti@y~pwlb z2Wlf)ZJ&zBE_p)teDMXMTSH!ym+=Ck;+A;;K=j112Zpq=2*%Jx`{6WUuB5EdwOaI~ zE&3D*w{3*uR0wY#EG@U3klOn$Km-x|ei3ld4Pk@*oF^L+t*_Hc!*S3c%$tWRwn@0O z^jN>B-6!rwEG-a_6n%o0{R`JubONZKr@A=-XZyZ4y3qN?$x(rqh4D94iAO`v_T!6d zF*6lZJq&;DbPaXtK?q+RNb+&jMB;kh4(YF31CM&{^hCSun3lNDv<8g5EkM~#IX()m zZ^Q(J6`TQ=?i6yp7a{FZvew8L^NA5unKFRXLQ3xXa{}o-W9Qwf`@9QXzL6R3yum*~ z`w9&T$WVuH;E$~%Ig&!X<*=I*ov$!4|0jwp*)?h zwkjs5Vys_ZlosR9~aAk|qZb~HZV0+zby3gc}Ddo6h(*#Hy- z5C{AM4f_i}KXgk8j*jRg`>Fg6_uNBwBmf!&q>#y}sWPl$JWvcxTLO$yKm4MC{5)|K zA28Cph8;?ccQH9XWtKM99xoN%;Tr-+H$^O9*>Ed|bQ{$oN{T9tjjCSVL@C0k3vH=$ z#c(Z0q{I0ChOo##H?+&BN&9Yp7)5RGv)+vfgZ_6d^NvL``0AYZccxx!!f-a@$z#15 z1T`>AQ0U{vjj8`lj-7Y<-&REK#>c%W_t5z4PaLc5vf#5SoHE-Ib;O!J5xt}siqQ8u z^xV(6@SygizuTL>3r>W5+jTyo%^{7*bl26pVB%;${hQ1%?LHlMFnIS(1mAyKGi?y6 zXIxAZ;f``79YTQJ@dQvht(34(@zLUwp&1q;Qa=}H9Z6-TZOlY555#1OeLAsUm`e1H z_|q!sYV5BbFGD#^$j#ut$spKA$e!yAEC=(pQjSPEjV>|3j@V$0_s`2)(2bJ&qJmRK z^3-iv+Bo}@NPbG*!4Qpw`g!;{LqfP(AF1KfLGMEeBTZqxgBm$M^l|>&3WsGY2HP6l zN~Xqh;ZO!0K>X)r81o8=ek>$1F@)eHG=!Yz(7@F&H;7P7G1|wB|xlJIc3fKNyF<|TY5 z_Nt;Qev-0E(2zv^?==i?l=NrAxWVwYynkN5lad*s65fCwz+4Otb#T2 z!k#k9jgu}N645yZ2nNvHAt1Gp+m0*j9S2GZ<7fouhRKi@r^)$HCIhb+g&e~zb(Muw>kEnm7 z&;RnXNMKp6Lm1|iTH$;fFb2LbUQGBiME6L@s&-G6F)a7ja zS}1BT{KnyC3Sk~DZLM{gRS*T0BixF4OCM_%hX_I|stcatSA+=oozjK+%Ra|Te7C64 zSAiq`=G$Gz81S{(Z9!NO8$LM`J>;}bMtCSx|_rrD7mOXL@Kj!)@FJhYP zR$t!ndhH-(YL?|+112fuZAU{8Y=z(e%7YKL`H8frHHQ5pL)dLdNXqaP;W~wr5Gdr+ zv{RkmJBl=_)mIfJ;B|+vma1}CA3#*C^wH@Y1V4;Z3UjijHL>*a7geuncCk6C{8_$7 zh-voAcBd&u*E-wLPymnJXHg%3_M!T#VbDyM^jKk5jHG>+ZqQ)mF%5kq+SkbTK*tL9 zJ}#o(kom4-m!B%`Kc-tfSzw$0?-A_c2(D_44tSMU>oK%k{WG>&#@n|TPWRw*h$a$1 z3>HRd84+%*$B)6smQHJ^hLcL4R+Q51rTvY&Qs6AOX34T<_O`ZU{CUI0dq8QXG zIDPT<`G2QOZvV>)86a|42J;oo2mmGv_w!N*Vx0`<^P)e?(w9pzgk>JqD}cf}TXO$) z%T0jA1kK=KUkau#4&YPaXcdeMq>5en^kE%1R-)N*BTcL@)%V`xUySOs3xezJ3?W&w zz?PS!wwDOJ(bM(bZ2WKquxCUJw(t&7=wv1Sehwe^m zaaU5Mfm!ZfXC}FXX?f)Q1s!$El)$aqyo)^)^Z@QJj-hD0zq2v~GS#Pwz^$>oS!l0R zbd;=)fxZ@_`SZ=ZMs8S{)_+>Wml0RHEOr#Z4&`el*aX+HwG<%cRvkfrOQloJp11ZG z6Y{yBrVVyR7LMTmtcO)0$YUQKS)l)P%4pQB%yVv<3H~j$M2?1d2bqX02o<&>{p{s! z^Oj?K4x>wb>H$@Q9(*~7u5b`w2&QWVT(jjg_Xjw~fZS3*I$B6l`$rV=Ke?L~T`=Lf zO8xIX1NM1)f*^op7+Jhd`ZCz;>?C;b+YzB#3W{PSgCiBoLPvvJus{?F_T=i24Kelo z@=ZxP2&%EK^`^(#1v5Ff>2X>64=O}*HdxI14_fShGQVrf4pejSL}-~jS@~hjwh2bE z#1%cT*usVy(S;cNm26Ao2V3=*TZ}|f=ED$zOs?+53+E7Kpp3^xg$|P);(@QN_)~D( zI`=(hs~Bp+MD1Mr^BXBg+R0Fg*tj-FE{-vd5m9$-@O&q8ChhW{@Kt>oV67|{@zda0 zCxcfi9V$`42%|ElP2%ajViQJayKH3pQH5NN$VB27sO4tOY|}SEL%{Lm2h%w3urQj; z;y}BZK1nI8RJzlD4jRfz8-&=+_BAP6yZS$$4Wam4x<%ZN<9QKHJxnAT%<*)|-Rt0$ zY$#NR0t9w)1n#!b3LP|XT&RwDH9y{_VtWq!-_8Pg_&eqE%Q$qS6koMO!dVxhnp>oS z{4&^|Z0xbFdW}m*@N+PW1_G4cS zFV8e{e%e@aGqC1(y}da_z)1w2N8}op*V^xAtCC$Uh195kU$( z*i4dM@iY-p=SmGIOMaNXE8VOZX41cG=r$F2k6v0IEnzrVFfqldbI-w&@w5_a zTzJ5@0vFXHx=k9}y(gdv(ut063%GhYqcf-KO$~F?QAg;b?2R9`$imCzM^9YoL?K?C z>h}AesCM>R3_0VKpqsNnOhS}jb(cfNNy||Z^wHJPIYPH4q4ZhVCwjP>N>2r1I7by_ zy0((&`*8z@U?EklW36Uf8CbF+_Nx_R>~*f_)Wz}32bWtxq>1h1wE4j6`@>U_J>SGu z3|f|}bO{18%2d^yV3G(Jm*iLK5P}30%NT3i${norr8MQycy~f&JNF?Y>MOd?9|>&P zeWQohc_+R8?Pyd1olFS)guE}R{No30^%~ta^N;A}PaMBP_dP3q1otEFir*^PJ|;Mt z^A@ejGn6entYYd&AQ)O>H_^Hb71vUL$3_D9`bgOVbyj5m4nh8hNn3y8WC0~PmH3Q?yEG}ral*_5&%aXhBc zuXI{npE;4=2*_5#wR>&O2jYg21oR~S9lF^8WLb_bym=BRW>J;;@DRSj1(kshwsb+d z4+%GhMmTl4c2S2rhZa2>kp>*RN2Uv9)QXo7~qlj92$i zqH#W-&ttNG+n#Iobn{Wnuy+%>T*3nl`5@p~3YGFIpx^6P+8K();zAAQS(a5g@;hsr zO0wK}I;>$C`_+R&vOu@hDAeKB@B7N2x*+OgT+^ZhR}2_06m2#|N#&wsk}eS}GLGv~+O3Ky%(3aP5c*iXli z`%w`JneWZvAyX1!&*DxdkF;-+2L9Q<-!^E23|YqxCzu%FM8+4q#gO9e3B_=(N5j3)t;}k( z{3N7+1($ba{ZsuzZ^LD2Au`3y@nFwkZE=fXbXNV0T5EOrz&#QqI%Ef!o|R>mo}A4` zC1Y}S*u>&ilW%}3Yr%zA{eJGvsro;#DUG|2@zolT+F*dU(r*vr3-(aaRBoh3(7vO} zjX|WI)T|@_bI4>8+^QhN^wIFq@W&>)b}2+$DfXJqg)P2qpXSVjlfzB`Q7@;35z~6^ zu{GvtY^1{k7J*be26~==^zb{J^+ZxX{Sph21At#xD~NsnDV^aPcs7oBHp&@>yE2O% zb5vF$%#HE6CZ-Z_L!SIH^W>dd=pS~o9AuAe`2D8%aCx{5w+vNNN#k?$A(KYL~ zh6p$MUba|N`s*=j2r3utp-^(aGnqfKWv^u{r&>HZf=dr7ip!QwYs>#U@RhW|%VEkG z;Vb`A3cvvG1mqZM8?1L~=Q~zwEt3IBOFAq>zA6(sIX+VTH^%}y$2hF!M$%jNjqtB! z`}#R*^QOArA;h$yLFO=wmUQrym;vFr0$QJ?*dkz9UFGvkiua7KyKn&|>r~d(KjJxy z4$tXtv^V@l>`@2t%;iT<#H0QO_4Y;#3Ly>!J=tI_4K7-kJWZ&$vv#wxY`(GK#Op!D z{4Q^f@u99*Eh>jQ^d+q=m<43R@F4*M7USe1YUvmWEROR2pqbPjjo-SmPO-ooiQD-F z>tBMG3e>`n`DV|##Ow!3)EOV9tmneQSQLw!*aUq89cY>0`^%3ooix6?i=$i$m)D72 zoLODO45GL(w`Fs#ZEs1hjLY(q2iF0q-dLtp&X{Wa*$oI7Mad%O`Q=z~^Ci*fDhA0zq!MJGh<%ZdL8DtK zW0#Z6Zya~H@SY*(_lETF`Z(Xd6OSH{t`$6RIh0p%_5C>XAiQ<4p=K2^Y< z`W0;y3Q6pW^SA;N)zMdF62asT_;Ve*i#0jZWQmcL(9{5iq0DjVvuEjESTv?45#8#PWiG>^hG_R$6|a^lm5@ua*xl{gBTLsXxOTRc%@N1rz&VVmkx=RG1);~`5{da z9j7(s4*r^)V9sv-Vh*k4X)%|;;!zDw-o#@_E!hNN9)$V(@X~HhiG+vj0<9jW?K%|* z1ki3O@fpFU^C7DstGbT`cLxLPvX9#>6knvro*e@J$1kHT54G$K^)$6GMQK7APZ9Ih zN^srQ<9g8$dl8=Pa#eYM^tbFN*Z^+NeYCcR#*`1tweJ*765TAgVo`~Gqc(Cpc|smWt}89b0;TRrfT3HDfh{Z`Fl4Mf%GMzbo>&0;ur zAnmt*=kV1hwz!Rz+iqcf1ZX|^-5O&51OFd1>gj)kT0n|q&Q_PfxS2tYp6;VN(Pp#0(XQ*@~Xl8z@|3G zQTDqedsb!Idbs3G@wMH1Uu#x^b#tJ;vf;-f7-2U`$#_N|c_QE7<@KIKM z?_8hw`<_%c!wQp?bS{?aGd5q+=u)iRNe-Is0rELm-KV4#tk}Ty9)8H#8xtLQYL6wr|2*Mf*JUs%z6gkPuQ?;{c8mv>{(!D z$^Xjs%IF3WiU~n_+{8`HERZXb^T=%>K(D73c=gmEyUzMzvu~zJ8%s39KYvb!LAu`) z4+<1~no?eq<0Az;T@T3L#D8kMEkZKros?LpD=GV(mk9;2#HC; zA`KO~B;jA-6O}4F3jOnQy@c~n3Ytc=r!@nGCbog@u00<`5y&Vy4Z_E8@%52OM{hvQ|>2r|r4L2?Z5`QqJc`EiXPqwFmiO>Yq5GEIK}%!3gGYUqska1TE|*7Y$Q z-s6Vz@Dm#6_(io-^=!Xr)B6vL15IA}G0KP}ize)zU_fPw`Y7%`4cj3``>yECEZ`r+ z$}9duV|h0G^DkCfWet-(8C$ypwghhGqv=t0`I_C(xjAR$)G$HQ`y)zf&WyiUks(hH zjv2+WN6&7*)A8AWvQ%YSgVie8;%mvt# zG1ZE2fb9nqqF+vo1)94L@CX3s z45!~Q5S+0&Ndc(XBm40K3H+O=iKvB9`SQhl=jGiQG_+kmuX$GJ@&$xjSDo|^qq!zi zu!8R}Eoc6I^xdq^@@^%TcM_=A+wV>uwZn2Qw&dT0kTBnR@<}RUJBZ9#_M{$DV$a78 z{CIC46x->`RXL@H^|Co?t{1qxfD1QtDB2Uu3ZcP?5=E#@x@Bg>3Mek$o+fVWep)G3=v66aR7bZA3ftWS!3rKII{T7-* zdwoM0)PXM1+z&2Dqi?`8<~_0YY5{Q;s$E1s{c2j$}sRu5AmEy?#__`Hz>*f<#j zX^mN0tjoXdW>`J(6BGghmLV<4?Hkti*#!WwQPAF!Gwd6 zc=I1`I><@H1PzsF3aGAPc550z`Z|H{#-E0e>y`5uB6_I!`YM}7$Tp2@@ex?H_tBN` zAmeP*0#u@qun`?q`g9hWJ7#LnCD`eAse2hoOf?8H9`#gQUW}Uz;nXPdr8qEEtcx~u z?ipCpTGyuO6xK+|E79pkQ6{>YLqC}M8D_he95Iyd#0s2$!QwdugmYXdQTWU~hA(I2W)KrOomoRQ%kZqo|3 z_(#S=iS-CYcfRYJ^{nJ_57QvFY()MHc#U6+)Vox*4Ar<=1p$D5Xk9E+FT^A^iyja{ z4cgv;XF$GlexWl0o*j#z#u`VWGtl?}xkjtQ&6wbCFtpgBA&ADOJ!*KTpXH0?_u}Jq zJN=O~_olQ7lod|Wc|mAx3Y#aY=Lc5{Z%4T`jhwf7bG&GQ@V`lqDK*cQ>i*~5eu#|g5!AWYO_qpHUdE(ed;#b(4y3ZM=OS3!& zm0QJGZ;_^TP3NERn309l)k&o7Dq9$b3`Nv{44?mcHJFpmoORX)u?i5>BhE(}NXl+p_}g_IDP3ZazZaUJW$0oy%>spENNf`R9b>-KPdV#IJSoY1D#xX4B5?k#BUu4H1>OI#@l3jj@1Z^`7XJKTAN?_ z_Dhm&=&-xr?OEzSk&@xo{7w`gnET0Iga;6I4#2O!^@VtlmqQcL-mvx2IB@+GP{m*n zScNrI0#X{_Uk~NaQ*){-(i<4beG4>O5d*NLs%=p~&bB*X+Qr@^2L)cmBH`Yg_UvUL zTvo8OWgcXNpj(F3sM!QmW*VuV5QGrB`C{+#;Av}e9o_Ut2fT%F)2D_pMpLpFShL#@ z_Sm6b{Fy25&XuhA8s1aa&Z@;*z`)191O`82@?7nw{Bt;&2%xa?8h3j zB+AKds3X5x!D2g=M5G89&&m_UqGeIo*A%$Td)BstC?=0Iq5&7xFP0bB!=j_7Z48BzPV-S`8qw9nOca-RP%&dIO`Y{cqh$b?psaY4Ks~S=BzC~4H!}7y#nI$N9dHntuA;t`+6ElGEys41k~PjfWX7j znF)$~-QcZIj^eacl6-A$B=)aly!2zTy+J^tfV4%CMc=y#Fn z<$$sxb4krK8dBR+zY`vY^pYZMm~vUI8OGE_kS#HI4UmQj9i?Nv31wzjd!rA-M$TIb zc6s>T3Sdl5K+L_!lAT8U`2rO5>h#6Xzx-&yOtN)pB$Lu|nkqRR-&;crH7uYGk(-q> zc?WWPTJDZz&kd{LQBQQYRkadX3D{dAkhh<82>VY_OJJ=@Ue=fVSf443&^4{jmKft1 z_A)trukXnTZsGa}FJ*_v7wA2|#2lPW1zEev`{+YlZ3`LEf4Fv+_*H>Sc2*zmv#O!eY=}tSF{L%|2q4_4f4Zp_^ zsB}G7R0_Opq(6x{!M=0VJ}YM)f6?^P8&}VN}{=qz3CY9jqK|*kR2ynz{3~ zy)Mr}CLW^kIUJh_hg*p?Y>6tQ*ksy=ISIdC`2>r(3Ck0}4sCgZAx{PbP#6iV46@3N z+b`&T(nfQsqPkr)?C*yW1D|h1l$#8C&T+BmXnGsjZGG4gs3+;I9efppmE;i1uU>4Z z{0f4J{jEZ>TVY>n!kw(cDFmLUaWycC=0LP(7Y8NAq2`=wP^vDY_*!DEIO4Ae?47cF z>0`lfCo%)LNIGY#Z{V=#(t&*jqq@1uH{eoMzW{3>ZSY?__$scHK+$`K-o2Bl9`9%e zwsM)_fOO6n=^NX>C%(Q63nbnjO{x81*ljB0vc6U?tAA8}zDTaKJ`C3qX=;i3_(ByT z_B-^K%Ha8tB}E79_H%Z|p^8@w8|d{t1KxT_V61M11*drXz3O{;_=No5^y#>zUfd`h z_yX483^V!&*eSD6C-oNDNW8@fsp}WR-x4VoFa`QEo7*j^6a}^->!nJ0q7HR#CVCLn zE2YtK*JgjL7I7p_ifTkg*QQTNqlI|g|uPag3>o>#K+@j$Bxd8p4l=;2Rn5V-2^X6* z6u>4Ux6gjtNHb|wgrdrke5b;;Co&kJza`X%_eIbw#I#+ItHqY2>|>4%?<1!DGYxgP z^`tR<##Ct_Qc46@CQm^Yl4Igqy+ISmDrc&?r)TdD3zORhgYKg<>Tx5}RpKN{o%eKN=(M= z_Y7?Rri>^nDwZv^MG^D(46_2yJBoD$?`sOVhVk2v_-tc5z$$!)QcxFUIq}I(ZDaE6 zj$jXn=grn?h6AL|#@FruQ=GH1I75FXJpBV+~u4xFn8>mdR`8vL2 zDbq65q#JQNE9KpKzxq#%4bmJ>t(nW1_~~&h1WImMH#h1!cBSF>Qat*`12???0!ttZ zh}^M0`qg?){Q=QrBMwSKbZr=FWQ~~zXSlj! z&QVu@*`b_Fu_V-8l@Ih-AT9xQJWthYK*xXb^dox1 zpzNFqX<*8%jD#ZduM@<=OVIwc5?tJ|q!D`~i9 z4A`4UU(3NAL9o~XG}Moxx`wsBO5>v-M{VFncnCve%%IkqB<0TaT)pHO10)PKVLelb z8|>MQHYA|KXV-66hk5eE3<|Cx2auD#19O9#?K$3&yslI6sp%-Jy5hP7V*3f^Vt=AQ6xLW^Z)A`MG`r$lY`&rofu}ZV`2?zWiOT-31X{B2d2&qTV z@`iAzdAbHK)QqzL3z{qjHVpyq@V4Mlt9bgr15T%t_(inv^G$UlVQl4zlWJi=+bfUv z*9o)Bu_H@>%su1?Wh!X6=8RnXmgk6QUh{zYi4M+rd-+jD@TKx8fGrB)0#v*~yXH&? z`BbhXcuRniVyomC%Z6FXsO|7Hlpys2RVTg zB*?0hOn}-97ltmVQvE@oJqO((g)Yh=T{wHw@#teB$<@&qA>DTYNGRfRW019@AT zf_Kr1$Z!)Fv+dLiF!RkwR7e`&&Wl7APjy? zH{iW~9b4m&oSV`xMB7m!t6K#%3wVmG4uG-e3p!N%)=UN_`E~t_{FjDN@fkt@00MwF z;}@o27H_hhHmv?)+E|vM@9ZIYH(^H^TdnIvC;UJ`H2ZF*omc0YTKb1T6@)9YI|-tp zg^>vkdfT8MRcML|w`D%>!ksz0iHNN)hGBHk%y=syefSPROV1;3Tj>s4`H}Z+Sw(U0 z4~x=c-$`tJTxp}!`;bd54jS)xc7+Dg;I;ql`v6|S=dw&=Vwxj<=v%De0~7KK3BvBI z=6VdCgk03{2~odz24ElLO&>qvW$(mHpL4CT`b#LZhcrVayXFUJ9CjoF!X0;YI9%*f z`ugg7FgKYY_DkrAheo>BpD1_}o-`!>a~l1y`;%(zB8^B zqoyr6wDla3suQ73h=D_&S>~$cb1mZ#k@*72CT2}xD&zLpZRYG~tBAP1@)+!F-g`0( z1M%J>p1R#ZY+B{0IEY^DSj+6aP^`*u`g-CzBL1mP2~f?&UjEa+PpiWELY* z0#MqvnHKP?*N|FScmL0zR5MIM&WdFP^=>uksXx0c{UCey8ch-IyP4S=t7So#3W`bK z(3pr7&R0s_`vX-r_Y^HT_mb@Ar9LQc^AxWWB8ufk-VCxeJP2)>48~|NkClqfoE*9P zfa7@vGt$SHUr4kcyV7#p_lCAOZv-)68M(3R4ACLc&4wX5_E?FE?x3u-$ydt<1YUS^ z&aBKL;F@vOd(KaC4V0vuUeW9qotT%R14TL>k^9|KyG=9)Xbc1hlq)jvq&XV=7Rzvj z3ISmXm%-r5yVx*4Oq7jJYy>jK@=XCC!FtmKv_ihhKAu>oH^b&i;k^rZqBz8cj+ZDkH)hQV2XN-)idBM$)>5n! zYkjK9SO7R__=7Q?@X$Hf2HDVZ-&~96Q;NQU8Y@NOZdg@i6u`|cR?ON{jW915mkh1z zgdZ!IMbus{VcEW_yXr_1El34UWAb@`&MJK zOIGG##UC}qCT4Yf3lyvM!wCFM)euKB;kLjK^T8}wFR?;9HQ49&<(*N_-d6zJjvz`# z4Sn}@b(h7luo=3$`j(X1_0{x#6r6ypqq!h}=m;JK0F@L96=Fdt@)|mcu^^K-y6p1y z@S~tAlMx!;2du=d0(f;#^DFT!4v2?)@qwo3Ya8Sa1WAlu_)Az#qt*rOfQ{Ksv6U4( z%xB8H63r#pNFcy6#s%MH_oput1BWsy^uYih4=ZvXfQ)4-_PR@bQ`wv9pF#IcGC{kv z{X&*gu1vgL|lMmU1Fnvw4TbedqHDW#9@Fyp(h+s>)@4cG5$q97o*ei;fHHLPa7J%0Zp`RUqt`jmT6MWCx$dIJsY@uq|j*nY{1 z!y0TI4WSAv^%l!}BKIGL1vQJt^SnLD6dz{c0xRQ-qD?1oWerf)HqvOS*;REY3QZ>B z2&zi^3QH`cNWcfJ{O(B7J;s7%!{|f%KYdu!4nccIsj#xrzvPeEaGJqWdj#()7CouL z2>rr~dOu?Qa*i!iUxb0tkyaVD`#?1hfah%{TMoq^xN@bs37YXqdGA{O8}^VbmJ$Ps z48Fk0(Tx7f4*L8pPeP-y#S{XThe83^UU-C}R6``AfO99XNe@r6^3g>5auF2k46J)Z zDqAJL9D{bn1Nk{GUIndq`=R>`39_XA5O$giggbFBZ-hRz_!WX%2!)rOoKb)HYJay! z4E~2BZvb9_xKcwQl_X z4vKr|{O|Vcu9XqS!Rzya@kteM=oVx3ct0Zl^Pb&`^$ucMcaE_XofNWQ4Tn!L91M zKp@e-etUHme~W5}k%g=L@s|@$2!|I6^m)nVg_vXGMOP1uY7d)YAOgOKIdzCs@`{eB zCjHnXq8I-+Jf*t$@!@yW57QZ`-IPmTL*Fsx`D7CL`8$8cl1h;YrRRqQS6dkOf^_2i zLkE0f^d`md_Z01QjGwOI&cvNzm89LxW4^|yb4+j%@akv%?>PBHDxWFbG5%9(gR5=iC|4c{9Kef|6+<(DX@An(pA12SqO0y5u0c>B$VER?&A|p|g<<4RdI>@COGJUS51dV?usX z?+)Vci~VLXXS{@=gp<#{I`S5{Ewe4^eA2+N`olCe_g;mdq-vXhG{&N(et2c0jCu~v z4z^At46LzQAcioJ0&~lC=J)ci@YZtpM4^lJ27sNs`!obA1-=*E)4NGsW%40$1zs@Y ztA6XfqzTZ%5crvkKp)FqT)Ck7@d5>JpNjU@h6EiK7!v!8;JuAJUS)MrV}ttVuVV-BTZaJf6w`)C270bc&@$dN`*t#~vN{R6OKoIxhj{E3fgh50EV6Oyqq z235dydP9Ga7pq((CidZw*3>zm`Kz5|DHg-?%{yA z>?1LrZ{h(m#nCgT<&Wz>g88;jXGisy16^A?ShjkOJ?X zh`l3BgqsPFshtAxT@2wEcJjr#K?o5%G0?7j(u44mnV+P6-t7NChht&hsCl@C*-!g!o?Q`XwPj)q2_% z)fSKq;F?P9nlzq~mX#C1Gw5^`W1q(?WkU;xEo{W*=LS{}fj~A|`8+6K zPG}X-7zKXJ`1->>88H`*;4j@4>`(+i+`LyR?pt435?%zshppcmiTitNdFi;(O=_v? bxgBY@5%KXhDVueAQ1qo2i}6y{*ZjOI^HwNn literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-repack-01/package/objects/cf842ef3058d3c54d56c0ea3e075efdc77163602b4a1dabcff080e5ea28b9946.wai b/wai/pack-conformance/packs/video-repack-01/package/objects/cf842ef3058d3c54d56c0ea3e075efdc77163602b4a1dabcff080e5ea28b9946.wai new file mode 100644 index 0000000000000000000000000000000000000000..5b4b092ebb2bec1dc52fe1987b91ef15cd29ee73 GIT binary patch literal 2648 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 literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-repack-01/package/objects/f525b4450c29153dde0b43e4d143dfb76fcc3884c607b744c8a53fa6a1728580.wai b/wai/pack-conformance/packs/video-repack-01/package/objects/f525b4450c29153dde0b43e4d143dfb76fcc3884c607b744c8a53fa6a1728580.wai new file mode 100644 index 0000000000000000000000000000000000000000..f91d83f963f2032c6a6f7f40d71290e2af675b0d GIT binary patch literal 1234 zcmZ{h-ERz07{hL{HZy0wHx(<<2sdrq;DYU$IcMxdcekda)V9rr z2oe4PAD2WV(z@Y7f-9mo6&h|-D@uY3^$`(?#JjW1s8lj1Gw1x?=Xu}f%${vKg{L8e ziri6Rb16^)iUVliAq=wdrV}pGezTe=<=GnxOw03pJf}}B4XV3-7O4N1z+=8TO-pmoy-Bd}l0yqCN+uigp D%T*i5 literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-repack-01/package/objects/f7f7f4d6af777bfcce09cdda5ecb754ce6bd8dcd2e03ecfc41359cad989b15f7.wai b/wai/pack-conformance/packs/video-repack-01/package/objects/f7f7f4d6af777bfcce09cdda5ecb754ce6bd8dcd2e03ecfc41359cad989b15f7.wai new file mode 100644 index 0000000000000000000000000000000000000000..ccf6489fc6a4df75c3b252aa792e7bce90cffe23 GIT binary patch literal 2351 zcmZ`(X;c$e7#$WN1+;(|6i~tl0ReMfCOcY1i-L*>xKxmWlUZ;oBr!w*(Karntik~o z+_2alT#tIRTB{z7#ky4Mg4&9rq7}6+)v8pjr^mjT!58__A9Hdh_ulWj_xs+wPezSX zUUb2*61S)}#_%LF&E(}+nK^Sg zE0ZtaB{)S|NF$fW*@__>mQ)BO6y!W5zAzT2%qE(%ab^=|%EjYK@Y$S+hP-Z+W~|&i zhR$KF=6oK_H`_QC!W2O(Npt)9`-1W;>rEX_~^ zsbm&57=YPz>bUA!4vk5Y-j0yT+tgvsvTnkLg(DAg+prKg<0SMNp zVO0dnD7AW$)aW%T6+vpW1~p0RXg#fC^hUkLz*0I|qa$?&B@6VF!N5%AECofhlB5}0tp%jfV9=|TI)c^Hlu<+KU>_PbFfd9&7^ID~ z<}z?0B{*v(^BGuH17h)6c$`unix=W?Dq`WnR8I^eFbwmDj|@Ho-~%^}J%f)w=H&%{ zTqAGiFL20+TQ0uXTKMXXx%PTKbyCHV1#M3jHF$^nCT@Ifo7Zr??uV-Vz2;k1r#)=H zm~|+s@NIEZOtaQuWdF58g@Xm&s(16z37i>ZDw#Sj$ zG1l7K!Gs&Inf=z(6~DQCP|=*zj$b%4={H?N+_ohidm0TfZwa=m>U2cwALYR{K~4Jro$grC$Jf0py?)u1r92cD0Q-e6X(C1EgKT+%le6bB_K~CH{NCbj_zl-NBN&qVP zSf_%&+cW>ljYVw|Bn@zt{I%UFrIBB$dvCukC(yF0qoU>?2h#P2aXxp#S*T?Y3{v9+ zP7SGdUvy`!*~cjj>6vCa+SMQwqtXtC+;4Zu=B)Z_fjI->q-!$lXvSej--Qw;S!F@J zaaYgIna4ifT%YtWd(-F>7`5T573}f6NZ>XOfRch^#Q6K-mOy12y-K zPuMp@r7F&@Cckm5_!)TvD55|-)|!>x_5Gnxu}&}`P)Iv}B+jipeLXPy!&ckMnP^CA zl+KPpLs#}Bk{!sc)|rjhhh~(v?n#i`d(t?4YXv|i^v+ED_Y$HgZ5=J&fF>Q+Gt94s zWp^^O4uHk&6>@)UN5*akTIq0S8h(_Q?;l9m6xi_5LOW_TqGzDX%Rajl(A(Z$%o_kk z)$*%yzzaagTR%+Wl#Z53ho^Q=9%cz&lxVn{+83Si1g!DQc>xxrbJ0N^>*{&k*SX)Q z-Mg-NKDc>eykqD?OG_@&C%OClE0!1ZsVLNViQjs$uy850r^Gm_%enFZ=NFxfoQYBy zCfpMtAmu$za5vXO>WA&xn5N$Dof;J+a-<*?*%S8H9(H&3S@TBaJnSg2^(j5+&#K{@R_;}q@MnsNnVW(UnX)UsJ#kL zES=IhE?4o@D|FXoA$tPl!rsOUM@nzaLf=6)a#qQ&w4>_6z( BnjioG literal 0 HcmV?d00001 diff --git a/wai/pack-conformance/packs/video-repack-01/package/package.receipt.json b/wai/pack-conformance/packs/video-repack-01/package/package.receipt.json new file mode 100644 index 000000000..695ca2459 --- /dev/null +++ b/wai/pack-conformance/packs/video-repack-01/package/package.receipt.json @@ -0,0 +1 @@ +{"asset_id":"video-repack-01","components":[{"id":"v","index":"index-v.wsix","index_digest":"df4e5e68edf28f11f0ba914f92f05d3d3dcdd4e5c2c808175e3aa45694a45592","media_class":"video","stage_root":"56ff2237e4654a894ebefb9d0588092806b71c58ee502aa43624bba633cd4bf2"}],"energy_provenance":null,"grant":{"capability":"wai.video.package","funds_ceiling":null,"grant_hash":"0000000000000000000000000000000000000000000000000000000000000000","joule_ceiling_micro":null},"joules_micro":0,"kind":"package","packager":"builtin:wai-pack@0.1.0","parent_kind":"re-pack","parent_receipt_hash":"22c6f558063499040127d58b062f08f9ec2a6cee54b51c97d42e8741d76ad728","policy_digest":"21db788ba0009de8df8a540d30841d707e18fbbd68b5bcc1ca6b998ff1c05008","receipt_hash":"82efcb204fb9f2be928a9217a2c39c55b8ccbc6345664c435bb44e22072bfed4","sig":"1d69fa0993386204d349f55f0a53499c2dcb7cde762f1d66e46ddd01e69d15e0f91b01404732e2cc4ab7f08be3ff86d5550070c7ca55477dec746e1c73268109","signer_id":"did:key:z6MkgBeQ3WGF1Gc5juV274JXu3VfVACXK93TwQY57g5jVYbx","signer_pubkey":"19b75ae888e816033d1436d72002d1a375ca87444efbb150d6cc2b32c8ef5f87","stored_bytes":127966,"total_bytes":140530,"total_entries":15,"unique_objects":12,"version":2,"work_units":15} \ No newline at end of file diff --git a/wai/pack-conformance/packs/video-repack-01/package/plan-v.txt b/wai/pack-conformance/packs/video-repack-01/package/plan-v.txt new file mode 100644 index 000000000..c7196c34c --- /dev/null +++ b/wai/pack-conformance/packs/video-repack-01/package/plan-v.txt @@ -0,0 +1,5 @@ +0 +60 +85 +135 +160 diff --git a/wai/pack-conformance/packs/video-repack-01/package/policy.json b/wai/pack-conformance/packs/video-repack-01/package/policy.json new file mode 100644 index 000000000..98fbb8714 --- /dev/null +++ b/wai/pack-conformance/packs/video-repack-01/package/policy.json @@ -0,0 +1 @@ +{"asset_id":"video-repack-01","class":[{"floor_only":false,"id":"tv","max_layer":0},{"floor_only":false,"id":"mobile","max_kbps":100,"max_layer":0},{"floor_only":true,"id":"legacy","max_layer":0}],"classify":{"motion_high_milli":9000,"static_mad_milli":300,"static_permille":5,"synthetic_bins":12},"component":[{"id":"v","media":"video","source":"video-base-01.y4m","timebase":{"den":1,"num":25}}],"defaults":{"deadline_ms":1500},"floor":{"extra_keyframes":false,"supplied_listing":"d795df9202fb5f32fe168aa585332a5694ad7d8d7e8b859fc7d57a791f08c990"},"ladder":[{"capability":"wai.video.int_motion","component":"v","id":"b0","params":{"block":16,"max_sse_px_milli":30000,"mv_precision":1,"q_candidates":[16,12,8],"search":4},"role":"base"},{"capability":"wai.video.av1","component":"v","id":"hi","params":{"source":"supplied"},"role":"floor"},{"capability":"wai.video.av1","component":"v","id":"lo","params":{"source":"supplied"},"role":"floor"}],"lead":"v","live":{"layer_lag_ms":[0]},"moment":[],"royalty_free_only":true,"rule":[],"schema":"wai.pack.policy/1","segmentation":{"closed":true,"cut_abs_permille":300,"cut_rel_permille":3000,"cut_window":8,"lookahead_frames":6,"max_ms":4000,"min_ms":1000,"scene_cut":"wai.pack.scenecut/1","target_ms":2000}} \ No newline at end of file diff --git a/wai/pack-conformance/packs/video-repack-01/package/policy.toml b/wai/pack-conformance/packs/video-repack-01/package/policy.toml new file mode 100644 index 000000000..4492ee643 --- /dev/null +++ b/wai/pack-conformance/packs/video-repack-01/package/policy.toml @@ -0,0 +1,54 @@ +schema = "wai.pack.policy/1" +asset_id = "video-repack-01" +royalty_free_only = true +lead = "v" + +[[component]] +id = "v" +media = "video" +source = "video-base-01.y4m" + +[component.timebase] +num = 25 +den = 1 + +[segmentation] +target_ms = 2000 +min_ms = 1000 +max_ms = 4000 + +[[ladder]] +id = "b0" +component = "v" +capability = "wai.video.int_motion" +role = "base" +params = { block = 16, search = 4, mv_precision = 1, q_candidates = [16, 12, 8], max_sse_px_milli = 30000 } + +[[ladder]] +id = "hi" +component = "v" +capability = "wai.video.av1" +role = "floor" +params = { source = "supplied" } + +[[ladder]] +id = "lo" +component = "v" +capability = "wai.video.av1" +role = "floor" +params = { source = "supplied" } + +[floor] +supplied_listing = "d795df9202fb5f32fe168aa585332a5694ad7d8d7e8b859fc7d57a791f08c990" + +[[class]] +id = "tv" +max_layer = 0 + +[[class]] +id = "mobile" +max_kbps = 100 + +[[class]] +id = "legacy" +floor_only = true diff --git a/wai/pack-conformance/packs/video-repack-01/package/stages/legacy.json b/wai/pack-conformance/packs/video-repack-01/package/stages/legacy.json new file mode 100644 index 000000000..171fd7b89 --- /dev/null +++ b/wai/pack-conformance/packs/video-repack-01/package/stages/legacy.json @@ -0,0 +1 @@ +{"class":"legacy","components":{"v":{"pieces":[{"dur":60,"floor_only":true,"p":0,"stages":[],"start":0},{"dur":25,"floor_only":true,"p":1,"stages":[],"start":60},{"dur":50,"floor_only":true,"p":2,"stages":[],"start":85},{"dur":25,"floor_only":true,"p":3,"stages":[],"start":135},{"dur":40,"floor_only":true,"p":4,"stages":[],"start":160}]}},"policy_digest":"21db788ba0009de8df8a540d30841d707e18fbbd68b5bcc1ca6b998ff1c05008"} diff --git a/wai/pack-conformance/packs/video-repack-01/package/stages/mobile.json b/wai/pack-conformance/packs/video-repack-01/package/stages/mobile.json new file mode 100644 index 000000000..09649ed2c --- /dev/null +++ b/wai/pack-conformance/packs/video-repack-01/package/stages/mobile.json @@ -0,0 +1 @@ +{"class":"mobile","components":{"v":{"media_playlist":"../hls/mobile/wai-v.m3u8","pieces":[{"dur":60,"floor_only":true,"p":0,"stages":[],"start":0},{"dur":25,"p":1,"stages":[{"bytes":9950,"h":"61c7c3b7ccab07ed01df5b0d7ca0240598b914dbf2cabe545aa001e8de12d365","layer":0}],"start":60},{"dur":50,"floor_only":true,"p":2,"stages":[],"start":85},{"dur":25,"p":3,"stages":[{"bytes":9950,"h":"61c7c3b7ccab07ed01df5b0d7ca0240598b914dbf2cabe545aa001e8de12d365","layer":0}],"start":135},{"dur":40,"floor_only":true,"p":4,"stages":[],"start":160}]}},"policy_digest":"21db788ba0009de8df8a540d30841d707e18fbbd68b5bcc1ca6b998ff1c05008"} diff --git a/wai/pack-conformance/packs/video-repack-01/package/stages/tv.json b/wai/pack-conformance/packs/video-repack-01/package/stages/tv.json new file mode 100644 index 000000000..30815e7af --- /dev/null +++ b/wai/pack-conformance/packs/video-repack-01/package/stages/tv.json @@ -0,0 +1 @@ +{"class":"tv","components":{"v":{"media_playlist":"../hls/tv/wai-v.m3u8","pieces":[{"dur":60,"p":0,"stages":[{"bytes":39826,"h":"24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d","layer":0}],"start":0},{"dur":25,"p":1,"stages":[{"bytes":9950,"h":"61c7c3b7ccab07ed01df5b0d7ca0240598b914dbf2cabe545aa001e8de12d365","layer":0}],"start":60},{"dur":50,"p":2,"stages":[{"bytes":35882,"h":"c2ce1907255a041c388afd06ccd007436368e8d20467fdec2a1eebbb84b03bf2","layer":0}],"start":85},{"dur":25,"p":3,"stages":[{"bytes":9950,"h":"61c7c3b7ccab07ed01df5b0d7ca0240598b914dbf2cabe545aa001e8de12d365","layer":0}],"start":135},{"dur":40,"p":4,"stages":[{"bytes":25514,"h":"618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481","layer":0}],"start":160}]}},"policy_digest":"21db788ba0009de8df8a540d30841d707e18fbbd68b5bcc1ca6b998ff1c05008"} diff --git a/wai/pack-conformance/packs/video-repack-01/parent b/wai/pack-conformance/packs/video-repack-01/parent new file mode 100644 index 000000000..07b23b316 --- /dev/null +++ b/wai/pack-conformance/packs/video-repack-01/parent @@ -0,0 +1 @@ +video-base-01 diff --git a/wai/pack-conformance/packs/video-repack-01/policy.toml b/wai/pack-conformance/packs/video-repack-01/policy.toml new file mode 100644 index 000000000..4492ee643 --- /dev/null +++ b/wai/pack-conformance/packs/video-repack-01/policy.toml @@ -0,0 +1,54 @@ +schema = "wai.pack.policy/1" +asset_id = "video-repack-01" +royalty_free_only = true +lead = "v" + +[[component]] +id = "v" +media = "video" +source = "video-base-01.y4m" + +[component.timebase] +num = 25 +den = 1 + +[segmentation] +target_ms = 2000 +min_ms = 1000 +max_ms = 4000 + +[[ladder]] +id = "b0" +component = "v" +capability = "wai.video.int_motion" +role = "base" +params = { block = 16, search = 4, mv_precision = 1, q_candidates = [16, 12, 8], max_sse_px_milli = 30000 } + +[[ladder]] +id = "hi" +component = "v" +capability = "wai.video.av1" +role = "floor" +params = { source = "supplied" } + +[[ladder]] +id = "lo" +component = "v" +capability = "wai.video.av1" +role = "floor" +params = { source = "supplied" } + +[floor] +supplied_listing = "d795df9202fb5f32fe168aa585332a5694ad7d8d7e8b859fc7d57a791f08c990" + +[[class]] +id = "tv" +max_layer = 0 + +[[class]] +id = "mobile" +max_kbps = 100 + +[[class]] +id = "legacy" +floor_only = true diff --git a/wai/pack-conformance/policy_diff.py b/wai/pack-conformance/policy_diff.py index 9f01e22cf..f785cbfd4 100644 --- a/wai/pack-conformance/policy_diff.py +++ b/wai/pack-conformance/policy_diff.py @@ -125,6 +125,11 @@ def random_policy(rng): body = [] for c in comps: body += ["[[component]]", f'id = "{c}"', "media = " + val(q + biased(["video", "audio", "bogus"]) + q)] + # §7.8's profile and a source, which a floor-only component may not have. + if rng.random() < 0.15: + body.append("profile = " + val(q + biased(["floor-only", "bogus"]) + q)) + if rng.random() < 0.1: + body.append('source = "v.y4m"') if rng.random() > 0.05: num, den = val(str(biased([25, 0, 48000, 4294967295, 16777216]))), val(str(biased([1, 1001, 0, 600]))) body.append("timebase = { num = " + num + ", den = " + den + " }") @@ -147,6 +152,13 @@ def random_policy(rng): body.append(f'refines = "{rng.choice(rungs + ["nope"])}"') if rng.random() < 0.5: body.append("params = " + biased(PARAMS)) + if rng.random() < 0.3: + # §7.7's form of a supplied floor, and the floor's other members. + body.append("[floor]") + if rng.random() < 0.6: + body.append("supplied_form = " + val(q + biased(["cmaf", "obu"]) + q)) + if rng.random() < 0.4: + body.append("extra_keyframes = " + val(biased(["true", "false"]))) if rng.random() < 0.3: body += ["[live]", "layer_lag_ms = " + biased(["[0]", "[0, 200]", "[0, 200, 400]", "[1]", "[0, 100, 50]"])] for i in range(biased([0, 0, 1, 2])): diff --git a/wai/pack-conformance/staged-mutations/expected.json b/wai/pack-conformance/staged-mutations/expected.json index cbdafd185..9393a597f 100644 --- a/wai/pack-conformance/staged-mutations/expected.json +++ b/wai/pack-conformance/staged-mutations/expected.json @@ -1,6 +1,11 @@ { "pack": "video-staged-01", "cases": [ + { + "name": "ok", + "reason": "ok", + "remove": [] + }, { "name": "refinement-deadline", "reason": "index-policy-mismatch", diff --git a/wai/pack-conformance/supplied_cmaf.py b/wai/pack-conformance/supplied_cmaf.py new file mode 100644 index 000000000..b10f7bc50 --- /dev/null +++ b/wai/pack-conformance/supplied_cmaf.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python3 +"""Write a golden's supplied floor in the CMAF form (extensions/packaging.md §7.7) from +another golden's supplied floor in the OBU form (§7.3). + +A CMAF floor is a ladder's own initialization segment and media segments, as a media +muxer wrote them, so this golden's are written by one: each `.obu` of the source +golden's floor is muxed, without re-encoding (`-c copy`), by ffmpeg's HLS muxer into fMP4 +segments, cutting at every key frame (`-hls_time` of one frame), so each media segment +holds one piece of the plan; its `init.mp4` and `seg_.m4s` files, `` four digits, are +`floor//`. The policy's `floor.supplied_listing` is set to the SHA-256 of the floor +directory's listing (SPEC §3.1), which `wai-pack listing` prints. + +A muxer is not a pure function of its input across versions, so the files are committed +and pinned by the listing: a packer reads them and checks them against the plan, and +never writes them. This script is how the committed files were written, not a step of +verification. + + python3 supplied_cmaf.py > > +""" +import hashlib +import os +import re +import shutil +import subprocess +import sys +import tempfile + + +def main(argv): + if len(argv) != 6: + print(__doc__) + return 2 + ffmpeg, wai_pack, src, dst, rate = argv[1:] + num, den = (int(x) for x in rate.split("/")) + floor_in, floor_out = os.path.join(src, "floor"), os.path.join(dst, "floor") + if os.path.isdir(floor_out): + shutil.rmtree(floor_out) + os.makedirs(floor_out) + for f in sorted(os.listdir(floor_in)): + if not f.endswith(".obu"): + continue + name = f[:-len(".obu")] + with tempfile.TemporaryDirectory() as tmp: + subprocess.run([ffmpeg, "-nostdin", "-v", "error", "-f", "obu", "-framerate", f"{num}/{den}", + "-i", os.path.join(floor_in, f), "-c", "copy", "-f", "hls", "-hls_time", f"{den / num:.6f}", + "-hls_segment_type", "fmp4", "-hls_fmp4_init_filename", "init.mp4", + "-hls_segment_filename", os.path.join(tmp, "seg_%04d.m4s"), "-hls_playlist_type", "vod", + os.path.join(tmp, "index.m3u8")], check=True) + out = os.path.join(floor_out, name) + os.makedirs(out) + for g in sorted(os.listdir(tmp)): + if g == "init.mp4" or g.endswith(".m4s"): + shutil.copyfile(os.path.join(tmp, g), os.path.join(out, g)) + print(f"{out}: {sorted(os.listdir(out))}") + listing = hashlib.sha256(subprocess.run([wai_pack, "listing", floor_out], check=True, capture_output=True).stdout).hexdigest() + p = os.path.join(dst, "policy.toml") + policy = open(p, encoding="utf-8").read() + open(p, "w", encoding="utf-8").write(re.sub(r'supplied_listing = "[0-9a-f]{64}"', f'supplied_listing = "{listing}"', policy)) + print(f"listing {listing}") + return 0 + + +if __name__ == "__main__": + sys.exit(main(sys.argv)) diff --git a/wai/pack-conformance/supplied_floor.py b/wai/pack-conformance/supplied_floor.py index d01635825..02e58eb52 100644 --- a/wai/pack-conformance/supplied_floor.py +++ b/wai/pack-conformance/supplied_floor.py @@ -6,10 +6,14 @@ from the fixture generator and nothing else. This script states how it was made: 1. `wai-pack fixture gen ` writes the fixture the policy's component names; 2. `wai-pack plan` cuts it with the policy and writes the keyframe plan (§7.3); -3. each piece is coded alone by an AV1 encoder (`aomenc`, one pass, constant quality, no - lag and no alternate reference, so each temporal unit holds one shown frame, and no - key frame but the piece's first), in the low-overhead OBU format; -4. the pieces' streams, concatenated in order, are `floor/.obu`; +3. for each floor rung of the policy, in ladder order, each piece is coded alone by an AV1 + encoder (`aomenc`, one pass, constant quality, no lag and no alternate reference, so + each temporal unit holds one shown frame, and no key frame but the piece's first), in + the low-overhead OBU format; a rung given `--scale =` codes the fixture with + its width and height divided by d, each sample the mean of its d × d block, rounded + half up, and `--cq =` sets its quality (40 by default); +4. each rung's pieces' streams, concatenated in order, are `floor/.obu`: the + component's id when it has one floor rung, the rung's id when it has several (§7.1); 5. the policy's `floor.supplied_listing` is set to the SHA-256 of the floor directory's listing (SPEC §3.1), which `wai-pack listing` prints. @@ -19,6 +23,7 @@ never encodes it. This script is how the committed stream was written, not a ste verification. python3 supplied_floor.py directory> [aomenc] + [--scale =]... [--cq =]... """ import os import re @@ -46,45 +51,101 @@ def frames_of(y4m): return head, out +def scaled(head, frames, d): + """The frames with width and height divided by d: each sample of each plane the mean + of its d x d block, rounded half up (4:2:0, so the chroma planes are halved too).""" + if d == 1: + return head, frames + w = int(re.search(rb" W(\d+)", head).group(1)) + h = int(re.search(rb" H(\d+)", head).group(1)) + if w % (2 * d) or h % (2 * d): + raise SystemExit(f"{w}x{h} does not divide by {2 * d}") + cw, ch = (w + 1) // 2, (h + 1) // 2 + + def plane(b, pw, ph): + out = bytearray() + for y in range(0, ph, d): + for x in range(0, pw, d): + t = sum(b[(y + j) * pw + x + i] for j in range(d) for i in range(d)) + out.append((2 * t + d * d) // (2 * d * d)) + return bytes(out) + out = [] + for f in frames: + line_end = f.index(b"\n") + 1 + body = f[line_end:] + y, u, v = body[:w * h], body[w * h:w * h + cw * ch], body[w * h + cw * ch:] + out.append(f[:line_end] + plane(y, w, h) + plane(u, cw, ch) + plane(v, cw, ch)) + head = re.sub(rb" W\d+", b" W%d" % (w // d), head) + head = re.sub(rb" H\d+", b" H%d" % (h // d), head) + return head, out + + +def floor_rungs(policy): + """The policy's floor rungs, in ladder order.""" + out = [] + for block in re.split(r"\n(?=\[)", policy): + if block.startswith("[[ladder]]") and re.search(r'role = "floor"', block): + out.append(re.search(r'id = "([^"]+)"', block).group(1)) + return out + + def main(argv): - if len(argv) < 3: + opts = {"--scale": {}, "--cq": {}} + rest = [] + it = iter(argv[1:]) + for a in it: + if a in opts: + k, v = next(it).split("=") + opts[a][k] = int(v) + else: + rest.append(a) + if len(rest) < 2: print(__doc__) return 2 - wai_pack, pack = argv[1], os.path.abspath(argv[2]) - aomenc = argv[3] if len(argv) > 3 else "aomenc" + wai_pack, pack = rest[0], os.path.abspath(rest[1]) + aomenc = rest[2] if len(rest) > 2 else "aomenc" policy_path = os.path.join(pack, "policy.toml") policy = open(policy_path, encoding="utf-8").read() comp = re.search(r'\[\[component\]\]\s*id = "([^"]+)"', policy).group(1) source = re.search(r'source = "([^"]+)\.y4m"', policy).group(1) + rungs = floor_rungs(policy) + names = [comp] if len(rungs) == 1 else rungs + floor = os.path.join(pack, "floor") with tempfile.TemporaryDirectory() as tmp: src = os.path.join(tmp, "source.y4m") run(wai_pack, "fixture", "gen", source, "-o", src) plan = os.path.join(tmp, "plan.txt") run(wai_pack, "plan", "--policy", policy_path, "--component", comp, "--source", src, "--out", plan) starts = [int(x) for x in open(plan).read().split()] - head, frames = frames_of(open(src, "rb").read()) - bounds = starts + [len(frames)] - stream = b"" - for k, (a, b) in enumerate(zip(bounds, bounds[1:])): - piece = os.path.join(tmp, f"p{k}.y4m") - with open(piece, "wb") as f: - f.write(head + b"".join(frames[a:b])) - out = os.path.join(tmp, f"p{k}.obu") - run(aomenc, "--obu", f"--limit={b - a}", "--passes=1", "--lag-in-frames=0", "--auto-alt-ref=0", - "--kf-min-dist=0", f"--kf-max-dist={b - a}", "--end-usage=q", "--cq-level=40", "--cpu-used=6", - "--threads=1", "--row-mt=0", "-q", "-o", out, piece) - stream += open(out, "rb").read() - floor = os.path.join(pack, "floor") + head0, frames0 = frames_of(open(src, "rb").read()) + bounds = starts + [len(frames0)] + streams = {} + for rung, name in zip(rungs, names): + head, frames = scaled(head0, frames0, opts["--scale"].get(rung, 1)) + stream = b"" + for k, (a, b) in enumerate(zip(bounds, bounds[1:])): + piece = os.path.join(tmp, f"{rung}-p{k}.y4m") + with open(piece, "wb") as f: + f.write(head + b"".join(frames[a:b])) + out = os.path.join(tmp, f"{rung}-p{k}.obu") + run(aomenc, "--obu", f"--limit={b - a}", "--passes=1", "--lag-in-frames=0", "--auto-alt-ref=0", + "--kf-min-dist=0", f"--kf-max-dist={b - a}", "--end-usage=q", f"--cq-level={opts['--cq'].get(rung, 40)}", + "--cpu-used=6", "--threads=1", "--row-mt=0", "-q", "-o", out, piece) + stream += open(out, "rb").read() + streams[name] = stream os.makedirs(floor, exist_ok=True) - for name in os.listdir(floor): - os.remove(os.path.join(floor, name)) - with open(os.path.join(floor, f"{comp}.obu"), "wb") as f: - f.write(stream) + for n in os.listdir(floor): + os.remove(os.path.join(floor, n)) + for name, stream in streams.items(): + with open(os.path.join(floor, f"{name}.obu"), "wb") as f: + f.write(stream) import hashlib listing = hashlib.sha256(run(wai_pack, "listing", floor)).hexdigest() policy = re.sub(r'supplied_listing = "[0-9a-f]{64}"', f'supplied_listing = "{listing}"', policy) open(policy_path, "w", encoding="utf-8").write(policy) - print(f"{floor}/{comp}.obu: {len(stream)} bytes, {len(frames)} frames, key frames at {starts}; listing {listing}") + for name, stream in streams.items(): + print(f"{floor}/{name}.obu: {len(stream)} bytes, {len(frames0)} frames, key frames at {starts}") + print(f"listing {listing}") return 0 diff --git a/wai/research/cross-fabric.md b/wai/research/cross-fabric.md new file mode 100644 index 000000000..735b5d8f7 --- /dev/null +++ b/wai/research/cross-fabric.md @@ -0,0 +1,339 @@ +# WAI across fabrics: research for the packer and the verifiers + +> **Status.** Research note, informative, not normative. It records what decided the change +> that lets each step of a WAI pack or verify run on the fabric that does it with the least +> measured energy (the CPU, a GPU, a hardware media engine, or a neural processor): +> [packaging](../extensions/packaging.md) §11.6, [jwp-receipts](../extensions/jwp-receipts.md) +> §2.4.8 and [energy-measurement](../extensions/energy-measurement.md) §6.3. Nothing here changes +> a byte of a package or a verdict. + +**Method.** Every statement about an interface or a specification was checked against that +document on 2026-10-22. Items marked **[measured]** were run for this note (the setup is in §9); +items marked **[local]** were read from the platform's SDK headers on the machine that ran them. +Exact counts and digests are exact. Times and energies are indicative: each table in §9 is **one +run**, on a shared host whose load is given, and none is a sample of anything. + +## 1. The hardware the measurements ran on + +Hardware is named as the rest of the repository names it: by architecture, PCI vendor and device +id, and operating-system version. + +- **arm64 desktops** (macOS 27.0.1), each with an integrated GPU and a media engine that decodes + AV1 in hardware and encodes no AV1. The measurements of §9 ran on one of them, shared with other + work. Every one reports the platform's current GPU interface. +- **A Windows x86_64 host** with an integrated GPU of PCI vendor 0x8086, device 0x9a49, and a + discrete GPU of PCI vendor 0x10de, device 0x1f15. Its vendor's published support matrix gives + that discrete GPU's architecture neither AV1 decode nor AV1 encode; the integrated GPU decodes + AV1, with a film-grain path its vendor does not state as bit-exact (§6.1). +- **Linux x86_64 hosts** with GPUs of PCI vendor 0x10de, device 0x28e1, of vendor 0x8086, device + 0xa7a0, and of vendor 0x1002, device 0x1586, as determinism-tiers §5 records them. Their media + engines were not probed for this note. + +## 2. The steps, and the fabrics that can run each + +| Step | CPU | GPU | Media engine | Neural processor | Placed on | +|---|---|---|---|---|---| +| `source-decode` (a coded source to frames, before a pack) | dav1d | | AV1 decode where the engine has it | | either, on equal pictures (§6) | +| `source-read`, `segment` | yes | | | | CPU (sequential, cheap) | +| `base-search` (the integer motion search) | reference | exact integer kernel | none: no engine runs §5.5's search, and the platform's hardware motion estimation is not it (§3) | unsound (FP16, §5) | GPU where it qualifies | +| `base-code`, `refine-code` (residuals, rANS) | reference | | none: no engine codes `WIV1` or `WIR1` | | CPU (rANS is sequential) | +| `sse` | reference | exact (partial sums under 2^32) | | unsound | by measured cost | +| `object-hash` (BLAKE3) | reference | exact (chunks on the device, parents on the host) | | | by measured cost | +| `digest` (SHA-256) | yes | no: one message is one chain (FIPS 180-4 §6.2.2) | | | CPU | +| `floor-read` (AV1 and CMAF structure) | yes | | | | CPU | +| `floor-decode` | dav1d | | AV1 decode, as above | | informative only (§6.3) | +| `index`, `io` | yes | | | | CPU | + +What this decides: the GPU takes the one step that dominates a pack's work, the motion search (at +least 96.8% of the CPU-only pack's CPU time in the run of §9.2), plus SSE and BLAKE3 where the +measured cost says so, which on the host of §9 it does not (§9.3). No hardware encoder computes any +WAI step. The media engine decodes AV1 sources and floors. The neural processor computes nothing +exact. + +## 3. Media engines + +- **AV1 decode, and no AV1 encode, on the arm64 desktops.** Every published specification of their + media engines lists AV1 decode and no AV1 encode, and the platform's compression headers name no + AV1 encoder **[local]**. ffmpeg's encoders for the platform's framework cover H.264, HEVC and + ProRes only. +- **What the decode needs.** A decode session takes the sequence header OBU from an `av1C` record; + a low-overhead OBU stream (`-f obu`) gives it none up front, so it does not decode there, while + the ladder's CMAF (with `av1C`) does **[measured]**. The reference tool therefore decodes floors + from the package's CMAF files. +- **What it gives back [measured]** (ffmpeg 9.0.2, macOS 27.0.1): + - The ladder of §9 is AV1 Main profile, **10-bit** (each rung's `av1C`). The engine's hardware + frames are P010; a download as 8-bit NV12 is refused. + - Its raw P010 frames equal, frame by frame, dav1d's planar 10-bit output repacked to P010. But + ffmpeg's P010-to-8-bit conversion of them does not equal dav1d's own 10-to-8-bit conversion: + that conversion rounds and dithers, so a comparison stays at the stream's bit depth or + converts exactly. + - Earlier comparisons hashed `-f framemd5` outputs with stderr piped into the hash; the + "difference" they showed was ffmpeg's error text. Every comparison in §9 hashes the output + file, not the console. +- **Hardware motion estimation.** The platform offers a motion-estimation session returning 4×4 or + 16×16 vectors, and documents neither the engine, its cost metric, its search window nor its + determinism. It cannot compute §5.5's normative search. +- **Other platforms.** One vendor's published support matrix gives AV1 decode from one GPU + generation and AV1 encode from a later one, and states that its decoder runs independently of + the compute engine. Another's media driver decodes AV1 from its twelfth graphics generation, in + its full-feature build. A third's kernel driver decodes AV1 on its third video-core generation + and encodes from its fourth. Vulkan defines `VK_KHR_video_decode_av1` from Vulkan 1.3.277 and + `VK_KHR_video_encode_av1` from 1.3.302. + +## 4. GPU compute + +- **WGSL integer semantics** (WGSL, W3C Candidate Recommendation Draft): `i32` operations "use + two's complement arithmetic and have defined overflow behavior"; `>>` on a signed value inserts + copies of the sign bit (§8.10); an integer division by zero evaluates to `e1` (§8.8); an + out-of-bounds access is a dynamic error the implementation does not perform as written (§6.5.7). + So a WGSL kernel that keeps every value inside its type and every index inside its buffer has + one result on every conformant device. The WAI kernels do: a block's cost is at most + `block² · 765`, refused on the host where that passes 2^32 − 1. What a translator does with the + cases WGSL defines and its target languages do not is determinism-tiers §5's subject. +- **The backend languages.** MSL leaves signed integer overflow undefined and its atomics relaxed, + so only commutative integer reductions are order-free there. The WAI kernels use no atomics: + each block's minimum is a tree reduction over a total order, so it does not depend on which + thread visits which candidate. +- **BLAKE3 on GPUs.** The specification splits input into 1 KiB chunks hashed independently. + Published GPU ports measured slower than one CPU core on a discrete GPU, or than eight CPU + threads on an integrated one, and none reported energy. Measured here in §9.3. + +## 5. Neural processors + +The neural processor of the arm64 desktops computes in FP16, which the platform's machine-learning +framework can permit but not require, and its documentation states that its capabilities differ by +hardware and software generation. FP16 represents integers exactly only up to 2048, and one 8-bit +squared difference is 65025. **No WAI step can run on it.** The fabric term is `npu`, the term +determinism-tiers uses for `wai-ops/1-npu`. + +## 6. Determinism and conformance + +### 6.1 AV1 decoding is exact, film grain aside + +AV1 Bitstream & Decoding Process Specification, Version 1.0.0 with Errata 1, §7.2: "When +film_grain_params_present is equal to 0, decoders shall produce output frames that are identical +in all respects and have the same output order as those produced by the decoding process +specified herein." With film grain, a conformant decoder may instead match only the pre-grain +frames of §7.18.2 and add grain with no "perceptually significant differences". dav1d states that +it passes the AV1 conformance streams with grain on. One GPU vendor's media driver states that its +film-grain path does not guarantee a bit match, and AV1 decode defects have been fixed in more than +one vendor's driver. + +**Tested [measured]:** the media engine decoded each rung of the ladder of §9, and its pictures +were compared with dav1d's (§9.1). The ladder carries no film grain: dav1d gives the same frames +with grain applied and with it exported. + +### 6.2 Hardware encoders are not reproducible + +No vendor states that its hardware encoder is deterministic. One vendor's encoder guide documents +split-frame encoding that turns on with the number of engines and the frame height, and another's +low-power AV1 rate control runs in firmware. Software encoders are reproducible only under pinned +conditions. + +### 6.3 What it means for WAI + +- **Receipts.** A package's bytes do not depend on where its steps ran, because every step is + integer and the GPU kernels compute the same integers: the receipt, the index and every object + are the CPU's (§9.1). Where the steps ran is recorded only in a metered package's measurement + claim, which §11.2 already exempts, so an unmetered package records nothing machine-specific. +- **§11.2 on non-deterministic hardware.** No WAI step may be computed by a hardware encoder. A + floor a packager is given is an input; a floor encoded on a hardware encoder is one §7.5 covers, + and §11.2 does not hold its bytes. +- **Verifiers' independence.** A check whose expected value the package states (an object's + content hash) may run anywhere: a match shows the fabric computed it, and a mismatch is computed + again on the CPU before it is reported. A floor states no decoded-output digest, so a hardware + decode never decides a floor verdict, and a hardware decoder may conceal an error that dav1d + reports. The Python verifier stays on the CPU and shares no code with wai-rs; the GPU path is + wai-pack's. + +## 7. Measuring energy per fabric without privileges + +### 7.1 macOS 27 + +- **IOReport** is a private interface (the SDK ships a stub and no header **[local]**). On macOS 27 + its Energy Model CPU and neural-processor channels stay visible and stop updating for a reader + without a private entitlement. **[measured]** on the host of §9: of 645 Energy Model channels, + only `GPU Energy` (nJ) moved over a 6 s span during a hardware decode, a dav1d decode and idle; + the CPU, per-core, neural-processor, video-encoder, memory and display channels read zero, and + there is no decoder energy channel. So **the media engine and the neural processor have no + unprivileged counter there**; a privileged sampler reads the neural processor, and nothing in + this change runs privileged. +- **CPU, per process:** `proc_pid_rusage(RUSAGE_INFO_V6)` gives the kernel's account of the task's + own CPU energy (`ri_energy_nj`) and the energy it billed to the task and serviced for others + (`ri_billed_energy`, `ri_serviced_energy`), readable for one's own process or a child. A task's + `task` share is `ri_energy_nj + ri_billed_energy − ri_serviced_energy`, the definition the + sink-metering profiles use, so energy a system service spent for the process is in it. Other + load on the host enters it only through contention. +- **GPU, per process:** the accelerator's user clients in the I/O registry carry each creator's pid + and its accumulated GPU time (ns), readable by any process **[measured]**. The repository's own + measurement found that dividing the shared rail by GPU time charged a decode 3 to 15 times its own + GPU energy, and that a client disappears with its process. So the rail is attributed to a process + only when it was the rail's sole user: the clients are sampled every 200 ms through the span, each + client's GPU time differenced between samples, and the span refused when a client vanishes, a + difference is negative, or the process held under 99% of the GPU time the samples saw. The rail + is then sealed whole, its idle and static draw over the span included, never divided by busy + time. The rail holds a reading for hundreds of milliseconds and then catches up in one step, so + it is read on its next republish at each end, inside the sampled window. + +### 7.2 Linux and Windows (not run here) + +- RAPL's `energy_uj` became root-only in Linux 5.10, and perf's RAPL events are system-wide only, + so reading CPU energy there takes an owner's act (`cap_perfmon`, or a group-readable + `energy_uj`). +- NVML's total-energy query (mJ) is not marked as needing privilege; the in-kernel hwmon power and + energy attributes of two other GPU drivers are world-readable. +- Windows' Energy Meter Interface is readable unelevated. + +## 8. The design choices, and what decided them + +| Choice | Decided by | +|---|---| +| The GPU computes the motion search, SSE and BLAKE3 chunks, in WGSL integer kernels through wgpu, not in one platform's shading language | WGSL's defined integer arithmetic (§4) gives one result on every conformant device; the repository's GPU precedent (`wai-ops-gpu`) is wgpu. Exactness is claimed only on the adapters a run showed (`wai-pack-gpu`'s crate documentation lists them), with qualification at open as the runtime gate | +| A backend runs a step only after it gives the reference's output on qualifying inputs; any call it cannot take runs on the CPU | §11.2 must hold on every fabric; a device or driver can be wrong (§6.1's driver defects) | +| Placement by a measured cost table (µJ per call + nJ per unit), the CPU on a tie or where unmeasured | **[measured]** the GPU's fixed cost per call (1.7 mJ for a hash, 3.1 mJ for an SSE) exceeds what a pack's calls save, while the search saves 14× per unit (§9.3); placing by fabric alone made the floor-only pack dearer (§9.2) | +| The fabric record lives in the measurement claim, not the receipt | the receipt and `LISTING` would otherwise differ by machine, voiding §11.2 for every package; the claim is already §11.2's exemption | +| `fabrics` is absent rather than `null` | every existing claim, and every package that carries one, keeps its bytes | +| Attributions `task` and `rail` only; a `rail` share is the whole rail, sealed only for its sole user | the repository's measurement of a 3–15× overcharge from dividing by busy time (§7.1) | +| The figure is an `OnChipCounter` reading with a declared uncertainty over its span | both readings are counters (energy-measurement §2, §2.9); a counter reading is not a model | +| Hardware AV1 decode for sources and for informative floor decodes; never a floor verdict | AV1 §7.2 (exact without grain); floors state no digest; hardware may conceal errors | +| Hardware frames read from P010 exactly, never through ffmpeg's 16-to-8-bit conversion | **[measured]**: that conversion differs from dav1d's (§3) | +| No hardware encoder computes a WAI step | §6.2 | +| No neural-processor backend | §5 | + +## 9. Measurements + +**Setup.** A 596 s, 24 fps open-licence film, 14,315 frames: a 256×144 integer proxy and the +ladder's four 10-bit AV1 rungs (1080, 720, 540 and 360 lines). One arm64 desktop (macOS 27.0.1), +shared with other work; each run's load average is in its report. wai-pack at this change, +release, features `gpu,fabric-meter`; ffmpeg 9.0.2 with dav1d 1.5.4. Each run was metered by an +external sampler that read the kernel's account of the child's CPU energy before reaping it (and of +every decode service the run started: hardware decodes run out of process, and a 2,000-frame +decode billed 1.20 J to ffmpeg and 1.09 J to its service), and the IOReport `GPU Energy` rail and +every client's GPU time every 200 ms, with idle brackets before and after. + +**Class and scope of every figure below.** CPU figures are `OnChipCounter` readings of the +process's own task energy. GPU figures are `OnChipCounter` readings of the whole GPU rail over the +run, given only where the run held at least 99% of all GPU time; otherwise there is no GPU figure. +The media engine has no counter, so a media-engine run's figure is its CPU side alone, a lower +bound. **Each table is one run.** None was repeated, so none is a median, and none carries a +measured spread; they are indicative. + +### 9.1 Exact results + +- **Packages are the same bytes on the GPU.** A 360-line rung's policy packed with + `--fabric gpu`: the CPU pack's digest (`7454acc6…1118`), every file the same (`diff -r`), in + three runs, and with `--fabric auto:` too. A four-rung pack over the ladder's own CMAF, + the base coded once: pack digest `3912bd7c…b9b7f` and receipt `e0256cd9…`, the CPU's. A + floor-only pack: `f8871444…e032`, the CPU's. +- **The media engine decodes what dav1d decodes.** Each of the four rungs, all 14,315 frames: the + SHA-256 of every frame in P010 equal between the engine's hardware frames and dav1d's output. + And `wai-pack floor-decode` of the four-rung package: the same digest from both decoders for each + of its 600 pieces, in the stream's own 10-bit form, the P010 words read back exactly. +- **A source decoded by the media engine is the same source.** The proxy decoded from the 1080-line + rung on the engine, then by the same scaler: SHA-256 `8d236f5b…b56d`, the CPU decode's proxy byte + for byte. +- **Placement.** In a 12-piece pack, 24,915 of 24,930 motion-search calls ran on the GPU before the + map-wait fix. The other 15 were handed back to the CPU, with the same vectors. +- **Instructions.** The CPU-only 360-line pack retired 98.3 × 10¹² CPU instructions; the GPU pack + retired 2.05 × 10¹². + +### 9.2 Pack and verify, joules per fabric (one run each) + +The GPU's other clients held under 1% of its time in every pack of this run. + +| Run | Wall | CPU (task) | GPU (rail) | Total | Peak memory | CPU-only baseline (task) | +|---|---:|---:|---:|---:|---:|---| +| 360-line pack, search on the GPU | 56 s | 573 J | 1,284 J | **1,857 J** | 0.95 GB | 20,299 J, 3,689 s, 3.04 GB | +| 360-line pack, `auto` (search on the GPU; SSE and hashes on the CPU) | 56 s | 571 J | 1,283 J | **1,854 J** | 0.76 GB | as above | +| four-rung CMAF pack, search on the GPU, `--jobs 12` | 71 s | 525 J | 1,239 J | **1,763 J** | 1.62 GB | 19,541 J, 980 s at `--jobs 6`, 0.17 GB | +| floor-only pack, hashes on the GPU | 2.2 s | 4.4 J | 2.3 J | **6.7 J** | 0.65 GB | 3.7 J, 1.5 s, 0.04 GB | +| `wai-pack verify`, 360-line, CPU | 32 s | 118 J | 0 | 118 J | 0.58 GB | 31–33 s | +| `wai-pack verify`, 360-line, hashes on the GPU | 31 s | 120 J | none (GPU shared) | ≥ 120 J | 2.04 GB | | +| `wai-pack verify`, four-rung, CPU | 34 s | 119 J | 0 | 119 J | 1.55 GB | 35 s, 121 J | +| `wai-pack verify`, four-rung, hashes on the GPU | 32 s | 122 J | 0.2 J | 122 J | 3.44 GB | | + +What the table shows: +- Moving the motion search to the GPU cut the 360-line pack's energy 9 to 11 times over the two + runs made: 1,857 J here and 2,248 J in the sealed run of §9.5, against a 20,299 J baseline. The + baseline is CPU task energy alone, and the GPU runs add the whole rail. The CPU work left + (residuals, rANS, digests, I/O: 116 s of CPU against the baseline's 3,635 s) shows that the + search was at least 96.8% of the baseline's CPU time. +- Moving the object hashes or SSE gained nothing: the floor-only pack, whose only movable step is + hashing, cost more on the GPU. +- `wai-pack verify` is dominated by the integer base's decode, which is sequential rANS, so it + stays on the CPU. + +### 9.3 The measured cost table (`wai-pack fabric calibrate`, one run) + +Each backend, two call sizes, 6 s each, fitted to `µJ per call + nJ per unit`: + +| Step | CPU | GPU | Placement | +|---|---|---|---| +| `base-search` (unit: candidate-sample) | 0 + 20.2 nJ | 11,276 µJ + 1.47 nJ | GPU from about 600,000 units, a 32×24 frame at the policy's range; every frame of the film is 32 million | +| `sse` (unit: byte) | 0 + 0.85 nJ | 3,136 µJ + 0.76 nJ | CPU below about 35 MB a call; a piece of the film is 5 MB | +| `object-hash` (unit: byte) | 7 µJ + 1.33 nJ | 1,699 µJ + 1.43 nJ | CPU always: the GPU's BLAKE3 is no cheaper per byte either | + +The GPU's per-call cost includes its idle and static draw over the call, since the rail is the whole +GPU's. + +### 9.4 Decoding: CPU against the media engine (one run) + +The decode service was counted; the GPU was shared in this run, and no decode used it. + +| Decode of the whole floor | dav1d: wall, CPU | media engine: wall, CPU (ffmpeg and its service), engine | +|---|---|---| +| 1080 lines | 23.1 s, 198.7 J | 22.0 s, 17.4 J, + unmetered | +| 720 lines | 12.4 s, 111.0 J | 17.3 s, 11.3 J, + unmetered | +| 540 lines | 7.7 s, 73.3 J | 14.1 s, 8.5 J, + unmetered | +| 360 lines | 5.1 s, 53.8 J | 11.3 s, 15.9 J, + unmetered | +| proxy source (1080 lines decoded and scaled to 256×144) | 22.7 s, 304.1 J | 25.6 s, 350.5 J, + unmetered | + +What the table shows: +- A floor decode on the media engine cost the CPU 8 to 11 times less at 540 to 1080 lines, and 3.4 + times less at 360, where the per-frame download dominates. +- The engine's own draw is not visible to an unprivileged reader on macOS 27 (§7.1), so these are + lower bounds. +- For the proxy source the engine saved nothing: the Lanczos scale and the P010 repack on the CPU + cost more than the decode saved. Placing `source-decode` on the media engine is worth it only + where the scaling also moves, and moving it would change the source's bytes unless the scaler is + exact. + +### 9.5 A metered pack, sealed (one run) + +- **Sealed.** The 360-line pack with `--fabric gpu --meter fabric`, run when the GPU's other + clients had held under 0.5% of its time over the preceding 10 s, sealed 2,248.4 J with the fabric + record in its measurement claim: the CPU's share 475.4 J (`task`) and the GPU's 1,773.0 J + (`rail`, the pack its sole user); the steps `base-search`, `sse` and `object-hash` on the GPU and + every other step on the CPU, with no search call handed back to the CPU. +- **Which meter.** That run used the meter's first revision, which sealed the figure as + `ModelBased`, took the GPU's time at the two ends only, and multiplied the rail by the pack's + share of GPU time (at least 99%). The meter now seals `OnChipCounter` with the whole rail and + samples GPU time through the span (§7.1). The run has not been repeated under it, so its figures + are the first revision's. +- **Verified.** `wai-pack verify` accepts the package, and `pack_verify.py` holds every check of it + (3622 of 3622), the claim among them. +- **Refused.** The same metered four-rung pack, a minute later, found the GPU shared (39.9 s of its + 50.0 s) and was refused `pack-meter`, as was the calibration then. + +### 9.6 Load, and what is indicative + +- The host's one-minute load average was 14 to 50 over the runs of §9.2 and 25 to 90 over §9.4. +- The CPU figures are each process's own, by the kernel's attribution, so other load changes them + only through contention. +- The GPU figures of §9.2 are from a run that held the GPU alone. In the run of §9.4 another process + held about a third of the GPU's time; the GPU packs then had no GPU figure, and the metered packs + were refused `pack-meter` ("the GPU was shared: this process had 45.2 s of its 65.0 s, under + 99%"). +- Instruction counts and digests are exact. + +## 10. Judged unsound + +- **Any WAI step on the neural processor** (§5). +- **A hardware encoder for any WAI step:** floors are supplied, the packer refuses to encode one + (`pack-floor-encode-unsupported`), and no hardware encoder's bytes are reproducible (§6.2). +- **The platform's hardware motion estimation in place of §5.5's search** (§3). +- **Dividing a shared GPU rail by GPU time** (§7.1). +- **Media-engine and neural-processor energy on macOS 27 without privileges:** no live counter + (§7.1); a step run there makes a metered span refuse rather than guess. +- **A floor verdict from a hardware decoder** (§6.3). +- **ffmpeg's P010-to-8-bit conversion in a comparison** (§3). diff --git a/wai/wai-ops-gpu/Cargo.lock b/wai/wai-ops-gpu/Cargo.lock index 850571340..6aa77b26f 100644 --- a/wai/wai-ops-gpu/Cargo.lock +++ b/wai/wai-ops-gpu/Cargo.lock @@ -705,6 +705,7 @@ version = "0.1.0" name = "wai-ops-gpu" version = "0.1.0" dependencies = [ + "naga", "wai-ops", "wgpu", ] diff --git a/wai/wai-ops-gpu/Cargo.toml b/wai/wai-ops-gpu/Cargo.toml index 7e1b39647..32fc66c22 100644 --- a/wai/wai-ops-gpu/Cargo.toml +++ b/wai/wai-ops-gpu/Cargo.toml @@ -29,5 +29,11 @@ wgpu = { version = "30.0.1", default-features = false, features = ["std", "wgsl" [target.'cfg(all(target_arch = "wasm32", target_os = "unknown"))'.dependencies] wgpu = { version = "30.0.1", default-features = false, features = ["std", "wgsl", "webgpu"] } +# The WGSL rules test (tests/wgsl_rules.rs) reads the shipped modules on the IR of the +# translator wgpu compiles them with: naga, the same release wgpu 30.0.1 depends on, so +# the lockfile gains no package. +[target.'cfg(not(target_arch = "wasm32"))'.dev-dependencies] +naga = { version = "30.0.1", default-features = false, features = ["wgsl-in", "msl-out", "hlsl-out", "spv-out"] } + [profile.release] debug = false diff --git a/wai/wai-ops-gpu/browser/index.html b/wai/wai-ops-gpu/browser/index.html index 5d8d7fed8..c7c410b66 100644 --- a/wai/wai-ops-gpu/browser/index.html +++ b/wai/wai-ops-gpu/browser/index.html @@ -5,9 +5,10 @@