ezmsg-sigproc 1.5.0__tar.gz → 2.3.0__tar.gz

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.
Files changed (173) hide show
  1. ezmsg_sigproc-2.3.0/.github/workflows/docs.yml +65 -0
  2. {ezmsg_sigproc-1.5.0 → ezmsg_sigproc-2.3.0}/.github/workflows/python-publish-ezmsg-sigproc.yml +2 -2
  3. {ezmsg_sigproc-1.5.0 → ezmsg_sigproc-2.3.0}/.github/workflows/python-tests.yml +4 -10
  4. {ezmsg_sigproc-1.5.0 → ezmsg_sigproc-2.3.0}/.gitignore +5 -1
  5. ezmsg_sigproc-2.3.0/PKG-INFO +72 -0
  6. ezmsg_sigproc-2.3.0/README.md +55 -0
  7. ezmsg_sigproc-2.3.0/docs/Makefile +20 -0
  8. ezmsg_sigproc-2.3.0/docs/img/HybridBufferBasic.svg +4 -0
  9. ezmsg_sigproc-2.3.0/docs/img/HybridBufferOverflow.svg +4 -0
  10. ezmsg_sigproc-2.3.0/docs/make.bat +35 -0
  11. ezmsg_sigproc-2.3.0/docs/source/_templates/autosummary/module.rst +64 -0
  12. ezmsg_sigproc-2.3.0/docs/source/api/index.rst +157 -0
  13. ezmsg_sigproc-2.3.0/docs/source/conf.py +127 -0
  14. ezmsg_sigproc-2.3.0/docs/source/guides/HybridBuffer.md +87 -0
  15. ezmsg_sigproc-2.3.0/docs/source/guides/ProcessorsBase.md +173 -0
  16. ezmsg_sigproc-2.3.0/docs/source/guides/explanations/sigproc.rst +365 -0
  17. ezmsg_sigproc-2.3.0/docs/source/guides/how-tos/signalprocessing/adaptive.rst +4 -0
  18. ezmsg_sigproc-2.3.0/docs/source/guides/how-tos/signalprocessing/checkpoint.rst +4 -0
  19. ezmsg_sigproc-2.3.0/docs/source/guides/how-tos/signalprocessing/composite.rst +4 -0
  20. ezmsg_sigproc-2.3.0/docs/source/guides/how-tos/signalprocessing/content-signalprocessing.rst +13 -0
  21. ezmsg_sigproc-2.3.0/docs/source/guides/how-tos/signalprocessing/processor.rst +4 -0
  22. ezmsg_sigproc-2.3.0/docs/source/guides/how-tos/signalprocessing/standalone.rst +4 -0
  23. ezmsg_sigproc-2.3.0/docs/source/guides/how-tos/signalprocessing/stateful.rst +4 -0
  24. ezmsg_sigproc-2.3.0/docs/source/guides/how-tos/signalprocessing/unit.rst +11 -0
  25. ezmsg_sigproc-2.3.0/docs/source/guides/sigproc/base.rst +65 -0
  26. ezmsg_sigproc-2.3.0/docs/source/guides/sigproc/content-sigproc.rst +22 -0
  27. ezmsg_sigproc-2.3.0/docs/source/guides/sigproc/processors.rst +149 -0
  28. ezmsg_sigproc-2.3.0/docs/source/guides/sigproc/units.rst +29 -0
  29. ezmsg_sigproc-2.3.0/docs/source/guides/tutorials/signalprocessing.rst +615 -0
  30. ezmsg_sigproc-2.3.0/docs/source/index.rst +82 -0
  31. {ezmsg_sigproc-1.5.0 → ezmsg_sigproc-2.3.0}/pyproject.toml +35 -18
  32. ezmsg_sigproc-2.3.0/src/ezmsg/sigproc/__version__.py +34 -0
  33. ezmsg_sigproc-2.3.0/src/ezmsg/sigproc/activation.py +84 -0
  34. ezmsg_sigproc-2.3.0/src/ezmsg/sigproc/adaptive_lattice_notch.py +231 -0
  35. ezmsg_sigproc-2.3.0/src/ezmsg/sigproc/affinetransform.py +239 -0
  36. ezmsg_sigproc-2.3.0/src/ezmsg/sigproc/aggregate.py +215 -0
  37. ezmsg_sigproc-2.3.0/src/ezmsg/sigproc/bandpower.py +88 -0
  38. ezmsg_sigproc-2.3.0/src/ezmsg/sigproc/base.py +1284 -0
  39. ezmsg_sigproc-2.3.0/src/ezmsg/sigproc/butterworthfilter.py +164 -0
  40. ezmsg_sigproc-2.3.0/src/ezmsg/sigproc/cheby.py +131 -0
  41. ezmsg_sigproc-2.3.0/src/ezmsg/sigproc/combfilter.py +163 -0
  42. ezmsg_sigproc-2.3.0/src/ezmsg/sigproc/decimate.py +72 -0
  43. ezmsg_sigproc-2.3.0/src/ezmsg/sigproc/denormalize.py +86 -0
  44. ezmsg_sigproc-2.3.0/src/ezmsg/sigproc/detrend.py +29 -0
  45. ezmsg_sigproc-2.3.0/src/ezmsg/sigproc/diff.py +81 -0
  46. ezmsg_sigproc-2.3.0/src/ezmsg/sigproc/downsample.py +120 -0
  47. ezmsg_sigproc-2.3.0/src/ezmsg/sigproc/ewma.py +197 -0
  48. {ezmsg_sigproc-1.5.0 → ezmsg_sigproc-2.3.0}/src/ezmsg/sigproc/ewmfilter.py +10 -5
  49. ezmsg_sigproc-2.3.0/src/ezmsg/sigproc/extract_axis.py +41 -0
  50. ezmsg_sigproc-2.3.0/src/ezmsg/sigproc/fbcca.py +332 -0
  51. ezmsg_sigproc-2.3.0/src/ezmsg/sigproc/filter.py +332 -0
  52. ezmsg_sigproc-2.3.0/src/ezmsg/sigproc/filterbank.py +329 -0
  53. ezmsg_sigproc-2.3.0/src/ezmsg/sigproc/filterbankdesign.py +136 -0
  54. ezmsg_sigproc-2.3.0/src/ezmsg/sigproc/firfilter.py +119 -0
  55. ezmsg_sigproc-2.3.0/src/ezmsg/sigproc/gaussiansmoothing.py +93 -0
  56. ezmsg_sigproc-2.3.0/src/ezmsg/sigproc/kaiser.py +110 -0
  57. ezmsg_sigproc-2.3.0/src/ezmsg/sigproc/math/abs.py +29 -0
  58. ezmsg_sigproc-2.3.0/src/ezmsg/sigproc/math/clip.py +40 -0
  59. {ezmsg_sigproc-1.5.0 → ezmsg_sigproc-2.3.0}/src/ezmsg/sigproc/math/difference.py +36 -31
  60. ezmsg_sigproc-2.3.0/src/ezmsg/sigproc/math/invert.py +23 -0
  61. ezmsg_sigproc-2.3.0/src/ezmsg/sigproc/math/log.py +47 -0
  62. ezmsg_sigproc-2.3.0/src/ezmsg/sigproc/math/scale.py +32 -0
  63. {ezmsg_sigproc-1.5.0 → ezmsg_sigproc-2.3.0}/src/ezmsg/sigproc/messages.py +1 -2
  64. ezmsg_sigproc-2.3.0/src/ezmsg/sigproc/quantize.py +71 -0
  65. ezmsg_sigproc-2.3.0/src/ezmsg/sigproc/resample.py +299 -0
  66. ezmsg_sigproc-2.3.0/src/ezmsg/sigproc/sampler.py +296 -0
  67. ezmsg_sigproc-2.3.0/src/ezmsg/sigproc/scaler.py +127 -0
  68. ezmsg_sigproc-2.3.0/src/ezmsg/sigproc/signalinjector.py +81 -0
  69. ezmsg_sigproc-2.3.0/src/ezmsg/sigproc/slicer.py +158 -0
  70. ezmsg_sigproc-2.3.0/src/ezmsg/sigproc/spectrogram.py +97 -0
  71. ezmsg_sigproc-2.3.0/src/ezmsg/sigproc/spectrum.py +298 -0
  72. ezmsg_sigproc-2.3.0/src/ezmsg/sigproc/synth.py +774 -0
  73. ezmsg_sigproc-2.3.0/src/ezmsg/sigproc/transpose.py +131 -0
  74. ezmsg_sigproc-2.3.0/src/ezmsg/sigproc/util/asio.py +156 -0
  75. ezmsg_sigproc-2.3.0/src/ezmsg/sigproc/util/axisarray_buffer.py +379 -0
  76. ezmsg_sigproc-2.3.0/src/ezmsg/sigproc/util/buffer.py +470 -0
  77. ezmsg_sigproc-2.3.0/src/ezmsg/sigproc/util/message.py +31 -0
  78. ezmsg_sigproc-2.3.0/src/ezmsg/sigproc/util/profile.py +174 -0
  79. ezmsg_sigproc-2.3.0/src/ezmsg/sigproc/util/sparse.py +123 -0
  80. ezmsg_sigproc-2.3.0/src/ezmsg/sigproc/util/typeresolution.py +83 -0
  81. ezmsg_sigproc-2.3.0/src/ezmsg/sigproc/wavelets.py +196 -0
  82. ezmsg_sigproc-2.3.0/src/ezmsg/sigproc/window.py +382 -0
  83. ezmsg_sigproc-2.3.0/tests/__init__.py +0 -0
  84. ezmsg_sigproc-2.3.0/tests/conftest.py +4 -0
  85. ezmsg_sigproc-2.3.0/tests/helpers/__init__.py +0 -0
  86. {ezmsg_sigproc-1.5.0 → ezmsg_sigproc-2.3.0}/tests/helpers/util.py +88 -13
  87. ezmsg_sigproc-2.3.0/tests/integration/bytewax/test_spectrum_bytewax.py +68 -0
  88. ezmsg_sigproc-2.3.0/tests/integration/bytewax/test_window_bytewax.py +59 -0
  89. ezmsg_sigproc-1.5.0/tests/test_butterworth.py → ezmsg_sigproc-2.3.0/tests/integration/ezmsg/test_butterworth_system.py +4 -7
  90. ezmsg_sigproc-2.3.0/tests/integration/ezmsg/test_decimate_system.py +60 -0
  91. ezmsg_sigproc-1.5.0/tests/test_downsample.py → ezmsg_sigproc-2.3.0/tests/integration/ezmsg/test_downsample_system.py +15 -78
  92. ezmsg_sigproc-2.3.0/tests/integration/ezmsg/test_filter_system.py +117 -0
  93. ezmsg_sigproc-2.3.0/tests/integration/ezmsg/test_sampler_system.py +103 -0
  94. ezmsg_sigproc-2.3.0/tests/integration/ezmsg/test_scaler_system.py +78 -0
  95. ezmsg_sigproc-2.3.0/tests/integration/ezmsg/test_spectrum_system.py +104 -0
  96. ezmsg_sigproc-1.5.0/tests/test_synth.py → ezmsg_sigproc-2.3.0/tests/integration/ezmsg/test_synth_system.py +11 -153
  97. ezmsg_sigproc-2.3.0/tests/integration/ezmsg/test_window_system.py +192 -0
  98. ezmsg_sigproc-2.3.0/tests/test_profile.py +191 -0
  99. ezmsg_sigproc-2.3.0/tests/unit/buffer/test_axisarray_buffer.py +589 -0
  100. ezmsg_sigproc-2.3.0/tests/unit/buffer/test_buffer.py +442 -0
  101. ezmsg_sigproc-2.3.0/tests/unit/buffer/test_buffer_overflow.py +203 -0
  102. ezmsg_sigproc-2.3.0/tests/unit/test_adaptive_lattice_notch.py +159 -0
  103. {ezmsg_sigproc-1.5.0/tests → ezmsg_sigproc-2.3.0/tests/unit}/test_affine_transform.py +3 -3
  104. {ezmsg_sigproc-1.5.0/tests → ezmsg_sigproc-2.3.0/tests/unit}/test_aggregate.py +25 -1
  105. {ezmsg_sigproc-1.5.0/tests → ezmsg_sigproc-2.3.0/tests/unit}/test_bandpower.py +6 -2
  106. ezmsg_sigproc-2.3.0/tests/unit/test_base.py +1183 -0
  107. {ezmsg_sigproc-1.5.0/tests → ezmsg_sigproc-2.3.0/tests/unit}/test_butter.py +101 -7
  108. ezmsg_sigproc-2.3.0/tests/unit/test_combfilter.py +332 -0
  109. ezmsg_sigproc-2.3.0/tests/unit/test_denormalize.py +245 -0
  110. ezmsg_sigproc-2.3.0/tests/unit/test_diff.py +127 -0
  111. ezmsg_sigproc-2.3.0/tests/unit/test_downsample.py +77 -0
  112. ezmsg_sigproc-2.3.0/tests/unit/test_ewma.py +51 -0
  113. ezmsg_sigproc-2.3.0/tests/unit/test_extract_axis.py +65 -0
  114. ezmsg_sigproc-2.3.0/tests/unit/test_fbcca.py +766 -0
  115. ezmsg_sigproc-2.3.0/tests/unit/test_filter.py +17 -0
  116. {ezmsg_sigproc-1.5.0/tests → ezmsg_sigproc-2.3.0/tests/unit}/test_filterbank.py +1 -9
  117. ezmsg_sigproc-2.3.0/tests/unit/test_filterbankdesign.py +692 -0
  118. ezmsg_sigproc-2.3.0/tests/unit/test_firfilter.py +287 -0
  119. ezmsg_sigproc-2.3.0/tests/unit/test_gaussian_smoothing_filter.py +255 -0
  120. ezmsg_sigproc-2.3.0/tests/unit/test_kaiser.py +426 -0
  121. ezmsg_sigproc-2.3.0/tests/unit/test_quantize.py +89 -0
  122. ezmsg_sigproc-2.3.0/tests/unit/test_resample.py +152 -0
  123. ezmsg_sigproc-2.3.0/tests/unit/test_sampler.py +94 -0
  124. ezmsg_sigproc-2.3.0/tests/unit/test_scaler.py +73 -0
  125. {ezmsg_sigproc-1.5.0/tests → ezmsg_sigproc-2.3.0/tests/unit}/test_slicer.py +1 -1
  126. {ezmsg_sigproc-1.5.0/tests → ezmsg_sigproc-2.3.0/tests/unit}/test_spectrogram.py +8 -8
  127. {ezmsg_sigproc-1.5.0/tests → ezmsg_sigproc-2.3.0/tests/unit}/test_spectrum.py +1 -97
  128. ezmsg_sigproc-2.3.0/tests/unit/test_synth.py +150 -0
  129. ezmsg_sigproc-2.3.0/tests/unit/test_transpose.py +64 -0
  130. ezmsg_sigproc-2.3.0/tests/unit/test_util.py +121 -0
  131. {ezmsg_sigproc-1.5.0/tests → ezmsg_sigproc-2.3.0/tests/unit}/test_wavelets.py +40 -43
  132. ezmsg_sigproc-2.3.0/tests/unit/test_window.py +257 -0
  133. ezmsg_sigproc-1.5.0/PKG-INFO +0 -58
  134. ezmsg_sigproc-1.5.0/README.md +0 -39
  135. ezmsg_sigproc-1.5.0/src/ezmsg/sigproc/__version__.py +0 -16
  136. ezmsg_sigproc-1.5.0/src/ezmsg/sigproc/activation.py +0 -86
  137. ezmsg_sigproc-1.5.0/src/ezmsg/sigproc/affinetransform.py +0 -232
  138. ezmsg_sigproc-1.5.0/src/ezmsg/sigproc/aggregate.py +0 -183
  139. ezmsg_sigproc-1.5.0/src/ezmsg/sigproc/bandpower.py +0 -75
  140. ezmsg_sigproc-1.5.0/src/ezmsg/sigproc/base.py +0 -39
  141. ezmsg_sigproc-1.5.0/src/ezmsg/sigproc/butterworthfilter.py +0 -162
  142. ezmsg_sigproc-1.5.0/src/ezmsg/sigproc/decimate.py +0 -43
  143. ezmsg_sigproc-1.5.0/src/ezmsg/sigproc/downsample.py +0 -111
  144. ezmsg_sigproc-1.5.0/src/ezmsg/sigproc/filter.py +0 -232
  145. ezmsg_sigproc-1.5.0/src/ezmsg/sigproc/filterbank.py +0 -279
  146. ezmsg_sigproc-1.5.0/src/ezmsg/sigproc/math/abs.py +0 -33
  147. ezmsg_sigproc-1.5.0/src/ezmsg/sigproc/math/clip.py +0 -39
  148. ezmsg_sigproc-1.5.0/src/ezmsg/sigproc/math/invert.py +0 -34
  149. ezmsg_sigproc-1.5.0/src/ezmsg/sigproc/math/log.py +0 -51
  150. ezmsg_sigproc-1.5.0/src/ezmsg/sigproc/math/scale.py +0 -39
  151. ezmsg_sigproc-1.5.0/src/ezmsg/sigproc/sampler.py +0 -327
  152. ezmsg_sigproc-1.5.0/src/ezmsg/sigproc/scaler.py +0 -172
  153. ezmsg_sigproc-1.5.0/src/ezmsg/sigproc/signalinjector.py +0 -68
  154. ezmsg_sigproc-1.5.0/src/ezmsg/sigproc/slicer.py +0 -166
  155. ezmsg_sigproc-1.5.0/src/ezmsg/sigproc/spectrogram.py +0 -90
  156. ezmsg_sigproc-1.5.0/src/ezmsg/sigproc/spectrum.py +0 -263
  157. ezmsg_sigproc-1.5.0/src/ezmsg/sigproc/synth.py +0 -620
  158. ezmsg_sigproc-1.5.0/src/ezmsg/sigproc/wavelets.py +0 -170
  159. ezmsg_sigproc-1.5.0/src/ezmsg/sigproc/window.py +0 -290
  160. ezmsg_sigproc-1.5.0/tests/conftest.py +0 -4
  161. ezmsg_sigproc-1.5.0/tests/test_sampler.py +0 -191
  162. ezmsg_sigproc-1.5.0/tests/test_scaler.py +0 -132
  163. ezmsg_sigproc-1.5.0/tests/test_window.py +0 -397
  164. ezmsg_sigproc-1.5.0/uv.lock +0 -598
  165. {ezmsg_sigproc-1.5.0 → ezmsg_sigproc-2.3.0}/.pre-commit-config.yaml +0 -0
  166. {ezmsg_sigproc-1.5.0 → ezmsg_sigproc-2.3.0}/LICENSE.txt +0 -0
  167. {ezmsg_sigproc-1.5.0 → ezmsg_sigproc-2.3.0}/src/ezmsg/sigproc/__init__.py +0 -0
  168. {ezmsg_sigproc-1.5.0 → ezmsg_sigproc-2.3.0}/src/ezmsg/sigproc/math/__init__.py +0 -0
  169. {ezmsg_sigproc-1.5.0 → ezmsg_sigproc-2.3.0}/src/ezmsg/sigproc/spectral.py +0 -0
  170. {ezmsg_sigproc-1.5.0/tests/helpers → ezmsg_sigproc-2.3.0/src/ezmsg/sigproc/util}/__init__.py +0 -0
  171. {ezmsg_sigproc-1.5.0 → ezmsg_sigproc-2.3.0}/tests/resources/xform.csv +0 -0
  172. {ezmsg_sigproc-1.5.0/tests → ezmsg_sigproc-2.3.0/tests/unit}/test_activation.py +0 -0
  173. {ezmsg_sigproc-1.5.0/tests → ezmsg_sigproc-2.3.0/tests/unit}/test_math.py +0 -0
