msntv2 initial work

This commit is contained in:
zefie
2026-05-01 18:10:25 -04:00
parent 20357809a7
commit ddbcb4be5e
232 changed files with 16126 additions and 7 deletions

View File

@@ -50,21 +50,19 @@ function validateAudioProxy() {
}); });
if (check.error || check.status !== 0) { if (check.error || check.status !== 0) {
console.warn(`AudioProxy disabled: ffmpeg not found or failed to execute at '${wtvAudioProxy.config.ffmpegPath}'.`); console.warn(` # AudioProxy disabled: ffmpeg not found or failed to execute at '${wtvAudioProxy.config.ffmpegPath}'.`);
if (check.error) console.warn(`AudioProxy ffmpeg error: ${check.error.message}`); if (check.error) console.warn(` # AudioProxy ffmpeg error: ${check.error.message}`);
wtvAudioProxy.config.enabled = false; wtvAudioProxy.config.enabled = false;
return; return;
} }
console.log(`AudioProxy enabled: transcoding audio to ${wtvAudioProxy.config.bitrate} ${wtvAudioProxy.config.sampleRate}Hz mono MP3.`); console.log(` * AudioProxy enabled: transcoding audio to ${wtvAudioProxy.config.bitrate} ${wtvAudioProxy.config.sampleRate}Hz mono MP3.`);
} catch (error) { } catch (error) {
console.warn(`AudioProxy disabled: ffmpeg validation failed: ${error.message}`); console.warn(` # AudioProxy disabled: ffmpeg validation failed: ${error.message}`);
wtvAudioProxy.config.enabled = false; wtvAudioProxy.config.enabled = false;
} }
} }
validateAudioProxy();
process process
.on('SIGTERM', shutdown('SIGTERM')) .on('SIGTERM', shutdown('SIGTERM'))
.on('SIGINT', shutdown('SIGINT')) .on('SIGINT', shutdown('SIGINT'))
@@ -2487,6 +2485,8 @@ else console.log(" * Shenanigans disabled");
if (minisrv_config.config.image_decoder.enabled) console.log(" * WebTV Unsupported images will be processed and converted for WebTV clients"); if (minisrv_config.config.image_decoder.enabled) console.log(" * WebTV Unsupported images will be processed and converted for WebTV clients");
else console.log(" * WebTV Unsupported images will not be processed, and sent to client as-is"); else console.log(" * WebTV Unsupported images will not be processed, and sent to client as-is");
validateAudioProxy();
ports.sort(); ports.sort();
pc_ports.sort(); pc_ports.sort();

View File

@@ -0,0 +1,172 @@
'use strict';
const fs = require('fs');
const path = require('path');
const forge = require('node-forge');
const workspaceRoot = __dirname;
const httpsDir = path.join(workspaceRoot, 'includes', 'ServiceDeps', 'https');
const msnDir = path.join(workspaceRoot, 'includes', 'ServiceDeps', 'msntv2');
const domainsFile = path.join(msnDir, 'msn_domains.txt');
const defaultCaCertPath = path.join(msnDir, 'msntv2.crt');
const defaultCaKeyPath = path.join(msnDir, 'msntv2.key');
const defaultOutCertPath = path.join(msnDir, 'msn_domains.crt');
const defaultOutKeyPath = path.join(msnDir, 'msn_domains.key');
function parseArgs(argv) {
const out = {};
for (let i = 2; i < argv.length; i++) {
const part = argv[i];
if (!part.startsWith('--')) continue;
const key = part.slice(2);
const next = argv[i + 1];
if (!next || next.startsWith('--')) {
out[key] = true;
continue;
}
out[key] = next;
i += 1;
}
return out;
}
function extractDomainsFromRedirectMap(text) {
const found = [];
const seen = new Set();
const re = /"([A-Za-z0-9.-]+\.)"\s*:\s*self\.redirect_ip/g;
let match;
while ((match = re.exec(text))) {
const clean = match[1].replace(/\.$/, '').toLowerCase();
if (!seen.has(clean)) {
seen.add(clean);
found.push(clean);
}
}
return found;
}
function loadDomains(args) {
if (args['from-map-file']) {
const mapText = fs.readFileSync(path.resolve(workspaceRoot, args['from-map-file']), 'utf8');
const domains = extractDomainsFromRedirectMap(mapText);
if (!domains.length) {
throw new Error('No domains were extracted from --from-map-file.');
}
return domains;
}
if (!fs.existsSync(domainsFile)) {
throw new Error('Domain file not found: ' + domainsFile);
}
const domains = fs.readFileSync(domainsFile, 'utf8')
.split(/\r?\n/)
.map((s) => s.trim().toLowerCase())
.filter((s) => s && !s.startsWith('#'));
return Array.from(new Set(domains));
}
function loadPemOrThrow(filePath, label) {
if (!fs.existsSync(filePath)) {
throw new Error(label + ' file missing: ' + filePath);
}
return fs.readFileSync(filePath, 'utf8');
}
function ensureDirFor(filePath) {
const dir = path.dirname(filePath);
if (!fs.existsSync(dir)) {
fs.mkdirSync(dir, { recursive: true });
}
}
function signAlgorithm(sigName) {
const lower = String(sigName || 'sha1').toLowerCase();
if (lower === 'sha256') return forge.md.sha256.create();
if (lower === 'sha384') return forge.md.sha384.create();
if (lower === 'sha512') return forge.md.sha512.create();
return forge.md.sha1.create();
}
function generateCert({ domains, caCertPem, caKeyPem, outCertPath, outKeyPath, years, sig }) {
const caCert = forge.pki.certificateFromPem(caCertPem);
const caKey = forge.pki.privateKeyFromPem(caKeyPem);
const keys = forge.pki.rsa.generateKeyPair(2048);
const cert = forge.pki.createCertificate();
cert.publicKey = keys.publicKey;
cert.serialNumber = forge.util.bytesToHex(forge.random.getBytesSync(16));
const now = new Date();
cert.validity.notBefore = new Date(now.getTime() - 24 * 60 * 60 * 1000);
cert.validity.notAfter = new Date(now.getTime() + years * 365 * 24 * 60 * 60 * 1000);
const cn = domains[0] || 'headwaiter.trusted.msntv.msn.com';
cert.setSubject([
{ name: 'commonName', value: cn },
{ name: 'organizationName', value: 'Zefie Networks' },
{ name: 'countryName', value: 'US' }
]);
cert.setIssuer(caCert.subject.attributes);
cert.setExtensions([
{ name: 'basicConstraints', cA: false },
{ name: 'keyUsage', digitalSignature: true, keyEncipherment: true },
{ name: 'extKeyUsage', serverAuth: true },
{
name: 'subjectAltName',
altNames: domains.map((d) => ({ type: 2, value: d }))
}
]);
cert.sign(caKey, signAlgorithm(sig));
ensureDirFor(outCertPath);
ensureDirFor(outKeyPath);
fs.writeFileSync(outKeyPath, forge.pki.privateKeyToPem(keys.privateKey), 'utf8');
fs.writeFileSync(outCertPath, forge.pki.certificateToPem(cert), 'utf8');
return { cn, count: domains.length };
}
function main() {
const args = parseArgs(process.argv);
const caCertPath = path.resolve(workspaceRoot, args['ca-cert'] || defaultCaCertPath);
const caKeyPath = path.resolve(workspaceRoot, args['ca-key'] || defaultCaKeyPath);
const outCertPath = path.resolve(workspaceRoot, args['out-cert'] || defaultOutCertPath);
const outKeyPath = path.resolve(workspaceRoot, args['out-key'] || defaultOutKeyPath);
const years = Number(args.years || 15);
const sig = String(args.sig || 'sha1');
const domains = loadDomains(args);
const caCertPem = loadPemOrThrow(caCertPath, 'CA cert');
const caKeyPem = loadPemOrThrow(caKeyPath, 'CA key');
const result = generateCert({
domains,
caCertPem,
caKeyPem,
outCertPath,
outKeyPath,
years,
sig
});
console.log('[msn-san-cert] generated cert:', outCertPath);
console.log('[msn-san-cert] generated key :', outKeyPath);
console.log('[msn-san-cert] domains :', result.count);
console.log('[msn-san-cert] common name :', result.cn);
console.log('[msn-san-cert] signature alg :', sig);
}
if (require.main === module) {
try {
main();
} catch (err) {
console.error('[msn-san-cert] error:', err.message);
process.exit(1);
}
}

View File

@@ -0,0 +1,36 @@
-----BEGIN CERTIFICATE-----
MIIGSTCCBTGgAwIBAgIQlHjGEAhkTTLRsnsDQ/FBODANBgkqhkiG9w0BAQUFADBw
MQswCQYDVQQGEwJVUzELMAkGA1UECAwCT0gxEzARBgNVBAcMCkJ1dHQgQ3JhY2sx
IDAeBgNVBAoMF1VuZGVyd2VhciBJbnNwZWN0b3IgIzEyMR0wGwYDVQQLDBRUaGlu
ZyBMb29rZXIgRXhwZXJ0czAeFw0yNjA0MzAxMjI0MzFaFw00MTA0MjcxMjI0MzFa
MD4xFjAUBgNVBAMTDWVwaXgueGJveC5jb20xFzAVBgNVBAoTDlplZmllIE5ldHdv
cmtzMQswCQYDVQQGEwJVUzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
ALcVrQ2E2OiR8JJ2WFZVvrN1hrM2vusykN/59GZ5DuIQEQlDC3UZw0Utu/gnTwqh
GScJ2xkCrW2znTl/Dnst2sppy+PghIJBORM/M5CViKuSezpekribgUBFUbF9udSF
WqfdEnxwd51v/hVS753hL2pT+BbzMgalAmxGFLREf1Hu4loQu9bo8I8hhwFRCTd1
JMqQ8QMxG5l+tV6u52SwDWAkMdSL9Tqh0mun38hhZWUCkGCCSpjUmL2PzWfdH7K1
GXw+VtA48gidkjahChlNuuMu7w2fJdbfZtSITYimd5yQ19sStlr5lZ/tNyHOvokL
xBZ4HUSk9xePKyVe2s1nEU0CAwEAAaOCAw8wggMLMAkGA1UdEwQCMAAwCwYDVR0P
BAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMIIC2gYDVR0RBIIC0TCCAs2CDWVw
aXgueGJveC5jb22CEXhlYXMueGJveGxpdmUuY29tgg14ZWFzLnhib3guY29tghJ4
ZXRncy54Ym94bGl2ZS5jb22CD2FzLnhib3hsaXZlLmNvbYIUYXMucGFydC54Ym94
bGl2ZS5jb22CEHRncy54Ym94bGl2ZS5jb22CFXRncy5wYXJ0Lnhib3hsaXZlLmNv
bYITeGVtYWNzLnhib3hsaXZlLmNvbYIRbWFuaWZlc3QueGJveC5jb22CEW1hY3Mu
eGJveGxpdmUuY29tghZtYWNzLnBhcnQueGJveGxpdmUuY29tghdwaWZsYy5wYXJ0
Lnhib3hsaXZlLmNvbYIQZXBsaXN0cy54Ym94LmNvbYIScGlmbGMueGJveGxpdmUu
Y29tghBiZWFjb25zLnhib3guY29tghlzZzQudHJ1c3RlZC5tc250di5tc24uY29t
ghlzZzMudHJ1c3RlZC5tc250di5tc24uY29tghlzZzIudHJ1c3RlZC5tc250di5t
c24uY29tghlzZzEudHJ1c3RlZC5tc250di5tc24uY29tgg1tc250di5tc24uY29t
ghZtYWlsLnNlcnZpY2VzLmxpdmUuY29tgiBoZWFkd2FpdGVyLnRydXN0ZWQubXNu
dHYubXNuLmNvbYIec3luYy1zZzEudHJ1c3RlZC5tc250di5tc24uY29tgg5sb2dp
bi5saXZlLmNvbYIRcG9wdGltaXplLm1zbi5jb22CEWZhdm9yaXRlcy5tc24uY29t
ghFtZXNzZW5nZXIubXNuLmNvbYIRbGl2ZWZpbGVzdG9yZS5jb22CFnVzZXJzLnN0
b3JhZ2UubGl2ZS5jb22CCWcubXNuLmNvbYIXbXNuaWFsb2dpbi5wYXNzcG9ydC5j
b22CEGNsb3VkLnJlZml2ZS5kZXaCE3Byb2Qucm9zLnJlZml2ZS5kZXYwDQYJKoZI
hvcNAQEFBQADggEBACKaL3Pl9893HrDj6mAM5Ac3qoD0wCfxws8H7oiabzHr4PgA
rZKoV8NS5qwoi1B1Tr/EZJct0gtjBdp+x8GRZ3j+UgkPhTEi32kXG8HLDRaaXIhW
i7LpjMs3zk6uATXNuPfjuFs6yh66H8Qj44MXgYT66xLLVKYsrm2CSjDiajfhpr5x
HL2oEJUJfqoGTxaxz8zAdiDCVjTkJ0zxyv6vGsVo0TgVggOEfJiYMSqBlJ/j7wBj
+mfRsB8d735QhJOMdABMDLj0DIG6HoMM2gvR2ayeuTtSf1x36doyadDmNYDXyIqI
Vica5k3jkRJ/4IIBf8Ghakh1e+4r6hI692sxePA=
-----END CERTIFICATE-----

