History

Merge remote-tracking branch 'upstream/master'

Sigrid Solveig Haflínudóttir committed 3 years ago

Commit dfe013b2 parents f6e05c9 0ee14b8168 files · +18209 −6088Browse files

Showing the changes to src (36 of 168 files). Show all

Unified · Split

36 files
  1. src/ft2_audio.c +11 −30
  2. src/ft2_audio.h +16 −6
  3. src/ft2_checkboxes.c +8 −2
  4. src/ft2_checkboxes.h +3 −0
  5. src/ft2_config.c +65 −25
  6. src/ft2_config.h +3 −1
  7. src/ft2_diskop.c +7 −2
  8. src/ft2_edit.c +9 −1
  9. src/ft2_events.c +18 −51
  10. src/ft2_events.h +0 −3
  11. src/ft2_header.h +4 −7
  12. src/ft2_hpc.c +163 −0
  13. src/ft2_hpc.h +24 −0
  14. src/ft2_inst_ed.c +2 −1
  15. src/ft2_keyboard.c +2 −2
  16. src/ft2_main.c +13 −35
  17. src/ft2_mouse.c +42 −6
  18. src/ft2_mouse.h +1 −1
  19. src/ft2_pushbuttons.c +1 −1
  20. src/ft2_replayer.c +22 −5
  21. src/ft2_sample_ed.c +31 −19
  22. src/ft2_sampling.c +1 −1
  23. src/ft2_sysreqs.c +2 −2
  24. src/ft2_textboxes.c +32 −29
  25. src/ft2_video.c +125 −93
  26. src/ft2_video.h +6 −7
  27. src/ft2_wav_renderer.c +37 −30
  28. src/ft2_wav_renderer.h +1 −2
  29. src/helpdata/FT2.HLP +11 −7
  30. src/helpdata/ft2_help_data.h +542 −532
  31. src/mixer/ft2_mix_macros.h +69 −0
  32. src/mixer/ft2_windowed_sinc.c +4 −7
  33. src/mixer/ft2_windowed_sinc.h +9 −8
  34. src/modloaders/ft2_load_digi.c +1 −1
  35. src/modloaders/ft2_load_mod.c +0 −3
  36. src/scopes/ft2_scopes.c +5 −42
