microsandbox-rb 0.9.0 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3395a95418c2c6e159365140455797f0b40318aa585aea8b0b4ac0b93f521957
4
- data.tar.gz: e39164f8143656a0f069720f3359e133bffe2cb5438146dab3b3e629abbe9647
3
+ metadata.gz: c9a11efe93577fa841e3825418b7ea2bdd27cadd404d64f750ef060fa255d4bc
4
+ data.tar.gz: 9ccca9426b0ddefed890528408775068244959e69400497c904ffb2d408c27a5
5
5
  SHA512:
6
- metadata.gz: d07ddd920c69d73c86372176745047ed27c515a5ba3dd30bb1c9fe5ddcf2de39009dc670d1f44965d38ea6c8399e84224640e51fe4caf792f40291ab49befbe1
7
- data.tar.gz: 2eb6879b20289edbcebf80eee934bfd81d176bf6f8e3c577f3da21d8e987e15315db486c612f5f1bd8fa296a35ba4f3244e293496116bce321ae7bd9a9201530
6
+ metadata.gz: 6cc9f1524466a9e910ee21aabcefbf62a8abfa79625d1bdd7a7a37fc634db018a8d8efa277613691d69b153fed22d1d5fcaf493ecbaac629b1b1a866e861461e
7
+ data.tar.gz: c36aa8379159eead35e062c4f282a34deb3957dbf93a34ed48d395ef9e52c96a7f3343a145f24f3418fe25a5a8e1dfc64d23b8514845d80090a14161739e43c3
data/CHANGELOG.md CHANGED
@@ -6,6 +6,25 @@ All notable changes to this gem are documented here. The format is based on
6
6
  microsandbox runtime it embeds; each release notes the upstream runtime tag it
7
7
  wraps, and the README's Versioning section keeps the full gem→runtime map.
8
8
 
