//#region ../../packages/@play-xbox/url-paths/dist/getSafeInternalRedirectUri.js
/**
* Protocols that are explicitly blocked to prevent script injection or
* data-exfiltration attacks via redirect URIs.
*/
var DANGEROUS_PROTOCOLS = [
	"javascript:",
	"data:",
	"vbscript:",
	"blob:"
];
/**
* Validates that a URI is a safe internal path suitable for in-app navigation
* and returns it, or returns the fallback when the URI is unsafe.
*
* @remarks
* Rejects protocol-relative URLs (`//`), URIs that do not start with `/`,
* and any URI whose lowercase form contains a dangerous protocol
* (`javascript:`, `data:`, `vbscript:`, `blob:`).
*
* @param uri - The URI to validate (may be `undefined`).
* @param fallback - The value to return when the URI is missing or unsafe.
* @returns The original URI if it is a safe internal path; otherwise `fallback`.
*/
function getSafeInternalRedirectUri(uri, fallback) {
	if (!uri) return fallback;
	if (!uri.startsWith("/") || uri.startsWith("//")) return fallback;
	const lower = uri.toLowerCase();
	if (DANGEROUS_PROTOCOLS.some((protocol) => lower.includes(protocol))) return fallback;
	return uri;
}
//#endregion
//#region \0virtual:asset-manifest
var assets = [
	{
		"path": "offlinemanifest.json",
		"integrity": "sha256-7RVMSy4zpOR0nMtr7+KMb/zdPHMCTbN+m2XmsNU6b6M="
	},
	{
		"path": "robots.txt",
		"integrity": "sha256-Lk5/1oJw+s2zfEC8q9m8fydUXeXsMoWrJYmZmwRzFYM="
	},
	{
		"path": "sitemap.xml",
		"integrity": "sha256-pQ8G9VSIArFGqUlVJ9ry/redsqv+FdbtVHPZW2YSvuQ="
	},
	{
		"path": "sitemap/catalog-sitemap.xml",
		"integrity": "sha256-VieZhLSHT2Jwc4LroylULdIIVZNAXBwbwF3sb3EMqU0="
	},
	{
		"path": "sitemap/gallery-sitemap.xml",
		"integrity": "sha256-LTNODp2SGgWdh/2e3bBgbQ0aYGF2kbcY39h01jwUukI="
	},
	{
		"path": "sitemap/static-sitemap.xml",
		"integrity": "sha256-dhpmklt8fHa4Q9qY8YTlJWt/85w4C3MWrw0oHT6T/E0="
	},
	{
		"path": "assets/AccessibilityFeatures-imsrgx4h.js",
		"integrity": "sha256-CNi8IAbE8quY5+4Bt79eX/Ec2X8t7iFHQ89DSDdmeGU="
	},
	{
		"path": "assets/AccessibilityFeaturesDialog-akybxm0v.js",
		"integrity": "sha256-jjuD+wgNgv9jcnV1de8h3cHCYtsEhdC60nO5XfBCHb4="
	},
	{
		"path": "assets/AccessibilityTab-gmb1dyut.js",
		"integrity": "sha256-I/tcir49bqtZCFsrK4H8BWPJAVSWE1SlznpE0nRaStY="
	},
	{
		"path": "assets/AccountPickerRoute-hl6j9r42.js",
		"integrity": "sha256-0klx214/UJJEioFTieuVwWqM+WNKxpnDTlKgd1eZv6k="
	},
	{
		"path": "assets/AccountTab-pelulps3.js",
		"integrity": "sha256-aYQNQom5NXQIaiaatQxbBSMI0n4y5NFQfduIVhFe6Dw="
	},
	{
		"path": "assets/AchievementDetails-ie2z5zom.js",
		"integrity": "sha256-UWlUvEsaqNlaWTmeFCqr8ag4dYhymVYGkUt+mg5ThoM="
	},
	{
		"path": "assets/AchievementFrame-cn3z415z.js",
		"integrity": "sha256-hwIfGrFfa9QP+CRsguVK9viDynuxvcTfEIPe9TtUrbA="
	},
	{
		"path": "assets/AchievementRareFrame-ohay5n6q.js",
		"integrity": "sha256-1u9OlKE33YswI0ZJwUvtfjSkgv7P1rx8y47mIell4Ac="
	},
	{
		"path": "assets/Achievements-mwm6kxa8.js",
		"integrity": "sha256-ZxlWPFYqXlEfvvJblZVDsQ1WV0uCruCgNG/9eMP0tyI="
	},
	{
		"path": "assets/AchievementsDetailPage-lmnf8xge.js",
		"integrity": "sha256-6D/MT0odgT81OEAY9P+OTLqHX0SRPb6BX0bONtypqqU="
	},
	{
		"path": "assets/AchievementsHeroDetailsLoading-czav3ehv.js",
		"integrity": "sha256-MpmIb1zG1artS67SLzkxpUkpe2ycQG3wMa+V0dI46rw="
	},
	{
		"path": "assets/AchievementsPage-b38yjq2w.js",
		"integrity": "sha256-yxVgwHdva5Ry3QOPgZ58AbWpB5DBweExB4UQMly26wc="
	},
	{
		"path": "assets/ActivePartyPage-c5klk1d4.js",
		"integrity": "sha256-CAGvtME5+r4LqZf7u+ESvCSPLBHC7HA5jmaYyYcfVz0="
	},
	{
		"path": "assets/AddFriendRequest-c1c00pfw.js",
		"integrity": "sha256-mSzn8NG6HnP0UTbfx+32h3Kmyzz8FrTO3wLGBUU64ss="
	},
	{
		"path": "assets/AnnouncementProvider-ice67845.js",
		"integrity": "sha256-qEqe3yqCaZKwWYq9hmil0NeUraxvtxvRVjukw1dOYgk="
	},
	{
		"path": "assets/Announcer-b6q4a41y.js",
		"integrity": "sha256-/Ba7XLfUyDlbly2XdwXUZRY6Q8EitHrWJ3i/hFYruxY="
	},
	{
		"path": "assets/App-l1qq5ey0.js",
		"integrity": "sha256-kln0v9CedShXd8Wv7SQJJJSEv/OLB8BoTbYJcN48Sfc="
	},
	{
		"path": "assets/AppInsightsTelemetryAdapter-dv420bzq.js",
		"integrity": "sha256-d2u43PxZ4Ezax0TCVnJDgPgoWnV/YuXePKnoW7A1aL0="
	},
	{
		"path": "assets/AppQuitDialog-l3oef02v.js",
		"integrity": "sha256-ILzOnEdV+P6jQ12Mp6cS9hy9fg6FSrCPb8LEWmtzWgM="
	},
	{
		"path": "assets/AppQuitPlayDialog-by1fxi59.js",
		"integrity": "sha256-RIamLpAKXWB+2nZ/OUZBJeVBtLvI0Z8if34dp3DlLwk="
	},
	{
		"path": "assets/AppearanceTab-mtvuecwk.js",
		"integrity": "sha256-ivuaeohN7kiKgAp5srjVHwv6O6GW5XLYsXWleSkjY6M="
	},
	{
		"path": "assets/Apps-cniyatpx.js",
		"integrity": "sha256-9nf8Y8kWJS9NpUrjX6tRJQnpZnFYKx6ZtzwNGF/XGsY="
	},
	{
		"path": "assets/Apps_BattleNet-ndj7o7ry.png",
		"integrity": "sha256-Bd8veesfcqSZ9pjOhk+/RyMi8MDEfOWLFMQ7Jyct29I="
	},
	{
		"path": "assets/Apps_EA-mez26q80.png",
		"integrity": "sha256-e6FTG8Q7I616SDYOn65XgiV1Dz5SDxetqIWIkSEz1Xs="
	},
	{
		"path": "assets/Apps_Epic-oahfkb1h.png",
		"integrity": "sha256-3lnTpDWI/qMu7mtPFMuaT+2vZF91Ky9diJb4XRgWAIQ="
	},
	{
		"path": "assets/Apps_GOG-gshw2che.png",
		"integrity": "sha256-N7ss5nYrknfevmLOWXu86VN4Lta2H7+AZnDWZNX0VNk="
	},
	{
		"path": "assets/Apps_Riot-m596j3wt.png",
		"integrity": "sha256-+aE+IfqMemS5huqAPlmXz9n38xMs9ocQsXQFuhq+YVg="
	},
	{
		"path": "assets/Apps_Steam-g6awhuoy.png",
		"integrity": "sha256-LvjGxZHYGudyYRaq9uymTGC5LlqB9VGp4OK5svo1pHI="
	},
	{
		"path": "assets/Apps_UbisoftConnect-oexn5ery.png",
		"integrity": "sha256-AjksUVRO2ao7XNRCxwsai+suAp7etVIuv9O8b/2ZPuc="
	},
	{
		"path": "assets/AskAParent-olh0utmw.js",
		"integrity": "sha256-79yZRFDNTQ8Lb1ZcySxprNz8fRS9Mzy7qQVNmllOkns="
	},
	{
		"path": "assets/AskAParentDialog-n2618ez5.js",
		"integrity": "sha256-TgXLTxGJzQIfWY0pmAcBJK9TerbYLoChHT8Ud/IuerA="
	},
	{
		"path": "assets/AskAParentResult-ifw3bloh.js",
		"integrity": "sha256-UQeoik8VDkUeejKgq8ZLymdSewvvBCiuSW3ev05bKoQ="
	},
	{
		"path": "assets/AsyncPayment-j97bkq3d.js",
		"integrity": "sha256-JU/xGmujF0AbA9Dl0NSZiDd/TDddMAdM26GHb+xQl7E="
	},
	{
		"path": "assets/AsyncPayment-ned32kg1.js",
		"integrity": "sha256-G26yWyUL3vo9P2AFy0Q2S1U7Z6k2VBx0kXFMeN0hilI="
	},
	{
		"path": "assets/AudioAndVideoTab-ijz9m1a4.js",
		"integrity": "sha256-HxPdYkrnU7J46Uje3GsecGq7jxw4MM/fTXu2wmFU6YU="
	},
	{
		"path": "assets/Auras-i0uy1yun.js",
		"integrity": "sha256-samDtRxJpcQTRHiCawprbqYdBo5f2ALHJk7FQQClxbo="
	},
	{
		"path": "assets/AuthActionHandlerRoute-e6e66a6m.js",
		"integrity": "sha256-bJxk+Wau1trWtW6AZJnpeWmfCIUS5LEL6iMuJGVsgvg="
	},
	{
		"path": "assets/AuthErrorFallback-eqv5eqid.js",
		"integrity": "sha256-lbaHmRgl8sv5/5YKqI2e2NgOg2FPbfw4+hYPRM48I3g="
	},
	{
		"path": "assets/Back-ddqm128l.mp3",
		"integrity": "sha256-l6edwNF/O1jPJPlaW7EKaijMvkqQ23KIzRTd+vVQXcw="
	},
	{
		"path": "assets/BackgroundChildLayout-gbqtjzog.js",
		"integrity": "sha256-DI4+994hY9VL16ke4hmShB409tbgFlkJB76XBjmbdj8="
	},
	{
		"path": "assets/BackgroundLayout-heby7bb3.js",
		"integrity": "sha256-JvPeYtjJUL3ENk03zrCD297eaESMSgUEWRuacfJC9EE="
	},
	{
		"path": "assets/BankChallenge-l20l7nzh.js",
		"integrity": "sha256-USMkuiZ93J1umBQ2Ocvt96p3Aooxf1j5s1PpPMxD8Ys="
	},
	{
		"path": "assets/BankChallenge-nr1vnxo2.js",
		"integrity": "sha256-cv0HMLRnR6cZCcuRciicfz2EcckBHWaDfoshYzUpXWs="
	},
	{
		"path": "assets/BaseAchievementsList-m15u5sjj.js",
		"integrity": "sha256-hF2hj9vXF1Rs3Ov52UWPPiiJP6nkGDNdOjllhyE8Jj8="
	},
	{
		"path": "assets/BaseChatPage-jo5vrfrh.js",
		"integrity": "sha256-GEdp/buiBPWRh6gk7Xbmb8qx4VOeL4psNHFHcMerITc="
	},
	{
		"path": "assets/BenefitCard-c3ro2n67.js",
		"integrity": "sha256-nFynYuSIm+Xhamqt9uDUkgAOOT2Z3la1HevuVzqmYgo="
	},
	{
		"path": "assets/BenefitsGalleryRoute-imzuhkmv.js",
		"integrity": "sha256-U/0r47zIC2qp2G9wSl/xn6C4HI9pK76cQ+8gpHuvpf8="
	},
	{
		"path": "assets/BenefitsHubDialog-ddsnueyt.js",
		"integrity": "sha256-bR7zuzZ0CFLDfBaE2hpA1IsUTqh4DZ34mTLJV80R4XI="
	},
	{
		"path": "assets/BenefitsHubDialog.data-gu1x09dl.js",
		"integrity": "sha256-w769zQPuRziZTocNMuKqrRJ0+Q+QlXIDhdjMc7md5vM="
	},
	{
		"path": "assets/BenefitsHubGateLayout-l1jdy7gp.js",
		"integrity": "sha256-o3sTSgD9Op8OC+KpHkZwr/XRne2s77JqXQtYmG+cBJQ="
	},
	{
		"path": "assets/BenefitsHubPage-f24h3yal.js",
		"integrity": "sha256-P0p0B1CPztk1XIro9rragJ8y2u7e13aJD/2qhMXlKsU="
	},
	{
		"path": "assets/BenefitsHubRoute-ces4f4cb.js",
		"integrity": "sha256-5Y9PgLSyTbIZTmlDkSxgmOd6hKA85gdv8dVca3Qc9H4="
	},
	{
		"path": "assets/BioDialog-fqjqdw8j.js",
		"integrity": "sha256-vKZf6ppGmEBCPeutuyoHlDwzMBoP7qOKHBBqquQqwNE="
	},
	{
		"path": "assets/BluetoothScan-f143quqn.js",
		"integrity": "sha256-qiHs8fQRQSGmN+RqbwYrwLlwsvhDRAxx0yA/otWCOlg="
	},
	{
		"path": "assets/BluetoothScanDevicesDialog-n06l1bc6.js",
		"integrity": "sha256-RE25n34zsqGZBGm5126wOsmXrvP9PNCdCs8JnYW4SSQ="
	},
	{
		"path": "assets/BrowseListDialog-of6e4x6i.js",
		"integrity": "sha256-mfRa7ce7huyUPZxQYx0pdGUjnYRfFQal+0632+gia+w="
	},
	{
		"path": "assets/BrowserPerfAdapter-j140cvji.js",
		"integrity": "sha256-d2eitqKkfkZShyguzWWaN3ApWrTm+58UGptvqyhO/qs="
	},
	{
		"path": "assets/CaccsConfirmation-ocn72133.js",
		"integrity": "sha256-kS8S/OTNA8XO52GXr3x2CIBITlUzb5hjkzfEdQ/2MY8="
	},
	{
		"path": "assets/CaccsConnected-ngdv04qr.js",
		"integrity": "sha256-qmFgVlfqwz1RPGZxgSv8P//9Aw0TdBf/b5zxERyzH0w="
	},
	{
		"path": "assets/CaccsPairing-oiqgxn2u.js",
		"integrity": "sha256-63XfRDVItiWygynnDzgKBH3NQN0UNoFIBAYrFkJpBvc="
	},
	{
		"path": "assets/CanSeeRealNameDialog-iuxc6oyh.js",
		"integrity": "sha256-IVQnhEgiRjo6trKk9ufX+fof4Y6e6jKpKtxjxGnB4n4="
	},
	{
		"path": "assets/ChangeClassicGamertag-ftb020e2.js",
		"integrity": "sha256-/zvzMZ2MASRzplJvb5w7XpcnD1rFibWEgGkYrZPjt1M="
	},
	{
		"path": "assets/ChangeGamertagDialog-5hzfa65p.js",
		"integrity": "sha256-T5ofTBqyhahD+tUXQ6gBazHe84j5xvOm8TenAQrdXQs="
	},
	{
		"path": "assets/ChangeGamertagInput-gpneb2o3.js",
		"integrity": "sha256-2qTTZppBp6kxi/O2us/g+WKNf4mtJGGUaGfg3CmhN9Y="
	},
	{
		"path": "assets/ChangeGamertagLoader-gd80n69h.js",
		"integrity": "sha256-EPHgj9Ld7m4SzZ7ju0GoOSOVO+Zbcw2lBE8WeAabIDA="
	},
	{
		"path": "assets/Chat-jjtspk45.js",
		"integrity": "sha256-QUzAYJuu9kq7sKbEWZbvWdj9nsfRD+LNo2KGk0Lp5O4="
	},
	{
		"path": "assets/Chat-juu8daql.js",
		"integrity": "sha256-ygznVc8tpX5BN+9lT6xSyi598kK3QuUG9aTpO7e5BzM="
	},
	{
		"path": "assets/ChatLandingPage-crn72hz2.js",
		"integrity": "sha256-HSdKKr46bt82lNst9fxOroLwBgQXbUBhzWJ5h0NpWmU="
	},
	{
		"path": "assets/ChatLandingPage-depq64rn.js",
		"integrity": "sha256-x0GZIJfUnZFJL6cA1KWWeXcfr38YPnTmS5gTyT5oGXY="
	},
	{
		"path": "assets/ChatRequestsPage-e1v91d64.js",
		"integrity": "sha256-6EiM5PRSLalUEIeax3zh5iz7Yj1t9iLOL4Hcrwk560Q="
	},
	{
		"path": "assets/ChooseGamerpicDialog-c6s3lhgg.js",
		"integrity": "sha256-AnsKjzNtveKkO+WZ/N7iF6AMOxwHW0YB17lKA4ZFAhU="
	},
	{
		"path": "assets/ChooseYourGamertag-oxbf0tj4.js",
		"integrity": "sha256-pYJuF7+c399QDSH6rlHIcasNP1SEjpiOPZbEOB9i+lA="
	},
	{
		"path": "assets/ClientInitPage-k2t0splp.js",
		"integrity": "sha256-c++Hd1NyYEBF6Y+Mz9qGd0tEp0+g4+6mZXSp9hPA70E="
	},
	{
		"path": "assets/ClientInitRoute-i0ojpwx8.js",
		"integrity": "sha256-y2N951ml1y8/ymQPB9fwnj7iBemyTDEYX+83Kfqlnp4="
	},
	{
		"path": "assets/CloudConsoleStreamRoute-igb9twf6.js",
		"integrity": "sha256-ugWoQnIcCkRKfijzSAa5oPbdDpJXc15t9yBAJQWUm3M="
	},
	{
		"path": "assets/CompletedState-bs4aqy5c.js",
		"integrity": "sha256-OBhloejb+vgJMwwGZy1M8uzRqEoonMgOoOjHCD9nmGw="
	},
	{
		"path": "assets/ConfigureIPConnectRoute-kfmapcj6.js",
		"integrity": "sha256-gs80SY2lm/FINhRsnMm9QCSIvAV4tJ6agsQ/dVNd7bs="
	},
	{
		"path": "assets/ConfirmAgeDialog-o8iqf3mp.js",
		"integrity": "sha256-60xVfAoyqcy6W7YFbB+WeNkZ8OGc3Xvca4cMFXOHbi4="
	},
	{
		"path": "assets/ConfirmBlockDialog-bur0sir7.js",
		"integrity": "sha256-QWCXk7wtnmv/Y1srkmtgjNbIQ9FwzJYUqLpiDjOZJHo="
	},
	{
		"path": "assets/ConfirmNewGamertag-msgsx3pk.js",
		"integrity": "sha256-sDEK21ysfvC+HrtNTXj+Ow9HlQbwiD7M3wEg+jzHnUw="
	},
	{
		"path": "assets/ConfirmQuitDialog-im7q8xva.js",
		"integrity": "sha256-XtGXIbehgoPRasBUbdb1Z8VP/AO+WU4f/uQX9wj5lw8="
	},
	{
		"path": "assets/ConfirmRemoveFriendDialog-c6pzp13z.js",
		"integrity": "sha256-VdFFflAjPA7ekSFhnRJ5+KNthJYfoFyDbbkYty6zmRM="
	},
	{
		"path": "assets/ConfirmStorageDataDeletion-pfcyviwq.js",
		"integrity": "sha256-lZjfEjOpV7XhDnQmfU2QvFUxwX8wu0WAlIsrvU6raXM="
	},
	{
		"path": "assets/Confirmation-cudgrzei.js",
		"integrity": "sha256-qnuZXZYd0qhRz37U//rCRgVoPE7hXn9L9u8N+sapHfs="
	},
	{
		"path": "assets/ConfirmationDialog-gwsu4d5l.js",
		"integrity": "sha256-Vd2TypytCdi7XkLBPJb9WVeQ9ATcHSuWDG11eUOvT58="
	},
	{
		"path": "assets/ConfirmationDialog-klzjv9qq.js",
		"integrity": "sha256-D/qwyHyHV8YzZlFpG91/7jykg3IwboGZBjrhtwW2i4M="
	},
	{
		"path": "assets/ConnectConsoleDialog-ewnaoj51.js",
		"integrity": "sha256-p6tmQouJAcI1a3KesrtcN/IF2ziOqjOBjL5Dd/L1w48="
	},
	{
		"path": "assets/ConnectInputDevice-ebigt71z.js",
		"integrity": "sha256-h+OPZNPW0q5cvUtI14MGSrqFUrf8nZknSktiOErTjRg="
	},
	{
		"path": "assets/ContainerVirtualGrid-gc40b5uu.js",
		"integrity": "sha256-GlL7jOROdMTnfWdwpjmnHA/l4csnN7HudPGZ6igrWOk="
	},
	{
		"path": "assets/ContentPromotionFREDialog-gcu3vlcr.js",
		"integrity": "sha256-6Gicgghv+McS3OTgLjFjtyT4bK1edzQJaH8chUaK6PU="
	},
	{
		"path": "assets/ContentPromotionPage-fj56l69r.js",
		"integrity": "sha256-vMA53D0jAa5yXI8i29yTjdRSAHg3WizB0lJL7L074MY="
	},
	{
		"path": "assets/ContextualStoreDialog-ee9ya4cd.js",
		"integrity": "sha256-fi9mdczVwQPj52FShi5WfQgIanTMTcOBh5Rc5DPRdxs="
	},
	{
		"path": "assets/ContextualStoreHost-jce1zzlr.js",
		"integrity": "sha256-qLfPJL1Uyj9i5G5wsDn6stSDEwzxpG/1WqSevHgxHTI="
	},
	{
		"path": "assets/ContextualStoreRoute-gz2zll82.js",
		"integrity": "sha256-kZkbSjWg9kKwpKiH5eAOZMJYwPD1J0qDIRguZDkFW5Y="
	},
	{
		"path": "assets/Controller-nefjcmnz.js",
		"integrity": "sha256-z2oqWLzepTGrbNXy7xqNn4FA1sUpepozqD+1130MwHY="
	},
	{
		"path": "assets/ControllerBluetooth-nu0xyx07.js",
		"integrity": "sha256-BvnUyzHnhW1Q03I2pEaRdgBewq2uEMut3/64A1aOWqY="
	},
	{
		"path": "assets/ControllerBuyQr-db5pll7o.js",
		"integrity": "sha256-K3uFEspNU7sQsuSgt2iichS7mqc6o3M3LVYWQRdHTco="
	},
	{
		"path": "assets/ControllerConnectedUsb-dlyufjsd.js",
		"integrity": "sha256-Z7Zm50DphraOBjGTC4QqceVCSmoHWYIeJU0U4JYXTXA="
	},
	{
		"path": "assets/ControllerGenericDefault-ln6x4572.js",
		"integrity": "sha256-wo9VazNaFIqv0ZIb5wBG8vxhGKiJJ2Z8jSiXMdaZWHE="
	},
	{
		"path": "assets/ControllerGenericPair-bipvfiqr.js",
		"integrity": "sha256-qa/7BatJoXbxdCzGKWrFm30dpWoSPCKBeLm/CPqhHqs="
	},
	{
		"path": "assets/ControllerGenericPressButtons-mwww3q1u.js",
		"integrity": "sha256-PGRDV+DOzJlmBUlBMrI+ZkMrUDouyZuInFgP8fQubiE="
	},
	{
		"path": "assets/ControllerList-nh54g0mj.js",
		"integrity": "sha256-OastWK4w+Q71txtyUNhiYxoGce6xcYHBsAgWsnwTd0A="
	},
	{
		"path": "assets/ControllerLunaDefault-clxlmrnk.js",
		"integrity": "sha256-yOOdNeoIhDBqEZZZC/e5koGit7UNvn16f/Kf1b+pyb0="
	},
	{
		"path": "assets/ControllerLunaPair-egc5x6xi.js",
		"integrity": "sha256-wsO5+2EX3MFnHa67SV4OHVhbVUaSWuS/7voHDQ5SFFs="
	},
	{
		"path": "assets/ControllerLunaPressButtons-cnci4dzy.js",
		"integrity": "sha256-iyj4yVTtdk4BoXl0zm14u4FKOeS+MK7tcE0d3SJGz00="
	},
	{
		"path": "assets/ControllerNintendoSwitchProDefault-esncot9n.js",
		"integrity": "sha256-M1rpfKfJg+8IsGIA02Wdrba6pikCeof0C9dIOrGjgDY="
	},
	{
		"path": "assets/ControllerNintendoSwitchProPair-ebcw7rgq.js",
		"integrity": "sha256-XHbDig2jg7dHGMnEE3ejBwZHBSDF/gAEnnTeb/6T3Sg="
	},
	{
		"path": "assets/ControllerNintendoSwitchProPressButtons-kfmcvw3u.js",
		"integrity": "sha256-0qwOq3HmdeIvr5iLywBZ3xK4fRa16y0K8duWzCBb2qY="
	},
	{
		"path": "assets/ControllerPairingContext-g12j6fyu.js",
		"integrity": "sha256-dRC+h6qFHWfao1BMWoIc5k5Yy210GZynYLRQvb1/OnE="
	},
	{
		"path": "assets/ControllerPairingDialogContent-nvc7xku6.js",
		"integrity": "sha256-FKNh0wV3vHv1ev4ekQ+EMzhMxgnN65/mVsAL0gQpz94="
	},
	{
		"path": "assets/ControllerPairingDialogWrapper-dcctdlot.js",
		"integrity": "sha256-PQlZb/NhyStEA+nEckGznhXXR1clZbctkwatCUuhmU4="
	},
	{
		"path": "assets/ControllerPairingHeader-fiafpaeq.js",
		"integrity": "sha256-nDt2u0spsPj3299x8ZugC/bMo6jb31sRKg6o+RPk8E8="
	},
	{
		"path": "assets/ControllerPairingRoute-h2jdlaie.js",
		"integrity": "sha256-RmEkJ2NH5dz7WBLcPBFaMlgUbNixEamGFcWeTs6ohsE="
	},
	{
		"path": "assets/ControllerPlaystationDualSenseDefault-ksjivab8.js",
		"integrity": "sha256-sgQgHt73cL0yP6khh5XmkOaN5IWXcDAapmuqnTKG9Cs="
	},
	{
		"path": "assets/ControllerPlaystationDualSensePair-m0sqaw3r.js",
		"integrity": "sha256-FXwpi1+DiFSwdTzK14PTvafbx6E9cLhI6zqD/foXqRE="
	},
	{
		"path": "assets/ControllerPlaystationDualSensePressButtons-jb7y8fjq.js",
		"integrity": "sha256-QRtYgG45Qgi3m2EBhUBBv9aYqGQwM0Fx/TLe8Zoqyio="
	},
	{
		"path": "assets/ControllerStatusDialog-ic31xltg.js",
		"integrity": "sha256-Pcl+WC2V0Y3We2uGS8i6/QubkdiChwhsVMucCT/T1KQ="
	},
	{
		"path": "assets/ControllerXboxSeriesXSDefault-kmzq0u7b.js",
		"integrity": "sha256-Oy9u14UoDVXbCmHAzlPbtVyTjsyePd+EgGQnIVwCHBo="
	},
	{
		"path": "assets/ControllerXboxSeriesXSPair-h71h57gm.js",
		"integrity": "sha256-Zts/EUo0RwCj6PzT827ntdH20aVD4eC8JKtyeSX0eiE="
	},
	{
		"path": "assets/ControllerXboxSeriesXSPressButtons-l26x94qy.js",
		"integrity": "sha256-7AGaeD1rzkYzwjjK8cKwJ1ZewtqzndQTvzqL7I2V+c0="
	},
	{
		"path": "assets/ConversationsList-mdrouoa8.js",
		"integrity": "sha256-b7IMElmdaCoe/PbV9y0kj8dr3GhZb/N+LI1gUfB0rR4="
	},
	{
		"path": "assets/CoreApplicationLayout-djgnfhh2.js",
		"integrity": "sha256-yESJEfduynqjkp9Io0u+PHKfoRS+0adrwtq9q1hThoo="
	},
	{
		"path": "assets/CreateLightweightUserDialog-d8512hh8.js",
		"integrity": "sha256-wQbdYJaU3uHKOdVWfU+l4F/liKkMCwHCt6oJcBtK5UI="
	},
	{
		"path": "assets/DefaultPlaceholderImage-n7xcg7i1.svg",
		"integrity": "sha256-K26xxyrFaYwhjXuutlj9/P48aioMHuA39ra1KQBAmZ0="
	},
	{
		"path": "assets/Description-gn7yegek.js",
		"integrity": "sha256-JNUEVVT57Yzoho0sPTzMHbL74ZBjl9hLWXxl6n6Ar4I="
	},
	{
		"path": "assets/DesktopMode-g6tccqj2.js",
		"integrity": "sha256-lJiJi+7hUrrLexvpw7Q7JHEZINhrXAH0dRI402ykNOg="
	},
	{
		"path": "assets/DeveloperTabContent-cnc449no.js",
		"integrity": "sha256-Pc7q8G0CGMKXBgSHeH39/0EJTqfdDg81qmD65JHnpno="
	},
	{
		"path": "assets/DeviceCodeRoute-k6c47hit.js",
		"integrity": "sha256-2M21fniy1nEgoy4B2wkP09PHecMrFE7yjj9wyQHJBDo="
	},
	{
		"path": "assets/DeviceGameInputPage-kzaxy6w2.js",
		"integrity": "sha256-gMB4uq7zQ7OteemlIHqVlrhMmSdn7SapLdb227X5Q9U="
	},
	{
		"path": "assets/DevicePage-ltxzdyvo.js",
		"integrity": "sha256-Y2GKBX7en90LChSXO4g594G02mDzvyBpj138wUMKStI="
	},
	{
		"path": "assets/DeviceSoundPage-csl99b8x.js",
		"integrity": "sha256-sKT0aOMdKKYXvVo+CEgl5u6Ace4LT5ZeSp9KWOfxtQ4="
	},
	{
		"path": "assets/DialogShell-ga7ic6wy.js",
		"integrity": "sha256-uSsxx9lGlP10BNJctQvYQPIWheslu/024YRpo6O9Uwc="
	},
	{
		"path": "assets/DialogShellContext-grfsno45.js",
		"integrity": "sha256-QyHLkb27YASKAJnqRMxVju+fTDoakKzWUW3iGA3/GUk="
	},
	{
		"path": "assets/Diamond-htqqez0g.js",
		"integrity": "sha256-sGSw80NDKCdW0TXBo3GMkZe6CFDDeyRPtkFWqjPwk8E="
	},
	{
		"path": "assets/DirectChatPage-ni5qkxym.js",
		"integrity": "sha256-JUI8MlIzqo3FKPDN/EMELwcSVFNjwFvUkHx8b6R8Sig="
	},
	{
		"path": "assets/DisconnectWarningDialog-e05jt080.js",
		"integrity": "sha256-i8/hvB1n+iV6Gfttn6fMBlyihrfz1nS+Yw6rFyq/lSk="
	},
	{
		"path": "assets/Dropdown-hdf9za35.js",
		"integrity": "sha256-juRmk/oOneFSVsCyIvDNevYVLpozUwiLdX03OQ8IzPE="
	},
	{
		"path": "assets/DuetDialog-lk9pz6if.js",
		"integrity": "sha256-Ye8FVP7DO14r6AJefWww50L2oa90WhsqhSMUcPSa29E="
	},
	{
		"path": "assets/DuetPostUpsellDialog-dglfsdmd.js",
		"integrity": "sha256-u9oaTPX1KEAKBm2VSYIZ7FdygobZaDVFrUu5yeTeeBc="
	},
	{
		"path": "assets/DuetPostUpsellDialogContent-hkkw0o01.js",
		"integrity": "sha256-aCQPaOOobcgB4HfitIfR0paeupgm42CQuhUgR0YpcW4="
	},
	{
		"path": "assets/DynamicLayoutRenderer-b1allo8r.js",
		"integrity": "sha256-eU/q2FyVOtMNfRj1Hj+SuKjJoP0+ho/KjgCIbh2UgTU="
	},
	{
		"path": "assets/EIDV623S-jqtuclkf.js",
		"integrity": "sha256-iTBWRrCfPOxsmtvkrcG7YzMsKQJfgL8I3OI3zcCESAc="
	},
	{
		"path": "assets/EmptyAchievements-o4jgk32e.js",
		"integrity": "sha256-zphoeHqG23a+KLelnm402bvVuchSkc/FxRXsMaC5jgc="
	},
	{
		"path": "assets/EmptyChat-hnbbarri.js",
		"integrity": "sha256-mxScv8jCPbiQnOW1AmnS6/1cvcitejONV4j4tozecqg="
	},
	{
		"path": "assets/EmptyFriendsRequests-w19eflyr.js",
		"integrity": "sha256-QO5/C0NkP6uyo+nILQX7tElbIvwVfNE3+L9ltWMg0Xw="
	},
	{
		"path": "assets/EmptyPlay-dto3vrdy.js",
		"integrity": "sha256-LAdMOWnPcBE8AyvIsDjVhBFlT80ujz/jE5cEX6WCi9o="
	},
	{
		"path": "assets/EmptyProfile-fg5x42j2.js",
		"integrity": "sha256-jAd9cQLTlQpti11HP67UyqMWWOrLEzRn+jyL8vJonlk="
	},
	{
		"path": "assets/EmptySearch-ipfnled8.js",
		"integrity": "sha256-3eKOLVjibmvMR/Sf9TmSEHgK/DEgruWgN+KrN4z/GE8="
	},
	{
		"path": "assets/EnterGiftCard-h5fbcr6m.js",
		"integrity": "sha256-RWfFTEvJ4Y9GEDNQPPgT6zcMIK2Vk/BkoKBmeUP8DSE="
	},
	{
		"path": "assets/Error-otzamwsx.js",
		"integrity": "sha256-Pqt57hthrIUR0kggDXS44f9xDCoRrKg6kqrJahfCLsg="
	},
	{
		"path": "assets/ErrorAccess-og03enqz.js",
		"integrity": "sha256-7vFxhOlNsmhOcWsLWzdRZAPVPAXkRPQ2g7zwfFJFK48="
	},
	{
		"path": "assets/ErrorChangeGamertag-gsulvmb3.js",
		"integrity": "sha256-SZ5wVhh33bcbFHmNnVztYdnsIyo9ShjYEw9nIEkBzfc="
	},
	{
		"path": "assets/ErrorChangeGamertagContent-gliow57a.js",
		"integrity": "sha256-yivdM2oOzdtQ2xhkDyo/JLHRU8MM8WonuN1spO43M+o="
	},
	{
		"path": "assets/ErrorChannel-e2qytd1e.js",
		"integrity": "sha256-l006mQ4b0bi71VmfTmth0+BRv4+I7wz/KVqh3hao1g4="
	},
	{
		"path": "assets/ErrorDialog-iksdiohl.js",
		"integrity": "sha256-ajSfMaEfD1ZdfMLMIxPBk4keT5KlTNfTeu7n4rkuW4w="
	},
	{
		"path": "assets/ErrorProfile-c0nclr6d.js",
		"integrity": "sha256-CutV5CT0rOTsexmEvLRJqw1MwFnXYPHh4+ebSNJ/hRY="
	},
	{
		"path": "assets/ErrorServer-dj5361vy.js",
		"integrity": "sha256-NsNWTyy5nHNXI282qwJJe1fsdkTsqd++EaWC9hbikZE="
	},
	{
		"path": "assets/ErrorTestRoute-gbi6zgin.js",
		"integrity": "sha256-Na+vtYPFkLFYt9Y4LycEU1mcF4xYYiHfBe6cYN5byWE="
	},
	{
		"path": "assets/ExampleTemplatePage-emqpi8os.js",
		"integrity": "sha256-tmoMaNirdQhJ8HIxpSE5ydoKlV9Ys5wywBJbKGvjZ8o="
	},
	{
		"path": "assets/ExampleTemplateRoute-naysu43c.js",
		"integrity": "sha256-dzDl7joTQTdPF75ins6oZ2BzVeeWmPTwGlbvkrhUimY="
	},
	{
		"path": "assets/ExceptionRequest-ohinfb8b.js",
		"integrity": "sha256-jxtn40lmxMccn5yB6M3eF3aXzGqhf4sLadyJZFpx3Uc="
	},
	{
		"path": "assets/ExceptionRequestSuccess-glu1nsa1.js",
		"integrity": "sha256-Gb073kbH0csuA7+TvgZC6reelJpX/eYjAJ8yXgpkSfA="
	},
	{
		"path": "assets/ExitFullscreenDialog-kgn1st18.js",
		"integrity": "sha256-Sn46PEBsJ5fvljVNS+nBPSEM7z4/pv0fnS7GC+s7HoE="
	},
	{
		"path": "assets/ExternalAppSetupDialog-d0aj6if3.js",
		"integrity": "sha256-xqN0TCoW2WY/IBo/SqyJFuL1E8/WhVjtN1A0SpF3Gxw="
	},
	{
		"path": "assets/Feedback-gwbqhjq9.js",
		"integrity": "sha256-pu8ttti5QkgErEvbwylJQUw1IRudgwU7C3he25JnYr0="
	},
	{
		"path": "assets/Feedback-iaamtwyb.js",
		"integrity": "sha256-8GuzOJAL5ShC81Ihi2N/xcglafKqEfSy1Bay6HTZ69I="
	},
	{
		"path": "assets/FeedbackButton-c5d91z75.js",
		"integrity": "sha256-C1r5i0n3FK7XP80YsWqmhA92BOoCTVenxwhKC8LW2SY="
	},
	{
		"path": "assets/FeedbackDialog-na45735c.js",
		"integrity": "sha256-LSKZ8uLe8AQsui2vN1g3YmW0ra3FYAZXSnl4ryUZjVE="
	},
	{
		"path": "assets/FeedbackEntryPoints-mh0fmk2c.js",
		"integrity": "sha256-Q80kNgppPIwYNjT8X7B2Qs6Bi7xcPaTR+j2j/TVujhU="
	},
	{
		"path": "assets/FeedbackExternalRoute-dvdm7mpo.js",
		"integrity": "sha256-r39iggxGYEbuS5iz2yxuPgtjKjqnlSYzvzU+73Wz6Es="
	},
	{
		"path": "assets/FeedbackVerbatimScreen-oqr3cbz6.js",
		"integrity": "sha256-4BX5gNUrhGzh2iL401Bzma2G370dY+nncFYtMCI9UJ0="
	},
	{
		"path": "assets/FilterTagsDropdownRow-o0ofb8ts.js",
		"integrity": "sha256-DdBGTywar3i5QW+kzrTRT44bFfP/ddPG+lSyhW/PYHY="
	},
	{
		"path": "assets/Finish-jgeqsvnt.js",
		"integrity": "sha256-bYT737XZ5V4tvJmZe7UO8dsH9YZmdAQOALVCmK8vxPs="
	},
	{
		"path": "assets/FirstLookWelcomeDialog-gclw17am.js",
		"integrity": "sha256-ommLFXsj/YOpsMNqvudYPvKtSGB/wShia5jq8l6M9mA="
	},
	{
		"path": "assets/FourOhFour-g8zo94vx.js",
		"integrity": "sha256-TTRe+gmXCIAsZGWIPi8/w03X0MrmgQxYiF9tPkyi7FQ="
	},
	{
		"path": "assets/FresnoPostStreamDialog-o91caf9y.js",
		"integrity": "sha256-itZHLeo3opqZDQe2eeYMw+eF0vGqLfhBXo72J18j4DE="
	},
	{
		"path": "assets/FresnoTimeoutUpsellDialog-la4fl0ph.js",
		"integrity": "sha256-BTR3B1f+IlC6YKT2s5t0g7l27r0F3MgG+iPHTYwpUUA="
	},
	{
		"path": "assets/FresnoTimeoutUpsellDialogContent-d2p2y5qk.js",
		"integrity": "sha256-9WoI9K56LEjpxsUE/Mu1AUOCuJA3nf3j6ZBRr1qIVPU="
	},
	{
		"path": "assets/FriendDetails-jsrd0b9k.js",
		"integrity": "sha256-P4N8Y8f2/PvDx1fd/AxuC8JEeTSVemgzgG4FKlKT+RM="
	},
	{
		"path": "assets/FriendRequests-kw22kzhy.js",
		"integrity": "sha256-PFEqsS4MqS9aTm4pe9wuT57T571LI/xnF3aGPUgCJxU="
	},
	{
		"path": "assets/FriendRequestsPage-dbg3xyyd.js",
		"integrity": "sha256-P8ivWZarx+qo2hZhSqTMgT5N+tFFGcvlMK7F0AK6sOU="
	},
	{
		"path": "assets/FriendsWhoPlay-le9mdzt6.js",
		"integrity": "sha256-He2y5rp0OlFvecaCKJpCvWWFLEnUriwSc6zOYLQ3J98="
	},
	{
		"path": "assets/FullScreenMode-oaax2fx0.js",
		"integrity": "sha256-6IoscPcgIQ2lMELL3IR4S8RKWjw647+FfTvk3ZMlwbQ="
	},
	{
		"path": "assets/GalleryDialog-n64upap8.js",
		"integrity": "sha256-Xu2QhHkGqWE7Tcei/AI4VaBbYMQOFudmvKg2ZX18/bI="
	},
	{
		"path": "assets/GalleryPage-brsharru.js",
		"integrity": "sha256-+DGeVnnwlmG6kcYgl9o5HYvZZWRqsNkUwgrJwicvuIs="
	},
	{
		"path": "assets/GalleryRoute-fwugjn67.js",
		"integrity": "sha256-UbWh1GWf4xeFZ1DQ7E3utOC43M8WxHLu/InJ5/CaDLY="
	},
	{
		"path": "assets/GameArtScroller-k420qq7e.js",
		"integrity": "sha256-I7CjPKkRSf4SzOwL//j+sXOxdTxZxrgbL+qFid5f5c0="
	},
	{
		"path": "assets/GameDescriptionDialog-jse250mh.js",
		"integrity": "sha256-Chi8NPlzCQ2lnHdCtzPKdmebDoGLmIi81C+eJFjlsu8="
	},
	{
		"path": "assets/GameHubGateLayout-i58d6iis.js",
		"integrity": "sha256-9ZexsUsjNGaDawTQ+WdMDRTxEPpWDPNYrOtviz8/KUg="
	},
	{
		"path": "assets/GameHubPage-ow5wuyiv.js",
		"integrity": "sha256-v+YOiNO64kQKHb71QKu4NJE4VVlufBBTRfhe9WVJAa0="
	},
	{
		"path": "assets/GameHubRoute-hb6r5p52.js",
		"integrity": "sha256-rB0fQ1d4iooMhIDWV66kLDbZnshApsyBr5Ppm1zgG70="
	},
	{
		"path": "assets/GameInviteDialog-j9vbxara.js",
		"integrity": "sha256-Fn8c8ssy4U8Uege/MDqI5+tQxQiVTggSBAVUSkD3FAY="
	},
	{
		"path": "assets/GameInviteGateLayout-njq8zxcj.js",
		"integrity": "sha256-iNY5drNcCB8T3wt3O0NKS5EVMeKukLO0Id/zuJ0PAXY="
	},
	{
		"path": "assets/GameInvitePage-bynal805.js",
		"integrity": "sha256-JbHa+QHUnf+fNNmQTh+GtEahR/NI5sqIo2eQ9weL94E="
	},
	{
		"path": "assets/GameInviteRoute-19mllepa.js",
		"integrity": "sha256-HtzeCbYJLzFJRobNUs+BuX2vxY9RNc6J7GQ4Ts5eNSs="
	},
	{
		"path": "assets/GamePassBadge-hp32hqts.js",
		"integrity": "sha256-pF4STzg2/gfonzYxOtHH97a21Unb+sIpORHHv0cQCks="
	},
	{
		"path": "assets/GamePassGateLayout-cjmk4z32.js",
		"integrity": "sha256-ti6nBZXDLB7O+zF/xo0LEIsbPmhy66p7MiuZDeo/3HI="
	},
	{
		"path": "assets/GamePassPage-ganvbkza.js",
		"integrity": "sha256-62DlZPJH6+9ync5uu19LB8OptVa6jkeXtAAKLUWLjrQ="
	},
	{
		"path": "assets/GamePassProfileService-i0nxuvbf.js",
		"integrity": "sha256-t4c3UpRrVm3zjRcmpgN8yqjr9Y+Q9N06y9zWndiRzmg="
	},
	{
		"path": "assets/GamePassRoute-dx8sqt6f.js",
		"integrity": "sha256-FTmDBdMuundDpIQ61qU7/N00ncd3svXnsmRl2LBkajc="
	},
	{
		"path": "assets/GamePassShellLayout-o60x1u5g.js",
		"integrity": "sha256-w4sghlCYtv+bJntJqDoMuIMPUoy2UiNM0Kf8h1wp0pc="
	},
	{
		"path": "assets/GameSessionCodeDialog-ldy6y3vj.js",
		"integrity": "sha256-Rg0EtWkBjYAuggKyCvjM/L2b1AhyCnkpvzsz26G9Ofc="
	},
	{
		"path": "assets/GameSessionDetails-lrb45wq3.js",
		"integrity": "sha256-14uvqNDYgg+B1mlwugymOLl9ndQAzhaL8aBBRhLY3j0="
	},
	{
		"path": "assets/GameStreamBootstrapper-b34zt04n.js",
		"integrity": "sha256-v9XpOIqsQX1qFYdd2LtWiD8XyfJi3FPwdqUx4P/10qc="
	},
	{
		"path": "assets/GameStreamDialog-e7b7wli9.js",
		"integrity": "sha256-osRqQDOzjpbC+2vmWkyRpxVJELgO8IXR6aYfz/6z3Vc="
	},
	{
		"path": "assets/GameStreamPage-eeysv293.js",
		"integrity": "sha256-+e5UP01P3TFBAHCjc2IT5MDkIzxU6s0hJDLD4sCRqkg="
	},
	{
		"path": "assets/GamepadDisconnectedDialog-k6vu1317.js",
		"integrity": "sha256-rckviEXWdE9THYZGpimNFvfTzOvFlLYnMWR8kmOqDak="
	},
	{
		"path": "assets/Gamerscore-hcq9d41u.js",
		"integrity": "sha256-9kcgfungSKSjQqResixdzFaon2qdleohbG2EkZz5V18="
	},
	{
		"path": "assets/Gift-czuc7s6y.png",
		"integrity": "sha256-HKxu51CVY6109f9Zd3SMyzMQltRDqIVqJf1vnQ1vzgU="
	},
	{
		"path": "assets/Gift-n506jqqv.png",
		"integrity": "sha256-NkjinG3errUYPFtbeEU06Q/+kmcE9tG+CdsbQyJlCFw="
	},
	{
		"path": "assets/GiftingDialog-edprl512.js",
		"integrity": "sha256-UJwQENcNsuxq09gBUacPheaDAaWl5NpjvITU/EPxxNo="
	},
	{
		"path": "assets/GroupChatPage-mkc9s6b6.js",
		"integrity": "sha256-HTOA/AkyG1djF9hhKOYZtONdtYgQTigkzyHYKx6RJb8="
	},
	{
		"path": "assets/GroupGamerpic-ixaynvir.js",
		"integrity": "sha256-BSIzHeAtNzEgiF+XOqvti65rf0LuHC01y24tvRXxkXo="
	},
	{
		"path": "assets/GroupMembersPage-kfaj1884.js",
		"integrity": "sha256-mqOmf7vOgatx80ZaG1D3OxzkbFzwbh7psiNZ1SXbtds="
	},
	{
		"path": "assets/GuideAccentImage-hojxwxht.js",
		"integrity": "sha256-SzrYNFxzY02ARoQpIvOqiWzVcOPLnWgFUO706CPcVeI="
	},
	{
		"path": "assets/GuideDialog-fi76ketn.js",
		"integrity": "sha256-Oz6JUEjMabf4t9XiqDk0VcLGwqWhg3BoAxq1CFUg4jU="
	},
	{
		"path": "assets/GuideDialogWrapper-kkgblr47.js",
		"integrity": "sha256-jcKWVuETAsCYPGvfyPfEBBYZcuGMJvNOKPxDgFcRzEU="
	},
	{
		"path": "assets/GuideFriendsPicker-hl7nx5ln.js",
		"integrity": "sha256-fAodnYnKCqiFsXM1rjuYO0zAzcvDBCFBhGp7F2NZSL4="
	},
	{
		"path": "assets/GuideIllustration-pex5y7xc.js",
		"integrity": "sha256-XsOU8UnrW1jdrT0yTF3yolN/Sb7vKblp0wT1qWCdcpw="
	},
	{
		"path": "assets/GuideL1Header-jicu0pye.js",
		"integrity": "sha256-cmvsXbrG17STNNlWNxw32ws6Ed574WgdhLTlXMDu55k="
	},
	{
		"path": "assets/GuideL2Header-a2pogkf0.js",
		"integrity": "sha256-bSLFoTcUAmIvyUxqyMjkQVTeYoXmt6u0R+oN1oGi0QU="
	},
	{
		"path": "assets/GuidePageLayout-eh7novzv.js",
		"integrity": "sha256-ArpgJr3BicIxEL7Q7HSMQfYg2qxFRvgoNlYp4MPnO3g="
	},
	{
		"path": "assets/HomePage-0f05hgs6.js",
		"integrity": "sha256-0zGxFWelfC4Zze8Sd2Ab9uSg114VaolgsyooPFhM8hU="
	},
	{
		"path": "assets/HomeRoute-ea5ux9lb.js",
		"integrity": "sha256-z+CLOdL4jYmIQJCHBK48RkVpmy3BPYTT5k8jOxvM0AA="
	},
	{
		"path": "assets/HorizontalProfileItem-nxlgww0q.js",
		"integrity": "sha256-dJktJKNCad21uQxNqVhtJ9aL/VoD4SG9vakrIz7ra6U="
	},
	{
		"path": "assets/HorizontalSocialItem-locb7qz2.js",
		"integrity": "sha256-XURFmtMIOzlDm5n2/0f20HeuZUjcduyUufb+S//ngCM="
	},
	{
		"path": "assets/HorizontalSocialItemLoading-lf95egyh.js",
		"integrity": "sha256-2vvGE+RqLmps9bT7JhSC9hxH4XUlDiHrAryvAJn0wio="
	},
	{
		"path": "assets/HorizontalSocialItemWithButtons-ecyndeus.js",
		"integrity": "sha256-F4WhCk+NVTS4MW5HlyE+4isRp56D7TFZy1vnysWsF6s="
	},
	{
		"path": "assets/IPConnectRoute-ostfbo4i.js",
		"integrity": "sha256-rzTz9guySQim89UHxaswH1ehdc97LhMAHD6vom7jzW8="
	},
	{
		"path": "assets/IdentitySharingConfirmationDialog-opv5syvd.js",
		"integrity": "sha256-/p1JEgEGcdSXJbupvfFeBBYZGYlm5dEwX3L8ez4X/q0="
	},
	{
		"path": "assets/IdleWarningDialog-i9tll1ot.js",
		"integrity": "sha256-5HR0S4S0OIY9yCFh/3eX9K902Nv5Q/V778f31FPlxgw="
	},
	{
		"path": "assets/InfoContainer-don0ub98.js",
		"integrity": "sha256-i2uCqCta3ftmGqdF74TbCAyPepG+ZyEC+tKbqsUDPf8="
	},
	{
		"path": "assets/InlineTabs-bvyyhfyl.js",
		"integrity": "sha256-2/VeW/DhnmJgZo7kbW3UAFoufCsKzIWwp4wfnRAPRwM="
	},
	{
		"path": "assets/InputCheck-c9t6rnva.js",
		"integrity": "sha256-b1S4c7mrAA2hqI6EOLbH5hGblUgdrAqKe7fJf1jVqQI="
	},
	{
		"path": "assets/InputTab-ihv5z4vj.js",
		"integrity": "sha256-ONf/UkSdQ/jLfpGZ1aRxV8K0q4lNgd4Hhofj4bMoi9k="
	},
	{
		"path": "assets/InsiderPreviewGate-okx9ojdd.js",
		"integrity": "sha256-q0lulCfWu0zNXiCFdqJAbGIt61ucrm1D8Nzzx02aYx0="
	},
	{
		"path": "assets/InsiderPreviewGateDialog-n2s1u2q4.js",
		"integrity": "sha256-bsUiUQN5jZ4kckzfYCR4HDh+mtFyTeOwUVH/xfNDmKc="
	},
	{
		"path": "assets/InsiderPreviewGateLayout-h667lw87.js",
		"integrity": "sha256-LmWaFsXJSVLBj73GDl96cLnr+tqivnQeEQEIJvBvtT0="
	},
	{
		"path": "assets/InsiderPreviewGatePage-j2gbxerr.js",
		"integrity": "sha256-y8nhAxea4x288xpyummVZBXDtIIC3FzdwssgD7cZwVo="
	},
	{
		"path": "assets/InstallDialog-jaezzyhq.js",
		"integrity": "sha256-R+O6qJzDVvMAx8tOZcerofvvXb2H0m0hVb6PpQTbigs="
	},
	{
		"path": "assets/InstallDialogContent-l89jv65o.js",
		"integrity": "sha256-QFX7eZRkBTk3MeyXH+d7ugH82y80MfSeoJMbvrQmle4="
	},
	{
		"path": "assets/IntraDialogNavigationStorageProvider-c39vfeoe.js",
		"integrity": "sha256-L6fAO9Fhxc7ogL8wxDR4DbzM1LtMxDaz8Z/e6XUu6hg="
	},
	{
		"path": "assets/InviteAndCreatePartyPage-ceogotk6.js",
		"integrity": "sha256-uxRYwYRhF9270h5nx5rdyeKMNtoXH763ePUhLElbJhA="
	},
	{
		"path": "assets/InviteToChatPage-boku6wht.js",
		"integrity": "sha256-E1Vg+aWAkH9xHztZEysbC639sVmCre39tELVh6e57dA="
	},
	{
		"path": "assets/InviteToGamePage-og559o0a.js",
		"integrity": "sha256-qbdeXAO4xH266MD1cJ6mau/igmmQszqu71A/N0pjtqM="
	},
	{
		"path": "assets/InviteToPartyPage-lueaoduw.js",
		"integrity": "sha256-bNWzLj3jCfleNCnn7cJjNsNUqT6YzZYuldzupgncekI="
	},
	{
		"path": "assets/JoinGameDialog-hfu93fqz.js",
		"integrity": "sha256-uYrUQf/ysN7VH6Mc4a0Lr/yAYRRzwEDPeB7QIqA1nsA="
	},
	{
		"path": "assets/JoinablePartyPreview-g1bq39m7.js",
		"integrity": "sha256-yXHoIxz49TRdGROYMcIAypqmTpod46Uzu//pgYver+8="
	},
	{
		"path": "assets/JumpLandingPage-gb068glg.js",
		"integrity": "sha256-KHYOyhPa+eXNrGQ91tUjALnDbi4Ay0maWSd0NbpX1wE="
	},
	{
		"path": "assets/JumpLandingPage-itmog6et.js",
		"integrity": "sha256-iuaATA0NCisaVC3xNt1A0ZXjShMnwhjJhj81HbENQdg="
	},
	{
		"path": "assets/JumpLandingPageError-j6f9ykxe.js",
		"integrity": "sha256-Lb1DF8icQqeSP08XJxPoUQBeTd/dXTtYD4kDJI8HvZU="
	},
	{
		"path": "assets/KeepPlayingUpsellPage-e4oys5x9.js",
		"integrity": "sha256-vWL64+0JbpQQNEPjHG8yQqMdMuKMNjIRf9LZYWoN3Sw="
	},
	{
		"path": "assets/LanguagesSupportedTable-c4n7lrwe.js",
		"integrity": "sha256-dDMp+0vQT3MvuKvpFRb0pgMqZFVYHwoqlyNQSViEn5g="
	},
	{
		"path": "assets/LanguagesTab-h8d35iub.js",
		"integrity": "sha256-LbrIKwlEp7nvv3kTsz9axC2HrmnZZ9NnKjRYqYxulQY="
	},
	{
		"path": "assets/LibraryFilterDialog-ivcimwcj.js",
		"integrity": "sha256-2sKO3ilZYSNQJouHVWpqXWBAewSZfpZ0pmrkxhWiUks="
	},
	{
		"path": "assets/LibraryGateLayout-fwpvpgmo.js",
		"integrity": "sha256-Podvc+avF294wchQ/xK1cAH/zBh3siV+cqXgzrsbGCg="
	},
	{
		"path": "assets/LibraryPage-h9vymy6t.js",
		"integrity": "sha256-9QLkY5lQdPG3eop0IxIE7t+sgEOkYAXFcCmSIBJwRhc="
	},
	{
		"path": "assets/LibraryRoute-lryivnos.js",
		"integrity": "sha256-A6zkQ6TKGeRcA+tk6cz3wAioN0BRInEkKx3e6TV95+w="
	},
	{
		"path": "assets/Link-ieqddn6w.js",
		"integrity": "sha256-uFiI85v+ru42RNmV0dfg1sYtFz5MvpBg+S7S+y2jvuo="
	},
	{
		"path": "assets/LoadingParty-bxsummv7.js",
		"integrity": "sha256-0Z+5D5e3/udZaLmtll2Fp276iQPCxgY80oYr8YUKlAM="
	},
	{
		"path": "assets/LocationPermission-hefg8xll.js",
		"integrity": "sha256-OuE+EvcIWFPIZNUq7j+qckjBXE+FHod8Gs4/43gTqFo="
	},
	{
		"path": "assets/Lock-msxmmllg.js",
		"integrity": "sha256-2+nC+/cMleBWcuZRT6I6C/GgLufAbrcqw2L+dllqnfo="
	},
	{
		"path": "assets/LockedProfile-fzw127ha.js",
		"integrity": "sha256-ystfvbEGis6m0BT9e7qukOZbAA3+zGk/CYUL5KmUut0="
	},
	{
		"path": "assets/ManageBillingAddress-ab1rku3t.css",
		"integrity": "sha256-O5Xc3vM6suW0Jmjb/tap/b1VSAKoXpua79Airjc9UN8="
	},
	{
		"path": "assets/ManageBillingAddress-jtkqllew.js",
		"integrity": "sha256-MkNfUifRme7JFXDWlMs6LTvZ8wnC6gcbZ5hQvOvanq4="
	},
	{
		"path": "assets/ManageBillingAddress-nivex3ju.js",
		"integrity": "sha256-pr3BcXdF8OcImNOK6XT0VW/hNobNx1Z4SvAUGJwmmYY="
	},
	{
		"path": "assets/ManageGameStorage-otstafd9.js",
		"integrity": "sha256-/72y/pniDVX2sCXkt2FMKZsJuwdZpD20rFI7PBvtv7Q="
	},
	{
		"path": "assets/ManagePaymentInstrument-dnyp1ahh.js",
		"integrity": "sha256-YwTeKFfIhNudZOVV6whhbWx0OPajVr5sxr/Eij2nXlA="
	},
	{
		"path": "assets/ManagePaymentInstrument-el8nqtxd.js",
		"integrity": "sha256-7ellwMFv8/BlptLz2YFUPDUsf3E3iARKCJHr4DstRCM="
	},
	{
		"path": "assets/ManagePaymentInstrument-jqc0umif.css",
		"integrity": "sha256-Ix8XBIItgKewJtpzsGay9mVmba0u7jg2YgZtrRvLIFI="
	},
	{
		"path": "assets/ManageSavesMenu-bshzvobx.js",
		"integrity": "sha256-XkXelkPE2V+P9du3vsAQdguMa77ZR54lA3txRog6A2o="
	},
	{
		"path": "assets/ManifestRoute-k82apc9v.js",
		"integrity": "sha256-8LG9o5/y/YDLLMXe3aGFoyKdK1piFXa9T6x0CLMqMR8="
	},
	{
		"path": "assets/MeControlDialog-j2a0w0y0.js",
		"integrity": "sha256-vWAxgAMd9nIw4POltrEtq5g5JhVFE2qr2yV96G4Um58="
	},
	{
		"path": "assets/Members-ejszvwep.js",
		"integrity": "sha256-9M9ElNQlFKMumBThfeWwrNCmA7N27l6MYhRrRBuOZEw="
	},
	{
		"path": "assets/MessageCanvas-epwsnqhh.js",
		"integrity": "sha256-qBvzFEJK3YVG5LxlklGLomsB86igVH+WjsnWKvvtV9Y="
	},
	{
		"path": "assets/MicErrorMessage-e3vya0dy.js",
		"integrity": "sha256-stQZ8MVagHzmH74A6jgeqDW526KvPuUv9tyJ5gH+p0k="
	},
	{
		"path": "assets/MinimalLayoutWithBackground-g609usz5.js",
		"integrity": "sha256-1ItLYZ38ecGH0mBR+Ns8CjR5ZFlzqO7AADVE54/KxbA="
	},
	{
		"path": "assets/MissingImage-fjtoh9qm.js",
		"integrity": "sha256-bq0kLUlBGdBexkZ0mh+wE05x8wq1PvoNeRWxgFaT13g="
	},
	{
		"path": "assets/MockAvatar-l1owg41s.js",
		"integrity": "sha256-hrdgvDITB3UzpBp3VXSGrOX/1KaYbNpnITXBmgEBMVU="
	},
	{
		"path": "assets/MouseSection-b9b6q3jx.js",
		"integrity": "sha256-xpsjy8Xz9c+MA0f6leJxenuwlfeuyjCS9p3yS7xe6uE="
	},
	{
		"path": "assets/MyProfileHeader-kymh07ye.js",
		"integrity": "sha256-eaUKc7w7723c0eRS80jVYY4ODHLC1WooylcFN0hF9n8="
	},
	{
		"path": "assets/NOTICE.txt",
		"integrity": "sha256-q4QfSuhbMzaDX9cWZhjXxL39m8c9icg/NNx6tPZivfE="
	},
	{
		"path": "assets/NavIconButton-jfqqf01j.js",
		"integrity": "sha256-K6BVwGhh+Xilsksr31f1WXrAR0vRrrQmw8tdONxcA6U="
	},
	{
		"path": "assets/NetworkInfoPermissionRoute-huvqixgb.js",
		"integrity": "sha256-wj4Qrf1jbgslwebpAPO++ERUUz4XcbPCiI9cO9lF5SM="
	},
	{
		"path": "assets/NodeWrappers-gh8ohz8w.js",
		"integrity": "sha256-UWF8PL93LlZKHdFGjM8CpADtMec0jtiwV9hoIRKKZjU="
	},
	{
		"path": "assets/NotFoundRoute-g9plfzim.js",
		"integrity": "sha256-NkQws9rjIKQmP/+eUhQJuhQASoi6g3r4klAETL42qpY="
	},
	{
		"path": "assets/NoticesPage-jam4tw97.js",
		"integrity": "sha256-bRm+g7HyJe4TyW7+1iUfpgPeXedoQ/+cZmYzpgl6//k="
	},
	{
		"path": "assets/NoticesRoute-e7klmnuq.js",
		"integrity": "sha256-iQbplqebV0pOxRCMBhQB+dDGMyG2EKeL0kszmJfwBeM="
	},
	{
		"path": "assets/NotificationBell-m98a0edw.js",
		"integrity": "sha256-WG9aHaegDkmEXR/hMBNqe+Z3A9zOIw0B8158Ir3SnIs="
	},
	{
		"path": "assets/NotificationsPage-cyjvptkh.js",
		"integrity": "sha256-DMO84wYx1iVV/HeaqoSL1oNmy6BY9hAAAXPHP1pMkds="
	},
	{
		"path": "assets/NotificationsPage-nsf54r1w.js",
		"integrity": "sha256-ds43nwM6PefdgtWIYqvV6OoIz10+EgKnckGfiJsgxIo="
	},
	{
		"path": "assets/NotificationsTab-o1xr44yw.js",
		"integrity": "sha256-c8OTE9uoJPhHqamB/qUUk9FVBLoxGV2P15i8V8HDVFo="
	},
	{
		"path": "assets/NumberedList-g7xcuf3v.js",
		"integrity": "sha256-DlFY+qwFY3sUrfO5NycNf4+chs+/kHW55VVa8eXxIlM="
	},
	{
		"path": "assets/OSSNoticesSystem-peyrjave.js",
		"integrity": "sha256-iuFzZn1hHrfQV/+PO8I4dS6Racko3kPQu5/KZgrRcmg="
	},
	{
		"path": "assets/OSSNoticesSystem.client-flb797g2.js",
		"integrity": "sha256-dd0rWFnGN1M/JCMjzL1Fz8n57H5RKoMH3WexgPuLVV8="
	},
	{
		"path": "assets/OfferingBrowserPage-mfg0742x.js",
		"integrity": "sha256-dgQ6mv9tgEkaYIhYcWaYWGHSB0F/HgeDVCgfjN4cPOg="
	},
	{
		"path": "assets/OfferingBrowserRoute-f7gjv479.js",
		"integrity": "sha256-fwidR9u9A9J8AS5WFuydJQDChQRIzr1prmna2wTPLdk="
	},
	{
		"path": "assets/OfferingEnrollment-h60v8e6g.js",
		"integrity": "sha256-Ct6trevekWQEHJAURSpSErXOBhyPK+6z2k7jLgzvw3U="
	},
	{
		"path": "assets/OfferingStreamPage-n6ral4u1.js",
		"integrity": "sha256-5HesHKEXZr2gfMEK/RFxoPuOenE7tYSYj6zxs3hsTls="
	},
	{
		"path": "assets/OfferingStreamRoute-dhtnoh1b.js",
		"integrity": "sha256-5wvUAmcXurbvSmhyP9j1Doc1qo7JcEBwy/cgNh8IW4g="
	},
	{
		"path": "assets/OffersAndCreditsDialog-ks7r7srz.js",
		"integrity": "sha256-i0zlkdBBgn+qxWbGGrfB73GoJ2Qw0+XoiTmumBjEW0c="
	},
	{
		"path": "assets/OnboardingRoute-d2z04n6s.js",
		"integrity": "sha256-MIbcJeBOSHXkr7Voclm7xrHqnuQTgyRNLsAmd7c51EQ="
	},
	{
		"path": "assets/OpenDialogLayout-njtwmsip.js",
		"integrity": "sha256-a14lIQcEBTYxbhUwTKcdU42yF8KSJl3yF2U4XukKGJY="
	},
	{
		"path": "assets/OtherUserProfileCard-kedqd0oe.js",
		"integrity": "sha256-5f0u30GnJl00rY7Ubho4HREuul2ZRCpnIHf6JqBGrvo="
	},
	{
		"path": "assets/PCGAFDService-hirc7sx0.js",
		"integrity": "sha256-K+p6pVSjva+XjuR1SXWHEqguGMLCW3ogT/xZTe5KXos="
	},
	{
		"path": "assets/PairError-inqdjuzz.js",
		"integrity": "sha256-wByo+BJepZwkFqTqWqg1u5E5xRKMQldVldw3oD240oU="
	},
	{
		"path": "assets/PairScreen-d0aiqzz4.js",
		"integrity": "sha256-jYOpV9iTVC3RXU7UrJG6jJOtBW30441k+VhDRaq+F8Q="
	},
	{
		"path": "assets/PairingHome-k2188hts.js",
		"integrity": "sha256-xySXNOYsUoRzg+nWjXzEEvIGLu2gq4lmoNdAbIe1T2M="
	},
	{
		"path": "assets/PairingPage-eizv68t7.js",
		"integrity": "sha256-UzS9F2YpyfrPJFoYqoX2p9Cn9+9n24YHLV+HkXwFhDw="
	},
	{
		"path": "assets/PartnerBenefitsChannel-kz057lbt.js",
		"integrity": "sha256-fWtWU2U8pS3bzJ8aN1asPY+zYr7MFrlyX/F6IUL6h8o="
	},
	{
		"path": "assets/PartyBlockedDialog-kv7hab93.js",
		"integrity": "sha256-obbMWQm+wDlkEuzsLJzfNmdluOApaB9f3sreiy9Lo58="
	},
	{
		"path": "assets/PartyChatUnavailablePage-c0q0octe.js",
		"integrity": "sha256-dTPb866Y5+GvpdgSPzYpp1Adtm1kgGyyP568doaJ+1U="
	},
	{
		"path": "assets/PartyInvitePreviewPage-dnscyux2.js",
		"integrity": "sha256-p1CDtP73NoLP/hodSvJ6vR9RTT1SazL4UxIuRCT3p8w="
	},
	{
		"path": "assets/PartyJoinPreviewPage-hk0pe4kh.js",
		"integrity": "sha256-pEzWB0ZgW0bo3F9gLh0PvMDWJEDIdH9D3JeNQsBnNI8="
	},
	{
		"path": "assets/PartyJoinability-vgai6vn6.js",
		"integrity": "sha256-qo9NddTnIhVi+wOXDO3rEnso6u3XPAnSN8rHlO4j9Tc="
	},
	{
		"path": "assets/PasTimingsAdapter-mkfnvqh4.js",
		"integrity": "sha256-x73evwjANftQm2UXgys3M3v/X7IvKkO9sR2AqL75N7M="
	},
	{
		"path": "assets/PaymentInstrumentShell-ddd4dle6.js",
		"integrity": "sha256-2R3/MOw/PPBoCleIXL4KLLnKBE7CKYEWsh2OIR3KtC8="
	},
	{
		"path": "assets/PendingFriendRequestType-o03at4sn.js",
		"integrity": "sha256-+Qz3CrL8J6CEylc18mUOxdZvUedvXIigi/HMTaMY3Kw="
	},
	{
		"path": "assets/PendingPlayRequest-f5dr1c5p.js",
		"integrity": "sha256-Jor/ewFrkZr+VksyteBIUyHOifrEdV9HjBKSMUbzSJc="
	},
	{
		"path": "assets/PeopleLandingPage-iw74j317.js",
		"integrity": "sha256-x7xp1ZknKS/EiVMUg5pcj0kQUZphBUyz3/wQI9uwWFk="
	},
	{
		"path": "assets/PeopleLandingPage-o54h3ven.js",
		"integrity": "sha256-mdjsfu7106rHfn9XKeI31OAg7grE96jMxBtG0eGhT9o="
	},
	{
		"path": "assets/PeoplePickerList-osg9oky5.js",
		"integrity": "sha256-7UEe8MEzA9tNta528VszI8SYsLPugt/NPij2nNeFyKc="
	},
	{
		"path": "assets/PeopleSearchBar-kxq63xh0.js",
		"integrity": "sha256-AKe0emOGR5rurYkJo8eEkp5ukt1iAXLKzIzxDK2yMhc="
	},
	{
		"path": "assets/PeopleSearchView-da688a6s.js",
		"integrity": "sha256-5IFQOG5b17QujfPTdI2fSKXLvO8WAtXt2hGVPNXLZCY="
	},
	{
		"path": "assets/PerfBridgeAdapter-l826x3b9.js",
		"integrity": "sha256-IJjxO6kZs1uUQ3ga1lb0Oorw7k06qaiHT0UdCcvKyV0="
	},
	{
		"path": "assets/PerfTestComponentRunnerRoute-dghsowi4.js",
		"integrity": "sha256-6mTn0X2FclNQ/Zkk1Ws9hCogu0YgFc66zKq2NHLumME="
	},
	{
		"path": "assets/PerfTestGameTilesRoute-hdlkxqub.js",
		"integrity": "sha256-2oBt+AE27R4sR5xZMv2nfVkefcHefLNgJSYGH7vfwHU="
	},
	{
		"path": "assets/PerfTestRoute-6eta2vkh.js",
		"integrity": "sha256-rkVPDg3a8NmHlYm7sk7puCo3hhIbf3POG1jpE2f1W2k="
	},
	{
		"path": "assets/PerformanceMeasurementLayout-fc4je6pn.js",
		"integrity": "sha256-48PRD4wON6bzFxfVehAh0ftcj0q23NTrVwgH67CdtV4="
	},
	{
		"path": "assets/PersistentFocusGroup-jmvvmp4f.js",
		"integrity": "sha256-5WL+kyoasao+yC8sc2VzV8dyfjVTHuEtoY7NrrHAU94="
	},
	{
		"path": "assets/PlatformCapabilitiesBody-niw9bzyg.js",
		"integrity": "sha256-6D0tiMk/PlMJ9ktsHZ1BEcRka2LNqqzLMe5yOrcviyM="
	},
	{
		"path": "assets/PlayFabService-omhn2tc1.js",
		"integrity": "sha256-NHl7eVSRKOloGpkaucHS3PeRQNaVW4AIxAJRHRa0Ar4="
	},
	{
		"path": "assets/PlayService-fdm2hcvl.js",
		"integrity": "sha256-yUNl5NaYZmqV3I6cw3zGUQVFEcdkQe+kUYDied+u0uE="
	},
	{
		"path": "assets/PlayVideo-dne2w0h4.js",
		"integrity": "sha256-gx85bCyq/GPTJUAhlsNXFGpiWpTYVGUXsltc0W4nHps="
	},
	{
		"path": "assets/PlayableOnCapabilitiesDialog-gpymv2o2.js",
		"integrity": "sha256-78xZkTIh4thj/nogt0mX4m04rEncJ2seqHijlqdOzC0="
	},
	{
		"path": "assets/PointerHandSolid-bphwg8iy.svg",
		"integrity": "sha256-LBLFwQJrNYv97LkK3yon/QcKjkBX8ZlWIlBMwgZdnyk="
	},
	{
		"path": "assets/PostStreamFeedbackState-ma1gb6gy.js",
		"integrity": "sha256-LVMJlK0ATbWROgVPhKx5F5r8F+kIT8u2mUgbwZMZfwQ="
	},
	{
		"path": "assets/PostStreamUpsell-frbpu6bq.js",
		"integrity": "sha256-EATNySVWmDv0fGNsSd4D/KGT4F4/9r48dTeqG4jdKCg="
	},
	{
		"path": "assets/PreviewHeader-lc7w9ftr.js",
		"integrity": "sha256-qIEh3ShVA9M3j+8Py1tNDQJbPPxv3SB7al38HbWGLdY="
	},
	{
		"path": "assets/PreviewWelcomeComponent-hedpdd7p.js",
		"integrity": "sha256-XaCYyh3ZvQe9YPaXRMHscy3QNVgQ70qEv8ukJy17BBc="
	},
	{
		"path": "assets/PrimaryButton-ffeqtfzf.js",
		"integrity": "sha256-ya8Ys923uNhVZRVJxRBLgMQQU7xwlg9rr7d9m4bklyU="
	},
	{
		"path": "assets/ProductDetailPage-e885m6l9.js",
		"integrity": "sha256-miymPrJ3m+qVRIwH99UXTao+6YD9zJxADt8VdhO/Mr0="
	},
	{
		"path": "assets/ProductDetailRoute-exhnrmzq.js",
		"integrity": "sha256-9KhwkjPNBekbENhFwz1fKx8IgFpWtbxTTDaTMcIKBuE="
	},
	{
		"path": "assets/ProductPrice-ie9uuxwu.js",
		"integrity": "sha256-g+MPcJoGIU2DjwM9IO5W1f8dumiIcqqYSRhKqylIdjk="
	},
	{
		"path": "assets/ProfileCard-hlvujc6r.js",
		"integrity": "sha256-GZL0E705kmLIQ7NPAq/5AlYufkwemE9w81Z6hXH6AzE="
	},
	{
		"path": "assets/ProfileCardLoading-k9ac00on.js",
		"integrity": "sha256-z8GCb8gjDJkfJb9cG+XVJWyCWasTALVjzVsLAv6Z9tM="
	},
	{
		"path": "assets/ProfileLandingPage-jr52qiqc.js",
		"integrity": "sha256-nCfa/5qflsXauY6QiyI1/fMJeKPgNHKJ3aK/Ki7aA3c="
	},
	{
		"path": "assets/ProfileLandingPage-o7u4y1x1.js",
		"integrity": "sha256-B/ZfFsz6OHa4PLWaYQSNXKqAiaUrl6uDE+mXrpRt8rE="
	},
	{
		"path": "assets/ProfileOnboardingDialog-nfo2i5y8.js",
		"integrity": "sha256-tpNFefv/HuZkdGKU6goNGWJw0cSuhoDJsbHinTQa9hg="
	},
	{
		"path": "assets/ProviderFilterTags-noqrqnsh.js",
		"integrity": "sha256-RJ7uW0z5qZuQZ9893muT6IVrUJQx7Lh9skkg4Fg0n+A="
	},
	{
		"path": "assets/PurchaseDialog-fpui7yuh.js",
		"integrity": "sha256-Q9FkHzgIesIHqfSIxJV4GrWEjELLt4Ti+hmO1n8O3k0="
	},
	{
		"path": "assets/PurchaseNotAvailableDialog-bapt518a.js",
		"integrity": "sha256-fBOJZnIbZtktrScgCVr/YlIV7t5xwaIZ6aPWSBkrqwQ="
	},
	{
		"path": "assets/Purchased-f0rzvlug.js",
		"integrity": "sha256-7JkTCxiQuGBGU37yBsmzWdSWb9oX9N5C5cHf/OstwDQ="
	},
	{
		"path": "assets/PureContentPromotionL2-oqggaukp.js",
		"integrity": "sha256-W8I/yurZnQ+pTGJ1z3kYVa6DWKx5+q3eBcTt7MGbsgE="
	},
	{
		"path": "assets/PureInStreamConfirmationDialog-k0il2d8x.js",
		"integrity": "sha256-5AGMHFbeCHXRaetoHJz19nOzTw/UaBCofYZhJtvktok="
	},
	{
		"path": "assets/PureInStreamConfirmationDialog.styles-deafeydi.js",
		"integrity": "sha256-E9iTEKrYloOb5LirzCqj7iDTwSuX66RmyhYGZto6XQc="
	},
	{
		"path": "assets/PwaPromptDialog-yienvrhv.js",
		"integrity": "sha256-JanM0AeebQrMwMd6hZBky5Q3v4vnAzkhrkb2ZQcwiJo="
	},
	{
		"path": "assets/QRCodeDialog-ea8zc5mb.js",
		"integrity": "sha256-O2GAXEqXu/bJzflA8++4vxaVjSu3xqSCQal2axWitCo="
	},
	{
		"path": "assets/QueuedState-lqa2scrl.js",
		"integrity": "sha256-JUaL8FC6dPL+hoLB/8J0iZqzj1Aw67kvFt0q8y3AYbo="
	},
	{
		"path": "assets/RareIntro-idpjko0s.mp3",
		"integrity": "sha256-8tWW90/ayXAd9mJ9FPQzeXtT7u02u8rCA0g6QMIxIAI="
	},
	{
		"path": "assets/RareOutro-d4vjsgx4.mp3",
		"integrity": "sha256-ajffp451jAr20MbiwbuALWAUk1xhXKA4jlnpjtPSWwc="
	},
	{
		"path": "assets/RecentAchievementsPage-cle12yd1.js",
		"integrity": "sha256-BupRx+CCrxd035uAexnowMII7WtqR4RRRyp/bxdQHmw="
	},
	{
		"path": "assets/RecentFollowersPage-gtbktdx4.js",
		"integrity": "sha256-6t5l77elEFsrCSAGD1O7HhANr6cgL4kjoczmuZvanyc="
	},
	{
		"path": "assets/RecentFriendsPage-nfqjr9ye.js",
		"integrity": "sha256-idrPMFGN+/CIBptoB3AVtxusnzsjXIt060CMF/iF4Q0="
	},
	{
		"path": "assets/RecentUsersList-exk15hoj.js",
		"integrity": "sha256-gnIqaJAlPTjiHrmaWwslPLgRRrcqMkQ+z9nHvLtaan8="
	},
	{
		"path": "assets/RecentlyPlayedWith-mtmskra5.js",
		"integrity": "sha256-NetDadHyEDp0dEsvw9/i0EWJGZvlrV1h+SebHF3YGFU="
	},
	{
		"path": "assets/Recents-iof26c72.js",
		"integrity": "sha256-h+uHYd11GLsl7TkHl7kE1zKhlBCcVav+IxIt5of2Yx8="
	},
	{
		"path": "assets/RecentsList-e5iuywfy.js",
		"integrity": "sha256-xV97nZnEGBMq1pc+UNKDqr3KtFX1povzm71cThSE268="
	},
	{
		"path": "assets/RecentsPage-bv9lkiiv.js",
		"integrity": "sha256-LIsnpXx/QVQv/qK/Z5jFFht5jlDuGNA7qbr0BmQpRKc="
	},
	{
		"path": "assets/ReconnectDialog-k2zrp9yr.js",
		"integrity": "sha256-EjGOPhMT+vQ0cnOgbDXpPN7hQNFg1GBOEI5CQHe5zUw="
	},
	{
		"path": "assets/RedeemDialog-dgopqljq.js",
		"integrity": "sha256-Ii1nC6NVi5EtYNpGXCB8tSH/JODUcnAZRHjyXPtoaRw="
	},
	{
		"path": "assets/RedeemGiftCardConfirmation-iqivi4i1.js",
		"integrity": "sha256-cZH9kIHyJIMaoVTj/jt55GzukU1pLE3+0onE8yx9jb8="
	},
	{
		"path": "assets/RedeemHost-h6yfzbd7.js",
		"integrity": "sha256-3yK4kxlU184YBP9sD6uA9o5cHxu3ADZ1qYjjX0YAjv0="
	},
	{
		"path": "assets/RelationshipTag-ko7byhn3.js",
		"integrity": "sha256-v9Du1GSj7mpAOOm7cCSEGpzTnDKAd8+8/SikKpUc2qc="
	},
	{
		"path": "assets/RemotePlay-ve1nw6so.js",
		"integrity": "sha256-D+UzoLtCEP6gA9G3oizaoyK8ev6jUDUwj/UIOBK92PY="
	},
	{
		"path": "assets/RemotePlayGateLayout-lupstzrd.js",
		"integrity": "sha256-/fKV9+MUZazjpNJZ6LbBPd+LqX2ecSNucZjp3Uw0270="
	},
	{
		"path": "assets/RemotePlayLeavePartyDialog-ow34drjy.js",
		"integrity": "sha256-eQgON0gSvXpiRkOHu1eYFvVROLIy2tqT/6EO7W63WbM="
	},
	{
		"path": "assets/RemotePlayRoute-lz3s8g8e.js",
		"integrity": "sha256-PpROsXKFnRKkOaervYj8yGhKpqcKbx5T/PALRQedb3g="
	},
	{
		"path": "assets/RemotePlayStreamRoute-lzzupzwi.js",
		"integrity": "sha256-TtrbBg0MRXttQoiLpapspFtqhhce9Gn5dTkq+Vs2Ti8="
	},
	{
		"path": "assets/RemotePlayWarningDialog-otgz723m.js",
		"integrity": "sha256-TIncVy7+ex0eyajGQQiFnB+N/WFuBjibVzQCMQZigUs="
	},
	{
		"path": "assets/RemotedPeoplePickerPage-h7kmjplw.js",
		"integrity": "sha256-ngqChxsDlZiJwxlzVZaH502Rz1ozA9L57A35eL3Ea70="
	},
	{
		"path": "assets/RemoveConsoleDialog-ee1miex0.js",
		"integrity": "sha256-bCS0zQN73+Xqlf0TXGMVjX7CkY7RId4uOZOJXai9K+Y="
	},
	{
		"path": "assets/RenameConsoleDialog-lisu78rf.js",
		"integrity": "sha256-nvIqnks0rYw2B+hZAL+A2IMLTrU7bIPufSZxmQnY8jk="
	},
	{
		"path": "assets/RenewIntoDialog-ntggd61n.js",
		"integrity": "sha256-3BzWO1AqrQhIvzueHnFh3BcZBuMifynuSCIJ0TLe7V8="
	},
	{
		"path": "assets/ReportDialog-hoasacg0.js",
		"integrity": "sha256-8xKS3ghBNAjG0ZlR++WSSsEL+mAjBrjqU8VDMPHG0TQ="
	},
	{
		"path": "assets/ReportProductDialog-lpsc5k18.js",
		"integrity": "sha256-t89oDwKKqD4uSb7/ILNR5KnzxkWJg3zYWz4LhJgZzXY="
	},
	{
		"path": "assets/RequireUserGestureDialog-fihu624y.js",
		"integrity": "sha256-2+k2lPdBeqFB8WsC9HSyvkSzmRH/Ng5RDPzPOr/IL0w="
	},
	{
		"path": "assets/ResizingSlider-515c52vu.js",
		"integrity": "sha256-yNEjCWsw8lwNK+i9Ld+NYFzyFFUfXVhs/xXdOAv87hM="
	},
	{
		"path": "assets/ReturnButton-dlt0z7ig.js",
		"integrity": "sha256-pExMuNr6en3Wphd2mrnf8cwHSOt2NnNB6IxCM8IGeNw="
	},
	{
		"path": "assets/RiskChallenge-itrzg1ez.js",
		"integrity": "sha256-oeMhHI58OvmIRsqSPiQbbpgg4hr8NumFo29Go1HA7N8="
	},
	{
		"path": "assets/RiskChallenge-jk6ooxu5.js",
		"integrity": "sha256-3pWTi1inBDGPE3U0l7G+x3v3N+munzY9pJWqKHHr2VM="
	},
	{
		"path": "assets/RuntimeDevToolsProvider.devtool-yovf1vmp.js",
		"integrity": "sha256-4Xh+99dI1eubNT8nS2R/VLQTRm49zPE+RVxoSQNG0uo="
	},
	{
		"path": "assets/SafetyAndPrivacyTab-j90xz0e5.js",
		"integrity": "sha256-SexFte8QGYXmJv/fKS0QYEG5ZSYz7NYEMmYY6ooZ8zs="
	},
	{
		"path": "assets/SearchPage-c440x9uf.js",
		"integrity": "sha256-g7pp9L5IBL7i1S/CdG64y3M8jkKSjpng3b6jLCri480="
	},
	{
		"path": "assets/SearchRoute-hsr54db6.js",
		"integrity": "sha256-pBbKcgdTNvd085M9psX9uja+J6X6DjSCqxORLkHn5fU="
	},
	{
		"path": "assets/SecondaryButton-d2ldxq5i.js",
		"integrity": "sha256-D4+WZVKlNV5MbZR8goPj6879/r9JyDq7u7Teny7jzvs="
	},
	{
		"path": "assets/Section-bmjy0l2a.js",
		"integrity": "sha256-EEkxjU22beVX7tJyrEgr8xnwWyclgdd42qlJioxJLwY="
	},
	{
		"path": "assets/Segoe-Sans-Variable-2-021-jokom3al.woff2",
		"integrity": "sha256-PERwuNnV2eLnCTGEyn/eRGamJsoPuONMzL1fQ4Go0JE="
	},
	{
		"path": "assets/SentryAdapter.client-h5hjrw7o.js",
		"integrity": "sha256-VJi6M845WbzbHlB3s101XDa0rd0ae0cBJXZTW5vqHH8="
	},
	{
		"path": "assets/ServerInfo-ki93py3b.js",
		"integrity": "sha256-JxP86Mhc++pPDf9shgsY05F8IeZfHmZVIQLXeO6RixA="
	},
	{
		"path": "assets/Settings-h41tz7fs.js",
		"integrity": "sha256-ELeS31BUwBnmb7Mz5LvHO6fPYmAjrm3vgysWExTyHWU="
	},
	{
		"path": "assets/SettingsDialog-0l6new0i.js",
		"integrity": "sha256-/z+xUZ6RJa4hKxITIYKaTUBREsbR8Jlu08xn4/PKA4k="
	},
	{
		"path": "assets/ShareALinkPage-ljjz0z7s.js",
		"integrity": "sha256-5hvWp9WtdYM+KPTYZnWqH5+NQoNjwJOsg/5scfHZDQU="
	},
	{
		"path": "assets/Shell-gd3o10n0.js",
		"integrity": "sha256-GABAnmrdqi4JGSTjOt3J+l8qboRaFDjfMzUWN2k8A90="
	},
	{
		"path": "assets/ShellLayout-k90jmd5x.js",
		"integrity": "sha256-ns7PmJ5j2tyUZoHKQNUQtghY6Byf4w8UdAmcWBFsOBg="
	},
	{
		"path": "assets/ShowApplicationDialog-ngasykrt.js",
		"integrity": "sha256-mag01F04quEuQVPwX2I5jlmb7Y2YOk3oWwz24p9BuAE="
	},
	{
		"path": "assets/SignIn-mly6fu3i.js",
		"integrity": "sha256-RAXSBo3/YTWVme0VmzUgspMUCVDi4ls4/2aH5Qz8a84="
	},
	{
		"path": "assets/SignInRequiredDialog-eqtvooqk.js",
		"integrity": "sha256-PcC0Ze53ByKtU1TElJv2ehDyn1zv829bFSXqvSxpGfI="
	},
	{
		"path": "assets/SkipOver-jqm71f5d.js",
		"integrity": "sha256-/0t6cgnwBfHWnDHnznhlyIrQY3YTxmftcVw5pRnYRDU="
	},
	{
		"path": "assets/SocialSection-ju7izvcn.js",
		"integrity": "sha256-ieYQcyoZee7zNsRTQtc36dmIu57fQ19p+InA+BoM8jE="
	},
	{
		"path": "assets/SortByTagDropdown-hwoix5oa.js",
		"integrity": "sha256-TQXyS2YyE7zn2HDYvWDqtVPD9mEFPF6pp4wnngvP1WU="
	},
	{
		"path": "assets/Spinner-bhkd19qw.js",
		"integrity": "sha256-ZvD0CQd/qKxIO9K7LhwnxHpnmDvgQgagfu+nC+zsS9c="
	},
	{
		"path": "assets/SplitActionMenu-eplkkqbc.js",
		"integrity": "sha256-s7ZqNDnUnb4Hl0NxYatL1pSYvhPZnduD2K/6vakszZs="
	},
	{
		"path": "assets/Standard-lv501k87.mp3",
		"integrity": "sha256-42R5YWxdVz0KiBBBJZ3N1NJWpf+rwFEnnMuPS/8jJak="
	},
	{
		"path": "assets/StorageTesterRoute-knlonuoq.js",
		"integrity": "sha256-ILAIcNNL7+2OM1U+PL67Bwpq73lf7btC17xdiJnRNxU="
	},
	{
		"path": "assets/StoreGateLayout-0asu90on.js",
		"integrity": "sha256-XESM8Ru9fguJeY3/eEOY2zm3+kKuHKWXmI/3fnalFQ0="
	},
	{
		"path": "assets/StorePage-c8vzdiki.js",
		"integrity": "sha256-cfGe2DMQlISmN0ENy4ttnZpgoGMN2Fcslh3gQGv2ccQ="
	},
	{
		"path": "assets/StoreRoute-df8kcgme.js",
		"integrity": "sha256-7+Jv73cB9he6JrD1E3bvw1XYxi7u6iV5LkXlGTOHuxY="
	},
	{
		"path": "assets/StreamClient-d3udq5fz.js",
		"integrity": "sha256-agPHU+qI5v9iALyib/2MSCCoQKdYIytUBI2z5AMvkRs="
	},
	{
		"path": "assets/StreamGateDialog-pcriiigd.js",
		"integrity": "sha256-fdAZcoqw35GiyoVi4k3t+289UhKMKf5F27sHfQKOix0="
	},
	{
		"path": "assets/StreamIsReadyDialog-mh7l9a8w.js",
		"integrity": "sha256-sBOq1wMExKiR+BMnS9feF1ptVMawl5Nd75qG6C1X+9o="
	},
	{
		"path": "assets/StreamSessionConfiguration-exfmxbr7.js",
		"integrity": "sha256-BQsZYKGLNsZ4g3xnYlh/6Mk+KrnCogIHZnp/OmcLXlc="
	},
	{
		"path": "assets/StreamSessionRequest-b1lr9edg.js",
		"integrity": "sha256-jvuKdXQUq+5qy/U2vTCYWwqd7dhiAPAUbbfPDdU0qTU="
	},
	{
		"path": "assets/StreamingTab-epk6zueh.js",
		"integrity": "sha256-2f4/c3Ww155Bh/80AsPFXux4x4uEwZaRlHbx3NMjqog="
	},
	{
		"path": "assets/StyledBaseListItem-ncir5bqg.js",
		"integrity": "sha256-nIbBjGDLBpfOh/GKKQ/3srP6sz84Gw+MRwATbJBTR1A="
	},
	{
		"path": "assets/StyledListItem-kapwul78.js",
		"integrity": "sha256-wN9WBU17Z5ilU8UKekGtcAJdaTT0N7WDGTg3VfQx3+0="
	},
	{
		"path": "assets/Styles-l5eym0go.js",
		"integrity": "sha256-xA3H8YB36AWDncTLVlMsO1Ye0mykqsIjqaBbiOPaWV0="
	},
	{
		"path": "assets/SubscriptionPlanPickerDialog-knivr0qc.js",
		"integrity": "sha256-WdQ/4lb3HEM7RX8NGF7L/kJfA6tbUPRFdD+D90qckHA="
	},
	{
		"path": "assets/SubscriptionPlanPickerHeader-ep0g5ais.js",
		"integrity": "sha256-Vwxo2wzKueZ1asa8zGpYxVDJecbc/+1QsKpHrbd2Luo="
	},
	{
		"path": "assets/SubscriptionUpgrade-bx2icbg8.js",
		"integrity": "sha256-HlT0gcZq8OvPdmDg6XhmDc2O3awSBedP82zERLOzes0="
	},
	{
		"path": "assets/SuccessfulChangeGamertag-h4en9oj3.js",
		"integrity": "sha256-xp35s5t6r50Af/Mo64mkR2UnKLKW+FUrCZV6blGIxqQ="
	},
	{
		"path": "assets/SupportedLanguagesDialog-jod33wga.js",
		"integrity": "sha256-htN2+Q2oLe9rh0V9lak3+DxQzS18ZzuUpsxPs8VJtzY="
	},
	{
		"path": "assets/Switch-kh4wjj0c.js",
		"integrity": "sha256-QPl69797Lyo4lqqWA9Z9YNOM7dFwPqYIpy/gqdjTCCg="
	},
	{
		"path": "assets/SystemRequirementsDialog-bmubc8kr.js",
		"integrity": "sha256-a4p0i5B0IScA/6oXwqhS5V+g7+ro08fls6TSQikw2Xs="
	},
	{
		"path": "assets/SystemUiMessageDialog-n9tvpsqd.js",
		"integrity": "sha256-GvKPOYfxO0MbY1k/pBzGz25gaKehvJ3QMKjgKRxvLAo="
	},
	{
		"path": "assets/SystemUiVirtualKeyboardDialog-dhobtc0u.js",
		"integrity": "sha256-pFvrkKIq6yGgNkK78OByFpDEHxPDbAo1Z8SpWr/A0Q8="
	},
	{
		"path": "assets/TAK_INTERNAL_ICONS_SPRITESHEET.@1.0x-dt9z9ibh.js",
		"integrity": "sha256-/4A2pDvYw2CcF12zEUocgKMKfUA06upzIZZteSa9MfI="
	},
	{
		"path": "assets/TAK_INTERNAL_ICONS_SPRITESHEET.@1.5x-nc4yn0j8.js",
		"integrity": "sha256-uMkxnsFPHd0lR1M2PiFtHcy//S/j6MC/kH2L2ZYdqlE="
	},
	{
		"path": "assets/TAK_INTERNAL_ICONS_SPRITESHEET.@2.0x-dpkue3g7.js",
		"integrity": "sha256-ZTPKQl/93J+paZOajcm/laLN39LcWNgRxJ35NMI87Q4="
	},
	{
		"path": "assets/TAK_INTERNAL_ICONS_SPRITESHEET.@3.0x-dpfkwrag.js",
		"integrity": "sha256-5XWasJPOJoJ/NgMjMAx57iUJDvhZkycc7arrnbZ1+58="
	},
	{
		"path": "assets/TAK_INTERNAL_ICONS_SPRITESHEET.@4.0x-j61sjt7j.js",
		"integrity": "sha256-ulIl7kawZsx5LADkSFKBIuo8OxPIubpxCOC34RTZxlA="
	},
	{
		"path": "assets/TabContentLayout-c956lcpz.js",
		"integrity": "sha256-VricRl8ASmxERmVnE79398FQQ74uKsArrwbGsGtbuBA="
	},
	{
		"path": "assets/TagDropdown-ja19iptp.js",
		"integrity": "sha256-pXstZ505EVTyYp/45F/gCBD5al24MUBmeDdYyQZLA3k="
	},
	{
		"path": "assets/TagListDialog-d82a2s73.js",
		"integrity": "sha256-Yi49F1KovlQVlOmFTM8jdTBXZnJvfWwmatvDZQXvf6g="
	},
	{
		"path": "assets/TakEditErgoDialog-b4xug86o.js",
		"integrity": "sha256-K10X+UMxtnMdkPJIuPSElCJM0UZDApi6j9r8tcrg0Gw="
	},
	{
		"path": "assets/TakSideloadManager-gvk1j3nv.js",
		"integrity": "sha256-/GtsqyVijd2qbfBKEa2tt+cD+kHeprtnrT4pmF8G1xs="
	},
	{
		"path": "assets/TakTooSmallDialog-i926wjpi.js",
		"integrity": "sha256-i6GkCNnKQHzXLww8VWUTPVihPNMJoXdfmcYhDYDmlUU="
	},
	{
		"path": "assets/ThemeSelectionButton-dnqm506c.js",
		"integrity": "sha256-+g7oeLv6HdxX4pYI9feK1y+kBixrVfz9/+TQidD05Xw="
	},
	{
		"path": "assets/ThirdPartyGridItems-e0nejys7.js",
		"integrity": "sha256-S5yzPmD37fY2X7fg5ZNLtgaWyqCA7SumrPbr22YaJ88="
	},
	{
		"path": "assets/ThirdPartyRecentTile-frt9w21m.js",
		"integrity": "sha256-e0ovZzU+sa7ALXbDWyx54JfCorXlpFkZFTAWL9nZ4ho="
	},
	{
		"path": "assets/TitleActivationDialog-ka191b45.js",
		"integrity": "sha256-n3BEqGcHhgbJOJkvtvBf4FVUIUQ9tb3f6SW9XcBdrfc="
	},
	{
		"path": "assets/TitleInfo-jf2yvbze.js",
		"integrity": "sha256-nZorP8FMFrRP0PyKWe5CsYEin+OcQZUrAe9ceRIn6hs="
	},
	{
		"path": "assets/TitleRecordsService-j6dazyjf.js",
		"integrity": "sha256-koes56Hf9M0PLaGErXGR3I6KpftirdFUGP04Xh0Gmrc="
	},
	{
		"path": "assets/TrialTimeManager-elk2qaav.js",
		"integrity": "sha256-xav55Xq2gTk8kY9DpA5cgpiQZS5ytoVxKEpx8T9jc/Q="
	},
	{
		"path": "assets/TrialsEndedDialog-jq2hlwk0.js",
		"integrity": "sha256-+Bl4oytqasrmEF/kt+vvyGnjzA/Hd9OeYP7XT5iuzKI="
	},
	{
		"path": "assets/Trophy-b2ttm8em.js",
		"integrity": "sha256-qd32HFc8XKffYuhY3I9yBLnqFQCwfBfJj1qVWQTC3mw="
	},
	{
		"path": "assets/TurnPhone-c541r917.js",
		"integrity": "sha256-CbiuIu71EFyT2rH/KaT47LzsHND9GnTFbh0Qo9Z2Nes="
	},
	{
		"path": "assets/URI-f8ryawpl.js",
		"integrity": "sha256-wxiJypLa7L13sp4Uh/2JHckS8hc+tj+fy/24PMCRaZY="
	},
	{
		"path": "assets/UltimateGradient-gv763uy2.js",
		"integrity": "sha256-oH+VzEqnKbSTS2PQD+2GllSyb7eu+iLj6YC2TK3zOoM="
	},
	{
		"path": "assets/Unauthenticated-e5yzuzds.js",
		"integrity": "sha256-VGC0hv4SSdCJrkF3opdC8huZZRVafgs3lVRsB4j5tJg="
	},
	{
		"path": "assets/UnderConstruction-nq5zlxj2.js",
		"integrity": "sha256-jVuwotRs3mer5QeT8MG8dMvG63CkennoQFGkXHvnc2M="
	},
	{
		"path": "assets/Unlock-jjththfo.js",
		"integrity": "sha256-Ea33j2DypnHHqMKfCjZ4JzN3r1khaaoujibeGZiSyV0="
	},
	{
		"path": "assets/UpgradeAccountUpsellPage-ic1stpkz.js",
		"integrity": "sha256-kvfbtQnJ5Es+tepTwjub5x2tz2Zs2adGJuRzP/Lf6bI="
	},
	{
		"path": "assets/UpsellBackgroundImage-g7tl5l2r.js",
		"integrity": "sha256-mxcLWCHnd8k4A2NjVH4PRqbClmtAi8kTaO6WjR/tTJ4="
	},
	{
		"path": "assets/UserPresenceDropdown-j9amuap0.js",
		"integrity": "sha256-ZVSGFA4i5EjNXNs77GK2WMym44RPvNyYBacqSB4DwW0="
	},
	{
		"path": "assets/UserPresenceService-bonl70o3.js",
		"integrity": "sha256-IJccYTC1gvu5s9/RZURbUSTEcGcbQUCMWOmGVq8d73M="
	},
	{
		"path": "assets/UserProfilePageUnauthenticated-feoyjza1.js",
		"integrity": "sha256-B9ygVD7hghx3gwfkPv6ohvRCKhwvHLUem2rp+zfTa+c="
	},
	{
		"path": "assets/UserProfileRoute-vuo0984c.js",
		"integrity": "sha256-VVsThc/QRbg4XUgDt4lNvNHFnx4Biv8HluL6BQ2H9EA="
	},
	{
		"path": "assets/UserRelationshipsDialog-c4nskmte.js",
		"integrity": "sha256-GclhzVx9uzKH5NJpdTh742g9b4zY6SKpcE4UNAc9YeI="
	},
	{
		"path": "assets/VLTTJS3N-pe1seubt.js",
		"integrity": "sha256-Tivizn+TBSADFCqpw6MrlNQzh2+wEBa8hM5IxQwFx7k="
	},
	{
		"path": "assets/VideoPlayer-nj6fu1yt.js",
		"integrity": "sha256-6hXeTcc/K5UgmTn8MVHkwrLG9mMxO+e+Wk9I5xJ8CwQ="
	},
	{
		"path": "assets/VirtualGrid-cjvc90rt.js",
		"integrity": "sha256-K+FJJqiDTRsqie06wS13X/irYoRteCwCYAB6zbnjUoM="
	},
	{
		"path": "assets/VirtualGridCore-jyuwjfh8.js",
		"integrity": "sha256-NmJAljzKbTg8fKBGKlfJqUhhEsHM8mgMRMZQhLwTVns="
	},
	{
		"path": "assets/VirtualMouseModeChangedEvent-f3exu8fa.js",
		"integrity": "sha256-QbaFZlamW+aMRTJWm1g4LJUtkn6hObgpqRZeNEwm8no="
	},
	{
		"path": "assets/WebRtcStreamV1-hgg24ijq.js",
		"integrity": "sha256-NApsQXzputLJW5qtvhVu71TTNmtiIFeuLo0DH8Ujg3c="
	},
	{
		"path": "assets/WelcomeRoute-k4rapesl.js",
		"integrity": "sha256-GNFSCB+VjX1Dl9W4Nbq6lTGGaoz4lDhyPmBnZEEPCTQ="
	},
	{
		"path": "assets/WidgetInteractable-mzv6xcil.js",
		"integrity": "sha256-FlKqwlIgrKJg4/qt1N3qtRb+o5rF3cm8IyQbxLlHKyE="
	},
	{
		"path": "assets/WidgetNavigationHostProvider-j82lfshf.js",
		"integrity": "sha256-HmjKrCX+/G1Yq806pFjEslrzSiFqvjJUWxf+kHjdvbg="
	},
	{
		"path": "assets/Wifi-k6s1rp8y.js",
		"integrity": "sha256-lQhbNURLzXg8ib8avErE2QpF37Pm5p24L1p9dfxyL50="
	},
	{
		"path": "assets/XbcRedirectRoute-ncca8qcz.js",
		"integrity": "sha256-0GsuQ+8JzrdkFovieEBo4FxoEJvKELSAy9U9OhucHJk="
	},
	{
		"path": "assets/XboxOne-kv8l2xyr.png",
		"integrity": "sha256-+UPR+T04WuDMG5vG09NHFMXB772M00RzyiLTK3ZObNU="
	},
	{
		"path": "assets/XboxOneS-hecaq60d.png",
		"integrity": "sha256-+TIekCMPBi1mr8JiOIDqa2P6dyYedkZk4mPqgCc84lM="
	},
	{
		"path": "assets/XboxOneX-bbh8uatg.png",
		"integrity": "sha256-BVdS5P56kqW7YGXI8PI/FcCTaVy0BiK3QRY9k+52hvc="
	},
	{
		"path": "assets/XboxReduxModulesAdaptor-jcr0r8g5.js",
		"integrity": "sha256-Kahi9ZLcapqQmazYFLG+f2t/UrACy5hOD8lHtFvSXj0="
	},
	{
		"path": "assets/XboxSplashScreen-k4sxyhua.mp4",
		"integrity": "sha256-YAM360y8WhnrpfZccBXBz3Q66XbI0yVE7KzkQisVF/k="
	},
	{
		"path": "assets/XgpuUpsellSection-f22b71ic.js",
		"integrity": "sha256-PBcbZjnHmCGKjWMLhS7mMeLa4hEjXVHc4SZJyq+2j7k="
	},
	{
		"path": "assets/_AchievementsPlugin-d5d34a22.js",
		"integrity": "sha256-vLt3y4iBeOu7zrAlIvOmxFqrWHqfD6tZKIz7QjrEjrY="
	},
	{
		"path": "assets/_ChatSocketPlugin-j9acdx8l.js",
		"integrity": "sha256-JGfcdLkWHkW39TuWgfifZFdAfSqGaMcpmHSmyNSd1Hw="
	},
	{
		"path": "assets/_ClubsPlugin-ej4eqrx7.js",
		"integrity": "sha256-pMv+sOEnHsmOFm812tKoyyYbOoNjxAx993LYJReEtuo="
	},
	{
		"path": "assets/_ContentBuilderPlugin-nm879ddj.js",
		"integrity": "sha256-/FSXCuqQ0Rk3RYIFHwCVxoMvH7ngnXEoRw16BOQrOao="
	},
	{
		"path": "assets/_FamilyPlugin-k2nka6o2.js",
		"integrity": "sha256-KGq96QPcXWFIJ+GDMmfCN9kKkfHlTUOszUOw/vfTlHQ="
	},
	{
		"path": "assets/_FamilySafetyPlugin-kfcwsg48.js",
		"integrity": "sha256-O66E95fQiQJTWqXxtoNq6th2PpxLPgqGcRlPE1xeAho="
	},
	{
		"path": "assets/_FeedPlugin-gil9adti.js",
		"integrity": "sha256-1xsS/VTnT7XHjQcAtCF4OQtQP+u/ibABmerXARVwzq8="
	},
	{
		"path": "assets/_FireOSApplicationLifecycleAdaptor-l2t1l7dm.js",
		"integrity": "sha256-lfUeHR0sxkVCju9U4JKypq61zXbQ2y16Xx/l7AghUQw="
	},
	{
		"path": "assets/_FireOSBluetoothAdaptor-dpqwy41z.js",
		"integrity": "sha256-v22pRWldhIhSZC9bLX4r866ai92acFCszVdHOuKbuXA="
	},
	{
		"path": "assets/_FireOSNativePlatformStorageAdaptor-i1v4g5ik.js",
		"integrity": "sha256-/Ewpk+BHp7/0hJ7OwmZXkhVRI0CBVR8dbM6Y93p45+8="
	},
	{
		"path": "assets/_FireOSOSSNoticesAdaptor-eyo06lod.js",
		"integrity": "sha256-ZnjeRifk6PteAJQp/FGW2YmdZQPYaq3dnXtWzcy/NPc="
	},
	{
		"path": "assets/_GameMediaPlugin-mz0eqwqb.js",
		"integrity": "sha256-i5gOKlPQCqBTpByPp0A8QKJIN7pojet7NxhS/pLFiWI="
	},
	{
		"path": "assets/_HomeOSApplicationLifecycleAdaptor-cb89egbf.js",
		"integrity": "sha256-3F375rGy5cYWFpRLysjikJroDSYI52D7G0TTZJpB2fw="
	},
	{
		"path": "assets/_KeplerApplicationLifecycleAdaptor-ejnpqal3.js",
		"integrity": "sha256-XJ0g6w6dkgLTsmK1P6/rsL1oBvHA0jmNZ2bjT9CkAF0="
	},
	{
		"path": "assets/_KeplerBluetoothAdaptor-cx52th3e.js",
		"integrity": "sha256-kba+yQQ6yzpr6PTWfGsFoz6HtAGSjY6DDFiD3eFfqxE="
	},
	{
		"path": "assets/_KeplerNativePlatformStorageAdaptor-il8dozk7.js",
		"integrity": "sha256-ogvFYUD00o95OtI/f19KIpQx/EcHdmGYNQYDX0P0OUw="
	},
	{
		"path": "assets/_KeplerOSSNoticesAdaptor-c5lnq5ms.js",
		"integrity": "sha256-ELRUCrP4mJm4wqbD9pwYDzmAejecJ5Ur4H5m3Gcf9tU="
	},
	{
		"path": "assets/_LinksPlugin-hapa7v3m.js",
		"integrity": "sha256-W6SKI7OFXQsCi8R6x5RNNv8oZ97v5khtpHLN71QJoS0="
	},
	{
		"path": "assets/_MessagingPlugin-jprj6v2q.js",
		"integrity": "sha256-tapapFhg/QH11bYIR/yfXm5x9P7ePMIRJXY3cFHaKVQ="
	},
	{
		"path": "assets/_NotificationInboxPlugin-hoh96eoc.js",
		"integrity": "sha256-nLLyjWBw17cFM9q+5mZVEQLuilERvV4XgnHDzAEjkxI="
	},
	{
		"path": "assets/_PartyPlugin-h36owezu.js",
		"integrity": "sha256-wRyVlhkdqJoyBUyNq7K5wg7EoWaTbBlOeE/+ZVmbDLo="
	},
	{
		"path": "assets/_PeoplePlugin-ecaxzspd.js",
		"integrity": "sha256-BaWf8AK/FDUTBMSVdIF3nZg8iHVodkYEFl6cBZiE/TQ="
	},
	{
		"path": "assets/_PrivacyPlugin-ng9c1gj4.js",
		"integrity": "sha256-IkjyHeQq9mAI/G+EELrvKh0XihHJHVNeWeZsc8j9QQg="
	},
	{
		"path": "assets/_ReportingPlugin-hqe4a2t4.js",
		"integrity": "sha256-l0eQwWojtfFw4hmVOdKqF3RWDu5SJqrc7TqSOR9T9Vg="
	},
	{
		"path": "assets/_RtaPlugin-h198l1x2.js",
		"integrity": "sha256-PV2YTgwT1jbCPDtZ4smjC/cTuH7fnfrukCw+hPy/6EM="
	},
	{
		"path": "assets/_SearchPlugin-ihf6ox9k.js",
		"integrity": "sha256-d+A9E3+k3hQdkZ/F4SQDbSJ4d7G/cyNWGI6nyhu1mR0="
	},
	{
		"path": "assets/_TitleManagerAdaptor-lcdsohby.js",
		"integrity": "sha256-u2BWyrhPNbfI1IHhqF4owd8a4b+zXa3nxjYhrPZcQUQ="
	},
	{
		"path": "assets/_TitleManagerAdaptorIndexedDbWrapper-mwxsk1st.js",
		"integrity": "sha256-YjNPCrIEndPEbHvP2U8H+tG4Uo/y6bRt+cjzBYUZjDA="
	},
	{
		"path": "assets/_TitlesPlugin-mx05ihuz.js",
		"integrity": "sha256-ykJ/wz/jDopajssyA+KEiDmQ+gHCIKYdMqtaaveJDLI="
	},
	{
		"path": "assets/_TizenApplicationLifecycleAdaptor-cq3wkup9.js",
		"integrity": "sha256-oDSG1CkD0I+RR21ysM8f2VHNAmaaRHdh3WfxXK4gf+8="
	},
	{
		"path": "assets/_TizenBackgroundServiceAdaptor-es11lu9p.js",
		"integrity": "sha256-fnDBbxOrk4+OAig39zsytIhbuqIjnIR1aU7q0Fd0mIA="
	},
	{
		"path": "assets/_TizenNativePlatformStorageAdaptor-qamcqzkx.js",
		"integrity": "sha256-w/lhqgBldmDJ25/o/mOrTlTHm6rRgvBkvj4S5tsljYM="
	},
	{
		"path": "assets/_TizenOSSNoticesAdaptor-oi9lyqn0.js",
		"integrity": "sha256-D3w3a2FE4R5gTkXdIo56Is46+KZmh+hgANexyY8MDKY="
	},
	{
		"path": "assets/_TrialTimeManagerIndexedDbWrapper-ef09e85x.js",
		"integrity": "sha256-qGbA6kR8REYx+PELX2tVBIfYE33g4rxIpqfOWgfoA+c="
	},
	{
		"path": "assets/_TrustPlugin-iatk1osu.js",
		"integrity": "sha256-wZnl9PN4+1jrDPbONMZ0yZ1K3CL7TEAAYAdrJDW4uFM="
	},
	{
		"path": "assets/_UnsupportedNativePlatformStorageAdaptor-ioxnuwap.js",
		"integrity": "sha256-IkLYPopTwkuLmY4QlXwBPDzbPeLCvIA/Pflk9gVavQ4="
	},
	{
		"path": "assets/_UnsupportedPlatformBluetoothAdaptor-irkf32a8.js",
		"integrity": "sha256-9i2nSxf+v92irW5+7llppDsgHIgais9QWGPKkKawv+w="
	},
	{
		"path": "assets/_UnsupportedPlatformOSSNoticesAdaptor-f9vz4psn.js",
		"integrity": "sha256-UVu8Tm69eYL2fwx5XhusCTrhKhSBHlaqmeSHX9SB4c4="
	},
	{
		"path": "assets/_UserPresencePlugin-ctwa1w7v.js",
		"integrity": "sha256-tRQWo6uOBWYLfJOMjNkGmAzSJzWbsj5aHzeEHH7+CiM="
	},
	{
		"path": "assets/_WebDeviceManagerAdaptor-ifsj2slu.js",
		"integrity": "sha256-3rzfjcaVi3auHd4mcNJsKxkwITa4wzSGRvZeIfHdO6g="
	},
	{
		"path": "assets/_WebFallbackNativePlatformStorageAdaptor-czemd6q7.js",
		"integrity": "sha256-phXRmvJO6X0t7reziAQzR8F6aQwAALXNPowE+qrB7j8="
	},
	{
		"path": "assets/_WebOSApplicationLifecycleAdaptor-e8wi6de9.js",
		"integrity": "sha256-fWtgFHkEKChA2a72pFqXJv09/ZYA+G7Kg0ApQsD/JjI="
	},
	{
		"path": "assets/_WebOSBluetoothAdaptor-j39v9kji.js",
		"integrity": "sha256-KJEECsKYu44uPEI/z2WFDDUIeXttKF699CKH/lYvFLE="
	},
	{
		"path": "assets/_WebOSNativePlatformStorageAdaptor-f0m88edp.js",
		"integrity": "sha256-oaWWyFAvtNVEb0OPjhWJfjM0WIVVGg4eJEKXIbgc7do="
	},
	{
		"path": "assets/_WebOSOSSNoticesAdaptor-c64s8re7.js",
		"integrity": "sha256-UZ9Z/8a9ZrRIcx4g9E7LVjqSC98d2LmpLNP1jlAPHQg="
	},
	{
		"path": "assets/_virtual_token-inspector-manifest-gx3dta5o.js",
		"integrity": "sha256-kZPJpK5hbh2bljyWfY+VEw+gJ6mvDguRto/74fr5vYE="
	},
	{
		"path": "assets/_virtual_xbox-locator-manifest-o3xjan5o.js",
		"integrity": "sha256-Rks8IB1evqyC6b5jsgDqyzxABqPaRKc1Y5c9zPh1PDg="
	},
	{
		"path": "assets/accelerators-mediz1dj.js",
		"integrity": "sha256-v3QEjXWxLbxxDg28PRlTRh+Ytjjd4maeoTnwlaylEmQ="
	},
	{
		"path": "assets/account-dark-mzevsfe4.svg",
		"integrity": "sha256-hqKjYcleE9ME61h1DgwRrUzCM3Fr8Lx4Kdgf13mje3k="
	},
	{
		"path": "assets/account-light-j0fv5hp9.svg",
		"integrity": "sha256-3M/cOWfcW4j2jnaEynnq9GnjuYIQGr5tZzhDU+n5OjA="
	},
	{
		"path": "assets/adapter_core-n4xpf8o6.js",
		"integrity": "sha256-aSPgPOmP+dNHUbuXExmQr6498QvX7zjehaSqoKMXXEw="
	},
	{
		"path": "assets/animation-data-jk9s2jas.js",
		"integrity": "sha256-gbvry0BYcUWotr6Vm+0Y+ClT2nycmfXwFx/yvqNZZs0="
	},
	{
		"path": "assets/animation-data-m0xmi7o6.js",
		"integrity": "sha256-BagT0oRAUf9Pc7QIqfhKFOCpwH0K5HtqxHqusO3B2jI="
	},
	{
		"path": "assets/app-insights-1ds-adapter-nyp4hcsn.js",
		"integrity": "sha256-PGTOHzeMVOveX3aMSyrbC9SuuncpmtCmYaADJ9KRYNs="
	},
	{
		"path": "assets/app-j3dwnli9.svg",
		"integrity": "sha256-lU3hvr5SmZeEqxbTojeCntVmmxuEjJAvD5YfUgIqD/o="
	},
	{
		"path": "assets/apple-gpu-deobfuscator-hw3322s0.js",
		"integrity": "sha256-7G9W+s4wZK4AvgZDv8TTpqsVDJYvqRbvIFhoJwN3CS4="
	},
	{
		"path": "assets/applicationManager-ogj923x7.js",
		"integrity": "sha256-SZvvWsgzRptrgNSvWruxmhwkEWJDEm9l95csM7tUenE="
	},
	{
		"path": "assets/assets-ecd2fgdi.js",
		"integrity": "sha256-dRumEgxRbIr43h/rfdpbr/2sXDYeHv31PGU6FjIDpBA="
	},
	{
		"path": "assets/auth-hooks-dkb6uyrd.js",
		"integrity": "sha256-HIHnHAymSkEcP/n/vUeTq4hG3KxDfzRepgC6cFkP0Ys="
	},
	{
		"path": "assets/background-image-nmq0yffm.js",
		"integrity": "sha256-h6stXn1xc7cz//nB7k2GYgoqGZtt7DWm7Nl0hhFkIwg="
	},
	{
		"path": "assets/baseline-experience-i0hl6740.css",
		"integrity": "sha256-LJKSMkodknOghNVQLM53/qc5KG6M926RZCzKh5Igs68="
	},
	{
		"path": "assets/blue-dvf64i8k.js",
		"integrity": "sha256-ic8mb1zIZJs4PKaUJgUhlis+s4Sk3qx6EECcj4VWO9k="
	},
	{
		"path": "assets/blue-hr5a92px.css",
		"integrity": "sha256-GuAzUDSHoRadioIJ4GvLjuyQyXqtGnvDRfYXzp4zoko="
	},
	{
		"path": "assets/bluetoothManagerPlugin-ot2xjy6g.js",
		"integrity": "sha256-LDEJwYzbbrNxJhp17VKIV9/HomqLo2rsBHJX0a6ESGs="
	},
	{
		"path": "assets/browser-l69cztay.js",
		"integrity": "sha256-q4VQ/LzUN/PQ2DvqNFuEcdfK+kjlDWb29ttAf0X/kPc="
	},
	{
		"path": "assets/browser-q024jlz1.js",
		"integrity": "sha256-iNnmwGqQX8YFkPM+sTz9++NHU/W2gdsLcfXu3psiDf4="
	},
	{
		"path": "assets/community-dark-jktpu849.svg",
		"integrity": "sha256-aANbuyTc8bqpXiLOflFzh5zia4gwcbocW5aTlvE21a8="
	},
	{
		"path": "assets/community-light-kdceaeah.svg",
		"integrity": "sha256-6HX0N8PHiTv7Qu6XCxl1oVrJeG9swr2i8JL7dD39yV8="
	},
	{
		"path": "assets/connectionManager-lsl8cwtu.js",
		"integrity": "sha256-cS2/a6szuyQaR/1xjlDRGN5nEF7tkVCZKZJpY0yngtE="
	},
	{
		"path": "assets/constants-b87zkitl.js",
		"integrity": "sha256-9vuL/NEZH4W7MqWRQIWP4bOm2FSY1sZMX5+1oVCjlK8="
	},
	{
		"path": "assets/constants-d8otsdxx.js",
		"integrity": "sha256-8Sd6NEfpOATQTZwJ/bqlaYMWpKDj8SOPVznveIZtra4="
	},
	{
		"path": "assets/content-promotion-fre-dialog-background_1920x1080@1x-hnxriqxd.avif",
		"integrity": "sha256-/LB/zYOZBN5dO/Ew8fY9V71uVjMUpXmM/1bJdIlgB/A="
	},
	{
		"path": "assets/content-promotion-fre-dialog-background_1920x1080@1x-m52llw3d.webp",
		"integrity": "sha256-Cm5x1/0lk+bFcFrTflWJrywyruo0VdRRKc/3gOiTNRE="
	},
	{
		"path": "assets/content-promotion-fre-dialog-game-art_694x873@1x-m33tnxy9.webp",
		"integrity": "sha256-JyNJM4x3RmlgTaybvunqzi3Qe6HeArQ0yJEj9jlog0Y="
	},
	{
		"path": "assets/content-promotion-fre-dialog-game-art_694x873@1x-ngcal63o.avif",
		"integrity": "sha256-5phGCyZL1oEEI9Qsp8zFdJ3oAKSiAat7KQ85FpSRmt4="
	},
	{
		"path": "assets/controllerPairingRouteBindings-jumx2xek.js",
		"integrity": "sha256-foJ1MAUVx8F4dwh9HwXyj1QtxCVUq7tGQCyghUHhBKA="
	},
	{
		"path": "assets/core-oqwr3z9q.js",
		"integrity": "sha256-sek410Pzh/koijPNHOOhHL3GMGoBi+Yxy7dOQShV8pA="
	},
	{
		"path": "assets/createWidgetGuidePage-dfs3x1eb.js",
		"integrity": "sha256-RP5whRuX7vVLMBz/DJhmnPVji96mkmHCqqVcD9I/XR0="
	},
	{
		"path": "assets/crimson-c4bdnuks.css",
		"integrity": "sha256-/xdzBTMoUdEG0uxnbMdDpXwfBJQYW5xDdqXdisOIIFg="
	},
	{
		"path": "assets/crimson-nomsp7wi.js",
		"integrity": "sha256-tJh+XLiRHzDlFISeNjsnAoXtPz79xeAo6bdWh9BZx8I="
	},
	{
		"path": "assets/crush-dark-czroojbj.css",
		"integrity": "sha256-DgBgW8B580OWXhvif5NixYEThW695ZLO6hBAMnbP9C4="
	},
	{
		"path": "assets/crush-light-kyir4ug7.css",
		"integrity": "sha256-eieNIzeskUEtZGclqLmOz7Lq46W7TACEc76bnWTYYCA="
	},
	{
		"path": "assets/customTokens-evjrjhto.css",
		"integrity": "sha256-sKnvRW3SuN1iqUiw0BjquIMUGrqYuFHK8DFOWQZbSU0="
	},
	{
		"path": "assets/data-k1o1noin.js",
		"integrity": "sha256-gCWU3MT/THA94fIwGVxlOP+cdEz0yArq/rHLn9cVQh0="
	},
	{
		"path": "assets/default-jhqvxbig.js",
		"integrity": "sha256-quskzcHnE2aAZ31BS+pkYDzufM6PkMpzj3usBjprWB0="
	},
	{
		"path": "assets/default-jl6mig10.css",
		"integrity": "sha256-J0dkLG/lIF3MNBcR0w0jA38PKDLreodrfW2QmD1aH6M="
	},
	{
		"path": "assets/determineUpsells-munlya5p.js",
		"integrity": "sha256-wHQQcMrc3KXs2dst/i6aiRB8TuVJnZ5Q+Qo0Y16QNqo="
	},
	{
		"path": "assets/dialogPreloading-oqqhxo9l.js",
		"integrity": "sha256-9RWtEMhr71Pi29viAY7oevHMG3H/sSc5TzVHJfqOgM4="
	},
	{
		"path": "assets/dist-dlgt6bci.js",
		"integrity": "sha256-/XVcNU0YxX33U9LihFq3fNAmLvxO2f/09/TK9q+bm4k="
	},
	{
		"path": "assets/dist-ext7x2gm.js",
		"integrity": "sha256-o89dhrvLRXSqC4hFuqsObvvUmSgDREMPC8shqPEv6XQ="
	},
	{
		"path": "assets/dist-g5zbh3uo.js",
		"integrity": "sha256-UdPHhVYu2CKvwnKPqk2HUrjxgAslVQvsJC/uc7vn+P0="
	},
	{
		"path": "assets/dist-gjjoo1y0.js",
		"integrity": "sha256-TPsvNFC26ADGeaJ8BNlt5sdqLeHz8mwnktt5UMBGnJc="
	},
	{
		"path": "assets/dist-hcsgj0ub.js",
		"integrity": "sha256-PL/c2ZxEF/0Dct9r/nUD6ZbniBwnVNCeqbD6zxOKiro="
	},
	{
		"path": "assets/dist-jv0txkve.js",
		"integrity": "sha256-5PPHInDv8CWDecQ4TmdiMO7n6aPPDFs9qGIiZLKRt94="
	},
	{
		"path": "assets/dist-kegyd3i8.js",
		"integrity": "sha256-CN5DqjiFObeDCVqs8CaRLCphryvmwJ46g9S80vY8ABo="
	},
	{
		"path": "assets/dist-n3a3gauw.js",
		"integrity": "sha256-X/9bbIkJ8cxxuO/IwpekhA/u4QG8TKQ/QA5zlknYY68="
	},
	{
		"path": "assets/dist-om7x3958.js",
		"integrity": "sha256-4h9vzmkFblJqX3vxPaURID241iVVojVNe7ZdxsiYUAY="
	},
	{
		"path": "assets/entry.client-mpghtlrl.js",
		"integrity": "sha256-86DzlGFotB8b8In8FfmNebtAUSgR7O4S471QCH5puvU="
	},
	{
		"path": "assets/esm-browser-clkq2kxy.js",
		"integrity": "sha256-lCetawDH8Ytupr98LGlF2hlPvFHZpvj/i0n5v4Nhkwk="
	},
	{
		"path": "assets/esm-emuj639j.js",
		"integrity": "sha256-P1yw128ilS3gPFHo1Bb40hrmmR1mIAVdlC5QPjbnJd8="
	},
	{
		"path": "assets/esm5-m6t44ovh.js",
		"integrity": "sha256-7iyOwU9R22nvztQCyPr/js4LpWLvWI8SV451tcwMho4="
	},
	{
		"path": "assets/filterLabels-mk737m82.js",
		"integrity": "sha256-KCx5xP1EQZGRLDCuemGYEpkrXe8K8SNp/S0rCyBN7MA="
	},
	{
		"path": "assets/findElements-k68duyja.js",
		"integrity": "sha256-/9iM9RMI0sSz7USPNBpDPxPtEGveYxQjZA+QuQjtPfg="
	},
	{
		"path": "assets/fireOSHelpers-cd388bi0.js",
		"integrity": "sha256-Ip3e9gk5UY892/s/OCwJ2KLLeLjX/ajDPiV3X8KKeqc="
	},
	{
		"path": "assets/fonts-kxvwg6sq.css",
		"integrity": "sha256-ySTQGrjnC7VnMLpYxTRxD61E/1Fk7LsEVrFcZqocQBk="
	},
	{
		"path": "assets/forced-colors-lujdpd1q.css",
		"integrity": "sha256-psFRR2I6a1D44zYV/q/WbxW/mRIiFNYZx0PKWY9d1es="
	},
	{
		"path": "assets/fpv2-ilp8rm2c.js",
		"integrity": "sha256-4RcxyAZA0vAnh0WaX3KMPGzviPe053gOIVP8jfjEIhY="
	},
	{
		"path": "assets/frame-landscape-dark-lyl8ts3t.svg",
		"integrity": "sha256-PFrsxiQS1yzattEy2Ok3SaQqKek1n6ymT+J2gairAZo="
	},
	{
		"path": "assets/frame-landscape-light-oqy90k4e.svg",
		"integrity": "sha256-MQqsnaS1C3/6mAslWuP1MA8J/x/pLSMhsl6/6BDpLvk="
	},
	{
		"path": "assets/frame-portrait-dark-orce274k.svg",
		"integrity": "sha256-eLXlTOje7eRO4PhvWThE7haBoG6eBejBLmi8cIR2YmI="
	},
	{
		"path": "assets/frame-portrait-light-izj6hdcd.svg",
		"integrity": "sha256-L6M5z9H7iEYZQNVz33D3Sk9cbjrgaHXkXMQ5ME5e1Dk="
	},
	{
		"path": "assets/friends1-n7x0m65r.png",
		"integrity": "sha256-wMtAZnKLIVNzMHCNc/F7lzDCkP1hIt/3PjtuGifvRbY="
	},
	{
		"path": "assets/game-tile-gvlusypf.js",
		"integrity": "sha256-Rwb3cLwbGjA9lI1IG6khb2w2qFe1xhjSqtOdZRBneAg="
	},
	{
		"path": "assets/gameStreamAdapter-mms0qxik.js",
		"integrity": "sha256-TKrQHkTy7FdcjLj68t1gxzFKNf1fWNwyxRiSl9Hkw1E="
	},
	{
		"path": "assets/gamepad-cjvnpypw.js",
		"integrity": "sha256-fGO3mlVBz6dX9ERPt4p1vRt/JzRcUYLWQuAyMEUjYcc="
	},
	{
		"path": "assets/gamepad-nav-virtual-lh6mhh03.js",
		"integrity": "sha256-qxKidCVDD/0KBcOrioIejFGOQNGlbPJgDwOhXsBac74="
	},
	{
		"path": "assets/gamestream-auth-service-c0q5alk0.js",
		"integrity": "sha256-Dru3ZF6rOtOYHsrX06NN+3bm9jNUTSSzqqQ0Yh6CQuI="
	},
	{
		"path": "assets/getAchievementSummary-jfhgftke.js",
		"integrity": "sha256-tEtz5qJSxrZ+oa5743nCRzIrylU3mbyX1QRqPlIVpGE="
	},
	{
		"path": "assets/getChangeGamertagRouterEnvironmentHooks-e3geq7oh.js",
		"integrity": "sha256-v8mhlbqPA0qpF8Sbm4xJh5/1//omODFIij84Pa4/AAg="
	},
	{
		"path": "assets/getControllerPairingRouterEnvironment-fiqysqef.js",
		"integrity": "sha256-d4+W5RET0vlhRaKLRivGEiyda46mheggOFhC3yPD7Lk="
	},
	{
		"path": "assets/getNetworkInfo-d5wut9g4.js",
		"integrity": "sha256-cF0zKUDdKdtdSSMKdkK29oKXXYw0ygwpW2ksJd3Tt2Y="
	},
	{
		"path": "assets/getNetworkInfo-il9dffhf.js",
		"integrity": "sha256-1sOyqpIJ3ScvcivEt8pTTRdTCY6nX1l7kDqYRZoLEC8="
	},
	{
		"path": "assets/green-czhb07wt.css",
		"integrity": "sha256-VE101TIRYOU4GL80yoqhQaV+xW9EMlAPZ4yb4z4Gu28="
	},
	{
		"path": "assets/green-kxvkh8h9.js",
		"integrity": "sha256-T5LAj/oTsvKbdiFe4KCRYXSkX67y9ajs7FZzHVFYUX8="
	},
	{
		"path": "assets/guideRouterEnvironmentHooks-h2xlfina.js",
		"integrity": "sha256-BluV7o/JFcSWMCkrMIRZIRcxfMgJVYSQRUrf08OA70M="
	},
	{
		"path": "assets/high-bekejheh.css",
		"integrity": "sha256-qPWc5ty2I74vWlkqO/pWDLMrpp5on4IuYU7Xl5CqJdc="
	},
	{
		"path": "assets/home-pdp-leaf-utils-hnv6pld2.js",
		"integrity": "sha256-ypxYZJRMTvhxiS9QR6DnPJ8Kgy230/mLWgXfIBys3pA="
	},
	{
		"path": "assets/home-pdp-support-leaves-g5ox5ksp.js",
		"integrity": "sha256-phFJZAoDYpydAanjaYq7/YHYDs8QVCikd1mDBxYJQOs="
	},
	{
		"path": "assets/home-prelcp-leaves-buc8gr46.js",
		"integrity": "sha256-fqQxwMod4Gceh20x0wVKPVIotVUHci7UGtUYhAM1798="
	},
	{
		"path": "assets/homeOSTV-jswz3q6s.js",
		"integrity": "sha256-CC60LIAj2NSUNuvp17olSCpWoAcUb+96zX2IWxGzXrc="
	},
	{
		"path": "assets/index.client-k08pgrvf.js",
		"integrity": "sha256-PcjRwvKyT+t7Ql7hotez+5U6o/aCkEXG3+019NshkKc="
	},
	{
		"path": "assets/index.devtool-c74menzg.js",
		"integrity": "sha256-JELOthMHZULk88F4aWPvHw3T0wTN6+5ub7w6hs+GuL8="
	},
	{
		"path": "assets/indigo-cmsi84aa.css",
		"integrity": "sha256-8rnTke64PW2tLobWdDFFAuq/36TBRspCzNyxAJZgJXM="
	},
	{
		"path": "assets/indigo-hvb8gajp.js",
		"integrity": "sha256-TqRToPyfteyMJjiMo2R+gsB8j2l4tMKyWVwbaBRNI+U="
	},
	{
		"path": "assets/interval.worker-X_LrmMQP.js",
		"integrity": "sha256-LUqaoSebUcQhnclb5rTGTBJpHnv+qEuwxkinbZO4jec="
	},
	{
		"path": "assets/keyboard-fi4iodii.js",
		"integrity": "sha256-bgWEifvfXGCzR0l36bxycZj/a6AKdqtV8EHF4lscico="
	},
	{
		"path": "assets/labels-i94hzg75.js",
		"integrity": "sha256-8L/aeUeAV4jN9ZyFfo/8X9Vku6uvbwkJDIhGKMBeQR8="
	},
	{
		"path": "assets/languageTranslations-nc0szlnz.js",
		"integrity": "sha256-kl2dvLt5D08ViQQDZlGO5aHW4dy0M+zDesOzv8+LLwI="
	},
	{
		"path": "assets/lib-fz3gz239.js",
		"integrity": "sha256-qBn2yN+SHf0WTU12yiczuGJpsjwwX76zKlQFWEWRe6I="
	},
	{
		"path": "assets/loader-ar-SA-dvcn4lh9.js",
		"integrity": "sha256-5smtg4XS8+Hb+Sj1QJ3atcSZBc5wRMRXNxYuOhncJZE="
	},
	{
		"path": "assets/loader-bg-BG-eel9c6u7.js",
		"integrity": "sha256-djOEbllngnRVJBUO7X5YprX9JTd9g/8OWJBxU7WK8II="
	},
	{
		"path": "assets/loader-bs-Latn-BA-c1s4mvwi.js",
		"integrity": "sha256-vdGh4IbeTK66jgajBO1+NDEIJowTZRLUOoPeH3dTqeU="
	},
	{
		"path": "assets/loader-cs-CZ-cdk2903e.js",
		"integrity": "sha256-QIk0OLCw8PQSOFofRyx3ZbeyoU/jA1Ykvh9x0ibz1JY="
	},
	{
		"path": "assets/loader-da-DK-l97qot90.js",
		"integrity": "sha256-8HfN8pGPgx2xrYSrm8ZNAf3dhhxttkyfeM/2pragf18="
	},
	{
		"path": "assets/loader-de-DE-dntxs3r4.js",
		"integrity": "sha256-49aTVkjqxsT71a8hw/arpuOTdgvq9HMoVqhFjOq41q4="
	},
	{
		"path": "assets/loader-el-GR-lfihc3qc.js",
		"integrity": "sha256-2k9KC44vzjCgzHWOPJGWpbDxUOFpiJl0B/k9TTGxG40="
	},
	{
		"path": "assets/loader-en-GB-cxbnvfiu.js",
		"integrity": "sha256-fF0dyYD5j+J2q/kENQSTGjKVTAnYlZ703GXNabY09uM="
	},
	{
		"path": "assets/loader-es-ES-c0qe2d4t.js",
		"integrity": "sha256-hQif2Yl11Hx2uramSqhZxN8SShxwpWccq9Mys0xZY+8="
	},
	{
		"path": "assets/loader-es-MX-d35xyygz.js",
		"integrity": "sha256-1b2WJCPzsBZjHve9cefiv6yRFOSOVDZiLDn93NGoFRw="
	},
	{
		"path": "assets/loader-et-EE-ht8foa7b.js",
		"integrity": "sha256-3kET17Ns6zesToXCGtIbc7K+hGBeraM1J9603Hji4oE="
	},
	{
		"path": "assets/loader-fi-FI-oxyoaz04.js",
		"integrity": "sha256-ufLYlX3pbtiRGVLJ0nzg2InOpx9yazB99GjO1QmAL+w="
	},
	{
		"path": "assets/loader-fr-CA-fu3jp5hc.js",
		"integrity": "sha256-fCVqIoH6Quo7WNPjtohevgPve6ScI8NsgHS1N/Gdeq8="
	},
	{
		"path": "assets/loader-fr-FR-jyqylw7k.js",
		"integrity": "sha256-uxXII1OXyBQRLhwwKoQqzQXQTiwWjHkuC/85L+0gSkU="
	},
	{
		"path": "assets/loader-he-IL-mf3rateg.js",
		"integrity": "sha256-uRPwrI9AjqlWIebCOwmDsT5DrHxbLKClfIY9RhEEsog="
	},
	{
		"path": "assets/loader-hr-HR-mz6geuqf.js",
		"integrity": "sha256-qvpxYJk1EAVfD3C/G4JSFKYeVusYYhVsCtJnBNVp/jI="
	},
	{
		"path": "assets/loader-hu-HU-l6asy3pd.js",
		"integrity": "sha256-UWhcjeOETkn+y17Fu9e7pfZKBwwXJzM+8zmYaRHyu64="
	},
	{
		"path": "assets/loader-id-ID-dxjxygs0.js",
		"integrity": "sha256-jNEZ+Y674QnWsKPTzcY/aOWxzTA1fNeJcG8Yvb23V5Y="
	},
	{
		"path": "assets/loader-is-IS-gxahnutw.js",
		"integrity": "sha256-WoQ+xe3KK5KbJ1zcxbzFHkrW86/I7B63XZAnscZ9cGA="
	},
	{
		"path": "assets/loader-it-IT-junufwq7.js",
		"integrity": "sha256-ZlEi6GoXqDy6Xzh9MYFQkM+usMInZOZDqZYo/L60Nn0="
	},
	{
		"path": "assets/loader-ja-JP-fpzmtq8d.js",
		"integrity": "sha256-JuhyYz7qoiv0Tq71GaBQ7csLcRbufHxA/qK5gbeJKMM="
	},
	{
		"path": "assets/loader-ka-GE-m2blhrdd.js",
		"integrity": "sha256-hNQNRr3Q64WpqadXenVRA2hvzHCli/55XX7ljG6ub/Y="
	},
	{
		"path": "assets/loader-ko-KR-e5muw5m8.js",
		"integrity": "sha256-Ym4QCJkttRkSPo6DKOUDFWkU/iNGH1yI0218dKObKxI="
	},
	{
		"path": "assets/loader-longest-debug-kpz6hfog.js",
		"integrity": "sha256-CoR7/sRMrNZBG/Gem8Mo8myBk1gTqWTbQBItxtvs7Cg="
	},
	{
		"path": "assets/loader-longest-is9gzdc1.js",
		"integrity": "sha256-gOwZ12hds3HqyFieXYHxqEXHEYL6m+I1bGqV4CZMcx8="
	},
	{
		"path": "assets/loader-lt-LT-cuwlr4ju.js",
		"integrity": "sha256-xzcsZQUg5JjYD5djFVQ8cJfxwJ0lBsJWoceGcM9EMOQ="
	},
	{
		"path": "assets/loader-lv-LV-bvfn99ag.js",
		"integrity": "sha256-IQZ/JvdbgtlEsKSxGtyVMtEbIBoixenJSLChTey8bSo="
	},
	{
		"path": "assets/loader-mk-MK-ohh8cxre.js",
		"integrity": "sha256-nuBLXcdJwnucqJTYB0qyi4LY7qhLnYM3JG/eiVl/uOE="
	},
	{
		"path": "assets/loader-mt-MT-kudgn1py.js",
		"integrity": "sha256-KldugJ1a88f88tsVi7giptb7Jop8IDXW5O2rPr5PxzE="
	},
	{
		"path": "assets/loader-nb-NO-eg8e1ssd.js",
		"integrity": "sha256-TqUUHTzBsRJitOJcxoTlpWGwYGwAnhce0jbreMaC1wg="
	},
	{
		"path": "assets/loader-nl-NL-myd9ks2z.js",
		"integrity": "sha256-L3qMFBx/5AkyBR8Y9DJCpy1lMlZd08ASweh4omCsUMY="
	},
	{
		"path": "assets/loader-pl-PL-oxrjrvwb.js",
		"integrity": "sha256-xRnwx6jB64kpxvMB+JpIcioQcUM9cBp9ADgI17+uzoo="
	},
	{
		"path": "assets/loader-pt-BR-dwjmm3nl.js",
		"integrity": "sha256-pVQ5YI7ciJ/JEVev0P6MfqI9aug4oW1LeiLJYFGX7Zw="
	},
	{
		"path": "assets/loader-pt-PT-f7um23li.js",
		"integrity": "sha256-IGNrMAIbs/6IphieTDt+ji/5A0b4Humw8OA5RZIeuVw="
	},
	{
		"path": "assets/loader-ro-RO-i5l7ps9a.js",
		"integrity": "sha256-Jdwn/UyypOAxV06UJTBB+/jSyuKfw4eQ81/AoePcLjo="
	},
	{
		"path": "assets/loader-ru-RU-d1nnmhax.js",
		"integrity": "sha256-M5o0mgv6H/apPS2rwKlHOAocyj+VXAy/JqcJkyTrwos="
	},
	{
		"path": "assets/loader-shortest-debug-is4mcdof.js",
		"integrity": "sha256-xzD6oUZrR6Wy0jQJ2Sm+xblc8tNrW07HIptYROFXEHs="
	},
	{
		"path": "assets/loader-shortest-gbt289b8.js",
		"integrity": "sha256-gE1VVjpvK+k6UMrD5ZNU6n/UXUS5A+4PsHjqcJWc10c="
	},
	{
		"path": "assets/loader-sk-SK-j3yayfm9.js",
		"integrity": "sha256-5AnPpM6O5u94rPayxbJUKvFFfUCvE0VFidjicYyEJb8="
	},
	{
		"path": "assets/loader-sl-SI-k3e9uyua.js",
		"integrity": "sha256-9EC69OZFgyZSU7Tlnt3kaUguMobOizFRMlq293OtU70="
	},
	{
		"path": "assets/loader-sq-AL-8upy0cl6.js",
		"integrity": "sha256-bSZh7zqovMzypXB/kqdtUrJJxlhwN19PlxXTECOtlL4="
	},
	{
		"path": "assets/loader-sr-Latn-RS-g5m693cd.js",
		"integrity": "sha256-FaK1VSur57HSAxo5DBQkeJE3FTA0wwpSg+CP0yKwB1k="
	},
	{
		"path": "assets/loader-sv-SE-i8otu339.js",
		"integrity": "sha256-zgCr7baT3BV/CNm2TSQAJb8vR+2kV/m8/ptcbtdcoGY="
	},
	{
		"path": "assets/loader-th-TH-grvug5gw.js",
		"integrity": "sha256-3WcyfJhbrBFt2M1IVrFajiFSrSW6z7cjcI5eiwUcqHg="
	},
	{
		"path": "assets/loader-tr-TR-insg18fv.js",
		"integrity": "sha256-Evx4BYboYXFw4J59NWPbiTernj9J1SHf2GDy5Vag4lQ="
	},
	{
		"path": "assets/loader-uk-UA-h1bjhy47.js",
		"integrity": "sha256-LMwb3cAFkyL6uUNY7+HTMUcoCNk3fhKnXDtV6bfweRQ="
	},
	{
		"path": "assets/loader-vi-VN-k0tksbyy.js",
		"integrity": "sha256-Z5+soTbbAvlMj8FwmgcJaKV5pc9yWSEMKYeV/tLXjUQ="
	},
	{
		"path": "assets/loader-zh-CN-dopr9j21.js",
		"integrity": "sha256-ql+MN1rkzRTevUFGgA2TaC9MQzzna+XmFGQwTqfNMzo="
	},
	{
		"path": "assets/loader-zh-TW-k7lvxvv2.js",
		"integrity": "sha256-4WUMR1QHNJ/a5ynJWFvXiCaeRcxSSTDIi3LdBc+38pw="
	},
	{
		"path": "assets/localNetworkAccess-i56fch4w.js",
		"integrity": "sha256-sp+D569SpJc73Cdid3hnn9URBGzgjtorZ//kkx1AcHY="
	},
	{
		"path": "assets/lottie-k9kozhz5.js",
		"integrity": "sha256-V9nua1neucJCIBE/un3qvdNtvjihwx9kK6Aa4FfNvYk="
	},
	{
		"path": "assets/low-jmzfmu6d.css",
		"integrity": "sha256-KLdPnTqJwW4qJBoYIm4z8LvhenMLwk/uoolwFwdhkoM="
	},
	{
		"path": "assets/manifest-a0c583b2.js",
		"integrity": "sha256-QK2UmoVc6VD9SmF9nm/+qor8xXKm9FniCULnEPWkxvg="
	},
	{
		"path": "assets/mapStoreResultStatusToXboxPurchaseStatus-dsrh7mq2.js",
		"integrity": "sha256-h59dqGVAIRSzl8S9OCV/BBW9LQgQj9czTqCmaA5VpEU="
	},
	{
		"path": "assets/mobile-app-qr-ks3cr11i.svg",
		"integrity": "sha256-E/dQndiXm3eY17s+4q9P5R9+hk4tNQtqhifSe7VPRMk="
	},
	{
		"path": "assets/mockConfigProtocol-kjfun4cf.js",
		"integrity": "sha256-lA64d5+a/HQtAnVKUdVzOvMIrgQ2aivg2eV2st2/5WQ="
	},
	{
		"path": "assets/nativeStorage-3cu859fw.js",
		"integrity": "sha256-LsVFRJf+PxUl93g7A+Cr8fsI2dvmbPAYEqDGmkmq9lc="
	},
	{
		"path": "assets/navigation-stack-h7n8tudn.js",
		"integrity": "sha256-QagvidNOtjquglCguMCiWF7U1xGewWbby81xzqbuVpk="
	},
	{
		"path": "assets/openDialogSchema-fv7jc82y.js",
		"integrity": "sha256-YiUOznnqTxp5gtJaJgF0XTlNcKE5zdfq9FNVinXlt2U="
	},
	{
		"path": "assets/openNetworkSettings-dwmb7dvg.js",
		"integrity": "sha256-VzKtWXADsXQM2OVaNmXZ8UkOxAFUb0AcUjlwjuYWjdY="
	},
	{
		"path": "assets/openNetworkSettings-m3fxuwsy.js",
		"integrity": "sha256-IhsB/wa0q5e+Eh1fj6w2JBtg86k67bAQrDulBv4OKCc="
	},
	{
		"path": "assets/orange-bbzsbfby.css",
		"integrity": "sha256-ORPb0MAsU1JZElgA60bXVuPFHgbrRXITwwTN4o54m4U="
	},
	{
		"path": "assets/orange-ljav9lnz.js",
		"integrity": "sha256-G8IZjh2dWWAtsDKufs285slG6a3GfxFUGzz+g86NIo0="
	},
	{
		"path": "assets/ossNotices-0pw0g5kd.js",
		"integrity": "sha256-ZS1oxdNhwuYKIoKTq3h4ktP2+m/mx6WpzHZ1uvnv2AE="
	},
	{
		"path": "assets/pidlsdk.resource.helpers.module-ifkm3kee.js",
		"integrity": "sha256-eXONrIfPprCkYlZcFxbePw5dTzL9D3/TOuahH71YVbA="
	},
	{
		"path": "assets/pink-hdu3ku7h.js",
		"integrity": "sha256-8rAMFIpSbRdDMfHKViGvSU2Cc224yJhr1jE4nFDpTXk="
	},
	{
		"path": "assets/pink-kl2pulg2.css",
		"integrity": "sha256-JQya8mcLRC3QKFkgbVXFyLauM06WYHKhoREJOczqC14="
	},
	{
		"path": "assets/priceHelpers-fqbpta9z.js",
		"integrity": "sha256-xkpJX3tAhLv1ZUBq6CZxXeNMJ70uvErUylToLKQxvyM="
	},
	{
		"path": "assets/privileges-oj193jfa.js",
		"integrity": "sha256-lXWL0fwKSWyMom8sOfwtxfkKp1nhglI8UDinN7x4EL8="
	},
	{
		"path": "assets/product-metadata-adaptors-39tgbarz.js",
		"integrity": "sha256-J+UfHC90aAB6z7vf+a1zVX2g3zccggKxoMKoYIyaFyw="
	},
	{
		"path": "assets/productIds-c31b1jep.js",
		"integrity": "sha256-E7xpwZOf1LfDX1jLVKOG/Nh9dzSGYEg3FOkliacsBHU="
	},
	{
		"path": "assets/production-ll1zi3x3.js",
		"integrity": "sha256-gZwi42N5XuSYe53W8KzpWQPk/iADzKWqTWUBLunpsQo="
	},
	{
		"path": "assets/purchasePageReadyUtils-h1z511qr.js",
		"integrity": "sha256-al+yX3fNDQpzfySlh0yK/k+Q90KutWF/Iz53z708r6s="
	},
	{
		"path": "assets/red-cilsmixv.js",
		"integrity": "sha256-6nr1GoV1NwG3rTRpKJ0OHhTLfCVeeK8wl3sH6sNysvQ="
	},
	{
		"path": "assets/red-cucsk2k6.css",
		"integrity": "sha256-Wkon8Ze1Qeo9kLFRd1B5KYQmh/eqYE3YN2tFYeS5U0c="
	},
	{
		"path": "assets/redux-boot-core-pd6f4ovn.js",
		"integrity": "sha256-vFsZjAS8XI6Pg8UELXtX0UWUDj78Akg/KTY7U9asK0I="
	},
	{
		"path": "assets/resolutionAdapter.prod.devtool-ixtnwpar.js",
		"integrity": "sha256-sUEmbw62S+Xn1fc1QHxK5orl3FYp7rbDCCmsUwZ9ZSI="
	},
	{
		"path": "assets/responsive-toolkit-jup4yedr.js",
		"integrity": "sha256-O6WVjs+zumMQeRTqEsbPyCBsb1S+6VoAJCgMpoNYLCc="
	},
	{
		"path": "assets/rolldown-runtime-nx40z1zs.js",
		"integrity": "sha256-DXrdu+dgSRy8FwcKA4AH/ze23hyAsOcuyPod12/Gllk="
	},
	{
		"path": "assets/root-n0pvw86a.js",
		"integrity": "sha256-Pbp6Imnz9h/rjsJn7pAx5T4kj0FW3fNI6OAS/NKuiN4="
	},
	{
		"path": "assets/routes-dojzucd0.js",
		"integrity": "sha256-lg9ThhRQynDN9AVqf+wHYUT9N3MBdVDoyBgre3DVfaE="
	},
	{
		"path": "assets/routes-oel6fm83.js",
		"integrity": "sha256-RIYAda9+VXRbyqutuIYCxRha+cBsj/QH8VLWTNWvPuI="
	},
	{
		"path": "assets/series-s-fg0lid33.png",
		"integrity": "sha256-Fg0vdgV7xTUT+eVC1uhjz5/n1QbG4+pQUHTpvPSgTC0="
	},
	{
		"path": "assets/series-x-dosmzchu.png",
		"integrity": "sha256-Y99DPKjY4sVrV+hcaMwx75otb7Kj8/kOjraLOEHTjqY="
	},
	{
		"path": "assets/service-adaptors-o6urwprd.js",
		"integrity": "sha256-R5ArCOaFMRVSSxiDFruzef1wJ46GtxcLDA0U21CU+3Y="
	},
	{
		"path": "assets/service-sdk-adaptors-nui3h93f.js",
		"integrity": "sha256-lm42qS6x59/TwGHw/wn+vduIVM1sxhtdUrJ7oov93ug="
	},
	{
		"path": "assets/shouldShowPostStreamFeedback-bcqdxbkp.js",
		"integrity": "sha256-dn3NXft3dvs+tFku7n26i9QtPLtwkLTwPTw8hGLEoFM="
	},
	{
		"path": "assets/slate-b98w6fxz.js",
		"integrity": "sha256-Ytg7RWpJhfd10cRjkNAT2cwn00g0IYu29sN719VCJnQ="
	},
	{
		"path": "assets/slate-nn9k92d8.css",
		"integrity": "sha256-xGfWMMGxQhC4OCnYokxwgb5l20eytQ2WEYnXjGNxFkY="
	},
	{
		"path": "assets/smart-tv-help-qr-efybpt6d.avif",
		"integrity": "sha256-l9uVxdbO4utEMxfxZr8qRMShfP9vfiuKtzww7Eh2vmM="
	},
	{
		"path": "assets/smart-tv-help-qr-ionlzhbc.png",
		"integrity": "sha256-vS1TuUDY+f5yrjgpenaKoo8uA6NRWJLdhAWcHJjdc3c="
	},
	{
		"path": "assets/smart-tv-pair-qr-gbtuapk3.avif",
		"integrity": "sha256-iH61hppBxcsEnWUtwUswDMb8Mmk6jMGoMon1ZAeyZ2c="
	},
	{
		"path": "assets/smart-tv-pair-qr-kqcu2x2t.png",
		"integrity": "sha256-PjVEa//+aRSsnQD4TECmS015EWudF3PCBqi1AIXpusQ="
	},
	{
		"path": "assets/social-cards-pe92tvjf.js",
		"integrity": "sha256-8h3yXXlIyYTAAenvYxpRYW+Iwqe9JNKirnjDAXEvB8g="
	},
	{
		"path": "assets/src-kv81py4k.js",
		"integrity": "sha256-6HNmemzAf13YFYjNqNWhs7ynhnnHwrRsV1NcUgVPe6o="
	},
	{
		"path": "assets/standard-dark-f4udmw9b.css",
		"integrity": "sha256-R/A5b5OyZ8ntosEjFkbZNyEZvznprdqQvseCy/sQycQ="
	},
	{
		"path": "assets/standard-light-e63h0mh4.css",
		"integrity": "sha256-7yfmCav+H19o7B7dD1H2Q8qWXPRmXkzZ//VG/MsAF0Y="
	},
	{
		"path": "assets/steel-mwth1yn1.css",
		"integrity": "sha256-uawM4hOUZxm2ccOD4dx0XGlSpdNa3RFtBZ2WFPJ1yJ0="
	},
	{
		"path": "assets/steel-ntt720lw.js",
		"integrity": "sha256-AgYP3N6Sh/Q3m9dPUmV5XmmcZVtBU7vu08TRzdZQO3o="
	},
	{
		"path": "assets/stream-gate-hooks-bpatbpk5.js",
		"integrity": "sha256-m9oD/mum6a9uxK/ESKcr57Boy5Iq2fx0+7k/0m0eO6k="
	},
	{
		"path": "assets/stringify-ncos2zju.js",
		"integrity": "sha256-Mafc6BFhJhdL9LRkBLUBft1d0RcisvdDqPbcqA3vrco="
	},
	{
		"path": "assets/subscribe-dark-ytq1g4n5.svg",
		"integrity": "sha256-xhOxhmlvuh1mvnWcykUeGNfDq1AAlg2MX/ji7XsHZcw="
	},
	{
		"path": "assets/subscribe-light-ln6qgeim.svg",
		"integrity": "sha256-ke5ArANBcBxVfPcYrQu98/RrqIg0kkYlQe49Bm9+/JQ="
	},
	{
		"path": "assets/tailwind-okev5vkc.css",
		"integrity": "sha256-5yw4p355p6djamluD5p6j5ctL0541883ovOSbKHdcSU="
	},
	{
		"path": "assets/takAdapter-lawc01o4.js",
		"integrity": "sha256-q8LTUgYLs9MLAKyn+pk5l+b4mIMPUrQ9l1mB6IJRHBU="
	},
	{
		"path": "assets/teal-byjrdc53.js",
		"integrity": "sha256-Ne+dzidrqlnjGLrh294KtrXBwqKrOCQo2HzYwXkUXiE="
	},
	{
		"path": "assets/teal-jhvpsihz.css",
		"integrity": "sha256-YmOTSxMXrCc9r2nLe7fXWCEDVhLXfOjHBp+teo+vNlE="
	},
	{
		"path": "assets/text-encoding-shim-pbvfq80b.js",
		"integrity": "sha256-eyK3MgiZe4xVnoHBjO0kNTf+4ZHxPjzZ30XPe/G3Wz4="
	},
	{
		"path": "assets/thinEngine-ml0559zp.js",
		"integrity": "sha256-P0UHZmeoCXxvQYH7I3tux/3DzhgISV6Ps9H5ytsm4gI="
	},
	{
		"path": "assets/tizenHelper-fl4ssml0.js",
		"integrity": "sha256-IKPCarvgRKSMXZFYKYPnUoeBsKoadtDaiB1Z3Unk+ug="
	},
	{
		"path": "assets/tokens-co9iq3r3.css",
		"integrity": "sha256-XOALOuLuQGt2XgeVuC8mQ8RH27FW4vvLFaa9vzBd6jQ="
	},
	{
		"path": "assets/uhf-ar-sa-pe3akm7s.js",
		"integrity": "sha256-mvHW4lyuSoGMp1Tz0CjGNCEz1QyASuBBDapkanyUoso="
	},
	{
		"path": "assets/uhf-bg-bg-ht6432m2.js",
		"integrity": "sha256-UoApbPsEmPHk4k/To01lBYyZ8f2y08Op314GezcuGao="
	},
	{
		"path": "assets/uhf-bn-bd-jujrg6qs.js",
		"integrity": "sha256-h1vlegeNSr/4cLGxByAIbfQHpApxLF6QUcIf5oUto2A="
	},
	{
		"path": "assets/uhf-bs-latn-ba-cok5hogb.js",
		"integrity": "sha256-Oh1r/sx/Y9U4jZIWkh14Wj74mMfdk3RtkdNxAo2/OCQ="
	},
	{
		"path": "assets/uhf-cs-cz-hld4o8re.js",
		"integrity": "sha256-Zzz+mDK5IdV21bGlNuedj4UwLCp8pvSFEJUPt/onZwM="
	},
	{
		"path": "assets/uhf-da-dk-klkxaqt4.js",
		"integrity": "sha256-kS8l0+sTTCHPfV2+S9czY4+3UVofwrT2LTMKUZA1XxI="
	},
	{
		"path": "assets/uhf-de-de-imjs2z8i.js",
		"integrity": "sha256-ocCQbYxxTS/sHLkTgZ/Qr2JGA4MXqQKPqj/Vh3X0YGg="
	},
	{
		"path": "assets/uhf-el-gr-fj274g6l.js",
		"integrity": "sha256-P2JV/lJXDt41IalSU9yM5dLykoLTfGwjqeM3gbWcS44="
	},
	{
		"path": "assets/uhf-en-gb-itgs6712.js",
		"integrity": "sha256-2j5+Ek1Z420gux0OTak43mDexwO/Lnj0Xf7YBM1wkJM="
	},
	{
		"path": "assets/uhf-en-us-pfutm5ao.js",
		"integrity": "sha256-G83IEwiLE8bQJMGQtc8GT3+7FZtuR3n62i1rVUuJzHQ="
	},
	{
		"path": "assets/uhf-es-es-iigvxv4l.js",
		"integrity": "sha256-d//qwgfype4elVkEA4BuzWXDK01cy+HwxNWpbd2OeWk="
	},
	{
		"path": "assets/uhf-es-mx-jzlbuzy1.js",
		"integrity": "sha256-s0ay9qR5ZoqcCyivGCWj6aKXObb7vPhXchKmIjodt0Y="
	},
	{
		"path": "assets/uhf-et-ee-cbo0iijp.js",
		"integrity": "sha256-URWOSMgsG6aiRIzqubc2ohTqJfAmH2P37kYCwbBBYuM="
	},
	{
		"path": "assets/uhf-fi-fi-jr1ecxww.js",
		"integrity": "sha256-AiCwWA2q0KjS6aWyyzWiuWhMkNEkHKzEbWfd6rx0t0s="
	},
	{
		"path": "assets/uhf-fr-ca-oqqu8kbp.js",
		"integrity": "sha256-xajOxJAUDv2eIT0B2rI4JIFChQY9I0N/tKZzy54mf2k="
	},
	{
		"path": "assets/uhf-fr-fr-dhfdfz57.js",
		"integrity": "sha256-U8EkcowmwA68N0j2022Io4bizJv7b7mXdRevFX8ISSo="
	},
	{
		"path": "assets/uhf-he-il-egj8vp7j.js",
		"integrity": "sha256-qPqqYzUv2PS4/V+DNj3blQlf3+VbFHzIWiJ1kZaUHq8="
	},
	{
		"path": "assets/uhf-hr-hr-exe19t5u.js",
		"integrity": "sha256-K5E8kNmT4I/vvtjlGxsHp1acC9DZd0/NPi1jNaaeuOw="
	},
	{
		"path": "assets/uhf-hu-hu-bv286wir.js",
		"integrity": "sha256-ua+qDe0P0xhWBBtzxrXeQEGCIE04JKFYFafYU4qGAow="
	},
	{
		"path": "assets/uhf-id-id-nppqe3qr.js",
		"integrity": "sha256-RCh4GbZVhkkwM8myLAnSE+PVY0CU3GeZOE4sp5Vblf4="
	},
	{
		"path": "assets/uhf-is-is-jmna1cdf.js",
		"integrity": "sha256-IjJPz/U5u42xPCkSS7iU6b5jxV9WL9OgayJbbb4HcCo="
	},
	{
		"path": "assets/uhf-it-it-fk5zevwx.js",
		"integrity": "sha256-ojpIqeNzvyOLfXJy7RFlNlg1SDjLoFMhArr6q5Q4Efo="
	},
	{
		"path": "assets/uhf-ja-jp-o2766d5i.js",
		"integrity": "sha256-QFbGZvHrD7+gRclYgnxOPRNhDLJ0MKO6KbEX/Mux+PY="
	},
	{
		"path": "assets/uhf-ka-ge-dxkzamhi.js",
		"integrity": "sha256-xyofUY3smXDr8nODQz9BjZvS3MZfd6CgLD+S29AfTp8="
	},
	{
		"path": "assets/uhf-kk-kz-idfliox4.js",
		"integrity": "sha256-jnW4kXmBdgw2r4CHsQY2NRCUtXBIdTkdfa3SldGsHNI="
	},
	{
		"path": "assets/uhf-ko-kr-oaby03r7.js",
		"integrity": "sha256-queuGDKn/97FDXUbtuvKLuHgWRDD63lqGaoHUPwu5f4="
	},
	{
		"path": "assets/uhf-lt-lt-mxr7va3o.js",
		"integrity": "sha256-ycpgmZGsClsiSUvfXoUyeEcInlFqoZ5wFimR+EFPxNM="
	},
	{
		"path": "assets/uhf-lv-lv-h8mkf7vg.js",
		"integrity": "sha256-nbtW+ONLpye1pP4AH3lFsHRxIT8b8lx4cERbF2PEDN0="
	},
	{
		"path": "assets/uhf-mk-mk-bdikupbn.js",
		"integrity": "sha256-J/qNiRJ4NyEKYnvS/l6NY4bWkgITDFIffwUtloPu/Ac="
	},
	{
		"path": "assets/uhf-ms-my-epx46gta.js",
		"integrity": "sha256-chGWfv6M51IIrcdazgS56gfCCECvxsr3U4zUCvigr3c="
	},
	{
		"path": "assets/uhf-mt-mt-d0yygjum.js",
		"integrity": "sha256-Og55QE9yRoIpim904+LreYXkN27IkcfCqMPIdWgN4OA="
	},
	{
		"path": "assets/uhf-my-mm-kxbbjvsb.js",
		"integrity": "sha256-AfUYcM9hbAwjwizIgvXignNzwvpDkx7rdWtp+8Ylw3U="
	},
	{
		"path": "assets/uhf-nb-no-frmgq2ko.js",
		"integrity": "sha256-QNCRAHqbUCumiAcvVDvAcmL1fH27c68p5NorIGwHq2o="
	},
	{
		"path": "assets/uhf-ne-np-cyrbvg49.js",
		"integrity": "sha256-gm3I1VAkVMah1Avy4DTPc3itiA09Le5hAHIoFu8/fJc="
	},
	{
		"path": "assets/uhf-nl-nl-dfbc1xw6.js",
		"integrity": "sha256-rdd1nq+0GgbCRz25MFDNbcUq2S53Vfyrs6C9Om2Qo3c="
	},
	{
		"path": "assets/uhf-pl-pl-mk87qmfa.js",
		"integrity": "sha256-wTY8MkZjWIW1UN4VXaFs1UASO3eZDHdY9oCEQbELejw="
	},
	{
		"path": "assets/uhf-pt-br-im8uqfl5.js",
		"integrity": "sha256-6rQ1+GEmY4DiG9VNL5KqJfALH6N4rD9eKWzy7tlFcv8="
	},
	{
		"path": "assets/uhf-pt-pt-kuvwx8iy.js",
		"integrity": "sha256-gwJVZ/UfRfoxT7FQD+cGxCPsUmHb8/dLMIRVLg9eyTA="
	},
	{
		"path": "assets/uhf-ro-ro-dkqxwc38.js",
		"integrity": "sha256-qFhfmk+ZNcgBGVzt3GhlxAg4OluN5UENZGU++rBO2lI="
	},
	{
		"path": "assets/uhf-ru-kz-gl6wnccb.js",
		"integrity": "sha256-v86wtsVT3edzy9dbkflzXVTe3nK2UycFkh7EaQpzChU="
	},
	{
		"path": "assets/uhf-ru-ru-lqj0nhh4.js",
		"integrity": "sha256-QiuDFdLuraf8iqHbQo0Kmm1QqFtsCI2zmgIDtYGgAqk="
	},
	{
		"path": "assets/uhf-sk-sk-coni2smp.js",
		"integrity": "sha256-XjRWY60LLTXlsDBWL/z3KxORVJ4ZAr7YTcypMtzI6D0="
	},
	{
		"path": "assets/uhf-sl-si-cdhwwt0g.js",
		"integrity": "sha256-i01nBLwtt60FaRDnz4umZWrTfhqHksdgwjNgp+jayE8="
	},
	{
		"path": "assets/uhf-sq-al-f8pw9g4q.js",
		"integrity": "sha256-fdL+IAQLEWn8whewJbrE4mQikGFmvBtWa5yZERrnIP0="
	},
	{
		"path": "assets/uhf-sr-latn-rs-h3pe3aka.js",
		"integrity": "sha256-WEYf5y80B5vb/4AXXmMMVMf4mzSfn4lE2ESdQGGPf4c="
	},
	{
		"path": "assets/uhf-sv-se-b25b7izm.js",
		"integrity": "sha256-l/yiIDnz3IJ1GCqfzlpXa9dlQIieiVtCx2/hOBkCGBU="
	},
	{
		"path": "assets/uhf-th-th-ed5rp4t5.js",
		"integrity": "sha256-zqtRUgKklhOQ/wxpXGLKKb8Hv5yTHtLs8BRu/HawbkQ="
	},
	{
		"path": "assets/uhf-tr-tr-klx3zx7m.js",
		"integrity": "sha256-Bl5lXXmO/p64AjAyfmpBCiiVOuGwD8GjXjYCnXNOUKI="
	},
	{
		"path": "assets/uhf-uk-ua-ywwo72oe.js",
		"integrity": "sha256-PskiVXzDiSQ5K6H/bi9556jFmqjXEyYj7dNYOm9Sf4A="
	},
	{
		"path": "assets/uhf-vi-vn-hqnofvk0.js",
		"integrity": "sha256-JoH4Oi4j/xVdjd9QKtedOKFDrDjFHBfw1O93gIFln38="
	},
	{
		"path": "assets/uhf-zh-cn-kyvyd61f.js",
		"integrity": "sha256-9ceRkNDB/rGCjDWjb4pJsJgBOEI7WamtZjCqZiW8R9U="
	},
	{
		"path": "assets/uhf-zh-tw-m3c5b17e.js",
		"integrity": "sha256-hQ7YHootuDqpSbeyp8mO1hg2cawn4KVgjbIgcXJ7Z24="
	},
	{
		"path": "assets/useAccessoryDisplayName-g05mfu8x.js",
		"integrity": "sha256-PPpdrdN9F4LY21Fms4LHAq5o9YFPeXDykkWb+iw2F9s="
	},
	{
		"path": "assets/useAnnouncement-iefwapiq.js",
		"integrity": "sha256-jJlGzB0LO8gGjOKgFEoE0bNZybVyvx6hMxNUM6IZIoE="
	},
	{
		"path": "assets/useAutoFocusOnNavigation-jozowuvg.js",
		"integrity": "sha256-5dgpywgSJsz9H7FP6da3ICIQJXgNCU/D6c0J+Tg8hQ8="
	},
	{
		"path": "assets/useBackHandler-nc8l72js.js",
		"integrity": "sha256-af+k9zb0Ryjm/5PRPRRLo+Lx7cAYKXbOfg7lxOY48rg="
	},
	{
		"path": "assets/useCaccsConnectedTranslation-j58djipu.js",
		"integrity": "sha256-clYubOHkc46NxzBjyNyQVQ52nDdKwzgcMpoUcHSDfjE="
	},
	{
		"path": "assets/useCenteredPosition-e51np64o.js",
		"integrity": "sha256-gJ5GudBcn6MudI6IFTZYQUhEWkNNjNtCWR4Q/ne6/xY="
	},
	{
		"path": "assets/useChangeGamertagStrings-g1ircyol.js",
		"integrity": "sha256-krxXrDHefqcdtbrdVFGSvQtPWgtx52/onSH42FBrjqw="
	},
	{
		"path": "assets/useChatStrings-f6vrmnim.js",
		"integrity": "sha256-nf6sFVxQIffr+YFkMeAvq69nuCjfonDSH3c7m9qM7FQ="
	},
	{
		"path": "assets/useControllerInformation-iarbxboy.js",
		"integrity": "sha256-fgIrKs12VZhOc+vzgjv4DHWGzAo75+DCDncw5k0Hbbg="
	},
	{
		"path": "assets/useControllerPairingCommonTranslation-9ra7wovb.js",
		"integrity": "sha256-feTcTuzEKY/Y3Z4wIzAeS+908ArnpeOkpJ0OG3uoi+s="
	},
	{
		"path": "assets/useConversationHandlers-jge1m3tu.js",
		"integrity": "sha256-VzTIqcL5pjChu51RB3Iktc5yWfS5i5HDEbnzQz6vlcM="
	},
	{
		"path": "assets/useCreateGroupAndNavigate-idhg8dbq.js",
		"integrity": "sha256-b8fRvD/g7aMQRPK6u+WuHwsrgquKWCQvskhFHlXg1lI="
	},
	{
		"path": "assets/useDebounce-pdood5pk.js",
		"integrity": "sha256-3rbXRMNA8WrJVivrf652x7T6H3ICpSkWqUt7p31fTi4="
	},
	{
		"path": "assets/useDeferRestore-dphp89mz.js",
		"integrity": "sha256-aDgX2RS7HFBnvhPeLTYdLw2dJNAToK49E6hdpbP6HEA="
	},
	{
		"path": "assets/useDialogPageDescription-fsgom47w.js",
		"integrity": "sha256-hRlQmdD+PwTO52GHEcdUp3XP/bhsxsPZbNs0WRylbbM="
	},
	{
		"path": "assets/useDuetDialogStrings-mfmpbocl.js",
		"integrity": "sha256-Hb/sO8m+0o3qDEXVzkOz1sYlmxhc5KjQAT/Hdfe3ZOQ="
	},
	{
		"path": "assets/useEmitGameStreamDialogEvent-m3jw3fvd.js",
		"integrity": "sha256-TVM7aielTP9s8Hlgv8hSbkqfEm0miINHbWrb4cudUH0="
	},
	{
		"path": "assets/useFeedbackAllowed-n8kdrflz.js",
		"integrity": "sha256-7GlTZPMkGDWKYd3ME5z3djPnvtYIzq2YO3ckW1xSeCQ="
	},
	{
		"path": "assets/useFindNewFocus-h0rt0gey.js",
		"integrity": "sha256-U55xq0ISwsHP3i4CRsKPJmJcAkjIkR/txeyDx+4xyq4="
	},
	{
		"path": "assets/useFormatAmountOfTime-b07yvc3l.js",
		"integrity": "sha256-YPt6YpNPNOOnMvC8lDme6tGLpq0olfyVfbGXVQ7gugg="
	},
	{
		"path": "assets/useGameStreamDialogContext-orgnly77.js",
		"integrity": "sha256-M5pw/YvaDOOkS7YVuPQ10CY1asKwmSne5V5/FaTz6ts="
	},
	{
		"path": "assets/useGameStreamProps-wkghqjeq.js",
		"integrity": "sha256-jznoagmTidL/cc5gOQPQVTkQksoVzNE4+KO7f+QQzt0="
	},
	{
		"path": "assets/useGenerateQrCode-qq9i2f73.js",
		"integrity": "sha256-qV+NlhFwGxT5B7sAdx5gkHKVBo0ZHHa0hRxmybjP5M0="
	},
	{
		"path": "assets/useGetCommerceErrorMessage-mwbe7c3i.js",
		"integrity": "sha256-SuvOWCoyWV9KpoxBjuNsQ6mInb7FN4KbqWoVz+vPAj4="
	},
	{
		"path": "assets/useGroupConversationHandlers-gavceizu.js",
		"integrity": "sha256-22C134v3tq9PPEMP3QhVnRnC4hD5KNEybHKdCDRvIOw="
	},
	{
		"path": "assets/useGuideStrings-n4ehuf4q.js",
		"integrity": "sha256-y/gddQqr3tmSpzIfHMDNvuFn5BYvD7GC689iBaoPTK4="
	},
	{
		"path": "assets/useGuideTearOff-cgtlkksg.js",
		"integrity": "sha256-8fK/7tDz43mEH1koopXIvWp999+HjOd+3n355yNckBE="
	},
	{
		"path": "assets/useIconConstraints-loy7xo6t.js",
		"integrity": "sha256-fP2ugNhluZeTXYSbE2jE7pOiyEFKSMOKli4/ZND6V5c="
	},
	{
		"path": "assets/useInitialFocusIn-jawaf05r.js",
		"integrity": "sha256-E/crq4JjZDPXcXG6IOxN6BV1CrG0r2UTpOUmE7YvvzI="
	},
	{
		"path": "assets/useIntraDialogHistory-id9u91ur.js",
		"integrity": "sha256-B/ogh8azz5k78c1ZOGZ+6Pna5MegfT2Ht9iAe1xo308="
	},
	{
		"path": "assets/useJumpPartyState-h09z0rp5.js",
		"integrity": "sha256-SPdaoF3bVBeGxTwFzMvPhgZbawfBEHbc2Mdt4XCfSKY="
	},
	{
		"path": "assets/useJumpStrings-d9pk8ps8.js",
		"integrity": "sha256-3NFO8LxEbdysFnlm1LZXxmzqpGys+KsSEE6o2zTuASc="
	},
	{
		"path": "assets/useLibraryFilterStrings-dlxionln.js",
		"integrity": "sha256-xB7Sp8txmefO3ki9KzDsIsRIjrBuyb5cp3mSua+cFts="
	},
	{
		"path": "assets/useLocation-gval357w.js",
		"integrity": "sha256-YsGHX6Mg4GHu25MU5lgiejw2Zgr831dHNQHi443lAkQ="
	},
	{
		"path": "assets/useMatchMedia-darrb7je.js",
		"integrity": "sha256-QJAcP23Q27vQV0BdhnS/Mtj4PEAXioZbnld1X7X/O2s="
	},
	{
		"path": "assets/useMicrophone-krseyn4k.js",
		"integrity": "sha256-wBN62KOofy2O45TXMhXijoE9itkr/nnNniRvXPdjVCo="
	},
	{
		"path": "assets/useMountedFetchMessages-epcotw0e.js",
		"integrity": "sha256-mOzG3T+mi7CINcW4CXo9dbCLHm5hYzD9IIZmUi/SUAc="
	},
	{
		"path": "assets/useNoLocalMultiplayerDialog-ielzaup8.js",
		"integrity": "sha256-kj2tOjssmhy5ESbH6z+7Yrd7bqWerqB3jWXyBPKCF/Q="
	},
	{
		"path": "assets/useNotificationStrings-cv1z18ke.js",
		"integrity": "sha256-r6tsmA+2vyj7aUmBU0NY9oxKSK+KKHK8Hx7GRAgZTbU="
	},
	{
		"path": "assets/useOpenExternalLink-ltd46cme.js",
		"integrity": "sha256-zJ7atuy2YBemUkbzfZLVfbCnyEtKRD5LTmcRdOBohV8="
	},
	{
		"path": "assets/usePlanPickerProps-ovsyok80.js",
		"integrity": "sha256-1txNa11pImWKVNFNvsfzVzwoSmplJ/IT8r7AbyiLOfo="
	},
	{
		"path": "assets/usePrevious-jzkclgc8.js",
		"integrity": "sha256-+ZMbUH8qMuqiSsTDsiPIfG0lARu/wo6STeH1a8Lauko="
	},
	{
		"path": "assets/usePurchaseCoreRoot-dh35i5yy.js",
		"integrity": "sha256-mhqOZxympm826jDAx8NnkeGi0wnyMFANNb6oEto5+lo="
	},
	{
		"path": "assets/useRecentsTileHandlers-bcx1swum.js",
		"integrity": "sha256-sZ8bjzVUy8CnekVTuXOBlEF6AJpeBUJI1qzxjfVy5SU="
	},
	{
		"path": "assets/useSettledRoutePrefetch-h1qjph6s.js",
		"integrity": "sha256-tTsf3g4gqPf7J5ydgzKbiUPR072u8uCcxs6wPbB9EQg="
	},
	{
		"path": "assets/useShouldUseDialogNavigation-hy13sydb.js",
		"integrity": "sha256-Fgw14BvNPP/HfXxEAMNHS8Yn+IjtUc7wFdoVfchhb1Y="
	},
	{
		"path": "assets/useSingleAchievementInfo-nh14t4z1.js",
		"integrity": "sha256-7USVZViqDvmg5MhwVbGN5C/zeNKC7bNjYRk2q+1NXXU="
	},
	{
		"path": "assets/useStartParty-ixcjwocq.js",
		"integrity": "sha256-pBIOAgJXkhq6gSKjEja1F20uSIEMJCAAvFna+KgbahE="
	},
	{
		"path": "assets/useStreamAwareSignIn-ku96et8t.js",
		"integrity": "sha256-lHO7MB9lejzR/yZ8XTz0jbUGpZIiwaWq9g1iGEiTcYk="
	},
	{
		"path": "assets/useStreamTimeLimitCountdown-jfusesci.js",
		"integrity": "sha256-uc2p4uSC2i0OFMzYlgJK/GOYhgeghH6AhUhZJU47c78="
	},
	{
		"path": "assets/useSynchronizeProductVanityUrl-5l67h3wt.js",
		"integrity": "sha256-Eou6r/ro9Tb3+DlCMfiXIH0FVSMKTa98xRI34eNopvc="
	},
	{
		"path": "assets/useTimeout-n59izuqs.js",
		"integrity": "sha256-U7PMckx9xfMtpyQAy0dOoB4YuJ+7lA8/GVBlIe2zxSA="
	},
	{
		"path": "assets/useTrackFollowInteractionEvent-nnv0gm30.js",
		"integrity": "sha256-kXf45Bu9tuFgblMQuP6EYAYV2o9aBD5pPysjQhjkQHo="
	},
	{
		"path": "assets/useTrackFriendInteractionEvent-fzu1r77v.js",
		"integrity": "sha256-K7vc8+/K0tfDUx94+bKSmj7VLPI3y8MAlrjbux6GRGc="
	},
	{
		"path": "assets/useTrackPrivacyInteractionEvent-i0bk4us8.js",
		"integrity": "sha256-txQ7TFWaKZk6E7UaMxF574Hp2n9A71QnfPJrTpU8Dm4="
	},
	{
		"path": "assets/useVirtualGridImageConstraints-lj7qukd5.js",
		"integrity": "sha256-CufVBd21m9MC1dgQsaoxslBhn0FeHOWL7HqekRwDJ6Y="
	},
	{
		"path": "assets/useWebShare-i9wdrvph.js",
		"integrity": "sha256-kpLCop+Ux6E5zFjb34z9O7dkMJPORh8JuwvoVKaZYco="
	},
	{
		"path": "assets/useWidget-nf2epnjz.js",
		"integrity": "sha256-PaPdhI0py2i14//ZHzfUboI2DRZrLgqsFnMhC9ijQG8="
	},
	{
		"path": "assets/useWidgetNavigation-os2rjdn1.js",
		"integrity": "sha256-MdXkJTkgF/z14sXXDPMLtL4nb5xQTzZ1jTWddaCQVf4="
	},
	{
		"path": "assets/utils-c8qfn4gk.js",
		"integrity": "sha256-yqYmKgkp+lYK28SDf2+WK5MWEhmIG4Bvd2NO4FTlAbs="
	},
	{
		"path": "assets/utils-e7a4w3py.js",
		"integrity": "sha256-kGrqKuxnzKxoG4VA7WD38By0L1Ti4yU74wp2Ih/CDL4="
	},
	{
		"path": "assets/utils-lvbsxthb.js",
		"integrity": "sha256-bSPGTY9vTLBOjwmJYnQXI0H1TOfrUIhKmswtlkaft7s="
	},
	{
		"path": "assets/vendor-misc-dys7qi6h.js",
		"integrity": "sha256-lFZQu/g5tlpF/02n0lcT/ML7Ga/uCt4/8FS0OH/VT/w="
	},
	{
		"path": "assets/view-transitions-nqfd5e8u.css",
		"integrity": "sha256-Ybdu6L1Y0Ojwo2gCXYBOtTgsQtcmeI+jIJrV9HDPPKY="
	},
	{
		"path": "assets/violet-hyksfpmo.js",
		"integrity": "sha256-676z4HXS2mrjI+PwTj4cv28zQ1EsGN0ROWOl69H1pYM="
	},
	{
		"path": "assets/violet-n3sxt9b2.css",
		"integrity": "sha256-A9Mc+VVBzAJTv1iG50/u/behYw2rkNgYiR4PoWdZLBw="
	},
	{
		"path": "assets/wasmvqe-ic5igkil.js",
		"integrity": "sha256-SYkiAuJifK+x3BonSNA/jtPogtXwNky8HzeUAlcj9B4="
	},
	{
		"path": "assets/welcome-o23agywh.mp4",
		"integrity": "sha256-6rIE3eGE9ZFwR+XITy6RVZIqpOYR2AuNwf02tizTIeI="
	},
	{
		"path": "assets/win10-dark-b9yjvvlk.css",
		"integrity": "sha256-Esi4sN10+YQjFylmPs1z2AhpuRs6p6l7WBhNNA8C9Tw="
	},
	{
		"path": "assets/win10-light-f18w6t1t.css",
		"integrity": "sha256-BTRW7iDFC8KCqqADvAAITAgF9+MrXLpgpk806W3OmgQ="
	},
	{
		"path": "assets/win11-aquatic-d3vrf3o4.css",
		"integrity": "sha256-GSo8ZhzBdBCX46smxVc43R5wiBV8UDbHYAm/FVaAmjc="
	},
	{
		"path": "assets/win11-desert-gywnoyns.css",
		"integrity": "sha256-JDu+hMneHrPI+cmCiVGrTDv77Saq7xex27CJuB5JGOU="
	},
	{
		"path": "assets/win11-dusk-dos17bef.css",
		"integrity": "sha256-Urfi/pgl6TMyLaH9zkHGF/96sG5ertc69oG3fpb3kz8="
	},
	{
		"path": "assets/win11-night-sky-dydzexuy.css",
		"integrity": "sha256-U/sIgG2/SbfGznxWQtpDllZtdAsGZriTGw050a/6Y1o="
	},
	{
		"path": "assets/withLogicalMotion-dbrcj2vj.js",
		"integrity": "sha256-cmPh6Mlx5dobq42O76qd9OKfC4/cbSwm0D+CsJn0mcA="
	},
	{
		"path": "assets/withName-npfn486g.js",
		"integrity": "sha256-JmhGUyCTMwgxSuUZK61nbUFZBMtdLlrrB6PqzIk2nZw="
	},
	{
		"path": "assets/workspace-leaf-files-oergw4h0.js",
		"integrity": "sha256-LQ+4V1IrMxKsXU/DCUXcRoKgHbemS0n8WFyjv+DiA38="
	},
	{
		"path": "assets/xbox-com-tvsetup-qr-gwzuqyhu.png",
		"integrity": "sha256-jZLAGgle0zWZzq3ReZcZp2Q/1NQ40nW7qizBs0Hs0mg="
	},
	{
		"path": "assets/xds-icons-m106f2fc.js",
		"integrity": "sha256-DFrR+9QALwNxCbKrrQskQPkFWBgO6fdqi00etb4AiRM="
	},
	{
		"path": "assets/xds-react-components-ihgca01z.js",
		"integrity": "sha256-0QGX4j7PeLKq70YGQc0UnuA0fxy752Df8PG3n7ZEKQ4="
	},
	{
		"path": "assets/yellow-iwpx7bzw.js",
		"integrity": "sha256-q0mVBc867wg5PEERkx+if3GFd/dwhafMRi+yEnspJ6A="
	},
	{
		"path": "assets/yellow-l3jiq976.css",
		"integrity": "sha256-CKac+gJj2e6afYf4umZPhEgFlGVKZU0UzYiHxnBHrq0="
	},
	{
		"path": "_external/child-window/index.html",
		"integrity": "sha256-DYhGiCPiI3+wcG4I+yy6Py7AyU4hrAUS7HFPPQlYIHE="
	},
	{
		"path": "_external/init/index.html",
		"integrity": "sha256-9TL3gMp6LKttxMRRwVVXD9btH+B5NvVaAMqKDKyb8xk="
	}
];
//#endregion
//#region ../../node_modules/workbox-core/_version.js
try {
	self["workbox:core:7.2.0"] && _();
} catch (e) {}
//#endregion
//#region ../../node_modules/workbox-core/models/messages/messageGenerator.js
var fallback = (code, ...args) => {
	let msg = code;
	if (args.length > 0) msg += ` :: ${JSON.stringify(args)}`;
	return msg;
};
var messageGenerator = fallback;
//#endregion
//#region ../../node_modules/workbox-core/_private/WorkboxError.js
/**
* Workbox errors should be thrown with this class.
* This allows use to ensure the type easily in tests,
* helps developers identify errors from workbox
* easily and allows use to optimise error
* messages correctly.
*
* @private
*/
var WorkboxError = class extends Error {
	/**
	*
	* @param {string} errorCode The error code that
	* identifies this particular error.
	* @param {Object=} details Any relevant arguments
	* that will help developers identify issues should
	* be added as a key on the context object.
	*/
	constructor(errorCode, details) {
		const message = messageGenerator(errorCode, details);
		super(message);
		this.name = errorCode;
		this.details = details;
	}
};
//#endregion
//#region ../../node_modules/workbox-core/_private/getFriendlyURL.js
var getFriendlyURL = (url) => {
	return new URL(String(url), location.href).href.replace(new RegExp(`^${location.origin}`), "");
};
//#endregion
//#region ../../node_modules/workbox-cacheable-response/_version.js
try {
	self["workbox:cacheable-response:7.2.0"] && _();
} catch (e) {}
//#endregion
//#region ../../node_modules/workbox-cacheable-response/CacheableResponse.js
/**
* This class allows you to set up rules determining what
* status codes and/or headers need to be present in order for a
* [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response)
* to be considered cacheable.
*
* @memberof workbox-cacheable-response
*/
var CacheableResponse = class {
	/**
	* To construct a new CacheableResponse instance you must provide at least
	* one of the `config` properties.
	*
	* If both `statuses` and `headers` are specified, then both conditions must
	* be met for the `Response` to be considered cacheable.
	*
	* @param {Object} config
	* @param {Array<number>} [config.statuses] One or more status codes that a
	* `Response` can have and be considered cacheable.
	* @param {Object<string,string>} [config.headers] A mapping of header names
	* and expected values that a `Response` can have and be considered cacheable.
	* If multiple headers are provided, only one needs to be present.
	*/
	constructor(config = {}) {
		this._statuses = config.statuses;
		this._headers = config.headers;
	}
	/**
	* Checks a response to see whether it's cacheable or not, based on this
	* object's configuration.
	*
	* @param {Response} response The response whose cacheability is being
	* checked.
	* @return {boolean} `true` if the `Response` is cacheable, and `false`
	* otherwise.
	*/
	isResponseCacheable(response) {
		let cacheable = true;
		if (this._statuses) cacheable = this._statuses.includes(response.status);
		if (this._headers && cacheable) cacheable = Object.keys(this._headers).some((headerName) => {
			return response.headers.get(headerName) === this._headers[headerName];
		});
		return cacheable;
	}
};
//#endregion
//#region ../../node_modules/workbox-cacheable-response/CacheableResponsePlugin.js
/**
* A class implementing the `cacheWillUpdate` lifecycle callback. This makes it
* easier to add in cacheability checks to requests made via Workbox's built-in
* strategies.
*
* @memberof workbox-cacheable-response
*/
var CacheableResponsePlugin = class {
	/**
	* To construct a new CacheableResponsePlugin instance you must provide at
	* least one of the `config` properties.
	*
	* If both `statuses` and `headers` are specified, then both conditions must
	* be met for the `Response` to be considered cacheable.
	*
	* @param {Object} config
	* @param {Array<number>} [config.statuses] One or more status codes that a
	* `Response` can have and be considered cacheable.
	* @param {Object<string,string>} [config.headers] A mapping of header names
	* and expected values that a `Response` can have and be considered cacheable.
	* If multiple headers are provided, only one needs to be present.
	*/
	constructor(config) {
		/**
		* @param {Object} options
		* @param {Response} options.response
		* @return {Response|null}
		* @private
		*/
		this.cacheWillUpdate = async ({ response }) => {
			if (this._cacheableResponse.isResponseCacheable(response)) return response;
			return null;
		};
		this._cacheableResponse = new CacheableResponse(config);
	}
};
//#endregion
//#region ../../node_modules/workbox-core/_private/dontWaitFor.js
/**
* A helper function that prevents a promise from being flagged as unused.
*
* @private
**/
function dontWaitFor(promise) {
	promise.then(() => {});
}
//#endregion
//#region ../../node_modules/workbox-expiration/node_modules/idb/build/wrap-idb-value.js
var instanceOfAny = (object, constructors) => constructors.some((c) => object instanceof c);
var idbProxyableTypes;
var cursorAdvanceMethods;
function getIdbProxyableTypes() {
	return idbProxyableTypes || (idbProxyableTypes = [
		IDBDatabase,
		IDBObjectStore,
		IDBIndex,
		IDBCursor,
		IDBTransaction
	]);
}
function getCursorAdvanceMethods() {
	return cursorAdvanceMethods || (cursorAdvanceMethods = [
		IDBCursor.prototype.advance,
		IDBCursor.prototype.continue,
		IDBCursor.prototype.continuePrimaryKey
	]);
}
var cursorRequestMap = /* @__PURE__ */ new WeakMap();
var transactionDoneMap = /* @__PURE__ */ new WeakMap();
var transactionStoreNamesMap = /* @__PURE__ */ new WeakMap();
var transformCache = /* @__PURE__ */ new WeakMap();
var reverseTransformCache = /* @__PURE__ */ new WeakMap();
function promisifyRequest(request) {
	const promise = new Promise((resolve, reject) => {
		const unlisten = () => {
			request.removeEventListener("success", success);
			request.removeEventListener("error", error);
		};
		const success = () => {
			resolve(wrap(request.result));
			unlisten();
		};
		const error = () => {
			reject(request.error);
			unlisten();
		};
		request.addEventListener("success", success);
		request.addEventListener("error", error);
	});
	promise.then((value) => {
		if (value instanceof IDBCursor) cursorRequestMap.set(value, request);
	}).catch(() => {});
	reverseTransformCache.set(promise, request);
	return promise;
}
function cacheDonePromiseForTransaction(tx) {
	if (transactionDoneMap.has(tx)) return;
	const done = new Promise((resolve, reject) => {
		const unlisten = () => {
			tx.removeEventListener("complete", complete);
			tx.removeEventListener("error", error);
			tx.removeEventListener("abort", error);
		};
		const complete = () => {
			resolve();
			unlisten();
		};
		const error = () => {
			reject(tx.error || new DOMException("AbortError", "AbortError"));
			unlisten();
		};
		tx.addEventListener("complete", complete);
		tx.addEventListener("error", error);
		tx.addEventListener("abort", error);
	});
	transactionDoneMap.set(tx, done);
}
var idbProxyTraps = {
	get(target, prop, receiver) {
		if (target instanceof IDBTransaction) {
			if (prop === "done") return transactionDoneMap.get(target);
			if (prop === "objectStoreNames") return target.objectStoreNames || transactionStoreNamesMap.get(target);
			if (prop === "store") return receiver.objectStoreNames[1] ? void 0 : receiver.objectStore(receiver.objectStoreNames[0]);
		}
		return wrap(target[prop]);
	},
	set(target, prop, value) {
		target[prop] = value;
		return true;
	},
	has(target, prop) {
		if (target instanceof IDBTransaction && (prop === "done" || prop === "store")) return true;
		return prop in target;
	}
};
function replaceTraps(callback) {
	idbProxyTraps = callback(idbProxyTraps);
}
function wrapFunction(func) {
	if (func === IDBDatabase.prototype.transaction && !("objectStoreNames" in IDBTransaction.prototype)) return function(storeNames, ...args) {
		const tx = func.call(unwrap(this), storeNames, ...args);
		transactionStoreNamesMap.set(tx, storeNames.sort ? storeNames.sort() : [storeNames]);
		return wrap(tx);
	};
	if (getCursorAdvanceMethods().includes(func)) return function(...args) {
		func.apply(unwrap(this), args);
		return wrap(cursorRequestMap.get(this));
	};
	return function(...args) {
		return wrap(func.apply(unwrap(this), args));
	};
}
function transformCachableValue(value) {
	if (typeof value === "function") return wrapFunction(value);
	if (value instanceof IDBTransaction) cacheDonePromiseForTransaction(value);
	if (instanceOfAny(value, getIdbProxyableTypes())) return new Proxy(value, idbProxyTraps);
	return value;
}
function wrap(value) {
	if (value instanceof IDBRequest) return promisifyRequest(value);
	if (transformCache.has(value)) return transformCache.get(value);
	const newValue = transformCachableValue(value);
	if (newValue !== value) {
		transformCache.set(value, newValue);
		reverseTransformCache.set(newValue, value);
	}
	return newValue;
}
var unwrap = (value) => reverseTransformCache.get(value);
//#endregion
//#region ../../node_modules/workbox-expiration/node_modules/idb/build/index.js
/**
* Open a database.
*
* @param name Name of the database.
* @param version Schema version.
* @param callbacks Additional callbacks.
*/
function openDB(name, version, { blocked, upgrade, blocking, terminated } = {}) {
	const request = indexedDB.open(name, version);
	const openPromise = wrap(request);
	if (upgrade) request.addEventListener("upgradeneeded", (event) => {
		upgrade(wrap(request.result), event.oldVersion, event.newVersion, wrap(request.transaction), event);
	});
	if (blocked) request.addEventListener("blocked", (event) => blocked(event.oldVersion, event.newVersion, event));
	openPromise.then((db) => {
		if (terminated) db.addEventListener("close", () => terminated());
		if (blocking) db.addEventListener("versionchange", (event) => blocking(event.oldVersion, event.newVersion, event));
	}).catch(() => {});
	return openPromise;
}
/**
* Delete a database.
*
* @param name Name of the database.
*/
function deleteDB(name, { blocked } = {}) {
	const request = indexedDB.deleteDatabase(name);
	if (blocked) request.addEventListener("blocked", (event) => blocked(event.oldVersion, event));
	return wrap(request).then(() => void 0);
}
var readMethods = [
	"get",
	"getKey",
	"getAll",
	"getAllKeys",
	"count"
];
var writeMethods = [
	"put",
	"add",
	"delete",
	"clear"
];
var cachedMethods = /* @__PURE__ */ new Map();
function getMethod(target, prop) {
	if (!(target instanceof IDBDatabase && !(prop in target) && typeof prop === "string")) return;
	if (cachedMethods.get(prop)) return cachedMethods.get(prop);
	const targetFuncName = prop.replace(/FromIndex$/, "");
	const useIndex = prop !== targetFuncName;
	const isWrite = writeMethods.includes(targetFuncName);
	if (!(targetFuncName in (useIndex ? IDBIndex : IDBObjectStore).prototype) || !(isWrite || readMethods.includes(targetFuncName))) return;
	const method = async function(storeName, ...args) {
		const tx = this.transaction(storeName, isWrite ? "readwrite" : "readonly");
		let target = tx.store;
		if (useIndex) target = target.index(args.shift());
		return (await Promise.all([target[targetFuncName](...args), isWrite && tx.done]))[0];
	};
	cachedMethods.set(prop, method);
	return method;
}
replaceTraps((oldTraps) => ({
	...oldTraps,
	get: (target, prop, receiver) => getMethod(target, prop) || oldTraps.get(target, prop, receiver),
	has: (target, prop) => !!getMethod(target, prop) || oldTraps.has(target, prop)
}));
//#endregion
//#region ../../node_modules/workbox-expiration/_version.js
try {
	self["workbox:expiration:7.2.0"] && _();
} catch (e) {}
//#endregion
//#region ../../node_modules/workbox-expiration/models/CacheTimestampsModel.js
var DB_NAME = "workbox-expiration";
var CACHE_OBJECT_STORE = "cache-entries";
var normalizeURL = (unNormalizedUrl) => {
	const url = new URL(unNormalizedUrl, location.href);
	url.hash = "";
	return url.href;
};
/**
* Returns the timestamp model.
*
* @private
*/
var CacheTimestampsModel = class {
	/**
	*
	* @param {string} cacheName
	*
	* @private
	*/
	constructor(cacheName) {
		this._db = null;
		this._cacheName = cacheName;
	}
	/**
	* Performs an upgrade of indexedDB.
	*
	* @param {IDBPDatabase<CacheDbSchema>} db
	*
	* @private
	*/
	_upgradeDb(db) {
		const objStore = db.createObjectStore(CACHE_OBJECT_STORE, { keyPath: "id" });
		objStore.createIndex("cacheName", "cacheName", { unique: false });
		objStore.createIndex("timestamp", "timestamp", { unique: false });
	}
	/**
	* Performs an upgrade of indexedDB and deletes deprecated DBs.
	*
	* @param {IDBPDatabase<CacheDbSchema>} db
	*
	* @private
	*/
	_upgradeDbAndDeleteOldDbs(db) {
		this._upgradeDb(db);
		if (this._cacheName) deleteDB(this._cacheName);
	}
	/**
	* @param {string} url
	* @param {number} timestamp
	*
	* @private
	*/
	async setTimestamp(url, timestamp) {
		url = normalizeURL(url);
		const entry = {
			url,
			timestamp,
			cacheName: this._cacheName,
			id: this._getId(url)
		};
		const tx = (await this.getDb()).transaction(CACHE_OBJECT_STORE, "readwrite", { durability: "relaxed" });
		await tx.store.put(entry);
		await tx.done;
	}
	/**
	* Returns the timestamp stored for a given URL.
	*
	* @param {string} url
	* @return {number | undefined}
	*
	* @private
	*/
	async getTimestamp(url) {
		const entry = await (await this.getDb()).get(CACHE_OBJECT_STORE, this._getId(url));
		return entry === null || entry === void 0 ? void 0 : entry.timestamp;
	}
	/**
	* Iterates through all the entries in the object store (from newest to
	* oldest) and removes entries once either `maxCount` is reached or the
	* entry's timestamp is less than `minTimestamp`.
	*
	* @param {number} minTimestamp
	* @param {number} maxCount
	* @return {Array<string>}
	*
	* @private
	*/
	async expireEntries(minTimestamp, maxCount) {
		const db = await this.getDb();
		let cursor = await db.transaction(CACHE_OBJECT_STORE).store.index("timestamp").openCursor(null, "prev");
		const entriesToDelete = [];
		let entriesNotDeletedCount = 0;
		while (cursor) {
			const result = cursor.value;
			if (result.cacheName === this._cacheName) if (minTimestamp && result.timestamp < minTimestamp || maxCount && entriesNotDeletedCount >= maxCount) entriesToDelete.push(cursor.value);
			else entriesNotDeletedCount++;
			cursor = await cursor.continue();
		}
		const urlsDeleted = [];
		for (const entry of entriesToDelete) {
			await db.delete(CACHE_OBJECT_STORE, entry.id);
			urlsDeleted.push(entry.url);
		}
		return urlsDeleted;
	}
	/**
	* Takes a URL and returns an ID that will be unique in the object store.
	*
	* @param {string} url
	* @return {string}
	*
	* @private
	*/
	_getId(url) {
		return this._cacheName + "|" + normalizeURL(url);
	}
	/**
	* Returns an open connection to the database.
	*
	* @private
	*/
	async getDb() {
		if (!this._db) this._db = await openDB(DB_NAME, 1, { upgrade: this._upgradeDbAndDeleteOldDbs.bind(this) });
		return this._db;
	}
};
//#endregion
//#region ../../node_modules/workbox-expiration/CacheExpiration.js
/**
* The `CacheExpiration` class allows you define an expiration and / or
* limit on the number of responses stored in a
* [`Cache`](https://developer.mozilla.org/en-US/docs/Web/API/Cache).
*
* @memberof workbox-expiration
*/
var CacheExpiration = class {
	/**
	* To construct a new CacheExpiration instance you must provide at least
	* one of the `config` properties.
	*
	* @param {string} cacheName Name of the cache to apply restrictions to.
	* @param {Object} config
	* @param {number} [config.maxEntries] The maximum number of entries to cache.
	* Entries used the least will be removed as the maximum is reached.
	* @param {number} [config.maxAgeSeconds] The maximum age of an entry before
	* it's treated as stale and removed.
	* @param {Object} [config.matchOptions] The [`CacheQueryOptions`](https://developer.mozilla.org/en-US/docs/Web/API/Cache/delete#Parameters)
	* that will be used when calling `delete()` on the cache.
	*/
	constructor(cacheName, config = {}) {
		this._isRunning = false;
		this._rerunRequested = false;
		this._maxEntries = config.maxEntries;
		this._maxAgeSeconds = config.maxAgeSeconds;
		this._matchOptions = config.matchOptions;
		this._cacheName = cacheName;
		this._timestampModel = new CacheTimestampsModel(cacheName);
	}
	/**
	* Expires entries for the given cache and given criteria.
	*/
	async expireEntries() {
		if (this._isRunning) {
			this._rerunRequested = true;
			return;
		}
		this._isRunning = true;
		const minTimestamp = this._maxAgeSeconds ? Date.now() - this._maxAgeSeconds * 1e3 : 0;
		const urlsExpired = await this._timestampModel.expireEntries(minTimestamp, this._maxEntries);
		const cache = await self.caches.open(this._cacheName);
		for (const url of urlsExpired) await cache.delete(url, this._matchOptions);
		this._isRunning = false;
		if (this._rerunRequested) {
			this._rerunRequested = false;
			dontWaitFor(this.expireEntries());
		}
	}
	/**
	* Update the timestamp for the given URL. This ensures the when
	* removing entries based on maximum entries, most recently used
	* is accurate or when expiring, the timestamp is up-to-date.
	*
	* @param {string} url
	*/
	async updateTimestamp(url) {
		await this._timestampModel.setTimestamp(url, Date.now());
	}
	/**
	* Can be used to check if a URL has expired or not before it's used.
	*
	* This requires a look up from IndexedDB, so can be slow.
	*
	* Note: This method will not remove the cached entry, call
	* `expireEntries()` to remove indexedDB and Cache entries.
	*
	* @param {string} url
	* @return {boolean}
	*/
	async isURLExpired(url) {
		if (!this._maxAgeSeconds) return false;
		else {
			const timestamp = await this._timestampModel.getTimestamp(url);
			const expireOlderThan = Date.now() - this._maxAgeSeconds * 1e3;
			return timestamp !== void 0 ? timestamp < expireOlderThan : true;
		}
	}
	/**
	* Removes the IndexedDB object store used to keep track of cache expiration
	* metadata.
	*/
	async delete() {
		this._rerunRequested = false;
		await this._timestampModel.expireEntries(Infinity);
	}
};
//#endregion
//#region ../../node_modules/workbox-core/_private/cacheNames.js
var _cacheNameDetails = {
	googleAnalytics: "googleAnalytics",
	precache: "precache-v2",
	prefix: "workbox",
	runtime: "runtime",
	suffix: typeof registration !== "undefined" ? registration.scope : ""
};
var _createCacheName = (cacheName) => {
	return [
		_cacheNameDetails.prefix,
		cacheName,
		_cacheNameDetails.suffix
	].filter((value) => value && value.length > 0).join("-");
};
var eachCacheNameDetail = (fn) => {
	for (const key of Object.keys(_cacheNameDetails)) fn(key);
};
var cacheNames = {
	updateDetails: (details) => {
		eachCacheNameDetail((key) => {
			if (typeof details[key] === "string") _cacheNameDetails[key] = details[key];
		});
	},
	getGoogleAnalyticsName: (userCacheName) => {
		return userCacheName || _createCacheName(_cacheNameDetails.googleAnalytics);
	},
	getPrecacheName: (userCacheName) => {
		return userCacheName || _createCacheName(_cacheNameDetails.precache);
	},
	getPrefix: () => {
		return _cacheNameDetails.prefix;
	},
	getRuntimeName: (userCacheName) => {
		return userCacheName || _createCacheName(_cacheNameDetails.runtime);
	},
	getSuffix: () => {
		return _cacheNameDetails.suffix;
	}
};
//#endregion
//#region ../../node_modules/workbox-core/models/quotaErrorCallbacks.js
var quotaErrorCallbacks = /* @__PURE__ */ new Set();
//#endregion
//#region ../../node_modules/workbox-core/registerQuotaErrorCallback.js
/**
* Adds a function to the set of quotaErrorCallbacks that will be executed if
* there's a quota error.
*
* @param {Function} callback
* @memberof workbox-core
*/
function registerQuotaErrorCallback(callback) {
	quotaErrorCallbacks.add(callback);
}
//#endregion
//#region ../../node_modules/workbox-expiration/ExpirationPlugin.js
/**
* This plugin can be used in a `workbox-strategy` to regularly enforce a
* limit on the age and / or the number of cached requests.
*
* It can only be used with `workbox-strategy` instances that have a
* [custom `cacheName` property set](/web/tools/workbox/guides/configure-workbox#custom_cache_names_in_strategies).
* In other words, it can't be used to expire entries in strategy that uses the
* default runtime cache name.
*
* Whenever a cached response is used or updated, this plugin will look
* at the associated cache and remove any old or extra responses.
*
* When using `maxAgeSeconds`, responses may be used *once* after expiring
* because the expiration clean up will not have occurred until *after* the
* cached response has been used. If the response has a "Date" header, then
* a light weight expiration check is performed and the response will not be
* used immediately.
*
* When using `maxEntries`, the entry least-recently requested will be removed
* from the cache first.
*
* @memberof workbox-expiration
*/
var ExpirationPlugin = class {
	/**
	* @param {ExpirationPluginOptions} config
	* @param {number} [config.maxEntries] The maximum number of entries to cache.
	* Entries used the least will be removed as the maximum is reached.
	* @param {number} [config.maxAgeSeconds] The maximum age of an entry before
	* it's treated as stale and removed.
	* @param {Object} [config.matchOptions] The [`CacheQueryOptions`](https://developer.mozilla.org/en-US/docs/Web/API/Cache/delete#Parameters)
	* that will be used when calling `delete()` on the cache.
	* @param {boolean} [config.purgeOnQuotaError] Whether to opt this cache in to
	* automatic deletion if the available storage quota has been exceeded.
	*/
	constructor(config = {}) {
		/**
		* A "lifecycle" callback that will be triggered automatically by the
		* `workbox-strategies` handlers when a `Response` is about to be returned
		* from a [Cache](https://developer.mozilla.org/en-US/docs/Web/API/Cache) to
		* the handler. It allows the `Response` to be inspected for freshness and
		* prevents it from being used if the `Response`'s `Date` header value is
		* older than the configured `maxAgeSeconds`.
		*
		* @param {Object} options
		* @param {string} options.cacheName Name of the cache the response is in.
		* @param {Response} options.cachedResponse The `Response` object that's been
		*     read from a cache and whose freshness should be checked.
		* @return {Response} Either the `cachedResponse`, if it's
		*     fresh, or `null` if the `Response` is older than `maxAgeSeconds`.
		*
		* @private
		*/
		this.cachedResponseWillBeUsed = async ({ event, request, cacheName, cachedResponse }) => {
			if (!cachedResponse) return null;
			const isFresh = this._isResponseDateFresh(cachedResponse);
			const cacheExpiration = this._getCacheExpiration(cacheName);
			dontWaitFor(cacheExpiration.expireEntries());
			const updateTimestampDone = cacheExpiration.updateTimestamp(request.url);
			if (event) try {
				event.waitUntil(updateTimestampDone);
			} catch (error) {}
			return isFresh ? cachedResponse : null;
		};
		/**
		* A "lifecycle" callback that will be triggered automatically by the
		* `workbox-strategies` handlers when an entry is added to a cache.
		*
		* @param {Object} options
		* @param {string} options.cacheName Name of the cache that was updated.
		* @param {string} options.request The Request for the cached entry.
		*
		* @private
		*/
		this.cacheDidUpdate = async ({ cacheName, request }) => {
			const cacheExpiration = this._getCacheExpiration(cacheName);
			await cacheExpiration.updateTimestamp(request.url);
			await cacheExpiration.expireEntries();
		};
		this._config = config;
		this._maxAgeSeconds = config.maxAgeSeconds;
		this._cacheExpirations = /* @__PURE__ */ new Map();
		if (config.purgeOnQuotaError) registerQuotaErrorCallback(() => this.deleteCacheAndMetadata());
	}
	/**
	* A simple helper method to return a CacheExpiration instance for a given
	* cache name.
	*
	* @param {string} cacheName
	* @return {CacheExpiration}
	*
	* @private
	*/
	_getCacheExpiration(cacheName) {
		if (cacheName === cacheNames.getRuntimeName()) throw new WorkboxError("expire-custom-caches-only");
		let cacheExpiration = this._cacheExpirations.get(cacheName);
		if (!cacheExpiration) {
			cacheExpiration = new CacheExpiration(cacheName, this._config);
			this._cacheExpirations.set(cacheName, cacheExpiration);
		}
		return cacheExpiration;
	}
	/**
	* @param {Response} cachedResponse
	* @return {boolean}
	*
	* @private
	*/
	_isResponseDateFresh(cachedResponse) {
		if (!this._maxAgeSeconds) return true;
		const dateHeaderTimestamp = this._getDateHeaderTimestamp(cachedResponse);
		if (dateHeaderTimestamp === null) return true;
		return dateHeaderTimestamp >= Date.now() - this._maxAgeSeconds * 1e3;
	}
	/**
	* This method will extract the data header and parse it into a useful
	* value.
	*
	* @param {Response} cachedResponse
	* @return {number|null}
	*
	* @private
	*/
	_getDateHeaderTimestamp(cachedResponse) {
		if (!cachedResponse.headers.has("date")) return null;
		const dateHeader = cachedResponse.headers.get("date");
		const headerTime = new Date(dateHeader).getTime();
		if (isNaN(headerTime)) return null;
		return headerTime;
	}
	/**
	* This is a helper method that performs two operations:
	*
	* - Deletes *all* the underlying Cache instances associated with this plugin
	* instance, by calling caches.delete() on your behalf.
	* - Deletes the metadata from IndexedDB used to keep track of expiration
	* details for each Cache instance.
	*
	* When using cache expiration, calling this method is preferable to calling
	* `caches.delete()` directly, since this will ensure that the IndexedDB
	* metadata is also cleanly removed and open IndexedDB instances are deleted.
	*
	* Note that if you're *not* using cache expiration for a given cache, calling
	* `caches.delete()` and passing in the cache's name should be sufficient.
	* There is no Workbox-specific method needed for cleanup in that case.
	*/
	async deleteCacheAndMetadata() {
		for (const [cacheName, cacheExpiration] of this._cacheExpirations) {
			await self.caches.delete(cacheName);
			await cacheExpiration.delete();
		}
		this._cacheExpirations = /* @__PURE__ */ new Map();
	}
};
//#endregion
//#region ../../node_modules/workbox-routing/_version.js
try {
	self["workbox:routing:7.2.0"] && _();
} catch (e) {}
//#endregion
//#region ../../node_modules/workbox-routing/utils/normalizeHandler.js
/**
* @param {function()|Object} handler Either a function, or an object with a
* 'handle' method.
* @return {Object} An object with a handle method.
*
* @private
*/
var normalizeHandler = (handler) => {
	if (handler && typeof handler === "object") return handler;
	else return { handle: handler };
};
//#endregion
//#region ../../node_modules/workbox-routing/Route.js
/**
* A `Route` consists of a pair of callback functions, "match" and "handler".
* The "match" callback determine if a route should be used to "handle" a
* request by returning a non-falsy value if it can. The "handler" callback
* is called when there is a match and should return a Promise that resolves
* to a `Response`.
*
* @memberof workbox-routing
*/
var Route = class {
	/**
	* Constructor for Route class.
	*
	* @param {workbox-routing~matchCallback} match
	* A callback function that determines whether the route matches a given
	* `fetch` event by returning a non-falsy value.
	* @param {workbox-routing~handlerCallback} handler A callback
	* function that returns a Promise resolving to a Response.
	* @param {string} [method='GET'] The HTTP method to match the Route
	* against.
	*/
	constructor(match, handler, method = "GET") {
		this.handler = normalizeHandler(handler);
		this.match = match;
		this.method = method;
	}
	/**
	*
	* @param {workbox-routing-handlerCallback} handler A callback
	* function that returns a Promise resolving to a Response
	*/
	setCatchHandler(handler) {
		this.catchHandler = normalizeHandler(handler);
	}
};
//#endregion
//#region ../../node_modules/workbox-routing/RegExpRoute.js
/**
* RegExpRoute makes it easy to create a regular expression based
* {@link workbox-routing.Route}.
*
* For same-origin requests the RegExp only needs to match part of the URL. For
* requests against third-party servers, you must define a RegExp that matches
* the start of the URL.
*
* @memberof workbox-routing
* @extends workbox-routing.Route
*/
var RegExpRoute = class extends Route {
	/**
	* If the regular expression contains
	* [capture groups]{@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#grouping-back-references},
	* the captured values will be passed to the
	* {@link workbox-routing~handlerCallback} `params`
	* argument.
	*
	* @param {RegExp} regExp The regular expression to match against URLs.
	* @param {workbox-routing~handlerCallback} handler A callback
	* function that returns a Promise resulting in a Response.
	* @param {string} [method='GET'] The HTTP method to match the Route
	* against.
	*/
	constructor(regExp, handler, method) {
		const match = ({ url }) => {
			const result = regExp.exec(url.href);
			if (!result) return;
			if (url.origin !== location.origin && result.index !== 0) return;
			return result.slice(1);
		};
		super(match, handler, method);
	}
};
//#endregion
//#region ../../node_modules/workbox-routing/Router.js
/**
* The Router can be used to process a `FetchEvent` using one or more
* {@link workbox-routing.Route}, responding with a `Response` if
* a matching route exists.
*
* If no route matches a given a request, the Router will use a "default"
* handler if one is defined.
*
* Should the matching Route throw an error, the Router will use a "catch"
* handler if one is defined to gracefully deal with issues and respond with a
* Request.
*
* If a request matches multiple routes, the **earliest** registered route will
* be used to respond to the request.
*
* @memberof workbox-routing
*/
var Router = class {
	/**
	* Initializes a new Router.
	*/
	constructor() {
		this._routes = /* @__PURE__ */ new Map();
		this._defaultHandlerMap = /* @__PURE__ */ new Map();
	}
	/**
	* @return {Map<string, Array<workbox-routing.Route>>} routes A `Map` of HTTP
	* method name ('GET', etc.) to an array of all the corresponding `Route`
	* instances that are registered.
	*/
	get routes() {
		return this._routes;
	}
	/**
	* Adds a fetch event listener to respond to events when a route matches
	* the event's request.
	*/
	addFetchListener() {
		self.addEventListener("fetch", ((event) => {
			const { request } = event;
			const responsePromise = this.handleRequest({
				request,
				event
			});
			if (responsePromise) event.respondWith(responsePromise);
		}));
	}
	/**
	* Adds a message event listener for URLs to cache from the window.
	* This is useful to cache resources loaded on the page prior to when the
	* service worker started controlling it.
	*
	* The format of the message data sent from the window should be as follows.
	* Where the `urlsToCache` array may consist of URL strings or an array of
	* URL string + `requestInit` object (the same as you'd pass to `fetch()`).
	*
	* ```
	* {
	*   type: 'CACHE_URLS',
	*   payload: {
	*     urlsToCache: [
	*       './script1.js',
	*       './script2.js',
	*       ['./script3.js', {mode: 'no-cors'}],
	*     ],
	*   },
	* }
	* ```
	*/
	addCacheListener() {
		self.addEventListener("message", ((event) => {
			if (event.data && event.data.type === "CACHE_URLS") {
				const { payload } = event.data;
				const requestPromises = Promise.all(payload.urlsToCache.map((entry) => {
					if (typeof entry === "string") entry = [entry];
					const request = new Request(...entry);
					return this.handleRequest({
						request,
						event
					});
				}));
				event.waitUntil(requestPromises);
				if (event.ports && event.ports[0]) requestPromises.then(() => event.ports[0].postMessage(true));
			}
		}));
	}
	/**
	* Apply the routing rules to a FetchEvent object to get a Response from an
	* appropriate Route's handler.
	*
	* @param {Object} options
	* @param {Request} options.request The request to handle.
	* @param {ExtendableEvent} options.event The event that triggered the
	*     request.
	* @return {Promise<Response>|undefined} A promise is returned if a
	*     registered route can handle the request. If there is no matching
	*     route and there's no `defaultHandler`, `undefined` is returned.
	*/
	handleRequest({ request, event }) {
		const url = new URL(request.url, location.href);
		if (!url.protocol.startsWith("http")) return;
		const sameOrigin = url.origin === location.origin;
		const { params, route } = this.findMatchingRoute({
			event,
			request,
			sameOrigin,
			url
		});
		let handler = route && route.handler;
		const method = request.method;
		if (!handler && this._defaultHandlerMap.has(method)) handler = this._defaultHandlerMap.get(method);
		if (!handler) return;
		let responsePromise;
		try {
			responsePromise = handler.handle({
				url,
				request,
				event,
				params
			});
		} catch (err) {
			responsePromise = Promise.reject(err);
		}
		const catchHandler = route && route.catchHandler;
		if (responsePromise instanceof Promise && (this._catchHandler || catchHandler)) responsePromise = responsePromise.catch(async (err) => {
			if (catchHandler) try {
				return await catchHandler.handle({
					url,
					request,
					event,
					params
				});
			} catch (catchErr) {
				if (catchErr instanceof Error) err = catchErr;
			}
			if (this._catchHandler) return this._catchHandler.handle({
				url,
				request,
				event
			});
			throw err;
		});
		return responsePromise;
	}
	/**
	* Checks a request and URL (and optionally an event) against the list of
	* registered routes, and if there's a match, returns the corresponding
	* route along with any params generated by the match.
	*
	* @param {Object} options
	* @param {URL} options.url
	* @param {boolean} options.sameOrigin The result of comparing `url.origin`
	*     against the current origin.
	* @param {Request} options.request The request to match.
	* @param {Event} options.event The corresponding event.
	* @return {Object} An object with `route` and `params` properties.
	*     They are populated if a matching route was found or `undefined`
	*     otherwise.
	*/
	findMatchingRoute({ url, sameOrigin, request, event }) {
		const routes = this._routes.get(request.method) || [];
		for (const route of routes) {
			let params;
			const matchResult = route.match({
				url,
				sameOrigin,
				request,
				event
			});
			if (matchResult) {
				params = matchResult;
				if (Array.isArray(params) && params.length === 0) params = void 0;
				else if (matchResult.constructor === Object && Object.keys(matchResult).length === 0) params = void 0;
				else if (typeof matchResult === "boolean") params = void 0;
				return {
					route,
					params
				};
			}
		}
		return {};
	}
	/**
	* Define a default `handler` that's called when no routes explicitly
	* match the incoming request.
	*
	* Each HTTP method ('GET', 'POST', etc.) gets its own default handler.
	*
	* Without a default handler, unmatched requests will go against the
	* network as if there were no service worker present.
	*
	* @param {workbox-routing~handlerCallback} handler A callback
	* function that returns a Promise resulting in a Response.
	* @param {string} [method='GET'] The HTTP method to associate with this
	* default handler. Each method has its own default.
	*/
	setDefaultHandler(handler, method = "GET") {
		this._defaultHandlerMap.set(method, normalizeHandler(handler));
	}
	/**
	* If a Route throws an error while handling a request, this `handler`
	* will be called and given a chance to provide a response.
	*
	* @param {workbox-routing~handlerCallback} handler A callback
	* function that returns a Promise resulting in a Response.
	*/
	setCatchHandler(handler) {
		this._catchHandler = normalizeHandler(handler);
	}
	/**
	* Registers a route with the router.
	*
	* @param {workbox-routing.Route} route The route to register.
	*/
	registerRoute(route) {
		if (!this._routes.has(route.method)) this._routes.set(route.method, []);
		this._routes.get(route.method).push(route);
	}
	/**
	* Unregisters a route with the router.
	*
	* @param {workbox-routing.Route} route The route to unregister.
	*/
	unregisterRoute(route) {
		if (!this._routes.has(route.method)) throw new WorkboxError("unregister-route-but-not-found-with-method", { method: route.method });
		const routeIndex = this._routes.get(route.method).indexOf(route);
		if (routeIndex > -1) this._routes.get(route.method).splice(routeIndex, 1);
		else throw new WorkboxError("unregister-route-route-not-registered");
	}
};
//#endregion
//#region ../../node_modules/workbox-routing/utils/getOrCreateDefaultRouter.js
var defaultRouter;
/**
* Creates a new, singleton Router instance if one does not exist. If one
* does already exist, that instance is returned.
*
* @private
* @return {Router}
*/
var getOrCreateDefaultRouter = () => {
	if (!defaultRouter) {
		defaultRouter = new Router();
		defaultRouter.addFetchListener();
		defaultRouter.addCacheListener();
	}
	return defaultRouter;
};
//#endregion
//#region ../../node_modules/workbox-routing/registerRoute.js
/**
* Easily register a RegExp, string, or function with a caching
* strategy to a singleton Router instance.
*
* This method will generate a Route for you if needed and
* call {@link workbox-routing.Router#registerRoute}.
*
* @param {RegExp|string|workbox-routing.Route~matchCallback|workbox-routing.Route} capture
* If the capture param is a `Route`, all other arguments will be ignored.
* @param {workbox-routing~handlerCallback} [handler] A callback
* function that returns a Promise resulting in a Response. This parameter
* is required if `capture` is not a `Route` object.
* @param {string} [method='GET'] The HTTP method to match the Route
* against.
* @return {workbox-routing.Route} The generated `Route`.
*
* @memberof workbox-routing
*/
function registerRoute(capture, handler, method) {
	let route;
	if (typeof capture === "string") {
		const captureUrl = new URL(capture, location.href);
		const matchCallback = ({ url }) => {
			return url.href === captureUrl.href;
		};
		route = new Route(matchCallback, handler, method);
	} else if (capture instanceof RegExp) route = new RegExpRoute(capture, handler, method);
	else if (typeof capture === "function") route = new Route(capture, handler, method);
	else if (capture instanceof Route) route = capture;
	else throw new WorkboxError("unsupported-route-type", {
		moduleName: "workbox-routing",
		funcName: "registerRoute",
		paramName: "capture"
	});
	getOrCreateDefaultRouter().registerRoute(route);
	return route;
}
//#endregion
//#region ../../node_modules/workbox-routing/setCatchHandler.js
/**
* If a Route throws an error while handling a request, this `handler`
* will be called and given a chance to provide a response.
*
* @param {workbox-routing~handlerCallback} handler A callback
* function that returns a Promise resulting in a Response.
*
* @memberof workbox-routing
*/
function setCatchHandler(handler) {
	getOrCreateDefaultRouter().setCatchHandler(handler);
}
//#endregion
//#region ../../node_modules/workbox-routing/setDefaultHandler.js
/**
* Define a default `handler` that's called when no routes explicitly
* match the incoming request.
*
* Without a default handler, unmatched requests will go against the
* network as if there were no service worker present.
*
* @param {workbox-routing~handlerCallback} handler A callback
* function that returns a Promise resulting in a Response.
*
* @memberof workbox-routing
*/
function setDefaultHandler(handler) {
	getOrCreateDefaultRouter().setDefaultHandler(handler);
}
//#endregion
//#region ../../node_modules/workbox-core/_private/cacheMatchIgnoreParams.js
function stripParams(fullURL, ignoreParams) {
	const strippedURL = new URL(fullURL);
	for (const param of ignoreParams) strippedURL.searchParams.delete(param);
	return strippedURL.href;
}
/**
* Matches an item in the cache, ignoring specific URL params. This is similar
* to the `ignoreSearch` option, but it allows you to ignore just specific
* params (while continuing to match on the others).
*
* @private
* @param {Cache} cache
* @param {Request} request
* @param {Object} matchOptions
* @param {Array<string>} ignoreParams
* @return {Promise<Response|undefined>}
*/
async function cacheMatchIgnoreParams(cache, request, ignoreParams, matchOptions) {
	const strippedRequestURL = stripParams(request.url, ignoreParams);
	if (request.url === strippedRequestURL) return cache.match(request, matchOptions);
	const keysOptions = Object.assign(Object.assign({}, matchOptions), { ignoreSearch: true });
	const cacheKeys = await cache.keys(request, keysOptions);
	for (const cacheKey of cacheKeys) if (strippedRequestURL === stripParams(cacheKey.url, ignoreParams)) return cache.match(cacheKey, matchOptions);
}
//#endregion
//#region ../../node_modules/workbox-core/_private/Deferred.js
/**
* The Deferred class composes Promises in a way that allows for them to be
* resolved or rejected from outside the constructor. In most cases promises
* should be used directly, but Deferreds can be necessary when the logic to
* resolve a promise must be separate.
*
* @private
*/
var Deferred = class {
	/**
	* Creates a promise and exposes its resolve and reject functions as methods.
	*/
	constructor() {
		this.promise = new Promise((resolve, reject) => {
			this.resolve = resolve;
			this.reject = reject;
		});
	}
};
//#endregion
//#region ../../node_modules/workbox-core/_private/executeQuotaErrorCallbacks.js
/**
* Runs all of the callback functions, one at a time sequentially, in the order
* in which they were registered.
*
* @memberof workbox-core
* @private
*/
async function executeQuotaErrorCallbacks() {
	for (const callback of quotaErrorCallbacks) await callback();
}
//#endregion
//#region ../../node_modules/workbox-core/_private/timeout.js
/**
* Returns a promise that resolves and the passed number of milliseconds.
* This utility is an async/await-friendly version of `setTimeout`.
*
* @param {number} ms
* @return {Promise}
* @private
*/
function timeout(ms) {
	return new Promise((resolve) => setTimeout(resolve, ms));
}
//#endregion
//#region ../../node_modules/workbox-strategies/_version.js
try {
	self["workbox:strategies:7.2.0"] && _();
} catch (e) {}
//#endregion
//#region ../../node_modules/workbox-strategies/StrategyHandler.js
function toRequest(input) {
	return typeof input === "string" ? new Request(input) : input;
}
/**
* A class created every time a Strategy instance instance calls
* {@link workbox-strategies.Strategy~handle} or
* {@link workbox-strategies.Strategy~handleAll} that wraps all fetch and
* cache actions around plugin callbacks and keeps track of when the strategy
* is "done" (i.e. all added `event.waitUntil()` promises have resolved).
*
* @memberof workbox-strategies
*/
var StrategyHandler = class {
	/**
	* Creates a new instance associated with the passed strategy and event
	* that's handling the request.
	*
	* The constructor also initializes the state that will be passed to each of
	* the plugins handling this request.
	*
	* @param {workbox-strategies.Strategy} strategy
	* @param {Object} options
	* @param {Request|string} options.request A request to run this strategy for.
	* @param {ExtendableEvent} options.event The event associated with the
	*     request.
	* @param {URL} [options.url]
	* @param {*} [options.params] The return value from the
	*     {@link workbox-routing~matchCallback} (if applicable).
	*/
	constructor(strategy, options) {
		this._cacheKeys = {};
		Object.assign(this, options);
		this.event = options.event;
		this._strategy = strategy;
		this._handlerDeferred = new Deferred();
		this._extendLifetimePromises = [];
		this._plugins = [...strategy.plugins];
		this._pluginStateMap = /* @__PURE__ */ new Map();
		for (const plugin of this._plugins) this._pluginStateMap.set(plugin, {});
		this.event.waitUntil(this._handlerDeferred.promise);
	}
	/**
	* Fetches a given request (and invokes any applicable plugin callback
	* methods) using the `fetchOptions` (for non-navigation requests) and
	* `plugins` defined on the `Strategy` object.
	*
	* The following plugin lifecycle methods are invoked when using this method:
	* - `requestWillFetch()`
	* - `fetchDidSucceed()`
	* - `fetchDidFail()`
	*
	* @param {Request|string} input The URL or request to fetch.
	* @return {Promise<Response>}
	*/
	async fetch(input) {
		const { event } = this;
		let request = toRequest(input);
		if (request.mode === "navigate" && event instanceof FetchEvent && event.preloadResponse) {
			const possiblePreloadResponse = await event.preloadResponse;
			if (possiblePreloadResponse) return possiblePreloadResponse;
		}
		const originalRequest = this.hasCallback("fetchDidFail") ? request.clone() : null;
		try {
			for (const cb of this.iterateCallbacks("requestWillFetch")) request = await cb({
				request: request.clone(),
				event
			});
		} catch (err) {
			if (err instanceof Error) throw new WorkboxError("plugin-error-request-will-fetch", { thrownErrorMessage: err.message });
		}
		const pluginFilteredRequest = request.clone();
		try {
			let fetchResponse;
			fetchResponse = await fetch(request, request.mode === "navigate" ? void 0 : this._strategy.fetchOptions);
			for (const callback of this.iterateCallbacks("fetchDidSucceed")) fetchResponse = await callback({
				event,
				request: pluginFilteredRequest,
				response: fetchResponse
			});
			return fetchResponse;
		} catch (error) {
			if (originalRequest) await this.runCallbacks("fetchDidFail", {
				error,
				event,
				originalRequest: originalRequest.clone(),
				request: pluginFilteredRequest.clone()
			});
			throw error;
		}
	}
	/**
	* Calls `this.fetch()` and (in the background) runs `this.cachePut()` on
	* the response generated by `this.fetch()`.
	*
	* The call to `this.cachePut()` automatically invokes `this.waitUntil()`,
	* so you do not have to manually call `waitUntil()` on the event.
	*
	* @param {Request|string} input The request or URL to fetch and cache.
	* @return {Promise<Response>}
	*/
	async fetchAndCachePut(input) {
		const response = await this.fetch(input);
		const responseClone = response.clone();
		this.waitUntil(this.cachePut(input, responseClone));
		return response;
	}
	/**
	* Matches a request from the cache (and invokes any applicable plugin
	* callback methods) using the `cacheName`, `matchOptions`, and `plugins`
	* defined on the strategy object.
	*
	* The following plugin lifecycle methods are invoked when using this method:
	* - cacheKeyWillBeUsed()
	* - cachedResponseWillBeUsed()
	*
	* @param {Request|string} key The Request or URL to use as the cache key.
	* @return {Promise<Response|undefined>} A matching response, if found.
	*/
	async cacheMatch(key) {
		const request = toRequest(key);
		let cachedResponse;
		const { cacheName, matchOptions } = this._strategy;
		const effectiveRequest = await this.getCacheKey(request, "read");
		const multiMatchOptions = Object.assign(Object.assign({}, matchOptions), { cacheName });
		cachedResponse = await caches.match(effectiveRequest, multiMatchOptions);
		for (const callback of this.iterateCallbacks("cachedResponseWillBeUsed")) cachedResponse = await callback({
			cacheName,
			matchOptions,
			cachedResponse,
			request: effectiveRequest,
			event: this.event
		}) || void 0;
		return cachedResponse;
	}
	/**
	* Puts a request/response pair in the cache (and invokes any applicable
	* plugin callback methods) using the `cacheName` and `plugins` defined on
	* the strategy object.
	*
	* The following plugin lifecycle methods are invoked when using this method:
	* - cacheKeyWillBeUsed()
	* - cacheWillUpdate()
	* - cacheDidUpdate()
	*
	* @param {Request|string} key The request or URL to use as the cache key.
	* @param {Response} response The response to cache.
	* @return {Promise<boolean>} `false` if a cacheWillUpdate caused the response
	* not be cached, and `true` otherwise.
	*/
	async cachePut(key, response) {
		const request = toRequest(key);
		await timeout(0);
		const effectiveRequest = await this.getCacheKey(request, "write");
		if (!response) throw new WorkboxError("cache-put-with-no-response", { url: getFriendlyURL(effectiveRequest.url) });
		const responseToCache = await this._ensureResponseSafeToCache(response);
		if (!responseToCache) return false;
		const { cacheName, matchOptions } = this._strategy;
		const cache = await self.caches.open(cacheName);
		const hasCacheUpdateCallback = this.hasCallback("cacheDidUpdate");
		const oldResponse = hasCacheUpdateCallback ? await cacheMatchIgnoreParams(cache, effectiveRequest.clone(), ["__WB_REVISION__"], matchOptions) : null;
		try {
			await cache.put(effectiveRequest, hasCacheUpdateCallback ? responseToCache.clone() : responseToCache);
		} catch (error) {
			if (error instanceof Error) {
				if (error.name === "QuotaExceededError") await executeQuotaErrorCallbacks();
				throw error;
			}
		}
		for (const callback of this.iterateCallbacks("cacheDidUpdate")) await callback({
			cacheName,
			oldResponse,
			newResponse: responseToCache.clone(),
			request: effectiveRequest,
			event: this.event
		});
		return true;
	}
	/**
	* Checks the list of plugins for the `cacheKeyWillBeUsed` callback, and
	* executes any of those callbacks found in sequence. The final `Request`
	* object returned by the last plugin is treated as the cache key for cache
	* reads and/or writes. If no `cacheKeyWillBeUsed` plugin callbacks have
	* been registered, the passed request is returned unmodified
	*
	* @param {Request} request
	* @param {string} mode
	* @return {Promise<Request>}
	*/
	async getCacheKey(request, mode) {
		const key = `${request.url} | ${mode}`;
		if (!this._cacheKeys[key]) {
			let effectiveRequest = request;
			for (const callback of this.iterateCallbacks("cacheKeyWillBeUsed")) effectiveRequest = toRequest(await callback({
				mode,
				request: effectiveRequest,
				event: this.event,
				params: this.params
			}));
			this._cacheKeys[key] = effectiveRequest;
		}
		return this._cacheKeys[key];
	}
	/**
	* Returns true if the strategy has at least one plugin with the given
	* callback.
	*
	* @param {string} name The name of the callback to check for.
	* @return {boolean}
	*/
	hasCallback(name) {
		for (const plugin of this._strategy.plugins) if (name in plugin) return true;
		return false;
	}
	/**
	* Runs all plugin callbacks matching the given name, in order, passing the
	* given param object (merged ith the current plugin state) as the only
	* argument.
	*
	* Note: since this method runs all plugins, it's not suitable for cases
	* where the return value of a callback needs to be applied prior to calling
	* the next callback. See
	* {@link workbox-strategies.StrategyHandler#iterateCallbacks}
	* below for how to handle that case.
	*
	* @param {string} name The name of the callback to run within each plugin.
	* @param {Object} param The object to pass as the first (and only) param
	*     when executing each callback. This object will be merged with the
	*     current plugin state prior to callback execution.
	*/
	async runCallbacks(name, param) {
		for (const callback of this.iterateCallbacks(name)) await callback(param);
	}
	/**
	* Accepts a callback and returns an iterable of matching plugin callbacks,
	* where each callback is wrapped with the current handler state (i.e. when
	* you call each callback, whatever object parameter you pass it will
	* be merged with the plugin's current state).
	*
	* @param {string} name The name fo the callback to run
	* @return {Array<Function>}
	*/
	*iterateCallbacks(name) {
		for (const plugin of this._strategy.plugins) if (typeof plugin[name] === "function") {
			const state = this._pluginStateMap.get(plugin);
			const statefulCallback = (param) => {
				const statefulParam = Object.assign(Object.assign({}, param), { state });
				return plugin[name](statefulParam);
			};
			yield statefulCallback;
		}
	}
	/**
	* Adds a promise to the
	* [extend lifetime promises]{@link https://w3c.github.io/ServiceWorker/#extendableevent-extend-lifetime-promises}
	* of the event event associated with the request being handled (usually a
	* `FetchEvent`).
	*
	* Note: you can await
	* {@link workbox-strategies.StrategyHandler~doneWaiting}
	* to know when all added promises have settled.
	*
	* @param {Promise} promise A promise to add to the extend lifetime promises
	*     of the event that triggered the request.
	*/
	waitUntil(promise) {
		this._extendLifetimePromises.push(promise);
		return promise;
	}
	/**
	* Returns a promise that resolves once all promises passed to
	* {@link workbox-strategies.StrategyHandler~waitUntil}
	* have settled.
	*
	* Note: any work done after `doneWaiting()` settles should be manually
	* passed to an event's `waitUntil()` method (not this handler's
	* `waitUntil()` method), otherwise the service worker thread my be killed
	* prior to your work completing.
	*/
	async doneWaiting() {
		let promise;
		while (promise = this._extendLifetimePromises.shift()) await promise;
	}
	/**
	* Stops running the strategy and immediately resolves any pending
	* `waitUntil()` promises.
	*/
	destroy() {
		this._handlerDeferred.resolve(null);
	}
	/**
	* This method will call cacheWillUpdate on the available plugins (or use
	* status === 200) to determine if the Response is safe and valid to cache.
	*
	* @param {Request} options.request
	* @param {Response} options.response
	* @return {Promise<Response|undefined>}
	*
	* @private
	*/
	async _ensureResponseSafeToCache(response) {
		let responseToCache = response;
		let pluginsUsed = false;
		for (const callback of this.iterateCallbacks("cacheWillUpdate")) {
			responseToCache = await callback({
				request: this.request,
				response: responseToCache,
				event: this.event
			}) || void 0;
			pluginsUsed = true;
			if (!responseToCache) break;
		}
		if (!pluginsUsed) {
			if (responseToCache && responseToCache.status !== 200) responseToCache = void 0;
		}
		return responseToCache;
	}
};
//#endregion
//#region ../../node_modules/workbox-strategies/Strategy.js
/**
* An abstract base class that all other strategy classes must extend from:
*
* @memberof workbox-strategies
*/
var Strategy = class {
	/**
	* Creates a new instance of the strategy and sets all documented option
	* properties as public instance properties.
	*
	* Note: if a custom strategy class extends the base Strategy class and does
	* not need more than these properties, it does not need to define its own
	* constructor.
	*
	* @param {Object} [options]
	* @param {string} [options.cacheName] Cache name to store and retrieve
	* requests. Defaults to the cache names provided by
	* {@link workbox-core.cacheNames}.
	* @param {Array<Object>} [options.plugins] [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}
	* to use in conjunction with this caching strategy.
	* @param {Object} [options.fetchOptions] Values passed along to the
	* [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters)
	* of [non-navigation](https://github.com/GoogleChrome/workbox/issues/1796)
	* `fetch()` requests made by this strategy.
	* @param {Object} [options.matchOptions] The
	* [`CacheQueryOptions`]{@link https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions}
	* for any `cache.match()` or `cache.put()` calls made by this strategy.
	*/
	constructor(options = {}) {
		/**
		* Cache name to store and retrieve
		* requests. Defaults to the cache names provided by
		* {@link workbox-core.cacheNames}.
		*
		* @type {string}
		*/
		this.cacheName = cacheNames.getRuntimeName(options.cacheName);
		/**
		* The list
		* [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}
		* used by this strategy.
		*
		* @type {Array<Object>}
		*/
		this.plugins = options.plugins || [];
		/**
		* Values passed along to the
		* [`init`]{@link https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters}
		* of all fetch() requests made by this strategy.
		*
		* @type {Object}
		*/
		this.fetchOptions = options.fetchOptions;
		/**
		* The
		* [`CacheQueryOptions`]{@link https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions}
		* for any `cache.match()` or `cache.put()` calls made by this strategy.
		*
		* @type {Object}
		*/
		this.matchOptions = options.matchOptions;
	}
	/**
	* Perform a request strategy and returns a `Promise` that will resolve with
	* a `Response`, invoking all relevant plugin callbacks.
	*
	* When a strategy instance is registered with a Workbox
	* {@link workbox-routing.Route}, this method is automatically
	* called when the route matches.
	*
	* Alternatively, this method can be used in a standalone `FetchEvent`
	* listener by passing it to `event.respondWith()`.
	*
	* @param {FetchEvent|Object} options A `FetchEvent` or an object with the
	*     properties listed below.
	* @param {Request|string} options.request A request to run this strategy for.
	* @param {ExtendableEvent} options.event The event associated with the
	*     request.
	* @param {URL} [options.url]
	* @param {*} [options.params]
	*/
	handle(options) {
		const [responseDone] = this.handleAll(options);
		return responseDone;
	}
	/**
	* Similar to {@link workbox-strategies.Strategy~handle}, but
	* instead of just returning a `Promise` that resolves to a `Response` it
	* it will return an tuple of `[response, done]` promises, where the former
	* (`response`) is equivalent to what `handle()` returns, and the latter is a
	* Promise that will resolve once any promises that were added to
	* `event.waitUntil()` as part of performing the strategy have completed.
	*
	* You can await the `done` promise to ensure any extra work performed by
	* the strategy (usually caching responses) completes successfully.
	*
	* @param {FetchEvent|Object} options A `FetchEvent` or an object with the
	*     properties listed below.
	* @param {Request|string} options.request A request to run this strategy for.
	* @param {ExtendableEvent} options.event The event associated with the
	*     request.
	* @param {URL} [options.url]
	* @param {*} [options.params]
	* @return {Array<Promise>} A tuple of [response, done]
	*     promises that can be used to determine when the response resolves as
	*     well as when the handler has completed all its work.
	*/
	handleAll(options) {
		if (options instanceof FetchEvent) options = {
			event: options,
			request: options.request
		};
		const event = options.event;
		const request = typeof options.request === "string" ? new Request(options.request) : options.request;
		const params = "params" in options ? options.params : void 0;
		const handler = new StrategyHandler(this, {
			event,
			request,
			params
		});
		const responseDone = this._getResponse(handler, request, event);
		return [responseDone, this._awaitComplete(responseDone, handler, request, event)];
	}
	async _getResponse(handler, request, event) {
		await handler.runCallbacks("handlerWillStart", {
			event,
			request
		});
		let response = void 0;
		try {
			response = await this._handle(request, handler);
			if (!response || response.type === "error") throw new WorkboxError("no-response", { url: request.url });
		} catch (error) {
			if (error instanceof Error) for (const callback of handler.iterateCallbacks("handlerDidError")) {
				response = await callback({
					error,
					event,
					request
				});
				if (response) break;
			}
			if (!response) throw error;
		}
		for (const callback of handler.iterateCallbacks("handlerWillRespond")) response = await callback({
			event,
			request,
			response
		});
		return response;
	}
	async _awaitComplete(responseDone, handler, request, event) {
		let response;
		let error;
		try {
			response = await responseDone;
		} catch (error) {}
		try {
			await handler.runCallbacks("handlerDidRespond", {
				event,
				request,
				response
			});
			await handler.doneWaiting();
		} catch (waitUntilError) {
			if (waitUntilError instanceof Error) error = waitUntilError;
		}
		await handler.runCallbacks("handlerDidComplete", {
			event,
			request,
			response,
			error
		});
		handler.destroy();
		if (error) throw error;
	}
};
/**
* Classes extending the `Strategy` based class should implement this method,
* and leverage the {@link workbox-strategies.StrategyHandler}
* arg to perform all fetching and cache logic, which will ensure all relevant
* cache, cache options, fetch options and plugins are used (per the current
* strategy instance).
*
* @name _handle
* @instance
* @abstract
* @function
* @param {Request} request
* @param {workbox-strategies.StrategyHandler} handler
* @return {Promise<Response>}
*
* @memberof workbox-strategies.Strategy
*/
//#endregion
//#region ../../node_modules/workbox-strategies/plugins/cacheOkAndOpaquePlugin.js
var cacheOkAndOpaquePlugin = { 
/**
* Returns a valid response (to allow caching) if the status is 200 (OK) or
* 0 (opaque).
*
* @param {Object} options
* @param {Response} options.response
* @return {Response|null}
*
* @private
*/
cacheWillUpdate: async ({ response }) => {
	if (response.status === 200 || response.status === 0) return response;
	return null;
} };
//#endregion
//#region ../../node_modules/workbox-strategies/NetworkFirst.js
/**
* An implementation of a
* [network first](https://developer.chrome.com/docs/workbox/caching-strategies-overview/#network-first-falling-back-to-cache)
* request strategy.
*
* By default, this strategy will cache responses with a 200 status code as
* well as [opaque responses](https://developer.chrome.com/docs/workbox/caching-resources-during-runtime/#opaque-responses).
* Opaque responses are are cross-origin requests where the response doesn't
* support [CORS](https://enable-cors.org/).
*
* If the network request fails, and there is no cache match, this will throw
* a `WorkboxError` exception.
*
* @extends workbox-strategies.Strategy
* @memberof workbox-strategies
*/
var NetworkFirst = class extends Strategy {
	/**
	* @param {Object} [options]
	* @param {string} [options.cacheName] Cache name to store and retrieve
	* requests. Defaults to cache names provided by
	* {@link workbox-core.cacheNames}.
	* @param {Array<Object>} [options.plugins] [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}
	* to use in conjunction with this caching strategy.
	* @param {Object} [options.fetchOptions] Values passed along to the
	* [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters)
	* of [non-navigation](https://github.com/GoogleChrome/workbox/issues/1796)
	* `fetch()` requests made by this strategy.
	* @param {Object} [options.matchOptions] [`CacheQueryOptions`](https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions)
	* @param {number} [options.networkTimeoutSeconds] If set, any network requests
	* that fail to respond within the timeout will fallback to the cache.
	*
	* This option can be used to combat
	* "[lie-fi]{@link https://developers.google.com/web/fundamentals/performance/poor-connectivity/#lie-fi}"
	* scenarios.
	*/
	constructor(options = {}) {
		super(options);
		if (!this.plugins.some((p) => "cacheWillUpdate" in p)) this.plugins.unshift(cacheOkAndOpaquePlugin);
		this._networkTimeoutSeconds = options.networkTimeoutSeconds || 0;
	}
	/**
	* @private
	* @param {Request|string} request A request to run this strategy for.
	* @param {workbox-strategies.StrategyHandler} handler The event that
	*     triggered the request.
	* @return {Promise<Response>}
	*/
	async _handle(request, handler) {
		const logs = [];
		const promises = [];
		let timeoutId;
		if (this._networkTimeoutSeconds) {
			const { id, promise } = this._getTimeoutPromise({
				request,
				logs,
				handler
			});
			timeoutId = id;
			promises.push(promise);
		}
		const networkPromise = this._getNetworkPromise({
			timeoutId,
			request,
			logs,
			handler
		});
		promises.push(networkPromise);
		const response = await handler.waitUntil((async () => {
			return await handler.waitUntil(Promise.race(promises)) || await networkPromise;
		})());
		if (!response) throw new WorkboxError("no-response", { url: request.url });
		return response;
	}
	/**
	* @param {Object} options
	* @param {Request} options.request
	* @param {Array} options.logs A reference to the logs array
	* @param {Event} options.event
	* @return {Promise<Response>}
	*
	* @private
	*/
	_getTimeoutPromise({ request, logs, handler }) {
		let timeoutId;
		return {
			promise: new Promise((resolve) => {
				const onNetworkTimeout = async () => {
					resolve(await handler.cacheMatch(request));
				};
				timeoutId = setTimeout(onNetworkTimeout, this._networkTimeoutSeconds * 1e3);
			}),
			id: timeoutId
		};
	}
	/**
	* @param {Object} options
	* @param {number|undefined} options.timeoutId
	* @param {Request} options.request
	* @param {Array} options.logs A reference to the logs Array.
	* @param {Event} options.event
	* @return {Promise<Response>}
	*
	* @private
	*/
	async _getNetworkPromise({ timeoutId, request, logs, handler }) {
		let error;
		let response;
		try {
			response = await handler.fetchAndCachePut(request);
		} catch (fetchError) {
			if (fetchError instanceof Error) error = fetchError;
		}
		if (timeoutId) clearTimeout(timeoutId);
		if (error || !response) response = await handler.cacheMatch(request);
		return response;
	}
};
//#endregion
//#region ../../node_modules/workbox-strategies/StaleWhileRevalidate.js
/**
* An implementation of a
* [stale-while-revalidate](https://developer.chrome.com/docs/workbox/caching-strategies-overview/#stale-while-revalidate)
* request strategy.
*
* Resources are requested from both the cache and the network in parallel.
* The strategy will respond with the cached version if available, otherwise
* wait for the network response. The cache is updated with the network response
* with each successful request.
*
* By default, this strategy will cache responses with a 200 status code as
* well as [opaque responses](https://developer.chrome.com/docs/workbox/caching-resources-during-runtime/#opaque-responses).
* Opaque responses are cross-origin requests where the response doesn't
* support [CORS](https://enable-cors.org/).
*
* If the network request fails, and there is no cache match, this will throw
* a `WorkboxError` exception.
*
* @extends workbox-strategies.Strategy
* @memberof workbox-strategies
*/
var StaleWhileRevalidate = class extends Strategy {
	/**
	* @param {Object} [options]
	* @param {string} [options.cacheName] Cache name to store and retrieve
	* requests. Defaults to cache names provided by
	* {@link workbox-core.cacheNames}.
	* @param {Array<Object>} [options.plugins] [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}
	* to use in conjunction with this caching strategy.
	* @param {Object} [options.fetchOptions] Values passed along to the
	* [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters)
	* of [non-navigation](https://github.com/GoogleChrome/workbox/issues/1796)
	* `fetch()` requests made by this strategy.
	* @param {Object} [options.matchOptions] [`CacheQueryOptions`](https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions)
	*/
	constructor(options = {}) {
		super(options);
		if (!this.plugins.some((p) => "cacheWillUpdate" in p)) this.plugins.unshift(cacheOkAndOpaquePlugin);
	}
	/**
	* @private
	* @param {Request|string} request A request to run this strategy for.
	* @param {workbox-strategies.StrategyHandler} handler The event that
	*     triggered the request.
	* @return {Promise<Response>}
	*/
	async _handle(request, handler) {
		const fetchAndCachePromise = handler.fetchAndCachePut(request).catch(() => {});
		handler.waitUntil(fetchAndCachePromise);
		let response = await handler.cacheMatch(request);
		let error;
		if (response) {} else try {
			response = await fetchAndCachePromise;
		} catch (err) {
			if (err instanceof Error) error = err;
		}
		if (!response) throw new WorkboxError("no-response", {
			url: request.url,
			error
		});
		return response;
	}
};
//#endregion
//#region src/worker/storage.ts
var databaseName = "play-xbox-service-worker";
var logStoreName = "logs";
var settingsStoreName = "settings";
var database = null;
async function initializeStorage() {
	return new Promise((resolve, reject) => {
		const request = indexedDB.open(databaseName, 5);
		request.onerror = () => reject(request.error);
		request.onsuccess = () => {
			database = request.result;
			if (!database.objectStoreNames.contains(logStoreName) || !database.objectStoreNames.contains(settingsStoreName)) {
				reject(/* @__PURE__ */ new Error(`Object stores ${logStoreName} or ${settingsStoreName} not found`));
				return;
			}
			resolve();
		};
		request.onupgradeneeded = (event) => {
			const db = event.target.result;
			if (!db.objectStoreNames.contains(logStoreName)) db.createObjectStore(logStoreName, { autoIncrement: true });
			if (db.objectStoreNames.contains(settingsStoreName)) db.deleteObjectStore(settingsStoreName);
			db.createObjectStore(settingsStoreName, { keyPath: "key" });
		};
	});
}
/**
* Stores the installed worker version
* @param version Worker version to store
* @returns Promise that resolves when version is stored
*/
async function storeInstalledWorkerVersion(version) {
	return setSetting("installedWorkerVersion", version);
}
/**
* Stores the active worker version
* @param version Worker version to store
* @returns Promise that resolves when version is stored
*/
async function storeActiveWorkerVersion(version) {
	return setSetting("activeWorkerVersion", version);
}
/**
* Stores saved install data
* @param data InstallData to store
* @returns Promise that resolves when data is stored
*/
async function storeInstallData(data) {
	return setSetting("installData", data);
}
/**
* Grab saved install data
* @returns Promise that resolves with InstallData or undefined if not found
*/
async function getInstallData() {
	return getSetting("installData", void 0);
}
/**
* Get all stored logs and delete them from the database
* @returns Promise that resolves with array of log entries
*/
async function getLogs() {
	if (!database) await initializeStorage();
	if (!database) throw new Error("Database not initialized");
	return new Promise((resolve, reject) => {
		const store = database.transaction([logStoreName], "readwrite").objectStore(logStoreName);
		const getRequest = store.getAll();
		getRequest.onerror = () => reject(getRequest.error);
		getRequest.onsuccess = () => {
			const logs = getRequest.result;
			const clearRequest = store.clear();
			clearRequest.onerror = () => {
				console.warn("SW: Failed to clear logs after retrieval:", clearRequest.error);
				resolve(logs);
			};
			clearRequest.onsuccess = () => resolve(logs);
		};
	});
}
/**
* Clear all stored logs
*/
async function clearLogs() {
	if (!database) await initializeStorage();
	if (!database) throw new Error("Database not initialized");
	return new Promise((resolve, reject) => {
		const request = database.transaction([logStoreName], "readwrite").objectStore(logStoreName).clear();
		request.onerror = () => reject(request.error);
		request.onsuccess = () => resolve();
	});
}
/**
* Prune the specified number of oldest log entries
* @param store The object store to prune
* @param toDelete Number of entries to delete
*/
async function pruneOldLogs(store, toDelete) {
	return new Promise((resolve, reject) => {
		let deleted = 0;
		const cursorRequest = store.openCursor();
		cursorRequest.onsuccess = (event) => {
			const cursor = event.target.result;
			if (cursor && deleted < toDelete) {
				const deleteRequest = cursor.delete();
				deleteRequest.onsuccess = () => {
					deleted++;
					cursor.continue();
				};
				deleteRequest.onerror = () => reject(deleteRequest.error);
			} else resolve();
		};
		cursorRequest.onerror = () => reject(cursorRequest.error);
	});
}
async function storeLog(log, maxEntries) {
	if (!database) await initializeStorage();
	if (!database) throw new Error("Database not initialized");
	const store = database.transaction([logStoreName], "readwrite").objectStore(logStoreName);
	const count = await new Promise((resolve, reject) => {
		const request = store.count();
		request.onsuccess = () => resolve(request.result);
		request.onerror = () => reject(request.error);
	});
	try {
		if (count >= maxEntries) await pruneOldLogs(store, count - maxEntries + 1);
	} catch (error) {
		console.error("SW: Failed to prune old logs:", error);
		return;
	}
	return new Promise((resolve, reject) => {
		const request = store.add(log);
		request.onsuccess = () => resolve();
		request.onerror = () => reject(request.error);
	});
}
/**
* Generic getter for a setting by key
* @param key The setting key (e.g., 'verboseLogging')
* @param defaultValue The value to return if not found
* @returns Promise that resolves with the setting value or default
*/
async function getSetting(key, defaultValue) {
	if (!database) await initializeStorage();
	if (!database) throw new Error("Database not initialized");
	return new Promise((resolve, reject) => {
		const request = database.transaction([settingsStoreName], "readonly").objectStore(settingsStoreName).get(key);
		request.onsuccess = () => {
			const data = request.result;
			if (typeof defaultValue === "boolean" && typeof data?.value === "string") resolve(data.value.toLowerCase() === "true");
			else resolve(data?.value ?? defaultValue);
		};
		request.onerror = () => reject(request.error);
	});
}
/**
* Generic setter for a setting by key
* @param key The setting key (e.g., 'verboseLogging')
* @param value The value to store
* @returns Promise that resolves when stored
*/
async function setSetting(key, value) {
	if (!database) await initializeStorage();
	if (!database) throw new Error("Database not initialized");
	return new Promise((resolve, reject) => {
		const request = database.transaction([settingsStoreName], "readwrite").objectStore(settingsStoreName).put({
			key,
			value
		});
		request.onsuccess = () => resolve();
		request.onerror = () => reject(request.error);
	});
}
/**
* Check if verbose logging is enabled
* @returns Promise that resolves with true if verbose logging is enabled, false otherwise
*/
async function isVerboseLoggingEnabled() {
	return getSetting("verboseLogging", false);
}
/**
* Set verbose logging enabled state
* @param isEnabled Whether verbose logging should be enabled
* @returns Promise that resolves when the setting is stored
*/
async function storeVerboseLogging(isEnabled) {
	return setSetting("verboseLogging", isEnabled);
}
/**
* Sets a value indicating that the app is in native offline mode.
* This is used to indicate that certain behaviors may need to change when offline.
* @returns Promise that resolves when stored
*/
async function setIsNativeOfflineMode(isNativeOfflineMode) {
	return setSetting("isNativeOfflineMode", isNativeOfflineMode);
}
/**
* Gets the setting indicating whether the app is in native offline mode.
* @returns Promise that resolves with true if the app is in native offline mode, false otherwise
*/
async function getIsNativeOfflineMode() {
	return getSetting("isNativeOfflineMode", false);
}
//#endregion
//#region \0@oxc-project+runtime@0.137.0/helpers/esm/typeof.js
function _typeof(o) {
	"@babel/helpers - typeof";
	return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(o) {
		return typeof o;
	} : function(o) {
		return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o;
	}, _typeof(o);
}
//#endregion
//#region \0@oxc-project+runtime@0.137.0/helpers/esm/toPrimitive.js
function toPrimitive(t, r) {
	if ("object" != _typeof(t) || !t) return t;
	var e = t[Symbol.toPrimitive];
	if (void 0 !== e) {
		var i = e.call(t, r || "default");
		if ("object" != _typeof(i)) return i;
		throw new TypeError("@@toPrimitive must return a primitive value.");
	}
	return ("string" === r ? String : Number)(t);
}
//#endregion
//#region \0@oxc-project+runtime@0.137.0/helpers/esm/toPropertyKey.js
function toPropertyKey(t) {
	var i = toPrimitive(t, "string");
	return "symbol" == _typeof(i) ? i : i + "";
}
//#endregion
//#region \0@oxc-project+runtime@0.137.0/helpers/esm/defineProperty.js
function _defineProperty(e, r, t) {
	return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
		value: t,
		enumerable: !0,
		configurable: !0,
		writable: !0
	}) : e[r] = t, e;
}
//#endregion
//#region src/worker/Logger.ts
var LoggerImpl = class {
	constructor() {
		_defineProperty(this, "MAX_LOG_ENTRIES", 250);
		_defineProperty(this, "MAX_LOG_LENGTH", 1e3);
		_defineProperty(this, "MAX_MESSAGE_LENGTH", 500);
		_defineProperty(this, "clients", void 0);
		_defineProperty(this, "verboseLoggingEnabled", void 0);
		_defineProperty(this, "hasLoggedInitialization", false);
		this.reset();
	}
	/**
	* Log information messages
	* @param args First arg is the message, remaining are context
	*/
	async info(...args) {
		const message = args.length > 0 ? String(args[0]) : "";
		const contextArgs = args.slice(1);
		if (!this.postLog("info", message, ...contextArgs)) console.info("SW_FALLBACK", ...args);
		this.storeLog("info", args).catch((error) => {
			console.error("Failed to store info log:", error);
		});
	}
	/**
	* Log warning messages
	* @param args First arg is the message, remaining are context
	*/
	async warn(...args) {
		const message = args.length > 0 ? String(args[0]) : "";
		const contextArgs = args.slice(1);
		if (!this.postLog("warn", message, ...contextArgs)) console.warn("SW_FALLBACK", ...args);
		this.storeLog("warn", args).catch((error) => {
			console.error("SW: Failed to store warning log:", error);
		});
	}
	/**
	* Log error messages
	* @param args First arg is the message, remaining are context
	*/
	async error(...args) {
		const message = args.length > 0 ? String(args[0]) : "";
		const contextArgs = args.slice(1);
		if (!this.postLog("error", message, ...contextArgs)) console.error("SW_FALLBACK", ...args);
		this.storeLog("error", args).catch((error) => {
			console.error("SW: Failed to store error log:", error);
		});
	}
	/**
	* Log debug messages
	* @param args First arg is the message, remaining are context
	*/
	async debug(...args) {
		const message = args.length > 0 ? String(args[0]) : "";
		const contextArgs = args.slice(1);
		if (!this.postLog("debug", message, ...contextArgs)) console.debug("SW_FALLBACK", ...args);
		this.storeLog("debug", args).catch((error) => {
			console.error("SW: Failed to store debug log:", error);
		});
	}
	/**
	* Toggle verbose logging on/off.  Useful for debugging the ServiceWorker, as many of the per-request logs
	* are logged at this level and are dropped unless verbose logging is explicitly enabled. The setting is
	* persisted in IndexedDB to survive ServiceWorker restarts.
	* @param enable True to enable verbose logging, false to disable
	*/
	async setVerboseLogging(enable) {
		this.verboseLoggingEnabled = enable;
		await storeVerboseLogging(enable);
		await this.reset();
	}
	/**
	* Log verbose messages.  These messages are completely dropped unless verbose logging is enabled.
	* Can be enabled in the devtools console via window.__SW_MANAGER__.toggleVerboseLogging(true).
	* @param args First arg is the message, remaining are context
	*/
	async verbose(...args) {
		if (this.verboseLoggingEnabled === true) console.debug("WORKER_VERBOSE: ", ...args);
	}
	/**
	* Get all stored logs and delete them from the database
	* @returns Promise that resolves with array of log entries
	*/
	async getLogs() {
		return getLogs();
	}
	/**
	* Clear all stored logs
	*/
	async clearLogs() {
		return clearLogs();
	}
	/**
	* Refreshes the logger state by re-querying clients and settings.
	* Should be called on ServiceWorker startup and whenever clients may have changed (e.g., on message from a client).
	*/
	async reset() {
		const oldClientCount = this.clients?.length ?? 0;
		const oldVerboseLoggingEnabled = this.verboseLoggingEnabled;
		const clients = await self.clients.matchAll({
			type: "window",
			includeUncontrolled: true
		});
		this.clients = clients;
		this.verboseLoggingEnabled = await isVerboseLoggingEnabled();
		if (!this.hasLoggedInitialization || this.clients?.length !== oldClientCount || this.verboseLoggingEnabled !== oldVerboseLoggingEnabled) {
			console.info(`SW: Logger initialized. Verbose logging is ${this.verboseLoggingEnabled ? "ENABLED" : "DISABLED"}, clients count: ${this.clients.length}`);
			this.hasLoggedInitialization = true;
		}
	}
	postLog(level, message, ...args) {
		if (!this.clients || this.clients.length === 0) return false;
		const logMessage = {
			type: "SW_LOG",
			payload: {
				level,
				message,
				args
			}
		};
		for (const client of this.clients) client.postMessage(logMessage);
		return true;
	}
	/**
	* Store a log entry in IndexedDB and prune old entries if necessary
	*/
	async storeLog(level, args) {
		const message = args.length > 0 ? args[0] : "";
		let context = args.slice(1);
		let serializedMessage;
		try {
			serializedMessage = typeof message === "string" ? message : JSON.stringify(message);
		} catch (error) {
			console.warn("SW: Failed to serialize log message, using fallback:", error);
			serializedMessage = "[Unserializable message]";
		}
		if (serializedMessage.length > this.MAX_MESSAGE_LENGTH) {
			console.warn(`SW: Log message too long (${serializedMessage}), truncating to ${this.MAX_MESSAGE_LENGTH}`);
			serializedMessage = `${serializedMessage.slice(0, this.MAX_MESSAGE_LENGTH - 3)}...`;
		}
		let serializedContext;
		try {
			serializedContext = JSON.stringify(context);
		} catch (error) {
			console.warn("SW: Failed to serialize log context, using fallback:", error);
			serializedContext = "[]";
			context = [];
		}
		if (serializedMessage.length + serializedContext.length > this.MAX_LOG_LENGTH) {
			const contextMaxLength = this.MAX_LOG_LENGTH - serializedMessage.length - 3;
			console.warn(`SW: Log context too long (${serializedContext.length} chars), truncating to ${contextMaxLength}`);
			serializedContext = `${serializedContext.slice(0, Math.max(0, contextMaxLength))}...`;
			try {
				context = JSON.parse(serializedContext);
			} catch (error) {
				console.warn("SW: Failed to parse truncated context, using fallback:", error);
				context = ["Truncated context"];
			}
		}
		const logEntry = {
			timestamp: Date.now(),
			level,
			message: serializedMessage,
			context
		};
		try {
			await storeLog(logEntry, this.MAX_LOG_ENTRIES).catch((error) => {
				console.error("SW: Failed to store log entry:", error, JSON.stringify(logEntry));
			});
		} catch (error) {
			console.error("SW: Failed to store log:", error, JSON.stringify(logEntry));
		}
	}
};
var logger = new LoggerImpl();
//#endregion
//#region src/worker/utils.ts
/**
* Checks whether the given url string is for the current origin.
*/
function isSameOriginRequest(url) {
	return url.origin === self.location.origin;
}
/**
* Checks if an error response was rendered by our React Router app (vs upstream infrastructure).
*
* Detection: Checks for the `X-Play-Xbox-Error: 1` header set by entry.server.tsx on error
* responses (4xx, 5xx). This header is unique to Play Xbox error pages and will not be present
* on error responses from upstream infrastructure (Azure App Service, CDNs, proxies, AAD auth
* pages, etc.).
*
* @param response - The error response to check.
* @returns `true` if the error was rendered by Play Xbox, `false` otherwise.
*/
function isAppRenderedErrorResponse(response) {
	return response.headers.get("x-play-xbox-error") === "1";
}
/**
* Gets the trailing file extension from a path.
* Expects paths using forward slashes.
*/
function getFileExtension(path) {
	const filenameIdx = path.lastIndexOf("/") + 1;
	const dotIdx = path.indexOf(".", filenameIdx);
	return dotIdx > -1 ? path.substring(dotIdx) : "";
}
/**
* Returns true if a path is for an HTML or API route rather than
* a normal asset file.
*/
function isRoutePath(path) {
	const ext = getFileExtension(path);
	return ext === "" || ext === ".html";
}
/**
* Trims off trailing slashes and index.html to get to
* the path that the web server will actually make a resource
* available at for fetching.
*
* NOTE: Expects the input to be just the path portion of a URL, e.g. '/foo/bar.html'.
* Do not include query params.
*/
function getResourceWebPath(path) {
	if (path.endsWith("/") && path !== "/") return path.substring(0, path.length - 1);
	if (path.endsWith("/index.html")) return path.substring(0, path.length - 11);
	if (path.endsWith(".html")) return path.substring(0, path.length - 5);
	return path;
}
/**
* Fetches a resource with retry logic.
* Retries the fetch request up to `maxAttempts` times if it fails.
* If all attempts fail, it returns the last response.
*
* @param maxAttempts - The maximum number of attempts to fetch the resource.
* @param url - The URL of the resource to fetch.
* @param init - Optional RequestInit object for the fetch request.
* @returns A Promise that resolves to the Response object.
*/
async function fetchWithRetry(maxAttempts, url, init) {
	if (maxAttempts < 1) throw new Error("maxAttempts must be at least 1");
	if (!url.href || url.protocol !== "https:") throw new Error(`Invalid URL: ${url.href}`);
	const method = init.method?.toUpperCase();
	if (method && method !== "GET") throw new Error(`fetchWithRetry only supports GET requests, got ${method}`);
	let attempt = 1;
	const baseDelay = 100;
	while (attempt <= maxAttempts) {
		try {
			const response = await fetch(url, init);
			if (response.ok) {
				if (attempt > 1) logger.debug(`successfully fetched ${url.href} on attempt ${attempt}`);
				return response;
			}
			if (response.status >= 500 && response.status < 600 && attempt < maxAttempts) logger.warn(`failed response for ${url.href} on attempt ${attempt} - retrying...`, {
				status: response.status,
				statusText: response.statusText
			});
			else {
				logger.error(`failed response for ${url.href} on attempt ${attempt} - returning failed response`, {
					status: response.status,
					statusText: response.statusText
				});
				return response;
			}
		} catch (e) {
			logger.warn(`network error fetching ${url.href} on attempt ${attempt}`, {
				error: e.message,
				type: e.name
			});
			if (attempt === maxAttempts) throw e;
		}
		const delay = baseDelay * Math.pow(2, attempt - 1) * (1 + Math.random() * .1);
		logger.warn(`Retrying ${url.href} in ${delay}ms (attempt ${attempt + 1}/${maxAttempts})`);
		await new Promise((resolve) => setTimeout(resolve, delay));
		attempt++;
	}
	throw new Error("Unexpected error in fetchWithRetry");
}
function bytesToMB(bytes) {
	return (bytes / 1024 / 1024).toFixed(1);
}
//#endregion
//#region src/worker/AppInstallCache.ts
var FETCH_RETRIES = 3;
/**
* Assets that are included in the manifest but lack a content hash in their
* filename. Unlike Vite-fingerprinted assets, their URL does not change when
* content changes, so CDN caches may serve stale versions. These assets skip
* SRI integrity checks and use a versioned `__CACHEKEY__` for cache storage.
*/
var UNHASHED_ASSETS = /* @__PURE__ */ new Set(["assets/NOTICE.txt"]);
/**
* Manages a cache of resource files needed for the app to run.
*/
var AppInstallCache = class {
	/**
	* Creates the cache wrapper
	* @param cacheName Name of the Cache database to store data in
	* @param assets List of relative paths to resources
	*/
	constructor(cacheName, assets) {
		_defineProperty(this, "cacheName", void 0);
		_defineProperty(this, "assets", void 0);
		_defineProperty(this, "assetsByWebPath", void 0);
		_defineProperty(this, "isNativeOfflineMode", void 0);
		this.cacheName = cacheName;
		this.assets = [];
		this.assetsByWebPath = /* @__PURE__ */ new Map();
		for (const asset of assets) {
			const url = new URL(getResourceWebPath(asset.path), self.location.href);
			const isRoute = isRoutePath(asset.path);
			const isUnhashedAsset = UNHASHED_ASSETS.has(asset.path);
			const assetInfo = {
				isRoute,
				diskPath: asset.path,
				webPath: url.pathname,
				absoluteUrl: url,
				integrity: isRoute || isUnhashedAsset ? void 0 : asset.integrity,
				cacheKey: isRoute || isUnhashedAsset ? `${url.href}?__CACHEKEY__=${asset.integrity}` : url.href
			};
			this.assets.push(assetInfo);
			this.assetsByWebPath.set(assetInfo.webPath, assetInfo);
		}
	}
	async cacheNavigationResponse(requestUrl, response, extendableEvent) {
		const webPath = getResourceWebPath(requestUrl.pathname);
		const assetInfo = this.assetsByWebPath.get(webPath);
		if (assetInfo?.isRoute) {
			const cache = await caches.open(this.cacheName);
			await this.cacheResponse(cache, assetInfo.cacheKey, response, extendableEvent);
		} else logger.warn(`cacheNavigationResponse: received navigation response for url ${requestUrl.href} which does not match any known route webPath in the manifest; ignoring.`);
	}
	/**
	* Looks up an app asset in the cache only (never performs a network fetch).
	*
	* @param request - Same-origin request to look up.
	* @returns Cached response if present, otherwise undefined.
	*/
	async tryGetCachedAsset(request) {
		const url = new URL(request.url);
		if (url.origin !== self.location.origin) {
			logger.debug(`tryGetCachedAsset: ignoring cross-origin request: ${request.url}`);
			return;
		}
		const cache = await caches.open(this.cacheName);
		let cachedResponse = await cache.match(request);
		if (cachedResponse) {
			logger.verbose(`tryGetCachedAsset: cache hit - ${request.url}`);
			return cachedResponse;
		}
		const webPath = getResourceWebPath(url.pathname);
		const assetInfo = this.assetsByWebPath.get(webPath);
		if (assetInfo && (request.mode === "navigate" && assetInfo.isRoute || !assetInfo.isRoute && !assetInfo.integrity)) {
			cachedResponse = await cache.match(assetInfo.cacheKey);
			if (cachedResponse) {
				logger.verbose(`tryGetCachedAsset: cache hit (__CACHEKEY__): ${request.url} -> ${assetInfo.cacheKey}`);
				return cachedResponse;
			}
		}
		logger.verbose(`tryGetCachedAsset: cache miss - ${request.url}`);
	}
	/**
	* Handles a same-origin request for an app asset.
	* Always checks the cache first for offline support.
	* Falls back to special __CACHEKEY__ lookup for routes, since they don't have a hash in the file name.
	* For forward compatibility, allows runtime fetching of new/untracked assets so we can properly cache
	* requested assets before a new SW is installed/active. When the new SW does activate, it will walk its
	* manifest and clean up any assets that aren't in the new manifest, so we won't end up with stale cached
	* assets from old SW versions.
	*
	* @param options - Workbox route handler options (contains request + event)
	* @param appVersion - Current app version
	* @returns Response if we handled it, undefined otherwise
	*/
	async fetchAndCacheAsset(options) {
		const { request, event } = options;
		const url = new URL(request.url);
		if (url.origin !== self.location.origin) {
			const msg = `fetchAndCacheAsset: blocking cross-origin request: ${request.url}`;
			logger.error(msg);
			throw new Error(msg);
		}
		const cachedResponse = await this.tryGetCachedAsset(request);
		if (cachedResponse) return cachedResponse;
		const cache = await caches.open(this.cacheName);
		const webPath = getResourceWebPath(url.pathname);
		const assetInfo = this.assetsByWebPath.get(webPath);
		if (assetInfo) return this.doTrackedFetchAndCache(assetInfo, cache, FETCH_RETRIES, event);
		if (!(request.mode === "navigate" || request.destination === "script" || request.destination === "style" || /\.(js|css|json|html?|jsx|tsx|svg|png|jpe?g|gif|webp|avif|woff2?|ttf|otf|eot|ico|webmanifest)$/i.test(url.pathname) || url.pathname.includes(".chunk.") || url.pathname.includes(".module."))) {
			logger.warn(`fetchAndCacheAsset: not handling unrecognized/untracked request, doesn't appear to be an app asset: ${request.url}`);
			return;
		}
		logger.verbose(`fetchAndCacheAsset: fetching/caching unrecognized/untracked app asset: ${request.url}`);
		return this.doUntrackedFetchAndCache(request, cache, event);
	}
	/**
	* Remove all resources from the cache that are not in the current asset list
	*/
	async cleanup() {
		try {
			const cache = await caches.open(this.cacheName);
			const newKeys = new Set(this.assets.map((asset) => asset.cacheKey));
			const oldRequestKeys = await cache.keys();
			const oldRequestKeyCount = oldRequestKeys.length;
			const newKeysCount = newKeys.size;
			let itemsRemoved = 0;
			let itemsReused = 0;
			for (const oldRequestKey of oldRequestKeys) {
				const oldUrl = oldRequestKey.url;
				if (newKeys.has(oldUrl)) {
					itemsReused++;
					continue;
				}
				if (oldUrl.includes("__CACHEKEY__=")) {
					const url = new URL(oldUrl);
					url.searchParams.delete("__CACHEKEY__");
					const oldBaseUrl = url.toString();
					const newVersion = Array.from(newKeys).find((newKey) => {
						if (newKey.includes("__CACHEKEY__=")) {
							const newUrl = new URL(newKey);
							newUrl.searchParams.delete("__CACHEKEY__");
							return newUrl.toString() === oldBaseUrl;
						}
						return false;
					});
					if (newVersion && newVersion !== oldUrl) {
						try {
							logger.verbose(`asset cache cleanup - deleting stale '__CACHEKEY__' url - old:${oldUrl}, keeping new:${newVersion}`);
							await cache.delete(oldRequestKey);
							itemsRemoved++;
						} catch (error) {
							logger.error(`cleanup [${this.cacheName}]: failed to delete ${oldUrl}`, { error });
						}
						continue;
					}
				}
				try {
					logger.verbose(`asset cache cleanup - deleting old asset for url: ${oldUrl}`);
					await cache.delete(oldRequestKey);
					itemsRemoved++;
				} catch (error) {
					logger.error(`cleanup [${this.cacheName}]: failed to delete ${oldUrl}`, { error });
				}
			}
			logger.debug(`cleanup [${this.cacheName}]: old cache size:${oldRequestKeyCount}, new asset count:${newKeysCount}, assets deleted:${itemsRemoved}, assets reused:${itemsReused}`);
		} catch (error) {
			logger.error(`cleanup [${this.cacheName}]: failed to perform cleanup`, { error });
		}
	}
	/**
	* Fetch and cache all assets in the install cache.
	*/
	async fetchAndCacheAll() {
		const cache = await caches.open(this.cacheName);
		const maxConcurrent = 20;
		let lastProgressLog = 0;
		const progressIntervalMs = 5e3;
		await this.concurrentFetch(this.assets, maxConcurrent, async (asset, index, attempt) => {
			if (await cache.match(asset.cacheKey)) {
				logger.verbose(`Using cached asset #${index} ${attempt > 1 ? `(retry ${attempt}):` : ":"} ${asset.absoluteUrl}`);
				return;
			}
			await this.doTrackedFetchAndCache(asset, cache);
		}, {
			maxRetries: FETCH_RETRIES,
			baseDelayMs: 1500,
			onProgress: (done, total, failed, attempt) => {
				const now = Date.now();
				const isFinal = done + failed === total;
				const timeSinceLastLog = now - lastProgressLog;
				if (timeSinceLastLog >= progressIntervalMs || isFinal && timeSinceLastLog > 2e3) {
					lastProgressLog = now;
					const percent = total > 0 ? Math.round(done / total * 100) : 0;
					const attemptInfo = typeof attempt === "number" && attempt > 1 ? ` (attempt ${attempt})` : "";
					const failedInfo = failed > 0 ? ` - ${failed} failed` : "";
					logger.debug(`Install: ${done}/${total} (${percent}%)${failedInfo}${attemptInfo}`);
				}
			},
			onRetry: (asset, index, attempt, err, previousError) => {
				logger.warn(`Retry ${attempt} for asset #${index}: ${asset.absoluteUrl} - ${err.message} ${previousError ? `(previous: ${previousError.message})` : ""}`);
			}
		});
	}
	/**
	* Concurrently processes an array of items with a fixed concurrency limit,
	* automatic retries with exponential backoff + jitter, and smart permanent failure detection.
	*
	* Features:
	* - Keeps exactly `concurrency` requests in flight at all times
	* - Retries only failed items in waves (massively faster than per-item retry)
	* - Detects permanent 404/410 failures and skips retries
	* - Full progress reporting with accurate "failed" count
	* - Graceful handling of any error type
	* - All-or-nothing: rejects only when all retries are exhausted or permanent failures occur
	*
	* Perfect for Service Worker precaching on low-end devices like Smart TVs.
	*/
	async concurrentFetch(items, concurrency, fetcher, options) {
		const total = items.length;
		let completed = 0;
		let failedItems = [];
		const maxRetries = options?.maxRetries ?? 3;
		const baseDelayMs = options?.baseDelayMs ?? 1e3;
		let aborted = false;
		const report = (attempt) => {
			const currentlyFailed = failedItems.length;
			options?.onProgress?.(completed, total, currentlyFailed, attempt);
		};
		report(1);
		for (let attempt = 1; attempt <= maxRetries; attempt++) {
			if (attempt === 1) failedItems = items.map((item, index) => ({
				item,
				index,
				error: null
			}));
			if (failedItems.length === 0) {
				report(attempt);
				return;
			}
			const currentBatch = [...failedItems];
			failedItems = [];
			completed = total - currentBatch.length;
			report(attempt);
			let active = 0;
			let i = 0;
			const next = async () => {
				if (i >= currentBatch.length) {
					if (active === 0 && failedItems.length > 0 && attempt < maxRetries) {
						if (aborted) return;
						const delay = baseDelayMs * Math.pow(2, attempt - 1) * (1 + Math.random() * .1);
						logger.warn(`Retry wave ${attempt + 1}/${maxRetries} starting in ${Math.round(delay)}ms for ${failedItems.length} assets...`);
						await new Promise((r) => setTimeout(r, delay));
						if (aborted) return;
						await next();
					}
					return;
				}
				const { item, index, error: previousError } = currentBatch[i++];
				active++;
				try {
					await fetcher(item, index, attempt);
					completed++;
					report(attempt);
				} catch (error) {
					const errorMsg = error instanceof Error ? error.message : String(error);
					if (errorMsg.startsWith("PERMANENT:404:") || errorMsg.startsWith("PERMANENT:410:")) {
						logger.error(`Permanent failure - asset gone: ${item.absoluteUrl}`);
						completed++;
						report(attempt);
						return;
					}
					options?.onRetry?.(item, index, attempt, error, previousError);
					logger.warn(`Asset #${index} failed (attempt ${attempt}/${maxRetries}) - will retry`, error);
					failedItems.push({
						item,
						index,
						error
					});
				} finally {
					active--;
					next();
				}
			};
			for (let j = 0; j < Math.min(concurrency, currentBatch.length); j++) next();
			while (active > 0 || i < currentBatch.length) await new Promise((r) => setTimeout(r, 10));
			if (failedItems.length === 0) {
				report(attempt);
				return;
			}
		}
		aborted = true;
		throw new Error(`Precaching failed: ${failedItems.length} asset(s) failed after ${maxRetries} attempt(s):\n${failedItems.map((f) => `  #${f.index} ${f.item.absoluteUrl} → ${f.error instanceof Error ? f.error.message : f.error}`).join("\n")}`);
	}
	async updateIsNativeOfflineMode(localAppVersion) {
		if (this.isNativeOfflineMode !== void 0) return;
		this.isNativeOfflineMode = localAppVersion !== null;
		await setIsNativeOfflineMode(this.isNativeOfflineMode);
		logger.info(`AppAssetCache - isNativeOfflineMode:${this.isNativeOfflineMode}.`);
	}
	/**
	* Caches a Response, using `extendableEvent.waitUntil()` when possible.
	*
	* - With an event: returns immediately (response goes to the browser instantly; caching happens in background).
	* - Without an event: awaits the cache write (required for correctness outside fetch/install/activate handlers).
	*
	* Call this with `await` - the function handles the performance difference internally.
	*/
	async cacheResponse(cache, cacheKey, response, extendableEvent) {
		const clone = response.clone();
		const localAppVersion = response.headers.get("x-local-app-version");
		await this.updateIsNativeOfflineMode(localAppVersion);
		const cachePromise = async () => {
			try {
				await cache.put(cacheKey, clone);
			} catch (error) {
				logger.debug(`cacheResponse - (deferred) fetch succeeded, but failed to cache asset: ${cacheKey}.`);
				throw error;
			}
		};
		if (extendableEvent) {
			extendableEvent.waitUntil(cachePromise());
			return;
		} else await cachePromise();
	}
	/**
	* Fetches and caches a *tracked* app asset (one that exists in the current ServiceWorker's asset manifest).
	*
	* This is the core path used during both:
	* - Precaching at install time (native clients)
	* - Runtime fetch of known/tracked assets when the Service Worker is controlling the page (web browsers)
	*
	* Performs integrity checking (for non-route assets), version header validation (for routes served by native clients,
	* since they don't have a hash in the file name), and performs retries on transient network errors.
	* Defers the cache write when possible to minimize response latency.
	*
	* @param {AssetInfo} asset - Metadata about the asset from the build manifest.
	* @param {Cache} cache - Already-opened Cache instance (app asset cache).
	* @param {string} appVersion - Expected app version string. Used to validate route responses in native clients.
	* @param {number} [retries] - Number of retry attempts on transient failures (default: 1). Permanent errors (404/410) are not retried.
	* @param {ExtendableEvent} [extendableEvent] - The fetch/install event. If provided, cache.put() is deferred
	*                                              via event.waitUntil() so the response can be returned immediately,
	*                                              reducing perceived latency by 30–80ms per request.
	*
	* @returns {Promise<Response>} The successful network response (cloned and cached in background if event provided).
	* @throws {Error} If fetch fails permanently (404, 410, version mismatch, etc.) or after all retries.
	*
	* @private
	*/
	async doTrackedFetchAndCache(asset, cache, retries, extendableEvent) {
		logger.debug(`doTrackedFetchAndCache - fetching asset: ${asset.absoluteUrl} with integrity: ${asset.integrity} and retries: ${retries}`);
		const response = await fetchWithRetry(retries ?? 1, asset.absoluteUrl, {
			cache: "no-cache",
			integrity: asset.integrity,
			headers: { "Accept-Encoding": "identity" }
		});
		if (!response.ok) {
			const status = response.status;
			if (status === 404 || status === 410) {
				const msg = `Permanent failure - asset no longer exists: ${asset.absoluteUrl} (HTTP ${status})`;
				logger.error(msg);
				throw new Error(`PERMANENT:${status}:${asset.absoluteUrl}`);
			}
			const msg = `Fetch failed: ${asset.absoluteUrl} (HTTP ${status})`;
			logger.error(msg);
			throw new Error(msg);
		}
		try {
			await this.cacheResponse(cache, asset.cacheKey, response, extendableEvent);
			logger.verbose(`doTrackedFetchAndCache - fetched and cached asset: ${asset.absoluteUrl}`);
			return response;
		} catch (error) {
			logger.debug(`doTrackedFetchAndCache - fetch succeeded, but failed to cache asset: ${asset.absoluteUrl}.`);
			throw error;
		}
	}
	/**
	* Fetches an untracked same-origin app asset (e.g. a new chunk from a newer app version than this ServiceWorker)
	* and caches it in the app asset cache.
	*
	* This ensures that when the old Service Worker is still controlling the page, but a new app version is running,
	* newly-introduced assets are still cached and immediately available to the waiting/new Service Worker upon activation.
	*
	* @param {Request} request - The original fetch request for the asset.
	* @param {Cache} cache - Open Cache instance (must be the app asset cache).
	* @param {ExtendableEvent} [event] - Optional fetch event. If provided, the cache.put()
	*                                    operation is deferred via event.waitUntil() to avoid
	*                                    blocking the response, reducing latency significantly.
	* @returns {Promise<Response>} The network response (cached in background if event provided).
	* @throws {Error} If the network response is not ok (status < 200 || >= 300).
	*
	* @private
	*/
	async doUntrackedFetchAndCache(request, cache, extendableEvent) {
		logger.debug(`doUntrackedFetchAndCache - fetching untracked asset: ${request.url}`);
		const response = await fetchWithRetry(FETCH_RETRIES, new URL(request.url), { cache: "no-cache" });
		if (!response.ok) throw new Error(`Runtime fetch failed ${response.status}: ${request.url}`);
		try {
			await this.cacheResponse(cache, request.url, response, extendableEvent);
			logger.verbose(`doUntrackedFetchAndCache - fetched and cached asset: ${request.url}`);
			return response;
		} catch (error) {
			logger.debug(`doUntrackedFetchAndCache - fetch succeeded, but failed to cache untracked asset: ${request.url}.`);
			throw error;
		}
	}
};
/**
* Combines base styles with button styles for a complete fallback page stylesheet.
*/
var FULL_STYLES = `
    body {
        margin: 0;
        height: 100vh;
        background: #141414;
        color: #fff;
        font-family: system-ui, sans-serif;
        display: flex;
        align-items: center;
        justify-content: center;
        text-align: center;
    }
    .container {
        max-width: 420px;
        padding: 2rem;
    }
    h1 {
        font-size: 1.5rem;
        font-weight: 600;
        margin: 0 0 1rem 0;
    }
    p {
        font-size: 1.125rem;
        line-height: 1.5;
        opacity: 0.9;
        margin: 0;
    }

    button {
        margin-top: 2rem;
        padding: 0.75rem 1.5rem;
        font-size: 1rem;
        background: #107c10;
        color: white;
        border: none;
        border-radius: 4px;
        cursor: pointer;
    }
    button:hover {
        background: #0e6b0b;
    }
    button:focus {
        outline: 2px solid #fff;
        outline-offset: 2px;
    }
`;
//#endregion
//#region src/worker/html/errorFallback.ts
/**
* Human-readable error messages for common HTTP status codes.
* Used to provide context to users when an error occurs.
*/
var ERROR_MESSAGES = {
	400: {
		title: "Bad Request",
		description: "The request could not be understood by the server."
	},
	401: {
		title: "Sign In Required",
		description: "You need to sign in to access this page."
	},
	403: {
		title: "Access Denied",
		description: "You don't have permission to access this page."
	},
	404: {
		title: "Page Not Found",
		description: "The page you're looking for doesn't exist."
	},
	408: {
		title: "Request Timeout",
		description: "The request took too long to complete."
	},
	422: {
		title: "Request Error",
		description: "The request could not be processed."
	},
	429: {
		title: "Too Many Requests",
		description: "Please wait a moment and try again."
	},
	500: {
		title: "Server Error",
		description: "The server encountered an unexpected error."
	},
	502: {
		title: "Service Unavailable",
		description: "The service is temporarily unavailable. Please try again."
	},
	503: {
		title: "Service Unavailable",
		description: "The service is temporarily unavailable. Please try again."
	},
	504: {
		title: "Gateway Timeout",
		description: "The request took too long to complete."
	}
};
/** Default error message for unrecognized status codes. */
var DEFAULT_ERROR = {
	title: "Something Went Wrong",
	description: "An unexpected error occurred."
};
/**
* Generates a self-contained error fallback HTML page.
*
* This page is served when:
* - An intentional HTTP error (4xx) occurs from upstream (not the React app)
* - No cached content is available to serve instead
*
* The page provides:
* - A human-readable error message based on the status code
* - A button that performs a full browser navigation to `/_external/init`
* - `/_external/init` then performs SPA navigation to the sanitized `redirectUri`
* - If already on `/_external/init`, the button performs a full page reload
*
* - Has no external dependencies - renders even if zero assets are cached.
* - Uses CSP meta tag and addEventListener for defense-in-depth security.
*
* @param statusCode - The HTTP status code that triggered the error.
* @param failedUrl - The URL that failed to load, used for redirect after recovery.
* @returns A complete HTML document string.
*/
function createNavigationErrorFallbackHtml(statusCode, failedUrl) {
	const error = ERROR_MESSAGES[statusCode] ?? DEFAULT_ERROR;
	let safeRedirectUrl;
	let isAlreadyOnInit = false;
	try {
		const parsedUrl = new URL(failedUrl, self.location.origin);
		const isSameOrigin = parsedUrl.origin === self.location.origin;
		isAlreadyOnInit = parsedUrl.pathname === "/_external/init";
		if (isSameOrigin) {
			const safeRedirectUri = getSafeInternalRedirectUri(parsedUrl.pathname + parsedUrl.search + parsedUrl.hash, "/");
			safeRedirectUrl = `/_external/init?redirectUri=${encodeURIComponent(safeRedirectUri)}`;
		} else safeRedirectUrl = "/_external/init";
	} catch {
		safeRedirectUrl = "/_external/init";
	}
	const safeEncodedUrl = JSON.stringify(safeRedirectUrl);
	const buttonText = isAlreadyOnInit ? "Reload" : "Try Again";
	return `
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta http-equiv="Content-Security-Policy" content="default-src 'none'; style-src 'unsafe-inline'; script-src 'unsafe-inline'">
    <title>Play XBOX - ${error.title}</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <style>${FULL_STYLES}</style>
</head>
<body>
    <div class="container">
        <h1>${error.title}</h1>
        <p>${error.description}</p>
        <button id="retryButton">${buttonText}</button>
    </div>
    <script>
        document.getElementById('retryButton').addEventListener('click', function() {
            ${isAlreadyOnInit ? "location.reload();" : `location.href = ${safeEncodedUrl};`}
        });
    <\/script>
</body>
</html>`.trim();
}
//#endregion
//#region src/worker/html/nativeOfflineModeBootstrapperFallback.ts
var NATIVE_LOCAL_NAV_BOOTSTRAP_RETRY_PARAM = "__sw_nav_bootstrap_retry";
/**
* If the fetch failed, we could be trying to load from disk from within a ServiceWorker that's unable to send intercepted requests
* to the native app, because the native app may not be on our origin yet. In those cases, it looks like the WebView doesn't receive
* WebResourceRequested events until the first successful navigation to our origin, which means the ServiceWorker can't proxy requests
* to disk until that happens! This issue has been reported to the WebView2 team, but in the meantime, we'll work around it.
*
* To work around this, if we get a 5xx error on the initial navigation request while in 'native offline mode', then we can assume
* that this is the issue. When detected, we serve the a lightweight bootstrapping page directly from the ServiceWorker to 'move' the WebView
* to our origin. Once on our origin, the bootstrapping page immediately calls location.replace(request.url), allowing the ServiceWorker's
* fetch requests to be intercepted by the native Sdk to load the file from disk.
* Uses CSP meta tag for defense-in-depth security.
*/
async function tryCreateNativeOfflineModeBootstrapperResponse(url, status) {
	if (url.searchParams.has(NATIVE_LOCAL_NAV_BOOTSTRAP_RETRY_PARAM)) {
		logger.warn(`Navigation contains retry param, skipping bootstrap response for url=${url.href} to avoid infinite retry loop`);
		return;
	}
	if (await getIsNativeOfflineMode() && (!status || status >= 500)) {
		logger.debug(`Navigation returning offline mode bootstrap-on-origin response for url=${url.href}`);
		const retryUrl = new URL(url.href);
		retryUrl.searchParams.set(NATIVE_LOCAL_NAV_BOOTSTRAP_RETRY_PARAM, "1");
		const html = `
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta http-equiv="Content-Security-Policy" content="default-src 'none'; style-src 'unsafe-inline'; script-src 'unsafe-inline'">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Loading…</title>
    <style>${FULL_STYLES}</style>
</head>
<body>
    <script>
        location.replace(${JSON.stringify(retryUrl.toString())});
    <\/script>
</body>
</html>`.trim();
		return new Response(html, {
			status: 200,
			headers: {
				"Content-Type": "text/html; charset=utf-8",
				"Cache-Control": "no-store"
			}
		});
	}
}
//#endregion
//#region src/worker/html/offlineFallback.ts
/**
* Self-contained offline fallback HTML page.
*
* Rendered when the user is offline and no cached content is available.
* Has no external dependencies - renders even if zero assets are cached.
* Uses CSP meta tag and addEventListener for defense-in-depth security.
*/
var OFFLINE_FALLBACK_HTML = `
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta http-equiv="Content-Security-Policy" content="default-src 'none'; style-src 'unsafe-inline'; script-src 'unsafe-inline'">
    <title>Play XBOX - Offline</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <style>${FULL_STYLES}</style>
</head>
<body>
    <div class="container">
        <h1>You're offline</h1>
        <p>Check your internet connection and try again.</p>
        <button id="retryButton">Retry</button>
    </div>
    <script>
        document.getElementById('retryButton').addEventListener('click', function() {
            location.reload();
        });
    <\/script>
</body>
</html>`.trim();
//#endregion
//#region src/worker/entry.worker.ts
var APP_VERSION = "main-1.0.2607.0808";
var APP_WCF_VERSION_STRING = "18.17.26062302";
/** Cache name for core app assets (HTML, JS, CSS, etc.). */
var APP_CACHE_KEY = "play-app-cache";
/** Cache name for React Router route manifests. */
var MANIFEST_CACHE_KEY = "play-manifest-cache";
/** Cache name for dynamic images (CDN, product images, etc.) with non-opaque responses. */
var IMAGE_CACHE_KEY = "play-image-cache";
/** Cache name for opaque (no-cors) image responses — tightly constrained due to ~7 MB per-entry browser estimation padding. */
var OPAQUE_IMAGE_CACHE_KEY = "play-opaque-image-cache";
/** Cache name for Game Pass SIGL data. */
var SIGL_CACHE_KEY = "play-sigl-cache";
var NAVIGATION_NETWORK_TIMEOUT_NATIVE_LOCAL_ASSETS_MS = 3e3;
var NAVIGATION_NETWORK_TIMEOUT_NATIVE_MS = 5e3;
var NAVIGATION_NETWORK_TIMEOUT_WEB_MS = 5e3;
var NAVIGATION_NETWORK_TIMEOUT_LOCAL_DEV_MS = 6e4;
var IMAGE_PLACEHOLDER = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg==";
var LOCAL_DEV_HOSTNAME = "local.play.xbox.com";
var installPromise = null;
var IS_NATIVE_CLIENT = new URLSearchParams(self.location.search).get("nativeHost") === "true";
var IS_LOWMEMORY_CLIENT = new URLSearchParams(self.location.search).get("lowMemory") === "true";
var appAssetCache = new AppInstallCache(APP_CACHE_KEY, assets);
self.addEventListener("unhandledrejection", (event) => {
	logger.error(`Unhandled rejection in SW ${APP_VERSION}:`, event.reason);
	event.preventDefault();
});
/**
* Determines the network timeout to use for same-origin navigations.
*/
var getNavigationNetworkTimeoutMs = async (requestUrl) => {
	if (await getIsNativeOfflineMode()) {
		logger.verbose(`Native client loading assets from disk, using navigation network timeout of ${NAVIGATION_NETWORK_TIMEOUT_NATIVE_LOCAL_ASSETS_MS}ms for request to ${requestUrl.href}`);
		return NAVIGATION_NETWORK_TIMEOUT_NATIVE_LOCAL_ASSETS_MS;
	}
	if (self.navigator.onLine === false) {
		logger.verbose(`Client is offline, skipping network request for ${requestUrl.href}`);
		return 0;
	}
	if (requestUrl.hostname === LOCAL_DEV_HOSTNAME) {
		logger.verbose(`Local dev server detected, using extended navigation network timeout of ${NAVIGATION_NETWORK_TIMEOUT_LOCAL_DEV_MS}ms for request to ${requestUrl.href}`);
		return NAVIGATION_NETWORK_TIMEOUT_LOCAL_DEV_MS;
	}
	if (IS_NATIVE_CLIENT) {
		logger.verbose(`Native client detected, using navigation network timeout of ${NAVIGATION_NETWORK_TIMEOUT_NATIVE_MS}ms for request to ${requestUrl.href}`);
		return NAVIGATION_NETWORK_TIMEOUT_NATIVE_MS;
	}
	logger.debug(`Default navigation path detected, using navigation network timeout of ${NAVIGATION_NETWORK_TIMEOUT_WEB_MS}ms for request to ${requestUrl.href}`);
	return NAVIGATION_NETWORK_TIMEOUT_WEB_MS;
};
/**
* Performs a navigation request with a specified network timeout, and appropriate handling for different scenarios (e.g., native local asset loading).
*/
var fetchNavigationWithTimeout = async (request, timeoutMs) => {
	const requestUrl = new URL(request.url);
	const startTime = Date.now();
	logger.debug(`Navigation fetch request begin url=${requestUrl.href} mode=${request.mode} destination=${request.destination} method=${request.method} native=${IS_NATIVE_CLIENT} timeoutMs=${timeoutMs}`);
	const controller = new AbortController();
	const timeoutId = setTimeout(() => {
		logger.debug(`Navigation fetch request timed out after ${timeoutMs}ms, aborting fetch for ${request.url}`);
		controller.abort();
	}, timeoutMs);
	try {
		const response = await fetch(request, {
			redirect: "manual",
			cache: "no-cache",
			signal: controller.signal
		});
		logger.debug(`Navigation fetch request completed status=${response.status} type=${response.type} elapsedMs=${Date.now() - startTime} url=${requestUrl.href}`);
		return response;
	} catch (error) {
		logger.debug(`Navigation fetch request threw an exception elapsedMs=${Date.now() - startTime} url=${requestUrl.href} error=${error instanceof Error ? `${error.name}:${error.message}` : String(error)}`);
		throw error;
	} finally {
		clearTimeout(timeoutId);
	}
};
/**
* Sends a message to all clients controlled by this ServiceWorker.
*/
var sendMessage = async (message) => {
	const clients = await self.clients.matchAll({ includeUncontrolled: true });
	logger.debug(`sending ${message.type} message to ${clients.length} clients`);
	for (const client of clients) client.postMessage(message);
};
var tryInstallWebApplication = async () => {
	if (installPromise) return installPromise;
	installPromise = (async () => {
		try {
			if ((await getInstallData())?.appVersion === APP_VERSION) {
				logger.info(`Web app version ${APP_VERSION} already installed.`);
				return;
			}
			sendMessage({
				type: "SW_INSTALL_APP_STARTED",
				payload: { appVersion: APP_VERSION }
			});
			await appAssetCache.fetchAndCacheAll();
			logger.info(`successfully installed/cached web app assets`);
			try {
				logger.info(`storing install data - appVersion:${APP_VERSION}, webAppWcfVersion:${APP_WCF_VERSION_STRING}`);
				await storeInstallData({
					appVersion: APP_VERSION,
					webAppWcfVersion: APP_WCF_VERSION_STRING
				});
			} catch (error) {
				logger.error(`failed to store install data: ${error instanceof Error ? error.message : JSON.stringify(error)}`);
			}
			sendMessage({
				type: "SW_INSTALL_APP_SUCCEEDED",
				payload: { appVersion: APP_VERSION }
			});
		} catch (error) {
			const msg = `failed to install - asset fetch error: ${error instanceof Error ? error.message : "Unknown error"}`;
			logger.error(msg);
			sendMessage({
				type: "SW_INSTALL_APP_FAILED",
				payload: {
					message: msg,
					appVersion: APP_VERSION
				}
			});
			throw error;
		} finally {
			installPromise = null;
		}
	})();
	return installPromise;
};
self.addEventListener("install", (e) => {
	e.waitUntil((async () => {
		logger.info(`worker 'install' for AppVersion:${APP_VERSION}`);
		await storeInstalledWorkerVersion(APP_VERSION);
	})());
});
self.addEventListener("activate", (e) => {
	e.waitUntil((async () => {
		try {
			logger.info(`worker 'activate' - claiming all clients for AppVersion:${APP_VERSION}, webAppWcfVersion:${APP_WCF_VERSION_STRING}`);
			await self.clients.claim();
		} catch (error) {
			logger.warn(`failed to claim clients during activate: ${error instanceof Error ? error.message : JSON.stringify(error)}`);
		} finally {
			await storeActiveWorkerVersion(APP_VERSION);
		}
		if ((await getInstallData())?.appVersion !== APP_VERSION) {
			logger.info(`worker 'activate' - sending SW_INSTALL_APP_PENDING to defer app installation.`);
			sendMessage({
				type: "SW_INSTALL_APP_PENDING",
				payload: { appVersion: APP_VERSION }
			});
		} else logger.info(`worker 'activate' - app version ${APP_VERSION} already installed, no pending install`);
		try {
			logger.info(`activating - cleaning up old app assets`);
			appAssetCache.cleanup();
		} catch (error) {
			logger.warn(`failed to clean up assets from previous ServiceWorker instance:`, error);
		}
	})());
});
/**
* Simple, reusable Workbox strategy logging plugin.
* Logs cache hits and misses for requests handled by Workbox strategies.
* Only logs if 'verbose' logging is enabled (via swManager.toggleVerboseLogging(true)).
*/
var RequestLogPlugin = class {
	constructor(name) {
		_defineProperty(this, "name", void 0);
		this.name = name;
	}
	async cachedResponseWillBeUsed({ request, cachedResponse }) {
		if (cachedResponse) {
			const size = cachedResponse.headers.get("content-length") ?? "?";
			logger.verbose(`${this.name} cache hit: ${request.url}, size: ${size}`);
			return cachedResponse;
		}
		logger.verbose(`${this.name} cache miss: ${request.url}`);
		return cachedResponse;
	}
	async cacheDidUpdate({ request, newResponse }) {
		const size = newResponse.headers.get("content-length") ?? "?";
		logger.verbose(`${this.name} cache write: ${request.url}, type: ${newResponse?.type ?? "?"}, size: ${size}`);
	}
};
/**
* First route handler that we register with workbox-routing - gives us first crack at handling requests
* by checking our app asset cache. If not handled by the cache, we fall back to a default fetch for any request
* that made it to this route handler, as workbox-routing doesn't let you defer to another route handler from within a route handler.
*/
var appAssetHandler = async (options) => {
	const url = new URL(options.request.url);
	if (url.href.startsWith(`https://${self.location.host}/__manifest`)) {
		const pathsParam = url.searchParams.get("paths");
		if (pathsParam) try {
			const decodedPaths = decodeURIComponent(pathsParam);
			url.searchParams.set("paths", decodedPaths);
		} catch {}
		const normalizedRequest = new Request(url.toString(), options.request);
		return await new NetworkFirst({
			cacheName: MANIFEST_CACHE_KEY,
			networkTimeoutSeconds: 3,
			plugins: [
				new RequestLogPlugin("RouteManifest"),
				new ExpirationPlugin({
					maxEntries: 100,
					maxAgeSeconds: 3600 * 24 * 30,
					purgeOnQuotaError: true
				}),
				new CacheableResponsePlugin({ statuses: [200] })
			]
		}).handle({
			...options,
			request: normalizedRequest
		});
	}
	const response = await appAssetCache.fetchAndCacheAsset(options);
	if (response) return response;
	logger.debug(`appAssetHandler performing default fetch for untracked request: ${url.href}`);
	return fetch(options.request);
};
/**
* Handles non-ok navigation responses (4xx, 5xx errors).
*
* Strategy:
* - For app-rendered errors: Return as-is to preserve React Router ErrorBoundary UI
* - For recoverable upstream errors (5xx, 408, 429): Try serving cached content first
* - For other upstream errors: Serve contextual fallback page with recovery options
*
* @param response - The error response from the server.
* @param request - The original navigation request.
* @returns The appropriate response to serve to the user.
*/
async function handleNavigationErrorResponse(response, request) {
	if (isAppRenderedErrorResponse(response)) {
		logger.debug(`App-rendered ${response.status} error for ${request.url} - returning as-is`);
		return response;
	}
	if (response.status === 404) {
		logger.info(`Received 404 for navigation request ${request.url}, throwing to catch handler for shared offline fallback handling`);
		throw new Error(`Received 404 for navigation request ${request.url}`);
	}
	if (response.status >= 500 || response.status === 408 || response.status === 429) {
		const cachedResponse = await appAssetCache.tryGetCachedAsset(request);
		if (cachedResponse) {
			logger.info(`Served cached content for failed navigation request ${response.status} error: ${request.url}`);
			return cachedResponse;
		} else logger.debug(`No cached content available for failed navigation request ${response.status} error: ${request.url}`);
	}
	logger.info(`Upstream ${response.status} error for ${request.url} - serving error fallback`);
	return new Response(createNavigationErrorFallbackHtml(response.status, request.url), {
		status: response.status,
		headers: {
			"Content-Type": "text/html; charset=utf-8",
			"Cache-Control": "no-store"
		}
	});
}
/**
* Cache-only navigation fallback used by offline/failed-network branches.
*
* Why cache-only?
* - These branches are entered after we've already decided the network is unavailable/unreliable.
* - Issuing another fetch here only adds latency and can trigger duplicate failing requests.
*/
async function resolveNavigationFromCacheOrOfflineFallback(request) {
	const cachedResponse = await appAssetCache.tryGetCachedAsset(request);
	if (cachedResponse) {
		logger.info(`Served cached navigation fallback for ${request.url}`);
		return cachedResponse;
	}
	logger.info(`No cached navigation fallback for ${request.url} - serving offline fallback page`);
	return new Response(OFFLINE_FALLBACK_HTML, {
		headers: {
			"Content-Type": "text/html; charset=utf-8",
			"Cache-Control": "no-store"
		},
		status: 503
	});
}
registerRoute(({ url, request }) => {
	return isSameOriginRequest(url) && request.mode === "navigate";
}, async (options) => {
	const { request, event } = options;
	const url = new URL(request.url);
	const networkTimeoutMs = await getNavigationNetworkTimeoutMs(url);
	logger.info(`Handling navigation request for ${request.url} with network timeout of ${networkTimeoutMs}ms`);
	if (url.pathname === "/auth/msa/blank.html" || url.pathname === "/auth/blank.html") {
		logger.info(`Serving blank.html for MSAL redirect URI: ${url}`);
		return new Response("<!DOCTYPE html>", {
			status: 200,
			headers: {
				"Content-Type": "text/html; charset=utf-8",
				"Cache-Control": "public, max-age=31536000, immutable",
				Expires: new Date(Date.now() + 365 * 24 * 60 * 60 * 1e3).toUTCString()
			}
		});
	}
	if (networkTimeoutMs <= 0 && !await getIsNativeOfflineMode()) {
		logger.info(`Navigation network fetch skipped due to zero timeout, falling back to cache immediately: ${request.url}`);
		return resolveNavigationFromCacheOrOfflineFallback(request);
	}
	try {
		const response = await fetchNavigationWithTimeout(request, networkTimeoutMs);
		const nativeOfflineBootstrapResponse = await tryCreateNativeOfflineModeBootstrapperResponse(url, response.status);
		if (nativeOfflineBootstrapResponse) return nativeOfflineBootstrapResponse;
		if (response.type === "opaqueredirect") {
			logger.info(`Navigation opaque redirect for ${request.url} -> passing through to browser`);
			return response;
		}
		if (response.status >= 300 && response.status < 400) {
			logger.info(`Navigation redirect (${response.status}) for ${request.url} -> passing through to browser`);
			return response;
		}
		if (response.ok) {
			await appAssetCache.cacheNavigationResponse(url, response, event);
			return response;
		}
		return handleNavigationErrorResponse(response, request);
	} catch (error) {
		const nativeOfflineBootstrapResponse = await tryCreateNativeOfflineModeBootstrapperResponse(url);
		if (nativeOfflineBootstrapResponse) return nativeOfflineBootstrapResponse;
		logger.debug(`Navigation network request failed, trying cache fallback: ${error instanceof Error ? error.message : "Unknown"}`);
		return resolveNavigationFromCacheOrOfflineFallback(request);
	}
}, "GET");
registerRoute(({ url, request }) => {
	return isSameOriginRequest(url) && request.mode !== "navigate";
}, appAssetHandler, "GET");
/**
* Reusable plugin to skip caching oversized images (strict 4 MB limit).
* - Fast path: Responses with Content-Length header (zero overhead)
* - Slow path: Chunked responses - streaming byte counter required (exact cached size, low memory, early abort)
* - Never caches if size check fails or if body size can't be measured
*/
var ImageSizePlugin = class {
	constructor(maxSizeBytes = 4 * 1024 * 1024) {
		_defineProperty(this, "maxSizeBytes", void 0);
		this.maxSizeBytes = maxSizeBytes;
	}
	async cacheWillUpdate({ response, request }) {
		if (!response) return null;
		if (response.type === "opaque") {
			logger.warn(`Unexpected opaque response for ${request.url} — unable to validate size, so disallowing caching`);
			return null;
		}
		const contentLength = response.headers.get("content-length");
		if (contentLength) {
			const size = parseInt(contentLength, 10);
			if (!isNaN(size) && size > this.maxSizeBytes) {
				logger.info(`Skipping caching of oversized image in response: ${request.url} — ${bytesToMB(size)} MB`);
				return null;
			}
			return response;
		}
		if (!response.body) {
			logger.warn(`Image response has no body for ${request.url} — skipping cache`);
			return null;
		}
		try {
			const reader = response.clone().body.getReader();
			let size = 0;
			while (true) {
				const { done, value } = await reader.read();
				if (done) break;
				size += value.length;
				if (size > this.maxSizeBytes) {
					logger.info(`Skipping caching of oversized image in opaque response: ${request.url} — exceeded ${this.maxSizeBytes} bytes`);
					await reader.cancel(new DOMException("Image size limit exceeded", "QuotaExceededError"));
					return null;
				}
			}
			return response;
		} catch (err) {
			logger.warn(`Failed to measure image size for ${request.url} — skipping cache`, err);
			return null;
		}
	}
};
/**
* Rejects stale opaque cached responses when the incoming request uses CORS mode.
* During the transition from no-cors to cors image fetches (via crossOrigin="anonymous"),
* existing opaque cache entries would cause browser-level network errors if served for
* cors-mode requests (per Fetch spec §24.1). This plugin forces a network fetch instead,
* allowing StaleWhileRevalidate's background revalidation to replace the entry with a
* proper CORS response.
*/
var OpaqueCorsGuardPlugin = class {
	async cachedResponseWillBeUsed({ cachedResponse, request }) {
		if (cachedResponse?.type === "opaque" && request.mode === "cors") {
			logger.verbose(`Rejecting opaque cached response for CORS request: ${request.url}`);
			return null;
		}
		return cachedResponse ?? null;
	}
};
/** Primary strategy for CORS images — non-opaque, real file sizes. */
var corsImageStrategy = new StaleWhileRevalidate({
	cacheName: IMAGE_CACHE_KEY,
	plugins: [
		new OpaqueCorsGuardPlugin(),
		new RequestLogPlugin("Image"),
		new CacheableResponsePlugin({ statuses: [200] }),
		new ImageSizePlugin(),
		new ExpirationPlugin({
			maxEntries: IS_LOWMEMORY_CLIENT ? 200 : 1e3,
			maxAgeSeconds: 3600 * 24 * 30,
			purgeOnQuotaError: true
		})
	]
});
/** Constrained strategy for opaque images — each padded to ~7 MB by browsers. */
var opaqueImageStrategy = new StaleWhileRevalidate({
	cacheName: OPAQUE_IMAGE_CACHE_KEY,
	plugins: [
		new RequestLogPlugin("OpaqueImage"),
		new CacheableResponsePlugin({ statuses: [0, 200] }),
		new ExpirationPlugin({
			maxEntries: 50,
			maxAgeSeconds: 3600 * 24 * 7,
			purgeOnQuotaError: true
		})
	]
});
/**
* Handle requests for dynamic images (e.g., PDP images) with tiered L2 caches.
* CORS images (from crossOrigin="anonymous") go to the primary cache with generous limits.
* Opaque images (from CSS background-image or non-CORS CDNs) go to a constrained cache
* to prevent ~7 MB per-entry browser estimates from incorrectly reporting excessive disk space consumption.
*/
registerRoute(({ request }) => request.destination === "image" || /\.(ico|jpg|jpeg|png|gif|svg|webp|avif)(\?.*)?$/i.test(request.url), async (options) => {
	try {
		if (IS_LOWMEMORY_CLIENT && options.request.mode !== "cors") return fetch(options.request);
		return await (options.request.mode === "cors" ? corsImageStrategy : opaqueImageStrategy).handle(options);
	} catch (err) {
		logger.warn(`Image fetch failed completely -> serving placeholder: ${options.request.url}`, err);
		return new Response(IMAGE_PLACEHOLDER, {
			status: 200,
			headers: {
				"Content-Type": "image/png",
				"Cache-Control": "public, max-age=31536000, immutable",
				"Content-Length": "68"
			}
		});
	}
});
/**
* Default handler if none of the registered handlers match the request.
*/
setDefaultHandler(async ({ event, request, url }) => {
	if (url.href.startsWith("https://catalog.gamepass.com/sigls/")) return await new NetworkFirst({
		cacheName: SIGL_CACHE_KEY,
		networkTimeoutSeconds: 3,
		plugins: [
			new RequestLogPlugin("Sigl"),
			new ExpirationPlugin({
				maxEntries: 500,
				maxAgeSeconds: 3600 * 24 * 30,
				purgeOnQuotaError: true
			}),
			new CacheableResponsePlugin({ statuses: [200] })
		]
	}).handle({
		event,
		request
	});
	logger.debug(`default handler issuing cross-origin request:${url.href} (destination: ${request.destination}, mode: ${request.mode})`);
	return fetch(request);
});
/**
* Error handler called if exceptions are thrown from any route handler.
*/
setCatchHandler((({ request, url }) => {
	if (isSameOriginRequest(url) && request.mode === "navigate") if (url.pathname === "/_external/init") {
		logger.error(`/_external/init failed to load - serving built-in error page for ${url}.`);
		const status = 404;
		return new Response(createNavigationErrorFallbackHtml(status, request.url), {
			status,
			headers: {
				"Content-Type": "text/html; charset=utf-8",
				"Cache-Control": "no-store"
			}
		});
	} else {
		const safeRedirectUri = getSafeInternalRedirectUri(url.pathname + url.search + url.hash, "/");
		const urlToRedirect = `/_external/init?redirectUri=${encodeURIComponent(safeRedirectUri)}`;
		logger.info(`Redirecting failed navigation request to ${urlToRedirect} for ${url}, so we can SPA nav to the requested url from there.`);
		return Response.redirect(urlToRedirect, 302);
	}
	logger.error(`request failed: ${url}, request.mode: ${request.mode}`);
	return Response.error();
}));
/**
* Quick type guard to check if the message data is a typed message.
* This is used to ensure that the message data has a 'type' property of type string,
* which is a common pattern for typed messages in ServiceWorkers, to avoid processing
* messages that are not intended for this ServiceWorker.
*/
function isTypedMessageData(e) {
	return typeof e === "object" && !!e && "type" in e && typeof e.type === "string";
}
self.addEventListener("message", async (e) => {
	if (!isTypedMessageData(e.data)) {
		logger.warn(`received unexpected message: ${JSON.stringify(e.data)}.`);
		return;
	}
	logger.info(`worker received app message: ${e.data.type}.`);
	switch (e.data.type) {
		case "SW_SKIP_WAITING":
			logger.info(`received 'SW_SKIP_WAITING' - calling self.skipWaiting().`);
			self.skipWaiting();
			break;
		case "SW_GET_VERSION":
			await logger.reset();
			e.ports[0].postMessage({
				type: "SW_VERSION_RESPONSE",
				payload: APP_VERSION
			});
			break;
		case "SW_GET_INSTALLED_APP_VERSION":
			try {
				const installData = await getInstallData();
				logger.info(`retrieved installed app version: ${installData?.appVersion ?? "none"}`);
				e.ports[0].postMessage({
					type: "SW_INSTALLED_APP_VERSION_RESPONSE",
					payload: installData?.appVersion
				});
			} catch (error) {
				logger.error(`error retrieving installed app version: ${error instanceof Error ? error.message : JSON.stringify(error)}`);
			}
			break;
		case "SW_INSTALL_APP":
			try {
				logger.info(`received SW_INSTALL_APP message - performing asset pre-caching for AppVersion:${APP_VERSION}`);
				const locale = e.data.payload.locale;
				await tryInstallWebApplication(locale);
				await appAssetCache.cleanup();
				logger.info(`successfully completed SW_INSTALL_APP for AppVersion:${APP_VERSION}`);
				e.ports[0].postMessage({
					type: "SW_INSTALL_APP_RESPONSE",
					payload: { appVersion: APP_VERSION }
				});
			} catch (error) {
				logger.error(`error during SW_INSTALL_APP handling: ${error instanceof Error ? error.message : JSON.stringify(error)}`);
				e.ports[0].postMessage({
					type: "SW_INSTALL_APP_RESPONSE",
					payload: {
						appVersion: APP_VERSION,
						errorMessage: error instanceof Error ? error.message : JSON.stringify(error)
					}
				});
			}
			break;
		case "SW_ENABLE_VERBOSE_LOGGING":
			try {
				logger.info(`received SW_ENABLE_VERBOSE_LOGGING message - setting verbose logging to: ${e.data.payload}`);
				await logger.setVerboseLogging(e.data.payload);
				e.ports[0].postMessage({
					type: "SW_ENABLE_VERBOSE_LOGGING_RESPONSE",
					payload: {}
				});
			} catch (error) {
				logger.error(`error during SW_ENABLE_VERBOSE_LOGGING handling: ${error instanceof Error ? error.message : JSON.stringify(error)}`);
				e.ports[0].postMessage({
					type: "SW_ENABLE_VERBOSE_LOGGING_RESPONSE",
					payload: { errorMessage: error instanceof Error ? error.message : JSON.stringify(error) }
				});
			}
			break;
		default:
			logger.warn(`received unrecognized message type: ${e.data.type}.`, { event: e });
			break;
	}
});
//#endregion
