From a6f8674a0a871f1deecd9e01701b7732905ce85f Mon Sep 17 00:00:00 2001 From: zefie Date: Sat, 17 Jul 2021 19:32:35 -0400 Subject: [PATCH] v0.8.0 - FlashROM Support for LC2 and newer. - FlashROM system can handle local files, or proxy from server (default). No need to have a local FlashROM collection! - Added 'verbosity' configuration option - Update HTML Mode to async fileRead - Config option for sending tellyscripts or not - Config option to mask SSIDs in console log - Update wtv-home:/home and wtv-home:/zefie - Update .gitignore - Add wtv-music:/demo/index courtesy of MattMan69 - Update HTML Mode to async fileRead - Update Raw TXT Mode to async fileRead - Replaced .async.js feature with defining `request_is_async` in standard .js script - Cleaned up code a bit - Moved global var 'query' to 'request_headers.query' - Tidied ServiceDeps - Upgraded wtv-log:/log to async, now also logs query arguments, saves to .txt for easier reading. --- README.md | 6 +- ServiceVault.md | 7 +- zefie_wtvp_minisrv/.gitignore | 1 + .../LC2/LC2_HDD_artemis_18004653537.tok} | Bin .../LC2/LC2_HDD_artemis_18006138199.tok} | Bin .../LC2/LC2_OISP_5555732_56k.tok | Bin .../LC2/LC2_WTV_18006138199_56k.tok | Bin .../ServiceVault/wtv-1800/finish-prereg.js | 54 +-- .../ServiceVault/wtv-1800/preregister.js | 4 +- .../wtv-flashrom/ROMCache/HackTVLogoJewel.gif | Bin 0 -> 5845 bytes .../ServiceVault/wtv-flashrom/get-by-path.js | 74 ++++ .../ServiceVault/wtv-flashrom/get-lc2-page.js | 158 ++++++-- .../wtv-flashrom/initiate-lc2-download.js | 11 + .../wtv-flashrom/lc2-download-complete.js | 2 +- .../wtv-flashrom/lc2-download-failed.html | 50 --- .../wtv-flashrom/lc2-download-failed.js | 140 +++++++ .../ServiceVault/wtv-flashrom/willie.async.js | 35 -- .../ServiceVault/wtv-flashrom/willie.js | 50 +++ .../wtv-head-waiter/finalize-security.js | 8 +- .../wtv-head-waiter/login-stage-two.js | 29 +- .../ServiceVault/wtv-head-waiter/login.js | 10 +- .../ServiceVault/wtv-head-waiter/ssl-cert.der | Bin 594 -> 0 bytes .../ServiceVault/wtv-home/home.js | 28 +- .../ServiceVault/wtv-home/splash.txt | 1 + .../ServiceVault/wtv-home/zefie.html | 14 +- .../ServiceVault/wtv-log/log.js | 55 ++- .../ServiceVault/wtv-music/demo/hacktv4.gif | Bin 0 -> 2050 bytes .../ServiceVault/wtv-music/demo/index.html | 156 ++++++++ .../wtv-music/demo/midi/Bogged.mid | Bin 0 -> 21741 bytes .../wtv-music/demo/midi/Bogged2.mid | Bin 0 -> 21582 bytes .../wtv-music/demo/midi/BoggedDown.mid | Bin 0 -> 21743 bytes .../wtv-music/demo/midi/Brasilia.mid | Bin 0 -> 20704 bytes .../ServiceVault/wtv-music/demo/midi/Busy.mid | Bin 0 -> 25190 bytes .../wtv-music/demo/midi/CantWait.mid | Bin 0 -> 17425 bytes .../wtv-music/demo/midi/Catamran.mid | Bin 0 -> 29177 bytes .../wtv-music/demo/midi/ComeInn.mid | Bin 0 -> 21213 bytes .../wtv-music/demo/midi/ComeOnInn.mid | Bin 0 -> 21247 bytes .../wtv-music/demo/midi/CoolShad.mid | Bin 0 -> 14877 bytes .../wtv-music/demo/midi/Dancing.mid | Bin 0 -> 15947 bytes .../wtv-music/demo/midi/DarkGame.mid | Bin 0 -> 18081 bytes .../wtv-music/demo/midi/DeerXing.mid | Bin 0 -> 25146 bytes .../wtv-music/demo/midi/DialingWebtv.mid | Bin 0 -> 26531 bytes .../wtv-music/demo/midi/Downtown.mid | Bin 0 -> 22568 bytes .../wtv-music/demo/midi/Fever.mid | Bin 0 -> 25786 bytes .../wtv-music/demo/midi/Flutey.mid | Bin 0 -> 17065 bytes .../wtv-music/demo/midi/Flutter.mid | Bin 0 -> 20148 bytes .../wtv-music/demo/midi/Georgy.mid | Bin 0 -> 18188 bytes .../wtv-music/demo/midi/GetBy.mid | Bin 0 -> 20979 bytes .../wtv-music/demo/midi/Glasses.mid | Bin 0 -> 13742 bytes .../wtv-music/demo/midi/Harry.mid | Bin 0 -> 18761 bytes .../wtv-music/demo/midi/HarryRock.mid | Bin 0 -> 18763 bytes .../wtv-music/demo/midi/Herbie.mid | Bin 0 -> 18839 bytes .../wtv-music/demo/midi/HomeAgn.mid | Bin 0 -> 7199 bytes .../wtv-music/demo/midi/Huffin.mid | Bin 0 -> 23236 bytes .../wtv-music/demo/midi/HuffinPuffin.mid | Bin 0 -> 23270 bytes .../wtv-music/demo/midi/IAmBusy.mid | Bin 0 -> 25192 bytes .../wtv-music/demo/midi/ICantWait.mid | Bin 0 -> 17458 bytes .../wtv-music/demo/midi/Jazzin.mid | Bin 0 -> 15771 bytes .../ServiceVault/wtv-music/demo/midi/Jimi.mid | Bin 0 -> 11309 bytes .../wtv-music/demo/midi/JiveJava.mid | Bin 0 -> 25154 bytes .../wtv-music/demo/midi/JustBlue.mid | Bin 0 -> 13401 bytes .../wtv-music/demo/midi/LetsPlayBall.mid | Bin 0 -> 23495 bytes .../wtv-music/demo/midi/Liz-N-Larry.mid | Bin 0 -> 23406 bytes .../wtv-music/demo/midi/LizLarry.mid | Bin 0 -> 23374 bytes .../wtv-music/demo/midi/Midterm.mid | Bin 0 -> 29772 bytes .../wtv-music/demo/midi/Missin.mid | Bin 0 -> 23671 bytes .../wtv-music/demo/midi/MissinSummer.mid | Bin 0 -> 23700 bytes .../wtv-music/demo/midi/Moorea.mid | Bin 0 -> 25058 bytes .../wtv-music/demo/midi/MoveOver.mid | Bin 0 -> 30015 bytes .../wtv-music/demo/midi/MrChopChop.mid | Bin 0 -> 22887 bytes .../wtv-music/demo/midi/NiteFunk.mid | Bin 0 -> 27423 bytes .../wtv-music/demo/midi/OhImOnFire.mid | Bin 0 -> 23047 bytes .../wtv-music/demo/midi/OnBoogie.mid | Bin 0 -> 30523 bytes .../wtv-music/demo/midi/OnFire.mid | Bin 0 -> 23016 bytes .../ServiceVault/wtv-music/demo/midi/PCH.mid | Bin 0 -> 22970 bytes .../wtv-music/demo/midi/ParkIt.mid | Bin 0 -> 22841 bytes .../wtv-music/demo/midi/ParkItHere.mid | Bin 0 -> 22870 bytes .../wtv-music/demo/midi/ParkWalk.mid | Bin 0 -> 21014 bytes .../wtv-music/demo/midi/PianoJz1.mid | Bin 0 -> 10673 bytes .../wtv-music/demo/midi/PianoJz2.mid | Bin 0 -> 11846 bytes .../wtv-music/demo/midi/Prezo.mid | Bin 0 -> 30489 bytes .../wtv-music/demo/midi/Prussian.mid | Bin 0 -> 24558 bytes .../wtv-music/demo/midi/Pundit.mid | Bin 0 -> 30107 bytes .../wtv-music/demo/midi/RickPunk.mid | Bin 0 -> 17145 bytes .../ServiceVault/wtv-music/demo/midi/Road.mid | Bin 0 -> 23527 bytes .../wtv-music/demo/midi/Saunter.mid | Bin 0 -> 23600 bytes .../wtv-music/demo/midi/ShadowMe.mid | Bin 0 -> 22093 bytes .../ServiceVault/wtv-music/demo/midi/Shre.mid | Bin 0 -> 24240 bytes .../wtv-music/demo/midi/SlowDay.mid | Bin 0 -> 14044 bytes .../wtv-music/demo/midi/SoGrand.mid | Bin 0 -> 19142 bytes .../wtv-music/demo/midi/StarDanc.mid | Bin 0 -> 29111 bytes .../wtv-music/demo/midi/Stubborn.mid | Bin 0 -> 22828 bytes .../wtv-music/demo/midi/Surge.mid | Bin 0 -> 25545 bytes .../wtv-music/demo/midi/Swang.mid | Bin 0 -> 27313 bytes .../wtv-music/demo/midi/SwingSet.mid | Bin 0 -> 23364 bytes .../wtv-music/demo/midi/TastyWav.mid | Bin 0 -> 30600 bytes .../wtv-music/demo/midi/TheGirl.mid | Bin 0 -> 17307 bytes .../wtv-music/demo/midi/Theme.mid | Bin 0 -> 29961 bytes .../wtv-music/demo/midi/Think.mid | Bin 0 -> 23164 bytes .../wtv-music/demo/midi/Travel.mid | Bin 0 -> 25290 bytes .../wtv-music/demo/midi/Tumbling.mid | Bin 0 -> 20071 bytes .../wtv-music/demo/midi/Under.mid | Bin 0 -> 28709 bytes .../wtv-music/demo/midi/Upping.mid | Bin 0 -> 31315 bytes .../wtv-music/demo/midi/Wind1.mid | Bin 0 -> 8933 bytes .../ServiceVault/wtv-music/demo/midi/Xess.mid | Bin 0 -> 26684 bytes .../ServiceVault/wtv-music/demo/midi/acey.mid | Bin 0 -> 5966 bytes .../wtv-music/demo/midi/bach_cmaj_prelude.mid | Bin 0 -> 11252 bytes .../demo/midi/bach_dminor_2part_invention.mid | Bin 0 -> 3970 bytes .../wtv-music/demo/midi/bach_fugue_cmajor.mid | Bin 0 -> 6892 bytes .../wtv-music/demo/midi/bach_fugue_cminor.mid | Bin 0 -> 6827 bytes .../demo/midi/bach_fugue_eflatMajor.mid | Bin 0 -> 7845 bytes .../wtv-music/demo/midi/bach_little_fugue.mid | Bin 0 -> 11786 bytes .../wtv-music/demo/midi/bach_menuet_in_G.mid | Bin 0 -> 5634 bytes .../demo/midi/bach_violin_partita_in_e.mid | Bin 0 -> 10094 bytes .../wtv-music/demo/midi/cata_wtv.mid | Bin 0 -> 29179 bytes .../wtv-music/demo/midi/chill_jingle.mid | Bin 0 -> 16703 bytes .../wtv-music/demo/midi/dark_dance.mid | Bin 0 -> 10914 bytes .../demo/midi/eubieblake_baltimoretodolo.mid | Bin 0 -> 19791 bytes .../wtv-music/demo/midi/funky.mid | Bin 0 -> 21342 bytes .../wtv-music/demo/midi/future_sound.mid | Bin 0 -> 6658 bytes .../wtv-music/demo/midi/grldream.mid | Bin 0 -> 17309 bytes .../wtv-music/demo/midi/groovy.mid | Bin 0 -> 10590 bytes .../wtv-music/demo/midi/hacktv4.gif | Bin 0 -> 2050 bytes .../wtv-music/demo/midi/home_wtv.mid | Bin 0 -> 7201 bytes .../wtv-music/demo/midi/house.mid | Bin 0 -> 15312 bytes .../wtv-music/demo/midi/house_jam.mid | Bin 0 -> 11053 bytes .../wtv-music/demo/midi/index.html | 306 ++++++++++++++ .../demo/midi/jelly_kansascitystomp.mid | Bin 0 -> 17474 bytes .../wtv-music/demo/midi/jelly_mrjoe.mid | Bin 0 -> 20620 bytes .../wtv-music/demo/midi/jivecofe.mid | Bin 0 -> 25156 bytes .../demo/midi/joplin_entertainer.mid | Bin 0 -> 9853 bytes .../wtv-music/demo/midi/joplin_figleafrag.mid | Bin 0 -> 24123 bytes .../demo/midi/joplin_mapleleafrag.mid | Bin 0 -> 19412 bytes .../demo/midi/joplin_wallstreetrag.mid | Bin 0 -> 21545 bytes .../wtv-music/demo/midi/jscape.mid | Bin 0 -> 9073 bytes .../wtv-music/demo/midi/just_wtv.mid | Bin 0 -> 13403 bytes .../wtv-music/demo/midi/mattman.mid | Bin 0 -> 29333 bytes .../wtv-music/demo/midi/nightclub.mid | Bin 0 -> 11120 bytes .../wtv-music/demo/midi/nite_wtv.mid | Bin 0 -> 27425 bytes .../wtv-music/demo/midi/oldshop.mid | Bin 0 -> 14103 bytes .../wtv-music/demo/midi/pnojazz1.mid | Bin 0 -> 10675 bytes .../wtv-music/demo/midi/pnojazz2.mid | Bin 0 -> 11848 bytes .../wtv-music/demo/midi/relief.mid | Bin 0 -> 3798 bytes .../wtv-music/demo/midi/roadtrav.mid | Bin 0 -> 23529 bytes .../wtv-music/demo/midi/royal.mid | Bin 0 -> 5435 bytes .../wtv-music/demo/midi/shre_wtv.mid | Bin 0 -> 24242 bytes .../ServiceVault/wtv-music/demo/midi/stop.wav | Bin 0 -> 572 bytes .../wtv-music/demo/midi/tekworld.mid | Bin 0 -> 14983 bytes .../wtv-music/demo/midi/undr_wtv.mid | Bin 0 -> 28711 bytes .../wtv-music/demo/midi/webtv.gif | Bin 0 -> 1892 bytes .../ServiceVault/wtv-music/demo/music.jpg | Bin 0 -> 8681 bytes .../ServiceVault/wtv-tricks/access.js | 2 +- .../ServiceVault/wtv-tricks/blastcache.js | 4 +- .../ServiceVault/wtv-tricks/go-offline.js | 8 +- .../ServiceVault/wtv-update/sync.js | 12 +- zefie_wtvp_minisrv/app.js | 372 ++++++++++-------- zefie_wtvp_minisrv/package.json | 2 +- zefie_wtvp_minisrv/services.json | 11 +- zefie_wtvp_minisrv/wtvsec.js | 15 +- zefie_wtvp_minisrv/zefie_wtvp_minisrv.njsproj | 140 ++++++- 160 files changed, 1383 insertions(+), 382 deletions(-) rename zefie_wtvp_minisrv/ServiceDeps/{LC2/artemis_18004653537.tok => premade_tellyscripts/LC2/LC2_HDD_artemis_18004653537.tok} (100%) rename zefie_wtvp_minisrv/ServiceDeps/{LC2/artemis_18006138199.tok => premade_tellyscripts/LC2/LC2_HDD_artemis_18006138199.tok} (100%) rename zefie_wtvp_minisrv/ServiceDeps/{ => premade_tellyscripts}/LC2/LC2_OISP_5555732_56k.tok (100%) rename zefie_wtvp_minisrv/ServiceDeps/{ => premade_tellyscripts}/LC2/LC2_WTV_18006138199_56k.tok (100%) create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/ROMCache/HackTVLogoJewel.gif create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/get-by-path.js create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/initiate-lc2-download.js delete mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/lc2-download-failed.html create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/lc2-download-failed.js delete mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/willie.async.js create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/willie.js delete mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-head-waiter/ssl-cert.der create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/hacktv4.gif create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/index.html create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/Bogged.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/Bogged2.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/BoggedDown.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/Brasilia.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/Busy.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/CantWait.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/Catamran.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/ComeInn.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/ComeOnInn.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/CoolShad.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/Dancing.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/DarkGame.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/DeerXing.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/DialingWebtv.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/Downtown.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/Fever.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/Flutey.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/Flutter.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/Georgy.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/GetBy.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/Glasses.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/Harry.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/HarryRock.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/Herbie.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/HomeAgn.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/Huffin.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/HuffinPuffin.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/IAmBusy.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/ICantWait.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/Jazzin.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/Jimi.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/JiveJava.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/JustBlue.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/LetsPlayBall.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/Liz-N-Larry.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/LizLarry.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/Midterm.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/Missin.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/MissinSummer.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/Moorea.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/MoveOver.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/MrChopChop.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/NiteFunk.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/OhImOnFire.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/OnBoogie.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/OnFire.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/PCH.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/ParkIt.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/ParkItHere.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/ParkWalk.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/PianoJz1.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/PianoJz2.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/Prezo.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/Prussian.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/Pundit.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/RickPunk.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/Road.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/Saunter.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/ShadowMe.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/Shre.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/SlowDay.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/SoGrand.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/StarDanc.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/Stubborn.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/Surge.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/Swang.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/SwingSet.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/TastyWav.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/TheGirl.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/Theme.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/Think.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/Travel.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/Tumbling.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/Under.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/Upping.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/Wind1.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/Xess.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/acey.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/bach_cmaj_prelude.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/bach_dminor_2part_invention.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/bach_fugue_cmajor.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/bach_fugue_cminor.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/bach_fugue_eflatMajor.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/bach_little_fugue.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/bach_menuet_in_G.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/bach_violin_partita_in_e.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/cata_wtv.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/chill_jingle.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/dark_dance.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/eubieblake_baltimoretodolo.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/funky.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/future_sound.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/grldream.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/groovy.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/hacktv4.gif create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/home_wtv.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/house.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/house_jam.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/index.html create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/jelly_kansascitystomp.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/jelly_mrjoe.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/jivecofe.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/joplin_entertainer.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/joplin_figleafrag.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/joplin_mapleleafrag.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/joplin_wallstreetrag.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/jscape.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/just_wtv.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/mattman.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/nightclub.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/nite_wtv.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/oldshop.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/pnojazz1.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/pnojazz2.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/relief.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/roadtrav.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/royal.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/shre_wtv.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/stop.wav create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/tekworld.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/undr_wtv.mid create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/webtv.gif create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/music.jpg diff --git a/README.md b/README.md index 5ac221f4..da4bd195 100644 --- a/README.md +++ b/README.md @@ -11,12 +11,13 @@ This open source server is in alpha status. Use at your own risk. - Suports `.async.js` service files with asynchronous requests - Supports multiple simultaneous users - WebTV-compatible HTTP Proxy (via minisrv, or using an external proxy for enhanced features (such as [WebOne](https://github.com/atauenis/webone)) +- wtv-flashrom for LC2 and newer boxes (bf0app unsupported, need test unit) +- Can flash anything on [Ultra Willies](https://wtv.zefie.com/willie.php) with optional `use_zefie_server` flag set on `wtv-flashrom` service. ### Current issues: - May not run on non-development Windows machines (VS2019 with nodejs and python) - Power cycling box and re-connecting via ConnectSetup may invalidate encryption until server is restarted - wtv-update:/update does not yet function as intended -- wtv-flashrom features do not yet function as intended - HTTPS Proxying untested, likely needs SSL spoofing with self-signed solution ### Won't fix: @@ -26,7 +27,8 @@ This open source server is in alpha status. Use at your own risk. ### Feature Todo: - ~~(maybe) implement HTTP proxy (needs to be able to defluff most of the web, think retro WAP converter)~~ ***Done*** - ~~(maybe) enable "internet mode" (let user outside of minisrv)~~ ***Done*** -- Flashrom flashing functionality (at least for LC2 and higher) +- ~~Flashrom flashing functionality (at least for LC2 and higher)~~ ***Done*** +- Flashrom flashing for bf0app old classic (need donor unit) - SSID/IP black/whitelisting (including tying SSID to an IP or multiple IPs) - (maybe) Proper wtv-star (generic service outage page) support (maybe useful for allowing a unit to multiple sub-minisrvs). - (maybe) wtvchat stuff diff --git a/ServiceVault.md b/ServiceVault.md index d674a9cb..4b6d806f 100644 --- a/ServiceVault.md +++ b/ServiceVault.md @@ -16,14 +16,13 @@ Let us use the URL `wtv-1800:/preregister` as an example. This is what the serve - TXT file match (*Raw TXT Mode*) - Service parses and sends AS-IS. - You are expected to define headers -- `./ServiceVault/wtv-1800/preregister.async.js` \[ [Example](zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/willie.async.js) \] - - Asynchronous JS match (*Async JS Interpreter mode*) - - Executes the JavaScript in asynchronous mode. - - You are expected to call `sendToClient(socket,headers,data)` yourself, `socket` is already defined by the time your script runs, so you can just pass it through. - `./ServiceVault/wtv-1800/preregister.js` \[ [Example](zefie_wtvp_minisrv/ServiceVault/wtv-home/home.js) \] - Synchronous JS match (*JS Interpreter mode*) - Executes the JavaScript in synchronous mode. - You are expected to define `headers` and `data` before the end of your script. + - Access Asynchronous mode by setting `request_is_async = true;` + - Client request headers are available as an Array in variable `request_headers`, query arguments are also an Array, in `request_headers.query` + - In Asynchronous mode, you are expected to call `sendToClient(socket,headers,data)` yourself, `socket` is already defined by the time your script runs, so you can just pass it through. - `./ServiceVault/wtv-1800/preregister.html` \[ [Example](zefie_wtvp_minisrv/ServiceVault/wtv-home/zefie.html) \] - HTML match (*HTML mode*) - Like Direct File Mode, but you don't need to append `.html`. diff --git a/zefie_wtvp_minisrv/.gitignore b/zefie_wtvp_minisrv/.gitignore index 6d6f8150..0dade07a 100644 --- a/zefie_wtvp_minisrv/.gitignore +++ b/zefie_wtvp_minisrv/.gitignore @@ -9,6 +9,7 @@ ServiceLogPost/*_* # Large files not pertaining to the service code ServiceVault/wtv-flashrom/content/* ServiceVault/wtv-music/content/* +ServiceVault/wtv-music/midi/* # User-specific files *.rsuser diff --git a/zefie_wtvp_minisrv/ServiceDeps/LC2/artemis_18004653537.tok b/zefie_wtvp_minisrv/ServiceDeps/premade_tellyscripts/LC2/LC2_HDD_artemis_18004653537.tok similarity index 100% rename from zefie_wtvp_minisrv/ServiceDeps/LC2/artemis_18004653537.tok rename to zefie_wtvp_minisrv/ServiceDeps/premade_tellyscripts/LC2/LC2_HDD_artemis_18004653537.tok diff --git a/zefie_wtvp_minisrv/ServiceDeps/LC2/artemis_18006138199.tok b/zefie_wtvp_minisrv/ServiceDeps/premade_tellyscripts/LC2/LC2_HDD_artemis_18006138199.tok similarity index 100% rename from zefie_wtvp_minisrv/ServiceDeps/LC2/artemis_18006138199.tok rename to zefie_wtvp_minisrv/ServiceDeps/premade_tellyscripts/LC2/LC2_HDD_artemis_18006138199.tok diff --git a/zefie_wtvp_minisrv/ServiceDeps/LC2/LC2_OISP_5555732_56k.tok b/zefie_wtvp_minisrv/ServiceDeps/premade_tellyscripts/LC2/LC2_OISP_5555732_56k.tok similarity index 100% rename from zefie_wtvp_minisrv/ServiceDeps/LC2/LC2_OISP_5555732_56k.tok rename to zefie_wtvp_minisrv/ServiceDeps/premade_tellyscripts/LC2/LC2_OISP_5555732_56k.tok diff --git a/zefie_wtvp_minisrv/ServiceDeps/LC2/LC2_WTV_18006138199_56k.tok b/zefie_wtvp_minisrv/ServiceDeps/premade_tellyscripts/LC2/LC2_WTV_18006138199_56k.tok similarity index 100% rename from zefie_wtvp_minisrv/ServiceDeps/LC2/LC2_WTV_18006138199_56k.tok rename to zefie_wtvp_minisrv/ServiceDeps/premade_tellyscripts/LC2/LC2_WTV_18006138199_56k.tok diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-1800/finish-prereg.js b/zefie_wtvp_minisrv/ServiceVault/wtv-1800/finish-prereg.js index 67275dd8..6d0706f3 100644 --- a/zefie_wtvp_minisrv/ServiceVault/wtv-1800/finish-prereg.js +++ b/zefie_wtvp_minisrv/ServiceVault/wtv-1800/finish-prereg.js @@ -1,26 +1,40 @@ if (socket_session_data[socket.id].ssid != null && !getSessionData(socket_session_data[socket.id].ssid, 'wtvsec_login')) { var wtvsec_login = new WTVSec(); wtvsec_login.IssueChallenge(); - wtvsec_login.set_incarnation(request_headers['wtv-incarnation']); + wtvsec_login.set_incarnation(request_headers["wtv-incarnation"]); setSessionData(socket_session_data[socket.id].ssid, 'wtvsec_login', wtvsec_login) } else { var wtvsec_login = getSessionData(socket_session_data[socket.id].ssid, 'wtvsec_login') } -var contype = "text/tellyscript"; - -var skip_tellyscript = false; +var prereg_contype = "text/html"; // if relogin, skip tellyscript -if (query['relogin']) { - contype = "text/html"; // skip tellyscript +if (request_headers.query.relogin) { // skip tellyscript wtvsec_login.ticket_b64 = null; // clear old ticket } +// if relogin, skip tellyscript +var romtype, file_path = null; +if (!request_headers.query.relogin && services_configured.config.send_tellyscripts) { + var romtype = getSessionData(socket_session_data[socket.id].ssid, 'wtv-client-rom-type'); +} + +switch (romtype) { + case "US-LC2-disk-0MB-8MB": + prereg_contype = "text/tellyscript"; + var file_path = __dirname + "/ServiceDeps/premade_tellyscripts/LC2/LC2_OISP_5555732_56k.tok"; + break; + + default: + data = ''; + break; +} + headers = `200 OK Connection: Keep-Alive wtv-initial-key: ` + wtvsec_login.challenge_key.toString(CryptoJS.enc.Base64) + ` -Content-Type: `+ contype + ` +Content-Type: `+ prereg_contype + ` wtv-service: reset ` + getServiceString('wtv-1800') + ` ` + getServiceString('wtv-star') + ` @@ -30,20 +44,16 @@ wtv-boot-url: wtv-1800:/preregister?relogin=true wtv-visit: wtv-head-waiter:/login? wtv-client-time-zone: GMT -0000 wtv-client-time-dst-rule: GMT -wtv-client-date: `+strftime("%a, %d %b %Y %H:%M:%S", new Date(new Date().toUTCString()))+` GMT`; +wtv-client-date: `+ strftime("%a, %d %b %Y %H:%M:%S", new Date(new Date().toUTCString())) + ` GMT`; -// if relogin, skip tellyscript -var romtype = null; -if (!query['relogin'] && skip_tellyscript == false) { - var romtype = getSessionData(socket_session_data[socket.id].ssid, 'wtv-client-rom-type'); -} - -switch (romtype) { - case "US-LC2-disk-0MB-8MB": - data = getFile("LC2/LC2_OISP_5555732_56k.tok", true); - break; - - default: - data = ''; - break; +if (file_path) { + request_is_async = true; + fs.readFile(file_path, null, function (err, file_read_data) { + if (err) { + var errmsg = doErrorCode(400); + headers = errmsg[0]; + file_read_data = errmsg[1] + "\n" + err.toString(); + } + sendToClient(socket, headers, file_read_data); + }); } \ No newline at end of file diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-1800/preregister.js b/zefie_wtvp_minisrv/ServiceVault/wtv-1800/preregister.js index bd9909f4..2885e20f 100644 --- a/zefie_wtvp_minisrv/ServiceVault/wtv-1800/preregister.js +++ b/zefie_wtvp_minisrv/ServiceVault/wtv-1800/preregister.js @@ -1,8 +1,8 @@ var gourl = "wtv-1800:/finish-prereg?"; -if (query['relogin']) gourl += "relogin=true"; +if (request_headers.query.relogin) gourl += "relogin=true"; -if (request_headers['wtv-ticket']) { +if (request_headers["wtv-ticket"]) { gourl = "wtv-head-waiter:/login-stage-two?"; } diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/ROMCache/HackTVLogoJewel.gif b/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/ROMCache/HackTVLogoJewel.gif new file mode 100644 index 0000000000000000000000000000000000000000..07a0f4b89f69c09aeab54c2d11da99fef40b5ca7 GIT binary patch literal 5845 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 { + data_hex += d; + }) + + res.on('end', function () { + if (!zquiet) console.log(` * Zefie's FlashROM Server HTTP Status: ${res.statusCode} ${res.statusMessage}`) + if (res.statusCode == 200) { + data = Buffer.from(data_hex, 'hex'); + } else if (res.statusCode == 404) { + var errpage = doErrorPage(404, "The service could not find the requested ROM on zefie's server.") + headers = errpage[0]; + data = errpage[1]; + } else { + var errpage = doErrorPage(400) + headers = errpage[0]; + data = errpage[1]; + } + sendToClient(socket, headers, data); + }); + }); + req.end(); + } else { + // use local flashrom files); + var flashrom_file_path = service_dir + '/' + request_path; + try { + fs.readFile(flashrom_file_path, null, function (err, data) { + if (err) { + errpage = doErrorPage(400) + headers = errpage[0]; + data = err.toString(); + } + sendToClient(socket, headers, data); + }); + } catch (e) { + var errpage = doErrorPage(404, "The service could not find the requested ROM.") + headers = errpage[0]; + data = errpage[1]; + sendToClient(socket, headers, data); + } + } +} else { + // no support for bf0app yet, but here we send the client to initiate-lc2-download + // to get the rom image + if (request_headers.query.path) { + headers += "Content-type: text/html\n" + headers += "wtv-visit: wtv-flashrom:/initiate-lc2-download?path=" + request_headers.query.path; + data = ''; + } else { + var errpage = doErrorPage(404) + headers = errpage[0]; + data = errpage[1]; + } + sendToClient(socket, headers, data); +} \ No newline at end of file diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/get-lc2-page.js b/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/get-lc2-page.js index 51d7b10f..76250b79 100644 --- a/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/get-lc2-page.js +++ b/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/get-lc2-page.js @@ -2,11 +2,106 @@ // - ready query param to get flashrom path, check for its existance // - handle last part to redirect to lc2-download-complete // - handle failures +request_is_async = true; -headers = `200 OK +if (!request_headers.query.path) { + var errpage = doErrorPage(400); + headers = errpage[0]; + data = errpage[1]; +} else { + var request_path = unescape(request_headers.query.path); + if (services_configured.services[service_name].use_zefie_server) { + // read first 256 bytes of flashrom file from archive.midnightchannel.net + // to get `flashrom_message` and `numparts` if missing + var options = { + host: "archive.midnightchannel.net", + path: "/zefie/files/wtv-flashrom/" + request_path, + method: 'GET', + timeout: 5000, + headers: { + 'Range': 'bytes=0-256' + } + } + + var chunk; + + const req = https.request(options, function (res) { + var data = ''; + res.setEncoding('hex'); + + res.on('data', function (d) { + data += d; + }); + + res.on('error', function (e) { + console.log(" * Upstream FlashROM Error:", e); + var errpage = doErrorPage(400) + headers = errpage[0]; + data = errpage[1]; + sendToClient(socket, headers, data); + }); + + res.on('end', function () { + if (res.statusCode == 206) { + var flashrom_message = new Buffer.from(data.substring(36 * 2, 68 * 2), 'hex').toString('ascii').replace(/[^0-9a-z\ \.\-]/gi, ""); + processLC2DownloadPage(request_headers.query.path, flashrom_message, (request_headers.query.numparts || null)); + return; + } else if (res.statusCode == 404) { + var errpage = doErrorPage(404, "The service could not find the requested ROM on zefie's server.") + headers = errpage[0]; + data = errpage[1]; + } else { + var errpage = doErrorPage(400) + headers = errpage[0]; + data = errpage[1]; + } + sendToClient(socket, headers, data); + }); + }); + req.end(); + } else { + // use local flashrom files + var flashrom_file_path = service_dir + '/' + request_path; + fs.readFile(flashrom_file_path, null, function (err, data) { + try { + var data_128 = new Buffer.alloc(128); + data.copy(data_128, 0, 0, 128); + var flashrom_message = new Buffer.from(data_128.toString('hex').substring(36 * 2, 68 * 2), 'hex').toString('ascii').replace(/[^0-9a-z\ \.\-]/gi, ""); + processLC2DownloadPage(request_headers.query.path, flashrom_message, (request_headers.query.numparts || null)); + } catch (e) { + var errpage = doErrorPage(404, "The service could not find the requested ROM.") + headers = errpage[0]; + data = errpage[1]; + sendToClient(socket, headers, data); + } + }); + } +} + +async function processLC2DownloadPage(path, flashrom_message, numparts = null) { + if (numparts != null) var flashrom_numparts = parseInt(numparts); + if (!flashrom_numparts) flashrom_numparts = flashrom_message.substring(flashrom_message.length - 4).replace(/\D/g, ''); + var ind = new Array(); + ind[0] = (path.indexOf("part") + 4); + ind[1] = (path.indexOf(".", ind[0]) + 1); + var flashrom_part_num = path.substr(ind[0], (path.length - ind[1])); + var flashrom_lastpart = (flashrom_numparts == (parseInt(flashrom_part_num) + 1)) ? true : false; + var flashrom_rompath = 'wtv-flashrom:/get-by-path?path=' + path + '&raw=true'; + var flashrom_isboot = (/\.brom$/).test(path); + if (flashrom_lastpart) { + flashrom_next_rompath = "wtv-flashrom:/lc2-download-complete?"; + } else { + var flashrom_next_part_num = (parseInt(flashrom_part_num) + 1); + if (flashrom_next_part_num < 10) flashrom_next_part_num = "00" + flashrom_next_part_num; // 1s + else if (flashrom_next_part_num >= 10 && flashrom_next_part_num < 100) flashrom_next_part_num = "0" + flashrom_next_part_num; // 10s + var flashrom_next_rompath = flashrom_rompath.replace("part"+flashrom_part_num, "part"+flashrom_next_part_num).replace('get-by-path', 'get-lc2-page').replace("&raw=true", "&numparts=" + parseInt(flashrom_numparts)); + } + if (!flashrom_part_num || !flashrom_lastpart || !flashrom_rompath || !flashrom_next_rompath || !flashrom_isboot) { + + headers = `200 OK Content-type: text/html` -data = ` + data = ` Updating @@ -18,18 +113,22 @@ hspace=0 vspace=0 fontsize="large"> <table cellspacing=0 cellpadding=0> <tr> <td width=104 height=74 valign=middle align=center bgcolor="3B3A4D"> +<img src="wtv-flashrom:/ROMCache/HackTVLogoJewel.gif" width=87 height=67> <td width=20 valign=top align=left bgcolor="3B3A4D"> +<img src="wtv-flashrom:/ROMCache/Spacer.gif" width=1 height=1> <td colspan=10 width=436 valign=middle align=left bgcolor="3B3A4D"> <font color="D6DFD0" size="+2"> <blackface> <shadow> +<img src="wtv-flashrom:/ROMCache/Spacer.gif" width=1 height=4> <br> -Updating now... +Updating now </shadow> </blackface> </font> <tr> <td colspan=12 width=560 height=10 valign=top align=left> +<img src="wtv-flashrom:/ROMCache/S40H1.gif" width=560 height=6> <tr> <td width=104 height=10 valign=top align=left> <td width=20 valign=top align=left> @@ -49,38 +148,37 @@ Updating now... <td width=20 valign=middle align=center> <td colspan=9 width=100 height=258 valign=top align=left> <font size=+1> -Your Internet Receiver is being<br>updated automatically. +Your WebTV Unit is being<br>updated automatically. <p> <font size=+1> -This will take a while, and then<br> your unit will reboot.<br><br> +This will take a while, and<br>then you can use your WebTV again. `; - -if (flashrom_isboot && flashrom_part == 16) { -data += `<p> + if (flashrom_isboot && parseInt(flashrom_part_num) == 16) { + data += `<p> The system will pause for about 30 seconds at the end of this update. Please <strong>do not</strong> interrupt the system during this time. ` -} -data += `</font> -</table> -<table width="100%"> -<tr> -<td align="left"><font size="-1" color="#D6DFD0"><small>    Receiving part ${flashrom_part} of ${flashrom_total_parts}</small></font></td> -<td align="right"><font size="-1" color="#D6DFD0"><small>v${flashrom_version} (${flashrom_type})    </small></font></td> -</tr> -</table> -<center> -<upgradeblock width=520 height=15 -${nextrompath} -errorurl="wtv-flashrom:/lc2-download-failed" -blockurl="wtv-flashrom:/${flashrom_rompath} -lastblock=${flashrom_lastpart} -curblock="${flashrom_part}" -totalblocks="${flashrom_total_parts}"></center> + } +data += ` +</font> +<br><br><br><br><br> +<upgradeblock width=280 height=15 +nexturl="${flashrom_next_rompath}" +errorurl="wtv-flashrom:/lc2-download-failed?" +blockurl="${flashrom_rompath}" +lastblock="${flashrom_lastpart}" +curblock="` + (parseInt(flashrom_part_num) + 1) + `" +totalblocks="${flashrom_numparts}"> +<font size="-1" color="#D6DFD0"> +<br> +<img src="wtv-flashrom:/ROMCache/Spacer.gif" width=2 height=10><br> +${flashrom_message} + <br><br> <tr> <td width=104 valign=middle align=center> <td width=20 valign=middle align=center> <td colspan=10 height=2 valign=middle align=center bgcolor="#191919"> +<img src="wtv-flashrom:/ROMCache/Spacer.gif" width=436 height=1> <tr> <td width=104 valign=middle align=center> <td width=20 valign=middle align=center> @@ -89,6 +187,7 @@ totalblocks="${flashrom_total_parts}"></center> <td width=104 valign=middle align=center> <td width=20 valign=middle align=center> <td colspan=10 height=2 valign=top align=left bgcolor="#191919"> +<img src="wtv-flashrom:/ROMCache/Spacer.gif" width=436 height=1> <tr> <td width=104 valign=middle align=center> <td width=20 valign=middle align=center> @@ -109,4 +208,11 @@ totalblocks="${flashrom_total_parts}"></center> <td width=20 valign=middle align=center> </table> </body> -</html>` \ No newline at end of file +</html>`; + } else { + var errpage = doErrorPage(400) + headers = errpage[0]; + data = errpage[1]; + } + sendToClient(socket, headers, data); +} diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/initiate-lc2-download.js b/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/initiate-lc2-download.js new file mode 100644 index 00000000..dcc51996 --- /dev/null +++ b/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/initiate-lc2-download.js @@ -0,0 +1,11 @@ +if (request_headers.query.path) { + headers = "300 OK\n"; + headers += "wtv-visit: wtv-flashrom:/get-lc2-page?path=" + request_headers.query.path + "\n"; + headers += "Location: wtv-flashrom:/get-lc2-page?path=" + request_headers.query.path + "\n"; + headers += "Content-type: text/html"; + data = ''; +} else { + var errpage = doErrorPage(400) + headers = errpage[0]; + data = errpage[1]; +} \ No newline at end of file diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/lc2-download-complete.js b/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/lc2-download-complete.js index 07290fdd..ed082c92 100644 --- a/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/lc2-download-complete.js +++ b/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/lc2-download-complete.js @@ -23,7 +23,7 @@ hspace=0 vspace=0 fontsize="large"> <table cellspacing=0 cellpadding=0> <tr> <td width=104 height=74 valign=middle align=center bgcolor="3B3A4D"> -<img src="wtv-flashrom:/ROMCache/MSNLogo.gif" width=87 height=67> +<img src="wtv-flashrom:/ROMCache/HackTVLogoJewel.gif" width=87 height=67> <td width=20 valign=top align=left bgcolor="3B3A4D"> <img src="wtv-flashrom:/ROMCache/Spacer.gif" width=1 height=1> <td colspan=10 width=436 valign=middle align=left bgcolor="3B3A4D"> diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/lc2-download-failed.html b/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/lc2-download-failed.html deleted file mode 100644 index 19abc99a..00000000 --- a/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/lc2-download-failed.html +++ /dev/null @@ -1,50 +0,0 @@ -<html> -<head> -<title> -Updating failed - - - - - - - - - - + + + + + + +
- - - - - - - - -
-Updated failed -
-
-
-
- -
- - - - - - - - - - - -
-
- - - -Update failed, gomennasai. - - \ No newline at end of file diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/lc2-download-failed.js b/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/lc2-download-failed.js new file mode 100644 index 00000000..6a5a5c52 --- /dev/null +++ b/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/lc2-download-failed.js @@ -0,0 +1,140 @@ +var error = ''; +if (request_headers.query.error) { + switch (request_headers.query.error) { + case "1": + error = "uncompression failed"; + break; + case "2": + error = "upgrade write failed"; + break; + case "3": + error = "signature verification failed"; + break; + case "4": + error = "cannot upgrade bootstrap"; + break; + case "5": + error = "out of memory"; + break; + case "-7": + error = "response error"; + break; + case "-20": + error = "timed out"; + break; + case "99": + error = "test code"; + break; + default: + error = "unknown error"; + break; + } +} + + +var try_again_url = 'wtv-flashrom:/willie'; +var try_again_url_path = '' +var try_again_url_start_time = parseInt(new Date().toUTCString()) / 1000; + +headers = `200 OK +Content-type: text/html` + + +data = ` + + + Update failed + + + + + + + + + + + + + +
+ + + + + + + + +
+ Updating failed +
+
+
+
+ +
+ + + + + + + + + + + + + + +
+ + + + We ran into a technical problem while updating + your unit. (Error: ${error}) + Choose Try Again to try again now. +

Press the power button to switch off your unit. +

+ + + +
+ + +
+ + + +
+ + +
+ + + + +
+ + + + + + + + + + + + +
+
+
+ +`; \ No newline at end of file diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/willie.async.js b/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/willie.async.js deleted file mode 100644 index aa379a3d..00000000 --- a/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/willie.async.js +++ /dev/null @@ -1,35 +0,0 @@ -// willie is just a graphical frontend to a list of ROMs -// the rest of the scripts should work if you manually link to a ROM, and actually have it. - - -var proxy_query = ''; -if (query['flash']) delete query['flash']; -if (query['vflash']) delete query['vflash']; - -for (const [key, value] of Object.entries(query)) { - proxy_query += "&" + key + "=" + value; -} - -console.log(proxy_query); - -var options = { - host: "wtv.zefie.com", - path: "/willie.php?pflash=" + getSessionData(socket_session_data[socket.id].ssid, 'wtv-client-rom-type') + proxy_query, - method: 'GET' -} - - -headers = "200 OK\nContent-type: text/html"; -const req = http.request(options, function (res) { - data = ''; - console.log(` * Upstream HTTP StatusCode: ${res.statusCode}`) - - res.on('data', d => { - data += d; - }) - - res.on('end', function () { - sendToClient(socket, headers, data); - }); -}); -req.end(); diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/willie.js b/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/willie.js new file mode 100644 index 00000000..ef2e4597 --- /dev/null +++ b/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/willie.js @@ -0,0 +1,50 @@ +// willie is just a graphical frontend to a list of ROMs +// the rest of the scripts should work if you manually link to a ROM, and actually have it. + +request_is_async = true; + +var proxy_query = ''; +if (request_headers.query.flash) delete request_headers.query.flash; +if (request_headers.query.vflash) delete request_headers.query.vflash; +if (request_headers.query.pflash) delete request_headers.query.pflash; + +for (const [key, value] of Object.entries(request_headers.query)) { + proxy_query += "&" + key + "=" + value; +} + +if (!services_configured.services[service_name].use_zefie_server) { + proxy_query += "&minisrv_local_mode=true"; +} + +var options = { + host: "wtv.zefie.com", + path: "/willie.php?minisrv=true&pflash=" + getSessionData(socket_session_data[socket.id].ssid, 'wtv-client-rom-type') + proxy_query, + timeout: 5000, + method: 'GET' +} + + +headers = "200 OK\nContent-type: text/html"; +const req = https.request(options, function (res) { + data = ''; + res.on('data', d => { + data += d; + }); + + res.on('error', function (e) { + if (!zquiet) console.log(" * Upstream Ultra Willies HTTP Error:", e); + var errpage = doErrorPage(400) + headers = errpage[0]; + data = errpage[1]; + sendToClient(socket, headers, data); + }); + + res.on('end', function () { + if (!zquiet) console.log(" * Upstream Ultra Willies HTTP Response:", res.statusCode, res.statusMessage); + if (request_headers.query.clear_cache) { + headers += "\nwtv-expire-all: wtv-flashrom"; + } + sendToClient(socket, headers, data); + }); +}); +req.end(); diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-head-waiter/finalize-security.js b/zefie_wtvp_minisrv/ServiceVault/wtv-head-waiter/finalize-security.js index ba53496f..25ed5f5b 100644 --- a/zefie_wtvp_minisrv/ServiceVault/wtv-head-waiter/finalize-security.js +++ b/zefie_wtvp_minisrv/ServiceVault/wtv-head-waiter/finalize-security.js @@ -2,10 +2,10 @@ var challenge_response, challenge_header = ''; var gourl; if (socket_session_data[socket.id].ssid !== null) { - if (request_headers['wtv-ticket']) { - if (request_headers['wtv-ticket'].length > 8) { - DecodeTicket(request_headers['wtv-ticket']); - socket_session_data[socket.id].wtvsec.ticket_b64 = request_headers['wtv-ticket']; + if (request_headers["wtv-ticket"]) { + if (request_headers["wtv-ticket"].length > 8) { + DecodeTicket(request_headers["wtv-ticket"]); + socket_session_data[socket.id].wtvsec.ticket_b64 = request_headers["wtv-ticket"]; //socket_session_data[socket.id].secure == true; } } else if (socket_session_data[socket.id].wtvsec.ticket_b64 == null) { diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-head-waiter/login-stage-two.js b/zefie_wtvp_minisrv/ServiceVault/wtv-head-waiter/login-stage-two.js index 47cebbad..be58d5a4 100644 --- a/zefie_wtvp_minisrv/ServiceVault/wtv-head-waiter/login-stage-two.js +++ b/zefie_wtvp_minisrv/ServiceVault/wtv-head-waiter/login-stage-two.js @@ -2,10 +2,9 @@ var challenge_response, challenge_header = ''; var gourl; if (socket_session_data[socket.id].ssid != null && !getSessionData(socket_session_data[socket.id].ssid, 'wtvsec_login')) { - var wtvsec_login = new WTVSec(); - wtvsec_login = new WTVSec(); + var wtvsec_login = new WTVSec(1,zdebug); wtvsec_login.IssueChallenge(); - wtvsec_login.set_incarnation(request_headers['wtv-incarnation']); + wtvsec_login.set_incarnation(request_headers["wtv-incarnation"]); setSessionData(socket_session_data[socket.id].ssid, 'wtvsec_login', wtvsec_login) } else { var wtvsec_login = getSessionData(socket_session_data[socket.id].ssid, 'wtvsec_login') @@ -13,23 +12,23 @@ if (socket_session_data[socket.id].ssid != null && !getSessionData(socket_sessio if (socket_session_data[socket.id].ssid !== null) { if (wtvsec_login.ticket_b64 == null) { - if (request_headers['wtv-ticket']) { - if (request_headers['wtv-ticket'].length > 8) { - wtvsec_login.DecodeTicket(request_headers['wtv-ticket']); - wtvsec_login.ticket_b64 = request_headers['wtv-ticket']; + if (request_headers["wtv-ticket"]) { + if (request_headers["wtv-ticket"].length > 8) { + wtvsec_login.DecodeTicket(request_headers["wtv-ticket"]); + wtvsec_login.ticket_b64 = request_headers["wtv-ticket"]; //socket_session_data[socket.id].secure = true; } } else { challenge_response = wtvsec_login.challenge_response; - var client_challenge_response = request_headers['wtv-challenge-response'] || null; + var client_challenge_response = request_headers["wtv-challenge-response"] || null; if (challenge_response && client_challenge_response) { //if (challenge_response.toString(CryptoJS.enc.Base64).substring(0,85) == client_challenge_response.substring(0,85)) { if (challenge_response.toString(CryptoJS.enc.Base64) == client_challenge_response) { - console.log(" * wtv-challenge-response success for "+socket_session_data[socket.id].ssid); + console.log(" * wtv-challenge-response success for " + processSSID(socket_session_data[socket.id].ssid)); wtvsec_login.PrepareTicket(); //socket_session_data[socket.id].secure = true; } else { - console.log(" * wtv-challenge-response FAILED for " + socket_session_data[socket.id].ssid); + console.log(" * wtv-challenge-response FAILED for " + processSSID(socket_session_data[socket.id].ssid)); if (zdebug) console.log("Response Expected:", challenge_response.toString(CryptoJS.enc.Base64)); if (zdebug) console.log("Response Received:", client_challenge_response) gourl = "wtv-head-waiter:/login?reissue_challenge=true"; @@ -54,7 +53,7 @@ else { var nickname = 'HackTVUsr_' + namerand; var userid = '1'+ Math.floor(Math.random() * 1000000000000000000); var offline_user_list = CryptoJS.enc.Latin1.parse("\n\t\n").toString(CryptoJS.enc.Base64); - + data = ''; headers = `200 OK Connection: Keep-Alive wtv-encrypted: true @@ -80,10 +79,10 @@ wtv-messenger-enable: 0 wtv-noback-all: wtv- wtv-service: reset `+ getServiceString('all') + ` -wtv-boot-url: wtv-1800:/preregister?relogin=true -wtv-ssl-certs-download-url: wtv-head-waiter:/ssl-cert.der -wtv-ssl-certs-checksum: 473926DC1B11F635A6B920953FDCDE6A -wtv-user-name: `+ nickname + ` +wtv-boot-url: wtv-1800:/preregister?relogin=true` +//wtv-ssl-certs-download-url: wtv-head-waiter:/ssl-cert.der +//wtv-ssl-certs-checksum: 473926DC1B11F635A6B920953FDCDE6A + headers += `wtv-user-name: `+ nickname + ` wtv-human-name: `+ nickname + ` wtv-irc-nick: `+ nickname + ` wtv-home-url: wtv-home:/home? diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-head-waiter/login.js b/zefie_wtvp_minisrv/ServiceVault/wtv-head-waiter/login.js index be4cf9e3..e16e5d7e 100644 --- a/zefie_wtvp_minisrv/ServiceVault/wtv-head-waiter/login.js +++ b/zefie_wtvp_minisrv/ServiceVault/wtv-head-waiter/login.js @@ -2,17 +2,17 @@ var challenge_response, challenge_header = ''; if (socket_session_data[socket.id].ssid !== null) { var wtvsec_login = getSessionData(socket_session_data[socket.id].ssid, 'wtvsec_login'); - if (request_headers['wtv-ticket']) { + if (request_headers["wtv-ticket"]) { if (wtvsec_login.ticket_b64 == null) { - if (request_headers['wtv-ticket'].length > 8) { - wtvsec_login.DecodeTicket(request_headers['wtv-ticket']); - wtvsec_login.ticket_b64 = request_headers['wtv-ticket']; + if (request_headers["wtv-ticket"].length > 8) { + wtvsec_login.DecodeTicket(request_headers["wtv-ticket"]); + wtvsec_login.ticket_b64 = request_headers["wtv-ticket"]; } } } else { if (wtvsec_login) { challenge_response = wtvsec_login.challenge_response; - var client_challenge_response = request_headers['wtv-challenge-response'] || null; + var client_challenge_response = request_headers["wtv-challenge-response"] || null; if (challenge_response && client_challenge_response) { if (challenge_response.toString(CryptoJS.enc.Base64).substring(0, 85) == client_challenge_response.substring(0, 85)) { console.log(" * wtv-challenge-response success for " + socket_session_data[socket.id].ssid); diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-head-waiter/ssl-cert.der b/zefie_wtvp_minisrv/ServiceVault/wtv-head-waiter/ssl-cert.der deleted file mode 100644 index b4b9da9398efc60829c0a4a3e055a2092689ee63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 594 zcmXqLV)8R+V%)xfnTe5!NrcgLiuMkThDm3X+xQvE%%*JAdKF{9%f_kI=F#?@mywZ` zmBGN$klTQhjX9KsO_<3s)KJ(!5X9l&;R?>rP1Ox9Ni0b<6g3bA33Bo9_~)bq2m2@l z6y;Y`8pw(B8W|dx8=4!K7+V+`Mgh5IK&}~-ONr5q^O4=j$jZRn*vnwh*vZt`$Z&d< z4(rz-fmKdS^CyWiuRpjo>|aHf*PQa-8~%RTbockgL-BE6`kx#-GvB{H^Qyf>Jl9I5 z^zUiRVHGjPGnU1BFXcM2NW3ekU!RLPC1(56DaUV4v6f_+^>Y1D`x~!q%I%w~u3xvG zuWd7f^_A5lr9IPnYpj*U?#?JWZ)P=BqTwcMClfOx1LNXggFpjWV5rFQv52vV80YF5 z)k~Dbwf)_^gn8-hzjLcY{S4$m(#k9n24W4^74U-;2s1MNXJIv922#j=2F49D(6c9c zEthYNlwFtYylU#?St~AI>N>g5sOPQB!!^tP=riXR*#)R8UcS1M)y{0&8U?Qh? iEq(98cTCv1BD*-0)h{F`@9?UwPQ`bUlEJc@e*yrdYS0M) diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-home/home.js b/zefie_wtvp_minisrv/ServiceVault/wtv-home/home.js index ae471606..957b5d26 100644 --- a/zefie_wtvp_minisrv/ServiceVault/wtv-home/home.js +++ b/zefie_wtvp_minisrv/ServiceVault/wtv-home/home.js @@ -13,7 +13,7 @@ if (getSessionData(socket_session_data[socket.id].ssid, 'box-does-psuedo-encrypt data =` Home for minisrv - + + + + + + + + + + + + +
+ + + +
+
+
+ + + + + +
+
Stop Music +
+
+
+
+
+ +
+ + + + + + + + +
+ + + +
+  WebTV MIDI Music +
+
+
+
+   + + + + + +
+
+ + + + +
+ +<font color="red" size="+1">WebTV JavaScript Bug!!! Press and hold CMD-R for 3 seconds</font><br> + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Bogged.mid + + Jazzin.mid + + Saunter.mid +
+ Bogged2.mid + + Jimi.mid + + ShadowMe.mid +
+ Brasilia.mid + + JiveJava.mid + + Shre.mid +
+ Busy.mid + + JustBlue.mid + + SlowDay.mid +
+ CantWait.mid + + LizLarry.mid + + SoGrand.mid +
+ Catamran.mid + + Midterm.mid + + StarDanc.mid +
+ ComeInn.mid + + Missin.mid + + Stubborn.mid +
+ CoolShad.mid + + Moorea.mid + + Surge.mid +
+ Dancing.mid + + MoveOver.mid + + Swang.mid +
+ DarkGame.mid + + NiteFunk.mid + + SwingSet.mid +
+ DeerXing.mid + + OnBoogie.mid + + TastyWav.mid +
+ Downtown.mid + + OnFire.mid + + TheGirl.mid +
+ Fever.mid + + ParkIt.mid + + Theme.mid +
+ Flutey.mid + + ParkWalk.mid + + Think.mid +
+ Flutter.mid + + PCH.mid + + Travel.mid +
+ Georgy.mid + + PianoJz1.mid + + Tumbling.mid +
+ GetBy.mid + + PianoJz2.mid + + Under.mid +
+ Glasses.mid + + Prezo.mid + + Upping.mid +
+ Harry.mid + + Prussian.mid + + Wind1.mid +
+ Herbie.mid + + Pundit.mid + + Xess.mid +
+ HomeAgn.mid + + RickPunk.mid + + MattMan69.mid + +

+

+ Huffin.mid + + Road.mid + +

+

+ +
+ + + \ No newline at end of file diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/jelly_kansascitystomp.mid b/zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/jelly_kansascitystomp.mid new file mode 100644 index 0000000000000000000000000000000000000000..21de4e063427bb01528c5d381ad44a5f192643d8 GIT binary patch literal 17474 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 JyEHTNe*xYAobmtw literal 0 HcmV?d00001 diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/jelly_mrjoe.mid b/zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/jelly_mrjoe.mid new file mode 100644 index 0000000000000000000000000000000000000000..785f79eb3bd99d483859551cb4f8189cdb05726b GIT binary patch literal 20620 zcmZ{MTT@)uw%&&YHp1A#7P7IoY_%jLfw;AxTYaJF3w>LCWA(j(2GQI>0)ZrCOSUV! z=4wkjsZ-}1k*8FplHVZZDGzx_Dvx=~Q>yZkf03ue`No_L($?OoQkCen#vF6bF}`t~ zv%65;+XC<@y6{!k|0-0UJ_5Q{@W*0z_a{TW_+#ml{|o$4y3q3<|HpsBAD?~_yZ7(; z-}M`X{bwiJPhHug?HjI*m#*yg!NE&c`RL%lRXBQja`agJccGrw)K?3cM8@@O`^od| z$D7-l{Alknsn<96wmXE=!uDqT==kN+{oTD2*S$dC{-i5Ler5Um%vIigw*B;{?JYwe z)AY9v*I&9ewq09X%+vji=O^1+uAQT&uE$4@CpM1`54WFg?yn!{5f`dYC;yXd=l^g! zpMDb83%mII*|zKG@xjY+^% zXhbG=8;yqRczt&}=-N9uISx)u9c~|PY(ITA*%>wUbba?^pR0L>Kc--0JoZ2F$Mr6* zhm{o^x62l1}E~iuiW(}Ry<#ErifJ0nRwgR?0S=3k_BZ2DC);IDfDOXnV|==K&*gN z0hxk~O>#AzK_!0fHNcv5sk^eRl#H`Ej~*AzlcMiE&P00Z+S|TG%JWkLI=r#cFH*Rp zx0RYFeYfCn@r?zGl86G4Dw0)LRlfSH15b6#*GTdm=HB)dy56Kj5q)QCf4u#a zSU+4Blfs*1Nev`%se~>|3wDQ4*g|6qr7h&PWDjC1!u|pcro((q^hFgUw`C_gPq(*e z#Lg(0e`rx8-XIOY4O&a6F3Bh^i7VlHsAw*%v?Ei9?QtnPk1bs0N~-uWiPuvaaoIf- z_E6s=*@Xpr0dLBCvY5}`o2e{n&EQDm*+7r5qPFWmK_mxzQ|1w~CB8S+wKxWCIO8$} z1t+FFi8u9Kly_0sMRxb~pU#<9P_A_FX_%57nP%5vuOq(h%xZlLX!Vq-W`{UlLACF6n@B}N7Kl@LRoR#YlyBPzozb37~nABR6${h`;BJM9YuE@ z&I^$dx?{K+w_#VEsNQyR1Emdh*~UN|&Rl8(<&8>7wiwr7u{KfNY?aZQf?BHWAhQ$U z6jj)7`v}bJF6z4nH4J31rIp(Pb;`%jqfxEn!cgCznxL zJ1%2@>_@d&MNE4X=sp_zDDA)g)>uzd(TWA&>#Co!Z*=rdK_Su+? zvoR(0%)+fIzDnXty{KvnR!b4tgJ!+!NUn=w8&KT&Wec36y9!Yy-FEpQvJX*si2B3V z7t6vz(ES*x$1(x6AKxULd(Y6FOJSglBt13(J!3c=pm2ct0kQ|e;kMz>LaL=MojLn> zX^$!`;GvD7I6f<5D21@`T&o?b_%gD~u$O;Lp{EWPCuBf~Lrg=W%K|bBXJ#UpIfK18 zeC5iZmw`j;*)Vs^?lKkBDxG1eC6u*OkWH<@UQ=mWSPF-6i9K8@ft@;E%?9iZMQ`3; zL$5a9J1IEb#{E-DroshP1I&w;L>SHRvz=TqmlsJCAWNOIXZIG-3UITcG* zr{Xv^0}Fde_>3pXRW0N?j-F4IFKQKHIEiGYqSSK)uPF2*nw6zo^|@jV#hTw;$8mkm zQ^P?m8m*&MpC75=MXlngM-xQd-T1*fFw89U1Xae1%BdARzv1 zq`W=Et@Nh1#tBBsMX*#?SG2aMA|fSw2>Z~P(y!9T-G$>}x*cMYfb37hVeA%6W)#DN zpszWV6xj)%LNzS{lcyCfo_~^(9MemPFA1z@x$|r8IQG)`{B2)}FEH-5hM5DI%%r9t zWuB@KmC8r-&(){MJ%vRojbc>=W4@p+wE=wJ;#-(b)&`f^>Y5tTVA} zzbGytQT3D%N{W4oN3SywJT0P|rsUVD4-(09~RxDdml;nr}NZ&O3oDpD&y#lUQb4n$yn z%=~Q|&F$YAoCPo2>RuDQCDATTxVeeSCQ6%A#GTvtjbqiX3A!ujrzZ|&mYJELu=E` zQj)OAjVgvD!Q`@Hg3ApQwvgUJe9O(yaDfw&8ATf})6U6Eh{Oi>Y1I@l-#S;d0#gUb zAAC#u{yL97Zk!rt5>`7v`2d*%HC%s$?4w!+!!;;6O6K}ioh~v05iPx`EtI!<>$t}f zgkF;ll8IJnOI#_XZ&1oqHQC%}u2wcy(vY_#liX~HDN-qq8|F>!krDOMULKdtqqQwt zVu+}6of%Xpj~5o!(woR{iaU`Yu*6`cT6ysgVuX!LW)Y1<3hn+px=Vr&!Z^1$X4o$e z~dhqmNrw z7Z{Phi{T4~SYc-)W(%*LcxTGXG4h~}Eqs#0SIpvK%SbINAGzytRucJr#@>zgqf*0D z#+Hf98x5)=ZC(*!RrHocbP`K8oNJ5<0i9Nf9yeGKoRr|~8VPN@;HviutIA_fxeK^j zm>RO-wx@>$vYuhe#rAj#7%X^Lce!j&sDOcjXTZj=?bUz#m=w(0{;vzTRq)@k@vR*s z{q;idGn)>4j(>k!h<;^b%#Mx}Fj7bm>RvnXWdW0gl*`6#JM(=3cM7wAlD}uK74So0 zp7V}V_I4y>qpy(SM1$0#jqeI+{_U8=IK7JECJL(#*D6Mq#!zV==@tsD_L_#5F&U~Z z-XNV6k5n4HO1y>C{ty`vwBpH`s>X3KB_g9iW%m(l3I2XQdpnR7KvApIK}^QFXlq22 z8Oxf7?hW=n;;kXR=#MiqZ(w1Sl2o6t`B9KJ?ggj__Yp^cFSD!a^EkfaLUQ|yH2h72 z^VMJD=*pdSBK8?U)Nu;m8LzN!8{1gy&q~IxgBO#3?m;Z3#zK{U%F{+v*L~cLyjWzV zBu^9Hr4Z|QjO(28LVW)@eMCyX&9B00u(VTy+5PLZFOx0F@YPmUiZFrnzPir(i#|$R z_Le6OhHLQ%O=Md?5V)Vwf23HC=&UeAH%;F&oRVThFg2%dRd2zZ?n~t4BVNOujqltvbB6h z{0{S%@CrioWIO69FC|_MqJ&yb5r~G>W4{wZUOw-*I(5eE3F#N=gZF zcsgR_R@HAgv<*^nt4OXQzWVx>)@mdxIXwF|giE&TO-TG%uO6nDB6f%HmF^XY>bQ#> zb2t{Q<<4NMhDc2jpBzco&#p+w=1eT}uIMUD%4CGVutfZrnL5N7gfi+n>#zteX`0v6 zo`{LTP3DlAnsTOws5T-hY$KjkJ_&!--%>IIWzCT3P|zI4F&xQZ7xf5E$ie5szSqMX z21zf6nt5#1M_UU^na;(>tDHfNv!D*+>l9x7a<qT%l3B#EvRyLgqKWXN zjfl{3QU>|`Bbw)MGSQ1}E(2}-J z=XKnID~1y1i=dz3$;I+C%(}hgj8Yp`8If|6GRk6reV*qm$uc&g_Kc1&Z1OzQKxFYm zV`17=s3TiPtnQ2wLo~_)3mSV7@kL}8CAbhXB|@Owh%<0%0l!QwqP#ehq<6(5lPzq* z+GG{mUxs=v#@rgKip!7+PP#oisPC}g8DdH#DFq81!&j$v^hQiLtX))h6WkNy)^@o} z6a^Nsm1z77y~!FvH8n`SIa~=* z#8NFdqh@ds@gj1?&S3TftepBn59YcBz&6pV`gA*Oo~_joF6OXfW~#CUtk?w-3t2&O zs)fAY~5i#A=SjVXsk(KqmW)!+^ zz#B(6E}Q!#jJ|jR;lyuQET>S33xQb5oa*B%17G%lQi|*tdv4ROaL3}tRz#!XFV~b$ zBS5{-+o31tzJ#KsIKstTe5Uil=`erj9C0qqJlgsb0|UdIO!~+f<<6qwYblH9N~c{J zUvoyI;B1MmH*>}NaqOD+b;n~u&e|7qn2zEFRTF1QVq(Y=w?{lkY_SJopzD{&Vuxr; z(Iv)Ir#EIFL{TJEBTLRObEOcq6WT$1=Qma%{UK><4W)Jw-bHLzyGe?f>xQ+o zFFDv8A2SZ=r!<8`6&KBm@TPe>eYq?m5!&z|A#I*U?v^DRm8X%u_fMJ3nWxOU%h3+s zD9yXKD#?eCpFNHJ)zesqZ#G=U*XOkU&eM55y<3&kSUAjgp2qo<8k9%z8&&Bb$u2z8 zWqf~5o5-1`Ay*mWRjJg3JlWxpyvOxcMN;~yT^1w?lVtwA` zLYV%PW`E8%NIQ_H7JH(h^QTsaL&nf{W}9o3rK}h7%=_809on3sC5~mn0%<$y%#*gW zi+qQ6{;&Av-_zQc8Ok~wIy+wYzKkEwIV^NIERX}`d&ST$e87RjWC1qIC}tS4Snm&I z`BR=2?JC&#mZ!z{PfK_7tnxI*{%?o2%&^*_Z4zg3!=cRXIt@l>BW{hpj&v%U=4qWZ zK-16$*tGMRr;XtBT2VKSAY*Gt6YXx+%%IwW&fC^rrC-L-I^Qrkp28X0#}c zf5}ib9IqwGhdf+v=45{iBE@wz%7{WWi`Q8fVj);pKQINosYe#pd6sjz2=)$-bhVy- zh{{7OJp6%45mz-_Wv6ci_KLd0!km@%g6_MD_?NHiwXk9fn!T^M&djgeVo^fd5Q#jY zu`A}OteYB-k$e0bBWrd8^^IZ!67*@M63d#XHreuHdZD^2ThLW|v?}XTY=!meu7Db` z*^aUr$Tv`Ju-bxJtYUy(*+RnF0NIu|gds&D4UQ$)OH!W5rulJ;YU3F8;39gfmB&aw zme_W+x(jPpq}$&OAVSt5aX@h0hUzj||d6YhvaoFFGYH$a+9W-{- zwbCAVVpre0#?p}00kd&w3p7|2d{#$a4xg0pO#?rrHc=MMmbfUQ=a}-Xu5>g>4Rhol9#; z4V7_;RqA(aquGy9e~j#7hmrt`1g0o#lkr7Xzpx*-TYSV9I`5F<$Fe@|%dYDZgtXZw zAW-X1*rV&E5(KLq+7^l}Rx(nUaPNG`R~%4WM0F9wtEVX0grJz~FFr%%nL||fYi!B3 ztu0iyRH!KE5d^o2<+{6wk>VolbELfFD#Be{87ZSh7KI&DcaDp2jtgj0N@Pn5Wk}9# zBhB_8dlQx%?Y7T~^MNMvr5Ei5-koSxxXiy5n^DQ{wSE zmhm*0QW`AIF4|IykP}boE02(VqOW1fHNb;0HgssTVip4QP#ptVEVA{>MoDEUTE!5pV#{7s zgN07N#>lTACO~f^nCA*BJj=);&2+gyp|2n>IHQ3vCsj1%feL=pOX9)95VJ0xMhzF) zn_U;Ikc^_Hs(#N|JYwfL^tzg;{DkzuCPij|Ta-7uJp3fHN2dAroR=47&D;H^$mEj! z49#cKWqU+hI>OQs`!z#NHvP$FNn1Y!M8`l-<{pcZxa)=I-_gt(8e9DY`L7EYwWY`) zY5h6M(t2xK8gZ0a7tzVXYoe2uFQ$I1=uf!^0`Eooc!08E?3e2F5z5ayZDtnprCpvx zBC}2-Bk@7;ITFIy!|W;}dAjl&qst1YBsV4Tt{Tn?9n*4VqC77aJxOEWg&L-PCInpx zLZ-#tCFC8)5sbVR65m!#$t15L?C7b@Ryd5mf{HR5rntCF>k*2NPz4nz3kv>G_@JpJ=H&u3e*q~S~Yke^w z{Vw5z#bZ@^BPU&Nme%oLou)2IV2^jTgn9|3(&`d=A4o4Oy0Q+^6xVsIPSFmm3I^+F z)={rtDPm{|11mUY*LG*C_D%+0LxI*OX8V%fkhS}rQsQk7;M;V#L$FUY&MqUwU9nQ_CZ+hUrp=9k_AOT z7h)}`=?dG^jj*w$X}!9zdBf2n&rRecj&vyKuWsphTW-N>(Jhu)nlZp?oS?pL$mo02 zG_|hR6t1m+YRIhc(Hg32u-3YYnA43Ob+0HlQ3wyNNd%}D&9GRO&Mo~F`6*_)f@dDB zm3Mf&PPebF@uEjbYCCF|d5z3>Gm9<)CMhnKoQRJ&onB%a#cg#Zj;1!UTkKvYWI1YB zT7dg`{Zt)L9dSuLIWt2@VG)T%b*uv+eYQF-E+Zi)35o$g;$snQnmV(N>=Eimu#c3h zc7zQ7s~*BS^z-oCoaNJeS@&wMpe2mdLzEw?xU0gm)t*d}1}jc$56xg+;= zay!iWxofr*#bYk##8Z%vE`o6f~Y-)+E^lX{W3Djq>^ zzk`fl$~!KegwmO3aYv6h%Q2Uzok)>>{s7ejSO<$dFsv{pl2qFO-532paT_ZKYQ#Q3 z^MFA_X?tqKg0TYfKzb|w6@A2Plp(coT>6lF7agw~FDqshhd6Fcl2ab!%EI(DpL^HL()5bD>YEY4DYMM>z`ZHAb!#P>4%2vgO zWVuWSTVL0u!Eju72uX=gc*Q{$*HMZ6Bv`INMf>x$bt+@h&7wd#7u1#!`o{n9=P`+Gct<7&fnR(#5qmGMHkBM?*e z5z0r-Bo&}VA(AQ|2nD6F@T;N>6{|jO!(Jm`A1+ACOo-}|aX6EiP1H7T=rrZeMuLwR zlES*R%oDwzk^XsFLyEGX31oj31*d)v8>hRR#WxxnNN!B)V7y1aM0b!~>B?eGTcNr~ zH=-?^4oQOXt_0)hgj^SrdDvXZvK^Gbj|u6*$S{#8>u8TJTk_G_Mq zl4B~Q*rkvrOi113^&e@eV1U;(do-!JFT`LZq*+?Ju4-k7cn#)hwp!LsCt*lzo^esW zig+Y}&AzSuiM~{%zU1{FE}BUmvmJ8dHHuUWv6yo4z8rfzT=R21rCqZM$$*XT?YYSU zzAS`hDs@U~pTESazAwo{v72mvE@%=BrJ6`d9r?2?_)1Uihd3Evp zZZA%QRm?H_ufkLPcYl7@H{NyX0fN9B;M13M&8^?l(KNj2cFPNl0{1hZuFTC}b$oi4 zPw0MlrPW;U#pxJxzifN$UEfUCDcOtxfjlPUGOW4u%Rv)-rU#wh@x|#ROJZAw`MXZJ zhDp5ued`ye_m@9^*LSz;baL5oO`_{v-#u>R{Y_sE&cjzq-G}qUhrvl)G0Wp~S&O>& zjyspNa0&XFFHZeSGL@(6)UT%s$OT)u-HTJVtwsVEa`X1nyS_-*X{3QrgKy98`rPXF>p}0>aN3f7drb zLVXdKt4XU7F2$#p!ZCV)jQrp}@XTpMy1`t=pcl@UT9I01B>Lc5uo^fW)fBU5%qR|X zFZh&f$&*XD<`q6{U-yL&5&@B>qlC$I1lQqR|GihMr+0D_!yA*tS|G{SlEDzeXNqj0`IlV8s*SCRBeGj@PAG8<$`a&>Hr&i!! z8TSdlHWy+p{t^t7%ZMM{Q~1q|ZZ5wA3K3QhMdr0HQ9}AQuo^wp8l>cUs0SkAdKWRE zM!11X8i8Itgi@X)p;tugp1)~e_F7!^o&s~q9{jHYT2+M4H zd=$gvv~-6z=kgT~`bYHW+g+!(YnZO7Z|`7m2K~G!c7I2lGaw?Funf;Tv%mqgE1Qb85l_z_Co&!*O!H$cdK||Z7>L+&H7~mYVM=puv9K;dBVO$C# zMEM_U?yUSKSx(U*PS$b1p75f5)qL>P6ZbnG9>Dt`;lm!MqCwEc=@Ff0@ zdmo*JcedT)0CDPbxI5QwjS2bCeGJ@1n=Xff4$NUR8*jI;Jn2 zXtZ0}ql0dAqI&jWya9hh9n-;%-gO$* zi=9m%mQZPiw=jBUB@#JQpNx*G!7+_{(#ApvhcFw0FQn#t=!>BzjPGWle$nXng=B(} zY4Dvq;s|zFV(bZ8@L9rLSX0nG0jMyKDS8ctp6M87V=BtG(_$5!rST9g7DhOX*|3_4 zVUSB>IGNQ;qokuDxI^vM^eket?xHS6}7;%hvwCe8y7`jr zkOA47%5yGqrzXffkU%JbNCI9einPQKEs5TY<{&;VszT(>{mM$Bh(r;JsuC^D_`IHA z5Z)ld!GER(jB((;T&3nsz<;78QVU!!U(st%TbQ+!Wne=8Ac`#TD>*$rNwHKuhQ3)* zeINBqa}iDQvLN+Fqav-ZBHuG$$~;?9Gqd2aCG#fIiX0dgrZXx;_;IDA4Ks(xBbLW( zUZpiUh`k=31#;8kH|4b&W`05Lbne2P_gduq6SFBbN5J~<<1BvUO$@qVqN1Z$a-7Z& zMaA0NlsHkro_M@KR50}vGb1Wu?(S(fuRIQVcoAkAT`}a(5HR|V=bfj~dG#`in?y%k zv*4Y{U=mT*&`H5Rvk*z#qHt~)A%xY-F})5>7ZuEd*J5b4C9Xe;zM!Z}mO0XOdZ&b$ z5++Md^$zI6Fazo!MWhzMdM#2=C)8XVJ%n0kKo&DuwKaq8J5VoJwR%eG$T-kNco!7` z9vXooeue&!(&Glt{9(IwuJSoq5Ioka%DJvI?;)DI@aW zE~B0^4=Nxmf(H~qk&E(21x++VDo^GZ>N*|HtNgJ3AhbFZ^46V?2@uiBSWC^2JF^0M zB)8-=;*lgDGyX0hD}lEpUxUhPM`K*xSvH&pvqh#fL+5^p8}`-^kZVLQIDmW5Ud-9m za_1Dh&fy7RkZB1aB92T*MNWa5a2hm&xB~hDZh2Hs!HQ1u)s7SXV8mzyHyJ)nYIrHQ z%u4|9F8_Yapyict|8LB^)61A$Ru)Cg*g`H;c&v$V6SGbDnlA_qjS-1F93c8GD(f70 zY`3tOo2?>NePQS{mV{Ii3}JL;f1Xu@Ry)-e_bwr64YO_N~6*0Qf zwN>~qItS&VKIjM;R%q4C3hw4{Kd(+09PeU$tN>rZxjKek?vTP_$~KWgAf?82vgUXu z69^`pYdVB+?ey~GRX??Ybab8XY$4nh-s;ZFu<@k z%(tP8rVH>3B}^$vMACpPr`_s&kQvk<>l7W|#7tysvI%Zjx+cRx46q`l$uI@+l`&Rk z8O{ELxB}{l0d91$%{bOO3ft6g0zJodX9+V)!y_2*=)o+(?nq?EbQ8Cm6!{W{mqu=* zdm8N-ZEuwAFmR)R$%Z19@KdECl-=mc)_ssR(u;dn?_Zi-47qV0Wd z(9qGTR;5@wZACB}R=!e(;!ANfaEaQU#$90Cb4nTq{ zm|KBw1)deh69j#Qn6?N1Hf^F;76IKJV@xraX0F3Kf&8jKASWJ~d5nRSi7=yic_MYp8WJ^2jRb;_JMoh7eOc5=Y?h#n*j@Yl5AxYqzmy}8!%$DHiRb;8L zUKPVShR|*Bn%i+y_Zfq0^mdFMzVa)JGGUn%l(vs*m?}hHPQHKG9jL#`)3=c?Z?&>Z zco1BaD|Ft)ZvUb>;3l}5FuMKtM`Dh$8qKK^LoQPT21_o0H&mII@T<|oehEOASgJ9H zr}LNop{0gc9#avLdTF1|^J;#hkF+Ed)}&O!95p&3&jgPdz`$U|ArTQhV)2}NMk#7aTP936VI17tUPL$A@1B;N!1I$QtS1Y=A z**&A9DHCwEXPNBAt1qYmPQ>uBYy5-Wp|_;claf8~g(QC*z;8Y?qvrP#d7W7H5&??^ ziMusXp5&{NNH~=-UH!6YLxm89ta@hU``fx#!K94I1;r(r62nC_;jFU4c7rM2ky{E0 z=SQ=SDuUG>xAa2P$iyB3ds7;9>IdBokjzfl71f|75JGs?8v!&=BMHD*@BP=~= z7YEn1v{};dd+HHe(nl@tGxaQk`JH!JRdt0y!)%kEs9~d{hM5Bd4|E4*22;Tu%bg7Yiu zE;p8q;B}vY-wtFT9Mx)-h8n{kZHR)W?%A35=bZ|5NM@6GVb&ByFv<=H!cmoG?nmp> z`Kl~KEMf^h-mB5(AnCQ(LIe@QIieUmC@6kwMqXSa?Hoqux^K*>#Hjed{u}%@h%ts3 zf-%Hn^5q*^g6x>PAonpF(>7*pRhpLO0mG>DEx3DjcxJ<3t0x>*S12PciLaSgQ7e-5 zS|Iv;mUDqXVC3SLa92!rDmEe=kznElt&VSX&PlJp+5C$bUu?I=MevvXI~d=QQFPGW zU5xIA{OBKt3To2v2k<}eQc|=8&$zg_wee;6m(}XTIs)q><03;E{VsyL8DnDpNepmf z4Aqno@7hG9M=uo+Tk!nxh(6P~DDiNl-Qv2&Fg4bIuc2ahmvMjD(#;GO+iMtIyM7;o zcL^Fglu@+Z1`oPw_OBwg+Ht4E4pk+xzrt=Wzb;656O4j0UDFWx{Ib~@tGHfD zUAhbcU1hOrd`H}=G*k}ZJ3L>Od{D9b8@RhMrB|wcxQm-|w4^<^r`$7AR?QLgco6h% zV{}`mm+XahRw^!Ee7~P=QTtda8T~pg$V$`dTe=bp1Jh^ym=fEweDqF^r&m%IAkkoE!PX}G1gu6UTZgOCnI+>FY z%3~NRRE13l?aac%3jt+9Bc8Qt2k!fr+1J7Cj$(|^;87=iKX*Z}&n{wYAJhBJ!5A*F$v%ss-b;8Bvzzd3 zs;16nI;Au7ANLwUbV4k)*w$hCC|;-qU+XvRah$F3P53tjW_{zl^*j0m-Y4pKd zW--=3GV?!#k9VkybM`;N_#+kb9bxQfN>9ZP+HK!|g1b*tZ1h)nf1NUC?iUR2&JiD5Z}U`R!o%kw)=GkA3{C%TfBrf1>bOWT9FK7qk) z=%NZ?HU_vr$}@<69Ps(tE$@8j~9e8;W_C;kjGO#8sHXJt8L4nywG*}&4~LO z{A24KL+ttW2mEk;{o(9~%jD(){sTTFx^+f0xbb&>MeZZwAJ2%t(5K&(&M(S+M0M?q z>Puny{+H(dzhv)!4NQIj>?5+_Gj5mv&X3W3M0?|m_N(~$ug|&kZ_Mp{M0xv+^2&+) z2AJN?`ER7{Kl_OKy^!R0?lw>OD_zG=kM{OA_W6rJ<0vd^?nHqL8bPKu{&>MAwT0#h+$u_n?l64s5K^DUH z6>22QS2x4iT+1R|shj7dQkA+%94EJuhs?u6-jlba>ePA8+f6DDC%r3;fhi!qAXQs{fE-RC#$qv^_x)L%!9{wTc;l0yLb1l`prVs z`}8aIn=7H}Q_bo(k%qr9kWP=ZUjJZ)NuRCV`Q+{gk3Lktxe*TAC#zrniTX{y@`*K6 zso#X_uRi>2W2JTKgN?@@derMi9?e|wAxk^f2w|C{deeDhu1$?Tf6&c`GZIL zgNJK<%MaI?d}QIn2cNdyd$4x5^}`Q7ZM}2%?gqU_*B&h2-T3tGO6$FcpR|7V>D|^l zTXff5zk6q4vGw7`+E$;e%|C42c=)Jw<-wu6E8j_R*#99^5$p|oz8(zOLW=w;`l z=~2tcpLmwmVMm9uy5JQqsfpt6J)6+=1s(CSskUcXeZ`yF3>P-bp=^Kn*_4hJbW2ue zyh1TNQ7ktwS259kR?z3N`l|-dN!jUmP4;L9OKa2Gc65(7u^lRGf5Fs-g0Azj=Y;II zHwCv#cOgmdSub0xc1CN{M{U?Skkznz+?$$@7V_Q9sPgi~oj!y)VF;woL7>ws^e6N4 zJL7bB6!bAKdnx3M9!VdyM4+t5l<@NNHHG;>W+-p!(oT!N*#Q`Cg+kUV+&fE`aBF*&z>t@cDxyCj(1^o``HEE;blkLX~(_k`KQmObsH*aq1}z5 z%i=X>J@-=SnXAiHC}{=?<%Bo0H2Z8umrr{I3{cR+UTL))eOA)&=e8%d^WX z#LMDRU%ihS%5z@o(zVQ`dbB*6(FeTTQVwAcdHKx&I8AuP&2s0nqMqeFX)dY0F)R#ETDlA2jkF1A}z7$?0{g^Hfv^%k}dKf9vUj8?8zXfdl*T9;!B zy5Cz|{o>i8&UwzX%1(xEE~(OzmA>5j?50*Fu^$tUWOez3m%SCbIj>6dika!@xIdvj zt!o{9mWxxqW$c;4$bME z^C`_Nv)&UeKrUzSDRYzPf$XyE-q7 zhP=|a@t(S?y2;DNjxpZE_+f8;zNQqPW6IfQ^P=XYm(4daYBPG;o6AQ^snd*3Ks!2z z)vt`#mg1*qg|28A-o})7U_p9fG{>~sVE+avjMF^9(7PpDJ;mlH~NJws$BaFpRwVl$Tk`Ch{MQ!EvO~{nT^mZdlB1CR}$s#IqmsD}J ztnf@y0xPP_^him6$@KS_8qQC$NUnS%pNjjO`^Wr#+IzXK(0Pw7@>e@wzxrAwiyVk16f7qkV7 zm#|F489k6b8pW@uAmpe~mNxjg-7YPao0yHxs5s>`WX?&JPLJD8Ua}3*Q|0JhZ+5%f zNZ2oVh3#@3+ursrY*Jb-khZ2bza%|vdikXdq#p3x`J`l}0dFFImULVm^(N-e@iO9N z`yrCm3+(cobhlQWURI^Gu(PP9*6hO8^FbK91e=zlEw(m!7$J5@;IK8dW@XnxrDauE z4y8*8n6OB^6q1t6E@!;dawNB`X4gW~%b`p`&8-bUZv?wVFj`JmlXRzb&73ZyJ9WsL zDuoNBP1LdGT1PVC$Il-__60`Y3OS`v2|cZ;EDBhBew-C^umQg)0{U=bqpf};U12$l zwx&=p(oKfa>A`>xW;2y#ct^jND}>-6wFoO!=xlZ?3DrJy7B+b#YIGJsXIZFrcuuKm zO7>T!<#1uyPN$_}K~EHhF|Y*EO~EW|+NHG+dT>fAT`EsNRtgbr?#~rvP+S|l+;V7k zQBAMesby}Qtls&I8O@%vtkN*Dw$8MjM+CV= zPQHZywR!I1JNRFtS6G}!fd@g7D}>~hFkNKeCnf!u()7$%#BASc&Om znC)X)wX^C0O(fnv#Cw~!fHuKr#_PI}YY+gsPFm>#UUdcCfgYeD#w6fzN2mC{>OiN+Sc{9f3?`oC66R2C;$Gw@w3+&QFJ4P^ub0s@d z2+eL47@Ppbgl5I-@Vzl+Re8CR%1nj`li9Tkuz4`0tMSQM@vcQ|xvg+!NDX?$<(nk! z2D%R6fOx%<_^rP7usSxI2*)Oi=yEK&pG8UvD*YYFZ-udqz-L3&5^_9VV~(8T_f zmn9@&W<1RL5LuRFV3KY~HrODKhDk}eWhn>S7{K zsob)iS+p++Qv~ny+C1xuZ>Q8v>(C`#?)7pVp-h{dI(zUL_0|x$$zCeA7|JZF`8B(^ zCTK4MDnx~c=5>|XfsM<*@R*ds1|@ZA%euCRx|E~0XJCyyRh!cd*L2M#y>o(W9Z4@* zB&bEnKLU5IAVWla!5ppBqOL+WVei@&3H<{U5V@uS59)~LbcNF?E8FrAO)hNRL57p) zjO?l?%_V(uL5GN6GO5a@Bz_xwQv%*jl3T3##R2E=K{jf_DD!yL!g5tfEU>65WyG9p0S+M5-_#i z90_>q1`|1=z+hWRi=>KBIRHtOjoIn5C1zF&$;-3z>RYr}vdOd{kw+sk%H zbzLH(_>&Y%B#lvzR5deKy_vO(xOUnrZmnP!@@h%)YMVE`b(gw-m^ykJ1aZ>KZ!MF5 z!(OVOa%np=`PuaL4JHsnz+>v~aW7x`kQq^mj>;75RG}<^YeT3^<%j)gJwiu=mrpnO zmOYx&C-VA?40>*9i7>!SXRFff;cVOE8IrT{T;v*HLmQUE%@N8>P*@SJv)Z4akA zR>e?gG>dj7K#3E;n2D|TcoLT>%Sl4*1Lgp9m~(=$@<9e~$crTv$WQ)Ox}($A5k(^- zC+7V2VRtRWp5m%O83Lk zrT>&STgrkY2E0pKQrsFiaP`qI>2w?)8OQ)4=eMeeP>^pYGeV?blIvlK6DX0pI7-Pi z!DPeL<-TWExe{1d=4hkDodu!~c?(+?X;0A>IN3qbBkI)vZLuNVzqLa9B<=IGn;Dmw z>7rdr-tS<;cFJoH?3^PJ9$}8l=8}i9QqdGjAGfn`l1gX;Hqh@%G zn7T&OVhUN296_FRN_M&cj#L*Unx@yR*{vKz!IE-TNOLYA&4VBt#WR3E+yj`4nr%j} z>Fo;!nPip$SypaM&27V&N-dLUx62nvg9Hcp&6?BJw3L(Qi!1|xuThAVw*m^dsA2a?5PL8rdmj!g;NA)whLhNiy5mz3&rGS=eMVzIYL~07FIe&5$ z1uk8-rnadzf1wj9cq$}7L%&?}F0EPQi#zm0PA3Z4VQU97I51#BrpkkCD%} zq+A&Q4=lGprBiE?N56_d5cP3?0zQT;g{#X;FOyP{MCw~%3q^nRkQ_p7ma`3YoNB(H zpU1q?wqo8*rY@_j;O*y&SUq&pz~=?QtjsR|*XFmEfi-{qw_OGfaxM4s-v9lRHubk_ zwR(3>-EL9QCtvH`=6mWtQl87rdX)ETJYQ7tGR(^)&jp@;IlkMxa*~%1c2C}Zex-a; zH|#d8Kkq6x>4Dwm53`J%=XrtWi&MPBdAY<>*6tqO?N~{bJA~NiX*%AaJwZFQ+qu4z zEqCg~Zu3W%7)bJ*=K10vFTK3X@?7HS(Q*3(FDq=nbDr(H*nVe%?a%Et|6-hx49|I< zFKT!Ze#Uve%k!7VcH7slmD}~v-IyLL$8_~>`$`Y(=H1ry@?^PH_cGxo9W8V~vsEMP zz2B+hck1|^cl=KUOMJO}_&=)mm3n`r949d}FH1gAifC)rF`Dum+ihKLAhuR$x6r=D zvw`Qz+y3_DI6*kK+jn=i+$TY~Tz-d+hTWdK@p2CXXQbl{9j(iACQ5tmjxjLyc85Q^ zQ(00%3lx4j5z-&^-K~ZCU?1z-q1R5-x6<81cdMT0fq~ZLTfDaH{vh82Yt^ZL~lObp21oAdw09G zKczpq+x)?&kO=Lz{$3B_wC%QkF@UsfyB%8tB;nTG*cZKI#SZ#K|L1mFKaVl5d$)aQ zi?+Sn@!1nG=WcwviuvXG{~M;p67RqSMF!I}NkYC`{t_u(W_LTbn}m&8k`@ z$8N{^Ed71d%USw+ch6kELOK|-ILeLZOwNqb}iR5L$Kw^%X8%x zW}KaW+Olqy&+2b=i+=p0(E2}{I{th9^q0bK@tVb_-aq^C*7@1-+CROb{!a8Gb$eUA zyRB*;ef1~$53@b?Oj1pCsIgY7kos$VJA8feuY1P?cmL7FKb##_xdAmkpz_12*r(>s z|Ivk=oUR(zVKDcs`A{&Yf7$+rLpjxzQ_VS*&Z%5Z<#W$Fc7`|%abzd~`Y*im zgOdL0Z&On0XIIicn^b={3Znf;y{lC1hcEtJ=$rhy8eJKC&NtOjK7M^Ox?<&5cJ4nP zmE*$hN8e1ZTbcFq&$+zK=$GMdrdO=YO3*Aj-(*(QG>iEpI<3p8Z}KbF=5?f;kFu^fAXBm^f4WWlFHnE0%4WW<(Y5BZmR-KJ|q=n@V1q? zz3K1T`OWBUm0x)RODK8g7vDH5Dz{$#=sAb|oc`tIZ}PXTQFt<&8Ya}}?LZ)!hQ(J& zpU405@U4j=|Ms_;Xy|7*(LWzm-_@QpzdQIyML$))Qo8)7`t`(yRoY0u;QoC=XI_^! z?1_!37ZY+-^?d7fZo{74$h|NZnxjm$OB;(!wI=kNcVACzvT~GWL{?60s?tiHm3(%3 zVZF|8SaTct#hf_&@aqyECU0328x3@%_}0v~pMQ4z_1t|c|LzQ3HuoeQuk#;Sb057} zd4ay?^v3JU_wA|sJL<({9h=hs=;?P+`+QWzqINbK?u|yyMyq>&rLy&EJgUa3)%l3Z zMAhg4HDasbs2Z|Ws#-Z=H5gU{RVo=({Snn?tKO*U4y#19>atb5T6I>ba}jmcRvi%) zt5WT?sx7QqZPgM{%@K9FN;O5)sgP=nsFPLdgsqNMtA?;T8dXOk>QGo6466gxs@_(0 zQB@mOHPtF=t4LH;*(y}4?66YL`(GE5*24J3@1nH_qxGG?QkL~y^hnjOlwGUBRjMkY zBKCLDWR2Nb8RjM|k4lvkK{VR1Sq7GN7Bh~6?jXDd_kb`QD;HEF8{?_xKYjP z*-b0AasGw58OKjnRB2-jS5UY@1A{6@ldPB1=kYN7;JoidznpkIx2f_B&Y2KA=ey0$ zecuPlpT3^m_+c&Hx$?u>7pH$hSX|edxD^oo{V!h6Z(7rv=U>dr{mIMl>-i09nr%(9 z?7W`dQ1fg{l9(sIyq?=2Ih7y62Fa=X5q@vYvN)%$Sy-Of_>nx#KiPKdCxfpVh2iU) zPej=3y7TqIiYnZC@&Z+neBgnk_5>azsm;7Dtf&Q=XmddZSFGukO`pNe*ZCDSxA6ou zC_dc(0)Eu&X89u+BH>+mE$MG_%x?(?#Nm0=%?HsJr(WkiRI{J{F!-)2-4AT>^%t+_ z$imF^zjG!bF+H$o^QJs zE~EDKjrSR~uj_K{>*A($ZKHho1s|%f>GBcZdr;)g1<^-IAK@Y`N>tl_9;3SS(7O5X z|A(j^d~s7-uen^ixvl0N*u*8K*;&0Qj`tUjy)A0i-~4SwZTM#|YX2gw{$BKn!5#Ig zb^+Y+t&cmt3UJ4_0q*!Jz#ZTExZ|q;cYN#P4!>D;zV&g(R{`$$HozSaGq~ehA9sA^ z=FGwdMNzsp8}9tgFRS#oRI*4RPSSt zs_&z%p*xyHcBESAA0I4?EgB?cM;RgT`G1!9z`P0#h zz0og^z6s#R%b&mxyr<@k4?kY|@Z*gSKkxtpKNu7U!Jxno97`aC?>oPoc;mwlOfQjm z&i9s``@ZSRpT6egyI~|76>-pA5cg6o!Ex!Z7gTjSoLw`tSoD1b)DS zfgf*t_#xT^e!TJFhtFW=8&VGN12q`<0Y3(Qz>vU?H$MFETf%|B57;yC;|;%zn|(a? zcJO^wS`B#r`inO{{0QVsA-BK}U;E{hua#HHKrNrW3E&4T8u)>50zZ5+?|g1nZ{G7) zzi=59_`#@wA8!Kq@iKrPZwgP;!$ZAtG9^`z*{?~&}riaUv~Cv?@AbT<#vJ-L?| zQ@PPzCO72t$lg$Ef!^d^Zd7H)rs+MDgRnDtj}4Bn!3{=R_rN~6(YGuQHD9E+$52ZB zh^bN5XvEAhnl@{+3q^ho1j}P{jK&euXL&>}W`@5W)8P@F-5ZL}vZi-0=pE6KF+GNu zms!)rXt|Z)Iis7gEF}49bstQwFI;}Ds@&KZqao3e zle)raC+v)}R_~1!)r8)uMprds`ug6`DVJ`?kkoxFisVq}P&`mKCK^l9dnAWBouq~o zMn68rnz6lHk-9PRHF+_Q3piu<89lr=bW$@~M$s%T_OKZHPVG7I4;em$aRwN^us2ae zE#-@%7x+13d?nfCGf;%B470Mnq#1g#_W+V!fW`olE;8C~ykSh3=0|6f_@eK1#=s&! zx=XTVU;Zns>GX{y24+oWZ|Iol`^FwXb)vWvLo1;%A$7*rit&c?Ohzks(4jzXaoj0- z59f5po^vLUyXhLFVm?ztjD~YMhq%6vh%&}T{WbkRn5^|3)|}o$g_+_HEXMZm}ZbpSUbdyASe|uqhY?5An!h*(nme5!u0^Md!vvK}WF(@{H zxf6MMQ@-)FPYG{JJsIk-S@zD5K4nOBW{Mg|C|-khY;TCa>@j|l$6t$S+~`Q2z;IgE8Lqsao_MoP zvG{;-!O;aqI|#irqdDJ;KE#Q*RQt@diuEvsYpwk*H~lU*{Vq5CE;s$Wxv9M6=g5Em z5d70m?xMD({YsSUQ<*_YmSi@EqUu8p>FpDELdk92bB3?7=Iq|kM3BD+S#trm=2yo3 zdqbT;@g7#0VSy)&Io-173_7fF_lCNCsFCSYxlX}Z6eNn+@L4kF)xEI^H8HVs9PaAJ z^z`1)>0o==K+-Mcg9357#N_V1Oj_mG*3`jn1Q}-oia{{|9E=XXEjdF?K1j(7(pzK= zFr;VC>Fi<6MZ^q{1^W!YEnd#xdyJlfxqkL5?u`Hrka$F@OBrNy+Al9cvQH$Tkfg}( z*O}b5m*H#UplnZ}0HmbjkeY+J0J;h5vWB0nQ}0js^~kEKQhc9kUlprOX z-`P@G2Y=95dZz)6ft+UdhK@-68r?HYNoD6R-N1LJFVov)dX2^?&Ydt7Y|s|~7ui4n z9CZ?tH2KBMFePS$(hz3MBM4#+2Spkq_X(N>i?~osF$z*kJM8zocP}SCASBrkG=0=B zz0#W&`~;c?c1#3lx^IC+9ecSnqk;xl1M7`}K%%jJdST-N8-2<~RX=#GtPunb*u@39 zgF2kXU^_?AO>|6O+8a6$I3~_KEIdOB$L~1Lw&T9WF4K!co@Ij|EUw&R^oS88Ee1o* zAt;6EePntE1)`kDVREPM$NPRundLc)@R-ri-P2>{^(P2)@D5YBXTjPu3N zp+N{vn?-%%fFL21+!(l}L|=hkjtr-Nq~ySt@V{}VyeK(Ha zYtzJY3u~|dPSf4Qns@hd6DptHIq)^V`pyxILrwE^pEH_4qhuwpZ#3=uQ$~{h|cc+Mq&HKUqA3y#)`i@{QKmN z|8Rf*^$)t<%F+J)Z;`_uNdD}C{2QhIB)Y9`52|+?RIUD6R}!mMtkC}|p+hk}U5VYB zeihRLl|=ghU4=@bO`aE+rQ%PMyjpSo-melX3^L7Sx;(R$gdSw9oM)Z9Oji;O^1M)q ze_|ybCSS$1&2X-gI3wMVZ49Pem!}Mv{fck*i$Ap!tNpCA7@lCA>YNk+Cpwa?JNEyB%x!jK39o9wqp0JzH#A5v91p) z?t#m!>!{4To9^+`On$G@GZLc9s>J41Vx{g?k3JjY514cjc?Z}IHv0np+vJIQ?yLCc z0|C3JXRInQ(#y1La0LqW>{wlO$74SC4zMWG7VLyW!h9F-W+!8dPJTnPbw<$&+XY#A7p0{!0sFGM*zD|m(N$?M+WK6qopd8nfN4vf?8&E zy|KeoprhGJVnAq#5qw<quC+-Tr*^1jB4t2xT z2aSX)A|XDpuOv91@dZm5PNof`>-$cStHiF^iL}wYzbKqYid*4GQ#$xIw6KdZ|RD~XR) z?8X^-q6vK|a2*2sdY~0!CkYL*$i75ll~^X67%*hSws>b^AkY!+?rTNZ7aA8UiF2YR z-vw}YUn_WJ-tSJF37#wBN|M1$yfDFJBrNh6xBXEjGQ&7*UpR5(MbsfV`l!gl}s} z*PrYwniSP1r17lwz#gk+9j?ifDb)kbDuL|u8mDu}a znjoyED)XauA|Vrw%%gz#WAcuWl5A`D<@WQ=c#wA{Q3}ddu^AG0Eve@OxjCjI;-axT zb+7orT1;3r-p17uFJY_N7D# z=VX|znq@wQ@Qc|vK`k9<*Hj7LeOLFjx*vBWvuf#Mzsvq~x6Y1}?Blw_)iE4FC9YE6 zWDNPB)>h>nuJNY5hl4n^b+t5=SvrH(!Z;U`cEkWg+~1VNg=;zOsy41}XPPapTB5 zl$4Yw>kOJGU9L&ZPJQNr-jh zIMWTYZho}ZFyFE#gmwKZutl zZHJtgDA+J4?6#U5U?k1SJW9HQpBQzMmpL&=>USnh>@b{T3+ZMnBX^-95;HJXar%RS zK;^QoU|faa^8xRuIwq{mvQ57sFBSigcv6k4hk$^QKxk2xd!i~fWjRzw!}1YP*=)&< zKau&OZ+qkyCX_}DDk2M*8n>dH%R(HZ^v#N{3`B+XxNwLw5aS{Og~ciD8`alN!W0x= zrMBbeYa?yeI0iI~cA#NA#@7zu-FFO>XS(+tYF|4*L=!ytGO)wpEffr~wsX3dX`}-(=$GO~ z{2?g{%%@;ds=4jN4=_DuEZ$;OoCYYmvGw%ef zi$?f|A~LDf#9WYJWAK(6WzsBCp~GMoZGAJWPk2 zWTa=LUN$xfK@_Z<4xzymTJ>EHEOoT8t)x6e4j;JiM(VPRQq&8W?k13!^X?bFK{17yUfd>1#yMQUuf zw&GwxC>ibEmPi#=@F3X&RwgU)_e80Jf7v?>qU|xZA~A~e{efUaGDn*~qs{Y`n3$OV ztstzN0qObX;9nyI85_p^sws*JIp>4mgI@0s*10U&^gUlZH7hD7l+aJDXfGTj&ZCuN zlVU=A#Y{*_sVCK369J4^-7ALOZXB}v^CVerN`#2lim>gHF}m*z(kq6wyT1(P`l%=W zu}IJcc94)#G5+t+qAY7e8)=DnQ`KabP}jPg1Ue*P_J8RoV&7!t_bRbR*1)`}76VeJ zdq!%rD^<*X$RQy7Dyw^ABGpqnHDhuU;BSOU(cF3slU6G+C;Wt*XZbdT58sFtB zxpg~!#Q3Cal$sfMl@cX#gcct`T|kYjk+7YTl+}-zW3J<{PzsS_9G87Bs>+#Z8;0u2 zCJqFns*)mE@V^dXWVP(*$2}vF?79V?{PTetBjSLqZ;OWH{?Cp-uu?M?4BHjGE;8GO z>!N1g+zL@DHn_)c=V;k6?ky-avWehlZZnvVh+`GD@T1|rC?qzG7ECD;hT~7fyKr#M z_riE?or4a+qf*5ne!$?9LSNXIt>P2~96>zRilvP6_!Z9X8wrVS`oz_XC|(TknU*CV zTY80EjU%Vb890PgeQz}-`hQS~jo7&rqb7a_BPvMEgkzlLQ&JH*As9n zI;v)mglLmI_I3k2A-8VDrh_B^JCwzyFnzudJ$^_dqlv>5l(OqjpcFzV5&J%o>nBal z378;jE`o5FLRLTK%C*X$M)5&|ld#i;O5}D9Ap=L|fBTqVkzl-AiCq+O1>-HiiIl)eS>nlvqw=L#``E$EUk`r4JXGr!n=#^$(qm^Vn>N|8- zMWeeURU2pL+cCqlzv3p!DPG1ZZsSFs-IU5Xo?X;~@-Q!> z9I9shfyOI56EdKA8TetKDeNb>8o<>7hC1S?0sh^@ezhkcLI!U?wOxb1IHIK95&%=X zoj9ZTLKFWPf~ac~Nud#g+=008TYH|@3~b6BxNsr4CbiV>r;9$R>uznBv0p&fim!|6 zPD&|r8^NRIdIGnK=@wUaiqu)Aj-XcCJt#F4?TGBQkDh7uFewzvi+&+4)u_ zAHQEjC1Uk+tO&)qN{b7laaLF^&^@lZUG|7&{H%`Kxf~f|B6cU`jh5VVoON}3W#oPN zp5gZNzZ%gtE-n{9aZb)se1$d@H?FxXLhX$OcI<@@%xk&kz(l+oDsG#M4OHT*mJ3$m zUjWEqnEdH-A7s>hmUB?Z1*69FpvVRlwoY}MvdRw)O;SI{{9wP%O8j!zZ4$I=xaLyF z?UYL$RwLQ8h@&g9bjUp-rfU|-jD|v@R#U22C(d#U&dT7ZV|M(JFjK{4$PxO^#C3J0 z|Kn=6sS9O9NjAsnZR#iQ#8>f`v&TxU%4@g8v>X5jTsipRZC&umT(rzw;;N;F<+xD{x;1W(8T{AtV11SGkSSfj{_3qUQt1 zpX9@d9S2^=B``=(ZDIMAXzn>lFKrU#EtUSy>)oD1=tKo)X!xk(RnT04XSLgs;FY6B z3%A*|Zeu4K(ZZsS)xh;CF%UZsXpO^!gq@L6*liRXMw;fD{5huDzX zkuu4F%;B~P36u2Vjh1U589=x1FsoYQx*qMDRdKTD`qD~$8lbZ08p@&&tY9!LA5F~pk7tcIJ&s%}6v^EN zePg>iF$ZmKT?}XD8sk8K%Bz_tJHw)R!ubKA!?<}eeo)#x{mZZ53EjiSOuj=^(MK&cdPWXKZlyQd}KN+&rl`KZI7AXC3=CMo?zVIN7ivWZTh*sGV*h- zH2h?Ob}ndBqRe&u9-?d`s#?hYs z#^B|47?YBEYeMV_ZCNi>`^&q1EefoJfy_Ht{{}sYj)4FG literal 0 HcmV?d00001 diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/joplin_entertainer.mid b/zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/joplin_entertainer.mid new file mode 100644 index 0000000000000000000000000000000000000000..7276e3f01a4382c30a48c1fe314aa8d337c3f9a7 GIT binary patch literal 9853 zcmeI0-%k`t5XW1&yIjmY7|(|dg14(YU_hCmo_G)$AcPGr5@e%1?w*oJG;rDQpl|Hl z%RR#U8~0Cm_m6R(s+pQ!u;2pWevJu!x4NsVtG``cUDGSgcW<3@-?%IMeO_sH-XneQ z4mZBKdbRScJ6s#MvAX9DCtTEZ^M*UDU2*Pk;AZpPW_59UceAtG-rC;mROO%hW8hbJ z@XD`rU-|A}1Ka?cU=v*Pz3v*gj=T=8BCmqW$je{@Y=CvJ4ldHa2reNnfeXkB;4|cB zpbz@s3^)TmrT-~7jXbS#Mdc~vDdZ>g^M^ghbTYgBN^Q=fJBzN_uA?Qs^p?BVRRPCk zoeJ(?#dpGjf;)KOyVpnxvTP^JD9ECFk5d)pNNB`oVNM~Q!Lu2lx8dW7;<;8cs;gni zYs{q}8v`U6F^x+J zIl^@XNkIZvqa)TNR3$W)yU5g)h|P+^C8t zp>&#N-ii*;5Ik+%S!cj5Lt_^8mlBB^F_-!)Ub!*Ks@Uv^RP^fc4ltZd;PeP8yU}5k ztskQAxQ9dQ+XzX1)+vz@!u&i(s}Ou|lO-z?fX@H#=77 z$nqtkLtn0-^Pl0WnR9->z8;<632O2v;9ijynLJ14BA$x9$qk-rlb_a z;FAAQNa0o}#LY>2Of*Pcr=a7+StKbt^L_E16<=8KjT6V>bKi+W3dM11tcOk8FWYz9 z@AJk@9V+Dfn7w(No6pErq}n`3Wvw)l_%%D`r}=FKxyjaV`o#V`>?&vpBNC2@FYq!K zaXp6wk#qDZsHQI$2&z)AE9dGFgQQfxkRzK-Ef;08Oarn*oWe}nDboOaNVxY*ExnJ= z`L2)uMjFr$Oi2Tm`02-vm7m;Y{a$`@_y5V=%GB?ChU;CRZTc&H8T@W6c^RDlq>q8Q z|Jy`yjptNUG7VSyFyRkUNcp#qsF+a<%DCNxquJ6jTx) zkg&mJmpx2*shDi~qbk42C)1kO?U$-Dyj<8XXaCsnD(^Zyta06xKaiGLtjd_+982YC zhpTvCFQukbcQs4Puf!Lth%To>Nl-`X4T9dZlV?GJ;);1D>JX}A6n9vtHVV!)kXz*7UanCKRIgBTplVB~;I9NDRX zHTv&@cTco?ykiyYR~T1eJb#H_cWA#udkqx(Rj>-$f(%C(7ZG9W5;?VFdL=;+6>a?S z1oeujUc?pkZ6k-6M4n8zAoG% zIW;U1*S(&EoOKjeW)=-?#$Nj7@xP1-@5mXn1@>CF_5aV3OPaD>ElJtUPW#RK&9~K` cGp{|zDmL1k&Zlaly|ugZp&ci8QM`8TFN@*RIRF3v literal 0 HcmV?d00001 diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/joplin_figleafrag.mid b/zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/joplin_figleafrag.mid new file mode 100644 index 0000000000000000000000000000000000000000..73f32b0f6f7ba402cb884f97d14c87793a1d6e5b GIT binary patch literal 24123 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 literal 0 HcmV?d00001 diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/joplin_wallstreetrag.mid b/zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/joplin_wallstreetrag.mid new file mode 100644 index 0000000000000000000000000000000000000000..3c312432acb5f3694285399d3c40e090b9cb0b70 GIT binary patch literal 21545 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 literal 0 HcmV?d00001 diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/jscape.mid b/zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/jscape.mid new file mode 100644 index 0000000000000000000000000000000000000000..fca43b97f898c440d7f2db264fe4df3f3bc31e58 GIT binary patch literal 9073 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 Vud7YC{lu!k?dR&R#+cOU{10*U+c*FK literal 0 HcmV?d00001 diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/just_wtv.mid b/zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/just_wtv.mid new file mode 100644 index 0000000000000000000000000000000000000000..ebd0a16e7575a1027f5e8863969e9cd47ad4a965 GIT binary patch literal 13403 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 literal 0 HcmV?d00001 diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/nite_wtv.mid b/zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/nite_wtv.mid new file mode 100644 index 0000000000000000000000000000000000000000..ade6b697fcea14a85823510bd8037610036aa2d7 GIT binary patch literal 27425 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 literal 0 HcmV?d00001 diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/oldshop.mid b/zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/oldshop.mid new file mode 100644 index 0000000000000000000000000000000000000000..a437cfc016f3543f2533fa17617255cbb3cd2e43 GIT binary patch literal 14103 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 literal 0 HcmV?d00001 diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/relief.mid b/zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/relief.mid new file mode 100644 index 0000000000000000000000000000000000000000..050a49ee01c4230cf488d6416cdaed59e164ad64 GIT binary patch literal 3798 zcmeHKO>bLO5Is)(5hqdlm8K4m)QjoEH>S6*q$O!%xpoXMw~f;nVxb6HS}V2EA;vY1 zC18P!6G5C60>h%J1PgvaOS`Dl4HOpq1$IDLuw%*2jGr5~3lyO)P%5%{qnSDP+_^_{ z=jzR6uU-M*hX+CYIhQT3h&O`fqSxCM>Ou3>?!K`pG_$^h#L-MNkD(3f>PNG?XW@fl zcsjSbil#qUxOT0yTFI3wxGB&u@ZIzH1qs{?RBvQIQyftk)T}iI6f1=TnqxM5H71EY zHck?ziO&#D*&HM8vav)sp!jWtfe4?9pj&axR`?{Xm=r>q$2EeA#}xLvOn!}*h2f^u|0NzMg1@`Mc^ae^?p z#ni58?R8-aD}GU-w_S(g7ZmooOaUzlaleh@JF2Fnjg1qXp78WaPXrBz7b;~gF5_09 zieIGzZngX2`|*3e&l3((4r0za#eftfi&q>N2T5nMkOYkQ!0DEcxKk^|0g0X#;8U}3 zW2&P_*GHmA;C%kQaB?}1#!Lp^iYARj2EWP48!_=kn?_2kT$uYy>(mfUL>ZA~MwG}P znSse5o!Km;U2#N=mOgGGo)JW?Bz{LF*+IyKHl+@v^Jr0R8Vpw8z*-_w^JGh7Yh7A@Cli>Cm7I3HO z_vw+&bw{Ih-DLo}O5YKse;1|iw3YsG@n?LQePc9>+H3!j+1%eL&HIg%<~MvbS6Rhf zsq7D_>~6cVpN7A}^)Zf(0Z;aoCrUr*+JCd-F8}r_?dr3u&-MyzpWOld^Y~*GZ#`DC zytMLAZ{e9+(S0Lx_?fn}|&;8N> literal 0 HcmV?d00001 diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/roadtrav.mid b/zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/roadtrav.mid new file mode 100644 index 0000000000000000000000000000000000000000..e6382aaf6d5a2a71619b3bca2f25c0ef725f5297 GIT binary patch literal 23529 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 J=(4Wi@L%(b(O>`o literal 0 HcmV?d00001 diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/shre_wtv.mid b/zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/shre_wtv.mid new file mode 100644 index 0000000000000000000000000000000000000000..85797144cdf9feda5da70633f0203628b5151d36 GIT binary patch literal 24242 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

gXL90q zeSiM55SAj53)t)5=_h`6U*qFG8^!z|S$pEU-t7OJQ={+}qe8}H+P&!KJZ^cSj5?W< zY)sr`)72OYxIZxQ4)dVCYBa~8I57=8l3W{1i{sBqUiWA&h4OHYRsfp#U9Wa9BV-bl zMUA!Iw7A*A1E3aX(s}4F>?`OV(oX33PM7j?ZWAXR%vGcLAHinotWbU@A{Eve6&ZZ9 z&v-@V$LyWyRn7g!#CQF57gF^Skv`cX`pv^RF zFIN5pq`GjCkC{>gPlv%5dCc>Slbb%J{k8 l!_mSr<5X@LKHr;nl6iIfUGKj7oOlK%|M304Z^wp0|39TAtndH; literal 0 HcmV?d00001 diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/stop.wav b/zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/stop.wav new file mode 100644 index 0000000000000000000000000000000000000000..0191f10ca38ccf677bb4f363758f7a2eb60ccaa0 GIT binary patch literal 572 zcmWIYbaOLdVqge&40BD(Em06*U|JO|I>2S5fad-$2y%D!Y65PNL$#z1ctU$qFClR)A%hmH|&DuQ9pqBpH8#LuE=s)rSxNj{P<=0+uheR|t&;s|1fLQU zA(moFA*O6Kjx&w7dnTDCwP%WHO4~MritUUy`R&!GnWo$MZB8@Fv|awTR`z~5{mq&& zZC5|8eojyS8D<(rEXkBaOxbE2VH#=oj53XCkE#$8Z!)OZ&UlmGj8&Wori5P0%*W(3 zqfFbxn;Dw1E`O)Lsu}zA;`+bq|EH$^ABNE#0qMpaVRh$b^Nx`GUfmIXo;falHe5pT z%Gc{j3=HGT7pQ>Lm0N2mOcK6bisH}5CH_(W+Fs@TYLg=KgQEDQc=yuh>V%bJ%IVvN z^2{;KwR`57=Cx;$X;IrYgNp5pH~H<=vrO4`ew)*bGHsW?t(CoBPJdN1>f0v6l+mXx z<(XlcY4==Yx~M%$J%zLxRBUIw$#1W|z_g&(GV?Jx%_!40@n(i*tjpi&uWH8b-mZVT z{&{M?e~oii|MPNA>M!2du2ti&Z0_uC)WRRtLFw1^9-EEN2nqN&dxGMy#AbkZ##Q9_193fk6Cu1fIr- z9pMdsP(V4~!UrXk3p%!hprm8Pj(EIwJK~glB8;(CBcHV9_fYmUzstY5cTWFS4ZHeL z_28ag)w^8(iR$5m{%Kqkx_+07LiY+^+e+S17lhxQxm!HC!21`lZ;fbr)ad@|)G%w{ zVOGOb4MhD?Gp31EUV6M*Sy+W+8Dv7MtHjQPQ$Tt1!m z!s+AmanJj|>1?k5bbeBtJ`cS<#tEQnrf~uYu2*)endk&?XYhzPL3oTfL)a&Nk?>Iu z@k@k{r-+wjdYbqxab}6f2u~8fOt?v$BpiH5JSTur;uV>mBEBTJH;JbSeZ-4|4~X-E zdz-i@fG3CxG6_W>xOL(w!T@oaAVl+ms}Xww7$km8CP}F*PWd!Tkd%b=po@5cAgRdf z5sx=lKe*wN{eP4_d^LLgr0*Lkoq=GpvQ^!UkH^ExJ692v&@CJ-T^?G(kUh>`9-2ML zZzGk*;qRx6)2FjCP9LX_t$^z%wkD>>>0_#4+fE-_6Vv1LG1ahbr;n|P>G_ZJIebG- Is(pQb14t3S+W-In literal 0 HcmV?d00001 diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/undr_wtv.mid b/zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/midi/undr_wtv.mid new file mode 100644 index 0000000000000000000000000000000000000000..d9eb58211cc5a1d5df0624462f23f6c65db96b1f GIT binary patch literal 28711 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

eJ|F^Gt?>~`5ZH@-^TR?U1IV#uQFF9N4&jNA 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 literal 0 HcmV?d00001 diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/music.jpg b/zefie_wtvp_minisrv/ServiceVault/wtv-music/demo/music.jpg new file mode 100644 index 0000000000000000000000000000000000000000..eb43257096b6e1632456992e25bc0c22bfcea820 GIT binary patch literal 8681 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 diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-tricks/go-offline.js b/zefie_wtvp_minisrv/ServiceVault/wtv-tricks/go-offline.js index f43dad67..4d108b25 100644 --- a/zefie_wtvp_minisrv/ServiceVault/wtv-tricks/go-offline.js +++ b/zefie_wtvp_minisrv/ServiceVault/wtv-tricks/go-offline.js @@ -9,8 +9,8 @@ wtv-service: reset // HackTV Homepage is default var url="file://Disk/Browser/Games/Games.html"; -if (query['url']) { - url = query['url']; +if (request_headers.query.url) { + url = request_headers.query.url; } data = ` @@ -33,8 +33,8 @@ if (window.location) {

` -if (query['title']) { - data += "Going offline and loading "+decodeURI(query['title'])+", please wait!"; +if (request_headers.query.title) { + data += "Going offline and loading " + decodeURI(request_headers.query.title)+", please wait!"; } else { data += "Please wait a moment."; } diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-update/sync.js b/zefie_wtvp_minisrv/ServiceVault/wtv-update/sync.js index 8be14f6b..36b4445f 100644 --- a/zefie_wtvp_minisrv/ServiceVault/wtv-update/sync.js +++ b/zefie_wtvp_minisrv/ServiceVault/wtv-update/sync.js @@ -1,13 +1,15 @@ +// todo: async (and make this work anyway) + var content_dir = service_dir + '/content/'; var diskmap_dir = content_dir + '/diskmaps/'; -if (initial_headers['post_data']) { - console.log(initial_headers['post_data'].toString('CryptoJS.enc.Latin1')) +if (request_headers.post_data) { + console.log(request_headers.post_data.toString('CryptoJS.enc.Latin1')) } -if (query['diskmap']) { - if (fs.lstatSync(diskmap_dir + query['diskmap'] + ".txt")) { - var diskmap_data = fs.readFileSync(diskmap_dir + query['diskmap'] + ".txt").toString(); +if (request_headers.query.diskmap) { + if (fs.lstatSync(diskmap_dir + request_headers.query.diskmap + ".txt")) { + var diskmap_data = fs.readFileSync(diskmap_dir + request_headers.query.diskmap + ".txt").toString(); // try to parse diskmap and get an accurate timestamp for webtv versioning // check all files in the diskmap and return the timestamp of the most recently modified diff --git a/zefie_wtvp_minisrv/app.js b/zefie_wtvp_minisrv/app.js index f87ec4cd..78fb52e8 100644 --- a/zefie_wtvp_minisrv/app.js +++ b/zefie_wtvp_minisrv/app.js @@ -10,8 +10,6 @@ const mime = require('mime-types'); const { crc16 } = require('easy-crc'); var WTVSec = require('./wtvsec.js'); -var zdebug = true; - var ports = []; var service_vault_dir = __dirname + "/ServiceVault"; @@ -58,20 +56,6 @@ function setSessionData(ssid, key, value) { ssid_data[ssid][key] = value; } - -function getFile(path, deps = false) { - var dir = null; - if (deps) dir = __dirname + "/ServiceDeps/"; - else dir = __dirname + "/ServiceVault/"; - if (fs.lstatSync(dir + path).isFile()) { - return fs.readFileSync(dir + path, { - encoding: null, - flags: 'r' - }); - } - return null; -} - function getFileExt(path) { return path.reverse().split(".")[0].reverse(); } @@ -112,7 +96,7 @@ function getConType(path) { async function processPath(socket, path, request_headers = new Array(), query = new Array(), service_name) { var headers, data = null; var request_is_direct_file = false; - var request_is_async_js = false; + var request_is_async = false; path = path.replace(/\\/g, "/"); try { try { @@ -126,9 +110,9 @@ async function processPath(socket, path, request_headers = new Array(), query = if (request_is_direct_file) { // file exists, read it and return it - console.log(" * Found " + path + " to handle request (Direct File Mode) [Socket " + socket.id +"]"); + if (!zquiet) console.log(" * Found " + path + " to handle request (Direct File Mode) [Socket " + socket.id +"]"); var contype = getConType(path); - request_is_async_js = true; + request_is_async = true; headers = "200 OK\n" headers += "Content-Type: " + contype; fs.readFile(path, null, function (err, data) { @@ -136,51 +120,50 @@ async function processPath(socket, path, request_headers = new Array(), query = }); } else if (fs.existsSync(path + ".txt")) { // raw text format, entire payload expected (headers and content) - console.log(" * Found " + path + ".txt to handle request (Raw TXT Mode) [Socket " + socket.id +"]"); - var file_raw = fs.readFileSync(path + ".txt").toString(); - if (file_raw.indexOf("\n\n") > 0) { - var file_raw_split = file_raw.split("\n\n"); - headers = file_raw_split[0]; - file_raw_split.shift(); - data = file_raw_split.join("\n"); - } else if (file_raw.indexOf("\r\n\r\n") > 0) { - var file_raw_split = file_raw.split("\r\n\r\n"); - headers = file_raw_split[0].replace(/\r/g, ""); - file_raw_split.shift(); - data = file_raw_split.join("\r\n"); - } else { - headers = fdat; - } - } else if (fs.existsSync(path + ".async.js")) { - // asynchronous js scripting, process with vars, must manually call sendToClient(socket, headers, data); - // (hint: socket is already defined) - // loaded script will have r/w access to any JavaScript vars this function does. - // any query args are in an array named 'query' - request_is_async_js = true; - console.log(" * Found " + path + ".async.js to handle request (Async JS Interpreter mode) [Socket " + socket.id + "]"); - // expose var service_dir for script path to the root of the wtv-service - var service_dir = service_vault_dir.replace(/\\/g, "/") + "/" + service_name; - socket_session_data[socket.id].starttime = Math.floor(new Date().getTime() / 1000); - fs.readFile(path + ".async.js", "utf-8", function (err, data) { - eval(data); + if (!zquiet) console.log(" * Found " + path + ".txt to handle request (Raw TXT Mode) [Socket " + socket.id + "]"); + request_is_async = true; + fs.readFile(path + ".txt", 'Utf-8', function (err, file_raw) { + if (file_raw.indexOf("\n\n") > 0) { + // split headers and data by newline (unix format) + var file_raw_split = file_raw.split("\n\n"); + headers = file_raw_split[0]; + file_raw_split.shift(); + data = file_raw_split.join("\n"); + } else if (file_raw.indexOf("\r\n\r\n") > 0) { + // split headers and data by carrage return + newline (windows format) + var file_raw_split = file_raw.split("\r\n\r\n"); + headers = file_raw_split[0].replace(/\r/g, ""); + file_raw_split.shift(); + data = file_raw_split.join("\r\n"); + } else { + // couldn't find two line breaks, assume entire file is just headers + headers = file_raw; + data = ''; + } + sendToClient(socket, headers, data); }); } else if (fs.existsSync(path + ".js")) { // synchronous js scripting, process with vars, must set 'headers' and 'data' appropriately. // loaded script will have r/w access to any JavaScript vars this function does. - // any query args are in an array named 'query' - console.log(" * Found " + path + ".js to handle request (JS Interpreter mode) [Socket " + socket.id + "]"); + // request headers are in an array named `request_headers`. + // Query arguments in `request_headers.query` + if (!zquiet) console.log(" * Found " + path + ".js to handle request (JS Interpreter mode) [Socket " + socket.id + "]"); // expose var service_dir for script path to the root of the wtv-service var service_dir = service_vault_dir.replace(/\\/g, "/") + "/" + service_name; socket_session_data[socket.id].starttime = Math.floor(new Date().getTime() / 1000); var jscript_eval = fs.readFileSync(path + ".js").toString(); eval(jscript_eval); + if (request_is_async && !zquiet) console.log(" * Script requested Asynchronous mode"); } else if (fs.existsSync(path + ".html")) { // Standard HTML with no headers, WTV Style - console.log(" * Found " + path + ".html to handle request (HTML Mode) [Socket " + socket.id +"]"); - data = fs.readFileSync(path + ".html").toString(); + if (!zquiet) console.log(" * Found " + path + ".html to handle request (HTML Mode) [Socket " + socket.id +"]"); + request_is_async = true; headers = "200 OK\n" headers += "Content-Type: text/html" + fs.readFile(path + ".html", null, function (err, data) { + sendToClient(socket, headers, data); + }); } else { var errpage = doErrorPage(404); headers = errpage[0]; @@ -190,7 +173,7 @@ async function processPath(socket, path, request_headers = new Array(), query = // 'headers' and 'data' should both be set with content by this point! - if (headers == null && !request_is_async_js) { + if (headers == null && !request_is_async) { var errpage = doErrorPage(400); headers = errpage[0]; data = errpage[1]; @@ -204,59 +187,82 @@ async function processPath(socket, path, request_headers = new Array(), query = var errpage = doErrorPage(400); headers = errpage[0]; data = errpage[1] + "

The interpreter said:
" + e.toString() + "
"; - console.log(e); + console.log(" * Scripting error:",e); } - if (!request_is_async_js) { + if (!request_is_async) { sendToClient(socket, headers, data); } } +function processSSID(obj) { + if (services_configured.config.hide_ssid_in_logs) { + if (typeof (obj) == "string") { + if (obj.substr(0, 8) == "MSTVSIMU") { + return obj.substr(0, 10) + ('*').repeat(10) + obj.substr(20); + } else { + return obj.substr(0, 6) + ('*').repeat(9); + } + } else { + if (obj["wtv-client-serial-number"]) { + var ssid = obj["wtv-client-serial-number"]; + if (ssid.substr(0, 8) == "MSTVSIMU") { + obj["wtv-client-serial-number"] = ssid.substr(0, 10) + ('*').repeat(10) + ssid.substr(20); + } else { + obj["wtv-client-serial-number"] = ssid.substr(0, 6) + ('*').repeat(9); + } + } + return obj; + } + } else { + return obj; + } +} + async function processURL(socket, request_headers) { if (request_headers === null) { return; } var shortURL, headers, data = ""; - var query = new Array(); - if (request_headers['request_url']) { - if (request_headers['request_url'].indexOf('?') >= 0) { - shortURL = request_headers['request_url'].split('?')[0]; - var qraw = request_headers['request_url'].split('?')[1]; + request_headers.query = new Array(); + if (request_headers.request_url) { + if (request_headers.request_url.indexOf('?') >= 0) { + shortURL = request_headers.request_url.split('?')[0]; + var qraw = request_headers.request_url.split('?')[1]; if (qraw.length > 0) { qraw = qraw.split("&"); for (let i = 0; i < qraw.length; i++) { var k = qraw[i].split("=")[0]; if (k) { - query[k] = qraw[i].split("=")[1]; + request_headers.query[k] = qraw[i].split("=")[1]; } } - console.log(" * Request query:", query); } } else { - shortURL = request_headers['request_url']; + shortURL = request_headers.request_url; } if (shortURL.indexOf(':/') >= 0 && shortURL.indexOf('://') < 0) { var ssid = socket_session_data[socket.id].ssid; if (ssid == null) { - ssid = request_headers['wtv-client-serial-number']; + ssid = request_headers["wtv-client-serial-number"]; } var reqverb = "Request"; - if (request_headers['encrypted'] || request_headers['secure']) { + if (request_headers.encrypted || request_headers.secure) { reqverb = "Encrypted " + reqverb; } - if (request_headers['psuedo-encryption']) { + if (request_headers.psuedo_encryption) { reqverb = "Psuedo-encrypted " + reqverb; } if (ssid != null) { - console.log(" * " + reqverb + " for " + request_headers['request_url'] + " from WebTV SSID " + ssid, 'on', socket.id); + console.log(" * " + reqverb + " for " + request_headers.request_url + " from WebTV SSID " + (await processSSID(ssid)), 'on', socket.id); } else { - console.log(" * " + reqverb + " for " + request_headers['request_url'], 'on', socket.id); + console.log(" * " + reqverb + " for " + request_headers.request_url, 'on', socket.id); } // assume webtv since there is a :/ in the GET var service_name = shortURL.split(':/')[0]; var urlToPath = service_vault_dir.replace(/\\/g, "/") + "/" + service_name + "/" + shortURL.split(':/')[1]; - console.log(" * Incoming headers on socket ID", socket.id, request_headers); - processPath(socket, urlToPath, request_headers, query, service_name); + if (zshowheaders) console.log(" * Incoming headers on socket ID", socket.id, (await processSSID(request_headers))); + processPath(socket, urlToPath, request_headers, request_headers.query, service_name); } else if (shortURL.indexOf('http://') >= 0 || shortURL.indexOf('https://') >= 0) { doHTTPProxy(socket, request_headers); } else { @@ -271,8 +277,8 @@ async function processURL(socket, request_headers) { } async function doHTTPProxy(socket, request_headers) { - console.log(socket.id, request_headers); - var request_type = request_headers['request'].indexOf('https://') ? 'http' : 'https' + if (zshowheaders) console.log("HTTP Proxy: Client Request Headers on socket ID",socket.id, request_headers); + var request_type = request_headers.request.indexOf('https://') ? 'http' : 'https' switch (request_type) { case "https": var proxy_agent = https; @@ -283,41 +289,41 @@ async function doHTTPProxy(socket, request_headers) { } var request_data = new Array(); - request_data['method'] = request_headers['request'].split(' ')[0]; - var request_url_split = request_headers['request'].split(' ')[1].split('/'); - request_data['host'] = request_url_split[2]; - if (request_data['host'].indexOf(':') > 0) { - request_data['port'] = request_data['host'].split(':')[1]; - request_data['host'] = request_data['host'].split(':')[0]; + request_data.method = request_headers.request.split(' ')[0]; + var request_url_split = request_headers.request.split(' ')[1].split('/'); + request_data.host = request_url_split[2]; + if (request_data.host.indexOf(':') > 0) { + request_data.port = request_data.host.split(':')[1]; + request_data.host = request_data.host.split(':')[0]; } else { - if (request_type === 'https') request_data['port'] = 443; - else request_data['port'] = 80; + if (request_type === 'https') request_data.port = 443; + else request_data.port = 80; } for (var i = 0; i < 3; i++) request_url_split.shift(); - request_data['path'] = "/" + request_url_split.join('/'); + request_data.path = "/" + request_url_split.join('/'); - if (request_data['method'] && request_data['host'] && request_data['path']) { + if (request_data.method && request_data.host && request_data.path) { var options = { - host: request_data['host'], - port: request_data['port'], - path: request_data['path'], - method: request_data['method'], + host: request_data.host, + port: request_data.port, + path: request_data.path, + method: request_data.method, headers: { - "User-Agent": request_headers['User-Agent'] || "WebTV" + "User-Agent": request_headers["User-Agent"] || "WebTV" } } - if (request_headers['post_data']) { - if (request_headers['Content-type']) options.headers['Content-type'] = request_headers['Content-type']; - if (request_headers['Content-length']) options.headers['Content-length'] = request_headers['Content-length']; + if (request_headers.post_data) { + if (request_headers["Content-type"]) options.headers["Content-type"] = request_headers["Content-type"]; + if (request_headers["Content-length"]) options.headers["Content-length"] = request_headers["Content-length"]; } if (services_configured.services[request_type].use_external_proxy && services_configured.services[request_type].external_proxy_port) { options.host = services_configured.services[request_type].external_proxy_host; options.port = services_configured.services[request_type].external_proxy_port; - options.path = request_headers['request'].split(' ')[1]; - options.headers['Host'] = request_data['host']; + options.path = request_headers.request.split(' ')[1]; + options.headers.Host = request_data.host; } const req = proxy_agent.request(options, function (res) { var data = []; @@ -333,19 +339,19 @@ async function doHTTPProxy(socket, request_headers) { res.on('end', function () { var data_hex = Buffer.concat(data).toString('hex'); - console.log(` * Proxy Request ${request_type.toUpperCase()} ${res.statusCode} for ${request_headers['request']}`) + console.log(` * Proxy Request ${request_type.toUpperCase()} ${res.statusCode} for ${request_headers.request}`) var headers = new Array(); - headers['http_response'] = res.statusCode + " " + res.statusMessage; - headers['wtv-connection-close'] = false; - if (res.headers['server']) headers['Server'] = res.headers['server']; - if (res.headers['connection']) headers['Connection'] = res.headers['connection'] == "close" ? "Keep-Alive" : "Close"; - if (res.headers['date']) headers['Date'] = res.headers['date']; - if (res.headers['content-type']) headers['Content-type'] = res.headers['content-type']; - if (res.headers['cookie']) headers['Cookie'] = res.headers['cookie']; + headers.http_response = res.statusCode + " " + res.statusMessage; + headers["wtv-connection-close"] = false; + if (res.headers.server) headers.Server = res.headers.server; + if (res.headers.connection) headers.Connection = res.headers.connection == "close" ? "Keep-Alive" : "Close"; + if (res.headers.date) headers.Date = res.headers.date; + if (res.headers["content-type"]) headers["Content-type"] = res.headers["content-type"]; + if (res.headers.cookie) headers.Cookie = res.headers.cookie; // content-length is best auto-calculated - //if (res.headers['content-length']) headers['Content-Length'] = res.headers['content-length']; - if (res.headers['vary']) headers['Vary'] = res.headers['vary']; - if (res.headers['location']) headers['Location'] = res.headers['location']; + //if (res.headers["content-length"]) headers["Content-Length"] = res.headers["content-length"]; + if (res.headers.vary) headers.Vary = res.headers.vary; + if (res.headers.location) headers.Location = res.headers.location; if (data_hex.substring(0, 8) == "0d0a0d0a") data_hex = data_hex.substring(8); if (data_hex.substring(0, 4) == "0a0a") data_hex = data_hex.substring(4); sendToClient(socket, headers, Buffer.from(data_hex,'hex')); @@ -362,8 +368,8 @@ async function doHTTPProxy(socket, request_headers) { data = errpage[1]; sendToClient(socket, headers, data); });; - if (request_headers['post_data']) { - req.write(Buffer.from(request_headers['post_data'].toString(CryptoJS.enc.Hex), 'hex'), function () { + if (request_headers.post_data) { + req.write(Buffer.from(request_headers.post_data.toString(CryptoJS.enc.Hex), 'hex'), function () { req.end(); }); } else { @@ -378,13 +384,13 @@ async function headerStringToObj(headers, response = false) { var headers_obj_pre = headers.split("\n"); headers_obj_pre.forEach(function (d) { if (/^SECURE ON/.test(d) && !response) { - headers_obj['secure'] = true; + headers_obj.secure = true; //socket_session_data[socket.id].secure_headers = true; } else if (/^([0-9]{3}) $/.test(d.substring(0, 4)) && response) { - headers_obj['http_response'] = d.replace("\r", ""); + headers_obj.http_response = d.replace("\r", ""); } else if (/^(GET |PUT |POST)$/.test(d.substring(0, 4)) && !response) { - headers_obj['request'] = d.replace("\r", ""); - headers_obj['request_url'] = decodeURI(d.split(' ')[1]).replace("\r", ""); + headers_obj.request = d.replace("\r", ""); + headers_obj.request_url = decodeURI(d.split(' ')[1]).replace("\r", ""); } else if (d.indexOf(":") > 0) { var d_split = d.split(':'); var header_name = d_split[0]; @@ -405,14 +411,15 @@ async function headerStringToObj(headers, response = false) { async function sendToClient(socket, headers_obj, data) { var headers = ""; + if (typeof (data) === 'undefined') data = ''; if (typeof (headers_obj) === 'string') { // string to header object headers_obj = await headerStringToObj(headers_obj, true); } // add Connection header if missing, default to Keep-Alive - if (!headers_obj['Connection']) { - headers_obj['Connection'] = "Keep-Alive"; + if (!headers_obj.Connection) { + headers_obj.Connection = "Keep-Alive"; headers_obj = moveObjectElement('Connection', 'http_response', headers_obj); } @@ -424,26 +431,35 @@ async function sendToClient(socket, headers_obj, data) { } else if (typeof data.byteLength !== 'undefined') { clen = data.byteLength; } - headers_obj['wtv-encrypted'] = 'true'; + headers_obj["wtv-encrypted"] = 'true'; headers_obj = moveObjectElement('wtv-encrypted', 'Connection', headers_obj); - if (clen > 0) { - console.log(" * Encrypting response to client ...") + if (clen > 0 && socket_session_data[socket.id].wtvsec) { + if (!zquiet) console.log(" * Encrypting response to client ...") var enc_data = socket_session_data[socket.id].wtvsec.Encrypt(1, data); data = enc_data; } } - // set content-length after encryption - if (!headers_obj["Content-length"] && !headers_obj["Content-Length"]) { - if (typeof data.length !== 'undefined') { - headers_obj['Content-Length'] = data.length; - } else if (typeof data.byteLength !== 'undefined') { - headers_obj['Content-Length'] = data.byteLength; - } + // fix captialization + if (headers_obj["Content-length"]) { + delete headers_obj["Content-length"]; } + if (headers_obj["Content-type"]) { + headers_obj["Content-Type"] = headers_obj["Content-type"]; + delete headers_obj["Content-type"]; + } + + // calculate content length + if (typeof data.length !== 'undefined') { + headers_obj["Content-Length"] = data.length; + } else if (typeof data.byteLength !== 'undefined') { + headers_obj["Content-Length"] = data.byteLength; + } + + // header object to string - console.log(" * Outgoing headers on socket ID", socket.id, headers_obj); + if (zshowheaders) console.log(" * Outgoing headers on socket ID", socket.id, headers_obj); Object.keys(headers_obj).forEach(function (k) { if (k == "http_response") { headers += headers_obj[k] + "\r\n"; @@ -464,18 +480,21 @@ async function sendToClient(socket, headers_obj, data) { toClient = headers + "\n" + data; socket.write(toClient); } else if (typeof data == 'object') { + if (zquiet) var verbosity_mod = (headers_obj["wtv-encrypted"] == 'true') ? " encrypted response" : ""; if (socket_session_data[socket.id].secure_headers == true) { // encrypt headers + if (zquiet)verbosity_mod += " with encrypted headers"; var enc_headers = socket_session_data[socket.id].wtvsec.Encrypt(1, headers + "\n"); socket.write(new Uint8Array(concatArrayBuffer(enc_headers, data))); } else { socket.write(new Uint8Array(concatArrayBuffer(Buffer.from(headers + "\n"), data))); } + if (zquiet) console.log(" * Sent" + verbosity_mod + " " + headers_obj.http_response + " to client (Content-Type:", headers_obj['Content-Type'], "~", headers_obj['Content-Length'], "bytes)"); } socket_session_data[socket.id].buffer = null; if (socket_session_data[socket.id].close_me) socket.end(); - if (headers_obj['Connection']) { - if (headers_obj['Connection'].toLowerCase() == "close" && !headers['wtv-connection-close'] == "false") { + if (headers_obj["Connection"]) { + if (headers_obj["Connection"].toLowerCase() == "close" && !headers["wtv-connection-close"] == "false") { socket.destroy(); } } @@ -511,17 +530,12 @@ function moveObjectElement(currentKey, afterKey, obj) { if (next !== -1) return result; else return obj; } -function headersAreStandard(string, verbose) { +function headersAreStandard(string, verbose = false) { // the test will see the binary compressed/enrypted data as ASCII, so a generic "isAscii" // is not suffuicent. This checks for characters expected in unecrypted headers, and returns // true only if every character in the string matches the regex. Once we know the string is binary // we can better process it with the raw base64 data in processRequest() below. - var test = /^([A-Za-z0-9\+\/\=\-\.\,\ \"\;\:\?\&\r\n\(\)\%\<\>\_]{8,})$/.test(string); - if (verbose) { - if (zdebug) console.log(" # Request is ascii: " + test); - if (zdebug) console.log(" # Request is SECURE ON: " + /^SECURE ON/.test(string)); - } - return test; + return /^([A-Za-z0-9\+\/\=\-\.\,\ \"\;\:\?\&\r\n\(\)\%\<\>\_]{8,})$/.test(string); } async function processRequest(socket, data_hex, returnHeadersBeforeSecure = false, encryptedRequest = false) { @@ -545,7 +559,7 @@ async function processRequest(socket, data_hex, returnHeadersBeforeSecure = fals if (socket_session_data[socket.id].secure != true) { // first time so reroll sessions if (zdebug) console.log(" # [ UNEXPECTED BINARY BLOCK ] First sign of encryption, re-creating RC4 sessions for socket id", socket.id); - socket_session_data[socket.id].wtvsec = new WTVSec(); + socket_session_data[socket.id].wtvsec = new WTVSec(1,zdebug); socket_session_data[socket.id].wtvsec.IssueChallenge(); socket_session_data[socket.id].wtvsec.SecureOn(); socket_session_data[socket.id].secure = true; @@ -554,7 +568,7 @@ async function processRequest(socket, data_hex, returnHeadersBeforeSecure = fals if (enc_data.sigBytes > 0) { var dec_data = CryptoJS.lib.WordArray.create(socket_session_data[socket.id].wtvsec.Decrypt(0, enc_data)); var secure_headers = await processRequest(socket, dec_data.toString(CryptoJS.enc.Hex), true, true); - headers['encrypted'] = true; + headers.encrypted = true; Object.keys(secure_headers).forEach(function (k, v) { headers[k] = secure_headers[k]; }); @@ -562,19 +576,19 @@ async function processRequest(socket, data_hex, returnHeadersBeforeSecure = fals } } - if (headers['wtv-client-serial-number'] != null) { - socket_session_data[socket.id].ssid = headers['wtv-client-serial-number']; + if (headers["wtv-client-serial-number"] != null) { + socket_session_data[socket.id].ssid = headers["wtv-client-serial-number"]; } - if (headers['wtv-client-rom-type'] != null) { + if (headers["wtv-client-rom-type"] != null) { if (socket_session_data[socket.id].ssid) { - setSessionData(socket_session_data[socket.id].ssid, 'wtv-client-rom-type', headers['wtv-client-rom-type']); + setSessionData(socket_session_data[socket.id].ssid, "wtv-client-rom-type", headers["wtv-client-rom-type"]); } } - if (headers['wtv-incarnation'] != null) { + if (headers["wtv-incarnation"] != null) { if (socket_session_data[socket.id].wtvsec) { - socket_session_data[socket.id].wtvsec.set_incarnation(headers['wtv-incarnation']); + socket_session_data[socket.id].wtvsec.set_incarnation(headers["wtv-incarnation"]); } else { - setSessionData(socket_session_data[socket.id].ssid, 'incarnation', headers['wtv-incarnation']) + setSessionData(socket_session_data[socket.id].ssid, "incarnation", headers["wtv-incarnation"]) } } @@ -583,15 +597,16 @@ async function processRequest(socket, data_hex, returnHeadersBeforeSecure = fals return headers; } - if (headers['secure'] === true) { + if (headers.secure === true) { if (!socket_session_data[socket.id].wtvsec) { - console.log(" * Starting new WTVSec instance on socket", socket.id); - socket_session_data[socket.id].wtvsec = new WTVSec(); - socket_session_data[socket.id].wtvsec.DecodeTicket(headers['wtv-ticket']); - socket_session_data[socket.id].wtvsec.ticket_b64 = headers['wtv-ticket']; - if (getSessionData(socket_session_data[socket.id].ssid, 'incarnation')) { - socket_session_data[socket.id].wtvsec.incarnation = getSessionData(socket_session_data[socket.id].ssid, 'incarnation'); + if (!zquiet) console.log(" * Starting new WTVSec instance on socket", socket.id); + if (getSessionData(socket_session_data[socket.id].ssid, "incarnation")) { + socket_session_data[socket.id].wtvsec = new WTVSec(getSessionData(socket_session_data[socket.id].ssid, "incarnation"), zdebug); + } else { + socket_session_data[socket.id].wtvsec = new WTVSec(1, zdebug); } + socket_session_data[socket.id].wtvsec.DecodeTicket(headers["wtv-ticket"]); + socket_session_data[socket.id].wtvsec.ticket_b64 = headers["wtv-ticket"]; socket_session_data[socket.id].wtvsec.SecureOn(); } if (socket_session_data[socket.id].secure != true) { @@ -599,7 +614,7 @@ async function processRequest(socket, data_hex, returnHeadersBeforeSecure = fals if (zdebug) console.log(" # [ SECURE ON BLOCK (" + socket.id + ")]"); socket_session_data[socket.id].secure = true; } - if (!headers['request_url']) { + if (!headers.request_url) { if (data_hex.indexOf("0d0a0d0a")) { // \r\n\r\n @@ -614,7 +629,7 @@ async function processRequest(socket, data_hex, returnHeadersBeforeSecure = fals // some builds (like our targeted 3833), send SECURE ON but then unencrypted headers if (zdebug) console.log(" # Psuedo-encrypted Request (SECURE ON)", "on", socket.id); // don't actually encrypt output - headers['psuedo-encryption'] = true; + headers.psuedo_encryption = true; setSessionData(socket_session_data[socket.id].ssid, 'box-does-psuedo-encryption', true); socket_session_data[socket.id].secure = false; var secure_headers = await processRequest(socket, enc_data.toString(CryptoJS.enc.Hex), true); @@ -633,18 +648,22 @@ async function processRequest(socket, data_hex, returnHeadersBeforeSecure = fals } } headers = await checkForPostData(socket, headers, data, data_hex); - if (!headers['request_url']) { + if (!headers.request_url) { // still no url, likely lost encryption stream, tell client to relog +/* socket_session_data[socket.id].secure = false; - headers = `200 OK + headers = `300 OK Connection: Keep-Alive Expires: Wed, 09 Oct 1991 22:00:00 GMT wtv-expire-all: wtv-head-waiter: wtv-expire-all: wtv-1800: +Location: client:relog wtv-visit: client:relog Content-type: text/html`; data = ''; + */ delete socket_session_data[socket.id].wtvsec; + socket_session_data[socket.id].close_me = true; sendToClient(socket, headers, data); } else { processURL(socket, headers); @@ -657,8 +676,8 @@ Content-type: text/html`; } async function checkForPostData(socket, headers, data, data_hex) { - if (headers['request']) { - if (headers['request'].substring(0, 4) == "POST") { + if (headers.request) { + if (headers.request.substring(0, 4) == "POST") { if (data_hex.indexOf("0d0a0d0a") != -1) { // \r\n\r\n var header_length = data.length + 4; @@ -673,20 +692,20 @@ async function checkForPostData(socket, headers, data, data_hex) { // some builds (like our targeted 3833), send SECURE ON but then unencrypted headers if (zdebug) console.log(" # Psuedo-encrypted POST Content (SECURE ON)", "on", socket.id); // don't actually encrypt output - headers['psuedo-encryption'] = true; + headers.psuedo_encryption = true; setSessionData(socket_session_data[socket.id].ssid, 'box-does-psuedo-encryption', true); socket_session_data[socket.id].secure = false; - headers['post_data'] = await processRequest(socket, enc_data.toString(CryptoJS.enc.Hex), true); + headers.post_data = await processRequest(socket, enc_data.toString(CryptoJS.enc.Hex), true); } else { // SECURE ON and detected encrypted data setSessionData(socket_session_data[socket.id].ssid, 'box-does-psuedo-encryption', false); - headers['post_data'] = CryptoJS.lib.WordArray.create(socket_session_data[socket.id].wtvsec.Decrypt(0, enc_data)) + headers.post_data = CryptoJS.lib.WordArray.create(socket_session_data[socket.id].wtvsec.Decrypt(0, enc_data)) if (zdebug) console.log(" # Encrypted POST Content (SECURE ON)", "on", socket.id); } } } else { if (zdebug) console.log(" # Unencrypted POST Content", "on", socket.id); - headers['post_data'] = CryptoJS.enc.Hex.parse(socket_session_data[socket.id].buffer.toString(CryptoJS.enc.Hex).substring(header_length * 2)); + headers.post_data = CryptoJS.enc.Hex.parse(socket_session_data[socket.id].buffer.toString(CryptoJS.enc.Hex).substring(header_length * 2)); } } } @@ -695,7 +714,7 @@ async function checkForPostData(socket, headers, data, data_hex) { async function cleanupSocket(socket) { try { - console.log(" * Destroying old WTVSec instance on disconnected socket", socket.id); + if (!zquiet) console.log(" * Destroying old WTVSec instance on disconnected socket", socket.id); delete socket_session_data[socket.id].buffer; delete socket_session_data[socket.id].wtvsec; @@ -769,6 +788,47 @@ Object.keys(services_configured.services).forEach(function (k) { } console.log(" * Configured Service", k, "on Port", services_configured.services[k].port, "- Host", services_configured.services[k].host, "- Bind Port:", !services_configured.services[k].nobind); }) +if (services_configured.config.hide_ssid_in_logs) console.log(" * Masking SSIDs in the console for security"); + +// defaults +var zdebug = false; +var zquiet = true; // will squash zdebug even if its true +var zshowheaders = false; + +if (services_configured.config.verbosity) { + switch (services_configured.config.verbosity) { + case 0: + zdebug = false; + zquiet = true; + zshowheaders = false; + console.log(" * Console Verbosity level 0 (quietest)") + break; + case 1: + zdebug = false; + zquiet = true; + zshowheaders = true; + console.log(" * Console Verbosity level 1 (headers shown)") + break; + case 2: + zdebug = true; + zquiet = true; + zshowheaders = false; + console.log(" * Console Verbosity level 2 (verbose without headers)") + break; + case 3: + zdebug = true; + zquiet = true; + zshowheaders = true; + console.log(" * Console Verbosity level 2 (verbose with headers)") + break; + default: + zdebug = true; + zquiet = false; + zshowheaders = true; + console.log(" * Console Verbosity level 3 (debug verbosity)") + break; + } +} var initstring = ''; ports.sort(); diff --git a/zefie_wtvp_minisrv/package.json b/zefie_wtvp_minisrv/package.json index 273dd83b..a7ab7014 100644 --- a/zefie_wtvp_minisrv/package.json +++ b/zefie_wtvp_minisrv/package.json @@ -1,6 +1,6 @@ { "name": "zefie_wtvp_minisrv", - "version": "0.7.2", + "version": "0.8.0", "description": "WebTV Service (WTVP) Emulation Server", "main": "app.js", "homepage": "https://github.com/zefie/zefie_wtvp_minisrv", diff --git a/zefie_wtvp_minisrv/services.json b/zefie_wtvp_minisrv/services.json index b24ecdb9..7c8b85fd 100644 --- a/zefie_wtvp_minisrv/services.json +++ b/zefie_wtvp_minisrv/services.json @@ -1,7 +1,10 @@ { "config": { "service_ip": "192.168.11.8", - "service_name": "HackTV" + "service_name": "HackTV", + "send_tellyscripts": false, + "hide_ssid_in_logs": true, + "verbosity": 2 }, "services": { "wtv-1800": { @@ -25,7 +28,8 @@ }, "wtv-log": { "port": 1609, - "connections": 1 + "connections": 1, + "write_logs_to_disk": true }, "wtv-home": { "port": 1612, @@ -37,7 +41,8 @@ }, "wtv-flashrom": { "port": 1618, - "flags": "0x00000040" + "flags": "0x00000040", + "use_zefie_server": true }, "wtv-music": { "port": 1656, diff --git a/zefie_wtvp_minisrv/wtvsec.js b/zefie_wtvp_minisrv/wtvsec.js index 7cc8c863..406c3ff2 100644 --- a/zefie_wtvp_minisrv/wtvsec.js +++ b/zefie_wtvp_minisrv/wtvsec.js @@ -18,11 +18,10 @@ class WTVSec { hRC4_Key1 = null; hRC4_Key2 = null; RC4Session = new Array(); - zdebug = false; - constructor(wtv_incarnation = 1) { - this.zdebug = true; + constructor(wtv_incarnation = 1, zdebug = false) { + this.zdebug = zdebug; this.initial_shared_key = CryptoJS.enc.Base64.parse(this.initial_shared_key_b64); if (this.initial_shared_key.sigBytes === 8) { @@ -295,16 +294,6 @@ class WTVSec { } return this.RC4Session[session_id].update(data); } - - Test() { - console.log("TEST RUN"); - console.log("Test python challenge"); - this.current_shared_key = CryptoJS.enc.Base64.parse("CC5rWmRUE0o="); - var current_challenge = "0kjyqIYAu0ziFBbSERN6DGaZ6S0fT+DBUCtpHCJ4lpuM7CbXdAm+x83BIDoJYztd1Z+5KFZ7ghmb3LJCT/6mhWUYkqqKOyfPRW8ZIdbICK/CV+Kxm8EUjRXZSk/97tsmFpH3hcCJ7C2TBw+TX38uQQ=="; - var expected_result = "0kjyqIYAu0zI5QrLhSuEUFgKkoVSxI3zBlUMfhnIYoMy0ExfIX4s/mHvILseDFx+17trk7YO+xG9D2qSY6v9XVUS1OP1m8ee"; - console.log("Expected: " + expected_result); - console.log("Got: " + this.ProcessChallenge(current_challenge)); - } } module.exports = WTVSec; \ No newline at end of file diff --git a/zefie_wtvp_minisrv/zefie_wtvp_minisrv.njsproj b/zefie_wtvp_minisrv/zefie_wtvp_minisrv.njsproj index 389a659a..67294f82 100644 --- a/zefie_wtvp_minisrv/zefie_wtvp_minisrv.njsproj +++ b/zefie_wtvp_minisrv/zefie_wtvp_minisrv.njsproj @@ -34,18 +34,149 @@ Code + + Code + + + Code + - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -78,6 +209,9 @@ + + +