@marmooo/midy 0.2.7 → 0.2.8
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.
- package/README.md +2 -2
- package/esm/midy-GM1.d.ts +6 -6
- package/esm/midy-GM1.d.ts.map +1 -1
- package/esm/midy-GM1.js +75 -73
- package/esm/midy-GM2.d.ts +22 -23
- package/esm/midy-GM2.d.ts.map +1 -1
- package/esm/midy-GM2.js +122 -153
- package/esm/midy-GMLite.d.ts +2 -2
- package/esm/midy-GMLite.d.ts.map +1 -1
- package/esm/midy-GMLite.js +63 -62
- package/esm/midy.d.ts +22 -23
- package/esm/midy.d.ts.map +1 -1
- package/esm/midy.js +153 -216
- package/package.json +1 -1
- package/script/midy-GM1.d.ts +6 -6
- package/script/midy-GM1.d.ts.map +1 -1
- package/script/midy-GM1.js +75 -73
- package/script/midy-GM2.d.ts +22 -23
- package/script/midy-GM2.d.ts.map +1 -1
- package/script/midy-GM2.js +122 -153
- package/script/midy-GMLite.d.ts +2 -2
- package/script/midy-GMLite.d.ts.map +1 -1
- package/script/midy-GMLite.js +63 -62
- package/script/midy.d.ts +22 -23
- package/script/midy.d.ts.map +1 -1
- package/script/midy.js +153 -216
package/esm/midy-GMLite.js
CHANGED
|
@@ -355,6 +355,7 @@ export class MidyGMLite {
|
|
|
355
355
|
state: new ControllerState(),
|
|
356
356
|
...this.setChannelAudioNodes(audioContext),
|
|
357
357
|
scheduledNotes: new SparseMap(128),
|
|
358
|
+
sustainNotes: [],
|
|
358
359
|
};
|
|
359
360
|
});
|
|
360
361
|
return channels;
|
|
@@ -412,7 +413,7 @@ export class MidyGMLite {
|
|
|
412
413
|
}
|
|
413
414
|
/* falls through */
|
|
414
415
|
case "noteOff": {
|
|
415
|
-
const notePromise = this.scheduleNoteOff(event.channel, event.noteNumber, event.velocity, startTime);
|
|
416
|
+
const notePromise = this.scheduleNoteOff(event.channel, event.noteNumber, event.velocity, startTime, false);
|
|
416
417
|
if (notePromise) {
|
|
417
418
|
this.notePromises.push(notePromise);
|
|
418
419
|
}
|
|
@@ -576,15 +577,10 @@ export class MidyGMLite {
|
|
|
576
577
|
stopChannelNotes(channelNumber, velocity, force, scheduleTime) {
|
|
577
578
|
const channel = this.channels[channelNumber];
|
|
578
579
|
const promises = [];
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
continue;
|
|
584
|
-
const promise = this.scheduleNoteOff(channelNumber, note.noteNumber, velocity, scheduleTime, force);
|
|
585
|
-
this.notePromises.push(promise);
|
|
586
|
-
promises.push(promise);
|
|
587
|
-
}
|
|
580
|
+
this.processScheduledNotes(channel, (note) => {
|
|
581
|
+
const promise = this.scheduleNoteOff(channelNumber, note.noteNumber, velocity, scheduleTime, force);
|
|
582
|
+
this.notePromises.push(promise);
|
|
583
|
+
promises.push(promise);
|
|
588
584
|
});
|
|
589
585
|
channel.scheduledNotes.clear();
|
|
590
586
|
return Promise.all(promises);
|
|
@@ -640,14 +636,12 @@ export class MidyGMLite {
|
|
|
640
636
|
const now = this.audioContext.currentTime;
|
|
641
637
|
return this.resumeTime + now - this.startTime - this.startDelay;
|
|
642
638
|
}
|
|
643
|
-
processScheduledNotes(channel,
|
|
639
|
+
processScheduledNotes(channel, callback) {
|
|
644
640
|
channel.scheduledNotes.forEach((noteList) => {
|
|
645
641
|
for (let i = 0; i < noteList.length; i++) {
|
|
646
642
|
const note = noteList[i];
|
|
647
643
|
if (!note)
|
|
648
644
|
continue;
|
|
649
|
-
if (scheduleTime < note.startTime)
|
|
650
|
-
continue;
|
|
651
645
|
callback(note);
|
|
652
646
|
}
|
|
653
647
|
});
|
|
@@ -691,7 +685,7 @@ export class MidyGMLite {
|
|
|
691
685
|
return pitchWheel * pitchWheelSensitivity;
|
|
692
686
|
}
|
|
693
687
|
updateChannelDetune(channel, scheduleTime) {
|
|
694
|
-
this.processScheduledNotes(channel,
|
|
688
|
+
this.processScheduledNotes(channel, (note) => {
|
|
695
689
|
this.updateDetune(channel, note, scheduleTime);
|
|
696
690
|
});
|
|
697
691
|
}
|
|
@@ -840,6 +834,9 @@ export class MidyGMLite {
|
|
|
840
834
|
const note = await this.createNote(channel, voice, noteNumber, velocity, startTime, isSF3);
|
|
841
835
|
note.volumeEnvelopeNode.connect(channel.gainL);
|
|
842
836
|
note.volumeEnvelopeNode.connect(channel.gainR);
|
|
837
|
+
if (0.5 <= channel.state.sustainPedal) {
|
|
838
|
+
channel.sustainNotes.push(note);
|
|
839
|
+
}
|
|
843
840
|
const exclusiveClass = note.voiceParams.exclusiveClass;
|
|
844
841
|
if (exclusiveClass !== 0) {
|
|
845
842
|
if (this.exclusiveClassMap.has(exclusiveClass)) {
|
|
@@ -847,8 +844,7 @@ export class MidyGMLite {
|
|
|
847
844
|
const [prevNote, prevChannelNumber] = prevEntry;
|
|
848
845
|
if (!prevNote.ending) {
|
|
849
846
|
this.scheduleNoteOff(prevChannelNumber, prevNote.noteNumber, 0, // velocity,
|
|
850
|
-
startTime,
|
|
851
|
-
true);
|
|
847
|
+
startTime, true);
|
|
852
848
|
}
|
|
853
849
|
}
|
|
854
850
|
this.exclusiveClassMap.set(exclusiveClass, [note, channelNumber]);
|
|
@@ -892,7 +888,7 @@ export class MidyGMLite {
|
|
|
892
888
|
}
|
|
893
889
|
scheduleNoteOff(channelNumber, noteNumber, _velocity, endTime, force) {
|
|
894
890
|
const channel = this.channels[channelNumber];
|
|
895
|
-
if (!force && 0.5
|
|
891
|
+
if (!force && 0.5 <= channel.state.sustainPedal)
|
|
896
892
|
return;
|
|
897
893
|
if (!channel.scheduledNotes.has(noteNumber))
|
|
898
894
|
return;
|
|
@@ -920,11 +916,11 @@ export class MidyGMLite {
|
|
|
920
916
|
const velocity = halfVelocity * 2;
|
|
921
917
|
const channel = this.channels[channelNumber];
|
|
922
918
|
const promises = [];
|
|
923
|
-
|
|
924
|
-
const
|
|
925
|
-
const promise = this.noteOff(channelNumber, noteNumber, velocity);
|
|
919
|
+
for (let i = 0; i < channel.sustainNotes.length; i++) {
|
|
920
|
+
const promise = this.noteOff(channelNumber, channel.sustainNotes[i].noteNumber, velocity, scheduleTime);
|
|
926
921
|
promises.push(promise);
|
|
927
|
-
}
|
|
922
|
+
}
|
|
923
|
+
channel.sustainNotes = [];
|
|
928
924
|
return promises;
|
|
929
925
|
}
|
|
930
926
|
handleMIDIMessage(statusByte, data1, data2, scheduleTime) {
|
|
@@ -1035,48 +1031,43 @@ export class MidyGMLite {
|
|
|
1035
1031
|
return state;
|
|
1036
1032
|
}
|
|
1037
1033
|
applyVoiceParams(channel, controllerType, scheduleTime) {
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1034
|
+
this.processScheduledNotes(channel, (note) => {
|
|
1035
|
+
const controllerState = this.getControllerState(channel, note.noteNumber, note.velocity);
|
|
1036
|
+
const voiceParams = note.voice.getParams(controllerType, controllerState);
|
|
1037
|
+
let appliedFilterEnvelope = false;
|
|
1038
|
+
let appliedVolumeEnvelope = false;
|
|
1039
|
+
for (const [key, value] of Object.entries(voiceParams)) {
|
|
1040
|
+
const prevValue = note.voiceParams[key];
|
|
1041
|
+
if (value === prevValue)
|
|
1042
1042
|
continue;
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
if (value === prevValue)
|
|
1043
|
+
note.voiceParams[key] = value;
|
|
1044
|
+
if (key in this.voiceParamsHandlers) {
|
|
1045
|
+
this.voiceParamsHandlers[key](channel, note, prevValue, scheduleTime);
|
|
1046
|
+
}
|
|
1047
|
+
else if (filterEnvelopeKeySet.has(key)) {
|
|
1048
|
+
if (appliedFilterEnvelope)
|
|
1050
1049
|
continue;
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
continue;
|
|
1058
|
-
appliedFilterEnvelope = true;
|
|
1059
|
-
const noteVoiceParams = note.voiceParams;
|
|
1060
|
-
for (let i = 0; i < filterEnvelopeKeys.length; i++) {
|
|
1061
|
-
const key = filterEnvelopeKeys[i];
|
|
1062
|
-
if (key in voiceParams)
|
|
1063
|
-
noteVoiceParams[key] = voiceParams[key];
|
|
1064
|
-
}
|
|
1065
|
-
this.setFilterEnvelope(note, scheduleTime);
|
|
1066
|
-
this.setPitchEnvelope(note, scheduleTime);
|
|
1050
|
+
appliedFilterEnvelope = true;
|
|
1051
|
+
const noteVoiceParams = note.voiceParams;
|
|
1052
|
+
for (let i = 0; i < filterEnvelopeKeys.length; i++) {
|
|
1053
|
+
const key = filterEnvelopeKeys[i];
|
|
1054
|
+
if (key in voiceParams)
|
|
1055
|
+
noteVoiceParams[key] = voiceParams[key];
|
|
1067
1056
|
}
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1057
|
+
this.setFilterEnvelope(note, scheduleTime);
|
|
1058
|
+
this.setPitchEnvelope(note, scheduleTime);
|
|
1059
|
+
}
|
|
1060
|
+
else if (volumeEnvelopeKeySet.has(key)) {
|
|
1061
|
+
if (appliedVolumeEnvelope)
|
|
1062
|
+
continue;
|
|
1063
|
+
appliedVolumeEnvelope = true;
|
|
1064
|
+
const noteVoiceParams = note.voiceParams;
|
|
1065
|
+
for (let i = 0; i < volumeEnvelopeKeys.length; i++) {
|
|
1066
|
+
const key = volumeEnvelopeKeys[i];
|
|
1067
|
+
if (key in voiceParams)
|
|
1068
|
+
noteVoiceParams[key] = voiceParams[key];
|
|
1079
1069
|
}
|
|
1070
|
+
this.setVolumeEnvelope(note, scheduleTime);
|
|
1080
1071
|
}
|
|
1081
1072
|
}
|
|
1082
1073
|
});
|
|
@@ -1111,7 +1102,7 @@ export class MidyGMLite {
|
|
|
1111
1102
|
updateModulation(channel, scheduleTime) {
|
|
1112
1103
|
scheduleTime ??= this.audioContext.currentTime;
|
|
1113
1104
|
const depth = channel.state.modulationDepth * channel.modulationDepthRange;
|
|
1114
|
-
this.processScheduledNotes(channel,
|
|
1105
|
+
this.processScheduledNotes(channel, (note) => {
|
|
1115
1106
|
if (note.modulationDepth) {
|
|
1116
1107
|
note.modulationDepth.gain.setValueAtTime(depth, scheduleTime);
|
|
1117
1108
|
}
|
|
@@ -1122,11 +1113,13 @@ export class MidyGMLite {
|
|
|
1122
1113
|
});
|
|
1123
1114
|
}
|
|
1124
1115
|
setModulationDepth(channelNumber, modulation, scheduleTime) {
|
|
1116
|
+
scheduleTime ??= this.audioContext.currentTime;
|
|
1125
1117
|
const channel = this.channels[channelNumber];
|
|
1126
1118
|
channel.state.modulationDepth = modulation / 127;
|
|
1127
1119
|
this.updateModulation(channel, scheduleTime);
|
|
1128
1120
|
}
|
|
1129
1121
|
setVolume(channelNumber, volume, scheduleTime) {
|
|
1122
|
+
scheduleTime ??= this.audioContext.currentTime;
|
|
1130
1123
|
const channel = this.channels[channelNumber];
|
|
1131
1124
|
channel.state.volume = volume / 127;
|
|
1132
1125
|
this.updateChannelVolume(channel, scheduleTime);
|
|
@@ -1139,11 +1132,13 @@ export class MidyGMLite {
|
|
|
1139
1132
|
};
|
|
1140
1133
|
}
|
|
1141
1134
|
setPan(channelNumber, pan, scheduleTime) {
|
|
1135
|
+
scheduleTime ??= this.audioContext.currentTime;
|
|
1142
1136
|
const channel = this.channels[channelNumber];
|
|
1143
1137
|
channel.state.pan = pan / 127;
|
|
1144
1138
|
this.updateChannelVolume(channel, scheduleTime);
|
|
1145
1139
|
}
|
|
1146
1140
|
setExpression(channelNumber, expression, scheduleTime) {
|
|
1141
|
+
scheduleTime ??= this.audioContext.currentTime;
|
|
1147
1142
|
const channel = this.channels[channelNumber];
|
|
1148
1143
|
channel.state.expression = expression / 127;
|
|
1149
1144
|
this.updateChannelVolume(channel, scheduleTime);
|
|
@@ -1165,8 +1160,14 @@ export class MidyGMLite {
|
|
|
1165
1160
|
}
|
|
1166
1161
|
setSustainPedal(channelNumber, value, scheduleTime) {
|
|
1167
1162
|
scheduleTime ??= this.audioContext.currentTime;
|
|
1168
|
-
this.channels[channelNumber]
|
|
1169
|
-
|
|
1163
|
+
const channel = this.channels[channelNumber];
|
|
1164
|
+
channel.state.sustainPedal = value / 127;
|
|
1165
|
+
if (64 <= value) {
|
|
1166
|
+
this.processScheduledNotes(channel, (note) => {
|
|
1167
|
+
channel.sustainNotes.push(note);
|
|
1168
|
+
});
|
|
1169
|
+
}
|
|
1170
|
+
else {
|
|
1170
1171
|
this.releaseSustainPedal(channelNumber, value, scheduleTime);
|
|
1171
1172
|
}
|
|
1172
1173
|
}
|
package/esm/midy.d.ts
CHANGED
|
@@ -10,6 +10,7 @@ export class Midy {
|
|
|
10
10
|
dataLSB: number;
|
|
11
11
|
rpnMSB: number;
|
|
12
12
|
rpnLSB: number;
|
|
13
|
+
mono: boolean;
|
|
13
14
|
fineTuning: number;
|
|
14
15
|
coarseTuning: number;
|
|
15
16
|
modulationDepthRange: number;
|
|
@@ -35,8 +36,6 @@ export class Midy {
|
|
|
35
36
|
sendToReverb: number;
|
|
36
37
|
delayTimes: any[];
|
|
37
38
|
};
|
|
38
|
-
mono: boolean;
|
|
39
|
-
omni: boolean;
|
|
40
39
|
noteCheckInterval: number;
|
|
41
40
|
lookAhead: number;
|
|
42
41
|
startDelay: number;
|
|
@@ -112,10 +111,10 @@ export class Midy {
|
|
|
112
111
|
120: (channelNumber: any, _value: any, scheduleTime: any) => Promise<any[]>;
|
|
113
112
|
121: (channelNumber: any) => void;
|
|
114
113
|
123: (channelNumber: any, _value: any, scheduleTime: any) => Promise<any[]>;
|
|
115
|
-
124: () => void;
|
|
116
|
-
125: () => void;
|
|
117
|
-
126: () => void;
|
|
118
|
-
127: () => void;
|
|
114
|
+
124: (channelNumber: any, value: any, scheduleTime: any) => void;
|
|
115
|
+
125: (channelNumber: any, value: any, scheduleTime: any) => void;
|
|
116
|
+
126: (channelNumber: any, value: any, scheduleTime: any) => void;
|
|
117
|
+
127: (channelNumber: any, value: any, scheduleTime: any) => void;
|
|
119
118
|
};
|
|
120
119
|
channels: any[];
|
|
121
120
|
reverbEffect: {
|
|
@@ -163,7 +162,7 @@ export class Midy {
|
|
|
163
162
|
seekTo(second: any): void;
|
|
164
163
|
calcTotalTime(): number;
|
|
165
164
|
currentTime(): number;
|
|
166
|
-
processScheduledNotes(channel: any,
|
|
165
|
+
processScheduledNotes(channel: any, callback: any): void;
|
|
167
166
|
getActiveNotes(channel: any, scheduleTime: any): SparseMap;
|
|
168
167
|
getActiveNote(noteList: any, scheduleTime: any): any;
|
|
169
168
|
createConvolutionReverbImpulse(audioContext: any, decay: any, preDecay: any): any;
|
|
@@ -213,8 +212,8 @@ export class Midy {
|
|
|
213
212
|
stopNote(endTime: any, stopTime: any, scheduledNotes: any, index: any): Promise<any>;
|
|
214
213
|
scheduleNoteOff(channelNumber: any, noteNumber: any, _velocity: any, endTime: any, force: any, portamentoNoteNumber: any): Promise<any> | undefined;
|
|
215
214
|
noteOff(channelNumber: any, noteNumber: any, velocity: any, scheduleTime: any): Promise<any> | undefined;
|
|
216
|
-
releaseSustainPedal(channelNumber: any, halfVelocity: any, scheduleTime: any): any[];
|
|
217
|
-
releaseSostenutoPedal(channelNumber: any, halfVelocity: any): any[];
|
|
215
|
+
releaseSustainPedal(channelNumber: any, halfVelocity: any, scheduleTime: any): (Promise<any> | undefined)[];
|
|
216
|
+
releaseSostenutoPedal(channelNumber: any, halfVelocity: any, scheduleTime: any): any[];
|
|
218
217
|
handleMIDIMessage(statusByte: any, data1: any, data2: any, scheduleTime: any): void | Promise<any>;
|
|
219
218
|
handlePolyphonicKeyPressure(channelNumber: any, noteNumber: any, pressure: any, scheduleTime: any): void;
|
|
220
219
|
handleProgramChange(channelNumber: any, program: any, _scheduleTime: any): void;
|
|
@@ -275,10 +274,10 @@ export class Midy {
|
|
|
275
274
|
120: (channelNumber: any, _value: any, scheduleTime: any) => Promise<any[]>;
|
|
276
275
|
121: (channelNumber: any) => void;
|
|
277
276
|
123: (channelNumber: any, _value: any, scheduleTime: any) => Promise<any[]>;
|
|
278
|
-
124: () => void;
|
|
279
|
-
125: () => void;
|
|
280
|
-
126: () => void;
|
|
281
|
-
127: () => void;
|
|
277
|
+
124: (channelNumber: any, value: any, scheduleTime: any) => void;
|
|
278
|
+
125: (channelNumber: any, value: any, scheduleTime: any) => void;
|
|
279
|
+
126: (channelNumber: any, value: any, scheduleTime: any) => void;
|
|
280
|
+
127: (channelNumber: any, value: any, scheduleTime: any) => void;
|
|
282
281
|
};
|
|
283
282
|
handleControlChange(channelNumber: any, controllerType: any, value: any, scheduleTime: any): void;
|
|
284
283
|
setBankMSB(channelNumber: any, msb: any): void;
|
|
@@ -321,19 +320,19 @@ export class Midy {
|
|
|
321
320
|
dataEntryMSB(channelNumber: any, value: any, scheduleTime: any): void;
|
|
322
321
|
handlePitchBendRangeRPN(channelNumber: any, scheduleTime: any): void;
|
|
323
322
|
setPitchBendRange(channelNumber: any, value: any, scheduleTime: any): void;
|
|
324
|
-
handleFineTuningRPN(channelNumber: any): void;
|
|
325
|
-
setFineTuning(channelNumber: any, value: any): void;
|
|
326
|
-
handleCoarseTuningRPN(channelNumber: any): void;
|
|
327
|
-
setCoarseTuning(channelNumber: any, value: any): void;
|
|
328
|
-
handleModulationDepthRangeRPN(channelNumber: any): void;
|
|
329
|
-
setModulationDepthRange(channelNumber: any, modulationDepthRange: any): void;
|
|
323
|
+
handleFineTuningRPN(channelNumber: any, scheduleTime: any): void;
|
|
324
|
+
setFineTuning(channelNumber: any, value: any, scheduleTime: any): void;
|
|
325
|
+
handleCoarseTuningRPN(channelNumber: any, scheduleTime: any): void;
|
|
326
|
+
setCoarseTuning(channelNumber: any, value: any, scheduleTime: any): void;
|
|
327
|
+
handleModulationDepthRangeRPN(channelNumber: any, scheduleTime: any): void;
|
|
328
|
+
setModulationDepthRange(channelNumber: any, modulationDepthRange: any, scheduleTime: any): void;
|
|
330
329
|
allSoundOff(channelNumber: any, _value: any, scheduleTime: any): Promise<any[]>;
|
|
331
330
|
resetAllControllers(channelNumber: any): void;
|
|
332
331
|
allNotesOff(channelNumber: any, _value: any, scheduleTime: any): Promise<any[]>;
|
|
333
|
-
omniOff(): void;
|
|
334
|
-
omniOn(): void;
|
|
335
|
-
monoOn(): void;
|
|
336
|
-
polyOn(): void;
|
|
332
|
+
omniOff(channelNumber: any, value: any, scheduleTime: any): void;
|
|
333
|
+
omniOn(channelNumber: any, value: any, scheduleTime: any): void;
|
|
334
|
+
monoOn(channelNumber: any, value: any, scheduleTime: any): void;
|
|
335
|
+
polyOn(channelNumber: any, value: any, scheduleTime: any): void;
|
|
337
336
|
handleUniversalNonRealTimeExclusiveMessage(data: any, scheduleTime: any): void;
|
|
338
337
|
GM1SystemOn(): void;
|
|
339
338
|
GM2SystemOn(): void;
|
package/esm/midy.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"midy.d.ts","sourceRoot":"","sources":["../src/midy.js"],"names":[],"mappings":"AAgLA;
|
|
1
|
+
{"version":3,"file":"midy.d.ts","sourceRoot":"","sources":["../src/midy.js"],"names":[],"mappings":"AAgLA;IAmCE;;;;;;;;;;;;;;;MAeE;IAgCF;;;;;OAaC;IA9FD,qBAAmB;IACnB,kBAAc;IACd,yBAAqB;IACrB,2BAAuB;IACvB;;;MAGE;IACF;;;;;;MAME;IACF,0BAAwB;IACxB,kBAAc;IACd,mBAAiB;IACjB,kBAAc;IACd,mBAAe;IACf,kBAAgB;IAChB,sBAA2C;IAC3C,kCAA+B;IAC/B,gCAA6B;IAC7B,mBAAkB;IAClB,mBAAkB;IAClB,kBAAiB;IACjB,oBAAmB;IACnB,mBAAkB;IAClB,gBAAc;IACd,mBAAiB;IACjB,oBAAkB;IAClB,6BAAuC;IAmBvC;;;;;MA4BE;IAGA,kBAAgC;IAChC;;;;;MAAqD;IACrD,kBAA8C;IAC9C;;;;;;;;;;;MAA2D;IAC3D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAA+D;IAC/D,gBAAiD;IACjD;;;MAA8D;IAC9D;;;;;;;;MAAyD;IAO3D,4BAMC;IAED,mCAWC;IAED,gDAMC;IAED,sCASC;IAED;;;;MAeC;IAED,yCAiBC;IAED,6DA2BC;IAED,8DASC;IAED,2CAcC;IAED,2EAqEC;IAED,mCAOC;IAED,0BAoDC;IAED,uDAEC;IAED,wDAEC;IAED,6EAEC;IAED;;;MAgHC;IAED,mGAiBC;IAED,wEAMC;IAED,uBAKC;IAED,aAGC;IAED,cAKC;IAED,wBAIC;IAED,0BAKC;IAED,wBAOC;IAED,sBAGC;IAED,yDAQC;IAED,2DASC;IAED,qDAQC;IAED,kFAuBC;IAED;;;;MAWC;IAED,gFAUC;IAED,mFAYC;IAED,sGAcC;IAID;;;MA8BC;IAED;;;;;;;;MA0CC;IAED,2BAEC;IAED,8BAEC;IAED,8BAEC;IAED,4BAEC;IAED,qCAUC;IAED,6CAEC;IAED,2DAIC;IAED,+DAOC;IAED,wCAIC;IAED,mFAUC;IAED,oEAiBC;IAED,qDAoBC;IAED,6CAIC;IAED,mFAsBC;IAED,oEA2BC;IAED,kEAoBC;IAED,+DAaC;IAED,yGAgBC;IAED,iIAqEC;IAED,gDAQC;IAED,mHA0DC;IAED,6FASC;IAED,qFAqCC;IAED,oJAwCC;IAED,yGAUC;IAED,4GAeC;IAED,uFAgBC;IAED,mGAoCC;IAED,yGAeC;IAED,gFAIC;IAED,+EAcC;IAED,wFAGC;IAED,sEAUC;IAED,mEAQC;IAED,mEAQC;IAED,sEAMC;IAED,oEAQC;IAED,uFA0BC;IAED,uFA0BC;IAED,mDAMC;IAED,kDAKC;IAED,gEAKC;IAED;;;;;;;;;;;MAiDC;IAED,oFAMC;IAED,6EAmDC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAqCC;IAED,kGAYC;IAED,+CAEC;IAED,wDAUC;IAED,iFAKC;IAED,iEAIC;IAED,yDAaC;IAED,oEAMC;IAED;;;MAMC;IAED,sDAiBC;IAED,8DAMC;IAED,4EAKC;IAED,+CAEC;IAED,sEAGC;IAED,2DAUC;IAED,yEAWC;IAED,oDAEC;IAED,2EASC;IAED,2EAGC;IAED,sFASC;IAED,+EAIC;IAED,4EAQC;IAED,4EAWC;IAED,0EAOC;IAED,8EAQC;IAED,gFAcC;IAED,6DASC;IAED,sFA4BC;IAED,sFA4BC;IAED,kFAeC;IAED,2DAMC;IAED,mEAyBC;IAGD,wCAEC;IAGD,wCAEC;IAED,gDAEC;IAED,gDAEC;IAED,sEAGC;IAED,qEAKC;IAED,2EAUC;IAED,iEAKC;IAED,uEAQC;IAED,mEAKC;IAED,yEAQC;IAED,2EASC;IAED,gGAKC;IAED,gFAGC;IAED,8CAyBC;IAED,gFAGC;IAED,iEAEC;IAED,gEAEC;IAED,gEAIC;IAED,gEAIC;IAED,+EAuCC;IAED,oBASC;IAED,oBASC;IAED,4EA6DC;IAED,4DAGC;IAED,sDASC;IAED,gEAGC;IAED,yDAMC;IAED,kEAGC;IAED,2DAMC;IAED,sEAeC;IAED,4CAOC;IAED,+BAKC;IAED,qDAiBC;IAED,gCAIC;IAED,kCAEC;IA6BD,4CAEC;IAED,+DAaC;IAED,kDAiBC;IAED,2GAKC;IAED,sDAIC;IAED,qCAEC;IAED,uDAMC;IAED,sCAEC;IAED,uDASC;IAED,sCAEC;IAED,2DAqBC;IAED,0CAEC;IAED,mCAeC;IAED,2FAeC;IAED,2FAmBC;IAED,iDAIC;IAED,wDAMC;IAED,qDAMC;IAED,kDAMC;IAED,mDAMC;IAED,sDAMC;IAED,mEASC;IAED,qDAQC;IAED,4CAUC;IAED,2DAOC;IAED,0CASC;IAED,6FAIC;IAED,yEAeC;IAED,gDAYC;IAED,6DAUC;CACF;AA/yFD;IACE,uBAGC;IAFC,YAA2B;IAC3B,qBAAuB;IAGzB,gCAKC;IAED,mBAEC;IAED,0BAUC;IAED,uBAEC;IAED,mBAEC;IAED,cAMC;IASD,6BAKC;IAZD,qDAKC;CAQF;AAED;IAkBE,0FAMC;IAvBD,kBAAa;IACb,gBAAW;IACX,iBAAY;IACZ,wBAAmB;IACnB,iBAAY;IACZ,gBAAW;IACX,WAAM;IACN,WAAM;IACN,mBAAc;IACd,qBAAgB;IAChB,gBAAW;IACX,kBAAa;IACb,uBAAkB;IAClB,uBAAkB;IAClB,gBAAW;IACX,iBAAa;IAGX,gBAA4B;IAC5B,cAAwB;IACxB,eAA0B;IAC1B,WAAkB;IAClB,iBAA8B;CAEjC"}
|