View File

@@ -0,0 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAtxWtDYTY6JHwknZYVlW+s3WGsza+6zKQ3/n0ZnkO4hARCUML
dRnDRS27+CdPCqEZJwnbGQKtbbOdOX8Oey3aymnL4+CEgkE5Ez8zkJWIq5J7Ol6S
uJuBQEVRsX251IVap90SfHB3nW/+FVLvneEvalP4FvMyBqUCbEYUtER/Ue7iWhC7
1ujwjyGHAVEJN3UkypDxAzEbmX61Xq7nZLANYCQx1Iv1OqHSa6ffyGFlZQKQYIJK
mNSYvY/NZ90fsrUZfD5W0DjyCJ2SNqEKGU264y7vDZ8l1t9m1IhNiKZ3nJDX2xK2
WvmVn+03Ic6+iQvEFngdRKT3F48rJV7azWcRTQIDAQABAoIBAAueAf2WHOdg/0lj
3gYYacHcZsAvbJzi+ANmSmZILzQT/ei/CtaS3Gui08cSw3ayszRhcTgcjeGkoIjZ
8ZLKXZQzc18Ry4ayWctJWt3FR0dPw6b4AkpZf7GS1HS1PBnqnk6Bfh9MSaLBTPeQ
bCjx9X7DNj5KjzWRud4h8kVgBU4vBTAU1Pu+j5yiepMnmasT/O4JQ6OZ0roc3Mr4
1MiEfNk33Qi88xsIeKcfqVS43vJzowUj6yF+zADTMSWr/Ij5xhHCdqSR0CFyX42Q
GrNFfcWQ9veFcL9b9+tTp575F8HNFa50ULCrk9wjMPsGk1aMztfF5EZamGyDvf/0
m2OGmjcCgYEA7eS8J76LDI8YS6Ijccu4FJRz9a+fPDOxkVmzbQKb2ErEpTWXdQX8
s2sk3W4EnMfMEZ9IJ0rm+LhaZZbKmiCL6lCJSIAhsQBdpHMJ/EUX1gDmv3I3/Ie7
pa9cMnxNQG2plWvKXorjP87ho1X2WmXtmaJc/oWR5x07Rtm/McZpCi8CgYEAxQUD
AbMBIKf3zB+bHmmTBFQkkt3GnCWGyF2nH85REX0e5SOOyAxJicXq3WSZkHtRjYMl
nxuy/ReyEU0zgWr9Qgl6PZ7EoJbS74W+IPth0KB9ZzJ6gXIP4k7n5lBMXbIpEaU9
n2DE43w2I6Zxl98F0z91Bsi/WoViDMJl/M2eSUMCgYAKDR0KDNnxKOac43fd6f6Y
GAGiQs5Wi9SX0JNtKqwNAnO2i0If9qXLqt4+4NQfD64GnJU+28JQhfGD01AyHOfs
eYSjZI6H3P0X4qhsWTr9lsIpGplU+SMrh/I8S9Yzv65nmstNHU8mtgYAkbQ784yL
bjnBo0Eb47dKcg7K+pgbjwKBgHMDM/gf+T6JD30XzkP4uZxDSn55/OFWftIk6dUF
agndktWM5mMd2SgWY78OZR8U/kywDJxPXTOmS4sSGEkqneGZCsVCE+LzaPvuhUlX
tohFyC8gJqe+YEtqaLHomkvwH01vuwN5SDbMYgZ5ucJArXPejYCCXEKJru1n5oWn
uwllAoGAD2W5Ims1iR/qWEzQoiSBOvDJdsQWLJwGWlZ1/bUZ5FK3VlhhNMuJv5PC
wJhSSW3GECt0SxS+z4QtjFATPMO5hdoo9H6WN+Kx14vAjJbX+8jLBS3EhVZkv6b3
aAjJgd9LMbAh9H+CAiYf9QjKfSL7ueIjzf4CHfovj8bk5PPlVSA=
-----END RSA PRIVATE KEY-----

View File

@@ -0,0 +1,34 @@
epix.xbox.com
xeas.xboxlive.com
xeas.xbox.com
xetgs.xboxlive.com
as.xboxlive.com
as.part.xboxlive.com
tgs.xboxlive.com
tgs.part.xboxlive.com
xemacs.xboxlive.com
manifest.xbox.com
macs.xboxlive.com
macs.part.xboxlive.com
piflc.part.xboxlive.com
eplists.xbox.com
piflc.xboxlive.com
beacons.xbox.com
sg4.trusted.msntv.msn.com
sg3.trusted.msntv.msn.com
sg2.trusted.msntv.msn.com
sg1.trusted.msntv.msn.com
msntv.msn.com
mail.services.live.com
headwaiter.trusted.msntv.msn.com
sync-sg1.trusted.msntv.msn.com
login.live.com
poptimize.msn.com
favorites.msn.com
messenger.msn.com
livefilestore.com
users.storage.live.com
g.msn.com
msnialogin.passport.com
cloud.refive.dev
prod.ros.refive.dev

View File

@@ -0,0 +1,23 @@
-----BEGIN CERTIFICATE-----
MIIDwzCCAqugAwIBAgIULL+4ofEIwgHwoGgoEJ+mJOmeF4YwDQYJKoZIhvcNAQEF
BQAwcDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAk9IMRMwEQYDVQQHDApCdXR0IENy
YWNrMSAwHgYDVQQKDBdVbmRlcndlYXIgSW5zcGVjdG9yICMxMjEdMBsGA1UECwwU
VGhpbmcgTG9va2VyIEV4cGVydHMwIBcNMDAwNDIwMDAwMDAxWhgPMjA2OTA2MDkw
MDAwMDFaMHAxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJPSDETMBEGA1UEBwwKQnV0
dCBDcmFjazEgMB4GA1UECgwXVW5kZXJ3ZWFyIEluc3BlY3RvciAjMTIxHTAbBgNV
BAsMFFRoaW5nIExvb2tlciBFeHBlcnRzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
MIIBCgKCAQEArN5xb8PqUKNNTitGuxyJJxEsWTIt7t7eobSq1+V3hTpknJEspRpb
JeD5Ep86pWn4aGoWYT0JU9w4FRJFPaBPAMmLFTIYv1bySlFwna+5J67dAtMm59Pr
t3ZSw2dQpads3LGZRSpkY1mv9GC2TVVk/TANWZmWYvEZZ4/2E2YuMJZ6v6gNIY7Y
pfJ6F6Q4+d/Dgrvow4E35lmNuM0Y95sdMhKy8HTJ0ecU/bMLKyoXXZyt7LxezT+T
w3J2EDVV03lDXZhb0h2ZECmpCAgnKsQ/WmLMjEGeojDQnm+QzTaFHqO0148RMbYN
lxURCZVl+keYe1LTHW/K+2f58DeeI0z11wIDAQABo1MwUTAdBgNVHQ4EFgQU0bsp
ZOhtJGP0dLS4sdaA4nmQ5ocwHwYDVR0jBBgwFoAU0bspZOhtJGP0dLS4sdaA4nmQ
5ocwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEANAV1WNeCggjK
eb8kIGkt2R3PMMBy2w+rC4X80xygh+NHU5neJKM1lpq6NLkt5rCBXNCTDb5uPjRv
mcrGeIYJYXMy39htjlYgPtfUiQx7e7eq3g1mMHYN26Gr9p7BwJW0QVvaA6zB3lqt
HGL7hwQyBCD9P/0sR91sjyLF9mPkaO4sBM5EbrV89LXbD+OPqn10X2Mu4trI3bd4
R02Pl0A/rDO/S7bOGc4HGGPSsmgeoapydvkqgnXL497zD1Sv103n96hiuq4Dhurj
gfnGxQvEN7MCc31HE2ufkTHjNc62RatseiCLxJE3sBhMl9aaNEhtM3FNDXZnhMbs
0/7C2b5kSg==
-----END CERTIFICATE-----

View File

@@ -0,0 +1,5 @@
-----BEGIN DH PARAMETERS-----
MIGHAoGBAOjeZEDvMxiY+T4AMUIJ6jPFhflzUwO6EPBc0+Fn3C13WGQgsx9N3Rjg
bZsF4Sbqs62+KFTYb5/1PVPSOxyif0CJLRC8VhvCl5CZ2DsS6nJ3sstPxtfhQdn+
X1kbvqAbHlvNtE6w5ketHv3gK6y4d9qdVnwicZW3uV1sJ2dg4RfDAgEC
-----END DH PARAMETERS-----

View File

@@ -0,0 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCs3nFvw+pQo01O
K0a7HIknESxZMi3u3t6htKrX5XeFOmSckSylGlsl4PkSnzqlafhoahZhPQlT3DgV
EkU9oE8AyYsVMhi/VvJKUXCdr7knrt0C0ybn0+u3dlLDZ1Clp2zcsZlFKmRjWa/0
YLZNVWT9MA1ZmZZi8Rlnj/YTZi4wlnq/qA0hjtil8noXpDj538OCu+jDgTfmWY24
zRj3mx0yErLwdMnR5xT9swsrKhddnK3svF7NP5PDcnYQNVXTeUNdmFvSHZkQKakI
CCcqxD9aYsyMQZ6iMNCeb5DNNoUeo7TXjxExtg2XFREJlWX6R5h7UtMdb8r7Z/nw
N54jTPXXAgMBAAECggEAN5W7IfX8FPu9csIllyrAyygRe4jQDjvpmFNwj8VAHj29
dj6T/W6xGkfxrtQ2VlPxxRk/ovquUiHAgr4CN6OhY55qs2ENZhD+DXmMXZfQUHtA
o5TjsK2K4M4SJLTG0M06CuisYPoVl4CSPGEQnWM0+tiFombpXV0rDwrSVECJ36Mr
x/HPoMJQPewBSI4lG2ACQMBmQ+7WQVwl0mprJjIFJYW9BXFRkqmFKSXq6G302VcH
VOjiSOF/8BR64worbo9UrpPBPMLZMAW1rwZx50Chwhplben8B2uQNSqrc7Q9ZA3C
2XJ8Wi0KCeYmJy+xng3LT22Sdme1UC8YfC9iCsHfaQKBgQDe3sN97UK+WVIgvA8Q
+4+rpkUWOy/dCoTzPuxHy4qSTHyF723+URyVkNF/P5EtwKwpIuJ/WMwIyUF0EqLQ
0+6HrmqfO5CR+p/2xJhFPHi1qn3uCM8pw5O9i5MjhOr1jM1RQz1xe0rToLiTlq3x
sSrYzDmIs61kBH2NKaVp38Oh5QKBgQDGkObMw8Gyn5JT1ewkS0VGDT5bbVK5sptJ
KTkaikKTuNV5RLya+7SxnR7rOBWWLN+ZpdQygM8IlUh0TJiTZazUkKUSNv3isIbF
rfak10q8Zad6RkaQyyH7GKhBOnMs0z3kqgL0SvNhoIs2KKsE46UoMVE49/C9Ma8Y
zbdEBLTtCwKBgQCRJc934d/IDHAadZ/yVYOaLO1trxpbARDZQq+rinozEbE/oVGn
gbf2CJ0IHKQ2gfcdy2Rrv68SQdBpAgIbswr0Prmd/rMG/4zSr/LjlKCg3+qn7gDN
mFxN4+ruBRDo3syREhOgJsXy0gejx0x9zf6ztz35M9vG+c2y896Q93R3qQKBgA/e
AmN4fSD9+V5zqMQZs7ZuVn5N1R97s0b8YVDKnZlaWsyu/ndQB9dtm8vmFmuCuHd5
teQ3QNQJwdlxSXv10wLFcDttY4pa2tovFZeEkLdPVDvEI91sLhH3nXJg7lU1qCt+
nm/REXPKtXUleM0SN99nWXs47ObhcoGD5tIroh2TAoGBAISazlBBrmnNOavnUzWa
Ka2uXk/2txan8Fh9jul0g6GPPsI7Ej3YMf3ccC9iotVugteHrBUK0cNbesydw3J0
PIs05XLX0curxoTox2Jeynq+ajy2tnmrDHDfilXdxRt2rsQlobZi3qoJskwPFYhf
ssL5LnP78Pv/t2H01jDSpZXu
-----END PRIVATE KEY-----

