Загрузка данных
Windows PowerShell 5.1
(C) Корпорация Майкрософт (Microsoft Corporation). Все права защищены.
PS C:\Users\str> $root = 'C:\Temp\pepper42-build\wgt-staging'
PS C:\Users\str> $js = Join-Path $root 'static\js'
PS C:\Users\str>
PS C:\Users\str> function Show-Range {
>> param([string]$File, [int]$Start, [int]$Count)
>> $lines = Get-Content -LiteralPath $File
>> $end = [Math]::Min($Start + $Count - 1, $lines.Length)
>> for ($i = $Start; $i -le $end; $i++) {
>> '{0,4}: {1}' -f $i, $lines[$i - 1]
>> }
>> }
PS C:\Users\str>
PS C:\Users\str> Write-Host "`n===== NAVIGATION.START: ПЕРВЫЙ ВЫЗОВ ====="
===== NAVIGATION.START: ПЕРВЫЙ ВЫЗОВ =====
PS C:\Users\str> Show-Range (Join-Path $js 'index.js') 535 75
535: var img = new Image();
536: host.getBoxArt(app.id).then(function (resolvedPromise) {
537: img.src = resolvedPromise;
538: }, function (failedPromise) {
539: console.log('%c[index.js, showApps]', 'color: green;', 'Error! Failed to retrieve box art for app ID: ' + app.id + '. Returned value was: ' + failedPromise, '\n Host object:', host, host.toString());
540: img.src = 'static/res/placeholder_error.svg';
541: });
542: img.onload = function (e) {
543: return img.classList.add('fade-in');
544: };
545: $(gameCard).append(img);
546: });
547: }, function (failedAppList) {
548: $('#naclSpinner').hide();
549: var img = new Image();
550: img.src = 'static/res/applist_error.svg';
551: $("#game-grid").html(img);
552: snackbarLog('Unable to retrieve your games');
553: console.error('%c[index.js, showApps]', 'Failed to get applist from host: ' + host.hostname, '\n Host object:', host, host.toString());
554: });
555: showAppsMode();
556: }
557:
558: // set the layout to the initial mode you see when you open moonlight
559: function showHostsAndSettingsMode() {
560: console.log('%c[index.js]', 'color: green;', 'Entering "Show apps and hosts" mode');
561: $("#main-navigation").show();
562: $(".nav-menu-parent").show();
563: $("#externalAudioBtn").show();
564: $("#mouseLockBtn").show();
565: $("#main-content").children().not("#listener, #loadingSpinner, #naclSpinner").show();
566: $('#game-grid').hide();
567: $('#backIcon').hide();
568: $('#quitCurrentApp').hide();
569: $("#main-content").removeClass("fullscreen");
570: $("#listener").removeClass("fullscreen");
571: Navigation.start();
572: Navigation.pop();
573: startPollingHosts();
574: }
575: function showAppsMode() {
576: console.log('%c[index.js]', 'color: green;', 'Entering "Show apps" mode');
577: $('#backIcon').show();
578: $("#main-navigation").show();
579: $("#main-content").children().not("#listener, #loadingSpinner, #naclSpinner").show();
580: $("#streamSettings").hide();
581: $(".nav-menu-parent").hide();
582: $("#externalAudioBtn").hide();
583: $("#mouseLockBtn").hide();
584: $("#host-grid").hide();
585: $("#settings").hide();
586: $("#main-content").removeClass("fullscreen");
587: $("#listener").removeClass("fullscreen");
588: $('#loadingSpinner').css('display', 'none');
589: $('body').css('backgroundColor', '#282C38');
590: isInGame = false;
591:
592: // FIXME: We want to eventually poll on the app screen but we can't now
593: // because it slows down box art loading and we don't update the UI live
594: // anyway.
595: stopPollingHosts();
596: Navigation.start();
597: }
598:
599: // start the given appID. if another app is running, offer to quit it.
600: // if the given app is already running, just resume it.
601: function startGame(host, appID) {
602: if (!host || !host.paired) {
603: console.error('%c[index.js, startGame]', 'color: green;', 'Attempted to start a game, but `host` did not initialize properly. Host object: ', host);
604: return;
605: }
606:
607: // refresh the server info, because the user might have quit the game.
608: host.refreshServerInfo().then(function (ret) {
609: host.getAppById(appID).then(function (appToStart) {
PS C:\Users\str>
PS C:\Users\str> Write-Host "`n===== NAVIGATION.START: ВТОРОЙ ВЫЗОВ ====="
===== NAVIGATION.START: ВТОРОЙ ВЫЗОВ =====
PS C:\Users\str> Show-Range (Join-Path $js 'index.js') 580 45
580: $("#streamSettings").hide();
581: $(".nav-menu-parent").hide();
582: $("#externalAudioBtn").hide();
583: $("#mouseLockBtn").hide();
584: $("#host-grid").hide();
585: $("#settings").hide();
586: $("#main-content").removeClass("fullscreen");
587: $("#listener").removeClass("fullscreen");
588: $('#loadingSpinner').css('display', 'none');
589: $('body').css('backgroundColor', '#282C38');
590: isInGame = false;
591:
592: // FIXME: We want to eventually poll on the app screen but we can't now
593: // because it slows down box art loading and we don't update the UI live
594: // anyway.
595: stopPollingHosts();
596: Navigation.start();
597: }
598:
599: // start the given appID. if another app is running, offer to quit it.
600: // if the given app is already running, just resume it.
601: function startGame(host, appID) {
602: if (!host || !host.paired) {
603: console.error('%c[index.js, startGame]', 'color: green;', 'Attempted to start a game, but `host` did not initialize properly. Host object: ', host);
604: return;
605: }
606:
607: // refresh the server info, because the user might have quit the game.
608: host.refreshServerInfo().then(function (ret) {
609: host.getAppById(appID).then(function (appToStart) {
610: if (host.currentGame != 0 && host.currentGame != appID) {
611: host.getAppById(host.currentGame).then(function (currentApp) {
612: var quitAppDialog = document.querySelector('#quitAppDialog');
613: document.getElementById('quitAppDialogText').innerHTML = currentApp.title + ' is already running. Would you like to quit ' + currentApp.title + '?';
614: quitAppDialog.showModal();
615: Navigation.push(Views.CloseAppDialog);
616: $('#cancelQuitApp').off('click');
617: $('#cancelQuitApp').on('click', function () {
618: quitAppDialog.close();
619: Navigation.pop();
620: console.log('[index.js, startGame]', 'color: green;', 'Closing app dialog, and returning');
621: });
622: $('#continueQuitApp').off('click');
623: $('#continueQuitApp').on('click', function () {
624: console.log('[index.js, startGame]', 'color: green;', 'Stopping game, and closing app dialog, and returning');
PS C:\Users\str>
PS C:\Users\str> Write-Host "`n===== ОСТАНОВКА NAVIGATION И ВОЗВРАТ ====="
===== ОСТАНОВКА NAVIGATION И ВОЗВРАТ =====
PS C:\Users\str> Show-Range (Join-Path $js 'index.js') 690 75
690: showApps(host);
691: return;
692: }
693: sendMessage('startRequest', [host.address, streamWidth, streamHeight, frameRate, bitrate.toString(), rikey, rikeyid.toString(), mouse_lock_enabled, host.appVersion, host.gfeVersion, $root.find('sessionUrl0').text().trim()]);
694: }, function (failedLaunchApp) {
695: console.error('%c[index.js, launchApp]', 'color: green;', 'Failed to launch app width id: ' + appID + '\nReturned error was: ' + failedLaunchApp);
696: showApps(host);
697: return;
698: });
699: });
700: });
701: }
702: function playGameMode() {
703: console.log('%c[index.js, playGameMode]', 'color:green;', 'Entering play game mode');
704: isInGame = true;
705: $("#main-navigation").hide();
706: $("#main-content").children().not("#listener, #loadingSpinner").hide();
707: $("#main-content").addClass("fullscreen");
708: $("#listener").addClass("fullscreen");
709:
710: // Hide the NaCl module until the first frame is rendered
711: $("#nacl_module")[0].style.opacity = 0.0;
712: fullscreenNaclModule();
713: $('#loadingSpinner').css('display', 'inline-block');
714: Navigation.stop();
715: }
716:
717: // Maximize the size of the nacl module by scaling and resizing appropriately
718: function fullscreenNaclModule() {
719: var streamWidth = $('#selectResolution').data('value').split(':')[0];
720: var streamHeight = $('#selectResolution').data('value').split(':')[1];
721: var screenWidth = window.innerWidth;
722: var screenHeight = window.innerHeight;
723: var xRatio = screenWidth / streamWidth;
724: var yRatio = screenHeight / streamHeight;
725: var zoom = Math.min(xRatio, yRatio);
726: var module = $("#nacl_module")[0];
727: module.width = zoom * streamWidth;
728: module.height = zoom * streamHeight;
729: module.style.marginTop = (screenHeight - module.height) / 2 + "px";
730: }
731: function stopGameWithConfirmation() {
732: if (api.currentGame === 0) {
733: snackbarLog('Nothing was running');
734: } else {
735: api.getAppById(api.currentGame).then(function (currentGame) {
736: var quitAppDialog = document.querySelector('#quitAppDialog');
737: document.getElementById('quitAppDialogText').innerHTML = ' Are you sure you would like to quit ' + currentGame.title + '? Unsaved progress will be lost.';
738: quitAppDialog.showModal();
739: Navigation.push(Views.CloseAppDialog);
740: $('#cancelQuitApp').off('click');
741: $('#cancelQuitApp').on('click', function () {
742: console.log('%c[index.js, stopGameWithConfirmation]', 'color:green;', 'Closing app dialog, and returning');
743: quitAppDialog.close();
744: Navigation.pop();
745: });
746: $('#continueQuitApp').off('click');
747: $('#continueQuitApp').on('click', function () {
748: console.log('%c[index.js, stopGameWithConfirmation]', 'color:green;', 'Stopping game, and closing app dialog, and returning');
749: stopGame(api);
750: quitAppDialog.close();
751: Navigation.pop();
752: });
753: });
754: }
755: }
756: function stopGame(host, callbackFunction) {
757: isInGame = false;
758: if (!host.paired) {
759: return;
760: }
761: host.refreshServerInfo().then(function (ret) {
762: host.getAppById(host.currentGame).then(function (runningApp) {
763: if (!runningApp) {
764: snackbarLog('Nothing was running');
PS C:\Users\str>
PS C:\Users\str> Write-Host "`n===== РЕГИСТРАЦИЯ КЛАВИШ TIZEN ====="
===== РЕГИСТРАЦИЯ КЛАВИШ TIZEN =====
PS C:\Users\str> Show-Range (Join-Path $js 'platform.js') 305 90
PS C:\Users\str>
PS C:\Users\str> Write-Host "`n===== ИНИЦИАЛИЗАЦИЯ ПУЛЬТА ====="
===== ИНИЦИАЛИЗАЦИЯ ПУЛЬТА =====
PS C:\Users\str> Select-String -Path (Join-Path $js 'index.js') -Pattern 'function initSamsungKeys|function remoteControllerHandler|platformOnLoad' -Context 0,35
> C:\Temp\pepper42-build\wgt-staging\static\js\index.js:992:function initSamsungKeys() {
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:993: console.log('initializing keys');
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:994: var handler = {
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:995: initRemoteController: true,
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:996: buttonsToRegister: [
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:997: // https://developer.samsung.com/tv/develop/guides/user
-interaction/keyboardime
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:998: 'ColorF0Red',
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:999: // F1
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1000: 'ColorF1Green',
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1001: // F2
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1002: 'ColorF2Yellow',
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1003: // F3
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1004: 'ColorF3Blue',
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1005: // F4
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1006: // Not working...
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1007: //'SmartHub', // F5
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1008: 'Source',
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1009: // F6
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1010: 'ChannelList',
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1011: // F7
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1012: 'ChannelDown',
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1013: // F11
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1014: 'ChannelUp' // F12
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1015: ],
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1016: onKeydownListener: remoteControllerHandler
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1017: };
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1018: console.log('Initializing SamsungTV platform');
> C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1019: platformOnLoad(handler);
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1020:}
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1021:function onWindowLoad() {
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1022: console.log('%c[index.js]', 'color: green;', 'Moonlight\
's main window loaded');
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1023: // don't show the game selection div
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1024: $('#gameSelection').css('display', 'none');
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1025: console.log('load stored resolution prefs');
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1026: getData('resolution', function (previousValue) {
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1027: if (previousValue.resolution != null) {
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1028: $('.resolutionMenu li').each(function () {
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1029: if ($(this).data('value') === previousValue.resolu
tion) {
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1030: $('#selectResolution').text($(this).text()).data
('value', previousValue.resolution);
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1031: }
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1032: });
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1033: }
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1034: });
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1035: console.log('Load stored remote audio prefs');
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1036: getData('remoteAudio', function (previousValue) {
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1037: if (previousValue.remoteAudio == null) {
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1038: document.querySelector('#externalAudioBtn').Material
IconToggle.uncheck();
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1039: } else if (previousValue.remoteAudio == false) {
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1040: document.querySelector('#externalAudioBtn').Material
IconToggle.uncheck();
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1041: } else {
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1042: document.querySelector('#externalAudioBtn').Material
IconToggle.check();
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1043: }
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1044: });
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1045: console.log('load stored framerate prefs');
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1046: getData('frameRate', function (previousValue) {
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1047: if (previousValue.frameRate != null) {
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1048: $('.framerateMenu li').each(function () {
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1049: if ($(this).data('value') === previousValue.frameR
ate) {
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1050: $('#selectFramerate').text($(this).text()).data(
'value', previousValue.frameRate);
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1051: }
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1052: });
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1053: }
C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1054: });
PS C:\Users\str>
PS C:\Users\str> Write-Host "`n===== CSS: FLEX-БЛОК И АДАПТИВНЫЕ ПРАВИЛА ====="
===== CSS: FLEX-БЛОК И АДАПТИВНЫЕ ПРАВИЛА =====
PS C:\Users\str> Show-Range (Join-Path $root 'static\css\style.css') 20 75
20: }
21:
22: .mdl-layout__header-row {
23: padding: 0 80px 0 80px;
24: }
25:
26: main {
27: padding: 0 80px 0 80px;
28: }
29:
30: @media screen and (max-width: 600px) {
31: #host-grid .mdl-card {
32: flex-basis: 50% !important;
33: }
34: #game-grid .mdl-card {
35: height: 100px !important;
36: width: 75px !important;
37: }
38: }
39:
40: @media screen and (min-width: 600px) and (max-width: 800px) {
41: #host-grid .mdl-card {
42: flex-basis: 33% !important;
43: }
44: #game-grid .mdl-card {
45: height: 150px !important;
46: width: 112.5px !important;
47: }
48: }
49:
50: @media screen and (min-width: 800px) and (max-width: 1024px) {
51: main {
52: padding: 0 72px 0 72px !important;
53: }
54: .mdl-layout__header-row {
55: padding: 0 72px 0 72px !important;
56: }
57: #host-grid .mdl-card {
58: flex-basis: 25% !important;
59: }
60: #game-grid .mdl-card {
61: height: 200px !important;
62: width: 150px !important;
63: }
64: }
65:
66: @media screen and (min-width: 1024px) {
67: #game-grid .mdl-card {
68: height: 300px !important;
69: width: 225px !important;
70: }
71: }
72:
73: .nav-menu-parent {
74: position: relative;
75: margin: 0 4px;
76: }
77: .mdl-menu__outline {
78: background-color: #333846;
79: color: white;
80: }
81: .mdl-menu__item {
82: color: white;
83: }
84: .mdl-menu__item:hover, .mdl-menu__item.hovered, .mdl-menu__item:focus {
85: background-color: #00A3C6;
86: }
87: #bitrateField {
88: width: 100px;
89: height: 36px;
90: overflow: hidden;
91: text-transform: none;
92: }
93: .bitrateMenu {
94: width: 170px;
PS C:\Users\str> Show-Range (Join-Path $root 'static\css\style.css') 165 95
165: min-width:0px;
166: }
167: #host-grid, #game-grid {
168: padding: 0;
169: margin: 0;
170: -webkit-flex: 1;
171: flex: 1;
172: display: -webkit-flex;
173: display: flex;
174: -webkit-flex-flow: row wrap;
175: flex-flow: row wrap;
176: -webkit-align-items: center;
177: align-items: center;
178: -webkit-justify-content: center;
179: justify-content: center;
180: }
181: #host-grid .mdl-card {
182: flex-basis: 15%;
183: }
184: #game-grid .mdl-card {
185: position: relative;
186: background: url('../res/placeholder_game.svg') rgba(29, 29, 29, 1) center/cover no-repeat;
187: }
188: #host-grid .mdl-card, #game-grid .mdl-card {
189: text-align: center;
190: width: 170px;
191: height: 170px;
192: min-height: 170px;
193: margin: 15px;
194: cursor: pointer;
195: transition: all .2s ease-in-out;
196: will-change: transform;
197: }
198: #host-grid .mdl-card:hover, #host-grid .mdl-card:focus, #host-grid .mdl-card:active, #game-grid .mdl-card:focus, #game-grid .mdl-card:active {
199: transform: scale(1.15);
200: outline : #00A3C6 solid 2px;;
201: }
202: #host-grid .mdl-card__title {
203: padding: 0;
204: }
205: #host-grid .mdl-card__title .mdl-card__title-text {
206: width: 100%;
207: font-size: 14px;
208: padding: 10px 15px;
209: background-color: rgba(0,0,0,0.7);
210: }
211: #game-grid .mdl-card img {
212: height: 100%;
213: width: 100%;
214: opacity: 0;
215: transition: opacity .3s;
216: z-index: -1;
217: }
218: #game-grid .mdl-card img.fade-in {
219: opacity: 1;
220: }
221: #game-grid .game-title {
222: position: absolute;
223: bottom: 0;
224: min-height: 20px;
225: font-size: 13px;
226: font-weight: 300;
227: padding: 5px 0;
228: width: 100%;
229: color: white;
230: text-align: center;
231: background-color: rgba(0, 0, 0, 0.6);
232: }
233: #game-grid .game-title span {
234: padding: 0 10px;
235: }
236: .add-host-card > .mdl-card__title {
237: color: #fff;
238: background:
239: url('../res/ic_add_to_queue_white_48px.svg') center no-repeat #3E4454;
240: }
241: .host-container > .mdl-card__title {
242: color: #fff;
243: background:
244: url('../res/ic_tv_white_48px.svg') center no-repeat #3E4454;
245: }
246: .mdl-card.hovered {
247: background-color: initial;
248: outline: #00A3C6 solid 2px;
249: transform: scale(1.15);
250: }
251: #host-grid p {
252: margin: 0;
253: }
254: #host-grid .mdl-textfield {
255: width: 200px;
256: margin-right: 20px;
257: margin-bottom: 0px;
258: }
259: #host-grid #GFEHostIPField {
PS C:\Users\str>
PS C:\Users\str> Write-Host "`n===== HTML: VIEWPORT И ПОДКЛЮЧЕНИЕ СТИЛЕЙ ====="
===== HTML: VIEWPORT И ПОДКЛЮЧЕНИЕ СТИЛЕЙ =====
PS C:\Users\str> Show-Range (Join-Path $root 'index.html') 1 45
1: <!DOCTYPE html>
2: <html>
3: <head>
4: <meta http-equiv="Pragma" content="no-cache">
5: <meta http-equiv="Expires" content="-1">
6: <meta name="viewport" content="width=device-width, initial-scale=1.0">
7: <title>Moonlight</title>
8: <link rel="stylesheet" href="static/css/roboto.css">
9: <link rel="stylesheet" href="static/css/material.min.css">
10: <link rel="stylesheet" href="static/css/style.css">
11: <link rel="stylesheet" href="static/css/material-icons.css">
12: <script type="text/javascript" src="static/js/platform.js"></script>
13: </head>
14: <body data-name="moonlight-chrome" data-tools="pnacl" data-configs="Debug Release" data-path="{tc}/{config}">
15: <div id="eventAnchor" tabindex="0" style="position:absolute;left:0;top:0;width:1px;height:1px;opacity:0;"></div>
16: <div class="mdl-layout mdl-js-layout">
17: <header id="main-navigation" class="mdl-layout__header mdl-layout__header--transparent">
18: <div class="mdl-layout__header-row">
19: <button id="backIcon" class="mdl-button mdl-js-button mdl-button--icon" role="link" aria-label="Host selection"><i class="material-icons">keyboard_arrow_left</i></button>
20: <!-- Title -->
21: <span class="mdl-layout-title">MOON<span>LIGHT</span></span>
22: <!-- Add spacer, to align navigation to the right -->
23: <div class="mdl-layout-spacer"></div>
24: <!-- Navigation -->
25: <nav class="mdl-navigation">
26: <div class="nav-menu-parent">
27: <div id="resolutionMenu">
28: <button id="selectResolution" data-value="1280:720" class="mdl-button mdl-js-button">
29: 720p
30: </button>
31: </div>
32:
33: <ul class="resolutionMenu mdl-menu mdl-menu--bottom-right mdl-js-menu mdl-js-ripple-effect" for="selectResolution">
34: <li class="mdl-menu__item" data-value="858:480">480p</li>
35: <li class="mdl-menu__item" data-value="1280:720">720p</li>
36: <li class="mdl-menu__item" data-value="1920:1080">1080p</li>
37: <li class="mdl-menu__item" data-value="2560:1440">1440p</li>
38: <li class="mdl-menu__item" data-value="3840:2160">4K</li>
39: </ul>
40:
41: <div id="resolutionTooltip" class="mdl-tooltip" for="resolutionMenu">
42: Resolution
43: </div>
44: </div>
45: <div class="nav-menu-parent">
PS C:\Users\str>