src/ft2_audio.c+11−30
@@ -107,8 +107,6 @@ bool setNewAudioSettings(void) // only call this from the main input/video threa · 106 unmodified lines
107107
108108 resumeAudio();
109109
110− setWavRenderFrequency(audio.freq);
111− setWavRenderBitDepth((config.specialFlags & BITDEPTH_32) ? 32 : 16);
112110 return true;
113111 }
114112
@@ -272,8 +270,7 @@ static void voiceUpdateVolumes(int32_t i, uint8_t status) · 157 unmodified lines
272270 // if destination volume and current volume is the same (and we have no sample trigger), don't do ramp
273271 if (fVolumeL == v->fVolumeL && fVolumeR == v->fVolumeR && !(status & IS_Trigger))
274272 {
275− // there is no volume change
276− v->volumeRampLength = 0;
273+ v->volumeRampLength = 0; // there is no volume change
277274 }
278275 else
279276 {
@@ -889,7 +886,7 @@ static void fillVisualsSyncBuffer(void) · 609 unmodified lines
889886 pattSyncData.row = song.curReplayerRow;
890887 pattSyncData.pattNum = song.curReplayerPattNum;
891888 pattSyncData.songPos = song.curReplayerSongPos;
892− pattSyncData.BPM = song.BPM;
889+ pattSyncData.BPM = (uint8_t)song.BPM;
893890 pattSyncData.speed = (uint8_t)song.speed;
894891 pattSyncData.globalVolume = (uint8_t)song.globalVolume;
895892 pattSyncData.timestamp = audio.tickTime64;
@@ -985,41 +982,28 @@ static void SDLCALL audioCallback(void *userdata, Uint8 *stream, int len) · 89 unmodified lines
985982
986983 static bool setupAudioBuffers(void)
987984 {
988− const uint32_t sampleSize = sizeof (float);
989−
990− audio.fMixBufferLUnaligned = (float *)MALLOC_PAD(MAX_WAV_RENDER_SAMPLES_PER_TICK * sampleSize, 256);
991− audio.fMixBufferRUnaligned = (float *)MALLOC_PAD(MAX_WAV_RENDER_SAMPLES_PER_TICK * sampleSize, 256);
985+ audio.fMixBufferL = (float *)calloc(MAX_WAV_RENDER_SAMPLES_PER_TICK, sizeof (float));
986+ audio.fMixBufferR = (float *)calloc(MAX_WAV_RENDER_SAMPLES_PER_TICK, sizeof (float));
992987
993− if (audio.fMixBufferLUnaligned == NULL || audio.fMixBufferRUnaligned == NULL)
988+ if (audio.fMixBufferL == NULL || audio.fMixBufferR == NULL)
994989 return false;
995990
996− // make aligned main pointers
997− audio.fMixBufferL = (float *)ALIGN_PTR(audio.fMixBufferLUnaligned, 256);
998− audio.fMixBufferR = (float *)ALIGN_PTR(audio.fMixBufferRUnaligned, 256);
999−
1000− // clear buffers
1001− memset(audio.fMixBufferL, 0, MAX_WAV_RENDER_SAMPLES_PER_TICK * sampleSize);
1002− memset(audio.fMixBufferR, 0, MAX_WAV_RENDER_SAMPLES_PER_TICK * sampleSize);
1003−
1004991 return true;
1005992 }
1006993
1007994 static void freeAudioBuffers(void)
1008995 {
1009− if (audio.fMixBufferLUnaligned != NULL)
996+ if (audio.fMixBufferL != NULL)
1010997 {
1011− free(audio.fMixBufferLUnaligned);
1012− audio.fMixBufferLUnaligned = NULL;
998+ free(audio.fMixBufferL);
999+ audio.fMixBufferL = NULL;
10131000 }
10141001
1015− if (audio.fMixBufferRUnaligned != NULL)
1002+ if (audio.fMixBufferR != NULL)
10161003 {
1017− free(audio.fMixBufferRUnaligned);
1018− audio.fMixBufferRUnaligned = NULL;
1004+ free(audio.fMixBufferR);
1005+ audio.fMixBufferR = NULL;
10191006 }
1020−
1021− audio.fMixBufferL = NULL;
1022− audio.fMixBufferR = NULL;
10231007 }
10241008
10251009 void updateSendAudSamplesRoutine(bool lockMixer)
@@ -1214,9 +1198,6 @@ bool setupAudio(bool showErrorMsg) · 188 unmodified lines
12141198 updateSendAudSamplesRoutine(false);
12151199 audio.resetSyncTickTimeFlag = true;
12161200
1217− setWavRenderFrequency(audio.freq);
1218− setWavRenderBitDepth((config.specialFlags & BITDEPTH_32) ? 32 : 16);
1219−
12201201 return true;
12211202 }
12221203
src/ft2_audio.h+16−6
@@ -40,7 +40,7 @@ typedef struct audio_t · 39 unmodified lines
4040 uint32_t freq, audLatencyPerfValInt, audLatencyPerfValFrac, samplesPerTick, samplesPerTickFrac, musicTimeSpeedVal;
4141 uint64_t tickTime64, tickTime64Frac;
4242 float fRampQuickVolMul, fRampTickMul, fRampTickMulTab[(MAX_BPM-MIN_BPM)+1];
43− float *fMixBufferL, *fMixBufferR, *fMixBufferLUnaligned, *fMixBufferRUnaligned;
43+ float *fMixBufferL, *fMixBufferR;
4444 double dHz2MixDeltaMul, dAudioLatencyMs;
4545
4646 SDL_AudioDeviceID dev;
@@ -57,7 +57,7 @@ typedef struct · 10 unmodified lines
5757 uint32_t volumeRampLength;
5858
5959 uintCPUWord_t positionFrac, delta, oldDelta, scopeDelta;
60−#
60+
6161 // if (loopEnabled && hasLooped && samplingPos <= loopStart+SINC_LEFT_TAPS) readFixedTapsFromThisPointer();
6262 const int8_t *leftEdgeTaps8;
6363 const int16_t *leftEdgeTaps16;
@@ -66,12 +66,22 @@ typedef struct · 2 unmodified lines
6666 float fVolume, fVolumeL, fVolumeR, fVolumeLDelta, fVolumeRDelta, fVolumeLTarget, fVolumeRTarget;
6767 } voice_t;
6868
69−typedef struct pattSyncData_t
69+#ifdef _MSC_VER
70+#pragma pack(push)
71+#pragma pack(1)
72+#endif
73+typedef struct pattSyncData_t // used for audio/video sync queue (pack to save RAM)
7074 {
71− uint8_t pattNum, globalVolume, songPos, tick, speed, row;
72− uint16_t BPM;
75+ uint8_t pattNum, globalVolume, songPos, tick, speed, row, BPM;
7376 uint64_t timestamp;
74−} pattSyncData_t;
77+}
78+#ifdef __GNUC__
79+__attribute__ ((packed))
80+#endif
81+pattSyncData_t;
82+#ifdef _MSC_VER
83+#pragma pack(pop)
84+#endif
7585
7686 typedef struct pattSync_t
7787 {
src/ft2_checkboxes.c+8−2
@@ -14,6 +14,7 @@ · 13 unmodified lines
1414 #include "ft2_mouse.h"
1515 #include "ft2_edit.h"
1616 #include "ft2_bmp.h"
17+#include "ft2_wav_renderer.h"
1718 #include "ft2_structs.h"
1819
1920 checkBox_t checkBoxes[NUM_CHECKBOXES] =
@@ -90,6 +91,7 @@ checkBox_t checkBoxes[NUM_CHECKBOXES] = · 70 unmodified lines
9091 { 113, 79, 128, 12, cbConfigLineColors },
9192 { 113, 92, 126, 12, cbConfigChanNums },
9293 { 255, 14, 136, 12, cbConfigShowVolCol },
94+ { 237, 108, 13, 12, cbEnableCustomPointer },
9395 { 255, 158, 111, 12, cbSoftwareMouse },
9496 // ---------------------------------
9597 { 212, 2, 150, 12, cbSampCutToBuff },
@@ -108,10 +110,14 @@ checkBox_t checkBoxes[NUM_CHECKBOXES] = · 12 unmodified lines
108110 { 411, 119, 121, 12, cbMIDIRecTransp },
109111 { 411, 132, 109, 12, cbMIDIRecVelocity },
110112 { 411, 145, 124, 12, cbMIDIRecAftert },
111− { 113, 115, 74, 12, cbVsyncOff },
113+ { 113, 115, 75, 12, cbVsyncOff },
112114 { 113, 128, 78, 12, cbFullScreen },
113115 { 113, 141, 75, 12, cbStretchImage },
114− { 113, 154, 78, 12, cbPixelFilter }
116+ { 113, 154, 78, 12, cbPixelFilter },
117+
118+ // WAV RENDERER BPM MODE
119+ //x, y, w, h, funcOnUp
120+ { 3, 112, 71, 24, cbToggleWavRenderBPMMode }
115121 };
116122
117123 void drawCheckBox(uint16_t checkBoxID)
src/ft2_checkboxes.h+3−0
@@ -65,6 +65,7 @@ enum // CHECKBOXES · 64 unmodified lines
6565 CB_CONF_LINECOLORS,
6666 CB_CONF_CHANNUMS,
6767 CB_CONF_SHOW_VOLCOL,
68+ CB_CONF_ENABLE_CUSTOM_POINTER,
6869 CB_CONF_SOFTWARE_MOUSE,
6970
7071 // CONFIG MISCELLANEOUS
@@ -89,6 +90,8 @@ enum // CHECKBOXES · 18 unmodified lines
8990 CB_CONF_STRETCH_IMAGE,
9091 CB_CONF_PIXEL_FILTER,
9192
93+ CB_WAV_BPM_MODE,
94+
9295 NUM_CHECKBOXES
9396 };
9497
src/ft2_config.c+65−25
@@ -210,12 +210,40 @@ static void setDefaultConfigSettings(void) · 209 unmodified lines
210210 loadConfigFromBuffer(true);
211211 }
212212
213+static void updateImageStretchAndPixelFilter(uint8_t oldWindowFlags, uint8_t oldSpecialFlags2)
214+{
215+ bool didFullscreenUpdate = false;
216+
217+ // handle pixel filter change
218+ if ((oldWindowFlags & PIXEL_FILTER) != (config.windowFlags & PIXEL_FILTER))
219+ {
220+ recreateTexture();
221+ if (video.fullscreen) // force an update if in fullscreen mode
222+ {
223+ leaveFullscreen();
224+ enterFullscreen();
225+ didFullscreenUpdate = true;
226+ }
227+ }
228+
229+ // handle image stretch change
230+ if ((oldSpecialFlags2 & STRETCH_IMAGE) != (config.specialFlags2 & STRETCH_IMAGE))
231+ {
232+ if (video.fullscreen && !didFullscreenUpdate) // force an update if in fullscreen mode
233+ {
234+ leaveFullscreen();
235+ enterFullscreen();
236+ }
237+ }
238+}
239+
213240 void resetConfig(void)
214241 {
215242 if (okBox(2, "System request", "Are you sure you want to reset your FT2 configuration?") != 1)
216243 return;
217244
218245 const uint8_t oldWindowFlags = config.windowFlags;
246+ const uint8_t oldSpecialFlags2 = config.specialFlags2;
219247
220248 setDefaultConfigSettings();
221249 setToDefaultAudioOutputDevice();
@@ -228,17 +256,7 @@ void resetConfig(void) · 6 unmodified lines
228256 showBottomScreen();
229257
230258 setWindowSizeFromConfig(true);
231−
232− // handle pixel filter change
233− if ((oldWindowFlags & PIXEL_FILTER) != (config.windowFlags & PIXEL_FILTER))
234− {
235− recreateTexture();
236− if (video.fullscreen)
237− {
238− leaveFullScreen();
239− enterFullscreen();
240− }
241− }
259+ updateImageStretchAndPixelFilter(oldWindowFlags, oldSpecialFlags2);
242260
243261 if (config.specialFlags2 & HARDWARE_MOUSE)
244262 SDL_ShowCursor(SDL_TRUE);
@@ -339,6 +357,7 @@ bool loadConfig(bool showErrorFlag) · 94 unmodified lines
339357 void loadConfig2(void) // called by "Load config" button
340358 {
341359 const uint8_t oldWindowFlags = config.windowFlags;
360+ const uint8_t oldSpecialFlags2 = config.specialFlags2;
342361
343362 loadConfig(CONFIG_SHOW_ERRORS);
344363
@@ -346,16 +365,8 @@ void loadConfig2(void) // called by "Load config" button · 1 unmodified line
346365 showTopScreen(false);
347366 showBottomScreen();
348367
349− // handle pixel filter change
350− if ((oldWindowFlags & PIXEL_FILTER) != (config.windowFlags & PIXEL_FILTER))
351− {
352− recreateTexture();
353− if (video.fullscreen)
354− {
355− leaveFullScreen();
356− enterFullscreen();
357− }
358− }
368+ setWindowSizeFromConfig(true);
369+ updateImageStretchAndPixelFilter(oldWindowFlags, oldSpecialFlags2);
359370
360371 if (config.specialFlags2 & HARDWARE_MOUSE)
361372 SDL_ShowCursor(SDL_TRUE);
@@ -872,6 +883,7 @@ static void setConfigLayoutCheckButtonStates(void) · 510 unmodified lines
872883 checkBoxes[CB_CONF_LINECOLORS].checked = config.ptnLineLight;
873884 checkBoxes[CB_CONF_CHANNUMS].checked = config.ptnChnNumbers;
874885 checkBoxes[CB_CONF_SHOW_VOLCOL].checked = config.ptnShowVolColumn;
886+ checkBoxes[CB_CONF_ENABLE_CUSTOM_POINTER].checked = (config.specialFlags2 & USE_OS_MOUSE_POINTER) ? false : true;
875887 checkBoxes[CB_CONF_SOFTWARE_MOUSE].checked = (config.specialFlags2 & HARDWARE_MOUSE) ? false : true;
876888
877889 showCheckBox(CB_CONF_PATTSTRETCH);
@@ -882,6 +894,7 @@ static void setConfigLayoutCheckButtonStates(void) · 4 unmodified lines
882894 showCheckBox(CB_CONF_LINECOLORS);
883895 showCheckBox(CB_CONF_CHANNUMS);
884896 showCheckBox(CB_CONF_SHOW_VOLCOL);
897+ showCheckBox(CB_CONF_ENABLE_CUSTOM_POINTER);
885898 showCheckBox(CB_CONF_SOFTWARE_MOUSE);
886899 }
887900
@@ -1429,6 +1442,7 @@ void hideConfigScreen(void) · 541 unmodified lines
14291442 hideCheckBox(CB_CONF_LINECOLORS);
14301443 hideCheckBox(CB_CONF_CHANNUMS);
14311444 hideCheckBox(CB_CONF_SHOW_VOLCOL);
1445+ hideCheckBox(CB_CONF_ENABLE_CUSTOM_POINTER);
14321446 hideCheckBox(CB_CONF_SOFTWARE_MOUSE);
14331447 hidePushButton(PB_CONFIG_PAL_R_DOWN);
14341448 hidePushButton(PB_CONFIG_PAL_R_UP);
@@ -1737,6 +1751,29 @@ void cbConfigShowVolCol(void) · 302 unmodified lines
17371751 redrawPatternEditor();
17381752 }
17391753
1754+void cbEnableCustomPointer(void)
1755+{
1756+ config.specialFlags2 ^= USE_OS_MOUSE_POINTER;
1757+
1758+ if (config.specialFlags2 & USE_OS_MOUSE_POINTER)
1759+ {
1760+ checkBoxes[CB_CONF_ENABLE_CUSTOM_POINTER].checked = false;
1761+ drawCheckBox(CB_CONF_ENABLE_CUSTOM_POINTER);
1762+ }
1763+ else
1764+ {
1765+ checkBoxes[CB_CONF_ENABLE_CUSTOM_POINTER].checked = true;
1766+ drawCheckBox(CB_CONF_ENABLE_CUSTOM_POINTER);
1767+ }
1768+
1769+ if (config.specialFlags2 & HARDWARE_MOUSE)
1770+ SDL_ShowCursor(SDL_TRUE);
1771+ else
1772+ SDL_ShowCursor(SDL_FALSE);
1773+
1774+ createMouseCursors();
1775+}
1776+
17401777 void cbSoftwareMouse(void)
17411778 {
17421779 config.specialFlags2 ^= HARDWARE_MOUSE;
@@ -1747,14 +1784,17 @@ void cbSoftwareMouse(void) · 4 unmodified lines
17471784 {
17481785 checkBoxes[CB_CONF_SOFTWARE_MOUSE].checked = false;
17491786 drawCheckBox(CB_CONF_SOFTWARE_MOUSE);
1750− SDL_ShowCursor(SDL_TRUE);
17511787 }
17521788 else
17531789 {
17541790 checkBoxes[CB_CONF_SOFTWARE_MOUSE].checked = true;
17551791 drawCheckBox(CB_CONF_SOFTWARE_MOUSE);
1756− SDL_ShowCursor(SDL_FALSE);
17571792 }
1793+
1794+ if (config.specialFlags2 & HARDWARE_MOUSE)
1795+ SDL_ShowCursor(SDL_TRUE);
1796+ else
1797+ SDL_ShowCursor(SDL_FALSE);
17581798 }
17591799
17601800 void rbConfigMouseNice(void)
@@ -2081,7 +2121,7 @@ void cbPixelFilter(void) · 320 unmodified lines
20812121 recreateTexture();
20822122 if (video.fullscreen)
20832123 {
2084− leaveFullScreen();
2124+ leaveFullscreen();
20852125 enterFullscreen();
20862126 }
20872127 }
@@ -2092,7 +2132,7 @@ void cbStretchImage(void) · 4 unmodified lines
20922132
20932133 if (video.fullscreen)
20942134 {
2095− leaveFullScreen();
2135+ leaveFullscreen();
20962136 enterFullscreen();
20972137 }
20982138 }
src/ft2_config.h+3−1
@@ -80,9 +80,10 @@ enum · 79 unmodified lines
8080 LINED_SCOPES = 128,
8181
8282 // specialFlags2
83− DITHERED_AUDIO = 1, /* DEPRECATED */
83+ DITHERED_AUDIO = 1, /* DEPRECATED (but don't use it for anything else!) */
8484 HARDWARE_MOUSE = 2,
8585 STRETCH_IMAGE = 4,
86+ USE_OS_MOUSE_POINTER = 8,
8687
8788 // windowFlags
8889 WINSIZE_AUTO = 1,
@@ -260,6 +261,7 @@ void cbConfigFramework(void); · 171 unmodified lines
260261 void cbConfigLineColors(void);
261262 void cbConfigChanNums(void);
262263 void cbConfigShowVolCol(void);
264+void cbEnableCustomPointer(void);
263265 void cbSoftwareMouse(void);
264266 void cbSampCutToBuff(void);
265267 void cbPattCutToBuff(void);
src/ft2_diskop.c+7−2
@@ -2251,13 +2251,18 @@ void showDiskOpScreen(void) · 2250 unmodified lines
22512251 // first test if we can change the dir to the one stored in the config (if present)
22522252 if (FReq_ModCurPathU[0] == '\0' || UNICHAR_CHDIR(FReq_ModCurPathU) != 0)
22532253 {
2254− // nope, couldn't do that, set Disk Op. path to user/home directory
2254+ // nope, couldn't do that, set Disk Op. path to the user's desktop directory
22552255 #ifdef _WIN32
2256− SHGetFolderPathW(NULL, CSIDL_PROFILE, NULL, 0, FReq_ModCurPathU);
2256+ SHGetFolderPathW(NULL, CSIDL_DESKTOPDIRECTORY, NULL, 0, FReq_ModCurPathU);
22572257 #else
22582258 char *home = getenv("HOME");
22592259 if (home != NULL)
2260+ {
2261+ UNICHAR_CHDIR(home);
22602262 UNICHAR_STRCPY(FReq_ModCurPathU, home);
2263+
2264+ UNICHAR_STRCAT(FReq_ModCurPathU, "/Desktop");
2265+ }
22612266 #endif
22622267 UNICHAR_CHDIR(FReq_ModCurPathU);
22632268 }
src/ft2_edit.c+9−1
@@ -118,7 +118,15 @@ static bool testEditKeys(SDL_Scancode scancode, SDL_Keycode keycode) · 117 unmodified lines
118118 }
119119
120120 if (i == KEY2VOL_ENTRIES)
121− i = -1; // invalid key for slot
121+ {
122+ // volume column key not found, let's try a hack for '-' and '+' keys first
123+ if (scancode == SDL_SCANCODE_MINUS)
124+ i = 5;
125+ else if (scancode == SDL_SCANCODE_EQUALS)
126+ i = 6;
127+ else
128+ i = -1; // invalid key for slot
129+ }
122130 }
123131 else if (cursor.object == CURSOR_EFX0)
124132 {
src/ft2_events.c+18−51
@@ -38,7 +38,7 @@ · 37 unmodified lines
3838 "Try to mention what you did before the crash happened.\n" \
3939 "My email can be found at the bottom of www.16-bits.org."
4040
41−static bool backupMadeAfterCrash;
41+static bool backupMadeAfterCrash, didDropFile;
4242
4343 #ifdef _WIN32
4444 #define SYSMSG_FILE_ARG (WM_USER+1)
@@ -48,52 +48,16 @@ static bool backupMadeAfterCrash; · 3 unmodified lines
4848 static HWND hWnd;
4949 static HANDLE oneInstHandle, hMapFile;
5050 static LPCTSTR sharedMemBuf;
51−
52−// used for Windows usleep() implementation
53−static NTSTATUS (__stdcall *NtDelayExecution)(BOOL Alertable, PLARGE_INTEGER DelayInterval);
5451 #endif
5552
56−static void handleInput(void);
57−
58−// usleep() implementation for Windows (Warning: This might not be future-safe!)
59−#ifdef _WIN32
60−void usleep(uint32_t usec)
61−{
62− LARGE_INTEGER lpDueTime;
63−
64− if (NtDelayExecution == NULL)
65− {
66− // NtDelayExecution() is not available (shouldn't happen), use regular sleep()
67− Sleep(usec / 1000);
68− }
69− else
70− {
71− // this prevents a 64-bit MUL (will not overflow with the ranges we use anyway)
72− lpDueTime.HighPart = UINT32_MAX;
73− lpDueTime.LowPart = (DWORD)(-10 * (int32_t)usec);
74−
75− NtDelayExecution(false, &lpDueTime);
76− }
77−}
78−
79−void setupWin32Usleep(void)
80−{
81− NtDelayExecution = (NTSTATUS (__stdcall *)(BOOL, PLARGE_INTEGER))GetProcAddress(GetModuleHandle("ntdll.dll"), "NtDelayExecution");
82− timeBeginPeriod(0); // enter highest timer resolution
83−}
84−
85−void freeWin32Usleep(void)
86−{
87− timeEndPeriod(0); // exit highest timer resolution
88−}
89−#endif
53+static void handleSDLEvents(void);
9054
9155 void readInput(void)
9256 {
9357 readMouseXY();
9458 readKeyModifiers();
9559 setSyncedReplayerVars();
96− handleInput();
60+ handleSDLEvents();
9761 }
9862
9963 void handleThreadEvents(void)
@@ -402,21 +366,13 @@ void handleWaitVblQuirk(SDL_Event *event) · 302 unmodified lines
402366 else if (event->window.event == SDL_WINDOWEVENT_SHOWN)
403367 video.windowHidden = false;
404368
405− if (video.vsync60HzPresent)
406− {
407− /* If we minimize the window and vsync is present, vsync is temporarily turned off.
408− ** recalc waitVBL() vars so that it can sleep properly in said mode.
409− */
410− if (event->window.event == SDL_WINDOWEVENT_MINIMIZED ||
411− event->window.event == SDL_WINDOWEVENT_FOCUS_LOST)
412− {
413− setupWaitVBL();
414− }
415− }
369+ // reset vblank end time if we minimize window
370+ if (event->window.event == SDL_WINDOWEVENT_MINIMIZED || event->window.event == SDL_WINDOWEVENT_FOCUS_LOST)
371+ hpc_ResetCounters(&video.vblankHpc);
416372 }
417373 }
418374
419−static void handleInput(void)
375+static void handleSDLEvents(void)
420376 {
421377 SDL_Event event;
422378
@@ -492,6 +448,10 @@ static void handleInput(void) · 69 unmodified lines
492448 editor.autoPlayOnDrop = false;
493449 loadDroppedFile(event.drop.file, true);
494450 SDL_free(event.drop.file);
451+
452+ // kludge: allow focus-clickthrough after drag-n-drop
453+ SDL_SetHint(SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH, "1");
454+ didDropFile = true;
495455 }
496456 else if (event.type == SDL_QUIT)
497457 {
@@ -529,6 +489,13 @@ static void handleInput(void) · 31 unmodified lines
529489 else if (event.type == SDL_MOUSEBUTTONUP)
530490 {
531491 mouseButtonUpHandler(event.button.button);
492+
493+ // kludge: we drag-n-dropped a file before this mouse click release, restore focus-clickthrough mode
494+ if (didDropFile)
495+ {
496+ didDropFile = false;
497+ SDL_SetHint(SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH, "0");
498+ }
532499 }
533500 else if (event.type == SDL_MOUSEBUTTONDOWN)
534501 {
src/ft2_events.h+0−3
@@ -20,7 +20,4 @@ void handleWaitVblQuirk(SDL_Event *event); · 19 unmodified lines
2020 #ifdef _WIN32
2121 bool handleSingleInstancing(int32_t argc, char **argv);
2222 void closeSingleInstancing(void);
23−void usleep(uint32_t usec);
24−void setupWin32Usleep(void);
25−void freeWin32Usleep(void);
2623 #endif
src/ft2_header.h+4−7
@@ -12,11 +12,11 @@ · 11 unmodified lines
1212 #endif
1313 #include "ft2_replayer.h"
1414
15−#define PROG_VER_STR "1.51"
15+#define PROG_VER_STR "1.63"
1616
1717 // do NOT change these! It will only mess things up...
1818
19−#define FT2_VBLANK_HZ 70
19+#define FT2_VBLANK_HZ 70.086302895323 /* nominal, 640x400 @ 70Hz */
2020 #define SCREEN_W 632
2121 #define SCREEN_H 400
2222
@@ -37,8 +37,8 @@ · 14 unmodified lines
3737 ** branchless in the inner channel mixer loop.
3838 ** Warning: Do not change this!
3939 */
40−#define SMP_DAT_OFFSET 32
41−#define SAMPLE_PAD_LENGTH (SMP_DAT_OFFSET+32)
40+#define SMP_DAT_OFFSET ((SINC_LEFT_TAPS*2)+1)
41+#define SAMPLE_PAD_LENGTH (SMP_DAT_OFFSET+(SINC_RIGHT_TAPS*2))
4242
4343 #ifndef _WIN32
4444 #define _stricmp strcasecmp
@@ -69,9 +69,6 @@ · 24 unmodified lines
6969 // fast 32-bit -> 16-bit clamp
7070 #define CLAMP16(i) if ((int16_t)(i) != i) i = 0x7FFF ^ (i >> 31)
7171
72−#define ALIGN_PTR(p, x) (((uintptr_t)(p) + ((x)-1)) & ~((x)-1))
73−#define MALLOC_PAD(size, pad) (malloc((size) + (pad)))
74−
7572 #define SWAP16(x) \
7673 ( \
7774 (((uint16_t)((x) & 0x00FF)) << 8) | \
src/ft2_hpc.c+163−0
@@ -0,0 +1,163 @@
1+/*
2+** Hardware Performance Counter delay routines
3+*/
4+
5+#ifdef _WIN32
6+#define WIN32_MEAN_AND_LEAN
7+#include <windows.h>
8+#else
9+#include <unistd.h>
10+#endif
11+#include <SDL2/SDL.h>
12+#include <stdint.h>
13+#include <stdbool.h>
14+#include "ft2_hpc.h"
15+
16+#define FRAC_BITS 63
17+#define FRAC_SCALE (1ULL << FRAC_BITS)
18+#define FRAC_MASK (FRAC_SCALE-1)
19+
20+hpcFreq_t hpcFreq;
21+
22+#ifdef _WIN32 // Windows usleep() implementation
23+
24+#define STATUS_SUCCESS 0
25+
26+static bool canAdjustTimerResolution;
27+
28+static NTSTATUS (__stdcall *NtDelayExecution)(BOOL Alertable, PLARGE_INTEGER DelayInterval);
29+static NTSTATUS (__stdcall *NtQueryTimerResolution)(PULONG MinimumResolution, PULONG MaximumResolution, PULONG ActualResolution);
30+static NTSTATUS (__stdcall *NtSetTimerResolution)(ULONG DesiredResolution, BOOLEAN SetResolution, PULONG CurrentResolution);
31+
32+static void (*usleep)(int32_t usec);
33+
34+static void usleepGood(int32_t usec)
35+{
36+ LARGE_INTEGER delayInterval;
37+
38+ // NtDelayExecution() delays in 100ns-units, and a negative value means to delay from current time
39+ usec *= -10;
40+
41+ delayInterval.HighPart = 0xFFFFFFFF; // negative 64-bit value, we only set the lower dword
42+ delayInterval.LowPart = usec;
43+ NtDelayExecution(false, &delayInterval);
44+}
45+
46+static void usleepPoor(int32_t usec) // fallback if no NtDelayExecution()
47+{
48+ Sleep((usec + 500) / 1000);
49+}
50+
51+static void windowsSetupUsleep(void)
52+{
53+ NtDelayExecution = (NTSTATUS (__stdcall *)(BOOL, PLARGE_INTEGER))GetProcAddress(GetModuleHandle("ntdll.dll"), "NtDelayExecution");
54+ usleep = (NtDelayExecution != NULL) ? usleepGood : usleepPoor;
55+
56+ NtQueryTimerResolution = (NTSTATUS (__stdcall *)(PULONG, PULONG, PULONG))GetProcAddress(GetModuleHandle("ntdll.dll"), "NtQueryTimerResolution");
57+ NtSetTimerResolution = (NTSTATUS (__stdcall *)(ULONG, BOOLEAN, PULONG))GetProcAddress(GetModuleHandle("ntdll.dll"), "NtSetTimerResolution");
58+ canAdjustTimerResolution = (NtQueryTimerResolution != NULL && NtSetTimerResolution != NULL);
59+}
60+#endif
61+
62+void hpc_Init(void)
63+{
64+#ifdef _WIN32
65+ windowsSetupUsleep();
66+#endif
67+ hpcFreq.freq64 = SDL_GetPerformanceFrequency();
68+
69+ double dFreq = (double)hpcFreq.freq64;
70+
71+ hpcFreq.dFreqMulMs = 1000.0 / dFreq;
72+ hpcFreq.dFreqMulMicro = (1000.0 * 1000.0) / dFreq;
73+}
74+
75+// returns 64-bit fractional part of u64 divided by u32
76+static uint64_t getFrac64FromU64DivU32(uint64_t dividend, uint32_t divisor)
77+{
78+ if (dividend == 0 || divisor == 0 || divisor >= dividend)
79+ return 0;
80+
81+ dividend %= divisor;
82+
83+ if (dividend == 0)
84+ return 0;
85+
86+ const uint32_t quotient = (uint32_t)((dividend << 32) / divisor);
87+ const uint32_t remainder = (uint32_t)((dividend << 32) % divisor);
88+
89+ const uint32_t resultHi = quotient;
90+ const uint32_t resultLo = (uint32_t)(((uint64_t)remainder << 32) / divisor);
91+
92+ return ((uint64_t)resultHi << 32) | resultLo;
93+}
94+
95+void hpc_SetDurationInHz(hpc_t *hpc, uint32_t hz)
96+{
97+ // set 64:63fp value
98+ hpc->durationInt = hpcFreq.freq64 / hz;
99+ hpc->durationFrac = getFrac64FromU64DivU32(hpcFreq.freq64, hz) >> 1;
100+
101+ hpc->resetFrame = hz * 3600; // reset counters every hour
102+}
103+
104+void hpc_ResetCounters(hpc_t *hpc)
105+{
106+ hpc->endTimeInt = SDL_GetPerformanceCounter() + hpc->durationInt;
107+ hpc->endTimeFrac = hpc->durationFrac;
108+}
109+
110+void hpc_Wait(hpc_t *hpc)
111+{
112+#ifdef _WIN32
113+ /* Make sure resolution is set to 0.5ms (safest minimum) - this is confirmed to improve
114+ ** NtDelayExecution() and Sleep(). This will only be changed when needed, not per frame.
115+ */
116+ ULONG curRes, minRes, maxRes, junk;
117+ if (canAdjustTimerResolution && NtQueryTimerResolution(&minRes, &maxRes, &curRes) == STATUS_SUCCESS)
118+ {
119+ if (curRes != 5000 && maxRes <= 5000)
120+ NtSetTimerResolution(5000, TRUE, &junk); // 0.5ms
121+ }
122+#endif
123+
124+ const uint64_t currTime64 = SDL_GetPerformanceCounter();
125+ if (currTime64 < hpc->endTimeInt)
126+ {
127+ uint64_t timeLeft64 = hpc->endTimeInt - currTime64;
128+
129+ // convert to int32_t for fast SSE2 SIMD usage lateron
130+ if (timeLeft64 > INT32_MAX)
131+ timeLeft64 = INT32_MAX;
132+
133+ const int32_t timeLeft32 = (int32_t)timeLeft64;
134+
135+ int32_t microSecsLeft = (int32_t)((timeLeft32 * hpcFreq.dFreqMulMicro) + 0.5); // rounded
136+ if (microSecsLeft > 0)
137+ usleep(microSecsLeft);
138+ }
139+
140+ // set next end time
141+
142+ hpc->endTimeInt += hpc->durationInt;
143+
144+ // handle fractional part
145+ hpc->endTimeFrac += hpc->durationFrac;
146+ if (hpc->endTimeFrac >= FRAC_SCALE)
147+ {
148+ hpc->endTimeFrac &= FRAC_MASK;
149+ hpc->endTimeInt++;
150+ }
151+
152+ /* The counter ("endTimeInt") can accumulate major errors after a couple of hours,
153+ ** since each frame is not happening at perfect intervals.
154+ ** To fix this, reset the counter's int & frac once every hour. We should only get
155+ ** up to one frame of stutter while they are resetting, then it's back to normal.
156+ */
157+ hpc->frameCounter++;
158+ if (hpc->frameCounter >= hpc->resetFrame)
159+ {
160+ hpc->frameCounter = 0;
161+ hpc_ResetCounters(hpc);
162+ }
163+}
src/ft2_hpc.h+24−0
@@ -0,0 +1,24 @@
1+#pragma once
2+
3+#include <stdint.h>
4+#include <stdbool.h>
5+
6+typedef struct
7+{
8+ uint64_t freq64;
9+ double dFreqMulMicro, dFreqMulMs;
10+} hpcFreq_t;
11+
12+typedef struct
13+{
14+ uint64_t durationInt, durationFrac;
15+ uint64_t endTimeInt, endTimeFrac;
16+ uint64_t frameCounter, resetFrame;
17+} hpc_t;
18+
19+extern hpcFreq_t hpcFreq;
20+
21+void hpc_Init(void);
22+void hpc_SetDurationInHz(hpc_t *hpc, uint32_t dHz);
23+void hpc_ResetCounters(hpc_t *hpc);
24+void hpc_Wait(hpc_t *hpc);
src/ft2_inst_ed.c+2−1
@@ -175,9 +175,10 @@ static int32_t SDLCALL copyInstrThread(void *ptr) · 174 unmodified lines
175175 pauseAudio();
176176 freeInstr(dstIns);
177177
178− bool error = true;
178+ bool error = false;
179179 if (instr[srcIns] != NULL)
180180 {
181+ error = true;
181182 if (allocateInstr(dstIns))
182183 {
183184 int16_t i;
src/ft2_keyboard.c+2−2
@@ -703,7 +703,7 @@ static bool checkModifiedKeys(SDL_Keycode keycode) · 702 unmodified lines
703703 {
704704 if (keyb.leftAltPressed)
705705 {
706− toggleFullScreen();
706+ toggleFullscreen();
707707
708708 // prevent fullscreen toggle from firing twice on certain SDL2 Linux ports
709709 #ifdef __unix__
@@ -896,7 +896,7 @@ static bool checkModifiedKeys(SDL_Keycode keycode) · 186 unmodified lines
896896 #ifdef __APPLE__
897897 if (keyb.leftCommandPressed && keyb.leftCtrlPressed)
898898 {
899− toggleFullScreen();
899+ toggleFullscreen();
900900 return true;
901901 }
902902 else
src/ft2_main.c+13−35
@@ -33,12 +33,12 @@ · 32 unmodified lines
3333 #include "ft2_events.h"
3434 #include "ft2_bmp.h"
3535 #include "ft2_structs.h"
36+#include "ft2_hpc.h"
3637
3738 #ifdef HAS_MIDI
3839 static SDL_Thread *initMidiThread;
3940 #endif
4041
41−static void setupPerfFreq(void);
4242 static void initializeVars(void);
4343 static void cleanUpAndExit(void); // never call this inside the main loop
4444 #ifdef __APPLE__
@@ -60,7 +60,7 @@ int main(int argc, char *argv[]) · 15 unmodified lines
6060 _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
6161 #endif
6262
63−#if SDL_PATCHLEVEL < 5
63+#if SDL_MAJOR_VERSION == 2 && SDL_MINOR_VERSION == 0 && SDL_PATCHLEVEL < 5
6464 #pragma message("WARNING: The SDL2 dev lib is older than ver 2.0.5. You'll get fullscreen mode issues and no audio input sampling.")
6565 #pragma message("At least version 2.0.7 is recommended.")
6666 #endif
@@ -93,12 +93,13 @@ int main(int argc, char *argv[]) · 26 unmodified lines
9393 }
9494 #endif
9595
96−#if SDL_PATCHLEVEL >= 4 // SDL 2.0.4 or later
97− SDL_SetHint(SDL_HINT_WINDOWS_NO_CLOSE_ON_ALT_F4, "1"); // windows only - prevent ALT+F4 from exiting (FT2 uses ALT+F4)
96+#ifdef _WIN32
97+
98+ // ALT+F4 is used in FT2, but is "close program" in Windows...
99+#if SDL_MINOR_VERSION >= 24 || (SDL_MINOR_VERSION == 0 && SDL_PATCHLEVEL >= 4)
100+ SDL_SetHint(SDL_HINT_WINDOWS_NO_CLOSE_ON_ALT_F4, "1");
98101 #endif
99102
100−#ifdef _WIN32
101−
102103 #ifndef _MSC_VER
103104 SetProcessDPIAware();
104105 #endif
@@ -117,7 +118,6 @@ int main(int argc, char *argv[]) · 12 unmodified lines
117118 return 0;
118119 }
119120
120− setupWin32Usleep();
121121 disableWasapi(); // disable problematic WASAPI SDL2 audio driver on Windows (causes clicks/pops sometimes...)
122122 // 13.03.2020: This is still needed with SDL 2.0.12...
123123 #endif
@@ -127,7 +127,7 @@ int main(int argc, char *argv[]) · 3 unmodified lines
127127 ** reinitialized in Windows and what not.
128128 ** Ref.: https://bugzilla.libsdl.org/show_bug.cgi?id=4391
129129 */
130−#if defined _WIN32 && SDL_PATCHLEVEL == 9
130+#if defined _WIN32 && SDL_MAJOR_VERSION == 2 && SDL_MINOR_VERSION == 0 && SDL_PATCHLEVEL == 9
131131 if (SDL_Init(SDL_INIT_AUDIO | SDL_INIT_VIDEO | SDL_INIT_JOYSTICK) != 0)
132132 #else
133133 if (SDL_Init(SDL_INIT_AUDIO | SDL_INIT_VIDEO) != 0)
@@ -144,6 +144,9 @@ int main(int argc, char *argv[]) · 10 unmodified lines
144144 */
145145 SDL_StopTextInput();
146146
147+ hpc_Init();
148+ hpc_SetDurationInHz(&video.vblankHpc, VBLANK_HZ);
149+
147150 #ifdef __APPLE__
148151 osxSetDirToProgramDirFromArgs(argv);
149152 #endif
@@ -178,8 +181,6 @@ int main(int argc, char *argv[]) · 28 unmodified lines
178181 audio.currOutputDevice = getAudioOutputDeviceFromConfig();
179182 audio.currInputDevice = getAudioInputDeviceFromConfig();
180183
181− setupPerfFreq();
182−
183184 if (!setupAudio(CONFIG_HIDE_ERRORS)) // can we open the audio device?
184185 {
185186 // nope, try with the default audio device
@@ -232,11 +233,11 @@ int main(int argc, char *argv[]) · 46 unmodified lines
232233 SDL_DetachThread(initMidiThread); // don't wait for this thread, let it clean up when done
233234 #endif
234235
235− setupWaitVBL(); // this is needed for potential okBox() calls in handleModuleLoadFromArg()
236+ hpc_ResetCounters(&video.vblankHpc); // quirk: this is needed for potential okBox() calls in handleModuleLoadFromArg()
236237 handleModuleLoadFromArg(argc, argv);
237238
238239 editor.mainLoopOngoing = true;
239− setupWaitVBL(); // this must be the very last thing done before entering the main loop
240+ hpc_ResetCounters(&video.vblankHpc); // this must be the last thing we do before entering the main loop
240241
241242 while (editor.programRunning)
242243 {
@@ -377,7 +378,6 @@ static void cleanUpAndExit(void) // never call this inside the main loop! · 134 unmodified lines
377378 }
378379
379380 #ifdef _WIN32
380− freeWin32Usleep();
381381 closeSingleInstancing();
382382 #endif
383383
@@ -417,28 +417,6 @@ static void osxSetDirToProgramDirFromArgs(char **argv) · 33 unmodified lines
417417 }
418418 #endif
419419
420−static void setupPerfFreq(void)
421−{
422− double dInt;
423−
424− const uint64_t perfFreq64 = SDL_GetPerformanceFrequency();
425− assert(perfFreq64 != 0);
426−
427− editor.dPerfFreq = (double)perfFreq64;
428− editor.dPerfFreqMulMicro = 1000000.0 / editor.dPerfFreq;
429− editor.dPerfFreqMulMs = 1.0 / (editor.dPerfFreq / 1000.0);
430−
431− // calculate vblank time for performance counters and split into int/frac
432− double dFrac = modf(editor.dPerfFreq / VBLANK_HZ, &dInt);
433−
434− // integer part
435− video.vblankTimeLen = (int32_t)dInt;
436−
437− // fractional part scaled to 0..2^32-1
438− dFrac *= UINT32_MAX+1.0;
439− video.vblankTimeLenFrac = (uint32_t)dFrac;
440−}
441−
442420 #ifdef _WIN32
443421 static void disableWasapi(void)
444422 {
src/ft2_mouse.c+42−6
@@ -32,6 +32,12 @@ static SDL_Cursor *cursors[NUM_CURSORS]; · 31 unmodified lines
3232
3333 static bool setSystemCursor(SDL_Cursor *cur)
3434 {
35+ if (config.specialFlags2 & USE_OS_MOUSE_POINTER)
36+ {
37+ SDL_SetCursor(SDL_GetDefaultCursor());
38+ return true;
39+ }
40+
3541 if (cur == NULL)
3642 {
3743 SDL_SetCursor(SDL_GetDefaultCursor());
@@ -77,8 +83,18 @@ bool createMouseCursors(void) // creates scaled SDL surfaces for current mouse p · 39 unmodified lines
7783 if (surface == NULL)
7884 {
7985 freeMouseCursors();
80− config.specialFlags2 &= ~HARDWARE_MOUSE; // enable software mouse
81− SDL_ShowCursor(SDL_FALSE);
86+
87+ if (config.specialFlags2 & USE_OS_MOUSE_POINTER)
88+ {
89+ SDL_ShowCursor(SDL_TRUE);
90+ }
91+ else
92+ {
93+ // enable software mouse
94+ config.specialFlags2 &= ~HARDWARE_MOUSE;
95+ SDL_ShowCursor(SDL_FALSE);
96+ }
97+
8298 return false;
8399 }
84100
@@ -148,8 +164,18 @@ bool createMouseCursors(void) // creates scaled SDL surfaces for current mouse p · 63 unmodified lines
148164 {
149165 SDL_FreeSurface(surface);
150166 freeMouseCursors();
151− config.specialFlags2 &= ~HARDWARE_MOUSE; // enable software mouse
152− SDL_ShowCursor(SDL_FALSE);
167+
168+ if (config.specialFlags2 & USE_OS_MOUSE_POINTER)
169+ {
170+ SDL_ShowCursor(SDL_TRUE);
171+ }
172+ else
173+ {
174+ // enable software mouse
175+ config.specialFlags2 &= ~HARDWARE_MOUSE;
176+ SDL_ShowCursor(SDL_FALSE);
177+ }
178+
153179 return false;
154180 }
155181
@@ -658,8 +684,8 @@ void mouseButtonDownHandler(uint8_t mouseButton) · 502 unmodified lines
658684 return;
659685 }
660686
661− // mouse 0,0 = open exit dialog
662− if (mouse.x == 0 && mouse.y == 0)
687+ // mouse 0,0 = open exit dialog (also make sure the test always works in fullscreen mode)
688+ if ((mouse.x == 0 && mouse.y == 0) || (video.fullscreen && (video.renderX > 0 || video.renderY > 0) && (mouse.rawX == 0 && mouse.rawY == 0)))
663689 {
664690 if (quitBox(false) == 1)
665691 editor.throwExit = true;
@@ -808,8 +834,12 @@ void readMouseXY(void) · 142 unmodified lines
808834 {
809835 mouse.buttonState = SDL_GetGlobalMouseState(&mx, &my);
810836
837+ mouse.absX = mx;
838+ mouse.absY = my;
839+
811840 // convert desktop coords to window coords
812841 SDL_GetWindowPosition(video.window, &windowX, &windowY);
842+
813843 mx -= windowX;
814844 my -= windowY;
815845 }
@@ -817,8 +847,14 @@ void readMouseXY(void) · 1 unmodified line
817847 {
818848 // special mode for KMSDRM (XXX: Confirm that this still works...)
819849 mouse.buttonState = SDL_GetMouseState(&mx, &my);
850+
851+ mouse.absX = mx;
852+ mouse.absY = my;
820853 }
821854
855+ mouse.rawX = mx;
856+ mouse.rawY = my;
857+
822858 if (video.fullscreen)
823859 {
824860 // centered fullscreen mode (not stretched) needs further coord translation
src/ft2_mouse.h+1−1
@@ -20,7 +20,7 @@ typedef struct mouse_t · 19 unmodified lines
2020 bool firstTimePressingButton, mouseOverTextBox;
2121 int8_t buttonCounter, mode;
2222 int16_t lastUsedObjectID, lastUsedObjectType, lastEditBox;
23− int32_t x, y, lastX, lastY, xBias, yBias, setPosX, setPosY;
23+ int32_t absX, absY, rawX, rawY, x, y, lastX, lastY, xBias, yBias, setPosX, setPosY;
2424 int32_t lastScrollX, lastScrollXTmp, lastScrollY, saveMouseX, saveMouseY;
2525 uint32_t buttonState;
2626 } mouse_t;
src/ft2_pushbuttons.c+1−1
@@ -382,7 +382,7 @@ pushButton_t pushButtons[NUM_PUSHBUTTONS] = · 381 unmodified lines
382382
383383 // ------ WAV RENDERER PUSHBUTTONS ------
384384 //x, y, w, h, p, d, text #1, text #2, funcOnDown, funcOnUp
385− { 3, 111, 73, 43, 0, 0, "Export", NULL, NULL, pbWavRender },
385+ { 3, 138, 73, 16, 0, 0, "Export", NULL, NULL, pbWavRender },
386386 { 3, 155, 73, 16, 0, 0, "Exit", NULL, NULL, pbWavExit },
387387 { 253, 114, 18, 13, 1, 6, ARROW_UP_STRING, NULL, pbWavFreqUp, NULL },
388388 { 270, 114, 18, 13, 1, 6, ARROW_DOWN_STRING, NULL, pbWavFreqDown, NULL },
src/ft2_replayer.c+22−5
@@ -311,7 +311,7 @@ void setFrequencyTable(bool linearPeriodsFlag) · 310 unmodified lines
311311 if (ui.configScreenShown && editor.currConfigScreen == CONFIG_SCREEN_IO_DEVICES)
312312 {
313313 // update "frequency table" radiobutton, if it's shown
314− setConfigIORadioButtonStates();
314+ setConfigIORadioButtonStates();
315315
316316 // update mid-C freq. in instr. editor (it can slightly differ between Amiga/linear)
317317 if (ui.instEditorShown)
@@ -404,7 +404,7 @@ void calcReplayerLogTab(void) // for linear period -> hz calculation · 86 unmodified lines
404404 dExp2MulTab[i] = 1.0 / exp2(i); // 1/(2^i)
405405
406406 for (int32_t i = 0; i < 4*12*16; i++)
407− dLogTab[i] = 8363.0 * exp2(i / 768.0) * 256.0;
407+ dLogTab[i] = (8363.0 * 256.0) * exp2(i / (4.0 * 12.0 * 16.0));
408408 }
409409
410410 void calcReplayerVars(int32_t audioFreq)
@@ -839,7 +839,7 @@ static void setEnvelopePos(channel_t *ch, uint8_t param) · 428 unmodified lines
839839 }
840840
841841 // *** PANNING ENVELOPE ***
842− if (ins->volEnvFlags & ENV_SUSTAIN) // What..? An FT2 bug!?
842+ if (ins->volEnvFlags & ENV_SUSTAIN) // FT2 PLAYER BUG: Should've been ins->panEnvFlags
843843 {
844844 ch->panEnvTick = param-1;
845845
@@ -2215,6 +2215,15 @@ static void getNextPos(void) · 1369 unmodified lines
22152215 song.pattNum = song.orders[song.songPos & 0xFF];
22162216 song.currNumRows = patternNumRows[song.pattNum & 0xFF];
22172217 }
2218+
2219+ /*
2220+ ** Because of a bug in FT2, pattern loop commands will manipulate
2221+ ** the row the next pattern will begin at (should be 0).
2222+ ** However, this can overflow the number of rows (length) for that
2223+ ** pattern and cause out-of-bounds reads. Set to row 0 in this case.
2224+ */
2225+ if (song.row >= song.currNumRows)
2226+ song.row = 0;
22182227 }
22192228 }
22202229
@@ -2229,7 +2238,6 @@ void resumeMusic(void) // starts reading pattern data · 8 unmodified lines
22292238 musicPaused = false;
22302239 }
22312240
2232−
22332241 void tickReplayer(void) // periodically called from audio callback
22342242 {
22352243 int32_t i;
@@ -3127,11 +3135,20 @@ void resetReplayerState(void) · 891 unmodified lines
31273135 song.pBreakPos = 0;
31283136 song.pBreakFlag = false;
31293137
3138+ // reset pattern loops (E6x)
3139+ channel_t *ch = channel;
3140+ for (int32_t i = 0; i < song.numChannels; i++, ch++)
3141+ {
3142+ ch->jumpToRow = 0;
3143+ ch->patLoopCounter = 0;
3144+ }
3145+
3146+ // reset global volume (if song was playing)
31303147 if (songPlaying)
31313148 {
31323149 song.globalVolume = 64;
31333150
3134− channel_t *ch = channel;
3151+ ch = channel;
31353152 for (int32_t i = 0; i < song.numChannels; i++, ch++)
31363153 ch->status |= IS_Vol;
31373154 }
src/ft2_sample_ed.c+31−19
@@ -153,26 +153,34 @@ bool cloneSample(sample_t *src, sample_t *dst) · 152 unmodified lines
153153 smpPtr_t sp;
154154
155155 freeSmpData(dst);
156− memcpy(dst, src, sizeof (sample_t));
157156
158− // zero out stuff that wasn't supposed to be cloned
159− dst->origDataPtr = dst->dataPtr = NULL;
160− dst->isFixed = false;
161− dst->fixedPos = 0;
162−
163− // if source sample isn't empty, allocate room and copy it over (and fix it)
164− if (src->length > 0 && src->dataPtr != NULL)
157+ if (src == NULL)
165158 {
166− bool sample16Bit = !!(src->flags & SAMPLE_16BIT);
167− if (!allocateSmpDataPtr(&sp, src->length, sample16Bit))
159+ memset(dst, 0, sizeof (sample_t));
160+ }
161+ else
162+ {
163+ memcpy(dst, src, sizeof (sample_t));
164+
165+ // zero out stuff that wasn't supposed to be cloned
166+ dst->origDataPtr = dst->dataPtr = NULL;
167+ dst->isFixed = false;
168+ dst->fixedPos = 0;
169+
170+ // if source sample isn't empty, allocate room and copy it over (and fix it)
171+ if (src->length > 0 && src->dataPtr != NULL)
168172 {
169− dst->length = 0;
170− return false;
171− }
173+ bool sample16Bit = !!(src->flags & SAMPLE_16BIT);
174+ if (!allocateSmpDataPtr(&sp, src->length, sample16Bit))
175+ {
176+ dst->length = 0;
177+ return false;
178+ }
172179
173− setSmpDataPtr(dst, &sp);
174− memcpy(dst->dataPtr, src->dataPtr, src->length << sample16Bit);
175− fixSample(dst);
180+ setSmpDataPtr(dst, &sp);
181+ memcpy(dst->dataPtr, src->dataPtr, src->length << sample16Bit);
182+ fixSample(dst);
183+ }
176184 }
177185
178186 return true;
@@ -695,14 +703,18 @@ static bool getCopyBuffer(int32_t size, bool sample16Bit) · 516 unmodified lines
695703
696704 static int32_t SDLCALL copySampleThread(void *ptr)
697705 {
698− sample_t *src = &instr[editor.srcInstr]->smp[editor.srcSmp];
699− sample_t *dst = &instr[editor.curInstr]->smp[editor.curSmp];
700−
701706 pauseAudio();
702707
708+ sample_t *src;
709+ if (instr[editor.srcInstr] == NULL)
710+ src = NULL;
711+ else
712+ src = &instr[editor.srcInstr]->smp[editor.srcSmp];
713+
703714 if (instr[editor.curInstr] == NULL && !allocateInstr(editor.curInstr))
704715 goto error;
705716
717+ sample_t *dst = &instr[editor.curInstr]->smp[editor.curSmp];
706718 if (!cloneSample(src, dst))
707719 goto error;
708720
src/ft2_sampling.c+1−1
@@ -325,7 +325,7 @@ void handleSamplingUpdates(void) · 324 unmodified lines
325325
326326 void startSampling(void)
327327 {
328−#if SDL_PATCHLEVEL < 5
328+#if SDL_MAJOR_VERSION == 2 && SDL_MINOR_VERSION == 0 && SDL_PATCHLEVEL < 5
329329 okBox(0, "System message", "This program needs to be compiled with SDL 2.0.5 or later to support audio sampling.");
330330 return;
331331 #else
src/ft2_sysreqs.c+2−2
@@ -637,7 +637,7 @@ int16_t okBoxThreadSafe(int16_t type, const char *headline, const char *text) · 636 unmodified lines
637637
638638 // block multiple calls before they are completed (for safety)
639639 while (okBoxData.active)
640− SDL_Delay(1000 / VBLANK_HZ);
640+ SDL_Delay(1000 / VBLANK_HZ); // accuracy is not important here
641641
642642 okBoxData.type = type;
643643 okBoxData.headline = headline;
@@ -645,7 +645,7 @@ int16_t okBoxThreadSafe(int16_t type, const char *headline, const char *text) · 1 unmodified line
645645 okBoxData.active = true;
646646
647647 while (okBoxData.active)
648− SDL_Delay(1000 / VBLANK_HZ);
648+ SDL_Delay(1000 / VBLANK_HZ); // accuracy is not important here
649649
650650 return okBoxData.returnData;
651651 }
src/ft2_textboxes.c+32−29
@@ -515,45 +515,48 @@ void drawTextBox(uint16_t textBoxID) · 514 unmodified lines
515515 if (t->textPtr == NULL)
516516 return;
517517
518− // draw text mark background
519− if (textIsMarked())
518+ // draw text mark background (if this is the textbox we last interacted with)
519+ if (mouse.lastEditBox == textBoxID)
520520 {
521− hideSprite(SPRITE_TEXT_CURSOR);
521+ if (textIsMarked())
522+ {
523+ hideSprite(SPRITE_TEXT_CURSOR);
522524
523− int32_t start = getTextMarkStart();
524− int32_t end = getTextMarkEnd();
525+ int32_t start = getTextMarkStart();
526+ int32_t end = getTextMarkEnd();
525527
526− assert(start < t->maxChars && end <= t->maxChars);
528+ assert(start < t->maxChars && end <= t->maxChars);
527529
528− // find pixel start/length from markX1 and markX2
530+ // find pixel start/length from markX1 and markX2
529531
530− int32_t x1 = 0;
531− int32_t x2 = 0;
532+ int32_t x1 = 0;
533+ int32_t x2 = 0;
532534
533− for (int32_t i = 0; i < end; i++)
534− {
535− const char ch = t->textPtr[i];
536− if (ch == '\0')
537− break;
535+ for (int32_t i = 0; i < end; i++)
536+ {
537+ const char ch = t->textPtr[i];
538+ if (ch == '\0')
539+ break;
538540
539− cw = charWidth(ch);
540− if (i < start)
541− x1 += cw;
541+ cw = charWidth(ch);
542+ if (i < start)
543+ x1 += cw;
542544
543− x2 += cw;
544− }
545+ x2 += cw;
546+ }
545547
546− // render text mark background
547− if (x1 != x2)
548− {
549− start = x1;
550− const int32_t length = x2 - x1;
548+ // render text mark background
549+ if (x1 != x2)
550+ {
551+ start = x1;
552+ const int32_t length = x2 - x1;
551553
552− assert(start+length <= t->renderBufW);
554+ assert(start+length <= t->renderBufW);
553555
554− uint8_t *ptr32 = &t->renderBuf[start];
555− for (uint16_t y = 0; y < t->renderBufH; y++, ptr32 += t->renderBufW)
556− memset(ptr32, PAL_TEXTMRK, length);
556+ uint8_t *ptr32 = &t->renderBuf[start];
557+ for (uint16_t y = 0; y < t->renderBufH; y++, ptr32 += t->renderBufW)
558+ memset(ptr32, PAL_TEXTMRK, length);
559+ }
557560 }
558561 }
559562
@@ -893,7 +896,7 @@ void handleTextEditControl(SDL_Keycode keycode) · 333 unmodified lines
893896 {
894897 // ALT+ENTER = toggle fullscreen, even while text editing
895898 if (keyb.leftAltPressed)
896− toggleFullScreen();
899+ toggleFullscreen();
897900 else
898901 exitTextEditing();
899902 }
src/ft2_video.c+125−93
@@ -48,19 +48,19 @@ video_t video; // globalized · 47 unmodified lines
4848
4949 static bool songIsModified;
5050 static char wndTitle[256];
51−static uint64_t timeNext64, timeNext64Frac;
5251 static sprite_t sprites[SPRITE_NUM];
5352
5453 // for FPS counter
54+#define FPS_LINES 15
5555 #define FPS_SCAN_FRAMES 60
5656 #define FPS_RENDER_W 285
57−#define FPS_RENDER_H (((FONT1_CHAR_H + 1) * 8) + 1)
57+#define FPS_RENDER_H (((FONT1_CHAR_H + 1) * FPS_LINES) + 1)
5858 #define FPS_RENDER_X 2
5959 #define FPS_RENDER_Y 2
6060
6161 static char fpsTextBuf[1024];
6262 static uint64_t frameStartTime;
63−static double dRunningFPS, dFrameTime, dAvgFPS;
63+static double dRunningFrameDuration, dAvgFPS;
6464 // ------------------
6565
6666 static void drawReplayerData(void);
@@ -69,8 +69,7 @@ void resetFPSCounter(void) · 2 unmodified lines
6969 {
7070 editor.framesPassed = 0;
7171 fpsTextBuf[0] = '\0';
72− dRunningFPS = VBLANK_HZ;
73− dFrameTime = 1000.0 / VBLANK_HZ;
72+ dRunningFrameDuration = 1000.0 / VBLANK_HZ;
7473 }
7574
7675 void beginFPSCounter(void)
@@ -81,13 +80,17 @@ void beginFPSCounter(void) · 4 unmodified lines
8180
8281 static void drawFPSCounter(void)
8382 {
83+ SDL_version SDLVer;
84+
85+ SDL_GetVersion(&SDLVer);
86+
8487 if (editor.framesPassed >= FPS_SCAN_FRAMES && (editor.framesPassed % FPS_SCAN_FRAMES) == 0)
8588 {
86− dAvgFPS = dRunningFPS * (1.0 / FPS_SCAN_FRAMES);
89+ dAvgFPS = 1000.0 / (dRunningFrameDuration / FPS_SCAN_FRAMES);
8790 if (dAvgFPS < 0.0 || dAvgFPS > 99999999.9999)
8891 dAvgFPS = 99999999.9999; // prevent number from overflowing text box
8992
90− dRunningFPS = 0.0;
93+ dRunningFrameDuration = 0.0;
9194 }
9295
9396 clearRect(FPS_RENDER_X+2, FPS_RENDER_Y+2, FPS_RENDER_W, FPS_RENDER_H);
@@ -96,10 +99,12 @@ static void drawFPSCounter(void) · 2 unmodified lines
9699 hLineDouble(FPS_RENDER_X+1, FPS_RENDER_Y, FPS_RENDER_W, PAL_FORGRND);
97100 hLineDouble(FPS_RENDER_X+1, FPS_RENDER_Y+FPS_RENDER_H+2, FPS_RENDER_W, PAL_FORGRND);
98101
99− // test if enough data is collected yet
102+ // if enough frame data isn't collected yet, show a message
100103 if (editor.framesPassed < FPS_SCAN_FRAMES)
101104 {
102− textOut(FPS_RENDER_X+53, FPS_RENDER_Y+39, PAL_FORGRND, "Collecting frame information...");
105+ const char *text = "Gathering frame information...";
106+ const uint16_t textW = textWidth(text);
107+ textOut(FPS_RENDER_X+((FPS_RENDER_W/2)-(textW/2)), FPS_RENDER_Y+((FPS_RENDER_H/2)-(FONT1_CHAR_H/2)), PAL_FORGRND, text);
103108 return;
104109 }
105110
@@ -111,20 +116,36 @@ static void drawFPSCounter(void) · 5 unmodified lines
111116 if (dAudLatency < 0.0 || dAudLatency > 999999999.9999)
112117 dAudLatency = 999999999.9999; // prevent number from overflowing text box
113118
114− sprintf(fpsTextBuf, "Frames per second: %.4f\n" \
119+ sprintf(fpsTextBuf,
120+ "SDL version: %u.%u.%u\n" \
121+ "Frames per second: %.3f\n" \
115122 "Monitor refresh rate: %.1fHz (+/-)\n" \
116123 "59..61Hz GPU VSync used: %s\n" \
117124 "Audio frequency: %.1fkHz (expected %.1fkHz)\n" \
118125 "Audio buffer samples: %d (expected %d)\n" \
119126 "Audio channels: %d (expected %d)\n" \
120127 "Audio latency: %.1fms (expected %.1fms)\n" \
128+ "Render size: %dx%d (offset %d,%d)\n" \
129+ "Disp. size: %dx%d (window: %dx%d)\n" \
130+ "Render scaling: x=%.2f, y=%.2f\n" \
131+ "Mouse to render space muls: x=%.2f, y=%.2f\n" \
132+ "Relative mouse coords: %d,%d\n" \
133+ "Absolute mouse coords: %d,%d\n" \
121134 "Press CTRL+SHIFT+F to close this box.\n",
122− dAvgFPS, dRefreshRate,
135+ SDLVer.major, SDLVer.minor, SDLVer.patch,
136+ dAvgFPS,
137+ dRefreshRate,
123138 video.vsync60HzPresent ? "yes" : "no",
124139 audio.haveFreq * (1.0 / 1000.0), audio.wantFreq * (1.0 / 1000.0),
125140 audio.haveSamples, audio.wantSamples,
126141 audio.haveChannels, audio.wantChannels,
127− dAudLatency, ((audio.wantSamples * 1000.0) / audio.wantFreq));
142+ dAudLatency, ((audio.wantSamples * 1000.0) / audio.wantFreq),
143+ video.renderW, video.renderH, video.renderX, video.renderY,
144+ video.displayW, video.displayH, video.windowW, video.windowH,
145+ video.renderW / (float)SCREEN_W, video.renderH / (float)SCREEN_H,
146+ video.fMouseXMul, video.fMouseYMul,
147+ mouse.x, mouse.y,
148+ mouse.absX, mouse.absY);
128149
129150 // draw text
130151
@@ -138,22 +159,35 @@ static void drawFPSCounter(void) · 7 unmodified lines
138159 if (ch == '\n')
139160 {
140161 yPos += FONT1_CHAR_H+1;
141− xPos = FPS_RENDER_X + 3;
162+ xPos = FPS_RENDER_X+3;
142163 continue;
143164 }
144165
145166 charOut(xPos, yPos, PAL_FORGRND, ch);
146167 xPos += charWidth(ch);
147168 }
169+
170+ // draw framerate tester symbol
171+
172+ const uint16_t symbolEnd = 115;
173+
174+ // ping-pong movement
175+ uint16_t x = editor.framesPassed % (symbolEnd * 2);
176+ if (x >= symbolEnd)
177+ x = (symbolEnd * 2) - x;
178+
179+ charOut(164 + x, 16, PAL_FORGRND, '*');
148180 }
149181
150182 void endFPSCounter(void)
151183 {
152184 if (video.showFPSCounter && frameStartTime > 0)
153185 {
154− const uint64_t frameTimeDiff = SDL_GetPerformanceCounter() - frameStartTime;
155− const double dHz = 1000.0 / (frameTimeDiff * editor.dPerfFreqMulMs);
156− dRunningFPS += dHz;
186+ uint64_t frameTimeDiff64 = SDL_GetPerformanceCounter() - frameStartTime;
187+ if (frameTimeDiff64 > INT32_MAX)
188+ frameTimeDiff64 = INT32_MAX;
189+
190+ dRunningFrameDuration += (int32_t)frameTimeDiff64 * hpcFreq.dFreqMulMs;
157191 }
158192 }
159193
@@ -180,7 +214,8 @@ void flipFrame(void) · 20 unmodified lines
180214
181215 if (!video.vsync60HzPresent)
182216 {
183− waitVBL(); // we have no VSync, do crude thread sleeping to sync to ~60Hz
217+ // we have no VSync, do crude thread sleeping to sync to ~60Hz
218+ hpc_Wait(&video.vblankHpc);
184219 }
185220 else
186221 {
@@ -190,14 +225,14 @@ void flipFrame(void) · 3 unmodified lines
190225 #ifdef __APPLE__
191226 // macOS: VSync gets disabled if the window is 100% covered by another window. Let's add a (crude) fix:
192227 if (minimized || !(windowFlags & SDL_WINDOW_INPUT_FOCUS))
193− waitVBL();
228+ hpc_Wait(&video.vblankHpc);
194229 #elif __unix__
195230 // *NIX: VSync gets disabled in fullscreen mode (at least on some distros/systems). Let's add a fix:
196231 if (minimized || video.fullscreen)
197− waitVBL();
232+ hpc_Wait(&video.vblankHpc);
198233 #else
199234 if (minimized)
200− waitVBL();
235+ hpc_Wait(&video.vblankHpc);
201236 #endif
202237 }
203238
@@ -238,6 +273,8 @@ static void updateRenderSizeVars(void) · 34 unmodified lines
238273 SDL_GetWindowSize(video.window, &video.displayW, &video.displayH);
239274 }
240275
276+ SDL_GetWindowSize(video.window, &video.windowW, &video.windowH);
277+
241278 if (video.fullscreen)
242279 {
243280 if (config.specialFlags2 & STRETCH_IMAGE)
@@ -271,8 +308,8 @@ static void updateRenderSizeVars(void) · 27 unmodified lines
271308 if (dXUpscale != 0.0) video.renderW = (int32_t)(video.renderW / dXUpscale);
272309 if (dYUpscale != 0.0) video.renderH = (int32_t)(video.renderH / dYUpscale);
273310
274− video.renderX = (video.displayW - video.renderW) >> 1;
275− video.renderY = (video.displayH - video.renderH) >> 1;
311+ video.renderX = (video.displayW - video.renderW) / 2;
312+ video.renderY = (video.displayH - video.renderH) / 2;
276313 }
277314 }
278315 else
@@ -284,19 +321,26 @@ static void updateRenderSizeVars(void) · 5 unmodified lines
284321 }
285322
286323 // for mouse cursor creation
287− video.xScale = (uint32_t)round(video.renderW * (1.0 / SCREEN_W));
288− video.yScale = (uint32_t)round(video.renderH * (1.0 / SCREEN_H));
324+ video.xScale = (uint32_t)round(video.renderW / (double)SCREEN_W);
325+ video.yScale = (uint32_t)round(video.renderH / (double)SCREEN_H);
289326
290327 createMouseCursors();
291328 }
292329
293330 void enterFullscreen(void)
294331 {
295− SDL_DisplayMode dm;
332+ SDL_SetWindowFullscreen(video.window, SDL_WINDOW_FULLSCREEN_DESKTOP);
296333
297334 if (config.specialFlags2 & STRETCH_IMAGE)
298335 {
299− SDL_GetDesktopDisplayMode(0, &dm);
336+ SDL_DisplayMode dm;
337+
338+ int32_t di = SDL_GetWindowDisplayIndex(video.window);
339+ if (di < 0)
340+ di = 0; // return display index 0 (default) on error
341+
342+ SDL_GetDesktopDisplayMode(di, &dm);
343+
300344 SDL_RenderSetLogicalSize(video.renderer, dm.w, dm.h);
301345 }
302346 else
@@ -305,15 +349,17 @@ void enterFullscreen(void) · 2 unmodified lines
305349 }
306350
307351 SDL_SetWindowSize(video.window, SCREEN_W, SCREEN_H);
308− SDL_SetWindowFullscreen(video.window, SDL_WINDOW_FULLSCREEN_DESKTOP);
352+
353+#ifndef __unix__ // can be severely buggy on Linux... (at least when used like this)
309354 SDL_SetWindowGrab(video.window, SDL_TRUE);
355+#endif
310356
311357 updateRenderSizeVars();
312358 updateMouseScaling();
313359 setMousePosToCenter();
314360 }
315361
316−void leaveFullScreen(void)
362+void leaveFullscreen(void)
317363 {
318364 SDL_SetWindowFullscreen(video.window, 0);
319365 SDL_RenderSetLogicalSize(video.renderer, SCREEN_W, SCREEN_H);
@@ -321,21 +367,28 @@ void leaveFullScreen(void) · 1 unmodified line
321367 setWindowSizeFromConfig(false);
322368
323369 SDL_SetWindowSize(video.window, SCREEN_W * video.upscaleFactor, SCREEN_H * video.upscaleFactor);
370+
371+#ifndef __unix__
324372 SDL_SetWindowGrab(video.window, SDL_FALSE);
373+#endif
325374
326375 updateRenderSizeVars();
327376 updateMouseScaling();
328377 setMousePosToCenter();
378+
379+#ifdef __unix__ // can be required on Linux... (or else the window keeps moving down every time you leave fullscreen)
380+ SDL_SetWindowPosition(video.window, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED);
381+#endif
329382 }
330383
331−void toggleFullScreen(void)
384+void toggleFullscreen(void)
332385 {
333386 video.fullscreen ^= 1;
334387
335388 if (video.fullscreen)
336389 enterFullscreen();
337390 else
338− leaveFullScreen();
391+ leaveFullscreen();
339392 }
340393
341394 bool setupSprites(void)
@@ -722,44 +775,6 @@ void renderLoopPins(void) · 380 unmodified lines
722775 }
723776 }
724777
725−void setupWaitVBL(void)
726−{
727− // set next frame time
728− timeNext64 = SDL_GetPerformanceCounter() + video.vblankTimeLen;
729− timeNext64Frac = video.vblankTimeLenFrac;
730−}
731−
732−void waitVBL(void)
733−{
734− // this routine almost never delays if we have 60Hz vsync, but it's still needed in some occasions
735−
736− uint64_t time64 = SDL_GetPerformanceCounter();
737− if (time64 < timeNext64)
738− {
739− time64 = timeNext64 - time64;
740− if (time64 > INT32_MAX)
741− time64 = INT32_MAX;
742−
743− const int32_t diff32 = (int32_t)time64;
744−
745− // convert and round to microseconds
746− const int32_t time32 = (int32_t)((diff32 * editor.dPerfFreqMulMicro) + 0.5);
747−
748− // delay until we have reached the next frame
749− if (time32 > 0)
750− usleep(time32);
751− }
752−
753− // update next frame time
754− timeNext64 += video.vblankTimeLen;
755− timeNext64Frac += video.vblankTimeLenFrac;
756− if (timeNext64Frac > UINT32_MAX)
757− {
758− timeNext64Frac &= UINT32_MAX;
759− timeNext64++;
760− }
761−}
762−
763778 void closeVideo(void)
764779 {
765780 if (video.texture != NULL)
@@ -780,13 +795,11 @@ void closeVideo(void) · 14 unmodified lines
780795 video.window = NULL;
781796 }
782797
783− if (video.frameBufferUnaligned != NULL)
798+ if (video.frameBuffer != NULL)
784799 {
785− free(video.frameBufferUnaligned);
786− video.frameBufferUnaligned = NULL;
800+ free(video.frameBuffer);
801+ video.frameBuffer = NULL;
787802 }
788−
789− video.frameBuffer = NULL;
790803 }
791804
792805 void setWindowSizeFromConfig(bool updateRenderer)
@@ -811,8 +824,12 @@ void setWindowSizeFromConfig(bool updateRenderer) · 18 unmodified lines
811824 uint8_t oldUpscaleFactor = video.upscaleFactor;
812825 if (config.windowFlags & WINSIZE_AUTO)
813826 {
827+ int32_t di = SDL_GetWindowDisplayIndex(video.window);
828+ if (di < 0)
829+ di = 0; // return display index 0 (default) on error
830+
814831 // find out which upscaling factor is the biggest to fit on screen
815− if (SDL_GetDesktopDisplayMode(0, &dm) == 0)
832+ if (SDL_GetDesktopDisplayMode(di, &dm) == 0)
816833 {
817834 for (i = MAX_UPSCALE_FACTOR; i >= 1; i--)
818835 {
@@ -869,17 +886,31 @@ void updateWindowTitle(bool forceUpdate) · 50 unmodified lines
869886 strncpy(songTitleTrunc, songTitle, sizeof (songTitleTrunc)-1);
870887 songTitleTrunc[sizeof (songTitleTrunc)-1] = '\0';
871888
872− if (song.isModified)
873− sprintf(wndTitle, "Fasttracker II clone v%s (%d-bit) - \"%s\" (unsaved)", PROG_VER_STR, CPU_BITS, songTitleTrunc);
874− else
875− sprintf(wndTitle, "Fasttracker II clone v%s (%d-bit) - \"%s\"", PROG_VER_STR, CPU_BITS, songTitleTrunc);
889+#if CPU_BITS==32
890+ if (song.isModified)
891+ sprintf(wndTitle, "Fasttracker II clone v%s (32-bit) - \"%s\" (unsaved)", PROG_VER_STR, songTitleTrunc);
892+ else
893+ sprintf(wndTitle, "Fasttracker II clone v%s (32-bit) - \"%s\"", PROG_VER_STR, songTitleTrunc);
894+#else
895+ if (song.isModified)
896+ sprintf(wndTitle, "Fasttracker II clone v%s - \"%s\" (unsaved)", PROG_VER_STR, songTitleTrunc);
897+ else
898+ sprintf(wndTitle, "Fasttracker II clone v%s - \"%s\"", PROG_VER_STR, songTitleTrunc);
899+#endif
876900 }
877901 else
878902 {
903+#if CPU_BITS==32
879904 if (song.isModified)
880− sprintf(wndTitle, "Fasttracker II clone v%s (%d-bit) - \"untitled\" (unsaved)", PROG_VER_STR, CPU_BITS);
905+ sprintf(wndTitle, "Fasttracker II clone v%s (32-bit) - \"untitled\" (unsaved)", PROG_VER_STR);
881906 else
882− sprintf(wndTitle, "Fasttracker II clone v%s (%d-bit) - \"untitled\"", PROG_VER_STR, CPU_BITS);
907+ sprintf(wndTitle, "Fasttracker II clone v%s (32-bit) - \"untitled\"", PROG_VER_STR);
908+#else
909+ if (song.isModified)
910+ sprintf(wndTitle, "Fasttracker II clone v%s - \"untitled\" (unsaved)", PROG_VER_STR);
911+ else
912+ sprintf(wndTitle, "Fasttracker II clone v%s - \"untitled\"", PROG_VER_STR);
913+#endif
883914 }
884915
885916 SDL_SetWindowTitle(video.window, wndTitle);
@@ -923,7 +954,11 @@ bool setupWindow(void) · 37 unmodified lines
923954
924955 setWindowSizeFromConfig(false);
925956
926− SDL_GetDesktopDisplayMode(0, &dm);
957+ int32_t di = SDL_GetWindowDisplayIndex(video.window);
958+ if (di < 0)
959+ di = 0; // return display index 0 (default) on error
960+
961+ SDL_GetDesktopDisplayMode(di, &dm);
927962 video.dMonitorRefreshRate = (double)dm.refresh_rate;
928963
929964 if (dm.refresh_rate >= 59 && dm.refresh_rate <= 61)
@@ -979,7 +1014,7 @@ bool setupRenderer(void) · 49 unmodified lines
9791014
9801015 SDL_RenderSetLogicalSize(video.renderer, SCREEN_W, SCREEN_H);
9811016
982−#if SDL_PATCHLEVEL >= 5
1017+#if SDL_MINOR_VERSION >= 24 || (SDL_MINOR_VERSION == 0 && SDL_PATCHLEVEL >= 5)
9831018 SDL_RenderSetIntegerScale(video.renderer, SDL_TRUE);
9841019 #endif
9851020
@@ -993,19 +1028,22 @@ bool setupRenderer(void) · 7 unmodified lines
9931028 }
9941029
9951030 // framebuffer used by SDL (for texture)
996− video.frameBufferUnaligned = (uint32_t *)MALLOC_PAD(SCREEN_W * SCREEN_H * sizeof (int32_t), 256);
997− if (video.frameBufferUnaligned == NULL)
1031+ video.frameBuffer = (uint32_t *)malloc(SCREEN_W * SCREEN_H * sizeof (int32_t));
1032+ if (video.frameBuffer == NULL)
9981033 {
9991034 showErrorMsgBox("Not enough memory!");
10001035 return false;
10011036 }
10021037
1003− // we want an aligned pointer
1004− video.frameBuffer = (uint32_t *)ALIGN_PTR(video.frameBufferUnaligned, 256);
1005−
10061038 if (!setupSprites())
10071039 return false;
10081040
1041+ // Workaround: SDL_GetGlobalMouseState() doesn't work with KMSDRM/Wayland
1042+ video.useDesktopMouseCoords = true;
1043+ const char *videoDriver = SDL_GetCurrentVideoDriver();
1044+ if (videoDriver != NULL && (strcmp("KMSDRM", videoDriver) == 0 || strcmp("wayland", videoDriver) == 0))
1045+ video.useDesktopMouseCoords = false;
1046+
10091047 updateRenderSizeVars();
10101048 updateMouseScaling();
10111049
@@ -1014,12 +1052,6 @@ bool setupRenderer(void) · 2 unmodified lines
10141052 else
10151053 SDL_ShowCursor(SDL_FALSE);
10161054
1017− // Workaround: SDL_GetGlobalMouseState() doesn't work with KMSDRM/Wayland
1018− video.useDesktopMouseCoords = true;
1019− const char *videoDriver = SDL_GetCurrentVideoDriver();
1020− if (videoDriver != NULL && (strcmp("KMSDRM", videoDriver) == 0 || strcmp("wayland", videoDriver) == 0))
1021− video.useDesktopMouseCoords = false;
1022−
10231055 SDL_SetRenderDrawColor(video.renderer, 0, 0, 0, SDL_ALPHA_OPAQUE);
10241056 return true;
10251057 }
src/ft2_video.h+6−7
@@ -5,6 +5,7 @@ · 4 unmodified lines
55 #include "ft2_header.h"
66 #include "ft2_palette.h"
77 #include "ft2_audio.h"
8+#include "ft2_hpc.h"
89
910 enum
1011 {
@@ -20,17 +21,17 @@ typedef struct video_t · 9 unmodified lines
2021 {
2122 bool fullscreen, showFPSCounter, useDesktopMouseCoords;
2223 uint32_t xScale, yScale;
23− uint32_t *frameBuffer, palette[PAL_NUM], vblankTimeLen, vblankTimeLenFrac;
24+ uint32_t *frameBuffer, palette[PAL_NUM];
2425 #ifdef _WIN32
2526 HWND hWnd;
2627 #endif
28+ hpc_t vblankHpc;
2729 SDL_Window *window;
2830 double dMonitorRefreshRate;
2931 float fMouseXMul, fMouseYMul;
3032 uint8_t upscaleFactor;
3133 bool vsync60HzPresent, windowHidden;
32− int32_t renderX, renderY, renderW, renderH, displayW, displayH;
33− uint32_t *frameBufferUnaligned;
34+ int32_t renderX, renderY, renderW, renderH, displayW, displayH, windowW, windowH;
3435 SDL_Renderer *renderer;
3536 SDL_Texture *texture;
3637 SDL_Surface *iconSurface;
@@ -70,9 +71,7 @@ void changeSpriteData(int32_t sprite, const uint8_t *data); · 33 unmodified lines
7071 void hideSprite(int32_t sprite);
7172 void handleRedrawing(void);
7273 void enterFullscreen(void);
73−void leaveFullScreen(void);
74+void leaveFullscreen(void);
7475 void setWindowSizeFromConfig(bool updateRenderer);
7576 bool recreateTexture(void);
76−void toggleFullScreen(void);
77−void setupWaitVBL(void);
78−void waitVBL(void);
77+void toggleFullscreen(void);
src/ft2_wav_renderer.c+37−30
@@ -20,6 +20,7 @@ · 19 unmodified lines
2020 #include "ft2_wav_renderer.h"
2121 #include "ft2_structs.h"
2222
23+#define UPDATE_VISUALS_AT_TICK 4
2324 #define TICKS_PER_RENDER_CHUNK 64
2425
2526 enum
@@ -37,9 +38,10 @@ typedef struct wavHeader_t · 11 unmodified lines
3738 uint32_t subchunk2ID, subchunk2Size;
3839 } wavHeader_t;
3940
41+static bool useLegacyBPM = false;
4042 static uint8_t WDBitDepth = 16, WDStartPos, WDStopPos, *wavRenderBuffer;
4143 static int16_t WDAmp;
42−static uint32_t WDFrequency = DEFAULT_AUDIO_FREQ;
44+static uint32_t WDFrequency = 44100;
4345 static SDL_Thread *thread;
4446
4547 static void updateWavRenderer(void)
@@ -58,22 +60,9 @@ static void updateWavRenderer(void) · 12 unmodified lines
5860 hexOut(237, 158, PAL_FORGRND, WDStopPos, 2);
5961 }
6062
61−void setWavRenderFrequency(int32_t freq)
63+void cbToggleWavRenderBPMMode(void)
6264 {
63− WDFrequency = CLAMP(freq, MIN_WAV_RENDER_FREQ, MAX_WAV_RENDER_FREQ);
64− if (ui.wavRendererShown)
65− updateWavRenderer();
66−}
67−
68−void setWavRenderBitDepth(uint8_t bitDepth)
69−{
70− if (bitDepth == 16)
71− WDBitDepth = 16;
72− else if (bitDepth == 32)
73− WDBitDepth = 32;
74−
75− if (ui.wavRendererShown)
76− updateWavRenderer();
65+ useLegacyBPM ^= 1;
7766 }
7867
7968 void updateWavRendererSettings(void) // called when changing config.boostLevel
@@ -91,6 +80,9 @@ void drawWavRenderer(void) · 11 unmodified lines
9180 textOutShadow(156, 96, PAL_FORGRND, PAL_DSKTOP2, "16-bit");
9281 textOutShadow(221, 96, PAL_FORGRND, PAL_DSKTOP2, "32-bit float");
9382
83+ textOutShadow(19, 114, PAL_FORGRND, PAL_DSKTOP2, "Imprecise");
84+ textOutShadow(4, 127, PAL_FORGRND, PAL_DSKTOP2, "BPM (FT2)");
85+
9486 textOutShadow(85, 116, PAL_FORGRND, PAL_DSKTOP2, "Frequency");
9587 textOutShadow(85, 130, PAL_FORGRND, PAL_DSKTOP2, "Amplification");
9688 textOutShadow(85, 144, PAL_FORGRND, PAL_DSKTOP2, "Start song position");
@@ -107,6 +99,8 @@ void drawWavRenderer(void) · 10 unmodified lines
10799 showPushButton(PB_WAV_END_UP);
108100 showPushButton(PB_WAV_END_DOWN);
109101
102+ showCheckBox(CB_WAV_BPM_MODE);
103+
110104 // bitdepth radiobuttons
111105
112106 radioButtons[RB_WAV_RENDER_BITDEPTH16].state = RADIOBUTTON_UNCHECKED;
@@ -162,6 +156,7 @@ void hideWavRenderer(void) · 49 unmodified lines
162156 hidePushButton(PB_WAV_START_DOWN);
163157 hidePushButton(PB_WAV_END_UP);
164158 hidePushButton(PB_WAV_END_DOWN);
159+ hideCheckBox(CB_WAV_BPM_MODE);
165160 hideRadioButtonGroup(RB_GROUP_WAV_RENDER_BITDEPTH);
166161
167162 ui.scopesShown = true;
@@ -325,7 +320,7 @@ static int32_t SDLCALL renderWavThread(void *ptr) · 157 unmodified lines
325320
326321 uint32_t sampleCounter = 0;
327322 bool overflow = false, renderDone = false;
328− uint8_t tickCounter = 4;
323+ uint8_t tickCounter = UPDATE_VISUALS_AT_TICK;
329324 int64_t tickSampleCounter64 = 0;
330325
331326 uint64_t bytesInFile = sizeof (wavHeader_t);
@@ -345,31 +340,43 @@ static int32_t SDLCALL renderWavThread(void *ptr) · 13 unmodified lines
345340 break;
346341 }
347342
348− if (tickSampleCounter64 <= 0) // new replayer tick
343+ int32_t tickSamples;
344+
345+ if (useLegacyBPM)
349346 {
350347 dump_TickReplayer();
351− tickSampleCounter64 += audio.samplesPerTick64;
348+ tickSamples = audio.samplesPerTick64 >> 32; // truncate
349+ }
350+ else
351+ {
352+ if (tickSampleCounter64 <= 0) // new replayer tick
353+ {
354+ dump_TickReplayer();
355+ tickSampleCounter64 += audio.samplesPerTick64;
356+ }
357+
358+ tickSamples = (tickSampleCounter64 + UINT32_MAX) >> 32; // ceil (rounded upwards)
352359 }
353360
354− int32_t remainingTick = (tickSampleCounter64 + UINT32_MAX) >> 32; // ceil (rounded upwards)
361+ mixReplayerTickToBuffer(tickSamples, ptr8, WDBitDepth);
355362
356− mixReplayerTickToBuffer(remainingTick, ptr8, WDBitDepth);
357− tickSampleCounter64 -= (int64_t)remainingTick << 32;
363+ if (!useLegacyBPM)
364+ tickSampleCounter64 -= (int64_t)tickSamples << 32;
358365
359− remainingTick *= 2; // stereo
360− samplesInChunk += remainingTick;
361− sampleCounter += remainingTick;
366+ tickSamples *= 2; // stereo
367+ samplesInChunk += tickSamples;
368+ sampleCounter += tickSamples;
362369
363370 // increase buffer pointer
364371 if (WDBitDepth == 16)
365372 {
366− ptr8 += remainingTick * sizeof (int16_t);
367− bytesInFile += remainingTick * sizeof (int16_t);
373+ ptr8 += tickSamples * sizeof (int16_t);
374+ bytesInFile += tickSamples * sizeof (int16_t);
368375 }
369376 else
370377 {
371− ptr8 += remainingTick * sizeof (float);
372− bytesInFile += remainingTick * sizeof (float);
378+ ptr8 += tickSamples * sizeof (float);
379+ bytesInFile += tickSamples * sizeof (float);
373380 }
374381
375382 if (bytesInFile >= INT32_MAX)
@@ -379,7 +386,7 @@ static int32_t SDLCALL renderWavThread(void *ptr) · 3 unmodified lines
379386 break;
380387 }
381388
382− if (++tickCounter >= 4)
389+ if (++tickCounter >= UPDATE_VISUALS_AT_TICK)
383390 {
384391 tickCounter = 0;
385392 updateVisuals();
src/ft2_wav_renderer.h+1−2
@@ -14,8 +14,7 @@ · 13 unmodified lines
1414
1515 #define MAX_WAV_RENDER_SAMPLES_PER_TICK (((MAX_WAV_RENDER_FREQ * 5) / 2) / MIN_BPM)
1616
17−void setWavRenderFrequency(int32_t freq);
18−void setWavRenderBitDepth(uint8_t bitDepth);
17+void cbToggleWavRenderBPMMode(void);
1918 void updateWavRendererSettings(void);
2019 void drawWavRenderer(void);
2120 void showWavRenderer(void);
src/helpdata/FT2.HLP+11−7
@@ -782,6 +782,15 @@ changed with respect to the resampling rate. · 781 unmodified lines
782782 By pressing the right mouse button in the sample window, you can
783783 draw your waveforms manually.
784784
785+@X020@C001WAV export:
786+>
787+>@X040@C001Imprecise BPM (FT2):
788+>@X060@C002
789+The BPM precision in original FT2 is not exact. Tick this box to use
790+the same (poor) BPM precision that original FT2 uses. It will be
791+a fraction off, but the WAV output will be the same length as from FT2.
792+This settings only affects WAV export, and not tracker playback.
793+
785794 @X020@C001Configuration:
786795 >
787796 >@X040@C001Auto save:
@@ -922,11 +931,6 @@ END · 134 unmodified lines
922931 ;***************************************************************************
923932 @LKnown bugs
924933 >
925−>@X010@C001Sample recording on Mac:
926−>
927−>@X010@C002- Sample recording doesn't work on macOS Mojave and later, because of an
928−>@X021issue in SDL2 where it doesn't ask for permission to use the audio input device.
929−>
930934 >@X010@C001WAV exporting (rendering song to WAV):
931935 >
932936 >@X010@C002- Songs that jump back to a previous pattern will render forever and ever,
@@ -936,7 +940,7 @@ END · 3 unmodified lines
936940 >@X010@C001Video:
937941 >@C002
938942 >@X010- Fullscreen mode can be unbearably slow on a Raspberry Pi (even on RPi 4)
939−>@X010- Not a bug, but if your monitor's refresh rate is not set to 60Hz (or 59Hz)
940−>@X021you may experience visual stuttering because VSync will not be used.
943+>@X010- Fullscreen mode can have several problems on multi-monitor systems
944+>@X010- Fullscreen mode can have several problems on some Linux systems
941945
942946 END
src/helpdata/ft2_help_data.h+542−532
@@ -3,9 +3,9 @@ · 2 unmodified lines
33
44 #include <stdint.h>
55
6−#define HELP_DATA_LEN 27766
6+#define HELP_DATA_LEN 27884
77
8−const uint8_t helpData[27766] =
8+const uint8_t helpData[27884] =
99 {
1010 0x4C,0x3B,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
1111 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
@@ -1789,538 +1789,548 @@ const uint8_t helpData[27766] = · 1777 unmodified lines
17891789 0x2C,0x20,0x79,0x6F,0x75,0x20,0x63,0x61,0x6E,0x1D,0x64,0x72,
17901790 0x61,0x77,0x20,0x79,0x6F,0x75,0x72,0x20,0x77,0x61,0x76,0x65,
17911791 0x66,0x6F,0x72,0x6D,0x73,0x20,0x6D,0x61,0x6E,0x75,0x61,0x6C,
1792− 0x6C,0x79,0x2E,0x00,0x18,0x40,0x58,0x30,0x32,0x30,0x40,0x43,
1793− 0x30,0x30,0x31,0x43,0x6F,0x6E,0x66,0x69,0x67,0x75,0x72,0x61,
1794− 0x74,0x69,0x6F,0x6E,0x3A,0x01,0x3E,0x15,0x3E,0x40,0x58,0x30,
1795− 0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x41,0x75,0x74,0x6F,0x20,
1796− 0x73,0x61,0x76,0x65,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,
1797− 0x40,0x43,0x30,0x30,0x32,0x43,0x49,0x66,0x20,0x74,0x68,0x65,
1798− 0x20,0x61,0x75,0x74,0x6F,0x20,0x73,0x61,0x76,0x65,0x20,0x69,
1799− 0x73,0x20,0x6F,0x6E,0x2C,0x20,0x46,0x54,0x32,0x20,0x77,0x69,
1800− 0x6C,0x6C,0x20,0x75,0x70,0x64,0x61,0x74,0x65,0x20,0x74,0x68,
1801− 0x65,0x20,0x63,0x6F,0x6E,0x66,0x69,0x67,0x75,0x72,0x61,0x74,
1802− 0x69,0x6F,0x6E,0x20,0x66,0x69,0x6C,0x65,0x20,0x77,0x68,0x65,
1803− 0x6E,0x15,0x79,0x6F,0x75,0x20,0x65,0x78,0x69,0x74,0x20,0x74,
1804− 0x68,0x65,0x20,0x70,0x72,0x6F,0x67,0x72,0x61,0x6D,0x2E,0x00,
1805− 0x25,0x40,0x58,0x30,0x32,0x30,0x40,0x43,0x30,0x30,0x31,0x43,
1806− 0x6F,0x6E,0x66,0x69,0x67,0x75,0x72,0x61,0x74,0x69,0x6F,0x6E,
1807− 0x2C,0x20,0x49,0x2F,0x4F,0x20,0x64,0x65,0x76,0x69,0x63,0x65,
1808− 0x73,0x3A,0x01,0x3E,0x19,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,
1809− 0x43,0x30,0x30,0x31,0x49,0x6E,0x74,0x65,0x72,0x70,0x6F,0x6C,
1810− 0x61,0x74,0x69,0x6F,0x6E,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,
1811− 0x30,0x40,0x43,0x30,0x30,0x32,0x35,0x53,0x65,0x6C,0x65,0x63,
1812− 0x74,0x73,0x20,0x77,0x68,0x61,0x74,0x20,0x74,0x79,0x70,0x65,
1813− 0x20,0x6F,0x66,0x20,0x72,0x65,0x73,0x61,0x6D,0x70,0x6C,0x69,
1814− 0x6E,0x67,0x20,0x69,0x6E,0x74,0x65,0x72,0x70,0x6F,0x6C,0x61,
1815− 0x74,0x69,0x6F,0x6E,0x20,0x74,0x6F,0x20,0x75,0x73,0x65,0x2E,
1816− 0x45,0x22,0x4E,0x6F,0x6E,0x65,0x22,0x20,0x75,0x73,0x65,0x73,
1817− 0x20,0x6E,0x6F,0x20,0x69,0x6E,0x74,0x65,0x72,0x70,0x6F,0x6C,
1818− 0x61,0x74,0x69,0x6F,0x6E,0x20,0x28,0x6E,0x65,0x61,0x72,0x65,
1819− 0x73,0x74,0x20,0x6E,0x65,0x69,0x67,0x68,0x62,0x6F,0x72,0x29,
1820− 0x2C,0x20,0x77,0x68,0x69,0x63,0x68,0x20,0x77,0x69,0x6C,0x6C,
1821− 0x20,0x72,0x65,0x73,0x75,0x6C,0x74,0x20,0x69,0x6E,0x49,0x61,
1822− 0x6C,0x69,0x61,0x73,0x69,0x6E,0x67,0x20,0x28,0x6E,0x6F,0x69,
1823− 0x73,0x65,0x29,0x20,0x69,0x6E,0x20,0x74,0x68,0x65,0x20,0x73,
1824− 0x6F,0x75,0x6E,0x64,0x2E,0x20,0x22,0x4C,0x69,0x6E,0x65,0x61,
1825− 0x72,0x22,0x20,0x69,0x73,0x20,0x77,0x68,0x61,0x74,0x20,0x72,
1826− 0x65,0x61,0x6C,0x20,0x46,0x54,0x32,0x20,0x75,0x73,0x65,0x73,
1827− 0x2C,0x20,0x77,0x68,0x69,0x63,0x68,0x20,0x69,0x73,0x20,0x61,
1828− 0x47,0x6D,0x65,0x64,0x69,0x6F,0x63,0x72,0x65,0x20,0x69,0x6E,
1829− 0x74,0x65,0x72,0x70,0x6F,0x6C,0x61,0x74,0x69,0x6F,0x6E,0x20,
1830− 0x74,0x79,0x70,0x65,0x2E,0x20,0x22,0x57,0x69,0x6E,0x64,0x6F,
1831− 0x77,0x65,0x64,0x2D,0x73,0x69,0x6E,0x63,0x22,0x20,0x69,0x73,
1832− 0x20,0x74,0x68,0x65,0x20,0x72,0x65,0x63,0x6F,0x6D,0x6D,0x65,
1833− 0x6E,0x64,0x65,0x64,0x20,0x73,0x65,0x74,0x74,0x69,0x6E,0x67,
1834− 0x48,0x66,0x6F,0x72,0x20,0x74,0x68,0x65,0x20,0x62,0x65,0x73,
1835− 0x74,0x20,0x61,0x75,0x64,0x69,0x6F,0x20,0x71,0x75,0x61,0x6C,
1836− 0x69,0x74,0x79,0x2C,0x20,0x61,0x6C,0x74,0x68,0x6F,0x75,0x67,
1837− 0x68,0x20,0x69,0x74,0x20,0x6D,0x61,0x79,0x20,0x73,0x6F,0x6D,
1838− 0x65,0x74,0x69,0x6D,0x65,0x73,0x20,0x73,0x6F,0x75,0x6E,0x64,
1839− 0x20,0x74,0x6F,0x6F,0x20,0x66,0x69,0x6C,0x74,0x65,0x72,0x65,
1840− 0x64,0x2A,0x6F,0x6E,0x20,0x6C,0x6F,0x77,0x2D,0x71,0x75,0x61,
1841− 0x6C,0x69,0x74,0x79,0x20,0x73,0x61,0x6D,0x70,0x6C,0x65,0x73,
1842− 0x20,0x28,0x66,0x2E,0x65,0x78,0x2E,0x20,0x41,0x6D,0x69,0x67,
1843− 0x61,0x20,0x4D,0x4F,0x44,0x73,0x29,0x2E,0x00,0x1A,0x3E,0x40,
1844− 0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x56,0x6F,0x6C,
1845− 0x75,0x6D,0x65,0x20,0x72,0x61,0x6D,0x70,0x69,0x6E,0x67,0x3A,
1792+ 0x6C,0x79,0x2E,0x00,0x15,0x40,0x58,0x30,0x32,0x30,0x40,0x43,
1793+ 0x30,0x30,0x31,0x57,0x41,0x56,0x20,0x65,0x78,0x70,0x6F,0x72,
1794+ 0x74,0x3A,0x01,0x3E,0x1F,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,
1795+ 0x43,0x30,0x30,0x31,0x49,0x6D,0x70,0x72,0x65,0x63,0x69,0x73,
1796+ 0x65,0x20,0x42,0x50,0x4D,0x20,0x28,0x46,0x54,0x32,0x29,0x3A,
18461797 0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,
1847− 0x3B,0x45,0x6E,0x61,0x62,0x6C,0x65,0x73,0x20,0x74,0x68,0x65,
1848− 0x20,0x61,0x6E,0x74,0x69,0x2D,0x63,0x6C,0x69,0x63,0x6B,0x20,
1849− 0x73,0x79,0x73,0x74,0x65,0x6D,0x20,0x69,0x6E,0x20,0x74,0x68,
1850− 0x65,0x20,0x61,0x75,0x64,0x69,0x6F,0x20,0x6D,0x69,0x78,0x65,
1851− 0x72,0x20,0x28,0x46,0x54,0x32,0x2E,0x30,0x38,0x2B,0x29,0x2E,
1852− 0x3B,0x50,0x6C,0x65,0x61,0x73,0x65,0x20,0x6E,0x6F,0x74,0x65,
1853− 0x20,0x74,0x68,0x61,0x74,0x20,0x6F,0x72,0x69,0x67,0x69,0x6E,
1854− 0x61,0x6C,0x20,0x46,0x54,0x32,0x20,0x63,0x61,0x6E,0x27,0x74,
1855− 0x20,0x6C,0x6F,0x61,0x64,0x20,0x74,0x68,0x69,0x73,0x20,0x63,
1856− 0x6F,0x6E,0x66,0x69,0x67,0x20,0x65,0x6E,0x74,0x72,0x79,0x2C,
1857− 0x0B,0x63,0x6C,0x6F,0x6E,0x65,0x20,0x6F,0x6E,0x6C,0x79,0x2E,
1858− 0x00,0x19,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,
1859− 0x31,0x41,0x6D,0x70,0x6C,0x69,0x66,0x69,0x63,0x61,0x74,0x69,
1860− 0x6F,0x6E,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,
1861− 0x30,0x30,0x32,0x46,0x41,0x6D,0x70,0x6C,0x69,0x66,0x69,0x65,
1862− 0x73,0x20,0x74,0x68,0x65,0x20,0x76,0x6F,0x6C,0x75,0x6D,0x65,
1863− 0x20,0x77,0x68,0x65,0x6E,0x20,0x6D,0x69,0x78,0x69,0x6E,0x67,
1864− 0x2E,0x20,0x49,0x66,0x20,0x79,0x6F,0x75,0x20,0x73,0x65,0x74,
1865− 0x20,0x74,0x68,0x69,0x73,0x20,0x6F,0x6E,0x65,0x20,0x74,0x6F,
1866− 0x6F,0x20,0x68,0x69,0x67,0x68,0x2C,0x20,0x79,0x6F,0x75,0x27,
1867− 0x6C,0x6C,0x3A,0x67,0x65,0x74,0x20,0x64,0x69,0x73,0x74,0x6F,
1868− 0x72,0x74,0x69,0x6F,0x6E,0x2E,0x20,0x33,0x32,0x58,0x20,0x65,
1869− 0x71,0x75,0x61,0x6C,0x73,0x20,0x66,0x75,0x6C,0x6C,0x20,0x61,
1870− 0x6D,0x70,0x6C,0x69,0x74,0x75,0x64,0x65,0x20,0x66,0x6F,0x72,
1871− 0x20,0x6F,0x6E,0x65,0x20,0x63,0x68,0x61,0x6E,0x6E,0x65,0x6C,
1872− 0x2E,0x00,0x1B,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,
1873− 0x30,0x31,0x46,0x72,0x65,0x71,0x75,0x65,0x6E,0x63,0x79,0x20,
1874− 0x74,0x61,0x62,0x6C,0x65,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,
1875− 0x30,0x40,0x43,0x30,0x30,0x32,0x40,0x54,0x68,0x65,0x20,0x6C,
1876− 0x69,0x6E,0x65,0x61,0x72,0x20,0x66,0x72,0x65,0x71,0x75,0x65,
1877− 0x6E,0x63,0x79,0x20,0x74,0x61,0x62,0x6C,0x65,0x20,0x6D,0x61,
1878− 0x6B,0x65,0x73,0x20,0x61,0x6C,0x6C,0x20,0x70,0x69,0x74,0x63,
1879− 0x68,0x20,0x62,0x65,0x6E,0x64,0x73,0x20,0x72,0x75,0x6E,0x20,
1880− 0x69,0x6E,0x20,0x63,0x6F,0x6E,0x73,0x74,0x61,0x6E,0x74,0x3F,
1881− 0x73,0x70,0x65,0x65,0x64,0x2C,0x20,0x69,0x6E,0x64,0x65,0x70,
1882− 0x65,0x6E,0x64,0x65,0x6E,0x74,0x20,0x6F,0x66,0x20,0x74,0x68,
1883− 0x65,0x20,0x63,0x75,0x72,0x72,0x65,0x6E,0x74,0x20,0x66,0x72,
1884− 0x65,0x71,0x75,0x65,0x6E,0x63,0x79,0x2E,0x20,0x49,0x66,0x20,
1885− 0x79,0x6F,0x75,0x20,0x73,0x77,0x69,0x74,0x63,0x68,0x20,0x74,
1886− 0x68,0x69,0x73,0x41,0x6F,0x6E,0x65,0x2C,0x20,0x6F,0x6E,0x20,
1887− 0x61,0x20,0x66,0x69,0x6E,0x69,0x73,0x68,0x65,0x64,0x20,0x73,
1888− 0x6F,0x6E,0x67,0x2C,0x20,0x69,0x74,0x20,0x6D,0x69,0x67,0x68,
1889− 0x74,0x20,0x73,0x6F,0x75,0x6E,0x64,0x20,0x73,0x74,0x72,0x61,
1890− 0x6E,0x67,0x65,0x20,0x69,0x66,0x20,0x74,0x68,0x65,0x20,0x73,
1891− 0x6F,0x75,0x6E,0x64,0x20,0x75,0x73,0x65,0x73,0x0D,0x70,0x6F,
1892− 0x72,0x74,0x61,0x6D,0x65,0x6E,0x74,0x6F,0x65,0x73,0x2E,0x00,
1893− 0x20,0x40,0x58,0x30,0x32,0x30,0x40,0x43,0x30,0x30,0x31,0x43,
1894− 0x6F,0x6E,0x66,0x69,0x67,0x75,0x72,0x61,0x74,0x69,0x6F,0x6E,
1895− 0x2C,0x20,0x4C,0x61,0x79,0x6F,0x75,0x74,0x3A,0x01,0x3E,0x29,
1896− 0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x50,
1897− 0x61,0x74,0x74,0x65,0x72,0x6E,0x20,0x6C,0x61,0x79,0x6F,0x75,
1898− 0x74,0x2C,0x20,0x68,0x65,0x78,0x20,0x6E,0x75,0x6D,0x62,0x65,
1899− 0x72,0x69,0x6E,0x67,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,
1900− 0x40,0x43,0x30,0x30,0x32,0x41,0x49,0x66,0x20,0x79,0x6F,0x75,
1901− 0x20,0x75,0x73,0x65,0x20,0x70,0x61,0x74,0x74,0x65,0x72,0x6E,
1902− 0x73,0x20,0x74,0x68,0x61,0x74,0x20,0x61,0x72,0x65,0x20,0x6C,
1903− 0x6F,0x6E,0x67,0x65,0x72,0x20,0x74,0x68,0x61,0x6E,0x20,0x39,
1904− 0x39,0x20,0x6C,0x69,0x6E,0x65,0x73,0x2C,0x20,0x79,0x6F,0x75,
1905− 0x20,0x73,0x68,0x6F,0x75,0x6C,0x64,0x20,0x75,0x73,0x65,0x45,
1906− 0x68,0x65,0x78,0x20,0x63,0x6F,0x75,0x6E,0x74,0x69,0x6E,0x67,
1907− 0x20,0x73,0x69,0x6E,0x63,0x65,0x20,0x74,0x68,0x65,0x72,0x65,
1908− 0x20,0x61,0x72,0x65,0x20,0x6F,0x6E,0x6C,0x79,0x20,0x32,0x20,
1909− 0x64,0x69,0x67,0x69,0x74,0x73,0x20,0x69,0x6E,0x20,0x74,0x68,
1910− 0x65,0x20,0x6C,0x69,0x6E,0x65,0x20,0x6E,0x75,0x6D,0x62,0x65,
1911− 0x72,0x20,0x63,0x6F,0x6C,0x75,0x6D,0x6E,0x2E,0x00,0x12,0x3E,
1912− 0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x53,0x63,
1913− 0x6F,0x70,0x65,0x73,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,
1914− 0x40,0x43,0x30,0x30,0x32,0x43,0x22,0x53,0x74,0x64,0x2E,0x22,
1915− 0x20,0x28,0x73,0x74,0x61,0x6E,0x64,0x61,0x72,0x64,0x29,0x20,
1916− 0x77,0x69,0x6C,0x6C,0x20,0x73,0x68,0x6F,0x77,0x20,0x74,0x68,
1917− 0x65,0x20,0x73,0x61,0x6D,0x70,0x6C,0x65,0x20,0x70,0x6F,0x69,
1918− 0x6E,0x74,0x73,0x20,0x61,0x73,0x20,0x70,0x69,0x78,0x65,0x6C,
1919− 0x73,0x20,0x28,0x6C,0x69,0x6B,0x65,0x20,0x46,0x54,0x32,0x29,
1920− 0x2E,0x3D,0x22,0x4C,0x69,0x6E,0x65,0x64,0x22,0x20,0x77,0x69,
1921− 0x6C,0x6C,0x20,0x64,0x72,0x61,0x77,0x20,0x69,0x6E,0x74,0x65,
1922− 0x72,0x70,0x6F,0x6C,0x61,0x74,0x65,0x64,0x20,0x73,0x61,0x6D,
1923− 0x70,0x6C,0x65,0x73,0x20,0x28,0x6C,0x69,0x6E,0x65,0x61,0x72,
1924− 0x20,0x69,0x6E,0x74,0x65,0x72,0x70,0x6F,0x6C,0x61,0x74,0x69,
1925− 0x6F,0x6E,0x2E,0x00,0x27,0x40,0x58,0x30,0x32,0x30,0x40,0x43,
1798+ 0x44,0x54,0x68,0x65,0x20,0x42,0x50,0x4D,0x20,0x70,0x72,0x65,
1799+ 0x63,0x69,0x73,0x69,0x6F,0x6E,0x20,0x69,0x6E,0x20,0x6F,0x72,
1800+ 0x69,0x67,0x69,0x6E,0x61,0x6C,0x20,0x46,0x54,0x32,0x20,0x69,
1801+ 0x73,0x20,0x6E,0x6F,0x74,0x20,0x65,0x78,0x61,0x63,0x74,0x2E,
1802+ 0x20,0x54,0x69,0x63,0x6B,0x20,0x74,0x68,0x69,0x73,0x20,0x62,
1803+ 0x6F,0x78,0x20,0x74,0x6F,0x20,0x75,0x73,0x65,0x40,0x74,0x68,
1804+ 0x65,0x20,0x73,0x61,0x6D,0x65,0x20,0x28,0x70,0x6F,0x6F,0x72,
1805+ 0x29,0x20,0x42,0x50,0x4D,0x20,0x70,0x72,0x65,0x63,0x69,0x73,
1806+ 0x69,0x6F,0x6E,0x20,0x74,0x68,0x61,0x74,0x20,0x6F,0x72,0x69,
1807+ 0x67,0x69,0x6E,0x61,0x6C,0x20,0x46,0x54,0x32,0x20,0x75,0x73,
1808+ 0x65,0x73,0x2E,0x20,0x49,0x74,0x20,0x77,0x69,0x6C,0x6C,0x20,
1809+ 0x62,0x65,0x47,0x61,0x20,0x66,0x72,0x61,0x63,0x74,0x69,0x6F,
1810+ 0x6E,0x20,0x6F,0x66,0x66,0x2C,0x20,0x62,0x75,0x74,0x20,0x74,
1811+ 0x68,0x65,0x20,0x57,0x41,0x56,0x20,0x6F,0x75,0x74,0x70,0x75,
1812+ 0x74,0x20,0x77,0x69,0x6C,0x6C,0x20,0x62,0x65,0x20,0x74,0x68,
1813+ 0x65,0x20,0x73,0x61,0x6D,0x65,0x20,0x6C,0x65,0x6E,0x67,0x74,
1814+ 0x68,0x20,0x61,0x73,0x20,0x66,0x72,0x6F,0x6D,0x20,0x46,0x54,
1815+ 0x32,0x2E,0x40,0x54,0x68,0x69,0x73,0x20,0x73,0x65,0x74,0x74,
1816+ 0x69,0x6E,0x67,0x73,0x20,0x6F,0x6E,0x6C,0x79,0x20,0x61,0x66,
1817+ 0x66,0x65,0x63,0x74,0x73,0x20,0x57,0x41,0x56,0x20,0x65,0x78,
1818+ 0x70,0x6F,0x72,0x74,0x2C,0x20,0x61,0x6E,0x64,0x20,0x6E,0x6F,
1819+ 0x74,0x20,0x74,0x72,0x61,0x63,0x6B,0x65,0x72,0x20,0x70,0x6C,
1820+ 0x61,0x79,0x62,0x61,0x63,0x6B,0x2E,0x00,0x18,0x40,0x58,0x30,
1821+ 0x32,0x30,0x40,0x43,0x30,0x30,0x31,0x43,0x6F,0x6E,0x66,0x69,
1822+ 0x67,0x75,0x72,0x61,0x74,0x69,0x6F,0x6E,0x3A,0x01,0x3E,0x15,
1823+ 0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x41,
1824+ 0x75,0x74,0x6F,0x20,0x73,0x61,0x76,0x65,0x3A,0x0B,0x3E,0x40,
1825+ 0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x43,0x49,0x66,
1826+ 0x20,0x74,0x68,0x65,0x20,0x61,0x75,0x74,0x6F,0x20,0x73,0x61,
1827+ 0x76,0x65,0x20,0x69,0x73,0x20,0x6F,0x6E,0x2C,0x20,0x46,0x54,
1828+ 0x32,0x20,0x77,0x69,0x6C,0x6C,0x20,0x75,0x70,0x64,0x61,0x74,
1829+ 0x65,0x20,0x74,0x68,0x65,0x20,0x63,0x6F,0x6E,0x66,0x69,0x67,
1830+ 0x75,0x72,0x61,0x74,0x69,0x6F,0x6E,0x20,0x66,0x69,0x6C,0x65,
1831+ 0x20,0x77,0x68,0x65,0x6E,0x15,0x79,0x6F,0x75,0x20,0x65,0x78,
1832+ 0x69,0x74,0x20,0x74,0x68,0x65,0x20,0x70,0x72,0x6F,0x67,0x72,
1833+ 0x61,0x6D,0x2E,0x00,0x25,0x40,0x58,0x30,0x32,0x30,0x40,0x43,
19261834 0x30,0x30,0x31,0x43,0x6F,0x6E,0x66,0x69,0x67,0x75,0x72,0x61,
1927− 0x74,0x69,0x6F,0x6E,0x2C,0x20,0x4D,0x69,0x73,0x63,0x65,0x6C,
1928− 0x6C,0x61,0x6E,0x65,0x6F,0x75,0x73,0x3A,0x01,0x3E,0x15,0x3E,
1929− 0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x56,0x53,
1930− 0x79,0x6E,0x63,0x20,0x6F,0x66,0x66,0x3A,0x0B,0x3E,0x40,0x58,
1931− 0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x3F,0x54,0x65,0x6C,
1932− 0x6C,0x73,0x20,0x74,0x68,0x65,0x20,0x70,0x72,0x6F,0x67,0x72,
1933− 0x61,0x6D,0x20,0x74,0x6F,0x20,0x6E,0x6F,0x74,0x20,0x75,0x73,
1934− 0x65,0x20,0x56,0x53,0x79,0x6E,0x63,0x20,0x66,0x6F,0x72,0x20,
1935− 0x76,0x69,0x64,0x65,0x6F,0x2E,0x20,0x49,0x66,0x20,0x79,0x6F,
1936− 0x75,0x72,0x20,0x6D,0x6F,0x6E,0x69,0x74,0x6F,0x72,0x27,0x73,
1937− 0x40,0x72,0x65,0x66,0x72,0x65,0x73,0x68,0x20,0x72,0x61,0x74,
1938− 0x65,0x20,0x69,0x73,0x20,0x6E,0x6F,0x74,0x20,0x36,0x30,0x48,
1939− 0x7A,0x20,0x28,0x6F,0x72,0x20,0x35,0x39,0x48,0x7A,0x29,0x2C,
1940− 0x20,0x74,0x68,0x65,0x6E,0x20,0x56,0x53,0x79,0x6E,0x63,0x20,
1941− 0x69,0x73,0x20,0x61,0x6C,0x77,0x61,0x79,0x73,0x20,0x6F,0x66,
1942− 0x66,0x20,0x66,0x6F,0x72,0x45,0x74,0x68,0x69,0x73,0x20,0x70,
1943− 0x72,0x6F,0x67,0x72,0x61,0x6D,0x2E,0x20,0x4E,0x6F,0x74,0x20,
1944− 0x68,0x61,0x76,0x69,0x6E,0x67,0x20,0x56,0x53,0x79,0x6E,0x63,
1945− 0x20,0x77,0x69,0x6C,0x6C,0x20,0x72,0x65,0x73,0x75,0x6C,0x74,
1946− 0x20,0x69,0x6E,0x20,0x6C,0x65,0x73,0x73,0x20,0x69,0x6E,0x70,
1947− 0x75,0x74,0x2F,0x76,0x69,0x64,0x65,0x6F,0x20,0x64,0x65,0x6C,
1948− 0x61,0x79,0x2C,0x1E,0x62,0x75,0x74,0x20,0x61,0x6C,0x73,0x6F,
1949− 0x20,0x70,0x6F,0x74,0x65,0x6E,0x74,0x69,0x61,0x6C,0x20,0x73,
1950− 0x74,0x75,0x74,0x74,0x65,0x72,0x69,0x6E,0x67,0x2E,0x00,0x15,
1951− 0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x53,
1952− 0x74,0x72,0x65,0x74,0x63,0x68,0x65,0x64,0x3A,0x0B,0x3E,0x40,
1953− 0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x4A,0x4D,0x61,
1954− 0x6B,0x65,0x73,0x20,0x66,0x75,0x6C,0x6C,0x73,0x63,0x72,0x65,
1955− 0x65,0x6E,0x20,0x6D,0x6F,0x64,0x65,0x20,0x63,0x6F,0x6D,0x70,
1956− 0x6C,0x65,0x74,0x65,0x6C,0x79,0x20,0x73,0x74,0x72,0x65,0x74,
1957− 0x63,0x68,0x20,0x6F,0x75,0x74,0x20,0x74,0x68,0x65,0x20,0x69,
1958− 0x6D,0x61,0x67,0x65,0x2E,0x20,0x54,0x68,0x69,0x73,0x20,0x63,
1959− 0x61,0x6E,0x20,0x72,0x65,0x73,0x75,0x6C,0x74,0x20,0x69,0x6E,
1960− 0x4E,0x61,0x6C,0x69,0x61,0x73,0x69,0x6E,0x67,0x20,0x28,0x75,
1961− 0x6E,0x65,0x76,0x65,0x6E,0x20,0x70,0x69,0x78,0x65,0x6C,0x20,
1962− 0x77,0x69,0x64,0x74,0x68,0x73,0x29,0x20,0x69,0x66,0x20,0x74,
1963− 0x68,0x65,0x20,0x61,0x73,0x70,0x65,0x63,0x74,0x20,0x72,0x61,
1964− 0x74,0x69,0x6F,0x20,0x6F,0x66,0x20,0x74,0x68,0x65,0x20,0x73,
1965− 0x63,0x72,0x65,0x65,0x6E,0x20,0x69,0x73,0x20,0x6E,0x6F,0x74,
1966− 0x20,0x31,0x36,0x3A,0x31,0x30,0x2E,0x52,0x54,0x68,0x65,0x20,
1967− 0x22,0x50,0x69,0x78,0x65,0x6C,0x20,0x66,0x69,0x6C,0x74,0x65,
1968− 0x72,0x22,0x20,0x73,0x65,0x74,0x74,0x69,0x6E,0x67,0x20,0x63,
1969− 0x61,0x6E,0x20,0x68,0x65,0x6C,0x70,0x20,0x77,0x69,0x74,0x68,
1970− 0x20,0x74,0x68,0x69,0x73,0x2C,0x20,0x62,0x75,0x74,0x20,0x69,
1971− 0x74,0x20,0x6D,0x61,0x6B,0x65,0x73,0x20,0x74,0x68,0x65,0x20,
1972− 0x69,0x6D,0x61,0x67,0x65,0x20,0x6C,0x6F,0x6F,0x6B,0x20,0x62,
1973− 0x6C,0x75,0x72,0x72,0x79,0x2E,0x01,0x20,0x18,0x3E,0x40,0x58,
1974− 0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x50,0x69,0x78,0x65,
1975− 0x6C,0x20,0x66,0x69,0x6C,0x74,0x65,0x72,0x3A,0x0B,0x3E,0x40,
1976− 0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x52,0x41,0x70,
1977− 0x70,0x6C,0x69,0x65,0x73,0x20,0x61,0x6E,0x20,0x61,0x6E,0x74,
1978− 0x69,0x2D,0x61,0x6C,0x69,0x61,0x73,0x69,0x6E,0x67,0x20,0x73,
1979− 0x75,0x62,0x70,0x69,0x78,0x65,0x6C,0x20,0x66,0x69,0x6C,0x74,
1980− 0x65,0x72,0x20,0x74,0x68,0x61,0x74,0x20,0x69,0x73,0x20,0x75,
1981− 0x73,0x65,0x64,0x20,0x77,0x68,0x65,0x6E,0x20,0x74,0x68,0x65,
1982− 0x20,0x77,0x69,0x6E,0x64,0x6F,0x77,0x20,0x69,0x73,0x20,0x75,
1983− 0x70,0x73,0x63,0x61,0x6C,0x65,0x64,0x2E,0x3B,0x50,0x6C,0x65,
1984− 0x61,0x73,0x65,0x20,0x6B,0x65,0x65,0x70,0x20,0x69,0x6E,0x20,
1985− 0x6D,0x69,0x6E,0x64,0x20,0x74,0x68,0x61,0x74,0x20,0x74,0x68,
1986− 0x69,0x73,0x20,0x77,0x69,0x6C,0x6C,0x20,0x6D,0x61,0x6B,0x65,
1987− 0x20,0x70,0x69,0x78,0x65,0x6C,0x73,0x20,0x6C,0x6F,0x6F,0x6B,
1988− 0x20,0x62,0x6C,0x75,0x72,0x72,0x79,0x2E,0x00,0x23,0x40,0x58,
1989− 0x30,0x32,0x30,0x40,0x43,0x30,0x30,0x31,0x41,0x64,0x76,0x61,
1990− 0x6E,0x63,0x65,0x64,0x20,0x65,0x64,0x69,0x74,0x20,0x66,0x75,
1991− 0x6E,0x63,0x74,0x69,0x6F,0x6E,0x73,0x3A,0x20,0x01,0x3E,0x1E,
1992− 0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x43,
1993− 0x6F,0x70,0x79,0x2F,0x50,0x61,0x73,0x74,0x65,0x20,0x6D,0x61,
1994− 0x73,0x6B,0x69,0x6E,0x67,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,
1995− 0x30,0x40,0x43,0x30,0x30,0x32,0x37,0x54,0x68,0x65,0x20,0x6D,
1996− 0x61,0x73,0x6B,0x69,0x6E,0x67,0x20,0x69,0x73,0x20,0x75,0x73,
1997− 0x65,0x64,0x20,0x66,0x6F,0x72,0x20,0x63,0x6F,0x70,0x79,0x69,
1998− 0x6E,0x67,0x2F,0x70,0x61,0x73,0x74,0x69,0x6E,0x67,0x20,0x6F,
1999− 0x6E,0x6C,0x79,0x20,0x70,0x61,0x72,0x74,0x73,0x20,0x6F,0x66,
2000− 0x20,0x61,0x46,0x22,0x6E,0x6F,0x74,0x65,0x2D,0x63,0x65,0x6C,
2001− 0x6C,0x22,0x2E,0x20,0x54,0x68,0x65,0x20,0x64,0x69,0x66,0x66,
2002− 0x65,0x72,0x65,0x6E,0x74,0x20,0x70,0x61,0x72,0x74,0x73,0x20,
2003− 0x6F,0x66,0x20,0x61,0x20,0x22,0x6E,0x6F,0x74,0x65,0x2D,0x63,
2004− 0x65,0x6C,0x6C,0x22,0x20,0x69,0x73,0x20,0x4E,0x6F,0x74,0x65,
2005− 0x2C,0x20,0x49,0x6E,0x73,0x74,0x72,0x2E,0x20,0x6E,0x72,0x2E,
2006− 0x2C,0x20,0x56,0x6F,0x6C,0x75,0x6D,0x65,0x2C,0x20,0x45,0x66,
2007− 0x66,0x65,0x63,0x74,0x20,0x6E,0x72,0x20,0x26,0x20,0x45,0x66,
2008− 0x66,0x65,0x63,0x74,0x20,0x64,0x61,0x74,0x61,0x2E,0x34,0x3E,
2009− 0x41,0x73,0x20,0x79,0x6F,0x75,0x20,0x63,0x61,0x6E,0x20,0x73,
2010− 0x65,0x65,0x20,0x69,0x6E,0x20,0x74,0x68,0x65,0x20,0x77,0x69,
2011− 0x6E,0x64,0x6F,0x77,0x20,0x74,0x68,0x65,0x72,0x65,0x20,0x61,
2012− 0x72,0x65,0x20,0x33,0x20,0x63,0x6F,0x6C,0x75,0x6D,0x6E,0x73,
2013− 0x20,0x6F,0x66,0x3D,0x22,0x65,0x6E,0x61,0x62,0x6C,0x65,0x2F,
2014− 0x64,0x69,0x73,0x61,0x62,0x6C,0x65,0x20,0x62,0x75,0x74,0x74,
2015− 0x6F,0x6E,0x73,0x22,0x20,0x77,0x68,0x69,0x63,0x68,0x20,0x68,
2016− 0x61,0x73,0x20,0x74,0x68,0x65,0x20,0x6C,0x65,0x74,0x74,0x65,
2017− 0x72,0x73,0x20,0x43,0x2C,0x50,0x20,0x26,0x20,0x54,0x20,0x61,
2018− 0x62,0x6F,0x76,0x65,0x2E,0x45,0x3E,0x43,0x20,0x6D,0x65,0x61,
2019− 0x6E,0x73,0x20,0x63,0x6F,0x70,0x79,0x2C,0x20,0x69,0x74,0x20,
2020− 0x63,0x6F,0x6E,0x74,0x72,0x6F,0x6C,0x73,0x20,0x77,0x68,0x69,
2021− 0x63,0x68,0x20,0x70,0x61,0x72,0x74,0x73,0x20,0x74,0x68,0x61,
2022− 0x74,0x20,0x67,0x6F,0x65,0x73,0x20,0x69,0x6E,0x74,0x6F,0x20,
2023− 0x74,0x68,0x65,0x20,0x63,0x6F,0x70,0x79,0x62,0x75,0x66,0x66,
2024− 0x65,0x72,0x2E,0x3E,0x3E,0x50,0x20,0x6D,0x65,0x61,0x6E,0x73,
2025− 0x20,0x70,0x61,0x73,0x74,0x65,0x20,0x61,0x6E,0x64,0x20,0x63,
2026− 0x6F,0x6E,0x74,0x72,0x6F,0x6C,0x73,0x20,0x77,0x68,0x69,0x63,
2027− 0x68,0x20,0x70,0x61,0x72,0x74,0x73,0x20,0x74,0x68,0x61,0x74,
2028− 0x20,0x67,0x6F,0x65,0x73,0x20,0x6F,0x75,0x74,0x20,0x66,0x72,
2029− 0x6F,0x6D,0x20,0x74,0x68,0x65,0x0B,0x63,0x6F,0x70,0x79,0x62,
2030− 0x75,0x66,0x66,0x65,0x72,0x2E,0x45,0x3E,0x54,0x20,0x6D,0x65,
2031− 0x61,0x6E,0x73,0x20,0x74,0x72,0x61,0x6E,0x73,0x70,0x61,0x72,
2032− 0x65,0x6E,0x63,0x79,0x2E,0x20,0x49,0x66,0x20,0x69,0x74,0x27,
2033− 0x73,0x20,0x65,0x6E,0x61,0x62,0x6C,0x65,0x64,0x2C,0x20,0x74,
2034− 0x68,0x65,0x20,0x70,0x61,0x73,0x74,0x69,0x6E,0x67,0x20,0x64,
2035− 0x6F,0x65,0x73,0x6E,0x27,0x74,0x20,0x6F,0x76,0x65,0x72,0x77,
2036− 0x72,0x69,0x74,0x65,0x3D,0x64,0x61,0x74,0x61,0x20,0x77,0x69,
2037− 0x74,0x68,0x20,0x6E,0x69,0x6C,0x2D,0x69,0x6E,0x66,0x6F,0x72,
2038− 0x6D,0x61,0x74,0x69,0x6F,0x6E,0x2C,0x20,0x6F,0x6E,0x6C,0x79,
2039− 0x20,0x77,0x69,0x74,0x68,0x20,0x61,0x20,0x6E,0x6F,0x74,0x65,
2040− 0x20,0x6F,0x72,0x20,0x61,0x20,0x6E,0x75,0x6D,0x62,0x65,0x72,
2041− 0x20,0x3C,0x3E,0x20,0x30,0x2E,0x01,0x3E,0x40,0x3E,0x54,0x68,
2042− 0x65,0x20,0x63,0x75,0x74,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,
2043− 0x6F,0x6E,0x73,0x20,0x77,0x6F,0x72,0x6B,0x73,0x20,0x6C,0x69,
2044− 0x6B,0x65,0x20,0x70,0x61,0x73,0x74,0x69,0x6E,0x67,0x20,0x77,
2045− 0x69,0x74,0x68,0x20,0x7A,0x65,0x72,0x6F,0x2D,0x64,0x61,0x74,
2046− 0x61,0x2E,0x20,0x54,0x68,0x69,0x73,0x20,0x6D,0x65,0x61,0x6E,
2047− 0x73,0x3B,0x74,0x68,0x61,0x74,0x20,0x74,0x68,0x65,0x20,0x63,
2048− 0x75,0x74,0x74,0x69,0x6E,0x67,0x20,0x69,0x73,0x20,0x63,0x6F,
2049− 0x6E,0x74,0x72,0x6F,0x6C,0x6C,0x65,0x64,0x20,0x77,0x69,0x74,
2050− 0x68,0x20,0x50,0x2D,0x63,0x6F,0x6C,0x75,0x6D,0x6E,0x20,0x28,
2051− 0x6F,0x72,0x20,0x54,0x2D,0x63,0x6F,0x6C,0x75,0x6D,0x6E,0x29,
2052− 0x2E,0x3C,0x3E,0x57,0x68,0x65,0x6E,0x20,0x79,0x6F,0x75,0x20,
2053− 0x63,0x6F,0x70,0x79,0x20,0x64,0x61,0x74,0x61,0x20,0x77,0x69,
2054− 0x74,0x68,0x20,0x6D,0x61,0x73,0x6B,0x69,0x6E,0x67,0x2C,0x20,
2055− 0x74,0x68,0x65,0x20,0x64,0x69,0x73,0x61,0x62,0x6C,0x65,0x64,
2056− 0x20,0x70,0x61,0x72,0x74,0x73,0x20,0x61,0x72,0x65,0x20,0x6E,
2057− 0x6F,0x74,0x43,0x63,0x6C,0x65,0x61,0x72,0x65,0x64,0x20,0x69,
2058− 0x6E,0x20,0x74,0x68,0x65,0x20,0x63,0x6F,0x70,0x79,0x62,0x75,
2059− 0x66,0x66,0x65,0x72,0x2E,0x20,0x28,0x4D,0x61,0x6B,0x69,0x6E,
2060− 0x67,0x20,0x69,0x74,0x20,0x70,0x6F,0x73,0x73,0x69,0x62,0x6C,
2061− 0x65,0x20,0x74,0x6F,0x20,0x63,0x6F,0x6C,0x6C,0x65,0x63,0x74,
2062− 0x20,0x64,0x61,0x74,0x61,0x20,0x66,0x72,0x6F,0x6D,0x27,0x73,
2063− 0x65,0x76,0x65,0x72,0x61,0x6C,0x20,0x6C,0x6F,0x63,0x61,0x74,
2064− 0x69,0x6F,0x6E,0x73,0x20,0x69,0x6E,0x74,0x6F,0x20,0x74,0x68,
2065− 0x65,0x20,0x63,0x6F,0x70,0x79,0x62,0x75,0x66,0x66,0x65,0x72,
2066− 0x2E,0x29,0x00,0x03,0x45,0x4E,0x44,0x4C,0x3B,0x2A,0x2A,0x2A,
2067− 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2068− 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2069− 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2070− 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2071− 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2072− 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2073− 0x4C,0x3B,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2074− 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2075− 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2076− 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2077− 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2078− 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2079− 0x2A,0x2A,0x2A,0x2A,0x2A,0x0E,0x40,0x4C,0x50,0x72,0x6F,0x62,
2080− 0x6C,0x65,0x6D,0x73,0x2F,0x46,0x41,0x51,0x06,0x3E,0x40,0x58,
2081− 0x30,0x32,0x30,0x2A,0x3E,0x40,0x43,0x30,0x30,0x31,0x51,0x3A,
2082− 0x20,0x48,0x6F,0x77,0x20,0x63,0x61,0x6E,0x20,0x49,0x20,0x74,
2083− 0x6F,0x67,0x67,0x6C,0x65,0x20,0x66,0x75,0x6C,0x6C,0x73,0x63,
2084− 0x72,0x65,0x65,0x6E,0x20,0x6D,0x6F,0x64,0x65,0x3F,0x37,0x3E,
2085− 0x40,0x43,0x30,0x30,0x32,0x41,0x3A,0x20,0x50,0x72,0x65,0x73,
2086− 0x73,0x20,0x41,0x6C,0x74,0x2B,0x45,0x6E,0x74,0x65,0x72,0x20,
2087− 0x28,0x43,0x74,0x72,0x6C,0x2B,0x43,0x6D,0x64,0x2B,0x46,0x20,
2088− 0x61,0x6C,0x73,0x6F,0x20,0x77,0x6F,0x72,0x6B,0x73,0x20,0x6F,
2089− 0x6E,0x20,0x4D,0x61,0x63,0x29,0x06,0x3E,0x40,0x58,0x30,0x32,
2090− 0x30,0x45,0x3E,0x40,0x43,0x30,0x30,0x31,0x51,0x3A,0x20,0x48,
2091− 0x6F,0x77,0x20,0x63,0x61,0x6E,0x20,0x49,0x20,0x6D,0x61,0x6B,
2092− 0x65,0x20,0x66,0x75,0x6C,0x6C,0x73,0x63,0x72,0x65,0x65,0x6E,
2093− 0x20,0x6D,0x6F,0x64,0x65,0x20,0x73,0x74,0x72,0x65,0x74,0x63,
2094− 0x68,0x20,0x6F,0x75,0x74,0x20,0x74,0x68,0x65,0x20,0x77,0x68,
2095− 0x6F,0x6C,0x65,0x20,0x73,0x63,0x72,0x65,0x65,0x6E,0x3F,0x37,
2096− 0x3E,0x40,0x43,0x30,0x30,0x32,0x41,0x3A,0x20,0x45,0x6E,0x61,
2097− 0x62,0x6C,0x65,0x20,0x22,0x53,0x74,0x72,0x65,0x74,0x63,0x68,
2098− 0x65,0x64,0x22,0x20,0x69,0x6E,0x20,0x43,0x6F,0x6E,0x66,0x69,
2099− 0x67,0x20,0x2D,0x3E,0x20,0x4D,0x69,0x73,0x63,0x65,0x6C,0x6C,
2100− 0x61,0x6E,0x65,0x6F,0x75,0x73,0x2E,0x4E,0x3E,0x40,0x58,0x30,
2101− 0x33,0x35,0x54,0x68,0x69,0x73,0x20,0x77,0x69,0x6C,0x6C,0x20,
2102− 0x72,0x65,0x73,0x75,0x6C,0x74,0x20,0x69,0x6E,0x20,0x75,0x6E,
2103− 0x65,0x76,0x65,0x6E,0x20,0x70,0x69,0x78,0x65,0x6C,0x20,0x77,
2104− 0x69,0x64,0x74,0x68,0x73,0x2E,0x20,0x49,0x66,0x20,0x79,0x6F,
2105− 0x75,0x20,0x77,0x61,0x6E,0x74,0x20,0x74,0x6F,0x20,0x66,0x69,
2106− 0x78,0x20,0x74,0x68,0x69,0x73,0x2C,0x20,0x65,0x6E,0x61,0x62,
2107− 0x6C,0x65,0x3D,0x22,0x50,0x69,0x78,0x65,0x6C,0x20,0x66,0x69,
2108− 0x6C,0x74,0x65,0x72,0x22,0x20,0x28,0x74,0x68,0x6F,0x75,0x67,
2109− 0x68,0x20,0x74,0x68,0x69,0x73,0x20,0x77,0x69,0x6C,0x6C,0x20,
2110− 0x6D,0x61,0x6B,0x65,0x20,0x74,0x68,0x65,0x20,0x69,0x6D,0x61,
2111− 0x67,0x65,0x20,0x6C,0x6F,0x6F,0x6B,0x20,0x62,0x6C,0x75,0x72,
2112− 0x72,0x79,0x29,0x2E,0x06,0x3E,0x40,0x58,0x30,0x32,0x30,0x27,
2113− 0x3E,0x40,0x43,0x30,0x30,0x31,0x51,0x3A,0x20,0x49,0x20,0x63,
2114− 0x61,0x6E,0x27,0x74,0x20,0x75,0x73,0x65,0x20,0x41,0x6C,0x74,
2115− 0x2B,0x46,0x34,0x20,0x61,0x6E,0x64,0x20,0x41,0x6C,0x74,0x2B,
2116− 0x46,0x35,0x21,0x4E,0x3E,0x40,0x43,0x30,0x30,0x32,0x41,0x3A,
2117− 0x20,0x57,0x69,0x6E,0x64,0x6F,0x77,0x73,0x3A,0x20,0x49,0x66,
2118− 0x20,0x79,0x6F,0x75,0x20,0x68,0x61,0x76,0x65,0x20,0x47,0x65,
2119− 0x46,0x6F,0x72,0x63,0x65,0x20,0x45,0x78,0x70,0x65,0x72,0x69,
2120− 0x65,0x6E,0x63,0x65,0x20,0x69,0x6E,0x73,0x74,0x61,0x6C,0x6C,
2121− 0x65,0x64,0x2C,0x20,0x79,0x6F,0x75,0x20,0x6E,0x65,0x65,0x64,
2122− 0x20,0x74,0x6F,0x20,0x63,0x68,0x61,0x6E,0x67,0x65,0x2B,0x3E,
2123− 0x40,0x58,0x30,0x33,0x35,0x74,0x68,0x65,0x20,0x6B,0x65,0x79,
2124− 0x62,0x69,0x6E,0x64,0x69,0x6E,0x67,0x73,0x20,0x69,0x6E,0x20,
2125− 0x69,0x74,0x73,0x20,0x73,0x65,0x74,0x74,0x69,0x6E,0x67,0x73,
2126− 0x20,0x70,0x61,0x67,0x65,0x2E,0x57,0x3E,0x6D,0x61,0x63,0x4F,
2127− 0x53,0x2F,0x4F,0x53,0x20,0x58,0x3A,0x20,0x43,0x68,0x61,0x6E,
2128− 0x67,0x65,0x20,0x41,0x6C,0x74,0x2B,0x46,0x34,0x2F,0x41,0x6C,
2129− 0x74,0x2B,0x46,0x35,0x20,0x6B,0x65,0x79,0x73,0x20,0x69,0x6E,
2130− 0x20,0x74,0x68,0x65,0x20,0x4F,0x53,0x20,0x74,0x6F,0x20,0x73,
2131− 0x6F,0x6D,0x65,0x74,0x68,0x69,0x6E,0x67,0x20,0x65,0x6C,0x73,
2132− 0x65,0x2E,0x20,0x41,0x6C,0x73,0x6F,0x20,0x66,0x6F,0x72,0x20,
2133− 0x47,0x4E,0x55,0x2F,0x4C,0x69,0x6E,0x75,0x78,0x2E,0x06,0x3E,
2134− 0x40,0x58,0x30,0x32,0x30,0x2B,0x3E,0x40,0x43,0x30,0x30,0x31,
2135− 0x51,0x3A,0x20,0x54,0x68,0x65,0x20,0x6D,0x6F,0x75,0x73,0x65,
2136− 0x20,0x63,0x75,0x72,0x73,0x6F,0x72,0x20,0x69,0x73,0x20,0x64,
2137− 0x65,0x6C,0x61,0x79,0x65,0x64,0x2F,0x6C,0x61,0x67,0x67,0x79,
2138− 0x21,0x44,0x3E,0x40,0x43,0x30,0x30,0x32,0x41,0x3A,0x20,0x4D,
2139− 0x61,0x6B,0x65,0x20,0x73,0x75,0x72,0x65,0x20,0x22,0x53,0x6F,
2140− 0x66,0x74,0x77,0x61,0x72,0x65,0x20,0x6D,0x6F,0x75,0x73,0x65,
2141− 0x22,0x20,0x69,0x73,0x20,0x64,0x69,0x73,0x61,0x62,0x6C,0x65,
2142− 0x64,0x20,0x69,0x6E,0x20,0x43,0x6F,0x6E,0x66,0x69,0x67,0x20,
2143− 0x2D,0x3E,0x20,0x4C,0x61,0x79,0x6F,0x75,0x74,0x2E,0x4B,0x3E,
2144− 0x40,0x58,0x30,0x33,0x35,0x41,0x6C,0x74,0x65,0x72,0x6E,0x61,
2145− 0x74,0x69,0x76,0x65,0x6C,0x79,0x2C,0x20,0x79,0x6F,0x75,0x20,
2146− 0x63,0x61,0x6E,0x20,0x65,0x6E,0x61,0x62,0x6C,0x65,0x20,0x22,
2147− 0x56,0x53,0x79,0x6E,0x63,0x20,0x6F,0x66,0x66,0x22,0x20,0x69,
2148− 0x6E,0x20,0x43,0x6F,0x6E,0x66,0x69,0x67,0x20,0x2D,0x3E,0x20,
2149− 0x4D,0x69,0x73,0x63,0x65,0x6C,0x6C,0x61,0x6E,0x65,0x6F,0x75,
2150− 0x73,0x2E,0x46,0x3E,0x54,0x68,0x69,0x73,0x20,0x68,0x6F,0x77,
2151− 0x65,0x76,0x65,0x72,0x2C,0x20,0x77,0x69,0x6C,0x6C,0x20,0x69,
2152− 0x6E,0x74,0x72,0x6F,0x64,0x75,0x63,0x65,0x20,0x73,0x74,0x75,
2153− 0x74,0x74,0x65,0x72,0x69,0x6E,0x67,0x20,0x62,0x65,0x63,0x61,
2154− 0x75,0x73,0x65,0x20,0x74,0x68,0x65,0x20,0x72,0x65,0x6E,0x64,
2155− 0x65,0x72,0x69,0x6E,0x67,0x20,0x72,0x61,0x74,0x65,0x20,0x69,
2156− 0x73,0x22,0x3E,0x6E,0x6F,0x74,0x20,0x65,0x78,0x61,0x63,0x74,
2157− 0x20,0x74,0x6F,0x20,0x79,0x6F,0x75,0x72,0x20,0x6D,0x6F,0x6E,
2158− 0x69,0x74,0x6F,0x72,0x27,0x73,0x20,0x72,0x61,0x74,0x65,0x2E,
2159− 0x06,0x3E,0x40,0x58,0x30,0x32,0x30,0x33,0x3E,0x40,0x43,0x30,
2160− 0x30,0x31,0x51,0x3A,0x20,0x57,0x69,0x6C,0x6C,0x20,0x79,0x6F,
2161− 0x75,0x20,0x69,0x6D,0x70,0x6C,0x65,0x6D,0x65,0x6E,0x74,0x20,
2162− 0x4D,0x49,0x44,0x49,0x20,0x6F,0x75,0x74,0x20,0x66,0x75,0x6E,
2163− 0x63,0x74,0x69,0x6F,0x6E,0x61,0x6C,0x69,0x74,0x79,0x3F,0x4D,
2164− 0x3E,0x40,0x43,0x30,0x30,0x32,0x41,0x3A,0x20,0x4E,0x6F,0x2C,
2165− 0x20,0x73,0x6F,0x72,0x72,0x79,0x2E,0x20,0x54,0x68,0x69,0x73,
2166− 0x20,0x69,0x73,0x20,0x76,0x65,0x72,0x79,0x20,0x64,0x69,0x66,
2167− 0x66,0x69,0x63,0x75,0x6C,0x74,0x20,0x74,0x6F,0x20,0x69,0x6D,
2168− 0x70,0x6C,0x65,0x6D,0x65,0x6E,0x74,0x20,0x63,0x6F,0x72,0x72,
2169− 0x65,0x63,0x74,0x6C,0x79,0x20,0x77,0x68,0x65,0x6E,0x20,0x68,
2170− 0x61,0x76,0x69,0x6E,0x67,0x3C,0x3E,0x40,0x58,0x30,0x33,0x35,
2171− 0x68,0x69,0x67,0x68,0x65,0x72,0x20,0x61,0x75,0x64,0x69,0x6F,
2172− 0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x20,0x73,0x69,0x7A,0x65,
2173− 0x73,0x20,0x28,0x62,0x75,0x66,0x66,0x65,0x72,0x65,0x64,0x20,
2174− 0x72,0x65,0x70,0x6C,0x61,0x79,0x65,0x72,0x20,0x74,0x69,0x63,
2175− 0x6B,0x73,0x29,0x2E,0x2E,0x2E,0x06,0x3E,0x40,0x58,0x30,0x32,
2176− 0x30,0x30,0x3E,0x40,0x43,0x30,0x30,0x31,0x51,0x3A,0x20,0x57,
2177− 0x68,0x65,0x72,0x65,0x20,0x69,0x73,0x20,0x74,0x68,0x65,0x20,
2178− 0x63,0x6F,0x6E,0x66,0x69,0x67,0x75,0x72,0x61,0x74,0x69,0x6F,
2179− 0x6E,0x20,0x66,0x69,0x6C,0x65,0x20,0x73,0x74,0x6F,0x72,0x65,
2180− 0x64,0x3F,0x3F,0x3E,0x40,0x43,0x30,0x30,0x32,0x41,0x3A,0x20,
2181− 0x57,0x69,0x6E,0x64,0x6F,0x77,0x73,0x3A,0x20,0x5C,0x55,0x73,
2182− 0x65,0x72,0x73,0x5C,0x55,0x53,0x45,0x52,0x5C,0x41,0x70,0x70,
2183− 0x44,0x61,0x74,0x61,0x5C,0x52,0x6F,0x61,0x6D,0x69,0x6E,0x67,
2184− 0x5C,0x46,0x54,0x32,0x20,0x63,0x6C,0x6F,0x6E,0x65,0x5C,0x46,
2185− 0x54,0x32,0x2E,0x43,0x46,0x47,0x45,0x3E,0x40,0x58,0x30,0x33,
2186− 0x35,0x4F,0x53,0x20,0x58,0x3A,0x20,0x2F,0x55,0x73,0x65,0x72,
2187− 0x73,0x2F,0x55,0x53,0x45,0x52,0x2F,0x4C,0x69,0x62,0x72,0x61,
2188− 0x72,0x79,0x2F,0x41,0x70,0x70,0x6C,0x69,0x63,0x61,0x74,0x69,
2189− 0x6F,0x6E,0x20,0x53,0x75,0x70,0x70,0x6F,0x72,0x74,0x2F,0x46,
2190− 0x54,0x32,0x20,0x63,0x6C,0x6F,0x6E,0x65,0x2F,0x46,0x54,0x32,
2191− 0x2E,0x43,0x46,0x47,0x2F,0x47,0x4E,0x55,0x2F,0x4C,0x69,0x6E,
2192− 0x75,0x78,0x3A,0x20,0x2F,0x68,0x6F,0x6D,0x65,0x2F,0x55,0x53,
2193− 0x45,0x52,0x2F,0x2E,0x63,0x6F,0x6E,0x66,0x69,0x67,0x2F,0x46,
2194− 0x54,0x32,0x20,0x63,0x6C,0x6F,0x6E,0x65,0x2F,0x46,0x54,0x32,
2195− 0x2E,0x43,0x46,0x47,0x01,0x3E,0x48,0x49,0x74,0x20,0x77,0x69,
2196− 0x6C,0x6C,0x20,0x62,0x65,0x20,0x73,0x74,0x6F,0x72,0x65,0x64,
2197− 0x20,0x69,0x6E,0x20,0x74,0x68,0x65,0x20,0x70,0x72,0x6F,0x67,
2198− 0x72,0x61,0x6D,0x20,0x64,0x69,0x72,0x65,0x63,0x74,0x6F,0x72,
2199− 0x79,0x20,0x69,0x66,0x20,0x74,0x68,0x65,0x20,0x70,0x61,0x74,
2200− 0x68,0x20,0x63,0x6F,0x75,0x6C,0x64,0x6E,0x27,0x74,0x20,0x62,
2201− 0x65,0x20,0x75,0x73,0x65,0x64,0x2E,0x4D,0x49,0x66,0x20,0x79,
2202− 0x6F,0x75,0x20,0x70,0x75,0x74,0x20,0x74,0x68,0x65,0x20,0x63,
2203− 0x6F,0x6E,0x66,0x69,0x67,0x75,0x72,0x61,0x74,0x69,0x6F,0x6E,
2204− 0x20,0x66,0x69,0x6C,0x65,0x20,0x69,0x6E,0x20,0x74,0x68,0x65,
2205− 0x20,0x70,0x72,0x6F,0x67,0x72,0x61,0x6D,0x20,0x64,0x69,0x72,
2206− 0x65,0x63,0x74,0x6F,0x72,0x79,0x2C,0x20,0x69,0x74,0x20,0x77,
2207− 0x69,0x6C,0x6C,0x20,0x72,0x65,0x61,0x64,0x20,0x74,0x68,0x61,
2208− 0x74,0x4A,0x6F,0x6E,0x65,0x20,0x61,0x6E,0x64,0x20,0x6E,0x6F,
2209− 0x74,0x20,0x61,0x74,0x74,0x65,0x6D,0x70,0x74,0x20,0x74,0x6F,
2210− 0x20,0x63,0x72,0x65,0x61,0x74,0x65,0x20,0x63,0x6F,0x6E,0x66,
2211− 0x69,0x67,0x20,0x64,0x69,0x72,0x73,0x20,0x66,0x6F,0x72,0x20,
2212− 0x74,0x68,0x65,0x20,0x4F,0x53,0x20,0x75,0x73,0x65,0x72,0x2E,
2213− 0x20,0x28,0x70,0x6F,0x72,0x74,0x61,0x62,0x6C,0x65,0x20,0x6D,
2214− 0x6F,0x64,0x65,0x29,0x06,0x3E,0x40,0x58,0x30,0x32,0x30,0x42,
2215− 0x3E,0x40,0x43,0x30,0x30,0x31,0x51,0x3A,0x20,0x43,0x61,0x6E,
2216− 0x20,0x74,0x68,0x65,0x20,0x63,0x6C,0x6F,0x6E,0x65,0x20,0x72,
2217− 0x65,0x61,0x64,0x20,0x46,0x54,0x32,0x2E,0x43,0x46,0x47,0x20,
2218− 0x66,0x72,0x6F,0x6D,0x20,0x72,0x65,0x61,0x6C,0x20,0x46,0x54,
2219− 0x32,0x2C,0x20,0x61,0x6E,0x64,0x20,0x76,0x69,0x63,0x65,0x20,
2220− 0x76,0x65,0x72,0x73,0x61,0x3F,0x4C,0x3E,0x40,0x43,0x30,0x30,
2221− 0x32,0x41,0x3A,0x20,0x59,0x65,0x73,0x2C,0x20,0x69,0x74,0x20,
2222− 0x73,0x68,0x6F,0x75,0x6C,0x64,0x20,0x77,0x6F,0x72,0x6B,0x20,
2223− 0x6A,0x75,0x73,0x74,0x20,0x66,0x69,0x6E,0x65,0x2E,0x20,0x50,
2224− 0x75,0x74,0x20,0x69,0x74,0x20,0x69,0x6E,0x20,0x74,0x68,0x65,
2225− 0x20,0x64,0x69,0x72,0x65,0x63,0x74,0x6F,0x72,0x79,0x20,0x73,
2226− 0x68,0x6F,0x77,0x6E,0x20,0x61,0x62,0x6F,0x76,0x65,0x2E,0x06,
2227− 0x3E,0x40,0x58,0x30,0x32,0x30,0x51,0x3E,0x40,0x43,0x30,0x30,
2228− 0x31,0x51,0x3A,0x20,0x53,0x6D,0x70,0x2E,0x20,0x45,0x64,0x2E,
2229− 0x3A,0x20,0x57,0x68,0x69,0x6C,0x65,0x20,0x7A,0x6F,0x6F,0x6D,
2230− 0x65,0x64,0x20,0x69,0x6E,0x2C,0x20,0x49,0x20,0x73,0x6F,0x6D,
2231− 0x65,0x74,0x69,0x6D,0x65,0x73,0x20,0x63,0x61,0x6E,0x27,0x74,
2232− 0x20,0x6D,0x61,0x72,0x6B,0x20,0x74,0x68,0x65,0x20,0x6C,0x61,
2233− 0x73,0x74,0x20,0x73,0x61,0x6D,0x70,0x6C,0x65,0x20,0x70,0x6F,
2234− 0x69,0x6E,0x74,0x21,0x47,0x3E,0x40,0x43,0x30,0x30,0x32,0x41,
2235− 0x3A,0x20,0x54,0x68,0x69,0x73,0x20,0x69,0x73,0x20,0x6E,0x6F,
2236− 0x72,0x6D,0x61,0x6C,0x2E,0x20,0x54,0x68,0x69,0x73,0x20,0x69,
2237− 0x73,0x20,0x61,0x20,0x6C,0x69,0x6D,0x69,0x74,0x61,0x74,0x69,
2238− 0x6F,0x6E,0x20,0x69,0x6E,0x20,0x74,0x68,0x65,0x20,0x6E,0x61,
2239− 0x74,0x75,0x72,0x65,0x20,0x6F,0x66,0x20,0x73,0x63,0x61,0x6C,
2240− 0x69,0x6E,0x67,0x2E,0x06,0x3E,0x40,0x58,0x30,0x32,0x30,0x17,
2241− 0x3E,0x40,0x43,0x30,0x30,0x31,0x51,0x3A,0x20,0x49,0x20,0x66,
2242− 0x6F,0x75,0x6E,0x64,0x20,0x61,0x20,0x62,0x75,0x67,0x21,0x4C,
2243− 0x3E,0x40,0x43,0x30,0x30,0x32,0x41,0x3A,0x20,0x50,0x6C,0x65,
2244− 0x61,0x73,0x65,0x20,0x73,0x65,0x6E,0x64,0x20,0x6D,0x65,0x20,
2245− 0x61,0x20,0x6D,0x61,0x69,0x6C,0x20,0x28,0x66,0x6F,0x75,0x6E,
2246− 0x64,0x20,0x61,0x74,0x20,0x31,0x36,0x2D,0x62,0x69,0x74,0x73,
2247− 0x2E,0x6F,0x72,0x67,0x29,0x20,0x61,0x6E,0x64,0x20,0x74,0x72,
2248− 0x79,0x20,0x74,0x6F,0x20,0x65,0x78,0x70,0x6C,0x61,0x69,0x6E,
2249− 0x20,0x69,0x74,0x2E,0x00,0x03,0x45,0x4E,0x44,0x4C,0x3B,0x2A,
2250− 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2251− 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2252− 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2253− 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2254− 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2255− 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2256− 0x2A,0x2A,0x4C,0x3B,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2257− 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2258− 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2259− 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2260− 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2261− 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2262− 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x0C,0x40,0x4C,0x4B,0x6E,
2263− 0x6F,0x77,0x6E,0x20,0x62,0x75,0x67,0x73,0x01,0x3E,0x23,0x3E,
2264− 0x40,0x58,0x30,0x31,0x30,0x40,0x43,0x30,0x30,0x31,0x53,0x61,
2265− 0x6D,0x70,0x6C,0x65,0x20,0x72,0x65,0x63,0x6F,0x72,0x64,0x69,
2266− 0x6E,0x67,0x20,0x6F,0x6E,0x20,0x4D,0x61,0x63,0x3A,0x01,0x3E,
2267− 0x53,0x3E,0x40,0x58,0x30,0x31,0x30,0x40,0x43,0x30,0x30,0x32,
2268− 0x2D,0x20,0x53,0x61,0x6D,0x70,0x6C,0x65,0x20,0x72,0x65,0x63,
2269− 0x6F,0x72,0x64,0x69,0x6E,0x67,0x20,0x64,0x6F,0x65,0x73,0x6E,
2270− 0x27,0x74,0x20,0x77,0x6F,0x72,0x6B,0x20,0x6F,0x6E,0x20,0x6D,
2271− 0x61,0x63,0x4F,0x53,0x20,0x4D,0x6F,0x6A,0x61,0x76,0x65,0x20,
2272− 0x61,0x6E,0x64,0x20,0x6C,0x61,0x74,0x65,0x72,0x2C,0x20,0x62,
2273− 0x65,0x63,0x61,0x75,0x73,0x65,0x20,0x6F,0x66,0x20,0x61,0x6E,
2274− 0x56,0x3E,0x40,0x58,0x30,0x32,0x31,0x69,0x73,0x73,0x75,0x65,
2275− 0x20,0x69,0x6E,0x20,0x53,0x44,0x4C,0x32,0x20,0x77,0x68,0x65,
2276− 0x72,0x65,0x20,0x69,0x74,0x20,0x64,0x6F,0x65,0x73,0x6E,0x27,
2277− 0x74,0x20,0x61,0x73,0x6B,0x20,0x66,0x6F,0x72,0x20,0x70,0x65,
2278− 0x72,0x6D,0x69,0x73,0x73,0x69,0x6F,0x6E,0x20,0x74,0x6F,0x20,
2279− 0x75,0x73,0x65,0x20,0x74,0x68,0x65,0x20,0x61,0x75,0x64,0x69,
2280− 0x6F,0x20,0x69,0x6E,0x70,0x75,0x74,0x20,0x64,0x65,0x76,0x69,
2281− 0x63,0x65,0x2E,0x01,0x3E,0x31,0x3E,0x40,0x58,0x30,0x31,0x30,
2282− 0x40,0x43,0x30,0x30,0x31,0x57,0x41,0x56,0x20,0x65,0x78,0x70,
2283− 0x6F,0x72,0x74,0x69,0x6E,0x67,0x20,0x28,0x72,0x65,0x6E,0x64,
2284− 0x65,0x72,0x69,0x6E,0x67,0x20,0x73,0x6F,0x6E,0x67,0x20,0x74,
2285− 0x6F,0x20,0x57,0x41,0x56,0x29,0x3A,0x01,0x3E,0x55,0x3E,0x40,
2286− 0x58,0x30,0x31,0x30,0x40,0x43,0x30,0x30,0x32,0x2D,0x20,0x53,
2287− 0x6F,0x6E,0x67,0x73,0x20,0x74,0x68,0x61,0x74,0x20,0x6A,0x75,
2288− 0x6D,0x70,0x20,0x62,0x61,0x63,0x6B,0x20,0x74,0x6F,0x20,0x61,
2289− 0x20,0x70,0x72,0x65,0x76,0x69,0x6F,0x75,0x73,0x20,0x70,0x61,
2290− 0x74,0x74,0x65,0x72,0x6E,0x20,0x77,0x69,0x6C,0x6C,0x20,0x72,
2291− 0x65,0x6E,0x64,0x65,0x72,0x20,0x66,0x6F,0x72,0x65,0x76,0x65,
2292− 0x72,0x20,0x61,0x6E,0x64,0x20,0x65,0x76,0x65,0x72,0x2C,0x4D,
2293− 0x3E,0x40,0x58,0x30,0x32,0x31,0x61,0x6E,0x64,0x20,0x79,0x6F,
2294− 0x75,0x20,0x6E,0x65,0x65,0x64,0x20,0x74,0x6F,0x20,0x70,0x72,
2295− 0x65,0x73,0x73,0x20,0x61,0x20,0x6B,0x65,0x79,0x20,0x6F,0x72,
2296− 0x20,0x63,0x6C,0x69,0x63,0x6B,0x20,0x74,0x68,0x65,0x20,0x6D,
2297− 0x6F,0x75,0x73,0x65,0x20,0x74,0x6F,0x20,0x61,0x62,0x6F,0x72,
2298− 0x74,0x20,0x74,0x68,0x65,0x20,0x72,0x65,0x6E,0x64,0x65,0x72,
2299− 0x20,0x77,0x68,0x65,0x6E,0x15,0x3E,0x40,0x58,0x30,0x32,0x31,
2300− 0x79,0x6F,0x75,0x20,0x77,0x61,0x6E,0x74,0x20,0x69,0x74,0x20,
2301− 0x74,0x6F,0x2E,0x01,0x3E,0x11,0x3E,0x40,0x58,0x30,0x31,0x30,
2302− 0x40,0x43,0x30,0x30,0x31,0x56,0x69,0x64,0x65,0x6F,0x3A,0x06,
2303− 0x3E,0x40,0x43,0x30,0x30,0x32,0x50,0x3E,0x40,0x58,0x30,0x31,
2304− 0x30,0x2D,0x20,0x46,0x75,0x6C,0x6C,0x73,0x63,0x72,0x65,0x65,
2305− 0x6E,0x20,0x6D,0x6F,0x64,0x65,0x20,0x63,0x61,0x6E,0x20,0x62,
2306− 0x65,0x20,0x75,0x6E,0x62,0x65,0x61,0x72,0x61,0x62,0x6C,0x79,
2307− 0x20,0x73,0x6C,0x6F,0x77,0x20,0x6F,0x6E,0x20,0x61,0x20,0x52,
2308− 0x61,0x73,0x70,0x62,0x65,0x72,0x72,0x79,0x20,0x50,0x69,0x20,
2309− 0x28,0x65,0x76,0x65,0x6E,0x20,0x6F,0x6E,0x20,0x52,0x50,0x69,
2310− 0x20,0x34,0x29,0x52,0x3E,0x40,0x58,0x30,0x31,0x30,0x2D,0x20,
2311− 0x4E,0x6F,0x74,0x20,0x61,0x20,0x62,0x75,0x67,0x2C,0x20,0x62,
2312− 0x75,0x74,0x20,0x69,0x66,0x20,0x79,0x6F,0x75,0x72,0x20,0x6D,
2313− 0x6F,0x6E,0x69,0x74,0x6F,0x72,0x27,0x73,0x20,0x72,0x65,0x66,
2314− 0x72,0x65,0x73,0x68,0x20,0x72,0x61,0x74,0x65,0x20,0x69,0x73,
2315− 0x20,0x6E,0x6F,0x74,0x20,0x73,0x65,0x74,0x20,0x74,0x6F,0x20,
2316− 0x36,0x30,0x48,0x7A,0x20,0x28,0x6F,0x72,0x20,0x35,0x39,0x48,
2317− 0x7A,0x29,0x4A,0x3E,0x40,0x58,0x30,0x32,0x31,0x79,0x6F,0x75,
2318− 0x20,0x6D,0x61,0x79,0x20,0x65,0x78,0x70,0x65,0x72,0x69,0x65,
2319− 0x6E,0x63,0x65,0x20,0x76,0x69,0x73,0x75,0x61,0x6C,0x20,0x73,
2320− 0x74,0x75,0x74,0x74,0x65,0x72,0x69,0x6E,0x67,0x20,0x62,0x65,
2321− 0x63,0x61,0x75,0x73,0x65,0x20,0x56,0x53,0x79,0x6E,0x63,0x20,
2322− 0x77,0x69,0x6C,0x6C,0x20,0x6E,0x6F,0x74,0x20,0x62,0x65,0x20,
2323− 0x75,0x73,0x65,0x64,0x2E,0x00,0x03,0x45,0x4E,0x44
1835+ 0x74,0x69,0x6F,0x6E,0x2C,0x20,0x49,0x2F,0x4F,0x20,0x64,0x65,
1836+ 0x76,0x69,0x63,0x65,0x73,0x3A,0x01,0x3E,0x19,0x3E,0x40,0x58,
1837+ 0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x49,0x6E,0x74,0x65,
1838+ 0x72,0x70,0x6F,0x6C,0x61,0x74,0x69,0x6F,0x6E,0x3A,0x0B,0x3E,
1839+ 0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x35,0x53,
1840+ 0x65,0x6C,0x65,0x63,0x74,0x73,0x20,0x77,0x68,0x61,0x74,0x20,
1841+ 0x74,0x79,0x70,0x65,0x20,0x6F,0x66,0x20,0x72,0x65,0x73,0x61,
1842+ 0x6D,0x70,0x6C,0x69,0x6E,0x67,0x20,0x69,0x6E,0x74,0x65,0x72,
1843+ 0x70,0x6F,0x6C,0x61,0x74,0x69,0x6F,0x6E,0x20,0x74,0x6F,0x20,
1844+ 0x75,0x73,0x65,0x2E,0x45,0x22,0x4E,0x6F,0x6E,0x65,0x22,0x20,
1845+ 0x75,0x73,0x65,0x73,0x20,0x6E,0x6F,0x20,0x69,0x6E,0x74,0x65,
1846+ 0x72,0x70,0x6F,0x6C,0x61,0x74,0x69,0x6F,0x6E,0x20,0x28,0x6E,
1847+ 0x65,0x61,0x72,0x65,0x73,0x74,0x20,0x6E,0x65,0x69,0x67,0x68,
1848+ 0x62,0x6F,0x72,0x29,0x2C,0x20,0x77,0x68,0x69,0x63,0x68,0x20,
1849+ 0x77,0x69,0x6C,0x6C,0x20,0x72,0x65,0x73,0x75,0x6C,0x74,0x20,
1850+ 0x69,0x6E,0x49,0x61,0x6C,0x69,0x61,0x73,0x69,0x6E,0x67,0x20,
1851+ 0x28,0x6E,0x6F,0x69,0x73,0x65,0x29,0x20,0x69,0x6E,0x20,0x74,
1852+ 0x68,0x65,0x20,0x73,0x6F,0x75,0x6E,0x64,0x2E,0x20,0x22,0x4C,
1853+ 0x69,0x6E,0x65,0x61,0x72,0x22,0x20,0x69,0x73,0x20,0x77,0x68,
1854+ 0x61,0x74,0x20,0x72,0x65,0x61,0x6C,0x20,0x46,0x54,0x32,0x20,
1855+ 0x75,0x73,0x65,0x73,0x2C,0x20,0x77,0x68,0x69,0x63,0x68,0x20,
1856+ 0x69,0x73,0x20,0x61,0x47,0x6D,0x65,0x64,0x69,0x6F,0x63,0x72,
1857+ 0x65,0x20,0x69,0x6E,0x74,0x65,0x72,0x70,0x6F,0x6C,0x61,0x74,
1858+ 0x69,0x6F,0x6E,0x20,0x74,0x79,0x70,0x65,0x2E,0x20,0x22,0x57,
1859+ 0x69,0x6E,0x64,0x6F,0x77,0x65,0x64,0x2D,0x73,0x69,0x6E,0x63,
1860+ 0x22,0x20,0x69,0x73,0x20,0x74,0x68,0x65,0x20,0x72,0x65,0x63,
1861+ 0x6F,0x6D,0x6D,0x65,0x6E,0x64,0x65,0x64,0x20,0x73,0x65,0x74,
1862+ 0x74,0x69,0x6E,0x67,0x48,0x66,0x6F,0x72,0x20,0x74,0x68,0x65,
1863+ 0x20,0x62,0x65,0x73,0x74,0x20,0x61,0x75,0x64,0x69,0x6F,0x20,
1864+ 0x71,0x75,0x61,0x6C,0x69,0x74,0x79,0x2C,0x20,0x61,0x6C,0x74,
1865+ 0x68,0x6F,0x75,0x67,0x68,0x20,0x69,0x74,0x20,0x6D,0x61,0x79,
1866+ 0x20,0x73,0x6F,0x6D,0x65,0x74,0x69,0x6D,0x65,0x73,0x20,0x73,
1867+ 0x6F,0x75,0x6E,0x64,0x20,0x74,0x6F,0x6F,0x20,0x66,0x69,0x6C,
1868+ 0x74,0x65,0x72,0x65,0x64,0x2A,0x6F,0x6E,0x20,0x6C,0x6F,0x77,
1869+ 0x2D,0x71,0x75,0x61,0x6C,0x69,0x74,0x79,0x20,0x73,0x61,0x6D,
1870+ 0x70,0x6C,0x65,0x73,0x20,0x28,0x66,0x2E,0x65,0x78,0x2E,0x20,
1871+ 0x41,0x6D,0x69,0x67,0x61,0x20,0x4D,0x4F,0x44,0x73,0x29,0x2E,
1872+ 0x00,0x1A,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,
1873+ 0x31,0x56,0x6F,0x6C,0x75,0x6D,0x65,0x20,0x72,0x61,0x6D,0x70,
1874+ 0x69,0x6E,0x67,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40,
1875+ 0x43,0x30,0x30,0x32,0x3B,0x45,0x6E,0x61,0x62,0x6C,0x65,0x73,
1876+ 0x20,0x74,0x68,0x65,0x20,0x61,0x6E,0x74,0x69,0x2D,0x63,0x6C,
1877+ 0x69,0x63,0x6B,0x20,0x73,0x79,0x73,0x74,0x65,0x6D,0x20,0x69,
1878+ 0x6E,0x20,0x74,0x68,0x65,0x20,0x61,0x75,0x64,0x69,0x6F,0x20,
1879+ 0x6D,0x69,0x78,0x65,0x72,0x20,0x28,0x46,0x54,0x32,0x2E,0x30,
1880+ 0x38,0x2B,0x29,0x2E,0x3B,0x50,0x6C,0x65,0x61,0x73,0x65,0x20,
1881+ 0x6E,0x6F,0x74,0x65,0x20,0x74,0x68,0x61,0x74,0x20,0x6F,0x72,
1882+ 0x69,0x67,0x69,0x6E,0x61,0x6C,0x20,0x46,0x54,0x32,0x20,0x63,
1883+ 0x61,0x6E,0x27,0x74,0x20,0x6C,0x6F,0x61,0x64,0x20,0x74,0x68,
1884+ 0x69,0x73,0x20,0x63,0x6F,0x6E,0x66,0x69,0x67,0x20,0x65,0x6E,
1885+ 0x74,0x72,0x79,0x2C,0x0B,0x63,0x6C,0x6F,0x6E,0x65,0x20,0x6F,
1886+ 0x6E,0x6C,0x79,0x2E,0x00,0x19,0x3E,0x40,0x58,0x30,0x34,0x30,
1887+ 0x40,0x43,0x30,0x30,0x31,0x41,0x6D,0x70,0x6C,0x69,0x66,0x69,
1888+ 0x63,0x61,0x74,0x69,0x6F,0x6E,0x3A,0x0B,0x3E,0x40,0x58,0x30,
1889+ 0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x46,0x41,0x6D,0x70,0x6C,
1890+ 0x69,0x66,0x69,0x65,0x73,0x20,0x74,0x68,0x65,0x20,0x76,0x6F,
1891+ 0x6C,0x75,0x6D,0x65,0x20,0x77,0x68,0x65,0x6E,0x20,0x6D,0x69,
1892+ 0x78,0x69,0x6E,0x67,0x2E,0x20,0x49,0x66,0x20,0x79,0x6F,0x75,
1893+ 0x20,0x73,0x65,0x74,0x20,0x74,0x68,0x69,0x73,0x20,0x6F,0x6E,
1894+ 0x65,0x20,0x74,0x6F,0x6F,0x20,0x68,0x69,0x67,0x68,0x2C,0x20,
1895+ 0x79,0x6F,0x75,0x27,0x6C,0x6C,0x3A,0x67,0x65,0x74,0x20,0x64,
1896+ 0x69,0x73,0x74,0x6F,0x72,0x74,0x69,0x6F,0x6E,0x2E,0x20,0x33,
1897+ 0x32,0x58,0x20,0x65,0x71,0x75,0x61,0x6C,0x73,0x20,0x66,0x75,
1898+ 0x6C,0x6C,0x20,0x61,0x6D,0x70,0x6C,0x69,0x74,0x75,0x64,0x65,
1899+ 0x20,0x66,0x6F,0x72,0x20,0x6F,0x6E,0x65,0x20,0x63,0x68,0x61,
1900+ 0x6E,0x6E,0x65,0x6C,0x2E,0x00,0x1B,0x3E,0x40,0x58,0x30,0x34,
1901+ 0x30,0x40,0x43,0x30,0x30,0x31,0x46,0x72,0x65,0x71,0x75,0x65,
1902+ 0x6E,0x63,0x79,0x20,0x74,0x61,0x62,0x6C,0x65,0x3A,0x0B,0x3E,
1903+ 0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x40,0x54,
1904+ 0x68,0x65,0x20,0x6C,0x69,0x6E,0x65,0x61,0x72,0x20,0x66,0x72,
1905+ 0x65,0x71,0x75,0x65,0x6E,0x63,0x79,0x20,0x74,0x61,0x62,0x6C,
1906+ 0x65,0x20,0x6D,0x61,0x6B,0x65,0x73,0x20,0x61,0x6C,0x6C,0x20,
1907+ 0x70,0x69,0x74,0x63,0x68,0x20,0x62,0x65,0x6E,0x64,0x73,0x20,
1908+ 0x72,0x75,0x6E,0x20,0x69,0x6E,0x20,0x63,0x6F,0x6E,0x73,0x74,
1909+ 0x61,0x6E,0x74,0x3F,0x73,0x70,0x65,0x65,0x64,0x2C,0x20,0x69,
1910+ 0x6E,0x64,0x65,0x70,0x65,0x6E,0x64,0x65,0x6E,0x74,0x20,0x6F,
1911+ 0x66,0x20,0x74,0x68,0x65,0x20,0x63,0x75,0x72,0x72,0x65,0x6E,
1912+ 0x74,0x20,0x66,0x72,0x65,0x71,0x75,0x65,0x6E,0x63,0x79,0x2E,
1913+ 0x20,0x49,0x66,0x20,0x79,0x6F,0x75,0x20,0x73,0x77,0x69,0x74,
1914+ 0x63,0x68,0x20,0x74,0x68,0x69,0x73,0x41,0x6F,0x6E,0x65,0x2C,
1915+ 0x20,0x6F,0x6E,0x20,0x61,0x20,0x66,0x69,0x6E,0x69,0x73,0x68,
1916+ 0x65,0x64,0x20,0x73,0x6F,0x6E,0x67,0x2C,0x20,0x69,0x74,0x20,
1917+ 0x6D,0x69,0x67,0x68,0x74,0x20,0x73,0x6F,0x75,0x6E,0x64,0x20,
1918+ 0x73,0x74,0x72,0x61,0x6E,0x67,0x65,0x20,0x69,0x66,0x20,0x74,
1919+ 0x68,0x65,0x20,0x73,0x6F,0x75,0x6E,0x64,0x20,0x75,0x73,0x65,
1920+ 0x73,0x0D,0x70,0x6F,0x72,0x74,0x61,0x6D,0x65,0x6E,0x74,0x6F,
1921+ 0x65,0x73,0x2E,0x00,0x20,0x40,0x58,0x30,0x32,0x30,0x40,0x43,
1922+ 0x30,0x30,0x31,0x43,0x6F,0x6E,0x66,0x69,0x67,0x75,0x72,0x61,
1923+ 0x74,0x69,0x6F,0x6E,0x2C,0x20,0x4C,0x61,0x79,0x6F,0x75,0x74,
1924+ 0x3A,0x01,0x3E,0x29,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,
1925+ 0x30,0x30,0x31,0x50,0x61,0x74,0x74,0x65,0x72,0x6E,0x20,0x6C,
1926+ 0x61,0x79,0x6F,0x75,0x74,0x2C,0x20,0x68,0x65,0x78,0x20,0x6E,
1927+ 0x75,0x6D,0x62,0x65,0x72,0x69,0x6E,0x67,0x3A,0x0B,0x3E,0x40,
1928+ 0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x41,0x49,0x66,
1929+ 0x20,0x79,0x6F,0x75,0x20,0x75,0x73,0x65,0x20,0x70,0x61,0x74,
1930+ 0x74,0x65,0x72,0x6E,0x73,0x20,0x74,0x68,0x61,0x74,0x20,0x61,
1931+ 0x72,0x65,0x20,0x6C,0x6F,0x6E,0x67,0x65,0x72,0x20,0x74,0x68,
1932+ 0x61,0x6E,0x20,0x39,0x39,0x20,0x6C,0x69,0x6E,0x65,0x73,0x2C,
1933+ 0x20,0x79,0x6F,0x75,0x20,0x73,0x68,0x6F,0x75,0x6C,0x64,0x20,
1934+ 0x75,0x73,0x65,0x45,0x68,0x65,0x78,0x20,0x63,0x6F,0x75,0x6E,
1935+ 0x74,0x69,0x6E,0x67,0x20,0x73,0x69,0x6E,0x63,0x65,0x20,0x74,
1936+ 0x68,0x65,0x72,0x65,0x20,0x61,0x72,0x65,0x20,0x6F,0x6E,0x6C,
1937+ 0x79,0x20,0x32,0x20,0x64,0x69,0x67,0x69,0x74,0x73,0x20,0x69,
1938+ 0x6E,0x20,0x74,0x68,0x65,0x20,0x6C,0x69,0x6E,0x65,0x20,0x6E,
1939+ 0x75,0x6D,0x62,0x65,0x72,0x20,0x63,0x6F,0x6C,0x75,0x6D,0x6E,
1940+ 0x2E,0x00,0x12,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,
1941+ 0x30,0x31,0x53,0x63,0x6F,0x70,0x65,0x73,0x3A,0x0B,0x3E,0x40,
1942+ 0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x43,0x22,0x53,
1943+ 0x74,0x64,0x2E,0x22,0x20,0x28,0x73,0x74,0x61,0x6E,0x64,0x61,
1944+ 0x72,0x64,0x29,0x20,0x77,0x69,0x6C,0x6C,0x20,0x73,0x68,0x6F,
1945+ 0x77,0x20,0x74,0x68,0x65,0x20,0x73,0x61,0x6D,0x70,0x6C,0x65,
1946+ 0x20,0x70,0x6F,0x69,0x6E,0x74,0x73,0x20,0x61,0x73,0x20,0x70,
1947+ 0x69,0x78,0x65,0x6C,0x73,0x20,0x28,0x6C,0x69,0x6B,0x65,0x20,
1948+ 0x46,0x54,0x32,0x29,0x2E,0x3D,0x22,0x4C,0x69,0x6E,0x65,0x64,
1949+ 0x22,0x20,0x77,0x69,0x6C,0x6C,0x20,0x64,0x72,0x61,0x77,0x20,
1950+ 0x69,0x6E,0x74,0x65,0x72,0x70,0x6F,0x6C,0x61,0x74,0x65,0x64,
1951+ 0x20,0x73,0x61,0x6D,0x70,0x6C,0x65,0x73,0x20,0x28,0x6C,0x69,
1952+ 0x6E,0x65,0x61,0x72,0x20,0x69,0x6E,0x74,0x65,0x72,0x70,0x6F,
1953+ 0x6C,0x61,0x74,0x69,0x6F,0x6E,0x2E,0x00,0x27,0x40,0x58,0x30,
1954+ 0x32,0x30,0x40,0x43,0x30,0x30,0x31,0x43,0x6F,0x6E,0x66,0x69,
1955+ 0x67,0x75,0x72,0x61,0x74,0x69,0x6F,0x6E,0x2C,0x20,0x4D,0x69,
1956+ 0x73,0x63,0x65,0x6C,0x6C,0x61,0x6E,0x65,0x6F,0x75,0x73,0x3A,
1957+ 0x01,0x3E,0x15,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,
1958+ 0x30,0x31,0x56,0x53,0x79,0x6E,0x63,0x20,0x6F,0x66,0x66,0x3A,
1959+ 0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,
1960+ 0x3F,0x54,0x65,0x6C,0x6C,0x73,0x20,0x74,0x68,0x65,0x20,0x70,
1961+ 0x72,0x6F,0x67,0x72,0x61,0x6D,0x20,0x74,0x6F,0x20,0x6E,0x6F,
1962+ 0x74,0x20,0x75,0x73,0x65,0x20,0x56,0x53,0x79,0x6E,0x63,0x20,
1963+ 0x66,0x6F,0x72,0x20,0x76,0x69,0x64,0x65,0x6F,0x2E,0x20,0x49,
1964+ 0x66,0x20,0x79,0x6F,0x75,0x72,0x20,0x6D,0x6F,0x6E,0x69,0x74,
1965+ 0x6F,0x72,0x27,0x73,0x40,0x72,0x65,0x66,0x72,0x65,0x73,0x68,
1966+ 0x20,0x72,0x61,0x74,0x65,0x20,0x69,0x73,0x20,0x6E,0x6F,0x74,
1967+ 0x20,0x36,0x30,0x48,0x7A,0x20,0x28,0x6F,0x72,0x20,0x35,0x39,
1968+ 0x48,0x7A,0x29,0x2C,0x20,0x74,0x68,0x65,0x6E,0x20,0x56,0x53,
1969+ 0x79,0x6E,0x63,0x20,0x69,0x73,0x20,0x61,0x6C,0x77,0x61,0x79,
1970+ 0x73,0x20,0x6F,0x66,0x66,0x20,0x66,0x6F,0x72,0x45,0x74,0x68,
1971+ 0x69,0x73,0x20,0x70,0x72,0x6F,0x67,0x72,0x61,0x6D,0x2E,0x20,
1972+ 0x4E,0x6F,0x74,0x20,0x68,0x61,0x76,0x69,0x6E,0x67,0x20,0x56,
1973+ 0x53,0x79,0x6E,0x63,0x20,0x77,0x69,0x6C,0x6C,0x20,0x72,0x65,
1974+ 0x73,0x75,0x6C,0x74,0x20,0x69,0x6E,0x20,0x6C,0x65,0x73,0x73,
1975+ 0x20,0x69,0x6E,0x70,0x75,0x74,0x2F,0x76,0x69,0x64,0x65,0x6F,
1976+ 0x20,0x64,0x65,0x6C,0x61,0x79,0x2C,0x1E,0x62,0x75,0x74,0x20,
1977+ 0x61,0x6C,0x73,0x6F,0x20,0x70,0x6F,0x74,0x65,0x6E,0x74,0x69,
1978+ 0x61,0x6C,0x20,0x73,0x74,0x75,0x74,0x74,0x65,0x72,0x69,0x6E,
1979+ 0x67,0x2E,0x00,0x15,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,
1980+ 0x30,0x30,0x31,0x53,0x74,0x72,0x65,0x74,0x63,0x68,0x65,0x64,
1981+ 0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,
1982+ 0x32,0x4A,0x4D,0x61,0x6B,0x65,0x73,0x20,0x66,0x75,0x6C,0x6C,
1983+ 0x73,0x63,0x72,0x65,0x65,0x6E,0x20,0x6D,0x6F,0x64,0x65,0x20,
1984+ 0x63,0x6F,0x6D,0x70,0x6C,0x65,0x74,0x65,0x6C,0x79,0x20,0x73,
1985+ 0x74,0x72,0x65,0x74,0x63,0x68,0x20,0x6F,0x75,0x74,0x20,0x74,
1986+ 0x68,0x65,0x20,0x69,0x6D,0x61,0x67,0x65,0x2E,0x20,0x54,0x68,
1987+ 0x69,0x73,0x20,0x63,0x61,0x6E,0x20,0x72,0x65,0x73,0x75,0x6C,
1988+ 0x74,0x20,0x69,0x6E,0x4E,0x61,0x6C,0x69,0x61,0x73,0x69,0x6E,
1989+ 0x67,0x20,0x28,0x75,0x6E,0x65,0x76,0x65,0x6E,0x20,0x70,0x69,
1990+ 0x78,0x65,0x6C,0x20,0x77,0x69,0x64,0x74,0x68,0x73,0x29,0x20,
1991+ 0x69,0x66,0x20,0x74,0x68,0x65,0x20,0x61,0x73,0x70,0x65,0x63,
1992+ 0x74,0x20,0x72,0x61,0x74,0x69,0x6F,0x20,0x6F,0x66,0x20,0x74,
1993+ 0x68,0x65,0x20,0x73,0x63,0x72,0x65,0x65,0x6E,0x20,0x69,0x73,
1994+ 0x20,0x6E,0x6F,0x74,0x20,0x31,0x36,0x3A,0x31,0x30,0x2E,0x52,
1995+ 0x54,0x68,0x65,0x20,0x22,0x50,0x69,0x78,0x65,0x6C,0x20,0x66,
1996+ 0x69,0x6C,0x74,0x65,0x72,0x22,0x20,0x73,0x65,0x74,0x74,0x69,
1997+ 0x6E,0x67,0x20,0x63,0x61,0x6E,0x20,0x68,0x65,0x6C,0x70,0x20,
1998+ 0x77,0x69,0x74,0x68,0x20,0x74,0x68,0x69,0x73,0x2C,0x20,0x62,
1999+ 0x75,0x74,0x20,0x69,0x74,0x20,0x6D,0x61,0x6B,0x65,0x73,0x20,
2000+ 0x74,0x68,0x65,0x20,0x69,0x6D,0x61,0x67,0x65,0x20,0x6C,0x6F,
2001+ 0x6F,0x6B,0x20,0x62,0x6C,0x75,0x72,0x72,0x79,0x2E,0x01,0x20,
2002+ 0x18,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,
2003+ 0x50,0x69,0x78,0x65,0x6C,0x20,0x66,0x69,0x6C,0x74,0x65,0x72,
2004+ 0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,
2005+ 0x32,0x52,0x41,0x70,0x70,0x6C,0x69,0x65,0x73,0x20,0x61,0x6E,
2006+ 0x20,0x61,0x6E,0x74,0x69,0x2D,0x61,0x6C,0x69,0x61,0x73,0x69,
2007+ 0x6E,0x67,0x20,0x73,0x75,0x62,0x70,0x69,0x78,0x65,0x6C,0x20,
2008+ 0x66,0x69,0x6C,0x74,0x65,0x72,0x20,0x74,0x68,0x61,0x74,0x20,
2009+ 0x69,0x73,0x20,0x75,0x73,0x65,0x64,0x20,0x77,0x68,0x65,0x6E,
2010+ 0x20,0x74,0x68,0x65,0x20,0x77,0x69,0x6E,0x64,0x6F,0x77,0x20,
2011+ 0x69,0x73,0x20,0x75,0x70,0x73,0x63,0x61,0x6C,0x65,0x64,0x2E,
2012+ 0x3B,0x50,0x6C,0x65,0x61,0x73,0x65,0x20,0x6B,0x65,0x65,0x70,
2013+ 0x20,0x69,0x6E,0x20,0x6D,0x69,0x6E,0x64,0x20,0x74,0x68,0x61,
2014+ 0x74,0x20,0x74,0x68,0x69,0x73,0x20,0x77,0x69,0x6C,0x6C,0x20,
2015+ 0x6D,0x61,0x6B,0x65,0x20,0x70,0x69,0x78,0x65,0x6C,0x73,0x20,
2016+ 0x6C,0x6F,0x6F,0x6B,0x20,0x62,0x6C,0x75,0x72,0x72,0x79,0x2E,
2017+ 0x00,0x23,0x40,0x58,0x30,0x32,0x30,0x40,0x43,0x30,0x30,0x31,
2018+ 0x41,0x64,0x76,0x61,0x6E,0x63,0x65,0x64,0x20,0x65,0x64,0x69,
2019+ 0x74,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x73,0x3A,
2020+ 0x20,0x01,0x3E,0x1E,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,
2021+ 0x30,0x30,0x31,0x43,0x6F,0x70,0x79,0x2F,0x50,0x61,0x73,0x74,
2022+ 0x65,0x20,0x6D,0x61,0x73,0x6B,0x69,0x6E,0x67,0x3A,0x0B,0x3E,
2023+ 0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x37,0x54,
2024+ 0x68,0x65,0x20,0x6D,0x61,0x73,0x6B,0x69,0x6E,0x67,0x20,0x69,
2025+ 0x73,0x20,0x75,0x73,0x65,0x64,0x20,0x66,0x6F,0x72,0x20,0x63,
2026+ 0x6F,0x70,0x79,0x69,0x6E,0x67,0x2F,0x70,0x61,0x73,0x74,0x69,
2027+ 0x6E,0x67,0x20,0x6F,0x6E,0x6C,0x79,0x20,0x70,0x61,0x72,0x74,
2028+ 0x73,0x20,0x6F,0x66,0x20,0x61,0x46,0x22,0x6E,0x6F,0x74,0x65,
2029+ 0x2D,0x63,0x65,0x6C,0x6C,0x22,0x2E,0x20,0x54,0x68,0x65,0x20,
2030+ 0x64,0x69,0x66,0x66,0x65,0x72,0x65,0x6E,0x74,0x20,0x70,0x61,
2031+ 0x72,0x74,0x73,0x20,0x6F,0x66,0x20,0x61,0x20,0x22,0x6E,0x6F,
2032+ 0x74,0x65,0x2D,0x63,0x65,0x6C,0x6C,0x22,0x20,0x69,0x73,0x20,
2033+ 0x4E,0x6F,0x74,0x65,0x2C,0x20,0x49,0x6E,0x73,0x74,0x72,0x2E,
2034+ 0x20,0x6E,0x72,0x2E,0x2C,0x20,0x56,0x6F,0x6C,0x75,0x6D,0x65,
2035+ 0x2C,0x20,0x45,0x66,0x66,0x65,0x63,0x74,0x20,0x6E,0x72,0x20,
2036+ 0x26,0x20,0x45,0x66,0x66,0x65,0x63,0x74,0x20,0x64,0x61,0x74,
2037+ 0x61,0x2E,0x34,0x3E,0x41,0x73,0x20,0x79,0x6F,0x75,0x20,0x63,
2038+ 0x61,0x6E,0x20,0x73,0x65,0x65,0x20,0x69,0x6E,0x20,0x74,0x68,
2039+ 0x65,0x20,0x77,0x69,0x6E,0x64,0x6F,0x77,0x20,0x74,0x68,0x65,
2040+ 0x72,0x65,0x20,0x61,0x72,0x65,0x20,0x33,0x20,0x63,0x6F,0x6C,
2041+ 0x75,0x6D,0x6E,0x73,0x20,0x6F,0x66,0x3D,0x22,0x65,0x6E,0x61,
2042+ 0x62,0x6C,0x65,0x2F,0x64,0x69,0x73,0x61,0x62,0x6C,0x65,0x20,
2043+ 0x62,0x75,0x74,0x74,0x6F,0x6E,0x73,0x22,0x20,0x77,0x68,0x69,
2044+ 0x63,0x68,0x20,0x68,0x61,0x73,0x20,0x74,0x68,0x65,0x20,0x6C,
2045+ 0x65,0x74,0x74,0x65,0x72,0x73,0x20,0x43,0x2C,0x50,0x20,0x26,
2046+ 0x20,0x54,0x20,0x61,0x62,0x6F,0x76,0x65,0x2E,0x45,0x3E,0x43,
2047+ 0x20,0x6D,0x65,0x61,0x6E,0x73,0x20,0x63,0x6F,0x70,0x79,0x2C,
2048+ 0x20,0x69,0x74,0x20,0x63,0x6F,0x6E,0x74,0x72,0x6F,0x6C,0x73,
2049+ 0x20,0x77,0x68,0x69,0x63,0x68,0x20,0x70,0x61,0x72,0x74,0x73,
2050+ 0x20,0x74,0x68,0x61,0x74,0x20,0x67,0x6F,0x65,0x73,0x20,0x69,
2051+ 0x6E,0x74,0x6F,0x20,0x74,0x68,0x65,0x20,0x63,0x6F,0x70,0x79,
2052+ 0x62,0x75,0x66,0x66,0x65,0x72,0x2E,0x3E,0x3E,0x50,0x20,0x6D,
2053+ 0x65,0x61,0x6E,0x73,0x20,0x70,0x61,0x73,0x74,0x65,0x20,0x61,
2054+ 0x6E,0x64,0x20,0x63,0x6F,0x6E,0x74,0x72,0x6F,0x6C,0x73,0x20,
2055+ 0x77,0x68,0x69,0x63,0x68,0x20,0x70,0x61,0x72,0x74,0x73,0x20,
2056+ 0x74,0x68,0x61,0x74,0x20,0x67,0x6F,0x65,0x73,0x20,0x6F,0x75,
2057+ 0x74,0x20,0x66,0x72,0x6F,0x6D,0x20,0x74,0x68,0x65,0x0B,0x63,
2058+ 0x6F,0x70,0x79,0x62,0x75,0x66,0x66,0x65,0x72,0x2E,0x45,0x3E,
2059+ 0x54,0x20,0x6D,0x65,0x61,0x6E,0x73,0x20,0x74,0x72,0x61,0x6E,
2060+ 0x73,0x70,0x61,0x72,0x65,0x6E,0x63,0x79,0x2E,0x20,0x49,0x66,
2061+ 0x20,0x69,0x74,0x27,0x73,0x20,0x65,0x6E,0x61,0x62,0x6C,0x65,
2062+ 0x64,0x2C,0x20,0x74,0x68,0x65,0x20,0x70,0x61,0x73,0x74,0x69,
2063+ 0x6E,0x67,0x20,0x64,0x6F,0x65,0x73,0x6E,0x27,0x74,0x20,0x6F,
2064+ 0x76,0x65,0x72,0x77,0x72,0x69,0x74,0x65,0x3D,0x64,0x61,0x74,
2065+ 0x61,0x20,0x77,0x69,0x74,0x68,0x20,0x6E,0x69,0x6C,0x2D,0x69,
2066+ 0x6E,0x66,0x6F,0x72,0x6D,0x61,0x74,0x69,0x6F,0x6E,0x2C,0x20,
2067+ 0x6F,0x6E,0x6C,0x79,0x20,0x77,0x69,0x74,0x68,0x20,0x61,0x20,
2068+ 0x6E,0x6F,0x74,0x65,0x20,0x6F,0x72,0x20,0x61,0x20,0x6E,0x75,
2069+ 0x6D,0x62,0x65,0x72,0x20,0x3C,0x3E,0x20,0x30,0x2E,0x01,0x3E,
2070+ 0x40,0x3E,0x54,0x68,0x65,0x20,0x63,0x75,0x74,0x20,0x66,0x75,
2071+ 0x6E,0x63,0x74,0x69,0x6F,0x6E,0x73,0x20,0x77,0x6F,0x72,0x6B,
2072+ 0x73,0x20,0x6C,0x69,0x6B,0x65,0x20,0x70,0x61,0x73,0x74,0x69,
2073+ 0x6E,0x67,0x20,0x77,0x69,0x74,0x68,0x20,0x7A,0x65,0x72,0x6F,
2074+ 0x2D,0x64,0x61,0x74,0x61,0x2E,0x20,0x54,0x68,0x69,0x73,0x20,
2075+ 0x6D,0x65,0x61,0x6E,0x73,0x3B,0x74,0x68,0x61,0x74,0x20,0x74,
2076+ 0x68,0x65,0x20,0x63,0x75,0x74,0x74,0x69,0x6E,0x67,0x20,0x69,
2077+ 0x73,0x20,0x63,0x6F,0x6E,0x74,0x72,0x6F,0x6C,0x6C,0x65,0x64,
2078+ 0x20,0x77,0x69,0x74,0x68,0x20,0x50,0x2D,0x63,0x6F,0x6C,0x75,
2079+ 0x6D,0x6E,0x20,0x28,0x6F,0x72,0x20,0x54,0x2D,0x63,0x6F,0x6C,
2080+ 0x75,0x6D,0x6E,0x29,0x2E,0x3C,0x3E,0x57,0x68,0x65,0x6E,0x20,
2081+ 0x79,0x6F,0x75,0x20,0x63,0x6F,0x70,0x79,0x20,0x64,0x61,0x74,
2082+ 0x61,0x20,0x77,0x69,0x74,0x68,0x20,0x6D,0x61,0x73,0x6B,0x69,
2083+ 0x6E,0x67,0x2C,0x20,0x74,0x68,0x65,0x20,0x64,0x69,0x73,0x61,
2084+ 0x62,0x6C,0x65,0x64,0x20,0x70,0x61,0x72,0x74,0x73,0x20,0x61,
2085+ 0x72,0x65,0x20,0x6E,0x6F,0x74,0x43,0x63,0x6C,0x65,0x61,0x72,
2086+ 0x65,0x64,0x20,0x69,0x6E,0x20,0x74,0x68,0x65,0x20,0x63,0x6F,
2087+ 0x70,0x79,0x62,0x75,0x66,0x66,0x65,0x72,0x2E,0x20,0x28,0x4D,
2088+ 0x61,0x6B,0x69,0x6E,0x67,0x20,0x69,0x74,0x20,0x70,0x6F,0x73,
2089+ 0x73,0x69,0x62,0x6C,0x65,0x20,0x74,0x6F,0x20,0x63,0x6F,0x6C,
2090+ 0x6C,0x65,0x63,0x74,0x20,0x64,0x61,0x74,0x61,0x20,0x66,0x72,
2091+ 0x6F,0x6D,0x27,0x73,0x65,0x76,0x65,0x72,0x61,0x6C,0x20,0x6C,
2092+ 0x6F,0x63,0x61,0x74,0x69,0x6F,0x6E,0x73,0x20,0x69,0x6E,0x74,
2093+ 0x6F,0x20,0x74,0x68,0x65,0x20,0x63,0x6F,0x70,0x79,0x62,0x75,
2094+ 0x66,0x66,0x65,0x72,0x2E,0x29,0x00,0x03,0x45,0x4E,0x44,0x4C,
2095+ 0x3B,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2096+ 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2097+ 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2098+ 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2099+ 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2100+ 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2101+ 0x2A,0x2A,0x2A,0x2A,0x4C,0x3B,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2102+ 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2103+ 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2104+ 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2105+ 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2106+ 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2107+ 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x0E,0x40,0x4C,
2108+ 0x50,0x72,0x6F,0x62,0x6C,0x65,0x6D,0x73,0x2F,0x46,0x41,0x51,
2109+ 0x06,0x3E,0x40,0x58,0x30,0x32,0x30,0x2A,0x3E,0x40,0x43,0x30,
2110+ 0x30,0x31,0x51,0x3A,0x20,0x48,0x6F,0x77,0x20,0x63,0x61,0x6E,
2111+ 0x20,0x49,0x20,0x74,0x6F,0x67,0x67,0x6C,0x65,0x20,0x66,0x75,
2112+ 0x6C,0x6C,0x73,0x63,0x72,0x65,0x65,0x6E,0x20,0x6D,0x6F,0x64,
2113+ 0x65,0x3F,0x37,0x3E,0x40,0x43,0x30,0x30,0x32,0x41,0x3A,0x20,
2114+ 0x50,0x72,0x65,0x73,0x73,0x20,0x41,0x6C,0x74,0x2B,0x45,0x6E,
2115+ 0x74,0x65,0x72,0x20,0x28,0x43,0x74,0x72,0x6C,0x2B,0x43,0x6D,
2116+ 0x64,0x2B,0x46,0x20,0x61,0x6C,0x73,0x6F,0x20,0x77,0x6F,0x72,
2117+ 0x6B,0x73,0x20,0x6F,0x6E,0x20,0x4D,0x61,0x63,0x29,0x06,0x3E,
2118+ 0x40,0x58,0x30,0x32,0x30,0x45,0x3E,0x40,0x43,0x30,0x30,0x31,
2119+ 0x51,0x3A,0x20,0x48,0x6F,0x77,0x20,0x63,0x61,0x6E,0x20,0x49,
2120+ 0x20,0x6D,0x61,0x6B,0x65,0x20,0x66,0x75,0x6C,0x6C,0x73,0x63,
2121+ 0x72,0x65,0x65,0x6E,0x20,0x6D,0x6F,0x64,0x65,0x20,0x73,0x74,
2122+ 0x72,0x65,0x74,0x63,0x68,0x20,0x6F,0x75,0x74,0x20,0x74,0x68,
2123+ 0x65,0x20,0x77,0x68,0x6F,0x6C,0x65,0x20,0x73,0x63,0x72,0x65,
2124+ 0x65,0x6E,0x3F,0x37,0x3E,0x40,0x43,0x30,0x30,0x32,0x41,0x3A,
2125+ 0x20,0x45,0x6E,0x61,0x62,0x6C,0x65,0x20,0x22,0x53,0x74,0x72,
2126+ 0x65,0x74,0x63,0x68,0x65,0x64,0x22,0x20,0x69,0x6E,0x20,0x43,
2127+ 0x6F,0x6E,0x66,0x69,0x67,0x20,0x2D,0x3E,0x20,0x4D,0x69,0x73,
2128+ 0x63,0x65,0x6C,0x6C,0x61,0x6E,0x65,0x6F,0x75,0x73,0x2E,0x4E,
2129+ 0x3E,0x40,0x58,0x30,0x33,0x35,0x54,0x68,0x69,0x73,0x20,0x77,
2130+ 0x69,0x6C,0x6C,0x20,0x72,0x65,0x73,0x75,0x6C,0x74,0x20,0x69,
2131+ 0x6E,0x20,0x75,0x6E,0x65,0x76,0x65,0x6E,0x20,0x70,0x69,0x78,
2132+ 0x65,0x6C,0x20,0x77,0x69,0x64,0x74,0x68,0x73,0x2E,0x20,0x49,
2133+ 0x66,0x20,0x79,0x6F,0x75,0x20,0x77,0x61,0x6E,0x74,0x20,0x74,
2134+ 0x6F,0x20,0x66,0x69,0x78,0x20,0x74,0x68,0x69,0x73,0x2C,0x20,
2135+ 0x65,0x6E,0x61,0x62,0x6C,0x65,0x3D,0x22,0x50,0x69,0x78,0x65,
2136+ 0x6C,0x20,0x66,0x69,0x6C,0x74,0x65,0x72,0x22,0x20,0x28,0x74,
2137+ 0x68,0x6F,0x75,0x67,0x68,0x20,0x74,0x68,0x69,0x73,0x20,0x77,
2138+ 0x69,0x6C,0x6C,0x20,0x6D,0x61,0x6B,0x65,0x20,0x74,0x68,0x65,
2139+ 0x20,0x69,0x6D,0x61,0x67,0x65,0x20,0x6C,0x6F,0x6F,0x6B,0x20,
2140+ 0x62,0x6C,0x75,0x72,0x72,0x79,0x29,0x2E,0x06,0x3E,0x40,0x58,
2141+ 0x30,0x32,0x30,0x27,0x3E,0x40,0x43,0x30,0x30,0x31,0x51,0x3A,
2142+ 0x20,0x49,0x20,0x63,0x61,0x6E,0x27,0x74,0x20,0x75,0x73,0x65,
2143+ 0x20,0x41,0x6C,0x74,0x2B,0x46,0x34,0x20,0x61,0x6E,0x64,0x20,
2144+ 0x41,0x6C,0x74,0x2B,0x46,0x35,0x21,0x4E,0x3E,0x40,0x43,0x30,
2145+ 0x30,0x32,0x41,0x3A,0x20,0x57,0x69,0x6E,0x64,0x6F,0x77,0x73,
2146+ 0x3A,0x20,0x49,0x66,0x20,0x79,0x6F,0x75,0x20,0x68,0x61,0x76,
2147+ 0x65,0x20,0x47,0x65,0x46,0x6F,0x72,0x63,0x65,0x20,0x45,0x78,
2148+ 0x70,0x65,0x72,0x69,0x65,0x6E,0x63,0x65,0x20,0x69,0x6E,0x73,
2149+ 0x74,0x61,0x6C,0x6C,0x65,0x64,0x2C,0x20,0x79,0x6F,0x75,0x20,
2150+ 0x6E,0x65,0x65,0x64,0x20,0x74,0x6F,0x20,0x63,0x68,0x61,0x6E,
2151+ 0x67,0x65,0x2B,0x3E,0x40,0x58,0x30,0x33,0x35,0x74,0x68,0x65,
2152+ 0x20,0x6B,0x65,0x79,0x62,0x69,0x6E,0x64,0x69,0x6E,0x67,0x73,
2153+ 0x20,0x69,0x6E,0x20,0x69,0x74,0x73,0x20,0x73,0x65,0x74,0x74,
2154+ 0x69,0x6E,0x67,0x73,0x20,0x70,0x61,0x67,0x65,0x2E,0x57,0x3E,
2155+ 0x6D,0x61,0x63,0x4F,0x53,0x2F,0x4F,0x53,0x20,0x58,0x3A,0x20,
2156+ 0x43,0x68,0x61,0x6E,0x67,0x65,0x20,0x41,0x6C,0x74,0x2B,0x46,
2157+ 0x34,0x2F,0x41,0x6C,0x74,0x2B,0x46,0x35,0x20,0x6B,0x65,0x79,
2158+ 0x73,0x20,0x69,0x6E,0x20,0x74,0x68,0x65,0x20,0x4F,0x53,0x20,
2159+ 0x74,0x6F,0x20,0x73,0x6F,0x6D,0x65,0x74,0x68,0x69,0x6E,0x67,
2160+ 0x20,0x65,0x6C,0x73,0x65,0x2E,0x20,0x41,0x6C,0x73,0x6F,0x20,
2161+ 0x66,0x6F,0x72,0x20,0x47,0x4E,0x55,0x2F,0x4C,0x69,0x6E,0x75,
2162+ 0x78,0x2E,0x06,0x3E,0x40,0x58,0x30,0x32,0x30,0x2B,0x3E,0x40,
2163+ 0x43,0x30,0x30,0x31,0x51,0x3A,0x20,0x54,0x68,0x65,0x20,0x6D,
2164+ 0x6F,0x75,0x73,0x65,0x20,0x63,0x75,0x72,0x73,0x6F,0x72,0x20,
2165+ 0x69,0x73,0x20,0x64,0x65,0x6C,0x61,0x79,0x65,0x64,0x2F,0x6C,
2166+ 0x61,0x67,0x67,0x79,0x21,0x44,0x3E,0x40,0x43,0x30,0x30,0x32,
2167+ 0x41,0x3A,0x20,0x4D,0x61,0x6B,0x65,0x20,0x73,0x75,0x72,0x65,
2168+ 0x20,0x22,0x53,0x6F,0x66,0x74,0x77,0x61,0x72,0x65,0x20,0x6D,
2169+ 0x6F,0x75,0x73,0x65,0x22,0x20,0x69,0x73,0x20,0x64,0x69,0x73,
2170+ 0x61,0x62,0x6C,0x65,0x64,0x20,0x69,0x6E,0x20,0x43,0x6F,0x6E,
2171+ 0x66,0x69,0x67,0x20,0x2D,0x3E,0x20,0x4C,0x61,0x79,0x6F,0x75,
2172+ 0x74,0x2E,0x4B,0x3E,0x40,0x58,0x30,0x33,0x35,0x41,0x6C,0x74,
2173+ 0x65,0x72,0x6E,0x61,0x74,0x69,0x76,0x65,0x6C,0x79,0x2C,0x20,
2174+ 0x79,0x6F,0x75,0x20,0x63,0x61,0x6E,0x20,0x65,0x6E,0x61,0x62,
2175+ 0x6C,0x65,0x20,0x22,0x56,0x53,0x79,0x6E,0x63,0x20,0x6F,0x66,
2176+ 0x66,0x22,0x20,0x69,0x6E,0x20,0x43,0x6F,0x6E,0x66,0x69,0x67,
2177+ 0x20,0x2D,0x3E,0x20,0x4D,0x69,0x73,0x63,0x65,0x6C,0x6C,0x61,
2178+ 0x6E,0x65,0x6F,0x75,0x73,0x2E,0x46,0x3E,0x54,0x68,0x69,0x73,
2179+ 0x20,0x68,0x6F,0x77,0x65,0x76,0x65,0x72,0x2C,0x20,0x77,0x69,
2180+ 0x6C,0x6C,0x20,0x69,0x6E,0x74,0x72,0x6F,0x64,0x75,0x63,0x65,
2181+ 0x20,0x73,0x74,0x75,0x74,0x74,0x65,0x72,0x69,0x6E,0x67,0x20,
2182+ 0x62,0x65,0x63,0x61,0x75,0x73,0x65,0x20,0x74,0x68,0x65,0x20,
2183+ 0x72,0x65,0x6E,0x64,0x65,0x72,0x69,0x6E,0x67,0x20,0x72,0x61,
2184+ 0x74,0x65,0x20,0x69,0x73,0x22,0x3E,0x6E,0x6F,0x74,0x20,0x65,
2185+ 0x78,0x61,0x63,0x74,0x20,0x74,0x6F,0x20,0x79,0x6F,0x75,0x72,
2186+ 0x20,0x6D,0x6F,0x6E,0x69,0x74,0x6F,0x72,0x27,0x73,0x20,0x72,
2187+ 0x61,0x74,0x65,0x2E,0x06,0x3E,0x40,0x58,0x30,0x32,0x30,0x33,
2188+ 0x3E,0x40,0x43,0x30,0x30,0x31,0x51,0x3A,0x20,0x57,0x69,0x6C,
2189+ 0x6C,0x20,0x79,0x6F,0x75,0x20,0x69,0x6D,0x70,0x6C,0x65,0x6D,
2190+ 0x65,0x6E,0x74,0x20,0x4D,0x49,0x44,0x49,0x20,0x6F,0x75,0x74,
2191+ 0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x61,0x6C,0x69,
2192+ 0x74,0x79,0x3F,0x4D,0x3E,0x40,0x43,0x30,0x30,0x32,0x41,0x3A,
2193+ 0x20,0x4E,0x6F,0x2C,0x20,0x73,0x6F,0x72,0x72,0x79,0x2E,0x20,
2194+ 0x54,0x68,0x69,0x73,0x20,0x69,0x73,0x20,0x76,0x65,0x72,0x79,
2195+ 0x20,0x64,0x69,0x66,0x66,0x69,0x63,0x75,0x6C,0x74,0x20,0x74,
2196+ 0x6F,0x20,0x69,0x6D,0x70,0x6C,0x65,0x6D,0x65,0x6E,0x74,0x20,
2197+ 0x63,0x6F,0x72,0x72,0x65,0x63,0x74,0x6C,0x79,0x20,0x77,0x68,
2198+ 0x65,0x6E,0x20,0x68,0x61,0x76,0x69,0x6E,0x67,0x3C,0x3E,0x40,
2199+ 0x58,0x30,0x33,0x35,0x68,0x69,0x67,0x68,0x65,0x72,0x20,0x61,
2200+ 0x75,0x64,0x69,0x6F,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x20,
2201+ 0x73,0x69,0x7A,0x65,0x73,0x20,0x28,0x62,0x75,0x66,0x66,0x65,
2202+ 0x72,0x65,0x64,0x20,0x72,0x65,0x70,0x6C,0x61,0x79,0x65,0x72,
2203+ 0x20,0x74,0x69,0x63,0x6B,0x73,0x29,0x2E,0x2E,0x2E,0x06,0x3E,
2204+ 0x40,0x58,0x30,0x32,0x30,0x30,0x3E,0x40,0x43,0x30,0x30,0x31,
2205+ 0x51,0x3A,0x20,0x57,0x68,0x65,0x72,0x65,0x20,0x69,0x73,0x20,
2206+ 0x74,0x68,0x65,0x20,0x63,0x6F,0x6E,0x66,0x69,0x67,0x75,0x72,
2207+ 0x61,0x74,0x69,0x6F,0x6E,0x20,0x66,0x69,0x6C,0x65,0x20,0x73,
2208+ 0x74,0x6F,0x72,0x65,0x64,0x3F,0x3F,0x3E,0x40,0x43,0x30,0x30,
2209+ 0x32,0x41,0x3A,0x20,0x57,0x69,0x6E,0x64,0x6F,0x77,0x73,0x3A,
2210+ 0x20,0x5C,0x55,0x73,0x65,0x72,0x73,0x5C,0x55,0x53,0x45,0x52,
2211+ 0x5C,0x41,0x70,0x70,0x44,0x61,0x74,0x61,0x5C,0x52,0x6F,0x61,
2212+ 0x6D,0x69,0x6E,0x67,0x5C,0x46,0x54,0x32,0x20,0x63,0x6C,0x6F,
2213+ 0x6E,0x65,0x5C,0x46,0x54,0x32,0x2E,0x43,0x46,0x47,0x45,0x3E,
2214+ 0x40,0x58,0x30,0x33,0x35,0x4F,0x53,0x20,0x58,0x3A,0x20,0x2F,
2215+ 0x55,0x73,0x65,0x72,0x73,0x2F,0x55,0x53,0x45,0x52,0x2F,0x4C,
2216+ 0x69,0x62,0x72,0x61,0x72,0x79,0x2F,0x41,0x70,0x70,0x6C,0x69,
2217+ 0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x53,0x75,0x70,0x70,0x6F,
2218+ 0x72,0x74,0x2F,0x46,0x54,0x32,0x20,0x63,0x6C,0x6F,0x6E,0x65,
2219+ 0x2F,0x46,0x54,0x32,0x2E,0x43,0x46,0x47,0x2F,0x47,0x4E,0x55,
2220+ 0x2F,0x4C,0x69,0x6E,0x75,0x78,0x3A,0x20,0x2F,0x68,0x6F,0x6D,
2221+ 0x65,0x2F,0x55,0x53,0x45,0x52,0x2F,0x2E,0x63,0x6F,0x6E,0x66,
2222+ 0x69,0x67,0x2F,0x46,0x54,0x32,0x20,0x63,0x6C,0x6F,0x6E,0x65,
2223+ 0x2F,0x46,0x54,0x32,0x2E,0x43,0x46,0x47,0x01,0x3E,0x48,0x49,
2224+ 0x74,0x20,0x77,0x69,0x6C,0x6C,0x20,0x62,0x65,0x20,0x73,0x74,
2225+ 0x6F,0x72,0x65,0x64,0x20,0x69,0x6E,0x20,0x74,0x68,0x65,0x20,
2226+ 0x70,0x72,0x6F,0x67,0x72,0x61,0x6D,0x20,0x64,0x69,0x72,0x65,
2227+ 0x63,0x74,0x6F,0x72,0x79,0x20,0x69,0x66,0x20,0x74,0x68,0x65,
2228+ 0x20,0x70,0x61,0x74,0x68,0x20,0x63,0x6F,0x75,0x6C,0x64,0x6E,
2229+ 0x27,0x74,0x20,0x62,0x65,0x20,0x75,0x73,0x65,0x64,0x2E,0x4D,
2230+ 0x49,0x66,0x20,0x79,0x6F,0x75,0x20,0x70,0x75,0x74,0x20,0x74,
2231+ 0x68,0x65,0x20,0x63,0x6F,0x6E,0x66,0x69,0x67,0x75,0x72,0x61,
2232+ 0x74,0x69,0x6F,0x6E,0x20,0x66,0x69,0x6C,0x65,0x20,0x69,0x6E,
2233+ 0x20,0x74,0x68,0x65,0x20,0x70,0x72,0x6F,0x67,0x72,0x61,0x6D,
2234+ 0x20,0x64,0x69,0x72,0x65,0x63,0x74,0x6F,0x72,0x79,0x2C,0x20,
2235+ 0x69,0x74,0x20,0x77,0x69,0x6C,0x6C,0x20,0x72,0x65,0x61,0x64,
2236+ 0x20,0x74,0x68,0x61,0x74,0x4A,0x6F,0x6E,0x65,0x20,0x61,0x6E,
2237+ 0x64,0x20,0x6E,0x6F,0x74,0x20,0x61,0x74,0x74,0x65,0x6D,0x70,
2238+ 0x74,0x20,0x74,0x6F,0x20,0x63,0x72,0x65,0x61,0x74,0x65,0x20,
2239+ 0x63,0x6F,0x6E,0x66,0x69,0x67,0x20,0x64,0x69,0x72,0x73,0x20,
2240+ 0x66,0x6F,0x72,0x20,0x74,0x68,0x65,0x20,0x4F,0x53,0x20,0x75,
2241+ 0x73,0x65,0x72,0x2E,0x20,0x28,0x70,0x6F,0x72,0x74,0x61,0x62,
2242+ 0x6C,0x65,0x20,0x6D,0x6F,0x64,0x65,0x29,0x06,0x3E,0x40,0x58,
2243+ 0x30,0x32,0x30,0x42,0x3E,0x40,0x43,0x30,0x30,0x31,0x51,0x3A,
2244+ 0x20,0x43,0x61,0x6E,0x20,0x74,0x68,0x65,0x20,0x63,0x6C,0x6F,
2245+ 0x6E,0x65,0x20,0x72,0x65,0x61,0x64,0x20,0x46,0x54,0x32,0x2E,
2246+ 0x43,0x46,0x47,0x20,0x66,0x72,0x6F,0x6D,0x20,0x72,0x65,0x61,
2247+ 0x6C,0x20,0x46,0x54,0x32,0x2C,0x20,0x61,0x6E,0x64,0x20,0x76,
2248+ 0x69,0x63,0x65,0x20,0x76,0x65,0x72,0x73,0x61,0x3F,0x4C,0x3E,
2249+ 0x40,0x43,0x30,0x30,0x32,0x41,0x3A,0x20,0x59,0x65,0x73,0x2C,
2250+ 0x20,0x69,0x74,0x20,0x73,0x68,0x6F,0x75,0x6C,0x64,0x20,0x77,
2251+ 0x6F,0x72,0x6B,0x20,0x6A,0x75,0x73,0x74,0x20,0x66,0x69,0x6E,
2252+ 0x65,0x2E,0x20,0x50,0x75,0x74,0x20,0x69,0x74,0x20,0x69,0x6E,
2253+ 0x20,0x74,0x68,0x65,0x20,0x64,0x69,0x72,0x65,0x63,0x74,0x6F,
2254+ 0x72,0x79,0x20,0x73,0x68,0x6F,0x77,0x6E,0x20,0x61,0x62,0x6F,
2255+ 0x76,0x65,0x2E,0x06,0x3E,0x40,0x58,0x30,0x32,0x30,0x51,0x3E,
2256+ 0x40,0x43,0x30,0x30,0x31,0x51,0x3A,0x20,0x53,0x6D,0x70,0x2E,
2257+ 0x20,0x45,0x64,0x2E,0x3A,0x20,0x57,0x68,0x69,0x6C,0x65,0x20,
2258+ 0x7A,0x6F,0x6F,0x6D,0x65,0x64,0x20,0x69,0x6E,0x2C,0x20,0x49,
2259+ 0x20,0x73,0x6F,0x6D,0x65,0x74,0x69,0x6D,0x65,0x73,0x20,0x63,
2260+ 0x61,0x6E,0x27,0x74,0x20,0x6D,0x61,0x72,0x6B,0x20,0x74,0x68,
2261+ 0x65,0x20,0x6C,0x61,0x73,0x74,0x20,0x73,0x61,0x6D,0x70,0x6C,
2262+ 0x65,0x20,0x70,0x6F,0x69,0x6E,0x74,0x21,0x47,0x3E,0x40,0x43,
2263+ 0x30,0x30,0x32,0x41,0x3A,0x20,0x54,0x68,0x69,0x73,0x20,0x69,
2264+ 0x73,0x20,0x6E,0x6F,0x72,0x6D,0x61,0x6C,0x2E,0x20,0x54,0x68,
2265+ 0x69,0x73,0x20,0x69,0x73,0x20,0x61,0x20,0x6C,0x69,0x6D,0x69,
2266+ 0x74,0x61,0x74,0x69,0x6F,0x6E,0x20,0x69,0x6E,0x20,0x74,0x68,
2267+ 0x65,0x20,0x6E,0x61,0x74,0x75,0x72,0x65,0x20,0x6F,0x66,0x20,
2268+ 0x73,0x63,0x61,0x6C,0x69,0x6E,0x67,0x2E,0x06,0x3E,0x40,0x58,
2269+ 0x30,0x32,0x30,0x17,0x3E,0x40,0x43,0x30,0x30,0x31,0x51,0x3A,
2270+ 0x20,0x49,0x20,0x66,0x6F,0x75,0x6E,0x64,0x20,0x61,0x20,0x62,
2271+ 0x75,0x67,0x21,0x4C,0x3E,0x40,0x43,0x30,0x30,0x32,0x41,0x3A,
2272+ 0x20,0x50,0x6C,0x65,0x61,0x73,0x65,0x20,0x73,0x65,0x6E,0x64,
2273+ 0x20,0x6D,0x65,0x20,0x61,0x20,0x6D,0x61,0x69,0x6C,0x20,0x28,
2274+ 0x66,0x6F,0x75,0x6E,0x64,0x20,0x61,0x74,0x20,0x31,0x36,0x2D,
2275+ 0x62,0x69,0x74,0x73,0x2E,0x6F,0x72,0x67,0x29,0x20,0x61,0x6E,
2276+ 0x64,0x20,0x74,0x72,0x79,0x20,0x74,0x6F,0x20,0x65,0x78,0x70,
2277+ 0x6C,0x61,0x69,0x6E,0x20,0x69,0x74,0x2E,0x00,0x03,0x45,0x4E,
2278+ 0x44,0x4C,0x3B,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2279+ 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2280+ 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2281+ 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2282+ 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2283+ 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2284+ 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x4C,0x3B,0x2A,0x2A,0x2A,0x2A,
2285+ 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2286+ 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2287+ 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2288+ 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2289+ 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,
2290+ 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x0C,
2291+ 0x40,0x4C,0x4B,0x6E,0x6F,0x77,0x6E,0x20,0x62,0x75,0x67,0x73,
2292+ 0x01,0x3E,0x31,0x3E,0x40,0x58,0x30,0x31,0x30,0x40,0x43,0x30,
2293+ 0x30,0x31,0x57,0x41,0x56,0x20,0x65,0x78,0x70,0x6F,0x72,0x74,
2294+ 0x69,0x6E,0x67,0x20,0x28,0x72,0x65,0x6E,0x64,0x65,0x72,0x69,
2295+ 0x6E,0x67,0x20,0x73,0x6F,0x6E,0x67,0x20,0x74,0x6F,0x20,0x57,
2296+ 0x41,0x56,0x29,0x3A,0x01,0x3E,0x55,0x3E,0x40,0x58,0x30,0x31,
2297+ 0x30,0x40,0x43,0x30,0x30,0x32,0x2D,0x20,0x53,0x6F,0x6E,0x67,
2298+ 0x73,0x20,0x74,0x68,0x61,0x74,0x20,0x6A,0x75,0x6D,0x70,0x20,
2299+ 0x62,0x61,0x63,0x6B,0x20,0x74,0x6F,0x20,0x61,0x20,0x70,0x72,
2300+ 0x65,0x76,0x69,0x6F,0x75,0x73,0x20,0x70,0x61,0x74,0x74,0x65,
2301+ 0x72,0x6E,0x20,0x77,0x69,0x6C,0x6C,0x20,0x72,0x65,0x6E,0x64,
2302+ 0x65,0x72,0x20,0x66,0x6F,0x72,0x65,0x76,0x65,0x72,0x20,0x61,
2303+ 0x6E,0x64,0x20,0x65,0x76,0x65,0x72,0x2C,0x4D,0x3E,0x40,0x58,
2304+ 0x30,0x32,0x31,0x61,0x6E,0x64,0x20,0x79,0x6F,0x75,0x20,0x6E,
2305+ 0x65,0x65,0x64,0x20,0x74,0x6F,0x20,0x70,0x72,0x65,0x73,0x73,
2306+ 0x20,0x61,0x20,0x6B,0x65,0x79,0x20,0x6F,0x72,0x20,0x63,0x6C,
2307+ 0x69,0x63,0x6B,0x20,0x74,0x68,0x65,0x20,0x6D,0x6F,0x75,0x73,
2308+ 0x65,0x20,0x74,0x6F,0x20,0x61,0x62,0x6F,0x72,0x74,0x20,0x74,
2309+ 0x68,0x65,0x20,0x72,0x65,0x6E,0x64,0x65,0x72,0x20,0x77,0x68,
2310+ 0x65,0x6E,0x15,0x3E,0x40,0x58,0x30,0x32,0x31,0x79,0x6F,0x75,
2311+ 0x20,0x77,0x61,0x6E,0x74,0x20,0x69,0x74,0x20,0x74,0x6F,0x2E,
2312+ 0x01,0x3E,0x11,0x3E,0x40,0x58,0x30,0x31,0x30,0x40,0x43,0x30,
2313+ 0x30,0x31,0x56,0x69,0x64,0x65,0x6F,0x3A,0x06,0x3E,0x40,0x43,
2314+ 0x30,0x30,0x32,0x50,0x3E,0x40,0x58,0x30,0x31,0x30,0x2D,0x20,
2315+ 0x46,0x75,0x6C,0x6C,0x73,0x63,0x72,0x65,0x65,0x6E,0x20,0x6D,
2316+ 0x6F,0x64,0x65,0x20,0x63,0x61,0x6E,0x20,0x62,0x65,0x20,0x75,
2317+ 0x6E,0x62,0x65,0x61,0x72,0x61,0x62,0x6C,0x79,0x20,0x73,0x6C,
2318+ 0x6F,0x77,0x20,0x6F,0x6E,0x20,0x61,0x20,0x52,0x61,0x73,0x70,
2319+ 0x62,0x65,0x72,0x72,0x79,0x20,0x50,0x69,0x20,0x28,0x65,0x76,
2320+ 0x65,0x6E,0x20,0x6F,0x6E,0x20,0x52,0x50,0x69,0x20,0x34,0x29,
2321+ 0x4A,0x3E,0x40,0x58,0x30,0x31,0x30,0x2D,0x20,0x46,0x75,0x6C,
2322+ 0x6C,0x73,0x63,0x72,0x65,0x65,0x6E,0x20,0x6D,0x6F,0x64,0x65,
2323+ 0x20,0x63,0x61,0x6E,0x20,0x68,0x61,0x76,0x65,0x20,0x73,0x65,
2324+ 0x76,0x65,0x72,0x61,0x6C,0x20,0x70,0x72,0x6F,0x62,0x6C,0x65,
2325+ 0x6D,0x73,0x20,0x6F,0x6E,0x20,0x6D,0x75,0x6C,0x74,0x69,0x2D,
2326+ 0x6D,0x6F,0x6E,0x69,0x74,0x6F,0x72,0x20,0x73,0x79,0x73,0x74,
2327+ 0x65,0x6D,0x73,0x47,0x3E,0x40,0x58,0x30,0x31,0x30,0x2D,0x20,
2328+ 0x46,0x75,0x6C,0x6C,0x73,0x63,0x72,0x65,0x65,0x6E,0x20,0x6D,
2329+ 0x6F,0x64,0x65,0x20,0x63,0x61,0x6E,0x20,0x68,0x61,0x76,0x65,
2330+ 0x20,0x73,0x65,0x76,0x65,0x72,0x61,0x6C,0x20,0x70,0x72,0x6F,
2331+ 0x62,0x6C,0x65,0x6D,0x73,0x20,0x6F,0x6E,0x20,0x73,0x6F,0x6D,
2332+ 0x65,0x20,0x4C,0x69,0x6E,0x75,0x78,0x20,0x73,0x79,0x73,0x74,
2333+ 0x65,0x6D,0x73,0x00,0x03,0x45,0x4E,0x44
23242334 };
23252335
23262336 #endif
src/mixer/ft2_mix_macros.h+69−0
@@ -168,6 +168,9 @@ · 167 unmodified lines
168168 **
169169 */
170170
171+#if SINC_TAPS==8
172+
173+#if SINC_FSHIFT>=0
171174 #define WINDOWED_SINC_INTERPOLATION(s, f, scale) \
172175 { \
173176 const float *t = v->fSincLUT + (((uint32_t)(f) >> SINC_FSHIFT) & SINC_FMASK); \
@@ -180,6 +183,72 @@ · 6 unmodified lines
180183 ( s[3] * t[6]) + \
181184 ( s[4] * t[7])) * (1.0f / scale); \
182185 }
186+#else
187+#define WINDOWED_SINC_INTERPOLATION(s, f, scale) \
188+{ \
189+ const float *t = v->fSincLUT + (((uint32_t)(f) << -SINC_FSHIFT) & SINC_FMASK); \
190+ fSample = ((s[-3] * t[0]) + \
191+ (s[-2] * t[1]) + \
192+ (s[-1] * t[2]) + \
193+ ( s[0] * t[3]) + \
194+ ( s[1] * t[4]) + \
195+ ( s[2] * t[5]) + \
196+ ( s[3] * t[6]) + \
197+ ( s[4] * t[7])) * (1.0f / scale); \
198+}
199+#endif
200+
201+#elif SINC_TAPS==16
202+
203+#if SINC_FSHIFT>=0
204+#define WINDOWED_SINC_INTERPOLATION(s, f, scale) \
205+{ \
206+ const float *t = v->fSincLUT + (((uint32_t)(f) >> SINC_FSHIFT) & SINC_FMASK); \
207+ fSample = ((s[-7] * t[0]) + \
208+ (s[-6] * t[1]) + \
209+ (s[-5] * t[2]) + \
210+ (s[-4] * t[3]) + \
211+ (s[-3] * t[4]) + \
212+ (s[-2] * t[5]) + \
213+ (s[-1] * t[6]) + \
214+ ( s[0] * t[7]) + \
215+ ( s[1] * t[8]) + \
216+ ( s[2] * t[9]) + \
217+ ( s[3] * t[10]) + \
218+ ( s[4] * t[11]) + \
219+ ( s[5] * t[12]) + \
220+ ( s[6] * t[13]) + \
221+ ( s[7] * t[14]) + \
222+ ( s[8] * t[15])) * (1.0f / scale); \
223+}
224+#else
225+#define WINDOWED_SINC_INTERPOLATION(s, f, scale) \
226+{ \
227+ const float *t = v->fSincLUT + (((uint32_t)(f) << -SINC_FSHIFT) & SINC_FMASK); \
228+ fSample = ((s[-7] * t[0]) + \
229+ (s[-6] * t[1]) + \
230+ (s[-5] * t[2]) + \
231+ (s[-4] * t[3]) + \
232+ (s[-3] * t[4]) + \
233+ (s[-2] * t[5]) + \
234+ (s[-1] * t[6]) + \
235+ ( s[0] * t[7]) + \
236+ ( s[1] * t[8]) + \
237+ ( s[2] * t[9]) + \
238+ ( s[3] * t[10]) + \
239+ ( s[4] * t[11]) + \
240+ ( s[5] * t[12]) + \
241+ ( s[6] * t[13]) + \
242+ ( s[7] * t[14]) + \
243+ ( s[8] * t[15])) * (1.0f / scale); \
244+}
245+#endif
246+
247+#else
248+
249+#error mixer/ft2_mix_macros.h: The SINC_TAPS definition is invalid! Valid values: 8 or 16
250+
251+#endif
183252
184253 #define RENDER_8BIT_SMP_SINTRP \
185254 WINDOWED_SINC_INTERPOLATION(smpPtr, positionFrac, 128) \
src/mixer/ft2_windowed_sinc.c+4−7
@@ -1,5 +1,5 @@
1−/* Code taken from the OpenMPT project, which has a BSD
2−** license which is compatible with this project.
1+/* Code taken from the OpenMPT project, which has a BSD license which is
2+** compatible with this project.
33 **
44 ** The code has been slightly modified.
55 */
@@ -10,10 +10,7 @@ · 4 unmodified lines
1010 #include <math.h>
1111 #include "ft2_windowed_sinc.h"
1212
13−// globalized
14−float *fKaiserSinc = NULL;
15−float *fDownSample1 = NULL;
16−float *fDownSample2 = NULL;
13+float *fKaiserSinc = NULL, *fDownSample1 = NULL, *fDownSample2 = NULL; // globalized
1714
1815 static double Izero(double y) // Compute Bessel function Izero(y) using a series approximation
1916 {
@@ -71,7 +68,7 @@ bool calcWindowedSincTables(void) · 51 unmodified lines
7168
7269 getSinc(fKaiserSinc, 9.6377, 0.97);
7370 getSinc(fDownSample1, 8.5, 0.5);
74− getSinc(fDownSample2, 2.7625, 0.425);
71+ getSinc(fDownSample2, 7.3, 0.425);
7572
7673 return true;
7774 }
src/mixer/ft2_windowed_sinc.h+9−8
@@ -4,14 +4,17 @@ · 3 unmodified lines
44 #include <stdbool.h>
55 #include "ft2_mix.h"
66
7−// if you change this, also change SINC_PHASES_BITS (>8192 gives very little improvement)
7+// 8 or 16. 8 allows more unwanted frequencies, which may be preferred for lo-fi samples
8+#define SINC_TAPS 8
9+
10+// log2(SINC_TAPS)
11+#define SINC_TAPS_BITS 3
12+
813 #define SINC_PHASES 8192
9−#define SINC_PHASES_BITS 13 /* log2(SINC_PHASES) */
1014
11−// don't change these!
15+// log2(SINC_PHASES)
16+#define SINC_PHASES_BITS 13
1217
13−#define SINC_TAPS 8
14−#define SINC_TAPS_BITS 3
1518 #define SINC_LUT_LEN (SINC_TAPS * SINC_PHASES)
1619 #define SINC_FSHIFT (MIXER_FRAC_BITS-(SINC_PHASES_BITS+SINC_TAPS_BITS))
1720 #define SINC_FMASK ((SINC_TAPS*SINC_PHASES)-SINC_TAPS)
@@ -23,9 +26,7 @@ · 5 unmodified lines
2326 // for LUT calculation
2427 #define SINC_MID_TAP ((SINC_TAPS/2)*SINC_PHASES)
2528
26−extern float *fKaiserSinc;
27−extern float *fDownSample1;
28−extern float *fDownSample2;
29+extern float *fKaiserSinc, *fDownSample1, *fDownSample2;
2930
3031 bool calcWindowedSincTables(void);
3132 void freeWindowedSincTables(void);
src/modloaders/ft2_load_digi.c+1−1
@@ -83,7 +83,7 @@ bool loadDIGI(FILE *f, uint32_t filesize) · 82 unmodified lines
8383 }
8484
8585 memcpy(songTmp.orders, hdr.orders, 128);
86−
86+ memcpy(songTmp.name, hdr.name, 20);
8787 songTmp.numChannels = hdr.numChannels;
8888 songTmp.songLength = hdr.numOrders;
8989 songTmp.BPM = 125;
src/modloaders/ft2_load_mod.c+0−3
@@ -314,9 +314,6 @@ bool loadMOD(FILE *f, uint32_t filesize) · 313 unmodified lines
314314 s->loopStart = 2 * SWAP16(hdr.smp[a].loopStart);
315315 s->loopLength = 2 * SWAP16(hdr.smp[a].loopLength);
316316
317− if (s->loopLength < 2)
318− s->loopLength = 2;
319−
320317 // fix for poorly converted STK (< v2.5) -> PT/NT modules
321318 if (s->loopLength > 2 && s->loopStart+s->loopLength > s->length)
322319 {
src/scopes/ft2_scopes.c+5−42
@@ -20,12 +20,12 @@ · 19 unmodified lines
2020 #include "../ft2_video.h"
2121 #include "../ft2_tables.h"
2222 #include "../ft2_structs.h"
23+#include "../ft2_hpc.h"
2324 #include "ft2_scopes.h"
2425 #include "ft2_scopedraw.h"
2526
2627 static volatile bool scopesUpdatingFlag, scopesDisplayingFlag;
27−static uint32_t scopeTimeLen, scopeTimeLenFrac;
28−static uint64_t timeNext64, timeNext64Frac;
28+static hpc_t scopeHpc;
2929 static volatile scope_t scope[MAX_CHANNELS];
3030 static SDL_Thread *scopeThread;
3131
@@ -520,9 +520,8 @@ static int32_t SDLCALL scopeThreadFunc(void *ptr) · 488 unmodified lines
520520 // this is needed for scope stability (confirmed)
521521 SDL_SetThreadPriority(SDL_THREAD_PRIORITY_HIGH);
522522
523− // set next frame time
524− timeNext64 = SDL_GetPerformanceCounter() + scopeTimeLen;
525− timeNext64Frac = scopeTimeLenFrac;
523+ hpc_SetDurationInHz(&scopeHpc, SCOPE_HZ);
524+ hpc_ResetCounters(&scopeHpc);
526525
527526 while (editor.programRunning)
528527 {
@@ -530,31 +529,7 @@ static int32_t SDLCALL scopeThreadFunc(void *ptr) · 1 unmodified line
530529 updateScopes();
531530 editor.scopeThreadBusy = false;
532531
533− uint64_t time64 = SDL_GetPerformanceCounter();
534− if (time64 < timeNext64)
535− {
536− time64 = timeNext64 - time64;
537− if (time64 > INT32_MAX)
538− time64 = INT32_MAX;
539−
540− const int32_t diff32 = (int32_t)time64;
541−
542− // convert and round to microseconds
543− const int32_t time32 = (int32_t)((diff32 * editor.dPerfFreqMulMicro) + 0.5);
544−
545− // delay until we have reached the next frame
546− if (time32 > 0)
547− usleep(time32);
548− }
549−
550− // update next tick time
551− timeNext64 += scopeTimeLen;
552− timeNext64Frac += scopeTimeLenFrac;
553− if (timeNext64Frac > UINT32_MAX)
554− {
555− timeNext64Frac &= UINT32_MAX;
556− timeNext64++;
557− }
532+ hpc_Wait(&scopeHpc);
558533 }
559534
560535 (void)ptr;
@@ -563,18 +538,6 @@ static int32_t SDLCALL scopeThreadFunc(void *ptr) · 2 unmodified lines
563538
564539 bool initScopes(void)
565540 {
566− double dInt;
567−
568− // calculate scope time for performance counters and split into int/frac
569− double dFrac = modf(editor.dPerfFreq / SCOPE_HZ, &dInt);
570−
571− // integer part
572− scopeTimeLen = (int32_t)dInt;
573−
574− // fractional part (scaled to 0..2^32-1)
575− dFrac *= UINT32_MAX+1.0;
576− scopeTimeLenFrac = (uint32_t)dFrac;
577−
578541 scopeThread = SDL_CreateThread(scopeThreadFunc, NULL, NULL);
579542 if (scopeThread == NULL)
580543 {

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t