View File

@@ -0,0 +1,76 @@
const minisrv_service_file = true;
headers = `200 OK
Content-type: text/html`;
data = `<HTML>
<HEAD>
<title id="title"></title>
</HEAD>
<body>
<iframe id=checkmail style="display:none"></iframe>
<script language="javascript">
var tvShell = new ActiveXObject("MSNTV.TVShell");
function IsNightlyEnabled() {
var taskScheduler = tvShell.TaskScheduler;
var updateTask = null;
for (var i = 0; ((i < taskScheduler.Count) && (updateTask == null)); i++) {
if (taskScheduler.Item(i).Caller == 'NightlyUpdate') {
updateTask = taskScheduler.Item(i);
}
}
if (updateTask != null) {
return(true);
}
else {
return(false);
}
}
function GotoBoxCheck() {
var url = 'https://sg1.trusted.msntv.msn.com/connection/boxcheck.html';
var parms='';
parms += 'BoxId=' + tvShell.SystemInfo.BoxIDService + '&';
parms += 'WANProvider=' + tvShell.ConnectionManager.WANProvider + '&';
parms += 'version=' + encodeURIComponent(tvShell.SystemInfo.LastVersion) + '&';
if ((tvShell.ConnectionManager.MSNIAManager != null) && (tvShell.ConnectionManager.MSNIAManager.CurrentConnector != null)) parms += 'ConnectorName=' + encodeURIComponent(tvShell.ConnectionManager.MSNIAManager.CurrentConnector.Name) + '&';
if (tvShell.UserManager.CurrentUser != null) parms += 'domain=' + encodeURIComponent(tvShell.UserManager.CurrentUser.Domain) + '&';
parms += 'NumRedirects=0&';
parms += 'NightlyEnabled=' + IsNightlyEnabled() + '&';
parms += 'x=y';
var myPanel = tvShell.PanelManager.Item('service');
if (myPanel) myPanel.PostToURL(url, parms);
}
var progressPanel = tvShell.PanelManager.Item('progress');
function SetProgress(text, percent) {
if (progressPanel) {
progressPanel.Document.SetProgressText(text);
progressPanel.Document.SetProgressPercent(percent);
}
}
function IsServicePanel() {
if ((window.name == null) || ((window.name != null) && (window.name.toLowerCase() != 'service'))) {
return(false);
}
return(true);
}
function DontContinue() {
var currentUser = tvShell.UserManager.CurrentUser;
if (currentUser != null && currentUser.IsAuthorized) {
window.location.replace(tvShell.UserManager.CurrentUser.ServiceList.Item('home::home').URL);
}
else {
tvShell.ConnectionManager.ServiceState = 'ReSignIn';
}
}
if (!IsServicePanel()) {
DontContinue();
}
else {
tvShell.MeteringManager.Stop();
SetProgress('Hello, New User.', 10);
GotoBoxCheck();
}
</script>
</body>
</HTML>
`;

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 B

View File