@@ -0,0 +1,65 @@
1
+ name: Documentation
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+ tags:
8
+ - 'v*'
9
+ pull_request:
10
+ branches:
11
+ - dev
12
+ workflow_dispatch:
13
+
14
+ permissions:
15
+ contents: read
16
+ pages: write
17
+ id-token: write
18
+
19
+ # Allow only one concurrent deployment
20
+ concurrency:
21
+ group: "pages"
22
+ cancel-in-progress: false
23
+
24
+ jobs:
25
+ build:
26
+ runs-on: ubuntu-latest
27
+ steps:
28
+ - uses: actions/checkout@v4
29
+ with:
30
+ fetch-depth: 0 # Needed for hatch-vcs to determine version
31
+
32
+ - name: Install uv
33
+ uses: astral-sh/setup-uv@v6
34
+ with:
35
+ enable-cache: true
36
+ python-version: "3.12"
37
+
38
+ - name: Install the project
39
+ run: uv sync --only-group docs
40
+
41
+ - name: Build documentation
42
+ run: |
43
+ cd docs
44
+ uv run make html
45
+
46
+ - name: Add .nojekyll file
47
+ run: touch docs/build/html/.nojekyll
48
+
49
+ - name: Upload artifact
50
+ uses: actions/upload-pages-artifact@v3
51
+ with:
52
+ path: 'docs/build/html'
53
+
54
+ deploy:
55
+ # Only deploy on push to main or release tags
56
+ if: github.event_name == 'push' && (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v'))
57
+ environment:
58
+ name: github-pages
59
+ url: ${{ steps.deployment.outputs.page_url }}
60
+ runs-on: ubuntu-latest
61
+ needs: build
62
+ steps:
63
+ - name: Deploy to GitHub Pages
64
+ id: deployment
65
+ uses: actions/deploy-pages@v4
@@ -17,8 +17,8 @@ jobs:
17
17
  steps:
18
18
  - uses: actions/checkout@v4
19
19
 
20
- - name: Install uv
21
- uses: astral-sh/setup-uv@v2
20
+ - name: Install the latest version of uv
21
+ uses: astral-sh/setup-uv@v6
22
22
 
23
23
  - name: Build Package
24
24
  run: uv build
@@ -13,7 +13,7 @@ jobs:
13
13
  build:
14
14
  strategy:
15
15
  matrix:
16
- python-version: [3.9, "3.10", "3.11", "3.12"]
16
+ python-version: ["3.10.15", "3.11", "3.12", "3.13"]
17
17
  os:
18
18
  - "ubuntu-latest"
19
19
  - "windows-latest"
@@ -23,17 +23,11 @@ jobs:
23
23
  steps:
24
24
  - uses: actions/checkout@v4
25
25
 
26
- - name: Install uv
27
- uses: astral-sh/setup-uv@v2
28
- with:
29
- enable-cache: true
30
- cache-dependency-glob: "uv.lock"
31
-
32
- - name: Set up Python ${{ matrix.python-version }}
33
- run: uv python install ${{ matrix.python-version }}
26
+ - name: Install the latest version of uv
27
+ uses: astral-sh/setup-uv@v6
34
28
 
35
29
  - name: Install the project
36
- run: uv sync --all-extras --dev
30
+ run: uv sync --python ${{ matrix.python-version }}
37
31
 
38
32
  - name: Lint
39
33
  run:
@@ -70,8 +70,10 @@ instance/
70
70
 
71
71
  # Sphinx documentation
72
72
  docs/_build/
73
+ docs/build/
73
74
  docs/source/_build
74
75
  docs/source/generated
76
+ docs/source/api/generated
75
77
 
76
78
  # PyBuilder
77
79
  .pybuilder/
@@ -142,4 +144,6 @@ cython_debug/
142
144
  # JetBrains
143
145
  .idea/
144
146
 
145
- src/ezmsg/sigproc/__version__.py
147
+ src/ezmsg/sigproc/__version__.py
148
+ uv.lock
149
+ *.local.json
@@ -0,0 +1,72 @@
1
+ Metadata-Version: 2.4
2
+ Name: ezmsg-sigproc
3
+ Version: 2.3.0
4
+ Summary: Timeseries signal processing implementations in ezmsg
5
+ Author-email: Griffin Milsap <griffin.milsap@gmail.com>, Preston Peranich <pperanich@gmail.com>, Chadwick Boulay <chadwick.boulay@gmail.com>
6
+ License-Expression: MIT
7
+ License-File: LICENSE.txt
8
+ Requires-Python: >=3.10.15
9
+ Requires-Dist: array-api-compat>=1.11.1
10
+ Requires-Dist: ezmsg>=3.6.0
11
+ Requires-Dist: numba>=0.61.0
12
+ Requires-Dist: numpy>=1.26.0
13
+ Requires-Dist: pywavelets>=1.6.0
14
+ Requires-Dist: scipy>=1.13.1
15
+ Requires-Dist: sparse>=0.15.4
16
+ Description-Content-Type: text/markdown
17
+
18
+ # ezmsg.sigproc
19
+
20
+ ## Overview
21
+
22
+ ezmsg-sigproc offers timeseries signal‑processing primitives built atop the ezmsg message‑passing framework. Core dependencies include ezmsg, numpy, scipy, pywavelets, and sparse; the project itself is managed through hatchling and uses VCS hooks to populate __version__.py.
23
+
24
+ ## Installation
25
+
26
+ Install the latest release from pypi with: `pip install ezmsg-sigproc` (or `uv add ...` or `poetry add ...`).
27
+
28
+ You can install pre-release versions directly from GitHub:
29
+
30
+ * Using `pip`: `pip install git+https://github.com/ezmsg-org/ezmsg-sigproc.git@dev`
31
+ * Using `uv`: `uv add git+https://github.com/ezmsg-org/ezmsg-sigproc --branch dev`
32
+ * Using `poetry`: `poetry add "git+https://github.com/ezmsg-org/ezmsg-sigproc.git@dev"`
33
+
34
+ > See the [Development](#development) section below for installing with the intention of developing.
35
+
36
+ ## Source layout & key modules
37
+ * All source resides under src/ezmsg/sigproc, which contains a suite of processors (for example, filter.py, spectrogram.py, spectrum.py, sampler.py) and math and util subpackages.
38
+ * The framework’s backbone is base.py, defining standard protocols—Processor, Producer, Consumer, and Transformer—that enable both stateless and stateful processing chains.
39
+ * Filtering is implemented in filter.py, providing settings dataclasses and a stateful transformer that applies supplied coefficients to incoming data.
40
+ * Spectral analysis uses a composite spectrogram transformer chaining windowing, spectrum computation, and axis adjustments.
41
+
42
+ ## Operating styles: Standalone processors vs. ezmsg pipelines
43
+ While each processor is designed to be assembled into an ezmsg pipeline, the components are also well‑suited for offline, ad‑hoc analysis. You can instantiate processors directly in scripts or notebooks for quick prototyping or to validate results from other code. The companion Unit wrappers, however, are meant for assembling processors into a full ezmsg pipeline.
44
+
45
+ A fully defined ezmsg pipeline shines in online streaming scenarios where message routing, scheduling, and latency handling are crucial. Nevertheless, you can run the same pipeline offline—say, within a Jupyter notebook—if your analysis benefits from ezmsg’s structured execution model. Deciding between a standalone processor and a full pipeline comes down to the trade‑off between simplicity and the operational overhead of the pipeline:
46
+
47
+ * Standalone processors: Low overhead, ideal for one‑off or exploratory offline tasks.
48
+ * Pipeline + Unit wrappers: Additional setup cost but bring concurrency, standardized interfaces, and automatic message flow—useful when your offline experiment mirrors a live system or when you require fine‑grained pipeline behavior.
49
+
50
+ ## Documentation & tests
51
+ * `docs/ProcessorsBase.md` details the processor hierarchy and generic type patterns, providing a solid foundation for custom components.
52
+ * Unit tests (e.g., `tests/unit/test_sampler.py`) offer concrete examples of usage, showcasing sampler generation, windowing, and message handling.
53
+
54
+ ## Where to learn next
55
+ * Study docs/ProcessorsBase.md to master the processor architecture.
56
+ * Explore unit tests for hands‑on examples of composing processors and Units.
57
+ * Review the ezmsg framework in pyproject.toml to understand the surrounding ecosystem.
58
+ * Experiment with the code—try running processors standalone and then integrate them into a small pipeline to observe the trade‑offs firsthand.
59
+
60
+ This approach equips newcomers to choose the right level of abstraction—raw processor, Unit wrapper, or full pipeline—based on the demands of their analysis or streaming application.
61
+
62
+ ## Development
63
+
64
+ We use [`uv`](https://docs.astral.sh/uv/getting-started/installation/) for development. It is not strictly required, but if you intend to contribute to ezmsg-sigproc then using `uv` will lead to the smoothest collaboration.
65
+
66
+ 1. Install [`uv`](https://docs.astral.sh/uv/getting-started/installation/) if not already installed.
67
+ 2. Fork ezmsg-sigproc and clone your fork to your local computer.
68
+ 3. Open a terminal and `cd` to the cloned folder.
69
+ 4. `uv sync` to create a .venv and install dependencies.
70
+ 5. `uv run pre-commit install` to install pre-commit hooks to do linting and formatting.
71
+ 6. Run the test suite before finalizing your edits: `uv run pytest tests`
72
+ 7. Make a PR against the `dev` branch of the main repo.
@@ -0,0 +1,55 @@
1
+ # ezmsg.sigproc
2
+
3
+ ## Overview
4
+
5
+ ezmsg-sigproc offers timeseries signal‑processing primitives built atop the ezmsg message‑passing framework. Core dependencies include ezmsg, numpy, scipy, pywavelets, and sparse; the project itself is managed through hatchling and uses VCS hooks to populate __version__.py.
6
+
7
+ ## Installation
8
+
9
+ Install the latest release from pypi with: `pip install ezmsg-sigproc` (or `uv add ...` or `poetry add ...`).
10
+
11
+ You can install pre-release versions directly from GitHub:
12
+
13
+ * Using `pip`: `pip install git+https://github.com/ezmsg-org/ezmsg-sigproc.git@dev`
14
+ * Using `uv`: `uv add git+https://github.com/ezmsg-org/ezmsg-sigproc --branch dev`
15
+ * Using `poetry`: `poetry add "git+https://github.com/ezmsg-org/ezmsg-sigproc.git@dev"`
16
+
17
+ > See the [Development](#development) section below for installing with the intention of developing.
18
+
19
+ ## Source layout & key modules
20
+ * All source resides under src/ezmsg/sigproc, which contains a suite of processors (for example, filter.py, spectrogram.py, spectrum.py, sampler.py) and math and util subpackages.
21
+ * The framework’s backbone is base.py, defining standard protocols—Processor, Producer, Consumer, and Transformer—that enable both stateless and stateful processing chains.
22
+ * Filtering is implemented in filter.py, providing settings dataclasses and a stateful transformer that applies supplied coefficients to incoming data.
23
+ * Spectral analysis uses a composite spectrogram transformer chaining windowing, spectrum computation, and axis adjustments.
24
+
25
+ ## Operating styles: Standalone processors vs. ezmsg pipelines
26
+ While each processor is designed to be assembled into an ezmsg pipeline, the components are also well‑suited for offline, ad‑hoc analysis. You can instantiate processors directly in scripts or notebooks for quick prototyping or to validate results from other code. The companion Unit wrappers, however, are meant for assembling processors into a full ezmsg pipeline.
27
+
28
+ A fully defined ezmsg pipeline shines in online streaming scenarios where message routing, scheduling, and latency handling are crucial. Nevertheless, you can run the same pipeline offline—say, within a Jupyter notebook—if your analysis benefits from ezmsg’s structured execution model. Deciding between a standalone processor and a full pipeline comes down to the trade‑off between simplicity and the operational overhead of the pipeline:
29
+
30
+ * Standalone processors: Low overhead, ideal for one‑off or exploratory offline tasks.
31
+ * Pipeline + Unit wrappers: Additional setup cost but bring concurrency, standardized interfaces, and automatic message flow—useful when your offline experiment mirrors a live system or when you require fine‑grained pipeline behavior.
32
+
33
+ ## Documentation & tests
34
+ * `docs/ProcessorsBase.md` details the processor hierarchy and generic type patterns, providing a solid foundation for custom components.
35
+ * Unit tests (e.g., `tests/unit/test_sampler.py`) offer concrete examples of usage, showcasing sampler generation, windowing, and message handling.
36
+
37
+ ## Where to learn next
38
+ * Study docs/ProcessorsBase.md to master the processor architecture.
39
+ * Explore unit tests for hands‑on examples of composing processors and Units.
40
+ * Review the ezmsg framework in pyproject.toml to understand the surrounding ecosystem.
41
+ * Experiment with the code—try running processors standalone and then integrate them into a small pipeline to observe the trade‑offs firsthand.
42
+
43
+ This approach equips newcomers to choose the right level of abstraction—raw processor, Unit wrapper, or full pipeline—based on the demands of their analysis or streaming application.
44
+
45
+ ## Development
46
+
47
+ We use [`uv`](https://docs.astral.sh/uv/getting-started/installation/) for development. It is not strictly required, but if you intend to contribute to ezmsg-sigproc then using `uv` will lead to the smoothest collaboration.
48
+
49
+ 1. Install [`uv`](https://docs.astral.sh/uv/getting-started/installation/) if not already installed.
50
+ 2. Fork ezmsg-sigproc and clone your fork to your local computer.
51
+ 3. Open a terminal and `cd` to the cloned folder.
52
+ 4. `uv sync` to create a .venv and install dependencies.
53
+ 5. `uv run pre-commit install` to install pre-commit hooks to do linting and formatting.
54
+ 6. Run the test suite before finalizing your edits: `uv run pytest tests`
55
+ 7. Make a PR against the `dev` branch of the main repo.
@@ -0,0 +1,20 @@
1
+ # Minimal makefile for Sphinx documentation
2
+ #
3
+
4
+ # You can set these variables from the command line, and also
5
+ # from the environment for the first two.
6
+ SPHINXOPTS ?=
7
+ SPHINXBUILD ?= sphinx-build
8
+ SOURCEDIR = source
9
+ BUILDDIR = build
10
+
11
+ # Put it first so that "make" without argument is like "make help".
12
+ help:
13
+ @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
14
+
15
+ .PHONY: help Makefile
16
+
17
+ # Catch-all target: route all unknown targets to Sphinx using the new
18
+ # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
19
+ %: Makefile
20
+ @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
@@ -0,0 +1,4 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!-- Do not edit this file with editors other than diagrams.net -->
3
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="793px" height="909px" viewBox="-0.5 -0.5 793 909" content="&lt;mxfile host=&quot;drawio-plugin&quot; modified=&quot;2025-08-15T19:39:08.057Z&quot; agent=&quot;Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36&quot; etag=&quot;iw1L_nIaa5UH2JvPgf6f&quot; version=&quot;22.1.22&quot; type=&quot;embed&quot;&gt;&lt;diagram id=&quot;23iRSUPoRavnBvh4doch&quot; name=&quot;Page-1&quot;&gt;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&lt;/diagram&gt;&lt;/mxfile&gt;"><defs/><g><rect x="13" y="40" width="60" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 58px; height: 1px; padding-top: 55px; margin-left: 13px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: right;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><div style="">deq_len=0<span style="background-color: initial;"><br /></span></div><div style=""><span style="background-color: initial;">available=0</span></div><div style=""><span style="background-color: initial;">tell=0</span></div></div></div></div></foreignObject><text x="71" y="59" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="end">deq_len=0...</text></switch></g><rect x="13" y="0" width="60" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 58px; height: 1px; padding-top: 15px; margin-left: 15px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">A: Init</div></div></div></foreignObject><text x="15" y="19" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">A: Init</text></switch></g><rect x="55" y="0" width="60" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 15px; margin-left: 56px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">(capacity=16)</div></div></div></foreignObject><text x="85" y="19" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">(capacity=...</text></switch></g><rect x="273" y="130" width="20" height="20" fill="#008a00" stroke="#ffffff" pointer-events="all"/><rect x="273" y="150" width="20" height="20" fill="#008a00" stroke="#ffffff" pointer-events="all"/><rect x="273" y="90" width="20" height="20" fill="#008a00" stroke="#ffffff" pointer-events="all"/><rect x="273" y="110" width="20" height="20" fill="#008a00" stroke="#ffffff" pointer-events="all"/><ellipse cx="138" cy="155" rx="85" ry="85" fill="none" stroke="rgb(0, 0, 0)" pointer-events="all"/><ellipse cx="138" cy="155" rx="51" ry="51" fill="none" stroke="rgb(0, 0, 0)" pointer-events="all"/><path d="M 189 154.93 L 223 155" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 53 154.8 L 87 154.86" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 174.06 118.94 L 198.1 94.9" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 137.8 70 L 137.8 104" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 137.8 206 L 137.8 240" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 77.9 215.1 L 101.94 191.06" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 198.1 215.1 L 174.06 191.06" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 102.3 118.45 L 76.8 95.5" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 185.02 136.23 L 217.05 122.53" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 58.95 187.3 L 90.88 174.69" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 59.63 122.7 L 90.57 136.64" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 185.6 174.55 L 216.2 188.15" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 104.85 77.48 L 117.8 108.08" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 158.2 202.94 L 171.25 233.23" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 118.11 201.61 L 103.15 233.2" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 170.81 76.8 L 157.58 107.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 138 70 L 138 30 L 171.63 30" fill="none" stroke="#005700" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 176.88 30 L 169.88 33.5 L 171.63 30 L 169.88 26.5 Z" fill="#005700" stroke="#005700" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 30px; margin-left: 158px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;"><font style="font-size: 8px;">head=0</font></div></div></div></foreignObject><text x="158" y="33" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">head=0</text></switch></g><path d="M 138 50 L 138 10 L 171.63 10" fill="none" stroke="#006eaf" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 176.88 10 L 169.88 13.5 L 171.63 10 L 169.88 6.5 Z" fill="#006eaf" stroke="#006eaf" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 10px; margin-left: 158px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;"><font style="font-size: 8px;">tail=0</font></div></div></div></foreignObject><text x="158" y="13" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">tail=0</text></switch></g><rect x="268" y="40" width="60" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 58px; height: 1px; padding-top: 55px; margin-left: 268px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: right;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><div style="">deq_len=4<span style="background-color: initial;"><br /></span></div><div style=""><span style="background-color: initial;">available=4</span></div><div style=""><span style="background-color: initial;">tell=0</span></div></div></div></div></foreignObject><text x="326" y="59" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="end">deq_len=4...</text></switch></g><rect x="268" y="0" width="65" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 63px; height: 1px; padding-top: 15px; margin-left: 270px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">B: write([4])</div></div></div></foreignObject><text x="270" y="19" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">B: write([4...</text></switch></g><ellipse cx="393" cy="155" rx="85" ry="85" fill="none" stroke="rgb(0, 0, 0)" pointer-events="all"/><ellipse cx="393" cy="155" rx="51" ry="51" fill="none" stroke="rgb(0, 0, 0)" pointer-events="all"/><path d="M 444 154.93 L 478 155" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 308 154.8 L 342 154.86" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 429.06 118.94 L 453.1 94.9" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 392.8 70 L 392.8 104" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 392.8 206 L 392.8 240" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 332.9 215.1 L 356.94 191.06" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 453.1 215.1 L 429.06 191.06" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 357.3 118.45 L 331.8 95.5" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 440.02 136.23 L 472.05 122.53" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 313.95 187.3 L 345.88 174.69" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 314.63 122.7 L 345.57 136.64" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 440.6 174.55 L 471.2 188.15" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 359.85 77.48 L 372.8 108.08" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 413.2 202.94 L 426.25 233.23" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 373.11 201.61 L 358.15 233.2" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 425.81 76.8 L 412.58 107.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 393 70 L 393 30 L 426.63 30" fill="none" stroke="#005700" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 431.88 30 L 424.88 33.5 L 426.63 30 L 424.88 26.5 Z" fill="#005700" stroke="#005700" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 30px; margin-left: 413px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;"><font style="font-size: 8px;">head=0</font></div></div></div></foreignObject><text x="413" y="33" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">head=0</text></switch></g><path d="M 393 50 L 393 10 L 426.63 10" fill="none" stroke="#006eaf" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 431.88 10 L 424.88 13.5 L 426.63 10 L 424.88 6.5 Z" fill="#006eaf" stroke="#006eaf" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 10px; margin-left: 413px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;"><font style="font-size: 8px;">tail=0</font></div></div></div></foreignObject><text x="413" y="13" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">tail=0</text></switch></g><rect x="534" y="130" width="20" height="20" fill="#008a00" stroke="#ffffff" pointer-events="all"/><rect x="534" y="150" width="20" height="20" fill="#008a00" stroke="#ffffff" pointer-events="all"/><rect x="534" y="90" width="20" height="20" fill="#008a00" stroke="#ffffff" pointer-events="all"/><rect x="534" y="110" width="20" height="20" fill="#008a00" stroke="#ffffff" pointer-events="all"/><rect x="529" y="40" width="60" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 58px; height: 1px; padding-top: 55px; margin-left: 529px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: right;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><div style="">deq_len=8<span style="background-color: initial;"><br /></span></div><div style=""><span style="background-color: initial;">available=8</span></div><div style=""><span style="background-color: initial;">tell=0</span></div></div></div></div></foreignObject><text x="587" y="59" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="end">deq_len=8...</text></switch></g><rect x="529" y="0" width="74" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 72px; height: 1px; padding-top: 15px; margin-left: 531px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">C: write([4])</div></div></div></foreignObject><text x="531" y="19" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">C: write([4])</text></switch></g><ellipse cx="654" cy="155" rx="85" ry="85" fill="none" stroke="rgb(0, 0, 0)" pointer-events="all"/><ellipse cx="654" cy="155" rx="51" ry="51" fill="none" stroke="rgb(0, 0, 0)" pointer-events="all"/><path d="M 705 154.93 L 739 155" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 569 154.8 L 603 154.86" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 690.06 118.94 L 714.1 94.9" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 653.8 70 L 653.8 104" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 653.8 206 L 653.8 240" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 593.9 215.1 L 617.94 191.06" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 714.1 215.1 L 690.06 191.06" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 618.3 118.45 L 592.8 95.5" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 701.02 136.23 L 733.05 122.53" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 574.95 187.3 L 606.88 174.69" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 575.63 122.7 L 606.57 136.64" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 701.6 174.55 L 732.2 188.15" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 620.85 77.48 L 633.8 108.08" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 674.2 202.94 L 687.25 233.23" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 634.11 201.61 L 619.15 233.2" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 686.81 76.8 L 673.58 107.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 654 70 L 654 30 L 687.63 30" fill="none" stroke="#005700" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 692.88 30 L 685.88 33.5 L 687.63 30 L 685.88 26.5 Z" fill="#005700" stroke="#005700" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 30px; margin-left: 674px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;"><font style="font-size: 8px;">head=0</font></div></div></div></foreignObject><text x="674" y="33" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">head=0</text></switch></g><path d="M 654 50 L 654 10 L 687.63 10" fill="none" stroke="#006eaf" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 692.88 10 L 685.88 13.5 L 687.63 10 L 685.88 6.5 Z" fill="#006eaf" stroke="#006eaf" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 10px; margin-left: 674px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;"><font style="font-size: 8px;">tail=0</font></div></div></div></foreignObject><text x="674" y="13" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">tail=0</text></switch></g><ellipse cx="133" cy="436" rx="85" ry="85" fill="none" stroke="rgb(0, 0, 0)" pointer-events="all"/><ellipse cx="133" cy="436" rx="51" ry="51" fill="none" stroke="rgb(0, 0, 0)" pointer-events="all"/><path d="M 184 435.93 L 218 436" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 48 435.8 L 82 435.86" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 169.06 399.94 L 193.1 375.9" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 132.8 351 L 132.8 385" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 132.8 487 L 132.8 521" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 72.9 496.1 L 96.94 472.06" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 193.1 496.1 L 169.06 472.06" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 97.3 399.45 L 71.8 376.5" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 180.02 417.23 L 212.05 403.53" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 53.95 468.3 L 85.88 455.69" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 54.63 403.7 L 85.57 417.64" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 180.6 455.55 L 211.2 469.15" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 99.85 358.48 L 112.8 389.08" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 153.2 483.94 L 166.25 514.23" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 113.11 482.61 L 98.15 514.2" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 165.81 357.8 L 152.58 388.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><rect x="163" y="486" width="16" height="16" fill="#008a00" stroke="#005700" pointer-events="all"/><rect x="138" y="496" width="16" height="16" fill="#008a00" stroke="#005700" pointer-events="all"/><rect x="181" y="465" width="16" height="16" fill="#008a00" stroke="#005700" pointer-events="all"/><rect x="192" y="440" width="16" height="16" fill="#008a00" stroke="#005700" pointer-events="all"/><rect x="192" y="416" width="16" height="16" fill="#008a00" stroke="#005700" pointer-events="all"/><rect x="182" y="390" width="16" height="16" fill="#008a00" stroke="#005700" pointer-events="all"/><rect x="163" y="370" width="16" height="16" fill="#008a00" stroke="#005700" pointer-events="all"/><rect x="138" y="360" width="16" height="16" fill="#008a00" stroke="#005700" pointer-events="all"/><path d="M 133 521 L 133 562 L 94.37 562" fill="none" stroke="#005700" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 89.12 562 L 96.12 558.5 L 94.37 562 L 96.12 565.5 Z" fill="#005700" stroke="#005700" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 562px; margin-left: 109px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;"><font style="font-size: 8px;">head=8</font></div></div></div></foreignObject><text x="109" y="565" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">head=8</text></switch></g><path d="M 133 351 L 133 311 L 166.63 311" fill="none" stroke="#006eaf" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 171.88 311 L 164.88 314.5 L 166.63 311 L 164.88 307.5 Z" fill="#006eaf" stroke="#006eaf" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 311px; margin-left: 153px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;"><font style="font-size: 8px;">tail=0</font></div></div></div></foreignObject><text x="153" y="314" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">tail=0</text></switch></g><rect x="3" y="330" width="60" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 58px; height: 1px; padding-top: 345px; margin-left: 3px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: right;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><div style="">deq_len=8<span style="background-color: initial;"><br /></span></div><div style=""><span style="background-color: initial;">available=8</span></div><div style=""><span style="background-color: initial;">tell=0</span></div></div></div></div></foreignObject><text x="61" y="349" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="end">deq_len=8...</text></switch></g><rect x="3" y="290" width="60" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 58px; height: 1px; padding-top: 305px; margin-left: 5px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">D: flush()</div></div></div></foreignObject><text x="5" y="309" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">D: flush()</text></switch></g><ellipse cx="394" cy="437" rx="85" ry="85" fill="none" stroke="rgb(0, 0, 0)" pointer-events="all"/><ellipse cx="394" cy="437" rx="51" ry="51" fill="none" stroke="rgb(0, 0, 0)" pointer-events="all"/><path d="M 445 436.93 L 479 437" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 309 436.8 L 343 436.86" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 430.06 400.94 L 454.1 376.9" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 393.8 352 L 393.8 386" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 393.8 488 L 393.8 522" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 333.9 497.1 L 357.94 473.06" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 454.1 497.1 L 430.06 473.06" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 358.3 400.45 L 332.8 377.5" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 441.02 418.23 L 473.05 404.53" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 314.95 469.3 L 346.88 456.69" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 315.63 404.7 L 346.57 418.64" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 441.6 456.55 L 472.2 470.15" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 360.85 359.48 L 373.8 390.08" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 414.2 484.94 L 427.25 515.23" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 374.11 483.61 L 359.15 515.2" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 426.81 358.8 L 413.58 389.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><rect x="424" y="487" width="16" height="16" fill="#008a00" stroke="#005700" pointer-events="all"/><rect x="399" y="497" width="16" height="16" fill="#008a00" stroke="#005700" pointer-events="all"/><rect x="442" y="466" width="16" height="16" fill="#008a00" stroke="#005700" pointer-events="all"/><rect x="453" y="441" width="16" height="16" fill="#008a00" stroke="#005700" pointer-events="all"/><rect x="453" y="417" width="16" height="16" fill="#008a00" stroke="#005700" pointer-events="all"/><rect x="443" y="391" width="16" height="16" fill="#008a00" stroke="#005700" pointer-events="all"/><rect x="424" y="371" width="16" height="16" fill="#008a00" stroke="#005700" pointer-events="all"/><rect x="399" y="361" width="16" height="16" fill="#008a00" stroke="#005700" pointer-events="all"/><path d="M 394 522 L 394 563 L 355.37 563" fill="none" stroke="#005700" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 350.12 563 L 357.12 559.5 L 355.37 563 L 357.12 566.5 Z" fill="#005700" stroke="#005700" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 563px; margin-left: 370px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;"><font style="font-size: 8px;">head=8</font></div></div></div></foreignObject><text x="370" y="566" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">head=8</text></switch></g><path d="M 394 352 L 394 312 L 427.63 312" fill="none" stroke="#006eaf" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 432.88 312 L 425.88 315.5 L 427.63 312 L 425.88 308.5 Z" fill="#006eaf" stroke="#006eaf" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 312px; margin-left: 414px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;"><font style="font-size: 8px;">tail=0</font></div></div></div></foreignObject><text x="414" y="315" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">tail=0</text></switch></g><rect x="283" y="290" width="60" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 58px; height: 1px; padding-top: 305px; margin-left: 285px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">E: peek(4)</div></div></div></foreignObject><text x="285" y="309" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">E: peek(4)</text></switch></g><ellipse cx="658" cy="437" rx="85" ry="85" fill="none" stroke="rgb(0, 0, 0)" pointer-events="all"/><ellipse cx="658" cy="437" rx="51" ry="51" fill="none" stroke="rgb(0, 0, 0)" pointer-events="all"/><path d="M 709 436.93 L 743 437" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 573 436.8 L 607 436.86" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 694.06 400.94 L 718.1 376.9" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 657.8 352 L 657.8 386" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 657.8 488 L 657.8 522" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 597.9 497.1 L 621.94 473.06" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 718.1 497.1 L 694.06 473.06" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 622.3 400.45 L 596.8 377.5" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 705.02 418.23 L 737.05 404.53" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 578.95 469.3 L 610.88 456.69" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 579.63 404.7 L 610.57 418.64" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 705.6 456.55 L 736.2 470.15" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 624.85 359.48 L 637.8 390.08" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 678.2 484.94 L 691.25 515.23" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 638.11 483.61 L 623.15 515.2" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 690.81 358.8 L 677.58 389.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><rect x="688" y="487" width="16" height="16" fill="#008a00" stroke="#005700" pointer-events="all"/><rect x="663" y="497" width="16" height="16" fill="#008a00" stroke="#005700" pointer-events="all"/><rect x="706" y="466" width="16" height="16" fill="#008a00" stroke="#005700" pointer-events="all"/><rect x="717" y="441" width="16" height="16" fill="#008a00" stroke="#005700" pointer-events="all"/><rect x="717" y="417" width="16" height="16" fill="#0050ef" stroke="#001dbc" pointer-events="all"/><rect x="707" y="391" width="16" height="16" fill="#0050ef" stroke="#001dbc" pointer-events="all"/><rect x="688" y="371" width="16" height="16" fill="#0050ef" stroke="#001dbc" pointer-events="all"/><rect x="663" y="361" width="16" height="16" fill="#0050ef" stroke="#001dbc" pointer-events="all"/><path d="M 658 522 L 658 563 L 619.37 563" fill="none" stroke="#005700" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 614.12 563 L 621.12 559.5 L 619.37 563 L 621.12 566.5 Z" fill="#005700" stroke="#005700" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 563px; margin-left: 634px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;"><font style="font-size: 8px;">head=8</font></div></div></div></foreignObject><text x="634" y="566" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">head=8</text></switch></g><path d="M 743 437 L 783 437 L 783 473.63" fill="none" stroke="#006eaf" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 783 478.88 L 779.5 471.88 L 783 473.63 L 786.5 471.88 Z" fill="#006eaf" stroke="#006eaf" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 459px; margin-left: 783px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;"><font style="font-size: 8px;">tail=4</font></div></div></div></foreignObject><text x="783" y="463" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">tail=4</text></switch></g><rect x="263" y="330" width="60" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 58px; height: 1px; padding-top: 345px; margin-left: 263px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: right;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><div style="">deq_len=0<span style="background-color: initial;"><br /></span></div><div style=""><span style="background-color: initial;">available=8</span></div><div style=""><span style="background-color: initial;">tell=0</span></div></div></div></div></foreignObject><text x="321" y="349" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="end">deq_len=0...</text></switch></g><rect x="523" y="330" width="60" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 58px; height: 1px; padding-top: 345px; margin-left: 523px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: right;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><div style="">deq_len=0<span style="background-color: initial;"><br /></span></div><div style=""><span style="background-color: initial;">available=4</span></div><div style=""><span style="background-color: initial;">tell=4</span></div></div></div></div></foreignObject><text x="581" y="349" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="end">deq_len=0...</text></switch></g><rect x="523" y="290" width="60" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 58px; height: 1px; padding-top: 305px; margin-left: 525px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">F: seek(4)</div></div></div></foreignObject><text x="525" y="309" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">F: seek(4)</text></switch></g><rect x="483" y="530" width="20" height="20" fill="#008a00" stroke="#ffffff" pointer-events="all"/><rect x="483" y="550" width="20" height="20" fill="#008a00" stroke="#ffffff" pointer-events="all"/><rect x="483" y="490" width="20" height="20" fill="#008a00" stroke="#ffffff" pointer-events="all"/><rect x="483" y="510" width="20" height="20" fill="#008a00" stroke="#ffffff" pointer-events="all"/><rect x="423" y="513" width="70" height="40" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 533px; margin-left: 458px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;">Returns:<br />(view)</div></div></div></foreignObject><text x="458" y="537" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Returns:...</text></switch></g><path d="M 399 377 L 479.51 499.68" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 482.39 504.07 L 475.62 500.13 L 479.51 499.68 L 481.47 496.29 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 469 425 L 501.44 553.82" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 502.73 558.92 L 497.62 552.98 L 501.44 553.82 L 504.41 551.27 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><ellipse cx="138" cy="744" rx="85" ry="85" fill="none" stroke="rgb(0, 0, 0)" pointer-events="all"/><ellipse cx="138" cy="744" rx="51" ry="51" fill="none" stroke="rgb(0, 0, 0)" pointer-events="all"/><path d="M 189 743.93 L 223 744" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 53 743.8 L 87 743.86" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 174.06 707.94 L 198.1 683.9" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 137.8 659 L 137.8 693" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 137.8 795 L 137.8 829" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 77.9 804.1 L 101.94 780.06" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 198.1 804.1 L 174.06 780.06" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 102.3 707.45 L 76.8 684.5" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 185.02 725.23 L 217.05 711.53" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 58.95 776.3 L 90.88 763.69" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 59.63 711.7 L 90.57 725.64" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 185.6 763.55 L 216.2 777.15" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 104.85 666.48 L 117.8 697.08" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 158.2 791.94 L 171.25 822.23" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 118.11 790.61 L 103.15 822.2" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 170.81 665.8 L 157.58 696.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><rect x="168" y="794" width="16" height="16" fill="#008a00" stroke="#005700" pointer-events="all"/><rect x="143" y="804" width="16" height="16" fill="#008a00" stroke="#005700" pointer-events="all"/><rect x="186" y="773" width="16" height="16" fill="#008a00" stroke="#005700" pointer-events="all"/><rect x="197" y="748" width="16" height="16" fill="#008a00" stroke="#005700" pointer-events="all"/><rect x="197" y="724" width="16" height="16" fill="#0050ef" stroke="#001dbc" pointer-events="all"/><rect x="187" y="698" width="16" height="16" fill="#0050ef" stroke="#001dbc" pointer-events="all"/><rect x="168" y="678" width="16" height="16" fill="#0050ef" stroke="#001dbc" pointer-events="all"/><rect x="143" y="668" width="16" height="16" fill="#0050ef" stroke="#001dbc" pointer-events="all"/><path d="M 138 829 L 138 870 L 99.37 870" fill="none" stroke="#005700" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 94.12 870 L 101.12 866.5 L 99.37 870 L 101.12 873.5 Z" fill="#005700" stroke="#005700" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 870px; margin-left: 114px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;"><font style="font-size: 8px;">head=8</font></div></div></div></foreignObject><text x="114" y="873" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">head=8</text></switch></g><path d="M 223 744 L 263 744 L 263 780.63" fill="none" stroke="#006eaf" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 263 785.88 L 259.5 778.88 L 263 780.63 L 266.5 778.88 Z" fill="#006eaf" stroke="#006eaf" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 766px; margin-left: 263px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;"><font style="font-size: 8px;">tail=4</font></div></div></div></foreignObject><text x="263" y="770" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">tail=4</text></switch></g><rect x="3" y="637" width="60" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 58px; height: 1px; padding-top: 652px; margin-left: 3px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: right;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><div style="">deq_len=4<span style="background-color: initial;"><br /></span></div><div style=""><span style="background-color: initial;">available=8</span></div><div style=""><span style="background-color: initial;">tell=4</span></div></div></div></div></foreignObject><text x="61" y="656" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="end">deq_len=4...</text></switch></g><rect x="3" y="597" width="70" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 68px; height: 1px; padding-top: 612px; margin-left: 5px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">G: write([4])</div></div></div></foreignObject><text x="5" y="616" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">G: write([4...</text></switch></g><rect x="13" y="730" width="20" height="20" fill="#008a00" stroke="#ffffff" pointer-events="all"/><rect x="13" y="750" width="20" height="20" fill="#008a00" stroke="#ffffff" pointer-events="all"/><rect x="13" y="690" width="20" height="20" fill="#008a00" stroke="#ffffff" pointer-events="all"/><rect x="13" y="710" width="20" height="20" fill="#008a00" stroke="#ffffff" pointer-events="all"/><ellipse cx="433" cy="751" rx="85" ry="85" fill="none" stroke="rgb(0, 0, 0)" pointer-events="all"/><ellipse cx="433" cy="751" rx="51" ry="51" fill="none" stroke="rgb(0, 0, 0)" pointer-events="all"/><path d="M 484 750.93 L 518 751" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 348 750.8 L 382 750.86" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 469.06 714.94 L 493.1 690.9" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 432.8 666 L 432.8 700" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 432.8 802 L 432.8 836" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 372.9 811.1 L 396.94 787.06" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 493.1 811.1 L 469.06 787.06" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 397.3 714.45 L 371.8 691.5" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 480.02 732.23 L 512.05 718.53" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 353.95 783.3 L 385.88 770.69" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 354.63 718.7 L 385.57 732.64" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 480.6 770.55 L 511.2 784.15" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 399.85 673.48 L 412.8 704.08" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 453.2 798.94 L 466.25 829.23" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 413.11 797.61 L 398.15 829.2" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 465.81 672.8 L 452.58 703.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><rect x="463" y="801" width="16" height="16" fill="#0050ef" stroke="#001dbc" pointer-events="all"/><rect x="438" y="811" width="16" height="16" fill="#0050ef" stroke="#001dbc" pointer-events="all"/><rect x="481" y="780" width="16" height="16" fill="#0050ef" stroke="#001dbc" pointer-events="all"/><rect x="492" y="755" width="16" height="16" fill="#0050ef" stroke="#001dbc" pointer-events="all"/><rect x="492" y="731" width="16" height="16" fill="#0050ef" stroke="#001dbc" pointer-events="all"/><rect x="482" y="705" width="16" height="16" fill="#0050ef" stroke="#001dbc" pointer-events="all"/><rect x="463" y="685" width="16" height="16" fill="#0050ef" stroke="#001dbc" pointer-events="all"/><rect x="438" y="675" width="16" height="16" fill="#0050ef" stroke="#001dbc" pointer-events="all"/><rect x="508" y="867" width="20" height="20" fill="#0050ef" stroke="#001dbc" pointer-events="all"/><rect x="508" y="887" width="20" height="20" fill="#0050ef" stroke="#001dbc" pointer-events="all"/><rect x="508" y="827" width="20" height="20" fill="#0050ef" stroke="#001dbc" pointer-events="all"/><rect x="508" y="847" width="20" height="20" fill="#0050ef" stroke="#001dbc" pointer-events="all"/><path d="M 508 755 L 526.3 820.86" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 527.7 825.92 L 522.45 820.11 L 526.3 820.86 L 529.2 818.24 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 463 809 L 504.49 871.69" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 507.38 876.07 L 500.6 872.16 L 504.49 871.69 L 506.44 868.3 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="448" y="867" width="70" height="40" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 887px; margin-left: 483px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;">Returns:<br />(view)</div></div></div></foreignObject><text x="483" y="891" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Returns:...</text></switch></g><path d="M 433 836 L 433 877 L 399.37 877" fill="none" stroke="#005700" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 394.12 877 L 401.12 873.5 L 399.37 877 L 401.12 880.5 Z" fill="#005700" stroke="#005700" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 877px; margin-left: 413px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;"><font style="font-size: 8px;">head=8</font></div></div></div></foreignObject><text x="413" y="880" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">head=8</text></switch></g><path d="M 433 860 L 433 900 L 399.37 900" fill="none" stroke="#006eaf" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 394.12 900 L 401.12 896.5 L 399.37 900 L 401.12 903.5 Z" fill="#006eaf" stroke="#006eaf" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 900px; margin-left: 413px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;"><font style="font-size: 8px;">tail=8</font></div></div></div></foreignObject><text x="413" y="903" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">tail=8</text></switch></g><rect x="297" y="644" width="60" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 58px; height: 1px; padding-top: 659px; margin-left: 297px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: right;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><div style="">deq_len=4<span style="background-color: initial;"><br /></span></div><div style=""><span style="background-color: initial;">available=4</span></div><div style=""><span style="background-color: initial;">tell=8</span></div></div></div></div></foreignObject><text x="355" y="663" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="end">deq_len=4...</text></switch></g><rect x="297" y="604" width="116" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 114px; height: 1px; padding-top: 619px; margin-left: 299px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">H: read(4)<br />(peek(4) &amp; seek(4))</div></div></div></foreignObject><text x="299" y="623" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">H: read(4)...</text></switch></g><rect x="307" y="737" width="20" height="20" fill="#008a00" stroke="#ffffff" pointer-events="all"/><rect x="307" y="757" width="20" height="20" fill="#008a00" stroke="#ffffff" pointer-events="all"/><rect x="307" y="697" width="20" height="20" fill="#008a00" stroke="#ffffff" pointer-events="all"/><rect x="307" y="717" width="20" height="20" fill="#008a00" stroke="#ffffff" pointer-events="all"/><rect x="534" y="211" width="20" height="20" fill="#008a00" stroke="#ffffff" pointer-events="all"/><rect x="534" y="231" width="20" height="20" fill="#008a00" stroke="#ffffff" pointer-events="all"/><rect x="534" y="171" width="20" height="20" fill="#008a00" stroke="#ffffff" pointer-events="all"/><rect x="534" y="191" width="20" height="20" fill="#008a00" stroke="#ffffff" pointer-events="all"/></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg>