Mario Wonder renders its title screen on the Mac host
Shaders - shader_split.py (new): scan RomFS and main for every BNSH and agl BAHS container (bfsha, particle effects, layouts, agl/gsys packs, main): 12,811 shaders, map + compute facts from the control section - key = sha256(control + code): many shaders share a control section - NVN 55 binding layout: bound textures at 0x20 + 8*slot, images 0x120 - bindless textures read from uniform buffers (tex_ubo / samp_ubo) - GL depth mode: translator remaps z' = z/2 + w/2 in vertex shaders - compute code areas carry a 0x30 header (magic 0x12345679) Replay - 8-bit index buffers widened to 16-bit - texture swizzle through Metal swizzled views - non-packaged textures shared by storage (fixes a ~13 MB/frame leak from transient render targets rebuilt every frame) - view_t packed to 16 bytes (SDK 16 NVNtextureView; fixes a stack smash) - TBDR optimizations off by default until they know bindless readers Host - alias region 2.875 GB for the 1.75 GB VirtualAddressMemory reservation - ideal core -2 resolves to the process default core - shared font served with a BFTTF "decoded" header - crash reports scan the stack and dump the popped frame Docs: docs/agents (guides for porting other titles), AGENTS.md
This commit is contained in:
1 parent
679c569bc7
commit
16d3820a72
29 files changed
+13719
-18444
No files matched your search
@@ -0,0 +1,8 @@
|
||||
# Notes for agents
|
||||
|
||||
- This repository ports Super Mario Bros. Wonder (Switch, base game v0) to Apple platforms by running the game's own code natively. Start with [README.md](README.md) for status and build steps.
|
||||
- To analyse or port **another** Switch title, follow [docs/agents](docs/agents/README.md): extraction, binary survey, host bring-up failure catalogue, graphics specifics, debugging recipes.
|
||||
- Game files, keys and anything extracted from them live in the user's workspace (`~/smbw-work`), never in this repository. Do not print key values.
|
||||
- Code comments are bilingual (Chinese line, then English line); red log lines start with `【红】`. Keep both conventions.
|
||||
- After changing anything on the shader translation chain (`dm/gfx/tools/dmsh_*`, `Program.cs`, `shader_map.tsv`, `shader_facts.tsv`), run `dmsh_chain.py --header`, rebuild the shaders, regenerate `c1_full.tsv`, and rebuild the host: the host only loads libraries of its own chain version.
|
||||
- Commit only when asked, with `git -c user.name=seedds -c user.email=ext6@xcra.ai commit`.
|
||||
@@ -4,16 +4,15 @@ Work in progress: an iOS native-execution port of **Super Mario Bros. Wonder** (
|
||||
|
||||
Same approach as d2r-mobile: the game's own aarch64 code runs natively. A rewriter changes only the instructions that cannot run under Apple's kernel (x18, thread pointers, `svc`, timers). The host replaces Switch system services, and the NVN graphics API is reimplemented on Metal.
|
||||
|
||||
## Status (2026-10-12)
|
||||
## Status (2026-10-13)
|
||||
|
||||
| Step | State |
|
||||
|---|---|
|
||||
| Rewriter (`dm/tools/patch_nso.py`, `DM_RULESET=native`) | Runs unchanged on Mario `main` / `sdk` |
|
||||
| Mac host boot | Runs the render loop and presents frames: frame 2 makes about 1,900 NVN calls (25 textures, 257 texture binds, 113 uniform binds, submit and present), and frame 3 is the steady acquire / record / submit / present loop. About 40 game threads; the job system (3 executors) works |
|
||||
| Current frontier | 1) Shaders: Mario's shaders are not in the mapping table yet, so draws are skipped ("control section not in mapping table"). 2) A wild-pointer crash in game code (`main+0x107dbc0`) a few frames in |
|
||||
| NVN | 534 functions fetched, 236 called. About 45 state-only functions added this round; the command-recording ones (binds, draws, queries, conditional render, ...) are still missing |
|
||||
| Audio | Silent AudioRenderer (`hle_audren.c`): open / start / stop / update and device queries, event fired every 5 ms. Config editing (180 library imports) runs natively. Real mixing comes later |
|
||||
| Shaders | `Shader/SecredUber...bfsha.zs` (BFSHA v9, plain zstd) needs a container reader feeding the existing translation chain |
|
||||
| Mac host | **Reaches the title screen and renders it correctly at 60 fps** (deferred G-buffer, shadow map, post passes, layout UI, final copy into the window). Memory stays flat (about 900 MB physical footprint) |
|
||||
| Shaders | All 12,811 shaders the game ships (bfsha archives, particle effects, engine `agl` packages, UI layouts, `main`) are extracted by `shader_split.py` and translated offline; 12,804 compile. 7 `agl` post-effect compute shaders with image atomics make SPIRV-Cross throw |
|
||||
| Known gaps | Input not wired to the title screen yet; partial / mid-pass clears; sparse (virtual) memory pools; conditional render; TBDR optimizations are off by default (they don't understand bindless textures yet) |
|
||||
| Audio | Silent AudioRenderer (`hle_audren.c`); real mixing comes later |
|
||||
| iOS bundle | Not started. Plan: reuse `dm/ios` from d2r-mobile, bundle the RomFS (3.5 GB) inside the app, standard-controller virtual gamepad |
|
||||
|
||||
## What changed relative to d2r-mobile
|
||||
@@ -32,17 +31,44 @@ Same approach as d2r-mobile: the game's own aarch64 code runs natively. A rewrit
|
||||
- API version reported as 55.15 (`DM_NVN_API` overrides it).
|
||||
- 13 newer names were added to the table.
|
||||
- `tex_t` is packed to 0x80 bytes: Mario allocates `NVNtexture` as 0x80, and the old 0x88 record overran it and corrupted the heap.
|
||||
- `view_t` is packed to 16 bytes: SDK 16's `NVNtextureView` is 16 bytes and Mario keeps it in a 16-byte stack slot; the old 28-byte record overwrote the saved frame pointer and return address.
|
||||
- Shader key = sha256(control section + code area): Mario has many shaders with an identical control section and different code.
|
||||
- Bindless textures: 38 % of Mario's shaders read texture handles out of their own uniform buffers. New binding kinds `tex_ubo` / `samp_ubo` (`NVN_RB_TEXU` / `NVN_RB_SAMPU`) read the handle at replay time.
|
||||
- Bound texture handles live at `0x20 + 8 × slot` in NVN 55 (D2R's driver: `0x168`); images stay at `0x120 + 8 × slot`.
|
||||
- 8-bit index buffers are widened to 16-bit at replay (Metal has no 8-bit indices); Mario's full-screen passes and its final copy to the window use them.
|
||||
- Texture swizzle (`TextureBuilderSetSwizzle` / `TextureViewSetSwizzle`) is applied through Metal texture views (the font atlas is `(1, 1, 1, R)`).
|
||||
- Non-packaged textures are shared by storage (pool + offset + description): Mario rebuilds its transient render targets on new objects every frame and never finalizes them, which leaked about 13 MB of GPU memory per frame.
|
||||
- TBDR optimizations are off by default (`DM_NVN_TBDR=1` turns them on) until they recognize bindless readers.
|
||||
- Shader chain:
|
||||
- `dm/gfx/tools/shader_split.py` (new) scans RomFS and `main` for BNSH and BAHS (agl `sharcb`) containers and writes the package directory, the shader map and the answer table (compute thread-group size from control +0x748, shared memory from +0x754).
|
||||
- The translator uses GL depth (`-1..1`) and no depth clip control, so vertex shaders remap z' = z/2 + w/2: Mario sets `nvnDeviceSetDepthMode` to near = -w, and without the remap its full-screen copy was clipped away.
|
||||
- `dmsh_build.py` strips the 0x30 header of compute code areas (magic 0x12345679).
|
||||
- Host:
|
||||
- Guest address space repartitioned: alias region 2.875 GB, heap 2.625 GB. Mario reserves 1.75 GB of `VirtualAddressMemory` (HeapDef) that it maps into the alias region on demand; with 1.25 GB, large layout archives got no address and were skipped.
|
||||
- Threads created with ideal core -2 run on the process default core (0); `GetCurrentProcessorNumber` never returns a negative core. Mario's font engine indexes per-core state with it.
|
||||
- The shared font is served with a BFTTF "already decoded" header so `ScalableFontEngineHelper::Decode` leaves it alone.
|
||||
- Crash reports scan the stack for return addresses and dump the popped frame.
|
||||
|
||||
## Build and run on Mac
|
||||
|
||||
Requires Xcode and the game files extracted to `~/smbw-work/data/v0/{ExeFS,RomFS}`.
|
||||
Requires Xcode, the .NET SDK, spirv-cross and the game files extracted to `~/smbw-work/data/v0/{ExeFS,RomFS}`.
|
||||
|
||||
```
|
||||
python3 dm/tools/patch_nso.py ~/smbw-work/data/v0/ExeFS/main <out> main # with DM_RULESET=native; same for sdk
|
||||
# 1. rewrite the code modules
|
||||
DM_RULESET=native python3 dm/tools/patch_nso.py ~/smbw-work/data/v0/ExeFS/{main,sdk} ~/smbw-work/build/patched_v0 {main,sdk}
|
||||
# 2. shaders: extract, then translate (writes <cache>/b-<chain version>/)
|
||||
<venv python with lz4> dm/gfx/tools/shader_split.py ~/smbw-work/data/v0/RomFS ~/smbw-work/data/v0/ExeFS/main ~/smbw-work/shader/pkg dm/gfx/nvn/shader_map.tsv dm/gfx/nvn/shader_facts.tsv
|
||||
dotnet publish dm/gfx/tools/dmsh_xlate -c Release -o ~/smbw-work/build/gfx/dmsh_xlate
|
||||
XLATE=~/smbw-work/build/gfx/dmsh_xlate/dmsh_xlate python3 dm/gfx/tools/dmsh_chain.py --header
|
||||
XLATE=... python3 dm/gfx/tools/dmsh_build.py ~/smbw-work/shader/pkg ~/smbw-work/build/cache/metal_shader_cache
|
||||
python3 dm/gfx/tools/c1_guard.py ~/smbw-work/build/cache/metal_shader_cache/b-<V> dm/gfx/nvn/c1_full.tsv
|
||||
# 3. host
|
||||
make -C dm/host dmhost
|
||||
~/smbw-work/run/boot.sh <logname> [seconds]
|
||||
~/smbw-work/run/boot.sh <logname> [seconds] # sets DM_MSL_DIR to the shader cache
|
||||
```
|
||||
|
||||
Agent-facing guides for analysing and porting other titles are in [docs/agents](docs/agents/README.md).
|
||||
|
||||
## Tools (dm/tools)
|
||||
|
||||
| Tool | What it does |
|
||||
|
||||
+12
-171
@@ -1,171 +1,12 @@
|
||||
# chain b-f0f7a7b25de7 2026-10-12T19:56:26+08:00
|
||||
0039367872c795ef
|
||||
012944185b7e261c
|
||||
01c5c7905790325c
|
||||
02475e2646930d3a
|
||||
0375622a8681eac8
|
||||
04d6e9e7022907f0
|
||||
05d419f912a4d1cd
|
||||
08cae9c2da02614a
|
||||
08cf187d05d84d09
|
||||
098bc3555e5bed5c
|
||||
0ae027ac272287d6
|
||||
0d08d8a1dd4cf5d6
|
||||
0ec3cd6738f3dc1c
|
||||
113ea8c683365263
|
||||
1294cbfb03e4e5d3
|
||||
12eb6ea3820b8a7d
|
||||
13ed8b18365bfce6
|
||||
16ca000298d851e8
|
||||
19124dcf41606d36
|
||||
1a52a65aa316e6a7
|
||||
1b3be84bc3d73eae
|
||||
1d0d15f74aaddb79
|
||||
202683f06c64ddef
|
||||
20786a082d2dfbd1
|
||||
22136f1bddcff874
|
||||
22bcee00f21c8c51
|
||||
232c2a3e6b7a9785
|
||||
246a3eb5daa0b7e0
|
||||
251d5ac1566e0b98
|
||||
256a56dd789b8f13
|
||||
2987a35f1911d7cf
|
||||
2bac2c1409557154
|
||||
2c0f19858ba73e3a
|
||||
2d00c13d2bedf438
|
||||
2f226536e8ebf232
|
||||
2f67901cf71cdf8d
|
||||
2fe401a733b4df57
|
||||
31382139e41128f6
|
||||
3164b49655fc21c9
|
||||
33a481418889a348
|
||||
3433b79150ad77fa
|
||||
3443a59816f5b87a
|
||||
35a28eb15010bf03
|
||||
361c9073e0fe932f
|
||||
3d01438bf311171f
|
||||
4074bf3ce3eb29d6
|
||||
407eda22c44a4ec7
|
||||
42061d685b137738
|
||||
429cd03ae61fb580
|
||||
431fe4783acb446b
|
||||
43ea12b5f3a11a78
|
||||
45439dae9ed6f82e
|
||||
470beddd47b0906c
|
||||
4dcb34893421ba50
|
||||
4deea881d1d5d891
|
||||
4e3228f54b273fb2
|
||||
4e33d2b2f5dd5684
|
||||
51f88ad470e16a62
|
||||
529c66d780376d9f
|
||||
544bfa980f0659e9
|
||||
552c7a641540285f
|
||||
5ab0b0b025ca5cc0
|
||||
5ab94c53e4b747ef
|
||||
60a4a32b7ad3dee7
|
||||
6199a47874e7865d
|
||||
62de3a10a1a70d79
|
||||
665f625445409a6e
|
||||
6708b5c15fb88273
|
||||
674c0117f15bf404
|
||||
6d13a23129c5bad1
|
||||
732793a8aa9c657a
|
||||
73fe0fb2e7f64d62
|
||||
742643391ed75757
|
||||
74da3fc1c952496d
|
||||
753571246bbaa1d3
|
||||
76635af22e6159c6
|
||||
7a41b9a2077e0d24
|
||||
7a971e1206ce7487
|
||||
7d00564cf449b5a8
|
||||
7e444c6b56f89cbb
|
||||
7e93dbafe3f1d8e7
|
||||
801be18d3b128861
|
||||
809cc7f4aa9f69a3
|
||||
826ba43379c72b7e
|
||||
8277d2e90a47fc42
|
||||
849c16fe2d7e4e1f
|
||||
864e2245e42231f9
|
||||
87563d5ae6077620
|
||||
8aabc1b86626d679
|
||||
8dc59d664925042f
|
||||
8dc9c3d51257ed16
|
||||
8e988dd02558f480
|
||||
8fbd7b46329cf14a
|
||||
933ac3975cdc62d2
|
||||
93f27d5276a307a2
|
||||
9427806fe45721bf
|
||||
9572fd30da881103
|
||||
959b175c17eb309c
|
||||
96e648c105ae22fa
|
||||
97133b997c557c31
|
||||
97d5e886b87c854a
|
||||
98bc3ef1161e7c8d
|
||||
9b786171fbe436a7
|
||||
a208b59a20da46df
|
||||
a29c4ce687403d4b
|
||||
a459b6a4ab3cfc9b
|
||||
a67ff94f0a782b91
|
||||
a7c7e72459c4c16c
|
||||
ab72d9b095921189
|
||||
ae224dd3406f544e
|
||||
ae8b319daf0ec3b8
|
||||
aeef425c5634876d
|
||||
afec3a532491951d
|
||||
b00c291fb7f30090
|
||||
b1000aa42019a635
|
||||
b1a087a0f2ca9211
|
||||
b1ca63c2a1e4132a
|
||||
b30b665fe5979b98
|
||||
b3c253f94140e753
|
||||
b69b19b0822cb2d4
|
||||
b784727d84409a7b
|
||||
ba496234f181e545
|
||||
babf0582ab85804f
|
||||
bb2859f7c9ab6835
|
||||
bb67dd335b8c3352
|
||||
bbf340d03939e655
|
||||
bbfaff061c9db62e
|
||||
be0232608909161d
|
||||
c2a97f4a818d143a
|
||||
c2b2d86cfd8e1cf1
|
||||
c4ee0e8f60681783
|
||||
c567bd2055e1e949
|
||||
c7e1f4ec7ae7dc48
|
||||
c8ecbf2ebbb6cd77
|
||||
c90edb05cc237d12
|
||||
cd09c05f4836b0df
|
||||
ce57281b7458def8
|
||||
ce7002e02c8ca160
|
||||
cf21eec08d595d65
|
||||
cf47f8b228a1a317
|
||||
d0d66e612d7e400d
|
||||
d273ffd56838049c
|
||||
d2ccd6cb831f3531
|
||||
d3678c2bd7da227d
|
||||
d6852696f83fa1f1
|
||||
d8a6fce93c9dedf6
|
||||
da28aceab3af1a4d
|
||||
e15e2e83a60f318f
|
||||
e26cfc8078dadac7
|
||||
e3e2e357887270d3
|
||||
e53325640ad88cef
|
||||
e90c8e4a82a1dff4
|
||||
e9ba089446aab577
|
||||
ea3d10a786d70c1a
|
||||
ea5d6929abbbb2f4
|
||||
eae5cca89702e8e9
|
||||
ebb63e9042983128
|
||||
ee54f785ad2aeeaf
|
||||
eed4afa7b0f076ab
|
||||
f211068bb6cc859e
|
||||
f31f3bbc05a0490f
|
||||
f3800b3ff760c8c2
|
||||
f89468337d477293
|
||||
f8a3235a063c616b
|
||||
f8cbc9f892e49ad0
|
||||
f9584aa45ac8cd79
|
||||
fafa3ee843dc7541
|
||||
fafc3b53dd48fb45
|
||||
fb531c641fc4dbe4
|
||||
fd100820d5447806
|
||||
# chain b-7beebd7b9322 2026-10-13T00:36:40+08:00
|
||||
35cbc686dd8461b8
|
||||
4872bec9a5567f8b
|
||||
54a618792b2d5f0f
|
||||
6b3b42dd85419432
|
||||
759c14c6d029f531
|
||||
928b83845893aa76
|
||||
a1cb0d16ed70b47c
|
||||
a4ab922bab92c014
|
||||
ac220c75fcefef9b
|
||||
b6b18c69a0bf5407
|
||||
c45ecc7cfc6ca397
|
||||
|
@@ -1,2 +1,2 @@
|
||||
// 生成文件(dm/gfx/tools/dmsh_chain.py --header):本源码树期望的 B 着色器库翻译链版本(缺省选项);宿主只加载 <库目录>/b-<V>/
|
||||
#define DMSH_CHAIN "f0f7a7b25de7"
|
||||
#define DMSH_CHAIN "7beebd7b9322"
|
||||
+11
-4
@@ -244,9 +244,14 @@ NVN(nvnTextureBuilderGetStorageAlignment, size_t, const NVNtextureBuilder *b) {
|
||||
#define CTX(t) ((const tex_t *)(t))
|
||||
NVN(nvnTextureInitialize, NVNboolean, NVNtexture *t, const NVNtextureBuilder *b) {
|
||||
const tex_builder_t *s = (const tex_builder_t *)b; tex_t *o = TX(t);
|
||||
// 对仍有效的贴图对象再初始化(没先 Finalize):先放掉旧序号的宿主贴图。SMBW 的临时渲染目标每帧在同一个对象上重新初始化、从不 Finalize,
|
||||
// 原先每次都新建一张私有 MTLTexture、旧的永远留在序号表里,显卡内存每帧涨约 13 MB(24 GB 时被内存看门狗杀)
|
||||
// Re-initializing a texture object that is still live (without a Finalize first): release the host texture of the old serial first. SMBW re-initializes its transient render targets on the same object every frame and never Finalizes them;
|
||||
// previously every init created a new private MTLTexture and the old one stayed in the serial table forever, so GPU memory grew about 13 MB per frame (killed by the memory watchdog at 24 GB)
|
||||
if (o->magic == MAGIC('T', 'E', 'X', 0) && o->serial) { static uint64_t n; if (!n++) LOG("[nvn] TextureInitialize 对仍有效的贴图对象再初始化(无 Finalize):放掉旧宿主贴图(首例 ser=%llu)", (unsigned long long)o->serial); mtl_tex_release(o); }
|
||||
memset(o, 0, sizeof *o);
|
||||
o->magic = MAGIC('T', 'E', 'X', 0); o->d = s->d; o->pool = s->pool; o->off = s->off;
|
||||
o->has_layout = s->has_layout; memcpy(o->layout, s->layout, 8);
|
||||
o->has_layout = s->has_layout; memcpy(o->layout, s->layout, 8); o->set_swz = s->set_swz; o->swz = s->swz;
|
||||
nvn_tex_layout(&o->d, &o->L);
|
||||
o->mem = s->pool && s->pool->mem ? s->pool->mem + s->off : NULL;
|
||||
o->serial = nvn_new_serial();
|
||||
@@ -1262,7 +1267,8 @@ NVN(nvnSamplerGetReductionFilter, NVNsamplerReduction, const NVNsampler *s) { (v
|
||||
// Texture builder / texture / view
|
||||
NVN(nvnTextureBuilderSetSize2D, void, NVNtextureBuilder *b, int w, int h) { TB(b)->d.width = w; TB(b)->d.height = h; TB(b)->d.depth = 1; }
|
||||
NVN(nvnTextureBuilderSetSwizzle, void, NVNtextureBuilder *b, NVNtextureSwizzle r, NVNtextureSwizzle g, NVNtextureSwizzle bl, NVNtextureSwizzle a) {
|
||||
(void)b; if (r != NVN_TEXTURE_SWIZZLE_R || g != NVN_TEXTURE_SWIZZLE_G || bl != NVN_TEXTURE_SWIZZLE_B || a != NVN_TEXTURE_SWIZZLE_A) ONCE_LOG("【红】TextureBuilderSetSwizzle 非恒等(%d %d %d %d):宿主暂不重排通道", (int)r, (int)g, (int)bl, (int)a);
|
||||
tex_builder_t *o = (tex_builder_t *)b; o->set_swz = 1; o->swz = (uint16_t)((r & 7) | (g & 7) << 3 | (bl & 7) << 6 | (a & 7) << 9);
|
||||
if (r != NVN_TEXTURE_SWIZZLE_R || g != NVN_TEXTURE_SWIZZLE_G || bl != NVN_TEXTURE_SWIZZLE_B || a != NVN_TEXTURE_SWIZZLE_A) ONCE_LOG("TextureBuilderSetSwizzle 非恒等(%d %d %d %d):采样时用 Metal 视图重排", (int)r, (int)g, (int)bl, (int)a);
|
||||
}
|
||||
NVN(nvnTextureBuilderSetDepthStencilMode, void, NVNtextureBuilder *b, NVNtextureDepthStencilMode m) { (void)b; if (m) ONCE_LOG("TextureBuilderSetDepthStencilMode %d:宿主按深度读", (int)m); }
|
||||
NVN(nvnTextureBuilderGetStorageClass, NVNstorageClass, const NVNtextureBuilder *b) { (void)b; return 0; }
|
||||
@@ -1273,9 +1279,10 @@ NVN(nvnTextureGetTarget, NVNtextureTarget, const NVNtexture *t) { return (NVNtex
|
||||
NVN(nvnTextureSetDebugLabel, void, NVNtexture *t, const char *s) { (void)t; (void)s; }
|
||||
NVN(nvnTextureViewGetLevels, NVNboolean, const NVNtextureView *v, int *base, int *n) { const view_t *w = (const view_t *)v; *base = w->base_level; *n = w->nlevels; return w->set_levels; }
|
||||
NVN(nvnTextureViewGetTarget, NVNboolean, const NVNtextureView *v, NVNtextureTarget *t) { const view_t *w = (const view_t *)v; *t = (NVNtextureTarget)w->target; return w->set_target; }
|
||||
NVN(nvnTextureViewSetDepthStencilMode, void, NVNtextureView *v, NVNtextureDepthStencilMode m) { (void)v; if (m) ONCE_LOG("TextureViewSetDepthStencilMode %d:宿主按深度读", (int)m); }
|
||||
NVN(nvnTextureViewSetDepthStencilMode, void, NVNtextureView *v, NVNtextureDepthStencilMode m) { VW(v)->set_dsmode = 1; VW(v)->dsmode = (uint8_t)m; if (m) ONCE_LOG("TextureViewSetDepthStencilMode %d:宿主按深度读", (int)m); }
|
||||
NVN(nvnTextureViewSetSwizzle, void, NVNtextureView *v, NVNtextureSwizzle r, NVNtextureSwizzle g, NVNtextureSwizzle bl, NVNtextureSwizzle a) {
|
||||
(void)v; if (r != NVN_TEXTURE_SWIZZLE_R || g != NVN_TEXTURE_SWIZZLE_G || bl != NVN_TEXTURE_SWIZZLE_B || a != NVN_TEXTURE_SWIZZLE_A) ONCE_LOG("【红】TextureViewSetSwizzle 非恒等(%d %d %d %d):宿主暂不重排通道", (int)r, (int)g, (int)bl, (int)a);
|
||||
view_t *w = VW(v); w->set_swizzle = 1; w->swz[0] = (uint8_t)r; w->swz[1] = (uint8_t)g; w->swz[2] = (uint8_t)bl; w->swz[3] = (uint8_t)a;
|
||||
if (r != NVN_TEXTURE_SWIZZLE_R || g != NVN_TEXTURE_SWIZZLE_G || bl != NVN_TEXTURE_SWIZZLE_B || a != NVN_TEXTURE_SWIZZLE_A) ONCE_LOG("TextureViewSetSwizzle 非恒等(%d %d %d %d):采样时用 Metal 视图重排", (int)r, (int)g, (int)bl, (int)a);
|
||||
}
|
||||
|
||||
// 颜色状态:alpha 测试函数、逻辑运算(字段已在 color_st 里)
|
||||
|
||||
+122
-21
@@ -90,6 +90,10 @@ static uint64_t g_fence; // 已提交的最大栅栏值
|
||||
static pthread_mutex_t g_mu = PTHREAD_MUTEX_INITIALIZER;
|
||||
static pthread_cond_t g_cv = PTHREAD_COND_INITIALIZER;
|
||||
static uint64_t g_done; // 已完成的最大栅栏值(完成回调写) | Highest completed fence value (written by the completion callback)
|
||||
static uint64_t g_arena_made;
|
||||
static int g_allocprof = -1; static uint64_t g_ap_bytes[64], g_ap_fn[8];
|
||||
#define AP_B uint64_t _ap0 = g_allocprof > 0 ? g_dev.currentAllocatedSize : 0
|
||||
#define AP_E(i) do { if (g_allocprof > 0) { uint64_t _n = g_dev.currentAllocatedSize; if (_n > _ap0) g_ap_fn[i] += _n - _ap0; } } while (0) // DM_NVN_ALLOCPROF:按操作种类累计的显卡分配增长 | DM_NVN_ALLOCPROF: GPU allocation growth accumulated per operation type // 累计新建的每帧竞技场(4 MiB 一块;内存报告用) | Per-frame arenas created so far (4 MiB each; for the memory report)
|
||||
static _Atomic int g_last_commit_error;
|
||||
static _Atomic int g_up_pending;
|
||||
|
||||
@@ -792,9 +796,19 @@ static pthread_mutex_t g_smu = PTHREAD_MUTEX_INITIALIZER;
|
||||
// 序号表代号:表项增删、预排布贴图换新时 +1。下游缓存(贴图视图、程序)记下取用时的代号,代号未变即可直接用、不必再查表
|
||||
// Serial table generation: +1 when entries are added / removed or a packaged texture is replaced. Downstream caches (texture views, programs) record the generation at fetch time; if it is unchanged they can be used directly without another table lookup
|
||||
static _Atomic uint64_t g_ser_gen = 1;
|
||||
// 按存储共用的贴图(非预排布):键 = 内存池 + 偏移 + 贴图描述。NVN 的贴图对象只是描述符,同一段存储上按同样描述再建的对象就是同一张贴图;
|
||||
// SMBW 的临时渲染目标每帧在新的对象上重建、从不 Finalize,按序号各建一张会每帧漏约 13 MB 显卡内存。这里的贴图由共用表持有驻留,
|
||||
// 序号表更替 / 删除时只放引用(defer_obj_unref),不移出驻留集。共用表不淘汰(条目数 = 不同的存储 + 描述组合)。
|
||||
// Textures shared by storage (non-packaged): key = memory pool + offset + texture description. An NVN texture object is only a descriptor; an object rebuilt over the same storage with the same description is the same texture;
|
||||
// SMBW rebuilds its transient render targets on new objects every frame and never Finalizes them, so building one per serial leaked about 13 MB of GPU memory per frame. Textures here are kept resident by the sharing table,
|
||||
// and when the serial table replaces / deletes them it only drops its reference (defer_obj_unref), never removing them from the residency set. The sharing table does not evict (entries = distinct storage + description combinations).
|
||||
typedef struct { uint64_t pool; int64_t off; nvn_texdesc d; } alias_key;
|
||||
static nvn_hmap g_alias = {.klen = sizeof(alias_key)};
|
||||
static CFMutableSetRef g_alias_set; // 共用表里的贴图(不持有;查「是否共用」用) | Textures in the sharing table (non-owning; used to ask "is this shared")
|
||||
static int alias_has(id o) { return g_alias_set && o && CFSetContainsValue(g_alias_set, (__bridge const void *)o); }
|
||||
static __unsafe_unretained id serial_get(uint64_t k) { pthread_mutex_lock(&g_smu); __unsafe_unretained id o = hm_get_id(&g_by_serial, &k); pthread_mutex_unlock(&g_smu); return o; }
|
||||
static void serial_put(uint64_t k, id o) { pthread_mutex_lock(&g_smu); id old = hm_get_id(&g_by_serial, &k); if (old) defer_obj_release(old); hm_put_id(&g_by_serial, &k, o); g_ser_gen++; pthread_mutex_unlock(&g_smu); }
|
||||
static void serial_del(uint64_t k) { pthread_mutex_lock(&g_smu); id old = hm_get_id(&g_by_serial, &k); if (old) defer_obj_release(old); hm_del_id(&g_by_serial, &k); g_ser_gen++; pthread_mutex_unlock(&g_smu); }
|
||||
static void serial_put(uint64_t k, id o) { pthread_mutex_lock(&g_smu); id old = hm_get_id(&g_by_serial, &k); if (old) { if (alias_has(old)) defer_obj_unref(old); else defer_obj_release(old); } hm_put_id(&g_by_serial, &k, o); g_ser_gen++; pthread_mutex_unlock(&g_smu); }
|
||||
static void serial_del(uint64_t k) { pthread_mutex_lock(&g_smu); id old = hm_get_id(&g_by_serial, &k); if (old) { if (alias_has(old)) defer_obj_unref(old); else defer_obj_release(old); } hm_del_id(&g_by_serial, &k); g_ser_gen++; pthread_mutex_unlock(&g_smu); }
|
||||
// 预排布贴图的宿主记录:当前 MTLTexture、上传戳、上次检查时的全局写代号
|
||||
// Host record of a packaged texture: the current MTLTexture, the upload stamp, and the global write generation at the last check
|
||||
@interface NvPkg : NSObject { @public id<MTLTexture> tex; uint64_t stamp, seen, hash; } @end // hash:DM_NVN_DIRTYCHECK 时上传内容的全量哈希 | hash: full hash of the uploaded content under DM_NVN_DIRTYCHECK
|
||||
@@ -868,7 +882,11 @@ static id<MTLTexture> tex_upgrade_pfv(const tex_t *t, id<MTLTexture> base, MTLPi
|
||||
}
|
||||
id holder = serial_get(t->serial);
|
||||
if ([holder isKindOfClass:[NvPkg class]]) { id<MTLTexture> old = ((NvPkg *)holder)->tex; ((NvPkg *)holder)->tex = upgraded; defer_obj_release(old); g_ser_gen++; }
|
||||
else serial_put(t->serial, upgraded);
|
||||
else {
|
||||
serial_put(t->serial, upgraded);
|
||||
alias_key ak; memset(&ak, 0, sizeof ak); ak.pool = (uint64_t)(uintptr_t)t->pool; ak.off = t->off; ak.d = t->d; // 共用表同步换成升级后的那张,后来同存储的对象直接拿到它 | Switch the sharing table to the upgraded one too, so later objects on the same storage get it directly
|
||||
pthread_mutex_lock(&g_smu); if (hm_get_id(&g_alias, &ak) == base) { hm_put_id(&g_alias, &ak, upgraded); CFSetAddValue(g_alias_set, (__bridge const void *)upgraded); } pthread_mutex_unlock(&g_smu);
|
||||
}
|
||||
MLOG("贴图升级为可换格式视图 ser=%llu 基格式 %lu → 视图格式 %lu(升级次数=%llu)", t->serial, (unsigned long)base.pixelFormat, (unsigned long)view_pf, ++g_pfv_upgrades);
|
||||
return upgraded;
|
||||
}
|
||||
@@ -1095,6 +1113,7 @@ static id<MTLTexture> pkg_upload_(const tex_t *t, uint64_t *stamp) {
|
||||
if (!d) return nil;
|
||||
id<MTLTexture> mt = [g_dev newTextureWithDescriptor:d];
|
||||
if (!mt) { RED_ONCE(2, "建 MTLTexture 失败 %ux%u 格式 %#x 目标 %d", t->d.width, t->d.height, t->d.format, t->d.target); return nil; }
|
||||
if (g_allocprof > 0) { static int n; if (n++ < 30 || n % 500 == 0) MLOG("新建贴图(%s)#%d ser=%llu %ux%ux%u 格式 %#x 目标 %d 级 %u 存储 %p", __func__, n, (unsigned long long)t->serial, t->d.width, t->d.height, t->d.depth, t->d.format, t->d.target, t->d.levels, (void *)t->mem); }
|
||||
res_add(mt); // 首传与重传都在这里登记驻留(Metal 4 不自动驻留;漏登 = GPU 地址页错误) | Both first upload and re-upload register residency here (Metal 4 does not make resources resident automatically; a missed registration = GPU address page fault)
|
||||
nvn_dirty_protect(t->mem, t->L.size);
|
||||
*stamp = nvn_dirty_now();
|
||||
@@ -1175,7 +1194,9 @@ static id<MTLTexture> pkg_upload_(const tex_t *t, uint64_t *stamp) {
|
||||
up_flush();
|
||||
return mt;
|
||||
}
|
||||
static id<MTLTexture> tex_mtl(const tex_t *ct) {
|
||||
static id<MTLTexture> tex_mtl_(const tex_t *ct);
|
||||
static id<MTLTexture> tex_mtl(const tex_t *ct) { AP_B; id<MTLTexture> r = tex_mtl_(ct); AP_E(4); return r; }
|
||||
static id<MTLTexture> tex_mtl_(const tex_t *ct) {
|
||||
tex_t *t = (tex_t *)ct;
|
||||
if (!t || !t->serial) return nil;
|
||||
int packaged = t->has_layout && t->mem;
|
||||
@@ -1222,11 +1243,19 @@ static id<MTLTexture> tex_mtl(const tex_t *ct) {
|
||||
serial_put(t->serial, mt);
|
||||
return mt;
|
||||
}
|
||||
alias_key ak; memset(&ak, 0, sizeof ak); ak.pool = (uint64_t)(uintptr_t)t->pool; ak.off = t->off; ak.d = t->d;
|
||||
pthread_mutex_lock(&g_smu); __unsafe_unretained id shared = hm_get_id(&g_alias, &ak); pthread_mutex_unlock(&g_smu);
|
||||
if (shared) { serial_put(t->serial, shared); return shared; }
|
||||
MTLTextureDescriptor *d = tex_desc(t, 0);
|
||||
if (!d) return nil;
|
||||
id<MTLTexture> mt = [g_dev newTextureWithDescriptor:d];
|
||||
if (!mt) { RED_ONCE(2, "建 MTLTexture 失败 %ux%u 格式 %#x 目标 %d", t->d.width, t->d.height, t->d.format, t->d.target); return nil; }
|
||||
if (g_allocprof > 0) { static int n; if (n++ < 30 || n % 500 == 0) MLOG("新建贴图(%s)#%d ser=%llu %ux%ux%u 格式 %#x 目标 %d 级 %u 存储 %p", __func__, n, (unsigned long long)t->serial, t->d.width, t->d.height, t->d.depth, t->d.format, t->d.target, t->d.levels, (void *)t->mem); }
|
||||
res_add(mt);
|
||||
pthread_mutex_lock(&g_smu);
|
||||
if (!g_alias_set) g_alias_set = CFSetCreateMutable(NULL, 0, NULL);
|
||||
hm_put_id(&g_alias, &ak, mt); CFSetAddValue(g_alias_set, (__bridge const void *)mt);
|
||||
pthread_mutex_unlock(&g_smu);
|
||||
serial_put(t->serial, mt);
|
||||
return mt;
|
||||
}
|
||||
@@ -1243,7 +1272,13 @@ void mtl_mem_stat(unsigned long long frame, unsigned long long rss_mb) {
|
||||
pthread_mutex_lock(&g_deferred_mu); unsigned long nd = (unsigned long)g_deferred.count; pthread_mutex_unlock(&g_deferred_mu);
|
||||
pthread_mutex_lock(&g_res_mu); unsigned long nr = (unsigned long)g_res_objects.count; pthread_mutex_unlock(&g_res_mu);
|
||||
int live = 0, peak = 0, cap = 0; nvn_dirty_stat(&live, &peak, &cap);
|
||||
MLOG("内存 至帧 %llu:常驻 %llu MB,显卡已分配 %llu MB,延迟释放队列 %lu,驻留集 %lu 个,内存池 %d 个(峰值 %d / 跟踪表容量 %d),贴图重传累计 %llu 次", frame, rss_mb, gpu, nd, nr, live, peak, cap, (unsigned long long)g_pkg_reuploads);
|
||||
MLOG("内存 至帧 %llu:常驻 %llu MB,显卡已分配 %llu MB,延迟释放队列 %lu,驻留集 %lu 个,内存池 %d 个(峰值 %d / 跟踪表容量 %d),贴图重传累计 %llu 次,每帧竞技场累计新建 %llu 块", frame, rss_mb, gpu, nd, nr, live, peak, cap, (unsigned long long)g_pkg_reuploads, (unsigned long long)g_arena_made);
|
||||
if (g_allocprof > 0) { char ab[256]; int o = 0; for (int i = 0; i < g_alloc_n && o < 200; i++) o += snprintf(ab + o, sizeof ab - o, " #%d %llu MB", i, (unsigned long long)(g_alloc4[i].allocatedSize >> 20));
|
||||
for (int i = 0; i < 3 && o < 240; i++) o += snprintf(ab + o, sizeof ab - o, " 传%d %llu 出%d %llu", i, (unsigned long long)(g_up_alloc4[i].allocatedSize >> 20), i, (unsigned long long)(g_present_alloc4[i].allocatedSize >> 20));
|
||||
MLOG("命令分配器占用:%s", ab);
|
||||
MLOG("显卡分配增长按函数:结束通道 %llu MB,开通道 %llu MB,取管线 %llu MB,参数缓冲 %llu MB,取贴图 %llu MB", g_ap_fn[0] >> 20, g_ap_fn[1] >> 20, g_ap_fn[2] >> 20, g_ap_fn[3] >> 20, g_ap_fn[4] >> 20); }
|
||||
if (g_allocprof > 0) { int top[4] = {-1, -1, -1, -1}; for (int o = 0; o < 64; o++) for (int k = 0; k < 4; k++) if (top[k] < 0 || g_ap_bytes[o] > g_ap_bytes[top[k]]) { for (int j = 3; j > k; j--) top[j] = top[j - 1]; top[k] = o; break; }
|
||||
MLOG("显卡分配增长按操作:op%d %llu MB,op%d %llu MB,op%d %llu MB,op%d %llu MB", top[0], g_ap_bytes[top[0]] >> 20, top[1], g_ap_bytes[top[1]] >> 20, top[2], g_ap_bytes[top[2]] >> 20, top[3], g_ap_bytes[top[3]] >> 20); }
|
||||
}
|
||||
void mtl_pkg_stats(uint64_t *uploads, uint64_t *reuploads) { *uploads = g_pkg_uploads; *reuploads = g_pkg_reuploads; }
|
||||
uint64_t mtl_pkg_miss(void) { return g_pkg_miss; }
|
||||
@@ -1522,7 +1557,11 @@ static int udc_on(void) {
|
||||
// 只用于等价对照(同一回放局开 / 关逐字节比画面),不是产品配置
|
||||
// Diagnostic DM_NVN_TBDR=0: turns off all TBDR optimizations (store lookahead, load elision, same-target continuation, clear-only pass hoist, on-demand depth-stencil attach); replay takes the plainest 'attach all, load all, store all' path.
|
||||
// Only for equivalence comparison (the same replay run on / off, comparing the picture byte by byte), not a product configuration
|
||||
static int tbdr_on(void) { static int v = -1; if (v < 0) { const char *e = getenv("DM_NVN_TBDR"), *r = getenv("DM_NVN_RULER"); v = !(e && !strcmp(e, "0")); g_ruler_truth = r && !strcmp(r, "1"); if (!v) MLOG("DM_NVN_TBDR=0:TBDR 优化全关(等价对照用)"); } return v && !g_ruler_truth; }
|
||||
// 马力欧:缺省关(DM_NVN_TBDR=1 才开)。这些优化按「贴图槽里绑了哪些贴图」推断读写关系,而本作 38% 的着色器用无绑定贴图(句柄在 uniform 缓冲里,NVN_RB_TEXU),
|
||||
// 推断会漏掉读者——例如判定某附件之后没人读而不写回。等它们认得无绑定读者再开。
|
||||
// Mario: off by default (only DM_NVN_TBDR=1 turns it on). These optimizations infer read / write relations from "which textures are bound in texture slots", while 38% of this game's shaders use bindless textures (handles in uniform buffers, NVN_RB_TEXU),
|
||||
// so the inference would miss readers - e.g. deciding an attachment is never read afterwards and not storing it. Turn them back on once they recognize bindless readers.
|
||||
static int tbdr_on(void) { static int v = -1; if (v < 0) { const char *e = getenv("DM_NVN_TBDR"), *r = getenv("DM_NVN_RULER"); v = e && !strcmp(e, "1"); g_ruler_truth = r && !strcmp(r, "1"); if (!v) MLOG("TBDR 优化缺省关(本作有无绑定贴图;DM_NVN_TBDR=1 开)"); } return v && !g_ruler_truth; }
|
||||
int dm_nvn_ruler_truth(void) { tbdr_on(); return g_ruler_truth; } // 视觉尺子真值阶段(宿主侧的被测设置据此让开,如 3D 渲染比例) | Visual ruler ground-truth phase (host-side settings under test yield accordingly, e.g. the 3D render scale)
|
||||
static int rt_range_on(void) { static int v = -1; if (v < 0) { const char *e=getenv("DM_NVN_RT_RANGE"); v=e && !strcmp(e,"1"); } return v; } // 窄候选,缺省关 | Narrow candidate, off by default
|
||||
static uint64_t g_sd_dead_bytes, g_sd_n_dead, g_sd_n_all;
|
||||
@@ -1638,7 +1677,7 @@ static void defer_fallback(void);
|
||||
static int g_el_w, g_el_h, g_el_draws; static char g_el_key[12];
|
||||
static int enc_label_on(void) { static int v = -1; if (v < 0) { const char *e = getenv("DM_NVN_ENC_LABEL"); v = e && atoi(e); } return v; }
|
||||
static void ghost_flush(void);
|
||||
static void rp_end(void) { if (g_enc) {
|
||||
static void rp_end(void) { if (g_enc) { AP_B;
|
||||
ghost_flush();
|
||||
if (enc_label_on()) { static uint64_t lf = ~0ull, base; uint64_t f = atomic_load(&g_cur_frame); if (f != lf) { lf = f; base = g_stat_pass - 1; } // 帧内序号:同一趟每帧同名,表里才能按名归并 | Intra-frame serial: the same pass has the same name every frame, so the table can aggregate by name
|
||||
[(id)g_enc setLabel:[NSString stringWithFormat:@"p%02llu %dx%d %s d%d", (unsigned long long)(g_stat_pass - base), g_el_w, g_el_h, g_el_key[0] ? g_el_key : "-", g_el_draws]]; }
|
||||
@@ -1649,6 +1688,7 @@ static void rp_end(void) { if (g_enc) {
|
||||
#ifdef NVN_RT_RANGE_TEST
|
||||
rr_finish(ranged);
|
||||
#endif
|
||||
AP_E(0);
|
||||
} }
|
||||
void pg_sub_begin_ext(uint64_t fence) { pg_sub_begin(fence); }
|
||||
void pg_commit_ext(id<MTLCommandBuffer> cb) { pg_commit(cb); }
|
||||
@@ -1665,7 +1705,9 @@ static void attach(MTLRenderPassAttachmentDescriptor *a, const tex_t *t, const v
|
||||
// (Mac character select screen: the color-clear pass drags along a 400x225 depth load and store)
|
||||
static id<MTL4RenderCommandEncoder> rp_begin_ex(int clear_only);
|
||||
static id<MTL4RenderCommandEncoder> rp_begin(void) { return rp_begin_ex(0); }
|
||||
static id<MTL4RenderCommandEncoder> rp_begin_ex(int clear_only) {
|
||||
static id<MTL4RenderCommandEncoder> rp_begin_ex_(int clear_only);
|
||||
static id<MTL4RenderCommandEncoder> rp_begin_ex(int clear_only) { AP_B; id<MTL4RenderCommandEncoder> e = rp_begin_ex_(clear_only); AP_E(1); return e; }
|
||||
static id<MTL4RenderCommandEncoder> rp_begin_ex_(int clear_only) {
|
||||
if (g_enc) return g_enc;
|
||||
memset(g_zskip_cand_ok, 0, sizeof g_zskip_cand_ok);
|
||||
g_enc_mode = clear_only;
|
||||
@@ -2097,13 +2139,26 @@ static __unsafe_unretained NvProg *prog_get(const prog_t *cp) { // 只在提
|
||||
shmap_load();
|
||||
NvProg *o = [NvProg new];
|
||||
for (unsigned i = 0; i < p->nstage; i++) {
|
||||
uint8_t md[32]; CC_SHA256(p->sd[i].control, 0x880, md);
|
||||
// 键 = sha256(控制段前 0x880 字节 + 代码区):本作大量着色器控制段相同、代码不同(dm/gfx/tools/shader_split.py);代码区长在控制段 +0x704,缓冲地址即宿主指针
|
||||
// Key = sha256(first 0x880 bytes of the control section + code area): many of this game's shaders share a control section but differ in code (dm/gfx/tools/shader_split.py); the code length is at control +0x704, and a buffer address is a host pointer
|
||||
uint8_t md[32]; CC_SHA256_CTX hc; CC_SHA256_Init(&hc); CC_SHA256_Update(&hc, p->sd[i].control, 0x880);
|
||||
uint32_t ncode; memcpy(&ncode, (const uint8_t *)p->sd[i].control + 0x704, 4);
|
||||
if (p->sd[i].data && ncode && ncode < (1u << 24)) CC_SHA256_Update(&hc, (const void *)(uintptr_t)p->sd[i].data, ncode);
|
||||
CC_SHA256_Final(md, &hc);
|
||||
NSString *k = [NSString stringWithFormat:@"%02x%02x%02x%02x%02x%02x%02x%02x", md[0], md[1], md[2], md[3], md[4], md[5], md[6], md[7]];
|
||||
NSString *zh = g_shmap[k];
|
||||
if (!zh) { // 不在包里:查 main 本体内嵌的计算核(nvn_builtin.h) | Not in the package: look up the compute kernels embedded in the main body (nvn_builtin.h)
|
||||
NvShader *b = builtin_get(k.UTF8String);
|
||||
if (b) { o->sh[5] = b; continue; }
|
||||
MLOG("【红】着色器控制段 %s 不在映射表里", k.UTF8String); continue;
|
||||
MLOG("【红】着色器 %s 不在映射表里(DM_NVN_SHDUMP=目录 可把控制段与代码区存盘)", k.UTF8String);
|
||||
// DM_NVN_SHDUMP=目录:不在表里的着色器存成 <键>.ctl(控制段 0x880 字节)与 <键>.code(代码区,长度取控制段 +0x704),供离线查来源 / 补进映射表
|
||||
// DM_NVN_SHDUMP=directory: shaders missing from the map are saved as <key>.ctl (0x880-byte control section) and <key>.code (code area, length from control +0x704), to trace their source / add them to the map offline
|
||||
static const char *shd; static int shd_init; if (!shd_init) { shd = getenv("DM_NVN_SHDUMP"); shd_init = 1; }
|
||||
if (shd) { char path[1024]; FILE *f;
|
||||
snprintf(path, sizeof path, "%s/%s.ctl", shd, k.UTF8String); if ((f = fopen(path, "wb"))) { fwrite(p->sd[i].control, 1, 0x880, f); fclose(f); }
|
||||
snprintf(path, sizeof path, "%s/%s.code", shd, k.UTF8String);
|
||||
if (p->sd[i].data && ncode && ncode < (1u << 24) && (f = fopen(path, "wb"))) { fwrite((const void *)(uintptr_t)p->sd[i].data, 1, ncode, f); fclose(f); } }
|
||||
continue;
|
||||
}
|
||||
int st = stage_of(zh);
|
||||
NvShader *sh = st >= 0 ? shader_get([k stringByAppendingString:@"_b"], st) : nil;
|
||||
@@ -2174,7 +2229,14 @@ static id<MTLTexture> tex_by_id(int tid) { // 调用方持 g_rmu | Caller hold
|
||||
id<MTLTexture> base = tex_mtl(&rp->t);
|
||||
if (!base) return nil;
|
||||
v = base;
|
||||
if (r.has_v && (r.v.set_format || r.v.set_levels || r.v.set_layers || r.v.set_target)) {
|
||||
// 通道重排:视图设了用视图的,否则用贴图建造时的;恒等不建视图(SMBW 的字体缓存是 (1 1 1 R):不重排时字形成白块)
|
||||
// Channel swizzle: the view's if set, otherwise the one from texture building; identity builds no view (SMBW's font cache is (1 1 1 R): without the swizzle glyphs become white blocks)
|
||||
uint8_t sw[4] = {MTLTextureSwizzleRed, MTLTextureSwizzleGreen, MTLTextureSwizzleBlue, MTLTextureSwizzleAlpha}; int need_sw = 0;
|
||||
if (r.has_v && r.v.set_swizzle) memcpy(sw, r.v.swz, 4);
|
||||
else if (r.t.set_swz) for (int c = 0; c < 4; c++) sw[c] = (uint8_t)(r.t.swz >> (3 * c) & 7);
|
||||
for (int c = 0; c < 4; c++) { if (sw[c] > MTLTextureSwizzleAlpha) sw[c] = (uint8_t)(MTLTextureSwizzleRed + c); if (sw[c] != MTLTextureSwizzleRed + c) need_sw = 1; }
|
||||
if ((r.has_v && (r.v.set_format || r.v.set_levels || r.v.set_layers || r.v.set_target)) || need_sw) {
|
||||
if (!r.has_v) memset(&r.v, 0, sizeof r.v);
|
||||
uint32_t pf = (uint32_t)base.pixelFormat; uint8_t swz[4];
|
||||
if (r.v.set_format && !(nvn_fmt_to_mtl(r.v.format, &pf, swz) && pf)) pf = (uint32_t)base.pixelFormat;
|
||||
{ uint32_t upf; int ubpp; if (r.v.set_format && bc_unpack(r.v.format, &upf, &ubpp)) pf = upf; } // 无 BC:BC 视图跟底图一样换成解压后的格式 | No BC: a BC view is switched to the decompressed format just like the base texture
|
||||
@@ -2187,7 +2249,8 @@ static id<MTLTexture> tex_by_id(int tid) { // 调用方持 g_rmu | Caller hold
|
||||
NSUInteger ns = base.textureType == MTLTextureType3D ? 1 : (r.v.set_layers && r.v.nlayers ? r.v.nlayers : base.arrayLength * (base.textureType == MTLTextureTypeCube || base.textureType == MTLTextureTypeCubeArray ? 6 : 1) - s0);
|
||||
MTLTextureType tt = r.v.set_target ? ttype(r.v.target, base.textureType) : base.textureType;
|
||||
if (tt == MTLTextureType2D && ns > 1) ns = 1;
|
||||
v = [base newTextureViewWithPixelFormat:(MTLPixelFormat)pf textureType:tt levels:NSMakeRange(l0, nl) slices:NSMakeRange(s0, ns)];
|
||||
v = need_sw ? [base newTextureViewWithPixelFormat:(MTLPixelFormat)pf textureType:tt levels:NSMakeRange(l0, nl) slices:NSMakeRange(s0, ns) swizzle:MTLTextureSwizzleChannelsMake(sw[0], sw[1], sw[2], sw[3])]
|
||||
: [base newTextureViewWithPixelFormat:(MTLPixelFormat)pf textureType:tt levels:NSMakeRange(l0, nl) slices:NSMakeRange(s0, ns)];
|
||||
if (!v) { RED_ONCE(11, "贴图视图建不出 id %d", tid); v = base; }
|
||||
}
|
||||
rp->view = (void *)CFBridgingRetain(v); rp->view_rid = v.gpuResourceID._impl; rp->view_ser = sg; rp->view_dirty = dg;
|
||||
@@ -2241,7 +2304,7 @@ static NvArena *arena_new(void) {
|
||||
// for-in 循环变量不持有对象:先取强引用再从数组删,否则数组释放后返回的是野指针
|
||||
// The for-in loop variable does not retain the object: take a strong reference first and then remove it from the array, otherwise what is returned after the array releases it is a dangling pointer
|
||||
for (NvArena *it in g_arenas) if (it->fence && it->fence <= g_done) { NvArena *r = it; [g_arenas removeObject:r]; r->fence = 0; r->used = 0; return r; }
|
||||
NvArena *a = [NvArena new]; a->buf = [g_dev newBufferWithLength:4 << 20 options:MTLResourceStorageModeShared]; a->gpu = a->buf.gpuAddress; res_add(a->buf); return a;
|
||||
NvArena *a = [NvArena new]; a->buf = [g_dev newBufferWithLength:4 << 20 options:MTLResourceStorageModeShared]; a->gpu = a->buf.gpuAddress; res_add(a->buf); g_arena_made++; return a;
|
||||
}
|
||||
void arena_begin(void) { if (!g_arenas) { g_arenas = [NSMutableArray array]; g_sub_arenas = [NSMutableArray array]; } g_cur_arena = nil; }
|
||||
void arena_commit(uint64_t fence) { for (NvArena *a in g_sub_arenas) { a->fence = fence; [g_arenas addObject:a]; } [g_sub_arenas removeAllObjects]; g_cur_arena = nil; }
|
||||
@@ -2433,7 +2496,9 @@ static id<MTLRenderPipelineState> pso_pend_take(const pso_key *k) { // 提交
|
||||
pthread_mutex_unlock(&g_pp_mu);
|
||||
return ps;
|
||||
}
|
||||
static __unsafe_unretained id<MTLRenderPipelineState> pso_get(NvProg *pr, MTLRenderPassDescriptor *unused) {
|
||||
static __unsafe_unretained id<MTLRenderPipelineState> pso_get_(NvProg *pr, MTLRenderPassDescriptor *unused);
|
||||
static __unsafe_unretained id<MTLRenderPipelineState> pso_get(NvProg *pr, MTLRenderPassDescriptor *unused) { AP_B; __unsafe_unretained id<MTLRenderPipelineState> r = pso_get_(pr, unused); AP_E(2); return r; }
|
||||
static __unsafe_unretained id<MTLRenderPipelineState> pso_get_(NvProg *pr, MTLRenderPassDescriptor *unused) {
|
||||
(void)unused;
|
||||
__unsafe_unretained NvShader *vs = pr->sh[0], *fs = pr->sh[1];
|
||||
if (!vs) { RED_ONCE(13, "程序没有顶点着色器(或未映射)"); return nil; }
|
||||
@@ -2677,7 +2742,24 @@ static uint64_t ui_mat_patch(const p_bind_buf *u, void *mb, uint64_t mo) {
|
||||
la = u->addr; ls = u->size; lp = g_pass.serial; lo = g_ui_moff; lg = ring_gpu + at; at += n;
|
||||
return lg;
|
||||
}
|
||||
static int encode_args(id<MTLCommandEncoder> en, NvShader *sh, int nvn_stage, int metal_vertex) {
|
||||
// 无绑定句柄(TEXU / SAMPU):uniform 槽 reg 字节偏移 off 处的 32 位字 = 游戏写进去的 NVN 句柄低 32 位(低 20 位贴图号、高 12 位采样器号)。
|
||||
// 回放时从 CPU 侧读(与真机 GPU 执行时读同一时刻的内存);槽没绑 / 越界 / 读不到 = 0(按空槽:哑贴图 / 哑采样器)。
|
||||
// 本提交里排着 GPU 侧写入(pend_hits)的位置照样读当前值,首例报红。
|
||||
// Bindless handle (TEXU / SAMPU): the 32-bit word at byte offset off of uniform slot reg = the low 32 bits of the NVN handle the game wrote there (low 20 bits texture ID, high 12 bits sampler ID).
|
||||
// Read on the CPU side at replay time (the memory at the same moment a real GPU would read it at execution); slot unbound / out of range / unreadable = 0 (empty slot: dummy texture / dummy sampler).
|
||||
// A location with a GPU-side write queued in this submit (pend_hits) is still read at its current value; the first case is reported red.
|
||||
static uint32_t ubo_handle(int stage, int reg, int off) {
|
||||
if (stage < 0 || stage >= 6 || reg < 0 || reg >= 16) return 0;
|
||||
const p_bind_buf *u = &S.ubo[stage][reg];
|
||||
if (!u->addr || (uint64_t)off + 4 > u->size) return 0;
|
||||
if (pend_hits(u->addr + off, 4)) RED_ONCE(47, "无绑定句柄所在的 uniform 缓冲(阶段 %d 槽 %d +%#x)本提交里有 GPU 侧写入:读的是当前值", stage, reg, off);
|
||||
void *mb; uint64_t mo; const uint8_t *base;
|
||||
if (!mtl_addr(u->addr + off, 4, &mb, &mo) || !(base = [(__bridge id<MTLBuffer>)mb contents])) return 0;
|
||||
uint32_t h; memcpy(&h, base + mo, 4); return h;
|
||||
}
|
||||
static int encode_args_(id<MTLCommandEncoder> en, NvShader *sh, int nvn_stage, int metal_vertex);
|
||||
static int encode_args(id<MTLCommandEncoder> en, NvShader *sh, int nvn_stage, int metal_vertex) { AP_B; int r = encode_args_(en, sh, nvn_stage, metal_vertex); AP_E(3); return r; }
|
||||
static int encode_args_(id<MTLCommandEncoder> en, NvShader *sh, int nvn_stage, int metal_vertex) {
|
||||
if (!sh->ae) return 1;
|
||||
uint64_t slots[NVN_REFL_MAXB] = {0};
|
||||
args_sync_dirty();
|
||||
@@ -2715,15 +2797,16 @@ static int encode_args(id<MTLCommandEncoder> en, NvShader *sh, int nvn_stage, in
|
||||
}
|
||||
slots[aid] = gpu;
|
||||
USE((__bridge id<MTLBuffer>)mb, MTLResourceUsageRead);
|
||||
} else if (b->kind == NVN_RB_SAMP || b->kind == NVN_RB_SAMPT) { // SAMPT:合并句柄(贴图号 | 采样器号 << 20)的采样器部分 | SAMPT: the sampler part of a combined handle (texture ID | sampler ID << 20)
|
||||
int sid = reg < 128 ? (int)((b->kind == NVN_RB_SAMPT ? S.tex[nvn_stage][reg] : S.samp[nvn_stage][reg]) >> 20) : 0;
|
||||
} else if (b->kind == NVN_RB_SAMP || b->kind == NVN_RB_SAMPT || b->kind == NVN_RB_SAMPU) { // SAMPT:合并句柄(贴图号 | 采样器号 << 20)的采样器部分;SAMPU:同上,句柄在 uniform 缓冲里 | SAMPT: the sampler part of a combined handle (texture ID | sampler ID << 20); SAMPU: the same, with the handle in a uniform buffer
|
||||
int sid = b->kind == NVN_RB_SAMPU ? (int)(ubo_handle(nvn_stage, reg, b->off) >> 20) :
|
||||
reg < 128 ? (int)((b->kind == NVN_RB_SAMPT ? S.tex[nvn_stage][reg] : S.samp[nvn_stage][reg]) >> 20) : 0;
|
||||
__unsafe_unretained id<MTLSamplerState> ss = sid ? (__bridge id<MTLSamplerState>)samp_fast(sid) : nil;
|
||||
slots[aid] = sid && sid < g_nsreg && g_srid[sid] ? g_srid[sid] : dummy_samp_rid();
|
||||
USE(ss ? ss : dummy_samp(), MTLResourceUsageRead);
|
||||
if (bl && sid > 0) { int ok = sid < g_nsreg && g_sreg_ok[sid]; samp_par sp = ok ? g_sreg[sid] : (samp_par){0}; // 本段已持 g_rmu | g_rmu is already held in this section
|
||||
if (ok) PD("B %llu st%d samp reg%d sid=%d mag=%d min=%d(0 最近点 / 1 双线性;2–5 带 mip)", g_stat_pass, nvn_stage, reg, sid, (int)sp.magf, (int)sp.minf); }
|
||||
} else if (b->kind == NVN_RB_TEX) {
|
||||
int tid = reg < 128 ? (int)(S.tex[nvn_stage][reg] & 0xfffff) : 0;
|
||||
} else if (b->kind == NVN_RB_TEX || b->kind == NVN_RB_TEXU) {
|
||||
int tid = b->kind == NVN_RB_TEXU ? (int)(ubo_handle(nvn_stage, reg, b->off) & 0xfffff) : reg < 128 ? (int)(S.tex[nvn_stage][reg] & 0xfffff) : 0;
|
||||
void *tv = NULL; uint64_t trid = tid ? tex_fast_rid(tid, &tv) : 0; __unsafe_unretained id<MTLTexture> t = (__bridge id<MTLTexture>)tv;
|
||||
if (t && tid < g_ntreg) use_rec("tex", (uint64_t)g_treg[tid].t.mem, g_treg[tid].t.L.size, tid, &g_treg[tid].t);
|
||||
if (t && passdump() && tid < g_ntreg) PD("R %llu st%d ser=%llu", g_stat_pass, nvn_stage, g_treg[tid].t.serial);
|
||||
@@ -2777,7 +2860,8 @@ static int encode_args(id<MTLCommandEncoder> en, NvShader *sh, int nvn_stage, in
|
||||
if (base < 0) RED_ONCE(45, "阶段 %d 的着色器读驱动段 c0,存储缓冲表基址未实测", nvn_stage);
|
||||
else for (int r = 0; r < 16; r++) { uint64_t a = S.ssbo[nvn_stage][r].addr; uint32_t n = (uint32_t)S.ssbo[nvn_stage][r].size; memcpy(d + base + 16 * r, &a, 8); memcpy(d + base + 16 * r + 8, &n, 4); }
|
||||
} else {
|
||||
for (int r = 0; r < 128; r++) { uint32_t th = (uint32_t)S.tex[nvn_stage][r], sh_ = (uint32_t)S.samp[nvn_stage][r]; memcpy(d + 0x168 + 8 * r, &th, 4); memcpy(d + 0x568 + 8 * r, &sh_, 4); }
|
||||
for (int r = 0; r < 32; r++) { uint32_t th = (uint32_t)S.tex[nvn_stage][r]; memcpy(d + 0x20 + 8 * r, &th, 4); }
|
||||
for (int r = 0; r < 8; r++) { uint32_t ih = (uint32_t)S.img[nvn_stage][r]; memcpy(d + 0x120 + 8 * r, &ih, 4); } // 图像句柄表 0x120 + 8 r | image handle table 0x120 + 8 r // 本作(NVN 55)贴图句柄表 0x20 + 8 r(dm/gfx/tools/dmsh_build.py TEX_BASE) | This game (NVN 55): texture handle table at 0x20 + 8 r (dm/gfx/tools/dmsh_build.py TEX_BASE)
|
||||
}
|
||||
slots[aid] = g_cur_arena->gpu + doff;
|
||||
USE(db, MTLResourceUsageRead);
|
||||
@@ -4472,7 +4556,20 @@ frz_plain:;
|
||||
if (dw->count) enc_r_draw(en, mp, dw->first, dw->count);
|
||||
} else {
|
||||
if (prim == 7) { RED_ONCE(20, "带索引的四边形未实现"); return; }
|
||||
if (di->itype == 0) { RED_ONCE(21, "8 位索引未实现"); return; }
|
||||
if (di->itype == 0) { // 8 位索引:Metal 只有 16 / 32 位。回放时从客体内存读出、展开成 16 位放进本帧竞技场(SMBW 的全屏通道与最后拷进窗口那一下都用 8 位索引,不展开就整屏黑)
|
||||
// 8-bit indices: Metal only has 16 / 32-bit. At replay they are read from guest memory and widened to 16-bit in this frame's arena (SMBW's full-screen passes and the final copy into the window all use 8-bit indices; without this the whole screen is black)
|
||||
if (!di->count) return;
|
||||
void *mb; uint64_t mo; const uint8_t *src;
|
||||
if (!mtl_addr(di->ibuf, di->count, &mb, &mo) || !(src = [(__bridge id<MTLBuffer>)mb contents])) { RED_ONCE(22, "索引缓冲不在内存池里"); return; }
|
||||
if (pend_hits(di->ibuf, di->count)) RED_ONCE(48, "8 位索引缓冲本提交里有 GPU 侧写入:按当前内容展开");
|
||||
id<MTLBuffer> ab; size_t off = arena_alloc(((size_t)di->count * 2 + 15) & ~(size_t)15, &ab);
|
||||
uint16_t *d = (uint16_t *)((uint8_t *)ab.contents + off); src += mo;
|
||||
for (int32_t i = 0; i < di->count; i++) d[i] = src[i];
|
||||
use_rec("buf", di->ibuf, (uint64_t)di->count, 0, NULL);
|
||||
enc_r_draw_indexed(en, mp, di->count, MTLIndexTypeUInt16, g_cur_arena->gpu + off, (NSUInteger)di->count * 2, di->instances ? di->instances : 1, di->base_vertex, di->base_instance);
|
||||
if (g_rt_range_pending) { PD("j rt_level_range pass=%llu vc=%u", g_stat_pass, (unsigned)di->count); g_rt_range_pending = 0; }
|
||||
return;
|
||||
}
|
||||
void *mb; uint64_t mo;
|
||||
uint64_t gpu;
|
||||
if (!mtl_gpu_addr(di->ibuf, 1, &mb, &mo, &gpu)) { RED_ONCE(22, "索引缓冲不在内存池里"); return; }
|
||||
@@ -5031,6 +5128,10 @@ void mtl_exec(const uint8_t *p) {
|
||||
if (h.op == OP_SET_RT) rt_toggle_poll();
|
||||
if ((g_frz_on || g_frz_state || g_dm_rt_ab == 1) && frz_op(h.op, p + 8)) { p += h.size; continue; }
|
||||
if (trace) PD("o cmd=%p pass=%llu op=%u size=%u", p, g_stat_pass, (unsigned)h.op, (unsigned)h.size);
|
||||
// 诊断 DM_NVN_ALLOCPROF=1:显卡已分配量的增长记到上一条操作的种类上(粗略:其他线程的分配也会算进来),内存读数行附带前 4 名
|
||||
// Diagnostic DM_NVN_ALLOCPROF=1: growth of the GPU allocated size is charged to the previous operation's type (rough: allocations on other threads are counted too); the memory report line appends the top 4
|
||||
if (g_allocprof < 0) g_allocprof = getenv("DM_NVN_ALLOCPROF") != NULL;
|
||||
if (g_allocprof) { static uint64_t last; static int prev = -1; uint64_t now = g_dev.currentAllocatedSize; if (prev >= 0 && prev < 64 && now > last) g_ap_bytes[prev] += now - last; last = now; prev = h.op; }
|
||||
if (g_hoist_n && hoist_take(p)) { if (g_fz.active && p == g_fz.rt2_op) { g_fz.phase = 2; g_rt_merged = 0; PD("F %llu 合并通道进入后一个通道的绘制", g_stat_pass); } p += h.size; continue; } // 已提前执行的纯清除通道 / 已并入的后一个通道开头 // 进入后一个通道:前一个通道的同目标续用到此为止,后一个通道读前一个通道附件由 fz_p2_draw 证本像素,不再按续用规则切开 | A pure-clear render pass already executed early / the start of a later pass already merged in // Entering the later pass: the same-target continuation of the earlier pass ends here; the later pass reading the earlier pass's attachment is proven to be same-pixel by fz_p2_draw, and is no longer split by the continuation rule
|
||||
const void *a = p + 8;
|
||||
switch (h.op) {
|
||||
|
||||
+10
-2
@@ -29,18 +29,26 @@ FITS(dpool_t, NVNtexturePool); FITS(dpool_t, NVNsamplerPool);
|
||||
typedef struct {
|
||||
NVNdevice *dev; nvn_texdesc d; pool_t *pool; int64_t off;
|
||||
uint8_t has_layout, layout[8];
|
||||
uint8_t set_swz; uint16_t swz; // TextureBuilderSetSwizzle:r | g << 3 | b << 6 | a << 9(NVN 与 Metal 的通道枚举同值:0 零 1 一 2 R 3 G 4 B 5 A) | TextureBuilderSetSwizzle: r | g << 3 | b << 6 | a << 9 (NVN and Metal channel enums have the same values: 0 zero 1 one 2 R 3 G 4 B 5 A)
|
||||
} tex_builder_t; FITS(tex_builder_t, NVNtextureBuilder);
|
||||
// 字段顺序压到 0x80:较新 SDK(SMBW,NVN 55)按 0x80 字节分配 NVNtexture(main 0x978c3c 起分配、0x978cd4 初始化),
|
||||
// 原先 0x88 会写出对象尾、改坏紧邻的堆块链表。has_layout 放进 d 之后的对齐空位,layout 与 serial 补齐到 0x80。
|
||||
// Field order packed to 0x80: newer SDKs (SMBW, NVN 55) allocate NVNtexture as 0x80 bytes (allocated from main 0x978c3c, initialized at 0x978cd4);
|
||||
// the former 0x88 wrote past the object's end and corrupted the adjacent heap block's free list. has_layout sits in the alignment gap after d, layout and serial fill up to 0x80.
|
||||
typedef struct {
|
||||
uint32_t magic; nvn_texdesc d; uint8_t has_layout; nvn_texlayout L; uint8_t *mem; pool_t *pool; int64_t off; uint8_t layout[8];
|
||||
// set_swz / swz(同 tex_builder_t)占 d 之后的对齐空位,大小仍是 0x80 | set_swz / swz (as in tex_builder_t) take the alignment gap after d; the size is still 0x80
|
||||
uint32_t magic; nvn_texdesc d; uint8_t has_layout, set_swz; uint16_t swz; nvn_texlayout L; uint8_t *mem; pool_t *pool; int64_t off; uint8_t layout[8];
|
||||
uint64_t serial; // 初始化序号:回放层按它在宿主表里找 MTLTexture(游戏可能按值拷贝对象,不能存对象指针) | Initialization serial: the replay layer uses it to find the MTLTexture in the host table (the game may copy the object by value, so object pointers cannot be stored)
|
||||
} tex_t; FITS(tex_t, NVNtexture);
|
||||
_Static_assert(sizeof(tex_t) <= 0x80, "tex_t 超出较新 SDK 的 NVNtexture(0x80)");
|
||||
typedef struct { uint8_t set_levels, set_layers, set_format, set_target; int32_t base_level, nlevels, min_layer, nlayers, format, target; } view_t;
|
||||
// 较新 SDK(NVN 55,SMBW)的 NVNtextureView 只有 16 字节:游戏把它放在 16 字节的栈槽里(main +0x5796c),原先 28 字节的记录写出界、盖掉保存的 fp / lr,
|
||||
// 函数返回到 0x100000000 崩。压成 16 字节:级 / 层 / 格式 / 目标 + 通道重排与深度模板模式(后两项先只记下)
|
||||
// The newer SDK's (NVN 55, SMBW) NVNtextureView is only 16 bytes: the game keeps it in a 16-byte stack slot (main +0x5796c), and the former 28-byte record wrote out of bounds over the saved fp / lr,
|
||||
// so the function returned to 0x100000000 and crashed. Packed into 16 bytes: levels / layers / format / target + swizzle and depth-stencil mode (the last two only recorded for now)
|
||||
typedef struct { uint8_t set_levels : 1, set_layers : 1, set_format : 1, set_target : 1, set_swizzle : 1, set_dsmode : 1, dsmode : 2;
|
||||
uint8_t target, base_level, nlevels; uint16_t format, min_layer, nlayers; uint8_t swz[4]; uint16_t _rsv; } view_t;
|
||||
FITS(view_t, NVNtextureView);
|
||||
_Static_assert(sizeof(view_t) <= 16, "view_t 超出较新 SDK 的 NVNtextureView(16 字节)");
|
||||
|
||||
// 采样器参数(builder 与对象共用一份)
|
||||
// Sampler parameters (one copy shared by builder and object)
|
||||
|
||||
@@ -12,7 +12,9 @@
|
||||
#include <stdint.h>
|
||||
|
||||
enum { NVN_RB_CBUF = 1, NVN_RB_SAMP, NVN_RB_TEX, NVN_RB_IMG, NVN_RB_TBUF,
|
||||
NVN_RB_SBUFP, NVN_RB_SUPPORT, NVN_RB_C1, NVN_RB_DRV0, NVN_RB_DRV2, NVN_RB_SAMPT, NVN_RB_UBOP }; // UBOP:计算阶段 uniform 槽 r 的设备指针(Maxwell 计算阶段经 c0 地址表 + 全局内存读 uniform) // SAMPT:采样器取自贴图槽 r 的合并句柄(高位 = 采样器号) // 绑定种类(json 的 type);IMG = 可写贴图(D3D u_r,NVN 图像槽 r);TBUF = 类型化缓冲(D3D t_r Buffer<T>,NVN 贴图槽 r 的缓冲贴图) | UBOP: device pointer of compute-stage uniform slot r (the Maxwell compute stage reads uniforms via the c0 address table + global memory) // SAMPT: the sampler is taken from the combined handle of texture slot r (high bits = sampler ID) // Binding kind (type in the json); IMG = writable texture (D3D u_r, NVN image slot r); TBUF = typed buffer (D3D t_r Buffer<T>, buffer texture in NVN texture slot r)
|
||||
NVN_RB_SBUFP, NVN_RB_SUPPORT, NVN_RB_C1, NVN_RB_DRV0, NVN_RB_DRV2, NVN_RB_SAMPT, NVN_RB_UBOP, NVN_RB_TEXU, NVN_RB_SAMPU };
|
||||
// TEXU / SAMPU:无绑定贴图 / 采样器——句柄由游戏写在 uniform 槽 reg 的字节偏移 off 处(32 位:低 20 位贴图号、高 12 位采样器号),回放时现读
|
||||
// TEXU / SAMPU: bindless texture / sampler - the game writes the handle at byte offset off of uniform slot reg (32 bits: low 20 bits texture ID, high 12 bits sampler ID); read at replay time // UBOP:计算阶段 uniform 槽 r 的设备指针(Maxwell 计算阶段经 c0 地址表 + 全局内存读 uniform) // SAMPT:采样器取自贴图槽 r 的合并句柄(高位 = 采样器号) // 绑定种类(json 的 type);IMG = 可写贴图(D3D u_r,NVN 图像槽 r);TBUF = 类型化缓冲(D3D t_r Buffer<T>,NVN 贴图槽 r 的缓冲贴图) | UBOP: device pointer of compute-stage uniform slot r (the Maxwell compute stage reads uniforms via the c0 address table + global memory) // SAMPT: the sampler is taken from the combined handle of texture slot r (high bits = sampler ID) // Binding kind (type in the json); IMG = writable texture (D3D u_r, NVN image slot r); TBUF = typed buffer (D3D t_r Buffer<T>, buffer texture in NVN texture slot r)
|
||||
enum { NVN_DPF_FLOAT = 0, NVN_DPF_UINT, NVN_DPF_SINT, NVN_DPF_DEPTH }; // 哑贴图像素类(由 msl_type 定) | Dummy texture pixel class (determined by msl_type)
|
||||
enum { NVN_CT_FLOAT = 0, NVN_CT_UINT, NVN_CT_INT }; // 顶点输入分量类型 | Vertex input component type
|
||||
#define NVN_REFL_MAXB 64
|
||||
@@ -22,6 +24,7 @@ typedef struct {
|
||||
uint8_t kind, rw; // rw:存储缓冲 access 为 read_write / write / device | rw: storage buffer access is read_write / write / device
|
||||
uint8_t dtt, dpf; // 贴图槽未绑时的哑贴图:MTLTextureType 数值、像素类 | Dummy texture when the texture slot is unbound: MTLTextureType value, pixel class
|
||||
uint16_t reg, aid; // D3D 寄存器号、参数缓冲内序号 | D3D register number, index within the argument buffer
|
||||
uint16_t off; // TEXU / SAMPU:句柄在 uniform 缓冲里的字节偏移 | TEXU / SAMPU: byte offset of the handle within the uniform buffer
|
||||
} nvn_rbind;
|
||||
typedef struct {
|
||||
int nb, abi, nv; // 绑定数、参数缓冲槽、顶点输入数 | Binding count, argument buffer slot, vertex input count
|
||||
@@ -29,6 +32,7 @@ typedef struct {
|
||||
struct { uint8_t loc, ct, nvn; } v[NVN_REFL_MAXV]; // loc:Metal 顶点属性槽(DXBC 输入寄存器);nvn:NVN 顶点属性号(HLSL 语义 ATTRn 的 n) | loc: Metal vertex attribute slot (DXBC input register); nvn: NVN vertex attribute number (the n of HLSL semantic ATTRn)
|
||||
uint16_t tg[3]; // 计算线程组大小(无 = 0) | Compute thread group size (none = 0)
|
||||
uint8_t route_b, has_c1; // B 路线;有 c1 常数段 | Route B; has a c1 constant segment
|
||||
uint8_t bindless; // 有 TEXU / SAMPU 绑定(读哪张贴图要到回放时才知道) | Has TEXU / SAMPU bindings (which texture is read is known only at replay time)
|
||||
uint8_t drv_read[3]; // B:运行时读驱动段 c0 / c2(下标 0、2;出包时由 MSL 静态统计,tools/dmsh_build.py drv_reads) | B: reads driver segments c0 / c2 at runtime (indices 0, 2; gathered statically from the MSL at packaging time, tools/dmsh_build.py drv_reads)
|
||||
uint16_t c1_len; // c1 常数段长度(B;全库 0 / 256 / 512 / 768) | Length of the c1 constant segment (B; 0 / 256 / 512 / 768 across the whole library)
|
||||
// 全覆盖首绘证明用(dmsh_build.py raster_facts;缺字段 = 不可证):顶点——位置 xyz 原样取自属性 pos_attr(-1 = 否),w 为常数 1(pos_w1)或取同属性 .w;
|
||||
|
||||
@@ -36,6 +36,8 @@ int nvn_refl_from_json(NSDictionary *j, nvn_refl *o, char *err, int errlen) {
|
||||
else if ([k isEqualToString:@"samp"]) r->kind = NVN_RB_SAMP;
|
||||
else if ([k isEqualToString:@"samp_tex"]) r->kind = NVN_RB_SAMPT;
|
||||
else if ([k isEqualToString:@"tex"]) { r->kind = NVN_RB_TEX; dummy_kind(b[@"msl_type"], &r->dtt, &r->dpf); }
|
||||
else if ([k isEqualToString:@"tex_ubo"]) { r->kind = NVN_RB_TEXU; dummy_kind(b[@"msl_type"], &r->dtt, &r->dpf); r->off = (uint16_t)[b[@"off"] intValue]; o->bindless = 1; }
|
||||
else if ([k isEqualToString:@"samp_ubo"]) { r->kind = NVN_RB_SAMPU; r->off = (uint16_t)[b[@"off"] intValue]; o->bindless = 1; }
|
||||
else if ([k isEqualToString:@"img"]) { r->kind = NVN_RB_IMG; dummy_kind(b[@"msl_type"], &r->dtt, &r->dpf); }
|
||||
else if ([k isEqualToString:@"tbuf"]) { r->kind = NVN_RB_TBUF; uint8_t tt; dummy_kind(b[@"msl_type"], &tt, &r->dpf); }
|
||||
else if ([k isEqualToString:@"sbuf"]) { r->kind = NVN_RB_SBUFP; r->rw = [b[@"rw"] boolValue]; }
|
||||
@@ -44,7 +46,7 @@ int nvn_refl_from_json(NSDictionary *j, nvn_refl *o, char *err, int errlen) {
|
||||
else if ([k isEqualToString:@"c1"]) r->kind = NVN_RB_C1;
|
||||
else if ([k isEqualToString:@"drvcb"]) r->kind = [b[@"bank"] intValue] == 2 ? NVN_RB_DRV2 : NVN_RB_DRV0;
|
||||
else FAIL("B 绑定种类 %s 未实现(%s)", k.UTF8String, [b[@"msl_name"] UTF8String]);
|
||||
if ((r->kind == NVN_RB_CBUF || r->kind == NVN_RB_SAMP || r->kind == NVN_RB_SAMPT || r->kind == NVN_RB_TEX || r->kind == NVN_RB_IMG || r->kind == NVN_RB_TBUF || r->kind == NVN_RB_SBUFP || r->kind == NVN_RB_UBOP) && reg < 0)
|
||||
if ((r->kind == NVN_RB_CBUF || r->kind == NVN_RB_SAMP || r->kind == NVN_RB_SAMPT || r->kind == NVN_RB_TEX || r->kind == NVN_RB_IMG || r->kind == NVN_RB_TBUF || r->kind == NVN_RB_SBUFP || r->kind == NVN_RB_UBOP || r->kind == NVN_RB_TEXU || r->kind == NVN_RB_SAMPU) && reg < 0)
|
||||
FAIL("B 绑定 %s 没解出槽号", [b[@"msl_name"] UTF8String]);
|
||||
o->nb++;
|
||||
}
|
||||
|
||||
+1
-396
@@ -1,397 +1,2 @@
|
||||
# 预热种子清单(随包,与 shader_map.tsv 同目录)。行:S<TAB>着色器键<TAB>阶段 / R<TAB>渲染管线键(pso_skey 十六进制)/ C<TAB>计算着色器键。
|
||||
# 来源:DM_PSO_RECORD 重录并按行去重(管线键加了特化来源字段,旧行作废)——画面闸门 17 页主机 / 掌机各一轮 + cvd5 营地主机、掌机、局内两个方向切换各一局。
|
||||
# 行序 = 录制时的首次使用顺序(前端在前、局内在后;真机追加的在最后):预热按行序建,启动最先要用的最先就绪。不要排序。
|
||||
# 追加:真机(野外走打三段)用户清单里种子没有的 102 行——着色器 42、普通通道管线 35、合并通道管线 25(旧键格式按「无特化」补零转换;6 条特化片元管线缺重建参数未并入)。
|
||||
# 追加(二):真机重场面(亡者大殿二层)与野外走打用到、种子没有的 32 行——着色器 15、普通通道管线 15、合并通道 1、可读 tile 特化 1。
|
||||
S a1217a07d94c1184_b 5
|
||||
C a1217a07d94c1184_b
|
||||
S f88d27f131d71049_b 0
|
||||
S 62ddcb3faa41a92a_b 1
|
||||
S ce3ad354c986bf85_b 1
|
||||
S b3d4dd57cd4d630c_b 1
|
||||
S 69cfdc6545a66915_b 0
|
||||
S 7a865245b73eb96b_b 1
|
||||
S de7267a552710c58_b 5
|
||||
S 890de4b2c99eb9ba_b 5
|
||||
S 552f45c348a61b86_b 5
|
||||
S da5e3bfe00b88521_b 5
|
||||
S 4639dd6d3e3f0c1b_b 5
|
||||
S 098a126f92bf533a_b 5
|
||||
S 6a7a308d61928982_b 5
|
||||
S b54d192f7c620ded_b 5
|
||||
S 60f3906f2280721c_b 1
|
||||
S 646e86038aa9e52c_b 0
|
||||
S 56c2fef6ecb186d5_b 1
|
||||
S d5fcb22fbc1b5fa5_b 1
|
||||
S 45a5b1ff67fc3724_b 1
|
||||
S 5ddee022e68e6a2d_b 1
|
||||
S 4a819818b8e489c5_b 1
|
||||
S c9468c9400b8df6f_b 0
|
||||
S e71f0d71ed3b2c71_b 1
|
||||
S 8e80084d3c30340a_b 1
|
||||
S d5eaef5580e95b5c_b 0
|
||||
S 95423174e654085d_b 1
|
||||
S fa0f7422e4d89595_b 1
|
||||
S 2938a5b71b8e21b2_b 1
|
||||
S 019ce2f82edbda84_b 1
|
||||
S cc264583f2000c81_b 1
|
||||
S 2e2d6700a2569795_b 1
|
||||
S 0800e9969c585b7d_b 1
|
||||
S a1b1aab66933fa8f_b 1
|
||||
S ebcfcd1fa0a77dbc_b 1
|
||||
S 52aac1f2306b8fc5_b 1
|
||||
S 9a650561e5c40791_b 1
|
||||
R 663838643237663133316437313034395f62000000000000363264646362336661613431613932615f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000460000000000000000000000000000000000000000000000000000000000000000000000000000000100000001000000ffffffff000000002818028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000160c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 663838643237663133316437313034395f62000000000000636533616433353463393836626638355f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000460000000000000000000000000000000000000000000000000000000000000000000000000000000100000001000000ffffffff000000002818028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000160c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 663838643237663133316437313034395f62000000000000623364346464353763643464363330635f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000460000000000000000000000000000000000000000000000000000000000000000000000000000000100000001000000ffffffff000000002818028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000160c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 363963666463363534356136363931355f62000000000000376138363532343562373365623936625f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040100000100000000000000ffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000000000000016280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
C de7267a552710c58_b
|
||||
C 890de4b2c99eb9ba_b
|
||||
C 552f45c348a61b86_b
|
||||
C da5e3bfe00b88521_b
|
||||
C 4639dd6d3e3f0c1b_b
|
||||
C 098a126f92bf533a_b
|
||||
C 6a7a308d61928982_b
|
||||
C b54d192f7c620ded_b
|
||||
R 363963666463363534356136363931355f62000000000000363066333930366632323830373231635f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000ffffffff000000001004048104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000000000000016280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 363436653836303338616139653532635f62000000000000353663326665663665636231383664355f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000100000001000000f1ffffff000000001004048104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000000000000016280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 363963666463363534356136363931355f62000000000000643566636232326662633162356661355f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000ffffffff000000001004048104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000000000000016280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 363963666463363534356136363931355f62000000000000343561356231666636376663333732345f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000ffffffff000000001004048104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000000000000016280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 363963666463363534356136363931355f62000000000000356464656530323265363865366132645f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004010000000000000100000000000000ffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000000000000016280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 633934363863393430306238646636665f62000000000000653731663064373165643362326337315f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000ffffffff000000001004048104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 633934363863393430306238646636665f62000000000000386538303038346433633330333430615f62000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000073000000460000005c000000000000000000000000000000000000000000000000000000000000000100000007000000ffffffff000000001008048204000000090c02850400000012080482040000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 633934363863393430306238646636665f62000000000000386538303038346433633330333430615f62000000000000000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000073000000460000005c0000005c0000000000000000000000000000000000000000000000040100000100000007000000ffffffff000000001008048204000000090c028504000000120804820400000013040481040000001404048104000000150404810400000016040481040000001704048104000000220000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000102ffffffffff0000000000000000
|
||||
R 643565616566353538306539356235635f62000000000000393534323331373465363534303835645f6200000000000000010101010700000002ff01ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000073000000460000005c0000005c0000000000000000000000000000000000000000000000040100000100000000000000ffffffff000000001004048104000000090c028504000000120804820400000013040481040000001404048104000000150404810400000016040481040000001704048104000000220000000000000000000000162800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00ffffffff0000000000000000
|
||||
R 363963666463363534356136363931355f62000000000000666130663734323265346438393539355f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000ffffffff000000001004048104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000000000000016280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 363963666463363534356136363931355f62000000000000303139636532663832656462646138345f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000ffffffff000000001004048104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000000000000016280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 363963666463363534356136363931355f62000000000000636332363435383366323030306338315f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000000000000000000000100000001000000ffffffff00000000080b048104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000000000000016280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 363963666463363534356136363931355f62000000000000326532643637303061323536393739355f6200000000000000010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000005c00000000000000000000000000000000000000000000000000000000000000040100000100000001000000ffffffff00000000080b048104000000090c02850400000012080482040000001304048104000000140404810400000015040481040000001604048104000000170404810400000022000000000000000000000016280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff0000000000000000
|
||||
R 643565616566353538306539356235635f62000000000000303830306539393639633538356237645f6200000000000000010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000005c00000000000000000000000000000000000000000000000000000000000000040100000100000001000000ffffffff000000001014028504000000090c02850400000012080482040000001304048104000000140404810400000015040481040000001604048104000000170404810400000022000000000000000000000016280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff0000000000000000
|
||||
R 363963666463363534356136363931355f62000000000000613162316161623636393333666138665f62000000000000000101010101000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000005c0000005c00000000000000000000000000000000000000000000000000000000000000040100000100000000000000ffffffff000000001004048104000000090c028504000000120804820400000013040481040000001404048104000000150404810400000016040481040000001704048104000000220000000000000000000000162800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ff00ffffffffffff0000000000000000
|
||||
R 363963666463363534356136363931355f62000000000000656263666364316661306137376462635f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000000000000040100000100000000000000ffffffff000000001004048104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000000000000016280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 363963666463363534356136363931355f62000000000000396136353035363165356334303739315f620000000000000001010102000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000460000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000ffffffff000000001004048104000000090c02850400000012080482040000001304048104000000140404810400000015040481040000001604048104000000170404810400000022000000000000000000000016280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff0000000000000000
|
||||
C
|
||||
R 363963666463363534356136363931355f62000000000000396136353035363165356334303739315f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000460000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000ffffffff000000001004048104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000000000000016280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S ed8df20b114afc67_b 0
|
||||
S 949495670492f2e4_b 1
|
||||
S 0f715b1a5e03f11f_b 5
|
||||
S b28286da8956e9a4_b 0
|
||||
S f57adeb0447b3dd9_b 1
|
||||
S af64b417689666bf_b 0
|
||||
S 358197ac3db59cbc_b 1
|
||||
S 54f730a6c0efc118_b 0
|
||||
S 5c1ca4e7c3e4657c_b 1
|
||||
S 38f344adf801b153_b 1
|
||||
S b70c638ef69450c5_b 1
|
||||
S fbb330365d3f53ff_b 1
|
||||
S 15f7712f6966060b_b 0
|
||||
S 943e19bc3ea02a59_b 1
|
||||
S bc8c31cad521e0c8_b 0
|
||||
S f0faf05b99e7a4a2_b 1
|
||||
S fa27a102ecd14b3e_b 0
|
||||
S 1bd6a72fa95c6a07_b 1
|
||||
S 6dc4afb46d96bc66_b 0
|
||||
S 1518b75a6c1e460a_b 1
|
||||
S 267cb1d4c373d33b_b 0
|
||||
S 04ae2ac7d2b62bb5_b 1
|
||||
S 4d47301a1db40fc7_b 0
|
||||
S fcccde2ec93d3553_b 1
|
||||
S af50d9d0c4e98e8a_b 0
|
||||
S e6e68409769c8bdd_b 1
|
||||
R 656438646632306231313461666336375f62000000000000393439343935363730343932663265345f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa000000000000000100000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000000000000011100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
C 0f715b1a5e03f11f_b
|
||||
R 623238323836646138393536653961345f62000000000000663537616465623034343762336464395f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000260800000000000025100000111400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 656438646632306231313461666336375f62000000000000663537616465623034343762336464395f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000000000000011100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 656438646632306231313461666336375f62000000000000393439343935363730343932663265345f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000000000000011100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 616636346234313736383936363662665f62000000000000333538313937616333646235396362635f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff00000000100404810400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000026080000260c000025100000111400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 353466373330613663306566633131385f62000000000000333538313937616333646235396362635f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff00000000100404810400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000026080000260c000011100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 353466373330613663306566633131385f62000000000000356331636134653763336534363537635f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff00000000100404810400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000026080000260c000011100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 353466373330613663306566633131385f62000000000000333866333434616466383031623135335f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff00000000100404810400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000026080000260c000011100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 616636346234313736383936363662665f62000000000000333866333434616466383031623135335f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff00000000100404810400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000026080000260c000025100000111400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 353466373330613663306566633131385f62000000000000623730633633386566363934353063355f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff00000000100404810400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000026080000260c000011100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 626338633331636164353231653063385f62000000000000663066616630356239396537613461325f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000004600000000000000000000000000000000000000000000000000000004010000000000000100000003000000ffffffff000000001008048204000000090c0286040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e000000000000000000000016000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 666132376131303265636431346233655f62000000000000316264366137326661393563366130375f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000000000000100000001000000ffffffff00000000100804820400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e000000000000000000000016000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 366463346166623436643936626336365f62000000000000313531386237356136633165343630615f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000000000000100000001000000ffffffff00000000100804820400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e000000000000000000000016000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 323637636231643463333733643333625f62000000000000303461653261633764326236326262355f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000000000000100000001000000ffffffff00000000100804820400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e000000000000000000000016000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 346434373330316131646234306663375f62000000000000666363636465326563393364333535335f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000000000000100000001000000ffffffff00000000100804820400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e000000000000000000000016000008160000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000008000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 616635306439643063346539386538615f62000000000000653665363834303937363963386264645f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000000000000100000001000000ffffffff00000000100804820400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e000000000000000000000016000008160000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000008000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 353466373330613663306566633131385f62000000000000666262333330333635643366353366665f62000000000000000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000073000000460000005c0000005c0000000000000000000000000000000000000004010000040100000100000003000000ffffffff000000001008048204000000090c0286040000001208048204000000130404810400000014040481040000001504048104000000160404810400000017040481040000002b00000026080000260c00001110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ffffffffffff0000000000000000
|
||||
R 313566373731326636393636303630625f62000000000000393433653139626333656130326135395f62000000000000000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000073000000460000005c0000005c0000000000000000000000000000000000000004010000040100000100000003000000ffffffff000000001008048204000000090c0286040000001208048204000000130404810400000014040481040000001504048104000000160404810400000017040481040000002e0000002e0000082e0000101600001800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000001000000000000000100000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ffffffffffff0000000000000000
|
||||
R 633934363863393430306238646636665f62000000000000386538303038346433633330333430615f62000000000000000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000073000000460000005c0000005c0000000000000000000000000000000000000004010000040100000100000007000000ffffffff000000001008048204000000090c028504000000120804820400000013040481040000001404048104000000150404810400000016040481040000001704048104000000220000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000102ffffffffff0000000000000000
|
||||
R 643565616566353538306539356235635f62000000000000393534323331373465363534303835645f6200000000000000010101010700000002ff01ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000073000000460000005c0000005c0000000000000000000000000000000000000004010000040100000100000000000000ffffffff000000001004048104000000090c028504000000120804820400000013040481040000001404048104000000150404810400000016040481040000001704048104000000220000000000000000000000162800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00ffffffff0000000000000000
|
||||
S 3deaf68fd65b5298_b 0
|
||||
S d3678c2bd7da227d_b 1
|
||||
S e9ba089446aab577_b 1
|
||||
S 26d5ae725c9d0bd7_b 1
|
||||
S 54c93fa22abff9ee_b 0
|
||||
S f1ae4555a6c44f4e_b 1
|
||||
S 203a07fdc5444d77_b 1
|
||||
S 634bc9f2af5d9216_b 1
|
||||
S 7482bf0e7f5de616_b 1
|
||||
R 336465616636386664363562353239385f62000000000000643336373863326264376461323237645f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa000000000000000100000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000025080000270c0000000000000000000011180000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 336465616636386664363562353239385f62000000000000653962613038393434366161623537375f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa000000000000000100000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000025080000270c0000000000000000000011180000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 336465616636386664363562353239385f62000000000000393439343935363730343932663265345f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa000000000000000100000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000025080000270c0000000000000000000011180000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 336465616636386664363562353239385f62000000000000323664356165373235633964306264375f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa000000000000000100000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000025080000270c0000000000000000000011180000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 336465616636386664363562353239385f62000000000000393439343935363730343932663265345f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000025080000270c0000000000000000000011180000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 336465616636386664363562353239385f62000000000000323664356165373235633964306264375f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000025080000270c0000000000000000000011180000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 353463393366613232616266663965655f62000000000000663161653435353561366334346634655f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff00000000100404810400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000025080000270c0000261000002614000011180000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 353463393366613232616266663965655f62000000000000323033613037666463353434346437375f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff00000000100404810400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000025080000270c0000261000002614000011180000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 353463393366613232616266663965655f62000000000000363334626339663261663564393231365f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff00000000100404810400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000025080000270c0000261000002614000011180000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 353463393366613232616266663965655f62000000000000373438326266306537663564653631365f62000000000000000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000073000000460000005c0000005c0000000000000000000000000000000000000004010000040100000100000003000000ffffffff000000001008048204000000090c0286040000001208048204000000130404810400000014040481040000001504048104000000160404810400000017040481040000002b00000025080000270c0000261000002614000011180000000000000000000000000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ffffffffffff0000000000000000
|
||||
S a71801f7ce2dd10d_b 1
|
||||
R 666132376131303265636431346233655f62000000000000613731383031663763653264643130645f62000000000000000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000073000000460000005c0000005c0000000000000000000000000000000000000004010000040100000100000003000000ffffffff000000001008048204000000090c0286040000001208048204000000130404810400000014040481040000001504048104000000160404810400000017040481040000002e00000000000000000000001600000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ffffffffffff0000000000000000
|
||||
S f079dcf4974fd7b9_b 1
|
||||
R 656438646632306231313461666336375f62000000000000393439343935363730343932663265345f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004010000000000000100000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000000000000011100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 643565616566353538306539356235635f62000000000000663037396463663439373466643762395f6200000000000000010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000005c00000000000000000000000000000000000000000000000000000000000000040100000100000001000000ffffffff000000001014028504000000090c02850400000012080482040000001304048104000000140404810400000015040481040000001604048104000000170404810400000022000000000000000000000016280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff0000000000000000
|
||||
S 7df0f17b3b325d31_b 1
|
||||
S 00da6be561241990_b 0
|
||||
S eed4afa7b0f076ab_b 1
|
||||
S 0fbb232e68f9fbfa_b 0
|
||||
S 5ea5ef2f3e8e8135_b 1
|
||||
S 06ece8336c8c242c_b 0
|
||||
S 405e645129f39ebc_b 1
|
||||
S 3bedd0f440391756_b 1
|
||||
S 25fcbaa0072d6f8e_b 1
|
||||
S e1c00b41f984949c_b 1
|
||||
S 913751f67bc50268_b 5
|
||||
S 2cf273eba56846c3_b 1
|
||||
S f371fb3f5b46dc6d_b 1
|
||||
R 663838643237663133316437313034395f62000000000000376466306631376233623332356433315f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000460000000000000000000000000000000000000000000000000000000000000000000000000000000100000001000000ffffffff000000002818028604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000160c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 303064613662653536313234313939305f62000000000000393439343935363730343932663265345f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa000000000000000100000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000000000000011100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 303064613662653536313234313939305f62000000000000663537616465623034343762336464395f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa000000000000000100000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000000000000011100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 336465616636386664363562353239385f62000000000000663537616465623034343762336464395f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa000000000000000100000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000025080000270c0000000000000000000011180000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 656438646632306231313461666336375f62000000000000663537616465623034343762336464395f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa000000000000000100000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000000000000011100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 336465616636386664363562353239385f62000000000000656564346166613762306630373661625f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa000000000000000100000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000025080000270c0000000000000000000011180000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 306662623233326536386639666266615f62000000000000393439343935363730343932663265345f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa000000000000000100000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000260800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 303064613662653536313234313939305f62000000000000393439343935363730343932663265345f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000000000000011100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 303064613662653536313234313939305f62000000000000663537616465623034343762336464395f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000000000000011100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 336465616636386664363562353239385f62000000000000663537616465623034343762336464395f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000025080000270c0000000000000000000011180000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 336465616636386664363562353239385f62000000000000356561356566326633653865383133355f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000025080000270c0000000000000000000011180000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 306662623233326536386639666266615f62000000000000393439343935363730343932663265345f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000260800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 303665636538333336633863323432635f62000000000000356331636134653763336534363537635f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff00000000100404810400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000026080000260c000011100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 303665636538333336633863323432635f62000000000000333866333434616466383031623135335f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff00000000100404810400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000026080000260c000011100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 353463393366613232616266663965655f62000000000000333538313937616333646235396362635f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff00000000100404810400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000025080000270c0000261000002614000011180000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 303665636538333336633863323432635f62000000000000333538313937616333646235396362635f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff00000000100404810400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000026080000260c000011100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 353463393366613232616266663965655f62000000000000343035653634353132396633396562635f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff00000000100404810400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000025080000270c0000261000002614000011180000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 353463393366613232616266663965655f62000000000000336265646430663434303339313735365f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff00000000100404810400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000025080000270c0000261000002614000011180000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 353463393366613232616266663965655f62000000000000323566636261613030373264366638655f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff00000000100404810400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000025080000270c0000261000002614000011180000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 353463393366613232616266663965655f62000000000000356331636134653763336534363537635f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff00000000100404810400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000025080000270c0000261000002614000011180000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 306662623233326536386639666266615f62000000000000653163303062343166393834393439635f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff00000000100404810400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000260800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
C 913751f67bc50268_b
|
||||
R 353463393366613232616266663965655f62000000000000326366323733656261353638343663335f62000000000000000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000073000000460000005c0000005c0000000000000000000000000000000000000004010000040100000100000003000000ffffffff000000001008048204000000090c0286040000001208048204000000130404810400000014040481040000001504048104000000160404810400000017040481040000002b00000025080000270c0000261000002614000011180000000000000000000000000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ffffffffffff0000000000000000
|
||||
R 363963666463363534356136363931355f62000000000000613162316161623636393333666138665f6200000000000000010101020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000000000000040100000100000000000000ffffffff000000001004048104000000090c02850400000012080482040000001304048104000000140404810400000015040481040000001604048104000000170404810400000022000000000000000000000016280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff0000000000000000
|
||||
S 1188eaedc8db3285_b 5
|
||||
C 1188eaedc8db3285_b
|
||||
S e411675c31157063_b 0
|
||||
S 58a0b840cd0b1e58_b 1
|
||||
R 653431313637356333313135373036335f62000000000000353861306238343063643062316535385f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000000000000100000001000000ffffffff00000000100804820400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e000000000000000000000016000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S 24373179821a89b8_b 0
|
||||
S 00f1902d880682c7_b 1
|
||||
S ff91743a2d7561cc_b 0
|
||||
S 18e91ef32f8623ca_b 1
|
||||
S acd655d88042767c_b 1
|
||||
S a9a839a220417792_b 0
|
||||
S 3be9871c4d40cf22_b 1
|
||||
S f70970fd3d9d4f2c_b 0
|
||||
S 4b0b7f6cb3b4c9e9_b 1
|
||||
S 86270a3c87cee47f_b 1
|
||||
R 656438646632306231313461666336375f62000000000000393439343935363730343932663265345f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000000000000025100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 323433373331373938323161383962385f62000000000000303066313930326438383036383263375f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff00000000100404810400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000026080000260c000025100000111400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 666639313734336132643735363163635f62000000000000313865393165663332663836323363615f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff00000000100404810400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000026080000260c000011100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 353463393366613232616266663965655f62000000000000616364363535643838303432373637635f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff00000000100404810400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000025080000270c0000261000002614000011180000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 613961383339613232303431373739325f62000000000000336265393837316334643430636632325f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000004600000000000000000000000000000000000000000000000000000004010000000000000100000000000000ffffffff00000000100404810400000011040481040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000000000000011100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 663730393730666433643964346632635f62000000000000346230623766366362336234633965395f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000004600000000000000000000000000000000000000000000000000000004010000000000000100000000000000ffffffff00000000100404810400000011040481040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000000000000011100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 353466373330613663306566633131385f62000000000000666262333330333635643366353366665f62000000000000000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000073000000460000005c0000005c0000000000000000000000000000000000000004010000040100000100000003000000ffffffff000000001008048204000000090c0286040000001204048104000000130404810400000014040481040000001504048104000000160404810400000017040481040000002b00000026080000260c00001110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ffffffffffff0000000000000000
|
||||
R 666639313734336132643735363163635f62000000000000383632373061336338376365653437665f62000000000000000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000073000000460000005c0000005c0000000000000000000000000000000000000004010000040100000100000003000000ffffffff000000001008048204000000090c0286040000001204048104000000130404810400000014040481040000001504048104000000160404810400000017040481040000002b00000026080000260c00001110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ffffffffffff0000000000000000
|
||||
R 353463393366613232616266663965655f62000000000000373438326266306537663564653631365f62000000000000000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000073000000460000005c0000005c0000000000000000000000000000000000000004010000040100000100000003000000ffffffff000000001008048204000000090c0286040000001204048104000000130404810400000014040481040000001504048104000000160404810400000017040481040000002b00000025080000270c0000261000002614000011180000000000000000000000000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ffffffffffff0000000000000000
|
||||
R 313566373731326636393636303630625f62000000000000393433653139626333656130326135395f62000000000000000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000073000000460000005c0000005c0000000000000000000000000000000000000004010000040100000100000003000000ffffffff000000001008048204000000090c0286040000001204048104000000130404810400000014040481040000001504048104000000160404810400000017040481040000002e0000002e0000082e0000101600001800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000001000000000000000100000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ffffffffffff0000000000000000
|
||||
S aac1cfbce5b7c113_b 1
|
||||
S 431cd4628fe13ffe_b 0
|
||||
S 6b1a415756894d2a_b 1
|
||||
S 13f6113d923edb98_b 0
|
||||
S f71c51f9729527fb_b 1
|
||||
S 6d19a794f1206668_b 1
|
||||
S 30153313e494b538_b 0
|
||||
S 93501565681849a0_b 1
|
||||
R 353466373330613663306566633131385f62000000000000363334626339663261663564393231365f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff00000000100404810400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000026080000260c000011100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 353466373330613663306566633131385f62000000000000616163316366626365356237633131335f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff00000000100404810400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000026080000260c000011100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 303665636538333336633863323432635f62000000000000363334626339663261663564393231365f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff00000000100404810400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000026080000260c000011100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 353463393366613232616266663965655f62000000000000616163316366626365356237633131335f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff00000000100404810400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000025080000270c0000261000002614000011180000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 343331636434363238666531336666655f62000000000000366231613431353735363839346432615f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000004600000000000000000000000000000000000000000000000000000004010000000000000100000003000000ffffffff000000001008048204000000090c0286040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e0000002e0000082e00001016000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000010000000000000001000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 313366363131336439323365646239385f62000000000000663731633531663937323935323766625f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000004600000000000000000000000000000000000000000000000000000004010000000000000100000003000000ffffffff000000001008048204000000090c0286040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e0000002e0000082e00001016000018160000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000010000000000000001000000000000000080000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 353463393366613232616266663965655f62000000000000366431396137393466313230363636385f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000000000000100000000000000ffffffff00000000100404810400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000025080000270c0000261000002614000011180000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 363963666463363534356136363931355f62000000000000346138313938313862386534383963355f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000ffffffff000000001004048104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000000000000016280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 363963666463363534356136363931355f62000000000000346138313938313862386534383963355f6200000000000000010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff000000001004048104000000090c02860400000012080482040000001304048104000000140404810400000015040481040000001604048104000000170404810400000022000000000000000000000016280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff0000000000000000
|
||||
R 353463393366613232616266663965655f62000000000000366431396137393466313230363636385f6200000000000000010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff000000001004048104000000090c0286040000001208048204000000130404810400000014040481040000001504048104000000160404810400000017040481040000002b00000025080000270c0000261000002614000011180000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff0000000000000000
|
||||
R 346434373330316131646234306663375f62000000000000666363636465326563393364333535335f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000040100000100000001000000ffffffff00000000100804820400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e000000000000000000000016000008160000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000008000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 666132376131303265636431346233655f62000000000000316264366137326661393563366130375f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000040100000100000001000000ffffffff00000000100804820400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e000000000000000000000016000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 333031353333313365343934623533385f62000000000000393335303135363536383138343961305f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000000000000100000001000000ffffffff00000000100804820400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e000000000000000000000016000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 336465616636386664363562353239385f62000000000000356561356566326633653865383133355f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa000000000000000100000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000025080000270c0000000000000000000011180000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S 832d4dd08089e58c_b 0
|
||||
S 94295c0108746c40_b 1
|
||||
R 383332643464643038303839653538635f62000000000000393432393563303130383734366334305f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000004600000000000000000000000000000000000000000000000000000004010000000000000100000003000000ffffffff000000001008048204000000090c0286040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e0000002e0000082e00001016000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000010000000000000001000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 353463393366613232616266663965655f62000000000000333866333434616466383031623135335f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff00000000100404810400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000025080000270c0000261000002614000011180000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 303665636538333336633863323432635f62000000000000366431396137393466313230363636385f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000000000000100000000000000ffffffff00000000100404810400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000026080000260c000011100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 303665636538333336633863323432635f62000000000000366431396137393466313230363636385f6200000000000000010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff000000001004048104000000090c0286040000001208048204000000130404810400000014040481040000001504048104000000160404810400000017040481040000002b00000026080000260c000011100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff0000000000000000
|
||||
R 616635306439643063346539386538615f62000000000000653665363834303937363963386264645f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000040100000100000001000000ffffffff00000000100804820400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e000000000000000000000016000008160000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000008000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 366463346166623436643936626336365f62000000000000313531386237356136633165343630615f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000040100000100000001000000ffffffff00000000100804820400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e000000000000000000000016000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 323637636231643463333733643333625f62000000000000303461653261633764326236326262355f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000040100000100000001000000ffffffff00000000100804820400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e000000000000000000000016000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 303665636538333336633863323432635f62000000000000366431396137393466313230363636385f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff00000000100404810400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000026080000260c000011100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S 34d99325b3a5896f_b 0
|
||||
S 49335a14af61b79e_b 1
|
||||
R 333464393933323562336135383936665f62000000000000343933333561313461663631623739655f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000000000000100000001000000ffffffff00000000100804820400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e000000000000000000000016000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S 57308d2793f59f72_b 0
|
||||
S fed04d7e34db9788_b 1
|
||||
R 353733303864323739336635396637325f62000000000000666564303464376533346462393738385f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000004600000000000000000000000000000000000000000000000000000004010000000000000100000003000000ffffffff000000001008048204000000090c0286040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e000000000000000000000016000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S 8ac93c54cfb3cbe3_b 0
|
||||
S 0d721a0acc36c0bf_b 1
|
||||
R 386163393363353463666233636265335f62000000000000306437323161306163633336633062665f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000460000000000000000000000000000000000000000000000000000000000000000000000000000000100000001000000ffffffff0000000028180a860400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e000000251000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 623238323836646138393536653961345f62000000000000663537616465623034343762336464395f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa000000000000000100000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000260800000000000025100000111400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S 60f397caa5e8b057_b 0
|
||||
S 8874c23936fc2a39_b 1
|
||||
S 434101471006d0e5_b 0
|
||||
S b98cd9f809e2bb4a_b 1
|
||||
R 343334313031343731303036643065355f62000000000000623938636439663830396532626234615f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000000000000100000001000000ffffffff00000000100804820400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e000000000000000000000016000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 363066333937636161356538623035375f62000000000000383837346332333933366663326133395f62000000000000000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000073000000460000005c0000005c0000000000000000000000000000000000000004010000040100000100000003000000ffffffff000000001008048204000000090c0286040000001208048204000000130404810400000014040481040000001504048104000000160404810400000017040481040000002e00000000000000000000001600000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ffffffffffff0000000000000000
|
||||
R 363963666463363534356136363931355f62000000000000353261616331663233303662386663355f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000460000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000ffffffff000000001004048104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000000000000016280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S 43c6fdfecea8a4cf_b 0
|
||||
S d8c1f99434f76ac6_b 1
|
||||
S aaa6e9e56009665b_b 1
|
||||
R 343363366664666563656138613463665f62000000000000643863316639393433346637366163365f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000000000000100000001000000ffffffff00000000100804820400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000025080000270c0000261000002614000011180000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 363066333937636161356538623035375f62000000000000616161366539653536303039363635625f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000000000000100000001000000ffffffff00000000100804820400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e000000000000000000000016000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S 26f0e1b6606f8f8f_b 1
|
||||
R 666132376131303265636431346233655f62000000000000323666306531623636303666386638665f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000000000000100000001000000ffffffff00000000100804820400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e000000000000000000000016000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 363963666463363534356136363931355f62000000000000323933386135623731623865323162325f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000ffffffff000000001004048104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000000000000016280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 363963666463363534356136363931355f62000000000000326532643637303061323536393739355f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000000000000040100000100000001000000ffffffff00000000080b048104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000000000000016280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 643565616566353538306539356235635f62000000000000303830306539393639633538356237645f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000000000000040100000100000001000000ffffffff000000001014028504000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000000000000016280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 363963666463363534356136363931355f62000000000000613162316161623636393333666138665f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000000000000040100000100000000000000ffffffff000000001004048104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000000000000016280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 353463393366613232616266663965655f62000000000000373438326266306537663564653631365f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000004600000000000000000000000000000000000000000000000000000004010000040100000100000003000000ffffffff000000001008048204000000090c0286040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000025080000270c0000261000002614000011180000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S 4dffa355f2fbcdaf_b 0
|
||||
S f08b6f90ba832e04_b 1
|
||||
R 346466666133353566326662636461665f62000000000000663038623666393062613833326530345f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000004600000000000000000000000000000000000000000000000000000004010000000000000100000000000000ffffffff00000000100404810400000011040481040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000025080000270c0000261000002614000011180000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 363963666463363534356136363931355f62000000000000346138313938313862386534383963355f62000000000000000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000073000000460000005c0000005c0000000000000000000000000000000000000004010000040100000100000000000000ffffffff0000000010040481040000001104048104000000120404810400000013040481040000001404048104000000150404810400000016040481040000001704048104000000220000000000000000000000162800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffff00ffffffffff0000000000000000
|
||||
R 363963666463363534356136363931355f62000000000000346138313938313862386534383963355f62000000000000000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000073000000460000005c0000005c0000000000000000000000000000000000000004010000040100000100000000000000ffffffff000000001004048104000000090c028504000000120804820400000013040481040000001404048104000000150404810400000016040481040000001704048104000000220000000000000000000000162800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffff00ffffffffff0000000000000000
|
||||
S 6fe6fa561417c0e5_b 0
|
||||
S 4d3ad70532012a16_b 1
|
||||
S ca452e812a294f77_b 0
|
||||
S 508f43146f0c9927_b 1
|
||||
S a094013b6c675fef_b 0
|
||||
S f1ef8fdeb5c0bd56_b 1
|
||||
R 366665366661353631343137633065355f62000000000000346433616437303533323031326131365f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000004600000000000000000000000000000000000000000000000000000004010000040100000100000003000000ffffffff000000001008048204000000090c0286040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e000000000000000000000016000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 636134353265383132613239346637375f62000000000000353038663433313436663063393932375f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000004600000000000000000000000000000000000000000000000000000004010000000000000100000003000000ffffffff000000001008048204000000090c0286040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e000000000000000000000016000008160000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000008000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 613039343031336236633637356665665f62000000000000663165663866646562356330626435365f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000004600000000000000000000000000000000000000000000000000000004010000000000000100000003000000ffffffff000000001008048204000000090c0286040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e000000000000000000000016000008160000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000008000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S 7df3a39125b025fc_b 0
|
||||
S 372d8bfaed684eb8_b 1
|
||||
R 376466336133393132356230323566635f62000000000000333732643862666165643638346562385f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000004600000000000000000000000000000000000000000000000000000004010000040100000100000003000000ffffffff000000001008048204000000090c0286040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e000000000000000000000016000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S 44ff7d4cebcbd1ec_b 0
|
||||
S 87574c4c2e6808c1_b 1
|
||||
R 343466663764346365626362643165635f62000000000000383735373463346332653638303863315f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000004600000000000000000000000000000000000000000000000000000004010000040100000100000003000000ffffffff000000001008048204000000090c0286040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000026080000260c000025100000111400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S 35a28eb15010bf03_b 0
|
||||
S aca45224f1489150_b 1
|
||||
S 3fb8919ff6ef9db2_b 1
|
||||
R 333561323865623135303130626630335f62000000000000616361343532323466313438393135305f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000004600000000000000000000000000000000000000000000000000000004010000040100000100000003000000ffffffff000000001008048204000000090c0286040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000002e0000182e000020000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000100000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 303431363065343432623162616236645f62000000000000336662383931396666366566396462325f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000004600000000000000000000000000000000000000000000000000000004010000040100000100000003000000ffffffff000000001008048204000000090c0286040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e000000000000000000000016000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S a4c74a484f864372_b 0
|
||||
S c1d9206301953400_b 1
|
||||
S 74cb94eeb5b40d0b_b 1
|
||||
R 613463373461343834663836343337325f62000000000000633164393230363330313935333430305f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000004600000000000000000000000000000000000000000000000000000004010000040100000100000003000000ffffffff000000001008048204000000090c0286040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e000000000000000000000016000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 333031353333313365343934623533385f62000000000000373463623934656562356234306430625f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000000000000100000001000000ffffffff00000000100804820400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e000000000000000000000016000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 363963666463363534356136363931355f62000000000000353261616331663233303662386663355f620000000000000001010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000460000004600000000000000000000000000000000000000000000000000000000000000000000000100000000000000ffffffff000000001004048104000000090c02850400000012080482040000001304048104000000140404810400000015040481040000001604048104000000170404810400000022000000000000000000000016280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff0000000000000000
|
||||
R 643565616566353538306539356235635f62000000000000663337316662336635623436646336645f6200000000000000010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000005c00000000000000000000000000000000000000000000000000000000000000040100000100000001000000ffffffff000000001014028504000000090c02850400000012080482040000001304048104000000140404810400000015040481040000001604048104000000170404810400000022000000000000000000000016280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff0000000000000000
|
||||
R 643565616566353538306539356235635f62000000000000393534323331373465363534303835645f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000000000000040100000100000000000000ffffffff000000001004048104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000000000000016280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 353466373330613663306566633131385f62000000000000666262333330333635643366353366665f6200000000000000010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000040100000100000003000000ffffffff000000001008048204000000090c0286040000001208048204000000130404810400000014040481040000001504048104000000160404810400000017040481040000002b00000026080000260c00001110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ffffffffffff0000000000000000
|
||||
R 313566373731326636393636303630625f62000000000000393433653139626333656130326135395f6200000000000000010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000040100000100000003000000ffffffff000000001008048204000000090c0286040000001208048204000000130404810400000014040481040000001504048104000000160404810400000017040481040000002e0000002e0000082e0000101600001800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000001000000000000000100000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ffffffffffff0000000000000000
|
||||
R 643565616566353538306539356235635f62000000000000393534323331373465363534303835645f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff000000001004048104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000000000000016280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 353463393366613232616266663965655f62000000000000373438326266306537663564653631365f6200000000000000010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000040100000100000003000000ffffffff000000001008048204000000090c0286040000001208048204000000130404810400000014040481040000001504048104000000160404810400000017040481040000002b00000025080000270c0000261000002614000011180000000000000000000000000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ffffffffffff0000000000000000
|
||||
R 353463393366613232616266663965655f62000000000000326366323733656261353638343663335f6200000000000000010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000040100000100000003000000ffffffff000000001008048204000000090c0286040000001208048204000000130404810400000014040481040000001504048104000000160404810400000017040481040000002b00000025080000270c0000261000002614000011180000000000000000000000000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ffffffffffff0000000000000000
|
||||
R 363963666463363534356136363931355f62000000000000326532643637303061323536393739355f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000040100000100000001000000ffffffff00000000080b048104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000000000000016280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 643565616566353538306539356235635f62000000000000663337316662336635623436646336645f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000040100000100000001000000ffffffff000000001014028504000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000000000000016280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 353466373330613663306566633131385f62000000000000666262333330333635643366353366665f6200000000000000010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000000000000000000000100000003000000ffffffff000000001008048204000000090c0286040000001208048204000000130404810400000014040481040000001504048104000000160404810400000017040481040000002b00000026080000260c00001110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ffffffffffff0000000000000000
|
||||
R 353463393366613232616266663965655f62000000000000326366323733656261353638343663335f6200000000000000010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000000000000000000000100000003000000ffffffff000000001008048204000000090c0286040000001208048204000000130404810400000014040481040000001504048104000000160404810400000017040481040000002b00000025080000270c0000261000002614000011180000000000000000000000000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ffffffffffff0000000000000000
|
||||
R 353463393366613232616266663965655f62000000000000373438326266306537663564653631365f6200000000000000010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000000000000000000000100000003000000ffffffff000000001008048204000000090c0286040000001208048204000000130404810400000014040481040000001504048104000000160404810400000017040481040000002b00000025080000270c0000261000002614000011180000000000000000000000000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ffffffffffff0000000000000000
|
||||
S 50f0ce62b195446e_b 1
|
||||
R 313566373731326636393636303630625f62000000000000393433653139626333656130326135395f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000004600000000000000000000000000000000000000000000000000000004010000000000000100000003000000ffffffff000000001008048204000000090c0286040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e0000002e0000082e00001016000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000010000000000000001000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 643565616566353538306539356235635f62000000000000353066306365363262313935343436655f6200000000000000010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000005c00000000000000000000000000000000000000000000000000000000000000040100000100000001000000ffffffff000000001014028504000000090c02850400000012080482040000001304048104000000140404810400000015040481040000001604048104000000170404810400000022000000000000000000000016280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff0000000000000000
|
||||
R 363963666463363534356136363931355f62000000000000346138313938313862386534383963355f6200000000000000010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff000000001004048104000000090c02860400000012040481040000001304048104000000140404810400000015040481040000001604048104000000170404810400000022000000000000000000000016280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff0000000000000000
|
||||
R 303665636538333336633863323432635f62000000000000366431396137393466313230363636385f6200000000000000010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff000000001004048104000000090c0286040000001204048104000000130404810400000014040481040000001504048104000000160404810400000017040481040000002b00000026080000260c000011100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff0000000000000000
|
||||
R 353463393366613232616266663965655f62000000000000326366323733656261353638343663335f62000000000000000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000073000000460000005c0000005c0000000000000000000000000000000000000004010000040100000100000003000000ffffffff000000001008048204000000090c0286040000001204048104000000130404810400000014040481040000001504048104000000160404810400000017040481040000002b00000025080000270c0000261000002614000011180000000000000000000000000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ffffffffffff0000000000000000
|
||||
R 666132376131303265636431346233655f62000000000000613731383031663763653264643130645f62000000000000000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000073000000460000005c0000005c0000000000000000000000000000000000000004010000040100000100000003000000ffffffff000000001008048204000000090c0286040000001204048104000000130404810400000014040481040000001504048104000000160404810400000017040481040000002e00000000000000000000001600000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ffffffffffff0000000000000000
|
||||
R 366665366661353631343137633065355f62000000000000346433616437303533323031326131365f62000000000000000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000073000000460000005c0000005c0000000000000000000000000000000000000004010000040100000100000003000000ffffffff000000001008048204000000090c0286040000001208048204000000130404810400000014040481040000001504048104000000160404810400000017040481040000002e00000000000000000000001600000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ffffffffffff0000000000000000
|
||||
R 376466336133393132356230323566635f62000000000000333732643862666165643638346562385f62000000000000000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000073000000460000005c0000005c0000000000000000000000000000000000000004010000040100000100000003000000ffffffff000000001008048204000000090c0286040000001208048204000000130404810400000014040481040000001504048104000000160404810400000017040481040000002e00000000000000000000001600000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ffffffffffff0000000000000000
|
||||
R 343466663764346365626362643165635f62000000000000383735373463346332653638303863315f62000000000000000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000073000000460000005c0000005c0000000000000000000000000000000000000004010000040100000100000003000000ffffffff000000001008048204000000090c0286040000001208048204000000130404810400000014040481040000001504048104000000160404810400000017040481040000002b00000026080000260c00002510000011140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ffffffffffff0000000000000000
|
||||
R 333561323865623135303130626630335f62000000000000616361343532323466313438393135305f62000000000000000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000073000000460000005c0000005c0000000000000000000000000000000000000004010000040100000100000003000000ffffffff000000001008048204000000090c0286040000001208048204000000130404810400000014040481040000001504048104000000160404810400000017040481040000002e000000000000000000000000000000000000002e0000182e00002000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000010000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ffffffffffff0000000000000000
|
||||
R 303431363065343432623162616236645f62000000000000336662383931396666366566396462325f62000000000000000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000073000000460000005c0000005c0000000000000000000000000000000000000004010000040100000100000003000000ffffffff000000001008048204000000090c0286040000001208048204000000130404810400000014040481040000001504048104000000160404810400000017040481040000002e00000000000000000000001600000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ffffffffffff0000000000000000
|
||||
R 333031353333313365343934623533385f62000000000000373463623934656562356234306430625f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000040100000100000001000000ffffffff00000000100804820400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e000000000000000000000016000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 613463373461343834663836343337325f62000000000000633164393230363330313935333430305f62000000000000000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000073000000460000005c0000005c0000000000000000000000000000000000000004010000040100000100000003000000ffffffff000000001008048204000000090c0286040000001208048204000000130404810400000014040481040000001504048104000000160404810400000017040481040000002e00000000000000000000001600000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ffffffffffff0000000000000000
|
||||
S 228ac21b01ac8272_b 0
|
||||
S b996352a54c7c554_b 0
|
||||
S b3e1b35237757df2_b 1
|
||||
S e833fe6d44bd091e_b 0
|
||||
S 9dafaeb1b3505783_b 1
|
||||
R 323238616332316230316163383237325f620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000260800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 623939363335326135346337633535345f62000000000000623365316233353233373735376466325f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff00000000100404810400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000026080000260c000011100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 653833336665366434346264303931655f62000000000000396461666165623162333530353738335f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000000000000100000001000000ffffffff00000000100804820400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000026080000260c000025100000111400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S 9ecd8e8edc829b2c_b 0
|
||||
S c9871ba3e716aace_b 1
|
||||
R 396563643865386564633832396232635f62000000000000633938373162613365373136616163655f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000000000000100000001000000ffffffff00000000100804820400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000026080000260c000011100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S f02c213a0471ae4b_b 1
|
||||
R 666132376131303265636431346233655f62000000000000663032633231336130343731616534625f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000004600000000000000000000000000000000000000000000000000000004010000000000000100000003000000ffffffff000000001008048204000000090c0286040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e000000000000000000000016000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S 3296391e11cf92a6_b 0
|
||||
S 2747a1418c858a23_b 1
|
||||
R 333239363339316531316366393261365f62000000000000323734376131343138633835386132335f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000000000000100000001000000ffffffff00000000100804820400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000026080000260c000025100000111400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 666132376131303265636431346233655f62000000000000663032633231336130343731616534625f62000000000000000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000073000000460000005c0000005c0000000000000000000000000000000000000004010000040100000100000003000000ffffffff000000001008048204000000090c0286040000001208048204000000130404810400000014040481040000001504048104000000160404810400000017040481040000002e00000000000000000000001600000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ffffffffffff0000000000000000
|
||||
S afdd1d5f24a570d1_b 0
|
||||
S 279d49d320adca06_b 1
|
||||
R 616664643164356632346135373064315f62000000000000323739643439643332306164636130365f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000000000000100000001000000ffffffff00000000100804820400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e0000002e0000082e00001016000018160000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000010000000000000001000000000000000080000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S 7ec0ca4f8e27c10e_b 1
|
||||
R 343331636434363238666531336666655f62000000000000376563306361346638653237633130655f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000000000000100000001000000ffffffff00000000100804820400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e0000002e0000082e00001016000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000010000000000000001000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 353466373330613663306566633131385f62000000000000616364363535643838303432373637635f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff00000000100404810400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000026080000260c000011100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S 2f2a18e30b53c626_b 1
|
||||
R 303064613662653536313234313939305f62000000000000326632613138653330623533633632365f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa000000000000000100000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000000000000011100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 303064613662653536313234313939305f62000000000000323664356165373235633964306264375f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa000000000000000100000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000000000000011100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S 2a0d8f4680281390_b 0
|
||||
S d147e21cbc820772_b 1
|
||||
S ec7ab6f7041d3dd8_b 0
|
||||
S 9d0e6650dcee931c_b 1
|
||||
S d1c50a68ed5a4c2b_b 0
|
||||
S ffa1003fd7d94c19_b 1
|
||||
R 326130643866343638303238313339305f62000000000000643134376532316362633832303737325f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000004600000000000000000000000000000000000000000000000000000004010000000000000100000003000000ffffffff000000001008048204000000090c0286040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e0000002e0000082e00001016000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000010000000000000001000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 656337616236663730343164336464385f62000000000000396430653636353064636565393331635f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000004600000000000000000000000000000000000000000000000000000004010000000000000100000003000000ffffffff000000001008048204000000090c0286040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e0000002e0000082e00001016000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000010000000000000001000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 643163353061363865643561346332625f62000000000000666661313030336664376439346331395f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000004600000000000000000000000000000000000000000000000000000004010000000000000100000003000000ffffffff000000001008048204000000090c0286040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e0000002e0000082e00001016000018160000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000010000000000000001000000000000000080000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S 46ac23df6139630d_b 0
|
||||
S 4912ef6a3d3fd770_b 1
|
||||
R 343661633233646636313339363330645f62000000000000343931326566366133643366643737305f62000000000000000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000073000000460000005c0000005c0000000000000000000000000000000000000004010000040100000100000003000000ffffffff000000001008048204000000090c0286040000001208048204000000130404810400000014040481040000001504048104000000160404810400000017040481040000002e0000002e0000082e0000101600001800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000001000000000000000100000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ffffffffffff0000000000000000
|
||||
S 1f752fd6f02d54bf_b 1
|
||||
R 366463346166623436643936626336365f62000000000000316637353266643666303264353462665f62000000000000000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000073000000460000005c0000005c0000000000000000000000000000000000000004010000040100000100000003000000ffffffff000000001008048204000000090c0286040000001208048204000000130404810400000014040481040000001504048104000000160404810400000017040481040000002e00000000000000000000001600000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ffffffffffff0000000000000000
|
||||
R 643565616566353538306539356235635f62000000000000393534323331373465363534303835645f6200000000000000010101010f000000020301ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000073000000460000005c0000005c0000000000000000000000000000000000000004010000040100000100000000000000ffffffff000000001004048104000000090c028504000000120804820400000013040481040000001404048104000000150404810400000016040481040000001704048104000000220000000000000000000000162800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00ffffffff0000000000000000
|
||||
S 6a4347e473cc751b_b 1
|
||||
R 353463393366613232616266663965655f62000000000000366134333437653437336363373531625f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff00000000100404810400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000025080000270c0000261000002614000011180000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S 44e41de8108725b1_b 1
|
||||
S 40e6a1e73082d7c8_b 1
|
||||
S a0c341d1743322bb_b 1
|
||||
S 525ad1193849d94c_b 1
|
||||
R 353466373330613663306566633131385f62000000000000666262333330333635643366353366665f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000004600000000000000000000000000000000000000000000000000000004010000040100000100000003000000ffffffff000000001008048204000000090c0286040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000026080000260c000011100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 336465616636386664363562353239385f62000000000000393439343935363730343932663265345f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000004600000000000000000000000000000000000000000000000000000004010000000000000100000000000000ffffffff00000000100404810400000011040481040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000025080000270c0000000000000000000011180000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 353463393366613232616266663965655f62000000000000343465343164653831303837323562315f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000004600000000000000000000000000000000000000000000000000000004010000000000000100000003000000ffffffff000000001008048204000000090c0286040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000025080000270c0000261000002614000011180000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 336465616636386664363562353239385f62000000000000356561356566326633653865383133355f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000004600000000000000000000000000000000000000000000000000000004010000000000000100000000000000ffffffff00000000100404810400000011040481040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000025080000270c0000000000000000000011180000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 353463393366613232616266663965655f62000000000000343065366131653733303832643763385f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000004600000000000000000000000000000000000000000000000000000004010000000000000100000003000000ffffffff000000001008048204000000090c0286040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000025080000270c0000261000002614000011180000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 353463393366613232616266663965655f62000000000000613063333431643137343333323262625f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000004600000000000000000000000000000000000000000000000000000004010000000000000100000003000000ffffffff000000001008048204000000090c0286040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000025080000270c0000261000002614000011180000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 353463393366613232616266663965655f62000000000000353235616431313933383439643934635f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000004600000000000000000000000000000000000000000000000000000004010000000000000100000003000000ffffffff000000001008048204000000090c0286040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000025080000270c0000261000002614000011180000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 303431363065343432623162616236645f62000000000000336662383931396666366566396462325f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000004600000000000000000000000000000000000000000000000000000004010000000000000100000003000000ffffffff000000001008048204000000090c0286040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e000000000000000000000016000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S cd9aa82ceb6746c6_b 1
|
||||
R 303064613662653536313234313939305f62000000000000636439616138326365623637343663365f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000fa000000000000000100000000000000ffffffff00000000100404810400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000000000000011100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S fa85525dc10e694b_b 0
|
||||
S 6164a15e85a4298c_b 0
|
||||
S 5f5438069d94ed61_b 1
|
||||
R 666138353532356463313065363934625f620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 363136346131356538356134323938635f62000000000000356635343338303639643934656436315f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000040100000100000000000000ffffffff00000000100404810400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b00000026080000260c000011100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S a199c4d81cd1d22b_b 0
|
||||
S 031add7213cfbffe_b 1
|
||||
R 613139396334643831636431643232625f62000000000000303331616464373231336366626666655f62000000000000000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000073000000460000005c0000005c0000000000000000000000000000000000000004010000040100000100000003000000ffffffff000000001008048204000000090c0286040000001208048204000000130404810400000014040481040000001504048104000000160404810400000017040481040000002e0000002e0000082e0000101600001816000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000001000000000000000100000000000000008000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ffffffffffff0000000000000000
|
||||
S 25299715e6687a28_b 0
|
||||
S 1f2749847659cbcb_b 1
|
||||
R 323532393937313565363638376132385f62000000000000316632373439383437363539636263625f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000000000000100000001000000ffffffff00000000100804820400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e000000000000000000000016000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
S 95b2624368e1b442_b 0
|
||||
S eafb083540b56169_b 1
|
||||
R 393562323632343336386531623434325f62000000000000656166623038333534306235363136395f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000004010000000000000100000001000000ffffffff00000000100804820400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e000000000000000000000016000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
R 363066333937636161356538623035375f62000000000000383837346332333933366663326133395f620000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730000004600000000000000000000000000000000000000000000000000000004010000040100000100000003000000ffffffff000000001008048204000000090c0286040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e000000000000000000000016000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
# 本作尚未录制(DM_PSO_RECORD):空表 = 不预热。行序 = 首次使用顺序,不要排序。
|
||||
|
+72
-6928
File diff suppressed because it is too large.
Load diff
+12814
-10856
File diff suppressed because it is too large.
Load diff
@@ -1,17 +1,2 @@
|
||||
# kind: evidence Switch 控制段键冲突的 PC 候选裁定(差异最小 → 最简 → 哈希最小)
|
||||
dm_ctl_sha16 chosen_pc class candidates(pc:差异:规模) records
|
||||
170d711cb0290746 67c858efc3fcf781 指令块不同(真实代码差异,Switch 编成同一二进制;需运行期定位包与序号或画面确认) 67c858efc3fcf781:4:31 83bb2ed8030f2e5b:4:31 ps_hair_p.bin#8 ps_hair_p.bin#10
|
||||
228ac21b01ac8272 261a6029b87a3a5b 指令块等长·输入签名不同(疑为输入寄存器重编号,同按配对选) 261a6029b87a3a5b:1:3 72e75628cab4e60a:1:3 7ca2c6b7e4d55e50:1:3 vs_popcorn_liquid_mesh_depth_v.bin#0 vs_popcorn_liquid_mesh_depth_v.bin#2 vs_popcorn_uber_mesh_depth_v.bin#0 vs_popcorn_uber_mesh_depth_v.bin#8
|
||||
463d9e09323caaca f3334e2447570533 指令块相同·仅输入签名不同(建管线时按顶点着色器输出配对选) f3334e2447570533:0:1 f3e1146daf6518c4:0:1 ps_models_hash_p.bin#0 ps_quad_efficiency_collect_p.bin#0
|
||||
60ff01e8ae40e485 3ac2e99eac3c9cb8 指令块等长·输入签名不同(疑为输入寄存器重编号,同按配对选) 3ac2e99eac3c9cb8:2:4 3c63926eff1b340d:2:4 vs_popcorn_uber_mesh_depth_v.bin#1 vs_popcorn_uber_mesh_depth_v.bin#9
|
||||
618342d86ec36c81 48611265537b4bf7 指令块不同(真实代码差异,Switch 编成同一二进制;需运行期定位包与序号或画面确认) 48611265537b4bf7:0:9 51de8ea74df55fd8:0:9 ps_compose_p.bin#2 ps_compose_p.bin#5
|
||||
62d3197aa02247ed ecba1a74eda4d42a 指令块等长·输入签名不同(疑为输入寄存器重编号,同按配对选) ecba1a74eda4d42a:2:4 fe107f2746969f21:2:4 vs_popcorn_mesh_depth_v.bin#1 vs_popcorn_mesh_depth_v.bin#9 vs_popcorn_stencil_v.bin#5
|
||||
63616a06a1ccd034 af002517ae365cc4 指令块不同(真实代码差异,Switch 编成同一二进制;需运行期定位包与序号或画面确认) af002517ae365cc4:4:30 f361d09d2f890138:4:30 ps_hair_p.bin#2 ps_hair_p.bin#4
|
||||
74afe0c274ac090e 4a053d52b1e635c7 指令块相同·仅输入签名不同(建管线时按顶点着色器输出配对选) 4a053d52b1e635c7:0:2 50f10bae0d377115:0:2 a51dd28f80e80687:0:2 ps_popcorn_default_p.bin#144 ps_popcorn_default_p.bin#146 ps_popcorn_default_p.bin#147 ps_popcorn_default_p.bin#149 ps_popcorn_default_p.bin#150 ps_popcorn_default_p.bin#152 ps_popcorn_default_p.bin#153 ps_popcorn_default_p.bin#156 ps_popcorn_default_p.bin#159
|
||||
7bf4832d3985c501 15b71014e328ab75 指令块相同·仅输入签名不同(建管线时按顶点着色器输出配对选) 15b71014e328ab75:0:2 b674a0db47d3629b:0:2 ps_alpha_threshold_velocity_p.bin#0 ps_alpha_threshold_velocity_p.bin#2 ps_models_velocity_p.bin#0
|
||||
7fbab804c6ba3dcf 506653c87391b685 指令块相同·仅输入签名不同(建管线时按顶点着色器输出配对选) 506653c87391b685:0:4 6510fa008b8bc356:0:4 vs_models_grass_force_v.bin#2 vs_models_grass_force_v.bin#3
|
||||
949495670492f2e4 6f571a39533eb2d8 指令块相同·仅输入签名不同(建管线时按顶点着色器输出配对选) 6f571a39533eb2d8:0:0 bb1e231e80b4442f:0:0 be1975491388c4ac:0:0 ps_alpha_threshold_shadows_p.bin#0 ps_alpha_threshold_shadows_p.bin#2 ps_models_shadows_p.bin#0 ps_popcorn_stencil_p.bin#0
|
||||
9a650561e5c40791 07e14c16200e4132 指令块不同(真实代码差异,Switch 编成同一二进制;需运行期定位包与序号或画面确认) 07e14c16200e4132:1:7 263766e5cd512650:1:7 ps_compose_p.bin#1 ps_compose_p.bin#4
|
||||
b2ee08eed36b3efd 69a41eaba6863a1f 指令块相同·仅输入签名不同(建管线时按顶点着色器输出配对选) 69a41eaba6863a1f:0:2 88e11d6d09d2fd24:0:2 e3efadc299b11545:0:2 ps_popcorn_default_p.bin#180 ps_popcorn_default_p.bin#182 ps_popcorn_default_p.bin#183 ps_popcorn_default_p.bin#185 ps_popcorn_default_p.bin#186 ps_popcorn_default_p.bin#188 ps_popcorn_default_p.bin#189 ps_popcorn_default_p.bin#192 ps_popcorn_default_p.bin#195
|
||||
b76211745124af86 74ebc67ee92d1734 指令块相同·仅输入签名不同(建管线时按顶点着色器输出配对选) 74ebc67ee92d1734:0:3 ff60ddad549824e0:0:3 vs_models_grass_force_v.bin#0 vs_models_grass_force_v.bin#1
|
||||
fa85525dc10e694b 238ad1aaa8a95fb8 指令块等长·输入签名不同(疑为输入寄存器重编号,同按配对选) 238ad1aaa8a95fb8:1:3 7570b0b80b9e81fa:1:3 vs_popcorn_mesh_depth_v.bin#0 vs_popcorn_mesh_depth_v.bin#8 vs_popcorn_stencil_v.bin#1
|
||||
# kind: evidence 控制段键冲突裁定:本作键已含代码区(dm/gfx/tools/shader_split.py),不会有同键异码,表空
|
||||
dm_ctl_sha16 chosen_pc class candidates records
|
||||
|
@@ -26,7 +26,7 @@ CHAIN = dmsh_chain.version(); out = os.path.join(out, 'b-' + CHAIN)
|
||||
if f'"{CHAIN}"' not in open(dmsh_chain.HEADER).read(): sys.exit(f'【红】nvn/dmsh_chain.h 不是当前翻译链版本 {CHAIN}:先跑 dmsh_chain.py --header(否则宿主找不到这批库)')
|
||||
XLATE = os.environ.get('XLATE', f'{DM_ROOT}/build/gfx/dmsh_xlate/dmsh_xlate')
|
||||
FACTS = dmsh_facts.load()
|
||||
if not FACTS: sys.exit('【红】没有作答表 nvn/shader_facts.tsv(随仓库;维护者用 dmsh_facts.py --freeze 重出)')
|
||||
if not os.path.exists(dmsh_facts.TABLE): sys.exit('【红】没有作答表 nvn/shader_facts.tsv(随仓库;空表 = 全部按缺省作答)')
|
||||
IOSOUT = os.environ.get('IOSOUT') # 设了就同时出 iOS 版(iphoneos metallib + 反射)到该目录 | if set, also build the iOS version (iphoneos metallib + reflection) into that directory
|
||||
if IOSOUT:
|
||||
sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), '../../ios/tools')); import ios_metal
|
||||
@@ -40,7 +40,11 @@ CAS = os.environ.get('DMSH_CAS', os.path.join(cache_root, 'cas'))
|
||||
CAS_LOCKS, CAS_LOCKS_GUARD = {}, threading.Lock()
|
||||
PRE_STATS = collections.Counter()
|
||||
MAC_RECORD = 'xcrun -sdk macosx metal -c; xcrun -sdk macosx metallib'
|
||||
TEX_BASE, SAMP_BASE, IMG_BASE = 0x168, 0x568, 0x120 # c[2]:图像句柄表 0x120 + 8 r(8 槽,紧接贴图表之前;cs_lut_combine_c 写 u4 = 0x140 反推,u5 = 0x148 核对) | c[2]: image handle table 0x120 + 8 r (8 slots, immediately before the texture table; inferred from cs_lut_combine_c writing u4 = 0x140, checked with u5 = 0x148)
|
||||
# 贴图句柄表(贴图指令立即数句柄所在的驱动段):马力欧(NVN 55)是 0x20 + 8 r、32 槽——全库 4888 个着色器的立即数句柄恰是 0x20..0xF0、步长 8(D2R 的旧驱动是 0x168)。
|
||||
# 本作只用合并句柄(nvnCommandBufferBindTexture),没有分离采样器;图像句柄表仍在 0x120 + 8 r(8 槽,紧接贴图表之后;agl 的 10 个计算着色器实测 0x120 / 0x128 / 0x130,与 D2R 同址)。
|
||||
# Texture handle table (the driver segment holding texture instructions' immediate handles): Mario (NVN 55) uses 0x20 + 8 r, 32 slots - the immediate handles of all 4888 shaders are exactly 0x20..0xF0 in steps of 8 (D2R's older driver used 0x168).
|
||||
# This game uses only combined handles (nvnCommandBufferBindTexture), with no separate samplers; the image handle table is still at 0x120 + 8 r (8 slots, right after the texture table; measured 0x120 / 0x128 / 0x130 on agl's 10 compute shaders, the same address as D2R).
|
||||
TEX_BASE, TEX_SLOTS, SAMP_BASE, IMG_BASE, IMG_SLOTS = 0x20, 32, 0x568, 0x120, 8
|
||||
|
||||
def records(d):
|
||||
r = [m.start() for m in re.finditer(b'BTCDBTCD', d)]
|
||||
@@ -249,7 +253,7 @@ def job_for(key, name, rec, w):
|
||||
ci = rec.find(bytes.fromhex('34127698')); code = rec[0x38:ci]; stage = stage_of.get(key, name[:2])
|
||||
c1o, c1t = struct.unpack_from('<2I', rec, ci + 0x700) # 控制段 +0x700:c1 相对指令区起点、+0x704:指令区总长(c1 = 两者之间;全库长度 0 / 256 / 512 / 768) | control segment +0x700: c1 relative to the start of the instruction area, +0x704: total length of the instruction area (c1 = what lies between the two; lengths across the whole library are 0 / 256 / 512 / 768)
|
||||
c1 = rec[0x38 + c1o:0x38 + c1t]
|
||||
if stage != 'cs': code = code[0x30:]
|
||||
if stage != 'cs' or code[:4] == bytes.fromhex('79563412'): code = code[0x30:] # 去 0x30 头:图形阶段都有;计算阶段本作有(魔数 0x12345679),D2R 的包记录没有 | strip the 0x30 header: every graphics stage has one; compute has one in this game (magic 0x12345679), D2R's package records do not
|
||||
cp = os.path.join(w, key + '.bin'); open(cp, 'wb').write(code)
|
||||
j = {'key': key, 'stage': stage, 'code': cp, 'tex': {}, 'img': {}, 'attr': {}, 'fout': {}, 'c1': c1.hex(),
|
||||
'debug': os.environ.get('XLATE_DEBUG', '1') != '0', 'reduced': os.environ.get('XLATE_REDUCED', '1') == '1'} # 翻译选项(见 dmsh_xlate/Program.cs);放宽精度缺省开(GPU 浮点末位误差不进游戏状态,mini 整帧 −26%) # c1:翻译器读间接跳转表用 | translation options (see dmsh_xlate/Program.cs); relaxed precision is on by default (GPU float last-bit error does not enter game state, whole frame −26% on the second Mac) # c1: used by the translator to read indirect jump tables
|
||||
@@ -313,11 +317,24 @@ def decode_tex(name):
|
||||
def slot(word, base, cb): return (word * 4 - base) // 8 if cb == 2 and word * 4 >= base and (word * 4 - base) % 8 == 0 else None
|
||||
words = [o0] + ([o1] if ty else [])
|
||||
if re.match(r'[a-z]+_i', name): # 图像 | image
|
||||
return next((slot(x, IMG_BASE, tb) for x in words if IMG_BASE <= x * 4 < TEX_BASE and slot(x, IMG_BASE, tb) is not None), None), None, ty
|
||||
t = next((slot(x, TEX_BASE, tb) for x in words if slot(x, TEX_BASE, tb) is not None and x * 4 < SAMP_BASE), None)
|
||||
return next((slot(x, IMG_BASE, tb) for x in words if IMG_BASE <= x * 4 < IMG_BASE + 8 * IMG_SLOTS and slot(x, IMG_BASE, tb) is not None), None), None, ty
|
||||
t = next((slot(x, TEX_BASE, tb) for x in words if slot(x, TEX_BASE, tb) is not None and x * 4 < TEX_BASE + 8 * TEX_SLOTS), None)
|
||||
s = next((slot(x, SAMP_BASE, sb) for x in words if x * 4 >= SAMP_BASE and slot(x, SAMP_BASE, sb) is not None), None)
|
||||
return t, s, ty
|
||||
|
||||
def decode_ubo_tex(name):
|
||||
"""无绑定贴图:句柄由游戏写在自己的 uniform 缓冲里(fp_t_cb7_2A = c[7] 第 0x2A 字)。返回 (贴图: (uniform 槽, 字节偏移), 采样器: (槽, 偏移));
|
||||
句柄类型 0 = 合并句柄(同一个 32 位字:低 20 位贴图号、高 12 位采样器号),1 = 采样器句柄在另一个字(槽取 slots 高 16 位 − 1)。本作全库只有类型 0(1850 个着色器)
|
||||
Bindless texture: the handle is written by the game into its own uniform buffer (fp_t_cb7_2A = c[7] word 0x2A). Returns (texture: (uniform slot, byte offset), sampler: (slot, offset));
|
||||
handle type 0 = combined handle (one 32-bit word: low 20 bits texture ID, high 12 bits sampler ID), 1 = the sampler handle is in another word (its slot is the high 16 bits of slots − 1). This game's whole library uses only type 0 (1850 shaders)"""
|
||||
m = re.match(r'[a-z]+_t\w*?_cb(\d+)_([0-9A-F]+)', name)
|
||||
if not m: return None
|
||||
slots, h = int(m.group(1)), int(m.group(2), 16)
|
||||
tb = slots & 0xffff; sb = (slots >> 16) - 1 if slots >> 16 else tb
|
||||
o0, o1, ty = h & 0x3fff, (h >> 14) & 0x3fff, h >> 28
|
||||
if not 3 <= tb <= 16 or ty not in (0, 1) or (ty and not 3 <= sb <= 16): return None
|
||||
return (tb - 3, o0 * 4), ((sb - 3, o1 * 4) if ty else (tb - 3, o0 * 4))
|
||||
|
||||
def reflect(key, stage, msl, res):
|
||||
"""MSL 参数缓冲结构体成员 → 回放反射:kind(同 nvn_refl.h)+ NVN 槽号 + 参数缓冲成员号 | MSL argument buffer struct member → replay reflection: kind (same as nvn_refl.h) + NVN slot number + argument buffer member index"""
|
||||
body = re.search(r'struct spvDescriptorSetBuffer0\s*\{(.*?)\};', msl, re.S)
|
||||
@@ -332,6 +349,11 @@ def reflect(key, stage, msl, res):
|
||||
e.update(kind='cbuf', reg=n - 3) if 3 <= n <= 16 else e.update(kind='c1' if n == 1 else 'drvcb', bank=n)
|
||||
elif re.fullmatch(r'[a-z]+_s(\d+)', nm):
|
||||
e.update(kind='sbuf', index=int(re.fullmatch(r'[a-z]+_s(\d+)', nm).group(1)))
|
||||
elif decode_ubo_tex(nm[:-5] if nm.endswith('Smplr') else nm): # 无绑定:句柄在 uniform 缓冲里(reg = uniform 槽,off = 字节偏移) | bindless: the handle is in a uniform buffer (reg = uniform slot, off = byte offset)
|
||||
ut, us = decode_ubo_tex(nm[:-5] if nm.endswith('Smplr') else nm)
|
||||
if nm.endswith('Smplr'): e.update(kind='samp_ubo', reg=us[0], off=us[1])
|
||||
elif 'texture_buffer' in ty: e.update(kind='?') # 无绑定类型化缓冲:回放层未实现 | bindless typed buffer: not implemented in the replay layer
|
||||
else: e.update(kind='tex_ubo', reg=ut[0], off=ut[1])
|
||||
elif nm.endswith('Smplr'): # 句柄类型 0 = 贴图与采样器合在同一句柄:采样器号取该贴图槽句柄的高位 | handle type 0 = texture and sampler combined in one handle: the sampler index is taken from the high bits of that texture slot's handle
|
||||
t, s, ty = decode_tex(nm[:-5]); e.update(kind='samp', reg=s) if ty else e.update(kind='samp_tex', reg=t)
|
||||
else:
|
||||
@@ -354,7 +376,7 @@ def reflect(key, stage, msl, res):
|
||||
return binds
|
||||
|
||||
DRV_FILL = {0: [(0x110, 0x210), (0x310, 0x410), (0x510, 0x610)], # c0:存储缓冲地址表(顶点 / 计算 / 像素,各 16 槽 × 0x10) | c0: storage buffer address tables (vertex / compute / pixel, 16 slots × 0x10 each)
|
||||
2: [(0x168, 0x568), (0x568, 0x968)]} # c2:贴图句柄表、采样器句柄表(各 128 槽 × 8) | c2: texture handle table, sampler handle table (128 slots × 8 each)
|
||||
2: [(TEX_BASE, TEX_BASE + 8 * TEX_SLOTS), (IMG_BASE, IMG_BASE + 8 * IMG_SLOTS)]} # c2:贴图句柄表(本作 0x20 + 8 r,32 槽)、图像句柄表(0x120 + 8 r,8 槽) | c2: texture handle table (this game: 0x20 + 8 r, 32 slots), image handle table (0x120 + 8 r, 8 slots)
|
||||
|
||||
def drv_reads(src):
|
||||
"""MSL 里对驱动段 c0 / c2 的读取:常量下标 → 字节区间;非常量下标记为动态 | Reads of driver segments c0 / c2 in the MSL: constant index → byte range; non-constant indices are recorded as dynamic"""
|
||||
@@ -473,7 +495,7 @@ ok = [r[3] for r in res if r[1] == 'ok']
|
||||
rd = [x for x in ok if x['drv_reads']]
|
||||
print(f'运行时读驱动段的着色器 {len(rd)}(c0 {sum("0" in x["drv_reads"] for x in rd)},c2 {sum("2" in x["drv_reads"] for x in rd)});读到回放层填不了的 {sum(bool(x["drv_unfillable"]) for x in ok)}')
|
||||
for e, n in collections.Counter(u for x in ok for u in x['drv_unfillable']).most_common(15): print(f' 填不了 {n:5d} {e}')
|
||||
SLOTK = {'cbuf', 'samp', 'samp_tex', 'tex', 'img', 'tbuf', 'sbuf', 'ubo_ptr'}
|
||||
SLOTK = {'cbuf', 'samp', 'samp_tex', 'tex', 'img', 'tbuf', 'sbuf', 'ubo_ptr', 'tex_ubo', 'samp_ubo'}
|
||||
noreg = [x for x in ok if any(b['kind'] in SLOTK and b.get('reg') is None for b in x['bindings'])]
|
||||
unk = [x for x in ok if any(b['kind'] == '?' for b in x['bindings'])]
|
||||
print(f'绑定没解出槽号的着色器 {len(noreg)},种类认不出的 {len(unk)}(运行时加载会报红)')
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# 翻译链工具指纹(dmsh_chain.py --update-lock 生成;换工具后重生成并随提交入仓)
|
||||
dmsh_xlate.dll 63cf2e985cc47ac9
|
||||
Ryujinx.Graphics.Shader.dll aa8e044a10236a8a
|
||||
Ryujinx.Common.dll 5499da4c1b1e11a6
|
||||
xlate_source d760b2f173ee5e0c
|
||||
dmsh_xlate.dll 0ffb0716effb5d38
|
||||
Ryujinx.Graphics.Shader.dll 67d1ccb8b5e0cbd4
|
||||
Ryujinx.Common.dll 9374fa7b47958542
|
||||
xlate_source 23b85cb2e58b9c36
|
||||
spirv-cross f9480d48c62eb2d8
|
||||
metal_macosx Apple metal version 32023.921 (metalfe-32023.921.6)
|
||||
metal_iphoneos Apple metal version 32023.921 (metalfe-32023.921.6)
|
||||
@@ -1,7 +1,8 @@
|
||||
// Switch 原版着色器(Maxwell 机器码)→ SPIR-V(Ryujinx.Graphics.Shader 翻译器),供 B 路线离线出 metallib。
|
||||
// 与 Ryujinx.ShaderTools 的区别:翻译器的「查询」按真实情况作答,而不是一律缺省值——
|
||||
// 贴图类型 / 图像格式 / 顶点属性类型 / 片元输出类型 / 计算线程组大小取自作业文件(由映射表配对的 PC 反射给出,同槽号 = 同资源);
|
||||
// 窗口原点左上、深度 0..1(游戏实测 nvnDeviceSetWindowOriginMode / SetDepthMode)。
|
||||
// 窗口原点左上、深度 -1..1(马力欧实测 nvnDeviceSetWindowOriginMode 左上 / SetDepthMode 近=-w,即 GL 口径):Metal 裁剪要求 0 ≤ z ≤ w,
|
||||
// 顶点着色器末尾按 Ryujinx 的办法改写 z' = z/2 + w/2(DepthMode + 宿主不支持深度裁剪控制);不改的话 z = -w 的全屏拷贝整个被裁掉,窗口全黑。
|
||||
// 用法:dmsh_xlate <作业.json> <输出目录>
|
||||
// 作业:[{ "key", "stage": "vs|ps|cs", "code": 机器码文件(图形 = 0x50 字节 SPH + 指令,计算 = 指令),
|
||||
// "tex": { "槽": "2d|2darray|cube|cubearray|3d|buffer|1d|1darray|2dms|2dmsarray", … }, "img": { "槽": { "type", "fmt" } },
|
||||
@@ -10,7 +11,8 @@
|
||||
// Original Switch shaders (Maxwell machine code) → SPIR-V (the Ryujinx.Graphics.Shader translator), for route B's offline metallib build.
|
||||
// Difference from Ryujinx.ShaderTools: the translator's "queries" are answered truthfully rather than always with defaults -
|
||||
// texture type / image format / vertex attribute type / fragment output type / compute thread group size come from the job file (given by the PC reflection paired via the mapping table; same slot number = same resource);
|
||||
// window origin upper-left, depth 0..1 (measured from the game: nvnDeviceSetWindowOriginMode / SetDepthMode).
|
||||
// window origin upper-left, depth -1..1 (measured on Mario: nvnDeviceSetWindowOriginMode upper-left / SetDepthMode near=-w, i.e. the GL convention): Metal clipping requires 0 ≤ z ≤ w,
|
||||
// so vertex shaders rewrite z' = z/2 + w/2 at the end, Ryujinx's way (DepthMode + host without depth clip control); without it the full-screen copy at z = -w is clipped away entirely and the window is black.
|
||||
// Usage: dmsh_xlate <job.json> <output dir>
|
||||
// Job: [{ "key", "stage": "vs|ps|cs", "code": machine code file (graphics = 0x50-byte SPH + instructions, compute = instructions),
|
||||
// "tex": { "slot": "2d|2darray|cube|cubearray|3d|buffer|1d|1darray|2dms|2dmsarray", ... }, "img": { "slot": { "type", "fmt" } },
|
||||
@@ -28,7 +30,7 @@ using System.Text.Json.Nodes;
|
||||
|
||||
static class SwshXlate
|
||||
{
|
||||
const int TexBase = 0x168, SampBase = 0x568; // NVN 分离贴图 / 采样器句柄在 c[2] 的字节基址(每槽 8 字节;dm/gfx/tools/maxwell_refs.py 全量实测) | byte base of NVN separate texture / sampler handles in c[2] (8 bytes per slot; full measurement in dm/gfx/tools/maxwell_refs.py)
|
||||
const int TexBase = 0x20, SampBase = 0x568; // NVN 贴图句柄在 c[2] 的字节基址(每槽 8 字节):本作(NVN 55)0x20,全库实测见 dm/gfx/tools/dmsh_build.py TEX_BASE;分离采样器沿用 D2R 的 0x568(本作不用) | byte base of NVN texture handles in c[2] (8 bytes per slot): 0x20 for this game (NVN 55), measured over the whole library, see TEX_BASE in dm/gfx/tools/dmsh_build.py; separate samplers keep D2R's 0x568 (unused by this game)
|
||||
|
||||
sealed class Accessor : IGpuAccessor
|
||||
{
|
||||
@@ -89,10 +91,11 @@ static class SwshXlate
|
||||
if (_job["attr"] is JsonObject a) foreach (var kv in a) attr[int.Parse(kv.Key)] = Attr((string)kv.Value);
|
||||
if (_job["fout"] is JsonObject f) foreach (var kv in f) fout[int.Parse(kv.Key)] = Attr((string)kv.Value);
|
||||
return new GpuGraphicsState(false, InputTopology.Triangles, false, TessPatchType.Triangles, TessSpacing.EqualSpacing,
|
||||
false, false, false, false /* 深度 0..1 | depth 0..1 */, false, 1f, AlphaTestOp.Always, 0f, attr, false, fout, false,
|
||||
false, false, false, true /* 深度 -1..1(GL)| depth -1..1 (GL) */, false, 1f, AlphaTestOp.Always, 0f, attr, false, fout, false,
|
||||
false /* 不做 Y 取反 | no Y flip */, true /* 原点左上 | origin upper-left */, false);
|
||||
}
|
||||
public bool QueryHostSupportsTextureShadowLod() => true;
|
||||
public bool QueryHostSupportsDepthClipControl() => false; // Metal 没有 -1..1 裁剪控制:让翻译器在顶点着色器里改写 z(见文件头) | Metal has no -1..1 clip control: have the translator rewrite z in the vertex shader (see the file header)
|
||||
// 作业 reduced = true:放宽精度——翻译器只给强制精确的运算打 NoContraction(缺省全部打:保持 Maxwell 分开舍入的逐位结果,代价是 MSL 里大量禁优化的 spvFMul 等)
|
||||
// Job reduced = true: relaxed precision - the translator marks NoContraction only on operations that must be exact (the default marks all: keeps the bit-exact results of Maxwell's separate rounding, at the cost of many optimization-disabled spvFMul etc. in the MSL)
|
||||
public bool QueryHostReducedPrecision() => _job["reduced"] is JsonNode n && (bool)n;
|
||||
|
||||
@@ -0,0 +1,172 @@
|
||||
#!/usr/bin/env python3
|
||||
# 马力欧全部着色器 → dmsh_build.py 认的「包目录」+ 着色器映射表 + 翻译查询作答表(计算着色器的线程组 / 共享内存)。
|
||||
# 来源(全量扫,不靠文件名):RomFS 下每个文件(.zs 先 zstd 解压,SARC 逐成员展开)与 ExeFS main(NSO,lz4 解压)里的
|
||||
# · BNSH('BNSH\0\0\0\0',bfsha / 粒子特效 esetb / UI 布局 blarc / main 内嵌各自带):
|
||||
# +0x60 grsc 块;+0x7c 变体数 u32;+0x80 变体表指针(指针都相对 BNSH 起点)。变体 0x40 字节,取 +0x10 二进制程序;
|
||||
# 二进制程序 +0x08 起 6 个阶段指针:顶点、外壳、域、几何、像素、计算;阶段代码描述 +0x08 控制段指针、+0x10 代码区指针、+0x18 代码区长、+0x1c 控制段长。
|
||||
# · BAHS(agl 的 sharcb:agl / gsys 资源包、Secred 包里的 GameAglShader):文件头 +0x1c 代码区起点、+0x18 代码区长;
|
||||
# 表区里每条二进制项 16 字节 {代码偏移(相对代码区,0x100 对齐), 0, 控制段长 0x880 / 0x88c, 控制段相对本项地址的有符号偏移}。
|
||||
# 控制段在多个程序间共用,所以按项配对,不能按控制段找代码;项靠「控制段魔数 + 代码区魔数 + 长度自洽」三重核对认出。
|
||||
# 代码区:0x30 头 + (图形)0x50 SPH + 指令;头魔数图形 0x12345678、计算 0x12345679。控制段 0x98761234 开头,+0x704 = 代码区长,
|
||||
# +0x700 = c1 常数段在代码区内的起点;计算着色器 +0x748 线程组 xyz(u32 ×3)、+0x754 共享内存字节(D2R 22 个计算着色器与 PC 反射逐条核对)。
|
||||
# 阶段:BNSH 取阶段槽;BAHS 取 SPH 第 0 字 bits 10..13(1 顶点 2 外壳 3 域 4 几何 5 像素),计算头的为计算。
|
||||
# 键 = sha256(控制段前 0x880 字节 + 代码区)[:16],与宿主 prog_get 一致:本作控制段相同、代码不同的情况很多
|
||||
# (SecredUber 16600 个阶段着色器只有 3079 种控制段,其中 6367 处同控制段而代码不同),只哈希控制段会拿错库。
|
||||
# 输出:<包目录>/<阶段>_<来源组>.bin,每条记录 = 'BTCDBTCD' + 头(+0x28 控制段长、+0x2c 代码区长)补到 0x38 + 代码区 + 控制段,同键只出一份;
|
||||
# 映射表行与 D2R 的 shader_map.tsv 同列(第 5 列记首次出现的位置);作答表每个计算着色器一行 {"local", "shared"}(共享内存按 16 字节向上取整,同 D2R 口径)。
|
||||
# 用法:shader_split.py <RomFS 目录> <ExeFS main> <输出包目录> <输出映射表> <输出作答表> (解 main 要 lz4:用 dm 的 venv python 跑) 环境 J=并发(缺省 8)
|
||||
# All of Mario's shaders → the "package directory" dmsh_build.py understands + the shader map + the translation query answer table (thread group / shared memory of compute shaders).
|
||||
# Sources (a full scan, not relying on file names): every file under RomFS (.zs is zstd-decompressed first, SARC is expanded member by member) and ExeFS main (NSO, lz4-decompressed), looking for
|
||||
# · BNSH ('BNSH\0\0\0\0', carried by bfsha / particle effect esetb / UI layout blarc / embedded in main):
|
||||
# +0x60 grsc block; +0x7c variation count u32; +0x80 variation table pointer (pointers are relative to the BNSH start). A variation is 0x40 bytes; the binary program is at +0x10;
|
||||
# the binary program has 6 stage pointers from +0x08: vertex, hull, domain, geometry, pixel, compute; the stage code descriptor has +0x08 control pointer, +0x10 code area pointer, +0x18 code area length, +0x1c control length.
|
||||
# · BAHS (agl's sharcb: the agl / gsys resource packs, GameAglShader in the Secred pack): file header +0x1c code region start, +0x18 code region length;
|
||||
# each binary entry in the table area is 16 bytes {code offset (relative to the code region, 0x100-aligned), 0, control length 0x880 / 0x88c, signed offset of the control relative to this entry's address}.
|
||||
# Control sections are shared between programs, so pairing goes by entry, never by finding code from a control; entries are recognized by a triple check of "control magic + code magic + consistent lengths".
|
||||
# Code area: 0x30 header + (graphics) 0x50 SPH + instructions; header magic 0x12345678 for graphics, 0x12345679 for compute. The control section starts with 0x98761234, +0x704 = code area length,
|
||||
# +0x700 = start of the c1 constant segment within the code area; for compute +0x748 thread group xyz (u32 ×3), +0x754 shared memory bytes (checked one by one against PC reflection on D2R's 22 compute shaders).
|
||||
# Stage: BNSH uses the stage slot; BAHS uses bits 10..13 of SPH word 0 (1 vertex 2 hull 3 domain 4 geometry 5 pixel), and a compute header means compute.
|
||||
# Key = sha256(first 0x880 bytes of the control section + code area)[:16], the same as the host's prog_get: in this game many shaders share a control section but differ in code
|
||||
# (SecredUber's 16600 stage shaders have only 3079 distinct control sections, with 6367 cases of same control, different code), so hashing the control alone picks the wrong library.
|
||||
# Output: <package dir>/<stage>_<source group>.bin, each record = 'BTCDBTCD' + header (+0x28 control length, +0x2c code length) padded to 0x38 + code area + control section, one copy per key;
|
||||
# map rows have the same columns as D2R's shader_map.tsv (column 5 records where the key first appeared); the answer table has one row per compute shader {"local", "shared"} (shared memory rounded up to 16 bytes, as D2R did).
|
||||
# Usage: shader_split.py <RomFS dir> <ExeFS main> <output package dir> <output map> <output answer table> (decompressing main needs lz4: run with dm's venv python) Environment J=concurrency (default 8)
|
||||
import collections, concurrent.futures as cf, hashlib, json, os, re, struct, subprocess, sys
|
||||
|
||||
CTL_MAGIC, GFX_MAGIC, CS_MAGIC = bytes.fromhex('34127698'), bytes.fromhex('78563412'), bytes.fromhex('79563412')
|
||||
STAGES = ['vs', 'hs', 'ds', 'gs', 'ps', 'cs']
|
||||
SPH_STAGE = {1: 'vs', 2: 'hs', 3: 'ds', 4: 'gs', 5: 'ps'}
|
||||
ZH = {'vs': '顶点', 'hs': '外壳', 'ds': '域', 'gs': '几何', 'ps': '像素', 'cs': '计算'}
|
||||
|
||||
def red(msg): sys.exit('【红】' + msg)
|
||||
|
||||
def check(where, st, ctl, code):
|
||||
"""控制段与代码区自洽;不自洽返回原因 | control section and code area consistent; returns the reason if not"""
|
||||
if ctl[:4] != CTL_MAGIC or len(ctl) < 0x880: return '控制段异常'
|
||||
if code[:4] != (CS_MAGIC if st == 'cs' else GFX_MAGIC): return '代码区头魔数与阶段不符'
|
||||
if struct.unpack_from('<I', ctl, 0x704)[0] != len(code): return '控制段 +0x704 与代码区长不符'
|
||||
return None
|
||||
|
||||
def bnsh_shaders(d, base, label):
|
||||
if d[base + 0x60:base + 0x64] != b'grsc': red(f'{label} BNSH @{base:#x} 没有 grsc 块')
|
||||
nvar, pvar = struct.unpack_from('<IQ', d, base + 0x7c)
|
||||
out = []
|
||||
for v in range(nvar):
|
||||
prog = struct.unpack_from('<Q', d, base + pvar + 0x40 * v + 0x10)[0]
|
||||
if not prog: continue
|
||||
for si, st in enumerate(STAGES):
|
||||
sc = struct.unpack_from('<Q', d, base + prog + 8 + 8 * si)[0]
|
||||
if not sc: continue
|
||||
pctl, pcode, ncode, nctl = struct.unpack_from('<QQII', d, base + sc + 8)
|
||||
ctl, code = d[base + pctl:base + pctl + nctl], d[base + pcode:base + pcode + ncode]
|
||||
why = check(label, st, ctl, code)
|
||||
if why: red(f'{label} BNSH @{base:#x} 变体 {v} {st}:{why}')
|
||||
out.append((f'{label}#BNSH@{base:#x}#var{v}', st, ctl, code))
|
||||
return out
|
||||
|
||||
def bahs_shaders(d, label):
|
||||
region, rsz = struct.unpack_from('<I', d, 0x1c)[0], struct.unpack_from('<I', d, 0x18)[0]
|
||||
if region + rsz > len(d): red(f'{label} BAHS 代码区越界')
|
||||
out = []
|
||||
for a in range(0, region - 16, 4):
|
||||
off, z, csz, rel = struct.unpack_from('<IIIi', d, a)
|
||||
if z or csz not in (0x880, 0x88c) or off % 0x100: continue
|
||||
c = a + rel
|
||||
if c < 0 or c + csz > region or d[c:c + 4] != CTL_MAGIC: continue
|
||||
n = struct.unpack_from('<I', d, c + 0x704)[0]
|
||||
if off + n > rsz: continue
|
||||
code, ctl = d[region + off:region + off + n], d[c:c + csz]
|
||||
st = 'cs' if code[:4] == CS_MAGIC else SPH_STAGE.get((struct.unpack_from('<I', code, 0x30)[0] >> 10) & 0xf) if code[:4] == GFX_MAGIC else None
|
||||
if not st or check(label, st, ctl, code): continue
|
||||
out.append((f'{label}#BAHS@{a:#x}', st, ctl, code))
|
||||
return out
|
||||
|
||||
def sarc_members(d):
|
||||
hl, bom, size, doff = struct.unpack_from('<HHII', d, 4)
|
||||
n = struct.unpack_from('<H', d, hl + 6)[0]
|
||||
names = hl + 12 + 16 * n + 8
|
||||
for i in range(n):
|
||||
h, attr, s, e = struct.unpack_from('<IIII', d, hl + 12 + 16 * i)
|
||||
nm = d[names + (attr & 0xffffff) * 4:].split(b'\0')[0].decode('utf-8', 'replace') if attr >> 24 else f'#{i}'
|
||||
yield nm, d[doff + s:doff + e]
|
||||
|
||||
def scan_blob(d, label, out):
|
||||
if d[:4] == b'SARC':
|
||||
for nm, m in sarc_members(d): scan_blob(m, f'{label}/{nm}', out)
|
||||
return
|
||||
if d[:4] == b'BAHS': out.extend(bahs_shaders(d, label)); return
|
||||
for m in re.finditer(b'BNSH\0\0\0\0', d):
|
||||
size = struct.unpack_from('<I', d, m.start() + 0x1c)[0]
|
||||
if m.start() + size <= len(d) and d[m.start() + 0x60:m.start() + 0x64] == b'grsc': out.extend(bnsh_shaders(d, m.start(), label))
|
||||
|
||||
def group(label):
|
||||
"""来源组(包文件名的后半) | source group (second half of the package file name)"""
|
||||
if label.startswith('main'): return 'main'
|
||||
for k, g in (('/Shader/SecredUber', 'SecredUber'), ('.sharcb', 'agl'), ('/Effect/', 'effect'), ('/Layout/', 'layout'), ('/Shader/', 'SecredUber')):
|
||||
if k in label: return g
|
||||
return 'other'
|
||||
|
||||
def scan_file(args):
|
||||
path, rel = args
|
||||
d = subprocess.run(['zstd', '-d', '-c', '-q', path], capture_output=True, check=True).stdout if path.endswith('.zs') else open(path, 'rb').read()
|
||||
if b'BNSH\0\0\0\0' not in d and b'BAHS' not in d: return rel, {}
|
||||
found = []; scan_blob(d, '/' + rel, found)
|
||||
uniq = {}
|
||||
for where, st, ctl, code in found:
|
||||
key = hashlib.sha256(ctl[:0x880] + code).hexdigest()[:16]
|
||||
if key in uniq and (uniq[key][2] != ctl or uniq[key][3] != code): red(f'键 {key} 相同而控制段或代码区不同({where})')
|
||||
uniq.setdefault(key, (where, st, ctl, code))
|
||||
return rel, uniq
|
||||
|
||||
def nso_image(path):
|
||||
import lz4.block
|
||||
d = open(path, 'rb').read()
|
||||
flags = struct.unpack_from('<I', d, 0xc)[0]; segs = [struct.unpack_from('<III', d, 0x10 + i * 0x10) for i in range(3)]; csz = struct.unpack_from('<III', d, 0x60)
|
||||
img = bytearray(segs[2][1] + segs[2][2])
|
||||
for i, (fo, mo, sz) in enumerate(segs):
|
||||
raw = d[fo:fo + csz[i]]
|
||||
img[mo:mo + sz] = lz4.block.decompress(raw, uncompressed_size=sz) if flags >> i & 1 else raw
|
||||
return bytes(img)
|
||||
|
||||
def main():
|
||||
romfs, mainnso, pkg, mapout, factsout = sys.argv[1:6]
|
||||
files = sorted((os.path.join(dp, f), os.path.relpath(os.path.join(dp, f), romfs)) for dp, _, fs in os.walk(romfs) for f in fs)
|
||||
keys = {}
|
||||
found = []; scan_blob(nso_image(mainnso), 'main', found)
|
||||
results = [('main', {hashlib.sha256(c[:0x880] + k).hexdigest()[:16]: (w, s, c, k) for w, s, c, k in found})]
|
||||
with cf.ProcessPoolExecutor(int(os.environ.get('J', '8'))) as ex: results += list(ex.map(scan_file, files, chunksize=16))
|
||||
per_src = collections.Counter()
|
||||
for rel, uniq in results:
|
||||
for key, v in uniq.items():
|
||||
if key in keys:
|
||||
if keys[key][2] != v[2] or keys[key][3] != v[3]: red(f'键 {key} 相同而控制段或代码区不同({v[0]} / {keys[key][0]})')
|
||||
continue
|
||||
keys[key] = v; per_src[group(v[0])] += 1
|
||||
os.makedirs(pkg, exist_ok=True)
|
||||
for f in os.listdir(pkg):
|
||||
if f.endswith('.bin'): os.unlink(os.path.join(pkg, f))
|
||||
recs = collections.defaultdict(list); rows = []; facts = {}; stat = collections.Counter()
|
||||
for key in sorted(keys, key=lambda k: (group(keys[k][0]), keys[k][0], k)): # 同输入逐字节同样的输出 | the same input gives byte-identical output
|
||||
where, st, ctl, code = keys[key]
|
||||
name = f'{st}_{group(where)}.bin'
|
||||
rec = bytearray(b'BTCDBTCD' + bytes(0x30)); struct.pack_into('<2I', rec, 0x28, len(ctl), len(code)); rec += code + ctl
|
||||
if rec.find(CTL_MAGIC) != 0x38 + len(code): red(f'键 {key}:代码区里出现控制段魔数,dmsh_build 会切错')
|
||||
if rec.count(b'BTCDBTCD') != 1: red(f'键 {key}:记录内出现记录分隔符')
|
||||
rows.append((name, len(recs[name]), ZH[st], key, where)); recs[name].append(bytes(rec)); stat[st] += 1
|
||||
if st == 'cs':
|
||||
x, y, z = struct.unpack_from('<3I', ctl, 0x748); sh = struct.unpack_from('<I', ctl, 0x754)[0]
|
||||
if not x * y * z: red(f'计算着色器 {key} 控制段 +0x748 线程组为 0({where})')
|
||||
facts[key] = {'local': [x, y, z], 'shared': (sh + 15) // 16 * 16}
|
||||
for name, rr in recs.items():
|
||||
with open(os.path.join(pkg, name), 'wb') as f: f.write(b''.join(rr))
|
||||
with open(mapout, 'w') as f:
|
||||
f.write('# kind: evidence 马力欧着色器(RomFS + main 里的 BNSH / BAHS)→ 控制段 + 代码区键(dm/gfx/tools/shader_split.py)\n')
|
||||
f.write('# 第 5 列记每个键首次出现的位置;本作没有 PC 版配对\n')
|
||||
f.write('package\tindex\tstage\tdm_ctl_sha16\tsource\n')
|
||||
for r in rows: f.write('\t'.join(map(str, r)) + '\n')
|
||||
with open(factsout, 'w') as f:
|
||||
f.write('# 翻译查询的作答表(dm/gfx/tools/shader_split.py 生成,勿手改):键 <TAB> 事实 JSON。本作没有 PC 版可配对:只有计算着色器的线程组 / 共享内存(取自控制段),其余查询按翻译器缺省\n')
|
||||
for k in sorted(facts): f.write(k + '\t' + json.dumps(facts[k], sort_keys=True, separators=(',', ':')) + '\n')
|
||||
print(f'着色器 {len(rows)} 个(' + ','.join(f'{ZH[s]} {n}' for s, n in sorted(stat.items())) + ');来源 ' + ','.join(f'{g} {n}' for g, n in per_src.most_common()) + f';计算着色器作答 {len(facts)} 行')
|
||||
|
||||
if __name__ == '__main__': main()
|
||||
@@ -142,6 +142,22 @@ static void on_crash(int sig, siginfo_t *si, void *uc_) {
|
||||
for (int i = 0; i < 29; i++) fprintf(stderr, "x%d=%#llx%s", i, uc->uc_mcontext->__ss.__x[i], i % 6 == 5 ? "\n" : " ");
|
||||
fprintf(stderr, "\n");
|
||||
dm_backtrace(uc->uc_mcontext->__ss.__fp);
|
||||
// 栈扫描:帧链断了(返回地址被写坏、pc = lr 落在垃圾值上)时,回溯打不出东西;从 sp 往上扫 512 个字,能解析成模块 / 宿主符号的都列出来(最近的调用者在前)
|
||||
// Stack scan: when the frame chain is broken (a return address was overwritten, pc = lr lands on garbage) the backtrace prints nothing; scan 512 words up from sp and list everything that resolves to a module / host symbol (nearest callers first)
|
||||
{ uint64_t sp = uc->uc_mcontext->__ss.__sp; // 刚弹掉的那一帧(返回地址被写坏时,坏值与写坏它的残留都在 sp 下方) | The frame just popped (when a return address was overwritten, the bad value and the leftovers of whatever overwrote it sit below sp)
|
||||
fprintf(stderr, "[dm] fp=%#llx sp 下方 0x100 字节:", (unsigned long long)uc->uc_mcontext->__ss.__fp);
|
||||
for (int i = -32; i < 0 && sp && !(sp & 7); i++) fprintf(stderr, "%s%llx", (i + 32) % 4 ? " " : "\n[dm] ", (unsigned long long)((uint64_t *)sp)[i]);
|
||||
fputc('\n', stderr); }
|
||||
{ uint64_t sp = uc->uc_mcontext->__ss.__sp; int n = 0;
|
||||
fprintf(stderr, "[dm] 栈扫描 sp=%#llx:", (unsigned long long)sp);
|
||||
for (int i = -32; i < 512 && n < 24 && sp && !(sp & 7); i++) {
|
||||
uint64_t v = ((uint64_t *)sp)[i]; Dl_info di;
|
||||
if (v < 0x100000000ull || (v & 3)) continue;
|
||||
int mod = -1; for (int k = 0; k < g_nmod; k++) { uint64_t b = (uint64_t)(uintptr_t)g_mod[k].base; if (v >= b && v < b + g_mod[k].size) mod = k; }
|
||||
if (mod >= 0) { fprintf(stderr, " [%+d]%s+%#llx", i * 8, g_mod[mod].name, (unsigned long long)(v - (uint64_t)(uintptr_t)g_mod[mod].base)); n++; }
|
||||
else if (dladdr((void *)v, &di) && di.dli_sname && di.dli_fname && strstr(di.dli_fname, "dmhost")) { fprintf(stderr, " [%+d]%s+%#llx", i * 8, di.dli_sname, (unsigned long long)(v - (uint64_t)di.dli_saddr)); n++; }
|
||||
}
|
||||
fputc('\n', stderr); }
|
||||
if (g_dump_hook) g_dump_hook();
|
||||
_exit(128 + sig);
|
||||
}
|
||||
|
||||
+1
-1
@@ -230,7 +230,7 @@ static int set_guest_name(const char *hp, const char *path) {
|
||||
return -1;
|
||||
}
|
||||
static Result err_res(const char *op, const char *path) {
|
||||
if (errno == ENOENT || errno == ENOTDIR) return RES_PATH_NOT_FOUND;
|
||||
if (errno == ENOENT || errno == ENOTDIR) { if (g_flag.fs) LOG("fs %s 不存在:%s", op, path); return RES_PATH_NOT_FOUND; } // DM_FS=1 时记录(游戏常拿「不存在」探路,缺省不记) | Logged under DM_FS=1 (the game often probes with "not found", not logged by default)
|
||||
if (errno == EEXIST) return RES_PATH_EXISTS;
|
||||
LOG("fs %s %s 失败 errno=%d", op, path, errno); return RES_FAIL;
|
||||
}
|
||||
|
||||
+20
-8
@@ -51,22 +51,34 @@ HLE_FORCE("_ZN2nn4time39AsyncEnsureNetworkClockAvailabilityTask9GetResultEv", "
|
||||
// ---------- pl:共享字体 ----------
|
||||
// 系统共享字体(标准 / 简中 / 繁中 / 韩文 / 任天堂扩展)宿主没有原版;一律给一份宿主字体(DM_SHARED_FONT 指定 TTF,缺省 macOS 的 Arial Unicode)。
|
||||
// 游戏自己的文字用 RomFS 里的字体,共享字体只在系统名字等少数地方用。
|
||||
// ---------- pl: shared fonts ----------
|
||||
// The host does not have the original system shared fonts (standard / Simplified Chinese / Traditional Chinese / Korean / Nintendo extension); every type gets one host font (DM_SHARED_FONT names a TTF, default macOS Arial Unicode).
|
||||
// 格式:原版共享内存里是 BFTTF——8 字节头 + 按字异或混淆的 TTF;游戏拿到地址后先调 nn::fontll::ScalableFontEngineHelper::Decode(地址, 大小)
|
||||
// (SMBW sdk +0x3093c0)就地解混淆并返回地址 + 8。Decode 先看头一个字:已是「解过」标记(小端 0x18029a7f)就直接返回地址 + 8、不动数据。
|
||||
// 所以宿主给「解过」标记 + 原样 TTF;第二个字照原版写混淆后的长度(键 0x49621806:存的是 bswap(长度 ^ 键))。给裸 TTF 会被当密文异或成乱码,
|
||||
// 字体引擎随后用野指针崩(SMBW main +0x107dbc0)。
|
||||
// The game's own text uses the fonts in its RomFS; shared fonts are only used in a few places such as system names.
|
||||
static const void *g_font; static size_t g_font_size;
|
||||
// Format: the original shared memory holds BFTTF - an 8-byte header + a TTF obfuscated by per-word XOR; after getting the address the game calls nn::fontll::ScalableFontEngineHelper::Decode(address, size)
|
||||
// (SMBW sdk +0x3093c0), which deobfuscates in place and returns address + 8. Decode first checks the first word: if it is already the "decoded" marker (little-endian 0x18029a7f) it returns address + 8 without touching the data.
|
||||
// So the host provides the "decoded" marker + the TTF as is; the second word holds the obfuscated length as in the original (key 0x49621806: stored as bswap(length ^ key)). A raw TTF would be XORed into garbage as if it were ciphertext,
|
||||
// and the font engine then crashes on a wild pointer (SMBW main +0x107dbc0).
|
||||
static uint8_t *g_font; static size_t g_font_size;
|
||||
static void font_load(void) {
|
||||
if (g_font) return;
|
||||
const char *p = getenv("DM_SHARED_FONT"); if (!p) p = "/System/Library/Fonts/Supplemental/Arial Unicode.ttf";
|
||||
int fd = open(p, O_RDONLY); struct stat st;
|
||||
if (fd < 0 || fstat(fd, &st)) { LOG("【红】共享字体打不开:%s(DM_SHARED_FONT 指一个 TTF)", p); if (fd >= 0) close(fd); return; }
|
||||
void *m = mmap(NULL, (size_t)st.st_size, PROT_READ, MAP_PRIVATE, fd, 0); close(fd);
|
||||
if (m == MAP_FAILED) { LOG("【红】共享字体映射失败:%s", p); return; }
|
||||
g_font_size = (size_t)st.st_size; g_font = m; LOG("共享字体:%s(%zu 字节,各类型共用)", p, g_font_size);
|
||||
size_t n = (size_t)st.st_size;
|
||||
uint8_t *m = mmap(NULL, n + 8, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0);
|
||||
if (m == MAP_FAILED) { LOG("【红】共享字体内存分配失败(%zu 字节)", n + 8); close(fd); return; }
|
||||
size_t got = 0; while (got < n) { ssize_t r = pread(fd, m + 8 + got, n - got, (off_t)got); if (r <= 0) break; got += (size_t)r; }
|
||||
close(fd);
|
||||
if (got != n) { LOG("【红】共享字体读不全:%s(%zu / %zu 字节)", p, got, n); munmap(m, n + 8); return; }
|
||||
uint32_t done = 0x18029a7fu, len = __builtin_bswap32((uint32_t)n ^ 0x49621806u);
|
||||
memcpy(m, &done, 4); memcpy(m + 4, &len, 4);
|
||||
g_font_size = n + 8; g_font = m; LOG("共享字体:%s(%zu 字节,各类型共用;BFTTF「已解」头 + 原样 TTF)", p, n);
|
||||
}
|
||||
HLE_FORCE("_ZN2nn2pl22GetSharedFontLoadStateENS0_14SharedFontTypeE", "共享字体装载状态:已装(1)", int, h_pl_LoadState, int type) { (void)type; font_load(); return g_font ? 1 : 0; }
|
||||
HLE_FORCE("_ZN2nn2pl20GetSharedFontAddressENS0_14SharedFontTypeE", "共享字体地址 → 宿主字体映射", const void *, h_pl_Addr, int type) { (void)type; font_load(); return g_font; }
|
||||
HLE_FORCE("_ZN2nn2pl17GetSharedFontSizeENS0_14SharedFontTypeE", "共享字体大小 → 宿主字体文件大小", size_t, h_pl_Size, int type) { (void)type; font_load(); return g_font_size; }
|
||||
HLE_FORCE("_ZN2nn2pl20GetSharedFontAddressENS0_14SharedFontTypeE", "共享字体地址 → BFTTF 头(宿主字体)", const void *, h_pl_Addr, int type) { (void)type; font_load(); return g_font; }
|
||||
HLE_FORCE("_ZN2nn2pl17GetSharedFontSizeENS0_14SharedFontTypeE", "共享字体大小 → 头 8 字节 + 宿主字体文件大小", size_t, h_pl_Size, int type) { (void)type; font_load(); return g_font_size; }
|
||||
|
||||
// ---------- vi:垂直同步事件 ----------
|
||||
// 游戏给一个 SystemEventType,宿主绑定后由一条宿主线程按 60 Hz 触发(DM_VSYNC_HZ 可改)
|
||||
|
||||
+13
-8
@@ -33,14 +33,19 @@ static void mem_init(void) {
|
||||
if (g_as) return;
|
||||
g_as = mmap(NULL, RESERVE, PROT_NONE, MAP_PRIVATE | MAP_ANON, -1, 0);
|
||||
if (g_as == MAP_FAILED) die("reserve guest AS");
|
||||
// 固定划分(都在预留块内):alias 1.25 GB、stack 256MB、heap 其余。较新 SDK 的 AddressRegionManager 在别名区开头固定占 0x3fe00000(约 1 GB)
|
||||
// 作节点区(sdk 0x134728),之后才给游戏分区域;别名区只有 512 MB 时第一次 AllocateAddressRegion 就失败(0x1803)。
|
||||
// Fixed partition (all inside the reserved block): alias 1.25 GB, stack 256MB, heap the rest. In newer SDKs the AddressRegionManager always takes 0x3fe00000 (~1 GB)
|
||||
// at the start of the alias region as its node area (sdk 0x134728) before handing out regions; with a 512 MB alias region the very first AllocateAddressRegion fails (0x1803).
|
||||
// Fixed partition (all inside the reserved block): alias 512MB, stack 256MB, heap the rest starting at 2GB
|
||||
g_alias = g_as + 0x10000000; g_alias_cap = 0x50000000;
|
||||
g_stack = g_as + 0x60000000; g_stack_cap = 0x10000000;
|
||||
g_heap = g_as + 0x70000000; g_heap_cap = RESERVE - 0x70000000; // 4 GB,容得下游戏那一整块约 3.2 GB 的堆 | 4 GB, enough to hold the game's single heap block of about 3.2 GB
|
||||
// 固定划分(都在预留块内):alias 2.875 GB、stack 256 MB、heap 其余 2.625 GB。
|
||||
// 较新 SDK 的 AddressRegionManager 在别名区开头固定占 0x3fe00000(约 1 GB)作节点区(sdk 0x134728),之后才给游戏分区域;别名区只有 512 MB 时第一次 AllocateAddressRegion 就失败(0x1803)。
|
||||
// SMBW 还在 HeapDef(System/HeapSize)里定了 1792000 KB(1.75 GB)的 VirtualAddressMemory:开堆时先从内存池里扣掉它(SetHeapSize 只要 0x5be00000),
|
||||
// 资源加载再按需 MapPhysicalMemory 到别名区节点区之后。别名区只给 1.25 GB 时那里只剩约 256 MB,3 MB 级的布局归档(WipeCourseIn / WipeWarp)
|
||||
// 分不到地址就被跳过,用到时空指针崩(main +0x373e04)。所以别名区 = 节点区 + 1.75 GB + 余量;堆只要 1.47 GB,给 2.625 GB 足够。
|
||||
// Fixed partition (all inside the reserved block): alias 2.875 GB, stack 256 MB, heap the remaining 2.625 GB.
|
||||
// In newer SDKs the AddressRegionManager always takes 0x3fe00000 (~1 GB) at the start of the alias region as its node area (sdk 0x134728) before handing out regions; with a 512 MB alias region the very first AllocateAddressRegion fails (0x1803).
|
||||
// SMBW also defines a 1792000 KB (1.75 GB) VirtualAddressMemory in HeapDef (System/HeapSize): it is subtracted from the memory pool before the heap is opened (SetHeapSize asks for only 0x5be00000),
|
||||
// and resource loading then MapPhysicalMemory's into the alias region after the node area on demand. With a 1.25 GB alias region only about 256 MB was left there, and 3 MB-class layout archives (WipeCourseIn / WipeWarp)
|
||||
// got no address, were skipped, and crashed on a null pointer when used (main +0x373e04). So alias = node area + 1.75 GB + slack; the heap needs only 1.47 GB, and 2.625 GB is plenty.
|
||||
g_alias = g_as + 0x10000000; g_alias_cap = 0xB8000000;
|
||||
g_stack = g_as + 0xC8000000; g_stack_cap = 0x10000000;
|
||||
g_heap = g_as + 0xD8000000; g_heap_cap = RESERVE - 0xD8000000;
|
||||
LOG("guest AS %p +%#llx heap %p alias %p stack %p", g_as, (unsigned long long)RESERVE, g_heap, g_alias, g_stack);
|
||||
}
|
||||
|
||||
|
||||
@@ -443,7 +443,11 @@ int svc_thread(int num, uint64_t *regs) {
|
||||
thr_t *t = calloc(1, sizeof *t);
|
||||
pthread_cond_init(&t->cv, NULL);
|
||||
t->entry = regs[1]; t->arg = regs[2]; t->stack_top = regs[3] & ~0xFull;
|
||||
t->prio = (int)regs[4]; t->core = (int)regs[5]; t->mask = t->core >= 0 ? 1ull << t->core : 7;
|
||||
// 核 -2(IdealCoreUseProcessValue)= 进程缺省理想核(本作 0 号),亲和掩码只含它——同 Horizon 内核。原先记成 -2,GetCurrentProcessorNumber 也答 -2,
|
||||
// SMBW 的字体引擎按当前核号取每核引擎槽,拿 -2 当下标越界崩(main +0x107dbc0,SequenceBackgroundWorker 线程)
|
||||
// Core -2 (IdealCoreUseProcessValue) = the process's default ideal core (0 for this game), with an affinity mask of just that core - as in the Horizon kernel. It used to be recorded as -2 and GetCurrentProcessorNumber answered -2;
|
||||
// SMBW's font engine picks its per-core engine slot by the current core number and crashed indexing with -2 (main +0x107dbc0, SequenceBackgroundWorker thread)
|
||||
t->prio = (int)regs[4]; t->core = (int)regs[5] >= 0 ? (int)regs[5] : 0; t->mask = 1ull << t->core;
|
||||
t->born_ns = now_ns(); t->born_tick = dm_thread_tick_fn ? dm_thread_tick_fn() : 0;
|
||||
pthread_mutex_lock(&G); t->handle = h_new(O_THREAD, t); t->id = g_next_id++; t->all = g_all; g_all = t; pthread_mutex_unlock(&G);
|
||||
pthread_attr_t a; pthread_attr_init(&a); pthread_attr_setstacksize(&a, 1 << 20);
|
||||
@@ -480,17 +484,17 @@ int svc_thread(int num, uint64_t *regs) {
|
||||
case 0x0D: { thr_t *t = h_get((uint32_t)regs[0], O_THREAD); if (t) t->prio = (int)regs[1]; regs[0] = t ? 0 : R_BAD_HANDLE; return 1; }
|
||||
case 0x0E: { thr_t *t = h_get((uint32_t)regs[2], O_THREAD);
|
||||
regs[0] = t ? 0 : R_BAD_HANDLE; regs[1] = t ? (uint64_t)(uint32_t)t->core : 0; regs[2] = t ? t->mask : 0; return 1; }
|
||||
case 0x0F: { // SetThreadCoreMask(w0, w1 理想核, x2 掩码):-1 = 用进程缺省、-2/-3 = 不改理想核;宿主只记账 | SetThreadCoreMask(w0, w1 ideal core, x2 mask): -1 = use the process default, -2/-3 = leave the ideal core unchanged; the host only keeps the bookkeeping
|
||||
case 0x0F: { // SetThreadCoreMask(w0, w1 理想核, x2 掩码):-2 = 用进程缺省(理想核 0、掩码只含它)、-1 = 不在乎、-3 = 不改理想核(同 Horizon 内核);宿主只记账 | SetThreadCoreMask(w0, w1 ideal core, x2 mask): -2 = use the process default (ideal core 0, mask of just that core), -1 = don't care, -3 = leave the ideal core unchanged (as in the Horizon kernel); the host only keeps the bookkeeping
|
||||
thr_t *t = h_get((uint32_t)regs[0], O_THREAD);
|
||||
if (t) { int c = (int)regs[1]; if (c >= 0) t->core = c; else if (c == -1) t->core = 0; if (regs[2]) t->mask = regs[2];
|
||||
if (t) { int c = (int)regs[1]; if (c >= 0) t->core = c; if (c == -2) { t->core = 0; t->mask = 1; } else if (regs[2]) t->mask = regs[2];
|
||||
// 理想核不在新掩码里(-2/-3 不改理想核、却把线程钉到别的核):同 Horizon,理想核改到掩码里最低的核。
|
||||
// 不改的话 GetCurrentProcessorNumber 对钉在 1 / 2 号核的线程也报 0 号,按核分队列的任务系统(SMBW 的 BaseProcExecutor)会去拿 0 号核的活、1 / 2 号核的队列没人取
|
||||
// The ideal core is not in the new mask (-2/-3 keep the ideal core but pin the thread to other cores): as in Horizon, move the ideal core to the lowest core in the mask.
|
||||
// Otherwise GetCurrentProcessorNumber reports core 0 even for threads pinned to cores 1 / 2, and a job system with per-core queues (SMBW's BaseProcExecutor) takes core 0's work while nobody drains the queues of cores 1 / 2
|
||||
if (t->mask && !(t->mask >> t->core & 1)) t->core = __builtin_ctzll(t->mask); }
|
||||
if (t->mask && (t->core < 0 || !(t->mask >> t->core & 1))) t->core = __builtin_ctzll(t->mask); }
|
||||
regs[0] = t ? 0 : R_BAD_HANDLE; return 1;
|
||||
}
|
||||
case 0x10: regs[0] = (uint64_t)(uint32_t)cur()->core; return 1;
|
||||
case 0x10: { int c = cur()->core; regs[0] = (uint64_t)(uint32_t)(c >= 0 ? c : 0); return 1; } // 当前核号总在 0..2(核号从不为负) | The current core number is always 0..2 (never negative)
|
||||
case 0x25: { thr_t *t = h_get((uint32_t)regs[1], O_THREAD); regs[0] = t ? 0 : R_BAD_HANDLE; regs[1] = t ? t->id : 0; return 1; }
|
||||
|
||||
case 0x1A: { // ArbitrateLock(w0 持有者句柄, x1 地址, w2 本线程标签) | ArbitrateLock(w0 owner handle, x1 address, w2 this thread's tag)
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
# iOS 着色器出包链的唯一编译口径:任意来源的 MSL(PC 链 / 常数补丁 / 今后 Switch 原版经 Ryujinx 翻译)→ iphoneos metallib。
|
||||
# 编译参数只在这里定义一次;反射 json 的 chain.metal 记录由同一份参数生成,记录 == 实际。
|
||||
# The single compile standard for the iOS shader packaging chain: MSL from any source (PC chain / constant patches / in future, the Switch original translated via Ryujinx) → iphoneos metallib.
|
||||
# Compile parameters are defined only once, here; the chain.metal record in the reflection json is generated from the same parameters, record == actual.
|
||||
import subprocess
|
||||
METAL = ['xcrun', '-sdk', 'iphoneos', 'metal', '-c', '-mios-version-min=18.0'] # 与既有 iOS 着色器缓存一致 | Consistent with the existing iOS shader cache
|
||||
METALLIB = ['xcrun', '-sdk', 'iphoneos', 'metallib']
|
||||
RECORD = ' '.join(METAL) + '; ' + ' '.join(METALLIB) # 写进 json chain.metal | Written into json chain.metal
|
||||
|
||||
def compile(msl, air, lib):
|
||||
subprocess.run([*METAL, msl, '-o', air], check=True)
|
||||
subprocess.run([*METALLIB, air, '-o', lib], check=True)
|
||||
@@ -0,0 +1,49 @@
|
||||
# 01 — Extracting an NSP
|
||||
|
||||
## Keys
|
||||
|
||||
- Needs the user's own `prod.keys` and the title key from the NSP's ticket. Keep both under the workspace, e.g. `~/dm-work/build/keys/.switch/{prod,title}.keys`, and run hactool with `HOME` pointed there so it never reads anything else:
|
||||
|
||||
```bash
|
||||
# ~/dm-work/build/keys/ht — hactool with a private key home
|
||||
HOME="$(cd "$(dirname "$0")" && pwd)" exec "$(dirname "$0")/../../tools/hactool/hactool" --disablekeywarns "$@"
|
||||
```
|
||||
|
||||
- Dumped `prod.keys` files may contain malformed lines (seen: 33 `*master_kek_source_*` lines with the wrong length) that make hactool refuse the whole file. Drop lines whose value length is wrong for the key type; keep a backup of the original.
|
||||
- Title key: the NSP carries `<rights id>.tik`. For a common ticket the encrypted title key is the first 16 bytes of the title-key block at 0x180; append `<rights id> = <key hex>` to `title.keys`. Never print the value.
|
||||
|
||||
## NSP → NCA → ExeFS / RomFS
|
||||
|
||||
```bash
|
||||
ht -t pfs0 --outdir=$W/build/nsp game.nsp > $W/build/nsp.log # NSP is a PFS0: NCAs + cnmt + tik/cert
|
||||
ht -t nca $W/build/nsp/<id>.nca | head -40 # identify the Program NCA (content type Program, has ExeFS + RomFS)
|
||||
ht -t nca --listromfs $W/build/nsp/<program>.nca > romfs_list.txt # quick look before extracting 3+ GB
|
||||
ht -t nca --exefsdir=$W/data/v0/ExeFS --romfsdir=$W/data/v0/RomFS $W/build/nsp/<program>.nca
|
||||
```
|
||||
|
||||
- ExeFS holds `main.npdm`, `rtld` (usually), `main`, `sdk` and sometimes `subsdk*` modules (NSO). D2R and Mario both had only `main` + `sdk` worth loading.
|
||||
- Update NSPs: the update's Program NCA is a patch NCA; extract it with `--basenca=<base program nca>` so RomFS is the merged view. Keep base and update in separate directories (`data/v0`, `data/v<ver>`); the rewriter and the host take one ExeFS at a time.
|
||||
- Decompressed NSO images for analysis: `dm/tools/nso.py <nso> <out.bin>` (lz4; use a venv that has `lz4`). `dm/tools/nso2elf.py` makes an ELF for Ghidra / REA / objdump.
|
||||
|
||||
## Workspace layout used so far
|
||||
|
||||
```
|
||||
~/<title>-work/
|
||||
build/nsp/ NCAs + tik/cert + nsp.log
|
||||
data/v0/{ExeFS,RomFS} extracted base game (v<ver> for updates)
|
||||
probe/ decompressed images (main.orig.bin, sdk.orig.bin), small experiments
|
||||
elf/ nso2elf output
|
||||
census/ survey tables (imports, svc, NVN slots)
|
||||
build/patched_v0/ rewriter output (what the host loads)
|
||||
shader/ shader package directory + map + facts produced by shader_split.py
|
||||
build/cache/metal_shader_cache/b-<chain version>/ translated metallibs
|
||||
build/gfx/dmsh_xlate/ the shader translator build
|
||||
ghidra/proj persistent Ghidra project (analysis takes ~35 min for a 28 MB main)
|
||||
run/ boot.sh, logs, saves, screenshots
|
||||
dbg/ lldb scripts
|
||||
```
|
||||
|
||||
## Compressed RomFS content
|
||||
|
||||
- Newer EPD titles store most files as `*.zs` (plain zstd, no dictionary in Mario; Zelda TotK needs `ZsDic.pack` dictionaries). Check for `*dic*` files before assuming plain zstd.
|
||||
- `*.sarc` / `*.pack` / `*.blarc` / `*.bfarc` are SARC archives; `*.byml` / `*.bgyml` are BYML (version 7 in Mario). A minimal reader for both is short enough to write inline when needed (see `shader_split.py` for SARC).
|
||||
@@ -0,0 +1,54 @@
|
||||
# 02 — Surveying a new title
|
||||
|
||||
Do this before touching the host. Every item answers "what will break, and how much work is it".
|
||||
|
||||
## Identity and versions
|
||||
|
||||
| Question | How |
|
||||
|---|---|
|
||||
| Program ID | NCA header / `main.npdm`. The host reports it from `svcGetInfo(ProgramId)` (`hle_svc.c`, `DM_PROGRAM_ID` overrides); some SDK code checks it. |
|
||||
| SDK version | Strings in `sdk`: `SDK MW+Nintendo+NintendoSDK_nnSdk-16_2_1-Release` style. SDK 16 changed several object sizes and service paths compared with D2R's SDK. |
|
||||
| NVN API version | The game calls `nvnDeviceGetInteger(API_MAJOR/MINOR)` and refuses to run if the host reports an older version. Mario required 55.x with minor ≥ 15 (`DM_NVN_API`). Its device setup *returns silently* on a failed check, so a missing frame loop with no error is a hint. |
|
||||
| Modules | ExeFS listing. Only `main` + `sdk` so far; `subsdk*` would need loader support. |
|
||||
|
||||
## Imports vs. host hooks
|
||||
|
||||
`dm/tools/nso_syms.py <repo dm/host dir> <gameA ExeFS> <gameB ExeFS>` compares the dynamic imports of the new title (B) with the title the host already supports (A) and with the host's hook names.
|
||||
|
||||
- Mario imported 1,107 symbols, 692 of which D2R never imported (biggest gaps: `nn::audio` 197, `nn::hid` 48). 172 of the host's 186 hook names existed in Mario's `sdk`.
|
||||
- Not every import needs a hook. Many SDK functions run natively inside `sdk`; only the ones that end in an IPC to a system service (they reach `nn::sm::Initialize` / `svcSendSyncRequest`) must be replaced by a host hook on the **public entry point**. A missing one shows up at run time as an abort in `nn::sm::Initialize` with a backtrace: hook the outermost public function in that backtrace.
|
||||
|
||||
## SVCs and instructions to rewrite
|
||||
|
||||
- `dm/tools/insn_census.py <module.nso> [--sites tsv]` counts every site the rewriter must handle: `svc`, `mrs/msr tpidr*`, `x18` use, exclusive windows (`ldxr`/`stxr`), timers (`cntpct`, `cntfrq`), cache maintenance, and system registers.
|
||||
- Run `DM_RULESET=native python3 dm/tools/patch_nso.py <nso> <out dir> <name>` and check that its counts match the census. New system registers appear with new SDKs: SDK 16 reads `CTR_EL0` (macOS traps it), now rewritten to a constant.
|
||||
- Mario's SVC set was a subset of D2R's. A new SVC needs a case in `hle_svc.c` / `hle_thread.c`; the default case logs `SVC %#x (占位返回成功)` once and returns success, which is wrong for anything that returns data.
|
||||
|
||||
## NVN surface
|
||||
|
||||
- Find how the game obtains NVN entry points. D2R wrote slots with `adrp`-to-slot code (`dm/gfx/tools/nvn_slots.py`); Mario's loader (`main+0x1070910`) calls `GetProcAddress` per name and stores through the GOT (`dm/tools/nvn_slots_got.py <main.bin> <loader> <text end> <out tsv>`). The output lists every fetched function and every call site.
|
||||
- Mario fetched 534 functions and called 236 of them; 79 were new to the host (CommandBuffer 31, Texture 15, Buffer 10, Sampler 10). Names the host doesn't know at all go into `dm/gfx/nvn/names.txt` → `gen_protos.py`.
|
||||
|
||||
## Data containers that matter to the host
|
||||
|
||||
| What | Where to look | Mario |
|
||||
|---|---|---|
|
||||
| Shaders | Every container that embeds NVN shader binaries, not just the obvious archive. Scan all of RomFS and `main` (see [04](04-graphics.md)) | `Shader/*.bfsha` (BNSH), `Lib/agl/*.sarc` + `Shader/Secred.sarc` (agl BAHS `sharcb`), `Effect/*.esetb` (BNSH), `Layout/*.blarc` (BNSH), and two BNSH inside `main` |
|
||||
| Heap budget | A heap-definition file, if the engine has one | `System/HeapSize/*.HeapDef.byml`: per-subsystem heaps in KB, and a 1.75 GB `VirtualAddressMemory` mapped on demand into the alias region (drives the address-space partition, [03](03-bringup.md)) |
|
||||
| Resource sizes | Resource size table | `System/Resource/ResourceSizeTable.*.rsizetable` (RESTBL, CRC32 of the path → decompressed size) |
|
||||
| Fonts | Font archives and use of the system shared font | `Font/*.bfarc`; the shared font goes through `nn::fontll::ScalableFontEngineHelper::Decode` (BFTTF) |
|
||||
| Languages | Per-language archives | `Mals/<Region><lang>.sarc`, `Voice/Resource/<Region><lang>` |
|
||||
|
||||
## Ghidra and REA
|
||||
|
||||
- Convert with `nso2elf.py`, create one persistent headless project per module, and analyse once (Mario `main`, 28 MB: ~35 min, 138k functions). Ghidra's image base for these ELFs is 0x100000, so `FUN_xxxx` = module offset + 0x100000.
|
||||
- Decompile on demand in seconds with a script (`ghidra/scripts/Decompile.java` in the workspace):
|
||||
|
||||
```bash
|
||||
JAVA_HOME=<jdk21> $GHIDRA/support/analyzeHeadless ~/<title>-work/ghidra/proj <name> -process <module>.elf \
|
||||
-noanalysis -readOnly -scriptPath ~/<title>-work/ghidra/scripts -postScript Decompile.java 0x107dbc0,0x3707b0
|
||||
```
|
||||
|
||||
`analyzeHeadless` needs `JAVA_HOME` set even when Java is on PATH. Code only reachable through vtables may have no function defined at an address; use `objdump -d --start-address=… --stop-address=… <module>.elf` instead.
|
||||
- REA (MCP) can open the same ELF, but its snapshots keep evidence only, so every new session re-runs the 35-minute analysis; the persistent Ghidra project is faster for repeated lookups. Register REA with `GHIDRA_INSTALL_DIR`, `JAVA_HOME` and a long `REA_GHIDRA_STARTUP_TIMEOUT_MS`.
|
||||
- Dynamic symbols (imports / exports with names) come from the NSO's `.dynsym`; read them directly (MOD0 → dynamic section → `DT_SYMTAB` / `DT_STRTAB`) when you need an address for a named SDK function, e.g. `nn::fontll::ScalableFontEngineHelper::Decode` in `sdk`.
|
||||
@@ -0,0 +1,68 @@
|
||||
# 03 — Host bring-up
|
||||
|
||||
## The loop
|
||||
|
||||
```bash
|
||||
DM_RULESET=native python3 dm/tools/patch_nso.py $W/data/v0/ExeFS/main $W/build/patched_v0 main # and sdk
|
||||
make -C dm/host dmhost
|
||||
~/<title>-work/run/boot.sh <log name> [seconds] [VAR=value ...]
|
||||
```
|
||||
|
||||
`boot.sh` runs `dmhost <patched dir>` with `DM_ROMFS`, `DM_SAVE`, `DM_TEMP`, `DM_MSL_DIR` set, under a perl `alarm` (a run that hits the time limit ends with `CRASH sig=14` — that is the alarm, not a crash). Logs go to `run/<name>.log`. Logs may contain non-UTF-8 bytes: use `grep -a` / `LC_ALL=C` when filtering.
|
||||
|
||||
## Reading the log
|
||||
|
||||
| Marker | Meaning |
|
||||
|---|---|
|
||||
| `>>> nnosInitialize`, `>>> nnMain` | Boot stages reached |
|
||||
| `【红】…` | Something unimplemented or wrong, printed once per kind. Collect them with `grep -a "【红】" log \| sort \| uniq -c` after every run |
|
||||
| `UNIMPL <name>` | A forced NVN / SDK stub was called |
|
||||
| `[nvn] 帧 N:… \| name=count …` | Per-frame NVN call counts (calls made on the frame thread; command buffers recorded elsewhere replay later) |
|
||||
| `[长帧]` | A long frame, with submit / GPU / pipeline / upload breakdown |
|
||||
| `内存 至帧 N:常驻 … 显卡已分配 …` | Memory report (RSS, Metal allocated size). Printed when memory moves; steady growth here is a leak. A watchdog exits at 24 GB |
|
||||
| `CRASH sig=… pc=… lr=…` + registers + `bt:` + `栈扫描` + thread dump | Crash report: see [05](05-debugging.md) |
|
||||
| `线程 0x10xx 「name」… 等:<state> addr=…` | Thread dump: what each guest thread waits on (`地址` = address arbiter, `锁` = mutex with holder, `条件变量`, `同步对象`, `运行/未在等` = running) |
|
||||
|
||||
Useful switches: `DM_FS=1` (file opens, and not-found probes), `DM_SVC=1` (memory SVCs and other syscalls), `DM_THR=1` (thread SVCs), `DM_WATCH=<s>` (dump all threads after s seconds), `DM_WATCH_STALL=<s>` (dump when the frame loop stops progressing).
|
||||
|
||||
## Failure catalogue
|
||||
|
||||
Each entry: symptom → root cause → fix (where the fix lives). Check these first; most new-title failures are one of them in a new form.
|
||||
|
||||
### Rewriter
|
||||
|
||||
- **Job system hangs; a queue claims thousands of tasks but every slot is empty** → in an `ldxr … cmp … b.ne out … stxr … cbnz` window, the rewritten stub emitted its exits in the wrong order, so successful stores took the failure path → emit the fall-through exit first (`patch_nso.py`). D2R had no such windows; Mario had 82.
|
||||
- **SIGILL / trap on a system register read** → newer SDK reads a register macOS traps (`CTR_EL0` in SDK 16's `FlushDataCache`) → rewrite to a constant.
|
||||
|
||||
### Memory and address space
|
||||
|
||||
- **First `AllocateAddressRegion` fails with 0x1803** → SDK 16's AddressRegionManager takes 0x3fe00000 at the start of the alias region as a node area → the alias region must be larger than 1 GB.
|
||||
- **Large resources silently skipped, later a null deref where the resource is used** → the game reserves "virtual address memory" (Mario: 1.75 GB in `HeapDef.byml`) and maps it into the alias region with `MapPhysicalMemory` on demand; the alias region left after the node area was too small. Also visible as `SetHeapSize` asking for much less than the pool. → repartition the 6 GB guest block (`hle_svc.c` `mem_init`): Mario uses alias 2.875 GB, stacks 256 MB, heap 2.625 GB. 6 GB is the most iOS reserves without the extended-virtual-addressing entitlement.
|
||||
- **`MapPhysicalMemory` faults on part of a page** → round to 16 KB host pages.
|
||||
- **Write through a null pointer at +0x1c0 during startup** → `GetInfo(UserExceptionContextAddress)` must return a real buffer.
|
||||
- **Heap allocations fail late in a busy scene** → the reported application pool (3285 MB, `APP_POOL`) and used memory decide the game's heap size; report Switch-accurate numbers.
|
||||
|
||||
### Threads
|
||||
|
||||
- **Per-core job queues never drained** → a `SetThreadCoreMask` that pins a thread to other cores (ideal core −3 = keep) must move the ideal core into the new mask, as Horizon does, so `GetCurrentProcessorNumber` reports a core the thread can run on.
|
||||
- **Crash indexing a per-core table with a huge offset (index −2)** → threads created with ideal core −2 (*use process default*) were recorded as core −2 and `GetCurrentProcessorNumber` returned −2 → resolve −2 to the process default core (0) and never return a negative core (`hle_thread.c`). Seen in Mario's font engine (`main+0x107dbc0`).
|
||||
|
||||
### Services and SDK
|
||||
|
||||
- **Abort inside `nn::sm::Initialize`** → an SDK path reached a system service the host doesn't replace → hook the public SDK entry point named in the backtrace (`HLE_FORCE` in the relevant `hle_*.c`).
|
||||
- **Device / subsystem setup returns quietly and the next stage never starts** → a version or capability check failed (NVN API version, a feature query) → compare what the game queries with what the host answers.
|
||||
- **Font engine runs on garbage** → the system shared font must look like BFTTF: the SDK calls `ScalableFontEngineHelper::Decode(ptr, size)`, which XOR-decodes in place unless the first word is the "already decoded" marker (LE `0x18029a7f`) → serve `marker + bswap(size ^ 0x49621806) + TTF` (`hle_sdk16.c`).
|
||||
- **File-not-found noise** → games probe many optional paths (debug parameters, other-language voice files); with `DM_FS=1` these show as `fs … 不存在`. Only a missing file followed by a failure matters.
|
||||
|
||||
### NVN object sizes (memory corruption)
|
||||
|
||||
The game allocates NVN objects with the sizes of *its* SDK's headers, which shrank in newer SDKs. A host record larger than the game's allocation overwrites neighbouring memory:
|
||||
|
||||
- `NVNtexture` is 0x80 bytes in SDK 16 (heap corruption: the old 0x88 record overwrote the next heap block's links).
|
||||
- `NVNtextureView` is 16 bytes in SDK 16 (stack smash: a 16-byte local next to the saved frame pointer; the function returned to `0x100000000`).
|
||||
|
||||
Check every host object against the new SDK: `_Static_assert(sizeof(host) <= N)` next to the struct, and when a crash returns to a nonsense address, look at the 0x100 bytes below `sp` in the crash report for a zeroed frame.
|
||||
|
||||
### Game state
|
||||
|
||||
- **"Stuck" at a screen with one draw per frame** → usually not stuck: most draws are in recorded command buffers replayed later; dump the passes ([04](04-graphics.md)) before assuming the game logic is blocked.
|
||||
@@ -0,0 +1,67 @@
|
||||
# 04 — Graphics: NVN on Metal for a new title
|
||||
|
||||
The graphics layer records NVN commands into its own command format (`dm/gfx/nvn/hle_nvn.c`) and replays them as Metal 4 at submit time (`nvn_mtl.m`). Shaders are never translated at run time: the original Maxwell shader binaries are translated offline (Ryujinx's translator → SPIR-V → spirv-cross → metallib) and looked up by key. See `dm/gfx/README.md` for the full pipeline; this page lists what changes per title.
|
||||
|
||||
## 1. Find every shader container
|
||||
|
||||
Do not stop at the obvious archive. In Mario the main `bfsha` held 4,888 of the 12,811 shaders the game actually uses.
|
||||
|
||||
`dm/gfx/tools/shader_split.py <RomFS> <ExeFS main> <pkg dir> <map out> <facts out>` scans **every** RomFS file (zstd-decompressed, SARC expanded recursively) and `main`, and recognizes:
|
||||
|
||||
- **BNSH** (`BNSH\0\0\0\0` + `grsc` block at +0x60): inside `bfsha`, particle effects (`esetb`, VFXB), UI layouts (`blarc`), and `main` itself. Variation table at +0x80 (count at +0x7c); binary program at variation +0x10; six stage pointers from program +0x08 (vs, hs, ds, gs, ps, cs); stage code descriptor: control ptr +0x08, code ptr +0x10, code size +0x18, control size +0x1c. All pointers relative to the BNSH start.
|
||||
- **BAHS** (agl `sharcb`, engine utility shaders): code region at header +0x1c (size +0x18). Binary entries in the table area are 16 bytes `{code offset, 0, control size (0x880/0x88c), signed offset from this entry to the control section}`. Control sections are shared between programs, so pair by entry, never by searching for code near a control.
|
||||
- **Code area**: 0x30-byte header (magic `0x12345678` graphics, `0x12345679` compute) + 0x50 SPH (graphics only) + instructions. **Control section**: magic `0x98761234`; +0x700 = c1 offset in the code area, +0x704 = code size, +0x748 = compute thread-group size (u32 ×3), +0x754 = compute shared memory bytes.
|
||||
|
||||
Validate a new title's coverage at run time: `DM_NVN_SHDUMP=<dir>` makes the host dump the control section and code of every program it can't find in the map; search those bytes in the game files to find the container that was missed.
|
||||
|
||||
## 2. Key shaders by control section + code
|
||||
|
||||
The host key is `sha256(control[0:0x880] + code)[:16]` (`prog_get` in `nvn_mtl.m`, `shader_split.py`). D2R keyed by the control section alone; in Mario, 6,367 shader pairs share a control section but differ in code. A different code length or layout in a new title must be reflected in both places.
|
||||
|
||||
## 3. Find the binding layout by census
|
||||
|
||||
The NVN driver puts binding tables in driver constant banks, and the layout changed between NVN versions. Don't guess: translate everything once (the translator alone takes seconds) and tabulate what the shaders reference.
|
||||
|
||||
| Binding | D2R (NVN 53) | Mario (NVN 55) | How it was measured |
|
||||
|---|---|---|---|
|
||||
| Bound texture handles (texture buffer) | `0x168 + 8 × slot`, 128 slots | **`0x20 + 8 × slot`**, 32 slots | Immediate handles of all TEX instructions: 0x20…0xF0 in steps of 8 |
|
||||
| Image handles | `0x120 + 8 × slot` | `0x120 + 8 × slot` | agl compute shaders: 0x120 / 0x128 / 0x130 |
|
||||
| Separate samplers | `0x568 + 8 × slot` | not used | — |
|
||||
| Uniform buffers | `c[3 + slot]` | same | |
|
||||
| Storage buffers | `c0[base + 16 × slot]`, base vs 0x110 / cs 0x310 / ps 0x510 | same | |
|
||||
|
||||
`dmsh_build.py` (`TEX_BASE`, `IMG_BASE`, `decode_tex`) and `Program.cs` (`TexBase`) hold these constants; the replay layer fills driver banks with the same layout (`NVN_RB_DRV2` in `encode_args`). After a full build, the summary must say `绑定没解出槽号的着色器 0` (no unresolved bindings).
|
||||
|
||||
## 4. Bindless textures
|
||||
|
||||
Mario's shaders read 38 % of their textures through handles stored in the game's own uniform buffers (`fp_t_cb7_2A` = handle at word 0x2A of c[7] = uniform slot 4). These became binding kinds `tex_ubo` / `samp_ubo` (`NVN_RB_TEXU` / `NVN_RB_SAMPU`): at replay the host reads the 32-bit word from the bound uniform buffer (low 20 bits texture ID, high 12 bits sampler ID).
|
||||
|
||||
Consequence: any optimization that infers "which textures a draw reads" from bound slots is wrong for such shaders. The TBDR optimizations (store / load elision, pass merging) are therefore off by default in this repository (`tbdr_on()`, `DM_NVN_TBDR=1` to enable).
|
||||
|
||||
## 5. Depth convention
|
||||
|
||||
`nvnDeviceSetDepthMode` near = −w (GL, z in [−w, w]) versus near = 0 (D3D / Metal). Metal clips anything with z < 0. Mario uses the GL mode; the translator must rewrite z' = z/2 + w/2 at the end of every vertex shader (`QueryGraphicsState` depth mode true + `QueryHostSupportsDepthClipControl() => false` in `Program.cs`). Symptom when wrong: the full-screen copy into the window draws nothing, so the window stays black even with a solid-colour fragment shader.
|
||||
|
||||
## 6. Other per-title surprises seen in Mario
|
||||
|
||||
- **8-bit index buffers**: Metal has only 16/32-bit indices. Widened to 16-bit at replay into the frame arena. Mario's full-screen passes and its final copy use them.
|
||||
- **Texture swizzle**: `TextureBuilderSetSwizzle` / `TextureViewSetSwizzle` are applied with Metal swizzled texture views (NVN and Metal channel enums have the same values). The font atlas is `(1, 1, 1, R)`; without it glyphs render as white boxes.
|
||||
- **Transient render targets**: the game builds new texture objects every frame over the same storage and never finalizes them. Host textures are shared by `(pool, offset, description)`; otherwise each new object allocates a new private Metal texture (≈13 MB/frame leak).
|
||||
- **Inline uniform updates** (`CommandBufferUpdateUniformBuffer`) are replayed as in-order GPU copies; reading the uniform buffer from the CPU at encode time gives the frame's *last* value, not the draw's.
|
||||
- **Compute code areas have a header** in Mario (`0x12345679`), not in D2R; `dmsh_build.py` strips it.
|
||||
- **Image atomics**: 7 agl compute shaders produce SPIR-V that SPIRV-Cross can't parse (`nullptr` exception). Open issue.
|
||||
|
||||
## 7. Diagnostic switches (host)
|
||||
|
||||
| Switch | Output |
|
||||
|---|---|
|
||||
| `DM_NVN_SHOT=f1,f2:path_%d.png` | Window screenshots at those presented frames |
|
||||
| `DM_NVN_PASSDUMP=f` or `f1-f2` (+ `DM_NVN_PASSDUMP_ALL=1`) | Every render pass of those frames: `P` attachments, `K` shader keys, `B` each binding's actual source, `d`/`D` draw state, `Y` inline updates, `X` texture clears |
|
||||
| `DM_NVN_TEXDUMP=f:path_%d.png` (+ `DM_NVN_TEXSNAP=i,…`) | Every colour render target of frame f, as PNG |
|
||||
| `DM_NVN_CBDUMP=dir` (with PASSDUMP) | Raw uniform buffer contents per binding |
|
||||
| `DM_NVN_HILITE=fskey,…` | Replace those fragment shaders with solid colours: tells "geometry is wrong" from "shading is wrong" |
|
||||
| `DM_NVN_SHDUMP=dir` | Control + code of programs missing from the shader map |
|
||||
| `DM_NVN_ALLOCPROF=1` | Metal allocation growth per replayed op type and per function, command allocator sizes, new textures |
|
||||
| `MTL_DEBUG_LAYER=1 MTL_DEBUG_LAYER_ERROR_MODE=nslog` | Metal validation without aborting |
|
||||
|
||||
A first-frame bring-up that worked for Mario: screenshot is black → `TEXDUMP` shows which targets have content → `PASSDUMP` the pass that writes the window → `HILITE` its fragment shader → `CBDUMP` its uniforms → read the translated `.metal` of its vertex shader.
|
||||
@@ -0,0 +1,70 @@
|
||||
# 05 — Debugging recipes
|
||||
|
||||
## Reading a crash report
|
||||
|
||||
```
|
||||
[dm] CRASH sig=11 addr=0 pc=main+0x373e04 lr=main+0x373dd8 sp=0x7066dd6370
|
||||
x0=… x28=…
|
||||
[dm] bt: main+0x373dd8 main+0x2ea2ac … frame-pointer backtrace
|
||||
[dm] fp=… sp 下方 0x100 字节: … the 32 words below sp (the frame that was just popped)
|
||||
[dm] 栈扫描 sp=…: [-72]main+0x57a14 [+24]main+0x57618 … every word near sp that resolves to a module or host symbol
|
||||
[dm] 线程 0x1001 「主线程」… all guest threads, what they wait on, their backtraces
|
||||
```
|
||||
|
||||
- `pc` and `lr` are module-relative (`main+…`, `sdk+…`) or host symbols. Module offsets are the same as in the decompressed NSO and the ELF (Ghidra adds 0x100000).
|
||||
- Look at the registers before the code: a pointer that is a valid pointer plus garbage high bits, an index of `0xfffffffe`, or `pc == lr == 0x100000000` each tell a different story. a fault at `0x74a740e114 = 0x70a740c570 + 0xfffffffe·4 + 0x1bac` was an index of −2 widened as unsigned; `pc == lr` on a nonsense value is a `ret` through an overwritten saved LR (look at the zeroed frame below `sp`).
|
||||
- When the frame-pointer backtrace is empty, the stack scan's negative offsets (below `sp`) show the return addresses of the calls the crashing function made last.
|
||||
|
||||
## Ghidra / objdump
|
||||
|
||||
```bash
|
||||
# decompile the functions containing these module offsets
|
||||
JAVA_HOME=/opt/homebrew/opt/openjdk@21/libexec/openjdk.jdk/Contents/Home \
|
||||
/opt/homebrew/opt/ghidra/libexec/support/analyzeHeadless ~/<title>-work/ghidra/proj <proj> -process <module>.elf \
|
||||
-noanalysis -readOnly -scriptPath ~/<title>-work/ghidra/scripts -postScript Decompile.java 0x373e04,0x2ea2ac
|
||||
|
||||
# raw disassembly (works where Ghidra defined no function)
|
||||
objdump -d --start-address=0x2ea1c0 --stop-address=0x2ea2b0 ~/<title>-work/elf/<module>.elf
|
||||
```
|
||||
|
||||
Map GOT slots to NVN names with the survey table (`census/*_nvn_slots.tsv`): a call through `[x8, #0x3e8]` after `adrp x8, 0x35ad000` is GOT entry 0x35ad3e8.
|
||||
|
||||
## lldb
|
||||
|
||||
The host uses SIGSEGV for dirty-page tracking, so lldb must pass it through without stopping. Address randomization is off under lldb, so guest addresses repeat across runs. Template (`~/<title>-work/dbg/*.py`, run with `perl -e 'alarm 240; exec @ARGV' lldb -b -o "command script import x.py"`):
|
||||
|
||||
```python
|
||||
import lldb
|
||||
HOST = '/path/to/dm/host/dmhost'
|
||||
def __lldb_init_module(dbg, _):
|
||||
dbg.SetAsync(False); ci = dbg.GetCommandInterpreter(); res = lldb.SBCommandReturnObject()
|
||||
ci.HandleCommand('settings set platform.plugin.darwin.ignored-exceptions EXC_BAD_ACCESS|EXC_BAD_INSTRUCTION', res)
|
||||
t = dbg.CreateTarget(HOST); t.BreakpointCreateByName('run_module_inits')
|
||||
li = lldb.SBLaunchInfo(['<patched dir>']); li.SetEnvironmentEntries(['DM_ROMFS=…', 'DM_SAVE=…', 'DM_TEMP=…'], True)
|
||||
p = t.Launch(li, lldb.SBError())
|
||||
for sig in ('SIGSEGV', 'SIGBUS', 'SIGUSR1', 'SIGUSR2', 'SIGPIPE'): ci.HandleCommand('process handle %s -n false -p true -s false' % sig, res)
|
||||
base = None
|
||||
while p.GetState() == lldb.eStateStopped:
|
||||
fr = p.GetSelectedThread().GetFrameAtIndex(0)
|
||||
if base is None and fr.GetFunctionName() == 'run_module_inits':
|
||||
base = t.EvaluateExpression('(unsigned long)g_mod[0].base').GetValueAsUnsigned() # g_mod[0] = main
|
||||
t.BreakpointCreateByAddress(base + 0x2ea228) # module offset
|
||||
elif base is not None and fr.GetPC() == base + 0x2ea228:
|
||||
print('x0=%#x' % fr.FindRegister('x0').GetValueAsUnsigned(), flush=True) # flush: a timeout kill loses buffered output
|
||||
p.Continue()
|
||||
p.Kill()
|
||||
```
|
||||
|
||||
Patterns that worked: print every call of one function with its arguments; stop when a return value is null and print the backtrace; trace the branch path through one function (one-shot breakpoints on every branch site). Hardware watchpoints on words touched by `ldxr`/`stxr` may stay silent.
|
||||
|
||||
## Memory growth
|
||||
|
||||
1. The host's memory report line (`内存 至帧 …`) every few hundred frames; `footprint -p <pid>` from outside.
|
||||
2. `vmmap -summary <pid>` twice a few seconds apart: which region grows. "owned unmapped (graphics)" = private Metal resources.
|
||||
3. `DM_NVN_ALLOCPROF=1`: growth per replayed op type and per function (`tex_mtl` / pass begin / pipelines / argument buffers), command allocator sizes, and a log of new textures with serial, size, format and storage. A stream of new serials with the same sizes = objects re-created every frame.
|
||||
|
||||
Instruments' Metal Resource Events didn't record this process from the command line (`xctrace record --launch`, with `--env` for the variables); the in-host probes were faster.
|
||||
|
||||
## Render-pass investigation
|
||||
|
||||
See [04](04-graphics.md) section 7. Notes: pass dumps are large and may contain non-UTF-8 bytes; filter with `LC_ALL=C grep -a "\[pass\] F600 " | grep -av " o cmd"`. A Python one-liner with PIL (the dm venv has it) gives mean colour and non-black share of each dumped PNG, which is quicker than opening 20 images.
|
||||
@@ -0,0 +1,32 @@
|
||||
# Porting a Switch title: agent guide
|
||||
|
||||
These pages are for an agent asked to analyse a Switch NSP and port it with the native-execution approach of this repository and [d2r-mobile](../../../d2r-mobile): the game's own aarch64 code runs natively on Apple hardware, a rewriter patches only the instructions Apple's kernel cannot run, the host replaces Horizon system services, and NVN is reimplemented on Metal.
|
||||
|
||||
Everything here was learned on two titles: Diablo II: Resurrected (SDK ~12, NVN 53, the original target of d2r-mobile) and Super Mario Bros. Wonder (SDK 16.2.1, NVN 55, this repository). Where the two differed, both are given; a third title will differ again, so treat every number below as "measure it, don't assume it".
|
||||
|
||||
| Page | Covers |
|
||||
|---|---|
|
||||
| [01-extract.md](01-extract.md) | Keys, NSP → NCA → ExeFS / RomFS, update NSPs, the workspace layout |
|
||||
| [02-survey.md](02-survey.md) | Static survey of a new title before touching the host: SDK version, imports vs. host hooks, SVCs, instructions to rewrite, NVN surface, data containers, Ghidra / REA setup |
|
||||
| [03-bringup.md](03-bringup.md) | Getting the host to boot the game: the run loop, how to read the log, and a catalogue of every failure pattern met so far with its root cause and fix |
|
||||
| [04-graphics.md](04-graphics.md) | NVN on Metal for a new title: object sizes, shader containers and keys, binding layouts, bindless textures, depth mode, index sizes, swizzle, transient render targets, the diagnostic switches |
|
||||
| [05-debugging.md](05-debugging.md) | Recipes: crash reports, lldb scripts, Ghidra headless decompilation, objdump, memory growth, render-pass and texture dumps |
|
||||
|
||||
## Ground rules
|
||||
|
||||
- **Bring your own files.** Keys, NSPs and anything extracted from them stay in the user's workspace (`~/<title>-work`), never in the repository, never in a commit, never printed. Print key *names* and lengths only.
|
||||
- **Measure, then change.** Each fix in this repository started from a concrete observation (a crash address and its decompilation, a census over all shaders, a memory profile). Write the evidence into the code comment next to the fix, the way the existing code does; the next title will need it.
|
||||
- **One title per repository.** smbw-mobile is a copy of d2r-mobile's generic parts with D2R-specific code removed. Constants that are title- or SDK-specific (texture handle base, depth mode, address-space partition, program ID) are changed in place with a comment, not hidden behind runtime switches.
|
||||
- **Keep the bilingual comment style** of the code base (Chinese line, then the English line), and the `【红】` prefix for red log lines that mark something unimplemented or wrong.
|
||||
- **Test where it runs.** The Mac host (`dm/host/dmhost`) is the development loop; the iOS app reuses the same host and graphics code. Never claim something works on iOS without running it there.
|
||||
|
||||
## Checklist for a new title
|
||||
|
||||
1. Extract base (and update, if in scope) — [01](01-extract.md).
|
||||
2. Survey the binaries and the RomFS — [02](02-survey.md). Write down: SDK version, NVN API version, module list, imports the host lacks, SVCs, instruction census, NVN loader pattern, shader containers.
|
||||
3. Make a new repository from the previous port: copy the generic host / gfx / tools / third_party, delete title-specific modules, set the program ID.
|
||||
4. Run the rewriter (`DM_RULESET=native`) and check its counts against `insn_census.py`.
|
||||
5. Boot on the Mac and iterate on the failure catalogue in [03](03-bringup.md) until the game reaches its frame loop.
|
||||
6. Extract and translate the shaders, find the binding layout by census, and get the first frame — [04](04-graphics.md).
|
||||
7. Check memory over a minute of running (`footprint`, the host's memory report line); fix growth before moving on.
|
||||
8. Input, audio, then the iOS bundle (d2r-mobile's `dm/ios`, RomFS inside the app).
|
||||
Reference in new issue
Block a user