@@ -0,0 +1,528 @@
const minisrv_service_file = true;
// Weather placeholder (static defaults — no live API)
const WeatherCity = 'Your City';
const WeatherTemp = '72';
const WeatherDescription = 'Sunny';
const WeatherIcon = '/Pages/Home/Weather/26.gif';
// News headlines
const NewsLink1 = 'http://sg1.trusted.msntv.msn.com/Pages/Tricks/he.mp3';
const NewsLink2 = 'http://sg1.trusted.msntv.msn.com/Pages/Tricks/pokemon-black-2.mp3';
const NewsLink3 = 'http://sg1.trusted.msntv.msn.com/Pages/Tricks/he.mp3';
const NewsTitle1 = 'Ryder Smells';
const NewsTitle2 = 'Ryder Smells';
const NewsTitle3 = 'Ryder Smells';
headers = `200 OK
Content-type: text/html`;
data = `<html xmlns:msntv>
<?import namespace="msntv" implementation="Shared/Anduril/HTC/en-us/TruncatedHtml.htc"?>
<head><title>Home</title>
<?import namespace="msntv" implementation="HTC/Shared/CustomButton.htc"?>
<?import namespace="msntv" implementation="/Pages/Home/Shared/BaseClient/HTCTransforms/en-us/LoopingDIV.htc"?>
<script src="/Include/2.0.261.900/localhost-1700/Shared/BaseClient/JsTransforms/en-us/PaneHelp.js" language="javascript" defer="true"></script>
<link href="/Include/2.0.261.778/localhost-1700/Home/Anduril/CssTransforms/en-us/Home.css" type="text/css" rel="StyleSheet">
<script src="/Include/2.0.261.778/localhost-1700/Home/Anduril/JsTransforms/en-us/Home.js" language="javascript"></script>
<script>
var forceReload = false;
var l = 'd:' + new Date().valueOf() + '|';
function setCookie(name, value) {
{
var now = new Date();
var expires = new Date(now.getFullYear() + 1, now.getMonth(), now.getDate());
document.cookie = escape(name) + '=' + escape(value) + ';expires=' + expires.toGMTString() + ';path=/';
}
}
function getCookie(name) {
{
var str = document.cookie;
var arr = str.split('; ');
for (var i = arr.length - 1; i >= 0; i--) {
{
var c = arr[i].split('=');
if (c.length != 2)
continue;
if (unescape(c[0]) == name)
return unescape(c[1]);
}
}
return null;
}
}
function syncCookie(cookieName, propValue) {
{
var c = getCookie(cookieName);
l += 'g:' + cookieName + ':' + c + '|';
if (c != propValue) {
{
setCookie(cookieName, propValue);
l += 's:' + cookieName + ':' + propValue + '|';
var check = getCookie(cookieName);
if (check == propValue)
forceReload = true;
}
}
}
}
var d = new Date();
var utcOffset = d.getTimezoneOffset();
syncCookie('UserUtcOffset', utcOffset);
var connSpeed;
try { { connSpeed = window.external.ClientCaps.connectionType; } }
catch (e) {
{
connSpeed = "undetected";
}
}
syncCookie('UserConnectionSpeed', connSpeed);
try {
{
top.log(l);
}
}
catch (e) {
{
}
}
if (forceReload)
location.replace(location.href);
</script></head>
<body>
<body onload="initPage();" scroll="no" tabindex="-1">
<div id="focdiv" style="position:absolute;top:314px;left:27px;width:70px;height:70px;" onclick="goToMail();">
</div>
<script>
document.all["focdiv"].focus();
function handleLoopingDivReady()
{
document.all["focdiv"].style.display = "none";
}
</script>
<div class="topdiv">
<div class="textMenu">
<script xmlns:msntvuxp="msntvuxp.microsoft.com">
function goToService(serviceName) {window.location = window.external.SafeGetServiceURL(serviceName);}
function goToCenter(svcURL) {window.location = svcURL;}
</script>
<div style="position:absolute; left:0px; top:0px" xmlns:msntvuxp="msntvuxp.microsoft.com">
<table border="0" class="TextMenuTbl">
<tr height="34" style="background-color: transparent;">
<td class="leftGradientTD"></td><td class="rightGradientTD">
</td>
</tr>
</table>
</div>
<div style="position:absolute; left:0px; top:0px" xmlns:msntvuxp="msntvuxp.microsoft.com">
<table border="0" class="TextMenuTbl">
<tr>
<td style="background-color: transparent;" width="8">
<img height="1" src="/Images/Shared/s.gif" width="8">
</td>
<td style="background-color: transparent;" align="left" width="162">
<a class="TextMenuLink" href="javascript:goToCenter('/Pages/UsingMSNTV/Main');" id="UsingMSNTVLinkID" onblur="umtvHasFocus=false">Using MSN TV</a>
</td>
<div>
<span style="position:absolute;left:0;top:35px;width:100%;height:2px;background-color:#8fc3d6;">
</span>
</div>
<td style="background-color: transparent;" align="left" width="115">
<a class="TextMenuLink" href="javascript:void(window.open(' ', 'signout', 'msntv:panel'));" id="SignoutLinkID">Sign Out</a>
</td>
<div>
<span style="position:absolute;left:0;top:35px;width:100%;height:2px;background-color:#8fc3d6;"></span>
</div>
<td style="background-color: transparent;" align="left" width="106">
<a class="TextMenuLink" href="javascript:goToService('UAM::UAMbase');" id="AccountLinkID">Account</a>
</td>
<div>
<span style="position:absolute;left:0;top:35px;width:100%;height:2px;background-color:#8fc3d6;">
</span>
</div>
<td style="background-color: transparent;" align="left" width="109">
<a class="TextMenuLink" href="javascript:goToService('settings::mainindex');" id="SettingsLinkID">Settings</a>
</td>
<div><span style="position:absolute;left:0;top:35px;width:100%;height:2px;background-color:#8fc3d6;">
</span>
</div>
<td style="background-color: transparent;" align="left" width="78">
<a href='javascript:CallPaneHelp(PH_TOC);' id="HelpLinkID">
<table><tr>
<td valign="middle" class="TextMenuLinkSimulation">Help</td>
<td valign="middle" width="30" height="20">
<span id="helpIcon" style='src:url(msntv:/Shared/Images/Icon_Help_RelatedLink.png);'></span>
</td>
</tr>
</table>
</a>
</td>
<div>
<span style="position:absolute;left:0;top:35px;width:100%;height:2px;background-color:#8fc3d6;">
</span>
</div>
</tr>
</table>
</div>
</div>
<div class="infoPaneDiv">
<div class="promoImgDiv">
<div style="position:absolute; left:0px; top:0px">
<img id="PromoImageID" width="178" height="135" border="0" hspace="0" alt="Promotional Image" src="/Pages/Home/ads/webtv3.gif">
</div>
<div style="position:absolute; left:5px; top:0px"><a id="PromoImageLinkID" href="">
<table width="173" height="135"><tr><td></td></tr></table></a>
</div>
</div>
<div id="timerRotatorDiv" class="personalPanelDiv" onclick="ClickRotator()">
<div>
<div style="top:0px; left:0px; width:176px; height:105px;" xmlns:msntvuxp="msntvuxp.microsoft.com">
<div class="PNGImage" style="width:176px;height:105px;src:/images/Home/HomeRotatorBGWeather.png;"></div>
</div>
<div style="position:absolute; top:0px; left:0px; width:178px; height:107px;" xmlns:msntvuxp="msntvuxp.microsoft.com">
<table class="wthrTbl" border="0" cellpadding="1" cellspacing="0">
<tr>
<td height="4" width="4" rowspan="4"><img src="images/Shared/s.gif" height="4" width="4"></td>
<td height="4" width="45"><img src="images/Shared/s.gif" height="4" width="45"></td>
<td height="4" width="10"><img src="images/Shared/s.gif" height="4" width="10"></td>
<td height="4" width="65"><img src="images/Shared/s.gif" height="4" width="65"></td>
</tr>
<tr>
<td id="CityCellID" class="wthrCityCell" colspan="3" valign="top">
<span class="wthrCityText">${WeatherCity}</span>
</td>
</tr>
<tr>
<td id="TRCID" class="wthrTempCond">
<table>
<tr>
<td id="TemperatureCellID" class="wthrTempCell">
<span class="wthrTempTxt">${WeatherTemp}&#176;F</span>
</td>
</tr>
<tr>
<td id="ConditionCellID" class="wthrCondCell">
<span class="wthrCondTxt">${WeatherDescription}</span>
</td>
</tr>
</table>
</td>
<td id="PaddingID" width="10"><img src="images/Shared/s.gif" height="1" width="10"></td>
<td id="ConditionIconID" class="wthrCondIcon">
<img src="${WeatherIcon}" alt="Weather icon" style="width:65px;height:61px;">
</td>
</tr>
<tr>
<td id="ProviderID" class="wthrProvider" colspan="3">
Open-Meteo
</td>
</tr>
</table>
</div>
<script xmlns:msntvuxp="msntvuxp.microsoft.com">
function clickPageRotatePanel() {
location.href = "/Pages/weather/yourcity";
}
</script>
</div>
</div>
<script>
InitRotator(timerRotatorDiv, 5000, new Array("/home/MoneyModule.aspx","/Pages/weather/WeatherModule"));
</script>
<div ID="clockID" class="clockDiv">
</div>
<script>clockID.innerHTML = formClockLink();</script>
<div class="newsHdlnDiv">
<div class="newsHdlnTitleDiv"><span class="newsHdlnTitleText">Today on TV2</span></div>
<table style="top:0px;left:0px;width:365px;height:78px;">
<tr><td><a class="newsHdlnLink" id="newsHdlnLinkID1" href="${NewsLink1}">${NewsTitle1}</a></td></tr>
<tr><td><a class="newsHdlnLink" id="newsHdlnLinkID2" href="${NewsLink2}">${NewsTitle2}</a></td></tr>
<tr><td><a class="newsHdlnLink" id="newsHdlnLinkID3" href="${NewsLink3}">${NewsTitle3}</a></td></tr>
</table>
<div class="moreNewsDiv">
<table><tr>
<td><img src="msntv:/Shared/images/BulletCustom.gif" height="14" width="7"></td>
<td><img src="images/Shared/s.gif" height="1" width="4"></td>
<td style="height:37px"><a id="moreNewsLinkID" class="moreNewsLink" href="../pages/TopStories">More MSN news</a></td>
</tr></table>
</div>
</div>
<div class="promoPanelDiv">
<div style="position:absolute; width:355px; height:70px;">
<table style="width:365px;">
<td class="promoHdlnTitle" style="color:#1D704C">Using MSN TV</td>
<tr>
<td class="promoHdlnCell"><a class="promoHdlnLink" id="promoHdlnLinkID1" href="http://msntv.msn.com/pages/usingmsntv/tippage.aspx?id=set15">Tip: Turn on audible dialing </a></td></tr><tr>
<td class="promoHdlnCell"><a class="promoHdlnLink" id="promoHdlnLinkID2" href="http://msntv.msn.com/pages/UsingMSNTV/Article.aspx?id=feature3">Get better printing results</a></td></tr>
</table>
</div>
<div style="position:absolute; left:161px; top:74px; width:200px;">
<table class="MoreUsingLinkTable"><tr>
<td><img src="msntv:/Shared/Images/BulletCustom.gif" height="14" width="7"></td>
<td><img src="/Images/Shared/s.gif" height="1" width="4"></td>
<td>
<a id="MoreUsingLinkID" class="MoreNewsLink" href="http://headwaiter.trusted.msntv.msn.com/Pages/UsingMSNTV/Main">Go to Using MSN TV</a>
</td></tr>
</table>
</div>
</div>
</div>
<div id="searchID" class="searchDiv">
<div class="searchCenterDiv">
<script>
function doSearch(country){
if (searchFormID.searchFieldID.value == "")
{
window.location = window.external.SafeGetServiceURL('search::search') + "?FORM=WEBTV&cfg=MSTVXML&v=1&c="+country+"&x=26&y=14";
}
else
{
window.location = window.external.SafeGetServiceURL('search::search') + "?FORM=WEBTV&cfg=MSTVXML&v=1&c="+country+"&x=26&y=14&q=" + escape(searchFormID.searchFieldID.value);
}
}
</script>
<div style="position:absolute; z-index:1; left:0; top:0px; width:100%; height:2px; background-color:#0c7faa;">
<table style="width:100%; height:2px;"><tr><td height="2"></td></tr></table>
</div>
<table class="searchTbl">
<form id="searchFormID" action="javascript:doSearch('US')">
<tr>
<td width="10"></td>
<td><a class="searchLink" href="javascript:doSearch('US');">Search</a><span class="searchLabelText"> or type www</span></td>
<td></td>
<td><span class="searchFieldText"><input id="searchFieldID" name="searchFieldName" class="searchField" type="text" size="28"></span></td>
<td></td>
<td valign="center"><msntv:custombutton id="GoButtonID" onClick="doSearch('US');" label="Go" /></td>
</tr></form></table>
<div style="position:absolute; left:0; top:33px; width:100%; height:2px; background-color:#1c4373;">
<table style="width:100%; height:2px;"><tr><td height="2"></td></tr></table>
</div>
</div>
</div>
<div id="iconNavBarID" class="iconNavBar">
<table class="iconNavBarMasterTbl">
<tr>
<td align="center" valign="middle">
<table class="iconNavBarTbl">
<tr>
<td class="iconNavBarTblFrameCell">
<table class="ApolloIcons" xmlns:msntv="http://tv.msn.com">
<tr height="70">
<td>
<msntv:loopingDIV id="navbar" hasInitialFocus="true" divWidthPX="554" onLoopingDivReady="handleLoopingDivReady()" />
</td>
</tr>
<script>
var nIcons;
var ImgURL = new Array();
var ImgWidth = new Array();
var ImgOverURL = new Array();
var IconURL = new Array();
function goToFavorites() {
window.open(" ", "favoritespanel", "msntv:panel");
}
function goToMessenger() {
if (window.external.SafeGetServiceURL('messenger::root') != null && window.external.SafeGetServiceURL('messenger::root') != "") window.open(" ", "impanel", "msntv:panel");
else window.location = "msntv:/OLTK/IMBlock.html";
}
function goToMail() {
if (window.external.SafeGetServiceURL('mail::listmail') != null && window.external.SafeGetServiceURL('mail::listmail') != "") window.location = window.external.SafeGetServiceURL('mail::listmail');
else window.location = "msntv:/OLTK/EmailBlock.html";
}
function goToChat() {
if (window.external.SafeGetServiceURL('chat::home') != null && window.external.SafeGetServiceURL('chat::home') != "") window.location = window.external.SafeGetServiceURL('chat::home');
else window.location = "msntv:/OLTK/chatBlock.html";
}
function goToSearch() { window.location = window.external.SafeGetServiceURL('search::main'); }
function goToMaps() { window.location = window.external.SafeGetServiceURL('maps::main'); }
function goToMusicHome() { window.location = window.external.SafeGetServiceURL('Music::Home'); }
function goToVideoHome() { window.location = window.external.SafeGetServiceURL('Video::Home'); }
function goToNetwork() { window.location = window.external.SafeGetServiceURL('Settings::HomeNetwork'); }
function goToAccount() { window.location = window.external.SafeGetServiceURL('UAM::UAMbase'); }
function goToSettings() { window.location = window.external.SafeGetServiceURL('settings::mainindex'); }
function goToCenter(svcURL) { window.location = svcURL; }
function goToPhotosApp() { window.location = window.external.SafeGetServiceURL('Photos'); }
function goToPhotosHome() { window.location = window.external.SafeGetServiceURL('Photo::Home'); }
function initIcons() {
var dq = '"';
for (index = 0; index < nIcons; index++) {
var realIndex = (index + nIcons - 1) % nIcons;
var cellHTML = '<span' +
' onFocus=' + dq + 'ImgObjs' + realIndex + ".src='" + ImgOverURL[realIndex] + "';" + dq +
' onBlur=' + dq + 'ImgObjs' + realIndex + ".src='" + ImgURL[realIndex] + "';" + dq +
' onClick=' + dq + IconURL[realIndex] + dq +
'><img id=' + dq + 'ImgObjs' + realIndex + dq +
" src='" + ImgURL[realIndex] + "' width=" + ImgWidth[realIndex] + ' height=61 border=0></span>';
navbar.AddCellHTML(cellHTML, ImgWidth[realIndex]);
}
}
ImgURL[0] = "/Images/Home/HomeIconFav.jpg";
ImgOverURL[0] = "/Images/Home/HomeIconFavOver.jpg";
ImgWidth[0] = 87;
IconURL[0] = "javascript:goToFavorites();";
ImgURL[1] = "/Images/Home/HomeIconMail.jpg";
ImgOverURL[1] = "/Images/Home/HomeIconMailOver.jpg";
ImgWidth[1] = 70;
IconURL[1] = "javascript:goToMail();";
ImgURL[2] = "/Images/Home/HomeIconMsgr.jpg";
ImgOverURL[2] = "/Images/Home/HomeIconMsgrOver.jpg";
ImgWidth[2] = 99;
IconURL[2] = "javascript:goToMessenger();";
ImgURL[3] = "/Images/Home/HomeIconMaps.jpg";
ImgOverURL[3] = "/Images/Home/HomeIconMapsOver.jpg";
ImgWidth[3] = 60;
IconURL[3] = "javascript:goToMaps();";
ImgURL[4] = "/Images/Home/HomeIconPhoto.jpg";
ImgOverURL[4] = "/Images/Home/HomeIconPhotoOver.jpg";
ImgWidth[4] = 70;
IconURL[4] = "javascript:goToPhotosApp();";
ImgURL[5] = "/Images/Home/HomeIconVideos.jpg";
ImgOverURL[5] = "/Images/Home/HomeIconVideosOver.jpg";
ImgWidth[5] = 70;
IconURL[5] = "javascript:goToVideoHome();";
ImgURL[6] = "/Images/Home/HomeIconMusic.jpg";
ImgOverURL[6] = "/Images/Home/HomeIconMusicOver.jpg";
ImgWidth[6] = 66;
IconURL[6] = "javascript:goToMusicHome();";
ImgURL[7] = "/Images/Home/HomeIconDiscuss.jpg";
ImgOverURL[7] = "/Images/Home/HomeIconDiscussOver.jpg";
ImgWidth[7] = 72;
IconURL[7] = "javascript:goToCenter('/Pages/Discuss/Home.aspx');";
ImgURL[8] = "/Images/Home/HomeIconMSNBC.jpg";
ImgOverURL[8] = "/Images/Home/HomeIconMSNBCOver.jpg";
ImgWidth[8] = 68;
IconURL[8] = "javascript:goToCenter('/Pages/News/TopStories.aspx');";
ImgURL[9] = "/Images/Home/HomeIconTWC.jpg";
ImgOverURL[9] = "/Images/Home/HomeIconTWCOver.jpg";
ImgWidth[9] = 81;
IconURL[9] = "javascript:goToCenter('/Pages/Weather/MyCity.aspx');";
ImgURL[10] = "/Images/Home/HomeIconEnt.jpg";
ImgOverURL[10] = "/Images/Home/HomeIconEntOver.jpg";
ImgWidth[10] = 125;
IconURL[10] = "javascript:goToCenter('/Pages/Entertainment/Home.aspx');";
ImgURL[11] = "/Images/Home/HomeIconTVListings.jpg";
ImgOverURL[11] = "/Images/Home/HomeIconTVListingsOver.jpg";
ImgWidth[11] = 96;
IconURL[11] = "javascript:goToCenter('http://tv.msn.com/tv/guide');";
ImgURL[12] = "/Images/Home/HomeIconSports.jpg";
ImgOverURL[12] = "/Images/Home/HomeIconSportsOver.jpg";
ImgWidth[12] = 82;
IconURL[12] = "javascript:goToCenter('/Pages/Sports/Main.aspx');";
ImgURL[13] = "/Images/Home/HomeIconMoney.jpg";
ImgOverURL[13] = "/Images/Home/HomeIconMoneyOver.jpg";
ImgWidth[13] = 68;
IconURL[13] = "javascript:goToCenter('/Pages/Money/Home.aspx');";
ImgURL[14] = "/Images/Home/HomeIconShopping.jpg";
ImgOverURL[14] = "/Images/Home/HomeIconShoppingOver.jpg";
ImgWidth[14] = 62;
IconURL[14] = "javascript:goToCenter('/Pages/Shopping/Main.aspx');";
ImgURL[15] = "/Images/Home/HomeIconGames.jpg";
ImgOverURL[15] = "/Images/Home/HomeIconGamesOver.jpg";
ImgWidth[15] = 70;
IconURL[15] = "javascript:goToCenter('/Pages/Games/Home.aspx');";
ImgURL[16] = "/Images/Home/HomeIconEncarta.jpg";
ImgOverURL[16] = "/Images/Home/HomeIconEncartaOver.jpg";
ImgWidth[16] = 74;
IconURL[16] = "javascript:goToCenter('http://g.msn.com/5TVANDURIL/1505')";
ImgURL[17] = "/Images/Home/HomeIconChat.jpg";
ImgOverURL[17] = "/Images/Home/HomeIconChatOver.jpg";
ImgWidth[17] = 55;
IconURL[17] = "javascript:goToChat();";
ImgURL[18] = "/Images/Home/HomeIconUsingMSN.jpg";
ImgOverURL[18] = "/Images/Home/HomeIconUsingMSNOver.jpg";
ImgWidth[18] = 127;
IconURL[18] = "javascript:goToCenter('/Pages/UsingMSNTV/Main');";
ImgURL[19] = "/Images/Home/HomeIconTTT.jpg";
ImgOverURL[19] = "/Images/Home/HomeIconTTTOver.jpg";
ImgWidth[19] = 116;
IconURL[19] = "javascript:goToCenter('/Pages/UsingMSNTV/ThingstoTry');";
ImgURL[20] = "/Images/Home/HomeIconSearch.jpg";
ImgOverURL[20] = "/Images/Home/HomeIconSearchOver.jpg";
ImgWidth[20] = 84;
IconURL[20] = "javascript:goToSearch();";
ImgObjs = new Array();
ImgOverObjs = new Array();
nIcons = ImgURL.length;
ImgOverObjs[0] = new Image();
ImgOverObjs[0].src = ImgOverURL[0];
for (var i = 0; i < nIcons; i++) {
ImgObjs[i] = new Image();
ImgObjs[i].src = ImgURL[i];
}
for (var i = 1; i < nIcons; i++) {
ImgOverObjs[i] = new Image();
ImgOverObjs[i].src = ImgOverURL[i];
}
initIcons();
</script>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</div>
<script>
function callCGif()
{
var i = new Image();
i.src = "http://c.msn.com/c.gif?DI=1455&PI=68206&PS=45577&TP=http://msntv.msn.com/HomePage.htm&RF=";
}
window.attachEvent("onload", callCGif);
</script>
</div>
</body></html>`;