9
+ ## [0.9.1] - 2026-07-03
10
+
11
+ Adopts upstream runtime **`v0.6.1` → `v0.6.2`**. The upstream SDK crate's public
12
+ API is unchanged in this release — the only surface change attempted upstream (a
13
+ `disk_size` builder rename, #983) was reverted before the release cut (#1078) —
14
+ so this is a pure runtime bump with no Ruby API change.
15
+
16
+ ### Changed
17
+
18
+ - **Embedded runtime is now `v0.6.2`** (`Microsandbox::RUNTIME_VERSION` /
19
+ `Microsandbox.runtime_version`). Upstream improvements inherited by the gem:
20
+ - **Faster image loads and pulls** (upstream #1075): an early cache gate skips
21
+ already-imported layers and OCI layer decompression switches to zlib-rs.
22
+ Inherited transitively through the SDK crate's `microsandbox-image`
23
+ dependency, so `Sandbox.create` image pulls benefit directly.
24
+ - `msb` CLI polish (terminal-aware help colors, aligned `doctor` runtime
25
+ diagnostics, image-load progress) ships in the prebuilt runtime binary but
26
+ does not affect the Ruby API surface.
27
+
9
28
  ## [0.9.0] - 2026-06-29
10
29
 
11
30
  Adopts upstream runtime **`v0.5.10` → `v0.6.1`** (spanning the upstream `v0.6.0`
data/Cargo.lock CHANGED
@@ -122,7 +122,7 @@ version = "1.1.5"
122
122
  source = "registry+https://github.com/rust-lang/crates.io-index"
123
123
  checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc"
124
124
  dependencies = [
125
- "windows-sys 0.61.2",
125
+ "windows-sys 0.60.2",
126
126
  ]
127
127
 
128
128
  [[package]]
@@ -133,7 +133,7 @@ checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d"
133
133
  dependencies = [
134
134
  "anstyle",
135
135
  "once_cell_polyfill",
136
- "windows-sys 0.61.2",
136
+ "windows-sys 0.60.2",
137
137
  ]
138
138
 
139
139
  [[package]]
@@ -1418,7 +1418,7 @@ dependencies = [
1418
1418
  "libc",
1419
1419
  "option-ext",
1420
1420
  "redox_users",
1421
- "windows-sys 0.61.2",
1421
+ "windows-sys 0.59.0",
1422
1422
  ]
1423
1423
 
1424
1424
  [[package]]
@@ -1616,7 +1616,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
1616
1616
  checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
1617
1617
  dependencies = [
1618
1618
  "libc",
1619
- "windows-sys 0.61.2",
1619
+ "windows-sys 0.52.0",
1620
1620
  ]
1621
1621
 
1622
1622
  [[package]]
@@ -1697,6 +1697,7 @@ checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c"
1697
1697
  dependencies = [
1698
1698
  "crc32fast",
1699
1699
  "miniz_oxide",
1700
+ "zlib-rs",
1700
1701
  ]
1701
1702
 
1702
1703
  [[package]]
@@ -2974,8 +2975,8 @@ dependencies = [
2974
2975
 
2975
2976
  [[package]]
2976
2977
  name = "microsandbox"
2977
- version = "0.6.1"
2978
- source = "git+https://github.com/superradcompany/microsandbox?tag=v0.6.1#868ac5a8f04fadca357b377537e7a5740a856509"
2978
+ version = "0.6.2"
2979
+ source = "git+https://github.com/superradcompany/microsandbox?tag=v0.6.2#e9043c89d3432a548908bb145581be4fa1e2e3d9"
2979
2980
  dependencies = [
2980
2981
  "anyhow",
2981
2982
  "astral-tokio-tar",
@@ -3028,8 +3029,8 @@ dependencies = [
3028
3029
 
3029
3030
  [[package]]
3030
3031
  name = "microsandbox-agent-client"
3031
- version = "0.6.1"
3032
- source = "git+https://github.com/superradcompany/microsandbox?tag=v0.6.1#868ac5a8f04fadca357b377537e7a5740a856509"
3032
+ version = "0.6.2"
3033
+ source = "git+https://github.com/superradcompany/microsandbox?tag=v0.6.2#e9043c89d3432a548908bb145581be4fa1e2e3d9"
3033
3034
  dependencies = [
3034
3035
  "ciborium",
3035
3036
  "microsandbox-protocol",
@@ -3041,8 +3042,8 @@ dependencies = [
3041
3042
 
3042
3043
  [[package]]
3043
3044
  name = "microsandbox-db"
3044
- version = "0.6.1"
3045
- source = "git+https://github.com/superradcompany/microsandbox?tag=v0.6.1#868ac5a8f04fadca357b377537e7a5740a856509"
3045
+ version = "0.6.2"
3046
+ source = "git+https://github.com/superradcompany/microsandbox?tag=v0.6.2#e9043c89d3432a548908bb145581be4fa1e2e3d9"
3046
3047
  dependencies = [
3047
3048
  "async-trait",
3048
3049
  "sea-orm",
@@ -3053,8 +3054,8 @@ dependencies = [
3053
3054
 
3054
3055
  [[package]]
3055
3056
  name = "microsandbox-filesystem"
3056
- version = "0.6.1"
3057
- source = "git+https://github.com/superradcompany/microsandbox?tag=v0.6.1#868ac5a8f04fadca357b377537e7a5740a856509"
3057
+ version = "0.6.2"
3058
+ source = "git+https://github.com/superradcompany/microsandbox?tag=v0.6.2#e9043c89d3432a548908bb145581be4fa1e2e3d9"
3058
3059
  dependencies = [
3059
3060
  "libc",
3060
3061
  "microsandbox-utils",
@@ -3066,8 +3067,8 @@ dependencies = [
3066
3067
 
3067
3068
  [[package]]
3068
3069
  name = "microsandbox-image"
3069
- version = "0.6.1"
3070
- source = "git+https://github.com/superradcompany/microsandbox?tag=v0.6.1#868ac5a8f04fadca357b377537e7a5740a856509"
3070
+ version = "0.6.2"
3071
+ source = "git+https://github.com/superradcompany/microsandbox?tag=v0.6.2#e9043c89d3432a548908bb145581be4fa1e2e3d9"
3071
3072
  dependencies = [
3072
3073
  "astral-tokio-tar",
3073
3074
  "async-compression",
@@ -3092,8 +3093,8 @@ dependencies = [
3092
3093
 
3093
3094
  [[package]]
3094
3095
  name = "microsandbox-metrics"
3095
- version = "0.6.1"
3096
- source = "git+https://github.com/superradcompany/microsandbox?tag=v0.6.1#868ac5a8f04fadca357b377537e7a5740a856509"
3096
+ version = "0.6.2"
3097
+ source = "git+https://github.com/superradcompany/microsandbox?tag=v0.6.2#e9043c89d3432a548908bb145581be4fa1e2e3d9"
3097
3098
  dependencies = [
3098
3099
  "chrono",
3099
3100
  "libc",
@@ -3104,8 +3105,8 @@ dependencies = [
3104
3105
 
3105
3106
  [[package]]
3106
3107
  name = "microsandbox-migration"
3107
- version = "0.6.1"
3108
- source = "git+https://github.com/superradcompany/microsandbox?tag=v0.6.1#868ac5a8f04fadca357b377537e7a5740a856509"
3108
+ version = "0.6.2"
3109
+ source = "git+https://github.com/superradcompany/microsandbox?tag=v0.6.2#e9043c89d3432a548908bb145581be4fa1e2e3d9"
3109
3110
  dependencies = [
3110
3111
  "sea-orm-migration",
3111
3112
  "serde_json",
@@ -3113,8 +3114,8 @@ dependencies = [
3113
3114
 
3114
3115
  [[package]]
3115
3116
  name = "microsandbox-network"
3116
- version = "0.6.1"
3117
- source = "git+https://github.com/superradcompany/microsandbox?tag=v0.6.1#868ac5a8f04fadca357b377537e7a5740a856509"
3117
+ version = "0.6.2"
3118
+ source = "git+https://github.com/superradcompany/microsandbox?tag=v0.6.2#e9043c89d3432a548908bb145581be4fa1e2e3d9"
3118
3119
  dependencies = [
3119
3120
  "base64",
3120
3121
  "bytes",
@@ -3155,8 +3156,8 @@ dependencies = [
3155
3156
 
3156
3157
  [[package]]
3157
3158
  name = "microsandbox-protocol"
3158
- version = "0.6.1"
3159
- source = "git+https://github.com/superradcompany/microsandbox?tag=v0.6.1#868ac5a8f04fadca357b377537e7a5740a856509"
3159
+ version = "0.6.2"
3160
+ source = "git+https://github.com/superradcompany/microsandbox?tag=v0.6.2#e9043c89d3432a548908bb145581be4fa1e2e3d9"
3160
3161
  dependencies = [
3161
3162
  "chrono",
3162
3163
  "ciborium",
@@ -3170,8 +3171,8 @@ dependencies = [
3170
3171
 
3171
3172
  [[package]]
3172
3173
  name = "microsandbox-runtime"
3173
- version = "0.6.1"
3174
- source = "git+https://github.com/superradcompany/microsandbox?tag=v0.6.1#868ac5a8f04fadca357b377537e7a5740a856509"
3174
+ version = "0.6.2"
3175
+ source = "git+https://github.com/superradcompany/microsandbox?tag=v0.6.2#e9043c89d3432a548908bb145581be4fa1e2e3d9"
3175
3176
  dependencies = [
3176
3177
  "bytes",
3177
3178
  "chrono",
@@ -3201,8 +3202,8 @@ dependencies = [
3201
3202
 
3202
3203
  [[package]]
3203
3204
  name = "microsandbox-types"
3204
- version = "0.6.1"
3205
- source = "git+https://github.com/superradcompany/microsandbox?tag=v0.6.1#868ac5a8f04fadca357b377537e7a5740a856509"
3205
+ version = "0.6.2"
3206
+ source = "git+https://github.com/superradcompany/microsandbox?tag=v0.6.2#e9043c89d3432a548908bb145581be4fa1e2e3d9"
3206
3207
  dependencies = [
3207
3208
  "chrono",
3208
3209
  "serde",
@@ -3213,8 +3214,8 @@ dependencies = [
3213
3214
 
3214
3215
  [[package]]
3215
3216
  name = "microsandbox-utils"
3216
- version = "0.6.1"
3217
- source = "git+https://github.com/superradcompany/microsandbox?tag=v0.6.1#868ac5a8f04fadca357b377537e7a5740a856509"
3217
+ version = "0.6.2"
3218
+ source = "git+https://github.com/superradcompany/microsandbox?tag=v0.6.2#e9043c89d3432a548908bb145581be4fa1e2e3d9"
3218
3219
  dependencies = [
3219
3220
  "dirs",
3220
3221
  "libc",
@@ -3226,7 +3227,7 @@ dependencies = [
3226
3227
 
3227
3228
  [[package]]
3228
3229
  name = "microsandbox_rb"
3229
- version = "0.9.0"
3230
+ version = "0.9.1"
3230
3231
  dependencies = [
3231
3232
  "chrono",
3232
3233
  "futures",
@@ -3300,9 +3301,9 @@ dependencies = [
3300
3301
 
3301
3302
  [[package]]
3302
3303
  name = "msb-imago"
3303
- version = "0.1.0"
3304
+ version = "0.1.1"
3304
3305
  source = "registry+https://github.com/rust-lang/crates.io-index"
3305
- checksum = "16db000f7280d4c8a78b8b95f64a41006d447fd116ecd69d984d93774cb85d09"
3306
+ checksum = "c3077f41d73d78575dd706fcb626778eea7942ab2f1402ec040a4e11badc5dfa"
3306
3307
  dependencies = [
3307
3308
  "async-trait",
3308
3309
  "bincode",
@@ -4760,7 +4761,7 @@ dependencies = [
4760
4761
  "errno",
4761
4762
  "libc",
4762
4763
  "linux-raw-sys",
4763
- "windows-sys 0.61.2",
4764
+ "windows-sys 0.52.0",
4764
4765
  ]
4765
4766
 
4766
4767
  [[package]]
@@ -4828,7 +4829,7 @@ dependencies = [
4828
4829
  "security-framework 3.7.0",
4829
4830
  "security-framework-sys",
4830
4831
  "webpki-root-certs",
4831
- "windows-sys 0.61.2",
4832
+ "windows-sys 0.52.0",
4832
4833
  ]
4833
4834
 
4834
4835
  [[package]]
@@ -4849,7 +4850,7 @@ dependencies = [
4849
4850
  "security-framework 3.7.0",
4850
4851
  "security-framework-sys",
4851
4852
  "webpki-root-certs",
4852
- "windows-sys 0.61.2",
4853
+ "windows-sys 0.52.0",
4853
4854
  ]
4854
4855
 
4855
4856
  [[package]]
@@ -5429,7 +5430,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
5429
5430
  checksum = "52d1cfed4120b4d927bf7c0f86d2087a4a7d6027c906d9f9d525a80573b9be51"
5430
5431
  dependencies = [
5431
5432
  "libc",
5432
- "windows-sys 0.61.2",
5433
+ "windows-sys 0.60.2",
5433
5434
  ]
5434
5435
 
5435
5436
  [[package]]
@@ -5869,7 +5870,7 @@ dependencies = [
5869
5870
  "getrandom 0.4.2",
5870
5871
  "once_cell",
5871
5872
  "rustix",
5872
- "windows-sys 0.61.2",
5873
+ "windows-sys 0.52.0",
5873
5874
  ]
5874
5875
 
5875
5876
  [[package]]
@@ -6229,7 +6230,7 @@ checksum = "f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e"
6229
6230
  dependencies = [
6230
6231
  "memoffset",
6231
6232
  "tempfile",
6232
- "windows-sys 0.61.2",
6233
+ "windows-sys 0.60.2",
6233
6234
  ]
6234
6235
 
6235
6236
  [[package]]
@@ -6655,7 +6656,7 @@ version = "0.1.11"
6655
6656
  source = "registry+https://github.com/rust-lang/crates.io-index"
6656
6657
  checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22"
6657
6658
  dependencies = [
6658
- "windows-sys 0.61.2",
6659
+ "windows-sys 0.48.0",
6659
6660
  ]
6660
6661
 
6661
6662
  [[package]]
@@ -7418,6 +7419,12 @@ dependencies = [
7418
7419
  "syn",
7419
7420
  ]
7420
7421
 
7422
+ [[package]]
7423
+ name = "zlib-rs"
7424
+ version = "0.6.5"
7425
+ source = "registry+https://github.com/rust-lang/crates.io-index"
7426
+ checksum = "5431d5661c32445236631278f27946e444ddafe4684cac70b185272d4f9c52d5"
7427
+
7421
7428
  [[package]]
7422
7429
  name = "zmij"
7423
7430
  version = "1.0.21"
data/DESIGN.md CHANGED
@@ -106,7 +106,7 @@ out (air-gapped hosts that provision out of band). libkrunfw is `dlopen`'d by
106
106
 
107
107
  `ext/microsandbox/Cargo.toml` depends on the core crate via a **pinned git tag**
108
108
  (`microsandbox` / `microsandbox-network`, pinned to the same tag as
109
- `Microsandbox::RUNTIME_VERSION` — currently `v0.6.1`), so the gem builds anywhere
109
+ `Microsandbox::RUNTIME_VERSION` — currently `v0.6.2`), so the gem builds anywhere
110
110
  — CI, `rake-compiler-dock` release containers, and end-user source installs —
111
111
  without an adjacent checkout. For fast local development against a sibling
112
112
  microsandbox checkout, copy `.cargo/config.toml.example` to `.cargo/config.toml`
@@ -211,7 +211,7 @@ create options, full mount options (tmpfs/disk + stat-virtualization/
211
211
  host-permissions), and snapshot inspection (`open`/`list_dir`/`reindex`).
212
212
 
213
213
  A few **secondary** upstream knobs remain unexposed (a genuine binding gap, not
214
- upstream-gated — they exist at the pinned `v0.6.1` runtime): per-published-port host
214
+ upstream-gated — they exist at the pinned `v0.6.2` runtime): per-published-port host
215
215
  **bind address** (ports always bind loopback), network **interface overrides**,
216
216
  and inline **named-volume create-mode** (pre-create with `Volume.create`, then
217
217
  mount with `{ named: }`). These slot in module-by-module exactly as the existing
data/README.md CHANGED
@@ -215,7 +215,7 @@ end
215
215
 
216
216
  ```ruby
217
217
  Microsandbox::Sandbox.create("obs", image: "public.ecr.aws/docker/library/alpine:latest") do |sb|
218
- # On the v0.6.1 runtime the metrics slot goes live a beat after create returns,
218
+ # On v0.6.x runtimes the metrics slot goes live a beat after create returns,
219
219
  # so `metrics` can briefly raise "no live metrics slot" right after boot —
220
220
  # retry for a few hundred ms rather than treating the first failure as fatal.
221
221
  m = sb.metrics # => Microsandbox::Metrics
@@ -394,7 +394,7 @@ of the embedded runtime version. To learn which runtime a build wraps, ask it:
394
394
 
395
395
  ```ruby
396
396
  Microsandbox::VERSION # => "0.9.0" (the gem's own version)
397
- Microsandbox.runtime_version # => "v0.6.1" (the embedded upstream runtime tag)
397
+ Microsandbox.runtime_version # => "v0.6.2" (the embedded upstream runtime tag)
398
398
  ```
399
399
 
400
400
  | Gem version | Upstream runtime | Notes |
@@ -411,6 +411,7 @@ Microsandbox.runtime_version # => "v0.6.1" (the embedded upstream runtime tag
411
411
  | `0.8.1` | `v0.5.10` | gem-only: re-provision a stale local runtime; per-bind-mount `quota_mib:` override |
412
412
  | `0.8.2` | `v0.5.10` | gem-only: redact secrets from errors, typed snapshot errors, panic-free durations, fat-gem loader + `extconf` preflight fixes, threading/streaming docs |
413
413
  | `0.9.0` | `v0.6.1` | adopts upstream `v0.6.0`+`v0.6.1` (zombie-runtime wait fix, secret substitution through CONNECT proxies, stale-sandbox cleanup); upstream public API is additive — no Ruby surface change |
414
+ | `0.9.1` | `v0.6.2` | adopts upstream `v0.6.2` (faster image loads/pulls via early cache gate + zlib-rs); upstream API unchanged — no Ruby surface change |
414
415
 
415
416
  **Going forward** — the gem version moves on its own semver track and no longer
416
417
  mirrors the upstream tag:
@@ -6,8 +6,8 @@ name = "microsandbox_rb"
6
6
  description = "Ruby SDK native extension for microsandbox — secure, fast microVM-based sandboxing."
7
7
  # Must equal Microsandbox::VERSION (lib/microsandbox/version.rb) — Native.version
8
8
  # returns this via env!("CARGO_PKG_VERSION") and version_spec.rb asserts equality.
9
- # The core-crate dependency below stays pinned at its own tag (v0.6.1).
10
- version = "0.9.0"
9
+ # The core-crate dependency below stays pinned at its own tag (v0.6.2).
10
+ version = "0.9.1"
11
11
  authors = ["Super Rad Company <development@superrad.company>"]
12
12
  repository = "https://github.com/superradcompany/microsandbox"
13
13
  license = "Apache-2.0"
@@ -35,8 +35,8 @@ rb-sys = "0.9"
35
35
  # `.cargo/config.toml.example`). "ssh" matches the feature set the Python/Node
36
36
  # SDKs ship with; default features add "prebuilt" (provisions msb + libkrunfw at
37
37
  # build time), "net", and "keyring".
38
- microsandbox = { git = "https://github.com/superradcompany/microsandbox", tag = "v0.6.1", default-features = true, features = ["ssh"] }
39
- microsandbox-network = { git = "https://github.com/superradcompany/microsandbox", tag = "v0.6.1" }
38
+ microsandbox = { git = "https://github.com/superradcompany/microsandbox", tag = "v0.6.2", default-features = true, features = ["ssh"] }
39
+ microsandbox-network = { git = "https://github.com/superradcompany/microsandbox", tag = "v0.6.2" }
40
40
 
41
41
  # Async core bridged to Ruby's synchronous API via a blocking tokio runtime.
42
42
  tokio = { version = "1", features = ["rt-multi-thread", "sync", "time"] }
@@ -931,7 +931,7 @@ module Microsandbox
931
931
  #
932
932
  # Raises a {Microsandbox::Error} ("sandbox N has no live metrics slot") when
933
933
  # called in the brief window right after {Sandbox.create} returns, before the
934
- # runtime has registered the sandbox's metrics slot. On the `v0.6.1` runtime
934
+ # runtime has registered the sandbox's metrics slot. On `v0.6.x` runtimes
935
935
  # the spawn handshake no longer blocks create until the first sample is
936
936
  # written, so the slot goes live a beat *after* boot (within a few hundred
937
937
  # milliseconds); retry for that window rather than treating the first failure
@@ -8,12 +8,12 @@ module Microsandbox
8
8
  # Versioning section of the README for the full gem-to-runtime map. Must equal
9
9
  # the native ext's Cargo crate version (`Native.version`), enforced by
10
10
  # spec/unit/version_spec.rb.
11
- VERSION = "0.9.0"
11
+ VERSION = "0.9.1"
12
12
 
13
13
  # The upstream microsandbox runtime release this gem build embeds — the `tag`
14
14
  # pinned on the `microsandbox`/`microsandbox-network` git deps in
15
15
  # ext/microsandbox/Cargo.toml. Exposed at runtime as
16
16
  # {Microsandbox.runtime_version}. spec/unit/version_spec.rb asserts it stays in
17
17
  # sync with the Cargo tag so it can't silently drift out of date.
18
- RUNTIME_VERSION = "v0.6.1"
18
+ RUNTIME_VERSION = "v0.6.2"
19
19
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: microsandbox-rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 0.9.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - ya-luotao