diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 0000000..752b17b --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,16 @@ +name: Tests +on: [push] +jobs: + build: + name: Integration tests + strategy: + matrix: + os: [ubuntu-latest, macos-latest] + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v4 + - uses: swift-actions/setup-swift@v2 + with: + swift-version: "5.10" + - name: Run tests + run: make test diff --git a/README.md b/README.md index 4e84beb..d2b1606 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,9 @@ ## ProgressLine -[![Latest Release](https://img.shields.io/badge/Platform-macOS-6464aa)](https://img.shields.io/badge/Platform-macOS-6464aa) -[![Latest Release](https://img.shields.io/badge/Platform-Linux-6464aa)](https://img.shields.io/badge/Platform-Linux-6464aa) +![](https://img.shields.io/badge/Platform-macOS-6464aa) +![](https://img.shields.io/badge/Platform-Linux-6464aa) [![Latest Release](https://img.shields.io/github/release/kattouf/ProgressLine.svg)](https://github.com/kattouf/ProgressLine/releases/latest) +![](https://github.com/kattouf/ProgressLine/actions/workflows/tests.yml/badge.svg?branch=main) Track commands progress in a compact one-line format. diff --git a/Sources/ActivityIndicator+CommandArgument.swift b/Sources/ActivityIndicator+CommandArgument.swift index 8999859..70633eb 100644 --- a/Sources/ActivityIndicator+CommandArgument.swift +++ b/Sources/ActivityIndicator+CommandArgument.swift @@ -17,12 +17,4 @@ extension ActivityIndicator { .snake } } - - #if DEBUG - static func test() -> ActivityIndicator { - .init( - configuration: .init(refreshRate: 1_000_000_000, states: [""]) - ) - } - #endif } diff --git a/Sources/ActivityIndicator.swift b/Sources/ActivityIndicator.swift index d5b6184..39c029a 100644 --- a/Sources/ActivityIndicator.swift +++ b/Sources/ActivityIndicator.swift @@ -77,3 +77,13 @@ extension ActivityIndicator { return ActivityIndicator(configuration: configuration) }() } + +#if DEBUG +extension ActivityIndicator { + static func disabled() -> ActivityIndicator { + .init( + configuration: .init(refreshRate: 1_000_000_000, states: []) + ) + } +} +#endif diff --git a/Sources/ProgressLine.swift b/Sources/ProgressLine.swift index 2896feb..ada6289 100644 --- a/Sources/ProgressLine.swift +++ b/Sources/ProgressLine.swift @@ -38,14 +38,16 @@ struct ProgressLine: AsyncParsableCommand { let logger = AboveProgressLineLogger(printers: printers) #if DEBUG - let activityIndicator: ActivityIndicator = testMode ? .test() : .make(style: activityIndicatorStyle) + let activityIndicator: ActivityIndicator = testMode ? .disabled() : .make(style: activityIndicatorStyle) #else + let testMode = false let activityIndicator: ActivityIndicator = .make(style: activityIndicatorStyle) #endif let progressLineController = await ProgressLineController.buildAndStart( printers: printers, logger: logger, - activityIndicator: activityIndicator + activityIndicator: activityIndicator, + mockActivityAndDuration: testMode ) let originalLogController = if let originalLogPath { await OriginalLogController(logger: logger, path: originalLogPath) diff --git a/Sources/ProgressLineController.swift b/Sources/ProgressLineController.swift index 0bf20a5..296607f 100644 --- a/Sources/ProgressLineController.swift +++ b/Sources/ProgressLineController.swift @@ -29,13 +29,15 @@ final actor ProgressLineController { static func buildAndStart( printers: PrintersHolder, logger: AboveProgressLineLogger, - activityIndicator: ActivityIndicator + activityIndicator: ActivityIndicator, + mockActivityAndDuration: Bool = false ) async -> Self { let progressTracker = ProgressTracker.start() let windowSizeObserver = WindowSizeObserver.startObserving() let progressLineFormatter = ProgressLineFormatter( activityIndicator: activityIndicator, - windowSizeObserver: windowSizeObserver + windowSizeObserver: windowSizeObserver, + mockActivityAndDuration: mockActivityAndDuration ) let controller = Self( diff --git a/Sources/ProgressLineFormatter.swift b/Sources/ProgressLineFormatter.swift index 3abb910..113f0f3 100644 --- a/Sources/ProgressLineFormatter.swift +++ b/Sources/ProgressLineFormatter.swift @@ -20,18 +20,21 @@ final class ProgressLineFormatter: Sendable { private let activityIndicator: ActivityIndicator private let windowSizeObserver: WindowSizeObserver? + private let mockActivityAndDuration: Bool init( activityIndicator: ActivityIndicator, - windowSizeObserver: WindowSizeObserver? + windowSizeObserver: WindowSizeObserver?, + mockActivityAndDuration: Bool ) { self.activityIndicator = activityIndicator self.windowSizeObserver = windowSizeObserver + self.mockActivityAndDuration = mockActivityAndDuration } func inProgress(progress: Progress) -> String { - let activityIndicator = activityIndicator.state(forDuration: progress.duration) - let formattedDuration = formatDuration(from: progress.duration) + let activityIndicator = mockActivityAndDuration ? "" : activityIndicator.state(forDuration: progress.duration) + let formattedDuration = mockActivityAndDuration ? "" : formatDuration(from: progress.duration) let styledActivityIndicator = ANSI.blue + activityIndicator + ANSI.reset let styledDuration = ANSI.bold + formattedDuration + ANSI.reset @@ -46,7 +49,7 @@ final class ProgressLineFormatter: Sendable { } func finished(progress: Progress?) -> String { - let formattedDuration = progress.map { formatDuration(from: $0.duration) } + let formattedDuration = mockActivityAndDuration ? "" : progress.map { formatDuration(from: $0.duration) } let styledActivityIndicator = ANSI.green + Symbol.checkmark + ANSI.reset let styledDuration = formattedDuration.map { ANSI.bold + $0 + ANSI.reset } diff --git a/snapshots/default.snapshot b/snapshots/default.snapshot index 68da960..524b91b 100644 --- a/snapshots/default.snapshot +++ b/snapshots/default.snapshot @@ -1,32 +1,32 @@ - 0s ❯ - 0s ❯ Chunk number: 1, Chunk Line: 3 - 0s ❯ Chunk number: 2, Chunk Line: 3 - 0s ❯ Chunk number: 3, Chunk Line: 3 - 0s ❯ Chunk number: 4, Chunk Line: 3 - 0s ❯ Chunk number: 5, Chunk Line: 3 - 0s ❯ Chunk number: 6, Chunk Line: 3 - 0s ❯ Chunk number: 7, Chunk Line: 3 - 0s ❯ Chunk number: 8, Chunk Line: 3 - 0s ❯ Chunk number: 9, Chunk Line: 3 - 0s ❯ Chunk number: 10, Chunk Line: 3 - 0s ❯ Chunk number: 11, Chunk Line: 3 - 0s ❯ Chunk number: 12, Chunk Line: 3 - 0s ❯ Chunk number: 13, Chunk Line: 3 - 0s ❯ Chunk number: 14, Chunk Line: 3 - 0s ❯ Chunk number: 15, Chunk Line: 3 - 0s ❯ Chunk number: 16, Chunk Line: 3 - 0s ❯ Chunk number: 17, Chunk Line: 3 - 0s ❯ Chunk number: 18, Chunk Line: 3 - 0s ❯ Chunk number: 19, Chunk Line: 3 - 0s ❯ Chunk number: 20, Chunk Line: 3 - 0s ❯ Chunk number: 21, Chunk Line: 3 - 0s ❯ Chunk number: 22, Chunk Line: 3 - 0s ❯ Chunk number: 23, Chunk Line: 3 - 0s ❯ Chunk number: 24, Chunk Line: 3 - 0s ❯ Chunk number: 25, Chunk Line: 3 - 0s ❯ Chunk number: 26, Chunk Line: 3 - 0s ❯ Chunk number: 27, Chunk Line: 3 - 0s ❯ Chunk number: 28, Chunk Line: 3 - 0s ❯ Chunk number: 29, Chunk Line: 3 - 0s ❯ Chunk number: 30, Chunk Line: 3 -✓ 0s ❯ Chunk number: 30, Chunk Line: 3 + ❯ + ❯ Chunk number: 1, Chunk Line: 3 + ❯ Chunk number: 2, Chunk Line: 3 + ❯ Chunk number: 3, Chunk Line: 3 + ❯ Chunk number: 4, Chunk Line: 3 + ❯ Chunk number: 5, Chunk Line: 3 + ❯ Chunk number: 6, Chunk Line: 3 + ❯ Chunk number: 7, Chunk Line: 3 + ❯ Chunk number: 8, Chunk Line: 3 + ❯ Chunk number: 9, Chunk Line: 3 + ❯ Chunk number: 10, Chunk Line: 3 + ❯ Chunk number: 11, Chunk Line: 3 + ❯ Chunk number: 12, Chunk Line: 3 + ❯ Chunk number: 13, Chunk Line: 3 + ❯ Chunk number: 14, Chunk Line: 3 + ❯ Chunk number: 15, Chunk Line: 3 + ❯ Chunk number: 16, Chunk Line: 3 + ❯ Chunk number: 17, Chunk Line: 3 + ❯ Chunk number: 18, Chunk Line: 3 + ❯ Chunk number: 19, Chunk Line: 3 + ❯ Chunk number: 20, Chunk Line: 3 + ❯ Chunk number: 21, Chunk Line: 3 + ❯ Chunk number: 22, Chunk Line: 3 + ❯ Chunk number: 23, Chunk Line: 3 + ❯ Chunk number: 24, Chunk Line: 3 + ❯ Chunk number: 25, Chunk Line: 3 + ❯ Chunk number: 26, Chunk Line: 3 + ❯ Chunk number: 27, Chunk Line: 3 + ❯ Chunk number: 28, Chunk Line: 3 + ❯ Chunk number: 29, Chunk Line: 3 + ❯ Chunk number: 30, Chunk Line: 3 +✓ ❯ Chunk number: 30, Chunk Line: 3 diff --git a/snapshots/default_with_original_log.snapshot b/snapshots/default_with_original_log.snapshot index 68da960..524b91b 100644 --- a/snapshots/default_with_original_log.snapshot +++ b/snapshots/default_with_original_log.snapshot @@ -1,32 +1,32 @@ - 0s ❯ - 0s ❯ Chunk number: 1, Chunk Line: 3 - 0s ❯ Chunk number: 2, Chunk Line: 3 - 0s ❯ Chunk number: 3, Chunk Line: 3 - 0s ❯ Chunk number: 4, Chunk Line: 3 - 0s ❯ Chunk number: 5, Chunk Line: 3 - 0s ❯ Chunk number: 6, Chunk Line: 3 - 0s ❯ Chunk number: 7, Chunk Line: 3 - 0s ❯ Chunk number: 8, Chunk Line: 3 - 0s ❯ Chunk number: 9, Chunk Line: 3 - 0s ❯ Chunk number: 10, Chunk Line: 3 - 0s ❯ Chunk number: 11, Chunk Line: 3 - 0s ❯ Chunk number: 12, Chunk Line: 3 - 0s ❯ Chunk number: 13, Chunk Line: 3 - 0s ❯ Chunk number: 14, Chunk Line: 3 - 0s ❯ Chunk number: 15, Chunk Line: 3 - 0s ❯ Chunk number: 16, Chunk Line: 3 - 0s ❯ Chunk number: 17, Chunk Line: 3 - 0s ❯ Chunk number: 18, Chunk Line: 3 - 0s ❯ Chunk number: 19, Chunk Line: 3 - 0s ❯ Chunk number: 20, Chunk Line: 3 - 0s ❯ Chunk number: 21, Chunk Line: 3 - 0s ❯ Chunk number: 22, Chunk Line: 3 - 0s ❯ Chunk number: 23, Chunk Line: 3 - 0s ❯ Chunk number: 24, Chunk Line: 3 - 0s ❯ Chunk number: 25, Chunk Line: 3 - 0s ❯ Chunk number: 26, Chunk Line: 3 - 0s ❯ Chunk number: 27, Chunk Line: 3 - 0s ❯ Chunk number: 28, Chunk Line: 3 - 0s ❯ Chunk number: 29, Chunk Line: 3 - 0s ❯ Chunk number: 30, Chunk Line: 3 -✓ 0s ❯ Chunk number: 30, Chunk Line: 3 + ❯ + ❯ Chunk number: 1, Chunk Line: 3 + ❯ Chunk number: 2, Chunk Line: 3 + ❯ Chunk number: 3, Chunk Line: 3 + ❯ Chunk number: 4, Chunk Line: 3 + ❯ Chunk number: 5, Chunk Line: 3 + ❯ Chunk number: 6, Chunk Line: 3 + ❯ Chunk number: 7, Chunk Line: 3 + ❯ Chunk number: 8, Chunk Line: 3 + ❯ Chunk number: 9, Chunk Line: 3 + ❯ Chunk number: 10, Chunk Line: 3 + ❯ Chunk number: 11, Chunk Line: 3 + ❯ Chunk number: 12, Chunk Line: 3 + ❯ Chunk number: 13, Chunk Line: 3 + ❯ Chunk number: 14, Chunk Line: 3 + ❯ Chunk number: 15, Chunk Line: 3 + ❯ Chunk number: 16, Chunk Line: 3 + ❯ Chunk number: 17, Chunk Line: 3 + ❯ Chunk number: 18, Chunk Line: 3 + ❯ Chunk number: 19, Chunk Line: 3 + ❯ Chunk number: 20, Chunk Line: 3 + ❯ Chunk number: 21, Chunk Line: 3 + ❯ Chunk number: 22, Chunk Line: 3 + ❯ Chunk number: 23, Chunk Line: 3 + ❯ Chunk number: 24, Chunk Line: 3 + ❯ Chunk number: 25, Chunk Line: 3 + ❯ Chunk number: 26, Chunk Line: 3 + ❯ Chunk number: 27, Chunk Line: 3 + ❯ Chunk number: 28, Chunk Line: 3 + ❯ Chunk number: 29, Chunk Line: 3 + ❯ Chunk number: 30, Chunk Line: 3 +✓ ❯ Chunk number: 30, Chunk Line: 3 diff --git a/snapshots/log_all.snapshot b/snapshots/log_all.snapshot index 3d60dcf..31087c8 100644 --- a/snapshots/log_all.snapshot +++ b/snapshots/log_all.snapshot @@ -1,152 +1,152 @@ - 0s ❯ + ❯ Chunk number: 1, Chunk Line: 1 Chunk number: 1, Chunk Line: 2 Chunk number: 1, Chunk Line: 3 - 0s ❯ Chunk number: 1, Chunk Line: 3 + ❯ Chunk number: 1, Chunk Line: 3 Chunk number: 2, Chunk Line: 1 Chunk number: 2, Chunk Line: 2 Chunk number: 2, Chunk Line: 3 - 0s ❯ Chunk number: 2, Chunk Line: 3 + ❯ Chunk number: 2, Chunk Line: 3 Chunk number: 3, Chunk Line: 1 Chunk number: 3, Chunk Line: 2 Chunk number: 3, Chunk Line: 3 - 0s ❯ Chunk number: 3, Chunk Line: 3 + ❯ Chunk number: 3, Chunk Line: 3 Chunk number: 4, Chunk Line: 1 Chunk number: 4, Chunk Line: 2 Chunk number: 4, Chunk Line: 3 - 0s ❯ Chunk number: 4, Chunk Line: 3 + ❯ Chunk number: 4, Chunk Line: 3 Chunk number: 5, Chunk Line: 1 Chunk number: 5, Chunk Line: 2 Chunk number: 5, Chunk Line: 3 - 0s ❯ Chunk number: 5, Chunk Line: 3 + ❯ Chunk number: 5, Chunk Line: 3 Chunk number: 6, Chunk Line: 1 Chunk number: 6, Chunk Line: 2 Chunk number: 6, Chunk Line: 3 - 0s ❯ Chunk number: 6, Chunk Line: 3 + ❯ Chunk number: 6, Chunk Line: 3 Chunk number: 7, Chunk Line: 1 Chunk number: 7, Chunk Line: 2 Chunk number: 7, Chunk Line: 3 - 0s ❯ Chunk number: 7, Chunk Line: 3 + ❯ Chunk number: 7, Chunk Line: 3 Chunk number: 8, Chunk Line: 1 Chunk number: 8, Chunk Line: 2 Chunk number: 8, Chunk Line: 3 - 0s ❯ Chunk number: 8, Chunk Line: 3 + ❯ Chunk number: 8, Chunk Line: 3 Chunk number: 9, Chunk Line: 1 Chunk number: 9, Chunk Line: 2 Chunk number: 9, Chunk Line: 3 - 0s ❯ Chunk number: 9, Chunk Line: 3 + ❯ Chunk number: 9, Chunk Line: 3 Chunk number: 10, Chunk Line: 1 Chunk number: 10, Chunk Line: 2 Chunk number: 10, Chunk Line: 3 - 0s ❯ Chunk number: 10, Chunk Line: 3 + ❯ Chunk number: 10, Chunk Line: 3 Chunk number: 11, Chunk Line: 1 Chunk number: 11, Chunk Line: 2 Chunk number: 11, Chunk Line: 3 - 0s ❯ Chunk number: 11, Chunk Line: 3 + ❯ Chunk number: 11, Chunk Line: 3 Chunk number: 12, Chunk Line: 1 Chunk number: 12, Chunk Line: 2 Chunk number: 12, Chunk Line: 3 - 0s ❯ Chunk number: 12, Chunk Line: 3 + ❯ Chunk number: 12, Chunk Line: 3 Chunk number: 13, Chunk Line: 1 Chunk number: 13, Chunk Line: 2 Chunk number: 13, Chunk Line: 3 - 0s ❯ Chunk number: 13, Chunk Line: 3 + ❯ Chunk number: 13, Chunk Line: 3 Chunk number: 14, Chunk Line: 1 Chunk number: 14, Chunk Line: 2 Chunk number: 14, Chunk Line: 3 - 0s ❯ Chunk number: 14, Chunk Line: 3 + ❯ Chunk number: 14, Chunk Line: 3 Chunk number: 15, Chunk Line: 1 Chunk number: 15, Chunk Line: 2 Chunk number: 15, Chunk Line: 3 - 0s ❯ Chunk number: 15, Chunk Line: 3 + ❯ Chunk number: 15, Chunk Line: 3 Chunk number: 16, Chunk Line: 1 Chunk number: 16, Chunk Line: 2 Chunk number: 16, Chunk Line: 3 - 0s ❯ Chunk number: 16, Chunk Line: 3 + ❯ Chunk number: 16, Chunk Line: 3 Chunk number: 17, Chunk Line: 1 Chunk number: 17, Chunk Line: 2 Chunk number: 17, Chunk Line: 3 - 0s ❯ Chunk number: 17, Chunk Line: 3 + ❯ Chunk number: 17, Chunk Line: 3 Chunk number: 18, Chunk Line: 1 Chunk number: 18, Chunk Line: 2 Chunk number: 18, Chunk Line: 3 - 0s ❯ Chunk number: 18, Chunk Line: 3 + ❯ Chunk number: 18, Chunk Line: 3 Chunk number: 19, Chunk Line: 1 Chunk number: 19, Chunk Line: 2 Chunk number: 19, Chunk Line: 3 - 0s ❯ Chunk number: 19, Chunk Line: 3 + ❯ Chunk number: 19, Chunk Line: 3 Chunk number: 20, Chunk Line: 1 Chunk number: 20, Chunk Line: 2 Chunk number: 20, Chunk Line: 3 - 0s ❯ Chunk number: 20, Chunk Line: 3 + ❯ Chunk number: 20, Chunk Line: 3 Chunk number: 21, Chunk Line: 1 Chunk number: 21, Chunk Line: 2 Chunk number: 21, Chunk Line: 3 - 0s ❯ Chunk number: 21, Chunk Line: 3 + ❯ Chunk number: 21, Chunk Line: 3 Chunk number: 22, Chunk Line: 1 Chunk number: 22, Chunk Line: 2 Chunk number: 22, Chunk Line: 3 - 0s ❯ Chunk number: 22, Chunk Line: 3 + ❯ Chunk number: 22, Chunk Line: 3 Chunk number: 23, Chunk Line: 1 Chunk number: 23, Chunk Line: 2 Chunk number: 23, Chunk Line: 3 - 0s ❯ Chunk number: 23, Chunk Line: 3 + ❯ Chunk number: 23, Chunk Line: 3 Chunk number: 24, Chunk Line: 1 Chunk number: 24, Chunk Line: 2 Chunk number: 24, Chunk Line: 3 - 0s ❯ Chunk number: 24, Chunk Line: 3 + ❯ Chunk number: 24, Chunk Line: 3 Chunk number: 25, Chunk Line: 1 Chunk number: 25, Chunk Line: 2 Chunk number: 25, Chunk Line: 3 - 0s ❯ Chunk number: 25, Chunk Line: 3 + ❯ Chunk number: 25, Chunk Line: 3 Chunk number: 26, Chunk Line: 1 Chunk number: 26, Chunk Line: 2 Chunk number: 26, Chunk Line: 3 - 0s ❯ Chunk number: 26, Chunk Line: 3 + ❯ Chunk number: 26, Chunk Line: 3 Chunk number: 27, Chunk Line: 1 Chunk number: 27, Chunk Line: 2 Chunk number: 27, Chunk Line: 3 - 0s ❯ Chunk number: 27, Chunk Line: 3 + ❯ Chunk number: 27, Chunk Line: 3 Chunk number: 28, Chunk Line: 1 Chunk number: 28, Chunk Line: 2 Chunk number: 28, Chunk Line: 3 - 0s ❯ Chunk number: 28, Chunk Line: 3 + ❯ Chunk number: 28, Chunk Line: 3 Chunk number: 29, Chunk Line: 1 Chunk number: 29, Chunk Line: 2 Chunk number: 29, Chunk Line: 3 - 0s ❯ Chunk number: 29, Chunk Line: 3 + ❯ Chunk number: 29, Chunk Line: 3 Chunk number: 30, Chunk Line: 1 Chunk number: 30, Chunk Line: 2 Chunk number: 30, Chunk Line: 3 - 0s ❯ Chunk number: 30, Chunk Line: 3 -✓ 0s ❯ Chunk number: 30, Chunk Line: 3 + ❯ Chunk number: 30, Chunk Line: 3 +✓ ❯ Chunk number: 30, Chunk Line: 3 diff --git a/snapshots/log_matches.snapshot b/snapshots/log_matches.snapshot index ae60bf2..36cd046 100644 --- a/snapshots/log_matches.snapshot +++ b/snapshots/log_matches.snapshot @@ -1,92 +1,92 @@ - 0s ❯ - 0s ❯ Chunk number: 1, Chunk Line: 3 - 0s ❯ Chunk number: 2, Chunk Line: 3 - 0s ❯ Chunk number: 3, Chunk Line: 3 - 0s ❯ Chunk number: 4, Chunk Line: 3 - 0s ❯ Chunk number: 5, Chunk Line: 3 - 0s ❯ Chunk number: 6, Chunk Line: 3 - 0s ❯ Chunk number: 7, Chunk Line: 3 - 0s ❯ Chunk number: 8, Chunk Line: 3 - 0s ❯ Chunk number: 9, Chunk Line: 3 - 0s ❯ Chunk number: 10, Chunk Line: 3 + ❯ + ❯ Chunk number: 1, Chunk Line: 3 + ❯ Chunk number: 2, Chunk Line: 3 + ❯ Chunk number: 3, Chunk Line: 3 + ❯ Chunk number: 4, Chunk Line: 3 + ❯ Chunk number: 5, Chunk Line: 3 + ❯ Chunk number: 6, Chunk Line: 3 + ❯ Chunk number: 7, Chunk Line: 3 + ❯ Chunk number: 8, Chunk Line: 3 + ❯ Chunk number: 9, Chunk Line: 3 + ❯ Chunk number: 10, Chunk Line: 3 Chunk number: 11, Chunk Line: 1 Chunk number: 11, Chunk Line: 2 Chunk number: 11, Chunk Line: 3 - 0s ❯ Chunk number: 11, Chunk Line: 3 + ❯ Chunk number: 11, Chunk Line: 3 Chunk number: 12, Chunk Line: 1 Chunk number: 12, Chunk Line: 2 Chunk number: 12, Chunk Line: 3 - 0s ❯ Chunk number: 12, Chunk Line: 3 + ❯ Chunk number: 12, Chunk Line: 3 Chunk number: 13, Chunk Line: 1 Chunk number: 13, Chunk Line: 2 Chunk number: 13, Chunk Line: 3 - 0s ❯ Chunk number: 13, Chunk Line: 3 + ❯ Chunk number: 13, Chunk Line: 3 Chunk number: 14, Chunk Line: 1 Chunk number: 14, Chunk Line: 2 Chunk number: 14, Chunk Line: 3 - 0s ❯ Chunk number: 14, Chunk Line: 3 + ❯ Chunk number: 14, Chunk Line: 3 Chunk number: 15, Chunk Line: 1 Chunk number: 15, Chunk Line: 2 Chunk number: 15, Chunk Line: 3 - 0s ❯ Chunk number: 15, Chunk Line: 3 - 0s ❯ Chunk number: 16, Chunk Line: 3 - 0s ❯ Chunk number: 17, Chunk Line: 3 - 0s ❯ Chunk number: 18, Chunk Line: 3 - 0s ❯ Chunk number: 19, Chunk Line: 3 - 0s ❯ Chunk number: 20, Chunk Line: 3 + ❯ Chunk number: 15, Chunk Line: 3 + ❯ Chunk number: 16, Chunk Line: 3 + ❯ Chunk number: 17, Chunk Line: 3 + ❯ Chunk number: 18, Chunk Line: 3 + ❯ Chunk number: 19, Chunk Line: 3 + ❯ Chunk number: 20, Chunk Line: 3 Chunk number: 21, Chunk Line: 1 Chunk number: 21, Chunk Line: 2 Chunk number: 21, Chunk Line: 3 - 0s ❯ Chunk number: 21, Chunk Line: 3 + ❯ Chunk number: 21, Chunk Line: 3 Chunk number: 22, Chunk Line: 1 Chunk number: 22, Chunk Line: 2 Chunk number: 22, Chunk Line: 3 - 0s ❯ Chunk number: 22, Chunk Line: 3 + ❯ Chunk number: 22, Chunk Line: 3 Chunk number: 23, Chunk Line: 1 Chunk number: 23, Chunk Line: 2 Chunk number: 23, Chunk Line: 3 - 0s ❯ Chunk number: 23, Chunk Line: 3 + ❯ Chunk number: 23, Chunk Line: 3 Chunk number: 24, Chunk Line: 1 Chunk number: 24, Chunk Line: 2 Chunk number: 24, Chunk Line: 3 - 0s ❯ Chunk number: 24, Chunk Line: 3 + ❯ Chunk number: 24, Chunk Line: 3 Chunk number: 25, Chunk Line: 1 Chunk number: 25, Chunk Line: 2 Chunk number: 25, Chunk Line: 3 - 0s ❯ Chunk number: 25, Chunk Line: 3 - 0s ❯ Chunk number: 26, Chunk Line: 3 - 0s ❯ Chunk number: 27, Chunk Line: 3 - 0s ❯ Chunk number: 28, Chunk Line: 3 - 0s ❯ Chunk number: 29, Chunk Line: 3 - 0s ❯ Chunk number: 30, Chunk Line: 3 -✓ 0s ❯ Chunk number: 30, Chunk Line: 3 + ❯ Chunk number: 25, Chunk Line: 3 + ❯ Chunk number: 26, Chunk Line: 3 + ❯ Chunk number: 27, Chunk Line: 3 + ❯ Chunk number: 28, Chunk Line: 3 + ❯ Chunk number: 29, Chunk Line: 3 + ❯ Chunk number: 30, Chunk Line: 3 +✓ ❯ Chunk number: 30, Chunk Line: 3