Commit 28239b7
authored








## <img
src="https://mojiemoji.jozo.beer/emoji/%E6%A6%82%E8%A6%81?font=toge&color=f43f5e&animation=kage_neon&background=transparent&outline=5ef43f&outline_width=2"
alt="概要" height="20" align="absmiddle">
長時間稼働した daemon で歌詞が<img
src="https://mojiemoji.jozo.beer/emoji/%E8%A1%A8%E7%A4%BA?font=gothic&color=a855f7&animation=bure&background=transparent&outline=f7a855&outline_width=2"
alt="表示" height="20" align="absmiddle">されなくなり `lyra restart` でのみ復旧する<img
src="https://mojiemoji.jozo.beer/emoji/%E3%83%90%E3%82%B0?font=gothic-bold&color=ef4444&animation=gatagata&speed=slow&background=transparent&outline=44ef44&outline_width=2"
alt="バグ" height="24" align="absmiddle">の<img
src="https://mojiemoji.jozo.beer/emoji/%E4%BF%AE%E6%AD%A3?font=gothic-bold&color=ef4444&animation=kirari&background=transparent&outline=44ef44&outline_width=2"
alt="修正" height="20" align="absmiddle">。プロセス寿命の `URLSession.shared`
を引き回すのをやめ、<img
src="https://mojiemoji.jozo.beer/emoji/API?font=mincho&color=10b981&animation=patapata&background=transparent&outline=8110b9&outline_width=2"
alt="API" height="20" align="absmiddle"> 呼び出し毎に ephemeral セッションを<img
src="https://mojiemoji.jozo.beer/emoji/%E7%94%9F%E6%88%90?font=maru&color=facc15&animation=tate_scroll&background=transparent&outline=04ca8a&outline_width=2"
alt="生成" height="20" align="absmiddle">する。
Closes #318
## <img
src="https://mojiemoji.jozo.beer/emoji/%E5%A4%89%E6%9B%B4?font=gothic&color=22d3ee&animation=tate_scroll&background=transparent&outline=b20891&outline_width=2"
alt="変更" height="20" align="absmiddle"><img
src="https://mojiemoji.jozo.beer/emoji/%E5%86%85%E5%AE%B9?font=gothic&color=fdba74&animation=kira&background=transparent&outline_width=0"
alt="内容" height="20" align="absmiddle">
- `LyricsDataSourceImpl` / `MusicBrainzMetadataDataSourceImpl`:
`apiFactory` 化し、呼び出し毎に `URLSessionConfiguration.ephemeral` + request
timeout 10 秒のセッションを<img
src="https://mojiemoji.jozo.beer/emoji/%E7%94%9F%E6%88%90?font=maru&color=facc15&animation=tate_scroll&background=transparent&outline=04ca8a&outline_width=2"
alt="生成" height="20" align="absmiddle">(`LRCLibHealthCheck` と<img
src="https://mojiemoji.jozo.beer/emoji/%E5%90%8C%E3%81%98?font=dela&color=60a5fa&animation=mochimochi&background=transparent&outline=fa60a5&outline_width=2"
alt="同じ" height="20" align="absmiddle"><img
src="https://mojiemoji.jozo.beer/emoji/%E6%A7%8B%E6%88%90?font=zero&color=a855f7&animation=kage_bokashi&background=transparent&outline=f7a855&outline_width=2"
alt="構成" height="20" align="absmiddle">)。`init(api:)` の<img
src="https://mojiemoji.jozo.beer/emoji/%E3%83%86%E3%82%B9%E3%83%88?font=maru-bold&color=fbbf24&animation=yokomoya&background=transparent&outline=06d977&outline_width=2"
alt="テスト" height="20" align="absmiddle">シームは<img
src="https://mojiemoji.jozo.beer/emoji/%E7%B6%AD%E6%8C%81?font=maru-bold&color=60a5fa&animation=yurayura&speed=slow&background=transparent&outline=fa60a5&outline_width=2"
alt="維持" height="24" align="absmiddle">
- `OpenAICompatibleAPI.provider(for:)`: <img
src="https://mojiemoji.jozo.beer/emoji/%E5%90%8C%E6%A7%98%E3%81%AB?font=maru&color=a78bfa&animation=neruneru&speed=slow&background=transparent&outline=faa78b&outline_width=2"
alt="同様に" height="24" align="absmiddle"> ephemeral セッション化。タイムアウトは従来の
`URLSession.shared` デフォルトと同値の 60 秒を明示(ローカル LLM の長い推論を<img
src="https://mojiemoji.jozo.beer/emoji/%E8%80%83%E6%85%AE?font=mincho&color=fbbf24&animation=patapata&speed=slow&background=transparent&outline=24fbbf&outline_width=2"
alt="考慮" height="24" align="absmiddle">)
- `try?` によるエラー握りつぶしを<img
src="https://mojiemoji.jozo.beer/emoji/%E5%BB%83%E6%AD%A2?font=gothic-bold&color=fb923c&animation=zanzo&speed=slow&background=transparent&outline=3cfb92&outline_width=2"
alt="廃止" height="24" align="absmiddle">し、取得<img
src="https://mojiemoji.jozo.beer/emoji/%E5%A4%B1%E6%95%97?font=hachimaru&color=f472b6&animation=mozaiku&background=transparent&outline=b6f472&outline_width=2"
alt="失敗" height="20" align="absmiddle">を stderr に<img
src="https://mojiemoji.jozo.beer/emoji/%E3%83%AD%E3%82%B0?font=maru-bold&color=10b981&animation=tatemoya&background=transparent&outline=8110b9&outline_width=2"
alt="ログ" height="20" align="absmiddle"><img
src="https://mojiemoji.jozo.beer/emoji/%E5%87%BA%E5%8A%9B?font=gothic-bold&color=fb7185&animation=yokomoya&background=transparent&outline=85fb71&outline_width=2"
alt="出力" height="20" align="absmiddle">。LRCLIB の 404(歌詞なしの<img
src="https://mojiemoji.jozo.beer/emoji/%E6%AD%A3%E5%B8%B8?font=gothic&color=34d399&animation=zanzo&background=transparent&outline=9934d3&outline_width=2"
alt="正常" height="20" align="absmiddle"><img
src="https://mojiemoji.jozo.beer/emoji/%E5%BF%9C%E7%AD%94?font=gothic-bold&color=c084fc&animation=ekken&background=transparent&outline=fcc084&outline_width=2"
alt="応答" height="20" align="absmiddle">)のみ<img
src="https://mojiemoji.jozo.beer/emoji/%E3%83%AD%E3%82%B0?font=akzk&color=60a5fa&animation=bure&background=transparent&outline=fa60a5&outline_width=2"
alt="ログ" height="20" align="absmiddle"><img
src="https://mojiemoji.jozo.beer/emoji/%E5%AF%BE%E8%B1%A1?font=akzk&color=facc15&animation=disco&background=transparent&outline_width=0"
alt="対象" height="20" align="absmiddle">外とし、「歌詞なし」と「取得<img
src="https://mojiemoji.jozo.beer/emoji/%E5%A4%B1%E6%95%97?font=maru-bold&color=3b82f6&animation=yokomoya&background=transparent&outline=f63b82&outline_width=2"
alt="失敗" height="20" align="absmiddle">」を<img
src="https://mojiemoji.jozo.beer/emoji/%E5%8C%BA%E5%88%A5?font=maru-bold&color=34d399&animation=kirari&speed=slow&background=transparent&outline=9934d3&outline_width=2"
alt="区別" height="24" align="absmiddle"><img
src="https://mojiemoji.jozo.beer/emoji/%E5%8F%AF%E8%83%BD?font=kurobara&color=a78bfa&animation=kira&background=transparent&outline_width=0"
alt="可能" height="20" align="absmiddle">に
- <img
src="https://mojiemoji.jozo.beer/emoji/%E3%83%86%E3%82%B9%E3%83%88?font=zero&color=a78bfa&animation=chirichiri&background=transparent&outline=ed7c3a&outline_width=2"
alt="テスト" height="20" align="absmiddle">: 404 サイレント分岐の<img
src="https://mojiemoji.jozo.beer/emoji/%E3%83%86%E3%82%B9%E3%83%88?font=maru-bold&color=fbbf24&animation=yokomoya&background=transparent&outline=06d977&outline_width=2"
alt="テスト" height="20" align="absmiddle">を<img
src="https://mojiemoji.jozo.beer/emoji/%E8%BF%BD%E5%8A%A0?font=pixel&color=22d3ee&animation=yatta&speed=normal&background=transparent&outline=ee22d3&outline_width=2"
alt="追加" height="24" align="absmiddle">。LLM のプロダクション配線<img
src="https://mojiemoji.jozo.beer/emoji/%E3%83%86%E3%82%B9%E3%83%88?font=zero&color=a78bfa&animation=chirichiri&background=transparent&outline=ed7c3a&outline_width=2"
alt="テスト" height="20" align="absmiddle">は、ephemeral セッションがグローバル
`URLProtocol.registerClass` を経由しなくなったため、refused port
(`http://127.0.0.1:1`) での graceful degradation <img
src="https://mojiemoji.jozo.beer/emoji/%E6%A4%9C%E8%A8%BC?font=gothic&color=22c55e&animation=nami&background=transparent&outline=5e22c5&outline_width=2"
alt="検証" height="20" align="absmiddle">に<img
src="https://mojiemoji.jozo.beer/emoji/%E5%A4%89%E6%9B%B4?font=pixel&color=c084fc&animation=disco&background=transparent&outline_width=0"
alt="変更" height="20"
align="absmiddle">(`OpenAICompatibleHealthCheckDefaultBackendTests`
の<img
src="https://mojiemoji.jozo.beer/emoji/%E6%97%A2%E5%AD%98?font=maru-bold&color=c084fc&animation=ekken&background=transparent&outline=fcc084&outline_width=2"
alt="既存" height="20" align="absmiddle">パターンを<img
src="https://mojiemoji.jozo.beer/emoji/%E8%B8%8F%E8%A5%B2?font=mincho&color=c084fc&animation=tatemoya&speed=slow&background=transparent&outline=fcc084&outline_width=2"
alt="踏襲" height="24" align="absmiddle">)
- CLAUDE.md: Key Design Decisions に「Network session strategy」を<img
src="https://mojiemoji.jozo.beer/emoji/%E8%BF%BD%E8%A8%98?font=gothic-bold&color=67e8f9&animation=ekken&speed=slow&background=transparent&outline=f967e8&outline_width=2"
alt="追記" height="24" align="absmiddle">
- version 2.21.0 → 2.21.1
## 背景・<img
src="https://mojiemoji.jozo.beer/emoji/%E5%8B%95%E6%A9%9F?font=tamanegi&color=3b82f6&animation=ekken&background=transparent&outline=f63b82&outline_width=2"
alt="動機" height="20" align="absmiddle">
症状は「<img
src="https://mojiemoji.jozo.beer/emoji/%E5%90%8C%E3%81%98?font=mincho&color=a78bfa&animation=yatta&background=transparent&outline=ed7c3a&outline_width=2"
alt="同じ" height="20" align="absmiddle">メタデータなのに再起動<img
src="https://mojiemoji.jozo.beer/emoji/%E7%9B%B4%E5%BE%8C?font=gothic-bold&color=f472b6&animation=shuchusen&background=transparent&outline=77db27&outline_width=2"
alt="直後" height="20"
align="absmiddle">だけ歌詞がヒットする」=プロセス内に時間経過で腐る状態がある、を示唆していた。<img
src="https://mojiemoji.jozo.beer/emoji/%E8%AA%BF%E6%9F%BB?font=chikara&color=f43f5e&animation=bane&background=transparent&outline=5ef43f&outline_width=2"
alt="調査" height="20" align="absmiddle">の<img
src="https://mojiemoji.jozo.beer/emoji/%E7%B5%90%E6%9E%9C?font=zero&color=c084fc&animation=mozaiku&background=transparent&outline=fcc084&outline_width=2"
alt="結果" height="20" align="absmiddle">、LRCLIB 呼び出しが `static let
liveValue` シングルトン + `URLSession.shared` + `try?` 全握りつぶしという<img
src="https://mojiemoji.jozo.beer/emoji/%E6%A7%8B%E6%88%90?font=kurobara&color=34d399&animation=tatemoya&background=transparent&outline=9934d3&outline_width=2"
alt="構成" height="20" align="absmiddle">で、スリープ復帰やネットワーク<img
src="https://mojiemoji.jozo.beer/emoji/%E5%88%87%E6%9B%BF?font=hachimaru&color=fb923c&animation=mabataki&background=transparent&outline=0cea58&outline_width=2"
alt="切替" height="20" align="absmiddle">でコネクションプールが死んでも<img
src="https://mojiemoji.jozo.beer/emoji/%E6%A4%9C%E7%9F%A5?font=pixel&color=ef4444&animation=bure&background=transparent&outline=44ef44&outline_width=2"
alt="検知" height="20" align="absmiddle">も張り替えも<img
src="https://mojiemoji.jozo.beer/emoji/%E3%83%AD%E3%82%B0?font=dela&color=facc15&animation=mabataki&background=transparent&outline=04ca8a&outline_width=2"
alt="ログ" height="20" align="absmiddle">もされないことが<img
src="https://mojiemoji.jozo.beer/emoji/%E5%88%A4%E6%98%8E?font=mincho&color=fde047&animation=mabataki&speed=slow&background=transparent&outline=47fde0&outline_width=2"
alt="判明" height="24" align="absmiddle">(<img
src="https://mojiemoji.jozo.beer/emoji/%E8%A9%B3%E7%B4%B0?font=chikara&color=a855f7&animation=kira&background=transparent&outline_width=0"
alt="詳細" height="20" align="absmiddle">は #318 の仮説 1)。ヘルスチェック
(`LRCLibHealthCheck`) だけが ephemeral + 10 秒タイムアウトの<img
src="https://mojiemoji.jozo.beer/emoji/%E5%A0%85%E7%89%A2?font=gothic-bold&color=f9a8d4&animation=zairu&speed=slow&background=transparent&outline=d4f9a8&outline_width=2"
alt="堅牢" height="24" align="absmiddle">な<img
src="https://mojiemoji.jozo.beer/emoji/%E6%A7%8B%E6%88%90?font=kurobara&color=34d399&animation=tatemoya&background=transparent&outline=9934d3&outline_width=2"
alt="構成" height="20" align="absmiddle">だったため、本番経路をこれに揃えた。
## <img
src="https://mojiemoji.jozo.beer/emoji/%E3%83%86%E3%82%B9%E3%83%88?font=zero&color=a78bfa&animation=chirichiri&background=transparent&outline=ed7c3a&outline_width=2"
alt="テスト" height="20" align="absmiddle">計画
- [x] `swift test` 全 1205 <img
src="https://mojiemoji.jozo.beer/emoji/%E3%83%86%E3%82%B9%E3%83%88?font=hachimaru&color=f43f5e&animation=yoko_scroll&background=transparent&outline=5ef43f&outline_width=2"
alt="テスト" height="20" align="absmiddle"> pass
- [x] `make lint` クリーン
- [ ] 実機で daemon を長時間稼働させ、スリープ復帰・ネットワーク<img
src="https://mojiemoji.jozo.beer/emoji/%E5%88%87%E6%9B%BF?font=tamanegi&color=f87171&animation=patapata&background=transparent&outline=26dc26&outline_width=2"
alt="切替" height="20" align="absmiddle">後も歌詞が取得され続けることを<img
src="https://mojiemoji.jozo.beer/emoji/%E7%A2%BA%E8%AA%8D?font=gothic-bold&color=d946ef&animation=zairu&background=transparent&outline=efd946&outline_width=2"
alt="確認" height="20" align="absmiddle">(<img
src="https://mojiemoji.jozo.beer/emoji/%E7%99%BA%E7%94%9F?font=mincho&color=ec4899&animation=gatagata&background=transparent&outline=99ec48&outline_width=2"
alt="発生" height="20" align="absmiddle">条件が長時間のため、リリース<img
src="https://mojiemoji.jozo.beer/emoji/%E5%BE%8C?font=chikara&color=10b981&animation=mozaiku&background=transparent&outline=8110b9&outline_width=2"
alt="後" height="20" align="absmiddle">の<img
src="https://mojiemoji.jozo.beer/emoji/%E7%B5%8C%E9%81%8E?font=maru-bold&color=93c5fd&animation=yoko_scroll&speed=slow&background=transparent&outline=fd93c5&outline_width=2"
alt="経過" height="24" align="absmiddle"><img
src="https://mojiemoji.jozo.beer/emoji/%E8%A6%B3%E5%AF%9F?font=maru&color=86efac&animation=chirichiri&speed=slow&background=transparent&outline=ac86ef&outline_width=2"
alt="観察" height="24" align="absmiddle">)
## 備考
- 呼び出し毎のセッション<img
src="https://mojiemoji.jozo.beer/emoji/%E7%94%9F%E6%88%90?font=dela&color=fb923c&animation=ekken&background=transparent&outline=0cea58&outline_width=2"
alt="生成" height="20" align="absmiddle">は TLS
ハンドシェイクが毎回走るが、歌詞・メタデータ取得はトラック変化毎の低頻度なので<img
src="https://mojiemoji.jozo.beer/emoji/%E5%AE%9F%E5%AE%B3?font=mincho&color=f87171&animation=tenmetsu&speed=slow&background=transparent&outline=71f871&outline_width=2"
alt="実害" height="24" align="absmiddle">はない
- ネガティブキャッシュや `NWPathMonitor` 契機のセッション再<img
src="https://mojiemoji.jozo.beer/emoji/%E7%94%9F%E6%88%90?font=maru&color=facc15&animation=tate_scroll&background=transparent&outline=04ca8a&outline_width=2"
alt="生成" height="20" align="absmiddle">(#318 <img
src="https://mojiemoji.jozo.beer/emoji/%E5%AF%BE%E5%BF%9C?font=maru&color=fdba74&animation=chirichiri&background=transparent&outline=74fdba&outline_width=2"
alt="対応" height="20" align="absmiddle">案の残り)は、本<img
src="https://mojiemoji.jozo.beer/emoji/%E4%BF%AE%E6%AD%A3?font=gothic-bold&color=ef4444&animation=kirari&background=transparent&outline=44ef44&outline_width=2"
alt="修正" height="20" align="absmiddle">で症状が解消するかの経過観察後に<img
src="https://mojiemoji.jozo.beer/emoji/%E5%BF%85%E8%A6%81?font=chikara&color=facc15&animation=tate_scroll&background=transparent&outline=04ca8a&outline_width=2"
alt="必要" height="20" align="absmiddle">なら別 issue で<img
src="https://mojiemoji.jozo.beer/emoji/%E5%AF%BE%E5%BF%9C?font=zero&color=a78bfa&animation=yatta&background=transparent&outline=ed7c3a&outline_width=2"
alt="対応" height="20" align="absmiddle">する
11 files changed
Lines changed: 216 additions & 45 deletions
File tree
- .claude
- Sources
- LyricsDataSource
- MetadataDataSource
- API
- ScopedAPISession
- VersionHandler/Resources
- Tests
- LyricsDataSourceTests
- MetadataDataSourceTests
- ScopedAPISessionTests
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
349 | 349 | | |
350 | 350 | | |
351 | 351 | | |
| 352 | + | |
| 353 | + | |
352 | 354 | | |
353 | 355 | | |
354 | 356 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
380 | 380 | | |
381 | 381 | | |
382 | 382 | | |
| 383 | + | |
383 | 384 | | |
384 | 385 | | |
385 | 386 | | |
386 | 387 | | |
| 388 | + | |
387 | 389 | | |
388 | 390 | | |
389 | 391 | | |
390 | 392 | | |
391 | 393 | | |
392 | 394 | | |
393 | 395 | | |
| 396 | + | |
394 | 397 | | |
395 | 398 | | |
396 | 399 | | |
| |||
447 | 450 | | |
448 | 451 | | |
449 | 452 | | |
| 453 | + | |
| 454 | + | |
| 455 | + | |
| 456 | + | |
| 457 | + | |
| 458 | + | |
450 | 459 | | |
451 | 460 | | |
452 | 461 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
| 3 | + | |
| 4 | + | |
4 | 5 | | |
5 | 6 | | |
6 | | - | |
| 7 | + | |
7 | 8 | | |
8 | 9 | | |
9 | | - | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
10 | 15 | | |
11 | 16 | | |
12 | 17 | | |
13 | | - | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
14 | 23 | | |
15 | 24 | | |
16 | 25 | | |
17 | | - | |
18 | | - | |
| 26 | + | |
19 | 27 | | |
20 | 28 | | |
21 | 29 | | |
22 | | - | |
23 | | - | |
24 | | - | |
25 | | - | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
26 | 40 | | |
27 | 41 | | |
28 | 42 | | |
29 | | - | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
30 | 59 | | |
31 | 60 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
10 | 10 | | |
11 | 11 | | |
12 | 12 | | |
13 | | - | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
14 | 18 | | |
15 | 19 | | |
16 | 20 | | |
17 | 21 | | |
18 | | - | |
| 22 | + | |
19 | 23 | | |
20 | 24 | | |
21 | 25 | | |
| |||
Lines changed: 18 additions & 7 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2 | 2 | | |
3 | 3 | | |
4 | 4 | | |
| 5 | + | |
5 | 6 | | |
6 | 7 | | |
7 | 8 | | |
8 | | - | |
| 9 | + | |
9 | 10 | | |
10 | 11 | | |
11 | | - | |
12 | | - | |
13 | | - | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
14 | 17 | | |
15 | 18 | | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
16 | 22 | | |
17 | | - | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
18 | 30 | | |
19 | 31 | | |
20 | 32 | | |
| |||
32 | 44 | | |
33 | 45 | | |
34 | 46 | | |
35 | | - | |
36 | 47 | | |
37 | 48 | | |
38 | 49 | | |
39 | 50 | | |
40 | 51 | | |
41 | | - | |
| 52 | + | |
42 | 53 | | |
43 | 54 | | |
44 | 55 | | |
| |||
Lines changed: 21 additions & 9 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | 3 | | |
| 4 | + | |
4 | 5 | | |
5 | 6 | | |
6 | | - | |
| 7 | + | |
7 | 8 | | |
8 | 9 | | |
9 | | - | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
10 | 15 | | |
11 | 16 | | |
12 | 17 | | |
13 | | - | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
14 | 23 | | |
15 | 24 | | |
16 | 25 | | |
17 | | - | |
18 | | - | |
| 26 | + | |
19 | 27 | | |
20 | 28 | | |
21 | 29 | | |
| |||
26 | 34 | | |
27 | 35 | | |
28 | 36 | | |
29 | | - | |
30 | | - | |
31 | | - | |
32 | | - | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
33 | 45 | | |
34 | 46 | | |
35 | 47 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | | - | |
| 1 | + | |
Lines changed: 22 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
| 3 | + | |
3 | 4 | | |
4 | 5 | | |
5 | 6 | | |
| |||
68 | 69 | | |
69 | 70 | | |
70 | 71 | | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
71 | 93 | | |
72 | 94 | | |
73 | 95 | | |
| |||
Lines changed: 9 additions & 15 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
19 | 19 | | |
20 | 20 | | |
21 | 21 | | |
22 | | - | |
| 22 | + | |
23 | 23 | | |
24 | 24 | | |
25 | 25 | | |
26 | | - | |
27 | | - | |
28 | | - | |
29 | | - | |
30 | | - | |
31 | | - | |
32 | | - | |
33 | | - | |
34 | | - | |
35 | | - | |
36 | | - | |
37 | | - | |
38 | | - | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
39 | 33 | | |
40 | 34 | | |
41 | 35 | | |
42 | 36 | | |
43 | 37 | | |
44 | 38 | | |
45 | | - | |
| 39 | + | |
46 | 40 | | |
47 | 41 | | |
48 | 42 | | |
| |||
0 commit comments