View File

@@ -0,0 +1,629 @@
@page "/Pages/Home/Home.aspx"
@using MSNTV2MainServer.Components.Layout
@using Microsoft.AspNetCore.Http
@using Microsoft.AspNetCore.Components
@using MSNTV2MainServer.Components.APIs
@inject IHttpContextAccessor httpContextAccessor
@layout EmptyLayout
@if (IsTV2)
{
MarkupString htmlContent = new MarkupString($@"
<html xmlns:msntv>
<?import namespace=""msntv"" implementation=""Shared/Anduril/HTC/en-us/TruncatedHtml.htc""?>
<head><title>Home</title>
<?import namespace=""msntv"" implementation=""HTC/Shared/CustomButton.htc""?>
<?import namespace=""msntv"" implementation=""/Pages/Home/Shared/BaseClient/HTCTransforms/en-us/LoopingDIV.htc""?>
<script src=""/Include/2.0.261.900/localhost-1700/Shared/BaseClient/JsTransforms/en-us/PaneHelp.js"" language=""javascript"" defer=""true""></script>
<link href=""/Include/2.0.261.778/localhost-1700/Home/Anduril/CssTransforms/en-us/Home.css"" type=""text/css"" rel=""StyleSheet"">
<script src=""/Include/2.0.261.778/localhost-1700/Home/Anduril/JsTransforms/en-us/Home.js"" language=""javascript""></script>
<script>
var forceReload = false;
var l = 'd:' + new Date().valueOf() + '|';
function setCookie(name, value) {{
{{
var now = new Date();
var expires = new Date(now.getFullYear() + 1, now.getMonth(), now.getDate());
document.cookie = escape(name) + '=' + escape(value) + ';expires=' + expires.toGMTString() + ';path=/';
}}
}}
function getCookie(name) {{
{{
var str = document.cookie;
var arr = str.split('; ');
for (var i = arr.length - 1; i >= 0; i--) {{
{{
var c = arr[i].split('=');
if (c.length != 2)
continue;
if (unescape(c[0]) == name)
return unescape(c[1]);
}}
}}
return null;
}}
}}
function syncCookie(cookieName, propValue) {{
{{
var c = getCookie(cookieName);
l += 'g:' + cookieName + ':' + c + '|';
if (c != propValue) {{
{{
setCookie(cookieName, propValue);
l += 's:' + cookieName + ':' + propValue + '|';
var check = getCookie(cookieName);
if (check == propValue)
forceReload = true;
}}
}}
}}
}}
var d = new Date();
var utcOffset = d.getTimezoneOffset();
syncCookie('UserUtcOffset', utcOffset);
var connSpeed;
try {{ {{ connSpeed = window.external.ClientCaps.connectionType; }} }}
catch (e) {{
{{
connSpeed = ""undetected"";
}}
}}
syncCookie('UserConnectionSpeed', connSpeed);
try {{
{{
top.log(l);
}}
}}
catch (e) {{
{{
}}
}}
if (forceReload)
location.replace(location.href);
</script></head>
<body>
<body onload=""initPage();"" scroll=""no"" tabindex=""-1"">
<div id=""focdiv"" style=""position:absolute;top:314px;left:27px;width:70px;height:70px;"" onclick=""goToMail();"">
</div>
<script>
document.all[""focdiv""].focus();
// when looping div is ready, you can hide the invisible rectangle used for holding Mail's
function handleLoopingDivReady()
{{
document.all[""focdiv""].style.display = ""none"";
}}
</script>
<div class=""topdiv"">
<div class=""textMenu"">
<script xmlns:msntvuxp=""msntvuxp.microsoft.com"">
function goToService(serviceName) {{window.location = window.external.SafeGetServiceURL(serviceName);}}
function goToCenter(URL) {{window.location = URL;}}
</script>
<div style=""position:absolute; left:0px; top:0px"" xmlns:msntvuxp=""msntvuxp.microsoft.com"">
<table border=""0"" class=""TextMenuTbl"">
<tr height=""34"" style=""background-color: transparent;"">
<td class=""leftGradientTD""></td><td class=""rightGradientTD"">
</td>
</tr>
</table>
</div>
<div style=""position:absolute; left:0px; top:0px"" xmlns:msntvuxp=""msntvuxp.microsoft.com"">
<table border=""0"" class=""TextMenuTbl"">
<tr>
<td style=""background-color: transparent;"" width=""8"">
<img height=""1"" src=""/Images/Shared/s.gif"" width=""8"">
</td>
<td style=""background-color: transparent;"" align=""left"" width=""162"">
<a class=""TextMenuLink"" href=""javascript:goToCenter('/Pages/UsingMSNTV/Main');"" id=""UsingMSNTVLinkID"" onblur=""umtvHasFocus=false"">Using MSN TV</a>
</td>
<div>
<span style=""position:absolute;left:0;top:35px;width:100%;height:2px;background-color:#8fc3d6;"">
</span>
</div>
<td style=""background-color: transparent;"" align=""left"" width=""115"">
<a class=""TextMenuLink"" href=""javascript:void(window.open(' ', 'signout', 'msntv:panel'));"" id=""SignoutLinkID"">Sign Out</a>
</td>
<div>
<span style=""position:absolute;left:0;top:35px;width:100%;height:2px;background-color:#8fc3d6;""></span>
</div>
<td style=""background-color: transparent;"" align=""left"" width=""106"">
<a class=""TextMenuLink"" href=""javascript:goToService('UAM::UAMbase');"" id=""AccountLinkID"">Account</a>
</td>
<div>
<span style=""position:absolute;left:0;top:35px;width:100%;height:2px;background-color:#8fc3d6;"">
</span>
</div>
<td style=""background-color: transparent;"" align=""left"" width=""109"">
<a class=""TextMenuLink"" href=""javascript:goToService('settings::mainindex');"" id=""SettingsLinkID"">Settings</a>
</td>
<div><span style=""position:absolute;left:0;top:35px;width:100%;height:2px;background-color:#8fc3d6;"">
</span>
</div>
<td style=""background-color: transparent;"" align=""left"" width=""78"">
<a href='javascript:CallPaneHelp(PH_TOC);' id=""HelpLinkID"">
<table><tr>
<td valign=""middle"" class=""TextMenuLinkSimulation"">Help</td>
<td valign=""middle"" width=""30"" height=""20"">
<span id=""helpIcon"" style='src:url(msntv:/Shared/Images/Icon_Help_RelatedLink.png);'></span>
</td>
</tr>
</table>
</a>
</td>
<div>
<span style=""position:absolute;left:0;top:35px;width:100%;height:2px;background-color:#8fc3d6;"">
</span>
</div>
</tr>
</table>
</div>
</div>
<div class=""infoPaneDiv"">
<div class=""promoImgDiv"">
<div style=""position:absolute; left:0px; top:0px"">
<img id=""PromoImageID"" width=""178"" height=""135"" border=""0"" hspace=""0"" alt=""Promotional Image"" src=""/Pages/Home/ads/webtv3.gif"">
</div>
<div style=""position:absolute; left:5px; top:0px""><a id=""PromoImageLinkID"" href="""">
<table width=""173"" height=""135""><tr><td></td></tr></table></a>
</div>
</div>
<div id=""timerRotatorDiv"" class=""personalPanelDiv"" onclick=""ClickRotator()"">
<div>
<div style=""top:0px; left:0px; width:176px; height:105px;"" xmlns:msntvuxp=""msntvuxp.microsoft.com"">
<div class=""PNGImage"" style=""width:176px;height:105px;src:/images/Home/HomeRotatorBGWeather.png;""></div>
</div>
<div style=""position:absolute; top:0px; left:0px; width:178px; height:107px;"" xmlns:msntvuxp=""msntvuxp.microsoft.com"">
<table class=""wthrTbl"" border=""0"" cellpadding=""1"" cellspacing=""0"">
<tr>
<td height=""4"" width=""4"" rowspan=""4""><img src=""images/Shared/s.gif"" height=""4"" width=""4""></td>
<td height=""4"" width=""45""><img src=""images/Shared/s.gif"" height=""4"" width=""45""></td>
<td height=""4"" width=""10""><img src=""images/Shared/s.gif"" height=""4"" width=""10""></td>
<td height=""4"" width=""65""><img src=""images/Shared/s.gif"" height=""4"" width=""65""></td>
</tr>
<tr>
<td id=""CityCellID"" class=""wthrCityCell"" colspan=""3"" valign=""top"">
<span class=""wthrCityText"">{@Weather.City}</span>
</td>
</tr>
<tr>
<td id=""TRCID"" class=""wthrTempCond"">
<table>
<tr>
<td id=""TemperatureCellID"" class=""wthrTempCell"">
<span class=""wthrTempTxt"">{@Weather.Temp}°F</span>
</td>
</tr>
<tr>
<td id=""ConditionCellID"" class=""wthrCondCell"">
<span class=""wthrCondTxt"">{Weather?.Description}</span>
</td>
</tr>
</table>
</td>
<td id=""PaddingID"" width=""10""><img src=""images/Shared/s.gif"" height=""1"" width=""10""></td>
<td id=""ConditionIconID"" class=""wthrCondIcon"">
<img src=""{@Weather?.Icon}"" alt=""Weather icon"" style=""width:65px;height:61px;"">
</td>
</tr>
<tr>
<td id=""ProviderID"" class=""wthrProvider"" colspan=""3"">
Open-Meteo
</td>
</tr>
</table>
</div>
<script xmlns:msntvuxp=""msntvuxp.microsoft.com"">
function clickPageRotatePanel() {{
location.href = ""/Pages/weather/yourcity"";
}}
</script>
</div>
</div>
<script>
InitRotator(timerRotatorDiv, 5000, new Array(""/home/MoneyModule.aspx"",""/Pages/weather/WeatherModule""));
</script>
<div ID=""clockID"" class=""clockDiv"">
</div>
<script>clockID.innerHTML = formClockLink();</script>
<div class=""newsHdlnDiv"">
<div class=""newsHdlnTitleDiv""><span class=""newsHdlnTitleText"">Today on TV2</span></div><table style=""top:0px;left:0px;width:365px;height:78px;""><tr><td><a class=""newsHdlnLink"" id=""newsHdlnLinkID1"" href=""{@NewsLink1}"">{NewsTitle1}</a></td></tr><tr><td><a class=""newsHdlnLink"" id=""newsHdlnLinkID2"" href=""{@NewsLink2}"">{NewsTitle2}</a></td></tr><tr><td><a class=""newsHdlnLink"" id=""newsHdlnLinkID3"" href=""{@NewsLink3}"">{NewsTitle3}</a></td></tr></table></td></tr></table><div class=""moreNewsDiv""><table><tr><td><img src=""msntv:/Shared/images/BulletCustom.gif"" height=""14"" width=""7""></td><td><img src=""images/Shared/s.gif"" height=""1"" width=""4""></td><td style=""height:37px""><a id=""moreNewsLinkID"" class=""moreNewsLink"" href=""../pages/TopStories"">More MSN news</a></td></tr></table></div>
</div>
<div class=""promoPanelDiv"">
<div style=""position:absolute; width:355px; height:70px;"">
<table style=""width:365px;""><td class=""promoHdlnTitle"" style=""color:#1D704C"">Using MSN TV</td><tr>
<td class=""promoHdlnCell""><a class=""promoHdlnLink"" id=""promoHdlnLinkID1"" href=""http://msntv.msn.com/pages/usingmsntv/tippage.aspx?id=set15"">Tip: Turn on audible dialing </a></td></tr><tr>
<td class=""promoHdlnCell""><a class=""promoHdlnLink"" id=""promoHdlnLinkID2"" href=""http://msntv.msn.com/pages/UsingMSNTV/Article.aspx?id=feature3"">Get better printing results</a></td></tr>
</table>
</div>
<div style=""position:absolute; left:161px; top:74px; width:200px;"">
<table class=""MoreUsingLinkTable""><tr><td><img src=""msntv:/Shared/Images/BulletCustom.gif"" height=""14"" width=""7""></td><td><img src=""/Images/Shared/s.gif"" height=""1"" width=""4""></td><td>
<a id=""MoreUsingLinkID"" class=""MoreNewsLink"" href=""http://headwaiter.trusted.msntv.msn.com/Pages/UsingMSNTV/Main"">Go to Using MSN TV</a>
</td></tr>
</table>
</div>
</div>
</div>
<div id=""searchID"" class=""searchDiv"">
<div class=""searchCenterDiv"">
<script>
function doSearch(country){{
if (searchFormID.searchFieldID.value == """")
{{
window.location = window.external.SafeGetServiceURL('search::search'); + ""?FORM=WEBTV&cfg=MSTVXML&v=1&c=""+country+""&x=26&y=14"";
}}
else
{{
window.location = window.external.SafeGetServiceURL('search::search') + ""?FORM=WEBTV&cfg=MSTVXML&v=1&c=""+country+""&x=26&y=14&q="" + escape(searchFormID.searchFieldID.value);
}}
}}
</script>
<div style=""position:absolute; z-index:1; left:0; top:0px; width:100%; height:2px; background-color:#0c7faa;"">
<table style="" width:100%; height:2px;"">
<tr>
<td height=""2"">
</td>
</tr>
</table>
</div>
<table class=""searchTbl"">
<form id=""searchFormID"" action=""javascript:doSearch('US')"">
<tr>
<td width=""10"">
</td><td>
<a class=""searchLink"" href=""
javascript:doSearch('US');
"">Search</a><span class=""searchLabelText""> or type www</span>
</td><td></td><td><span class=""searchFieldText""><input id=""searchFieldID"" name=""searchFieldName"" class=""searchField"" type=""text"" size=""28""></span></td><td></td>
<td valign=""center""><msntv:custombutton id=""GoButtonID"" onClick=""doSearch('US');"" label=""Go"" /></td></tr></form></table><div style=""position:absolute; left:0; top:33px; width:100%; height:2px; background-color:#1c4373;""><table style="" width:100%; height:2px;""><tr><td height=""2""></td></tr></table></div>
</div>
</div>
<div id=""iconNavBarID"" class=""iconNavBar"">
<table class=""iconNavBarMasterTbl"">
<tr>
<td align=""center"" valign=""middle"">
<table class=""iconNavBarTbl"">
<tr>
<td class=""iconNavBarTblFrameCell"">
<table class=""ApolloIcons"" xmlns:msntv=""http://tv.msn.com"">
<tr height=""70"">
<td>
<msntv:loopingDIV id=""navbar"" hasInitialFocus=""true"" divWidthPX=""554"" onLoopingDivReady=""handleLoopingDivReady()"" />
</td>
</tr>
<script>
var nIcons;
var ImgURL = new Array();
var ImgWidth = new Array();
var ImgOverURL = new Array();
var URL = new Array();
function goToFavorites() {{
window.open("" "", ""favoritespanel"", ""msntv:panel"");
}}
function goToMessenger() {{
if (window.external.SafeGetServiceURL('messenger::root') != null && window.external.SafeGetServiceURL('messenger::root') != """") window.open("" "", ""impanel"", ""msntv:panel"");
else
window.location = ""msntv:/OLTK/IMBlock.html"";
}}
function goToMail() {{
if (window.external.SafeGetServiceURL('mail::listmail') != null && window.external.SafeGetServiceURL('mail::listmail') != """") window.location = window.external.SafeGetServiceURL('mail::listmail');
else
window.location = ""msntv:/OLTK/EmailBlock.html"";
}}
function goToChat() {{
if (window.external.SafeGetServiceURL('chat::home') != null && window.external.SafeGetServiceURL('chat::home') != """") window.location = window.external.SafeGetServiceURL('chat::home');
else
window.location = ""msntv:/OLTK/chatBlock.html"";
}}
function goToSearch() {{
window.location = window.external.SafeGetServiceURL('search::main');
}}
function goToMaps() {{
window.location = window.external.SafeGetServiceURL('maps::main');
}}
function goToMusicHome() {{
window.location = window.external.SafeGetServiceURL('Music::Home');
}}
function goToVideoHome() {{
window.location = window.external.SafeGetServiceURL('Video::Home');
}}
function goToNetwork() {{
window.location = window.external.SafeGetServiceURL('Settings::HomeNetwork');
}}
function goToAccount() {{
window.location = window.external.SafeGetServiceURL('UAM::UAMbase');
}}
function goToSettings() {{
window.location = window.external.SafeGetServiceURL('settings::mainindex');
}}
function goToCenter(URL) {{
window.location = URL;
}}
function goToPhotosApp() {{
window.location = window.external.SafeGetServiceURL('Photos');
}}
function goToPhotosHome() {{
window.location = window.external.SafeGetServiceURL('Photo::Home');
}}
function initIcons() {{
for (index = 0; index < nIcons; index++) {{
var realIndex = (index + nIcons - 1) % nIcons;
var cellHTML = ""<span"" + "" onFocus=\""ImgObjs"" + realIndex + "".src='"" + ImgOverURL[realIndex] + ""'\"""" + "" onBlur=\""ImgObjs"" + realIndex + "".src='"" + ImgURL[realIndex] + ""'\"""";
cellHTML += "" onClick=\"""" + URL[realIndex] + ""\"""";
cellHTML += "">"" + ""<img"" + "" id='ImgObjs"" + realIndex + ""'"" + "" src='"" + ImgURL[realIndex] + ""' width="" + ImgWidth[realIndex] + "" height=61 border=0>"" + ""</span>"";
navbar.AddCellHTML(cellHTML, ImgWidth[realIndex]);
}}
}}
ImgURL[0] = ""/Images/Home/HomeIconFav.jpg"";
ImgOverURL[0] = ""/Images/Home/HomeIconFavOver.jpg"";
ImgWidth[0] = 87;
URL[0] = ""javascript:goToFavorites();"";
ImgURL[1] = ""/Images/Home/HomeIconMail.jpg"";
ImgOverURL[1] = ""/Images/Home/HomeIconMailOver.jpg"";
ImgWidth[1] = 70;
URL[1] = ""javascript:goToMail();"";
ImgURL[2] = ""/Images/Home/HomeIconMsgr.jpg"";
ImgOverURL[2] = ""/Images/Home/HomeIconMsgrOver.jpg"";
ImgWidth[2] = 99;
URL[2] = ""javascript:goToMessenger();"";
ImgURL[3] = ""/Images/Home/HomeIconMaps.jpg"";
ImgOverURL[3] = ""/Images/Home/HomeIconMapsOver.jpg"";
ImgWidth[3] = 60;
URL[3] = ""javascript:goToMaps();"";
ImgURL[4] = ""/Images/Home/HomeIconPhoto.jpg"";
ImgOverURL[4] = ""/Images/Home/HomeIconPhotoOver.jpg"";
ImgWidth[4] = 70;
URL[4] = ""javascript:goToPhotosApp();"";
ImgURL[5] = ""/Images/Home/HomeIconVideos.jpg"";
ImgOverURL[5] = ""/Images/Home/HomeIconVideosOver.jpg"";
ImgWidth[5] = 70;
URL[5] = ""javascript:goToVideoHome();"";
ImgURL[6] = ""/Images/Home/HomeIconMusic.jpg"";
ImgOverURL[6] = ""/Images/Home/HomeIconMusicOver.jpg"";
ImgWidth[6] = 66;
URL[6] = ""javascript:goToMusicHome();"";
ImgURL[7] = ""/Images/Home/HomeIconDiscuss.jpg"";
ImgOverURL[7] = ""/Images/Home/HomeIconDiscussOver.jpg"";
ImgWidth[7] = 72;
URL[7] = ""javascript:goToCenter('/Pages/Discuss/Home.aspx');"";
ImgURL[8] = ""/Images/Home/HomeIconMSNBC.jpg"";
ImgOverURL[8] = ""/Images/Home/HomeIconMSNBCOver.jpg"";
ImgWidth[8] = 68;
URL[8] = ""javascript:goToCenter('/Pages/News/TopStories.aspx');"";
ImgURL[9] = ""/Images/Home/HomeIconTWC.jpg"";
ImgOverURL[9] = ""/Images/Home/HomeIconTWCOver.jpg"";
ImgWidth[9] = 81;
URL[9] = ""javascript:goToCenter('/Pages/Weather/MyCity.aspx');"";
ImgURL[10] = ""/Images/Home/HomeIconEnt.jpg"";
ImgOverURL[10] = ""/Images/Home/HomeIconEntOver.jpg"";
ImgWidth[10] = 125;
URL[10] = ""javascript:goToCenter('/Pages/Entertainment/Home.aspx');"";
ImgURL[11] = ""/Images/Home/HomeIconTVListings.jpg"";
ImgOverURL[11] = ""/Images/Home/HomeIconTVListingsOver.jpg"";
ImgWidth[11] = 96;
URL[11] = ""javascript:goToCenter('http://tv.msn.com/tv/guide');"";
ImgURL[12] = ""/Images/Home/HomeIconSports.jpg"";
ImgOverURL[12] = ""/Images/Home/HomeIconSportsOver.jpg"";
ImgWidth[12] = 82;
URL[12] = ""javascript:goToCenter('/Pages/Sports/Main.aspx');"";
ImgURL[13] = ""/Images/Home/HomeIconMoney.jpg"";
ImgOverURL[13] = ""/Images/Home/HomeIconMoneyOver.jpg"";
ImgWidth[13] = 68;
URL[13] = ""javascript:goToCenter('/Pages/Money/Home.aspx');"";
ImgURL[14] = ""/Images/Home/HomeIconShopping.jpg"";
ImgOverURL[14] = ""/Images/Home/HomeIconShoppingOver.jpg"";
ImgWidth[14] = 62;
URL[14] = ""javascript:goToCenter('/Pages/Shopping/Main.aspx');"";
ImgURL[15] = ""/Images/Home/HomeIconGames.jpg"";
ImgOverURL[15] = ""/Images/Home/HomeIconGamesOver.jpg"";
ImgWidth[15] = 70;
URL[15] = ""javascript:goToCenter('/Pages/Games/Home.aspx');"";
ImgURL[16] = ""/Images/Home/HomeIconEncarta.jpg"";
ImgOverURL[16] = ""/Images/Home/HomeIconEncartaOver.jpg"";
ImgWidth[16] = 74;
URL[16] = ""javascript:goToCenter('http://g.msn.com/5TVANDURIL/1505')"";
ImgURL[17] = ""/Images/Home/HomeIconChat.jpg"";
ImgOverURL[17] = ""/Images/Home/HomeIconChatOver.jpg"";
ImgWidth[17] = 55;
URL[17] = ""javascript:goToChat();"";
ImgURL[18] = ""/Images/Home/HomeIconUsingMSN.jpg"";
ImgOverURL[18] = ""/Images/Home/HomeIconUsingMSNOver.jpg"";
ImgWidth[18] = 127;
URL[18] = ""javascript:goToCenter('/Pages/UsingMSNTV/Main');"";
ImgURL[19] = ""/Images/Home/HomeIconTTT.jpg"";
ImgOverURL[19] = ""/Images/Home/HomeIconTTTOver.jpg"";
ImgWidth[19] = 116;
URL[19] = ""javascript:goToCenter('/Pages/UsingMSNTV/ThingstoTry');"";
ImgURL[20] = ""/Images/Home/HomeIconSearch.jpg"";
ImgOverURL[20] = ""/Images/Home/HomeIconSearchOver.jpg"";
ImgWidth[20] = 84;
URL[20] = ""javascript:goToSearch();"";
ImgObjs = new Array();
ImgOverObjs = new Array();
nIcons = ImgURL.length;
ImgOverObjs[0] = new Image();
ImgOverObjs[0].src = ImgOverURL[0];
for (var i = 0; i < nIcons; i++) {{
ImgObjs[i] = new Image();
ImgObjs[i].src = ImgURL[i];
}}
for (var i = 1; i < nIcons; i++) {{
ImgOverObjs[i] = new Image();
ImgOverObjs[i].src = ImgOverURL[i];
}}
initIcons();
</script>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</div>
<script>
function callCGif()
{{
var i = new Image();
i.src = ""http://c.msn.com/c.gif?DI=1455&PI=68206&PS=45577&TP=http://msntv.msn.com/HomePage.htm&RF="";
}}
window.attachEvent(""onload"", callCGif);
</script>
</div>
</body></html>
");
@((MarkupString)htmlContent)
}
else
{
<PageTitle>Home</PageTitle>
<h1>Hello, world!</h1>
<footer>
<div style="position:fixed; left: 0px; bottom: 20px; width: 100vw;">
<TV2PCHomeNavBar />
</div>
<div style="position:fixed; left: 0px; bottom: 0; width: 100vw; height: 40px;">
<table cellpadding="0" cellspacing="0" width="100%" height="100%">
<tr>
<td width="560">
<img src="/Images/TV2PC/StatusBarBG.jpg" style="width: 100vw; height: 40px; object-fit: fill;"/>
<img src="/Images/TV2PC/Logo_MSNTVStatusBar.png" alt="Overlay Logo" class="overlay-logo" style="position: absolute; right: 0.1vw; bottom: 5px; max-width: 150%; z-index: 1001;" />
</td>
</tr>
</table>
</div>
</footer>
}
@code {
string userAgent { get; set; }
bool IsTV2 = false;
// News
string NewsLink1 = "http://sg1.trusted.msntv.msn.com/Pages/Tricks/he.mp3";
string NewsLink2 = "http://sg1.trusted.msntv.msn.com/Pages/Tricks/pokemon-black-2.mp3";
string NewsLink3 = "http://sg1.trusted.msntv.msn.com/Pages/Tricks/he.mp3";
string NewsTitle1 = "Ryder Smells";
string NewsTitle2 = "Ryder Smells";
string NewsTitle3 = "Ryder Smells";
// Weather mock
WeatherData Weather = new WeatherData
{
City = "San Jose",
Temp = "72",
Description = "Sunny",
Icon = "/Pages/Home/Weather/26.gif"
};
// Date data
DateData date = new DateData();
protected override void OnInitialized()
{
var request = httpContextAccessor.HttpContext?.Request;
IsTV2 = request != null && SecurityHandler.IsMsnTvClient(request) && SecurityHandler.IsTrustedDomain(request);
}
class WeatherData
{
public string City { get; set; }
public string Temp { get; set; }
public string Description { get; set; }
public string Icon { get; set; }
}
class DateData
{
public string date { get; }
public DateData()
{
date = DateTime.Now.ToString("dddd, MMMM d");
}
}
}

View File

@@ -0,0 +1,127 @@
const minisrv_service_file = true;
headers = `200 OK
Content-type: text/html`;
data = `<html>
<head>
<script>
var forceReload = false;
var l = 'd:' + new Date().valueOf() + '|';
function setCookie(name, value) {
var now = new Date();
var expires = new Date(now.getFullYear() + 1, now.getMonth(), now.getDate());
document.cookie = escape(name) + '=' + escape(value) + ';expires=' + expires.toGMTString() + ';path=/';
}
function getCookie(name) {
var str = document.cookie;
var arr = str.split('; ');
for (var i = arr.length - 1; i >= 0; i--) {
var c = arr[i].split('=');
if (c.length != 2) continue;
if (unescape(c[0]) == name) return unescape(c[1]);
}
return null;
}
function syncCookie(cookieName, propValue) {
var c = getCookie(cookieName);
l += 'g:' + cookieName + ':' + c + '|';
if (c != propValue) {
setCookie(cookieName, propValue);
l += 's:' + cookieName + ':' + propValue + '|';
var check = getCookie(cookieName);
if (check == propValue) forceReload = true;
}
}
var d = new Date();
var utcOffset = d.getTimezoneOffset();
syncCookie('UserUtcOffset', utcOffset);
var connSpeed;
try {
connSpeed = window.external.ClientCaps.connectionType;
} catch (e) {
connSpeed = "undetected";
}
syncCookie('UserConnectionSpeed', connSpeed);
try {
top.log(l);
} catch (e) {}
if (forceReload) location.replace(location.href);
</script>
</head>
<body>
<div style="top:0px; left:0px; width:176px; height:105px;">
<div class="PNGImage" style="width:176px;height:105px;src:/Images/Home/HomeRotatorBGStock.png;"></div>
</div>
<table cellpadding="0" cellspacing="0" class="stocksTbl">
<tbody>
<tr height="8">
<td width="7"></td>
<td width="75"></td>
<td width="5"></td>
<td width="14"></td>
<td width="7"></td>
<td width="65"></td>
<td width="5"></td>
</tr>
<tr>
<td></td>
<td class="stocksCell" style="font-weight:bold; overflow:hidden; text-overflow:ellipsis">Dow</td>
<td></td>
<td>
<div class="PNGImage" style="src:/Images/Home/HomeStocksUpArrow.png; width:14px; height:24px"></div>
</td>
<td></td>
<td class="stocksCell" style="text-align: right;">+54.11</td>
<td></td>
</tr>
<tr>
<td class="stocksRule" colspan="7"></td>
</tr>
<tr>
<td></td>
<td class="stocksCell" style="font-weight:bold; overflow:hidden; text-overflow:ellipsis">Nasdaq</td>
<td></td>
<td>
<div class="PNGImage" style="src:/Images/Home/HomeStocksUpArrow.png; width:14px; height:24px"></div>
</td>
<td></td>
<td class="stocksCell" style="text-align: right;">+6.31</td>
<td></td>
</tr>
<tr>
<td class="stocksRule" colspan="7"></td>
</tr>
<tr>
<td></td>
<td class="stocksCell" style="font-weight:bold; overflow:hidden; text-overflow:ellipsis">S&amp;P</td>
<td></td>
<td>
<div class="PNGImage" style="src:/Images/Home/HomeStocksUpArrow.png; width:14px; height:24px"></div>
</td>
<td></td>
<td class="stocksCell" style="text-align: right;">+3.19</td>
<td></td>
</tr>
<tr>
<td class="stocksRule" colspan="7"></td>
</tr>
<tr>
<td id="ProviderID" class="wthrProvider" colspan="6">Source: MSN Money</td>
</tr>
</tbody>
</table>
<!--<ROTATOR_FEEDBACK></ROTATOR_FEEDBACK>--><!--<ROTATOR_CLICKTHROUGH>/Pages/Money/MyStocks.aspx</ROTATOR_CLICKTHROUGH>-->
<script>
function clickPageRotatePanel() {
location.href = "/Pages/Money/MyStocks.aspx";
}
</script>
</body>
</html>`;

View File

@@ -0,0 +1,164 @@
@page "/Pages/Home/MoneyModule.aspx"
@using MSNTV2MainServer.Components.Layout
@using Microsoft.AspNetCore.Http
@using Microsoft.AspNetCore.Components;
@inject IHttpContextAccessor httpContextAccessor
<!-- Nulled layout as it is defined manually-->
@layout EmptyLayout
@if (IsTV2)
{
MarkupString htmlContent = new MarkupString($@"
<html>
<head>
<script>
var forceReload = false;
var l = 'd:' + new Date().valueOf() + '|';
function setCookie(name, value) {{
var now = new Date();
var expires = new Date(now.getFullYear() + 1, now.getMonth(), now.getDate());
document.cookie = escape(name) + '=' + escape(value) + ';expires=' + expires.toGMTString() + ';path=/';
}}
function getCookie(name) {{
var str = document.cookie;
var arr = str.split('; ');
for (var i = arr.length - 1; i >= 0; i--) {{
var c = arr[i].split('=');
if (c.length != 2) continue;
if (unescape(c[0]) == name) return unescape(c[1]);
}}
return null;
}}
function syncCookie(cookieName, propValue) {{
var c = getCookie(cookieName);
l += 'g:' + cookieName + ':' + c + '|';
if (c != propValue) {{
setCookie(cookieName, propValue);
l += 's:' + cookieName + ':' + propValue + '|';
var check = getCookie(cookieName);
if (check == propValue) forceReload = true;
}}
}}
var d = new Date();
var utcOffset = d.getTimezoneOffset();
syncCookie('UserUtcOffset', utcOffset);
var connSpeed;
try {{
connSpeed = window.external.ClientCaps.connectionType;
}} catch (e) {{
connSpeed = ""undetected"";
}}
syncCookie('UserConnectionSpeed', connSpeed);
try {{
top.log(l);
}} catch (e) {{}}
if (forceReload) location.replace(location.href);
</script>
</head>
<body>
<div style=""top:0px; left:0px; width:176px; height:105px;"">
<div class=""PNGImage"" style=""width:176px;height:105px;src:/Images/Home/HomeRotatorBGStock.png;""></div>
</div>
<table cellpadding=""0"" cellspacing=""0"" class=""stocksTbl"">
<tbody>
<tr height=""8"">
<td width=""7""></td>
<td width=""75""></td>
<td width=""5""></td>
<td width=""14""></td>
<td width=""7""></td>
<td width=""65""></td>
<td width=""5""></td>
</tr>
<tr>
<td></td>
<td class=""stocksCell"" style=""font-weight:bold; overflow:hidden; text-overflow:ellipsis"">Dow</td>
<td></td>
<td>
<div class=""PNGImage"" style=""src:/Images/Home/HomeStocksUpArrow.png; width:14px; height:24px""></div>
</td>
<td></td>
<td class=""stocksCell"" style=""text-align: right;"">+54.11</td>
<td></td>
</tr>
<tr>
<td class=""stocksRule"" colspan=""7""></td>
</tr>
<tr>
<td></td>
<td class=""stocksCell"" style=""font-weight:bold; overflow:hidden; text-overflow:ellipsis"">Nasdaq</td>
<td></td>
<td>
<div class=""PNGImage"" style=""src:/Images/Home/HomeStocksUpArrow.png; width:14px; height:24px""></div>
</td>
<td></td>
<td class=""stocksCell"" style=""text-align: right;"">+6.31</td>
<td></td>
</tr>
<tr>
<td class=""stocksRule"" colspan=""7""></td>
</tr>
<tr>
<td></td>
<td class=""stocksCell"" style=""font-weight:bold; overflow:hidden; text-overflow:ellipsis"">S&amp;P</td>
<td></td>
<td>
<div class=""PNGImage"" style=""src:/Images/Home/HomeStocksUpArrow.png; width:14px; height:24px""></div>
</td>
<td></td>
<td class=""stocksCell"" style=""text-align: right;"">+3.19</td>
<td></td>
</tr>
<tr>
<td class=""stocksRule"" colspan=""7""></td>
</tr>
<tr>
<td id=""ProviderID"" class=""wthrProvider"" colspan=""6"">Source: MSN Money</td>
</tr>
</tbody>
</table>
<!--<ROTATOR_FEEDBACK></ROTATOR_FEEDBACK>--><!--<ROTATOR_CLICKTHROUGH>/Pages/Money/MyStocks.aspx</ROTATOR_CLICKTHROUGH>-->
<script>
function clickPageRotatePanel() {{
location.href = ""/Pages/Money/MyStocks.aspx"";
}}
</script>
</body>
</html>
");
@((MarkupString)htmlContent)
}
else
{
<PageTitle>Home</PageTitle>
}
@code
{
string userAgent { get; set; }
bool IsTV2 = false;
protected override void OnInitialized()
{
userAgent = httpContextAccessor.HttpContext.Request.Headers["User-Agent"];
//Check if the client is an MSNTV2 box. If it is, we should return the TV2 page and not the Blazor based Page.
if(userAgent.Contains("MSNTV"))
{
IsTV2 = true;
StateHasChanged();
}
}
}

View File

@@ -0,0 +1,104 @@
const minisrv_service_file = true;
headers = `200 OK
Content-type: text/html`;
data = `<html>
<head>
<script>
var forceReload = false;
var l = 'd:' + new Date().valueOf() + '|';
function setCookie(name, value) {
var now = new Date();
var expires = new Date(now.getFullYear() + 1, now.getMonth(), now.getDate());
document.cookie = escape(name) + '=' + escape(value) + ';expires=' + expires.toGMTString() + ';path=/';
}
function getCookie(name) {
var str = document.cookie;
var arr = str.split('; ');
for (var i = arr.length - 1; i >= 0; i--) {
var c = arr[i].split('=');
if (c.length != 2) continue;
if (unescape(c[0]) == name) return unescape(c[1]);
}
return null;
}
function syncCookie(cookieName, propValue) {
var c = getCookie(cookieName);
l += 'g:' + cookieName + ':' + c + '|';
if (c != propValue) {
setCookie(cookieName, propValue);
l += 's:' + cookieName + ':' + propValue + '|';
var check = getCookie(cookieName);
if (check == propValue) forceReload = true;
}
}
var d = new Date();
var utcOffset = d.getTimezoneOffset();
syncCookie('UserUtcOffset', utcOffset);
var connSpeed;
try {
connSpeed = window.external.ClientCaps.connectionType;
} catch (e) {
connSpeed = "undetected";
}
syncCookie('UserConnectionSpeed', connSpeed);
try {
top.log(l);
} catch (e) {}
if (forceReload) location.replace(location.href);
</script>
</head>
<body>
<div style="top:0px; left:0px; width:176px; height:105px;" xmlns:msntvuxp="msntvuxp.microsoft.com">
<div class="PNGImage" style="width:176px;height:105px;src:/Images/Home/HomeRotatorBGWeather.png;"></div>
</div>
<div style="position:absolute; top:0px; left:0px; width:178px; height:107px;" xmlns:msntvuxp="msntvuxp.microsoft.com">
<table class="wthrTbl" border="0" cellpadding="1" cellspacing="0">
<tbody>
<tr>
<td height="4" width="4" rowspan="4"><img src="/Images/Shared/s.gif" height="4" width="4"></td>
<td height="4" width="45"><img src="/Images/Shared/s.gif" height="4" width="45"></td>
<td height="4" width="10"><img src="/Images/Shared/s.gif" height="4" width="10"></td>
<td height="4" width="65"><img src="/Images/Shared/s.gif" height="4" width="65"></td>
<td height="4" width="10" rowspan="4"><img src="/Images/Shared/s.gif" height="4" width="10"></td>
</tr>
<tr>
<td id="CityCellID" class="wthrCityCell" colspan="3" valign="top"><span class="wthrCityText">Your City</span></td>
</tr>
<tr>
<td id="TRCID" class="wthrTempCond">
<table>
<tbody>
<tr>
<td id="TemperatureCellID" class="wthrTempCell"><span class="wthrTempTxt">63&#176;/50</span></td>
</tr>
<tr>
<td id="ConditionCellID" class="wthrCondCell"><span class="wthrCondTxt">Mostly</span><br><span class="wthrCondTxt"> Cloudy</span></td>
</tr>
</tbody>
</table>
</td>
<td id="PaddingID" width="10"><img src="/Images/Shared/s.gif" height="1" width="10"></td>
<td id="ConditionIconID" class="wthrCondIcon"><span class="PNGImage" style="src:/Images/Shared/Weather/28.png;width:65px;height:61px;"></span></td>
</tr>
<tr>
<td id="ProviderID" class="wthrProvider" colspan="3">The Weather Channel &#174;</td>
</tr>
</tbody>
</table>
</div>
<!--<ROTATOR_FEEDBACK></ROTATOR_FEEDBACK>--><!--<ROTATOR_CLICKTHROUGH>/Pages/Weather/YourCity.aspx</ROTATOR_CLICKTHROUGH>-->
<script xmlns:msntvuxp="msntvuxp.microsoft.com">
function clickPageRotatePanel() {
location.href = "/Pages/Weather/YourCity.aspx";
}
</script>
</body>
</html>`;

View File

@@ -0,0 +1,166 @@
@page "/Pages/Home/WeatherModule.aspx"
@using MSNTV2MainServer.Components.Layout
@using Microsoft.AspNetCore.Http
@using Microsoft.AspNetCore.Components;
@inject IHttpContextAccessor httpContextAccessor
<!-- Nulled layout as it is defined manually-->
@layout EmptyLayout
@if (IsTV2)
{
MarkupString htmlContent = new MarkupString($@"
<html>
<head>
<script>
var forceReload = false;
var l = 'd:' + new Date().valueOf() + '|';
function setCookie(name, value) {{
var now = new Date();
var expires = new Date(now.getFullYear() + 1, now.getMonth(), now.getDate());
document.cookie = escape(name) + '=' + escape(value) + ';expires=' + expires.toGMTString() + ';path=/';
}}
function getCookie(name) {{
var str = document.cookie;
var arr = str.split('; ');
for (var i = arr.length - 1; i >= 0; i--) {{
var c = arr[i].split('=');
if (c.length != 2) continue;
if (unescape(c[0]) == name) return unescape(c[1]);
}}
return null;
}}
function syncCookie(cookieName, propValue) {{
var c = getCookie(cookieName);
l += 'g:' + cookieName + ':' + c + '|';
if (c != propValue) {{
setCookie(cookieName, propValue);
l += 's:' + cookieName + ':' + propValue + '|';
var check = getCookie(cookieName);
if (check == propValue) forceReload = true;
}}
}}
var d = new Date();
var utcOffset = d.getTimezoneOffset();
syncCookie('UserUtcOffset', utcOffset);
var connSpeed;
try {{
connSpeed = window.external.ClientCaps.connectionType;
}} catch (e) {{
connSpeed = ""undetected"";
}}
syncCookie('UserConnectionSpeed', connSpeed);
try {{
top.log(l);
}} catch (e) {{}}
if (forceReload) location.replace(location.href);
</script>
</head>
<body>
<div style=""top:0px; left:0px; width:176px; height:105px;"" xmlns:msntvuxp=""msntvuxp.microsoft.com"">
<div class=""PNGImage"" style=""width:176px;height:105px;src:/Images/Home/HomeRotatorBGWeather.png;""></div>
</div>
<div style=""position:absolute; top:0px; left:0px; width:178px; height:107px;"" xmlns:msntvuxp=""msntvuxp.microsoft.com"">
<table class=""wthrTbl"" border=""0"" cellpadding=""1"" cellspacing=""0"">
<tbody>
<tr>
<td height=""4"" width=""4"" rowspan=""4""><img src=""/Images/Shared/s.gif"" height=""4"" width=""4""></td>
<td height=""4"" width=""45""><img src=""/Images/Shared/s.gif"" height=""4"" width=""45""></td>
<td height=""4"" width=""10""><img src=""/Images/Shared/s.gif"" height=""4"" width=""10""></td>
<td height=""4"" width=""65""><img src=""/Images/Shared/s.gif"" height=""4"" width=""65""></td>
<td height=""4"" width=""10"" rowspan=""4""><img src=""/Images/Shared/s.gif"" height=""4"" width=""10""></td>
</tr>
<tr>
<td id=""CityCellID"" class=""wthrCityCell"" colspan=""3"" valign=""top""><span class=""wthrCityText"">Your City</span></td>
</tr>
<tr>
<td id=""TRCID"" class=""wthrTempCond"">
<table>
<tbody>
<tr>
<td id=""TemperatureCellID"" class=""wthrTempCell""><span class=""wthrTempTxt"">63°/50</span></td>
</tr>
<tr>
<td id=""ConditionCellID"" class=""wthrCondCell""><span class=""wthrCondTxt"">Mostly</span><br><span class=""wthrCondTxt""> Cloudy</span></td>
</tr>
</tbody>
</table>
</td>
<td id=""PaddingID"" width=""10""><img src=""/Images/Shared/s.gif"" height=""1"" width=""10""></td>
<td id=""ConditionIconID"" class=""wthrCondIcon""><span class=""PNGImage"" style=""src:/Images/Shared/Weather/28.png;width:65px;height:61px;""></span></td>
</tr>
<tr>
<td id=""ProviderID"" class=""wthrProvider"" colspan=""3"">The Weather Channel ®</td>
</tr>
</tbody>
</table>
</div>
<!--<ROTATOR_FEEDBACK></ROTATOR_FEEDBACK>--><!--<ROTATOR_CLICKTHROUGH>/Pages/Weather/YourCity.aspx</ROTATOR_CLICKTHROUGH>-->
<script xmlns:msntvuxp=""msntvuxp.microsoft.com"">
function clickPageRotatePanel() {{
location.href = ""/Pages/Weather/YourCity.aspx"";
}}
</script>
</body>
</html>
");
@((MarkupString)htmlContent)
}
else
{
<PageTitle>Home</PageTitle>
<h1>Hello, world!</h1>
<footer>
<div style="position:fixed; left: 0px; bottom: 20px; width: 100vw;">
<TV2PCHomeNavBar />
</div>
<div style="position:fixed; left: 0px; bottom: 0; width: 100vw; height: 40px;">
<table cellpadding="0" cellspacing="0" width="100%" height="100%">
<tr>
<td width="560">
<img src="/Images/TV2PC/StatusBarBG.jpg" style=" width: 100vw; height: 40px; object-fit: fill;"/>
<img src="/Images/TV2PC/Logo_MSNTVStatusBar.png" alt="Overlay Logo" class="overlay-logo" style="position: absolute; right: 0.1vw; bottom: 5px; max-width: 150%; z-index: 1001;" />
</td>
</tr>
</table>
</div>
</footer>
}
@code
{
string userAgent { get; set; }
bool IsTV2 = false;
string NewsLink1 = "https://google.com";
string NewsLink2 = "https://yahoo.com";
string NewsLink3 = "https://bing.com";
string NewsTitle1 = "Google reigns superior over the universe";
string NewsTitle2 = "Who even uses Yahoo anymore?";
string NewsTitle3 = "Oh god, it's Bing! (Now with extra piss)";
protected override void OnInitialized()
{
userAgent = httpContextAccessor.HttpContext.Request.Headers["User-Agent"];
//Check if the client is an MSNTV2 box. If it is, we should return the TV2 page and not the Blazor based Page.
@if(userAgent.Contains("MSNTV"))
{
IsTV2 = true;
StateHasChanged();
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 671 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 811 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 811 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 352 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 740 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 227 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 165 B

Some files were not shown because too many files have changed in this diff Show More