multithreading && code cleanup

This commit is contained in:
plexx-dev committed 2026-02-13 05:06:02 +01:00
1 parent 7ec01f634a
commit e84404a6de
9 files changed
+99 -71

No files matched your search

+2 -1
View File
@@ -6,4 +6,5 @@ edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies] [dependencies]
rand = "*" rand = "0.7.0"
rayon = "1.8"
+1 -3
View File
@@ -1,6 +1,4 @@
P6 P6
1000 1000 1000 1000
255 255
嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙�嵙��Line truncated 懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈�懈��Line truncated
"=2>mX?p[Dw`=lWDxa;eS;iV<iU:dS;gU9eS<gU<gU<hV@q]8dQ9dS5[L6\M7`O3XI7_O1SF3YI0RE;aS2PF.FA{�那�愇��愇��愇��𡡤�鍂��𢥫��𢹸��䔮��玏��愇��䔮��鍂��𨫣��愇��𧞄��愇��䔮��愇��𡡤��𨯵��糓��𧞅��玏��倮��𧞄��挷��愇��𨯵��𧞄�矩𣪧V𦶮X�X�X�Z�X�Y�Z�[�[�]�[�\�^�[�[�\�]�\�\�Y�[�Z�_�\�]�]�^�Y�[�^�^�_�]�]�^�_�]�a�`�^�a�^�^�`�]�`�_�^�`�\�^�\�[�]�x�}𨫡w�{𠴱z𨘻y𨘥w�u�v�u�x�z𨘻y�u�v�y�s�v�m�s�v�k�Eoa8jT6eP;pX9mU?w^8jT>u]>s]>s\;oX@w_?v]Az`;qX=tZ>v]@x_B}b=t[>w]=qY;qX?y^B{a>w\<sZ<rYPvpq�{錬|𤨎z𨘻~𩣪|𡤻~鍂{伃{𡤻|𤨎�𧞅��𨫣}佂𧞅襔圲}𤨎�襔|伃~鍂��鍂��襔��襔��𧞅�𧞅�洗圲�𧞅��𢥫鍂��愇��𢹸�𡡤��𡡤��𢥫��襔�𡡤�𧞅�品𢹸𥚃鍂�𨫣�泠𢹸��𧞅~𩣪�𥚃�襔�鍂�𧞄m�O𠌊R𨫎T𠿫Y�[�Z�X�Z�Z�[�Z�Z�Y�Y�[�Z�_�Y�]�]�Z�\�_�[�]�_�\�\�]�Y�Z�\�Y�_�\�^�]�]�X�\�^�]�\�[�Z�\�\�[�[�Z�[�Vㄏ[�Z�X�Y�X�Y�ax�e{�𠻺{�|�rLFsL+X0K M"R$Q% V&!V'(W-7\<;J!R$#]*#\*#_*'f/8h>CnHEqJCmHCoICnHBnHCmGBmG:`=6Z9+I,&?&/N1:a<@jD@oBq峭b㛄W�o觔p盍o崁n訃m毒l毒k咬j泗i泗h姅h姅g禿g禿f禿f呀e呀e呀e呀e字d字d字d字d字d字d字d字d字d字e字e呀e呀e呀f呀f禿g禿g姅h姅i泗j泗j咬k咬l毒m訃o崁p盍r郢s猛t犁FuN:HJ��竈��𠗊��𠗊��𠗊��齄��𠗊��𠗊��𠗊��竈��𤩅��𠗊��齄��𠗊��𠗊��竈��齄��竈��𢤦��𠗊��𠗊��𠗊��苿��齄��齄��𠗊��𠗊��𠗊��𠗊��𠗊��𠗊��齄��𠗊��苘��裵��𠗊��𠗊��竈��齄��竈��齄��𠗊��齄��苿��𤩅��苊��𠗊��凒��竈��竈��𠗊��𠗊��𤩅��竈��𠗊��𠗊��𠗊��齄��𤩅��竈��𠗊��𤩅��齄��𠗊��竈���jSBfP@hRAjSBjSBjSBiRBiRBkTChQAjSCgQAfQAiSBkTCgQAkTCdO?iRBiRBhQAjSCmUDoWEiRBhRBkTCiRAhQAkTCkTClUDiRBlUDjSBmVElTCmVDkTCkTCjSClTClTDlUDkTCkTDjSBiRBkSCkTCjSBkTClUDkTCgQAhRBmUDhRBjSBlUDjSCjSBiRBjSBlUCjSBkSCmUDnVElTClTClUDkTCjSCiRBjSChQAgQAkTCnVElUDiSBmUCjSBlTClTChQAmUDmUDkTCkTCjSBkTCiRBmVEkSCpXFkTCmUDmUDnVDlTClUDlUCnVElTCnUDmUDjSBlUDmVEoVEnVEjSCmUDjSCgQAnVEkTCmUDnVEkTCjSCmUDmUCjSCoWFiSBlUDlUDjSCmUDmUDjSBlUDlTCkTCnVElTCkTCjSClTCjTCiSBkSCkTCkSBkSBnVEkTCjTCkTCiRBkTCmUDjSBiSBkTCkTCmUDmUDkSBlTCjSBlUDhRBkTCnVEiRAkTCnVDkTCkTCkTCkTClTCmUDkTClTCiSBmVDkTDlTCmUDlTCiSBmUDmVEmUCiSBpXFlUDkTCkTCnVEnVDkTCgQ@lTClUDlUDkTCnVEnVDjSClUDjSBlUDlUDlTCjSCkTCoWEkTCjSBmUDkTCmUDlTClUDmVEkTCkTCmUDkTCkTCjSBmUDlUDnVEiRBlUDkTCoWEhRBjSCiSClTCpWEiSBjSCkTCmUDjTClUDgQAnVEjSBlUDhRAmUDkSCoWEkTCkTCoWEnVDmUDlUDlTCkTCkTCjSCjSCkTCkTClUCjSBiSBlUCjSBmUDkTCjSCiRBkTCnVElTDnVElUDnVEpWEhRAkTCmUDlTCgQAmUDkTCkTCmUDmUDlUDiRBmUDnVDiRBiSBkTCmUDgQAmUDkTCkSCjTCkTChRBjSCiSBkTCoVEjTCnVDmVDiRBkTChRAmUDlUDjTClUCjSCiSBiRBjSChQAkTCkTClTClUDkSCjSBkTClUDiSBkTCmUDlUCjSBiSBgQAnVDlUDjSBkTCjSCkTChQAlTCjSCkTCjSCiSBmUDiSBlUCkTCgQ@hRBiSBkTCjTCjSBjTCgQAiRAhQAhRAeP?jSBjTChRAhRAhQAiRBgP@hQAjSBgP@gQAkSBgQA偭棸媿變㜲徥蹼躟媿邐㩗跗囂𠥔湋モ皐跗蹙躠嗀遽鶭跗變鑻徥蹣躞跗遽鷖絑蹙躞絑蹣钁徫遽鷟羝夔㜲徫諂騔徫蹲𣿬絟濱鷩酕還衋徫謂鷎羛謂鶺徫擁儺惉謂鷟釬蹣包淴擁鶹惉樓騧淛碳鬅翊閩騛栮塾蟧崞碳繷抎覜蘤俀棹麭呠捻鞊扙粕磠斕姻滫醜忿�棋㨃�◆Wcs'+13+L�DxaBv_=oY:gT>nY;hU6bO6^N:gT>lY>oY<hV?mZ9dS:eS3WI6[M5[L6_O:dT;dT6[N8]P2QF7YO5RK3JGㄣ�本��䔮��僟��鱏��𧞄��𡡤��𢥫��玏��𤩐��𡡒��𨫣��䔮��𨯵��玏��𧞅��𡡤��𡡒��愇��𪑛��𡡒��𡡒��𢥫��愇��鱏��僟��𧞅��𧞅�挷��䔮��𨯵y𣫺V�X�W�T䐁Y�V𦶮Y�X�V�[�Z�X�Z�Y�Y�^�Z�Y�^�]�Y�^�\�]�\�\�_�[�Z�^�]�_�_�\�]�\�_�_�_�a�]�]�_�^�_�a�_�^�^�]�^�[�]�]�Z�x�z�y�w�x�z𨘥s�y�q�v�q�y�s�w�s�t�o�r�r�p�q�q�o�Zxy5_M5dO7gQ:mV6fQ8jT3_K8iS8jS8iS;pX:nV;pW=s[8kT<qX7iR8jS>u[9mU9nU6iR7jQ8jSCo_g�u�s�v�w�z�z𨘻|𤨎z鍫|𡤻|𣺊}𣺊{𪆓{鍫{侢{𢬢z鍫|伃|伃}𤨎�𧞅~𨫣�𢞁��襔鍂襔�𥚃~鍂��𧞄𩣪��𧞅~圲𩣪��𡛂��𧞅~𩣪襔��𢞁�𢥫��𢥫鍂��𧞅��𨯵��挷�𨫣��𧞄��𨫣��襔��𡡤��𧞅y𤥃P癳Q脒W�Z�X�X�Z�Z�V�X�]�\�X�[�Y�Z�X�^�Y�Z�]�[�]�\�\�^�]�[�]�\�\�Y�Z�[�Y�\�\�\�\�Y�\�]�Z�[�[�[�Z�X�]�Z�[�V╭Y�U捤V�X�W�W㗒p�p�j�m�t�TyfEqK:f?K"GN#U%R%Q$)K-,J0";%7J"H!R%"W)+Q.9`=;a@=dB@jEAlGDqJEqJCoI@jE?hD>gCBmGAlF@iDBlGDoIL𧜵h𦞙Z�d緔q郢p盍o崁n訃m毒l毒k咬j咬j泗i泗h姅h姅g禿g禿f禿f禿f呀f呀e呀e呀e呀e呀e呀e呀e呀e呀e呀e呀e呀f呀f呀f禿g禿g禿g姅h姅i姅i泗j泗k咬l毒l毒m訃n崁p盍q郢s徘u逗j吩Tkm��𠗊��𠗊��𤩅��𠗊��竈��齄��竈��凒��竈��𠗊��𠗊��𤩅��𠗊��𢤦��𠗊��𠗊��竈��𢤦��齄��𠗊��齄��竈��𤩅��𠗊��竈��𤩅��竈��苘��竈��𠗊��𤩅��𤩅��齄��𠗊��𠗊��𠗊��裵��𢤦��𠗊��𤩅��竈��𢤦��𤩅��𠗊��𢤦��竈��竈��𤩅��𤩅��齄��竈��𠗊��𠗊��竈��竈��𨩙��苘��竈��𠗊��𠗊��竈��𠗊��竈��𠗊��𨩙hSFjSCjSBkTCjSCjSCkTClTCiRAhQAiRBkSCiRBkTChRBjSBkSCmUDjSBkTCjSBjSCkTClTCiRBgP@kTCkTCkSCkTClTCjSCiRBiRBjSBmUDhQAiSBmUDhRBjSBmVEhQAkTClTCjSCmUDjSBmUDkTClUDhRAmVEiRBlUDmVEjSBlUDiRAiRBkTCjSBoWEkTCkTClUDlUDlUDjSCoWEjSCnVDjSCnVEkTCmUDjSBlUCjTCnVEjSCmUDmUDlTChRAlTCkTCkTClTCnVEkTClUDmVDlTCiRBkTCmUDlUDkTCjSCkTCmUDjSClUDoWEiRBmUDnVEjSBjSCkTCnVDjSCmUDnVDlTClTCjSBeO@lUCkTCnVEkTCnUDlUDlTLine truncated
 ;iUF|e@s[CxaF|d?q\<lWAs]Aq\Aq]?oZ@q\@q\?q\Ar^8fR:iV9aR9eS8cQ:bR1VF5]M8^P8[P>ZV黆�未��襔佂�𩣪��襔��𤩐��𧞅圲��𨫣�𩣪��糓��襔��𡡤�鍂��𧞅��𢥫��䔮��𨯵��玏�𢹸��玏��鱏��𨯵��𧞄��𧞅��𧞄��𡡒��𧞅��鍂��愇��𨫣��𧞄��糓�悽膓U𠍆P𠐔R鎆U墶S彜T㝯R䮽U𠍆U𦶮Z�X�W嗁S𤩝V嗁[�Z�X�Y�T㝯[�V嗁[�[�W�Z�[�[�[�[�Y�X�[�[�[�X�\�Y�Z�\�[�Z�[�W�Y�]�Z�^�[�Y�Y�X�\�Y�[�Z�v�x�v�u�v�s�p�p�o�q�p�n�i㗝|ā{Ê{�y�s{^r{_t{YlsXjqTgmM]dI[]HV[CQUBPR=JN/>=1<>2<>,56$# (('-0!!",+$/-&10(431<>'738FH9KJAOSI^_L`cJ^aQfkUkpVlqZrvbw�\rycx�骲�f~é�n�m�o�u�r�v�r�w�z�u�y�y𨘻{鍫w�x�{鍫{𪈠|𪈠z錬{𪈠|𣑐}𣑐}𣑐�洗𢹸~𣺊�𨫣𥚃鍂~𢹸~𢹸圲挷�𧞅�𧞅��𨫣�挷�僟��愇��愇��𧞄��𨫣��襔��𧞄�𨫣��𧞄�𡡤~佂U药S𣜖R鰠T纇S鰠W�T补S㝯U𦶮[�X�U达W�W�Y�Z�Y�W㗒V䃺V䃺X�]�X�W�Z�W�V愰X�Y�Z�X�[�Z�Z�Z�Y�X�V䃺Y�W�P𤴆Y�V﹚W�X�W�V﹚Z�U䶜T饀Z�T𪗋V�P錱T鞴U𧿹l�鍂~圲��𢥫鍂�則�CmH:a>0O3$<%4/":#$?&$=&*G-,L0-L11R44V98]<8_=9^=;cA<dA>iC=fBAlGAlFAlG@kECnIAlFBnGCnHCnH6l;4�?3<`𣊁t猛s徘r郢_𤩊,F.'#BiEm段m訃m毒l毒l毒k咬k咬k咬j咬j泗j泗i泗i泗i泗i泗i泗i泗i泗i泗i泗i泗i泗i泗i泗j泗j泗j泗j咬k咬k咬k咬l毒l毒m訃n訃n崁o崁p盍p盍q郢r徘t猛u逗t牽��竈��竈��𠗊��竈��苘��苘��𠗊��𠗊��竈��竈��黸��竈��竈��苘��竈��竈��齄��𠗊��𠗊��𤩅��𠗊��𠗊��齄��竈��竈��竈��𠗊��齄��苘��𠗊��𢤦��𠗊��𠗊��𠗊��𠗊��𤩅��𠗊��𠗊��𠗊��凒��竈��𠗊��竈��𠗊��苘��𠗊��𤩅��𠗊��苘��𠗊��𠗊��𤩅��苘��竈��𠗊��竈��竈��𤩅��竈��竈��竈��𠗊��竈��𠗊��𤩅�爽dcgQAjSBjSBiRAfP@fP@iRAjSCjSCiSBiRBhRAiRBlTChRAjSCkSCmUDkTCkSBgQAiRAgQAmVDiRBiRAkTCkTCkTCiSBlUDiRBkTClTClUDjSBmUDhRBmVDjSBiRBkTClTCjSCnVEjSChRAkTCiRBlTCkTChQAkTCiRBiSBjSClUClUDkTCiRBjRBjSClTCkTCiRAlUDlUDiRBlUDlUDmVDkTCkTClTClTClUDiRBlTCkTCjSChRAkTChRBkTCmUClTCfP@mUDkTClTCiRBlTDhRAiSBjSBlUDjSBhRBkSChRBjSBkTCkTCkTDmUDnVDjSCiSBmUClTClTChRAjTCkTClUCkTCjSBmUDlUClUDjSCjSBiRBlUDlUDiRBiRBkTCoWEnVDkTClTCkTChQAlUDkTCjSBmUCjSCkTCjSClUDjSCiSBmUDjSBoWEjSCjSBiRBkTClTCmUDkTCkTClUDkTCjSBmUDjSCkTCiRBkSCkTCjSCkSClUCjSBgQAmUDiRBlTCkTCmUDlUDjSCkTCjSBkTClTClTCmUDkTCnVEhQAmUCkTCkTCiSBlUDlUDiRBnVEkSClUDjTCiSBlUDnVEjSBkTChQAmUDiSBnVEkTDjSCkTClUDmUDkTCiRBjSCmUDkTCmUDlUDlUDlUDkTChRBlTCkTCiRBlTDjSCjSClUDkSBlTCjSBjSCjSCjTChRBjSCkTCmVEhRBlTCjSChRAjSBjSCkTCjSBkTCkTCmUDkTCjSCjSCnVElTCjSBlTClUDmUDjSBiSBkTClUDiSBmUDlUDiRBjSBnVEmVDmVEmUDmUDnVEkTCiRBhQAhRBlUCjSClTCkSBiRBlUDjSChRAkTClUDiRBnVEhQAkTCjSCiRBmUDhQAiRBiRBkSCjSCiRBjSCmUDlTClTChQAlUDlUCkTCjSCiRAmUDjSBhRAlUDiRBmUDfQAjSChRBoWFjSBjSBlUDlUDjSBiSBlUChRAjSBjSCjSBhRBhQAjSBkTCfQ@iSBkTCiSBeO@iRBjSBiRBjSBiRBkTClTCjSCjSBjSBhQAgQAiRAiRBiRAhQAiRBhRBhRAkTChRAkTBfP@lTCiSBgQAjSBlUCjSBiRAgP@hRAgQAgP@hQAfP@gQAfP@yqq濱鷖跅還钀徫擁儺徫蹣𠥔絟謂鷎淴蹦𡤑徫謂鷟釬蹣𣿬跅謂鶬湀謂鷟釬擁劘絎謂鷟徫調劘跅濟驩跅諷蠵釬擁鷎翊樊蘛屙擁鷩悹調鷅秪槳齝淴碩騠郠碳羆淴調鷅郠塾騇砏僇豱侺覜薷栺舒豯侹粕窵俀棹穖呠倩撖⺾姻漵醜汙搕際𧨾�煬佂�𧙕𥚃舊罣咑鑫歃挔𡎎檜租集秤丐【gf&'( 4ZKH�I�F~eCv_D|dG�g>q[Bw`Ar^Cv`=mX=lW?nZ<kW=lX>kZ8bQ:gT6`N3WI8_Q<eU7XN9`R�帑蹬�𩣪��佂�屈𪈠~𪈳�𩣪�𨫣佂�𨫣��𢞁��𧞅��鱏��愇��𧞄��𧞅��𨫣��𧞄��𢹸��䔮��𧞄��𧞄��𧞅��𧞄��𡡒��愇��䔮��𧞅��糓��鱏��䔮��𧞄��𡡤��𤩐��𡡒�烤𥲑S彜R鎆U𠍆R䮽V嗁S彜V䃺V�T㬹V�Q癳Y�X�V𦶮W�Y�V嗁U𠍆Z�Z�W�Y�V𦶮Y�X�X�[�Z�X�Y�X�X�[�Y�Y�Y�]�Y�X�[�Y�Y�Z�Z�V𠿫Y�]�[�\�X�X�W�Z�^�y�v�u�v�v�|錬s�q�n�t�r�p�n�p�n�l�m�fz�靕y�u_t}at}]ryYluZnvObhUgnNafSdjL^bM^bO`eK\`HY\IZ]BRUCSV>OQEVYGW[CVUNadFY[OdgTglRejTjo[ov^u{\rx\ryby��g}Ê~㷴�l�l�k�k�莑�o�p�t�w�r�v�y𨘥x�y𨘥v�{鍫z𪆓y鍫}𡤻y繧|𪈠{𪆓|𤨎|𪈠襔~𣑐圲𨫣�𨫣�襔��𢹸�品鍂�𢞁}𣑐�𨫣��𢥫}𣺊�𨫣鍂��𨫣~𩣪��䔮��𢥫�洞佂��𤩐�𡡤��嵰��𢥫�姒�M𥳁S𨨖U补Q𩥈V�T纇T㝯W�T𠍆V䃺X�U𠍆V愰U𦶮V愰W�V�Z�V匬X�X�V𠲜X�W�Z�X�Z�X�Z�X�Y�W㗒Y�Y�Y�Y�V愰W�W�U𠲜V栂V�W�Y�S𦲤S𦲤V﹚V匬S𡲢U﹙W﹚W�U𠿫Y�R䶑u���𧞅�洞𣺊��𢥫|𢬢GqP:b?7[:*F,'A)'A(&@(+I.(C*-M00R30R42T64X95X9:`?7]<8_=<d@=eB>hCAlF@jF>iC?jE@jEAkF>hCDqIBlG,m35𧶄<y=n夙t猛s徘m甸a脪h𩓧Y䱗*B*(A,h女n訃n訃m訃m毒l毒l毒l毒k咬k咬k咬k咬j咬j咬j咬j咬j泗j泗j泗j泗j泗j咬j咬j咬k咬k咬k咬k咬l毒l毒l毒m訃m訃n訃n崁o崁p盍p盍q郢r郢s徘t猛u逗r逅��齄��凒��𤩅��竈��𠗊��竈��竈��𠗊��𠗊��𠗊��𤩅��𠗊��𠗊��𠗊��𢤦��𠗊��𠗊��𢤦��𠗊��𠗊��𠗊��𠗊��齄��𠗊��𠗊��𤩅��竈��苘��𠗊��𠗊��𤩅��𠗊��凒��竈��苘��齄��竈��𠗊��𠗊��糓��𠗊��𠗊��𠗊��𠗊��竈��竈��𠗊��竈��𤩅��竈��𠗊��竈��竈��𠗊��竈��𠗊��竈��竈��𠗊��齄��𠗊��竈��𠗊��苘��竈�透|�SBjSBkTChRBlTCjRAiRBhQAjSBiRAhQAjRBjSBiRBiRAjSClTCjSBiSBhQAjSCjSBiRBjSBmUDjRBkTCiSBhRBiRBjSCjTCjSBlTCfP@mVDjSBjSBlTChRBjRBjSBjSCkTCkTClUDkSCjSBiSBkTCkTCkTCmUDiRBkSCjSBiSBkTCjTClTCgQAjSCkTCkTCkTCkTCfP@iSBlUDmUDlTCmVDkTCkTCiRBkSCjRBkTClUDkTCmUDlUDlUCkSCjSCmUDkTCjSCmUDkSBjSClUCjSCiRBhQAkSClTCjSBkTDiRBjSBkTCkTClTCjTClUDkTDiRBhRBnVElUDjSCnVDjTCkTCiSBlUDhQAjSBhQAkTCkTCnLine truncated
+1 -15
View File
@@ -1,8 +1,6 @@
use std::io::Write;
use crate::{vec3::*, rtweekend::clamp}; use crate::{vec3::*, rtweekend::clamp};
fn get_scaled_color_components(c: Color, samples_per_pixel: i32) -> (u8, u8, u8) { pub fn get_scaled_color_components(c: Color, samples_per_pixel: i32) -> (u8, u8, u8) {
let r = c.x(); let r = c.x();
let g = c.y(); let g = c.y();
let b = c.z(); let b = c.z();
@@ -19,15 +17,3 @@ fn get_scaled_color_components(c: Color, samples_per_pixel: i32) -> (u8, u8, u8)
(255.0 * clamp(b, 0.0, 1.0)) as u8, (255.0 * clamp(b, 0.0, 1.0)) as u8,
) )
} }
pub fn write_color<T: Write>(writer: &mut T, pixel_color: Color, samples_per_pixel: i32) {
let (r, g, b) = get_scaled_color_components(pixel_color, samples_per_pixel);
write!(writer, "{r} {g} {b} ").expect("Can write pixel data");
}
pub fn write_color_bin<T: Write>(writer: &mut T, pixel_color: Color, samples_per_pixel: i32) {
let (r, g, b) = get_scaled_color_components(pixel_color, samples_per_pixel);
let binary_data = [r, g, b];
writer.write(&binary_data).expect("Can write binary pixel data!");
}
+2 -2
View File
@@ -26,6 +26,6 @@ impl HitRecord<'_> {
} }
} }
pub trait Hittable { pub trait Hittable: Send + Sync {
fn hit(&mut self, r: &Ray, t_min: f64, t_max: f64) -> Option<HitRecord>; fn hit(&self, r: &Ray, t_min: f64, t_max: f64) -> Option<HitRecord<'_>>;
} }
+2 -2
View File
@@ -19,11 +19,11 @@ impl HittableList {
} }
impl Hittable for HittableList { impl Hittable for HittableList {
fn hit(&mut self, r: &crate::ray::Ray, t_min: f64, t_max: f64) -> Option<HitRecord> { fn hit(&self, r: &crate::ray::Ray, t_min: f64, t_max: f64) -> Option<HitRecord<'_>> {
let mut temp_rec = None; let mut temp_rec = None;
let mut closest_so_far = t_max; let mut closest_so_far = t_max;
for object in &mut self.objects { for object in &self.objects {
if let Some(rec) = object.hit(r, t_min, closest_so_far) { if let Some(rec) = object.hit(r, t_min, closest_so_far) {
closest_so_far = rec.t; closest_so_far = rec.t;
temp_rec = Some(rec); temp_rec = Some(rec);
+88 -45
View File
@@ -1,37 +1,51 @@
pub mod vec3; pub mod camera;
pub mod color; pub mod color;
pub mod ray;
pub mod sphere;
pub mod hittable; pub mod hittable;
pub mod hittable_list; pub mod hittable_list;
pub mod rtweekend;
pub mod camera;
pub mod material; pub mod material;
pub mod ray;
pub mod rtweekend;
pub mod sphere;
pub mod vec3;
use std::{io::{BufWriter, Write, stdout}, fs::File, time::Instant}; use rayon::prelude::*;
use std::{
io::{stdout, Write},
sync::atomic::{AtomicUsize, Ordering},
};
use crate::{ use crate::{
material::*, camera::*,
color::*, color::*,
sphere::*,
rtweekend::*,
hittable_list::*,
vec3::*,
ray::*,
hittable::*, hittable::*,
camera::*, material::{Lambertian, Dielectric}, hittable_list::*,
material::*,
material::{Dielectric, Lambertian},
ray::*,
rtweekend::*,
sphere::*,
vec3::*,
}; };
fn random_scene() -> HittableList { fn random_scene() -> HittableList {
let mut world = HittableList::new_empty(); let mut world = HittableList::new_empty();
static GROUND_MATERIAL: Lambertian = Lambertian::new(Color::new(0.5, 0.5, 0.5)); static GROUND_MATERIAL: Lambertian = Lambertian::new(Color::new(0.5, 0.5, 0.5));
world.add(Box::new(Sphere::new(Point3::new(0.0, -1000.0, 0.0), 1000.0, &GROUND_MATERIAL))); world.add(Box::new(Sphere::new(
Point3::new(0.0, -1000.0, 0.0),
1000.0,
&GROUND_MATERIAL,
)));
for a in 0..12 { for a in 0..12 {
for b in 0..12 { for b in 0..12 {
let choose_mat = random_f64(); let choose_mat = random_f64();
let center = Point3::new(a as f64 + 0.9*random_f64(), 0.2, b as f64 + 0.9*random_f64()); let center = Point3::new(
a as f64 + 0.9 * random_f64(),
0.2,
b as f64 + 0.9 * random_f64(),
);
if (center - Point3::new(4.0, 0.2, 0.0)).length() > 0.9 { if (center - Point3::new(4.0, 0.2, 0.0)).length() > 0.9 {
if choose_mat < 0.8 { if choose_mat < 0.8 {
@@ -50,18 +64,30 @@ fn random_scene() -> HittableList {
} }
static MATERIAL1: Dielectric = Dielectric::new(1.5); static MATERIAL1: Dielectric = Dielectric::new(1.5);
world.add(Box::new(Sphere::new(Point3::new(0.0, 1.0, 0.0), 1.0, &MATERIAL1))); world.add(Box::new(Sphere::new(
Point3::new(0.0, 1.0, 0.0),
1.0,
&MATERIAL1,
)));
static MATERIAL2: Lambertian = Lambertian::new(Color::new(0.4, 0.2, 0.1)); static MATERIAL2: Lambertian = Lambertian::new(Color::new(0.4, 0.2, 0.1));
world.add(Box::new(Sphere::new(Point3::new(-4.0, 1.0, 0.0), 1.0, &MATERIAL2))); world.add(Box::new(Sphere::new(
Point3::new(-4.0, 1.0, 0.0),
1.0,
&MATERIAL2,
)));
static MATERIAL3: Metal = Metal::new(Color::new(0.7, 0.6, 0.5), 0.0); static MATERIAL3: Metal = Metal::new(Color::new(0.7, 0.6, 0.5), 0.0);
world.add(Box::new(Sphere::new(Point3::new(4.0, 1.0, 0.0), 1.0, &MATERIAL3))); world.add(Box::new(Sphere::new(
Point3::new(4.0, 1.0, 0.0),
1.0,
&MATERIAL3,
)));
world world
} }
fn ray_color(r: Ray, world: &mut dyn Hittable, depth: i32) -> Color { fn ray_color(r: Ray, world: &dyn Hittable, depth: i32) -> Color {
// Limit the bounces // Limit the bounces
if depth <= 0 { if depth <= 0 {
return Color::new(0.0, 0.0, 0.0); return Color::new(0.0, 0.0, 0.0);
@@ -71,7 +97,10 @@ fn ray_color(r: Ray, world: &mut dyn Hittable, depth: i32) -> Color {
let mut scattered = Ray::new_empty(); let mut scattered = Ray::new_empty();
let mut attenuation = Color::new_empty(); let mut attenuation = Color::new_empty();
if rec.mat_ptr.scatter(r, rec, &mut attenuation, &mut scattered) { if rec
.mat_ptr
.scatter(r, rec, &mut attenuation, &mut scattered)
{
return attenuation * ray_color(scattered, world, depth - 1); return attenuation * ray_color(scattered, world, depth - 1);
} }
return Color::new_empty(); return Color::new_empty();
@@ -86,19 +115,19 @@ fn ray_color(r: Ray, world: &mut dyn Hittable, depth: i32) -> Color {
fn main() { fn main() {
// Image // Image
let aspect_ratio: f64 = 1.0 / 1.0; let aspect_ratio: f64 = 1.0 / 1.0;
let image_width: i32 = 1000; let image_height: i32 = 1000;
let image_height: i32 = (image_width as f64 / aspect_ratio as f64) as i32; let image_width: i32 = (image_height as f64 / aspect_ratio as f64) as i32;
let samples_per_pixel: i32 = 200; let samples_per_pixel: i32 = 50;
let max_depth: i32 = 4; let max_depth: i32 = 4;
// World // World
let mut world = random_scene(); let world = random_scene();
// Camera // Camera
let lookfrom = Point3::new(-13.0, 2.0, 3.0); let lookfrom = Point3::new(-13.0, 2.0, 3.0);
let lookat = Point3::new(0.0, 0.0, 0.0); let lookat = Point3::new(0.0, 0.0, 0.0);
let vup = Vec3::new(0.0, 1.0, 0.0); let vup = Vec3::new(0.0, 1.0, 0.0);
let dist_to_focus = 10.0;//(lookfrom-lookat).length_squared(); let dist_to_focus = 10.0; //(lookfrom-lookat).length_squared();
let cam = Camera::new( let cam = Camera::new(
lookfrom, lookfrom,
@@ -107,37 +136,51 @@ fn main() {
30.0, 30.0,
aspect_ratio, aspect_ratio,
0.0, 0.0,
dist_to_focus dist_to_focus,
); );
// Render // Render
//let mut rng = rand::thread_rng(); rayon::ThreadPoolBuilder::new()
let now = Instant::now(); .num_threads(11)
let mut file = BufWriter::new(File::create("img.ppm").expect("File creation failed")); .build_global()
.unwrap();
write!(file, "P6\n{image_width} {image_height}\n255\n").expect("Error while writing Magic Byte"); let mut buffer = vec![0u8; (image_width * image_height * 3) as usize];
for j in (0..image_width).rev() { let rows_completed = AtomicUsize::new(0);
for i in 0..image_height { let total_rows = image_height as usize;
buffer
.par_chunks_mut((image_width * 3) as usize)
.enumerate()
.for_each(|(index, row_slice)| {
let j = image_height - 1 - index as i32;
for i in 0..image_width {
let mut pixel_color = Color::new(0.0, 0.0, 0.0); let mut pixel_color = Color::new(0.0, 0.0, 0.0);
for _ in 0..samples_per_pixel { for _ in 0..samples_per_pixel {
let u = (i as f64 + random_f64()) / (image_width - 1) as f64; let u = (i as f64 + random_f64()) / (image_width - 1) as f64;
let v = (j as f64 + random_f64()) / (image_height - 1) as f64; let v = (j as f64 + random_f64()) / (image_height - 1) as f64;
let r: Ray = cam.get_ray(u, v); let r = cam.get_ray(u, v);
pixel_color += ray_color(r, &mut world, max_depth) pixel_color += ray_color(r, &world, max_depth);
}
write_color_bin(&mut file, pixel_color, samples_per_pixel);
} }
print!( let (ir, ig, ib) = get_scaled_color_components(pixel_color, samples_per_pixel);
"[ {:.2} % ]\r",
(1.0 - ((j + 1) as f64 / image_width as f64)) * 100.0 row_slice[(i as usize) * 3] = ir;
); row_slice[(i as usize) * 3 + 1] = ig;
stdout().flush().expect("Can flush stdout"); row_slice[(i as usize) * 3 + 2] = ib;
} }
println!("Took {:.6}ms", now.elapsed().as_millis());
println!("Took {:.6}s", now.elapsed().as_secs_f64()); // progress
println!("Took {:.6}m", now.elapsed().as_secs_f64() / 60.0); let completed = rows_completed.fetch_add(1, Ordering::Relaxed) + 1;
println!("Took {:.6}h", now.elapsed().as_secs_f64() / 3600.0); if completed % 10 == 0 || completed == total_rows {
print!(
"\r[ {:.2} % ] Rendering...",
(completed as f64 / total_rows as f64) * 100.0
);
let _ = stdout().flush();
}
});
} }
+1 -1
View File
@@ -16,7 +16,7 @@ use crate::vec3::{Color, random_unit_vector, reflect, refract};
*/ */
pub trait Material { pub trait Material: Send + Sync {
fn scatter(&self, r_in: Ray, rec: HitRecord, attenuation: &mut Color, scattered: &mut Ray) -> bool; fn scatter(&self, r_in: Ray, rec: HitRecord, attenuation: &mut Color, scattered: &mut Ray) -> bool;
} }
+1 -1
View File
@@ -16,7 +16,7 @@ pub fn random_f64() -> f64 {
// PLEASE CHANGE // PLEASE CHANGE
pub fn random_range_f64(min: f64, max: f64) -> f64 { pub fn random_range_f64(min: f64, max: f64) -> f64 {
rand::thread_rng().gen_range(min..=max) rand::thread_rng().gen_range(min, max)
} }
pub fn clamp(x: f64, min: f64, max: f64) -> f64 { pub fn clamp(x: f64, min: f64, max: f64) -> f64 {
+1 -1
View File
@@ -15,7 +15,7 @@ impl Sphere<'_> {
} }
impl Hittable for Sphere<'_> { impl Hittable for Sphere<'_> {
fn hit(&mut self, r: &crate::ray::Ray, t_min: f64, t_max: f64) -> Option<HitRecord> { fn hit(&self, r: &crate::ray::Ray, t_min: f64, t_max: f64) -> Option<HitRecord<'_>> {
let oc = r.origin() - self.center; let oc = r.origin() - self.center;
let a = r.direction().length_squared(); let a = r.direction().length_squared();
let half_b = oc.dot(&r.direction()); let half_b = oc.dot(&r.direction());