@jtarrio/webrtlsdr 3.0.0 → 3.0.2

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 (111) hide show
  1. package/dist/demod/demod-am.d.ts +54 -0
  2. package/dist/demod/demod-am.d.ts.map +1 -0
  3. package/dist/demod/demod-am.js +113 -0
  4. package/dist/demod/demod-am.js.map +1 -0
  5. package/dist/demod/demod-cw.d.ts +48 -0
  6. package/dist/demod/demod-cw.d.ts.map +1 -0
  7. package/dist/demod/demod-cw.js +101 -0
  8. package/dist/demod/demod-cw.js.map +1 -0
  9. package/dist/demod/demod-nbfm.d.ts +54 -0
  10. package/dist/demod/demod-nbfm.d.ts.map +1 -0
  11. package/dist/demod/demod-nbfm.js +114 -0
  12. package/dist/demod/demod-nbfm.js.map +1 -0
  13. package/dist/demod/demod-ssb.d.ts +55 -0
  14. package/dist/demod/demod-ssb.d.ts.map +1 -0
  15. package/dist/demod/demod-ssb.js +112 -0
  16. package/dist/demod/demod-ssb.js.map +1 -0
  17. package/dist/demod/demod-wbfm.d.ts +113 -0
  18. package/dist/demod/demod-wbfm.d.ts.map +1 -0
  19. package/dist/demod/demod-wbfm.js +212 -0
  20. package/dist/demod/demod-wbfm.js.map +1 -0
  21. package/dist/demod/demodulator.d.ts +3 -0
  22. package/dist/demod/demodulator.d.ts.map +1 -0
  23. package/dist/demod/demodulator.js +28 -0
  24. package/dist/demod/demodulator.js.map +1 -0
  25. package/dist/demod/empty-demodulator.d.ts +82 -0
  26. package/dist/demod/empty-demodulator.d.ts.map +1 -0
  27. package/dist/demod/empty-demodulator.js +149 -0
  28. package/dist/demod/empty-demodulator.js.map +1 -0
  29. package/dist/demod/modes.d.ts +107 -0
  30. package/dist/demod/modes.d.ts.map +1 -0
  31. package/dist/demod/modes.js +101 -0
  32. package/dist/demod/modes.js.map +1 -0
  33. package/dist/demod/player.d.ts +19 -0
  34. package/dist/demod/player.d.ts.map +1 -0
  35. package/dist/demod/player.js +15 -0
  36. package/dist/demod/player.js.map +1 -0
  37. package/dist/demod/sample-counter.d.ts +22 -0
  38. package/dist/demod/sample-counter.d.ts.map +1 -0
  39. package/dist/demod/sample-counter.js +57 -0
  40. package/dist/demod/sample-counter.js.map +1 -0
  41. package/dist/demod/spectrum.d.ts +23 -0
  42. package/dist/demod/spectrum.d.ts.map +1 -0
  43. package/dist/demod/spectrum.js +78 -0
  44. package/dist/demod/spectrum.js.map +1 -0
  45. package/dist/dsp/buffers.d.ts +72 -0
  46. package/dist/dsp/buffers.d.ts.map +1 -0
  47. package/dist/dsp/buffers.js +122 -0
  48. package/dist/dsp/buffers.js.map +1 -0
  49. package/dist/dsp/coefficients.d.ts +22 -0
  50. package/dist/dsp/coefficients.d.ts.map +1 -0
  51. package/dist/dsp/coefficients.js +77 -0
  52. package/dist/dsp/coefficients.js.map +1 -0
  53. package/dist/dsp/converters.d.ts +15 -0
  54. package/dist/dsp/converters.d.ts.map +1 -0
  55. package/dist/dsp/converters.js +43 -0
  56. package/dist/dsp/converters.js.map +1 -0
  57. package/dist/dsp/demodulators.d.ts +73 -0
  58. package/dist/dsp/demodulators.d.ts.map +1 -0
  59. package/dist/dsp/demodulators.js +244 -0
  60. package/dist/dsp/demodulators.js.map +1 -0
  61. package/dist/dsp/fft.d.ts +53 -0
  62. package/dist/dsp/fft.d.ts.map +1 -0
  63. package/dist/dsp/fft.js +175 -0
  64. package/dist/dsp/fft.js.map +1 -0
  65. package/dist/dsp/filters.d.ts +91 -0
  66. package/dist/dsp/filters.d.ts.map +1 -0
  67. package/dist/dsp/filters.js +250 -0
  68. package/dist/dsp/filters.js.map +1 -0
  69. package/dist/dsp/power.d.ts +2 -0
  70. package/dist/dsp/power.d.ts.map +1 -0
  71. package/dist/dsp/power.js +23 -0
  72. package/dist/dsp/power.js.map +1 -0
  73. package/dist/dsp/resamplers.d.ts +33 -0
  74. package/dist/dsp/resamplers.d.ts.map +1 -0
  75. package/dist/dsp/resamplers.js +91 -0
  76. package/dist/dsp/resamplers.js.map +1 -0
  77. package/dist/errors.d.ts +2 -1
  78. package/dist/errors.d.ts.map +1 -1
  79. package/dist/errors.js +1 -0
  80. package/dist/errors.js.map +1 -1
  81. package/dist/players/audioplayer.d.ts +34 -0
  82. package/dist/players/audioplayer.d.ts.map +1 -0
  83. package/dist/players/audioplayer.js +71 -0
  84. package/dist/players/audioplayer.js.map +1 -0
  85. package/dist/radio/msgqueue.d.ts +23 -0
  86. package/dist/radio/msgqueue.d.ts.map +1 -0
  87. package/dist/radio/msgqueue.js +52 -0
  88. package/dist/radio/msgqueue.js.map +1 -0
  89. package/dist/radio/radio.d.ts +63 -22
  90. package/dist/radio/radio.d.ts.map +1 -1
  91. package/dist/radio/radio.js +255 -41
  92. package/dist/radio/radio.js.map +1 -1
  93. package/dist/radio/sample_receiver.d.ts +19 -0
  94. package/dist/radio/sample_receiver.d.ts.map +1 -0
  95. package/dist/radio/sample_receiver.js +54 -0
  96. package/dist/radio/sample_receiver.js.map +1 -0
  97. package/dist/radio.d.ts +1 -2
  98. package/dist/radio.d.ts.map +1 -1
  99. package/dist/radio.js +1 -1
  100. package/dist/radio.js.map +1 -1
  101. package/dist/rtlsdr/rtl2832u.d.ts +10 -1
  102. package/dist/rtlsdr/rtl2832u.d.ts.map +1 -1
  103. package/dist/rtlsdr/rtl2832u.js +6 -4
  104. package/dist/rtlsdr/rtl2832u.js.map +1 -1
  105. package/dist/rtlsdr/rtlcom.d.ts.map +1 -1
  106. package/dist/rtlsdr/rtlcom.js.map +1 -1
  107. package/package.json +2 -2
  108. package/dist/radio/source.d.ts +0 -25
  109. package/dist/radio/source.d.ts.map +0 -1
  110. package/dist/radio/source.js +0 -69
  111. package/dist/radio/source.js.map +0 -1
@@ -0,0 +1,54 @@
1
+ import { Configurator, Demod, Demodulated } from "./modes.js";
2
+ /** Mode parameters for AM. */
3
+ export type ModeAM = {
4
+ scheme: "AM";
5
+ bandwidth: number;
6
+ squelch: number;
7
+ };
8
+ /** Mode options for AM. */
9
+ export type OptionsAM = {
10
+ /** Number of taps for the downsampler filter. Must be an odd number. 151 by default. */
11
+ downsamplerTaps?: number;
12
+ /** Number of taps for the RF filter. Must be an odd number. 151 by default. */
13
+ rfTaps?: number;
14
+ };
15
+ /** A demodulator for amplitude modulated signals. */
16
+ export declare class DemodAM implements Demod<ModeAM> {
17
+ private outRate;
18
+ private mode;
19
+ /**
20
+ * @param inRate The sample rate of the input samples.
21
+ * @param outRate The sample rate of the output audio.
22
+ * @param mode The mode to use initially.
23
+ * @param options Options for the demodulator.
24
+ */
25
+ constructor(inRate: number, outRate: number, mode: ModeAM, options?: OptionsAM);
26
+ private rfTaps;
27
+ private shifter;
28
+ private downsampler;
29
+ private filterI;
30
+ private filterQ;
31
+ private demodulator;
32
+ getMode(): ModeAM;
33
+ setMode(mode: ModeAM): void;
34
+ /**
35
+ * Demodulates the signal.
36
+ * @param samplesI The I components of the samples.
37
+ * @param samplesQ The Q components of the samples.
38
+ * @param freqOffset The offset of the signal in the samples.
39
+ * @returns The demodulated audio signal.
40
+ */
41
+ demodulate(samplesI: Float32Array, samplesQ: Float32Array, freqOffset: number): Demodulated;
42
+ }
43
+ /** Configurator for the AM mode. */
44
+ export declare class ConfigAM extends Configurator<ModeAM> {
45
+ constructor(mode: ModeAM | string);
46
+ protected create(): ModeAM;
47
+ hasBandwidth(): boolean;
48
+ getBandwidth(): number;
49
+ setBandwidth(bandwidth: number): ConfigAM;
50
+ hasSquelch(): boolean;
51
+ getSquelch(): number;
52
+ setSquelch(squelch: number): ConfigAM;
53
+ }
54
+ //# sourceMappingURL=demod-am.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demod-am.d.ts","sourceRoot":"","sources":["../../src/demod/demod-am.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9D,8BAA8B;AAC9B,MAAM,MAAM,MAAM,GAAG;IAAE,MAAM,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1E,2BAA2B;AAC3B,MAAM,MAAM,SAAS,GAAG;IACtB,wFAAwF;IACxF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,+EAA+E;IAC/E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,qDAAqD;AACrD,qBAAa,OAAQ,YAAW,KAAK,CAAC,MAAM,CAAC;IASzC,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,IAAI;IATd;;;;;OAKG;gBAED,MAAM,EAAE,MAAM,EACN,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,SAAS;IAgBrB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,OAAO,CAAY;IAC3B,OAAO,CAAC,OAAO,CAAY;IAC3B,OAAO,CAAC,WAAW,CAAgB;IAEnC,OAAO,IAAI,MAAM;IAIjB,OAAO,CAAC,IAAI,EAAE,MAAM;IAWpB;;;;;;OAMG;IACH,UAAU,CACR,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,YAAY,EACtB,UAAU,EAAE,MAAM,GACjB,WAAW;CAef;AAED,oCAAoC;AACpC,qBAAa,QAAS,SAAQ,YAAY,CAAC,MAAM,CAAC;gBACpC,IAAI,EAAE,MAAM,GAAG,MAAM;IAGjC,SAAS,CAAC,MAAM,IAAI,MAAM;IAG1B,YAAY,IAAI,OAAO;IAGvB,YAAY,IAAI,MAAM;IAGtB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,QAAQ;IAOzC,UAAU,IAAI,OAAO;IAGrB,UAAU,IAAI,MAAM;IAGpB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ;CAItC"}
@@ -0,0 +1,113 @@
1
+ // Copyright 2026 Jacobo Tarrio Barreiro. All rights reserved.
2
+ // Copyright 2014 Google Inc. All rights reserved.
3
+ //
4
+ // Licensed under the Apache License, Version 2.0 (the "License");
5
+ // you may not use this file except in compliance with the License.
6
+ // You may obtain a copy of the License at
7
+ //
8
+ // http://www.apache.org/licenses/LICENSE-2.0
9
+ //
10
+ // Unless required by applicable law or agreed to in writing, software
11
+ // distributed under the License is distributed on an "AS IS" BASIS,
12
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ // See the License for the specific language governing permissions and
14
+ // limitations under the License.
15
+ import { makeLowPassKernel } from "../dsp/coefficients.js";
16
+ import { AMDemodulator } from "../dsp/demodulators.js";
17
+ import { FrequencyShifter, FIRFilter } from "../dsp/filters.js";
18
+ import { getPower } from "../dsp/power.js";
19
+ import { ComplexDownsampler } from "../dsp/resamplers.js";
20
+ import { Configurator } from "./modes.js";
21
+ /** A demodulator for amplitude modulated signals. */
22
+ export class DemodAM {
23
+ outRate;
24
+ mode;
25
+ /**
26
+ * @param inRate The sample rate of the input samples.
27
+ * @param outRate The sample rate of the output audio.
28
+ * @param mode The mode to use initially.
29
+ * @param options Options for the demodulator.
30
+ */
31
+ constructor(inRate, outRate, mode, options) {
32
+ this.outRate = outRate;
33
+ this.mode = mode;
34
+ const downsamplerTaps = options?.downsamplerTaps || 151;
35
+ this.rfTaps = options?.rfTaps || 151;
36
+ this.shifter = new FrequencyShifter(inRate);
37
+ this.downsampler = new ComplexDownsampler(inRate, outRate, downsamplerTaps);
38
+ const kernel = makeLowPassKernel(outRate, this.mode.bandwidth / 2, this.rfTaps);
39
+ this.filterI = new FIRFilter(kernel);
40
+ this.filterQ = new FIRFilter(kernel);
41
+ this.demodulator = new AMDemodulator(outRate);
42
+ }
43
+ rfTaps;
44
+ shifter;
45
+ downsampler;
46
+ filterI;
47
+ filterQ;
48
+ demodulator;
49
+ getMode() {
50
+ return this.mode;
51
+ }
52
+ setMode(mode) {
53
+ this.mode = mode;
54
+ const kernel = makeLowPassKernel(this.outRate, mode.bandwidth / 2, this.rfTaps);
55
+ this.filterI.setCoefficients(kernel);
56
+ this.filterQ.setCoefficients(kernel);
57
+ }
58
+ /**
59
+ * Demodulates the signal.
60
+ * @param samplesI The I components of the samples.
61
+ * @param samplesQ The Q components of the samples.
62
+ * @param freqOffset The offset of the signal in the samples.
63
+ * @returns The demodulated audio signal.
64
+ */
65
+ demodulate(samplesI, samplesQ, freqOffset) {
66
+ this.shifter.inPlace(samplesI, samplesQ, -freqOffset);
67
+ const [I, Q] = this.downsampler.downsample(samplesI, samplesQ);
68
+ let allPower = getPower(I, Q);
69
+ this.filterI.inPlace(I);
70
+ this.filterQ.inPlace(Q);
71
+ let signalPower = (getPower(I, Q) * this.outRate) / this.mode.bandwidth;
72
+ this.demodulator.demodulate(I, Q, I);
73
+ return {
74
+ left: I,
75
+ right: new Float32Array(I),
76
+ stereo: false,
77
+ snr: signalPower / allPower,
78
+ };
79
+ }
80
+ }
81
+ /** Configurator for the AM mode. */
82
+ export class ConfigAM extends Configurator {
83
+ constructor(mode) {
84
+ super(mode);
85
+ }
86
+ create() {
87
+ return { scheme: "AM", bandwidth: 15000, squelch: 0 };
88
+ }
89
+ hasBandwidth() {
90
+ return true;
91
+ }
92
+ getBandwidth() {
93
+ return this.mode.bandwidth;
94
+ }
95
+ setBandwidth(bandwidth) {
96
+ this.mode = {
97
+ ...this.mode,
98
+ bandwidth: Math.max(250, Math.min(bandwidth, 30000)),
99
+ };
100
+ return this;
101
+ }
102
+ hasSquelch() {
103
+ return true;
104
+ }
105
+ getSquelch() {
106
+ return this.mode.squelch;
107
+ }
108
+ setSquelch(squelch) {
109
+ this.mode = { ...this.mode, squelch: Math.max(0, Math.min(squelch, 6)) };
110
+ return this;
111
+ }
112
+ }
113
+ //# sourceMappingURL=demod-am.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demod-am.js","sourceRoot":"","sources":["../../src/demod/demod-am.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,kDAAkD;AAClD,EAAE;AACF,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,iDAAiD;AACjD,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAEjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAsB,MAAM,YAAY,CAAC;AAa9D,qDAAqD;AACrD,MAAM,OAAO,OAAO;IASR;IACA;IATV;;;;;OAKG;IACH,YACE,MAAc,EACN,OAAe,EACf,IAAY,EACpB,OAAmB;QAFX,YAAO,GAAP,OAAO,CAAQ;QACf,SAAI,GAAJ,IAAI,CAAQ;QAGpB,MAAM,eAAe,GAAG,OAAO,EAAE,eAAe,IAAI,GAAG,CAAC;QACxD,IAAI,CAAC,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,GAAG,CAAC;QACrC,IAAI,CAAC,OAAO,GAAG,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,CAAC,WAAW,GAAG,IAAI,kBAAkB,CAAC,MAAM,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;QAC5E,MAAM,MAAM,GAAG,iBAAiB,CAC9B,OAAO,EACP,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,EACvB,IAAI,CAAC,MAAM,CACZ,CAAC;QACF,IAAI,CAAC,OAAO,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,CAAC,OAAO,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,CAAC,WAAW,GAAG,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;IAChD,CAAC;IAEO,MAAM,CAAS;IACf,OAAO,CAAmB;IAC1B,WAAW,CAAqB;IAChC,OAAO,CAAY;IACnB,OAAO,CAAY;IACnB,WAAW,CAAgB;IAEnC,OAAO;QACL,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,OAAO,CAAC,IAAY;QAClB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,MAAM,MAAM,GAAG,iBAAiB,CAC9B,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,SAAS,GAAG,CAAC,EAClB,IAAI,CAAC,MAAM,CACZ,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAED;;;;;;OAMG;IACH,UAAU,CACR,QAAsB,EACtB,QAAsB,EACtB,UAAkB;QAElB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,UAAU,CAAC,CAAC;QACtD,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC/D,IAAI,QAAQ,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9B,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,WAAW,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;QACxE,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACrC,OAAO;YACL,IAAI,EAAE,CAAC;YACP,KAAK,EAAE,IAAI,YAAY,CAAC,CAAC,CAAC;YAC1B,MAAM,EAAE,KAAK;YACb,GAAG,EAAE,WAAW,GAAG,QAAQ;SAC5B,CAAC;IACJ,CAAC;CACF;AAED,oCAAoC;AACpC,MAAM,OAAO,QAAS,SAAQ,YAAoB;IAChD,YAAY,IAAqB;QAC/B,KAAK,CAAC,IAAI,CAAC,CAAC;IACd,CAAC;IACS,MAAM;QACd,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IACxD,CAAC;IACD,YAAY;QACV,OAAO,IAAI,CAAC;IACd,CAAC;IACD,YAAY;QACV,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;IAC7B,CAAC;IACD,YAAY,CAAC,SAAiB;QAC5B,IAAI,CAAC,IAAI,GAAG;YACV,GAAG,IAAI,CAAC,IAAI;YACZ,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;SACrD,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IACD,UAAU;QACR,OAAO,IAAI,CAAC;IACd,CAAC;IACD,UAAU;QACR,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;IAC3B,CAAC;IACD,UAAU,CAAC,OAAe;QACxB,IAAI,CAAC,IAAI,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzE,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
@@ -0,0 +1,48 @@
1
+ import { Configurator, Demod, Demodulated } from "./modes.js";
2
+ /** Mode parameters for CW. */
3
+ export type ModeCW = {
4
+ scheme: "CW";
5
+ bandwidth: number;
6
+ };
7
+ /** Mode options for CW. */
8
+ export type OptionsCW = {
9
+ /** Tone frequency of the zero-beat CW signals, in Hertz. 600 by default. */
10
+ toneFrequency?: number;
11
+ /** Number of taps for the downsampler filter. Must be an odd number. 151 by default. */
12
+ downsamplerTaps?: number;
13
+ /** Number of taps for the audio filter. Must be an odd number. 351 by default. */
14
+ audioTaps?: number;
15
+ };
16
+ /** A demodulator for continuous wave signals. */
17
+ export declare class DemodCW implements Demod<ModeCW> {
18
+ private outRate;
19
+ private mode;
20
+ /**
21
+ * @param inRate The sample rate of the input samples.
22
+ * @param outRate The sample rate of the output audio.
23
+ * @param mode The mode to use initially.
24
+ * @param options Options for the demodulator.
25
+ */
26
+ constructor(inRate: number, outRate: number, mode: ModeCW, options?: OptionsCW);
27
+ private audioTaps;
28
+ private shifter;
29
+ private downsampler;
30
+ private filterI;
31
+ private filterQ;
32
+ private toneShifter;
33
+ private toneFrequency;
34
+ private agc;
35
+ getMode(): ModeCW;
36
+ setMode(mode: ModeCW): void;
37
+ /** Demodulates the given I/Q samples into the real output. */
38
+ demodulate(samplesI: Float32Array, samplesQ: Float32Array, freqOffset: number): Demodulated;
39
+ }
40
+ /** Configurator for the CW mode. */
41
+ export declare class ConfigCW extends Configurator<ModeCW> {
42
+ constructor(mode: ModeCW | string);
43
+ protected create(): ModeCW;
44
+ hasBandwidth(): boolean;
45
+ getBandwidth(): number;
46
+ setBandwidth(bandwidth: number): ConfigCW;
47
+ }
48
+ //# sourceMappingURL=demod-cw.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demod-cw.d.ts","sourceRoot":"","sources":["../../src/demod/demod-cw.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9D,8BAA8B;AAC9B,MAAM,MAAM,MAAM,GAAG;IAAE,MAAM,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzD,2BAA2B;AAC3B,MAAM,MAAM,SAAS,GAAG;IACtB,4EAA4E;IAC5E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wFAAwF;IACxF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kFAAkF;IAClF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,iDAAiD;AACjD,qBAAa,OAAQ,YAAW,KAAK,CAAC,MAAM,CAAC;IASzC,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,IAAI;IATd;;;;;OAKG;gBAED,MAAM,EAAE,MAAM,EACN,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,SAAS;IAmBrB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,OAAO,CAAY;IAC3B,OAAO,CAAC,OAAO,CAAY;IAC3B,OAAO,CAAC,WAAW,CAAmB;IACtC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,GAAG,CAAM;IAEjB,OAAO,IAAI,MAAM;IAIjB,OAAO,CAAC,IAAI,EAAE,MAAM;IAWpB,8DAA8D;IAC9D,UAAU,CACR,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,YAAY,EACtB,UAAU,EAAE,MAAM,GACjB,WAAW;CAgBf;AAED,oCAAoC;AACpC,qBAAa,QAAS,SAAQ,YAAY,CAAC,MAAM,CAAC;gBACpC,IAAI,EAAE,MAAM,GAAG,MAAM;IAGjC,SAAS,CAAC,MAAM,IAAI,MAAM;IAG1B,YAAY,IAAI,OAAO;IAGvB,YAAY,IAAI,MAAM;IAGtB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,QAAQ;CAO1C"}
@@ -0,0 +1,101 @@
1
+ // Copyright 2024 Jacobo Tarrio Barreiro. All rights reserved.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ import { makeLowPassKernel } from "../dsp/coefficients.js";
15
+ import { AGC, FIRFilter, FrequencyShifter } from "../dsp/filters.js";
16
+ import { getPower } from "../dsp/power.js";
17
+ import { ComplexDownsampler } from "../dsp/resamplers.js";
18
+ import { Configurator } from "./modes.js";
19
+ /** A demodulator for continuous wave signals. */
20
+ export class DemodCW {
21
+ outRate;
22
+ mode;
23
+ /**
24
+ * @param inRate The sample rate of the input samples.
25
+ * @param outRate The sample rate of the output audio.
26
+ * @param mode The mode to use initially.
27
+ * @param options Options for the demodulator.
28
+ */
29
+ constructor(inRate, outRate, mode, options) {
30
+ this.outRate = outRate;
31
+ this.mode = mode;
32
+ const downsamplerTaps = options?.downsamplerTaps || 151;
33
+ this.audioTaps = options?.audioTaps || 351;
34
+ const toneFrequency = options?.toneFrequency || 600;
35
+ this.shifter = new FrequencyShifter(inRate);
36
+ this.downsampler = new ComplexDownsampler(inRate, outRate, downsamplerTaps);
37
+ const kernel = makeLowPassKernel(outRate, mode.bandwidth / 2, this.audioTaps);
38
+ this.filterI = new FIRFilter(kernel);
39
+ this.filterQ = new FIRFilter(kernel);
40
+ this.toneShifter = new FrequencyShifter(outRate);
41
+ this.toneFrequency = toneFrequency;
42
+ this.agc = new AGC(outRate, 10);
43
+ }
44
+ audioTaps;
45
+ shifter;
46
+ downsampler;
47
+ filterI;
48
+ filterQ;
49
+ toneShifter;
50
+ toneFrequency;
51
+ agc;
52
+ getMode() {
53
+ return this.mode;
54
+ }
55
+ setMode(mode) {
56
+ this.mode = mode;
57
+ const kernel = makeLowPassKernel(this.outRate, mode.bandwidth / 2, this.audioTaps);
58
+ this.filterI.setCoefficients(kernel);
59
+ this.filterQ.setCoefficients(kernel);
60
+ }
61
+ /** Demodulates the given I/Q samples into the real output. */
62
+ demodulate(samplesI, samplesQ, freqOffset) {
63
+ this.shifter.inPlace(samplesI, samplesQ, -freqOffset);
64
+ const [I, Q] = this.downsampler.downsample(samplesI, samplesQ);
65
+ let allPower = getPower(I, Q);
66
+ this.filterI.inPlace(I);
67
+ this.filterQ.inPlace(Q);
68
+ let signalPower = (getPower(I, Q) * this.outRate) / this.mode.bandwidth;
69
+ this.toneShifter.inPlace(I, Q, this.toneFrequency);
70
+ this.agc.inPlace(I);
71
+ return {
72
+ left: I,
73
+ right: new Float32Array(I),
74
+ stereo: false,
75
+ snr: signalPower / allPower,
76
+ };
77
+ }
78
+ }
79
+ /** Configurator for the CW mode. */
80
+ export class ConfigCW extends Configurator {
81
+ constructor(mode) {
82
+ super(mode);
83
+ }
84
+ create() {
85
+ return { scheme: "CW", bandwidth: 50 };
86
+ }
87
+ hasBandwidth() {
88
+ return true;
89
+ }
90
+ getBandwidth() {
91
+ return this.mode.bandwidth;
92
+ }
93
+ setBandwidth(bandwidth) {
94
+ this.mode = {
95
+ ...this.mode,
96
+ bandwidth: Math.max(5, Math.min(bandwidth, 1000)),
97
+ };
98
+ return this;
99
+ }
100
+ }
101
+ //# sourceMappingURL=demod-cw.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demod-cw.js","sourceRoot":"","sources":["../../src/demod/demod-cw.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import { Configurator, Demod, Demodulated } from "./modes.js";
2
+ /** Mode parameters for NBFM. */
3
+ export type ModeNBFM = {
4
+ scheme: "NBFM";
5
+ maxF: number;
6
+ squelch: number;
7
+ };
8
+ /** Mode options for NBFM. */
9
+ export type OptionsNBFM = {
10
+ /** Number of taps for the downsampler filter. Must be an odd number. 151 by default. */
11
+ downsamplerTaps?: number;
12
+ /** Number of taps for the RF filter. Must be an odd number. 151 by default. */
13
+ rfTaps?: number;
14
+ };
15
+ /** A demodulator for narrowband FM signals. */
16
+ export declare class DemodNBFM implements Demod<ModeNBFM> {
17
+ private outRate;
18
+ private mode;
19
+ /**
20
+ * @param inRate The sample rate of the input samples.
21
+ * @param outRate The sample rate of the output audio.
22
+ * @param mode The mode to use initially.
23
+ * @param options Options for the demodulator.
24
+ */
25
+ constructor(inRate: number, outRate: number, mode: ModeNBFM, options?: OptionsNBFM);
26
+ private rfTaps;
27
+ private shifter;
28
+ private downsampler;
29
+ private filterI;
30
+ private filterQ;
31
+ private demodulator;
32
+ getMode(): ModeNBFM;
33
+ setMode(mode: ModeNBFM): void;
34
+ /**
35
+ * Demodulates the signal.
36
+ * @param samplesI The I components of the samples.
37
+ * @param samplesQ The Q components of the samples.
38
+ * @param freqOffset The offset of the signal in the samples.
39
+ * @returns The demodulated audio signal.
40
+ */
41
+ demodulate(samplesI: Float32Array, samplesQ: Float32Array, freqOffset: number): Demodulated;
42
+ }
43
+ /** Configurator for the NBFM mode. */
44
+ export declare class ConfigNBFM extends Configurator<ModeNBFM> {
45
+ constructor(mode: ModeNBFM | string);
46
+ protected create(): ModeNBFM;
47
+ hasBandwidth(): boolean;
48
+ getBandwidth(): number;
49
+ setBandwidth(bandwidth: number): ConfigNBFM;
50
+ hasSquelch(): boolean;
51
+ getSquelch(): number;
52
+ setSquelch(squelch: number): ConfigNBFM;
53
+ }
54
+ //# sourceMappingURL=demod-nbfm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demod-nbfm.d.ts","sourceRoot":"","sources":["../../src/demod/demod-nbfm.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9D,gCAAgC;AAChC,MAAM,MAAM,QAAQ,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzE,6BAA6B;AAC7B,MAAM,MAAM,WAAW,GAAG;IACxB,wFAAwF;IACxF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,+EAA+E;IAC/E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,+CAA+C;AAC/C,qBAAa,SAAU,YAAW,KAAK,CAAC,QAAQ,CAAC;IAS7C,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,IAAI;IATd;;;;;OAKG;gBAED,MAAM,EAAE,MAAM,EACN,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,QAAQ,EACtB,OAAO,CAAC,EAAE,WAAW;IAYvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,OAAO,CAAY;IAC3B,OAAO,CAAC,OAAO,CAAY;IAC3B,OAAO,CAAC,WAAW,CAAgB;IAEnC,OAAO,IAAI,QAAQ;IAInB,OAAO,CAAC,IAAI,EAAE,QAAQ;IAQtB;;;;;;OAMG;IACH,UAAU,CACR,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,YAAY,EACtB,UAAU,EAAE,MAAM,GACjB,WAAW;CAef;AAED,sCAAsC;AACtC,qBAAa,UAAW,SAAQ,YAAY,CAAC,QAAQ,CAAC;gBACxC,IAAI,EAAE,QAAQ,GAAG,MAAM;IAGnC,SAAS,CAAC,MAAM,IAAI,QAAQ;IAG5B,YAAY,IAAI,OAAO;IAGvB,YAAY,IAAI,MAAM;IAGtB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU;IAO3C,UAAU,IAAI,OAAO;IAGrB,UAAU,IAAI,MAAM;IAGpB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU;CAIxC"}
@@ -0,0 +1,114 @@
1
+ // Copyright 2026 Jacobo Tarrio Barreiro. All rights reserved.
2
+ // Copyright 2014 Google Inc. All rights reserved.
3
+ //
4
+ // Licensed under the Apache License, Version 2.0 (the "License");
5
+ // you may not use this file except in compliance with the License.
6
+ // You may obtain a copy of the License at
7
+ //
8
+ // http://www.apache.org/licenses/LICENSE-2.0
9
+ //
10
+ // Unless required by applicable law or agreed to in writing, software
11
+ // distributed under the License is distributed on an "AS IS" BASIS,
12
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ // See the License for the specific language governing permissions and
14
+ // limitations under the License.
15
+ import { makeLowPassKernel } from "../dsp/coefficients.js";
16
+ import { FMDemodulator } from "../dsp/demodulators.js";
17
+ import { FIRFilter, FrequencyShifter } from "../dsp/filters.js";
18
+ import { getPower } from "../dsp/power.js";
19
+ import { ComplexDownsampler } from "../dsp/resamplers.js";
20
+ import { Configurator } from "./modes.js";
21
+ /** A demodulator for narrowband FM signals. */
22
+ export class DemodNBFM {
23
+ outRate;
24
+ mode;
25
+ /**
26
+ * @param inRate The sample rate of the input samples.
27
+ * @param outRate The sample rate of the output audio.
28
+ * @param mode The mode to use initially.
29
+ * @param options Options for the demodulator.
30
+ */
31
+ constructor(inRate, outRate, mode, options) {
32
+ this.outRate = outRate;
33
+ this.mode = mode;
34
+ const downsamplerTaps = options?.downsamplerTaps || 151;
35
+ this.rfTaps = options?.rfTaps || 151;
36
+ this.shifter = new FrequencyShifter(inRate);
37
+ this.downsampler = new ComplexDownsampler(inRate, outRate, downsamplerTaps);
38
+ const kernel = makeLowPassKernel(outRate, mode.maxF, this.rfTaps);
39
+ this.filterI = new FIRFilter(kernel);
40
+ this.filterQ = new FIRFilter(kernel);
41
+ this.demodulator = new FMDemodulator(mode.maxF / outRate);
42
+ }
43
+ rfTaps;
44
+ shifter;
45
+ downsampler;
46
+ filterI;
47
+ filterQ;
48
+ demodulator;
49
+ getMode() {
50
+ return this.mode;
51
+ }
52
+ setMode(mode) {
53
+ this.mode = mode;
54
+ const kernel = makeLowPassKernel(this.outRate, mode.maxF, this.rfTaps);
55
+ this.filterI.setCoefficients(kernel);
56
+ this.filterQ.setCoefficients(kernel);
57
+ this.demodulator.setMaxDeviation(mode.maxF / this.outRate);
58
+ }
59
+ /**
60
+ * Demodulates the signal.
61
+ * @param samplesI The I components of the samples.
62
+ * @param samplesQ The Q components of the samples.
63
+ * @param freqOffset The offset of the signal in the samples.
64
+ * @returns The demodulated audio signal.
65
+ */
66
+ demodulate(samplesI, samplesQ, freqOffset) {
67
+ this.shifter.inPlace(samplesI, samplesQ, -freqOffset);
68
+ const [I, Q] = this.downsampler.downsample(samplesI, samplesQ);
69
+ let allPower = getPower(I, Q);
70
+ this.filterI.inPlace(I);
71
+ this.filterQ.inPlace(Q);
72
+ let signalPower = (getPower(I, Q) * this.outRate) / (this.mode.maxF * 2);
73
+ this.demodulator.demodulate(I, Q, I);
74
+ return {
75
+ left: I,
76
+ right: new Float32Array(I),
77
+ stereo: false,
78
+ snr: signalPower / allPower,
79
+ };
80
+ }
81
+ }
82
+ /** Configurator for the NBFM mode. */
83
+ export class ConfigNBFM extends Configurator {
84
+ constructor(mode) {
85
+ super(mode);
86
+ }
87
+ create() {
88
+ return { scheme: "NBFM", maxF: 5000, squelch: 0 };
89
+ }
90
+ hasBandwidth() {
91
+ return true;
92
+ }
93
+ getBandwidth() {
94
+ return 2 * this.mode.maxF;
95
+ }
96
+ setBandwidth(bandwidth) {
97
+ this.mode = {
98
+ ...this.mode,
99
+ maxF: Math.max(125, Math.min(bandwidth / 2, 15000)),
100
+ };
101
+ return this;
102
+ }
103
+ hasSquelch() {
104
+ return true;
105
+ }
106
+ getSquelch() {
107
+ return this.mode.squelch;
108
+ }
109
+ setSquelch(squelch) {
110
+ this.mode = { ...this.mode, squelch: Math.max(0, Math.min(squelch, 6)) };
111
+ return this;
112
+ }
113
+ }
114
+ //# sourceMappingURL=demod-nbfm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demod-nbfm.js","sourceRoot":"","sources":["../../src/demod/demod-nbfm.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import { Configurator, Demod, Demodulated } from "./modes.js";
2
+ /** Mode parameters for SSB. */
3
+ export type ModeSSB = {
4
+ scheme: "USB" | "LSB";
5
+ bandwidth: number;
6
+ squelch: number;
7
+ };
8
+ /** Mode options for SSB. */
9
+ export type OptionsSSB = {
10
+ /** Number of taps for the downsampler filter. Must be an odd number. 151 by default. */
11
+ downsamplerTaps?: number;
12
+ /** Number of taps for the RF filter. Must be an odd number. 151 by default. */
13
+ rfTaps?: number;
14
+ /** Number of taps for the Hilbert filter. Must be an odd number. 151 by default. */
15
+ hilbertTaps?: number;
16
+ };
17
+ /** A demodulator for single-sideband modulated signals. */
18
+ export declare class DemodSSB implements Demod<ModeSSB> {
19
+ private outRate;
20
+ private mode;
21
+ /**
22
+ * @param inRate The sample rate of the input samples.
23
+ * @param outRate The sample rate of the output audio.
24
+ * @param mode The mode to use initially.
25
+ */
26
+ constructor(inRate: number, outRate: number, mode: ModeSSB, options?: OptionsSSB);
27
+ private rfTaps;
28
+ private shifter;
29
+ private downsampler;
30
+ private filter;
31
+ private demodulator;
32
+ private agc;
33
+ getMode(): ModeSSB;
34
+ setMode(mode: ModeSSB): void;
35
+ /**
36
+ * Demodulates the signal.
37
+ * @param samplesI The I components of the samples.
38
+ * @param samplesQ The Q components of the samples.
39
+ * @param freqOffset The offset of the signal in the samples.
40
+ * @returns The demodulated audio signal.
41
+ */
42
+ demodulate(samplesI: Float32Array, samplesQ: Float32Array, freqOffset: number): Demodulated;
43
+ }
44
+ /** Configurator for the USB and LSB modes. */
45
+ export declare class ConfigSSB extends Configurator<ModeSSB> {
46
+ constructor(mode: ModeSSB | string);
47
+ protected create(scheme: string): ModeSSB;
48
+ hasBandwidth(): boolean;
49
+ getBandwidth(): number;
50
+ setBandwidth(bandwidth: number): ConfigSSB;
51
+ hasSquelch(): boolean;
52
+ getSquelch(): number;
53
+ setSquelch(squelch: number): ConfigSSB;
54
+ }
55
+ //# sourceMappingURL=demod-ssb.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demod-ssb.d.ts","sourceRoot":"","sources":["../../src/demod/demod-ssb.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9D,+BAA+B;AAC/B,MAAM,MAAM,OAAO,GAAG;IACpB,MAAM,EAAE,KAAK,GAAG,KAAK,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,4BAA4B;AAC5B,MAAM,MAAM,UAAU,GAAG;IACvB,wFAAwF;IACxF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,+EAA+E;IAC/E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oFAAoF;IACpF,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,2DAA2D;AAC3D,qBAAa,QAAS,YAAW,KAAK,CAAC,OAAO,CAAC;IAQ3C,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,IAAI;IARd;;;;OAIG;gBAED,MAAM,EAAE,MAAM,EACN,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,OAAO,EACrB,OAAO,CAAC,EAAE,UAAU;IAoBtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,WAAW,CAAiB;IACpC,OAAO,CAAC,GAAG,CAAM;IAEjB,OAAO,IAAI,OAAO;IAIlB,OAAO,CAAC,IAAI,EAAE,OAAO;IAUrB;;;;;;OAMG;IACH,UAAU,CACR,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,YAAY,EACtB,UAAU,EAAE,MAAM,GACjB,WAAW;CAgBf;AAED,8CAA8C;AAC9C,qBAAa,SAAU,SAAQ,YAAY,CAAC,OAAO,CAAC;gBACtC,IAAI,EAAE,OAAO,GAAG,MAAM;IAGlC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAGzC,YAAY,IAAI,OAAO;IAGvB,YAAY,IAAI,MAAM;IAGtB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS;IAO1C,UAAU,IAAI,OAAO;IAGrB,UAAU,IAAI,MAAM;IAGpB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS;CAIvC"}