{"scripts/advertising_toggle.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\nvar AdvertisingToggle;\n(function (AdvertisingToggle) {\n    let _m_elParent = $.GetContextPanel().FindChildInLayoutFile('id-friendslist-broadcast-toggle');\n    let _m_elBtn = _m_elParent.FindChildInLayoutFile('id-slider-btn');\n    let _m_lobbyListerFilter = '';\n    function _Init() {\n        _m_elBtn.SetPanelEvent('onactivate', _OnActivateToggle);\n    }\n    ;\n    function OnFilterPressed(sFilter) {\n        _m_lobbyListerFilter = sFilter;\n        _UpdateToggle();\n        _UpdateTooltip(PartyListAPI.GetCount() > 1);\n    }\n    AdvertisingToggle.OnFilterPressed = OnFilterPressed;\n    function _UpdateToggle() {\n        if (PartyListAPI.GetCount() > 1) {\n            _m_elBtn.checked = false;\n            _m_elBtn.enabled = false;\n            _UpdateTooltip(true);\n            return;\n        }\n        _m_elBtn.enabled = true;\n        _m_elBtn.checked = GetAdvertisingSetting() === _m_lobbyListerFilter;\n        _m_elBtn.SetDialogVariable('slide_toggle_text', $.Localize(\"#advertising_for_hire_\" + _m_lobbyListerFilter));\n        _UpdateTooltip(false);\n    }\n    ;\n    function _OnActivateToggle() {\n        let currentSetting = GetAdvertisingSetting();\n        let newSetting = currentSetting === _m_lobbyListerFilter ? '' : _m_lobbyListerFilter;\n        PartyListAPI.SetLocalPlayerForHireAdvertising(newSetting);\n    }\n    function GetAdvertisingSetting() {\n        let strAdvertising = PartyListAPI.GetLocalPlayerForHireAdvertising();\n        return strAdvertising.split('-')[0];\n    }\n    AdvertisingToggle.GetAdvertisingSetting = GetAdvertisingSetting;\n    function _AdvertisingChanged() {\n        let currentSetting = GetAdvertisingSetting();\n        _m_elBtn.checked = (currentSetting !== '' && currentSetting === _m_lobbyListerFilter);\n        PartyBrowserAPI.Refresh();\n    }\n    function _UpdateTooltip(isDisabled) {\n        let OnMouseOver = function () {\n            let tooltipText = isDisabled === true ? '#advertising_for_hire_tooltip_disabled' : '#advertising_for_hire_tooltip';\n            UiToolkitAPI.ShowTitleTextTooltip(_m_elBtn.id, '#advertising_for_hire_tooltip_title', tooltipText);\n        };\n        _m_elBtn.SetPanelEvent('onmouseover', OnMouseOver);\n        _m_elBtn.SetPanelEvent('onmouseout', function () { UiToolkitAPI.HideTitleTextTooltip(); });\n    }\n    ;\n    {\n        _Init();\n        $.RegisterForUnhandledEvent('PanoramaComponent_PartyBrowser_LocalPlayerForHireAdvertisingChanged', _AdvertisingChanged);\n        $.RegisterForUnhandledEvent(\"PanoramaComponent_PartyList_RebuildPartyList\", _UpdateToggle);\n    }\n})(AdvertisingToggle || (AdvertisingToggle = {}));\n","scripts/avatar.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"common/teamcolor.ts\" />\nvar CAvatar = class {\n    Init(elAvatar, xuid, type) {\n        const sXuid = xuid.toString();\n        switch (type) {\n            case 'playercard':\n            case 'partymember':\n                this.SetImage(elAvatar, sXuid);\n                this.SetFlair(elAvatar, sXuid, type);\n                this.SetTeamColor(elAvatar, sXuid);\n                this.SetLobbyLeader(elAvatar);\n                break;\n            case 'flair':\n                this.SetImage(elAvatar, sXuid);\n                this.SetFlair(elAvatar, sXuid, type);\n                break;\n            default:\n                this.SetImage(elAvatar, sXuid);\n                this.SetTeamColor(elAvatar, sXuid);\n        }\n    }\n    UpdateTalkingState(elAvatar, xuid, bCalledFromScheduledFunction) {\n        if (!elAvatar || !elAvatar.IsValid())\n            return;\n        const elSpeaking = elAvatar.FindChildTraverse('JsAvatarSpeaking');\n        if (!elSpeaking)\n            return;\n        const bFriendIsTalking = PartyListAPI.GetFriendIsTalking(xuid);\n        elSpeaking.SetHasClass('hidden', !bFriendIsTalking);\n        if (bFriendIsTalking && (bCalledFromScheduledFunction || !elAvatar.GetAttributeString('updatetalkingstate', ''))) {\n            const schfn = $.Schedule(.1, () => this.UpdateTalkingState(elAvatar, xuid, true));\n            elAvatar.SetAttributeString('updatetalkingstate', '' + schfn);\n        }\n        if (!bFriendIsTalking) {\n            elAvatar.SetAttributeString('updatetalkingstate', '');\n        }\n    }\n    ;\n    SetImage(elAvatar, xuid) {\n        const elImage = elAvatar.FindChildTraverse('JsAvatarImage');\n        if (xuid === '' || xuid === '0') {\n            elImage.AddClass('hidden');\n            return;\n        }\n        elImage.PopulateFromSteamID(xuid);\n        elImage.RemoveClass('hidden');\n    }\n    ;\n    SetFlair(elAvatar, xuid, type) {\n        const elFlair = elAvatar.FindChildTraverse('JsAvatarFlair');\n        if (xuid === '' || xuid === '0') {\n            elFlair.AddClass('hidden');\n            return;\n        }\n        let flairItemId = InventoryAPI.GetFlairItemId(xuid);\n        if (flairItemId === \"0\" || !flairItemId) {\n            const flairDefIdx = (type === 'partymember')\n                ? PartyListAPI.GetFriendDisplayItemDefFeatured(xuid)\n                : FriendsListAPI.GetFriendDisplayItemDefFeatured(xuid);\n            flairItemId = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(flairDefIdx, 0);\n            if (flairItemId === \"0\" || !flairItemId) {\n                elFlair.AddClass('hidden');\n                return;\n            }\n        }\n        const imagePath = InventoryAPI.GetItemInventoryImage(flairItemId);\n        if (imagePath !== '') {\n            elFlair.SetImage('file://{images}' + imagePath + '_small.png');\n            elFlair.RemoveClass('hidden');\n        }\n    }\n    ;\n    SetTeamColor(elAvatar, xuid) {\n        const teamColor = PartyListAPI.GetPartyMemberSetting(xuid, 'game/teamcolor');\n        const elTeamColor = elAvatar.FindChildTraverse('JsAvatarTeamColor');\n        if (!teamColor) {\n            if (elTeamColor)\n                elTeamColor.AddClass('hidden');\n            return;\n        }\n        if (typeof TeamColor !== 'undefined') {\n            const rgbColor = TeamColor.GetTeamColor(Number(teamColor));\n            elTeamColor.RemoveClass('hidden');\n            elTeamColor.style.washColor = 'rgb(' + rgbColor + ')';\n        }\n    }\n    ;\n    SetLobbyLeader(elAvatar) {\n        if (!elAvatar.hasOwnProperty(\"GetAttributeString\"))\n            return;\n        const show = elAvatar.GetAttributeString('showleader', '');\n        const elLeader = elAvatar.FindChildTraverse('JsAvatarLeader');\n        if (elLeader) {\n            if (show === 'show')\n                elLeader.RemoveClass('hidden');\n            else\n                elLeader.AddClass('hidden');\n        }\n    }\n    ;\n};\nvar Avatar = Avatar ?? new CAvatar();\n","scripts/characterbuttons.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"common/iteminfo.ts\" />\nvar CharacterButtons;\n(function (CharacterButtons) {\n    function _PopulateWeaponDropdownForCharacter(elDropdown, modelPanelSettings) {\n        const list = ItemInfo.GetLoadoutWeapons(modelPanelSettings.team);\n        if (!list || list.length == 0) {\n            return;\n        }\n        elDropdown.RemoveAllOptions();\n        for (let entry of list) {\n            const newEntry = $.CreatePanel('Panel', elDropdown, entry[1], {\n                'class': 'DropDownMenu'\n            });\n            newEntry.SetAcceptsFocus(true);\n            const elRarity = $.CreatePanel('Label', newEntry, 'rarity');\n            elRarity.style.width = '100%';\n            elRarity.style.height = '100%';\n            elRarity.style.padding = '0px 0px';\n            const rarityColor = InventoryAPI.GetItemRarityColor(entry[1]);\n            elRarity.style.backgroundColor = \"gradient( linear, 0% 0%, 100% 0%, from(\" + rarityColor + \" ),  color-stop( 0.0125, #00000000 ), to( #00000000 ) );\";\n            const elLabel = $.CreatePanel('Label', newEntry, 'label', {\n                'text': InventoryAPI.GetItemName(entry[1])\n            });\n            elDropdown.AddOption(newEntry);\n        }\n        elDropdown.SetPanelEvent('oninputsubmit', () => _OnUpdateWeaponSelection(elDropdown, modelPanelSettings));\n        elDropdown.SetSelected(modelPanelSettings.weaponItemId);\n    }\n    function _OnUpdateWeaponSelection(elDropdown, modelPanelSettings) {\n        modelPanelSettings.weaponItemId = elDropdown.GetSelected() ? elDropdown.GetSelected().id : \"\";\n        modelPanelSettings.panel.SetActiveCharacter(5);\n        CharacterAnims.PlayAnimsOnPanel(modelPanelSettings);\n    }\n    ;\n    function ZoomCamera() {\n        const data = $.GetContextPanel().Data();\n        const elZoomButton = $.GetContextPanel().FindChildInLayoutFile('LoadoutSingleItemModelZoom');\n        if (elZoomButton.checked) {\n            data.m_modelPanelSettings.panel.TransitionToCamera('cam_char_inspect_closeup', 0.5);\n        }\n        else {\n            data.m_modelPanelSettings.panel.TransitionToCamera('cam_char_inspect_wide', 0.5);\n        }\n    }\n    CharacterButtons.ZoomCamera = ZoomCamera;\n    function PlayCheer() {\n        const elZoomButton = $.GetContextPanel().FindChildInLayoutFile('LoadoutSingleItemModelZoom');\n        if (elZoomButton.checked)\n            elZoomButton.checked = false;\n        const data = $.GetContextPanel().Data();\n        data.m_modelPanelSettings.cameraPreset = data.m_characterToolbarButtonSettings.cameraPresetUnzoomed;\n        const modelRenderSettingsOneOffTempCopy = ItemInfo.DeepCopyVanityCharacterSettings(data.m_modelPanelSettings);\n        modelRenderSettingsOneOffTempCopy.cheer = InventoryAPI.GetCharacterDefaultCheerByItemId(modelRenderSettingsOneOffTempCopy.charItemId);\n        CharacterAnims.PlayAnimsOnPanel(modelRenderSettingsOneOffTempCopy);\n    }\n    CharacterButtons.PlayCheer = PlayCheer;\n    function PlayDefeat() {\n        const elZoomButton = $.GetContextPanel().FindChildInLayoutFile('LoadoutSingleItemModelZoom');\n        if (elZoomButton.checked)\n            elZoomButton.checked = false;\n        const data = $.GetContextPanel().Data();\n        data.m_modelPanelSettings.cameraPreset = data.m_characterToolbarButtonSettings.cameraPresetUnzoomed;\n        const modelRenderSettingsOneOffTempCopy = ItemInfo.DeepCopyVanityCharacterSettings(data.m_modelPanelSettings);\n        modelRenderSettingsOneOffTempCopy.cheer = InventoryAPI.GetCharacterDefaultDefeatByItemId(modelRenderSettingsOneOffTempCopy.charItemId);\n        CharacterAnims.PlayAnimsOnPanel(modelRenderSettingsOneOffTempCopy);\n    }\n    CharacterButtons.PlayDefeat = PlayDefeat;\n    function UpdateScenery() {\n        UiToolkitAPI.ShowCustomLayoutContextMenuParametersDismissEvent('id-inspect-contextmenu-maps', '', 'file://{resources}/layout/context_menus/context_menu_mainmenu_vanity.xml', 'type=maps' +\n            '&' + 'inspect-map=true', () => $.DispatchEvent('ContextMenuEvent', ''));\n    }\n    CharacterButtons.UpdateScenery = UpdateScenery;\n    function PreviewModelVoice() {\n        const data = $.GetContextPanel().Data();\n        InventoryAPI.PreviewModelVoice(data.m_modelPanelSettings.charItemId);\n    }\n    CharacterButtons.PreviewModelVoice = PreviewModelVoice;\n    function InitCharacterButtons(elButtons, elPreviewpanel, characterButtonSettings) {\n        if (!elButtons)\n            return;\n        elButtons.Children().forEach(el => el.enabled = true);\n        if (!elPreviewpanel)\n            return;\n        const elZoomButton = elButtons.FindChildInLayoutFile('LoadoutSingleItemModelZoom');\n        const modelPanelSettings = ItemInfo.GetOrUpdateVanityCharacterSettings(characterButtonSettings.charItemId);\n        modelPanelSettings.panel = elPreviewpanel;\n        modelPanelSettings.cameraPreset = elZoomButton.checked ? characterButtonSettings.cameraPresetZoomed : characterButtonSettings.cameraPresetUnzoomed;\n        const elDropdown = elButtons.FindChildInLayoutFile('LoadoutSingleItemModelWeaponChoice');\n        _PopulateWeaponDropdownForCharacter(elDropdown, modelPanelSettings);\n        const cheer = ItemInfo.GetDefaultCheer(modelPanelSettings.charItemId);\n        const elCheer = elButtons.FindChildInLayoutFile('PlayCheer');\n        elCheer.enabled = cheer != undefined && cheer != \"\";\n        const defeat = ItemInfo.GetDefaultDefeat(modelPanelSettings.charItemId);\n        const elDefeat = elButtons.FindChildInLayoutFile('PlayDefeat');\n        elDefeat.enabled = defeat != undefined && defeat != \"\";\n        elButtons.Data().m_characterToolbarButtonSettings = characterButtonSettings;\n        elButtons.Data().m_modelPanelSettings = modelPanelSettings;\n    }\n    CharacterButtons.InitCharacterButtons = InitCharacterButtons;\n})(CharacterButtons || (CharacterButtons = {}));\n","scripts/chat.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\nvar Chat;\n(function (Chat) {\n    let m_isContentPanelOpen = false;\n    let m_lastChatEntry = null;\n    let m_isChatType = $.GetContextPanel().GetParent().id === \"id-team-vote-middle\" ? true : false;\n    function _Init() {\n        let elInput = $('#ChatInput');\n        elInput.SetPanelEvent('oninputsubmit', _ChatTextSubmitted);\n        if (m_isChatType) {\n            _OpenChat();\n            return;\n        }\n        let elOpenChat = $.GetContextPanel().FindChildInLayoutFile('ChatContainer');\n        elOpenChat.SetPanelEvent(\"onactivate\", _OpenChat);\n        let elCloseChat = $.GetContextPanel().FindChildInLayoutFile('ChatCloseButton');\n        elCloseChat.SetPanelEvent(\"onactivate\", () => { _Close(); });\n    }\n    function _OpenChat() {\n        let elChatContainer = $('#ChatContainer');\n        if (!elChatContainer.BHasClass(\"chat-open\")) {\n            elChatContainer.RemoveClass('closed-minimized');\n            elChatContainer.AddClass(\"chat-open\");\n            $(\"#ChatInput\").SetFocus();\n            $.Schedule(.1, _ScrollToBottom);\n        }\n    }\n    function _Close() {\n        if (m_isChatType)\n            return true;\n        let elChatContainer = $('#ChatContainer');\n        if (elChatContainer.BHasClass(\"chat-open\")) {\n            elChatContainer.RemoveClass(\"chat-open\");\n            elChatContainer.SetFocus();\n            $.Schedule(.1, _ScrollToBottom);\n            _SetClosedHeight();\n            return true;\n        }\n        return false;\n    }\n    function _SetClosedHeight() {\n        let elChatContainer = $('#ChatContainer');\n        if (!elChatContainer.BHasClass(\"chat-open\")) {\n            elChatContainer.SetHasClass('closed-minimized', m_isContentPanelOpen);\n            $.Schedule(.1, _ScrollToBottom);\n        }\n    }\n    function _ChatTextSubmitted() {\n        if (m_lastChatEntry && (Date.now() - m_lastChatEntry < 200))\n            return;\n        else\n            m_lastChatEntry = Date.now();\n        if (m_isChatType) {\n            MatchDraftAPI.ActionPregameChat($('#ChatInput').text, false);\n        }\n        else {\n            $.GetContextPanel().SubmitChatText();\n        }\n        $('#ChatInput').text = \"\";\n    }\n    function _OnNewChatEntry() {\n        $.Schedule(.1, _ScrollToBottom);\n    }\n    function _ScrollToBottom() {\n        $('#ChatLinesContainer').ScrollToBottom();\n    }\n    function _SessionUpdate(status) {\n        let elChat = $.GetContextPanel().FindChildInLayoutFile('ChatPanelContainer');\n        if (status === 'closed')\n            _ClearChatMessages();\n        if (!LobbyAPI.IsSessionActive()) {\n            elChat.AddClass('hidden');\n        }\n        else {\n            let numPlayersActuallyInParty = PartyListAPI.GetCount();\n            let networkSetting = PartyListAPI.GetPartySessionSetting(\"system/network\");\n            elChat.SetHasClass('hidden', (networkSetting !== 'LIVE' && !m_isChatType));\n            if (networkSetting !== 'LIVE' && !m_isChatType) {\n                _Close();\n            }\n            let elPlaceholder = $.GetContextPanel().FindChildInLayoutFile('PlaceholderText');\n            if (m_isChatType) {\n                elPlaceholder.text = $.Localize('#party_chat_placeholder_pickban');\n            }\n            else if (numPlayersActuallyInParty > 1) {\n                elPlaceholder.text = $.Localize('#party_chat_placeholder');\n            }\n            else {\n                elPlaceholder.text = $.Localize('#party_chat_placeholder_empty_lobby');\n            }\n        }\n    }\n    function _ClearChatMessages() {\n        let elMessagesContainer = $('#ChatLinesContainer');\n        elMessagesContainer.RemoveAndDeleteChildren();\n    }\n    function _ClipPanelToNotOverlapSideBar(noClip) {\n        let panelToClip = $.GetContextPanel();\n        if (!panelToClip || panelToClip.BHasClass('hidden'))\n            return;\n        if ($.GetContextPanel().GetParent().id !== 'MainMenuFriendsAndParty')\n            return;\n        let panelToClipWidth = panelToClip.actuallayoutwidth;\n        let friendsListWidthWhenExpanded = panelToClip.GetParent().FindChildInLayoutFile('mainmenu-sidebar__blur-target').contentwidth;\n        let sideBarWidth = noClip ? 0 : friendsListWidthWhenExpanded;\n        let widthDiff = panelToClipWidth - sideBarWidth;\n        let clipPercent = (panelToClipWidth <= 0 || widthDiff <= 0 ? 1 : (widthDiff / panelToClipWidth)) * 100;\n        if (clipPercent)\n            panelToClip.style.clip = 'rect( 0%, ' + clipPercent + '%, 100%, 0% );';\n    }\n    ;\n    function _OnHideContentPanel() {\n        m_isContentPanelOpen = false;\n        _SetClosedHeight();\n    }\n    ;\n    function _OnShowContentPanel() {\n        m_isContentPanelOpen = true;\n        _SetClosedHeight();\n    }\n    ;\n    {\n        _Init();\n        $.RegisterForUnhandledEvent(\"PanoramaComponent_Lobby_MatchmakingSessionUpdate\", _SessionUpdate);\n        $.RegisterForUnhandledEvent(\"OnNewChatEntry\", _OnNewChatEntry);\n        $.RegisterEventHandler(\"Cancelled\", $.GetContextPanel(), _Close);\n        $.RegisterForUnhandledEvent('SidebarIsCollapsed', _ClipPanelToNotOverlapSideBar);\n        $.RegisterForUnhandledEvent('HideContentPanel', _OnHideContentPanel);\n        $.RegisterForUnhandledEvent('ShowContentPanel', _OnShowContentPanel);\n    }\n})(Chat || (Chat = {}));\n","scripts/common/add_major_tokens_anim.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\nvar AddMajorTokensAnim;\n(function (AddMajorTokensAnim) {\n    function SetTransitionEndEvent(elPanel) {\n        if (!elPanel.Data().PropertyTransitionEndHandler) {\n            function fnOnPropertyTransitionEndEventNotifications(panel, propertyName) {\n                if (elPanel === panel && propertyName === 'opacity') {\n                    if (elPanel.visible === true && elPanel.BIsTransparent()) {\n                        elPanel.visible = false;\n                        return true;\n                    }\n                }\n                return false;\n            }\n            elPanel.Data().PropertyTransitionEndHandler = $.RegisterEventHandler('PropertyTransitionEnd', elPanel, fnOnPropertyTransitionEndEventNotifications);\n        }\n    }\n    AddMajorTokensAnim.SetTransitionEndEvent = SetTransitionEndEvent;\n    function StartAnim(elPanel, elBalance, nCredits, CallAtEndAnimation) {\n        elPanel.TriggerClass('add_major_tokens__amount-anim');\n        elPanel.SetHasClass('hide-particles', false);\n        elPanel.SetDialogVariableInt('credits', nCredits);\n        $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.XP.NewSkillGroup', 'MOUSE');\n        let elCredits = elPanel.FindChildInLayoutFile('id-major-store-add-tokens-credits');\n        if (!elCredits) {\n            elCredits = $.CreatePanel('Panel', elPanel, 'id-major-store-add-tokens-credits');\n            elCredits.BLoadLayoutSnippet('credits-text');\n        }\n        $.Schedule(1.5, () => {\n            const balancePos = elBalance.GetPositionWithinWindow();\n            const notificationPos = elPanel.GetPositionWithinWindow();\n            const newXPos = Math.floor(balancePos.x / elPanel.actualuiscale_x - notificationPos.x / elPanel.actualuiscale_x) - Math.floor((elPanel.actuallayoutwidth / elPanel.actualuiscale_x) / 2.0);\n            const newYPos = Math.floor(balancePos.y / elPanel.actualuiscale_y - notificationPos.y / elPanel.actualuiscale_y) - Math.floor((elPanel.actuallayoutheight / elPanel.actualuiscale_y) / 2.05);\n            elCredits.SetPositionInPixels(newXPos, newYPos, 0);\n            elCredits.style.preTransformScale2d = '.4;';\n            elPanel.SetHasClass('hide-particles', true);\n            $.Schedule(1, () => {\n                CallAtEndAnimation();\n                $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.gift_claim', 'MOUSE');\n                elCredits.DeleteAsync(0);\n            });\n        });\n    }\n    AddMajorTokensAnim.StartAnim = StartAnim;\n})(AddMajorTokensAnim || (AddMajorTokensAnim = {}));\n","scripts/common/anim_background.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\nvar HudSpecatorBg;\n(function (HudSpecatorBg) {\n    const m_elBg = $.GetContextPanel().FindChildTraverse('AnimBackground');\n    function PickBg(xuid) {\n        if (!m_elBg || !m_elBg.IsValid()) {\n            return;\n        }\n        m_elBg.PopulateFromSteamID(xuid);\n    }\n    HudSpecatorBg.PickBg = PickBg;\n})(HudSpecatorBg || (HudSpecatorBg = {}));\n","scripts/common/async.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\nvar Async;\n(function (Async) {\n    function Delay(fDelay, value) {\n        return new Promise(resolve => $.Schedule(fDelay, () => resolve(value)));\n    }\n    Async.Delay = Delay;\n    function NextFrame() {\n        return Delay(0.0);\n    }\n    Async.NextFrame = NextFrame;\n    function UnhandledEvent(sEvent) {\n        return new Promise(resolve => {\n            const nHandlerId = $.RegisterForUnhandledEvent(sEvent, function (...args) {\n                $.UnregisterForUnhandledEvent(sEvent, nHandlerId);\n                resolve(args);\n            });\n        });\n    }\n    Async.UnhandledEvent = UnhandledEvent;\n    class AbortController {\n        signal;\n        _aborted = false;\n        constructor() {\n            const controller = this;\n            this.signal = { get aborted() { return controller._aborted; } };\n        }\n        abort() {\n            this._aborted = true;\n        }\n    }\n    Async.AbortController = AbortController;\n    function Condition(predicate, abortSignal) {\n        return new Promise(resolve => {\n            (async function () {\n                while (abortSignal === undefined || !abortSignal.aborted) {\n                    if (predicate()) {\n                        resolve();\n                        return;\n                    }\n                    await NextFrame();\n                }\n            })();\n        });\n    }\n    Async.Condition = Condition;\n    function RunSequence(sequenceFn, abortSignal) {\n        return new Promise(resolve => {\n            (async function () {\n                const generator = sequenceFn(abortSignal || new Async.AbortController().signal);\n                let value;\n                while (true) {\n                    const iterResult = await generator.next(value);\n                    if (iterResult.done) {\n                        resolve(true);\n                        return;\n                    }\n                    value = await iterResult.value;\n                    if (abortSignal && abortSignal.aborted) {\n                        resolve(false);\n                        return;\n                    }\n                }\n            })();\n        });\n    }\n    Async.RunSequence = RunSequence;\n    class TimeStamp {\n        frameTime = $.FrameTime();\n        Schedule(fDelay, fn) {\n            const fDelayFromNow = fDelay - ($.FrameTime() - this.frameTime);\n            $.Schedule(fDelayFromNow, fn);\n        }\n        Delay(fDelay, value) {\n            return new Promise(resolve => this.Schedule(fDelay, () => resolve(value)));\n        }\n    }\n    Async.TimeStamp = TimeStamp;\n})(Async || (Async = {}));\n","scripts/common/characteranims.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"iteminfo.ts\" />\nvar CharacterAnims;\n(function (CharacterAnims) {\n    function NormalizeTeamName(team, bShort = false) {\n        team = String(team).toLowerCase();\n        switch (team) {\n            case '2':\n            case 't':\n            case 'terrorist':\n            case 'team_t':\n                return bShort ? 't' : 'terrorist';\n            case '3':\n            case 'ct':\n            case 'counter-terrorist':\n            case 'team_ct':\n                return 'ct';\n            default:\n                return '';\n        }\n    }\n    CharacterAnims.NormalizeTeamName = NormalizeTeamName;\n    function PlayAnimsOnPanel(importedSettings, bDontStompModel = false, makeDeepCopy = true) {\n        if (importedSettings === null) {\n            return;\n        }\n        const settings = makeDeepCopy ? ItemInfo.DeepCopyVanityCharacterSettings(importedSettings) : importedSettings;\n        if (!settings.team || settings.team == \"\")\n            settings.team = 'ct';\n        settings.team = NormalizeTeamName(settings.team);\n        if (settings.modelOverride) {\n            settings.model = settings.modelOverride;\n        }\n        else {\n            settings.model = ItemInfo.GetModelPlayer(settings.charItemId);\n            if (!settings.model) {\n                if (settings.team == 'ct')\n                    settings.model = \"agents/models/ctm_sas/ctm_sas.vmdl\";\n                else\n                    settings.model = \"agents/models/tm_phoenix/tm_phoenix.vmdl\";\n            }\n        }\n        const wid = settings.weaponItemId;\n        const playerPanel = settings.panel;\n        CancelScheduledAnim(playerPanel);\n        ResetLastRandomAnimHandle(playerPanel);\n        if (settings.manifest)\n            playerPanel.SetScene(settings.manifest, settings.model, false);\n        if (!bDontStompModel) {\n            playerPanel.SetPlayerCharacterItemID(settings.charItemId);\n            playerPanel.SetPlayerModel(settings.model);\n        }\n        playerPanel.EquipPlayerWithItem(wid);\n        playerPanel.EquipPlayerWithItem(settings.glovesItemId);\n        playerPanel.EquipPlayerWithPet(settings.petItemId);\n        if (settings.cheer != null) {\n            playerPanel.ApplyCheer(settings.cheer);\n        }\n        let cam = 1;\n        if (settings.cameraPreset != null) {\n            cam = settings.cameraPreset;\n        }\n    }\n    CharacterAnims.PlayAnimsOnPanel = PlayAnimsOnPanel;\n    function CancelScheduledAnim(playerPanel) {\n        if (playerPanel.Data().handle) {\n            $.CancelScheduled(playerPanel.Data().handle);\n            playerPanel.Data().handle = null;\n        }\n    }\n    CharacterAnims.CancelScheduledAnim = CancelScheduledAnim;\n    function ResetLastRandomAnimHandle(playerPanel) {\n        if (playerPanel.Data().lastRandomAnim !== -1) {\n            playerPanel.Data().lastRandomAnim = -1;\n        }\n    }\n    function GetValidCharacterModels(bUniquePerTeamModelsOnly) {\n        InventoryAPI.SetInventorySortAndFilters('inv_sort_rarity', false, 'customplayer', '', '');\n        const count = InventoryAPI.GetInventoryCount();\n        let aAllItems = [];\n        for (let i = 0; i < count; i++) {\n            const itemId = InventoryAPI.GetInventoryItemIDByIndex(i);\n            aAllItems.push(itemId);\n        }\n        let loadoutItemId = LoadoutAPI.GetItemID('ct', 'customplayer');\n        aAllItems.unshift(loadoutItemId);\n        loadoutItemId = LoadoutAPI.GetItemID('t', 'customplayer');\n        aAllItems.unshift(loadoutItemId);\n        const itemsList = [];\n        const uniqueTracker = {};\n        const allItemsCount = aAllItems.length;\n        for (let i = 0; i < allItemsCount; i++) {\n            const itemId = aAllItems[i];\n            const modelplayer = ItemInfo.GetModelPlayer(itemId);\n            if (!modelplayer)\n                continue;\n            const team = (InventoryAPI.GetItemTeam(itemId).search('Team_T') === -1) ? 'ct' : 't';\n            if (bUniquePerTeamModelsOnly) {\n                if (uniqueTracker.hasOwnProperty(team + modelplayer))\n                    continue;\n                uniqueTracker[team + modelplayer] = 1;\n            }\n            const label = InventoryAPI.GetItemName(itemId);\n            const entry = {\n                label: label,\n                team: team,\n                itemId: itemId\n            };\n            itemsList.push(entry);\n        }\n        return itemsList;\n    }\n    CharacterAnims.GetValidCharacterModels = GetValidCharacterModels;\n})(CharacterAnims || (CharacterAnims = {}));\n","scripts/common/commonutil.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\nvar CommonUtil;\n(function (CommonUtil) {\n    const remap_lang_to_region = {\n        af: 'za',\n        ar: 'sa',\n        be: 'by',\n        cs: 'cz',\n        da: 'dk',\n        el: 'gr',\n        en: 'gb',\n        et: 'ee',\n        ga: 'ie',\n        he: 'il',\n        hi: 'in',\n        ja: 'jp',\n        kk: 'kz',\n        ko: 'kr',\n        nn: 'no',\n        sl: 'si',\n        sr: 'rs',\n        sv: 'se',\n        uk: 'ua',\n        ur: 'pk',\n        vi: 'vn',\n        zh: 'cn',\n        zu: 'za',\n    };\n    const valid_country_codes = [\n        \"ae\", \"ar\", \"asia\", \"at\", \"au\", \"be\", \"bg\", \"br\", \"by\", \"ca\",\n        \"cc\", \"ch\", \"cl\", \"cn\", \"cz\", \"de\", \"dk\", \"dz\", \"ee\", \"es\",\n        \"eu\", \"fi\", \"fr\", \"gb\", \"gp\", \"gr\", \"hk\", \"hr\", \"hu\", \"id\",\n        \"ie\", \"il\", \"in\", \"ir\", \"is\", \"it\", \"jp\", \"kr\", \"kz\", \"lt\",\n        \"lu\", \"lv\", \"ly\", \"mk\", \"mo\", \"mx\", \"my\", \"nam\", \"nl\", \"no\",\n        \"nz\", \"oce\", \"pe\", \"ph\", \"pk\", \"pl\", \"pt\", \"re\", \"ro\", \"rs\",\n        \"ru\", \"sa\", \"sam\", \"se\", \"sg\", \"si\", \"sk\", \"sq\", \"th\", \"tr\",\n        \"tw\", \"ua\", \"us\", \"ve\", \"vn\", \"za\",\n    ];\n    function SetRegionOnLabel(isoCode, elPanel, tooltip = true) {\n        let tooltipString = \"\";\n        if (isoCode) {\n            tooltipString = $.Localize(\"#SFUI_Country_\" + isoCode.toUpperCase());\n        }\n        SetDataOnLabelInternal(isoCode, isoCode, tooltip ? tooltipString : \"\", elPanel, tooltipString ? false : true);\n    }\n    CommonUtil.SetRegionOnLabel = SetRegionOnLabel;\n    function SetLanguageOnLabel(isoCode, elPanel, tooltip = true) {\n        let tooltipString = \"\";\n        let imgCode = isoCode;\n        if (isoCode) {\n            const sTranslated = $.Localize(\"#Language_Name_Translated_\" + isoCode);\n            const sLocal = $.Localize(\"#Language_Name_Native_\" + isoCode);\n            if (sTranslated && sLocal && sTranslated === sLocal) {\n                tooltipString = sLocal;\n            }\n            else {\n                tooltipString = (sTranslated && sLocal) ? sTranslated + \" (\" + sLocal + \")\" : \"\";\n            }\n            if (remap_lang_to_region[isoCode]) {\n                imgCode = remap_lang_to_region[isoCode];\n            }\n        }\n        SetDataOnLabelInternal(isoCode, imgCode, tooltip ? tooltipString : \"\", elPanel, tooltipString ? false : true);\n    }\n    CommonUtil.SetLanguageOnLabel = SetLanguageOnLabel;\n    function SetDataOnLabelInternal(isoCode, imgCode, tooltipString, elPanel, bWarningColor) {\n        if (!elPanel)\n            return;\n        const elLabel = elPanel.FindChildTraverse('JsRegionLabel');\n        elLabel.AddClass('visible-if-not-perfectworld');\n        if (isoCode) {\n            elLabel.text = isoCode.toUpperCase();\n            imgCode = imgCode.toLowerCase();\n            imgCode = valid_country_codes.indexOf(imgCode) > -1 ? imgCode : \"world\";\n            elLabel.style.backgroundImage = 'url(\"file://{images}/regions/' + imgCode + '.png\")';\n            let elTTAnchor = elLabel.FindChildTraverse('region-tt-anchor');\n            if (!elTTAnchor) {\n                elTTAnchor = $.CreatePanel(\"Panel\", elLabel, elPanel.id + '-region-tt-anchor');\n            }\n            if (tooltipString) {\n                elLabel.SetPanelEvent('onmouseover', () => UiToolkitAPI.ShowTextTooltip(elTTAnchor.id, tooltipString));\n                elLabel.SetPanelEvent('onmouseout', () => UiToolkitAPI.HideTextTooltip());\n            }\n            elLabel.RemoveClass('hidden');\n            elLabel.SetHasClass('world-region-label', true);\n            elLabel.SetHasClass('world-region-label--image', true);\n        }\n        else {\n            elLabel.AddClass('hidden');\n            elLabel.SetHasClass('world-region-label', false);\n            elLabel.SetHasClass('world-region-label--image', false);\n        }\n    }\n})(CommonUtil || (CommonUtil = {}));\n","scripts/common/dateutil.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\nvar DateUtil;\n(function (DateUtil) {\n    function PopulateDateFormatStrings(panel, date) {\n        panel.SetDialogVariableInt('M', date.getMonth() + 1);\n        const monthPaddedNumber = ('0' + (date.getMonth() + 1)).slice(-2);\n        panel.SetDialogVariable('MM', monthPaddedNumber);\n        panel.SetDialogVariable('MMM', $.Localize('#MonthName' + monthPaddedNumber + '_Short'));\n        panel.SetDialogVariable('MMMM', $.Localize('#MonthName' + monthPaddedNumber + '_Long'));\n        panel.SetDialogVariableInt('d', date.getDate());\n        const dayPaddedNumber = ('0' + (date.getDate())).slice(-2);\n        panel.SetDialogVariable('dd', dayPaddedNumber);\n        panel.SetDialogVariable('ddd', $.Localize('#LOC_Date_DayShort' + date.getDay()));\n        panel.SetDialogVariable('dddd', $.Localize('#LOC_Date_Day' + date.getDay()));\n    }\n    DateUtil.PopulateDateFormatStrings = PopulateDateFormatStrings;\n})(DateUtil || (DateUtil = {}));\n","scripts/common/eventutil.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\nvar EventUtil;\n(function (EventUtil) {\n    const _eventIdSet = new Set([\n        '5277',\n        '5278',\n        '5279',\n        '5281',\n        '5282',\n        '5356',\n        '5339',\n        '5338',\n        '5376',\n        '5500',\n        '5506',\n        '5465',\n        '5464',\n        '5937',\n        '5967',\n        '4866',\n        '6207',\n    ]);\n    function AnnotateOfficialEvents(jsonEvents) {\n        for (let event of jsonEvents) {\n            if (_eventIdSet.has(event.event_id)) {\n                event.is_official = true;\n            }\n        }\n        return jsonEvents;\n    }\n    EventUtil.AnnotateOfficialEvents = AnnotateOfficialEvents;\n    function GetTournamentWinner(tournamentId, numTeams) {\n        let ProEventJSO = TournamentsAPI.GetProEventDataJSO(tournamentId, numTeams);\n        let oWinningTeam;\n        if (ProEventJSO\n            && ProEventJSO.hasOwnProperty('eventdata')\n            && ProEventJSO['eventdata'].hasOwnProperty(tournamentId)) {\n            oWinningTeam = ProEventJSO['eventdata'][tournamentId][0];\n        }\n        return oWinningTeam;\n    }\n    EventUtil.GetTournamentWinner = GetTournamentWinner;\n    ;\n})(EventUtil || (EventUtil = {}));\n","scripts/common/flip_panel_anim.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\nvar FlipPanelAnimation = class {\n    oData;\n    get ActiveIndex() { return this.oData.activeIndex; }\n    set ActiveIndex(value) { this.oData.activeIndex = value; }\n    set CallbackData(value) { this.oData.oCallbackData = value; }\n    constructor(oData) {\n        this.oData = oData;\n    }\n    AddParamToCallbackData(param, value) {\n        this.oData.oCallbackData[param] = value;\n    }\n    ControlBtnActions() {\n        if (this.oData.controlBtnPrev) {\n            this.oData.controlBtnPrev.SetPanelEvent('onactivate', this.oData.funcCallback.bind(this, this.oData, true));\n            this.oData.controlBtnNext.SetPanelEvent('onactivate', this.oData.funcCallback.bind(this, this.oData, false));\n            this.oData.controlBtnPrev.enabled = false;\n            this.oData.controlBtnNext.enabled = false;\n        }\n    }\n    UpdateTextLabel(elPanel, aTextData) {\n        aTextData.forEach(element => {\n            if (typeof element.value == 'number' && element.value > 0) {\n                elPanel.SetDialogVariableInt(element.name, element.value);\n            }\n            else if (element.value) {\n                elPanel.SetDialogVariable(element.name, element.value.toString());\n            }\n        });\n    }\n    UseCallback() {\n        this.oData.funcCallback(this.oData, false);\n    }\n    DetermineVisiblePanel(animPanelA, animPanelB) {\n        return animPanelA.BHasClass('flip-panel-anim-down-show') || animPanelA.BHasClass('flip-panel-anim-up-show') ? animPanelA : animPanelB;\n    }\n    BtnPressNextAnim(panelA, panelB) {\n        const visiblePanel = this.DetermineVisiblePanel(panelA, panelB);\n        const hiddenPanel = visiblePanel === panelA ? panelB : panelA;\n        visiblePanel.RemoveClass('flip-panel-anim-transition');\n        visiblePanel.RemoveClass('flip-panel-anim-up-hidden');\n        visiblePanel.RemoveClass('flip-panel-anim-down-show');\n        visiblePanel.RemoveClass('flip-panel-anim-up-show');\n        visiblePanel.RemoveClass('flip-panel-anim-down-hidden');\n        visiblePanel.AddClass('flip-panel-anim-transition');\n        visiblePanel.AddClass('flip-panel-anim-down-hidden');\n        hiddenPanel.RemoveClass('flip-panel-anim-transition');\n        hiddenPanel.RemoveClass('flip-panel-anim-down-hidden');\n        hiddenPanel.AddClass('flip-panel-anim-up-hidden');\n        hiddenPanel.AddClass('flip-panel-anim-transition');\n        hiddenPanel.AddClass('flip-panel-anim-down-show');\n    }\n    BtnPressPrevAnim(panelA, panelB) {\n        const visiblePanel = this.DetermineVisiblePanel(panelA, panelB);\n        const hiddenPanel = visiblePanel === panelA ? panelB : panelA;\n        visiblePanel.RemoveClass('flip-panel-anim-transition');\n        visiblePanel.RemoveClass('flip-panel-anim-up-hidden');\n        visiblePanel.RemoveClass('flip-panel-anim-down-show');\n        visiblePanel.RemoveClass('flip-panel-anim-up-show');\n        visiblePanel.RemoveClass('flip-panel-anim-down-hidden');\n        visiblePanel.AddClass('flip-panel-anim-transition');\n        visiblePanel.AddClass('flip-panel-anim-up-hidden');\n        hiddenPanel.RemoveClass('flip-panel-anim-transition');\n        hiddenPanel.RemoveClass('flip-panel-anim-up-hidden');\n        hiddenPanel.AddClass('flip-panel-anim-down-hidden');\n        hiddenPanel.AddClass('flip-panel-anim-transition');\n        hiddenPanel.AddClass('flip-panel-anim-up-show');\n    }\n    DetermineHiddenPanel(animPanelA, animPanelB) {\n        return (!animPanelA.BHasClass('flip-panel-anim-down-show') &&\n            !animPanelA.BHasClass('flip-panel-anim-up-show')) ?\n            animPanelA : animPanelB;\n    }\n};\n","scripts/common/formattext.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\nvar CFormattedText = class {\n    tag;\n    vars;\n    constructor(strLocTag, mapDialogVars) {\n        this.tag = strLocTag;\n        this.vars = Object.assign({}, mapDialogVars);\n    }\n    SetOnLabel(elLabel) {\n        FormatText.SetFormattedTextOnLabel(elLabel, this);\n    }\n};\nvar FormatText;\n(function (FormatText) {\n    function SetFormattedTextOnLabel(elLabel, fmtText) {\n        if (!elLabel || !elLabel.IsValid()) {\n            return;\n        }\n        ClearFormattedTextFromLabel(elLabel);\n        elLabel.text = fmtText.tag;\n        elLabel.fmtTextVars = {};\n        for (const varName in fmtText.vars) {\n            elLabel.SetDialogVariable(varName, elLabel.html ? $.HTMLEscape(fmtText.vars[varName]) : fmtText.vars[varName]);\n            elLabel.fmtTextVars[varName] = true;\n        }\n    }\n    FormatText.SetFormattedTextOnLabel = SetFormattedTextOnLabel;\n    function ClearFormattedTextFromLabel(elLabel) {\n        elLabel.text = '';\n        if (!elLabel.fmtTextVars)\n            return;\n        for (const varName in elLabel.fmtTextVars) {\n            elLabel.SetDialogVariable(varName, '');\n        }\n        delete elLabel.fmtTextVars;\n    }\n    function SecondsToDDHHMMSSWithSymbolSeperator(rawSeconds) {\n        const time = ConvertSecondsToDaysHoursMinSec(rawSeconds);\n        const timeText = [];\n        let returnRemaining = false;\n        for (const key in time) {\n            const value = time[key];\n            if ((value > 0 && !returnRemaining) || key == 'minutes')\n                returnRemaining = true;\n            if (returnRemaining) {\n                const valueToShow = (value < 10) ? ('0' + value.toString()) : value.toString();\n                timeText.push(valueToShow);\n            }\n        }\n        return timeText.join(':');\n    }\n    FormatText.SecondsToDDHHMMSSWithSymbolSeperator = SecondsToDDHHMMSSWithSymbolSeperator;\n    function SecondsToSignificantTimeString(rawSeconds) {\n        rawSeconds = Math.floor(Number(rawSeconds));\n        if (rawSeconds < 60)\n            return $.ConstructString('#SFUI_Store_Timer_Min:f', { value: 1 });\n        const time = ConvertSecondsToDaysHoursMinSec(rawSeconds);\n        let timecomponents = ['days', 'hours', 'minutes', 'seconds'];\n        for (const idx in timecomponents) {\n            const key = timecomponents[idx];\n            let value = time[key];\n            if (key == 'seconds')\n                break;\n            if (value <= 0)\n                continue;\n            let lockey = '#SFUI_Store_Timer_Day:f';\n            if (key == 'days') {\n                if (time['hours'] > 16)\n                    ++value;\n            }\n            else if (key == 'hours') {\n                lockey = '#SFUI_Store_Timer_Hour:f';\n                if (time['minutes'] > 40)\n                    ++value;\n            }\n            else if (key == 'minutes') {\n                lockey = '#SFUI_Store_Timer_Min:f';\n                if (time['seconds'] > 40)\n                    ++value;\n            }\n            return $.ConstructString(lockey, { value: value });\n        }\n        return $.ConstructString('#SFUI_Store_Timer_Min:f', { value: 1 });\n    }\n    FormatText.SecondsToSignificantTimeString = SecondsToSignificantTimeString;\n    function ConvertSecondsToDaysHoursMinSec(rawSeconds) {\n        rawSeconds = Number(rawSeconds);\n        const time = {\n            days: Math.floor(rawSeconds / 86400),\n            hours: Math.floor((rawSeconds % 86400) / 3600),\n            minutes: Math.floor(((rawSeconds % 86400) % 3600) / 60),\n            seconds: ((rawSeconds % 86400) % 3600) % 60\n        };\n        return time;\n    }\n    function PadNumber(integer, digits, char = '0') {\n        integer = integer.toString();\n        while (integer.length < digits)\n            integer = char + integer;\n        return integer;\n    }\n    FormatText.PadNumber = PadNumber;\n    function SplitAbbreviateNumber(number, fixed = 0) {\n        if (number < 0)\n            return -1;\n        let pow10 = Math.log10(number) | 0;\n        let stringToken = \"\";\n        const locFilePrefix = \"#NumberAbbreviation_suffix_E\";\n        do {\n            stringToken = locFilePrefix + [pow10];\n            if ($.CanLocalize(stringToken))\n                break;\n        } while (--pow10 > 0);\n        if (!$.CanLocalize(stringToken))\n            return [number.toString(), ''];\n        const scale = Math.pow(10, pow10);\n        const scaledNumber = number / scale;\n        const decimals = scaledNumber < 10.0 ? 1 : 0;\n        const finalNum = scaledNumber.toFixed(fixed).replace(/\\.0+$/, '');\n        return [finalNum, $.Localize(stringToken)];\n    }\n    FormatText.SplitAbbreviateNumber = SplitAbbreviateNumber;\n    function AbbreviateNumber(number) {\n        if (number < 0)\n            return -1;\n        let pow10 = Math.log10(number) | 0;\n        let stringToken = \"\";\n        const locFilePrefix = \"#NumberAbbreviation_E\";\n        do {\n            stringToken = locFilePrefix + [pow10];\n            if ($.CanLocalize(stringToken))\n                break;\n        } while (--pow10 > 0);\n        if (!$.CanLocalize(stringToken))\n            return number.toString();\n        const scale = Math.pow(10, pow10);\n        const scaledNumber = number / scale;\n        const decimals = scaledNumber < 10.0 ? 1 : 0;\n        const finalNum = scaledNumber.toFixed(decimals).replace(/\\.0+$/, '');\n        $.GetContextPanel().SetDialogVariable('abbreviated_number', finalNum);\n        const result = $.Localize(stringToken, $.GetContextPanel());\n        return result;\n    }\n    FormatText.AbbreviateNumber = AbbreviateNumber;\n    function FormatRentalTime(expirationDate) {\n        let currentDate = Math.trunc(Date.now() / 1000);\n        if (expirationDate <= currentDate) {\n            return {\n                time: '',\n                locString: '#item-rental-time-expired',\n                isExpired: true\n            };\n        }\n        else {\n            let seconds = expirationDate - currentDate;\n            return {\n                time: FormatText.SecondsToSignificantTimeString(seconds),\n                locString: '#item-rental-time-remaining',\n                isExpired: false\n            };\n        }\n    }\n    FormatText.FormatRentalTime = FormatRentalTime;\n    function FormatExpirationToDDHHMMSSWithSymbolSeperator(expirationDate) {\n        let currentDate = Math.trunc(Date.now() / 1000);\n        if (expirationDate <= currentDate) {\n            return {\n                time: '',\n                locString: '#item-rental-time-expired',\n                isExpired: true\n            };\n        }\n        else {\n            let seconds = expirationDate - currentDate;\n            return {\n                time: FormatText.SecondsToDDHHMMSSWithSymbolSeperator(seconds),\n                locString: '#item-rental-time-remaining',\n                isExpired: false,\n                seconds: seconds\n            };\n        }\n    }\n    FormatText.FormatExpirationToDDHHMMSSWithSymbolSeperator = FormatExpirationToDDHHMMSSWithSymbolSeperator;\n    function FormatPetFoodTimeRemaining(expirationDate) {\n        let currentDate = Math.trunc(Date.now() / 1000);\n        let seconds = expirationDate - currentDate;\n        return {\n            time: FormatText.SecondsToSignificantTimeString(seconds),\n            locString: '#pet_food_time_remaining',\n            isExpired: false\n        };\n    }\n    FormatText.FormatPetFoodTimeRemaining = FormatPetFoodTimeRemaining;\n    function FormatNumberToNiceString(value, nsigdigits) {\n        let strNum = value.toFixed(nsigdigits);\n        strNum = strNum.replace('.', $.Localize('#LOC_Number_DecimalPoint'));\n        strNum = strNum.replace(/\\B(?=(\\d{3})+(?!\\d))/g, $.Localize(\"#LOC_Number_Grouping\"));\n        return strNum;\n    }\n    FormatText.FormatNumberToNiceString = FormatNumberToNiceString;\n})(FormatText || (FormatText = {}));\n","scripts/common/gamerules_constants.js":"\"use strict\";\nvar dictPlayerStatusImage = {\n    0: \"\",\n    1: \"file://{images}/icons/ui/elimination.svg\",\n    2: \"file://{images}/icons/ui/bomb_c4.svg\",\n    3: \"file://{images}/icons/ui/dominated.svg\",\n    4: \"file://{images}/icons/ui/dominated_dead.svg\",\n    5: \"file://{images}/icons/ui/nemesis.svg\",\n    6: \"file://{images}/icons/ui/nemesis_dead.svg\",\n    7: \"file://{images}/icons/equipment/defuser.svg\",\n    8: \"file://{images}/icons/ui/VoteTeamSwitch.svg\",\n    9: \"file://{images}/icons/ui/switch_teams_dead.svg\",\n    10: \"file://{images}/icons/ui/two_stack_line.svg\",\n    11: \"file://{images}/icons/ui/two_stack.svg\",\n    12: \"file://{images}/icons/ui/three_stack.svg\",\n    13: \"file://{images}/icons/ui/four_stack.svg\",\n    14: \"file://{images}/icons/ui/five_stack.svg\",\n    15: \"file://{images}/icons/ui/disconnect.svg\"\n};\nvar dictRoundResultImage = {\n    \"win_elimination\": \"file://{images}/icons/ui/kill.svg\",\n    \"win_rescue\": \"file://{images}/icons/ui/rescue.svg\",\n    \"win_defuse\": \"file://{images}/icons/equipment/defuser.svg\",\n    \"win_time\": \"file://{images}/icons/ui/timer.svg\",\n    \"win_bomb\": \"file://{images}/icons/ui/bomb.svg\",\n    \"win\": \"file://{images}/icons/ui/trophy.svg\",\n    \"win_rush\": \"file://{images}/icons/ui/rush_radio_win.svg\"\n};\n","scripts/common/hold_button.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\nvar HoldButton;\n(function (HoldButton) {\n    let m_LoopingSounds = {};\n    let _m_btnSettings = {\n        holdTimer: 0,\n        holdTimeMax: 10,\n        holdTimerHandle: null,\n        isButtonPressed: false\n    };\n    function StartLoopingSound(s) {\n        if (!s)\n            return;\n        if (m_LoopingSounds[s] !== undefined)\n            return;\n        m_LoopingSounds[s] = UiToolkitAPI.PlaySoundEvent(s);\n    }\n    HoldButton.StartLoopingSound = StartLoopingSound;\n    function StopLoopingSound(s) {\n        if (!s)\n            return;\n        if (m_LoopingSounds[s] === undefined)\n            return;\n        UiToolkitAPI.StopSoundEvent(m_LoopingSounds[s], 0);\n        m_LoopingSounds[s] = undefined;\n    }\n    HoldButton.StopLoopingSound = StopLoopingSound;\n    function SetupButton(settings) {\n        if (!settings.btn)\n            return;\n        if ('tooltip' in settings && settings.tooltip !== '') {\n            settings.btn.SetPanelEvent('onmouseover', () => {\n                if (settings.btn.enabled) {\n                    UiToolkitAPI.ShowTextTooltipStyled(settings.btn.id, settings.tooltip, ('tooltipStyle' in settings) ? settings.tooltipStyle : '');\n                }\n            });\n            settings.btn.SetPanelEvent('onmouseout', () => { UiToolkitAPI.HideTextTooltip(); });\n        }\n        settings.btn.SetDialogVariable('action-label', $.Localize(settings.locString));\n        settings.btn.SetPanelEvent('onmouseup', () => _OnMouseUp(settings));\n        settings.btn.SetPanelEvent('onmousedown', () => _OnMouseDown(settings));\n    }\n    HoldButton.SetupButton = SetupButton;\n    function _OnMouseUp(settings) {\n        CancelButtonTimer(settings);\n        _m_btnSettings.isButtonPressed = false;\n        _m_btnSettings.holdTimer = 0;\n        settings.btn.FindChild('id-response-btn-timer').visible = false;\n        settings.btn.FindChild('id-response-btn-timer').style.width = '0%;';\n        if ('mouseUpAction' in settings)\n            settings.mouseUpAction();\n    }\n    function _OnMouseDown(settings) {\n        CancelButtonTimer(settings);\n        _m_btnSettings.isButtonPressed = true;\n        _m_btnSettings.holdTimer = 0;\n        IncrementButtonTimer(settings);\n    }\n    function CancelButtonTimer(settings) {\n        if (_m_btnSettings.holdTimerHandle !== null) {\n            $.CancelScheduled(_m_btnSettings.holdTimerHandle);\n            if ('cancelTimerAction' in settings) {\n                settings.cancelTimerAction();\n            }\n            StopLoopingSound(settings.loopingSound);\n            _m_btnSettings.holdTimerHandle = null;\n        }\n    }\n    function IncrementButtonTimer(settings) {\n        ++_m_btnSettings.holdTimer;\n        if (_m_btnSettings.holdTimer <= _m_btnSettings.holdTimeMax && _m_btnSettings.isButtonPressed) {\n            settings.btn.FindChild('id-response-btn-timer').visible = true;\n            settings.btn.FindChild('id-response-btn-timer').style.width = (_m_btnSettings.holdTimer * 10) + '%;';\n            if (_m_btnSettings.holdTimerHandle == null) {\n                _m_btnSettings.holdTimerHandle = $.Schedule(.1, () => IncrementButtonTimer(settings));\n                StartLoopingSound(settings.loopingSound);\n            }\n            else {\n                $.Schedule(.1, () => IncrementButtonTimer(settings));\n            }\n            return;\n        }\n        if (_m_btnSettings.isButtonPressed) {\n            if ('timerCompleteAction' in settings)\n                settings.timerCompleteAction();\n        }\n        _OnMouseUp(settings);\n    }\n})(HoldButton || (HoldButton = {}));\n","scripts/common/icon.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\nvar IconUtil;\n(function (IconUtil) {\n    function SetPNGImageFallback(mapIconDetails, icon_image_path) {\n        if (mapIconDetails.m_type == 'svg') {\n            mapIconDetails.m_type = 'png';\n            mapIconDetails.m_icon.SetImage(icon_image_path + '.png');\n        }\n        else {\n            mapIconDetails.m_icon.SetImage('file://{images}/map_icons/map_icon_NONE.png');\n        }\n    }\n    function SetupFallbackMapIcon(elIconPanel, icon_image_path) {\n        const mapIconDetails = { m_icon: elIconPanel, m_type: 'svg', m_handler: -1 };\n        $.RegisterEventHandler('ImageFailedLoad', elIconPanel, () => SetPNGImageFallback(mapIconDetails, icon_image_path));\n    }\n    IconUtil.SetupFallbackMapIcon = SetupFallbackMapIcon;\n    function SetItemSetPNGImageFallback(elIconPanel, icon_image_name) {\n        elIconPanel.SetImage('file://{images}/econ/set_icons/' + icon_image_name + '_small.png');\n    }\n    IconUtil.SetItemSetPNGImageFallback = SetItemSetPNGImageFallback;\n    function SetItemSetSVGImage(elIconPanel, icon_image_name) {\n        elIconPanel.SetImage('file://{images}/econ/set_icons/' + icon_image_name + '.svg');\n    }\n    IconUtil.SetItemSetSVGImage = SetItemSetSVGImage;\n    function SetupFallbackItemSetIcon(elIconPanel, icon_image_name) {\n        if (elIconPanel.IsValid() && elIconPanel && elIconPanel.Data().fallbackHandler === undefined) {\n            $.RegisterEventHandler('ImageFailedLoad', elIconPanel, () => SetItemSetPNGImageFallback(elIconPanel, icon_image_name));\n            elIconPanel.Data().fallbackHandler = true;\n        }\n    }\n    IconUtil.SetupFallbackItemSetIcon = SetupFallbackItemSetIcon;\n})(IconUtil || (IconUtil = {}));\n","scripts/common/iteminfo.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"formattext.ts\" />\n/// <reference path=\"characteranims.ts\" />\nvar ItemInfo;\n(function (ItemInfo) {\n    function GetFormattedName(id) {\n        const strName = InventoryAPI.GetItemNameUncustomized(id);\n        const strCustomName = InventoryAPI.GetItemNameCustomized(id);\n        if (InventoryAPI.HasCustomName(id)) {\n            const splitLoc = strName.indexOf('|');\n            let strWeaponName;\n            let strPaintName;\n            if (splitLoc >= 0) {\n                strWeaponName = strName.substring(0, splitLoc).trim();\n                strPaintName = strName.substring(splitLoc + 1).trim();\n                return new CFormattedText('#CSGO_ItemName_Custom_Painted', { item_name: strWeaponName, paintkit_name: strPaintName, custom_item_name: strCustomName });\n            }\n            else\n                return new CFormattedText('#CSGO_ItemName_Custom_Simple', { item_name: strName, custom_item_name: strCustomName });\n        }\n        else {\n            const splitLoc = strName.indexOf('|');\n            if (splitLoc >= 0) {\n                const strWeaponName = strName.substring(0, splitLoc).trim();\n                const strPaintName = strName.substring(splitLoc + 1).trim();\n                return new CFormattedText('#CSGO_ItemName_Painted', { item_name: strWeaponName, paintkit_name: strPaintName });\n            }\n            return new CFormattedText('#CSGO_ItemName_Base', { item_name: strName });\n        }\n    }\n    ItemInfo.GetFormattedName = GetFormattedName;\n    function GetEquippedSlot(id, szTeam) {\n        let defIndex = InventoryAPI.GetItemDefinitionIndex(id);\n        return LoadoutAPI.GetSlotEquippedWithDefIndex(szTeam, defIndex);\n    }\n    ItemInfo.GetEquippedSlot = GetEquippedSlot;\n    function IsSpraySealed(id) {\n        return InventoryAPI.DoesItemMatchDefinitionByName(id, 'spray');\n    }\n    ItemInfo.IsSpraySealed = IsSpraySealed;\n    function IsSprayPaint(id) {\n        return InventoryAPI.DoesItemMatchDefinitionByName(id, 'spraypaint');\n    }\n    ItemInfo.IsSprayPaint = IsSprayPaint;\n    function IsTradeUpContract(id) {\n        return InventoryAPI.DoesItemMatchDefinitionByName(id, 'Recipe Trade Up');\n    }\n    ItemInfo.IsTradeUpContract = IsTradeUpContract;\n    function ItemHasCapability(id, capName) {\n        const caps = [];\n        const capCount = InventoryAPI.GetItemCapabilitiesCount(id);\n        for (let i = 0; i < capCount; i++) {\n            caps.push(InventoryAPI.GetItemCapabilityByIndex(id, i));\n        }\n        return caps.includes(capName);\n    }\n    ItemInfo.ItemHasCapability = ItemHasCapability;\n    function GetKeyForCaseInXray(caseId) {\n        const numActionItems = InventoryAPI.GetChosenActionItemsCount(caseId, 'decodable');\n        if (numActionItems > 0) {\n            const aKeyIds = [];\n            for (let i = 0; i < numActionItems; i++) {\n                aKeyIds.push(InventoryAPI.GetChosenActionItemIDByIndex(caseId, 'decodable', i));\n            }\n            aKeyIds.sort();\n            return aKeyIds[0];\n        }\n        return '';\n    }\n    ItemInfo.GetKeyForCaseInXray = GetKeyForCaseInXray;\n    function GetItemsInXray() {\n        InventoryAPI.SetInventorySortAndFilters('inv_sort_age', false, 'xraymachine', '', '');\n        const count = InventoryAPI.GetInventoryCount();\n        if (count === 0) {\n            return {};\n        }\n        let xrayCaseId = '';\n        let xrayRewardId = '';\n        for (let i = 0; i < count; i++) {\n            const id = InventoryAPI.GetInventoryItemIDByIndex(i);\n            xrayRewardId = i === 0 ? id : xrayRewardId;\n            xrayCaseId = i === 1 ? id : xrayCaseId;\n        }\n        return { case: xrayCaseId, reward: xrayRewardId };\n    }\n    ItemInfo.GetItemsInXray = GetItemsInXray;\n    function GetLoadoutWeapons(team) {\n        let teamName = CharacterAnims.NormalizeTeamName(team, true);\n        const list = [];\n        const slotStrings = LoadoutAPI.GetLoadoutSlotNames(false);\n        const slots = JSON.parse(slotStrings);\n        for (let slot of slots) {\n            const weaponItemId = LoadoutAPI.GetItemID(teamName, slot);\n            const bIsLoadoutWeapon = ItemInfo.IsWeapon(weaponItemId) || ItemInfo.IsMelee(weaponItemId);\n            if (bIsLoadoutWeapon) {\n                list.push([slot, weaponItemId]);\n            }\n        }\n        return list;\n    }\n    ItemInfo.GetLoadoutWeapons = GetLoadoutWeapons;\n    function DeepCopyVanityCharacterSettings(inVanityCharacterSettings) {\n        const modelRenderSettingsOneOffTempCopy = JSON.parse(JSON.stringify(inVanityCharacterSettings));\n        modelRenderSettingsOneOffTempCopy.panel = inVanityCharacterSettings.panel;\n        return modelRenderSettingsOneOffTempCopy;\n    }\n    ItemInfo.DeepCopyVanityCharacterSettings = DeepCopyVanityCharacterSettings;\n    function PrecacheVanityCharacterSettings(inVanityCharacterSettings) {\n        if (inVanityCharacterSettings.weaponItemId)\n            InventoryAPI.PrecacheCustomMaterials(inVanityCharacterSettings.weaponItemId);\n        if (inVanityCharacterSettings.glovesItemId)\n            InventoryAPI.PrecacheCustomMaterials(inVanityCharacterSettings.glovesItemId);\n    }\n    ItemInfo.PrecacheVanityCharacterSettings = PrecacheVanityCharacterSettings;\n    function GetOrUpdateVanityCharacterSettings(optionalCharacterItemId, optionalState) {\n        const oSettings = {\n            panel: undefined,\n            team: undefined,\n            charItemId: undefined,\n            loadoutSlot: undefined,\n            weaponItemId: undefined,\n            glovesItemId: undefined,\n            petItemId: undefined,\n            cameraPreset: undefined\n        };\n        if (optionalCharacterItemId && InventoryAPI.IsValidItemID(optionalCharacterItemId)) {\n            const charTeam = InventoryAPI.GetItemTeam(optionalCharacterItemId);\n            if (charTeam.search('Team_CT') !== -1)\n                oSettings.team = 'ct';\n            else if (charTeam.search('Team_T') !== -1)\n                oSettings.team = 't';\n            if (oSettings.team)\n                oSettings.charItemId = optionalCharacterItemId;\n        }\n        if (!oSettings.team) {\n            oSettings.team = GameInterfaceAPI.GetSettingString('ui_vanitysetting_team');\n            if (oSettings.team !== 'ct' && oSettings.team !== 't') {\n                oSettings.team = (Math.round(Math.random()) > 0) ? 'ct' : 't';\n                GameInterfaceAPI.SetSettingString('ui_vanitysetting_team', oSettings.team);\n            }\n        }\n        function RollRandomLoadoutSlotAndWeapon(strTeam) {\n            const myResult = {\n                loadoutSlot: '',\n                weaponItemId: ''\n            };\n            const slots = JSON.parse(LoadoutAPI.GetLoadoutSlotNames(false));\n            while (slots.length > 0) {\n                slots.splice(slots.indexOf('heavy3'), 1);\n                slots.splice(slots.indexOf('heavy4'), 1);\n                const nRandomSlotIndex = Math.floor(Math.random() * slots.length);\n                myResult.loadoutSlot = slots.splice(nRandomSlotIndex, 1)[0];\n                myResult.weaponItemId = LoadoutAPI.GetItemID(strTeam, myResult.loadoutSlot);\n                if (ItemInfo.IsWeapon(myResult.weaponItemId) || ItemInfo.IsMelee(myResult.weaponItemId))\n                    break;\n            }\n            return myResult;\n        }\n        ;\n        oSettings.loadoutSlot = GameInterfaceAPI.GetSettingString('ui_vanitysetting_loadoutslot_' + oSettings.team);\n        if (!JSON.parse(LoadoutAPI.GetLoadoutSlotNames(false)).includes(oSettings.loadoutSlot))\n            oSettings.loadoutSlot = '';\n        oSettings.weaponItemId = LoadoutAPI.GetItemID(oSettings.team, oSettings.loadoutSlot);\n        if (!(ItemInfo.IsWeapon(oSettings.weaponItemId) || ItemInfo.IsMelee(oSettings.weaponItemId))) {\n            const randomResult = RollRandomLoadoutSlotAndWeapon(oSettings.team);\n            oSettings.loadoutSlot = randomResult.loadoutSlot;\n            oSettings.weaponItemId = randomResult.weaponItemId;\n            GameInterfaceAPI.SetSettingString('ui_vanitysetting_loadoutslot_' + oSettings.team, oSettings.loadoutSlot);\n        }\n        oSettings.glovesItemId = LoadoutAPI.GetItemID(oSettings.team, 'clothing_hands');\n        oSettings.petItemId = InventoryAPI.GetPetItemID();\n        if (!oSettings.charItemId)\n            oSettings.charItemId = LoadoutAPI.GetItemID(oSettings.team, 'customplayer');\n        if (optionalState && optionalState === 'unowned') {\n            const randomResult = RollRandomLoadoutSlotAndWeapon(oSettings.team);\n            oSettings.loadoutSlot = randomResult.loadoutSlot;\n            oSettings.weaponItemId = LoadoutAPI.GetDefaultItem(oSettings.team, oSettings.loadoutSlot);\n            oSettings.glovesItemId = LoadoutAPI.GetDefaultItem(oSettings.team, 'clothing_hands');\n        }\n        return oSettings;\n    }\n    ItemInfo.GetOrUpdateVanityCharacterSettings = GetOrUpdateVanityCharacterSettings;\n    function GetitemStickerList(id) {\n        const count = InventoryAPI.GetItemStickerCount(id);\n        const stickerList = [];\n        for (let i = 0; i < count; i++) {\n            const oStickerInfo = {\n                image: InventoryAPI.GetItemStickerImageByIndex(id, i),\n                name: InventoryAPI.GetItemStickerNameByIndex(id, i)\n            };\n            stickerList.push(oStickerInfo);\n        }\n        return stickerList;\n    }\n    ItemInfo.GetitemStickerList = GetitemStickerList;\n    function GetitemKeychainList(id) {\n        const count = InventoryAPI.GetItemKeychainCount(id);\n        const keychainList = [];\n        for (let i = 0; i < count; i++) {\n            const jsdata = InventoryAPI.GetItemKeychainJsonByIndex(id, i);\n            if (jsdata) {\n                const o = JSON.parse(jsdata);\n                if (o)\n                    keychainList.push(o);\n            }\n        }\n        return keychainList;\n    }\n    ItemInfo.GetitemKeychainList = GetitemKeychainList;\n    function GetStoreOriginalPrice(id, count, rules) {\n        return StoreAPI.GetStoreItemOriginalPrice(id, count, rules ? rules : '');\n    }\n    ItemInfo.GetStoreOriginalPrice = GetStoreOriginalPrice;\n    function GetStoreSalePrice(id, count, rules) {\n        return StoreAPI.GetStoreItemSalePrice(id, count, rules ? rules : '');\n    }\n    ItemInfo.GetStoreSalePrice = GetStoreSalePrice;\n    function IsStatTrak(id) {\n        return Number(InventoryAPI.GetRawDefinitionKey(id, \"will_produce_stattrak\")) === 1;\n    }\n    ItemInfo.IsStatTrak = IsStatTrak;\n    function IsEquippalbleButNotAWeapon(id) {\n        const subSlot = InventoryAPI.GetDefaultSlot(id);\n        return (subSlot === \"flair0\" || subSlot === \"musickit\" || subSlot === \"spray0\" || subSlot === \"customplayer\" || subSlot === \"pet\");\n    }\n    ItemInfo.IsEquippalbleButNotAWeapon = IsEquippalbleButNotAWeapon;\n    function IsEquippableThroughContextMenu(id) {\n        const subSlot = InventoryAPI.GetDefaultSlot(id);\n        return (subSlot === \"flair0\" || subSlot === \"musickit\" || subSlot === \"spray0\");\n    }\n    ItemInfo.IsEquippableThroughContextMenu = IsEquippableThroughContextMenu;\n    function IsWeapon(id) {\n        const itemSchemaDef = BuildItemSchemaDef(id);\n        return (itemSchemaDef[\"craft_class\"] === \"weapon\");\n    }\n    ItemInfo.IsWeapon = IsWeapon;\n    function IsMelee(id) {\n        return InventoryAPI.GetLoadoutCategory(id) === \"melee\";\n    }\n    ItemInfo.IsMelee = IsMelee;\n    function IsCase(id) {\n        return ItemInfo.ItemHasCapability(id, 'decodable') && InventoryAPI.GetAssociatedItemsCount(id) > 0;\n    }\n    ItemInfo.IsCase = IsCase;\n    function IsCharacter(id) {\n        return InventoryAPI.GetDefaultSlot(id) === \"customplayer\";\n    }\n    ItemInfo.IsCharacter = IsCharacter;\n    function IsGloves(id) {\n        return InventoryAPI.GetDefaultSlot(id) === \"clothing_hands\";\n    }\n    ItemInfo.IsGloves = IsGloves;\n    function IsItemCt(id) {\n        return InventoryAPI.GetItemTeam(id) === '#CSGO_Inventory_Team_CT';\n    }\n    ItemInfo.IsItemCt = IsItemCt;\n    function IsItemT(id) {\n        return InventoryAPI.GetItemTeam(id) === '#CSGO_Inventory_Team_T';\n    }\n    ItemInfo.IsItemT = IsItemT;\n    function IsItemAnyTeam(id) {\n        return InventoryAPI.GetItemTeam(id) === '#CSGO_Inventory_Team_Any';\n    }\n    ItemInfo.IsItemAnyTeam = IsItemAnyTeam;\n    function ItemDefinitionNameSubstrMatch(id, defSubstr) {\n        const itemDefName = InventoryAPI.GetItemDefinitionName(id);\n        return (!!itemDefName && (itemDefName.indexOf(defSubstr) != -1));\n    }\n    ItemInfo.ItemDefinitionNameSubstrMatch = ItemDefinitionNameSubstrMatch;\n    function ItemDefinitionNameStartsWith(id, defSubstr) {\n        const itemDefName = InventoryAPI.GetItemDefinitionName(id);\n        return (!!itemDefName && (itemDefName.startsWith(defSubstr)));\n    }\n    ItemInfo.ItemDefinitionNameStartsWith = ItemDefinitionNameStartsWith;\n    function GetFauxReplacementItemID(id, purpose) {\n        if (purpose === 'graffiti') {\n            if (ItemDefinitionNameSubstrMatch(id, 'tournament_journal_')) {\n                return GetFauxItemIdForGraffiti(parseInt(InventoryAPI.GetItemAttributeValue(id, 'sticker slot 0 id')));\n            }\n        }\n        return id;\n    }\n    ItemInfo.GetFauxReplacementItemID = GetFauxReplacementItemID;\n    function GetFauxItemIdForGraffiti(stickestickerid_graffiti) {\n        return InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(1349, stickestickerid_graffiti);\n    }\n    ItemInfo.GetFauxItemIdForGraffiti = GetFauxItemIdForGraffiti;\n    function GetItemIdForItemEquippedInSlot(team, slot) {\n        return LoadoutAPI.GetItemID(team, slot);\n    }\n    ItemInfo.GetItemIdForItemEquippedInSlot = GetItemIdForItemEquippedInSlot;\n    function GetGifter(id) {\n        const xuid = InventoryAPI.GetItemGifterXuid(id);\n        return xuid !== undefined ? xuid : '';\n    }\n    ItemInfo.GetGifter = GetGifter;\n    function GetSet(id) {\n        const setName = InventoryAPI.GetSet(id);\n        return setName !== undefined ? setName : '';\n    }\n    ItemInfo.GetSet = GetSet;\n    function GetModelPath(id, itemSchemaDef) {\n        const isMusicKit = InventoryAPI.DoesItemMatchDefinitionByName(id, 'musickit');\n        const issMusicKitDefault = InventoryAPI.DoesItemMatchDefinitionByName(id, 'musickit_default');\n        const isSpray = itemSchemaDef.name === 'spraypaint';\n        const isSprayPaint = itemSchemaDef.name === 'spray';\n        const isFanTokenOrShieldItem = itemSchemaDef.name && itemSchemaDef.name.indexOf('tournament_journal_') != -1;\n        const isPet = InventoryAPI.DoesItemMatchDefinitionByName(id, 'pet');\n        if (isSpray || isSprayPaint || isFanTokenOrShieldItem)\n            return 'vmt://spraypreview_' + id;\n        else if (IsSticker(id) || IsPatch(id))\n            return 'vmt://stickerpreview_' + id;\n        else if (itemSchemaDef.hasOwnProperty(\"model_player\") || isMusicKit || issMusicKitDefault || isPet || IsKeychain(id))\n            return 'img://inventory_' + id;\n    }\n    function BuildItemSchemaDef(id) {\n        const schemaString = InventoryAPI.BuildItemSchemaDefJSON(id);\n        return JSON.parse(schemaString);\n    }\n    ItemInfo.BuildItemSchemaDef = BuildItemSchemaDef;\n    function GetModelPlayer(id) {\n        const itemSchemaDef = BuildItemSchemaDef(id);\n        return itemSchemaDef[\"model_player\"];\n    }\n    ItemInfo.GetModelPlayer = GetModelPlayer;\n    function IsKeychain(itemId) {\n        return InventoryAPI.DoesItemMatchDefinitionByName(itemId, 'keychain');\n    }\n    ItemInfo.IsKeychain = IsKeychain;\n    function IsSticker(itemId) {\n        return InventoryAPI.DoesItemMatchDefinitionByName(itemId, 'sticker');\n    }\n    ItemInfo.IsSticker = IsSticker;\n    function IsDisplayItem(itemId) {\n        return InventoryAPI.GetDefaultSlot(itemId) == 'flair0';\n    }\n    ItemInfo.IsDisplayItem = IsDisplayItem;\n    function IsPatch(itemId) {\n        return InventoryAPI.DoesItemMatchDefinitionByName(itemId, 'patch');\n    }\n    ItemInfo.IsPatch = IsPatch;\n    function IsPet(itemId) {\n        return InventoryAPI.DoesItemMatchDefinitionByName(itemId, 'pet') ||\n            InventoryAPI.DoesItemMatchDefinitionByName(itemId, 'chicken_egg') ||\n            InventoryAPI.DoesItemMatchDefinitionByName(itemId, 'chicken_feed');\n    }\n    ItemInfo.IsPet = IsPet;\n    function GetDefaultCheer(id) {\n        const itemSchemaDef = BuildItemSchemaDef(id);\n        if (itemSchemaDef[\"default_cheer\"])\n            return itemSchemaDef[\"default_cheer\"];\n        else\n            return \"\";\n    }\n    ItemInfo.GetDefaultCheer = GetDefaultCheer;\n    function GetDefaultDefeat(id) {\n        const itemSchemaDef = BuildItemSchemaDef(id);\n        if (itemSchemaDef[\"default_defeat\"])\n            return itemSchemaDef[\"default_defeat\"];\n        else\n            return \"\";\n    }\n    ItemInfo.GetDefaultDefeat = GetDefaultDefeat;\n    function GetModelPathFromJSONOrAPI(id) {\n        if (id === '' || id === undefined || id === null) {\n            return '';\n        }\n        let pedistalModel = '';\n        const itemSchemaDef = BuildItemSchemaDef(id);\n        if (InventoryAPI.GetDefaultSlot(id) === \"flair0\") {\n            pedistalModel = itemSchemaDef.hasOwnProperty('attributes') ? itemSchemaDef.attributes[\"pedestal display model\"] : '';\n        }\n        else if (ItemHasCapability(id, 'decodable')) {\n            pedistalModel = itemSchemaDef.hasOwnProperty(\"model_player\") ? itemSchemaDef.model_player : '';\n        }\n        return (pedistalModel === '') ? GetModelPath(id, itemSchemaDef) : pedistalModel;\n    }\n    ItemInfo.GetModelPathFromJSONOrAPI = GetModelPathFromJSONOrAPI;\n    function GetMarketLinkForLootlistItem(id) {\n        const appID = SteamOverlayAPI.GetAppID();\n        const communityUrl = SteamOverlayAPI.GetSteamCommunityURL();\n        const strName = InventoryAPI.GetItemName(id);\n        return communityUrl + \"/market/search?appid=\" + appID + \"&lock_appid=\" + appID + \"&q=\" + strName;\n    }\n    ItemInfo.GetMarketLinkForLootlistItem = GetMarketLinkForLootlistItem;\n    function FindAnyUserOwnedCharacterItemID() {\n        InventoryAPI.SetInventorySortAndFilters('inv_sort_rarity', false, 'customplayer,not_base_item', '', '');\n        const count = InventoryAPI.GetInventoryCount();\n        return (count > 0) ? InventoryAPI.GetInventoryItemIDByIndex(0) : '';\n    }\n    ItemInfo.FindAnyUserOwnedCharacterItemID = FindAnyUserOwnedCharacterItemID;\n    function IsFauxOrRentalOrPreviewTool(id) {\n        if ((id && id.length == 19 && id.startsWith('922323129721890'))\n            || InventoryAPI.IsFauxItemID(id)\n            || InventoryAPI.IsRental(id))\n            return true;\n        else\n            return false;\n    }\n    ItemInfo.IsFauxOrRentalOrPreviewTool = IsFauxOrRentalOrPreviewTool;\n    function IsPreviewable(id) {\n        return !!InventoryAPI.GetDefaultSlot(id) || IsSticker(id) || IsPatch(id) || IsSpraySealed(id) || IsKeychain(id);\n    }\n    ItemInfo.IsPreviewable = IsPreviewable;\n    function IsNameTag(id) {\n        return InventoryAPI.DoesItemMatchDefinitionByName(id, 'name tag');\n    }\n    ItemInfo.IsNameTag = IsNameTag;\n    function IsRecipe(id) {\n        return InventoryAPI.DoesItemMatchDefinitionByName(id, 'recipe');\n    }\n    ItemInfo.IsRecipe = IsRecipe;\n    ItemInfo.NUM_BACKPACK_SLOTS = 1000;\n})(ItemInfo || (ItemInfo = {}));\n","scripts/common/item_context_entries.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"iteminfo.ts\" />\n/// <reference path=\"../generated/items_event_current_generated_store.ts\" />\nvar ItemContextEntries;\n(function (ItemContextEntries) {\n    function FilterEntries(id, populateFilterText) {\n        const bHasFilter = populateFilterText !== \"(not found)\";\n        return _Entries.filter((entry) => {\n            if (entry.exclusiveFilter) {\n                if (!entry.exclusiveFilter.includes(populateFilterText))\n                    return false;\n            }\n            else if (bHasFilter && entry.populateFilter) {\n                if (!entry.populateFilter.includes(populateFilterText))\n                    return false;\n            }\n            else {\n                if (bHasFilter)\n                    return false;\n            }\n            if (!entry.bActionIsRentalAware && InventoryAPI.IsRental(id))\n                return false;\n            return entry.AvailableForItem(id);\n        });\n    }\n    ItemContextEntries.FilterEntries = FilterEntries;\n    const _Entries = [\n        {\n            name: 'preview',\n            populateFilter: ['lootlist', 'loadout', 'loadout_slot_t', 'loadout_slot_ct', 'tradeup_items', 'tradeup_ingredients'],\n            bActionIsRentalAware: true,\n            AvailableForItem: (id) => {\n                if (InventoryAPI.DoesItemMatchDefinitionByName(id, \"Remove Keychain Tool\"))\n                    return true;\n                if (InventoryAPI.DoesItemMatchDefinitionByName(id, \"sticker_display_case\"))\n                    return true;\n                return ItemInfo.IsPreviewable(id);\n            },\n            OnSelected: (id, contextmenuparam) => {\n                $.DispatchEvent('ContextMenuEvent', '');\n                $.DispatchEvent(\"InventoryItemPreview\", id, contextmenuparam);\n            }\n        },\n        {\n            name: 'view_highlight_reel',\n            populateFilter: ['loadout', 'loadout_slot_t', 'loadout_slot_ct'],\n            AvailableForItem: (id) => {\n                return !!InventoryAPI.GetItemAttributeValue(id, '{uint32}keychain slot 0 highlight');\n            },\n            OnSelected: (id) => {\n                const reelId = InventoryAPI.GetItemAttributeValue(id, '{uint32}keychain slot 0 highlight');\n                UiToolkitAPI.ShowCustomLayoutPopupParameters('popup-videoclip-' + reelId, 'file://{resources}/layout/popups/popup_videoclip.xml', 'reelid=' + reelId + '&' +\n                    'itemid=' + id);\n                $.DispatchEvent('ContextMenuEvent', '');\n            }\n        },\n        {\n            name: 'open_season_stats_panel',\n            populateFilter: ['loadout', 'loadout_slot_t', 'loadout_slot_ct'],\n            AvailableForItem: (id) => {\n                return (ItemInfo.ItemDefinitionNameStartsWith(id, 'premier season coin'));\n            },\n            OnSelected: (id) => {\n                const season = InventoryAPI.GetItemAttributeValue(id, 'premier season');\n                UiToolkitAPI.ShowCustomLayoutPopupParameters('id-popup-season-stats', 'file://{resources}/layout/popups/popup_season_stats.xml', 'seasonid=' + season + '&' +\n                    'itemid=' + id);\n                $.DispatchEvent('ContextMenuEvent', '');\n            }\n        },\n        {\n            name: 'bulkretrieve',\n            populateFilter: ['loadout', 'loadout_slot_t', 'loadout_slot_ct'],\n            AvailableForItem: (id) => {\n                const defName = InventoryAPI.GetItemDefinitionName(id);\n                return (defName === 'casket') && !!InventoryAPI.GetItemAttributeValue(id, 'modification date');\n            },\n            OnSelected: (id) => {\n                $.DispatchEvent('ContextMenuEvent', '');\n                const defName = InventoryAPI.GetItemDefinitionName(id);\n                if (defName === 'casket') {\n                    if (InventoryAPI.GetItemAttributeValue(id, 'items count')) {\n                        UiToolkitAPI.ShowCustomLayoutPopupParameters('', 'file://{resources}/layout/popups/popup_casket_operation.xml', 'op=loadcontents' +\n                            '&nextcapability=casketretrieve' +\n                            '&spinner=1' +\n                            '&casket_item_id=' + id +\n                            '&subject_item_id=' + id);\n                    }\n                    else {\n                        UiToolkitAPI.ShowGenericPopupOk($.Localize('#popup_casket_title_error_casket_empty'), $.Localize('#popup_casket_message_error_casket_empty'), '', () => { });\n                    }\n                    return;\n                }\n            }\n        },\n        {\n            name: 'bulkstore',\n            populateFilter: ['loadout', 'loadout_slot_t', 'loadout_slot_ct'],\n            style: (id) => 'BottomSeparator',\n            AvailableForItem: (id) => {\n                const defName = InventoryAPI.GetItemDefinitionName(id);\n                return (defName === 'casket') && !!InventoryAPI.GetItemAttributeValue(id, 'modification date');\n            },\n            OnSelected: (id) => {\n                $.DispatchEvent('ContextMenuEvent', '');\n                const defName = InventoryAPI.GetItemDefinitionName(id);\n                if (defName === 'casket') {\n                    $.DispatchEvent('ShowSelectItemForCapabilityPopup', id, '', 'casketstore');\n                }\n            }\n        },\n        {\n            name: 'openloadout',\n            style: (id) => 'TopSeparator',\n            bActionIsRentalAware: true,\n            AvailableForItem: (id) => !!InventoryAPI.GetRawDefinitionKey(id, 'flexible_loadout_group'),\n            OnSelected: (id) => {\n                $.DispatchEvent('ContextMenuEvent', '');\n                $.DispatchEvent(\"ShowLoadoutForItem\", id);\n            }\n        },\n        {\n            name: 'swap_finish_both',\n            populateFilter: ['inspect', 'loadout', 'loadout_slot_t', 'loadout_slot_ct'],\n            bActionIsRentalAware: true,\n            AvailableForItem: (id) => _CanSwapFinish(id, 'ct') && _CanSwapFinish(id, 't'),\n            OnSelected: (id) => {\n                $.DispatchEvent('ContextMenuEvent', '');\n                EquipItem(id, ['ct', 't']);\n            }\n        },\n        {\n            name: 'swap_finish_ct',\n            CustomName: (id) => GetItemToReplaceName(id, 'ct'),\n            populateFilter: ['inspect', 'loadout', 'loadout_slot_t', 'loadout_slot_ct'],\n            bActionIsRentalAware: true,\n            AvailableForItem: (id) => _CanSwapFinish(id, 'ct'),\n            OnSelected: (id) => {\n                $.DispatchEvent('ContextMenuEvent', '');\n                EquipItem(id, ['ct']);\n            }\n        },\n        {\n            name: 'swap_finish_t',\n            CustomName: (id) => GetItemToReplaceName(id, 't'),\n            populateFilter: ['inspect', 'loadout', 'loadout_slot_t', 'loadout_slot_ct'],\n            bActionIsRentalAware: true,\n            AvailableForItem: (id) => _CanSwapFinish(id, 't'),\n            OnSelected: (id) => {\n                $.DispatchEvent('ContextMenuEvent', '');\n                EquipItem(id, ['t']);\n            }\n        },\n        {\n            name: 'flair',\n            populateFilter: ['inspect', 'loadout', 'loadout_slot_t', 'loadout_slot_ct'],\n            bActionIsRentalAware: true,\n            AvailableForItem: (id) => {\n                return InventoryAPI.GetDefaultSlot(id) === 'flair0' && (!InventoryAPI.IsEquipped(id, \"noteam\") || (InventoryAPI.GetRawDefinitionKey(id, 'item_sub_position2') !== ''));\n            },\n            OnSelected: (id) => {\n                $.DispatchEvent('ContextMenuEvent', '');\n                EquipItem(id, ['noteam']);\n            }\n        },\n        {\n            name: 'equip_spray',\n            populateFilter: ['inspect', 'loadout', 'loadout_slot_t', 'loadout_slot_ct'],\n            AvailableForItem: (id) => ItemInfo.IsSprayPaint(id) && !InventoryAPI.IsEquipped(id, \"noteam\"),\n            OnSelected: (id) => {\n                $.DispatchEvent('ContextMenuEvent', '');\n                EquipItem(id, ['noteam'], 'spray0');\n            }\n        },\n        {\n            name: 'equip_tournament_spray',\n            populateFilter: ['inspect', 'loadout', 'loadout_slot_t', 'loadout_slot_ct'],\n            AvailableForItem: (id) => {\n                return (ItemInfo.ItemDefinitionNameSubstrMatch(id, 'tournament_journal_') && (InventoryAPI.GetRawDefinitionKey(id, 'item_sub_position2') === 'spray0'));\n            },\n            OnSelected: (id) => {\n                $.DispatchEvent('ContextMenuEvent', '');\n                UiToolkitAPI.ShowCustomLayoutPopupParameters('', 'file://{resources}/layout/popups/popup_tournament_select_spray.xml', 'journalid=' + id);\n            }\n        },\n        {\n            name: 'equip_musickit',\n            CustomName: (id) => GetItemToReplaceName(id, 'noteam'),\n            populateFilter: ['inspect', 'loadout', 'loadout_slot_t', 'loadout_slot_ct'],\n            bActionIsRentalAware: true,\n            AvailableForItem: (id) => InventoryAPI.GetDefaultSlot(id) === 'musickit' && !InventoryAPI.IsEquipped(id, \"noteam\"),\n            OnSelected: (id) => {\n                $.DispatchEvent('ContextMenuEvent', '');\n                const isMusicvolumeOn = InventoryAPI.TestMusicVolume();\n                if (isMusicvolumeOn) {\n                    $.DispatchEvent('CSGOPlaySoundEffect', 'equip_musickit', 'MOUSE');\n                    EquipItem(id, ['noteam']);\n                }\n            }\n        },\n        {\n            name: 'unequip',\n            populateFilter: ['inspect', 'loadout', 'loadout_slot_t', 'loadout_slot_ct'],\n            bActionIsRentalAware: true,\n            AvailableForItem: (id) => {\n                let availableForSlots = ['flair0', 'spray0'];\n                return InventoryAPI.IsEquipped(id, \"noteam\") && availableForSlots.includes(InventoryAPI.GetDefaultSlot(id));\n            },\n            OnSelected: (id) => {\n                $.DispatchEvent('ContextMenuEvent', '');\n                TryEquipItemInSlot('noteam', '0', InventoryAPI.GetDefaultSlot(id));\n            },\n        },\n        {\n            name: 'open_watch_panel_pickem',\n            AvailableForItem: (id) => {\n                if (GameStateAPI.GetMapBSPName())\n                    return false;\n                return (ItemInfo.ItemDefinitionNameSubstrMatch(id, 'tournament_journal_') && (InventoryAPI.GetRawDefinitionKey(id, 'item_sub_position2') === 'spray0'));\n            },\n            OnSelected: (id) => {\n                $.DispatchEvent('OpenWatchMenu');\n                $.DispatchEvent('ShowActiveTournamentPage', '');\n                $.DispatchEvent('ContextMenuEvent', '');\n            }\n        },\n        {\n            name: 'getprestige',\n            AvailableForItem: (id) => {\n                return (ItemInfo.ItemDefinitionNameSubstrMatch(id, 'xpgrant') &&\n                    (FriendsListAPI.GetFriendLevel(MyPersonaAPI.GetXuid()) >= InventoryAPI.GetMaxLevel()));\n            },\n            OnSelected: (id) => {\n                const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('', 'file://{resources}/layout/popups/popup_inventory_inspect.xml');\n                let oSettings = {\n                    item_id: '0',\n                    show_work_type_warning: false,\n                    work_type: 'prestigecheck'\n                };\n                elPanel.Data().oSettings = oSettings;\n                $.DispatchEvent('ContextMenuEvent', '');\n            }\n        },\n        {\n            name: (id) => InventoryAPI.IsRental(id) ? 'preview' : 'useitem',\n            bActionIsRentalAware: true,\n            AvailableForItem: (id) => {\n                if (ItemInfo.ItemDefinitionNameSubstrMatch(id, 'tournament_pass_'))\n                    return true;\n                if (ItemInfo.ItemDefinitionNameSubstrMatch(id, 'XpShopTicket'))\n                    return true;\n                if (ItemInfo.ItemDefinitionNameSubstrMatch(id, 'Remove Keychain Tool '))\n                    return true;\n                if (ItemInfo.ItemDefinitionNameSubstrMatch(id, 'xpgrant')) {\n                    return (FriendsListAPI.GetFriendLevel(MyPersonaAPI.GetXuid()) < InventoryAPI.GetMaxLevel());\n                }\n                if (!InventoryAPI.IsTool(id))\n                    return false;\n                const season = InventoryAPI.GetItemAttributeValue(id, 'season access');\n                if (season != undefined)\n                    return true;\n                return false;\n            },\n            OnSelected: (id) => {\n                if (InventoryAPI.IsRental(id)) {\n                    const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('', 'file://{resources}/layout/popups/popup_inventory_inspect.xml');\n                    let oSettings = {\n                        item_id: id,\n                        inspect_only: true\n                    };\n                    elPanel.Data().oSettings = oSettings;\n                }\n                else if (ItemInfo.ItemDefinitionNameSubstrMatch(id, 'tournament_pass_') && !ItemInfo.ItemDefinitionNameSubstrMatch(id, '_credits')) {\n                    const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('', 'file://{resources}/layout/popups/popup_capability_decodable.xml');\n                    let oSettings = {\n                        item_id: id,\n                        work_type: 'decodeable'\n                    };\n                    elPanel.Data().oSettings = oSettings;\n                }\n                else {\n                    const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('', 'file://{resources}/layout/popups/popup_inventory_inspect.xml');\n                    let oSettings = {\n                        item_id: id,\n                        work_type: 'useitem'\n                    };\n                    elPanel.Data().oSettings = oSettings;\n                }\n                $.DispatchEvent('ContextMenuEvent', '');\n            }\n        },\n        {\n            name: 'usespray',\n            populateFilter: ['inspect'],\n            AvailableForItem: (id) => ItemInfo.IsSpraySealed(id),\n            OnSelected: (id) => {\n                const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('', 'file://{resources}/layout/popups/popup_capability_decodable.xml');\n                let oSettings = {\n                    item_id: id,\n                    work_type: 'decodeable'\n                };\n                elPanel.Data().oSettings = oSettings;\n                $.DispatchEvent('ContextMenuEvent', '');\n            }\n        },\n        {\n            name: 'secure_connection_line',\n            AvailableForItem: (id) => {\n                return ItemInfo.ItemHasCapability(id, 'decodable') &&\n                    !!InventoryAPI.GetItemAttributeValue(id, '{uint32}volatile container') &&\n                    InventoryAPI.IsRental(id) &&\n                    (InventoryAPI.GetItemQuality(id) === 14);\n            },\n            bActionIsRentalAware: true,\n            OnSelected: (id) => {\n                $.DispatchEvent('ContextMenuEvent', '');\n                const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('popup-inspect-' + id, 'file://{resources}/layout/popups/popup_offers_laptop.xml');\n                let oSettings = {\n                    item_id: id,\n                    work_type: 'decodeable',\n                };\n                elPanel.Data().oSettings = oSettings;\n            }\n        },\n        {\n            name: (id) => {\n                if (InventoryAPI.GetItemAttributeValue(id, '{uint32}volatile container'))\n                    return InventoryAPI.IsRental(id) ? 'inspect_contents' : 'open_terminal';\n                else if (InventoryAPI.GetDecodeableRestriction(id) === 'restricted' && !InventoryAPI.IsTool(id) && !InventoryAPI.CanOpenForRental(id))\n                    return 'look_inside';\n                else if (InventoryAPI.IsRental(id))\n                    return 'look_inside';\n                else\n                    return 'open_package';\n            },\n            AvailableForItem: (id) => {\n                return ItemInfo.ItemHasCapability(id, 'decodable');\n            },\n            bActionIsRentalAware: true,\n            OnSelected: (id) => {\n                $.DispatchEvent('ContextMenuEvent', '');\n                if (InventoryAPI.GetItemAttributeValue(id, '{uint32}volatile container')\n                    && InventoryAPI.IsRental(id)) {\n                    $.DispatchEvent(\"LootlistItemPreview\", InventoryAPI.GetLootListItemIdByIndex(id, 0), id +\n                        ',' + id);\n                    return;\n                }\n                if (InventoryAPI.GetChosenActionItemsCount(id, 'decodable') === 0) {\n                    if (InventoryAPI.IsTool(id)) {\n                        $.DispatchEvent('ShowSelectItemForCapabilityPopup', id, '', 'decodable');\n                    }\n                    else if (InventoryAPI.GetItemAttributeValue(id, '{uint32}volatile container')) {\n                        const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('popup-inspect-' + id, 'file://{resources}/layout/popups/popup_offers_laptop.xml');\n                        let oSettings = {\n                            item_id: id,\n                            work_type: 'decodeable',\n                        };\n                        elPanel.Data().oSettings = oSettings;\n                        return;\n                    }\n                    else {\n                        const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('popup-inspect-' + id, 'file://{resources}/layout/popups/popup_capability_decodable.xml');\n                        let oSettings = {\n                            item_id: id,\n                            work_type: 'decodeable'\n                        };\n                        elPanel.Data().oSettings = oSettings;\n                    }\n                    $.DispatchEvent('ContextMenuEvent', '');\n                    return;\n                }\n                $.DispatchEvent('ShowSelectItemForCapabilityPopup', id, '', 'decodable');\n            }\n        },\n        {\n            name: (id) => {\n                if (InventoryAPI.IsRental(id))\n                    return 'preview';\n                if (InventoryAPI.GetItemDefinitionName(id) === 'casket') {\n                    return InventoryAPI.GetItemAttributeValue(id, 'modification date') ? 'yourcasket' : 'newcasket';\n                }\n                return 'nameable';\n            },\n            style: (id) => {\n                const defName = InventoryAPI.GetItemDefinitionName(id);\n                return (defName === 'casket' || defName === 'Name Tag') ? '' : 'TopSeparator';\n            },\n            bActionIsRentalAware: true,\n            AvailableForItem: (id) => {\n                if (InventoryAPI.IsRental(id))\n                    return InventoryAPI.IsTool(id) && ItemInfo.ItemHasCapability(id, 'nameable');\n                return ItemInfo.ItemHasCapability(id, 'nameable');\n            },\n            OnSelected: (id) => {\n                if (InventoryAPI.IsRental(id)) {\n                    $.DispatchEvent('ContextMenuEvent', '');\n                    const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('', 'file://{resources}/layout/popups/popup_inventory_inspect.xml');\n                    let oSettings = {\n                        item_id: id,\n                        inspect_only: true\n                    };\n                    elPanel.Data().oSettings = oSettings;\n                }\n                else if (InventoryAPI.GetItemDefinitionName(id) === 'casket') {\n                    const fauxNameTag = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(1200, 0);\n                    const noteText = InventoryAPI.GetItemAttributeValue(id, 'modification date') ? 'yourcasket' : 'newcasket';\n                    $.DispatchEvent('ContextMenuEvent', '');\n                    const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('', 'file://{resources}/layout/popups/popup_capability_nameable.xml');\n                    let oSettings = {\n                        item_id: id,\n                        tool_id: fauxNameTag,\n                        work_type: 'nameable',\n                        async_work_type_warning_text: '#popup_' + noteText + '_warning'\n                    };\n                    elPanel.Data().oSettings = oSettings;\n                }\n                else if (DoesNotHaveChosenActionItems(id, 'nameable')) {\n                    const nameTagId = '', itemToNameId = id;\n                    const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('', 'file://{resources}/layout/popups/popup_capability_nameable.xml');\n                    let oSettings = {\n                        item_id: itemToNameId,\n                        tool_id: nameTagId,\n                        work_type: 'nameable'\n                    };\n                    elPanel.Data().oSettings = oSettings;\n                }\n                else {\n                    $.DispatchEvent('ShowSelectItemForCapabilityPopup', id, '', 'nameable');\n                    $.DispatchEvent('ContextMenuEvent', '');\n                }\n            }\n        },\n        {\n            name: (id) => InventoryAPI.IsRental(id) ? 'preview_can_keychain' : 'can_keychain',\n            populateFilter: ['inspect', 'preview', 'loadout', 'loadout_slot_t', 'loadout_slot_ct'],\n            bActionIsRentalAware: true,\n            AvailableForItem: (id) => ItemInfo.IsKeychain(id) && ItemInfo.ItemHasCapability(id, 'can_keychain'),\n            OnSelected: (id) => {\n                $.DispatchEvent('CSGOPlaySoundEffect', 'sticker_applySticker', 'MOUSE');\n                $.DispatchEvent('ShowSelectItemForCapabilityPopup', id, '', 'can_keychain');\n                $.DispatchEvent('ContextMenuEvent', '');\n            }\n        },\n        {\n            name: 'can_unwrap_sticker',\n            style: (id) => 'TopSeparator',\n            populateFilter: ['loadout', 'loadout_slot_t', 'loadout_slot_ct'],\n            AvailableForItem: (id) => ItemInfo.IsKeychain(id) && ItemInfo.ItemHasCapability(id, 'can_keychain') &&\n                !!InventoryAPI.GetItemAttributeValue(id, '{uint32}keychain slot 0 sticker'),\n            OnSelected: (id) => {\n                $.DispatchEvent('CSGOPlaySoundEffect', 'sticker_applySticker', 'MOUSE');\n                $.DispatchEvent('ContextMenuEvent', '');\n                const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('popup-inspect-' + id, 'file://{resources}/layout/popups/popup_capability_can_keychain.xml');\n                let oSettings = {\n                    popup_panel: elPanel,\n                    item_id: id,\n                    work_type: 'can_wrap_sticker'\n                };\n                elPanel.Data().oSettings = oSettings;\n            }\n        },\n        {\n            name: 'can_keychain',\n            populateFilter: ['loadout', 'loadout_slot_t', 'loadout_slot_ct'],\n            AvailableForItem: (id) => {\n                return ItemInfo.ItemHasCapability(id, 'can_keychain') &&\n                    InventoryAPI.GetItemKeychainSlotCount(id) > InventoryAPI.GetItemKeychainCount(id);\n            },\n            OnSelected: (id) => {\n                $.DispatchEvent('CSGOPlaySoundEffect', 'sticker_applySticker', 'MOUSE');\n                $.DispatchEvent('ShowSelectItemForCapabilityPopup', id, '', 'can_keychain');\n                $.DispatchEvent('ContextMenuEvent', '');\n            }\n        },\n        {\n            name: 'remove_keychain',\n            AvailableForItem: (id) => InventoryAPI.DoesItemMatchDefinitionByName(id, \"Remove Keychain Tool\"),\n            OnSelected: (id) => {\n                $.DispatchEvent('ContextMenuEvent', '');\n                $.DispatchEvent('ShowSelectItemForCapabilityPopup', id, '', 'remove_keychain');\n            }\n        },\n        {\n            name: 'remove_keychain',\n            populateFilter: ['loadout', 'loadout_slot_t', 'loadout_slot_ct'],\n            AvailableForItem: (id) => ItemInfo.ItemHasCapability(id, 'can_keychain') && InventoryAPI.GetItemKeychainCount(id) > 0,\n            OnSelected: (id) => {\n                $.DispatchEvent('ContextMenuEvent', '');\n                const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('', 'file://{resources}/layout/popups/popup_capability_can_keychain.xml');\n                let oSettings = {\n                    popup_panel: elPanel,\n                    item_id: id,\n                    work_type: 'remove_keychain'\n                };\n                elPanel.Data().oSettings = oSettings;\n            }\n        },\n        {\n            name: (id) => InventoryAPI.IsRental(id) ? 'preview_can_sticker' : 'can_sticker',\n            populateFilter: ['inspect', 'preview', 'loadout', 'loadout_slot_t', 'loadout_slot_ct'],\n            bActionIsRentalAware: true,\n            AvailableForItem: (id) => ItemInfo.IsSticker(id) && ItemInfo.ItemHasCapability(id, 'can_sticker'),\n            OnSelected: (id) => {\n                $.DispatchEvent('CSGOPlaySoundEffect', 'sticker_applySticker', 'MOUSE');\n                $.DispatchEvent('ContextMenuEvent', '');\n                $.DispatchEvent('ShowSelectItemForCapabilityPopup', id, '', 'can_sticker');\n            }\n        },\n        {\n            name: 'can_sticker',\n            populateFilter: ['loadout', 'loadout_slot_t', 'loadout_slot_ct'],\n            AvailableForItem: (id) => {\n                return ItemInfo.ItemHasCapability(id, 'can_sticker') &&\n                    InventoryAPI.GetItemStickerSlotCount(id) > InventoryAPI.GetItemStickerCount(id);\n            },\n            OnSelected: (id) => {\n                $.DispatchEvent('CSGOPlaySoundEffect', 'sticker_applySticker', 'MOUSE');\n                $.DispatchEvent('ContextMenuEvent', '');\n                $.DispatchEvent('ShowSelectItemForCapabilityPopup', id, '', 'can_sticker');\n            }\n        },\n        {\n            name: 'can_wrap_sticker',\n            populateFilter: ['inspect', 'loadout', 'loadout_slot_t', 'loadout_slot_ct'],\n            AvailableForItem: (id) => {\n                return InventoryAPI.DoesItemMatchDefinitionByName(id, \"sticker_display_case\");\n            },\n            OnSelected: (id) => {\n                $.DispatchEvent('CSGOPlaySoundEffect', 'sticker_applySticker', 'MOUSE');\n                $.DispatchEvent('ContextMenuEvent', '');\n                $.DispatchEvent('ShowSelectItemForCapabilityPopup', id, '', 'can_wrap_sticker');\n            }\n        },\n        {\n            name: 'wrap_sticker',\n            populateFilter: ['loadout', 'loadout_slot_t', 'loadout_slot_ct'],\n            AvailableForItem: (id) => {\n                return ItemInfo.ItemHasCapability(id, 'can_wrap_sticker') &&\n                    !InventoryAPI.DoesItemMatchDefinitionByName(id, \"sticker_display_case\");\n            },\n            OnSelected: (id) => {\n                $.DispatchEvent('CSGOPlaySoundEffect', 'sticker_applySticker', 'MOUSE');\n                $.DispatchEvent('ContextMenuEvent', '');\n                if (InventoryAPI.GetChosenActionItemsCount(id, 'can_wrap_sticker') > 0) {\n                    $.DispatchEvent('ShowSelectItemForCapabilityPopup', id, '', 'can_wrap_sticker');\n                }\n                else {\n                    const defidxWrapper = InventoryAPI.GetItemDefinitionIndexFromDefinitionName(\"sticker_display_case\");\n                    const fauxCasket = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(defidxWrapper, 0);\n                    const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('popup-inspect-' + id, 'file://{resources}/layout/popups/popup_capability_can_keychain.xml');\n                    let oSettings = {\n                        popup_panel: elPanel,\n                        tool_id: id,\n                        item_id: fauxCasket,\n                        work_type: 'can_wrap_sticker'\n                    };\n                    elPanel.Data().oSettings = oSettings;\n                }\n            }\n        },\n        {\n            name: 'remove_sticker',\n            populateFilter: ['loadout', 'loadout_slot_t', 'loadout_slot_ct'],\n            AvailableForItem: (id) => ItemInfo.ItemHasCapability(id, 'can_sticker') && InventoryAPI.GetItemStickerCount(id) > 0,\n            OnSelected: (id) => {\n                $.DispatchEvent('ContextMenuEvent', '');\n                const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('', 'file://{resources}/layout/popups/popup_capability_can_sticker.xml');\n                let oSettings = {\n                    popup_panel: elPanel,\n                    item_id: id,\n                    work_type: 'remove_sticker'\n                };\n                elPanel.Data().oSettings = oSettings;\n            }\n        },\n        {\n            name: (id) => InventoryAPI.IsRental(id) ? 'preview_can_patch' : 'can_patch',\n            populateFilter: ['inspect', 'preview', 'loadout', 'loadout_slot_t', 'loadout_slot_ct'],\n            bActionIsRentalAware: true,\n            AvailableForItem: (id) => ItemInfo.IsPatch(id) && ItemInfo.ItemHasCapability(id, 'can_patch'),\n            OnSelected: (id) => {\n                $.DispatchEvent('CSGOPlaySoundEffect', 'sticker_applySticker', 'MOUSE');\n                $.DispatchEvent('ContextMenuEvent', '');\n                $.DispatchEvent('ShowSelectItemForCapabilityPopup', id, '', 'can_patch');\n            }\n        },\n        {\n            name: 'can_patch',\n            populateFilter: ['loadout', 'loadout_slot_t', 'loadout_slot_ct'],\n            AvailableForItem: (id) => {\n                return ItemInfo.ItemHasCapability(id, 'can_patch') &&\n                    InventoryAPI.GetItemStickerSlotCount(id) > InventoryAPI.GetItemStickerCount(id);\n            },\n            OnSelected: (id) => {\n                $.DispatchEvent('CSGOPlaySoundEffect', 'sticker_applySticker', 'MOUSE');\n                $.DispatchEvent('ContextMenuEvent', '');\n                $.DispatchEvent('ShowSelectItemForCapabilityPopup', id, '', 'can_patch');\n            }\n        },\n        {\n            name: 'remove_patch',\n            AvailableForItem: (id) => ItemInfo.ItemHasCapability(id, 'can_patch') && InventoryAPI.GetItemStickerCount(id) > 0,\n            OnSelected: (id) => {\n                $.DispatchEvent('ContextMenuEvent', '');\n                const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('', 'file://{resources}/layout/popups/popup_capability_can_patch.xml');\n                let oSettings = {\n                    item_id: id,\n                    work_type: 'remove_patch'\n                };\n                elPanel.Data().oSettings = oSettings;\n            }\n        },\n        {\n            name: 'recipe',\n            AvailableForItem: (id) => ItemInfo.IsRecipe(id),\n            OnSelected: (id) => $.DispatchEvent('ContextMenuEvent', ''),\n        },\n        {\n            name: (id) => InventoryAPI.IsRental(id) ? 'preview' : 'can_stattrack_swap',\n            AvailableForItem: (id) => ItemInfo.ItemHasCapability(id, 'can_stattrack_swap') && InventoryAPI.IsTool(id),\n            bActionIsRentalAware: true,\n            OnSelected: (id) => {\n                if (InventoryAPI.IsRental(id)) {\n                    const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('', 'file://{resources}/layout/popups/popup_inventory_inspect.xml');\n                    let oSettings = {\n                        item_id: id,\n                        inspect_only: true\n                    };\n                    elPanel.Data().oSettings = oSettings;\n                }\n                else {\n                    $.DispatchEvent('ShowSelectItemForCapabilityPopup', id, '', 'can_stattrack_swap');\n                }\n                $.DispatchEvent('ContextMenuEvent', '');\n            }\n        },\n        {\n            name: 'tradeup_add',\n            populateFilter: ['tradeup_items'],\n            AvailableForItem: (id) => {\n                const slot = InventoryAPI.GetDefaultSlot(id);\n                return !!slot && slot !== \"melee\" && slot !== \"c4\" && slot !== \"clothing_hands\" && !ItemInfo.IsEquippalbleButNotAWeapon(id) &&\n                    (InventoryAPI.CanTradeUp(id) || InventoryAPI.GetNumItemsNeededToTradeUp(id) > 0);\n            },\n            OnSelected: (id) => {\n                $.DispatchEvent('ContextMenuEvent', '');\n                InventoryAPI.AddCraftIngredient(id);\n            }\n        },\n        {\n            name: 'tradeup_remove',\n            exclusiveFilter: ['tradeup_ingredients'],\n            AvailableForItem: (id) => {\n                const slot = InventoryAPI.GetDefaultSlot(id);\n                return !!slot && slot !== \"melee\" && slot !== \"c4\" && slot !== \"clothing_hands\" && !ItemInfo.IsEquippalbleButNotAWeapon(id);\n            },\n            OnSelected: (id) => {\n                $.DispatchEvent('ContextMenuEvent', '');\n                InventoryAPI.RemoveCraftIngredient(id);\n            }\n        },\n        {\n            name: 'open_contract',\n            AvailableForItem: (id) => ItemInfo.IsTradeUpContract(id),\n            OnSelected: (id) => {\n                $.DispatchEvent('ShowTradeUpPanel');\n                $.DispatchEvent('ContextMenuEvent', '');\n            }\n        },\n        {\n            name: 'usegift',\n            AvailableForItem: (id) => InventoryAPI.GetToolType(id) === 'gift',\n            OnSelected: (id) => {\n                $.DispatchEvent('ContextMenuEvent', '');\n                const CapDisabledMessage = InventoryAPI.GetItemCapabilityDisabledMessageByIndex(id, 0);\n                if (CapDisabledMessage === \"\") {\n                    const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('', 'file://{resources}/layout/popups/popup_inventory_inspect.xml');\n                    let oSettings = {\n                        item_id: id,\n                        show_work_type_warning: false,\n                        work_type: 'usegift'\n                    };\n                    elPanel.Data().oSettings = oSettings;\n                }\n                else {\n                    const capDisabledMessage = InventoryAPI.GetItemCapabilityDisabledMessageByIndex(id, 0);\n                    UiToolkitAPI.ShowGenericPopupOk($.Localize('#inv_context_usegift'), $.Localize(capDisabledMessage), '', () => { });\n                }\n            }\n        },\n        {\n            name: 'add_to_favorites_both',\n            style: (id) => 'TopSeparator',\n            populateFilter: ['inspect', 'loadout', 'loadout_slot_t', 'loadout_slot_ct'],\n            bActionIsRentalAware: true,\n            AvailableForItem: (id) => CanAddToFavorites(id, 't') && CanAddToFavorites(id, 'ct'),\n            OnSelected: (id) => {\n                $.DispatchEvent('ContextMenuEvent', '');\n                InventoryAPI.AddItemToFavorites('ct', id);\n                InventoryAPI.AddItemToFavorites('t', id);\n            },\n        },\n        {\n            name: 'add_to_favorites_ct',\n            style: (id) => {\n                if (CanAddToFavorites(id, 't'))\n                    return '';\n                return 'TopSeparator';\n            },\n            populateFilter: ['inspect', 'loadout', 'loadout_slot_t', 'loadout_slot_ct'],\n            bActionIsRentalAware: true,\n            AvailableForItem: id => CanAddToFavorites(id, 'ct'),\n            OnSelected: id => {\n                $.DispatchEvent('ContextMenuEvent', '');\n                InventoryAPI.AddItemToFavorites('ct', id);\n            },\n        },\n        {\n            name: 'remove_from_favorites_ct',\n            style: (id) => 'TopSeparator',\n            populateFilter: ['inspect', 'loadout', 'loadout_slot_t', 'loadout_slot_ct'],\n            bActionIsRentalAware: true,\n            AvailableForItem: (id) => InventoryAPI.ItemIsInFavorites('ct', id),\n            OnSelected: (id) => {\n                $.DispatchEvent('ContextMenuEvent', '');\n                InventoryAPI.RemoveItemFromFavorites('ct', id);\n            },\n        },\n        {\n            name: 'add_to_favorites_t',\n            style: (id) => {\n                if (CanAddToFavorites(id, 'ct') || InventoryAPI.ItemIsInFavorites('ct', id))\n                    return '';\n                return 'TopSeparator';\n            },\n            populateFilter: ['inspect', 'loadout', 'loadout_slot_t', 'loadout_slot_ct'],\n            bActionIsRentalAware: true,\n            AvailableForItem: (id) => CanAddToFavorites(id, 't'),\n            OnSelected: (id) => {\n                $.DispatchEvent('ContextMenuEvent', '');\n                InventoryAPI.AddItemToFavorites('t', id);\n            },\n        },\n        {\n            name: 'remove_from_favorites_t',\n            style: (id) => {\n                if (CanAddToFavorites(id, 'ct') || InventoryAPI.ItemIsInFavorites('ct', id))\n                    return '';\n                return 'TopSeparator';\n            },\n            populateFilter: ['inspect', 'loadout', 'loadout_slot_t', 'loadout_slot_ct'],\n            bActionIsRentalAware: true,\n            AvailableForItem: (id) => InventoryAPI.ItemIsInFavorites('t', id),\n            OnSelected: (id) => {\n                $.DispatchEvent('ContextMenuEvent', '');\n                InventoryAPI.RemoveItemFromFavorites('t', id);\n            },\n        },\n        {\n            name: 'add_to_favorites_noteam',\n            style: (id) => 'TopSeparator',\n            populateFilter: ['inspect', 'loadout', 'loadout_slot_t', 'loadout_slot_ct'],\n            bActionIsRentalAware: true,\n            AvailableForItem: id => CanAddToFavorites(id, 'noteam'),\n            OnSelected: id => {\n                $.DispatchEvent('ContextMenuEvent', '');\n                InventoryAPI.AddItemToFavorites('noteam', id);\n            },\n        },\n        {\n            name: 'remove_from_favorites_noteam',\n            style: (id) => 'TopSeparator',\n            populateFilter: ['inspect', 'loadout', 'loadout_slot_t', 'loadout_slot_ct'],\n            bActionIsRentalAware: true,\n            AvailableForItem: (id) => InventoryAPI.ItemIsInFavorites('noteam', id),\n            OnSelected: (id) => {\n                $.DispatchEvent('ContextMenuEvent', '');\n                InventoryAPI.RemoveItemFromFavorites('noteam', id);\n            },\n        },\n        {\n            name: 'enable_shuffle_slot',\n            exclusiveFilter: ['loadout_slot_ct'],\n            bActionIsRentalAware: true,\n            AvailableForItem: (id) => {\n                const category = InventoryAPI.GetLoadoutCategory(id);\n                return ['customplayer', 'clothing', 'melee', 'c4', 'musickit', 'equipment2'].includes(category);\n            },\n            OnSelected: (id) => {\n                const [team, slot] = _GetLoadoutSlot(id, 'ct');\n                LoadoutAPI.SetShuffleEnabled(team, slot, true);\n                $.DispatchEvent('ContextMenuEvent', '');\n            },\n        },\n        {\n            name: 'enable_shuffle_slot',\n            exclusiveFilter: ['loadout_slot_t'],\n            bActionIsRentalAware: true,\n            AvailableForItem: (id) => {\n                const category = InventoryAPI.GetLoadoutCategory(id);\n                return ['customplayer', 'clothing', 'melee', 'c4', 'musickit', 'equipment2'].includes(category);\n            },\n            OnSelected: (id) => {\n                const [team, slot] = _GetLoadoutSlot(id, 't');\n                LoadoutAPI.SetShuffleEnabled(team, slot, true);\n                $.DispatchEvent('ContextMenuEvent', '');\n            },\n        },\n        {\n            name: 'enable_weapon_shuffle',\n            exclusiveFilter: ['loadout_slot_ct'],\n            bActionIsRentalAware: true,\n            AvailableForItem: (id) => {\n                const category = InventoryAPI.GetLoadoutCategory(id);\n                if (category != 'secondary' && category != 'smg' && category != 'rifle')\n                    return false;\n                $.GetContextPanel().SetDialogVariable(\"weapon_type\", $.Localize(InventoryAPI.GetItemBaseName(id)));\n                return true;\n            },\n            OnSelected: (id) => {\n                const [team, slot] = _GetLoadoutSlot(id, 'ct');\n                LoadoutAPI.SetShuffleEnabled(team, slot, true);\n                $.DispatchEvent('ContextMenuEvent', '');\n            },\n        },\n        {\n            name: 'enable_weapon_shuffle',\n            exclusiveFilter: ['loadout_slot_t'],\n            bActionIsRentalAware: true,\n            AvailableForItem: (id) => {\n                const category = InventoryAPI.GetLoadoutCategory(id);\n                if (category != 'secondary' && category != 'smg' && category != 'rifle')\n                    return false;\n                $.GetContextPanel().SetDialogVariable(\"weapon_type\", $.Localize(InventoryAPI.GetItemBaseName(id)));\n                return true;\n            },\n            OnSelected: (id) => {\n                const [team, slot] = _GetLoadoutSlot(id, 't');\n                LoadoutAPI.SetShuffleEnabled(team, slot, true);\n                $.DispatchEvent('ContextMenuEvent', '');\n            },\n        },\n        {\n            name: 'disable_shuffle_slot',\n            exclusiveFilter: ['shuffle_slot_ct'],\n            bActionIsRentalAware: true,\n            AvailableForItem: (id) => {\n                const category = InventoryAPI.GetLoadoutCategory(id);\n                return ['customplayer', 'clothing', 'melee', 'c4', 'musickit', 'equipment2'].includes(category);\n            },\n            OnSelected: (id) => {\n                const [team, slot] = _GetLoadoutSlot(id, 'ct');\n                LoadoutAPI.SetShuffleEnabled(team, slot, false);\n                $.DispatchEvent('ContextMenuEvent', '');\n            },\n        },\n        {\n            name: 'disable_shuffle_slot',\n            exclusiveFilter: ['shuffle_slot_t'],\n            bActionIsRentalAware: true,\n            AvailableForItem: (id) => {\n                const category = InventoryAPI.GetLoadoutCategory(id);\n                return ['customplayer', 'clothing', 'melee', 'c4', 'musickit', 'equipment2'].includes(category);\n            },\n            OnSelected: (id) => {\n                const [team, slot] = _GetLoadoutSlot(id, 't');\n                LoadoutAPI.SetShuffleEnabled(team, slot, false);\n                $.DispatchEvent('ContextMenuEvent', '');\n            },\n        },\n        {\n            name: 'disable_weapon_shuffle',\n            exclusiveFilter: ['shuffle_slot_ct'],\n            bActionIsRentalAware: true,\n            AvailableForItem: (id) => {\n                const category = InventoryAPI.GetLoadoutCategory(id);\n                if (category != 'secondary' && category != 'smg' && category != 'rifle')\n                    return false;\n                $.GetContextPanel().SetDialogVariable(\"weapon_type\", $.Localize(InventoryAPI.GetItemBaseName(id)));\n                return true;\n            },\n            OnSelected: (id) => {\n                const [team, slot] = _GetLoadoutSlot(id, 'ct');\n                LoadoutAPI.SetShuffleEnabled(team, slot, false);\n                $.DispatchEvent('ContextMenuEvent', '');\n            },\n        },\n        {\n            name: 'disable_weapon_shuffle',\n            exclusiveFilter: ['shuffle_slot_t'],\n            bActionIsRentalAware: true,\n            AvailableForItem: (id) => {\n                const category = InventoryAPI.GetLoadoutCategory(id);\n                if (category != 'secondary' && category != 'smg' && category != 'rifle')\n                    return false;\n                $.GetContextPanel().SetDialogVariable(\"weapon_type\", $.Localize(InventoryAPI.GetItemBaseName(id)));\n                return true;\n            },\n            OnSelected: (id) => {\n                const [team, slot] = _GetLoadoutSlot(id, 't');\n                LoadoutAPI.SetShuffleEnabled(team, slot, false);\n                $.DispatchEvent('ContextMenuEvent', '');\n            },\n        },\n        {\n            name: 'intocasket',\n            style: (id) => 'TopSeparator',\n            AvailableForItem: (id) => InventoryAPI.IsPotentiallyMarketable(id),\n            OnSelected: (id) => {\n                $.DispatchEvent('ContextMenuEvent', '');\n                if (InventoryAPI.GetChosenActionItemsCount(id, 'can_collect') > 0) {\n                    $.DispatchEvent('ShowSelectItemForCapabilityPopup', id, '', 'can_collect');\n                }\n                else {\n                    const fauxCasket = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(1201, 0);\n                    const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('', 'file://{resources}/layout/popups/popup_inventory_inspect.xml');\n                    let oSettings = {\n                        item_id: fauxCasket,\n                        inspect_only: true,\n                        show_work_type_warning: false,\n                        store_item_id: 'fauxCasket'\n                    };\n                    elPanel.Data().oSettings = oSettings;\n                }\n            }\n        },\n        {\n            name: 'sell',\n            AvailableForItem: (id) => InventoryAPI.IsMarketable(id),\n            OnSelected: (id) => {\n                $.DispatchEvent('CSGOPlaySoundEffect', 'inventory_inspect_sellOnMarket', 'MOUSE');\n                $.DispatchEvent('ContextMenuEvent', '');\n                InventoryAPI.MarketListingForItem(id, 'create');\n            }\n        },\n        {\n            name: 'marketlisting',\n            style: (id) => 'TopSeparator',\n            bActionIsRentalAware: true,\n            AvailableForItem: (id) => {\n                if (MyPersonaAPI.GetLauncherType() === 'perfectworld')\n                    return false;\n                let unProtectedEscrowValue = InventoryAPI.GetItemAttributeValue(id, '{uint32}trade protected escrow date');\n                return ((unProtectedEscrowValue !== undefined) && (unProtectedEscrowValue == 0));\n            },\n            OnSelected: (id) => {\n                $.DispatchEvent('CSGOPlaySoundEffect', 'inventory_inspect_sellOnMarket', 'MOUSE');\n                $.DispatchEvent('ContextMenuEvent', '');\n                InventoryAPI.MarketListingForItem(id, 'view');\n            }\n        },\n        {\n            name: 'delete',\n            style: (id) => !InventoryAPI.IsMarketable(id) ? 'TopSeparator' : '',\n            AvailableForItem: (id) => InventoryAPI.IsDeletable(id),\n            OnSelected: (id) => {\n                $.DispatchEvent('ContextMenuEvent', '');\n                const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('', 'file://{resources}/layout/popups/popup_inventory_inspect.xml');\n                let oSettings = {\n                    item_id: id,\n                    override_async_btn_style: 'Negative',\n                    work_type: 'delete'\n                };\n                elPanel.Data().oSettings = oSettings;\n            }\n        },\n        {\n            name: 'loadout_slot_reset_t',\n            exclusiveFilter: ['loadout_slot_t'],\n            bActionIsRentalAware: true,\n            AvailableForItem: (id) => {\n                let team = 't';\n                let slot = InventoryAPI.GetDefaultSlot(id);\n                if (slot == 'musickit')\n                    team = 'noteam';\n                else if (slot != 'customplayer' && slot != 'clothing_hands' && slot != 'melee' && slot != 'c4' && slot != 'equipment2')\n                    return false;\n                return id != LoadoutAPI.GetDefaultItem(team, slot);\n            },\n            OnSelected: (id) => {\n                let team = 't';\n                let slot = InventoryAPI.GetDefaultSlot(id);\n                if (slot == 'musickit')\n                    team = 'noteam';\n                let defaultId = LoadoutAPI.GetDefaultItem(team, slot);\n                $.DispatchEvent('ContextMenuEvent', '');\n                TryEquipItemInSlot(team, defaultId, slot);\n            },\n        },\n        {\n            name: 'loadout_slot_reset_ct',\n            exclusiveFilter: ['loadout_slot_ct'],\n            bActionIsRentalAware: true,\n            AvailableForItem: (id) => {\n                let team = 'ct';\n                let slot = InventoryAPI.GetDefaultSlot(id);\n                if (slot == 'musickit')\n                    team = 'noteam';\n                else if (slot != 'customplayer' && slot != 'clothing_hands' && slot != 'melee' && slot != 'c4' && slot != 'equipment2')\n                    return false;\n                return id != LoadoutAPI.GetDefaultItem(team, slot);\n            },\n            OnSelected: (id) => {\n                let team = 'ct';\n                let slot = InventoryAPI.GetDefaultSlot(id);\n                if (slot == 'musickit')\n                    team = 'noteam';\n                let defaultId = LoadoutAPI.GetDefaultItem(team, slot);\n                $.DispatchEvent('ContextMenuEvent', '');\n                TryEquipItemInSlot(team, defaultId, slot);\n            },\n        },\n        {\n            name: 'loadout_slot_reset_weapon_t',\n            exclusiveFilter: ['loadout_slot_t'],\n            bActionIsRentalAware: true,\n            AvailableForItem: (id) => {\n                let team = 't';\n                let category = InventoryAPI.GetLoadoutCategory(id);\n                if (category != 'secondary' && category != 'smg' && category != 'rifle')\n                    return false;\n                let defIndex = InventoryAPI.GetItemDefinitionIndex(id);\n                let slot = LoadoutAPI.GetSlotEquippedWithDefIndex(team, defIndex);\n                let defaultId = LoadoutAPI.GetDefaultItem(team, slot);\n                let defaultDefIndex = InventoryAPI.GetItemDefinitionIndex(defaultId);\n                return defIndex != defaultDefIndex;\n            },\n            OnSelected: (id) => {\n                let team = 't';\n                let defIndex = InventoryAPI.GetItemDefinitionIndex(id);\n                let slot = LoadoutAPI.GetSlotEquippedWithDefIndex(team, defIndex);\n                let defaultId = LoadoutAPI.GetDefaultItem(team, slot);\n                let defaultDefIndex = InventoryAPI.GetItemDefinitionIndex(defaultId);\n                let preferredId = LoadoutAPI.GetPreferredItemIdForItemDefIndex(team, defaultDefIndex);\n                $.DispatchEvent('ContextMenuEvent', '');\n                TryEquipItemInSlot(team, preferredId, slot);\n            },\n        },\n        {\n            name: 'loadout_slot_reset_weapon_ct',\n            exclusiveFilter: ['loadout_slot_ct'],\n            bActionIsRentalAware: true,\n            AvailableForItem: (id) => {\n                let team = 'ct';\n                let category = InventoryAPI.GetLoadoutCategory(id);\n                if (category != 'secondary' && category != 'smg' && category != 'rifle')\n                    return false;\n                let defIndex = InventoryAPI.GetItemDefinitionIndex(id);\n                let slot = LoadoutAPI.GetSlotEquippedWithDefIndex(team, defIndex);\n                let defaultId = LoadoutAPI.GetDefaultItem(team, slot);\n                let defaultDefIndex = InventoryAPI.GetItemDefinitionIndex(defaultId);\n                return defIndex != defaultDefIndex;\n            },\n            OnSelected: (id) => {\n                let team = 'ct';\n                let defIndex = InventoryAPI.GetItemDefinitionIndex(id);\n                let slot = LoadoutAPI.GetSlotEquippedWithDefIndex(team, defIndex);\n                let defaultId = LoadoutAPI.GetDefaultItem(team, slot);\n                let defaultDefIndex = InventoryAPI.GetItemDefinitionIndex(defaultId);\n                let preferredId = LoadoutAPI.GetPreferredItemIdForItemDefIndex(team, defaultDefIndex);\n                $.DispatchEvent('ContextMenuEvent', '');\n                TryEquipItemInSlot(team, preferredId, slot);\n            },\n        },\n        {\n            name: 'loadout_slot_reset_finish_t',\n            exclusiveFilter: ['loadout_slot_t'],\n            bActionIsRentalAware: true,\n            AvailableForItem: (id) => {\n                let category = InventoryAPI.GetLoadoutCategory(id);\n                if (category == 'secondary' || category == 'smg' || category == 'rifle')\n                    return !InventoryAPI.IsFauxItemID(id);\n                else\n                    return false;\n            },\n            OnSelected: (id) => {\n                let team = 't';\n                let defIndex = InventoryAPI.GetItemDefinitionIndex(id);\n                let slot = LoadoutAPI.GetSlotEquippedWithDefIndex(team, defIndex);\n                let fauxId = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(defIndex, 0);\n                $.DispatchEvent('ContextMenuEvent', '');\n                TryEquipItemInSlot(team, fauxId, slot);\n            },\n        },\n        {\n            name: 'loadout_slot_reset_finish_ct',\n            exclusiveFilter: ['loadout_slot_ct'],\n            bActionIsRentalAware: true,\n            AvailableForItem: (id) => {\n                let category = InventoryAPI.GetLoadoutCategory(id);\n                if (category == 'secondary' || category == 'smg' || category == 'rifle')\n                    return !InventoryAPI.IsFauxItemID(id);\n                else\n                    return false;\n            },\n            OnSelected: (id) => {\n                let team = 'ct';\n                let defIndex = InventoryAPI.GetItemDefinitionIndex(id);\n                let slot = LoadoutAPI.GetSlotEquippedWithDefIndex(team, defIndex);\n                let fauxId = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(defIndex, 0);\n                $.DispatchEvent('ContextMenuEvent', '');\n                TryEquipItemInSlot(team, fauxId, slot);\n            },\n        },\n    ];\n    function GetItemToReplaceName(id, team, slot) {\n        if (slot === null || slot === undefined || slot === '') {\n            if (ItemInfo.IsWeapon(id) && !['melee', 'secondary0', 'c4', 'equipment2'].includes(InventoryAPI.GetDefaultSlot(id))) {\n                slot = ItemInfo.GetEquippedSlot(id, team);\n            }\n            else {\n                slot = InventoryAPI.GetDefaultSlot(id);\n            }\n        }\n        const currentEquippedItem = ItemInfo.GetItemIdForItemEquippedInSlot(team, slot);\n        if (currentEquippedItem && currentEquippedItem !== '0') {\n            $.GetContextPanel().SetDialogVariable(\"item_name\", GetNameWithRarity(currentEquippedItem));\n            if (team != 'noteam') {\n                return $.Localize('#inv_context_equip_team', $.GetContextPanel());\n            }\n            else\n                return $.Localize('#inv_context_equip', $.GetContextPanel());\n        }\n        return 'WRONG CONTEXT -GetItemToReplaceName()' + id;\n    }\n    function GetNameWithRarity(id) {\n        const rarityColor = InventoryAPI.GetItemRarityColor(id);\n        let sName = InventoryAPI.HasCustomName(id) ? $.HTMLEscape(InventoryAPI.GetItemNameCustomized(id)) : InventoryAPI.GetItemName(id);\n        return '<font color=\"' + rarityColor + '\">' + sName + '</font>';\n    }\n    function EquipItem(id, team, slot) {\n        if (slot === null || slot === undefined || slot === '') {\n            slot = InventoryAPI.GetDefaultSlot(id);\n            if (ItemInfo.IsWeapon(id) && ![\"melee\", \"secondary0\", \"c4\", \"equipment2\"].includes(slot))\n                slot = ItemInfo.GetEquippedSlot(id, team[0]);\n        }\n        const teamShownOnMainMenu = GameInterfaceAPI.GetSettingString('ui_vanitysetting_team');\n        for (let element of team) {\n            if (!TryEquipItemInSlot(element, id, slot))\n                return;\n        }\n        let bNeedToRestartMainMenuVanity = false;\n        if (ItemInfo.IsCharacter(id)) {\n            const teamOfCharacter = (InventoryAPI.GetItemTeam(id).search('Team_T') === -1) ? 'ct' : 't';\n            if (teamOfCharacter !== teamShownOnMainMenu) {\n                GameInterfaceAPI.SetSettingString('ui_vanitysetting_team', teamOfCharacter);\n            }\n            bNeedToRestartMainMenuVanity = true;\n        }\n        else {\n            team.filter(e => e === teamShownOnMainMenu);\n            if (team.length > 0) {\n                if ((slot === 'clothing_hands') ||\n                    (slot === GameInterfaceAPI.GetSettingString('ui_vanitysetting_loadoutslot_' + teamShownOnMainMenu))) {\n                    bNeedToRestartMainMenuVanity = true;\n                }\n            }\n        }\n        if (bNeedToRestartMainMenuVanity) {\n            $.DispatchEvent('ForceRestartVanity');\n        }\n    }\n    function TryEquipItemInSlot(szTeam, szItemID, szSlot) {\n        let bSuccess = LoadoutAPI.EquipItemInSlot(szTeam, szItemID, szSlot);\n        if (!bSuccess) {\n            UiToolkitAPI.ShowGenericPopupOk($.Localize('#LoadoutLockedPopupTitle'), $.Localize('#LoadoutLockedPopupText'), '', () => { });\n        }\n        return bSuccess;\n    }\n    function DoesNotHaveChosenActionItems(id, capability) {\n        return (InventoryAPI.GetChosenActionItemsCount(id, capability) === 0 && !InventoryAPI.IsTool(id));\n    }\n    function DoesItemTeamMatchTeamRequired(team, id) {\n        if (team === 't') {\n            return ItemInfo.IsItemT(id) || ItemInfo.IsItemAnyTeam(id);\n        }\n        if (team === 'ct') {\n            return ItemInfo.IsItemCt(id) || ItemInfo.IsItemAnyTeam(id);\n        }\n        if (team === 'noteam') {\n            return InventoryAPI.GetLoadoutCategory(id) == 'musickit';\n        }\n        return false;\n    }\n    function CanEquipItem(itemID) {\n        return !!InventoryAPI.GetDefaultSlot(itemID) && !ItemInfo.IsEquippableThroughContextMenu(itemID);\n    }\n    function IsKeyForXrayItem(id) {\n        const oData = ItemInfo.GetItemsInXray();\n        if (oData.case && oData.reward) {\n            const numActionItems = InventoryAPI.GetChosenActionItemsCount(oData.case, 'decodable');\n            if (numActionItems > 0) {\n                for (let i = 0; i < numActionItems; i++) {\n                    if (id === InventoryAPI.GetChosenActionItemIDByIndex(oData.case, 'decodable', i)) {\n                        return oData.case;\n                    }\n                }\n            }\n        }\n        return '';\n    }\n    function _CanSwapFinish(id, team) {\n        if (!DoesItemTeamMatchTeamRequired(team, id))\n            return false;\n        let slot;\n        let group = InventoryAPI.GetRawDefinitionKey(id, 'flexible_loadout_group');\n        switch (group) {\n            case 'customplayer':\n            case 'clothing_hands':\n            case 'melee':\n            case 'c4':\n            case 'equipment2':\n                {\n                    slot = group;\n                    break;\n                }\n            case 'secondary0':\n            case 'secondary':\n            case 'smg':\n            case 'rifle':\n                {\n                    let itemDefIndex = InventoryAPI.GetItemDefinitionIndex(id);\n                    slot = LoadoutAPI.GetSlotEquippedWithDefIndex(team, itemDefIndex);\n                    if (!slot)\n                        return false;\n                    break;\n                }\n            default:\n                {\n                    return false;\n                }\n        }\n        if (LoadoutAPI.GetItemID(team, slot) == id)\n            return false;\n        if (LoadoutAPI.IsShuffleEnabled(team, slot))\n            return false;\n        return CanEquipItem(id);\n    }\n    function _GetLoadoutSlot(id, team) {\n        let group = InventoryAPI.GetRawDefinitionKey(id, 'flexible_loadout_group');\n        if (['equipment2', 'secondary0', 'secondary', 'smg', 'rifle'].includes(group)) {\n            let itemDefIndex = InventoryAPI.GetItemDefinitionIndex(id);\n            return [team, LoadoutAPI.GetSlotEquippedWithDefIndex(team, itemDefIndex)];\n        }\n        else if (['musickit', 'flair0', 'spray0'].includes(group)) {\n            return ['noteam', group];\n        }\n        else {\n            return [team, group];\n        }\n    }\n    function CanAddToFavorites(id, team) {\n        const [_, slot] = _GetLoadoutSlot(id, team);\n        if (!(ItemInfo.IsWeapon(id) || ItemInfo.IsMelee(id)) && slot != 'customplayer' && slot != 'clothing_hands' && slot != 'musickit')\n            return false;\n        if (slot == 'musickit' && team != 'noteam')\n            return false;\n        if (InventoryAPI.ItemIsInFavorites(team, id))\n            return false;\n        if (!DoesItemTeamMatchTeamRequired(team, id))\n            return false;\n        return !!InventoryAPI.GetDefaultSlot(id);\n    }\n})(ItemContextEntries || (ItemContextEntries = {}));\n","scripts/common/licenseutil.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\nvar LicenseUtil;\n(function (LicenseUtil) {\n    function GetCurrentLicenseRestrictions() {\n        let szButtonText = \"#Store_Get_License\";\n        let szMessageText = \"#SFUI_LoginLicenseAssist_NoOnlineLicense\";\n        switch (MyPersonaAPI.GetLicenseType()) {\n            case \"free_pw_needlink\":\n                szButtonText = \"#Store_Link_Accounts\";\n                szMessageText = \"#SFUI_LoginLicenseAssist_PW_NeedToLinkAccounts\";\n                break;\n            case \"free_pw_needupgrade\":\n                szMessageText = \"#SFUI_LoginLicenseAssist_HasLicense_PW\";\n                break;\n            case \"free_pw\":\n                szMessageText = \"#SFUI_LoginLicenseAssist_NoOnlineLicense_PW\";\n                break;\n            case \"free_sc\":\n                szMessageText = \"#SFUI_LoginLicenseAssist_NoOnlineLicense_SC\";\n                szButtonText = \"#Store_Register_License\";\n                break;\n            case \"purchased\":\n                return false;\n        }\n        return {\n            license_msg: szMessageText,\n            license_act: szButtonText\n        };\n    }\n    LicenseUtil.GetCurrentLicenseRestrictions = GetCurrentLicenseRestrictions;\n    function BuyLicenseForRestrictions(restrictions) {\n        if (restrictions && restrictions.license_act === \"#Store_Register_License\") {\n            UiToolkitAPI.ShowCustomLayoutPopupParameters('', 'file://{resources}/layout/popups/popup_license_register.xml', 'message=Store_Register_License' +\n                '&' + 'spinner=1');\n        }\n        else {\n            MyPersonaAPI.ActionBuyLicense();\n        }\n    }\n    LicenseUtil.BuyLicenseForRestrictions = BuyLicenseForRestrictions;\n    function ShowLicenseRestrictions(restrictions) {\n        if (restrictions !== false) {\n            UiToolkitAPI.ShowGenericPopupYesNo($.Localize(restrictions.license_act), $.Localize(restrictions.license_msg), '', () => BuyLicenseForRestrictions(restrictions), () => { });\n        }\n    }\n    LicenseUtil.ShowLicenseRestrictions = ShowLicenseRestrictions;\n})(LicenseUtil || (LicenseUtil = {}));\n","scripts/common/prime_button_action.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\nvar PrimeButtonAction;\n(function (PrimeButtonAction) {\n    function SetUpPurchaseBtn(btnPurchase) {\n        let sPrice = StoreAPI.GetStoreItemSalePrice(InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(1353, 0), 1, '');\n        btnPurchase.SetDialogVariable(\"price\", sPrice ? sPrice : '$0');\n        btnPurchase.SetPanelEvent('onactivate', () => {\n            SteamOverlayAPI.OpenURL(GetStoreUrl() + '/sub/54029');\n            $.DispatchEvent('UIPopupButtonClicked', '');\n        });\n    }\n    PrimeButtonAction.SetUpPurchaseBtn = SetUpPurchaseBtn;\n    function GetStoreUrl() {\n        return 'https://store.' +\n            ((SteamOverlayAPI.GetAppID() == 710) ? 'beta.' : '') +\n            ((MyPersonaAPI.GetSteamType() === 'china' || MyPersonaAPI.GetLauncherType() === \"perfectworld\") ? 'steamchina' : 'steampowered') + '.com';\n    }\n})(PrimeButtonAction || (PrimeButtonAction = {}));\n","scripts/common/promoted_settings.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\nvar g_PromotedSettingsVersion = 1;\nvar g_PromotedSettings = [\n    {\n        id: \"BuyMenuDonationKey\",\n        loc_name: \"#SFUI_Settings_BuyWheelDonateKey\",\n        loc_desc: \"#SFUI_Settings_BuyWheelDonateKey_Info\",\n        section: \"GameSettings\",\n        start_date: new Date('December 17, 2020'),\n        end_date: new Date('April 31, 2021'),\n    },\n    {\n        id: \"SettingsChatWheel\",\n        loc_name: \"#settings_ui_chatwheel_section\",\n        loc_desc: \"#Chatwheel_description\",\n        section: \"KeybdMouseSettings\",\n        start_date: new Date('November 25, 2020'),\n        end_date: new Date('April 30, 2021'),\n    },\n    {\n        id: \"SettingsCommunicationSettings\",\n        loc_name: \"#SFUI_Settings_FilterText_Title\",\n        loc_desc: \"#SFUI_Settings_FilterText_Title_Tooltip\",\n        section: \"GameSettings\",\n        start_date: new Date('June 11, 2020'),\n        end_date: new Date('June 30, 2020')\n    },\n    {\n        id: \"MainMenuMovieSceneSelector\",\n        loc_name: \"#GameUI_MainMenuMovieScene\",\n        loc_desc: \"#GameUI_MainMenuMovieScene_Tooltip\",\n        section: \"VideoSettings\",\n        subsection: \"SimpleVideoSettingsRadio\",\n        start_date: new Date('May 26, 2020'),\n        end_date: new Date('June 15, 2020')\n    },\n    {\n        id: \"XhairShowObserverCrosshair\",\n        loc_name: \"#GameUI_ShowObserverCrosshair\",\n        loc_desc: \"#GameUI_ShowObserverCrosshair_Tooltip\",\n        section: \"GameSettings\",\n        start_date: new Date('April 15, 2020'),\n        end_date: new Date('May 1, 2020')\n    },\n    {\n        id: \"SettingsCrosshair\",\n        loc_name: \"#settings_crosshair\",\n        loc_desc: \"#settings_crosshair_info\",\n        section: \"GameSettings\",\n        start_date: new Date('February 24, 2019'),\n        end_date: new Date('March 28, 2020')\n    },\n    {\n        id: \"ClutchKey\",\n        loc_name: \"#GameUI_Clutch_Key\",\n        loc_desc: \"#GameUI_Clutch_Key_Tooltip\",\n        section: \"KeybdMouseSettings\",\n        start_date: new Date('September 21, 2019'),\n        end_date: new Date('January 30, 2020')\n    },\n    {\n        id: \"id-friendlyfirecrosshair\",\n        loc_name: \"#GameUI_FriendlyWarning\",\n        loc_desc: \"#GameUI_FriendlyWarning_desc\",\n        section: \"GameSettings\",\n        start_date: new Date('October 7, 2019'),\n        end_date: new Date('February 30, 2020')\n    },\n    {\n        id: \"SettingsCommunicationSettings\",\n        loc_name: \"#settings_comm_binds_section\",\n        loc_desc: \"#settings_comm_binds_info\",\n        section: \"GameSettings\",\n        start_date: new Date('September 13, 2019'),\n        end_date: new Date('January 30, 2020')\n    },\n    {\n        id: \"RadialWepMenuBinder\",\n        loc_name: \"#SFUI_RadialWeaponMenu\",\n        loc_desc: \"#SFUI_RadialWeaponMenu_Desc\",\n        section: \"KeybdMouseSettings\",\n        start_date: new Date('September 18, 2019'),\n        end_date: new Date('January 30, 2020')\n    },\n    {\n        id: \"XhairRecoil\",\n        loc_name: \"#GameUI_CrosshairRecoil\",\n        loc_desc: \"#GameUI_CrosshairRecoil_Desc\",\n        section: \"GameSettings\",\n        start_date: new Date('August 21, 2023'),\n        end_date: new Date('January 30, 2024')\n    },\n    {\n        id: \"ZoomButtonHold\",\n        loc_name: \"#ZoomButtonHold\",\n        loc_desc: \"#ZoomButtonHold_Desc\",\n        section: \"KeybdMouseSettings\",\n        start_date: new Date('August 21, 2023'),\n        end_date: new Date('January 30, 2024')\n    },\n    {\n        id: \"FiddleWithSilencers\",\n        loc_name: \"#Cstrike_Fiddle_With_Silencers\",\n        loc_desc: \"#Cstrike_Fiddle_With_Silencers_Desc\",\n        section: \"GameSettings\",\n        start_date: new Date('August 21, 2023'),\n        end_date: new Date('January 30, 2024')\n    },\n    {\n        id: \"AllowAnimatedAvatars\",\n        loc_name: \"#Settings_AllowAnimatedAvatars_Title\",\n        loc_desc: \"#Settings_AllowAnimatedAvatars_Title_Tooltip\",\n        section: \"GameSettings\",\n        start_date: new Date('September 12, 2023'),\n        end_date: new Date('January 30, 2024')\n    },\n    {\n        id: \"ReplaceAvatarsWithPlayerCount\",\n        loc_name: \"#SFUI_Settings_MiniScoreboardPlayerCount\",\n        loc_desc: \"#SFUI_Settings_MiniScoreboardPlayerCount_Tooltip\",\n        section: \"GameSettings\",\n        start_date: new Date('October 11, 2023'),\n        end_date: new Date('January 30, 2024')\n    },\n    {\n        id: \"FirstPersonTracers\",\n        loc_name: \"#Cstrike_FirstPersonTracers\",\n        loc_desc: \"#Cstrike_FirstPersonTracers_Desc\",\n        section: \"GameSettings\",\n        start_date: new Date('January 19, 2024'),\n        end_date: new Date('February 28, 2024')\n    },\n    {\n        id: \"ExtraBufffering\",\n        loc_name: \"#SFUI_Settings_Network_ExtraBuffering\",\n        loc_desc: \"#SFUI_Settings_Network_ExtraBuffering_Info\",\n        section: \"GameSettings\",\n        start_date: new Date('February 6, 2024'),\n        end_date: new Date('April 22, 2024')\n    },\n    {\n        id: \"SettingsTelemetry\",\n        loc_name: \"#settings_telemetry_section\",\n        loc_desc: \"#settings_telemetry_section_info\",\n        section: \"GameSettings\",\n        start_date: new Date('February 6, 2024'),\n        end_date: new Date('April 22, 2024')\n    },\n    {\n        id: \"PreferredHandedness\",\n        loc_name: \"#Cstrike_PreferredHandedness\",\n        loc_desc: \"#Cstrike_PreferredHandedness_Desc\",\n        section: \"GameSettings\",\n        start_date: new Date('April 22, 2024'),\n        end_date: new Date('June 1, 2024')\n    },\n    {\n        id: \"RadarScaleToggle\",\n        loc_name: \"#SFUI_Settings_Radar_Scale_Alternate\",\n        loc_desc: \"#SFUI_Settings_Radar_Scale_Alternate_Info\",\n        section: \"GameSettings\",\n        start_date: new Date('April 22, 2024'),\n        end_date: new Date('June 1, 2024')\n    },\n    {\n        id: \"SettingsGrenadeCrosshair\",\n        loc_name: \"#settings_grenadecrosshair\",\n        loc_desc: \"#settings_grenadecrosshair_info\",\n        section: \"GameSettings\",\n        start_date: new Date('April 22, 2024'),\n        end_date: new Date('June 1, 2024')\n    },\n    {\n        id: \"DynamicShadowsContainer\",\n        loc_name: \"#SFUI_Settings_DynamicShadows\",\n        loc_desc: \"#SFUI_Settings_DynamicShadows_Info\",\n        section: \"VideoSettings\",\n        subsection: \"AdvancedVideoSettingsRadio\",\n        start_date: new Date('June 1, 2024'),\n        end_date: new Date('July 1, 2024')\n    },\n    {\n        id: \"RadarBackgroundOpacity\",\n        loc_name: \"#SFUI_Settings_HUD_Radar_Background_Alpha\",\n        loc_desc: \"#SFUI_Settings_HUD_Radar_Background_Alpha_Info\",\n        section: \"GameSettings\",\n        start_date: new Date('November 1, 2024'),\n        end_date: new Date('January 1, 2025')\n    },\n    {\n        id: \"RadarMapBlend\",\n        loc_name: \"#SFUI_Settings_HUD_Radar_Map_Additive\",\n        loc_desc: \"#SFUI_Settings_HUD_Radar_Map_Additive_Info\",\n        section: \"GameSettings\",\n        start_date: new Date('November 1, 2024'),\n        end_date: new Date('January 1, 2025')\n    },\n    {\n        id: \"SettingsDamagePrediction\",\n        loc_name: \"#settings_damage_prediction\",\n        loc_desc: \"#settings_damage_prediction_info\",\n        section: \"GameSettings\",\n        start_date: new Date('November 1, 2024'),\n        end_date: new Date('January 1, 2025')\n    },\n    {\n        id: \"RadarScaleDynamic\",\n        loc_name: \"#SFUI_Settings_Radar_Scale_Dynamic\",\n        loc_desc: \"#SFUI_Settings_Radar_Scale_Dynamic_Info\",\n        section: \"GameSettings\",\n        start_date: new Date('January 27, 2025'),\n        end_date: new Date('March 1, 2025')\n    },\n    {\n        id: \"RadarShapeSquare\",\n        loc_name: \"#SFUI_Settings_Radar_Shape_Square\",\n        loc_desc: \"#SFUI_Settings_Radar_Shape_Square_Info\",\n        section: \"GameSettings\",\n        start_date: new Date('January 27, 2025'),\n        end_date: new Date('March 1, 2025')\n    },\n    {\n        id: \"RadarBlurBackground\",\n        loc_name: \"#SFUI_Settings_Radar_Blur_Background\",\n        loc_desc: \"#SFUI_Settings_Radar_Blur_Background_Info\",\n        section: \"GameSettings\",\n        start_date: new Date('January 27, 2025'),\n        end_date: new Date('March 1, 2025')\n    },\n    {\n        id: \"WeaponRarityColor\",\n        loc_name: \"#SFUI_HUDWeaponRarityColor\",\n        loc_desc: \"#SFUI_HUDWeaponRarityColor_desc\",\n        section: \"GameSettings\",\n        start_date: new Date('January 27, 2025'),\n        end_date: new Date('June 1, 2025')\n    },\n    {\n        id: \"XhairStyle\",\n        loc_name: \"#settings_crosshair\",\n        loc_desc: \"#settings_crosshair_info\",\n        section: \"CrosshairSettings\",\n        start_date: new Date('September 21, 2026'),\n        end_date: new Date('December 1, 2026')\n    },\n]\n    .reverse();\nvar PromotedSettingsUtil;\n(function (PromotedSettingsUtil) {\n    function GetUnacknowledgedPromotedSettings() {\n        {\n            const now = new Date();\n            return g_PromotedSettings.filter(setting => setting.start_date <= now && setting.end_date > now);\n        }\n    }\n    PromotedSettingsUtil.GetUnacknowledgedPromotedSettings = GetUnacknowledgedPromotedSettings;\n    const hPromotedSettingsViewedEvt = $.RegisterForUnhandledEvent(\"MainMenu_PromotedSettingsViewed\", () => {\n        GameInterfaceAPI.SetSettingString(\"cl_promoted_settings_acknowledged\", \"\" + g_PromotedSettingsVersion + \":\" + Date.now());\n        $.UnregisterForUnhandledEvent(\"MainMenu_PromotedSettingsViewed\", hPromotedSettingsViewedEvt);\n    });\n})(PromotedSettingsUtil || (PromotedSettingsUtil = {}));\n","scripts/common/scheduler.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\nvar Scheduler;\n(function (Scheduler) {\n    const oJobs = {};\n    function Schedule(delay, fn, key = 'default') {\n        if (!oJobs.hasOwnProperty(key))\n            oJobs[key] = [];\n        oJobs[key].push(Job(delay, fn, key));\n    }\n    Scheduler.Schedule = Schedule;\n    function Cancel(key = 'default') {\n        if (oJobs.hasOwnProperty(key)) {\n            while (oJobs[key].length) {\n                const job = oJobs[key].pop();\n                job.Cancel();\n            }\n        }\n    }\n    Scheduler.Cancel = Cancel;\n    function Job(delay, func, key) {\n        let m_handle = $.Schedule(delay, function () {\n            m_handle = null;\n            func();\n        });\n        return {\n            GetHandle: () => m_handle,\n            Cancel: () => {\n                if (m_handle) {\n                    $.CancelScheduled(m_handle);\n                    m_handle = null;\n                }\n            },\n        };\n    }\n})(Scheduler || (Scheduler = {}));\n","scripts/common/sessionutil.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\nvar SessionUtil;\n(function (SessionUtil) {\n    function DoesGameModeHavePrimeQueue(gameModeSettingName) {\n        return gameModeSettingName === 'competitive' || gameModeSettingName === 'scrimcomp2v2';\n    }\n    SessionUtil.DoesGameModeHavePrimeQueue = DoesGameModeHavePrimeQueue;\n    function GetMaxLobbySlotsForGameMode(gameMode) {\n        switch (gameMode) {\n            case \"scrimcomp2v2\":\n                return 2;\n            case \"retakes\":\n                return 4;\n            case \"rush\":\n                return 3;\n            default:\n                return 5;\n        }\n    }\n    SessionUtil.GetMaxLobbySlotsForGameMode = GetMaxLobbySlotsForGameMode;\n    function AreLobbyPlayersPrime() {\n        const playersCount = PartyListAPI.GetCount();\n        for (let i = 0; i < playersCount; i++) {\n            const xuid = PartyListAPI.GetXuidByIndex(i);\n            const isFriendPrime = PartyListAPI.GetFriendPrimeEligible(xuid);\n            if (isFriendPrime === false) {\n                return false;\n            }\n        }\n        return true;\n    }\n    SessionUtil.AreLobbyPlayersPrime = AreLobbyPlayersPrime;\n    function GetNumWinsNeededForRank(skillgroupType) {\n        if (skillgroupType === 'Competitive')\n            return 2;\n        return 10;\n    }\n    SessionUtil.GetNumWinsNeededForRank = GetNumWinsNeededForRank;\n    function BCanUseMyPetInCurrentLobby() {\n        if (PartyListAPI.GetCount() <= 1)\n            return true;\n        if (LobbyAPI.GetHostSteamID() === MyPersonaAPI.GetXuid())\n            return true;\n        return false;\n    }\n    SessionUtil.BCanUseMyPetInCurrentLobby = BCanUseMyPetInCurrentLobby;\n})(SessionUtil || (SessionUtil = {}));\n","scripts/common/shopping_cart.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../common/formattext.ts\" />\nvar ShoppingCart;\n(function (ShoppingCart) {\n    class GlobalCart {\n        static instance;\n        MAX_PER_ITEM = 10;\n        MAX_CART = 100;\n        items = [];\n        totalItems = 0;\n        totalPrice = 0;\n        subscribers = [];\n        constructor() { }\n        static mapTempCarts = {};\n        static findOrCreateTempCart(id, bCreateNew) {\n            if (!GlobalCart.mapTempCarts.hasOwnProperty(id)) {\n                if (bCreateNew)\n                    GlobalCart.mapTempCarts[id] = new GlobalCart();\n            }\n            return GlobalCart.mapTempCarts[id];\n        }\n        static releaseTempCart(id) {\n            delete GlobalCart.mapTempCarts[id];\n        }\n        static getInstance() {\n            if (!GlobalCart.instance) {\n                GlobalCart.instance = new GlobalCart();\n            }\n            return GlobalCart.instance;\n        }\n        subscribeToUpdates(panel, key, callback) {\n            this.subscribers = this.subscribers.filter(sub => sub.panel.IsValid());\n            const existingIndex = this.subscribers.findIndex(sub => sub.panel === panel && sub.key === key);\n            if (existingIndex !== -1) {\n                this.subscribers[existingIndex].callback = callback;\n            }\n            else {\n                this.subscribers.push({ panel, key, callback });\n            }\n            callback();\n        }\n        broadcastUpdate() {\n            this.subscribers = this.subscribers.filter(sub => sub.panel.IsValid());\n            for (const sub of this.subscribers) {\n                sub.callback();\n            }\n        }\n        calculateTotals() {\n            let totalItems = 0;\n            let totalPrice = 0;\n            for (const item of this.items) {\n                totalItems += item.quantity;\n                totalPrice += (item.price * item.quantity);\n            }\n            this.totalItems = totalItems;\n            this.totalPrice = totalPrice;\n            this.broadcastUpdate();\n        }\n        addItem(product, quantity = 1) {\n            if (this.totalItems >= 100) {\n                return;\n            }\n            const existingItem = this.items.find(item => item.id === product.id);\n            if (existingItem) {\n                const newQuantity = existingItem.quantity + quantity;\n                existingItem.quantity = Math.min(newQuantity, this.MAX_PER_ITEM);\n            }\n            else {\n                const initialQuantity = Math.min(quantity, this.MAX_PER_ITEM);\n                this.items.push({ ...product, quantity: initialQuantity });\n            }\n            this.calculateTotals();\n        }\n        removeItem(productId) {\n            this.items = this.items.filter(item => item.id !== productId);\n            this.calculateTotals();\n        }\n        decrementItem(productId, amount = 1) {\n            const item = this.items.find(item => item.id === productId);\n            if (item) {\n                item.quantity -= amount;\n                if (item.quantity <= 0) {\n                    this.removeItem(productId);\n                }\n                else {\n                    this.calculateTotals();\n                }\n            }\n        }\n        updateQuantity(productId, quantity) {\n            if (quantity <= 0) {\n                this.removeItem(productId);\n                return;\n            }\n            const item = this.items.find(item => item.id === productId);\n            if (item) {\n                item.quantity = Math.min(quantity, this.MAX_PER_ITEM);\n                this.calculateTotals();\n            }\n        }\n        getItemQuantity(productId) {\n            const item = this.items.find(item => item.id === productId);\n            return item ? item.quantity : 0;\n        }\n        clearCart() {\n            this.items = [];\n            this.calculateTotals();\n        }\n        getItems() {\n            return this.items;\n        }\n        getItemUnitPrice(productId) {\n            const item = this.items.find(item => item.id === productId);\n            return item ? item.price : 0;\n        }\n        getItemLinePrice(productId) {\n            const item = this.items.find(item => item.id === productId);\n            return item ? (item.price * item.quantity) : 0;\n        }\n        getTotalItems() {\n            return this.totalItems;\n        }\n        getTotalPrice() {\n            return this.totalPrice;\n        }\n        syncPrices(getPriceById) {\n            let pricesChanged = false;\n            for (const item of this.items) {\n                const livePrice = getPriceById(item.id);\n                if (livePrice !== undefined && item.price !== undefined) {\n                    item.oldPrice = item.price;\n                    item.price = livePrice;\n                    pricesChanged = item.price !== item.oldPrice;\n                }\n            }\n            if (pricesChanged) {\n                this.calculateTotals();\n            }\n        }\n    }\n    ShoppingCart.cart = GlobalCart.getInstance();\n    function findOrCreateTempCart(id, bCreateNew) { return GlobalCart.findOrCreateTempCart(id, bCreateNew); }\n    ShoppingCart.findOrCreateTempCart = findOrCreateTempCart;\n    function releaseTempCart(id) { GlobalCart.releaseTempCart(id); }\n    ShoppingCart.releaseTempCart = releaseTempCart;\n})(ShoppingCart || (ShoppingCart = {}));\n","scripts/common/store_items.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"iteminfo.ts\" />\n/// <reference path=\"../generated/items_event_current_generated_store.d.ts\" />\n/// <reference path=\"../generated/items_event_current_generated_store.ts\" />\nvar StoreItems;\n(function (StoreItems) {\n    let m_oItemsByCategory = {\n        coupon: [],\n        tournament: [],\n        prime: [],\n        market: [],\n        key: [],\n        store: []\n    };\n    function MakeStoreItemList() {\n        let count = StoreAPI.GetBannerEntryCount();\n        if (!count || count < 1) {\n            return;\n        }\n        m_oItemsByCategory = {\n            coupon: [],\n            tournament: [],\n            prime: [],\n            market: [],\n            key: [],\n            store: []\n        };\n        let isPerfectWorld = (MyPersonaAPI.GetLauncherType() === \"perfectworld\");\n        let strBannerEntryCustomFormatString;\n        for (let i = 0; i < count; i++) {\n            let ItemId = StoreAPI.GetBannerEntryDefIdx(i);\n            let FauxItemId = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(ItemId, 0);\n            if (!isPerfectWorld &&\n                InventoryAPI.IsTool(FauxItemId) &&\n                InventoryAPI.GetItemCapabilityByIndex(FauxItemId, 0) === 'decodable') {\n                m_oItemsByCategory.key.push({ id: FauxItemId });\n            }\n            else if (StoreAPI.IsBannerEntryMarketLink(i)) {\n                m_oItemsByCategory.market.push({ id: FauxItemId, isMarketItem: true });\n            }\n            else if ((strBannerEntryCustomFormatString = StoreAPI.GetBannerEntryCustomFormatString(i)).startsWith(\"coupon\")) {\n                if (!AllowDisplayingItemInStore(FauxItemId))\n                    continue;\n                let obj = { id: FauxItemId };\n                let sLinkedCoupon = StoreAPI.GetBannerEntryLinkedCoupon(i);\n                if (sLinkedCoupon) {\n                    let LinkedItemId = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(parseInt(sLinkedCoupon), 0);\n                    obj.linkedid = LinkedItemId;\n                }\n                if (strBannerEntryCustomFormatString === \"coupon_new\") {\n                    obj.isNewRelease = true;\n                    if (!sLinkedCoupon) {\n                        obj.activationType = 'newstore';\n                    }\n                }\n                m_oItemsByCategory.coupon.push(obj);\n            }\n            else {\n                if (!AllowDisplayingItemInStore(FauxItemId))\n                    continue;\n                m_oItemsByCategory.store.push({ id: FauxItemId });\n            }\n        }\n        GetTournamentItems();\n    }\n    StoreItems.MakeStoreItemList = MakeStoreItemList;\n    function AllowDisplayingItemInStore(FauxItemId) {\n        let idToCheckForRestrictions = FauxItemId;\n        let bIsCouponCrate = InventoryAPI.IsCouponCrate(idToCheckForRestrictions);\n        if (bIsCouponCrate && InventoryAPI.GetLootListItemsCount(idToCheckForRestrictions) > 0) {\n            idToCheckForRestrictions = InventoryAPI.GetLootListItemIdByIndex(idToCheckForRestrictions, 0);\n        }\n        let sDefinitionName = InventoryAPI.GetItemDefinitionName(idToCheckForRestrictions);\n        if (sDefinitionName === \"crate_stattrak_swap_tool\")\n            return true;\n        let bIsDecodable = ItemInfo.ItemHasCapability(idToCheckForRestrictions, 'decodable');\n        let sRestriction = bIsDecodable ? InventoryAPI.GetDecodeableRestriction(idToCheckForRestrictions) : null;\n        if (sRestriction === \"restricted\" || sRestriction === \"xray\") {\n            return false;\n        }\n        return true;\n    }\n    function GetStoreItems() {\n        return m_oItemsByCategory;\n    }\n    StoreItems.GetStoreItems = GetStoreItems;\n    function GetStoreItemData(type, idx) {\n        return m_oItemsByCategory[type][idx];\n    }\n    StoreItems.GetStoreItemData = GetStoreItemData;\n    function GetTournamentItems() {\n        let sRestriction = InventoryAPI.GetDecodeableRestriction(\"capsule\");\n        let bCanSellCapsules = (sRestriction !== \"restricted\" && sRestriction !== \"xray\");\n        for (let i = 0; i < g_ActiveTournamentStoreLayout.length; i++) {\n            if (!bCanSellCapsules && i >= g_ActiveTournamentInfo.num_global_offerings) {\n                return;\n            }\n            let bContainsJustChampions = (typeof g_ActiveTournamentStoreLayout[i][1] === 'string');\n            let FauxItemId = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(g_ActiveTournamentStoreLayout[i][0], 0);\n            let GroupName = g_ActiveTournamentStoreLayout[i][2] ? g_ActiveTournamentStoreLayout[i][2] : '';\n            let warning = warningTextTournamentItems(isPurchaseable(FauxItemId), FauxItemId);\n            let itemPrice = ItemInfo.GetStoreSalePrice(FauxItemId, 1);\n            if (itemPrice || bContainsJustChampions) {\n                let storeItem = {\n                    id: FauxItemId,\n                    useTinyNames: true\n                };\n                storeItem.isDisabled = !isPurchaseable(FauxItemId);\n                storeItem.isNotReleased = !isPurchaseable(FauxItemId);\n                if (!bContainsJustChampions) {\n                    storeItem.linkedid = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(g_ActiveTournamentStoreLayout[i][1], 0);\n                }\n                if (GroupName) {\n                    storeItem.groupName = GroupName.toString();\n                }\n                if (warning) {\n                    storeItem.linkedWarning = warning;\n                }\n                if (g_ActiveTournamentStoreLayout[i][0] === g_ActiveTournamentInfo.itemid_pass) {\n                    storeItem.isTournamentPass = true;\n                }\n                m_oItemsByCategory.tournament?.push(storeItem);\n            }\n            if (!itemPrice && i >= g_ActiveTournamentInfo.num_global_offerings) {\n                break;\n            }\n        }\n    }\n    function warningTextTournamentItems(isPurchaseable, itemid) {\n        return !isPurchaseable\n            ? '#tournament_items_not_released_1'\n            : InventoryAPI.GetItemTypeFromEnum(itemid) === 'type_tool' ? '#tournament_items_notice' : '';\n    }\n    function isPurchaseable(itemid) {\n        let itemSchemaDef = ItemInfo.BuildItemSchemaDef(itemid);\n        return itemSchemaDef[\"cannot_inspect\"] === 1 ? false : true;\n    }\n})(StoreItems || (StoreItems = {}));\n","scripts/common/teamcolor.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\nvar TeamColor;\n(function (TeamColor) {\n    function GetColorString(color) {\n        const list = color.split(' ');\n        return list.join(',');\n    }\n    const colorRGB = [\n        '100,100,100',\n        GetColorString(GameInterfaceAPI.GetSettingString(\"cl_teammate_color_1\")),\n        GetColorString(GameInterfaceAPI.GetSettingString(\"cl_teammate_color_2\")),\n        GetColorString(GameInterfaceAPI.GetSettingString(\"cl_teammate_color_3\")),\n        GetColorString(GameInterfaceAPI.GetSettingString(\"cl_teammate_color_4\")),\n        GetColorString(GameInterfaceAPI.GetSettingString(\"cl_teammate_color_5\"))\n    ];\n    function GetTeamColor(teamColorInx) {\n        if (teamColorInx >= 0 && teamColorInx <= 4) {\n            return colorRGB[teamColorInx + 1];\n        }\n        return colorRGB[0];\n    }\n    TeamColor.GetTeamColor = GetTeamColor;\n})(TeamColor || (TeamColor = {}));\n","scripts/common/tint_spray_icon.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"iteminfo.ts\" />\nvar TintSprayIcon;\n(function (TintSprayIcon) {\n    function CheckIsSprayAndTint(itemId, elImage) {\n        if (ItemInfo.IsSprayPaint(itemId) || ItemInfo.IsSpraySealed(itemId)) {\n            const colorTint = InventoryAPI.GetSprayTintColorCode(itemId);\n            if (colorTint) {\n                elImage.style.washColor = colorTint.toString();\n            }\n            else {\n                elImage.style.washColor = 'none';\n            }\n        }\n        else {\n            elImage.style.washColor = 'none';\n        }\n    }\n    TintSprayIcon.CheckIsSprayAndTint = CheckIsSprayAndTint;\n})(TintSprayIcon || (TintSprayIcon = {}));\n","scripts/common/unique_random_number.js":"\"use strict\";\nvar UniqueRandomUtils;\n(function (UniqueRandomUtils) {\n    class UniqueRandomGenerator {\n        numbers;\n        currentIndex;\n        constructor(min, max) {\n            this.numbers = [];\n            for (let i = min; i <= max; i++) {\n                this.numbers.push(i);\n            }\n            this.currentIndex = this.numbers.length - 1;\n            this.shuffle();\n        }\n        shuffle() {\n            for (let i = this.numbers.length - 1; i > 0; i--) {\n                const j = Math.floor(Math.random() * (i + 1));\n                [this.numbers[i], this.numbers[j]] = [this.numbers[j], this.numbers[i]];\n            }\n        }\n        next() {\n            if (this.currentIndex < 0) {\n                return null;\n            }\n            return this.numbers[this.currentIndex--];\n        }\n        reset() {\n            this.shuffle();\n            this.currentIndex = this.numbers.length - 1;\n        }\n    }\n    UniqueRandomUtils.UniqueRandomGenerator = UniqueRandomGenerator;\n})(UniqueRandomUtils || (UniqueRandomUtils = {}));\n","scripts/common/xpshop_tile_weapon_camera_settings.js":"\"use strict\";\n/// <reference path=\"..\\csgo.d.ts\" />\nvar XpShopWeaponCameraSettings;\n(function (XpShopWeaponCameraSettings) {\n    XpShopWeaponCameraSettings.CameraSettings = JSON.parse(InventoryAPI.GetCameraDataJson()).weapons;\n})(XpShopWeaponCameraSettings || (XpShopWeaponCameraSettings = {}));\n","scripts/context_menus/context_menu_clan_tags.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../popups/popup_custom_layout.ts\" />\nvar PlayerCardContextMenuClanTags;\n(function (PlayerCardContextMenuClanTags) {\n    let m_myPrevClanId = MyPersonaAPI.GetMyClanId32BitEquipped();\n    function Init() {\n        m_myPrevClanId = MyPersonaAPI.GetMyClanId32BitEquipped();\n        const elClanTagContextMenu = $('#id-scrolling-tag-container');\n        elClanTagContextMenu.RemoveAndDeleteChildren();\n        const elClearItem = AddTextButtonItem(elClanTagContextMenu, 'noclan', $.Localize('#ClanTag_Clear_ClanTag'), () => EquipClanWithSpinner(0));\n        elClearItem.SetHasClass('current-clantag', m_myPrevClanId == 0);\n        elClearItem.enabled = m_myPrevClanId != 0;\n        const nNumClans = MyPersonaAPI.GetMyClanCount();\n        for (let i = 0; i < nNumClans; i++) {\n            const clanID = MyPersonaAPI.GetMyClanId32BitByIndex(i);\n            const clanTag = FriendsListAPI.GetClanInfoById32Bit(clanID, 'tag');\n            const clanName = FriendsListAPI.GetClanInfoById32Bit(clanID, 'name');\n            AddClanTagItem(elClanTagContextMenu, 'clanid' + i, clanID, '[' + clanTag + ']', clanName);\n        }\n        AddTextButtonItem(elClanTagContextMenu, 'id-manage-groups', $.Localize('#ClanTag_Manage_Groups'), () => {\n            const url = 'https://' + SteamOverlayAPI.GetSteamCommunityURL() + '/profiles/' + MyPersonaAPI.GetXuid() + '/groups/';\n            SteamOverlayAPI.OpenUrlInOverlayOrExternalBrowser(url);\n            $.DispatchEvent('ContextMenuEvent', '');\n        });\n    }\n    PlayerCardContextMenuClanTags.Init = Init;\n    function AddClanTagItem(elParent, id, clanID, tagText, nameText) {\n        const elItem = $.CreatePanel('Button', elParent, id);\n        elItem.BLoadLayoutSnippet('snippet-clantag-item');\n        const elClanTagLabel = elItem.FindChildTraverse('id-clan-tag__label');\n        elClanTagLabel.text = tagText;\n        elItem.SetHasClass('current-clantag', m_myPrevClanId == clanID);\n        elItem.enabled = m_myPrevClanId != clanID;\n        const elClanNameLabel = elItem.FindChildTraverse('id-clan-name__label');\n        elClanNameLabel.text = nameText;\n        elItem.SetPanelEvent('onactivate', () => EquipClanWithSpinner(clanID));\n    }\n    function AddTextButtonItem(elParent, id, labelText, fnActivate) {\n        const elItem = $.CreatePanel('Button', elParent, id);\n        elItem.BLoadLayoutSnippet('snippet-clantag-text-button');\n        const elLabel = elItem.FindChildTraverse('id-clantag-text-button__label');\n        elLabel.text = labelText;\n        elItem.SetPanelEvent('onactivate', fnActivate);\n        return elItem;\n    }\n    function EquipClanWithSpinner(clanID) {\n        let elPopup = UiToolkitAPI.ShowCustomLayoutPopup('', 'file://{resources}/layout/popups/popup_custom_layout.xml');\n        const jsEventHandler = UiToolkitAPI.RegisterJSCallback(OnMyPersonaInventoryUpdatedCallback);\n        let oSettings = {\n            image: 'file://{images}/control_icons/home_icon.vtf',\n            message: $.Localize('#ClanTag_Updating'),\n            show_spinner: true,\n            no_min_width: true,\n            show_loading_bar: false,\n            hide_buttons: true,\n            timeout: 1,\n            watch_event: 'PanoramaComponent_MyPersona_InventoryUpdated',\n            watch_event_callback: jsEventHandler,\n        };\n        elPopup.Data().oSettings = oSettings;\n        MyPersonaAPI.SetMyClanId32BitEquipped(clanID);\n    }\n    function OnMyPersonaInventoryUpdatedCallback() {\n        if (!MyPersonaAPI.IsInventoryValid() || !MyPersonaAPI.IsConnectedToGC()) {\n            $.DispatchEvent('UIPopupButtonClicked', '');\n            return;\n        }\n        const myNewClanId = MyPersonaAPI.GetMyClanId32BitEquipped();\n        if (myNewClanId != m_myPrevClanId) {\n            $.DispatchEvent('UIPopupButtonClicked', '');\n        }\n    }\n    {\n    }\n})(PlayerCardContextMenuClanTags || (PlayerCardContextMenuClanTags = {}));\n","scripts/context_menus/context_menu_color_picker.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\nvar ContextMenuColorPicker;\n(function (ContextMenuColorPicker) {\n    function Init() {\n        const contextPanel = $.GetContextPanel();\n        const contextData = contextPanel.GetParent().GetParent().GetParent().Data();\n        if (!contextData.initRGB) {\n            $.DispatchEvent('ContextMenuEvent', '');\n            return;\n        }\n        const bShowAlphaUi = ('nInitAlpha' in contextData);\n        const { initRGB: oRGB = { r: 0, g: 255, b: 0 }, nInitAlpha = 0, funcCallback } = contextData;\n        const elPicker = contextPanel.FindChildInLayoutFile('id-color-picker');\n        const elAlphaSliderTrack = elPicker.FindChildInLayoutFile('color-picker-alpha-slider').FindChildInLayoutFile('SliderTrack');\n        const hexColor = rgbToHex(oRGB);\n        let currentRgb = oRGB;\n        let currentAlpha = nInitAlpha;\n        const MakeResult = (rgb, alpha) => bShowAlphaUi ? { rgb, alpha } : { rgb };\n        $.RegisterEventHandler('CSColorPicked', elPicker, (r, g, b, a) => {\n            currentRgb = { r, g, b };\n            currentAlpha = a;\n            const newHex = rgbToHex(currentRgb);\n            elPicker.FindChildInLayoutFile('color-box-new').style.backgroundColor = newHex;\n            if (bShowAlphaUi)\n                elAlphaSliderTrack.style.backgroundColor = _AlphaGradient(newHex);\n            if (funcCallback) {\n                const result = MakeResult(currentRgb, currentAlpha);\n                _Debounce(elPicker, 'debounceHandler', .3, () => { funcCallback(result); });\n            }\n        });\n        elPicker.SetHasClass('hide-alpha', !bShowAlphaUi);\n        elPicker.FindChildInLayoutFile('color-box-current').style.backgroundColor = hexColor;\n        elPicker.FindChildInLayoutFile('color-box-new').style.backgroundColor = hexColor;\n        elPicker.SetRgb(oRGB.r, oRGB.g, oRGB.b);\n        if (bShowAlphaUi) {\n            elAlphaSliderTrack.style.backgroundColor = _AlphaGradient(hexColor);\n            elPicker.SetAlpha(nInitAlpha);\n        }\n        contextPanel.FindChildInLayoutFile('id-color-picker-cancel').SetPanelEvent('onactivate', () => {\n            if (funcCallback)\n                funcCallback(MakeResult(oRGB, nInitAlpha));\n            $.DispatchEvent('ContextMenuEvent', '');\n        });\n        contextPanel.FindChildInLayoutFile('id-color-picker-set').SetPanelEvent('onactivate', () => {\n            if (funcCallback)\n                funcCallback(MakeResult(currentRgb, currentAlpha));\n            $.DispatchEvent('ContextMenuEvent', '');\n        });\n    }\n    ContextMenuColorPicker.Init = Init;\n    function _AlphaGradient(hexColor) {\n        return \"gradient( linear,  0% 0%, 100% 0%, from( \" + hexColor + \"00 ), to( \" + hexColor + \") );\";\n    }\n    function rgbToHex({ r, g, b }) {\n        const clamp = (val) => Math.max(0, Math.min(255, val));\n        const toHex = (channel) => Math.round(clamp(channel)).toString(16).padStart(2, '0');\n        return `#${toHex(r)}${toHex(g)}${toHex(b)}`.toUpperCase();\n    }\n    function _Debounce(cp, handleName, delay, fnAction) {\n        if (cp.Data()[handleName]) {\n            $.CancelScheduled(cp.Data()[handleName]);\n            cp.Data()[handleName] = null;\n        }\n        cp.Data()[handleName] = $.Schedule(delay, fnAction);\n    }\n})(ContextMenuColorPicker || (ContextMenuColorPicker = {}));\n","scripts/context_menus/context_menu_custom_layout_test.js":"function SetupContextMenu()\n{\n\tvar strValue = $.GetContextPanel().GetAttributeString( \"test\", \"(not found)\" );\n\t$( '#DynamicButton' ).text = \"Parameter 'test' had value '\" + strValue + \"'\";\n}\n\nfunction OnTestPressed()\n{\n\t                   \n\t                                                                      \n\t\n\t                                                      \n\tvar callbackHandle = $.GetContextPanel().GetAttributeInt( \"callback\", -1 );\n\tif ( callbackHandle != -1 )\n\t{\n\t\tUiToolkitAPI.InvokeJSCallback( callbackHandle, 'Test' );\n\t}\n\t\n\t                                                                  \n\t                                           \n\t$.DispatchEvent( 'ContextMenuEvent', '' );\n}","scripts/context_menus/context_menu_eventsched_team.js":"'use strict';\n\nvar EventschedTeamContextMenu = ( function()\n{\n\n\tvar team_id;\n\tvar team_name;\n\tvar team_logo_url;\n\tvar team_url;\n\tvar player_photo_url = [];\n\tvar player_name = [];\n\tvar player_url = [];\n\n\tfunction _Init ()\n\t{\n\t\tteam_id = $.GetContextPanel().GetAttributeString( \"team_id\", \"\" );\n\t\tteam_name = $.GetContextPanel().GetAttributeString( \"team_name\", \"\" );\n\t\tteam_logo_url = $.GetContextPanel().GetAttributeString( \"team_logo_url\", \"\" );\n\t\tteam_url = $.GetContextPanel().GetAttributeString( \"team_url\", \"\" );\n\t\t\n\t\tplayer_photo_url[ 0 ] = $.GetContextPanel().GetAttributeString( \"player_photo0\", \"\" );\n\t\tplayer_photo_url[ 1 ] = $.GetContextPanel().GetAttributeString( \"player_photo1\", \"\" );\n\t\tplayer_photo_url[ 2 ] = $.GetContextPanel().GetAttributeString( \"player_photo2\", \"\" );\n\t\tplayer_photo_url[ 3 ] = $.GetContextPanel().GetAttributeString( \"player_photo3\", \"\" );\n\t\tplayer_photo_url[ 4 ] = $.GetContextPanel().GetAttributeString( \"player_photo4\", \"\" );\n\n\t\tplayer_name[ 0 ] = $.GetContextPanel().GetAttributeString( \"player_name0\", \"\" );\n\t\tplayer_name[ 1 ] = $.GetContextPanel().GetAttributeString( \"player_name1\", \"\" );\n\t\tplayer_name[ 2 ] = $.GetContextPanel().GetAttributeString( \"player_name2\", \"\" );\n\t\tplayer_name[ 3 ] = $.GetContextPanel().GetAttributeString( \"player_name3\", \"\" );\n\t\tplayer_name[ 4 ] = $.GetContextPanel().GetAttributeString( \"player_name4\", \"\" );\n\n\t\tplayer_url[ 0 ] = $.GetContextPanel().GetAttributeString( \"player_url0\", \"\" );\n\t\tplayer_url[ 1 ] = $.GetContextPanel().GetAttributeString( \"player_url1\", \"\" );\n\t\tplayer_url[ 2 ] = $.GetContextPanel().GetAttributeString( \"player_url2\", \"\" );\n\t\tplayer_url[ 3 ] = $.GetContextPanel().GetAttributeString( \"player_url3\", \"\" );\n\t\tplayer_url[ 4 ] = $.GetContextPanel().GetAttributeString( \"player_url4\", \"\" );\n\n\t\t            \n\t\t$.GetContextPanel().SetDialogVariable( 'eventsched-tt-teamname', team_name );\n\t\t\n\t\t            \n\t\tvar elTeamLogo = $.GetContextPanel().FindChildTraverse( 'id-estt-header__team-logo' );\n\t\tif ( elTeamLogo )\n\t\t{\n\t\t\telTeamLogo.SetImage( team_logo_url );\n\t\t}\n\n\t\tvar elTeamLogoBlurBG = $.GetContextPanel().FindChildTraverse( 'id-estt-blur' );\n\t\tif ( elTeamLogoBlurBG )\n\t\t{\n\t\t\telTeamLogoBlurBG.SetImage( team_logo_url );\n\t\t}\n\n\t\tvar elTeamHeader = $.GetContextPanel().FindChildTraverse( 'id-estt-header' );\n\t\tif ( elTeamHeader && team_url !== \"\" )\n\t\t{\n\t\t\telTeamHeader.AddClass( 'has_data' );\n\n\t\t\tvar onActivate = function ( url )\n\t\t\t{\n\t\t\t\tSteamOverlayAPI.OpenUrlInOverlayOrExternalBrowser( url ); \n\t\t\t\t\n\t\t\t\t$.DispatchEvent( 'CSGOPlaySoundEffect', 'UIPanorama.sidemenu_select', 'MOUSE' );\n\t\t\t}\n\n\t\t\telTeamHeader.SetPanelEvent( 'onactivate', onActivate.bind( undefined, team_url ) );\n\n\t\t}\n\t\t\n\t\t_Populate();\n\t}\n\n\tfunction _Populate ()\n\t{\n\t\t          \n\n\t\tvar elPlayerContainer = $.GetContextPanel().FindChildTraverse( 'id-estt-lineup-container' );\n\n\t\telPlayerContainer.RemoveAndDeleteChildren();\n\n\t\tfor ( var idx = 0; idx < 5; idx++ )\n\t\t{\n\t\t\tvar elPlayer = $.CreatePanel( 'Panel', elPlayerContainer, player_photo_url[ idx ] );\n\t\t\telPlayer.BLoadLayoutSnippet( 'snippet-estt-player' );\n\n\t\t\tvar playerName = player_name[ idx ] !== \"\" ? player_name[ idx ] : \"?\"; \n\t\t\t              \n\t\t\telPlayer.SetDialogVariable( 'esttplayer-name', playerName );\n\n\t\t\t              \n\t\t\tvar elPlayerImage = elPlayer.FindChildTraverse( 'id-estt-player__photo' );\n\t\t\tif ( elPlayerImage )\n\t\t\t{\n\t\t\t\telPlayerImage.SetImage( player_photo_url[ idx ] );\n\t\t\t}\n\n\t\t\tif ( player_url[ idx ] !== \"\" )\n\t\t\t{\n\t\t\t\telPlayer.AddClass( 'has_data' );\n\n\t\t\t\tvar onActivate = function ( url )\n\t\t\t\t{\n\t\t\t\t\tSteamOverlayAPI.OpenUrlInOverlayOrExternalBrowser( url ); \n\t\t\t\t\t\n\t\t\t\t\t$.DispatchEvent( 'CSGOPlaySoundEffect', 'UIPanorama.sidemenu_select', 'MOUSE' );\n\t\t\t\t}\n\n\t\t\t\telPlayer.SetPanelEvent( 'onactivate', onActivate.bind( undefined, player_url[ idx ] ) );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tInit: _Init,\n\t}\n\n\n})();\n\n(function()\n{\n\n})();","scripts/context_menus/context_menu_get_souvenir.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../popups/popup_acknowledge_item.ts\" />\n/// <reference path=\"../generated/items_event_current_generated_store.d.ts\" />\n/// <reference path=\"../generated/items_event_current_generated_store.ts\" />\nvar ContextMenuGetSouvenir;\n(function (ContextMenuGetSouvenir) {\n    let _m_redeemsAvailable = 0;\n    let _m_coinId = '';\n    let m_scheduleHandle;\n    function Init() {\n        let sUmids = $.GetContextPanel().GetAttributeString('umids', '');\n        if (!sUmids) {\n            $.GetContextPanel().SetHasClass('no-score', true);\n            return;\n        }\n        $.GetContextPanel().SetHasClass('no-score', false);\n        let tournamentIndex = $.GetContextPanel().GetAttributeString('tournamentId', '');\n        _m_coinId = InventoryAPI.GetActiveTournamentCoinItemId(parseInt(tournamentIndex));\n        if (_m_coinId && _m_coinId !== '0') {\n            let coinLevel = parseInt(InventoryAPI.GetItemAttributeValue(_m_coinId, \"upgrade level\"));\n            let coinRedeemsPurchased = parseInt(InventoryAPI.GetItemAttributeValue(_m_coinId, \"operation drops awarded 1\"));\n            if (coinRedeemsPurchased)\n                coinLevel += coinRedeemsPurchased;\n            let redeemed = parseInt(InventoryAPI.GetItemAttributeValue(_m_coinId, \"operation drops awarded 0\"));\n            _m_redeemsAvailable = coinLevel - redeemed;\n        }\n        let aUmids = sUmids.split(',');\n        aUmids.forEach(umid => {\n            let elParent = $.GetContextPanel().FindChildInLayoutFile('id-get-souvenir-matches-list');\n            MakeMatch(elParent, umid);\n        });\n        _SetRedeemHeader();\n    }\n    ContextMenuGetSouvenir.Init = Init;\n    function _SetRedeemHeader() {\n        let elRedeemHeader = $.GetContextPanel().FindChildInLayoutFile('id-get-souvenir-matches-redeem');\n        elRedeemHeader.visible = false;\n        if (_m_redeemsAvailable > 0) {\n            elRedeemHeader.visible = true;\n            elRedeemHeader.SetDialogVariableInt('redeems', _m_redeemsAvailable);\n            elRedeemHeader.SetDialogVariable('redeems-text', $.Localize('#popup_redeem_souvenir_desc:f', elRedeemHeader));\n        }\n        else {\n            elRedeemHeader.GetParent().visible = false;\n        }\n    }\n    function MakeMatch(elParent, umid) {\n        let elMatch = elParent.FindChild(umid);\n        if (!elMatch) {\n            elMatch = $.CreatePanel(\"Panel\", elParent, umid);\n            elMatch.BLoadLayoutSnippet(\"get-souvenir-tile\");\n        }\n        let team0 = MatchInfoAPI.GetMatchTournamentTeamTag(umid, 0);\n        let team1 = MatchInfoAPI.GetMatchTournamentTeamTag(umid, 1);\n        let res = MatchInfoAPI.GetMatchOutcome(umid);\n        let team0Score = MatchInfoAPI.GetMatchRoundScoreForTeam(umid, 0);\n        let team1Score = MatchInfoAPI.GetMatchRoundScoreForTeam(umid, 1);\n        let bTteamSwap = (res == 2);\n        elMatch.SetDialogVariableInt('match-score-0', bTteamSwap ? team1Score : team0Score);\n        elMatch.SetDialogVariableInt('match-score-1', bTteamSwap ? team0Score : team1Score);\n        elMatch.SetDialogVariable('teamname-0', bTteamSwap ?\n            MatchInfoAPI.GetMatchTournamentTeamName(umid, 1) :\n            MatchInfoAPI.GetMatchTournamentTeamName(umid, 0));\n        elMatch.SetDialogVariable('teamname-1', bTteamSwap ?\n            MatchInfoAPI.GetMatchTournamentTeamName(umid, 0) :\n            MatchInfoAPI.GetMatchTournamentTeamName(umid, 1));\n        elMatch.FindChildInLayoutFile('id-team-logo-0').SetImage(\"file://{images}/tournaments/teams/\" +\n            (bTteamSwap ? team1 : team0) + \".svg\");\n        elMatch.FindChildInLayoutFile('id-team-logo-1').SetImage(\"file://{images}/tournaments/teams/\" +\n            (bTteamSwap ? team0 : team1) + \".svg\");\n        var rawMapName = MatchInfoAPI.GetMatchMap(umid);\n        let mapBg = elMatch.FindChild('id-map-bg');\n        mapBg.style.backgroundImage = 'url(\"file://{images}/map_icons/screenshots/720p/' + rawMapName + '.png\")';\n        mapBg.style.backgroundPosition = '50% 50%';\n        mapBg.style.backgroundSize = 'clip_then_cover';\n        mapBg.style.backgroundImgOpacity = '.25';\n        elMatch.FindChildInLayoutFile('id-map-logo').SetImage(\"file://{images}/map_icons/map_icon_\" + rawMapName + \".svg\");\n        let tournamentId = $.GetContextPanel().GetAttributeString('tournamentId', '');\n        _SetButtonHintText(elMatch, parseInt(tournamentId), umid);\n        _SetPreviewBtn(elMatch, rawMapName, umid);\n        elMatch.SetHasClass('show', true);\n    }\n    function _SetButtonHintText(elMatch, tournamentIndex, umid) {\n        let elGetSouvenir = elMatch.FindChildInLayoutFile('id-get-souvenir');\n        let elGetSouvenirBtn = elMatch.FindChildInLayoutFile('id-get-souvenir-btn');\n        let elDropdown = elMatch.FindChildInLayoutFile('PurchaseCountDropdown');\n        let tailUmid = umid.split('_').at(-1);\n        const nEventID = MatchInfoAPI.GetMatchTournamentEventID(umid);\n        const nStageID = MatchInfoAPI.GetMatchTournamentStageID(umid);\n        const team0 = MatchInfoAPI.GetMatchTournamentTeamID(umid, 0);\n        const team1 = MatchInfoAPI.GetMatchTournamentTeamID(umid, 1);\n        const bPlayoffMatch = MatchInfoAPI.IsMatchTournamentStageIDPlayoff(nStageID);\n        const bThisMatchHasRedeemsEnabled = !bPlayoffMatch || InventoryAPI.HasHighlightReelSchema(nEventID, nStageID, team0, team1);\n        elGetSouvenir.SetHasClass('awaiting-highlights', !bThisMatchHasRedeemsEnabled && (nEventID < 26));\n        if (nEventID >= 26) {\n            let previewBtn = elMatch.FindChildInLayoutFile('id-preview-souvenir-btn');\n            previewBtn.text = $.Localize('#popup_redeem_souvenir_action_craft');\n            return;\n        }\n        if (_m_redeemsAvailable > 0) {\n            elGetSouvenir.SetDialogVariable('price', $.Localize('#popup_redeem_souvenir_action_redeem'));\n            elDropdown.visible = false;\n            elGetSouvenir.SetHasClass('only-purchase', false);\n            elGetSouvenirBtn.SetPanelEvent('onactivate', () => {\n                _ResetTimeouthandle();\n                MatchInfoAPI.RequestMatchTournamentSouvenir(umid, _m_coinId);\n                $.GetContextPanel().FindChildInLayoutFile('id-get-souvenir-matches-spinner').visible = true;\n                $.GetContextPanel().FindChildInLayoutFile('id-get-souvenir-matches-spinner').SetPanelEvent('onactivate', () => { });\n                m_scheduleHandle = $.Schedule(5, () => _CancelWaitforCallBack());\n            });\n            return;\n        }\n        let defIndexForCharges = g_ActiveTournamentInfo.itemid_charge;\n        let idFaux = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(defIndexForCharges, 0);\n        if (StoreAPI.GetStoreItemSalePrice(idFaux, 1, '')) {\n            elGetSouvenir.SetDialogVariable('redeems-text', $.Localize('#popup_redeem_souvenir_action'));\n            UpdateQuantity(elMatch);\n            elGetSouvenirBtn.SetPanelEvent('onactivate', () => {\n                _ResetTimeouthandle();\n                let elDropdown = elMatch.FindChildInLayoutFile('PurchaseCountDropdown');\n                let qty = Number(elDropdown.GetSelected().id);\n                let purchaseList = [];\n                for (let i = 0; i < qty; i++) {\n                    purchaseList.push(defIndexForCharges + '(' + tailUmid + ')');\n                }\n                let purchaseString = purchaseList.join(',');\n                StoreAPI.StoreItemPurchase(purchaseString);\n            });\n            elDropdown.visible = true;\n            elGetSouvenir.SetHasClass('only-purchase', true);\n            elDropdown.SetPanelEvent('oninputsubmit', () => UpdateQuantity(elMatch));\n            return;\n        }\n        elGetSouvenir.visible = false;\n    }\n    ;\n    function UpdateQuantity(elMatch) {\n        if (!elMatch || !elMatch.IsValid())\n            return;\n        let elDropdown = elMatch.FindChildInLayoutFile('PurchaseCountDropdown');\n        let qty = Number(elDropdown.GetSelected().id);\n        let elGetSouvenir = elMatch.FindChildInLayoutFile('id-get-souvenir');\n        let idForCharges = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(g_ActiveTournamentInfo.itemid_charge, 0);\n        elGetSouvenir.SetDialogVariable('price', StoreAPI.GetStoreItemSalePrice(idForCharges, qty, ''));\n    }\n    ContextMenuGetSouvenir.UpdateQuantity = UpdateQuantity;\n    function _ResetTimeouthandle() {\n        if (m_scheduleHandle) {\n            $.CancelScheduled(m_scheduleHandle);\n            m_scheduleHandle = null;\n        }\n    }\n    ;\n    function _CancelWaitforCallBack() {\n        m_scheduleHandle = null;\n        const elPanel = $.GetContextPanel();\n        if (!elPanel || !elPanel.IsValid()) {\n            return;\n        }\n        elPanel.FindChildInLayoutFile('id-get-souvenir-matches-spinner').visible = false;\n        $.DispatchEvent('ContextMenuEvent', '');\n        UiToolkitAPI.ShowGenericPopupOk($.Localize('#SFUI_SteamConnectionErrorTitle'), $.Localize('#SFUI_InvError_Item_Not_Given'), '', function () {\n        });\n    }\n    ;\n    function _SetPreviewBtn(elMatch, rawMapName, umid) {\n        let previewBtn = elMatch.FindChildInLayoutFile('id-preview-souvenir-btn');\n        StoreAPI.VolatileShopSubscribe(g_ActiveTournamentInfo.itemid_dynamic_stickers, true);\n        previewBtn.SetPanelEvent('onactivate', () => {\n            const defidxStickerItem = InventoryAPI.GetItemDefinitionIndexFromDefinitionName('sticker');\n            const idFauxSticker = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(defidxStickerItem, g_ActiveTournamentInfo.stickerids[g_ActiveTournamentInfo.stickerids.length - 1]);\n            if (!MissionsAPI.GetSeasonalOperationFauxCreditsCost(g_ActiveTournamentInfo.credits_id, idFauxSticker)) {\n                StoreAPI.VolatileShopSubscribe(g_ActiveTournamentInfo.itemid_dynamic_stickers, true);\n                return;\n            }\n            $.DispatchEvent('CSGOPlaySoundEffect', 'sticker_applySticker', 'MOUSE');\n            $.DispatchEvent('ContextMenuEvent', '');\n            $.DispatchEvent('ShowSelectItemForCapabilityPopup', umid, '', 'craft_souvenir');\n        });\n    }\n    var _ItemCustomizationNotification = function (numericType, type, itemid) {\n        _ResetTimeouthandle();\n        if (type === 'souvenir_generated') {\n            let itemsToAcknowledge = AcknowledgeItems.GetItems();\n            if (itemsToAcknowledge.length > 0) {\n                $.DispatchEvent('ShowAcknowledgePopup', '', '');\n            }\n            return;\n        }\n    };\n    {\n        $.RegisterForUnhandledEvent('PanoramaComponent_Inventory_ItemCustomizationNotification', _ItemCustomizationNotification);\n    }\n})(ContextMenuGetSouvenir || (ContextMenuGetSouvenir = {}));\n","scripts/context_menus/context_menu_inventory_item.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../common/item_context_entries.ts\" />\nvar ItemContextMenu;\n(function (ItemContextMenu) {\n    function SetupContextMenu() {\n        let id = $.GetContextPanel().GetAttributeString(\"itemid\", \"(not found)\");\n        let populateFilterText = $.GetContextPanel().GetAttributeString(\"populatefiltertext\", \"(not found)\");\n        InventoryAPI.PrecacheCustomMaterials(id);\n        _PopulateContextMenu(id, populateFilterText);\n    }\n    ItemContextMenu.SetupContextMenu = SetupContextMenu;\n    function _PopulateContextMenu(id, populateFilterText) {\n        let elParent = $.GetContextPanel();\n        let validEntries = ItemContextEntries.FilterEntries(id, populateFilterText);\n        function OnMouseOver(location, displayText) {\n            UiToolkitAPI.ShowTextTooltip(location, displayText);\n        }\n        let contextmenuparam = $.GetContextPanel().GetAttributeString('contextmenuparam', '');\n        for (let i = 0; i < validEntries.length; i++) {\n            const entry = validEntries[i];\n            let elButton = $.CreatePanel('Button', elParent, 'ContextMenuItem' + i);\n            let elLabel = $.CreatePanel('Label', elButton, '', { html: 'true' });\n            let displayName = '';\n            if (entry.name instanceof Function) {\n                displayName = entry.name(id);\n            }\n            else {\n                displayName = entry.name;\n            }\n            elLabel.text = '#inv_context_' + displayName;\n            if (entry.style) {\n                let strStyleToAdd = entry.style(id);\n                if (strStyleToAdd !== '') {\n                    if (strStyleToAdd === 'BottomSeparator' && i !== (validEntries.length - 1) ||\n                        strStyleToAdd === 'TopSeparator' && i !== 0) {\n                        elButton.AddClass(strStyleToAdd);\n                    }\n                }\n            }\n            let handler = entry.OnSelected;\n            elButton.SetPanelEvent('onactivate', () => {\n                $.DispatchEvent('CSGOPlaySoundEffect', 'inventory_item_popupSelect', 'MOUSE');\n                handler(id, contextmenuparam);\n            });\n            if (entry.CustomName) {\n                if (entry.CustomName(id) !== '') {\n                    let buttonId = elButton.id;\n                    let customName = entry.CustomName(id);\n                    elButton.SetPanelEvent('onmouseover', () => OnMouseOver(buttonId, customName));\n                    elButton.SetPanelEvent('onmouseout', () => UiToolkitAPI.HideTextTooltip());\n                }\n            }\n        }\n        if (!validEntries.length) {\n            let elButton = $.CreatePanel('Button', elParent, 'ContextMenuItem');\n            let elLabel = $.CreatePanel('Label', elButton, '', { html: 'true' });\n            elLabel.text = '#inv_context_no_valid_actions';\n            elButton.SetPanelEvent('onactivate', () => $.DispatchEvent('ContextMenuEvent', ''));\n        }\n    }\n})(ItemContextMenu || (ItemContextMenu = {}));\n","scripts/context_menus/context_menu_lobbies.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../friendlobby.ts\" />\nvar ContextMenuLobbies;\n(function (ContextMenuLobbies) {\n    let m_elNewestLobby = null;\n    let m_btnGoToNew = $.GetContextPanel().FindChildInLayoutFile('id-context-menu-lobbies-new-btn');\n    let m_bSeenNewestLobby = false;\n    function Init() {\n        let numInvites = PartyBrowserAPI.GetInvitesCount();\n        $.GetContextPanel().SetDialogVariableInt('lobby_count', numInvites);\n        let elInviteContainer = $.GetContextPanel().FindChildInLayoutFile('id-context-menu-lobbies');\n        if (numInvites < 1) {\n            $.DispatchEvent('ContextMenuEvent', '');\n            return;\n        }\n        let xuidsFromUpdate = [];\n        for (let i = 0; i < numInvites; i++) {\n            let xuid = PartyBrowserAPI.GetInviteXuidByIndex(i);\n            xuidsFromUpdate.push(xuid);\n        }\n        DeleteTilesNotInUpdate(elInviteContainer, xuidsFromUpdate);\n        xuidsFromUpdate.reverse();\n        for (let i = 0; i < xuidsFromUpdate.length; i++) {\n            let xuid = xuidsFromUpdate[i];\n            let elTile = elInviteContainer.FindChildTraverse(xuid);\n            if (!elTile)\n                AddTile(elInviteContainer, xuid, i);\n            else\n                UpdateTilePosition(elInviteContainer, elTile, i);\n        }\n        let elLastItem = elInviteContainer.Children()[elInviteContainer.Children().length - 1];\n        if (elLastItem && elLastItem.IsValid()) {\n            if (m_elNewestLobby === null) {\n                m_elNewestLobby = elLastItem;\n            }\n            else if (m_elNewestLobby && m_elNewestLobby.IsValid() && m_elNewestLobby.id !== elLastItem.id) {\n                m_elNewestLobby = elLastItem;\n                m_bSeenNewestLobby = false;\n            }\n        }\n        ShowHideNewLobbiesBtn();\n        elInviteContainer.SetSendScrollPositionChangedEvents(true);\n    }\n    ContextMenuLobbies.Init = Init;\n    ;\n    function DeleteTilesNotInUpdate(elList, xuidsFromUpdate) {\n        let children = elList.Children();\n        let sectionChildrenCount = children.length;\n        for (let i = 0; i < sectionChildrenCount; i++) {\n            let panelId = children[i].id;\n            if (xuidsFromUpdate.indexOf(panelId) < 0)\n                children[i].DeleteAsync(0);\n        }\n    }\n    ;\n    function UpdateTilePosition(elList, elTile, index) {\n        let children = elList.Children();\n        if (children[index])\n            elList.MoveChildBefore(elTile, children[index]);\n        friendLobby.Init(elTile);\n    }\n    ;\n    function ShowHideNewLobbiesBtn() {\n        $.Schedule(1, () => {\n            if (!m_elNewestLobby || !m_elNewestLobby.IsValid()) {\n                m_btnGoToNew.SetHasClass('hide', true);\n                return;\n            }\n            else if (m_elNewestLobby.BCanSeeInParentScroll() && !m_bSeenNewestLobby) {\n                m_btnGoToNew.SetHasClass('hide', true);\n                m_bSeenNewestLobby = true;\n            }\n            else if (!m_elNewestLobby.BCanSeeInParentScroll() && !m_bSeenNewestLobby) {\n                m_btnGoToNew.SetHasClass('hide', false);\n            }\n        });\n    }\n    ContextMenuLobbies.ShowHideNewLobbiesBtn = ShowHideNewLobbiesBtn;\n    function AddTile(elList, xuid, index) {\n        let elTile = $.CreatePanel(\"Panel\", elList, xuid);\n        elTile.SetAttributeString('xuid', xuid);\n        elTile.BLoadLayout('file://{resources}/layout/friendlobby.xml', false, false);\n        AddTransitionEndEventHandler(elTile);\n        elTile.SetAttributeString('showinpopup', 'true');\n        friendLobby.Init(elTile);\n        elTile.RemoveClass('hidden');\n        $.RegisterEventHandler('ScrolledIntoView', elTile, () => { });\n        $.Schedule(1, () => { });\n    }\n    ;\n    function AddTransitionEndEventHandler(elTile) {\n        $.RegisterEventHandler('PropertyTransitionEnd', elTile, fnOnPropertyTransitionEndEvent);\n        function fnOnPropertyTransitionEndEvent(panel, propertyName) {\n            if (elTile === panel && propertyName === 'opacity') {\n                if (elTile.visible === true && elTile.BIsTransparent()) {\n                    elTile.DeleteAsync(0.0);\n                    return true;\n                }\n            }\n            return false;\n        }\n        ;\n    }\n    ;\n    function OnPressGotoNew() {\n        let elPanel = $.GetContextPanel().FindChildInLayoutFile('id-context-menu-lobbies');\n        elPanel.ScrollToBottom();\n    }\n    ContextMenuLobbies.OnPressGotoNew = OnPressGotoNew;\n    {\n        $.RegisterForUnhandledEvent('PanoramaComponent_PartyBrowser_InviteConsumed', Init);\n        $.RegisterForUnhandledEvent('PanoramaComponent_PartyBrowser_InviteReceived', Init);\n        let elLister = $.GetContextPanel().FindChildInLayoutFile('id-context-menu-lobbies');\n        elLister.SetSendScrollPositionChangedEvents(true);\n        $.RegisterEventHandler('ScrollPositionChanged', elLister, ShowHideNewLobbiesBtn);\n    }\n})(ContextMenuLobbies || (ContextMenuLobbies = {}));\n","scripts/context_menus/context_menu_mainmenu_vanity.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../common/iteminfo.ts\" />\n/// <reference path=\"../common/characteranims.ts\" />\nvar MainMenuVanityContextMenu;\n(function (MainMenuVanityContextMenu) {\n    function ChooseMapNameToken(map) {\n        let token = \"#VanityMapName_\" + map;\n        if ($.Localize(token) == token) {\n            token = \"#SFUI_Map_\" + map;\n        }\n        return token;\n    }\n    function Init() {\n        let strType = $.GetContextPanel().GetAttributeString(\"type\", \"\");\n        let team = $.GetContextPanel().GetAttributeString(\"team\", \"\");\n        let elContextMenuBodyNoScroll = $.GetContextPanel().FindChildTraverse('ContextMenuBodyNoScroll');\n        elContextMenuBodyNoScroll.SetDialogVariableLocString(\"mainmenu_bkgnd\", ChooseMapNameToken(GameInterfaceAPI.GetSettingString(\"ui_mainmenu_bkgnd_movie\")));\n        $.RegisterForUnhandledEvent(\"CSGOMainInitBackgroundMovie\", () => {\n            elContextMenuBodyNoScroll.SetDialogVariableLocString(\"mainmenu_bkgnd\", ChooseMapNameToken(GameInterfaceAPI.GetSettingString(\"ui_mainmenu_bkgnd_movie\")));\n        });\n        if (strType === 'catagory')\n            MakeCatBtns(team);\n        else if (strType === 'weapons')\n            MakeWeaponBtns(team);\n        else\n            MakeMapBtns();\n    }\n    MainMenuVanityContextMenu.Init = Init;\n    function fnAddVanityPopupMenuItem(idString, strItemNameString, fnOnActivate) {\n        let elContextMenuBodyNoScroll = $.GetContextPanel().FindChildTraverse('ContextMenuBodyNoScroll');\n        let elItem = $.CreatePanel('Button', elContextMenuBodyNoScroll, idString);\n        elItem.BLoadLayoutSnippet('snippet-vanity-item');\n        let elLabel = elItem.FindChildTraverse('id-vanity-item__label');\n        elLabel.SetLocString(strItemNameString);\n        elItem.SetPanelEvent('onactivate', fnOnActivate);\n        return elItem;\n    }\n    ;\n    function MakeCatBtns(team) {\n        let elContextMenuBodyNoScroll = $.GetContextPanel().FindChildTraverse('ContextMenuBodyNoScroll');\n        elContextMenuBodyNoScroll.RemoveAndDeleteChildren();\n        fnAddVanityPopupMenuItem('ChangeVanityMap', '#mainmenu_change_vanity_map', () => {\n            const elVanityContextMenu = UiToolkitAPI.ShowCustomLayoutContextMenuParametersDismissEvent('id-vanity-contextmenu-maps', '', 'file://{resources}/layout/context_menus/context_menu_mainmenu_vanity.xml', 'type=maps', () => $.DispatchEvent('ContextMenuEvent', ''));\n            elVanityContextMenu.AddClass('ContextMenu_NoArrow');\n        })\n            .SetFocus();\n        fnAddVanityPopupMenuItem('ChangeWeapon', '#mainmenu_change_vanity_weapon', () => {\n            const elVanityContextMenu = UiToolkitAPI.ShowCustomLayoutContextMenuParametersDismissEvent('id-vanity-contextmenu-weapons', '', 'file://{resources}/layout/context_menus/context_menu_mainmenu_vanity.xml', 'type=weapons' +\n                '&' + 'team=' + team, () => $.DispatchEvent('ContextMenuEvent', ''));\n            elVanityContextMenu.AddClass('ContextMenu_NoArrow');\n        });\n        let strOtherTeamToPrecache = ((team == '2') ? 'ct' : 't');\n        fnAddVanityPopupMenuItem('switchTo_' + strOtherTeamToPrecache, '#mainmenu_switch_vanity_to_' + strOtherTeamToPrecache, () => {\n            $.DispatchEvent(\"MainMenuSwitchVanity\", strOtherTeamToPrecache);\n            $.DispatchEvent('ContextMenuEvent', '');\n        })\n            .AddClass('BottomSeparator');\n        fnAddVanityPopupMenuItem('GoToLoadout', '#mainmenu_go_to_character_loadout', () => {\n            $.DispatchEvent(\"MainMenuGoToCharacterLoadout\", team);\n            $.DispatchEvent('ContextMenuEvent', '');\n        });\n        let otherTeamCharacterItemID = LoadoutAPI.GetItemID(strOtherTeamToPrecache, 'customplayer');\n        let settingsForOtherTeam = ItemInfo.GetOrUpdateVanityCharacterSettings(otherTeamCharacterItemID);\n        ItemInfo.PrecacheVanityCharacterSettings(settingsForOtherTeam);\n    }\n    ;\n    function MakeWeaponBtns(team) {\n        let elContextMenuBodyWeapons = $.GetContextPanel().FindChildTraverse('ContextMenuBodyWeapons');\n        elContextMenuBodyWeapons.RemoveAndDeleteChildren();\n        for (let [loadoutSubSlot, weaponItemId] of ItemInfo.GetLoadoutWeapons(team)) {\n            let elItem = $.CreatePanel('Button', elContextMenuBodyWeapons, weaponItemId);\n            elItem.BLoadLayoutSnippet('snippet-vanity-item');\n            elItem.AddClass('vanity-item--weapon');\n            let elLabel = elItem.FindChildTraverse('id-vanity-item__label');\n            elLabel.text = InventoryAPI.GetItemName(weaponItemId);\n            let elRarity = elItem.FindChildTraverse('id-vanity-item__rarity');\n            let rarityColor = InventoryAPI.GetItemRarityColor(weaponItemId);\n            elRarity.style.backgroundColor = \"gradient( linear, 0% 0%, 100% 0%, from(\" + rarityColor + \" ), color-stop( 0.0125, #00000000 ), to( #00000000 ) );\";\n            elItem.SetPanelEvent('onactivate', () => {\n                let shortTeam = CharacterAnims.NormalizeTeamName(team, true);\n                GameInterfaceAPI.SetSettingString('ui_vanitysetting_loadoutslot_' + shortTeam, loadoutSubSlot);\n                $.DispatchEvent('ForceRestartVanity');\n                $.DispatchEvent('ContextMenuEvent', '');\n            });\n        }\n    }\n    function MakeMapBtns() {\n        let cvarInfo = $.GetContextPanel().GetAttributeString(\"inspect-map\", \"\") === \"true\"\n            ? GameInterfaceAPI.GetSettingInfo(\"ui_inspect_bkgnd_map\")\n            : GameInterfaceAPI.GetSettingInfo(\"ui_mainmenu_bkgnd_movie\");\n        let aMaps = cvarInfo.allowed_values;\n        let elContextMenuBodyNoScroll = $.GetContextPanel().FindChildTraverse('ContextMenuBodyNoScroll');\n        elContextMenuBodyNoScroll.RemoveAndDeleteChildren();\n        for (let map of aMaps) {\n            fnAddVanityPopupMenuItem('context-menu-vanity-' + map, ChooseMapNameToken(map), () => {\n                if ($.GetContextPanel().GetAttributeString(\"inspect-map\", \"\") === \"true\") {\n                    GameInterfaceAPI.SetSettingString('ui_inspect_bkgnd_map', map);\n                }\n                else {\n                    GameInterfaceAPI.SetSettingString('ui_mainmenu_bkgnd_movie', map);\n                }\n                $.DispatchEvent('ContextMenuEvent', '');\n            });\n        }\n    }\n})(MainMenuVanityContextMenu || (MainMenuVanityContextMenu = {}));\n","scripts/context_menus/context_menu_navbar_notification.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\nvar ContextMenuNavBarNotification;\n(function (ContextMenuNavBarNotification) {\n    function SetupContextMenu() {\n        const icon = $.GetContextPanel().GetAttributeString('icon', '');\n        const title = $.GetContextPanel().GetAttributeString('title', '');\n        const color = $.GetContextPanel().GetAttributeString('color', '');\n        const tooltip = $.GetContextPanel().GetAttributeString('tooltip', '');\n        const link = $.GetContextPanel().GetAttributeString('link', '');\n        const gcConnecting = $.GetContextPanel().GetAttributeString('gcconnecting', '');\n        const elPanel = $.CreatePanel('Panel', $.GetContextPanel(), '');\n        elPanel.BLoadLayoutSnippet('notification');\n        $.GetContextPanel().FindChildInLayoutFile('id-notification-gc-icon').SetHasClass('show', gcConnecting === 'true');\n        let elIcon = $.GetContextPanel().FindChildInLayoutFile('id-notification-icon');\n        elIcon.SetHasClass('show', gcConnecting !== 'true');\n        if (gcConnecting !== 'true') {\n            elIcon.SetImage('file://{images}/icons/ui/' + icon + '.svg');\n            elIcon.SetHasClass(color, color !== '');\n        }\n        if (link !== '') {\n            $.GetContextPanel().FindChildInLayoutFile('id-notification-link').SetPanelEvent('onactivate', () => SteamOverlayAPI.OpenUrlInOverlayOrExternalBrowser(link));\n        }\n        $.GetContextPanel().SetHasClass('show-title', title !== '');\n        $.GetContextPanel().SetHasClass('show-tooltip', tooltip !== '');\n        $.GetContextPanel().SetHasClass('show-link', link !== '');\n        $.GetContextPanel().SetDialogVariable('title', title);\n        $.GetContextPanel().SetDialogVariable('tooltip', $.Localize(tooltip));\n        $.GetContextPanel().SetDialogVariable('link', link);\n        $.GetContextPanel().FindChildInLayoutFile('id-notification-text-block').SetHasClass(color, true);\n    }\n    ContextMenuNavBarNotification.SetupContextMenu = SetupContextMenu;\n    {\n    }\n})(ContextMenuNavBarNotification || (ContextMenuNavBarNotification = {}));\n","scripts/context_menus/context_menu_photo_viewer.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\nvar PhotoViewerContextMenu;\n(function (PhotoViewerContextMenu) {\n    function Init() {\n        const elPanel = $.GetContextPanel();\n        const strSrc = elPanel.GetAttributeString('src', '');\n        const elImage = elPanel.FindChildTraverse('id-photo-viewer-image');\n        if (strSrc === '' || !elImage) {\n            return;\n        }\n        elImage.SetImageFromFile(strSrc);\n        const strPath = elPanel.GetAttributeString('path', '');\n        const strPathID = elPanel.GetAttributeString('pathid', '');\n        const bFile = strPath !== '' && strPathID !== '';\n        const nSlash = strPath.lastIndexOf('/');\n        const strFolder = (nSlash < 0) ? '' : strPath.substring(0, nSlash);\n        const elCopyBtn = elPanel.FindChildInLayoutFile('photo-viewer-copy');\n        elCopyBtn.visible = bFile;\n        elCopyBtn.SetPanelEvent('onmouseover', () => { UiToolkitAPI.ShowTextTooltip('photo-viewer-copy', '#pet_photo_viewer_copy'); });\n        elCopyBtn.SetPanelEvent('onmouseout', () => { UiToolkitAPI.HideTextTooltip(); });\n        elCopyBtn.SetPanelEvent('onactivate', () => {\n            SteamOverlayAPI.CopyImageFileToClipboard(strPath, strPathID);\n        });\n        const elOpenBtn = elPanel.FindChildInLayoutFile('photo-viewer-open');\n        elOpenBtn.visible = bFile;\n        elOpenBtn.SetPanelEvent('onmouseover', () => { UiToolkitAPI.ShowTextTooltip('photo-viewer-open', '#pet_photo_viewer_folder'); });\n        elOpenBtn.SetPanelEvent('onmouseout', () => { UiToolkitAPI.HideTextTooltip(); });\n        elOpenBtn.SetPanelEvent('onactivate', () => {\n            GameInterfaceAPI.OsOpenFileOrFolder(strFolder, strPathID);\n        });\n    }\n    PhotoViewerContextMenu.Init = Init;\n})(PhotoViewerContextMenu || (PhotoViewerContextMenu = {}));\n","scripts/context_menus/context_menu_playercard.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\nvar ContextmenuPlayerCard;\n(function (ContextmenuPlayerCard) {\n    function Init() {\n        _LoadPlayerCard();\n        _GetContextMenuEntries();\n    }\n    ContextmenuPlayerCard.Init = Init;\n    function _LoadPlayerCard() {\n        let xuid = $.GetContextPanel().GetAttributeString(\"xuid\", \"(not found)\");\n        let oldPanel = $.GetContextPanel().FindChildInLayoutFile('JsContextMenuPlayercard');\n        if (oldPanel)\n            oldPanel.DeleteAsync(.0);\n        let newPanel = $.CreatePanel('Panel', $.GetContextPanel().FindChildInLayoutFile('JsContextMenuSections'), 'JsContextMenuPlayercard');\n        newPanel.SetAttributeString(\"xuid\", xuid);\n        newPanel.BLoadLayout('file://{resources}/layout/playercard.xml', false, false);\n    }\n    ContextmenuPlayerCard.ContextMenus = [\n        {\n            name: 'invite',\n            icon: 'invite',\n            AvailableForItem: (id) => {\n                return !GameStateAPI.IsLocalPlayerPlayingMatch() && !(LobbyAPI.IsPartyMember(id)) && !_IsSelf(id) &&\n                    ('purchased' === MyPersonaAPI.GetLicenseType());\n            },\n            OnSelected: (id, type) => {\n                FriendsListAPI.ActionInviteFriend(id, '');\n                $.DispatchEvent('ContextMenuEvent', '');\n                $.DispatchEvent('FriendInvitedFromContextMenu', id);\n            },\n            IsDisabled: () => {\n                let gss = LobbyAPI.GetSessionSettings();\n                if (!gss || !gss.hasOwnProperty('game')) {\n                    return false;\n                }\n                return gss.game.apr > 1 ? true : false;\n            },\n        },\n        {\n            name: 'join',\n            icon: 'JoinPlayer',\n            AvailableForItem: (id) => {\n                if (FriendsListAPI.IsFriendJoinable(id)) {\n                    if (GameStateAPI.IsPlayerConnected(id))\n                        return false;\n                    if (LobbyAPI.IsSessionActive()) {\n                        let party = LobbyAPI.GetSessionSettings().members;\n                        for (let i = 0; i < party.numPlayers; i++) {\n                            if (id === party['machine' + i].player0.xuid)\n                                return false;\n                        }\n                    }\n                    return ('purchased' === MyPersonaAPI.GetLicenseType());\n                }\n                return false;\n            },\n            OnSelected: (id) => {\n                FriendsListAPI.ActionJoinFriendSession(id);\n                $.DispatchEvent('ContextMenuEvent', '');\n            },\n        },\n        {\n            name: 'watch',\n            icon: 'watch_tv',\n            AvailableForItem: (id) => {\n                return !GameStateAPI.IsLocalPlayerPlayingMatch() &&\n                    FriendsListAPI.IsFriendWatchable(id) &&\n                    !GameStateAPI.IsPlayerConnected(id);\n            },\n            OnSelected: (id) => {\n                FriendsListAPI.ActionWatchFriendSession(id);\n                $.DispatchEvent('ContextMenuEvent', '');\n            },\n        },\n        {\n            name: 'steamprofile',\n            icon: 'profile',\n            AvailableForItem: (id) => MyPersonaAPI.GetLauncherType() !== \"perfectworld\",\n            OnSelected: (id) => {\n                SteamOverlayAPI.ShowUserProfilePage(id);\n                $.DispatchEvent('ContextMenuEvent', '');\n            },\n        },\n        {\n            name: 'changeclantag',\n            icon: 'clantag',\n            AvailableForItem: (id) => !GameStateAPI.IsLocalPlayerPlayingMatch() && _IsSelf(id) && MyPersonaAPI.GetLauncherType() !== \"perfectworld\",\n            OnSelected: null,\n            xml: 'file://{resources}/layout/change_clantag_playercard_button.xml',\n        },\n        {\n            name: 'petbook',\n            icon: 'pet_book',\n            AvailableForItem: (id) => {\n                return !GameStateAPI.IsLocalPlayerPlayingMatch() && _IsSelf(id) &&\n                    (_HatchedPetItemID() !== '' || _RetiredPetBookKeys().length > 0);\n            },\n            OnSelected: () => _ShowPetBookMenu(),\n        },\n        {\n            name: 'kick_from_lobby',\n            icon: 'friendignore',\n            AvailableForItem: (id) => {\n                if (GameStateAPI.IsLocalPlayerPlayingMatch())\n                    return false;\n                if (LobbyAPI.IsSessionActive() && LobbyAPI.BIsHost()) {\n                    let party = LobbyAPI.GetSessionSettings().members;\n                    for (let i = 0; i < party.numPlayers; i++) {\n                        if (id === party['machine' + i].player0.xuid && !_IsSelf(id))\n                            return true;\n                    }\n                }\n                return false;\n            },\n            OnSelected: (id) => {\n                LobbyAPI.KickPlayer(id);\n                $.DispatchEvent('ContextMenuEvent', '');\n            },\n        },\n        {\n            name: 'leave_lobby',\n            icon: 'leave',\n            AvailableForItem: (id) => {\n                if (!GameStateAPI.IsLocalPlayerPlayingMatch() && _IsSelf(id) && LobbyAPI.IsSessionActive()) {\n                    let party = LobbyAPI.GetSessionSettings().members;\n                    return party.numPlayers > 1 ? true : false;\n                }\n                return false;\n            },\n            OnSelected: (id) => {\n                LobbyAPI.CloseSession();\n                $.DispatchEvent('ContextMenuEvent', '');\n            },\n        },\n        {\n            name: 'message',\n            icon: 'message',\n            AvailableForItem: (id) => {\n                return !_IsSelf(id);\n            },\n            OnSelected: (id) => {\n                SteamOverlayAPI.StartChatWithUser(id);\n                $.DispatchEvent('ContextMenuEvent', '');\n            },\n        },\n        {\n            name: 'trade',\n            icon: 'trade',\n            AvailableForItem: (id) => FriendsListAPI.GetFriendRelationship(id) === \"friend\",\n            OnSelected: (id) => {\n                SteamOverlayAPI.StartTradeWithUser(id);\n                $.DispatchEvent('ContextMenuEvent', '');\n            },\n        },\n        {\n            name: 'friendaccept',\n            icon: 'friendaccept',\n            AvailableForItem: (id) => FriendsListAPI.GetFriendStatusBucket(id) === 'AwaitingLocalAccept',\n            OnSelected: (id) => {\n                SteamOverlayAPI.InteractWithUser(id, 'friendrequestaccept');\n                $.DispatchEvent('ContextMenuEvent', '');\n            },\n        },\n        {\n            name: 'friendignore',\n            icon: 'friendignore',\n            AvailableForItem: (id) => FriendsListAPI.GetFriendStatusBucket(id) === 'AwaitingLocalAccept',\n            OnSelected: (id) => {\n                SteamOverlayAPI.InteractWithUser(id, 'friendrequestignore');\n                $.DispatchEvent('ContextMenuEvent', '');\n            },\n        },\n        {\n            name: 'cancelinvite',\n            icon: 'friendignore',\n            AvailableForItem: (id) => FriendsListAPI.GetFriendStatusBucket(id) === 'AwaitingRemoteAccept',\n            OnSelected: (id) => {\n                SteamOverlayAPI.InteractWithUser(id, 'friendremove');\n                $.DispatchEvent('ContextMenuEvent', '');\n            },\n        },\n        {\n            name: 'removefriend',\n            icon: 'friendremove',\n            AvailableForItem: (id) => {\n                if (MyPersonaAPI.GetLauncherType() === \"perfectworld\") {\n                    if (_IsSelf(id))\n                        return false;\n                    let status = FriendsListAPI.GetFriendStatusBucket(id);\n                    return status !== 'AwaitingRemoteAccept' && status !== 'AwaitingLocalAccept';\n                }\n                return false;\n            },\n            OnSelected: (id) => {\n                SteamOverlayAPI.InteractWithUser(id, 'friendremove');\n                $.DispatchEvent('ContextMenuEvent', '');\n            },\n        },\n        {\n            name: 'request',\n            icon: 'addplayer',\n            AvailableForItem: (id) => {\n                let status = FriendsListAPI.GetFriendStatusBucket(id);\n                let isRequest = status === 'AwaitingRemoteAccept' || status === 'AwaitingLocalAccept';\n                return FriendsListAPI.GetFriendRelationship(id) !== \"friend\" && !_IsSelf(id) && !isRequest;\n            },\n            OnSelected: (id) => {\n                SteamOverlayAPI.InteractWithUser(id, 'friendadd');\n                $.DispatchEvent('ContextMenuEvent', '');\n            },\n        },\n        {\n            name: 'editprofile',\n            icon: 'edit',\n            AvailableForItem: (id) => _IsSelf(id),\n            OnSelected: (id) => {\n                let communityUrl = SteamOverlayAPI.GetSteamCommunityURL();\n                SteamOverlayAPI.OpenURL(communityUrl + \"/profiles/\" + id + \"/minimaledit\");\n                $.DispatchEvent('ContextMenuEvent', '');\n            },\n        },\n        {\n            name: 'changecolor',\n            icon: 'colorwheel',\n            AvailableForItem: (id) => {\n                return !GameStateAPI.IsLocalPlayerPlayingMatch() &&\n                    LobbyAPI.IsSessionActive() &&\n                    _IsSelf(id);\n            },\n            OnSelected: (id) => {\n                LobbyAPI.ChangeTeammateColor();\n            },\n        },\n        {\n            name: 'mute',\n            xml: 'file://{resources}/layout/mute_spinner.xml',\n            icon: null,\n            AvailableForItem: (id) => {\n                const bInGameAndMutable = GameStateAPI.IsLocalPlayerPlayingMatch() && !_IsSelf(id) && GameStateAPI.IsPlayerConnected(id);\n                const bInPartyAndMutable = !_IsSelf(id) && PartyListAPI.BIsVoiceChatEnabled() && PartyListAPI.BIsPlayerInParty(id);\n                return bInGameAndMutable || bInPartyAndMutable;\n            },\n            OnSelected: null,\n        },\n        {\n            name: 'report',\n            icon: 'alert',\n            AvailableForItem: (id) => {\n                return (GameStateAPI.IsLocalPlayerPlayingMatch() ||\n                    (GameStateAPI.IsLocalPlayerWatchingOwnDemo() && MatchInfoAPI.CanReportFromCurrentlyPlayingDemo()) ||\n                    GameStateAPI.GetGameModeInternalName(false) === \"survival\") &&\n                    !_IsSelf(id) &&\n                    GameStateAPI.IsPlayerConnected(id);\n            },\n            OnSelected: (id) => {\n                UiToolkitAPI.ShowCustomLayoutPopupParameters('', 'file://{resources}/layout/popups/popup_report_player.xml', 'xuid=' + id);\n                $.DispatchEvent('ContextMenuEvent', '');\n            },\n        },\n        {\n            name: 'commend',\n            icon: 'smile',\n            AvailableForItem: (id) => {\n                return (GameStateAPI.IsLocalPlayerPlayingMatch() || GameStateAPI.GetGameModeInternalName(false) === \"survival\") &&\n                    !_IsSelf(id) &&\n                    GameStateAPI.IsPlayerConnected(id);\n            },\n            OnSelected: (id) => {\n                UiToolkitAPI.ShowCustomLayoutPopupParameters('', 'file://{resources}/layout/popups/popup_commend_player.xml', 'xuid=' + id);\n                $.DispatchEvent('ContextMenuEvent', '');\n            },\n        },\n        {\n            name: 'borrowmusickit',\n            icon: 'music_kit',\n            AvailableForItem: (id) => {\n                let borrowedPlayerSlot = parseInt(GameInterfaceAPI.GetSettingString(\"cl_borrow_music_from_player_slot\"));\n                return GameStateAPI.IsLocalPlayerPlayingMatch() &&\n                    !_IsSelf(id) &&\n                    borrowedPlayerSlot !== GameStateAPI.GetPlayerSlot(id) &&\n                    _HasMusicKit(id) &&\n                    GameStateAPI.IsPlayerConnected(id);\n            },\n            OnSelected: (id) => {\n                GameInterfaceAPI.SetSettingString(\"cl_borrow_music_from_player_slot\", \"\" + GameStateAPI.GetPlayerSlot(id));\n                $.DispatchEvent('ContextMenuEvent', '');\n            },\n        },\n        {\n            name: 'stopborrowmusickit',\n            icon: 'no_musickit',\n            AvailableForItem: (id) => {\n                let borrowedPlayerSlot = parseInt(GameInterfaceAPI.GetSettingString(\"cl_borrow_music_from_player_slot\"));\n                if (borrowedPlayerSlot === -1)\n                    return false;\n                return GameStateAPI.IsLocalPlayerPlayingMatch() &&\n                    ((_IsSelf(id) && borrowedPlayerSlot !== -1) ||\n                        (borrowedPlayerSlot === GameStateAPI.GetPlayerSlot(id))) &&\n                    GameStateAPI.IsPlayerConnected(id);\n            },\n            OnSelected: (id) => {\n                $.DispatchEvent('Scoreboard_UnborrowMusicKit');\n                $.DispatchEvent('ContextMenuEvent', '');\n            },\n        },\n        {\n            name: 'copycrosshair',\n            icon: 'crosshair',\n            AvailableForItem: (id) => {\n                return GameStateAPI.IsLocalPlayerPlayingMatch() &&\n                    !_IsSelf(id) &&\n                    GameStateAPI.IsPlayerConnected(id);\n            },\n            OnSelected: (xuid) => {\n                $.DispatchEvent('Scoreboard_ApplyPlayerCrosshairCode', xuid);\n                $.DispatchEvent('ContextMenuEvent', '');\n            },\n        },\n        {\n            name: 'viewaddon',\n            icon: 'globe',\n            AvailableForItem: (id) => {\n                if (FriendsListAPI.IsFriendJoinable(id) && FriendsListAPI.GetFriendAddon(id)) {\n                    return true;\n                }\n                return false;\n            },\n            OnSelected: (xuid) => {\n                const workshopID = FriendsListAPI.GetFriendAddon(xuid);\n                if (workshopID) {\n                    $.DispatchEvent('CSGOOpenSteamWorkshop', workshopID);\n                }\n                $.DispatchEvent('ContextMenuEvent', '');\n            },\n        },\n        {\n            name: 'kick_player',\n            icon: 'ban_global',\n            AvailableForItem: (id) => {\n                return GameStateAPI.BIsLocalServerHost() && !_IsSelf(id);\n            },\n            OnSelected: (xuid) => {\n                FriendsListAPI.Kick(xuid);\n                $.DispatchEvent('ContextMenuEvent', '');\n            },\n        }\n    ];\n    function _HasMusicKit(id) {\n        return (InventoryAPI.GetMusicIDForPlayer(id) > 1);\n    }\n    function _IsSelf(id) {\n        return id === MyPersonaAPI.GetXuid();\n    }\n    function _HatchedPetItemID() {\n        const strLivePet = InventoryAPI.GetPetItemID();\n        const nStage = strLivePet === '' ? 0 : Number(InventoryAPI.GetItemAttributeValue(strLivePet, '{uint32}upgrade level'));\n        return nStage > 0 ? strLivePet : '';\n    }\n    function _RetiredPetBookKeys() {\n        const strLivePet = InventoryAPI.GetPetItemID();\n        const strLivePrefix = strLivePet === '' ? '' : '_p' + strLivePet + '_x';\n        return GameInterfaceAPI.GetPetBookCloudFileKeys().reverse()\n            .filter(strCloudKey => strLivePrefix === '' || !strCloudKey.startsWith(strLivePrefix));\n    }\n    function _LivePetBookLabel(elPanel) {\n        return $.Localize('#pet_book_menu_current_unnamed', elPanel);\n    }\n    function _ShowPetBookMenu() {\n        const elPanel = $.GetContextPanel();\n        const items = [];\n        if (_HatchedPetItemID() !== '') {\n            items.push({ label: _LivePetBookLabel(elPanel), jsCallback: _OpenLivePetBook });\n        }\n        function MakeRetiredPetName(pet_id, locPanel) {\n            const strName = InventoryAPI.HasCustomName(pet_id) ? InventoryAPI.GetItemName(pet_id)\n                : InventoryAPI.GetItemNameUncustomized(pet_id);\n            if (!strName)\n                return '';\n            locPanel.SetDialogVariable('pet_name', strName);\n            const value = Number(InventoryAPI.GetItemAttributeValue(pet_id, '{uint32}deployment date'));\n            if (!value)\n                return '';\n            locPanel.SetDialogVariable('hatch_date', InventoryAPI.LocalizeDateCoarsely(value, 'month'));\n            return $.Localize('#pet_book_menu_retired', locPanel);\n        }\n        _RetiredPetBookKeys().forEach((strCloudKey, nIndex) => {\n            const oldPetItemID = GameInterfaceAPI.UnpackPetBookCloudFile('[header]' + strCloudKey);\n            const strPetMenuEntry = MakeRetiredPetName(oldPetItemID, elPanel);\n            if (strPetMenuEntry) {\n                items.push({\n                    label: strPetMenuEntry,\n                    jsCallback: _OpenPetBook.bind(undefined, strCloudKey),\n                });\n            }\n        });\n        if (items.length > 0) {\n            UiToolkitAPI.ShowSimpleContextMenu('petbook', 'PetBookContextMenu', items);\n        }\n    }\n    function _OpenLivePetBook() {\n        UiToolkitAPI.ShowCustomLayoutPopup('', 'file://{resources}/layout/popups/popup_pet_book.xml');\n        _CloseForBook();\n    }\n    function _OpenPetBook(strCloudKey) {\n        UiToolkitAPI.ShowCustomLayoutPopupParameters('', 'file://{resources}/layout/popups/popup_pet_book.xml', 'bookkey=' + strCloudKey);\n        _CloseForBook();\n    }\n    function _CloseForBook() {\n        $.DispatchEvent('DismissAllContextMenus');\n    }\n    function _GetContextMenuEntries() {\n        $.CreatePanel('Panel', $.GetContextPanel(), '', { class: 'context-menu-playercard-seperator' });\n        let elContextMenuBtnsParent = $.CreatePanel('Panel', $.GetContextPanel(), '', { class: 'context-menu-playercard-btns' });\n        let xuid = $.GetContextPanel().GetAttributeString(\"xuid\", \"(not found)\");\n        let type = $.GetContextPanel().GetAttributeString(\"type\", \"\");\n        let count = 0;\n        let rowCount = 0;\n        let elContextMenuBtns;\n        for (let entry of ContextmenuPlayerCard.ContextMenus) {\n            if (entry.AvailableForItem(xuid)) {\n                count = count === 5 ? 0 : count;\n                if (count === 0) {\n                    elContextMenuBtns = $.GetContextPanel().FindChildInLayoutFile('id_playercard-button-row' + rowCount);\n                    if (!elContextMenuBtns) {\n                        elContextMenuBtns = $.CreatePanel('Panel', elContextMenuBtnsParent, 'id_playercard-button-row' + rowCount, { class: 'context-menu-playercard-btns__container' });\n                        elContextMenuBtns.xuid = xuid;\n                        rowCount++;\n                    }\n                }\n                if ('xml' in entry) {\n                    let elEntryBtn = $.CreatePanel('Panel', elContextMenuBtns, entry.name, {\n                        class: 'IconButton',\n                        style: 'tooltip-position: bottom;'\n                    });\n                    elEntryBtn.BLoadLayout(entry.xml, false, false);\n                }\n                else {\n                    let elEntryBtn = $.CreatePanel('Button', elContextMenuBtns, entry.name, {\n                        class: 'IconButton',\n                        style: 'tooltip-position: bottom;'\n                    });\n                    $.CreatePanel('Image', elEntryBtn, entry.name, { src: 'file://{images}/icons/ui/' + entry.icon + '.svg' });\n                    let label = $.CreatePanel('Label', elEntryBtn, entry.name + '-label');\n                    label.text = $.Localize('#tooltip_short_' + entry.name);\n                    let tooltip = '#tooltip_' + entry.name;\n                    if ('IsDisabled' in entry) {\n                        if (entry.IsDisabled()) {\n                            elEntryBtn.enabled = false;\n                            tooltip = '#tooltip_disabled_' + entry.name;\n                        }\n                        else {\n                            elEntryBtn.enabled = true;\n                        }\n                    }\n                    let onSelected = entry.OnSelected;\n                    elEntryBtn.SetPanelEvent('onactivate', () => onSelected(xuid, type));\n                    elEntryBtn.SetPanelEvent('onmouseover', () => UiToolkitAPI.ShowTextTooltip(elEntryBtn.id, tooltip));\n                    elEntryBtn.SetPanelEvent('onmouseout', () => UiToolkitAPI.HideTextTooltip());\n                }\n                count++;\n            }\n        }\n    }\n})(ContextmenuPlayerCard || (ContextmenuPlayerCard = {}));\n","scripts/context_menus/context_menu_rewards.js":"'use strict';\nvar ContextMenuRewards = ( function()\n{\n    var _Init = function()\n    {\n        _AddContexTMenuEntries();\n    };\n\n    var _AddContexTMenuEntries = function()\n    {\n        var elParent = $.GetContextPanel();\n        var aList = elParent.Data().aRewardsList;\n\n        aList.forEach( element => \n        {\n            var elButton = $.CreatePanel( 'Button', elParent, 'ContextMenuItem' + element.idx );\n            var elLabel = $.CreatePanel( 'Label', elButton, '', { html: 'true' } );\n            elLabel.text = InventoryAPI.GetItemName( element.itemLists[ 0 ].itemIds[ 0 ] );\n\n            elButton.SetPanelEvent( 'onactivate', _OnActivate.bind( undefined, element.idx ) );\n            elButton.SetPanelEvent( 'onmouseover', _CacheWeapon.bind( undefined, element.itemLists[ 0 ].itemIds[ 0 ] ) );\n        } );\n    };\n\n    var _OnActivate = function( idx )\n    {\n                           \n                                                                                \n        \n                                                              \n        var callbackHandle = $.GetContextPanel().GetAttributeInt( \"callback\", -1 );\n        if ( callbackHandle != -1 )\n        {\n            UiToolkitAPI.InvokeJSCallback( callbackHandle, idx );\n        }\n\n                                                   \n        $.DispatchEvent( 'ContextMenuEvent', '' );\n    };\n\n    var _CacheWeapon = function( id )\n    {\n        InventoryAPI.PrecacheCustomMaterials( id );\n    };\n    \n    return { Init: _Init };\n}());","scripts/context_menus/context_menu_store_linked_items.js":"\"use strict\";\n/// <reference path=\"../itemtile_store.ts\" />\nvar StoreLinkedItems;\n(function (StoreLinkedItems) {\n    function Init() {\n        const itemId = $.GetContextPanel().GetAttributeString(\"itemids\", \"\");\n        const isNotReleased = $.GetContextPanel().GetAttributeString(\"is-not-released\", \"\") === \"true\";\n        const aItemIds = itemId.split(',');\n        let elItem = null;\n        for (let i = 0; i < aItemIds.length; i++) {\n            elItem = $.CreatePanel(\"Button\", $.GetContextPanel().FindChildInLayoutFile('id-store-linked-items-images'), aItemIds[i]);\n            elItem.BLoadLayout('file://{resources}/layout/itemtile_store.xml', false, false);\n            let oItemData = {\n                id: aItemIds[i],\n                isNotReleased: isNotReleased,\n                isDisabled: isNotReleased\n            };\n            ItemTileStore.Init(elItem, oItemData);\n        }\n        ShowWarningText();\n    }\n    StoreLinkedItems.Init = Init;\n    function ShowWarningText() {\n        let warningText = $.GetContextPanel().GetAttributeString(\"linkedWarning\", \"\");\n        if (warningText) {\n            $.GetContextPanel().SetHasClass('hidewarning', false);\n            $.GetContextPanel().SetDialogVariable('warning', $.Localize(warningText));\n        }\n        else {\n            $.GetContextPanel().SetHasClass('hidewarning', true);\n        }\n    }\n})(StoreLinkedItems || (StoreLinkedItems = {}));\n","scripts/context_menus/context_menu_vote.js":"\"use-strict\";\n\nvar ItemContextMenu = ( function (){\n\n\tvar m_hBackupFileNamesEventReg = null;\n\n\tfunction MakeVoteButton( elParent, id, name, voteFunc, snippetType )\n\t{\n\t\tvar elChoicesContainer = elParent.FindChildInLayoutFile( 'ChoicesContainer' );\n\n\t\tvar p = $.CreatePanel( \"Button\", elChoicesContainer, id );\n\t\tif ( p.BLoadLayoutSnippet( snippetType ) ) {\n\t\t\tp.FindChild( \"Name\" ).text = name;\n\t\t\tp.SetPanelEvent( \"onactivate\", function () {\n\t\t\t\tvoteFunc();\n\t\t\t\t$.DispatchEvent('UIPopupButtonClicked', '');\n\t\t\t\t                                                                                                                            \n\t\t\t\t                                                                                                                      \n\t\t\t\t$.DispatchEventAsync( 0.0, 'CSGOMainMenuResumeGame' );\n\t\t\t});\n\t\t}\n\n\t\treturn p;\n\t}\n\n\tfunction GetMapIcon( map )\n\t{\n\t\treturn \"file://{images}/map_icons/map_icon_\"+ map +\".svg\";\n\t}\n\n\tfunction GetMapDisplayName( map )\n\t{\n\t\treturn GameStateAPI.GetMapDisplayNameToken( map );\n\t}\n\n\tfunction GetKickTargets() \n\t{\n\t\tvar kickTargets = GameStateAPI.GetKickTargets();\n\t\treturn Object.keys( kickTargets ).map( function ( value ) { \n\t\t\treturn { displayName: value, voteParam: kickTargets[value] };\n\t\t});\n\t}\n\tfunction GetMapTargets() \n\t{\n\t\tvar strMaps = GameStateAPI.GetMapsInCurrentMapGroup();\n\t\tif ( strMaps === null || strMaps === \"\" )\n\t\t\treturn [];\n\n\t\tvar mapsInMapGroup = strMaps.split( ',' );\n\t\t                            \n\t\treturn mapsInMapGroup.map( function ( curMap ) {\n\t\t\treturn { displayName: $.Localize( GetMapDisplayName( curMap ) ).toUpperCase(), voteParam: curMap };\n\t\t});\n\t}\n\n\tfunction GetBackupFilenames( elPopup )\n\t{\n\t\tGameInterfaceAPI.ConsoleCommand( \"send_round_backup_file_list\" );\n\t\tm_hBackupFileNamesEventReg = $.RegisterForUnhandledEvent( 'BackupFileNamesReceived',  \n\t\t_Event_BackupFileNamesReceived.bind( null, elPopup ) );\n\t}\n\n\tfunction _Event_BackupFileNamesReceived( elPopup, objFileNames ) {\n\t\tvar voteFunc = function ( param )\n\t\t{\n\t\t\tGameInterfaceAPI.ConsoleCommand( 'callvote loadbackup ' + param );\n\t\t}\n\t\tvar arrDisplayNames = objFileNames.display_names.split( ',' );\n\t\tvar arrFileNames = objFileNames.file_names.split( ',' );\n\t\tarrDisplayNames.forEach(function (item, idx) {\n\t\t\tvar elButton = MakeVoteButton(elPopup, \"voteoption_\" + idx,\n\t\t\t\titem,\n\t\t\t\tvoteFunc.bind( undefined, arrFileNames[ idx ] ),\n\t\t\t\t\"ChoiceEntry\"\n\t\t\t);\n\t\t\telButton.FindChild(\"Icon\").SetImage( \"file://{images}/icons/ui/competitive.svg\" );\n\t\t\t$.UnregisterForUnhandledEvent('BackupFileNamesReceived', m_hBackupFileNamesEventReg);\n\t\t});\n\t}\n\n\tfunction ConstructBaseVoteIssue( voteCommand, locToken )\n\t{\n\t\tthis.id = \"voteissue_\" + voteCommand;\n\t\tthis.name = locToken;\n\t\tthis.desc = locToken + \"_Desc\";\n\t\tthis.icon = \"file://{images}/icons/ui/Vote\" + voteCommand + \".svg\";\n\t\tthis.cmd = function ()\n\t\t{\n\t\t\tGameInterfaceAPI.ConsoleCommand( 'callvote ' + voteCommand );\n\t\t\t$.DispatchEvent( 'ContextMenuEvent', '' );\n\t\t\t$.DispatchEventAsync( 0.0, 'CSGOMainMenuResumeGame' );\n\t\t};\n\t\tthis.enabled = true;\n\t}\n\n\tfunction ConstructBaseVoteIssueEnabled( voteCommand, locToken, bEnabled )\n\t{\n\t\tConstructBaseVoteIssue.call( this, voteCommand, locToken );\n\t\tthis.enabled = bEnabled;\n\t}\n\n\tfunction CreateVotePopupChoices( locToken )\n\t{\n\t\tvar elPopup = UiToolkitAPI.ShowCustomLayoutPopup( \"voteissuechoices\", \"file://{resources}/layout/popups/popup_choices.xml\" );\n\t\tvar elPopupTitle = elPopup.FindChild( \"ChoiceTitle\" );\n\t\telPopupTitle.text = $.Localize( locToken );\n\n\t\treturn elPopup;\n\t}\n\n\tfunction ConstructPopupMapChoicesVoteIssue( voteCommand, locToken, choiceListFunc )\n\t{\n\t\tConstructBaseVoteIssue.call( this, voteCommand, locToken );\n\t\tthis.cmd = function () {\n\t\t\tvar elPopup = CreateVotePopupChoices( locToken );\n\t\t\telPopup.AddClass( 'popup-map-vote' );\n\t\t\tvar voteFunc = function ( param )\n\t\t\t{\n\t\t\t\tGameInterfaceAPI.ConsoleCommand( 'callvote ' + voteCommand + \" \" + param );\n\t\t\t}\n\t\t\t\n\t\t\tchoiceListFunc().forEach(function (item) {\n\t\t\t\tvar elButton = MakeVoteButton(elPopup, \"voteoption_\" + item.voteParam,\n\t\t\t\t\titem.displayName,\n\t\t\t\t\tvoteFunc.bind( undefined, item.voteParam ),\n\t\t\t\t\t\"ChoiceEntry\"\n\t\t\t\t);\n\n\t\t\t\tvar elIcon = elButton.FindChild( \"Icon\" );\n\t\t\t\tIconUtil.SetupFallbackMapIcon( elIcon, \"file://{images}/map_icons/map_icon_\" + item.voteParam );\n\t\t\t\telIcon.SetImage( \"file://{images}/map_icons/map_icon_\" + item.voteParam + \".svg\" );\n\t\t\t});\n\t\t}\n\t\tthis.enabled = choiceListFunc().length > 0;\n\t}\n\n\tfunction ConstructPopupAvatarChoicesVoteIssue( voteCommand, locToken, choiceListFunc )\n\t{\n\t\tConstructBaseVoteIssue.call(this, voteCommand, locToken );\n\t\tthis.cmd = function () {\n\t\t\tvar elPopup = CreateVotePopupChoices( locToken );\n\t\t\tvar voteFunc = function ( param ) { GameInterfaceAPI.ConsoleCommand( 'callvote ' + voteCommand + \" \" + param ); }\n\t\t\t\n\t\t\tchoiceListFunc().forEach(function (item) {\n\t\t\t\tvar elButton = MakeVoteButton(elPopup, \"voteoption_\" + item.voteParam,\n\t\t\t\t\titem.displayName,\n\t\t\t\t\tvoteFunc.bind( undefined, item.voteParam ),\n\t\t\t\t\t\"AvatarChoiceEntry\"\n\t\t\t\t);\n\t\t\t\telButton.FindChild(\"AvatarImage\").PopulateFromSteamID(GameStateAPI.GetPlayerXuidStringFromPlayerSlot(item.voteParam));\n\t\t\t});\n\t\t}\n\t\tthis.enabled = choiceListFunc().length > 0;\n\t}\n\n\tfunction ConstructRoundBackupVoteIssue( voteCommand, locToken, bEnabled, pollForBackups )\n\t{\n\t\tConstructBaseVoteIssueEnabled.call(this, voteCommand, locToken, bEnabled );\n\t\tthis.cmd = function () {\n\t\t\t$.DispatchEvent( 'ContextMenuEvent', '' );\n\t\t\tvar elPopup = CreateVotePopupChoices( locToken );\n\t\t\tpollForBackups( elPopup );\n\t\t}\n\t}\n\t\n\n\t    \n\t                                       \n\t   \n\tfunction GetCurrentVoteIssues() {\n\t\tvar VoteIssues = [];\n\n\t\t                                                             \n\t\tvar bIsQueuedMatchmaking \t= GameStateAPI.IsQueuedMatchmaking();\n\t\tvar bIsTournamentMatch \t\t= MatchStatsAPI.IsTournamentMatch();\n\t\tvar bIsWarmup \t\t\t\t= FriendsListAPI.IsGameInWarmup();\n\t\tvar bIsPaused \t\t\t\t= FriendsListAPI.IsGamePaused();\n\t\tvar curGameMode \t\t\t= MatchStatsAPI.GetGameMode();\n\t\tvar mapsInMapGroup\t\t\t= GetMapTargets().length;\n\t\tvar kickablePlayers\t\t\t= GetKickTargets().length;\n\t\tvar nLocalPlayerTeamNum\t\t= GameStateAPI.GetAssociatedTeamNumber( GameStateAPI.GetLocalPlayerXuid() );\n\t\tvar bLocalPlayerActiveTeam = ( nLocalPlayerTeamNum === 2 || nLocalPlayerTeamNum === 3 );\n\n\t\t  \n\t\t                                            \n\t\t                                                                                  \n\t\t                            \n\t\t                                     \n\t\t  \n\n\t\tif ( !bIsQueuedMatchmaking )\n\t\t{\n\t\t\tVoteIssues.push(new ConstructPopupMapChoicesVoteIssue(\"ChangeLevel\", \"#SFUI_Vote_ChangeMap\", GetMapTargets ));\n\t\t}\n\n\t\tif ( bIsQueuedMatchmaking && !bIsTournamentMatch )\n\t\t{\n\t\t\tVoteIssues.push(new ConstructBaseVoteIssue(\"Surrender\", \"#SFUI_vote_surrender\" ));\n\t\t}\n\n\t\tif ( bIsQueuedMatchmaking && bIsTournamentMatch )\n\t\t{\n\t\t\tif ( bLocalPlayerActiveTeam )\n\t\t\t{\t                                              \n\t\t\t\tVoteIssues.push(new ConstructBaseVoteIssueEnabled( \"starttimeout\", \"#SFUI_Vote_StartTimeout\", !bIsWarmup && !bIsPaused ) );\n\t\t\t\tVoteIssues.push( new ConstructBaseVoteIssueEnabled( \"PauseMatch\", \"#SFUI_Vote_pause_match\", !bIsWarmup && !bIsPaused ) );\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif ( bIsWarmup )\n\t\t\t\t{\n\t\t\t\t\tif ( !bIsPaused )\n\t\t\t\t\t\tVoteIssues.push( new ConstructBaseVoteIssue( \"NotReadyForMatch\", \"#SFUI_Vote_not_ready_for_match\") );\n\t\t\t\t\telse\n\t\t\t\t\t\tVoteIssues.push( new ConstructBaseVoteIssue( \"ReadyForMatch\", \"#SFUI_Vote_ready_for_match\") );\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif ( bIsPaused )\n\t\t\t\t\t\tVoteIssues.push( new ConstructBaseVoteIssue( \"UnpauseMatch\", \"#SFUI_Vote_unpause_match\" ) );\n\t\t\t\t\telse\n\t\t\t\t\t\tVoteIssues.push( new ConstructBaseVoteIssue( \"PauseMatch\", \"#SFUI_Vote_pause_match\" ) );\n\t\t\t\t}\n\n\t\t\t\tVoteIssues.push( new ConstructRoundBackupVoteIssue(\"LoadBackup\", \"#SFUI_Vote_loadbackup1\", !bIsWarmup, GetBackupFilenames ) );\n\t\t\t}\n\t\t}\n\n\t\tif ( !bIsTournamentMatch )\n\t\t{\n\t\t\tif  ( curGameMode === \"competitive\" || curGameMode === \"scrimcomp5v5\" || curGameMode === \"scrimcomp2v2\" )\n\t\t\t{\n\t\t\t\tVoteIssues.push(new ConstructBaseVoteIssue(\"starttimeout\", \"#SFUI_Vote_StartTimeout\" ));\n\t\t\t}\n\n\t\t\tVoteIssues.push(new ConstructPopupAvatarChoicesVoteIssue(\"Kick\", \"#SFUI_Vote_KickPlayer\", GetKickTargets));\n\t\t}\n\n\t\treturn VoteIssues;\n\t}\n\n\tfunction _OnTabActivate() {\n\t\n\t}\n\n\tvar _SetupContextMenu = function()\n\t{\n\t\t$.GetContextPanel().RemoveAndDeleteChildren();\n\t\tGetCurrentVoteIssues().forEach( function ( item ) {\n\t\t\tvar p = $.CreatePanel( \"Button\", $.GetContextPanel(), \"voteoption_\" + item.id );\n\t\t\tp.BLoadLayoutSnippet( \"VoteOption\" );\n\t\t\tp.FindChild( \"VoteOptionName\" ).text = $.Localize( item.name );\n\t\t\tp.FindChild( \"VoteOptionIcon\" ).SetImage( item.icon );\n\t\t\tp.SetPanelEvent( \"onactivate\", function() {\n\t\t\t\titem.cmd();\n\t\t\t\t$.DispatchEvent( 'UIPopupButtonClicked', '' );\n\t\t\t});\n\t\t\tp.enabled = item.enabled;\n\t\t});\n\t};\n\n\treturn {\n\t\tSetupContextMenu: _SetupContextMenu\n\t};\n})();\n","scripts/context_menus/context_menu_watchnotice_match_streams.js":"\"use strict\";\n\nvar ContextMenuWatchNoticeMatchStream = (function () {\n\n\tvar _m_arrStreams = undefined;\n\tvar _m_cP = $.GetContextPanel();\n\tvar _m_myCountryCode = undefined;\n\tvar _m_oPriorityMap = {};\n\tvar _m_isOfficial = false;\n\n\n\tfunction _Init()\n\t{\n\t\t$.RegisterForUnhandledEvent( 'Tournaments_RequestMatch_Response', _RequestMatchString_Received);\n\n\t\tvar matchId = _m_cP.GetAttributeString( \"match_id\", \"\" );\n\t\t_m_isOfficial = ( _m_cP.GetAttributeString( \"is_official\", \"\" ) === 'true' ) ? true : false;\n\n\t\t                                                                      \n\t\t$.DispatchEvent( 'Tournaments_RequestMatch', matchId );\n\n\t\t_m_cP.SetFocus();\n\t}\n\n\n\t                                                        \n\tfunction _SortStreams ( arrStreams )\n\t{\n\t\t_m_oPriorityMap = {};\n\n\t\tfor ( var i in arrStreams )\n\t\t{\n\t\t\tvar cc = arrStreams[ i ].iso.toLowerCase();\n\n\t\t\tif ( !( cc in _m_oPriorityMap  ) )\n\t\t\t{\n\t\t\t\tif ( cc == _m_myCountryCode )\n\t\t\t\t{\n\t\t\t\t\t_m_oPriorityMap[ cc ] = 0;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t_m_oPriorityMap[ cc ] = Object.keys( _m_oPriorityMap ).length + 1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction _StreamCompareFunction ( a, b )\n\t\t{\n\t\t\tvar alc = a.iso.toLowerCase();\n\t\t\tvar blc = b.iso.toLowerCase();\n\t\n\t\t\treturn _m_oPriorityMap[ alc ] - _m_oPriorityMap[ blc ];\n\t\t}\n\n\t\tarrStreams.sort( _StreamCompareFunction );\n\t}\n\n\tfunction _RequestMatchString_Received( matchString )\n\t{\n\t\tif ( _m_arrStreams != undefined )\n\t\t{\n\t\t\t$.DispatchEvent( 'ContextMenuEvent', '' );\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tvar elStreamContainer = $.GetContextPanel().FindChildTraverse( 'id-watchnotice__event__match__stream-container' );\n\t\tif ( elStreamContainer == undefined || !elStreamContainer.IsValid() )\n\t\t{\n\t\t\t$.DispatchEvent( 'ContextMenuEvent', '' );\n\t\t\treturn;\n\t\t}\n\n\t\tvar oMatch = JSON.parse( matchString );\n\t\t\n\t\tif ( oMatch == undefined )\n\t\t{\n\t\t\t$.DispatchEvent( 'ContextMenuEvent', '' );\n\t\t\treturn;\t\t\n\t\t}\n\n\t\t_m_arrStreams = oMatch[ 'streams' ];\n\n\t\tif ( _m_arrStreams.length == 0 )\n\t\t{\n\n\t\t\tvar elNoStreamLabel = $.GetContextPanel().FindChildTraverse( \"id-watchnotice__event__match__no-stream\" );\n\t\t\telNoStreamLabel.RemoveClass( 'hidden' );\n\t\t}\n\n\t\t_m_myCountryCode = MyPersonaAPI.GetMyCountryCode().toLowerCase();\n\n\t\t                                \n\t\t\n\t\tfor ( var jdx in _m_arrStreams )\n\t\t{\n\t\t\tvar oStream = oMatch[ 'streams' ][ jdx ];\n\n\t\t\tvar countryCode = oStream.iso;\n\t\t\tvar languageCode = oStream.hasOwnProperty( 'language' ) ? oStream.language : \"\";\n\n\t\t\t       \n\t\t\tvar bIsGotv = oStream[ 'site' ].toLowerCase() === \"gotv\";\n\t\t\tvar elGotvBtn = $.GetContextPanel().FindChildTraverse( \"id-watchnotice__event__match_gotv\" );\n\n\t\t\tif ( bIsGotv )\n\t\t\t{\n\t\t\t\tvar onActivate = function ( url )\n\t\t\t\t{\n\t\t\t\t\tGameInterfaceAPI.ConsoleCommand( 'playcast \"' + url + '\"' );\n\t\t\t\t\t$.DispatchEvent( 'ContextMenuEvent', '' );\n\t\t\t\t}\n\n\t\t\t\telGotvBtn.SetPanelEvent( 'onactivate', onActivate.bind( undefined, oStream[ 'resolved_embed' ] ) );\n\t\t\t\telGotvBtn.visible = true;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tvar elStream = $.CreatePanel( 'Button', elStreamContainer, oStream[ 'stream_id' ] );\n\t\t\t\t                                                                                           \n\t\t\t\telStream.AddClass( \"eventsched-match__stream\" );\n\n\t\t\t\telStream.BLoadLayoutSnippet( \"snippet-cm-watchnotice-stream\" );\n\n\t\t\t\tif ( languageCode )\n\t\t\t\t\tCommonUtil.SetLanguageOnLabel( languageCode, elStream );\n\t\t\t\telse\n\t\t\t\t\tCommonUtil.SetRegionOnLabel( countryCode, elStream );\n\n\n\t\t\t\tvar elStreamName = elStream.FindChildTraverse( 'id-eventsched-match__stream__name' );\n\t\t\t\tif ( elStreamName )\n\t\t\t\t{\n\n\t\t\t\t\t                                                                                        \n\t\t\t\t\tvar streamName = \"\";\n\n\t\t\t\t\tif ( oStream[ 'resolved_embed' ].search( \"channel=\" ) != -1 )\n\t\t\t\t\t{\n\t\t\t\t\t\tstreamName = \"Twitch: \" + oStream[ 'resolved_embed' ].match( \"channel=(.*?(?=&))\" )[ 1 ];\n\t\t\t\t\t}\n\t\t\t\t\telse if ( oStream[ 'site' ].toLowerCase().search( \"youtube\" ) != -1 )\n\t\t\t\t\t{\n\t\t\t\t\t\tstreamName = \"YouTube\";\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\telStreamName.SetDialogVariable( 'stream_site', streamName );\n\t\t\t\t}\n\n\t\t\t\tvar url = oStream[ 'resolved_embed' ];\n\t\t\t\n\t\t\t\tvar onActivate = function ( url )\n\t\t\t\t{\n\t\t\t\t\tSteamOverlayAPI.OpenUrlInOverlayOrExternalBrowser( url );\n\t\t\t\t\t$.DispatchEvent( 'ContextMenuEvent', '' );\n\t\t\t\t}\n\n\t\t\t\telStream.SetPanelEvent( 'onactivate', onActivate.bind( undefined, url ) );\n\t\t\t}\n\t\t}\n\n\t\t      \n\t\tif ( 'match_page_url' in oMatch )\n\t\t{\n\t\t\tvar url = oMatch[ 'match_page_url' ];\n\t\t\tvar elLinkBtn = $.GetContextPanel().FindChildTraverse( \"id-watchnotice__event__match\" );\n\n\t\t\tvar onActivate = function ( url )\n\t\t\t{\n\t\t\t\tSteamOverlayAPI.OpenUrlInOverlayOrExternalBrowser( url );\n\t\t\t\t$.DispatchEvent( 'ContextMenuEvent', '' );\n\t\t\t}\n\n\t\t\telLinkBtn.SetPanelEvent( 'onactivate', onActivate.bind( undefined, url ) );\n\t\t}\n\t};\n\n\t\n\treturn {\n\t\tInit: _Init,\n\t};\n\n} )();\n\n                                                                                                    \n                                           \n                                                                                                    \n(function()\n{\n})();","scripts/controlslibrary.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"common/iteminfo.ts\" />\n/// <reference path=\"hud/hudwinpanel_background_map.ts\" />\n/// <reference path=\"generated/items_event_current_generated_store.d.ts\" />\n/// <reference path=\"generated/items_event_current_generated_store.ts\" />\nvar controlsLibActiveTab = null;\nfunction ControlsLibNavigateToTab(tab, msg) {\n    if (controlsLibActiveTab) {\n        controlsLibActiveTab.RemoveClass('Active');\n    }\n    controlsLibActiveTab = $('#' + tab);\n    if (controlsLibActiveTab) {\n        controlsLibActiveTab.AddClass('Active');\n    }\n}\nfunction CloseControlsLib() {\n    $.GetContextPanel().DeleteAsync(.3);\n    var controlsLibPanel = $.GetContextPanel();\n    controlsLibPanel.RemoveClass(\"Active\");\n}\nfunction OpenControlsLib() {\n    var controlsLibPanel = $.GetContextPanel();\n    controlsLibPanel.AddClass(\"Active\");\n}\nvar jsPopupCallbackHandle = null;\nvar jsPopupLoadingBarCallbackHandle = null;\nvar popupLoadingBarLevel = 0;\nfunction ClearPopupsText() {\n    $('#ControlsLibPopupsText').text = '--';\n}\nfunction OnControlsLibPopupEvent(msg) {\n    $('#ControlsLibPopupsText').text = msg;\n}\nfunction OnPopupCustomLayoutParamsPressed() {\n    ClearPopupsText();\n    UiToolkitAPI.ShowCustomLayoutPopupParameters('', 'file://{resources}/layout/popups/popup_custom_layout_test.xml', 'popupvalue=123456&callback=' + jsPopupCallbackHandle);\n}\nfunction OnPopupCustomLayoutImagePressed() {\n    ClearPopupsText();\n    UiToolkitAPI.ShowCustomLayoutPopupParameters('', 'file://{resources}/layout/popups/popup_custom_layout_test_image.xml', 'message=Example of popup with an image&image=file://{images}/control_icons/home_icon.vtf&callback=' + jsPopupCallbackHandle);\n}\nfunction OnPopupCustomLayoutImageSpinnerPressed() {\n    ClearPopupsText();\n    UiToolkitAPI.ShowCustomLayoutPopupParameters('', 'file://{resources}/layout/popups/popup_custom_layout_test_image.xml', 'message=Example of popup with an image and a spinner&image=file://{images}/control_icons/home_icon.vtf&spinner=1&callback=' + jsPopupCallbackHandle);\n}\nfunction OnPopupCustomLayoutImageLoadingPressed() {\n    ClearPopupsText();\n    popupLoadingBarLevel = 0;\n    UiToolkitAPI.ShowCustomLayoutPopupParameters('', 'file://{resources}/layout/popups/popup_custom_layout_test_image.xml', 'message=Example of popup with an image and a loading bar&image=file://{images}/control_icons/home_icon.vtf&callback=' + jsPopupCallbackHandle + '&loadingBarCallback=' + jsPopupLoadingBarCallbackHandle);\n}\nfunction OnPopupCustomLayoutMatchAccept() {\n    ClearPopupsText();\n    popupLoadingBarLevel = 0;\n    var popup = UiToolkitAPI.ShowCustomLayoutPopupParameters('', 'file://{resources}/layout/popups/popup_accept_match.xml', 'map_and_isreconnect=de_dust2,false&ping=155&location=China, Tianjin');\n    $.DispatchEvent(\"ShowAcceptPopup\", popup);\n}\nfunction OnPopupCustomLayoutPremierPickBan() {\n    UiToolkitAPI.ShowCustomLayoutPopupParameters('', 'file://{resources}/layout/popups/popup_premier_pick_ban.xml', \"none\");\n}\nfunction OnPopupCustomLayoutXpGrant() {\n    UiToolkitAPI.ShowCustomLayoutPopupParameters('', 'file://{resources}/layout/popups/popup_acknowledge_xpgrant.xml', 'none');\n}\nfunction OnPopupCustomLayoutMajorStore() {\n    const popupPanel = UiToolkitAPI.ShowCustomLayoutPopup('id-popup-major-store', 'file://{resources}/layout/popups/popup_major_store.xml');\n    popupPanel.Data().eventId = g_ActiveTournamentInfo.eventid;\n}\nfunction OnPopupCustomLayoutCaseConfirm() {\n    UiToolkitAPI.ShowCustomLayoutPopupParameters('', 'file://{resources}/layout/popups/popup_container_open_confirm.xml', 'none');\n}\nfunction OnPopupCustomLayoutLoadingScreen() {\n    ClearPopupsText();\n    UiToolkitAPI.ShowCustomLayoutPopup('teams', 'file://{resources}/layout/teamselectmenu.xml');\n}\nfunction OnControlsLibPopupLoadingBarEvent() {\n    popupLoadingBarLevel += 0.05;\n    if (popupLoadingBarLevel > 1.0) {\n        popupLoadingBarLevel = 1.0;\n    }\n}\nvar jsContextMenuCallbackHandle = null;\nfunction ClearContextMenuText() {\n    $('#ControlsLibContextMenuText').text = '--';\n}\nfunction OnControlsLibContextMenuEvent(msg) {\n    $('#ControlsLibContextMenuText').text = msg;\n}\nfunction OnSimpleContextMenu() {\n    ClearContextMenuText();\n    var items = [];\n    items.push({ label: 'Item 1', jsCallback: function () { OnControlsLibContextMenuEvent('Item1'); } });\n    items.push({ label: 'Item 2', jsCallback: function () { OnControlsLibContextMenuEvent('Item2'); } });\n    items.push({ label: 'Item 3', jsCallback: function () { OnControlsLibContextMenuEvent('Item3'); } });\n    UiToolkitAPI.ShowSimpleContextMenu('', 'ControlLibSimpleContextMenu', items);\n}\nfunction OnContextMenuCustomLayoutParamsPressed() {\n    ClearContextMenuText();\n    UiToolkitAPI.ShowCustomLayoutContextMenuParameters('', '', 'file://{resources}/layout/context_menus/context_menu_custom_layout_test.xml', 'test=123456&callback=' + jsContextMenuCallbackHandle);\n}\nvar g_VideoNumTrailers = 2;\nvar g_VideoCurrentTrailer = 0;\nfunction VideoPlayNextTrailer() {\n    g_VideoCurrentTrailer = (g_VideoCurrentTrailer + 1) % g_VideoNumTrailers;\n    var videoPlayer = $('#VideoTrailerPlayer');\n    videoPlayer.SetMovie(\"file://{resources}/videos/trailer_\" + g_VideoCurrentTrailer + \".webm\");\n    videoPlayer.SetTitle(\"Trailer \" + g_VideoCurrentTrailer);\n    videoPlayer.Play();\n}\nfunction InitScenePanel() {\n    var playbackSpeedSlider = $('#PlaybackSpeedSlider');\n    playbackSpeedSlider.min = -2;\n    playbackSpeedSlider.max = 2;\n    playbackSpeedSlider.value = 1;\n}\nfunction SceneCameraPlaybackSpeedSliderChanged() {\n    var playbackSpeedSlider = $('#PlaybackSpeedSlider');\n    var playbackSpeedText = $('#PlaybackSpeedText');\n    var vanityPanel = $('#MapForVanity');\n    playbackSpeedText.text = playbackSpeedSlider.value.toFixed(3);\n    vanityPanel.SetCameraPlaybackSpeed(playbackSpeedSlider.value);\n}\nfunction SceneCameraPlaybackSpeedTextChanged() {\n    var playbackSpeedText = $('#PlaybackSpeedText');\n    var value = parseFloat(playbackSpeedText.text);\n    if (!isNaN(value)) {\n        var playbackSpeedSlider = $('#PlaybackSpeedSlider');\n        playbackSpeedSlider.value = value;\n    }\n    else {\n    }\n}\nvar g_DialogVarCount = 0;\nfunction UpdateParentDialogVariablesFromTextEntry() {\n    var varStr = $(\"#ParentDialogVarTextEntry\").text;\n    $(\"#DialogVarParentPanel\").SetDialogVariable('testvar', varStr);\n}\nfunction UpdateChildDialogVariablesFromTextEntry() {\n    var varStr = $(\"#ChildDialogVarTextEntry\").text;\n    $(\"#DialogVarChildPanel\").SetDialogVariable('testvar', varStr);\n}\nfunction InitDialogVariables() {\n    $(\"#ControlsLibDiagVars\").SetDialogVariableInt(\"count\", g_DialogVarCount);\n    $(\"#ControlsLibDiagVars\").SetDialogVariable(\"s1\", \"Test1\");\n    $(\"#ControlsLibDiagVars\").SetDialogVariable(\"s2\", \"Test2\");\n    $(\"#ControlsLibDiagVars\").SetDialogVariable(\"cam_key\", \"%jump%\");\n    $(\"#ControlsLibDiagVars\").SetDialogVariable(\"np_key\", \"%attack%\");\n    $(\"#ControlsLibDiagVars\").SetDialogVariable(\"sp_key\", \"%radio%\");\n    $(\"#DiagVarLabel\").text = $.Localize(\"\\tDynamic Label Count: {d:r:count}\", $(\"#ControlsLibDiagVars\"));\n    $.Schedule(1.0, UpdateDialogVariables);\n    $(\"#ParentDialogVarTextEntry\").RaiseChangeEvents(true);\n    $(\"#ChildDialogVarTextEntry\").RaiseChangeEvents(true);\n    $.RegisterEventHandler('TextEntryChanged', $(\"#ParentDialogVarTextEntry\"), UpdateParentDialogVariablesFromTextEntry);\n    $.RegisterEventHandler('TextEntryChanged', $(\"#ChildDialogVarTextEntry\"), UpdateChildDialogVariablesFromTextEntry);\n}\nfunction UpdateDialogVariables() {\n    g_DialogVarCount++;\n    $(\"#ControlsLibDiagVars\").SetDialogVariableInt(\"count\", g_DialogVarCount);\n    $.Schedule(1.0, UpdateDialogVariables);\n}\nfunction InitCaseTest() {\n    $(\"#CaseTest\").SetDialogVariable(\"casetest\", \"iİıI\");\n}\nfunction OnImageFailLoad() {\n    $(\"#ControlsLibPanelImageFallback\").SetImage(\"file://{images}/icons/knife.psd\");\n}\nfunction InitPanels() {\n    var parent = $.FindChildInContext(\"#ControlsLibPanelsDynParent\");\n    $.CreatePanel('Label', parent, '', { text: 'Label, with text property, created dynamically from js.' });\n    $.CreatePanel('Label', parent, '', { class: 'fontSize-l fontWeight-Bold', style: 'color:#558927;', text: 'Label, with text and class properties, created dynamically from js.' });\n    $.CreatePanel('TextButton', parent, '', { class: 'PopupButton', text: \"Output to console\", onactivate: \"$.Msg('Panel tab - Button pressed !!!')\" });\n    $.CreatePanel('ControlLibTestPanel', $.FindChildInContext('#ControlsLibPanelsJS'), '', { MyCustomProp: 'Created dynamically from javascript', CreatedFromJS: 1 });\n    $.RegisterEventHandler('ImageFailedLoad', $(\"#ControlsLibPanelImageFallback\"), OnImageFailLoad);\n    $(\"#ControlsLibPanelImageFallback\").SetImage(\"file://{images}/unknown2.vtf\");\n    $(\"#ImageApngtest\").SetImage(\"file://{resources}/videos/test/apngtestnoext\");\n}\nfunction TransitionBlurPanel() {\n    $(\"#MyBlendBlurFitParent\").RemoveClass(\"TheBlurAnimOut\");\n    $(\"#MyBlendBlurFitParent\").RemoveClass(\"TheBlurAnimIn\");\n    $(\"#MyBlendBlurFitParent\").AddClass(\"TheBlurAnimIn\");\n}\nfunction TransitionBlurPanel2() {\n    $(\"#MyBlendBlurFitParent\").RemoveClass(\"TheBlurAnimIn\");\n    $(\"#MyBlendBlurFitParent\").RemoveClass(\"TheBlurAnimOut\");\n    $(\"#MyBlendBlurFitParent\").AddClass(\"TheBlurAnimOut\");\n}\nfunction CreateSvgFromJs() {\n    $.CreatePanel('Image', $('#svgButton'), '', {\n        src: \"file://{images}/icons/ui/smile.svg\",\n        texturewidth: 100,\n        textureheight: 100\n    });\n}\nfunction GetRssFeed() {\n    BlogAPI.RequestRSSFeed();\n}\nfunction OnRssFeedReceived(feed) {\n    var RSSFeedPanel = $(\"#RSSFeed\");\n    if (RSSFeedPanel == null) {\n        return;\n    }\n    RSSFeedPanel.RemoveAndDeleteChildren();\n    for (const item of feed.items) {\n        var itemPanel = $.CreatePanel('Panel', RSSFeedPanel, '', { acceptsinput: true });\n        itemPanel.AddClass('RSSFeed__Item');\n        $.CreatePanel('Label', itemPanel, '', { text: item.title, html: true, class: 'RSSFeed__ItemTitle' });\n        if (item.imageUrl.length !== 0) {\n            $.CreatePanel('Image', itemPanel, '', { src: item.imageUrl, class: 'RSSFeed__ItemImage', scaling: 'stretch-to-fit-preserve-aspect' });\n        }\n        $.CreatePanel('Label', itemPanel, '', { text: item.description, html: true, class: 'RSSFeed__ItemDesc' });\n        $.CreatePanel('Label', itemPanel, '', { text: item.date, html: true, class: 'RSSFeed__ItemDate' });\n        itemPanel.SetPanelEvent(\"onactivate\", SteamOverlayAPI.OpenURL.bind(SteamOverlayAPI, item.link));\n    }\n}\nfunction JSReadyReset() {\n    var elParent = $('#ControlsLibBugsReadyParent');\n    var elBtnAddChild = $('#ControlsLibBugsReadyButtonAddChild');\n    var elBtnAddBgImg = $('#ControlsLibBugsReadyButtonAddBgImg');\n    elParent.RemoveAndDeleteChildren();\n    elParent.SetReadyForDisplay(false);\n    elBtnAddChild.enabled = true;\n    elBtnAddBgImg.enabled = false;\n}\nfunction JSReadyAddChild() {\n    var elParent = $('#ControlsLibBugsReadyParent');\n    var elBtnAddChild = $('#ControlsLibBugsReadyButtonAddChild');\n    var elBtnAddBgImg = $('#ControlsLibBugsReadyButtonAddBgImg');\n    $.CreatePanel('Panel', elParent, 'ControlsLibBugsReadyChild', { class: 'ControlLibBugs__ReadyChild' });\n    elBtnAddChild.enabled = false;\n    elBtnAddBgImg.enabled = true;\n}\nfunction JSReadyAddBgImg() {\n    var elBtnAddChild = $('#ControlsLibBugsReadyButtonAddChild');\n    var elBtnAddBgImg = $('#ControlsLibBugsReadyButtonAddBgImg');\n    var elParent = $('#ControlsLibBugsReadyParent');\n    var elChild = $('#ControlsLibBugsReadyChild');\n    elBtnAddChild.enabled = false;\n    elBtnAddBgImg.enabled = false;\n    elChild.AddClass('ControlLibBugs__ReadyChild--Ready');\n    elParent.SetReadyForDisplay(true);\n}\nfunction JSTestTransition() {\n    var Delay = 0.2;\n    function _reveal(panelId) {\n        $(panelId).AddClass('TestTransition');\n    }\n    $.Schedule(Delay, () => _reveal(\"#RepaintBugGrandchild\"));\n    $.Schedule(Delay * 2.0, () => _reveal(\"#RepaintBugChild\"));\n}\nfunction JSResetTransition() {\n    $('#RepaintBugChild').RemoveClass('TestTransition');\n    $('#RepaintBugGrandchild').RemoveClass('TestTransition');\n}\nfunction JSControlsPageStartParticles() {\n    for (const curPanel of $('#ControlsLibParticles').FindChildrenWithClassTraverse('TestParticlePanel')) {\n        curPanel.StartParticles();\n    }\n}\nfunction JSControlsPageStopPlayEndCapParticles() {\n    for (const curPanel of $('#ControlsLibParticles').FindChildrenWithClassTraverse('TestParticlePanel')) {\n        curPanel.StopParticlesWithEndcaps();\n    }\n}\nfunction JSControlsPageSetControlPointParticles(cp, xpos, ypos, zpos) {\n    for (const curPanel of $('#ControlsLibParticles').FindChildrenWithClassTraverse('TestParticlePanel')) {\n        curPanel.SetControlPoint(cp, 0, 1 + ypos, zpos);\n        curPanel.SetControlPoint(cp, xpos, ypos, zpos);\n    }\n}\nfunction JSPanelStartParticles(name) {\n    for (const curPanel of $.GetContextPanel().FindChildrenWithClassTraverse(name)) {\n        curPanel.StartParticles();\n    }\n}\nfunction JSPanelStopPlayEndCapParticles(name) {\n    for (const curPanel of $.GetContextPanel().FindChildrenWithClassTraverse(name)) {\n        curPanel.StopParticlesWithEndcaps();\n    }\n}\nfunction JSPanelSetControlPointParticles(name, cp, xpos, ypos, zpos) {\n    for (const curPanel of $.GetContextPanel().FindChildrenWithClassTraverse(name)) {\n        curPanel.SetControlPoint(cp, 0, 1 + ypos, zpos);\n        curPanel.SetControlPoint(cp, xpos, ypos, zpos);\n    }\n}\nfunction JSPanelSetParticlesName(name, particleName) {\n    for (const curPanel of $.GetContextPanel().FindChildrenWithClassTraverse(name)) {\n        curPanel.SetParticleNameAndRefresh(particleName);\n    }\n}\nfunction ShowHideWinPanel(bshow, teamOverride = 2, mode = 'casual') {\n    let elPanel = $.GetContextPanel().FindChildInLayoutFile('ZooWinPanel');\n    elPanel.RemoveClass('WinPanelRoot--Win--T');\n    elPanel.Data().teamOverride = teamOverride;\n    elPanel.Data().gameModeOverride = mode;\n    elPanel.SetHasClass('winpanel-basic-round-result-visible', bshow);\n    elPanel.SetHasClass('WinPanelRoot--Win', bshow);\n    elPanel.SetHasClass('winpanel-mvp--show', bshow);\n    elPanel.SetHasClass('MVP__MusicKit--show', bshow);\n    elPanel.SetHasClass('winpanel-funfacts--show', bshow);\n    elPanel.SetDialogVariable('winpanel-funfact', $.Localize('#GameUI_Stat_LastMatch_MaxPlayers'));\n    elPanel.SetDialogVariable('winpanel-title', $.Localize('#WinPanel_RoundWon'));\n    let elAvatar = elPanel.FindChildInLayoutFile('MVPAvatar');\n    elAvatar.PopulateFromSteamID(MyPersonaAPI.GetXuid());\n    let musicKitId = LoadoutAPI.GetItemID('noteam', 'musickit');\n    let elKitName = elPanel.FindChildInLayoutFile('MVPMusicKitName');\n    elKitName.text = InventoryAPI.GetItemName(musicKitId);\n    let elKitLabel = elPanel.FindChildInLayoutFile('MVPMusicKitStatTrak');\n    elKitLabel.text = '1000';\n}\nfunction CtrlLib_RandomColorString() {\n    return \"rgba(\"\n        + Math.random() * 255 + \",\"\n        + Math.random() * 255 + \",\"\n        + Math.random() * 255 + \",\"\n        + Number(0.3 + Math.random() * 0.6)\n        + \")\";\n}\nfunction CtrlLib_CreateSpiderGraph() {\n    const spiderGraph = $('#SpiderGraph');\n    spiderGraph.ClearJS('rgba(0,0,0,0)');\n    const elGuidelines = $('#SpiderGraphNumGuidelines');\n    const numGuidelines = Number(elGuidelines.text);\n    const options = {\n        bkg_color: \"#44444444\",\n        spoke_length_scale: 1.0,\n        guideline_count: numGuidelines,\n        deadzone_percent: .2\n    };\n    spiderGraph.SetGraphOptions(options);\n    const elSpokes = $('#SpiderGraphSpokes');\n    const spokesCount = Number(elSpokes.text);\n    spiderGraph.DrawGraphBackground(spokesCount);\n    const elNumPolys = $('#SpiderGraphNumPolys');\n    const polyCount = Number(elNumPolys.text);\n    for (let p = 0; p < polyCount; p++) {\n        let values = Array.from({ length: spokesCount }, () => Math.random());\n        const options = {\n            line_color: CtrlLib_RandomColorString(),\n            fill_color_inner: CtrlLib_RandomColorString(),\n            fill_color_outer: CtrlLib_RandomColorString(),\n        };\n        spiderGraph.DrawGraphPoly(values, options);\n    }\n    for (let s = 0; s < spokesCount; s++) {\n        let vPos = spiderGraph.GraphPositionToUIPosition(s, 1.0);\n    }\n}\nfunction gen_graph_data(i, max) {\n    return Math.random() * max;\n}\nfunction CtrlLib_CreateLineGraph() {\n    const lineGraph = $('#LineGraph');\n    const elNumVals = $('#num_points');\n    const numPoints = Math.floor(Number(4 + elNumVals.value * (15)));\n    const xvals = [...Array(numPoints).keys()];\n    const yvals = xvals.map(x => gen_graph_data(x, numPoints));\n    const options = {\n        draw_guidelines: true,\n        guideline_color: \"#88888888\",\n        guideline_thick: 4,\n        guideline_soft: .5,\n        line_color: \"#aaffffaa\",\n        line_thickness: 6,\n        line_softness: .5,\n        draw_points: true,\n        point_size: 8.5,\n        point_color: \"#ff3344ff\",\n        gradient_color: \"#344d7333\",\n    };\n    lineGraph.SetGraphOptions(options);\n    lineGraph.SetData(xvals, yvals);\n    lineGraph.Show();\n    const guidelineYPositions = lineGraph.GetGuidelinePositions();\n    const pointPositions = lineGraph.GetDataPointPositions();\n}\n(function () {\n    OpenControlsLib();\n    ControlsLibNavigateToTab('ControlLibStyleGuide', 'init');\n    const spiderGraph = $('#SpiderGraph');\n    if (spiderGraph) {\n        $.RegisterEventHandler(\"CanvasReady\", spiderGraph, CtrlLib_CreateSpiderGraph);\n        if (spiderGraph.BCanvasReady()) {\n            CtrlLib_CreateSpiderGraph();\n        }\n    }\n    var elTime = $(\"#TimeZoo\");\n    if (elTime) {\n        elTime.SetDialogVariableTime(\"time\", 1605560584);\n    }\n    jsPopupCallbackHandle = UiToolkitAPI.RegisterJSCallback(OnControlsLibPopupEvent);\n    jsContextMenuCallbackHandle = UiToolkitAPI.RegisterJSCallback(OnControlsLibContextMenuEvent);\n    jsPopupLoadingBarCallbackHandle = UiToolkitAPI.RegisterJSCallback(OnControlsLibPopupLoadingBarEvent);\n    $.RegisterForUnhandledEvent(\"PanoramaComponent_Blog_RSSFeedReceived\", OnRssFeedReceived);\n})();\n","scripts/crafting.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\nvar Crafting;\n(function (Crafting) {\n    function _Init() {\n        _AddSort();\n    }\n    function _AddSort() {\n        let elDropdown = $.GetContextPanel().FindChildInLayoutFile('CraftingSortDropdown');\n        let count = InventoryAPI.GetSortMethodsCount();\n        for (let i = 0; i < count; i++) {\n            let sort = InventoryAPI.GetSortMethodByIndex(i);\n            let newEntry = $.CreatePanel('Label', elDropdown, sort, {\n                class: 'DropDownMenu'\n            });\n            newEntry.text = $.Localize('#' + sort);\n            elDropdown.AddOption(newEntry);\n        }\n        elDropdown.SetSelected(InventoryAPI.GetSortMethodByIndex(1));\n    }\n    function OnReadyToTradeUpClicked() {\n        let elTradeUpConfirmBtn = $.GetContextPanel().FindChildTraverse('TradeUpConfirmBtn');\n        if (elTradeUpConfirmBtn.checked) {\n            InventoryAPI.SetInventorySortAndFilters('inv_sort_age', false, 'ingredient,item_quality:tournament', '', '');\n            const count = InventoryAPI.GetInventoryCount();\n            if (count > 0) {\n                elTradeUpConfirmBtn.SetDialogVariableInt('count', count);\n                UiToolkitAPI.ShowGenericPopupOkCancelBgStyle('#CSGO_Recipe_TradeUp', $.Localize('#CSGO_Recipe_TradeUp_Souvenirs:f', elTradeUpConfirmBtn), '', () => UpdateButtons(), () => { if (elTradeUpConfirmBtn && elTradeUpConfirmBtn.IsValid()) {\n                    elTradeUpConfirmBtn.checked = false;\n                    UpdateButtons();\n                } }, '');\n                return;\n            }\n        }\n        UpdateButtons();\n    }\n    Crafting.OnReadyToTradeUpClicked = OnReadyToTradeUpClicked;\n    function UpdateButtons() {\n        let elTradeUpConfirmBtn = $.GetContextPanel().FindChildTraverse('TradeUpConfirmBtn');\n        elTradeUpConfirmBtn.enabled = InventoryAPI.IsCraftReady();\n        if (!elTradeUpConfirmBtn.enabled) {\n            elTradeUpConfirmBtn.checked = false;\n        }\n        let elClearIngredientsBtn = $.GetContextPanel().FindChildTraverse('ClearIngredientsBtn');\n        elClearIngredientsBtn.enabled = InventoryAPI.GetCraftIngredientCount() > 0;\n        let elCraftItemBtn = $.GetContextPanel().FindChildTraverse('CraftItemBtn');\n        elCraftItemBtn.enabled = elTradeUpConfirmBtn.checked;\n    }\n    Crafting.UpdateButtons = UpdateButtons;\n    function UpdateItemList() {\n        let elDropdown = $.GetContextPanel().FindChildInLayoutFile('CraftingSortDropdown');\n        let sortType = elDropdown.GetSelected().id;\n        $.DispatchEvent('SetInventoryFilter', $('#Crafting-Items'), 'inv_group_equipment', 'any', 'any', sortType, 'recipe,is_rental:false,is_sealed:false', '');\n    }\n    Crafting.UpdateItemList = UpdateItemList;\n    function _UpdateCraftingPanelDisplay() {\n        UpdateButtons();\n        {\n            UpdateItemList();\n            $.DispatchEvent('SetInventoryFilter', $('#Crafting-Ingredients'), 'inv_group_equipment', 'any', 'any', '', 'ingredient', '');\n        }\n        {\n            function _UpdateItemCount(ItemListName, LabelName, nRecipeCount) {\n                let elItemList = $.GetContextPanel().FindChildTraverse(ItemListName);\n                let elLabel = $.GetContextPanel().FindChildTraverse(LabelName);\n                elLabel.SetDialogVariableInt('count', elItemList.count);\n                if (nRecipeCount >= 0) {\n                    elLabel.SetDialogVariableInt('recipecount', nRecipeCount);\n                    elLabel.text = $.Localize((nRecipeCount > 0) ? '#CSGO_Recipe_TradeUp_Items_XofY:f' : '#CSGO_Recipe_TradeUp_Items_NoSelection', elLabel);\n                }\n            }\n            _UpdateItemCount('Crafting-Items', 'CraftingItemsText', -1);\n            let numRequiredToCraft = InventoryAPI.GetCraftIngredientsRequired();\n            _UpdateItemCount('Crafting-Ingredients', 'CraftingIngredientsText', numRequiredToCraft);\n        }\n    }\n    {\n        _Init();\n        $.RegisterForUnhandledEvent('UpdateTradeUpPanel', _UpdateCraftingPanelDisplay);\n        $.RegisterForUnhandledEvent('PanoramaComponent_Inventory_CraftIngredientAdded', _UpdateCraftingPanelDisplay);\n        $.RegisterForUnhandledEvent('PanoramaComponent_Inventory_CraftIngredientRemoved', _UpdateCraftingPanelDisplay);\n    }\n})(Crafting || (Crafting = {}));\n","scripts/digitpanel.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\nvar DigitPanelFactory;\n(function (DigitPanelFactory) {\n    function MakeDigitPanel(elParent, nDigits, suffix = undefined, duration = 0.5, digitStringToken = \"#digitpanel_digits\", timingFunc = 'cubic-bezier( 0.9, 0.01, 0.1, 1 )') {\n        elParent.RemoveAndDeleteChildren();\n        const elContainer = $.CreatePanel('Panel', elParent, 'DigitPanel');\n        elContainer.m_nDigits = nDigits;\n        elContainer.m_suffix = suffix;\n        elContainer.m_duration = duration;\n        elContainer.m_strDigitsToken = digitStringToken;\n        elContainer.m_timingFunc = timingFunc;\n        elContainer.m_pendingSetStringHandle = null;\n        elContainer.m_bPendingSetStringInstant = false;\n        elContainer.style.flowChildren = 'right';\n        elContainer.style.overflow = 'clip';\n        _MakeDigitPanelContents(elContainer);\n        return elContainer;\n    }\n    DigitPanelFactory.MakeDigitPanel = MakeDigitPanel;\n    function _UpdateSuffix(elContainer) {\n        if (elContainer.m_suffix != undefined) {\n            let elSuffixLabel = elContainer.FindChildTraverse('DigitPanel-Suffix');\n            if (!elSuffixLabel) {\n                elSuffixLabel = $.CreatePanel('Label', elContainer, 'DigitPanel-Suffix');\n                elSuffixLabel.style.marginLeft = '2px';\n                elSuffixLabel.style.height = \"100%\";\n                elSuffixLabel.style.textAlign = \"right\";\n            }\n            elSuffixLabel.text = elContainer.m_suffix;\n        }\n        _SetWidth(elContainer);\n    }\n    function _MakeDigitPanelContents(elContainer) {\n        if (!elContainer.IsValid())\n            return;\n        const elParent = elContainer.GetParent();\n        if (!elParent.IsSizeValid()) {\n            $.Schedule(0.5, () => _MakeDigitPanelContents(elContainer));\n        }\n        else {\n            const ParentHeight = Math.floor(elParent.actuallayoutheight / elParent.actualuiscale_y);\n            elContainer.style.height = ParentHeight + 'px';\n            for (let i = 0; i < elContainer.m_nDigits; i++) {\n                const elDigit = $.CreatePanel('Panel', elContainer, 'DigitPanel-Digit-' + i);\n                elDigit.style.flowChildren = 'down';\n                elDigit.AddClass(\"digitpanel__digit\");\n                elDigit.style.transitionProperty = 'transform, position';\n                elDigit.m_duration = elContainer.m_duration + 's';\n                elDigit.style.transitionDuration = elContainer.m_duration + 's';\n                elDigit.style.transitionTimingFunction = elContainer.m_timingFunc;\n                const arrSymbols = $.Localize(elContainer.m_strDigitsToken).split(\"\");\n                arrSymbols.forEach(function (number) {\n                    const elNumeralLabel = $.CreatePanel('Label', elDigit, 'DigitPanel-Numeral-' + number);\n                    elNumeralLabel.style.textAlign = 'center';\n                    elNumeralLabel.style.letterSpacing = '0px';\n                    elNumeralLabel.text = number;\n                    elNumeralLabel.style.height = ParentHeight + \"px\";\n                    elNumeralLabel.style.horizontalAlign = 'center';\n                    elNumeralLabel.AddClass('digitpanel-font');\n                });\n            }\n            _UpdateSuffix(elContainer);\n        }\n    }\n    function _SetWidth(elContainer) {\n        if (!elContainer || !elContainer.IsValid())\n            return;\n        if (!elContainer.IsSizeValid()) {\n            $.Schedule(0.1, () => _SetWidth(elContainer));\n        }\n        else {\n            const dig0 = elContainer.FindChildTraverse('DigitPanel-Digit-0');\n            const nDigitWidth = Math.ceil(dig0.actuallayoutwidth / dig0.actualuiscale_x);\n            let width = elContainer.m_nDigits * nDigitWidth;\n            const elSuffixLabel = elContainer.FindChildTraverse('DigitPanel-Suffix');\n            if (elSuffixLabel) {\n                width += elSuffixLabel.actuallayoutwidth / elSuffixLabel.actualuiscale_x;\n            }\n            elContainer.style.width = width + 'px';\n        }\n    }\n    function SetDigitPanelString(elParent, string, bInstant = false) {\n        if (!elParent || !elParent.IsValid())\n            return;\n        const elContainer = elParent.FindChildTraverse('DigitPanel');\n        if (!elContainer)\n            return;\n        if (elContainer.m_pendingSetStringHandle !== null) {\n            $.CancelScheduled(elContainer.m_pendingSetStringHandle);\n            elContainer.m_pendingSetStringHandle = null;\n        }\n        bInstant ||= elContainer.m_bPendingSetStringInstant;\n        if (elContainer.GetChildCount() === 0) {\n            elContainer.m_pendingSetStringHandle = $.Schedule(0.1, () => {\n                elContainer.m_pendingSetStringHandle = null;\n                SetDigitPanelString(elParent, string, bInstant);\n            });\n            elContainer.m_bPendingSetStringInstant = bInstant;\n            return;\n        }\n        elContainer.m_bPendingSetStringInstant = false;\n        const nDigits = elContainer.m_nDigits;\n        let arrDigits = String(string).split(\"\");\n        const padsNeeded = Math.max(0, nDigits - arrDigits.length);\n        if (padsNeeded > 0) {\n            const padding = Array(padsNeeded).fill(\" \");\n            arrDigits = padding.concat(arrDigits);\n            arrDigits = arrDigits.slice(0, nDigits);\n        }\n        const arrSymbols = $.Localize(elContainer.m_strDigitsToken).split(\"\");\n        for (let d = nDigits; d >= 0; d--) {\n            const symbol = arrDigits[d];\n            const elDigit = elContainer.FindChildTraverse('DigitPanel-Digit-' + d);\n            if (elDigit) {\n                const index = arrSymbols.indexOf(symbol);\n                elDigit.visible = d < arrDigits.length;\n                if (index >= 0) {\n                    elDigit.style.transitionDuration = bInstant ? '0s' : elDigit.m_duration;\n                    $.Schedule(0.01, () => {\n                        if (elDigit && elDigit.IsValid()) {\n                            elDigit.style.transform = \"translate3D( \" + d + \"%,\" + -Number(index) * 100 + \"%, 0px);\";\n                        }\n                    });\n                }\n            }\n        }\n        _UpdateSuffix(elContainer);\n    }\n    DigitPanelFactory.SetDigitPanelString = SetDigitPanelString;\n})(DigitPanelFactory || (DigitPanelFactory = {}));\n","scripts/endofmatch-characters.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"endofmatch.ts\" />\n/// <reference path=\"scoreboard.ts\" />\n/// <reference path=\"player_stats_card.ts\" />\n/// <reference path=\"mock_adapter.ts\" />\nvar EOM_Characters;\n(function (EOM_Characters) {\n    let _m_arrAllPlayersMatchDataJSO = [];\n    let _m_localPlayer = null;\n    let _m_teamToShow = null;\n    const ACCOLADE_START_TIME = 1;\n    const DELAY_PER_PLAYER = 0.5;\n    let m_bNoGimmeAccolades = false;\n    function _GetSnippetForMode(mode) {\n        switch (mode) {\n            case 'scrimcomp2v2':\n                return 'snippet-eom-chars__layout--scrimcomp2v2';\n            case 'competitive':\n            case 'cooperative':\n            case 'casual':\n            case 'teamdm':\n            case 'rush':\n                return 'snippet-eom-chars__layout--classic';\n            case 'training':\n            case 'deathmatch':\n            case 'ffadm':\n            case 'gungameprogressive':\n                return 'snippet-eom-chars__layout--ffa';\n            default:\n                return 'snippet-eom-chars__layout--classic';\n        }\n    }\n    function _SetTeamLogo(team) {\n        let elRoot = $('#id-eom-characters-root');\n        let teamLogoPath = 'file://{images}/icons/ui/' + (team == 'ct' ? 'ct_logo_1c.svg' : 't_logo_1c.svg');\n        let elTeamLogo = elRoot.FindChildTraverse('id-eom-chars__layout__logo--' + team);\n        if (elTeamLogo) {\n            elTeamLogo.SetImage(teamLogoPath);\n        }\n    }\n    function _SetupPanel(mode) {\n        let elRoot = $('#id-eom-characters-root');\n        let snippet = _GetSnippetForMode(mode);\n        elRoot.RemoveAndDeleteChildren();\n        elRoot.BLoadLayoutSnippet(snippet);\n        _SetTeamLogo('t');\n        _SetTeamLogo('ct');\n    }\n    function _CollectPlayersForMode(mode) {\n        let arrPlayerList = [];\n        switch (mode) {\n            case 'deathmatch':\n            case 'ffadm':\n            case 'gungameprogressive':\n                {\n                    let arrPlayerXuids = Scoreboard.GetFreeForAllTopThreePlayers();\n                    if (MockAdapter.GetMockData() != undefined) {\n                        arrPlayerXuids = ['1', '2', '3'];\n                    }\n                    arrPlayerList[0] = _m_arrAllPlayersMatchDataJSO.filter(o => o['xuid'] == arrPlayerXuids[0])[0];\n                    arrPlayerList[1] = _m_arrAllPlayersMatchDataJSO.filter(o => o['xuid'] == arrPlayerXuids[1])[0];\n                    arrPlayerList[2] = _m_arrAllPlayersMatchDataJSO.filter(o => o['xuid'] == arrPlayerXuids[2])[0];\n                    m_bNoGimmeAccolades = true;\n                    break;\n                }\n            case 'training':\n            case 'scrimcomp2v2':\n                {\n                    let listCT = _CollectPlayersOfTeam('CT').slice(0, 2);\n                    let listT = _CollectPlayersOfTeam('TERRORIST').slice(0, 2);\n                    arrPlayerList = listCT.concat(listT);\n                    m_bNoGimmeAccolades = false;\n                    break;\n                }\n            case 'rush':\n                {\n                    let listCT = _CollectPlayersOfTeam('CT').slice(0, 3);\n                    let listT = _CollectPlayersOfTeam('TERRORIST').slice(0, 3);\n                    arrPlayerList = listCT.concat(listT);\n                    m_bNoGimmeAccolades = false;\n                    break;\n                }\n            case 'competitive':\n            case 'casual':\n            case 'cooperative':\n            case 'teamdm':\n            default:\n                {\n                    arrPlayerList = _CollectPlayersOfTeam(_m_teamToShow);\n                    arrPlayerList = arrPlayerList.sort(_SortByScoreFn);\n                    m_bNoGimmeAccolades = false;\n                    if (_m_localPlayer) {\n                        arrPlayerList = arrPlayerList.filter(player => player['xuid'] != _m_localPlayer['xuid']);\n                        arrPlayerList.splice(0, 0, _m_localPlayer);\n                    }\n                    break;\n                }\n        }\n        if (arrPlayerList)\n            arrPlayerList = arrPlayerList.slice(0, _GetNumCharsToShowForMode(mode));\n        return arrPlayerList;\n    }\n    function _CollectPlayersOfTeam(teamName) {\n        let teamNum = 0;\n        switch (teamName) {\n            case 'TERRORIST':\n                teamNum = 2;\n                break;\n            case 'CT':\n                teamNum = 3;\n                break;\n        }\n        return _m_arrAllPlayersMatchDataJSO.filter(o => o['teamnumber'] == teamNum);\n    }\n    function _GetNumCharsToShowForMode(mode) {\n        switch (mode) {\n            case 'scrimcomp2v2':\n                return 4;\n            case 'competitive':\n                return 5;\n            case 'rush':\n                return 6;\n            case 'casual':\n            case 'teamdm':\n                return 5;\n            case 'cooperative':\n                return 2;\n            case 'deathmatch':\n            case 'ffadm':\n            case 'gungameprogressive':\n                return 3;\n            case 'training':\n                return 1;\n            default:\n                return 5;\n        }\n    }\n    function GetModeForEndOfMatchPurposes() {\n        let mode = MockAdapter.GetGameModeInternalName(false);\n        if (mode == 'deathmatch') {\n            if (GameInterfaceAPI.GetSettingString('mp_teammates_are_enemies') !== '0') {\n                mode = 'ffadm';\n            }\n            else if (GameInterfaceAPI.GetSettingString('mp_dm_teammode') !== '0') {\n                mode = 'teamdm';\n            }\n        }\n        return mode;\n    }\n    EOM_Characters.GetModeForEndOfMatchPurposes = GetModeForEndOfMatchPurposes;\n    function ShowWinningTeam(mode) {\n        return false;\n    }\n    EOM_Characters.ShowWinningTeam = ShowWinningTeam;\n    function _DisplayMe() {\n        if (GameStateAPI.IsOverwatch()) {\n            return false;\n        }\n        let data = MockAdapter.GetAllPlayersMatchDataJSO();\n        if (data && data.allplayerdata && data.allplayerdata.length > 0) {\n            _m_arrAllPlayersMatchDataJSO = data.allplayerdata;\n        }\n        else {\n            return false;\n        }\n        let localPlayerSet = _m_arrAllPlayersMatchDataJSO.filter(oPlayer => oPlayer['xuid'] == MockAdapter.GetLocalPlayerXuid());\n        let localPlayer = (localPlayerSet.length > 0) ? localPlayerSet[0] : undefined;\n        let oMatchEndData = MockAdapter.GetMatchEndWinDataJSO();\n        let teamNumToShow = 3;\n        let losingTeamNum = oMatchEndData ? oMatchEndData.losing_team_number : 0;\n        let mode = GetModeForEndOfMatchPurposes();\n        if (localPlayer && !ShowWinningTeam(mode)) {\n            _m_localPlayer = localPlayer;\n            teamNumToShow = _m_localPlayer['teamnumber'];\n        }\n        else {\n            if (oMatchEndData)\n                teamNumToShow = oMatchEndData['winning_team_number'];\n            if (!teamNumToShow && localPlayer) {\n                _m_localPlayer = localPlayer;\n                teamNumToShow = _m_localPlayer['teamnumber'];\n            }\n        }\n        if (teamNumToShow == 2) {\n            _m_teamToShow = 'TERRORIST';\n        }\n        else {\n            _m_teamToShow = 'CT';\n        }\n        _SetupPanel(mode);\n        let arrPlayerList = _CollectPlayersForMode(mode);\n        arrPlayerList = _SortPlayers(mode, arrPlayerList);\n        let cheerSet = new Set();\n        let localPlayerCheer = '';\n        if (_m_localPlayer) {\n            let arrLocalPlayer = _m_localPlayer.hasOwnProperty('items') ? _m_localPlayer.items.filter(oItem => ItemInfo.IsCharacter(oItem.itemid)) : [];\n            let localPlayerModel = arrLocalPlayer[0];\n            if (localPlayerModel) {\n                if (_m_localPlayer['teamnumber'] == losingTeamNum) {\n                    if (GameInterfaceAPI.GetSettingString('eom_local_player_defeat_anim_enabled') !== '0')\n                        localPlayerCheer = ItemInfo.GetDefaultDefeat(localPlayerModel['itemid']);\n                }\n                else {\n                    localPlayerCheer = ItemInfo.GetDefaultCheer(localPlayerModel['itemid']);\n                }\n            }\n            cheerSet.add(localPlayerCheer);\n        }\n        let gapIndex = -1;\n        if (mode == 'scrimcomp2v2' && arrPlayerList.length > 0) {\n            let firstTeamNum = arrPlayerList[0].teamnumber;\n            gapIndex = arrPlayerList.findIndex(player => player.teamnumber != firstTeamNum);\n        }\n        $.GetContextPanel().SetPlayerCount(arrPlayerList.length + (gapIndex >= 0 ? 1 : 0));\n        arrPlayerList.forEach((oPlayer, index) => {\n            if (oPlayer) {\n                if (index >= gapIndex && gapIndex >= 0)\n                    index += 1;\n                let sAgentItemId = '';\n                let sGlovesItemId = '';\n                let sWeaponItemId = '';\n                let cheer = '';\n                let sPetItemId = '';\n                if ('items' in oPlayer) {\n                    let agentItem = oPlayer['items'].filter(oItem => ItemInfo.IsCharacter(oItem['itemid']))[0];\n                    if (agentItem) {\n                        sAgentItemId = agentItem['itemid'];\n                        if (oPlayer.teamnumber == losingTeamNum)\n                            cheer = ItemInfo.GetDefaultDefeat(sAgentItemId);\n                        else\n                            cheer = ItemInfo.GetDefaultCheer(sAgentItemId);\n                    }\n                    let glovesItem = oPlayer['items'].filter(oItem => ItemInfo.IsGloves(oItem['itemid']))[0];\n                    if (glovesItem) {\n                        sGlovesItemId = glovesItem['itemid'];\n                    }\n                    let weaponItem = oPlayer['items'].filter(oItem => ItemInfo.IsWeapon(oItem['itemid']) || ItemInfo.IsMelee(oItem['itemid']))[0];\n                    if (weaponItem) {\n                        sWeaponItemId = weaponItem['itemid'];\n                    }\n                    let items = oPlayer['items'];\n                    let petItem = oPlayer['items'].filter(oItem => ItemInfo.IsPet(oItem['itemid']))[0];\n                    if (petItem) {\n                        sPetItemId = petItem['itemid'];\n                    }\n                }\n                if (oPlayer === _m_localPlayer)\n                    cheer = localPlayerCheer;\n                else if (cheerSet.has(cheer))\n                    cheer = '';\n                cheerSet.add(cheer);\n                let label = oPlayer['xuid'];\n                $.GetContextPanel().AddPlayer(index, label, sAgentItemId, sGlovesItemId, sWeaponItemId, cheer, sPetItemId);\n            }\n        });\n        _CreatePlayerStatCards(arrPlayerList, gapIndex, m_bNoGimmeAccolades);\n        return true;\n    }\n    ;\n    function _DisplayPlayerStatsCard(elCardContainer, index, nPlayerCount) {\n        let elEndOfMatch = $.GetContextPanel();\n        let w = elEndOfMatch.actuallayoutwidth;\n        let h = elEndOfMatch.actuallayoutheight;\n        let xMin = 1080 * (w / h) * 0.5 - 720;\n        let x = xMin + 1440 * ((index + 1) / (nPlayerCount + 1));\n        let charPos = { x: x, y: 540 };\n        if (elCardContainer && elCardContainer.IsValid()) {\n            elCardContainer.style.x = charPos.x + 'px;';\n            let elCard = elCardContainer.FindChildTraverse('card');\n            elCardContainer.AddClass('reveal');\n            $.Schedule(0.3, () => PlayerStatsCard.RevealStats(elCard));\n        }\n        if (!$.GetContextPanel().BAscendantHasClass('scoreboard-visible')) {\n            $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.stats_reveal', 'MOUSE');\n        }\n    }\n    function _CreatePlayerStatCards(arrPlayerList, gapIndex, bNoGimmes) {\n        if (!arrPlayerList || arrPlayerList.length == 0)\n            return;\n        let arrBestStats = [\n            { stat: 'adr', value: null, elCard: null },\n            { stat: 'hsp', value: null, elCard: null },\n            { stat: 'enemiesflashed', value: null, elCard: null },\n            { stat: 'utilitydamage', value: null, elCard: null }\n        ];\n        let nPlayerCount = arrPlayerList.length + (gapIndex >= 0 ? 1 : 0);\n        let elRoot = $('#id-eom-characters-root');\n        for (let oPlayer of arrPlayerList) {\n            if (!oPlayer)\n                continue;\n            let oTitle = oPlayer.nomination;\n            let index = arrPlayerList.indexOf(oPlayer);\n            if (index >= gapIndex && gapIndex >= 0)\n                index += 1;\n            if (oTitle != undefined) {\n                let xuid = oPlayer.xuid;\n                let elCardContainer = $.CreatePanel('Panel', elRoot, 'cardcontainer-' + xuid);\n                elCardContainer.AddClass('player-stats-card-container');\n                elCardContainer.style.zIndex = (index * 10).toString();\n                let elCard = PlayerStatsCard.Init(elCardContainer, xuid, index);\n                let accName = GameStateAPI.GetAccoladeLocalizationString(Number(oTitle.eaccolade));\n                let showAccolade = !(bNoGimmes && accName.includes('gimme_'));\n                if (showAccolade) {\n                    let accValue = oTitle.value.toString();\n                    let accPosition = oTitle.position.toString();\n                    PlayerStatsCard.SetAccolade(elCard, accValue, accName, accPosition);\n                }\n                PlayerStatsCard.SetStats(elCard, xuid, arrBestStats);\n                PlayerStatsCard.SetFlair(elCard, xuid);\n                PlayerStatsCard.SetSkillGroup(elCard, xuid);\n                PlayerStatsCard.SetAvatar(elCard, xuid);\n                PlayerStatsCard.SetTeammateColor(elCard, xuid);\n                $.Schedule(ACCOLADE_START_TIME + (index * DELAY_PER_PLAYER), _DisplayPlayerStatsCard.bind(undefined, elCardContainer, index, nPlayerCount));\n            }\n            else {\n            }\n        }\n        for (let oBest of arrBestStats) {\n            if (oBest.elCard)\n                PlayerStatsCard.HighlightStat(oBest.elCard, oBest.stat);\n        }\n    }\n    function _SortByTeamFn(a, b) {\n        let team_a = Number(a['teamnumber']);\n        let team_b = Number(b['teamnumber']);\n        let index_a = Number(a['slot']);\n        let index_b = Number(b['slot']);\n        if (team_a != team_b) {\n            return team_b - team_a;\n        }\n        else {\n            return index_a - index_b;\n        }\n    }\n    function _SortByScoreFn(a, b) {\n        let score_a = MockAdapter.GetPlayerScore(a['xuid']);\n        let score_b = MockAdapter.GetPlayerScore(b['xuid']);\n        let index_a = Number(a['slot']);\n        let index_b = Number(b['slot']);\n        if (score_a != score_b) {\n            return score_b - score_a;\n        }\n        else {\n            return index_a - index_b;\n        }\n    }\n    function _SortPlayers(mode, arrPlayerList) {\n        let midpoint;\n        let localPlayerPosition;\n        switch (mode) {\n            case 'scrimcomp2v2':\n                arrPlayerList.sort(_SortByTeamFn);\n                break;\n            case 'no longer used but force local player to the middle':\n                if (_m_localPlayer &&\n                    _m_localPlayer.hasOwnProperty('xuid') &&\n                    (arrPlayerList.filter(p => p.xuid == _m_localPlayer.xuid).length > 0)) {\n                    midpoint = Math.floor(arrPlayerList.length / 2);\n                    arrPlayerList = arrPlayerList.filter(player => player['xuid'] != _m_localPlayer['xuid']);\n                    arrPlayerList.splice(midpoint, 0, _m_localPlayer);\n                }\n                break;\n            case 'no longer used but force player to have a spot':\n                if (_m_localPlayer && arrPlayerList.includes(_m_localPlayer)) {\n                    localPlayerPosition = Math.min(arrPlayerList.indexOf(_m_localPlayer), 7);\n                    arrPlayerList = arrPlayerList.filter(player => player['xuid'] != _m_localPlayer['xuid']);\n                    arrPlayerList.splice(localPlayerPosition, 0, _m_localPlayer);\n                }\n                break;\n            case 'deathmatch':\n            case 'ffadm':\n            case 'casual':\n            case 'teamdm':\n            case 'rush':\n            default:\n                break;\n        }\n        return arrPlayerList;\n    }\n    function _RankRevealAll() {\n        let mode = GetModeForEndOfMatchPurposes();\n        let arrPlayerList = _CollectPlayersForMode(mode);\n        for (let oPlayer of arrPlayerList) {\n            if (!oPlayer)\n                continue;\n            let xuid = oPlayer.xuid;\n            let elCardContainer = $.GetContextPanel().FindChildTraverse('cardcontainer-' + xuid);\n            if (elCardContainer) {\n                let elCard = PlayerStatsCard.GetCard(elCardContainer);\n                PlayerStatsCard.SetSkillGroup(elCard, xuid);\n            }\n        }\n    }\n    function Start() {\n        _DisplayMe();\n        $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.gameover_show', 'MOUSE');\n    }\n    EOM_Characters.Start = Start;\n    function Shutdown() {\n        $('#id-eom-characters-root').FindChildrenWithClassTraverse('eom-chars__accolade').forEach(el => el.DeleteAsync(.0));\n        $('#id-eom-characters-root').RemoveAndDeleteChildren();\n    }\n    EOM_Characters.Shutdown = Shutdown;\n    {\n        $.RegisterForUnhandledEvent('GameState_RankRevealAll', _RankRevealAll);\n    }\n})(EOM_Characters || (EOM_Characters = {}));\n","scripts/endofmatch-rank.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"common/formattext.ts\" />\n/// <reference path=\"mock_adapter.ts\" />\n/// <reference path=\"xpshop_track.ts\" />\n/// <reference path=\"rank_skillgroup_particles.ts\" />\n/// <reference path=\"endofmatch.ts\" />\nvar EOM_Rank;\n(function (EOM_Rank) {\n    let _m_pauseBeforeEnd = 1.0;\n    const _m_cP = $.GetContextPanel();\n    _m_cP.Data().m_retries = 0;\n    function _DisplayMe() {\n        if (!_m_cP || !_m_cP.IsValid())\n            return;\n        if (!MockAdapter.bXpDataReady(_m_cP))\n            return false;\n        if (MyPersonaAPI.GetElevatedState() !== 'elevated')\n            return false;\n        let xPPerLevel = MyPersonaAPI.GetXpPerLevel();\n        let oXpData = MockAdapter.XPDataJSO(_m_cP);\n        if (!oXpData)\n            return false;\n        const xpBonuses = MyPersonaAPI.GetActiveXpBonuses();\n        const bEligibleForCarePackage = xpBonuses.split(',').includes('2');\n        const earnedFreeRewards = oXpData.hasOwnProperty('free_rewards') ? Number(oXpData.free_rewards) : 0;\n        const xp_trail_level = oXpData.hasOwnProperty('xp_trail_level') ? Number(oXpData.xp_trail_level) : 0;\n        $.GetContextPanel().SetHasClass('care-package-eligible', bEligibleForCarePackage || (earnedFreeRewards != 0));\n        let elCarePackage = _m_cP.FindChildTraverse('jsEomCarePackage');\n        elCarePackage.RemoveClass('earned-rewards');\n        let elProgress = _m_cP.FindChildInLayoutFile(\"id-eom-rank__bar-container\");\n        let elNew = _m_cP.FindChildInLayoutFile(\"id-eom-new-reveal\");\n        let elCurrent = _m_cP.FindChildInLayoutFile(\"id-eom-rank__current\");\n        let elBar = _m_cP.FindChildInLayoutFile(\"id-eom-rank__bar\");\n        let elRankLister = _m_cP.FindChildInLayoutFile(\"id-eom-rank__lister\");\n        let elRankListerItems = _m_cP.FindChildInLayoutFile(\"id-eom-rank__lister__items\");\n        let arrPreRankXP = [];\n        let arrPostRankXP = [];\n        let totalXP = 0;\n        let maxLevel = InventoryAPI.GetMaxLevel();\n        let elPanel = _m_cP.FindChildTraverse('id-eom-rank__current');\n        elPanel.TriggerClass('show');\n        _m_cP.AddClass('eom-rank-show');\n        let currentRank = oXpData.current_level;\n        currentRank = currentRank < maxLevel ? currentRank : maxLevel;\n        elCurrent.SetDialogVariableInt(\"level\", currentRank);\n        elCurrent.SetDialogVariable('name', $.Localize('#XP_RankName_' + currentRank, elCurrent));\n        _m_cP.FindChildInLayoutFile(\"id-eom-rank__current__emblem\").SetImage(\"file://{images}/icons/xp/level\" + currentRank + \".png\");\n        const newRank = currentRank < maxLevel ? (currentRank + 1) : maxLevel;\n        let elCurrentListerItem;\n        let _xpSoundNum = 1;\n        let currentXpPointer = 0;\n        function _AddXPBar(reason, xp, xpToXpTrailEvent = -1) {\n            const sPerXp = 0.0005;\n            const duration = sPerXp * xp;\n            const sPerSoundTick = 0.082;\n            for (let t = sPerSoundTick; t < duration; t += sPerSoundTick) {\n                $.Schedule(animTime + t, () => $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.XP.Ticker', 'eom-rank'));\n            }\n            $.Schedule(animTime, () => {\n                if (!elBar.IsValid())\n                    return 0;\n                let elRankSegment = $.CreatePanel('Panel', elBar, 'id-eom-rank__bar__segment');\n                elRankSegment.AddClass(\"eom-rank__bar__segment\");\n                elBar.MoveChildAfter(elRankLister, elRankSegment);\n                let colorClass;\n                if (reason == \"old\") {\n                    colorClass = \"eom-rank__blue\";\n                }\n                else if (reason == \"levelup\") {\n                    colorClass = \"eom-rank__purple\";\n                }\n                else if (reason == \"6\" || reason == \"7\") {\n                    colorClass = \"eom-rank__yellow\";\n                }\n                else if (reason == \"9\" || reason == \"10\" || reason == \"59\") {\n                    colorClass = \"eom-rank__yellow\";\n                }\n                else {\n                    colorClass = \"eom-rank__green\";\n                }\n                $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.XP.Milestone_0' + _xpSoundNum.toString(), 'eom-rank');\n                if (_xpSoundNum < 4) {\n                    _xpSoundNum++;\n                }\n                elRankSegment.AddClass(colorClass);\n                elRankSegment.style.width = '0%';\n                $.Schedule(0.0, () => {\n                    if (elRankSegment && elRankSegment.IsValid()) {\n                        elRankSegment.style.width = (xp / xPPerLevel * 100) + '%;';\n                    }\n                });\n                elRankSegment.style.transitionDuration = duration + \"s\";\n                if (elCurrentListerItem) {\n                    elCurrentListerItem.AddClass(\"eom-rank__lister__item--old\");\n                }\n                if (elRankListerItems && elRankListerItems.IsValid()) {\n                    elCurrentListerItem = $.CreatePanel('Panel', elRankListerItems, 'id-eom-rank__lister__items__' + reason);\n                    elCurrentListerItem.BLoadLayoutSnippet(\"snippet_rank__lister__item\");\n                    elCurrentListerItem.RemoveClass(\"eom-rank__lister__item--appear\");\n                    let elAmtLabel = elCurrentListerItem.FindChildTraverse('id-eom-rank__lister__item__amt');\n                    elAmtLabel.SetDialogVariable(\"xp\", String(xp));\n                    elAmtLabel.text = $.Localize(\"#EOM_XP_Bar\", elAmtLabel);\n                    elAmtLabel.AddClass(colorClass);\n                    let elDescLabel = elCurrentListerItem.FindChildTraverse('id-eom-rank__lister__item__desc');\n                    elDescLabel.SetDialogVariable(\"gamemode\", $.Localize(\"#SFUI_GameMode_\" + MatchStatsAPI.GetGameMode()));\n                    elDescLabel.text = $.Localize(\"#XP_Bonus_RankUp_\" + reason, elDescLabel);\n                }\n            });\n            currentXpPointer += xp;\n            if (xpToXpTrailEvent > -1) {\n                const xpTrailAnimStartTime = xpToXpTrailEvent * sPerXp;\n                $.Schedule(animTime + xpTrailAnimStartTime, () => {\n                    if (_m_cP && _m_cP.IsValid()) {\n                        _m_cP.SetHasClass('xptrail-acquired', true);\n                        _DisplayXpTrailRemainingTime(oXpData.xp_trail_remaining);\n                        const elHonorIcon = _m_cP.FindChildTraverse('jsHonorIcon');\n                        elHonorIcon.Set(xp_trail_level, false);\n                    }\n                });\n            }\n            return duration;\n        }\n        ;\n        totalXP += oXpData.current_xp;\n        for (let elem of oXpData.xp_progress_data) {\n            let xp = elem.xp_points;\n            let key = elem.xp_category;\n            if (totalXP + xp < xPPerLevel) {\n                arrPreRankXP.push({ reason: key, xp: xp });\n            }\n            else {\n                let xp_upto = xPPerLevel - totalXP;\n                let xp_remainder = totalXP + xp - xPPerLevel;\n                if (xp_upto > 0) {\n                    arrPreRankXP.push({ reason: key, xp: xp_upto });\n                    arrPostRankXP.push({ reason: key, xp: xp_remainder });\n                }\n                else\n                    arrPostRankXP.push({ reason: key, xp: xp });\n            }\n            totalXP += xp;\n        }\n        const xpTrailXpPosition = totalXP + (oXpData.hasOwnProperty('xp_trail_xp_needed') ? Number(oXpData.xp_trail_xp_needed) : 0);\n        function _AnimSequenceNext(func, duration = 0) {\n            $.Schedule(animTime, func);\n            animTime += duration;\n        }\n        let _AnimPause = function (sec) {\n            animTime += sec;\n        };\n        let animTime = 0;\n        _AnimPause(1.0);\n        function _PlaceXpTrail(xp) {\n            const elHonorIcon = _m_cP.FindChildTraverse('jsHonorIcon');\n            elHonorIcon.Set(xp_trail_level, false);\n            _m_cP.SetHasClass('xptrail-enabled', xp >= 0);\n            if (xp < 0)\n                return;\n            const XpTrail_pct = (xp / xPPerLevel * 100) - 2;\n            elHonorIcon.style.x = (XpTrail_pct) + '%;';\n        }\n        function _DisplayXpTrailRemainingTime(xp_trail_remaining) {\n            _m_cP.SetHasClass('xptrail-remaining-time-enabled', (xp_trail_remaining != undefined) && (xp_trail_remaining > 0));\n            _m_cP.SetDialogVariable('xp-trail-remaining', FormatText.SecondsToSignificantTimeString(xp_trail_remaining).toLowerCase());\n        }\n        if (oXpData.current_xp > 0) {\n            const xpToXpTrailEvent = ((xpTrailXpPosition > 0) && (xpTrailXpPosition <= oXpData.current_xp)) ? xpTrailXpPosition : -1;\n            _AnimPause(_AddXPBar(\"old\", oXpData.current_xp, xpToXpTrailEvent));\n        }\n        const xpToXpTrailEvent = xpTrailXpPosition <= 5000 ? xpTrailXpPosition : -1;\n        _PlaceXpTrail(xpToXpTrailEvent);\n        const DelayXpTrailAnnounce = xpTrailXpPosition > 0 && xpTrailXpPosition <= totalXP;\n        if (!DelayXpTrailAnnounce)\n            _DisplayXpTrailRemainingTime(oXpData.xp_trail_remaining);\n        for (let i = 0; i < arrPreRankXP.length; i++) {\n            _AnimPause(1.0);\n            if (arrPreRankXP[i].xp > 0) {\n                const xpToXpTrailEvent = ((xpTrailXpPosition > currentXpPointer) && (xpTrailXpPosition <= currentXpPointer + arrPreRankXP[i].xp)) ? xpTrailXpPosition - currentXpPointer : -1;\n                _AnimPause(_AddXPBar(arrPreRankXP[i].reason, arrPreRankXP[i].xp, xpToXpTrailEvent));\n            }\n        }\n        if (totalXP >= xPPerLevel) {\n            let elRankEarnedCarePackagefx = _m_cP.FindChildInLayoutFile(\"id-eom-rank_carepackage_earned_effects\");\n            let elRankCarePackageBgfx = _m_cP.FindChildInLayoutFile(\"id-eom-rank_carepackage_bg_effects\");\n            _AnimSequenceNext(() => {\n                if (!elProgress || !elProgress.IsValid())\n                    return;\n                $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.XP.BarFull', 'eom-rank');\n                elProgress.FindChildInLayoutFile('id-eom-rank-bar-white').AddClass('eom-rank__bar--white--show');\n                if (earnedFreeRewards > 0) {\n                    elRankCarePackageBgfx.SetParticleNameAndRefresh(\"particles/ui/rank_carepackage_bg_base.vpcf\");\n                    elRankCarePackageBgfx.SetControlPoint(3, 0, 0, 1);\n                    elRankCarePackageBgfx.StartParticles();\n                }\n            }, 1);\n            if (earnedFreeRewards > 0) {\n                _AnimSequenceNext(() => {\n                    if (!_m_cP || !_m_cP.IsValid())\n                        return;\n                    let elCarePackage = _m_cP.FindChildTraverse('jsEomCarePackage');\n                    $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.tab_mainmenu_shop', 'eom-rank');\n                    elCarePackage.AddClass('earned-rewards');\n                    elRankEarnedCarePackagefx.SetParticleNameAndRefresh(\"particles/ui/rank_carepackage_recieve.vpcf\");\n                    elRankEarnedCarePackagefx.SetControlPoint(3, 0, 0, 1);\n                }, 2);\n            }\n            _AnimSequenceNext(() => {\n                if (!elProgress || !elProgress.IsValid() ||\n                    !elCurrent || !elCurrent.IsValid() ||\n                    !elBar || !elBar.IsValid() ||\n                    !elNew || !elNew.IsValid() ||\n                    !elCurrent || !elCurrent.IsValid())\n                    return;\n                $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.XP.NewRank', 'eom-rank');\n                elBar.FindChildrenWithClassTraverse(\"eom-rank__bar__segment\").forEach(entry => entry.DeleteAsync(.0));\n                elRankCarePackageBgfx.StopParticlesWithEndcaps();\n                elCurrent.SetDialogVariableInt(\"level\", newRank);\n                elCurrent.SetDialogVariable('name', $.Localize('#XP_RankName_' + newRank, elCurrent));\n                _m_cP.SetDialogVariable('rank_new', $.Localize('#XP_RankName_Display', elCurrent));\n                _m_cP.FindChildInLayoutFile(\"id-eom-rank__current__label\").text = $.Localize(\"{s:rank_new}\", elCurrent);\n                _m_cP.FindChildInLayoutFile(\"id-eom-rank__current__emblem\").SetImage(\"file://{images}/icons/xp/level\" + newRank + \".png\");\n                elNew.RemoveClass(\"hidden\");\n                elNew.FindChildInLayoutFile('id-eom-new-reveal-image').SetImage(\"file://{images}/icons/xp/level\" + newRank + \".png\");\n                elNew.TriggerClass(\"eom-rank-new-reveal--anim\");\n                let elParticleEffect = elNew.FindChildInLayoutFile('id-eom-new-reveal-flare');\n                let aParticleSettings = RankSkillgroupParticles.GetRankParticleSettings(newRank);\n                elParticleEffect.SetParticleNameAndRefresh(aParticleSettings.particleName);\n                elParticleEffect.SetControlPoint(aParticleSettings.cpNumber, aParticleSettings.cpValue[0], aParticleSettings.cpValue[1], aParticleSettings.cpValue[2]);\n                elParticleEffect.StartParticles();\n            }, 3);\n            _AnimSequenceNext(() => {\n                if (!_m_cP || !_m_cP.IsValid())\n                    return;\n                const xpToXpTrailEvent = xpTrailXpPosition > 5000 && xpTrailXpPosition <= 10000 ? xpTrailXpPosition - 5000 : -1;\n                _PlaceXpTrail(xpToXpTrailEvent);\n            });\n            _AnimSequenceNext(() => {\n                if (!elProgress || !elProgress.IsValid() ||\n                    !elCurrent || !elCurrent.IsValid() ||\n                    !elBar || !elBar.IsValid() ||\n                    !elNew || !elNew.IsValid() ||\n                    !elCurrent || !elCurrent.IsValid())\n                    return;\n                elProgress.FindChildInLayoutFile('id-eom-rank-bar-white').RemoveClass('eom-rank__bar--white--show');\n            });\n            for (let i = 0; i < arrPostRankXP.length; i++) {\n                const xpToXpTrailEvent = ((xpTrailXpPosition > currentXpPointer) && (xpTrailXpPosition <= currentXpPointer + arrPostRankXP[i].xp)) ? xpTrailXpPosition - currentXpPointer : -1;\n                _AnimPause(_AddXPBar(arrPostRankXP[i].reason, arrPostRankXP[i].xp, xpToXpTrailEvent));\n            }\n            _AnimPause(2.0);\n        }\n        _AnimSequenceNext(() => {\n        }, 1);\n        let oXpShopData = MockAdapter.XPShopDataJSO(_m_cP);\n        if (oXpShopData && oXpShopData.hasOwnProperty('prematch')) {\n            const elRoot = _m_cP.FindChildTraverse('jsXpShopTrackRoot');\n            const elXpShopContainer = _m_cP.FindChildTraverse('jsXpShopTrackContainer');\n            oXpShopData.prematch.xp_tracks.forEach(function (track, idx) {\n                const elTrack = $.CreatePanel('Panel', elXpShopContainer, 'id-xpshop_track_' + idx);\n                elTrack.BLoadLayout('file://{resources}/layout/xpshop_track.xml', false, false);\n                XpShopTrack.XpShopInit({\n                    xpshop_track_frame_panel: elTrack,\n                    xpshop_track_value: track,\n                });\n            });\n            _AnimSequenceNext(() => {\n                if (elRoot && elRoot.IsValid())\n                    elRoot.AddClass('reveal');\n            }, 0.3);\n            if (oXpShopData.hasOwnProperty('postmatch')) {\n                _AnimPause(1.0);\n                _AnimSequenceNext(() => {\n                    oXpShopData.postmatch.xp_tracks.forEach(function (track, idx) {\n                        const elTrack = (elXpShopContainer && elXpShopContainer.IsValid()) ? elXpShopContainer.FindChildTraverse('id-xpshop_track_' + idx) : undefined;\n                        if (elTrack) {\n                            XpShopTrack.XpShopUpdate({\n                                xpshop_track_frame_panel: elTrack,\n                                xpshop_track_value: track,\n                            });\n                        }\n                    });\n                }, 2);\n            }\n        }\n        _m_pauseBeforeEnd += animTime;\n        return true;\n    }\n    ;\n    function Start() {\n        if (MockAdapter.GetMockData() && !MockAdapter.GetMockData().includes('RANK')) {\n            _End();\n            return;\n        }\n        if (_DisplayMe()) {\n            EndOfMatch.SwitchToPanel('eom-rank');\n            EndOfMatch.StartDisplayTimer(_m_pauseBeforeEnd);\n            $.Schedule(_m_pauseBeforeEnd, _End);\n        }\n        else {\n            _End();\n            return;\n        }\n    }\n    function _End() {\n        EndOfMatch.ShowNextPanel();\n    }\n    function Shutdown() {\n    }\n    {\n        EndOfMatch.RegisterPanelObject({\n            name: 'eom-rank',\n            Start: Start,\n            Shutdown: Shutdown\n        });\n    }\n})(EOM_Rank || (EOM_Rank = {}));\n","scripts/endofmatch-skillgroup.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"common/formattext.ts\" />\n/// <reference path=\"mock_adapter.ts\" />\n/// <reference path=\"rank_skillgroup_particles.ts\" />\n/// <reference path=\"endofmatch.ts\" />\nvar EOM_Skillgroup;\n(function (EOM_Skillgroup) {\n    let _m_pauseBeforeEnd = 1.5;\n    let _m_cP = $.GetContextPanel();\n    _m_cP.Data().m_retries = 0;\n    function _DisplayMe() {\n        if (!_m_cP || !_m_cP.IsValid())\n            return false;\n        _Reset();\n        if (!MockAdapter.bSkillgroupDataReady(_m_cP))\n            return false;\n        if (MyPersonaAPI.GetElevatedState() !== 'elevated')\n            return false;\n        let oSkillgroupData = MockAdapter.SkillgroupDataJSO(_m_cP);\n        let localPlayerUpdate = oSkillgroupData[MockAdapter.GetLocalPlayerXuid()];\n        if (!localPlayerUpdate)\n            return false;\n        const rating_mismatch = localPlayerUpdate.new_rank - localPlayerUpdate.old_rank != localPlayerUpdate.rank_change &&\n            localPlayerUpdate.old_rank != 0;\n        let oData = {\n            current_rating: localPlayerUpdate.new_rank,\n            num_wins: localPlayerUpdate.num_wins,\n            old_rating: rating_mismatch ? 0 : localPlayerUpdate.old_rank,\n            old_rating_info: '',\n            old_rating_desc: '',\n            old_image: '',\n            new_rating: localPlayerUpdate.new_rank,\n            new_rating_info: '',\n            new_rating_desc: '',\n            new_image: '',\n            rating_change: localPlayerUpdate.rank_change,\n            rating_mismatch: rating_mismatch,\n            mode: localPlayerUpdate.rank_type,\n            model: ''\n        };\n        let current_rating = Math.max(Number(oData.new_rating), Number(oData.old_rating));\n        let winsNeededForRank = SessionUtil.GetNumWinsNeededForRank(oData.mode);\n        let matchesNeeded = winsNeededForRank - oData.num_wins;\n        _m_cP.SetDialogVariable('rating_type', $.Localize('#SFUI_GameMode' + oData.mode));\n        _m_cP.SetDialogVariable('map', GameStateAPI.GetMapName());\n        if (current_rating < 1 && matchesNeeded <= 0) {\n            switch (oData.mode) {\n                case 'Wingman':\n                case 'Competitive':\n                    let modePrefix = (oData.mode === 'Wingman') ? 'wingman' : 'skillgroup';\n                    oData.old_rating_info = $.Localize('#eom-skillgroup-expired', _m_cP);\n                    oData.old_image = 'file://{images}/icons/skillgroups/' + modePrefix + '_expired.svg';\n                    break;\n                case 'Premier':\n                    oData.old_rating_info = $.Localize('#eom-skillgroup-expired', _m_cP);\n                    break;\n            }\n        }\n        else if (current_rating < 1) {\n            _m_cP.SetDialogVariableInt('winsneeded', matchesNeeded);\n            switch (oData.mode) {\n                case 'Wingman':\n                case 'Competitive':\n                    let modePrefix = (oData.mode === 'Wingman') ? 'wingman' : 'skillgroup';\n                    oData.old_rating_info = $.Localize('#eom-skillgroup-needed-wins:f', _m_cP);\n                    oData.old_image = 'file://{images}/icons/skillgroups/' + modePrefix + '0.svg';\n                    break;\n                case 'Premier':\n                    break;\n            }\n        }\n        else if (current_rating >= 1) {\n            let skillgroupDescString = '';\n            switch (oData.mode) {\n                case 'Wingman':\n                case 'Premier':\n                    skillgroupDescString = '#eom-skillgroup-name';\n                    break;\n                case 'Competitive':\n                    skillgroupDescString = '#eom-skillgroup-map-name';\n                    break;\n            }\n            switch (oData.mode) {\n                case 'Wingman':\n                case 'Competitive':\n                    let modePrefix = (oData.mode === 'Wingman') ? 'wingman' : 'skillgroup';\n                    oData.old_image = 'file://{images}/icons/skillgroups/' + modePrefix + oData.old_rating + '.svg';\n                    oData.old_rating_info = $.Localize('#RankName_' + oData.old_rating);\n                    oData.old_rating_desc = $.Localize(skillgroupDescString, _m_cP);\n                    if (oData.old_rating < oData.new_rating) {\n                        oData.new_image = 'file://{images}/icons/skillgroups/' + modePrefix + oData.new_rating + '.svg';\n                        oData.new_rating_info = $.Localize('#RankName_' + oData.new_rating);\n                        oData.new_rating_desc = $.Localize(skillgroupDescString, _m_cP);\n                        _m_pauseBeforeEnd = 3.0;\n                        _LoadAndShowNewRankReveal(oData);\n                    }\n                    break;\n                case 'Premier':\n                    if (oData.old_rating !== oData.new_rating) {\n                        _m_pauseBeforeEnd = 5.0;\n                        _LoadAndShowNewRankReveal(oData);\n                    }\n                    break;\n            }\n            _m_cP.SetHasClass('rating-mismatch', oData.rating_mismatch);\n        }\n        if (oData.mode === 'Premier') {\n            _FilloutPremierRankData(oData);\n            _m_cP.FindChildInLayoutFile('id-eom-skillgroup-premier-bg').SwitchClass('tier', RatingEmblem.GetTierColorClass(_m_cP.FindChildInLayoutFile('jsRatingEmblem')));\n        }\n        else {\n            _FilloutRankData(oData);\n        }\n        _m_cP.FindChildInLayoutFile('id-eom-skillgroup-bg').SetHasClass('hide', oData.mode === 'Premier');\n        _m_cP.FindChildInLayoutFile('id-eom-skillgroup-premier-bg').SetHasClass('hide', oData.mode !== 'Premier');\n        _m_cP.AddClass('eom-skillgroup-show');\n        return true;\n    }\n    ;\n    function _LoadAndShowNewRankReveal(oData) {\n        $.Schedule(1, () => _RevealNewIcon(oData));\n    }\n    function _RevealNewIcon(oData) {\n        if (!_m_cP || !_m_cP.IsValid())\n            return;\n        if (oData.mode === 'Competitive' || oData.mode === 'Wingman') {\n            _m_cP.FindChildInLayoutFile('id-eom-skillgroup-emblem--new__image').SetImage(oData.new_image);\n            _m_cP.FindChildInLayoutFile('id-eom-skillgroup-emblem').AddClass(\"uprank-anim\");\n            _m_cP.SetDialogVariable('rank-info', oData.new_rating_info);\n            let elParticleFlare = _m_cP.FindChildInLayoutFile('id-eom-skillgroup-emblem--new__pfx--above');\n            let aParticleSettings = RankSkillgroupParticles.GetSkillGroupSettings(oData.new_rating, oData.mode);\n            elParticleFlare.SetParticleNameAndRefresh(aParticleSettings.particleName);\n            elParticleFlare.SetControlPoint(aParticleSettings.cpNumber, aParticleSettings.cpValue[0], aParticleSettings.cpValue[1], 1);\n            elParticleFlare.StartParticles();\n            let elParticleAmb = _m_cP.FindChildInLayoutFile('id-eom-skillgroup-emblem--new__pfx--below');\n            let aParticleAmbSettings = RankSkillgroupParticles.GetSkillGroupAmbientSettings(oData.new_rating, oData.mode);\n            elParticleAmb.SetParticleNameAndRefresh(aParticleAmbSettings.particleName);\n            elParticleAmb.SetControlPoint(aParticleAmbSettings.cpNumber, aParticleAmbSettings.cpValue[0], aParticleAmbSettings.cpValue[1], 1);\n            elParticleAmb.StartParticles();\n            $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.XP.NewSkillGroup', 'MOUSE');\n        }\n        else if (oData.mode === 'Premier') {\n            let options = {\n                root_panel: _m_cP.FindChildInLayoutFile('jsRatingEmblem'),\n                leaderboard_details: { score: oData.new_rating, matchesWon: oData.num_wins },\n                do_fx: false,\n                presentation: 'digital',\n                eom_digipanel_class_override: GetEmblemStyleOverride(oData.new_rating),\n                full_details: true,\n                rating_type: \"Premier\",\n                local_player: true\n            };\n            let winLossStyle = GetWinLossStyle(oData);\n            _m_cP.FindChildInLayoutFile('jsRatingEmblem').SwitchClass('winloss', winLossStyle + '-anim');\n            PremierRankText(oData);\n            SpeedLinesAnim(winLossStyle);\n            RatingEmblemAnim(oData, options, winLossStyle);\n        }\n    }\n    function _Reset() {\n        let elDesc = _m_cP.FindChildInLayoutFile(\"id-eom-skillgroup__current_wins_desc\");\n        elDesc.text = '';\n        _m_cP.SetDialogVariable('total-wins', '');\n        _m_cP.SetDialogVariable('rank-info', '');\n        let elRankDesc = _m_cP.FindChildInLayoutFile(\"id-eom-skillgroup__current__title\");\n        elRankDesc.AddClass('hidden');\n        elRankDesc.text = '';\n        let elImage = _m_cP.FindChildInLayoutFile(\"id-eom-skillgroup-emblem--current__image\");\n        elImage.AddClass('hidden');\n        elImage.SetImage('');\n        _m_cP.FindChildInLayoutFile('id-eom-skillgroup-emblem--new__image').SetImage('');\n        _m_cP.FindChildInLayoutFile('id-eom-skillgroup-emblem').RemoveClass(\"uprank-anim\");\n        _m_cP.RemoveClass('eom-skillgroup-show');\n        let elParticleFlare = _m_cP.FindChildInLayoutFile('id-eom-skillgroup-emblem--new__pfx--above');\n        elParticleFlare.StopParticlesImmediately(true);\n        let elParticleAmb = _m_cP.FindChildInLayoutFile('id-eom-skillgroup-emblem--new__pfx--below');\n        elParticleAmb.StopParticlesImmediately(true);\n        _m_cP.RemoveClass('rating-mismatch');\n    }\n    function _FilloutRankData(oData) {\n        SetWinDescString(oData, _m_cP.FindChildInLayoutFile(\"id-eom-skillgroup__current_wins_desc\"));\n        _m_cP.SetDialogVariable('total-wins', oData.num_wins.toString());\n        _m_cP.SetDialogVariable('rank-info', oData.old_rating_info);\n        let elRankDesc = _m_cP.FindChildInLayoutFile(\"id-eom-skillgroup__current__title\");\n        if (oData.old_rating_desc) {\n            elRankDesc.RemoveClass('hidden');\n            elRankDesc.text = oData.old_rating_desc;\n        }\n        if (oData.mode === 'Competitive' || oData.mode === 'Wingman') {\n            let elImage = _m_cP.FindChildInLayoutFile(\"id-eom-skillgroup-emblem--current__image\");\n            elImage.RemoveClass('hidden');\n            elImage.SetImage(oData.old_image);\n            let elParticleFlare = _m_cP.FindChildInLayoutFile('id-eom-skillgroup--current__pfx--above');\n            let aParticleSettings = RankSkillgroupParticles.GetSkillGroupSettings(oData.old_rating, oData.mode);\n            elParticleFlare.SetParticleNameAndRefresh(aParticleSettings.particleName);\n            elParticleFlare.SetControlPoint(aParticleSettings.cpNumber, aParticleSettings.cpValue[0], aParticleSettings.cpValue[1], 0);\n            elParticleFlare.StartParticles();\n            let elParticleAmb = _m_cP.FindChildInLayoutFile('id-eom-skillgroup--current__pfx--below');\n            let aParticleAmbSettings = RankSkillgroupParticles.GetSkillGroupAmbientSettings(oData.old_rating, oData.mode);\n            elParticleAmb.SetParticleNameAndRefresh(aParticleAmbSettings.particleName);\n            elParticleAmb.SetControlPoint(aParticleAmbSettings.cpNumber, aParticleAmbSettings.cpValue[0], aParticleAmbSettings.cpValue[1], 0);\n            elParticleAmb.StartParticles();\n        }\n    }\n    function GetEmblemStyleOverride(new_rating) {\n        return new_rating < 1000 ? 'digitpanel-container-3-digit-offset' : new_rating < 10000 ? 'digitpanel-container-4-digit-offset' : '';\n    }\n    function _FilloutPremierRankData(oData) {\n        const options = {\n            root_panel: _m_cP.FindChildInLayoutFile('jsRatingEmblem'),\n            leaderboard_details: { score: oData.old_rating, matchesWon: oData.num_wins },\n            do_fx: false,\n            rating_type: oData.mode,\n            presentation: 'digital',\n            eom_digipanel_class_override: GetEmblemStyleOverride(oData.old_rating),\n            full_details: true,\n            local_player: true\n        };\n        if (oData.rating_change === 0) {\n            RatingEmblem.SetXuid(options);\n            let winLossStyle = GetWinLossStyle(oData);\n            _m_cP.FindChildInLayoutFile('jsRatingEmblem').SwitchClass('winloss', winLossStyle + '-anim');\n            PremierRankText(oData);\n            SpeedLinesAnim(winLossStyle);\n            RatingEmblemAnim(oData, options, winLossStyle);\n            return;\n        }\n        RatingEmblem.SetXuid(options);\n    }\n    function PremierRankText(oData) {\n        SetWinDescString(oData, _m_cP.FindChildInLayoutFile(\"id-eom-skillgroup-premier-wins-desc\"));\n        _m_cP.SetDialogVariable('total-wins', oData.num_wins.toString());\n        let desc;\n        let nPoints;\n        if (oData.new_rating > 0 && oData.old_rating < 1) {\n            desc = $.Localize('#cs_rating_rating_established');\n            nPoints = 0;\n        }\n        else {\n            desc = RatingEmblem.GetEomDescText(_m_cP.FindChildInLayoutFile('jsRatingEmblem'));\n            nPoints = Math.abs(oData.rating_change);\n        }\n        if (oData.rating_mismatch) {\n            _m_cP.SetDialogVariable('premier-desc', $.Localize('#cs_rating_mismatch'));\n        }\n        else if (desc && desc !== '') {\n            _m_cP.SetDialogVariable('premier-desc', desc);\n        }\n        _m_cP.FindChildInLayoutFile('id-eom-skillgroup-premier-desc').SetHasClass('hide', desc === '' || !desc);\n        let sPointsString = '';\n        sPointsString = oData.new_rating >= oData.old_rating ? \"#eom-premier-points-gained\" : \"#eom-premier-points-lost\";\n        _m_cP.SetDialogVariableInt('premier_points', nPoints);\n        _m_cP.FindChildInLayoutFile('id-eom-skillgroup-premier-points').text = $.Localize(sPointsString, _m_cP);\n    }\n    function GetWinLossStyle(oData) {\n        let winLossStyle = ((oData.new_rating === 0) || (oData.new_rating > 0 && oData.old_rating < 1) || !oData.rating_change) ?\n            'no-points' : oData.rating_change < 0 ?\n            'lost-points' : oData.rating_change > 0 ?\n            'gain-points' : '';\n        return winLossStyle;\n    }\n    function SpeedLinesAnim(winLossStyle) {\n        $.DispatchEvent('CSGOPlaySoundEffect', 'UI.Premier.EOM.SlideIn', 'MOUSE');\n        $.Schedule(.25, () => {\n            if (!_m_cP || !_m_cP.IsValid())\n                return;\n            let speedLines = _m_cP.FindChildInLayoutFile('id-eom-premier-speed-lines');\n            if (speedLines && speedLines.IsValid()) {\n                speedLines.SetMovie(\"file://{resources}/videos/speed_lines.webm\");\n                speedLines.SwitchClass('winloss', winLossStyle);\n                speedLines.SetControls('none');\n                speedLines.Play();\n            }\n        });\n    }\n    function RatingEmblemAnim(oData, options, winLossStyle) {\n        PlayPremierRankSound(winLossStyle);\n        $.Schedule(.75, () => {\n            if (!elPanel || !elPanel.IsValid() || !options.root_panel || !options.root_panel.IsValid())\n                return;\n            RatingEmblem.SetXuid(options);\n            PremierRankText(oData);\n            elPanel.SwitchClass('tier', RatingEmblem.GetTierColorClass(_m_cP.FindChildInLayoutFile('jsRatingEmblem')));\n        });\n        let elPanel = _m_cP.FindChildInLayoutFile('id-eom-skillgroup-premier-bg');\n        elPanel.SwitchClass('winloss', winLossStyle);\n    }\n    function PlayPremierRankSound(winLossStyle) {\n        if (winLossStyle === 'no-points') {\n            $.DispatchEvent('CSGOPlaySoundEffect', 'UI.Premier.EOM.RankNeutral', 'MOUSE');\n        }\n        else if (winLossStyle === 'lost-points') {\n            $.DispatchEvent('CSGOPlaySoundEffect', 'UI.Premier.EOM.RankDown', 'MOUSE');\n        }\n        else {\n            $.DispatchEvent('CSGOPlaySoundEffect', 'UI.Premier.EOM.RankUp', 'MOUSE');\n        }\n    }\n    function SetWinDescString(oData, elLabel) {\n        elLabel.SetDialogVariableInt(\"matcheswon\", oData.num_wins);\n        switch (oData.mode) {\n            case 'Competitive':\n                elLabel.text = $.Localize('#eom-skillgroup-map-win:f', elLabel);\n                break;\n            case 'Wingman':\n            case 'Premier':\n                elLabel.text = $.Localize('#eom-skillgroup-win:f', elLabel);\n                break;\n        }\n    }\n    function Start() {\n        if (_DisplayMe()) {\n            EndOfMatch.SwitchToPanel('eom-skillgroup');\n            EndOfMatch.StartDisplayTimer(_m_pauseBeforeEnd);\n            $.Schedule(_m_pauseBeforeEnd, _End);\n        }\n        else {\n            _End();\n            return;\n        }\n    }\n    function _End() {\n        EndOfMatch.ShowNextPanel();\n    }\n    function Shutdown() {\n    }\n    {\n        EndOfMatch.RegisterPanelObject({\n            name: 'eom-skillgroup',\n            Start: Start,\n            Shutdown: Shutdown\n        });\n    }\n})(EOM_Skillgroup || (EOM_Skillgroup = {}));\n","scripts/endofmatch-voting.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"common/formattext.ts\" />\n/// <reference path=\"mock_adapter.ts\" />\n/// <reference path=\"endofmatch.ts\" />\nvar EOM_Voting;\n(function (EOM_Voting) {\n    const _m_cP = $('#eom-voting');\n    const _m_elVoteItemPanels = {};\n    let _m_updateJob = undefined;\n    let m_randIdx = 0;\n    function _DisplayMe() {\n        if (!_m_cP || !_m_cP.IsValid())\n            return;\n        if (GameStateAPI.IsDemoOrHltv())\n            return false;\n        const oTime = MockAdapter.GetTimeDataJSO();\n        if (!oTime)\n            return false;\n        $.RegisterForUnhandledEvent('EndOfMatch_Shutdown', _CancelUpdateJob);\n        const oMatchEndVoteData = MockAdapter.NextMatchVotingData(_m_cP);\n        $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.submenu_leveloptions_slidein', 'MOUSE');\n        if (!oMatchEndVoteData || !oMatchEndVoteData.voting_options)\n            return false;\n        const elMapSelectionList = _m_cP.FindChildInLayoutFile('id-map-selection-list');\n        Object.keys(oMatchEndVoteData.voting_options).forEach((key, index) => {\n            const type = oMatchEndVoteData.voting_options[key].type;\n            if (type == \"separator\") {\n                const elVoteItem = $.CreatePanel(\"Panel\", elMapSelectionList, \"\");\n                elVoteItem.AddClass(\"vote-item--separator\");\n            }\n            else {\n                let text = '';\n                const elVoteItem = $.CreatePanel(\"RadioButton\", elMapSelectionList, \"id-vote-item--\" + key);\n                elVoteItem.BLoadLayoutSnippet(\"MapGroupSelection\");\n                elVoteItem.Data().m_key = key;\n                if (type == \"skirmish\") {\n                    const skirmishId = oMatchEndVoteData.voting_options[key].id;\n                    text = $.Localize(GameTypesAPI.GetSkirmishName(skirmishId));\n                    const cfg = GameTypesAPI.GetConfig();\n                    if (cfg) {\n                        const mg = cfg.mapgroups['mg_skirmish_' + GameTypesAPI.GetSkirmishInternalName(skirmishId)];\n                        if (mg) {\n                            Object.keys(mg.maps).forEach((map, i) => {\n                                const elMapImage = $.CreatePanel('Panel', elVoteItem.FindChildInLayoutFile('MapGroupImagesCarousel'), 'MapSelectionScreenshot' + i);\n                                elMapImage.AddClass('map-selection-btn__screenshot');\n                                const image = 'url(\"file://{images}/map_icons/screenshots/360p/' + map + '.png\")';\n                                if (map in cfg.maps) {\n                                    elMapImage.style.backgroundImage = image;\n                                    elMapImage.style.backgroundPosition = '50% 0%';\n                                    elMapImage.style.backgroundSize = 'auto 100%';\n                                }\n                            });\n                        }\n                    }\n                    const elMapIcon = elVoteItem.FindChildInLayoutFile(\"id-map-selection-btn__modeicon\");\n                    const modeIcon = \"file://{images}/icons/ui/\" + GameTypesAPI.GetSkrimishIcon(skirmishId) + \".svg\";\n                    elMapIcon.SetImage(modeIcon);\n                    elMapIcon.RemoveClass('hidden');\n                }\n                else if (type == \"map\") {\n                    const internalName = oMatchEndVoteData.voting_options[key].name;\n                    text = GameTypesAPI.GetFriendlyMapName(internalName);\n                    let image;\n                    const elMapImage = $.CreatePanel('Panel', elVoteItem.FindChildInLayoutFile('MapGroupImagesCarousel'), 'MapSelectionScreenshot');\n                    elMapImage.AddClass('map-selection-btn__screenshot');\n                    const cfg = GameTypesAPI.GetConfig();\n                    if (cfg && ('maps' in cfg) && (internalName in cfg.maps)) {\n                        image = 'url(\"file://{images}/map_icons/screenshots/360p/' + internalName + '.png\")';\n                    }\n                    else {\n                        image = 'url(\"file://{images}/map_icons/screenshots/360p/random.png\")';\n                    }\n                    elMapImage.style.backgroundImage = image;\n                    elMapImage.style.backgroundPosition = '50% 0%';\n                    elMapImage.style.backgroundSize = 'auto 100%';\n                }\n                elVoteItem.FindChildTraverse(\"MapGroupName\").text = text;\n                elVoteItem.Data().m_name = text;\n                elVoteItem.SetPanelEvent('onactivate', () => {\n                    GameInterfaceAPI.ConsoleCommand(\"endmatch_votenextmap\" + \" \" + elVoteItem.Data().m_key);\n                    elMapSelectionList.FindChildrenWithClassTraverse(\"map-selection-btn\").forEach(btn => btn.enabled = false);\n                    $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.submenu_leveloptions_select', 'MOUSE');\n                });\n                _m_elVoteItemPanels[index] = elVoteItem;\n            }\n        });\n        _UpdateVotes();\n        return true;\n    }\n    function _UpdateVotes() {\n        _m_updateJob = undefined;\n        if (!_m_cP || !_m_cP.IsValid())\n            return;\n        const oMatchEndVoteData = MockAdapter.NextMatchVotingData(_m_cP);\n        if (!oMatchEndVoteData) {\n            return;\n        }\n        function _GetWinningMaps() {\n            let arrVoteWinnersKeys = [];\n            let highestVote = 0;\n            for (let key of Object.keys(oMatchEndVoteData.voting_options)) {\n                const nVotes = oMatchEndVoteData.voting_options[key].votes;\n                if (nVotes > highestVote)\n                    highestVote = nVotes;\n            }\n            for (let key of Object.keys(oMatchEndVoteData.voting_options)) {\n                const nVotes = oMatchEndVoteData.voting_options[key].votes;\n                if ((nVotes === highestVote) &&\n                    (oMatchEndVoteData.voting_options[key].type != 'separator'))\n                    arrVoteWinnersKeys.push(key);\n            }\n            return arrVoteWinnersKeys;\n        }\n        if (oMatchEndVoteData) {\n            if (oMatchEndVoteData.voting_done) {\n                const elMapSelectionList = _m_cP.FindChildInLayoutFile('id-map-selection-list');\n                elMapSelectionList.FindChildrenWithClassTraverse(\"map-selection-btn\").forEach(btn => btn.enabled = false);\n                const winner = oMatchEndVoteData[\"voting_winner\"];\n                if (winner !== -1) {\n                    let winningKey = '';\n                    for (let key of Object.keys(_m_elVoteItemPanels)) {\n                        if (_m_elVoteItemPanels[key].Data().m_key == winner)\n                            winningKey = key;\n                    }\n                    if (winningKey != '' && _m_elVoteItemPanels[winningKey]) {\n                        const elCheckmark = _m_elVoteItemPanels[winningKey].FindChildTraverse('id-map-selection-btn__winner');\n                        if (!elCheckmark.BHasClass('appear')) {\n                            elCheckmark.AddClass(\"appear\");\n                            $.DispatchEvent('CSGOPlaySoundEffect', 'mainmenu_press_GO', 'MOUSE');\n                        }\n                    }\n                }\n                else {\n                    const arrWinners = _GetWinningMaps();\n                    if (arrWinners.length == 0)\n                        return;\n                    if (arrWinners.length == 1) {\n                        return;\n                    }\n                    let randIdx = 0;\n                    if (arrWinners.length > 2) {\n                        randIdx = Math.floor(Math.random() * arrWinners.length);\n                    }\n                    if (randIdx == m_randIdx) {\n                        m_randIdx++;\n                        if (m_randIdx >= arrWinners.length) {\n                            m_randIdx = 0;\n                        }\n                    }\n                    else {\n                        m_randIdx = randIdx;\n                    }\n                    const voteidx = arrWinners[m_randIdx];\n                    const elVoteItem = _m_elVoteItemPanels[voteidx];\n                    if (!elVoteItem || !elVoteItem.IsValid())\n                        return;\n                    const panelToHilite = elVoteItem.FindChildTraverse(\"id-map-selection-btn__gradient\");\n                    if (!panelToHilite || !panelToHilite.IsValid())\n                        return;\n                    panelToHilite.RemoveClass(\"map-selection-btn__gradient--whiteout\");\n                    panelToHilite.AddClass(\"map-selection-btn__gradient--whiteout\");\n                    $.DispatchEvent('CSGOPlaySoundEffect', 'buymenu_select', elVoteItem.id);\n                }\n            }\n            else {\n                for (let key of Object.keys(_m_elVoteItemPanels)) {\n                    const elVoteItem = _m_elVoteItemPanels[key];\n                    const oVoteOptions = oMatchEndVoteData.voting_options[_m_elVoteItemPanels[key].Data().m_key];\n                    const elVoteCountLabel = elVoteItem.FindChildTraverse(\"id-map-selection-btn__count\");\n                    const votes = oVoteOptions.votes;\n                    const votesNeeded = oMatchEndVoteData[\"votes_to_succeed\"];\n                    if (votes > 0 && votes !== elVoteCountLabel.Data().votecount) {\n                        $.DispatchEvent('CSGOPlaySoundEffect', 'tab_settings_settings', elVoteItem.id);\n                        elVoteCountLabel.Data().votecount = votes;\n                    }\n                    elVoteCountLabel.text = \"<font color='#ffc130'>\" + votes + '</font>/' + votesNeeded;\n                }\n            }\n            _m_updateJob = $.Schedule(0.2, _UpdateVotes);\n        }\n    }\n    function Start() {\n        if (MockAdapter.GetMockData() && !MockAdapter.GetMockData().includes('VOTING')) {\n            _End();\n            return;\n        }\n        if (_DisplayMe()) {\n            EndOfMatch.SwitchToPanel('eom-voting');\n        }\n        else {\n            _End();\n        }\n    }\n    function _End() {\n        _CancelUpdateJob();\n        EndOfMatch.ShowNextPanel();\n    }\n    function _CancelUpdateJob() {\n        if (_m_updateJob != undefined) {\n            $.CancelScheduled(_m_updateJob);\n            _m_updateJob = undefined;\n        }\n    }\n    function Shutdown() {\n    }\n    {\n        EndOfMatch.RegisterPanelObject({\n            name: 'eom-voting',\n            Start: Start,\n            Shutdown: Shutdown\n        });\n    }\n})(EOM_Voting || (EOM_Voting = {}));\n","scripts/endofmatch-win.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"common/formattext.ts\" />\n/// <reference path=\"mock_adapter.ts\" />\n/// <reference path=\"endofmatch.ts\" />\nvar EOM_Win;\n(function (EOM_Win) {\n    const _m_pauseBeforeEnd = 5.0;\n    const _m_cP = $.GetContextPanel();\n    let _m_oMatchEndData = undefined;\n    let _m_oScoreData = undefined;\n    const _m_nT = 2;\n    function _SetVictoryStatement() {\n        if (!_m_cP || !_m_cP.IsValid())\n            return;\n        if (!_m_oMatchEndData)\n            return;\n        if (!_m_oScoreData)\n            return;\n        const winningTeamNumber = _m_oMatchEndData.winning_team_number;\n        let result = \"#eom-result-tie3\";\n        const teamT = _m_oScoreData.teamdata.find(td => td.team_name === \"TERRORIST\");\n        const teamCT = _m_oScoreData.teamdata.find(td => td.team_name === \"CT\");\n        let localPlayerTeamScore = teamT.score;\n        let otherTeamNumber = teamCT.score;\n        _m_cP.RemoveClass('eom-win_won');\n        _m_cP.RemoveClass('eom-win_lost');\n        _m_cP.SetDialogVariable(\"teamname\", \"\");\n        if (winningTeamNumber) {\n            const localPlayerTeamNumber = MockAdapter.GetPlayerTeamNumber(MockAdapter.GetLocalPlayerXuid());\n            const mode = EOM_Characters.GetModeForEndOfMatchPurposes();\n            const bForceShowWinningTeam = EOM_Characters.ShowWinningTeam(mode);\n            if (GameStateAPI.IsDemoOrHltv() || (localPlayerTeamNumber != 2 && localPlayerTeamNumber != 3) || bForceShowWinningTeam) {\n                localPlayerTeamScore = winningTeamNumber == _m_nT ? teamT.score : teamCT.score;\n                otherTeamNumber = winningTeamNumber == _m_nT ? teamCT.score : teamT.score;\n                result = \"#eom-result-win3\";\n                _m_cP.SetHasClass('eom-win_won', true);\n            }\n            else {\n                localPlayerTeamScore = localPlayerTeamNumber == _m_nT ? teamT.score : teamCT.score;\n                otherTeamNumber = localPlayerTeamNumber == _m_nT ? teamCT.score : teamT.score;\n                result = winningTeamNumber == localPlayerTeamNumber ? \"#eom-result-win3\" : \"#eom-result-loss3\";\n                _m_cP.SetHasClass('eom-win_won', winningTeamNumber == localPlayerTeamNumber);\n                _m_cP.SetHasClass('eom-win_lost', winningTeamNumber != localPlayerTeamNumber);\n            }\n        }\n        if (_m_oMatchEndData.hasOwnProperty('match_cancelled') && _m_oMatchEndData.match_cancelled) {\n            _m_cP.SetHasClass('eom-win_won', false);\n            _m_cP.SetHasClass('eom-win_lost', false);\n            result = '#SFUI_match_cancelled';\n        }\n        if (_m_oMatchEndData.hasOwnProperty('cancel_reason_code') && _m_oMatchEndData.cancel_reason_code) {\n            _ShowMatchCancelledEarlyWithReasonExplanation(_m_oMatchEndData.cancel_reason_code);\n        }\n        _m_cP.SetDialogVariable(\"win-result\", $.Localize(result));\n        _m_cP.SetDialogVariableInt(\"score_local_player\", localPlayerTeamScore);\n        _m_cP.SetDialogVariableInt(\"score_other\", otherTeamNumber);\n        _AnimStart();\n    }\n    function _AnimStart() {\n        const elPanel = $.GetContextPanel().FindChildTraverse('WinTeam');\n        elPanel.TriggerClass('show');\n    }\n    function _ShowMatchCancelledEarlyWithReasonExplanation(cancel_reason_code) {\n        const elPanel = $.GetContextPanel().FindChildTraverse('EomCancelReason' + cancel_reason_code);\n        if (elPanel) {\n            elPanel.AddClass('show');\n        }\n    }\n    function _DisplayMe() {\n        _m_oMatchEndData = MockAdapter.GetMatchEndWinDataJSO();\n        _m_oScoreData = MockAdapter.GetScoreDataJSO();\n        if (!_m_oMatchEndData)\n            return false;\n        if (!_m_oScoreData ||\n            !_m_oScoreData.teamdata.some(td => td.team_name === \"CT\") ||\n            !_m_oScoreData.teamdata.some(td => td.team_name === \"TERRORIST\"))\n            return false;\n        if (_m_oMatchEndData.hasOwnProperty('winning_player'))\n            return false;\n        if (GameStateAPI.GetGameModeInternalName(false) == 'deathmatch')\n            return false;\n        _SetVictoryStatement();\n        return true;\n    }\n    function Start() {\n        if (MockAdapter.GetMockData() && !MockAdapter.GetMockData().includes('EOM_WIN')) {\n            _End();\n            return;\n        }\n        if (_DisplayMe()) {\n            EndOfMatch.SwitchToPanel('eom-win');\n            EndOfMatch.StartDisplayTimer(_m_pauseBeforeEnd);\n            $.Schedule(_m_pauseBeforeEnd, _End);\n        }\n        else {\n            _End();\n            return;\n        }\n    }\n    function _End() {\n        EndOfMatch.ShowNextPanel();\n    }\n    function Shutdown() {\n    }\n    {\n        EndOfMatch.RegisterPanelObject({\n            name: 'eom-win',\n            Start: Start,\n            Shutdown: Shutdown\n        });\n    }\n})(EOM_Win || (EOM_Win = {}));\n","scripts/endofmatch.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"common/formattext.ts\" />\n/// <reference path=\"common/gamerules_constants.ts\" />\n/// <reference path=\"endofmatch-characters.ts\" />\n/// <reference path=\"mock_adapter.ts\" />\nvar EndOfMatch;\n(function (EndOfMatch) {\n    const _m_cP = $('#EndOfMatch');\n    const _m_data = {\n        _m_arrPanelObjects: [],\n        _m_currentPanelIndex: -1,\n        _m_jobStart: null,\n        _m_elActiveTab: null,\n        _m_scoreboardVisible: false,\n    };\n    $.RegisterEventHandler(\"EndOfMatch_Show\", _m_cP, _Start);\n    $.RegisterForUnhandledEvent(\"EndOfMatch_Shutdown\", _Shutdown);\n    _m_cP.AddClass('scoreboard-visible');\n    function _NavigateToTab(tab) {\n        if (_m_data._m_elActiveTab && _m_data._m_elActiveTab.IsValid()) {\n            _m_data._m_elActiveTab.RemoveClass('eom-panel--active');\n        }\n        _m_data._m_elActiveTab = _m_cP.FindChildTraverse(tab);\n        if (_m_data._m_elActiveTab) {\n            _m_data._m_elActiveTab.AddClass('eom-panel--active');\n        }\n    }\n    function SwitchToPanel(tab) {\n        _m_cP.FindChildTraverse('rb--' + tab).RemoveClass(\"hidden\");\n        _m_cP.FindChildTraverse('rb--' + tab).checked = true;\n        _NavigateToTab(tab);\n    }\n    EndOfMatch.SwitchToPanel = SwitchToPanel;\n    function RegisterPanelObject(panel) {\n        _m_data._m_arrPanelObjects.push(panel);\n    }\n    EndOfMatch.RegisterPanelObject = RegisterPanelObject;\n    function _Initialize() {\n        _m_cP.SetMouseCapture(true);\n        for (var j = 1; j < 10; ++j) {\n            var elPanel = $.GetContextPanel().FindChildTraverse('EomCancelReason' + j);\n            if (elPanel)\n                elPanel.RemoveClass('show');\n        }\n        $.Schedule(1, () => { $.DispatchEvent(\"EndOfMatch_Latch\"); });\n        _m_data._m_arrPanelObjects = [];\n        _m_data._m_currentPanelIndex = -1;\n        _m_data._m_elActiveTab = null;\n        if (_m_data._m_jobStart !== null) {\n            $.CancelScheduled(_m_data._m_jobStart);\n            _m_data._m_jobStart = null;\n        }\n        var mode = MockAdapter.GetGameModeInternalName(false);\n        _m_data._m_scoreboardVisible = (mode == \"cooperative\") || (mode == \"coopmission\");\n        var elLayout = _m_cP.FindChildTraverse(\"id-eom-layout\");\n        elLayout.RemoveAndDeleteChildren();\n        let strEomLayoutSnippet = \"snippet-eom-layout--default\";\n        if (mode == \"premier\") {\n            strEomLayoutSnippet = \"snippet-eom-layout--premier\";\n        }\n        elLayout.BLoadLayoutSnippet(strEomLayoutSnippet);\n        let elProgBar = _m_cP.FindChildTraverse(\"id-display-timer-progress-bar\");\n        elProgBar.style.transitionDuration = \"0s\";\n        elProgBar.style.width = '0%';\n        var bind = GameInterfaceAPI.GetSettingString(\"cl_scoreboard_mouse_enable_binding\");\n        if (bind.charAt(0) == '+' || bind.charAt(0) == '-')\n            bind = bind.substring(1);\n        bind = \"{s:bind_\" + bind + \"}\";\n        bind = $.Localize(bind, _m_cP);\n        _m_cP.SetDialogVariable(\"scoreboard_toggle_bind\", bind);\n        _m_cP.FindChildrenWithClassTraverse(\"timer\").forEach(el => el.active = false);\n        var elNavBar = _m_cP.FindChildTraverse(\"id-content-navbar__tabs\");\n        elNavBar.RemoveAndDeleteChildren();\n        _m_cP.FindChildrenWithClassTraverse(\"eom-panel\").forEach((elPanel, i) => {\n            var elRBtn = $.CreatePanel(\"RadioButton\", elNavBar, \"rb--\" + elPanel.id);\n            elRBtn.BLoadLayoutSnippet(\"snippet_navbar-button\");\n            elRBtn.AddClass(\"navbar-button\");\n            elRBtn.AddClass(\"appear\");\n            let tabName = elPanel.id;\n            elRBtn.SetPanelEvent('onactivate', () => _NavigateToTab(tabName));\n            elRBtn.FindChildTraverse(\"id-navbar-button__label\").text = $.Localize(\"#\" + elPanel.id);\n        });\n    }\n    function _ShowPanelStart() {\n        if (!_m_cP || !_m_cP.IsValid())\n            return;\n        _m_cP.AddClass(\"eom--reveal\");\n        const elFade = $(\"#id-eom-fade\");\n        elFade.AddClass(\"active\");\n        let elFallbackBackground = $(\"#id-eom-fallback-background\");\n        elFallbackBackground.AddClass(\"hidden\");\n        var elBackgroundImage = _m_cP.FindChildInLayoutFile('BackgroundMapImage');\n        elBackgroundImage.SetImage('file://{images}/map_icons/screenshots/1080p/' + GameStateAPI.GetMapBSPName() + '.png');\n        $.Schedule(0.5, () => {\n            _m_cP.SetWantsCamera(true);\n            if (_m_cP.FindChildTraverse('id-eom-characters-root')) {\n                EOM_Characters.Start();\n            }\n            elFade.RemoveClass(\"active\");\n            if (_m_cP.IsInFallbackMode()) {\n                elFallbackBackground.RemoveClass(\"hidden\");\n            }\n        });\n    }\n    function _Start(bHardCut) {\n        _Initialize();\n        if (bHardCut) {\n            _m_data._m_jobStart = $.Schedule(0.0, () => {\n                _m_data._m_jobStart = null;\n                _ShowPanelStart();\n                ShowNextPanel();\n            });\n        }\n        else {\n            _m_data._m_jobStart = $.Schedule(0.0, () => {\n                _m_data._m_jobStart = null;\n                _ShowPanelStart();\n                $.Schedule(1.25, ShowNextPanel);\n            });\n        }\n    }\n    function _StartTestShow(mockData) {\n        MockAdapter.SetMockData(mockData);\n        $.DispatchEvent(\"Scoreboard_ResetAndInit\");\n        $.DispatchEvent(\"OnOpenScoreboard\");\n        _m_cP.SetMouseCapture(false);\n        _Initialize();\n        _ShowPanelStart();\n        $.Schedule(1.25, ShowNextPanel);\n    }\n    function StartDisplayTimer(time) {\n        var elProgBar = _m_cP.FindChildTraverse(\"id-display-timer-progress-bar\");\n        $.Schedule(0.0, () => {\n            if (elProgBar && elProgBar.IsValid()) {\n                elProgBar.style.transitionDuration = \"0s\";\n                elProgBar.style.width = '0%';\n            }\n        });\n        $.Schedule(0.0, () => {\n            if (elProgBar && elProgBar.IsValid()) {\n                elProgBar.style.transitionDuration = time + \"s\";\n                elProgBar.style.width = '100%';\n            }\n        });\n    }\n    EndOfMatch.StartDisplayTimer = StartDisplayTimer;\n    function ShowNextPanel() {\n        _m_data._m_currentPanelIndex++;\n        if (_m_data._m_currentPanelIndex < _m_data._m_arrPanelObjects.length) {\n            if (_m_data._m_currentPanelIndex === (_m_data._m_arrPanelObjects.length - 1) &&\n                !GameStateAPI.IsDemoOrHltv() &&\n                !GameStateAPI.IsQueuedMatchmaking()) {\n                _m_cP.FindChildrenWithClassTraverse(\"timer\").forEach(el => el.active = true);\n            }\n            _m_data._m_arrPanelObjects[_m_data._m_currentPanelIndex].Start();\n        }\n    }\n    EndOfMatch.ShowNextPanel = ShowNextPanel;\n    function _Shutdown() {\n        if (_m_data._m_jobStart) {\n            $.CancelScheduled(_m_data._m_jobStart);\n            _m_data._m_jobStart = null;\n        }\n        var elLayout = _m_cP.FindChildTraverse(\"id-eom-layout\");\n        elLayout.RemoveAndDeleteChildren();\n        for (const panelObject of _m_data._m_arrPanelObjects) {\n            if (panelObject.Shutdown)\n                panelObject.Shutdown();\n        }\n        _m_cP.RemoveClass(\"eom--reveal\");\n        if (_m_cP.FindChildTraverse('id-eom-characters-root')) {\n            EOM_Characters.Shutdown();\n        }\n        _m_cP.SetWantsCamera(false);\n    }\n})(EndOfMatch || (EndOfMatch = {}));\n","scripts/friendlobby.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"rating_emblem.ts\" />\n/// <reference path=\"common/commonutil.ts\" />\nvar friendLobby;\n(function (friendLobby) {\n    let _m_xuid = '';\n    let _m_isInPopup = false;\n    function Init(elTile) {\n        const _m_isPerfectWorld = MyPersonaAPI.GetLauncherType() === \"perfectworld\" ? true : false;\n        _m_xuid = elTile.GetAttributeString('xuid', '(not found)');\n        if (_m_xuid === '(not found)') {\n            return;\n        }\n        _m_isInPopup = elTile.GetAttributeString('showinpopup', 'false') === 'true' ? true : false;\n        let lobbyType = PartyBrowserAPI.GetPartyType(_m_xuid);\n        let gameMode = PartyBrowserAPI.GetPartySessionSetting(_m_xuid, 'game/mode');\n        elTile.SetHasClass('playerforhire', (lobbyType === 'nearby'));\n        _SetLobbyLeaderNameAvatar(elTile, lobbyType);\n        _SetGroupNameLink(elTile, lobbyType);\n        _SetPrime(elTile);\n        if (!_m_isPerfectWorld) {\n            _SetRegion(elTile);\n        }\n        _SetSkillGroup(elTile, gameMode);\n        _SetLobbySettings(elTile, gameMode);\n        _SetLobbyPlayerSlots(elTile, gameMode, lobbyType);\n        _SetUpJoinBtn(elTile, lobbyType);\n        _SetUpLobbiesPopupBtn(elTile);\n        _SetDismissButton(elTile, lobbyType);\n        elTile.SetHasClass('friendlobby--is-in-popup', _m_isInPopup);\n    }\n    friendLobby.Init = Init;\n    function _SetLobbyLeaderNameAvatar(elTile, lobbyType) {\n        let xuidLobbyLeader = PartyBrowserAPI.GetPartyMemberXuid(_m_xuid, 0);\n        let rawName = FriendsListAPI.GetFriendName(xuidLobbyLeader);\n        elTile.SetDialogVariable('friendname', rawName);\n        let nameString = (lobbyType === 'invited') ? '#tooltip_friend_invited_you' : \"#tooltip_lobby_leader_name\";\n        elTile.FindChildTraverse('JsFriendLobbyLeaderName').text = nameString;\n        elTile.FindChildTraverse('JsFriendLobbyLeaderAvatar').PopulateFromSteamID(xuidLobbyLeader);\n        elTile.FindChildTraverse('JsFriendLobbyLeaderBtn').SetPanelEvent('onactivate', () => _OpenContextMenu(xuidLobbyLeader));\n    }\n    function _SetPrime(elTile) {\n        let primeValue = PartyBrowserAPI.GetPartySessionSetting(_m_xuid, 'game/apr');\n        elTile.FindChildTraverse('JsFriendLobbyPrime').visible = (primeValue && primeValue != '0') ? true : false;\n    }\n    function _SetRegion(elTile) {\n        let countryCode = PartyBrowserAPI.GetPartySessionSetting(_m_xuid, 'game/loc');\n        CommonUtil.SetRegionOnLabel(countryCode, elTile);\n    }\n    function _SetSkillGroup(elTile, gameMode) {\n        let szSkillGroupType = \"Competitive\";\n        if (gameMode === 'scrimcomp2v2') {\n            szSkillGroupType = 'Wingman';\n        }\n        else {\n            szSkillGroupType = 'Premier';\n        }\n        let score = Number(PartyBrowserAPI.GetPartySessionSetting(_m_xuid, 'game/ark'));\n        score = Math.floor(score / 10);\n        const options = {\n            root_panel: elTile.FindChildTraverse('jsRatingEmblem'),\n            do_fx: true,\n            full_details: false,\n            rating_type: szSkillGroupType,\n            leaderboard_details: { score: score },\n            local_player: _m_xuid === MyPersonaAPI.GetXuid()\n        };\n        RatingEmblem.SetXuid(options);\n    }\n    function _SetLobbySettings(elTile, gameMode) {\n        let gameModeType = GameTypesAPI.GetGameModeType(gameMode);\n        let gameModeDisplay = GameTypesAPI.GetGameModeAttribute(gameModeType, gameMode, 'nameID');\n        elTile.SetDialogVariable('lobby-mode', $.Localize(gameModeDisplay));\n        elTile.SetDialogVariable('lobby-maps', _GetMapNames(gameMode));\n    }\n    function _GetMapNames(gameMode) {\n        let mapGroups = PartyBrowserAPI.GetPartySessionSetting(_m_xuid, 'game/mapgroupname');\n        if (mapGroups == 'workshop')\n            return $.Localize('#SFUI_Groups_workshop');\n        if (!mapGroups)\n            mapGroups = '';\n        let mapsList = mapGroups.split(',');\n        let mapsNiceNamesList = [];\n        for (let i = 0; i < mapsList.length; i++) {\n            if (i < 4) {\n                let mapNiceName = GameTypesAPI.GetMapGroupAttribute(mapsList[i], 'nameID');\n                mapsNiceNamesList.push($.Localize(mapNiceName));\n            }\n        }\n        return mapsNiceNamesList.join(', ');\n    }\n    function _SetLobbyPlayerSlots(elTile, gameMode, lobbyType) {\n        if (lobbyType === 'nearby')\n            return;\n        let numSlotsToShow = SessionUtil.GetMaxLobbySlotsForGameMode(gameMode) - 1;\n        let elAvatarRow = elTile.FindChildTraverse('JsFriendLobbyAvatars');\n        for (let i = 1; i <= numSlotsToShow; i++) {\n            let xuid = PartyBrowserAPI.GetPartyMemberXuid(_m_xuid, i);\n            let slotId = _m_xuid + ':' + i;\n            let playerSlot = elAvatarRow.FindChild(slotId);\n            if (!playerSlot) {\n                playerSlot = $.CreatePanel('Panel', elAvatarRow, slotId);\n                playerSlot.BLoadLayoutSnippet('FriendLobbyAvatarSlot');\n            }\n            if (i === 1)\n                playerSlot.AddClass('friendlobby__slot--first');\n            let elEmpty = playerSlot.FindChildTraverse('JsFriendAvatarEmpty');\n            let elAvatar = playerSlot.FindChildTraverse('JsFriendAvatar');\n            if (xuid) {\n                elAvatar.PopulateFromSteamID(xuid);\n                playerSlot.FindChild('JsFriendAvatarBtn').SetPanelEvent('onactivate', () => _OpenContextMenu(xuid));\n                elEmpty.visible = false;\n                elAvatar.visible = true;\n            }\n            else {\n                elEmpty.visible = true;\n                elAvatar.visible = false;\n            }\n        }\n    }\n    function _SetUpJoinBtn(elTile, lobbyType) {\n        let elJoinBtn = elTile.FindChildInLayoutFile('JsFriendLobbyJoinBtn');\n        let clientInLobby = false;\n        let clientXuid = MyPersonaAPI.GetXuid();\n        let count = PartyBrowserAPI.GetPartyMembersCount(_m_xuid);\n        for (let i = 0; i <= count; i++) {\n            if (clientXuid === PartyBrowserAPI.GetPartyMemberXuid(_m_xuid, i)) {\n                clientInLobby = true;\n                break;\n            }\n        }\n        if (clientInLobby || lobbyType === 'suggested') {\n            elJoinBtn.AddClass('hidden');\n            return;\n        }\n        elJoinBtn.RemoveClass('hidden');\n        let tooltipText = $.Localize((lobbyType === 'invited') ? '#tooltip_accept_invite' : '#tooltip_join_public_lobby');\n        elJoinBtn.SetPanelEvent('onmouseover', () => UiToolkitAPI.ShowTextTooltip('JsFriendLobbyJoinBtn', tooltipText));\n        elJoinBtn.SetPanelEvent('onmouseout', () => UiToolkitAPI.HideTextTooltip());\n        let lobbyLeaderXuid = _m_xuid;\n        elJoinBtn.SetPanelEvent('onactivate', () => {\n            $.DispatchEvent('CSGOPlaySoundEffectMuteBypass', 'PanoramaUI.Lobby.Joined', 'MOUSE', 1.0);\n            PartyBrowserAPI.ActionJoinParty(lobbyLeaderXuid);\n        });\n    }\n    function _SetGroupNameLink(elTile, lobbyType) {\n        let elGroupLBtn = elTile.FindChildTraverse('JsFriendLobbyGroupBtn');\n        let elGroupLabel = elTile.FindChildTraverse('JsFriendLobbyGroupTxt');\n        if (lobbyType === 'invited') {\n            elGroupLabel.visible = false;\n            elGroupLBtn.visible = false;\n        }\n        if (lobbyType === 'nearby') {\n            elGroupLabel.text = $.Localize('#SFUI_Lobby_GroupsNearby');\n            elGroupLBtn.enabled = false;\n        }\n        else {\n            let clanId = PartyBrowserAPI.GetPartySessionSetting(_m_xuid, \"game/clanid\");\n            let clanName = PartyBrowserAPI.GetPartySessionSetting(_m_xuid, \"game/clantag\");\n            if (lobbyType === 'suggested') {\n                elGroupLabel.SetDialogVariable('group', clanName);\n                elGroupLabel.text = $.Localize('#FriendsLobby_GroupsSuggested', elGroupLabel);\n            }\n            else {\n                elGroupLabel.SetDialogVariable('group', clanName);\n                elGroupLabel.text = $.Localize('#FriendsLobby_GroupName', elGroupLabel);\n            }\n            let onActivate = _GetClanLink(clanId);\n            elGroupLBtn.SetPanelEvent('onactivate', onActivate);\n            elGroupLBtn.enabled = true;\n        }\n    }\n    function _SetDismissButton(elTile, lobbyType) {\n        if (lobbyType === 'invited') {\n            var elCloseButton = elTile.FindChildInLayoutFile('FriendLobbyCloseButton');\n            elCloseButton.RemoveClass('hidden');\n            elCloseButton.SetPanelEvent(\"onactivate\", function () {\n                $.DispatchEvent('CSGOPlaySoundEffectMuteBypass', 'PanoramaUI.Lobby.Left', 'MOUSE', 1.0);\n                PartyBrowserAPI.ClearInvite(elTile.GetAttributeString('xuid', '(not found)'));\n            });\n            elCloseButton.SetPanelEvent('onmouseover', () => {\n                UiToolkitAPI.ShowTextTooltip('FriendLobbyCloseButton', $.Localize('#tooltip_discard_invite'));\n            });\n            elCloseButton.SetPanelEvent('onmouseout', () => {\n                UiToolkitAPI.HideTextTooltip();\n            });\n        }\n    }\n    function _SetUpLobbiesPopupBtn(elTile) {\n        let elAlert = elTile.FindChildInLayoutFile('JsFriendLobbyCount');\n        let nLobbies = PartyBrowserAPI.GetInvitesCount();\n        if (nLobbies < 2) {\n            elTile.FindChildInLayoutFile('JsFriendLobbySeeAllInvites').visible = false;\n            return;\n        }\n        if (elAlert && elAlert.IsValid()) {\n            elAlert.SetDialogVariable(\"lobby_count\", (nLobbies - 1).toString());\n            elAlert.SetDialogVariable(\"alert_value\", $.Localize('#friends_lobby_count', elAlert));\n        }\n        let elBtn = elTile.FindChildInLayoutFile('JsFriendLobbySeeAllInvitesBtn');\n        elBtn.SetPanelEvent('onmouseover', () => {\n            UiToolkitAPI.ShowTextTooltip('JsFriendLobbySeeAllInvitesBtn', $.Localize('#tooltip_lobby_count'));\n        });\n        elBtn.SetPanelEvent('onmouseout', () => {\n            UiToolkitAPI.HideTextTooltip();\n        });\n        elBtn.SetPanelEvent('onactivate', OpenLobbiesContextMenu);\n    }\n    function OpenLobbiesContextMenu() {\n        var contextMenuPanel = UiToolkitAPI.ShowCustomLayoutContextMenu('', '', 'file://{resources}/layout/context_menus/context_menu_lobbies.xml');\n        contextMenuPanel.AddClass(\"ContextMenu_NoArrow\");\n    }\n    function _GetClanLink(clanId) {\n        return () => {\n            let link = '';\n            if (SteamOverlayAPI.GetAppID() == 710)\n                link = \"http://beta.steamcommunity.com/gid/\" + clanId;\n            else\n                link = \"http://steamcommunity.com/gid/\" + clanId;\n            SteamOverlayAPI.OpenURL(link);\n        };\n    }\n    function _OpenContextMenu(xuid) {\n        $.DispatchEvent('SidebarContextMenuActive', true);\n        var contextMenuPanel = UiToolkitAPI.ShowCustomLayoutContextMenuParametersDismissEvent('', '', 'file://{resources}/layout/context_menus/context_menu_playercard.xml', 'xuid=' + xuid, () => $.DispatchEvent('SidebarContextMenuActive', false));\n        contextMenuPanel.AddClass(\"ContextMenu_NoArrow\");\n    }\n})(friendLobby || (friendLobby = {}));\n","scripts/friendslist.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"common/formattext.ts\" />\n/// <reference path=\"advertising_toggle.ts\" />\n/// <reference path=\"friendtile.ts\" />\n/// <reference path=\"friendlobby.ts\" />\n/// <reference path=\"friend_advertise_tile.ts\" />\nvar FriendsList;\n(function (FriendsList) {\n    let _m_isPerfectWorld = MyPersonaAPI.GetLauncherType() === \"perfectworld\" ? true : false;\n    let m_activeSection = 'id-friendslist-section-friends';\n    let m_Sections = $.GetContextPanel().FindChildInLayoutFile('id-friendslist-accordian');\n    let _m_sLobbiesTabListFiltersString = GameInterfaceAPI.GetSettingString('ui_nearbylobbies_filter');\n    let _m_schfnUpdateAntiAddiction = null;\n    let _m_ClosedSectionHeight = Math.floor($.GetContextPanel().FindChildInLayoutFile('id-friendslist-section-recent').desiredlayoutheight / $.GetContextPanel().actualuiscale_x);\n    function _Init() {\n        let btnLobbiesTabListFilters = $('#JsFriendsList-lobbies-toolbar-button-' + _m_sLobbiesTabListFiltersString);\n        AdvertisingToggle.OnFilterPressed(_m_sLobbiesTabListFiltersString);\n        if (btnLobbiesTabListFilters) {\n            btnLobbiesTabListFilters.checked = true;\n            let elParent = btnLobbiesTabListFilters.GetParent();\n            for (let child of elParent.Children()) {\n                let gameMode = child.GetAttributeString('data-type', '');\n                if (gameMode !== '') {\n                    child.visible = PartyListAPI.IsPlayerForHireAdvertisingEnabledForGameMode(gameMode);\n                }\n            }\n        }\n        _UpdateBroadcastIcon();\n    }\n    function _UpdateBroadcastIcon() {\n        let adSetting = AdvertisingToggle.GetAdvertisingSetting();\n        _ActiveFilterOnTab(adSetting);\n        $.GetContextPanel().FindChildInLayoutFile('id-friendslist-section-broadcast-icon').SetHasClass('advertising-active', adSetting !== \"\");\n    }\n    function _UpdateAntiAddiction() {\n        let elAAGroup = $.GetContextPanel().FindChildInLayoutFile('AntiAddiction');\n        let numSec = _m_isPerfectWorld ? MyPersonaAPI.GetAntiAddictionTimeRemaining() : -1;\n        if (numSec < 0) {\n            elAAGroup.AddClass('hidden');\n            return false;\n        }\n        elAAGroup.RemoveClass('hidden');\n        let szSeverity = 'Green';\n        if (numSec <= 300)\n            szSeverity = 'Red';\n        else if (numSec <= 1800)\n            szSeverity = 'Yellow';\n        let elAAIcon = elAAGroup.FindChildInLayoutFile('AntiAddictionIcon');\n        elAAIcon.SetHasClass('anti-addiction-Green', 'Green' === szSeverity);\n        elAAIcon.SetHasClass('anti-addiction-Yellow', 'Yellow' === szSeverity);\n        elAAIcon.SetHasClass('anti-addiction-Red', 'Red' === szSeverity);\n        let strTimeRemainingSentence = (numSec >= 60)\n            ? FormatText.SecondsToSignificantTimeString(numSec)\n            : $.Localize('#AntiAddiction_Label_TimeRemainingNone');\n        elAAGroup.SetDialogVariable('aatime', strTimeRemainingSentence);\n        let szLocalizedTooltip = $.Localize(((numSec >= 60)\n            ? '#UI_AntiAddiction_Tooltip_GameTime'\n            : '#UI_AntiAddiction_Tooltip_GameTimeNone'), elAAGroup);\n        elAAGroup.SetPanelEvent(\"onmouseover\", () => {\n            UiToolkitAPI.ShowTextTooltip('AntiAddiction', szLocalizedTooltip);\n        });\n        if (_m_schfnUpdateAntiAddiction)\n            $.CancelScheduled(_m_schfnUpdateAntiAddiction);\n        _m_schfnUpdateAntiAddiction = $.Schedule(30, _UpdateAntiAddictionTimer);\n    }\n    function _UpdateAntiAddictionTimer() {\n        _m_schfnUpdateAntiAddiction = null;\n        _UpdateAntiAddiction();\n    }\n    function _UpdateIncomingInvitesContainer() {\n        let elInviteRoot = $.GetContextPanel().FindChildInLayoutFile('JsIncomingInvites');\n        elInviteRoot.AddClass('hidden');\n        let elInviteContainer = elInviteRoot.FindChildInLayoutFile('JsIncomingInviteContainer');\n        elInviteContainer.RemoveAndDeleteChildren();\n        let numInvites = PartyBrowserAPI.GetInvitesCount();\n        if (numInvites > 0) {\n            let xuid = PartyBrowserAPI.GetInviteXuidByIndex(0);\n            _AddTile(elInviteContainer, null, xuid, 0, 'friendlobby', null);\n            elInviteRoot.RemoveClass('hidden');\n        }\n        UpdateHeightOpenSection();\n    }\n    function OnSectionPressed(sectionId) {\n        if (!sectionId) {\n            return;\n        }\n        if (m_activeSection !== sectionId) {\n            m_activeSection = sectionId;\n            if (sectionId === 'id-friendslist-section-recent') {\n                TeammatesAPI.Refresh();\n            }\n            if (sectionId === 'id-friendslist-section-broadcast') {\n                RefreshLobbyListings();\n            }\n        }\n        _UpdateSection(sectionId, false);\n    }\n    FriendsList.OnSectionPressed = OnSectionPressed;\n    function _UpdateAllSections() {\n        _UpdateSection('', true);\n    }\n    function _UpdateSection(sectionId, bUpdateAll) {\n        if (_m_ClosedSectionHeight === 0 || _m_ClosedSectionHeight === undefined) {\n            _m_ClosedSectionHeight = Math.floor($.GetContextPanel().FindChildInLayoutFile('id-friendslist-section-recent').desiredlayoutheight / $.GetContextPanel().actualuiscale_x);\n        }\n        let funcGetXuid;\n        if (sectionId === 'id-friendslist-section-friends' || bUpdateAll) {\n            funcGetXuid = _GetXuidByIndex;\n            _UpdateSectionContent({\n                id: 'id-friendslist-section-friends',\n                count: _GetFriendsCount(),\n                xml: 'friendtile',\n                xuid_func: funcGetXuid,\n                no_data_String: '#FriendsList_nodata_friends'\n            });\n        }\n        if (sectionId === 'id-friendslist-section-recent' || bUpdateAll) {\n            funcGetXuid = _GetRecentXuidByIndex;\n            _UpdateSectionContent({\n                id: 'id-friendslist-section-recent',\n                count: _GetRecentsCount(),\n                xml: 'friendtile',\n                xuid_func: funcGetXuid,\n                type: 'recent',\n                no_data_String: '#FriendsList_nodata_recents',\n                show_loading_bar_only: _ShowRecentsLoadingBar(),\n                loading_bar_id: 'JsFriendsListRecentsLoadingBar'\n            });\n        }\n        if (sectionId === 'id-friendslist-section-invite' || m_activeSection === 'id-friendslist-section-invite' || bUpdateAll) {\n            funcGetXuid = _GetRequestsXuidByIndex;\n            _UpdateSectionContent({\n                id: 'id-friendslist-section-invite',\n                count: _GetRequestsCount(),\n                alerts_count: _GetRequestsAlertCount(),\n                xml: 'friendtile',\n                xuid_func: funcGetXuid,\n                no_data_String: '#FriendsList_nodata_requests',\n                hide_if_empty: true\n            });\n        }\n        if (sectionId === 'id-friendslist-section-broadcast' || bUpdateAll) {\n            _UpdateLobbiesLoadingBar();\n            funcGetXuid = _GetLobbyXuidByIndex;\n            _UpdateSectionContent({\n                id: 'id-friendslist-section-broadcast',\n                count: _GetLobbiesCount(),\n                xml: 'friend_advertise_tile',\n                xuid_func: funcGetXuid,\n                no_data_String: '#FriendsList_nodata_advertising'\n            });\n        }\n    }\n    function _UpdateSectionContent(oSettings) {\n        let elSection = m_Sections.FindChildInLayoutFile(oSettings.id);\n        let count = (oSettings.hasOwnProperty('alerts_count') ? oSettings.alerts_count : oSettings.count);\n        _ShowHideCounter(elSection, count);\n        if (oSettings.hasOwnProperty('hide_if_empty') && oSettings.hide_if_empty === true && count < 1) {\n            elSection.SetHasClass('hidden', true);\n            return;\n        }\n        elSection.SetHasClass('hidden', false);\n        if (oSettings.hasOwnProperty('show_loading_bar_only') && oSettings.show_loading_bar_only) {\n            return;\n        }\n        if (m_activeSection === oSettings.id) {\n            let elNodata = elSection.FindChildInLayoutFile('id-friendslist-nodata');\n            let elList = elSection.FindChildInLayoutFile('id-friendslist-section-list-contents');\n            if (oSettings.count && oSettings.count > 0) {\n                elNodata.visible = false;\n                elList.visible = true;\n                _MakeOrUpdateTiles(elList, oSettings);\n                _SetSectionHeight(oSettings.id);\n                return;\n            }\n            elNodata.SetDialogVariable('no_data_title', $.Localize(oSettings.no_data_String + '_title'));\n            elNodata.SetDialogVariable('no_data_body', $.Localize(oSettings.no_data_String));\n            elNodata.visible = true;\n            elList.visible = false;\n            _SetSectionHeight(oSettings.id);\n        }\n    }\n    function _GetAddtionalSectionHeight(idSection) {\n        let elPanel = $.GetContextPanel().FindChildInLayoutFile(idSection);\n        return elPanel.BHasClass('hidden') ? 0 :\n            Math.floor(elPanel.desiredlayoutheight / m_Sections.actualuiscale_x);\n    }\n    function _SetSectionHeight(sectionId) {\n        let aSectionsToClose = m_Sections.Children().filter(element => element.id !== m_activeSection && !element.BHasClass('hidden'));\n        for (let element of aSectionsToClose) {\n            let elList = element.FindChildInLayoutFile('id-friendslist-section-list');\n            elList.style.height = '0px;';\n        }\n        let closedSectionsHeight = _m_ClosedSectionHeight * (aSectionsToClose.length + 1);\n        let basicHeight = Math.floor(($.GetContextPanel().desiredlayoutheight / $.GetContextPanel().actualuiscale_x)) -\n            (closedSectionsHeight + _GetAddtionalSectionHeight('PartyList') + _GetAddtionalSectionHeight('JsIncomingInvites'));\n        m_Sections.FindChildInLayoutFile(sectionId).FindChildInLayoutFile('id-friendslist-section-list').style.height = basicHeight + \"px;\";\n    }\n    function _ShowHideCounter(elSection, count) {\n        if (!count) {\n            elSection.SetHasClass('hide-notification', true);\n            return;\n        }\n        elSection.SetDialogVariable('alert_value', String(count));\n        elSection.SetHasClass('hide-notification', false);\n    }\n    function _MakeOrUpdateTiles(elList, oSettings) {\n        elList.SetLoadListItemFunction((parent, nPanelIdx, reusePanel) => {\n            let xuid = oSettings.xuid_func(nPanelIdx);\n            if (!reusePanel || !reusePanel.IsValid()) {\n                reusePanel = _AddTile(elList, null, xuid, nPanelIdx, oSettings.xml, oSettings.type);\n            }\n            else {\n                reusePanel.SetAttributeString(\"xuid\", xuid);\n                _InitTile(reusePanel, oSettings.xml);\n            }\n            return reusePanel;\n        });\n        if (oSettings.count) {\n            elList.UpdateListItemsNonDestructive(oSettings.count);\n            for (let i = 0; i < oSettings.count; ++i) {\n                if (elList.TryGetListItemAtIndex(i))\n                    elList.ReloadListItem(i);\n            }\n        }\n    }\n    function _AddTile(elList, children, xuid, index, tileXmlToUse, type) {\n        let elTile = $.CreatePanel(\"Panel\", elList, xuid);\n        elTile.SetAttributeString('xuid', xuid);\n        elTile.BLoadLayout('file://{resources}/layout/' + tileXmlToUse + '.xml', false, false);\n        if (type) {\n            elTile.Data().type = type;\n        }\n        if (tileXmlToUse) {\n            elTile.Data().tileXmlToUse = tileXmlToUse;\n        }\n        if (children && children[index + 1])\n            elList.MoveChildBefore(elTile, children[index + 1]);\n        _AddTransitionEndEventHandler(elTile);\n        _InitTile(elTile, tileXmlToUse);\n        return elTile;\n    }\n    function _InitTile(elTile, tileXmlToUse) {\n        if (tileXmlToUse === \"friendtile\") {\n            FriendTile.Init(elTile);\n        }\n        else if (tileXmlToUse === \"friendlobby\") {\n            elTile.SetAttributeString('showinpopup', 'false');\n            friendLobby.Init(elTile);\n        }\n        else {\n            FriendAdvertiseTile.Init(elTile);\n        }\n        elTile.RemoveClass('hidden');\n    }\n    function _AddTransitionEndEventHandler(elTile) {\n        $.RegisterEventHandler('PropertyTransitionEnd', elTile, (panel, propertyName) => {\n            if (elTile === panel && propertyName === 'opacity') {\n                if (elTile.visible === true && elTile.BIsTransparent()) {\n                    elTile.DeleteAsync(.0);\n                    return true;\n                }\n            }\n            return false;\n        });\n    }\n    function _ShowRecentsLoadingBar() {\n        let elBarOuter = $('#JsFriendsListRecentsLoadingBar');\n        let elBarInner = $('#JsFriendsListRecentsLoadingBarInner');\n        if (TeammatesAPI.GetSecondsAgoFinished() < 0) {\n            if (elBarOuter.BHasClass('hidden'))\n                elBarOuter.RemoveClass('hidden');\n            elBarInner.AddClass('loadingbar-indeterminate');\n            return true;\n        }\n        else {\n            elBarInner.RemoveClass('loadingbar-indeterminate');\n            elBarOuter.AddClass('hidden');\n            return false;\n        }\n    }\n    function _UpdateLobbiesLoadingBar() {\n        let progress = PartyBrowserAPI.GetProgress();\n        let elBarOuter = $('#JsFriendsListLobbyLoadingBar');\n        let elBarInner = $('#JsFriendsListLobbyLoadingBarInner');\n        if (progress > 1 && progress < 100) {\n            if (elBarOuter.BHasClass('hidden'))\n                elBarOuter.RemoveClass('hidden');\n            elBarInner.style.width = progress + '%';\n            return true;\n        }\n        else {\n            elBarOuter.AddClass('hidden');\n            return false;\n        }\n    }\n    function UpdateHeightOpenSection() {\n        _UpdateSection(m_activeSection, false);\n    }\n    FriendsList.UpdateHeightOpenSection = UpdateHeightOpenSection;\n    function SetLobbiesTabListFilters(sFilterString) {\n        _m_sLobbiesTabListFiltersString = sFilterString;\n        AdvertisingToggle.OnFilterPressed(sFilterString);\n        let adSetting = AdvertisingToggle.GetAdvertisingSetting();\n        _ActiveFilterOnTab(adSetting);\n        RefreshLobbyListings();\n    }\n    FriendsList.SetLobbiesTabListFilters = SetLobbiesTabListFilters;\n    function _ActiveFilterOnTab(adSetting) {\n        let aBtns = $.GetContextPanel().FindChildInLayoutFile('JsFriendsListSettingsBtns').Children();\n        for (let btn of aBtns) {\n            btn.SetHasClass('toggle-active', ((btn.GetAttributeString('data-type', '') === adSetting) && adSetting !== ''));\n        }\n    }\n    function RefreshLobbyListings() {\n        m_Sections.FindChildInLayoutFile('id-friendslist-section-broadcast').FindChildInLayoutFile('id-friendslist-section-list-contents').ScrollToTop();\n        GameInterfaceAPI.SetSettingString('ui_nearbylobbies_filter', _m_sLobbiesTabListFiltersString);\n        PartyBrowserAPI.SetSearchFilter(_m_sLobbiesTabListFiltersString, \"\");\n        PartyBrowserAPI.Refresh();\n    }\n    FriendsList.RefreshLobbyListings = RefreshLobbyListings;\n    function _OnGcHello() {\n        _UpdateAllSections();\n        UpdateHeightOpenSection();\n    }\n    function _FriendsListNameChanged(xuid) {\n        let elSection = m_Sections.FindChildInLayoutFile(m_activeSection);\n        if (!elSection)\n            return;\n        let elList = elSection.FindChildInLayoutFile('id-friendslist-section-list-contents');\n        if (!elList)\n            return;\n        let elTile = elList.FindChildTraverse(xuid);\n        if (!elTile)\n            return;\n        _InitTile(elTile, elTile.Data().tileXmlToUse);\n    }\n    function OnAddFriend() {\n        UiToolkitAPI.ShowCustomLayoutPopup('', 'file://{resources}/layout/popups/popup_add_friend.xml');\n    }\n    FriendsList.OnAddFriend = OnAddFriend;\n    function _GetFriendsCount() {\n        return FriendsListAPI.GetCount();\n    }\n    function _GetRequestsCount() {\n        return FriendsListAPI.GetFriendRequestsCount();\n    }\n    function _GetRecentsCount() {\n        let count = TeammatesAPI.GetCount();\n        if (count)\n            return count;\n    }\n    function _GetLobbiesCount() {\n        let count = PartyBrowserAPI.GetResultsCount();\n        if (count)\n            return count;\n    }\n    function _GetRequestsAlertCount() {\n        return FriendsListAPI.GetFriendRequestsNotificationNumber();\n    }\n    function _GetXuidByIndex(index) {\n        return FriendsListAPI.GetXuidByIndex(index);\n    }\n    function _GetRequestsXuidByIndex(index) {\n        return FriendsListAPI.GetFriendRequestsXuidByIdx(index);\n    }\n    function _GetRecentXuidByIndex(index) {\n        return TeammatesAPI.GetXuidByIndex(index);\n    }\n    function _GetLobbyXuidByIndex(index) {\n        return PartyBrowserAPI.GetXuidByIndex(index);\n    }\n    function _ShowMatchAcceptPopUp(map, location, ping) {\n        UiToolkitAPI.ShowGlobalCustomLayoutPopupParameters('', 'file://{resources}/layout/popups/popup_accept_match.xml', 'map_and_isreconnect=' + map + ',false' + ((location && ping) ? '&ping=' + ping + '&location=' + location : ''));\n    }\n    {\n        _Init();\n        $.RegisterForUnhandledEvent('PanoramaComponent_GC_Hello', _OnGcHello);\n        $.RegisterForUnhandledEvent(\"PanoramaComponent_FriendsList_RebuildFriendsList\", () => _UpdateSection('id-friendslist-section-friends', false));\n        $.RegisterForUnhandledEvent('PanoramaComponent_Teammates_Refresh', () => _UpdateSection('id-friendslist-section-recent', false));\n        $.RegisterForUnhandledEvent('PanoramaComponent_PartyBrowser_Refresh', () => _UpdateSection('id-friendslist-section-broadcast', false));\n        $.RegisterForUnhandledEvent('PanoramaComponent_FriendsList_NameChanged', _FriendsListNameChanged);\n        $.RegisterForUnhandledEvent('PanoramaComponent_PartyBrowser_InviteConsumed', _UpdateIncomingInvitesContainer);\n        $.RegisterForUnhandledEvent('PanoramaComponent_PartyBrowser_InviteReceived', _UpdateIncomingInvitesContainer);\n        $.RegisterForUnhandledEvent('PanoramaComponent_PartyBrowser_LocalPlayerForHireAdvertisingChanged', _UpdateBroadcastIcon);\n        $.RegisterForUnhandledEvent(\"ServerReserved\", _ShowMatchAcceptPopUp);\n    }\n})(FriendsList || (FriendsList = {}));\n","scripts/friendtile.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\nvar FriendTile;\n(function (FriendTile) {\n    let _m_xuid = '';\n    let _m_isClan = false;\n    let _m_hasClanInfo = false;\n    let _m_clanHandle = null;\n    function Init(elTile) {\n        _m_xuid = elTile.GetAttributeString('xuid', '(not found)');\n        _m_isClan = elTile.GetAttributeString('isClan', 'false') === 'true';\n        if (_m_isClan) {\n            _m_hasClanInfo = FriendsListAPI.GetClanInfoById32Bit(FriendsListAPI.ConvertXuidToId32Bit(_m_xuid), 'name') != '';\n            if (!_m_clanHandle)\n                _m_clanHandle = $.RegisterForUnhandledEvent('PanoramaComponent_MyPersona_ClansInfoUpdated', _ClansInfoUpdated);\n        }\n        _SetImage(elTile);\n        _SetHonorIcon(elTile);\n        _SetName(elTile);\n        _SetStatus(elTile);\n        _SetStatusBar(elTile);\n        _SetInvitedFromCallback(elTile);\n        _SetCanJoin(elTile);\n        _SetCanWatch(elTile);\n        _SetOnActivateEvent(elTile);\n    }\n    FriendTile.Init = Init;\n    function _SetHonorIcon(elTile) {\n        const elHonorIcon = elTile.FindChildTraverse('jsHonorIcon');\n        if (elHonorIcon)\n            elHonorIcon.Set(FriendsListAPI.GetFriendXpTrailLevel(_m_xuid), false);\n    }\n    function _SetImage(elTile) {\n        let elAvatarImg = elTile.FindChildTraverse('JsFriendAvatar');\n        elAvatarImg.PopulateFromSteamID(_m_xuid);\n        elAvatarImg.visible = !_m_isClan || _m_hasClanInfo;\n    }\n    function _SetStatusBar(elTile) {\n        let elBg = elTile.FindChildTraverse('JsFriendTileStatusBg');\n        let statusBucket = FriendsListAPI.GetFriendStatusBucket(_m_xuid);\n        let isFriend = FriendsListAPI.GetFriendRelationship(_m_xuid);\n        if (TeammatesAPI.GetCoPlayerInCSGO(_m_xuid) && isFriend !== \"friend\") {\n            statusBucket = \"PlayingCSGO\";\n        }\n        else if (isFriend !== \"friend\") {\n            statusBucket = \"Offline\";\n        }\n        elBg.SetHasClass('ingame', statusBucket === \"PlayingCSGO\");\n    }\n    function _SetName(elTile) {\n        let elLabel = elTile.FindChildTraverse('JsFriendName');\n        if (!_m_isClan) {\n            let name = FriendsListAPI.GetFriendName(_m_xuid);\n            if (name === \"[unknown]\") {\n                name = '[' + $.Localize('SFUI_Friends_Unknown') + ']';\n            }\n            elLabel.text = name;\n        }\n        else {\n            elLabel.text = FriendsListAPI.GetClanInfoById32Bit(FriendsListAPI.ConvertXuidToId32Bit(_m_xuid), 'name');\n            elLabel.visible = !_m_isClan || _m_hasClanInfo;\n        }\n    }\n    function _SetStatus(elTile) {\n        let friendStatusText = '';\n        if (_m_isClan) {\n            friendStatusText = \"#steamgroup\";\n        }\n        else {\n            if (elTile.Data().type === 'recent') {\n                friendStatusText = TeammatesAPI.GetCoPlayerTime(_m_xuid);\n            }\n            if (!friendStatusText)\n                friendStatusText = FriendsListAPI.GetFriendStatus(_m_xuid);\n        }\n        let elLabel = elTile.FindChildTraverse('JsFriendStatus');\n        elLabel.text = $.Localize(friendStatusText);\n    }\n    function _SetInvitedFromCallback(elTile) {\n        let isInvited = FriendsListAPI.IsFriendInvited(_m_xuid);\n        _SetInvited(elTile, isInvited);\n    }\n    function SetInvitedFromContextMenu(elTile) {\n        _SetInvited(elTile, true);\n    }\n    FriendTile.SetInvitedFromContextMenu = SetInvitedFromContextMenu;\n    function _SetInvited(elTile, isInvited) {\n        let elInvited = elTile.FindChildTraverse('JsFriendInvited');\n        if (elInvited !== null)\n            elInvited.SetHasClass('hidden', !isInvited);\n    }\n    function _SetCanJoin(elTile) {\n        let canJoin = FriendsListAPI.IsFriendJoinable(_m_xuid);\n        elTile.FindChildTraverse('JsFriendJoin').SetHasClass('hidden', !canJoin);\n    }\n    function _SetCanWatch(elTile) {\n        let canWatch = FriendsListAPI.IsFriendWatchable(_m_xuid);\n        elTile.FindChildTraverse('JsFriendWatch').SetHasClass('hidden', !canWatch);\n    }\n    function _SetOnActivateEvent(elTile) {\n        if (_m_isClan) {\n            elTile.SetPanelEvent('onactivate', () => {\n                SteamOverlayAPI.OpenUrlInOverlayOrExternalBrowser(\"https://\" + SteamOverlayAPI.GetSteamCommunityURL() + \"/gid/\" + _m_xuid);\n            });\n            return;\n        }\n        function OpenContextMenu(xuid) {\n            $.DispatchEvent('SidebarContextMenuActive', true);\n            let contextMenuPanel = UiToolkitAPI.ShowCustomLayoutContextMenuParametersDismissEvent('', '', 'file://{resources}/layout/context_menus/context_menu_playercard.xml', 'xuid=' + xuid +\n                (elTile.Data().type ? ('&type=' + elTile.Data().type) : ''), () => $.DispatchEvent('SidebarContextMenuActive', false));\n            contextMenuPanel.AddClass(\"ContextMenu_NoArrow\");\n        }\n        elTile.FindChildTraverse('JsFriendTileBtn').SetPanelEvent('onactivate', OpenContextMenu.bind(undefined, _m_xuid));\n        elTile.FindChildTraverse('JsFriendTileBtn').SetPanelEvent('oncontextmenu', OpenContextMenu.bind(undefined, _m_xuid));\n    }\n    function _ClansInfoUpdated() {\n        let elTile = $.GetContextPanel().FindChildTraverse('JsKeyValidatedResult');\n        if (elTile.codeType === 'g' && !elTile.FindChildTraverse('JsAvatarImage')) {\n            Init(elTile);\n        }\n    }\n})(FriendTile || (FriendTile = {}));\n","scripts/friend_advertise_tile.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"common/commonutil.ts\" />\n/// <reference path=\"rating_emblem.ts\" />\nvar FriendAdvertiseTile;\n(function (FriendAdvertiseTile) {\n    let _m_xuid = '';\n    function Init(elTile) {\n        _m_xuid = elTile.GetAttributeString('xuid', '(not found)');\n        let gameMode = PartyBrowserAPI.GetPartySessionSetting(_m_xuid, 'game/mode');\n        let _m_isPerfectWorld = MyPersonaAPI.GetLauncherType() === \"perfectworld\" ? true : false;\n        _SetNameAvatar(elTile);\n        _SetPrime(elTile);\n        if (!_m_isPerfectWorld)\n            _SetRegion(elTile);\n        _SetSkillGroup(elTile, gameMode);\n        _SetInvitedFromCallback(elTile);\n        _ShowInviteButton(elTile);\n        _OnInviteSetPanelEvent(elTile);\n    }\n    FriendAdvertiseTile.Init = Init;\n    function _SetNameAvatar(elTile) {\n        let xuidLobbyLeader = PartyBrowserAPI.GetPartyMemberXuid(_m_xuid, 0);\n        elTile.SetDialogVariable('friendname', FriendsListAPI.GetFriendName(xuidLobbyLeader));\n        elTile.FindChildTraverse('JsFriendAvatar').PopulateFromSteamID(xuidLobbyLeader);\n        elTile.FindChildTraverse('JsFriendAvatarBtn').SetPanelEvent('onactivate', _OpenContextMenu.bind(undefined, xuidLobbyLeader));\n    }\n    function _SetPrime(elTile) {\n        let primeValue = PartyBrowserAPI.GetPartySessionSetting(_m_xuid, 'game/apr');\n        elTile.FindChildTraverse('JsFriendAdvertisePrime').visible = (primeValue && primeValue != '0') ? true : false;\n    }\n    function _SetRegion(elTile) {\n        let countryCode = PartyBrowserAPI.GetPartySessionSetting(_m_xuid, 'game/loc');\n        CommonUtil.SetRegionOnLabel(countryCode, elTile);\n    }\n    function _SetSkillGroup(elTile, gameMode) {\n        let szSkillGroupType = \"skillgroup\";\n        if (gameMode === 'scrimcomp2v2') {\n            szSkillGroupType = 'Wingman';\n        }\n        else {\n            szSkillGroupType = 'Premier';\n        }\n        let score = Number(PartyBrowserAPI.GetPartySessionSetting(_m_xuid, 'game/ark'));\n        score = Math.floor(score / 10);\n        const options = {\n            root_panel: elTile.FindChildTraverse('jsRatingEmblem'),\n            xuid: _m_xuid,\n            do_fx: true,\n            full_details: false,\n            rating_type: szSkillGroupType,\n            leaderboard_details: { score: score },\n            local_player: _m_xuid === MyPersonaAPI.GetXuid()\n        };\n        RatingEmblem.SetXuid(options);\n    }\n    function _OpenContextMenu(xuid) {\n        $.DispatchEvent('SidebarContextMenuActive', true);\n        let contextMenuPanel = UiToolkitAPI.ShowCustomLayoutContextMenuParametersDismissEvent('', '', 'file://{resources}/layout/context_menus/context_menu_playercard.xml', 'xuid=' + xuid +\n            '&type=nearby', () => $.DispatchEvent('SidebarContextMenuActive', false));\n        contextMenuPanel.AddClass(\"ContextMenu_NoArrow\");\n    }\n    function _ShowInviteButton(elTile) {\n        let elInvited = elTile.FindChildTraverse('JsInviteAdvertisingPlayer');\n        elInvited.visible = !(_m_xuid === MyPersonaAPI.GetXuid());\n    }\n    function _SetInvitedFromCallback(elTile) {\n        let isInvited = FriendsListAPI.IsFriendInvited(_m_xuid);\n        _SetInvited(elTile, isInvited);\n    }\n    function _SetInvited(elTile, isInvited) {\n        let elInvited = elTile.FindChildTraverse('JsFriendInvited');\n        if (elInvited !== null)\n            elInvited.SetHasClass('hidden', !isInvited);\n    }\n    function _OnInviteSetPanelEvent(elTile) {\n        let xuid = _m_xuid;\n        elTile.FindChildTraverse('JsInviteAdvertisingPlayer').SetPanelEvent('onactivate', () => {\n            FriendsListAPI.ActionInviteFriend(xuid, '');\n            $.DispatchEvent('FriendInvitedFromContextMenu', xuid);\n        });\n    }\n})(FriendAdvertiseTile || (FriendAdvertiseTile = {}));\n","scripts/generated/items_event_current_generated_store.js":"\"use strict\";\n/// <reference path=\"items_event_current_generated_store.d.ts\" />\nvar g_ActiveTournamentInfo = {\n    eventid: 26,\n    credits_id: 12,\n    organization: 'iem',\n    location: 'cologne2026',\n    stickerid_graffiti: 10533,\n    stickerids: [\n        10497,\n        10498,\n        10499,\n        10500\n    ],\n    rankingids: [\n        11331,\n        11332,\n        11333\n    ],\n    itemid_pass: 5310,\n    itemid_pack: 5311,\n    itemid_coins: [\n        5312, 5313, 5314, 5315\n    ],\n    itemid_charge: 5309,\n    itemid_dynamic_stickers: 5316,\n    itemid_champion_stickers: 5329,\n    itemid_rankings_stickers: 4040,\n    souvenir_cost: 1,\n    num_global_offerings: 1,\n    num_stages_with_swiss: 3,\n    active: false,\n};\nvar g_ActiveTournamentTeams = [\n    {\n        teamid: 89,\n        team: 'vita',\n        stickerid_graffiti: 10501,\n        stickerids: [\n            10369,\n            10370,\n            10371,\n            10372\n        ],\n        rankingids: [\n            11235,\n            11236,\n            11237\n        ],\n        team_group: 'legends',\n        players: [\n            {\n                playerid: 153400465,\n                code: 'zywoo',\n                nick: 'ZywOo',\n                stickerids: [\n                    10534,\n                    10535,\n                    10536,\n                    10537\n                ],\n                rankingids: [\n                    11334,\n                    11335,\n                    11336\n                ],\n            },\n            {\n                playerid: 29478439,\n                code: 'apex',\n                nick: 'apEX',\n                stickerids: [\n                    10538,\n                    10539,\n                    10540,\n                    10541\n                ],\n                rankingids: [\n                    11337,\n                    11338,\n                    11339\n                ],\n            },\n            {\n                playerid: 12874964,\n                code: 'mezii',\n                nick: 'mezii',\n                stickerids: [\n                    10542,\n                    10543,\n                    10544,\n                    10545\n                ],\n                rankingids: [\n                    11340,\n                    11341,\n                    11342\n                ],\n            },\n            {\n                playerid: 18569432,\n                code: 'flamez',\n                nick: 'FlameZ',\n                stickerids: [\n                    10546,\n                    10547,\n                    10548,\n                    10549\n                ],\n                rankingids: [\n                    11343,\n                    11344,\n                    11345\n                ],\n            },\n            {\n                playerid: 31006590,\n                code: 'ropz',\n                nick: 'ropz',\n                stickerids: [\n                    10550,\n                    10551,\n                    10552,\n                    10553\n                ],\n                rankingids: [\n                    11346,\n                    11347,\n                    11348\n                ],\n            },\n        ],\n        champions: [],\n    },\n    {\n        teamid: 12,\n        team: 'navi',\n        stickerid_graffiti: 10502,\n        stickerids: [\n            10373,\n            10374,\n            10375,\n            10376\n        ],\n        rankingids: [\n            11238,\n            11239,\n            11240\n        ],\n        team_group: 'legends',\n        players: [\n            {\n                playerid: 1102803112,\n                code: 'w0nderful',\n                nick: 'w0nderful',\n                stickerids: [\n                    10554,\n                    10555,\n                    10556,\n                    10557\n                ],\n                rankingids: [\n                    11349,\n                    11350,\n                    11351\n                ],\n            },\n            {\n                playerid: 52977598,\n                code: 'aleksib',\n                nick: 'Aleksib',\n                stickerids: [\n                    10558,\n                    10559,\n                    10560,\n                    10561\n                ],\n                rankingids: [\n                    11352,\n                    11353,\n                    11354\n                ],\n            },\n            {\n                playerid: 286341748,\n                code: 'b1t',\n                nick: 'b1t',\n                stickerids: [\n                    10562,\n                    10563,\n                    10564,\n                    10565\n                ],\n                rankingids: [\n                    11355,\n                    11356,\n                    11357\n                ],\n            },\n            {\n                playerid: 89984505,\n                code: 'im',\n                nick: 'iM',\n                stickerids: [\n                    10566,\n                    10567,\n                    10568,\n                    10569\n                ],\n                rankingids: [\n                    11358,\n                    11359,\n                    11360\n                ],\n            },\n            {\n                playerid: 1115923884,\n                code: 'makazze',\n                nick: 'makazze',\n                stickerids: [\n                    10570,\n                    10571,\n                    10572,\n                    10573\n                ],\n                rankingids: [\n                    11361,\n                    11362,\n                    11363\n                ],\n            },\n        ],\n        champions: [],\n    },\n    {\n        teamid: 139,\n        team: 'fal',\n        stickerid_graffiti: 10503,\n        stickerids: [\n            10377,\n            10378,\n            10379,\n            10380\n        ],\n        rankingids: [\n            11241,\n            11242,\n            11243\n        ],\n        team_group: 'legends',\n        players: [\n            {\n                playerid: 81417650,\n                code: 'niko',\n                nick: 'NiKo',\n                stickerids: [\n                    10574,\n                    10575,\n                    10576,\n                    10577\n                ],\n                rankingids: [\n                    11364,\n                    11365,\n                    11366\n                ],\n            },\n            {\n                playerid: 97016704,\n                code: 'kyxsan',\n                nick: 'kyxsan',\n                stickerids: [\n                    10578,\n                    10579,\n                    10580,\n                    10581\n                ],\n                rankingids: [\n                    11367,\n                    11368,\n                    11369\n                ],\n            },\n            {\n                playerid: 114497073,\n                code: 'm0nesy',\n                nick: 'm0NESY',\n                stickerids: [\n                    10582,\n                    10583,\n                    10584,\n                    10585\n                ],\n                rankingids: [\n                    11370,\n                    11371,\n                    11372\n                ],\n            },\n            {\n                playerid: 36412550,\n                code: 'teses',\n                nick: 'TeSeS',\n                stickerids: [\n                    10586,\n                    10587,\n                    10588,\n                    10589\n                ],\n                rankingids: [\n                    11373,\n                    11374,\n                    11375\n                ],\n            },\n            {\n                playerid: 1071740496,\n                code: 'kyousuke',\n                nick: 'kyousuke',\n                stickerids: [\n                    10590,\n                    10591,\n                    10592,\n                    10593\n                ],\n                rankingids: [\n                    11376,\n                    11377,\n                    11378\n                ],\n            },\n        ],\n        champions: [\n            {\n                playerid: 81417650,\n                code: 'niko',\n                nick: 'NiKo',\n                stickerids: [\n                    11174,\n                    11175,\n                    11176,\n                    11177\n                ],\n                rankingids: [],\n            },\n            {\n                playerid: 97016704,\n                code: 'kyxsan',\n                nick: 'kyxsan',\n                stickerids: [\n                    11178,\n                    11179,\n                    11180,\n                    11181\n                ],\n                rankingids: [],\n            },\n            {\n                playerid: 114497073,\n                code: 'm0nesy',\n                nick: 'm0NESY',\n                stickerids: [\n                    11182,\n                    11183,\n                    11184,\n                    11185\n                ],\n                rankingids: [],\n            },\n            {\n                playerid: 36412550,\n                code: 'teses',\n                nick: 'TeSeS',\n                stickerids: [\n                    11186,\n                    11187,\n                    11188,\n                    11189\n                ],\n                rankingids: [],\n            },\n            {\n                playerid: 1071740496,\n                code: 'kyousuke',\n                nick: 'kyousuke',\n                stickerids: [\n                    11190,\n                    11191,\n                    11192,\n                    11193\n                ],\n                rankingids: [],\n            },\n        ],\n    },\n    {\n        teamid: 122,\n        team: 'mngz',\n        stickerid_graffiti: 10504,\n        stickerids: [\n            10381,\n            10382,\n            10383,\n            10384\n        ],\n        rankingids: [\n            11244,\n            11245,\n            11246\n        ],\n        team_group: 'legends',\n        players: [\n            {\n                playerid: 999558360,\n                code: 'blitz',\n                nick: 'bLitz',\n                stickerids: [\n                    10594,\n                    10595,\n                    10596,\n                    10597\n                ],\n                rankingids: [\n                    11379,\n                    11380,\n                    11381\n                ],\n            },\n            {\n                playerid: 1006074432,\n                code: 'techno4k',\n                nick: 'Techno4K',\n                stickerids: [\n                    10598,\n                    10599,\n                    10600,\n                    10601\n                ],\n                rankingids: [\n                    11382,\n                    11383,\n                    11384\n                ],\n            },\n            {\n                playerid: 1470606075,\n                code: 'cobra',\n                nick: 'cobra',\n                stickerids: [\n                    10602,\n                    10603,\n                    10604,\n                    10605\n                ],\n                rankingids: [\n                    11385,\n                    11386,\n                    11387\n                ],\n            },\n            {\n                playerid: 878556854,\n                code: 'mzinho',\n                nick: 'mzinho',\n                stickerids: [\n                    10606,\n                    10607,\n                    10608,\n                    10609\n                ],\n                rankingids: [\n                    11388,\n                    11389,\n                    11390\n                ],\n            },\n            {\n                playerid: 1243297617,\n                code: '910',\n                nick: '910',\n                stickerids: [\n                    10610,\n                    10611,\n                    10612,\n                    10613\n                ],\n                rankingids: [\n                    11391,\n                    11392,\n                    11393\n                ],\n            },\n        ],\n        champions: [],\n    },\n    {\n        teamid: 142,\n        team: 'pari',\n        stickerid_graffiti: 10505,\n        stickerids: [\n            10385,\n            10386,\n            10387,\n            10388\n        ],\n        rankingids: [\n            11247,\n            11248,\n            11249\n        ],\n        team_group: 'legends',\n        players: [\n            {\n                playerid: 75859856,\n                code: 'jame',\n                nick: 'Jame',\n                stickerids: [\n                    10614,\n                    10615,\n                    10616,\n                    10617\n                ],\n                rankingids: [\n                    11394,\n                    11395,\n                    11396\n                ],\n            },\n            {\n                playerid: 1014804299,\n                code: 'nota',\n                nick: 'nota',\n                stickerids: [\n                    10618,\n                    10619,\n                    10620,\n                    10621\n                ],\n                rankingids: [\n                    11397,\n                    11398,\n                    11399\n                ],\n            },\n            {\n                playerid: 181006324,\n                code: 'xielo',\n                nick: 'xiELO',\n                stickerids: [\n                    10622,\n                    10623,\n                    10624,\n                    10625\n                ],\n                rankingids: [\n                    11400,\n                    11401,\n                    11402\n                ],\n            },\n            {\n                playerid: 293404789,\n                code: 'belchonokk',\n                nick: 'BELCHONOKK',\n                stickerids: [\n                    10626,\n                    10627,\n                    10628,\n                    10629\n                ],\n                rankingids: [\n                    11403,\n                    11404,\n                    11405\n                ],\n            },\n            {\n                playerid: 250361011,\n                code: 'zweih',\n                nick: 'zweih',\n                stickerids: [\n                    10630,\n                    10631,\n                    10632,\n                    10633\n                ],\n                rankingids: [\n                    11406,\n                    11407,\n                    11408\n                ],\n            },\n        ],\n        champions: [],\n    },\n    {\n        teamid: 134,\n        team: 'aura',\n        stickerid_graffiti: 10506,\n        stickerids: [\n            10389,\n            10390,\n            10391,\n            10392\n        ],\n        rankingids: [\n            11250,\n            11251,\n            11252\n        ],\n        team_group: 'legends',\n        players: [\n            {\n                playerid: 83853068,\n                code: 'xantares',\n                nick: 'XANTARES',\n                stickerids: [\n                    10634,\n                    10635,\n                    10636,\n                    10637\n                ],\n                rankingids: [\n                    11409,\n                    11410,\n                    11411\n                ],\n            },\n            {\n                playerid: 366802450,\n                code: 'soulfly',\n                nick: 'soulfly',\n                stickerids: [\n                    10638,\n                    10639,\n                    10640,\n                    10641\n                ],\n                rankingids: [\n                    11412,\n                    11413,\n                    11414\n                ],\n            },\n            {\n                playerid: 852248195,\n                code: 'wicadia',\n                nick: 'Wicadia',\n                stickerids: [\n                    10642,\n                    10643,\n                    10644,\n                    10645\n                ],\n                rankingids: [\n                    11415,\n                    11416,\n                    11417\n                ],\n            },\n            {\n                playerid: 7167161,\n                code: 'maj3r',\n                nick: 'MAJ3R',\n                stickerids: [\n                    10646,\n                    10647,\n                    10648,\n                    10649\n                ],\n                rankingids: [\n                    11418,\n                    11419,\n                    11420\n                ],\n            },\n            {\n                playerid: 123219778,\n                code: 'woxic',\n                nick: 'woxic',\n                stickerids: [\n                    10650,\n                    10651,\n                    10652,\n                    10653\n                ],\n                rankingids: [\n                    11421,\n                    11422,\n                    11423\n                ],\n            },\n        ],\n        champions: [],\n    },\n    {\n        teamid: 85,\n        team: 'furi',\n        stickerid_graffiti: 10507,\n        stickerids: [\n            10393,\n            10394,\n            10395,\n            10396\n        ],\n        rankingids: [\n            11253,\n            11254,\n            11255\n        ],\n        team_group: 'legends',\n        players: [\n            {\n                playerid: 174136197,\n                code: 'yekindar',\n                nick: 'YEKINDAR',\n                stickerids: [\n                    10654,\n                    10655,\n                    10656,\n                    10657\n                ],\n                rankingids: [\n                    11424,\n                    11425,\n                    11426\n                ],\n            },\n            {\n                playerid: 98234764,\n                code: 'kscerato',\n                nick: 'KSCERATO',\n                stickerids: [\n                    10658,\n                    10659,\n                    10660,\n                    10661\n                ],\n                rankingids: [\n                    11427,\n                    11428,\n                    11429\n                ],\n            },\n            {\n                playerid: 424467,\n                code: 'fallen',\n                nick: 'FalleN',\n                stickerids: [\n                    10662,\n                    10663,\n                    10664,\n                    10665\n                ],\n                rankingids: [\n                    11430,\n                    11431,\n                    11432\n                ],\n            },\n            {\n                playerid: 240716562,\n                code: 'molodoy',\n                nick: 'molodoy',\n                stickerids: [\n                    10666,\n                    10667,\n                    10668,\n                    10669\n                ],\n                rankingids: [\n                    11433,\n                    11434,\n                    11435\n                ],\n            },\n            {\n                playerid: 204704832,\n                code: 'yuurih',\n                nick: 'yuurih',\n                stickerids: [\n                    10670,\n                    10671,\n                    10672,\n                    10673\n                ],\n                rankingids: [\n                    11436,\n                    11437,\n                    11438\n                ],\n            },\n        ],\n        champions: [],\n    },\n    {\n        teamid: 106,\n        team: 'mouz',\n        stickerid_graffiti: 10508,\n        stickerids: [\n            10397,\n            10398,\n            10399,\n            10400\n        ],\n        rankingids: [\n            11256,\n            11257,\n            11258\n        ],\n        team_group: 'legends',\n        players: [\n            {\n                playerid: 895109597,\n                code: 'jimpphat',\n                nick: 'Jimpphat',\n                stickerids: [\n                    10674,\n                    10675,\n                    10676,\n                    10677\n                ],\n                rankingids: [\n                    11439,\n                    11440,\n                    11441\n                ],\n            },\n            {\n                playerid: 178562747,\n                code: 'brollan',\n                nick: 'Brollan',\n                stickerids: [\n                    10678,\n                    10679,\n                    10680,\n                    10681\n                ],\n                rankingids: [\n                    11442,\n                    11443,\n                    11444\n                ],\n            },\n            {\n                playerid: 103070679,\n                code: 'spinx',\n                nick: 'Spinx',\n                stickerids: [\n                    10682,\n                    10683,\n                    10684,\n                    10685\n                ],\n                rankingids: [\n                    11445,\n                    11446,\n                    11447\n                ],\n            },\n            {\n                playerid: 395473484,\n                code: 'torzsi',\n                nick: 'torzsi',\n                stickerids: [\n                    10686,\n                    10687,\n                    10688,\n                    10689\n                ],\n                rankingids: [\n                    11448,\n                    11449,\n                    11450\n                ],\n            },\n            {\n                playerid: 232908406,\n                code: 'xertion',\n                nick: 'xertioN',\n                stickerids: [\n                    10690,\n                    10691,\n                    10692,\n                    10693\n                ],\n                rankingids: [\n                    11451,\n                    11452,\n                    11453\n                ],\n            },\n        ],\n        champions: [],\n    },\n    {\n        teamid: 145,\n        team: 'fut',\n        stickerid_graffiti: 10509,\n        stickerids: [\n            10401,\n            10402,\n            10403,\n            10404\n        ],\n        rankingids: [\n            11259,\n            11260,\n            11261\n        ],\n        team_group: 'challengers',\n        players: [\n            {\n                playerid: 915367451,\n                code: 'dem0n',\n                nick: 'dem0n',\n                stickerids: [\n                    10694,\n                    10695,\n                    10696,\n                    10697\n                ],\n                rankingids: [\n                    11454,\n                    11455,\n                    11456\n                ],\n            },\n            {\n                playerid: 1012530125,\n                code: 'launx',\n                nick: 'lauNX',\n                stickerids: [\n                    10698,\n                    10699,\n                    10700,\n                    10701\n                ],\n                rankingids: [\n                    11457,\n                    11458,\n                    11459\n                ],\n            },\n            {\n                playerid: 1031012697,\n                code: 'krabeni',\n                nick: 'Krabeni',\n                stickerids: [\n                    10702,\n                    10703,\n                    10704,\n                    10705\n                ],\n                rankingids: [\n                    11460,\n                    11461,\n                    11462\n                ],\n            },\n            {\n                playerid: 1353702531,\n                code: 'cmtry',\n                nick: 'cmtry',\n                stickerids: [\n                    10706,\n                    10707,\n                    10708,\n                    10709\n                ],\n                rankingids: [\n                    11463,\n                    11464,\n                    11465\n                ],\n            },\n            {\n                playerid: 1140460110,\n                code: 'dziugss',\n                nick: 'dziugss',\n                stickerids: [\n                    10710,\n                    10711,\n                    10712,\n                    10713\n                ],\n                rankingids: [\n                    11466,\n                    11467,\n                    11468\n                ],\n            },\n        ],\n        champions: [],\n    },\n    {\n        teamid: 81,\n        team: 'spir',\n        stickerid_graffiti: 10510,\n        stickerids: [\n            10405,\n            10406,\n            10407,\n            10408\n        ],\n        rankingids: [\n            11262,\n            11263,\n            11264\n        ],\n        team_group: 'challengers',\n        players: [\n            {\n                playerid: 911747440,\n                code: 'tn1r',\n                nick: 'tN1R',\n                stickerids: [\n                    10714,\n                    10715,\n                    10716,\n                    10717\n                ],\n                rankingids: [\n                    11469,\n                    11470,\n                    11471\n                ],\n            },\n            {\n                playerid: 425999755,\n                code: 'donk',\n                nick: 'donk',\n                stickerids: [\n                    10718,\n                    10719,\n                    10720,\n                    10721\n                ],\n                rankingids: [\n                    11472,\n                    11473,\n                    11474\n                ],\n            },\n            {\n                playerid: 868554,\n                code: 'magixx',\n                nick: 'magixx',\n                stickerids: [\n                    10722,\n                    10723,\n                    10724,\n                    10725\n                ],\n                rankingids: [\n                    11475,\n                    11476,\n                    11477\n                ],\n            },\n            {\n                playerid: 121219047,\n                code: 'sh1ro',\n                nick: 'sh1ro',\n                stickerids: [\n                    10726,\n                    10727,\n                    10728,\n                    10729\n                ],\n                rankingids: [\n                    11478,\n                    11479,\n                    11480\n                ],\n            },\n            {\n                playerid: 1035615149,\n                code: 'zont1x',\n                nick: 'zont1x',\n                stickerids: [\n                    10730,\n                    10731,\n                    10732,\n                    10733\n                ],\n                rankingids: [\n                    11481,\n                    11482,\n                    11483\n                ],\n            },\n        ],\n        champions: [],\n    },\n    {\n        teamid: 60,\n        team: 'astr',\n        stickerid_graffiti: 10511,\n        stickerids: [\n            10409,\n            10410,\n            10411,\n            10412\n        ],\n        rankingids: [\n            11265,\n            11266,\n            11267\n        ],\n        team_group: 'challengers',\n        players: [\n            {\n                playerid: 38661042,\n                code: 'hooxi',\n                nick: 'HooXi',\n                stickerids: [\n                    10734,\n                    10735,\n                    10736,\n                    10737\n                ],\n                rankingids: [\n                    11484,\n                    11485,\n                    11486\n                ],\n            },\n            {\n                playerid: 447933315,\n                code: 'phzy',\n                nick: 'phzy',\n                stickerids: [\n                    10738,\n                    10739,\n                    10740,\n                    10741\n                ],\n                rankingids: [\n                    11487,\n                    11488,\n                    11489\n                ],\n            },\n            {\n                playerid: 208135644,\n                code: 'ryu',\n                nick: 'ryu',\n                stickerids: [\n                    10742,\n                    10743,\n                    10744,\n                    10745\n                ],\n                rankingids: [\n                    11490,\n                    11491,\n                    11492\n                ],\n            },\n            {\n                playerid: 160291620,\n                code: 'jabbi',\n                nick: 'jabbi',\n                stickerids: [\n                    10746,\n                    10747,\n                    10748,\n                    10749\n                ],\n                rankingids: [\n                    11493,\n                    11494,\n                    11495\n                ],\n            },\n            {\n                playerid: 44842089,\n                code: 'staehr',\n                nick: 'Staehr',\n                stickerids: [\n                    10750,\n                    10751,\n                    10752,\n                    10753\n                ],\n                rankingids: [\n                    11496,\n                    11497,\n                    11498\n                ],\n            },\n        ],\n        champions: [],\n    },\n    {\n        teamid: 59,\n        team: 'g2',\n        stickerid_graffiti: 10512,\n        stickerids: [\n            10413,\n            10414,\n            10415,\n            10416\n        ],\n        rankingids: [\n            11268,\n            11269,\n            11270\n        ],\n        team_group: 'challengers',\n        players: [\n            {\n                playerid: 52606325,\n                code: 'hunter',\n                nick: 'huNter-',\n                stickerids: [\n                    10754,\n                    10755,\n                    10756,\n                    10757\n                ],\n                rankingids: [\n                    11499,\n                    11500,\n                    11501\n                ],\n            },\n            {\n                playerid: 107737265,\n                code: 'heavygod',\n                nick: 'Heavygod',\n                stickerids: [\n                    10758,\n                    10759,\n                    10760,\n                    10761\n                ],\n                rankingids: [\n                    11502,\n                    11503,\n                    11504\n                ],\n            },\n            {\n                playerid: 92860917,\n                code: 'nertz',\n                nick: 'NertZ',\n                stickerids: [\n                    10762,\n                    10763,\n                    10764,\n                    10765\n                ],\n                rankingids: [\n                    11505,\n                    11506,\n                    11507\n                ],\n            },\n            {\n                playerid: 349573813,\n                code: 'sunpayus',\n                nick: 'SunPayus',\n                stickerids: [\n                    10766,\n                    10767,\n                    10768,\n                    10769\n                ],\n                rankingids: [\n                    11508,\n                    11509,\n                    11510\n                ],\n            },\n            {\n                playerid: 1086212773,\n                code: 'matys',\n                nick: 'MATYS',\n                stickerids: [\n                    10770,\n                    10771,\n                    10772,\n                    10773\n                ],\n                rankingids: [\n                    11511,\n                    11512,\n                    11513\n                ],\n            },\n        ],\n        champions: [],\n    },\n    {\n        teamid: 126,\n        team: 'lgcy',\n        stickerid_graffiti: 10513,\n        stickerids: [\n            10417,\n            10418,\n            10419,\n            10420\n        ],\n        rankingids: [\n            11271,\n            11272,\n            11273\n        ],\n        team_group: 'challengers',\n        players: [\n            {\n                playerid: 83503844,\n                code: 'art',\n                nick: 'arT',\n                stickerids: [\n                    10774,\n                    10775,\n                    10776,\n                    10777\n                ],\n                rankingids: [\n                    11514,\n                    11515,\n                    11516\n                ],\n            },\n            {\n                playerid: 889754458,\n                code: 'latto',\n                nick: 'latto',\n                stickerids: [\n                    10778,\n                    10779,\n                    10780,\n                    10781\n                ],\n                rankingids: [\n                    11517,\n                    11518,\n                    11519\n                ],\n            },\n            {\n                playerid: 234059589,\n                code: 'dumau',\n                nick: 'dumau',\n                stickerids: [\n                    10782,\n                    10783,\n                    10784,\n                    10785\n                ],\n                rankingids: [\n                    11520,\n                    11521,\n                    11522\n                ],\n            },\n            {\n                playerid: 140229234,\n                code: 'saadzin',\n                nick: 'saadzin',\n                stickerids: [\n                    10786,\n                    10787,\n                    10788,\n                    10789\n                ],\n                rankingids: [\n                    11523,\n                    11524,\n                    11525\n                ],\n            },\n            {\n                playerid: 101497868,\n                code: 'n1ssim',\n                nick: 'n1ssim',\n                stickerids: [\n                    10790,\n                    10791,\n                    10792,\n                    10793\n                ],\n                rankingids: [\n                    11526,\n                    11527,\n                    11528\n                ],\n            },\n        ],\n        champions: [],\n    },\n    {\n        teamid: 102,\n        team: 'pain',\n        stickerid_graffiti: 10514,\n        stickerids: [\n            10421,\n            10422,\n            10423,\n            10424\n        ],\n        rankingids: [\n            11274,\n            11275,\n            11276\n        ],\n        team_group: 'challengers',\n        players: [\n            {\n                playerid: 55043156,\n                code: 'biguzera',\n                nick: 'biguzera',\n                stickerids: [\n                    10794,\n                    10795,\n                    10796,\n                    10797\n                ],\n                rankingids: [\n                    11529,\n                    11530,\n                    11531\n                ],\n            },\n            {\n                playerid: 390076777,\n                code: 'nqz',\n                nick: 'NQZ',\n                stickerids: [\n                    10798,\n                    10799,\n                    10800,\n                    10801\n                ],\n                rankingids: [\n                    11532,\n                    11533,\n                    11534\n                ],\n            },\n            {\n                playerid: 417070118,\n                code: 'snow',\n                nick: 'snow',\n                stickerids: [\n                    10802,\n                    10803,\n                    10804,\n                    10805\n                ],\n                rankingids: [\n                    11535,\n                    11536,\n                    11537\n                ],\n            },\n            {\n                playerid: 436072455,\n                code: 'piriajr',\n                nick: 'piriajr',\n                stickerids: [\n                    10806,\n                    10807,\n                    10808,\n                    10809\n                ],\n                rankingids: [\n                    11538,\n                    11539,\n                    11540\n                ],\n            },\n            {\n                playerid: 51467095,\n                code: 'vsm',\n                nick: 'v$m',\n                stickerids: [\n                    10810,\n                    10811,\n                    10812,\n                    10813\n                ],\n                rankingids: [\n                    11541,\n                    11542,\n                    11543\n                ],\n            },\n        ],\n        champions: [],\n    },\n    {\n        teamid: 119,\n        team: 'mont',\n        stickerid_graffiti: 10515,\n        stickerids: [\n            10425,\n            10426,\n            10427,\n            10428\n        ],\n        rankingids: [\n            11277,\n            11278,\n            11279\n        ],\n        team_group: 'challengers',\n        players: [\n            {\n                playerid: 177848062,\n                code: 'rainwaker',\n                nick: 'Rainwaker',\n                stickerids: [\n                    10814,\n                    10815,\n                    10816,\n                    10817\n                ],\n                rankingids: [\n                    11544,\n                    11545,\n                    11546\n                ],\n            },\n            {\n                playerid: 133120627,\n                code: 'bymas',\n                nick: 'Bymas',\n                stickerids: [\n                    10818,\n                    10819,\n                    10820,\n                    10821\n                ],\n                rankingids: [\n                    11547,\n                    11548,\n                    11549\n                ],\n            },\n            {\n                playerid: 75315373,\n                code: 'afro',\n                nick: 'afro',\n                stickerids: [\n                    10822,\n                    10823,\n                    10824,\n                    10825\n                ],\n                rankingids: [\n                    11550,\n                    11551,\n                    11552\n                ],\n            },\n            {\n                playerid: 383961258,\n                code: 'gizmy',\n                nick: 'Gizmy',\n                stickerids: [\n                    10826,\n                    10827,\n                    10828,\n                    10829\n                ],\n                rankingids: [\n                    11553,\n                    11554,\n                    11555\n                ],\n            },\n            {\n                playerid: 1014228401,\n                code: 'azuwu',\n                nick: 'AZUWU',\n                stickerids: [\n                    10830,\n                    10831,\n                    10832,\n                    10833\n                ],\n                rankingids: [\n                    11556,\n                    11557,\n                    11558\n                ],\n            },\n        ],\n        champions: [],\n    },\n    {\n        teamid: 112,\n        team: 'nine',\n        stickerid_graffiti: 10516,\n        stickerids: [\n            10429,\n            10430,\n            10431,\n            10432\n        ],\n        rankingids: [\n            11280,\n            11281,\n            11282\n        ],\n        team_group: 'challengers',\n        players: [\n            {\n                playerid: 282684656,\n                code: 'max',\n                nick: 'max',\n                stickerids: [\n                    10834,\n                    10835,\n                    10836,\n                    10837\n                ],\n                rankingids: [\n                    11559,\n                    11560,\n                    11561\n                ],\n            },\n            {\n                playerid: 256625848,\n                code: 'dgt',\n                nick: 'dgt',\n                stickerids: [\n                    10838,\n                    10839,\n                    10840,\n                    10841\n                ],\n                rankingids: [\n                    11562,\n                    11563,\n                    11564\n                ],\n            },\n            {\n                playerid: 235377137,\n                code: 'meyern',\n                nick: 'meyern',\n                stickerids: [\n                    10842,\n                    10843,\n                    10844,\n                    10845\n                ],\n                rankingids: [\n                    11565,\n                    11566,\n                    11567\n                ],\n            },\n            {\n                playerid: 107456470,\n                code: 'luchov',\n                nick: 'luchov',\n                stickerids: [\n                    10846,\n                    10847,\n                    10848,\n                    10849\n                ],\n                rankingids: [\n                    11568,\n                    11569,\n                    11570\n                ],\n            },\n            {\n                playerid: 359457480,\n                code: 'huasopeek',\n                nick: 'HUASOPEEK',\n                stickerids: [\n                    10850,\n                    10851,\n                    10852,\n                    10853\n                ],\n                rankingids: [\n                    11571,\n                    11572,\n                    11573\n                ],\n            },\n        ],\n        champions: [],\n    },\n    {\n        teamid: 115,\n        team: 'gl',\n        stickerid_graffiti: 10517,\n        stickerids: [\n            10433,\n            10434,\n            10435,\n            10436\n        ],\n        rankingids: [\n            11283,\n            11284,\n            11285\n        ],\n        team_group: 'contenders',\n        players: [\n            {\n                playerid: 21875845,\n                code: 'snax',\n                nick: 'Snax',\n                stickerids: [\n                    10854,\n                    10855,\n                    10856,\n                    10857\n                ],\n                rankingids: [\n                    11574,\n                    11575,\n                    11576\n                ],\n            },\n            {\n                playerid: 73906687,\n                code: 'rez',\n                nick: 'REZ',\n                stickerids: [\n                    10858,\n                    10859,\n                    10860,\n                    10861\n                ],\n                rankingids: [\n                    11577,\n                    11578,\n                    11579\n                ],\n            },\n            {\n                playerid: 356440446,\n                code: 'tauson',\n                nick: 'Tauson',\n                stickerids: [\n                    10862,\n                    10863,\n                    10864,\n                    10865\n                ],\n                rankingids: [\n                    11580,\n                    11581,\n                    11582\n                ],\n            },\n            {\n                playerid: 350295751,\n                code: 'pr',\n                nick: 'PR',\n                stickerids: [\n                    10866,\n                    10867,\n                    10868,\n                    10869\n                ],\n                rankingids: [\n                    11583,\n                    11584,\n                    11585\n                ],\n            },\n            {\n                playerid: 294421006,\n                code: 'hypex',\n                nick: 'hypex',\n                stickerids: [\n                    10870,\n                    10871,\n                    10872,\n                    10873\n                ],\n                rankingids: [\n                    11586,\n                    11587,\n                    11588\n                ],\n            },\n        ],\n        champions: [],\n    },\n    {\n        teamid: 135,\n        team: 'b8',\n        stickerid_graffiti: 10518,\n        stickerids: [\n            10437,\n            10438,\n            10439,\n            10440\n        ],\n        rankingids: [\n            11286,\n            11287,\n            11288\n        ],\n        team_group: 'contenders',\n        players: [\n            {\n                playerid: 1041272634,\n                code: 's1zzi',\n                nick: 's1zzi',\n                stickerids: [\n                    10874,\n                    10875,\n                    10876,\n                    10877\n                ],\n                rankingids: [\n                    11589,\n                    11590,\n                    11591\n                ],\n            },\n            {\n                playerid: 344771176,\n                code: 'npl',\n                nick: 'npl',\n                stickerids: [\n                    10878,\n                    10879,\n                    10880,\n                    10881\n                ],\n                rankingids: [\n                    11592,\n                    11593,\n                    11594\n                ],\n            },\n            {\n                playerid: 1189546625,\n                code: 'esenthial',\n                nick: 'esenthial',\n                stickerids: [\n                    10882,\n                    10883,\n                    10884,\n                    10885\n                ],\n                rankingids: [\n                    11595,\n                    11596,\n                    11597\n                ],\n            },\n            {\n                playerid: 343849791,\n                code: 'alex666',\n                nick: 'alex666',\n                stickerids: [\n                    10886,\n                    10887,\n                    10888,\n                    10889\n                ],\n                rankingids: [\n                    11598,\n                    11599,\n                    11600\n                ],\n            },\n            {\n                playerid: 421907931,\n                code: 'kensizor',\n                nick: 'kensizor',\n                stickerids: [\n                    10890,\n                    10891,\n                    10892,\n                    10893\n                ],\n                rankingids: [\n                    11601,\n                    11602,\n                    11603\n                ],\n            },\n        ],\n        champions: [],\n    },\n    {\n        teamid: 95,\n        team: 'hero',\n        stickerid_graffiti: 10519,\n        stickerids: [\n            10441,\n            10442,\n            10443,\n            10444\n        ],\n        rankingids: [\n            11289,\n            11290,\n            11291\n        ],\n        team_group: 'contenders',\n        players: [\n            {\n                playerid: 217943381,\n                code: 'xfl0ud',\n                nick: 'xfl0ud',\n                stickerids: [\n                    10894,\n                    10895,\n                    10896,\n                    10897\n                ],\n                rankingids: [\n                    11604,\n                    11605,\n                    11606\n                ],\n            },\n            {\n                playerid: 200790839,\n                code: 'nilo',\n                nick: 'nilo',\n                stickerids: [\n                    10898,\n                    10899,\n                    10900,\n                    10901\n                ],\n                rankingids: [\n                    11607,\n                    11608,\n                    11609\n                ],\n            },\n            {\n                playerid: 382452440,\n                code: 'susp',\n                nick: 'susp',\n                stickerids: [\n                    10902,\n                    10903,\n                    10904,\n                    10905\n                ],\n                rankingids: [\n                    11610,\n                    11611,\n                    11612\n                ],\n            },\n            {\n                playerid: 332333072,\n                code: 'chr1zn',\n                nick: 'Chr1zN',\n                stickerids: [\n                    10906,\n                    10907,\n                    10908,\n                    10909\n                ],\n                rankingids: [\n                    11613,\n                    11614,\n                    11615\n                ],\n            },\n            {\n                playerid: 1176878177,\n                code: 'yxngstxr',\n                nick: 'yxngstxr',\n                stickerids: [\n                    10910,\n                    10911,\n                    10912,\n                    10913\n                ],\n                rankingids: [\n                    11616,\n                    11617,\n                    11618\n                ],\n            },\n        ],\n        champions: [],\n    },\n    {\n        teamid: 137,\n        team: 'bb',\n        stickerid_graffiti: 10520,\n        stickerids: [\n            10445,\n            10446,\n            10447,\n            10448\n        ],\n        rankingids: [\n            11292,\n            11293,\n            11294\n        ],\n        team_group: 'contenders',\n        players: [\n            {\n                playerid: 185941338,\n                code: 'boombl4',\n                nick: 'Boombl4',\n                stickerids: [\n                    10914,\n                    10915,\n                    10916,\n                    10917\n                ],\n                rankingids: [\n                    11619,\n                    11620,\n                    11621\n                ],\n            },\n            {\n                playerid: 99348674,\n                code: 'zorte',\n                nick: 'zorte',\n                stickerids: [\n                    10918,\n                    10919,\n                    10920,\n                    10921\n                ],\n                rankingids: [\n                    11622,\n                    11623,\n                    11624\n                ],\n            },\n            {\n                playerid: 207519341,\n                code: 's1ren',\n                nick: 'S1ren',\n                stickerids: [\n                    10922,\n                    10923,\n                    10924,\n                    10925\n                ],\n                rankingids: [\n                    11625,\n                    11626,\n                    11627\n                ],\n            },\n            {\n                playerid: 53993406,\n                code: 'fl4mus',\n                nick: 'FL4MUS',\n                stickerids: [\n                    10926,\n                    10927,\n                    10928,\n                    10929\n                ],\n                rankingids: [\n                    11628,\n                    11629,\n                    11630\n                ],\n            },\n            {\n                playerid: 411757486,\n                code: 'magnojez',\n                nick: 'Magnojez',\n                stickerids: [\n                    10930,\n                    10931,\n                    10932,\n                    10933\n                ],\n                rankingids: [\n                    11631,\n                    11632,\n                    11633\n                ],\n            },\n        ],\n        champions: [],\n    },\n    {\n        teamid: 69,\n        team: 'big',\n        stickerid_graffiti: 10521,\n        stickerids: [\n            10449,\n            10450,\n            10451,\n            10452\n        ],\n        rankingids: [\n            11295,\n            11296,\n            11297\n        ],\n        team_group: 'contenders',\n        players: [\n            {\n                playerid: 1225952,\n                code: 'tabsen',\n                nick: 'tabseN',\n                stickerids: [\n                    10934,\n                    10935,\n                    10936,\n                    10937\n                ],\n                rankingids: [\n                    11634,\n                    11635,\n                    11636\n                ],\n            },\n            {\n                playerid: 118505645,\n                code: 'jdc',\n                nick: 'JDC',\n                stickerids: [\n                    10938,\n                    10939,\n                    10940,\n                    10941\n                ],\n                rankingids: [\n                    11637,\n                    11638,\n                    11639\n                ],\n            },\n            {\n                playerid: 157930364,\n                code: 'faven',\n                nick: 'faveN',\n                stickerids: [\n                    10942,\n                    10943,\n                    10944,\n                    10945\n                ],\n                rankingids: [\n                    11640,\n                    11641,\n                    11642\n                ],\n            },\n            {\n                playerid: 68193075,\n                code: 'blamef',\n                nick: 'blameF',\n                stickerids: [\n                    10946,\n                    10947,\n                    10948,\n                    10949\n                ],\n                rankingids: [\n                    11643,\n                    11644,\n                    11645\n                ],\n            },\n            {\n                playerid: 409910954,\n                code: 'gr1ks',\n                nick: 'gr1ks',\n                stickerids: [\n                    10950,\n                    10951,\n                    10952,\n                    10953\n                ],\n                rankingids: [\n                    11646,\n                    11647,\n                    11648\n                ],\n            },\n        ],\n        champions: [],\n    },\n    {\n        teamid: 140,\n        team: 'm80',\n        stickerid_graffiti: 10522,\n        stickerids: [\n            10453,\n            10454,\n            10455,\n            10456\n        ],\n        rankingids: [\n            11298,\n            11299,\n            11300\n        ],\n        team_group: 'contenders',\n        players: [\n            {\n                playerid: 222737943,\n                code: 'swisher',\n                nick: 'Swisher',\n                stickerids: [\n                    10954,\n                    10955,\n                    10956,\n                    10957\n                ],\n                rankingids: [\n                    11649,\n                    11650,\n                    11651\n                ],\n            },\n            {\n                playerid: 377218468,\n                code: 'lake',\n                nick: 'Lake',\n                stickerids: [\n                    10958,\n                    10959,\n                    10960,\n                    10961\n                ],\n                rankingids: [\n                    11652,\n                    11653,\n                    11654\n                ],\n            },\n            {\n                playerid: 223887847,\n                code: 'jba',\n                nick: 'JBa',\n                stickerids: [\n                    10962,\n                    10963,\n                    10964,\n                    10965\n                ],\n                rankingids: [\n                    11655,\n                    11656,\n                    11657\n                ],\n            },\n            {\n                playerid: 230197733,\n                code: 's1n',\n                nick: 's1n',\n                stickerids: [\n                    10966,\n                    10967,\n                    10968,\n                    10969\n                ],\n                rankingids: [\n                    11658,\n                    11659,\n                    11660\n                ],\n            },\n            {\n                playerid: 104087441,\n                code: 'slaxz',\n                nick: 'slaxz-',\n                stickerids: [\n                    10970,\n                    10971,\n                    10972,\n                    10973\n                ],\n                rankingids: [\n                    11661,\n                    11662,\n                    11663\n                ],\n            },\n        ],\n        champions: [],\n    },\n    {\n        teamid: 80,\n        team: 'mibr',\n        stickerid_graffiti: 10523,\n        stickerids: [\n            10457,\n            10458,\n            10459,\n            10460\n        ],\n        rankingids: [\n            11301,\n            11302,\n            11303\n        ],\n        team_group: 'contenders',\n        players: [\n            {\n                playerid: 144361165,\n                code: 'lnz',\n                nick: 'LNZ',\n                stickerids: [\n                    10974,\n                    10975,\n                    10976,\n                    10977\n                ],\n                rankingids: [\n                    11664,\n                    11665,\n                    11666\n                ],\n            },\n            {\n                playerid: 101158002,\n                code: 'insani',\n                nick: 'insani',\n                stickerids: [\n                    10978,\n                    10979,\n                    10980,\n                    10981\n                ],\n                rankingids: [\n                    11667,\n                    11668,\n                    11669\n                ],\n            },\n            {\n                playerid: 895610852,\n                code: 'brnz4n',\n                nick: 'brnz4n',\n                stickerids: [\n                    10982,\n                    10983,\n                    10984,\n                    10985\n                ],\n                rankingids: [\n                    11670,\n                    11671,\n                    11672\n                ],\n            },\n            {\n                playerid: 257999525,\n                code: 'venomzera',\n                nick: 'venomzera',\n                stickerids: [\n                    10986,\n                    10987,\n                    10988,\n                    10989\n                ],\n                rankingids: [\n                    11673,\n                    11674,\n                    11675\n                ],\n            },\n            {\n                playerid: 164802903,\n                code: 'kl1m',\n                nick: 'kl1m',\n                stickerids: [\n                    10990,\n                    10991,\n                    10992,\n                    10993\n                ],\n                rankingids: [\n                    11676,\n                    11677,\n                    11678\n                ],\n            },\n        ],\n        champions: [],\n    },\n    {\n        teamid: 147,\n        team: 'sinn',\n        stickerid_graffiti: 10524,\n        stickerids: [\n            10461,\n            10462,\n            10463,\n            10464\n        ],\n        rankingids: [\n            11304,\n            11305,\n            11306\n        ],\n        team_group: 'contenders',\n        players: [\n            {\n                playerid: 73173022,\n                code: 'beastik',\n                nick: 'beastik',\n                stickerids: [\n                    10994,\n                    10995,\n                    10996,\n                    10997\n                ],\n                rankingids: [\n                    11679,\n                    11680,\n                    11681\n                ],\n            },\n            {\n                playerid: 209294569,\n                code: 'shock',\n                nick: 'SHOCK',\n                stickerids: [\n                    10998,\n                    10999,\n                    11000,\n                    11001\n                ],\n                rankingids: [\n                    11682,\n                    11683,\n                    11684\n                ],\n            },\n            {\n                playerid: 389955370,\n                code: 'modo',\n                nick: 'MoDo',\n                stickerids: [\n                    11002,\n                    11003,\n                    11004,\n                    11005\n                ],\n                rankingids: [\n                    11685,\n                    11686,\n                    11687\n                ],\n            },\n            {\n                playerid: 292476348,\n                code: 'kisserek',\n                nick: 'kisserek',\n                stickerids: [\n                    11006,\n                    11007,\n                    11008,\n                    11009\n                ],\n                rankingids: [\n                    11688,\n                    11689,\n                    11690\n                ],\n            },\n            {\n                playerid: 344171388,\n                code: 'stressarn',\n                nick: 'stressarN',\n                stickerids: [\n                    11010,\n                    11011,\n                    11012,\n                    11013\n                ],\n                rankingids: [\n                    11691,\n                    11692,\n                    11693\n                ],\n            },\n        ],\n        champions: [],\n    },\n    {\n        teamid: 87,\n        team: 'nrg',\n        stickerid_graffiti: 10525,\n        stickerids: [\n            10465,\n            10466,\n            10467,\n            10468\n        ],\n        rankingids: [\n            11307,\n            11308,\n            11309\n        ],\n        team_group: 'contenders',\n        players: [\n            {\n                playerid: 230970467,\n                code: 'grim',\n                nick: 'Grim',\n                stickerids: [\n                    11014,\n                    11015,\n                    11016,\n                    11017\n                ],\n                rankingids: [\n                    11694,\n                    11695,\n                    11696\n                ],\n            },\n            {\n                playerid: 100218065,\n                code: 'br0',\n                nick: 'br0',\n                stickerids: [\n                    11018,\n                    11019,\n                    11020,\n                    11021\n                ],\n                rankingids: [\n                    11697,\n                    11698,\n                    11699\n                ],\n            },\n            {\n                playerid: 87206806,\n                code: 'osee',\n                nick: 'oSee',\n                stickerids: [\n                    11022,\n                    11023,\n                    11024,\n                    11025\n                ],\n                rankingids: [\n                    11700,\n                    11701,\n                    11702\n                ],\n            },\n            {\n                playerid: 14864123,\n                code: 'sonic',\n                nick: 'Sonic',\n                stickerids: [\n                    11026,\n                    11027,\n                    11028,\n                    11029\n                ],\n                rankingids: [\n                    11703,\n                    11704,\n                    11705\n                ],\n            },\n            {\n                playerid: 35624002,\n                code: 'nitro',\n                nick: 'nitr0',\n                stickerids: [\n                    11030,\n                    11031,\n                    11032,\n                    11033\n                ],\n                rankingids: [\n                    11706,\n                    11707,\n                    11708\n                ],\n            },\n        ],\n        champions: [],\n    },\n    {\n        teamid: 74,\n        team: 'tyl',\n        stickerid_graffiti: 10526,\n        stickerids: [\n            10469,\n            10470,\n            10471,\n            10472\n        ],\n        rankingids: [\n            11310,\n            11311,\n            11312\n        ],\n        team_group: 'contenders',\n        players: [\n            {\n                playerid: 148530751,\n                code: 'mercury',\n                nick: 'Mercury',\n                stickerids: [\n                    11034,\n                    11035,\n                    11036,\n                    11037\n                ],\n                rankingids: [\n                    11709,\n                    11710,\n                    11711\n                ],\n            },\n            {\n                playerid: 400141913,\n                code: 'jee',\n                nick: 'Jee',\n                stickerids: [\n                    11038,\n                    11039,\n                    11040,\n                    11041\n                ],\n                rankingids: [\n                    11712,\n                    11713,\n                    11714\n                ],\n            },\n            {\n                playerid: 404671310,\n                code: 'jamyoung',\n                nick: 'JamYoung',\n                stickerids: [\n                    11042,\n                    11043,\n                    11044,\n                    11045\n                ],\n                rankingids: [\n                    11715,\n                    11716,\n                    11717\n                ],\n            },\n            {\n                playerid: 394931794,\n                code: 'moseyuh',\n                nick: 'Moseyuh',\n                stickerids: [\n                    11046,\n                    11047,\n                    11048,\n                    11049\n                ],\n                rankingids: [\n                    11718,\n                    11719,\n                    11720\n                ],\n            },\n            {\n                playerid: 996643915,\n                code: 'zerocn',\n                nick: 'Zero',\n                stickerids: [\n                    11050,\n                    11051,\n                    11052,\n                    11053\n                ],\n                rankingids: [\n                    11721,\n                    11722,\n                    11723\n                ],\n            },\n        ],\n        champions: [],\n    },\n    {\n        teamid: 104,\n        team: 'shrk',\n        stickerid_graffiti: 10527,\n        stickerids: [\n            10473,\n            10474,\n            10475,\n            10476\n        ],\n        rankingids: [\n            11313,\n            11314,\n            11315\n        ],\n        team_group: 'contenders',\n        players: [\n            {\n                playerid: 174962930,\n                code: 'gafolo',\n                nick: 'gafolo',\n                stickerids: [\n                    11054,\n                    11055,\n                    11056,\n                    11057\n                ],\n                rankingids: [\n                    11724,\n                    11725,\n                    11726\n                ],\n            },\n            {\n                playerid: 849196548,\n                code: 'koala',\n                nick: 'koala',\n                stickerids: [\n                    11058,\n                    11059,\n                    11060,\n                    11061\n                ],\n                rankingids: [\n                    11727,\n                    11728,\n                    11729\n                ],\n            },\n            {\n                playerid: 1070706470,\n                code: 'maxxkor',\n                nick: 'maxxkor',\n                stickerids: [\n                    11062,\n                    11063,\n                    11064,\n                    11065\n                ],\n                rankingids: [\n                    11730,\n                    11731,\n                    11732\n                ],\n            },\n            {\n                playerid: 347468740,\n                code: 'rdnzao',\n                nick: 'rdnzao',\n                stickerids: [\n                    11066,\n                    11067,\n                    11068,\n                    11069\n                ],\n                rankingids: [\n                    11733,\n                    11734,\n                    11735\n                ],\n            },\n            {\n                playerid: 135630812,\n                code: 'doc',\n                nick: 'doc',\n                stickerids: [\n                    11070,\n                    11071,\n                    11072,\n                    11073\n                ],\n                rankingids: [\n                    11736,\n                    11737,\n                    11738\n                ],\n            },\n        ],\n        champions: [],\n    },\n    {\n        teamid: 146,\n        team: 'gaim',\n        stickerid_graffiti: 10528,\n        stickerids: [\n            10477,\n            10478,\n            10479,\n            10480\n        ],\n        rankingids: [\n            11316,\n            11317,\n            11318\n        ],\n        team_group: 'contenders',\n        players: [\n            {\n                playerid: 57761535,\n                code: 'hen1',\n                nick: 'HEN1',\n                stickerids: [\n                    11074,\n                    11075,\n                    11076,\n                    11077\n                ],\n                rankingids: [\n                    11739,\n                    11740,\n                    11741\n                ],\n            },\n            {\n                playerid: 22765766,\n                code: 'felps',\n                nick: 'felps',\n                stickerids: [\n                    11078,\n                    11079,\n                    11080,\n                    11081\n                ],\n                rankingids: [\n                    11742,\n                    11743,\n                    11744\n                ],\n            },\n            {\n                playerid: 76618432,\n                code: 'nekiz',\n                nick: 'NEKiZ',\n                stickerids: [\n                    11082,\n                    11083,\n                    11084,\n                    11085\n                ],\n                rankingids: [\n                    11745,\n                    11746,\n                    11747\n                ],\n            },\n            {\n                playerid: 46114258,\n                code: 'luken',\n                nick: 'luken',\n                stickerids: [\n                    11086,\n                    11087,\n                    11088,\n                    11089\n                ],\n                rankingids: [\n                    11748,\n                    11749,\n                    11750\n                ],\n            },\n            {\n                playerid: 94554756,\n                code: 'jota',\n                nick: 'JOTA',\n                stickerids: [\n                    11090,\n                    11091,\n                    11092,\n                    11093\n                ],\n                rankingids: [\n                    11751,\n                    11752,\n                    11753\n                ],\n            },\n        ],\n        champions: [],\n    },\n    {\n        teamid: 48,\n        team: 'liq',\n        stickerid_graffiti: 10529,\n        stickerids: [\n            10481,\n            10482,\n            10483,\n            10484\n        ],\n        rankingids: [\n            11319,\n            11320,\n            11321\n        ],\n        team_group: 'contenders',\n        players: [\n            {\n                playerid: 106428011,\n                code: 'elige',\n                nick: 'EliGE',\n                stickerids: [\n                    11094,\n                    11095,\n                    11096,\n                    11097\n                ],\n                rankingids: [\n                    11754,\n                    11755,\n                    11756\n                ],\n            },\n            {\n                playerid: 323723495,\n                code: 'ultimate',\n                nick: 'ultimate',\n                stickerids: [\n                    11098,\n                    11099,\n                    11100,\n                    11101\n                ],\n                rankingids: [\n                    11757,\n                    11758,\n                    11759\n                ],\n            },\n            {\n                playerid: 120437415,\n                code: 'malbsmd',\n                nick: 'malbsMd',\n                stickerids: [\n                    11102,\n                    11103,\n                    11104,\n                    11105\n                ],\n                rankingids: [\n                    11760,\n                    11761,\n                    11762\n                ],\n            },\n            {\n                playerid: 190407632,\n                code: 'siuhy',\n                nick: 'siuhy',\n                stickerids: [\n                    11106,\n                    11107,\n                    11108,\n                    11109\n                ],\n                rankingids: [\n                    11763,\n                    11764,\n                    11765\n                ],\n            },\n            {\n                playerid: 40885967,\n                code: 'naf',\n                nick: 'NAF',\n                stickerids: [\n                    11110,\n                    11111,\n                    11112,\n                    11113\n                ],\n                rankingids: [\n                    11766,\n                    11767,\n                    11768\n                ],\n            },\n        ],\n        champions: [],\n    },\n    {\n        teamid: 127,\n        team: 'lynn',\n        stickerid_graffiti: 10530,\n        stickerids: [\n            10485,\n            10486,\n            10487,\n            10488\n        ],\n        rankingids: [\n            11322,\n            11323,\n            11324\n        ],\n        team_group: 'contenders',\n        players: [\n            {\n                playerid: 146974312,\n                code: 'westmelon',\n                nick: 'westmelon',\n                stickerids: [\n                    11114,\n                    11115,\n                    11116,\n                    11117\n                ],\n                rankingids: [\n                    11769,\n                    11770,\n                    11771\n                ],\n            },\n            {\n                playerid: 177517735,\n                code: 'z4kr',\n                nick: 'z4KR',\n                stickerids: [\n                    11118,\n                    11119,\n                    11120,\n                    11121\n                ],\n                rankingids: [\n                    11772,\n                    11773,\n                    11774\n                ],\n            },\n            {\n                playerid: 920033815,\n                code: 'starry',\n                nick: 'Starry',\n                stickerids: [\n                    11122,\n                    11123,\n                    11124,\n                    11125\n                ],\n                rankingids: [\n                    11775,\n                    11776,\n                    11777\n                ],\n            },\n            {\n                playerid: 856465673,\n                code: 'emiliaqaq',\n                nick: 'EmiliaQAQ',\n                stickerids: [\n                    11126,\n                    11127,\n                    11128,\n                    11129\n                ],\n                rankingids: [\n                    11778,\n                    11779,\n                    11780\n                ],\n            },\n            {\n                playerid: 456122416,\n                code: 'c4llm3su3',\n                nick: 'C4LLM3SU3',\n                stickerids: [\n                    11130,\n                    11131,\n                    11132,\n                    11133\n                ],\n                rankingids: [\n                    11781,\n                    11782,\n                    11783\n                ],\n            },\n        ],\n        champions: [],\n    },\n    {\n        teamid: 148,\n        team: 'thun',\n        stickerid_graffiti: 10531,\n        stickerids: [\n            10489,\n            10490,\n            10491,\n            10492\n        ],\n        rankingids: [\n            11325,\n            11326,\n            11327\n        ],\n        team_group: 'contenders',\n        players: [\n            {\n                playerid: 101535513,\n                code: 'dexter',\n                nick: 'dexter',\n                stickerids: [\n                    11134,\n                    11135,\n                    11136,\n                    11137\n                ],\n                rankingids: [\n                    11784,\n                    11785,\n                    11786\n                ],\n            },\n            {\n                playerid: 112055988,\n                code: 'liazz',\n                nick: 'Liazz',\n                stickerids: [\n                    11138,\n                    11139,\n                    11140,\n                    11141\n                ],\n                rankingids: [\n                    11787,\n                    11788,\n                    11789\n                ],\n            },\n            {\n                playerid: 138080982,\n                code: 'alistair',\n                nick: 'aliStair',\n                stickerids: [\n                    11142,\n                    11143,\n                    11144,\n                    11145\n                ],\n                rankingids: [\n                    11790,\n                    11791,\n                    11792\n                ],\n            },\n            {\n                playerid: 68391216,\n                code: 'asap',\n                nick: 'asap',\n                stickerids: [\n                    11146,\n                    11147,\n                    11148,\n                    11149\n                ],\n                rankingids: [\n                    11793,\n                    11794,\n                    11795\n                ],\n            },\n            {\n                playerid: 203514302,\n                code: 'tjp',\n                nick: 'TjP',\n                stickerids: [\n                    11150,\n                    11151,\n                    11152,\n                    11153\n                ],\n                rankingids: [\n                    11796,\n                    11797,\n                    11798\n                ],\n            },\n        ],\n        champions: [],\n    },\n    {\n        teamid: 132,\n        team: 'fq',\n        stickerid_graffiti: 10532,\n        stickerids: [\n            10493,\n            10494,\n            10495,\n            10496\n        ],\n        rankingids: [\n            11328,\n            11329,\n            11330\n        ],\n        team_group: 'contenders',\n        players: [\n            {\n                playerid: 26946895,\n                code: 'ins',\n                nick: 'INS',\n                stickerids: [\n                    11154,\n                    11155,\n                    11156,\n                    11157\n                ],\n                rankingids: [\n                    11799,\n                    11800,\n                    11801\n                ],\n            },\n            {\n                playerid: 16839456,\n                code: 'jks',\n                nick: 'jks',\n                stickerids: [\n                    11158,\n                    11159,\n                    11160,\n                    11161\n                ],\n                rankingids: [\n                    11802,\n                    11803,\n                    11804\n                ],\n            },\n            {\n                playerid: 92622415,\n                code: 'vexite',\n                nick: 'vexite',\n                stickerids: [\n                    11162,\n                    11163,\n                    11164,\n                    11165\n                ],\n                rankingids: [\n                    11805,\n                    11806,\n                    11807\n                ],\n            },\n            {\n                playerid: 105182632,\n                code: 'story',\n                nick: 'story',\n                stickerids: [\n                    11166,\n                    11167,\n                    11168,\n                    11169\n                ],\n                rankingids: [\n                    11808,\n                    11809,\n                    11810\n                ],\n            },\n            {\n                playerid: 372579523,\n                code: 'nettik',\n                nick: 'nettik',\n                stickerids: [\n                    11170,\n                    11171,\n                    11172,\n                    11173\n                ],\n                rankingids: [\n                    11811,\n                    11812,\n                    11813\n                ],\n            },\n        ],\n        champions: [],\n    },\n];\nvar g_ActiveTournamentHighlights = [\n    {\n        itemid_dynamic_shop: 5323,\n        group_id: 1,\n        stage: 49,\n        highlights: [\n            {\n                kc_highlight: 85,\n                stage: 49,\n                teamid1: 48,\n                teamid2: 69,\n                map_name: 'de_nuke',\n                title: \"#HighlightReel_cologne2026_st1ultimatenukejumpkill\",\n                desc: \"#HighlightDesc_cologne2026_st1ultimatenukejumpkill\",\n            },\n            {\n                kc_highlight: 86,\n                stage: 49,\n                teamid1: 69,\n                teamid2: 87,\n                map_name: 'de_mirage',\n                title: \"#HighlightReel_cologne2026_st1tabsenmirage1v2clutch\",\n                desc: \"#HighlightDesc_cologne2026_st1tabsenmirage1v2clutch\",\n            },\n            {\n                kc_highlight: 87,\n                stage: 49,\n                teamid1: 74,\n                teamid2: 104,\n                map_name: 'de_inferno',\n                title: \"#HighlightReel_cologne2026_st1koalainfernoace\",\n                desc: \"#HighlightDesc_cologne2026_st1koalainfernoace\",\n            },\n            {\n                kc_highlight: 88,\n                stage: 49,\n                teamid1: 74,\n                teamid2: 127,\n                map_name: 'de_ancient',\n                title: \"#HighlightReel_cologne2026_st1starryancientquadkill\",\n                desc: \"#HighlightDesc_cologne2026_st1starryancientquadkill\",\n            },\n            {\n                kc_highlight: 89,\n                stage: 49,\n                teamid1: 80,\n                teamid2: 148,\n                map_name: 'de_inferno',\n                title: \"#HighlightReel_cologne2026_st1asapinfernoace\",\n                desc: \"#HighlightDesc_cologne2026_st1asapinfernoace\",\n            },\n            {\n                kc_highlight: 90,\n                stage: 49,\n                teamid1: 87,\n                teamid2: 115,\n                map_name: 'de_inferno',\n                title: \"#HighlightReel_cologne2026_st1hypexinfernosmokekill\",\n                desc: \"#HighlightDesc_cologne2026_st1hypexinfernosmokekill\",\n            },\n            {\n                kc_highlight: 91,\n                stage: 49,\n                teamid1: 95,\n                teamid2: 146,\n                map_name: 'de_inferno',\n                title: \"#HighlightReel_cologne2026_st1suspinferno1v3clutch\",\n                desc: \"#HighlightDesc_cologne2026_st1suspinferno1v3clutch\",\n            },\n            {\n                kc_highlight: 92,\n                stage: 49,\n                teamid1: 132,\n                teamid2: 147,\n                map_name: 'de_ancient',\n                title: \"#HighlightReel_cologne2026_st1beastikancientquadkill\",\n                desc: \"#HighlightDesc_cologne2026_st1beastikancientquadkill\",\n            },\n            {\n                kc_highlight: 93,\n                stage: 49,\n                teamid1: 135,\n                teamid2: 140,\n                map_name: 'de_inferno',\n                title: \"#HighlightReel_cologne2026_st1s1zziinferno1v3clutch\",\n                desc: \"#HighlightDesc_cologne2026_st1s1zziinferno1v3clutch\",\n            },\n            {\n                kc_highlight: 94,\n                stage: 49,\n                teamid1: 137,\n                teamid2: 146,\n                map_name: 'de_dust2',\n                title: \"#HighlightReel_cologne2026_st1magnojezdust21v3clutch\",\n                desc: \"#HighlightDesc_cologne2026_st1magnojezdust21v3clutch\",\n            },\n        ]\n    },\n    {\n        itemid_dynamic_shop: 5324,\n        group_id: 2,\n        stage: 65,\n        highlights: [\n            {\n                kc_highlight: 95,\n                stage: 65,\n                teamid1: 59,\n                teamid2: 69,\n                map_name: 'de_inferno',\n                title: \"#HighlightReel_cologne2026_st2nertzinfernoace\",\n                desc: \"#HighlightDesc_cologne2026_st2nertzinfernoace\",\n            },\n            {\n                kc_highlight: 96,\n                stage: 65,\n                teamid1: 59,\n                teamid2: 119,\n                map_name: 'de_mirage',\n                title: \"#HighlightReel_cologne2026_st2gizmymirageknifekill\",\n                desc: \"#HighlightDesc_cologne2026_st2gizmymirageknifekill\",\n            },\n            {\n                kc_highlight: 97,\n                stage: 65,\n                teamid1: 59,\n                teamid2: 140,\n                map_name: 'de_mirage',\n                title: \"#HighlightReel_cologne2026_st2matysmirageace\",\n                desc: \"#HighlightDesc_cologne2026_st2matysmirageace\",\n            },\n            {\n                kc_highlight: 98,\n                stage: 65,\n                teamid1: 60,\n                teamid2: 102,\n                map_name: 'de_nuke',\n                title: \"#HighlightReel_cologne2026_st2saffeenuketriplekill\",\n                desc: \"#HighlightDesc_cologne2026_st2saffeenuketriplekill\",\n            },\n            {\n                kc_highlight: 99,\n                stage: 65,\n                teamid1: 69,\n                teamid2: 135,\n                map_name: 'de_ancient',\n                title: \"#HighlightReel_cologne2026_st2gr1ksancient1v3awpclutch\",\n                desc: \"#HighlightDesc_cologne2026_st2gr1ksancient1v3awpclutch\",\n            },\n            {\n                kc_highlight: 100,\n                stage: 65,\n                teamid1: 69,\n                teamid2: 135,\n                map_name: 'de_dust2',\n                title: \"#HighlightReel_cologne2026_st2kensizordust2acetoadvance\",\n                desc: \"#HighlightDesc_cologne2026_st2kensizordust2acetoadvance\",\n            },\n            {\n                kc_highlight: 101,\n                stage: 65,\n                teamid1: 69,\n                teamid2: 135,\n                map_name: 'de_overpass',\n                title: \"#HighlightReel_cologne2026_st2s1zzioverpassace\",\n                desc: \"#HighlightDesc_cologne2026_st2s1zzioverpassace\",\n            },\n            {\n                kc_highlight: 102,\n                stage: 65,\n                teamid1: 80,\n                teamid2: 135,\n                map_name: 'de_mirage',\n                title: \"#HighlightReel_cologne2026_st2venomzeramirage1v3clutch\",\n                desc: \"#HighlightDesc_cologne2026_st2venomzeramirage1v3clutch\",\n            },\n            {\n                kc_highlight: 103,\n                stage: 65,\n                teamid1: 81,\n                teamid2: 112,\n                map_name: 'de_nuke',\n                title: \"#HighlightReel_cologne2026_st2donknuke4kwithonetaps\",\n                desc: \"#HighlightDesc_cologne2026_st2donknuke4kwithonetaps\",\n            },\n            {\n                kc_highlight: 104,\n                stage: 65,\n                teamid1: 102,\n                teamid2: 119,\n                map_name: 'de_dust2',\n                title: \"#HighlightReel_cologne2026_st2azuwudust2deagleace\",\n                desc: \"#HighlightDesc_cologne2026_st2azuwudust2deagleace\",\n            },\n        ]\n    },\n    {\n        itemid_dynamic_shop: 5325,\n        group_id: 3,\n        stage: 83,\n        highlights: [\n            {\n                kc_highlight: 105,\n                stage: 83,\n                teamid1: 12,\n                teamid2: 59,\n                map_name: 'de_dust2',\n                title: \"#HighlightReel_cologne2026_st3w0nderfuldust22hp1v4clutch\",\n                desc: \"#HighlightDesc_cologne2026_st3w0nderfuldust22hp1v4clutch\",\n            },\n            {\n                kc_highlight: 106,\n                stage: 83,\n                teamid1: 81,\n                teamid2: 112,\n                map_name: 'de_dust2',\n                title: \"#HighlightReel_cologne2026_st3sh1rodust24kwith1v2clutch\",\n                desc: \"#HighlightDesc_cologne2026_st3sh1rodust24kwith1v2clutch\",\n            },\n            {\n                kc_highlight: 107,\n                stage: 83,\n                teamid1: 81,\n                teamid2: 134,\n                map_name: 'de_anubis',\n                title: \"#HighlightReel_cologne2026_st3magixxanubismultiweaponace\",\n                desc: \"#HighlightDesc_cologne2026_st3magixxanubismultiweaponace\",\n            },\n            {\n                kc_highlight: 108,\n                stage: 83,\n                teamid1: 85,\n                teamid2: 135,\n                map_name: 'de_inferno',\n                title: \"#HighlightReel_cologne2026_st3ksceratoinferno1v3clutch\",\n                desc: \"#HighlightDesc_cologne2026_st3ksceratoinferno1v3clutch\",\n            },\n            {\n                kc_highlight: 109,\n                stage: 83,\n                teamid1: 85,\n                teamid2: 135,\n                map_name: 'de_mirage',\n                title: \"#HighlightReel_cologne2026_st3yekindarmiragetriplekill\",\n                desc: \"#HighlightDesc_cologne2026_st3yekindarmiragetriplekill\",\n            },\n            {\n                kc_highlight: 110,\n                stage: 83,\n                teamid1: 89,\n                teamid2: 145,\n                map_name: 'de_overpass',\n                title: \"#HighlightReel_cologne2026_st3zywoooverpassacewith1v3clutch\",\n                desc: \"#HighlightDesc_cologne2026_st3zywoooverpassacewith1v3clutch\",\n            },\n            {\n                kc_highlight: 111,\n                stage: 83,\n                teamid1: 112,\n                teamid2: 122,\n                map_name: 'de_overpass',\n                title: \"#HighlightReel_cologne2026_st3dgtoverpasspistolace\",\n                desc: \"#HighlightDesc_cologne2026_st3dgtoverpasspistolace\",\n            },\n            {\n                kc_highlight: 112,\n                stage: 83,\n                teamid1: 112,\n                teamid2: 134,\n                map_name: 'de_dust2',\n                title: \"#HighlightReel_cologne2026_st3woxicdust21v4clutch\",\n                desc: \"#HighlightDesc_cologne2026_st3woxicdust21v4clutch\",\n            },\n            {\n                kc_highlight: 113,\n                stage: 83,\n                teamid1: 119,\n                teamid2: 139,\n                map_name: 'de_mirage',\n                title: \"#HighlightReel_cologne2026_st3nikomiragequadkill\",\n                desc: \"#HighlightDesc_cologne2026_st3nikomiragequadkill\",\n            },\n            {\n                kc_highlight: 114,\n                stage: 83,\n                teamid1: 137,\n                teamid2: 145,\n                map_name: 'de_mirage',\n                title: \"#HighlightReel_cologne2026_st3krabenimirageace\",\n                desc: \"#HighlightDesc_cologne2026_st3krabenimirageace\",\n            },\n        ]\n    },\n    {\n        itemid_dynamic_shop: 5326,\n        group_id: 4,\n        stage: 6,\n        highlights: [\n            {\n                kc_highlight: 115,\n                stage: 6,\n                teamid1: 134,\n                teamid2: 137,\n                map_name: 'de_nuke',\n                title: \"#HighlightReel_cologne2026_qfboombl4nuke1v3clutch\",\n                desc: \"#HighlightDesc_cologne2026_qfboombl4nuke1v3clutch\",\n            },\n            {\n                kc_highlight: 116,\n                stage: 6,\n                teamid1: 134,\n                teamid2: 137,\n                map_name: 'de_nuke',\n                title: \"#HighlightReel_cologne2026_qfsoulflynuke1v2clutch\",\n                desc: \"#HighlightDesc_cologne2026_qfsoulflynuke1v2clutch\",\n            },\n            {\n                kc_highlight: 117,\n                stage: 6,\n                teamid1: 59,\n                teamid2: 81,\n                map_name: 'de_mirage',\n                title: \"#HighlightReel_cologne2026_qfsh1romirageace\",\n                desc: \"#HighlightDesc_cologne2026_qfsh1romirageace\",\n            },\n            {\n                kc_highlight: 118,\n                stage: 6,\n                teamid1: 59,\n                teamid2: 81,\n                map_name: 'de_mirage',\n                title: \"#HighlightReel_cologne2026_qfmagixxmirage1v4clutch\",\n                desc: \"#HighlightDesc_cologne2026_qfmagixxmirage1v4clutch\",\n            },\n            {\n                kc_highlight: 119,\n                stage: 6,\n                teamid1: 59,\n                teamid2: 81,\n                map_name: 'de_dust2',\n                title: \"#HighlightReel_cologne2026_qfdonkdust21v2clutch\",\n                desc: \"#HighlightDesc_cologne2026_qfdonkdust21v2clutch\",\n            },\n            {\n                kc_highlight: 120,\n                stage: 6,\n                teamid1: 89,\n                teamid2: 139,\n                map_name: 'de_anubis',\n                title: \"#HighlightReel_cologne2026_qfkyousukeanubis3kills\",\n                desc: \"#HighlightDesc_cologne2026_qfkyousukeanubis3kills\",\n            },\n            {\n                kc_highlight: 121,\n                stage: 6,\n                teamid1: 89,\n                teamid2: 139,\n                map_name: 'de_dust2',\n                title: \"#HighlightReel_cologne2026_qfmeziidust2molotovkill\",\n                desc: \"#HighlightDesc_cologne2026_qfmeziidust2molotovkill\",\n            },\n            {\n                kc_highlight: 122,\n                stage: 6,\n                teamid1: 85,\n                teamid2: 112,\n                map_name: 'de_mirage',\n                title: \"#HighlightReel_cologne2026_qfyuurihmirage1v4clutch\",\n                desc: \"#HighlightDesc_cologne2026_qfyuurihmirage1v4clutch\",\n            },\n            {\n                kc_highlight: 123,\n                stage: 6,\n                teamid1: 85,\n                teamid2: 112,\n                map_name: 'de_overpass',\n                title: \"#HighlightReel_cologne2026_qfhuasopeekoverpassace\",\n                desc: \"#HighlightDesc_cologne2026_qfhuasopeekoverpassace\",\n            },\n            {\n                kc_highlight: 124,\n                stage: 6,\n                teamid1: 85,\n                teamid2: 112,\n                map_name: 'de_dust2',\n                title: \"#HighlightReel_cologne2026_qfmaxdust21v2clutch\",\n                desc: \"#HighlightDesc_cologne2026_qfmaxdust21v2clutch\",\n            },\n        ]\n    },\n    {\n        itemid_dynamic_shop: 5327,\n        group_id: 5,\n        stage: 8,\n        highlights: [\n            {\n                kc_highlight: 125,\n                stage: 8,\n                teamid1: 85,\n                teamid2: 134,\n                map_name: 'de_dust2',\n                title: \"#HighlightReel_cologne2026_sfsoulflydust23kills\",\n                desc: \"#HighlightDesc_cologne2026_sfsoulflydust23kills\",\n            },\n            {\n                kc_highlight: 126,\n                stage: 8,\n                teamid1: 85,\n                teamid2: 134,\n                map_name: 'de_dust2',\n                title: \"#HighlightReel_cologne2026_sfksceratodust2ace\",\n                desc: \"#HighlightDesc_cologne2026_sfksceratodust2ace\",\n            },\n            {\n                kc_highlight: 127,\n                stage: 8,\n                teamid1: 85,\n                teamid2: 134,\n                map_name: 'de_dust2',\n                title: \"#HighlightReel_cologne2026_sfyekindardust22kills\",\n                desc: \"#HighlightDesc_cologne2026_sfyekindardust22kills\",\n            },\n            {\n                kc_highlight: 128,\n                stage: 8,\n                teamid1: 85,\n                teamid2: 134,\n                map_name: 'de_nuke',\n                title: \"#HighlightReel_cologne2026_sfyekindarnuketriplekill\",\n                desc: \"#HighlightDesc_cologne2026_sfyekindarnuketriplekill\",\n            },\n            {\n                kc_highlight: 129,\n                stage: 8,\n                teamid1: 85,\n                teamid2: 134,\n                map_name: 'de_nuke',\n                title: \"#HighlightReel_cologne2026_sfksceratonukequadkill\",\n                desc: \"#HighlightDesc_cologne2026_sfksceratonukequadkill\",\n            },\n            {\n                kc_highlight: 130,\n                stage: 8,\n                teamid1: 81,\n                teamid2: 139,\n                map_name: 'de_anubis',\n                title: \"#HighlightReel_cologne2026_sfkyousukeanubistriplekill\",\n                desc: \"#HighlightDesc_cologne2026_sfkyousukeanubistriplekill\",\n            },\n            {\n                kc_highlight: 131,\n                stage: 8,\n                teamid1: 81,\n                teamid2: 139,\n                map_name: 'de_anubis',\n                title: \"#HighlightReel_cologne2026_sfsh1roanubisquadkill\",\n                desc: \"#HighlightDesc_cologne2026_sfsh1roanubisquadkill\",\n            },\n            {\n                kc_highlight: 132,\n                stage: 8,\n                teamid1: 81,\n                teamid2: 139,\n                map_name: 'de_dust2',\n                title: \"#HighlightReel_cologne2026_sftesesdust21v2clutch\",\n                desc: \"#HighlightDesc_cologne2026_sftesesdust21v2clutch\",\n            },\n            {\n                kc_highlight: 133,\n                stage: 8,\n                teamid1: 81,\n                teamid2: 139,\n                map_name: 'de_mirage',\n                title: \"#HighlightReel_cologne2026_sfkarriganmirage4kills\",\n                desc: \"#HighlightDesc_cologne2026_sfkarriganmirage4kills\",\n            },\n            {\n                kc_highlight: 134,\n                stage: 8,\n                teamid1: 81,\n                teamid2: 139,\n                map_name: 'de_mirage',\n                title: \"#HighlightReel_cologne2026_sfmagixxmirage4kills\",\n                desc: \"#HighlightDesc_cologne2026_sfmagixxmirage4kills\",\n            },\n        ]\n    },\n    {\n        itemid_dynamic_shop: 5328,\n        group_id: 6,\n        stage: 97,\n        highlights: [\n            {\n                kc_highlight: 135,\n                stage: 97,\n                teamid1: 85,\n                teamid2: 139,\n                map_name: 'de_mirage',\n                title: \"#HighlightReel_cologne2026_gffalconsteamentrance\",\n                desc: \"#HighlightDesc_cologne2026_gffalconsteamentrance\",\n            },\n            {\n                kc_highlight: 136,\n                stage: 97,\n                teamid1: 85,\n                teamid2: 139,\n                map_name: 'de_mirage',\n                title: \"#HighlightReel_cologne2026_gffuriateamentrance\",\n                desc: \"#HighlightDesc_cologne2026_gffuriateamentrance\",\n            },\n            {\n                kc_highlight: 137,\n                stage: 97,\n                teamid1: 85,\n                teamid2: 139,\n                map_name: 'de_mirage',\n                title: \"#HighlightReel_cologne2026_gffallenmiragequadkill\",\n                desc: \"#HighlightDesc_cologne2026_gffallenmiragequadkill\",\n            },\n            {\n                kc_highlight: 138,\n                stage: 97,\n                teamid1: 85,\n                teamid2: 139,\n                map_name: 'de_anubis',\n                title: \"#HighlightReel_cologne2026_gfm0nesyanubis4kills\",\n                desc: \"#HighlightDesc_cologne2026_gfm0nesyanubis4kills\",\n            },\n            {\n                kc_highlight: 139,\n                stage: 97,\n                teamid1: 85,\n                teamid2: 139,\n                map_name: 'de_anubis',\n                title: \"#HighlightReel_cologne2026_gfm0nesyanubis3killswith1v2clutch\",\n                desc: \"#HighlightDesc_cologne2026_gfm0nesyanubis3killswith1v2clutch\",\n            },\n            {\n                kc_highlight: 140,\n                stage: 97,\n                teamid1: 85,\n                teamid2: 139,\n                map_name: 'de_inferno',\n                title: \"#HighlightReel_cologne2026_gfkyousukeinferno4kills\",\n                desc: \"#HighlightDesc_cologne2026_gfkyousukeinferno4kills\",\n            },\n            {\n                kc_highlight: 141,\n                stage: 97,\n                teamid1: 85,\n                teamid2: 139,\n                map_name: 'de_inferno',\n                title: \"#HighlightReel_cologne2026_gfkarriganinferno3kills\",\n                desc: \"#HighlightDesc_cologne2026_gfkarriganinferno3kills\",\n            },\n            {\n                kc_highlight: 142,\n                stage: 97,\n                teamid1: 85,\n                teamid2: 139,\n                map_name: 'de_inferno',\n                title: \"#HighlightReel_cologne2026_gfnikoinfernotriplekill\",\n                desc: \"#HighlightDesc_cologne2026_gfnikoinfernotriplekill\",\n            },\n            {\n                kc_highlight: 143,\n                stage: 97,\n                teamid1: 85,\n                teamid2: 139,\n                map_name: 'de_inferno',\n                title: \"#HighlightReel_cologne2026_gfkarriganinfernodoublekill\",\n                desc: \"#HighlightDesc_cologne2026_gfkarriganinfernodoublekill\",\n            },\n            {\n                kc_highlight: 144,\n                stage: 97,\n                teamid1: 85,\n                teamid2: 139,\n                map_name: 'de_inferno',\n                title: \"#HighlightReel_cologne2026_gfm0nesyinfernomajorwinningkill\",\n                desc: \"#HighlightDesc_cologne2026_gfm0nesyinfernomajorwinningkill\",\n            },\n            {\n                kc_highlight: 145,\n                stage: 97,\n                teamid1: 85,\n                teamid2: 139,\n                map_name: 'de_inferno',\n                title: \"#HighlightReel_cologne2026_gffalconstrophyliftingmoment\",\n                desc: \"#HighlightDesc_cologne2026_gffalconstrophyliftingmoment\",\n            },\n        ]\n    },\n];\nvar g_ActiveTournamentStoreLayout = [\n    [\n        g_ActiveTournamentInfo.itemid_pass,\n        g_ActiveTournamentInfo.itemid_pack,\n        '#CSGO_TournamentPass_cologne2026_pack_tinyname'\n    ]\n];\nvar g_ActiveTournamentPasses = [\n    g_ActiveTournamentInfo.itemid_pass,\n    g_ActiveTournamentInfo.itemid_pack,\n];\nvar g_ActiveTournamentDynamicContainers = [\n    5316,\n    5329,\n    4040,\n    5323,\n    5324,\n    5325,\n    5326,\n    5327,\n    5328,\n];\n","scripts/hud/huddeathpanel.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../common/anim_background.ts\" />\nvar HudDeathPanel;\n(function (HudDeathPanel) {\n    $.RegisterEventHandler('CSGOHudDeathPanelSetFlair', $.GetContextPanel(), OnSetFlairEvent);\n    function OnSetFlairEvent(xuid, skillgroup) {\n        let elAvatarFlair = $('#AvatarFlair');\n        let elMedalText = $('#MedalText');\n        let elAvatarFlairSS = $('#AvatarFlairSS');\n        let elMedalTextSS = $('#MedalTextSS');\n        let elPlayerAvatarSkillGroup = $('#PlayerAvatarSkillGroup');\n        SetAnimBackground(xuid);\n        let flairItemImage = GetFlairItemImage(xuid);\n        if (flairItemImage !== '') {\n            elAvatarFlair.RemoveClass('DeathPanel__AvatarFlair--Hidden');\n            elAvatarFlair.SetImage('file://{images}' + flairItemImage + '_small.png');\n            elAvatarFlairSS.RemoveClass('DeathPanel__AvatarFlair--Hidden');\n            elAvatarFlairSS.SetImage('file://{images}' + flairItemImage + '_small.png');\n            let flairItemName = InventoryAPI.GetFlairItemName(xuid);\n            if (flairItemName === '') {\n                elMedalText.AddClass('DeathPanel__MedalText--Hidden');\n                elMedalTextSS.AddClass('DeathPanel__MedalText--Hidden');\n            }\n            else {\n                elMedalText.RemoveClass('DeathPanel__MedalText--Hidden');\n                elMedalText.text = flairItemName;\n                elMedalTextSS.RemoveClass('DeathPanel__MedalText--Hidden');\n                elMedalTextSS.text = flairItemName;\n            }\n        }\n        else {\n            elAvatarFlair.AddClass('DeathPanel__AvatarFlair--Hidden');\n            elMedalText.AddClass('DeathPanel__MedalText--Hidden');\n            elAvatarFlairSS.AddClass('DeathPanel__AvatarFlair--Hidden');\n            elMedalTextSS.AddClass('DeathPanel__MedalText--Hidden');\n        }\n        if (skillgroup) {\n            elPlayerAvatarSkillGroup.SetImage('file://{images}/icons/skillgroups/dangerzone' + skillgroup + '.svg');\n            elPlayerAvatarSkillGroup.RemoveClass('DeathPanel__AvatarSkillGroup--Hidden');\n        }\n        else {\n            elPlayerAvatarSkillGroup.AddClass('DeathPanel__AvatarSkillGroup--Hidden');\n        }\n    }\n    function SetAnimBackground(xuid) {\n        HudSpecatorBg.PickBg(xuid);\n    }\n    function GetFlairItemImage(xuid) {\n        if (xuid === '' || xuid === '0')\n            return '';\n        let flairItemId = InventoryAPI.GetFlairItemId(xuid);\n        if (flairItemId === \"0\" || !flairItemId) {\n            let flairDefIdx = FriendsListAPI.GetFriendDisplayItemDefFeatured(xuid);\n            flairItemId = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(flairDefIdx, 0);\n            if (flairItemId === \"0\" || !flairItemId)\n                return '';\n        }\n        return InventoryAPI.GetItemInventoryImage(flairItemId);\n    }\n})(HudDeathPanel || (HudDeathPanel = {}));\n","scripts/hud/huddemocontroller.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\nvar HudDemoController;\n(function (HudDemoController) {\n    function EatClick() {\n        return true;\n    }\n    HudDemoController.EatClick = EatClick;\n    let ObserverMode;\n    (function (ObserverMode) {\n        ObserverMode[ObserverMode[\"OBS_MODE_NONE\"] = 0] = \"OBS_MODE_NONE\";\n        ObserverMode[ObserverMode[\"OBS_MODE_FIXED\"] = 1] = \"OBS_MODE_FIXED\";\n        ObserverMode[ObserverMode[\"OBS_MODE_IN_EYE\"] = 2] = \"OBS_MODE_IN_EYE\";\n        ObserverMode[ObserverMode[\"OBS_MODE_CHASE\"] = 3] = \"OBS_MODE_CHASE\";\n        ObserverMode[ObserverMode[\"OBS_MODE_ROAMING\"] = 4] = \"OBS_MODE_ROAMING\";\n    })(ObserverMode || (ObserverMode = {}));\n    let DemoTimelineEvent;\n    (function (DemoTimelineEvent) {\n        DemoTimelineEvent[DemoTimelineEvent[\"EDemoTimelineEvent_Kill\"] = 0] = \"EDemoTimelineEvent_Kill\";\n        DemoTimelineEvent[DemoTimelineEvent[\"EDemoTimelineEvent_Death\"] = 1] = \"EDemoTimelineEvent_Death\";\n        DemoTimelineEvent[DemoTimelineEvent[\"EDemoTimelineEvent_DamageInflicted\"] = 2] = \"EDemoTimelineEvent_DamageInflicted\";\n        DemoTimelineEvent[DemoTimelineEvent[\"EDemoTimelineEvent_DamageReceived\"] = 3] = \"EDemoTimelineEvent_DamageReceived\";\n        DemoTimelineEvent[DemoTimelineEvent[\"EDemoTimelineEvent_TickMarker\"] = 4] = \"EDemoTimelineEvent_TickMarker\";\n    })(DemoTimelineEvent || (DemoTimelineEvent = {}));\n    function TimelineEventToLabel(timelineEvent) {\n        const labels = [\n            \"kill\",\n            \"death\",\n            \"dealt_damage\",\n            \"received_damage\",\n            \"tick\"\n        ];\n        return labels[timelineEvent];\n    }\n    const timeStepSeconds = 15;\n    const cp = $.GetContextPanel();\n    cp.SetDialogVariableInt(\"timestep_value\", timeStepSeconds);\n    const slider = $(\"#Slider\");\n    const timescale = $(\"#TimeScale\");\n    const XRayToggleButton = $(\"#XRayToggleButton\");\n    const TrueViewToggleButton = $(\"#TrueViewToggleButton\");\n    const TrueViewDOACheckBox = $(\"#TrueViewDOACheckBox\");\n    const TrueViewDOAToggleButton = $(\"#TrueViewDOAToggleButton\");\n    const TrueViewWrongVersionCheckBox = $(\"#TrueViewWrongVersionCheckBox\");\n    const TrueViewWrongVersionToggleButton = $(\"#TrueViewWrongVersionToggleButton\");\n    const SettingsPanel = $(\"#Settings\");\n    timescale.SetPanelEvent('onmouseover', () => UiToolkitAPI.ShowTextTooltip(timescale.id, \"Playback speed\"));\n    timescale.SetPanelEvent('onmouseout', () => UiToolkitAPI.HideTextTooltip());\n    const hud = cp.GetParent();\n    $.RegisterForUnhandledEvent(\"DemoToggleUI\", () => {\n        if (!cp.IsPlayingDemo())\n            return;\n        if (lastState && lastState.bIsPlayingBroadcast)\n            return;\n        if (lastState && lastState.bIsOverwatch)\n            return;\n        if (hud.BHasClass(\"DemoControllerMinimal\")) {\n            hud.SetHasClass(\"DemoControllerMinimal\", false);\n            hud.SetHasClass(\"DemoControllerFull\", true);\n        }\n        else if (hud.BHasClass(\"DemoControllerFull\")) {\n            hud.SetHasClass(\"DemoControllerMinimal\", false);\n            hud.SetHasClass(\"DemoControllerFull\", false);\n        }\n        else {\n            hud.SetHasClass(\"DemoControllerMinimal\", true);\n            hud.SetHasClass(\"DemoControllerFull\", false);\n        }\n    });\n    $.RegisterForUnhandledEvent(\"DemoSetHUDVisible\", (bVisible) => {\n        if (!cp.IsPlayingDemo())\n            return;\n        hud.SetHasClass(\"hide\", !bVisible);\n    });\n    $.RegisterForUnhandledEvent(\"DemoSetMouseEnabled\", (bEnabled) => {\n        if (!cp.IsPlayingDemo())\n            return;\n        cp.SetHasClass(\"mouseActive\", bEnabled);\n        const sMouseMode = bEnabled ?\n            $.Localize('#CSGO_Demo_Enable_Mouse_Camera', cp) :\n            $.Localize('#CSGO_Demo_Enable_Mouse_Cursor', cp);\n        cp.SetDialogVariable('mouse-mode', sMouseMode);\n    });\n    let lastState = null;\n    let bRoundsMarked = false;\n    let bAtEndOfPlayback = false;\n    let nSpectatingPlayerId = -1;\n    let bHighlightsMode = false;\n    function FrameUpdate() {\n        const state = cp.GetDemoControllerState();\n        if (state == null) {\n            hud.SetHasClass(\"DemoControllerMinimal\", false);\n            hud.SetHasClass(\"DemoControllerFull\", false);\n            lastState = null;\n            $.Schedule(1, FrameUpdate);\n            return;\n        }\n        const nFinalTick = state.bIsPlayingHighlights && state.HighlightIntervals ?\n            state.HighlightIntervals.at(-1)?.nTickEnd :\n            state.RoundIntervals.at(-1)?.nTickEnd;\n        const bStateAtEndOfPlayback = nFinalTick != undefined && state.nTick >= nFinalTick;\n        if (bStateAtEndOfPlayback != bAtEndOfPlayback) {\n            if (state.bIsOverwatch) {\n                const sEndPlayback = bStateAtEndOfPlayback ?\n                    $.Localize('#CSGO_Demo_End_Playback_Overwatch_Finished') :\n                    $.Localize('#CSGO_Demo_End_Playback_Overwatch');\n                cp.SetDialogVariable('end-playback', sEndPlayback);\n            }\n            bAtEndOfPlayback = bStateAtEndOfPlayback;\n        }\n        if (!cp.visible || !cp.BReadyForDisplay() || !cp.IsSizeValid()) {\n            $.Schedule(1, FrameUpdate);\n            return;\n        }\n        $.Schedule(0, FrameUpdate);\n        let bStateChanged = false;\n        if (lastState == null || lastState.sFileName !== state.sFileName) {\n            bRoundsMarked = false;\n            bStateChanged = true;\n            let sFileName = state.sFileName.replaceAll(\"\\\\\", \"/\");\n            let nSlashIndex = sFileName.lastIndexOf(\"/\");\n            if (nSlashIndex !== -1)\n                sFileName = sFileName.substring(nSlashIndex + 1);\n            cp.SetDialogVariable(\"total_time\", TicksToTimeText(state.nTotalTicks, state.nSecondsPerTick, false));\n            if (state?.bIsPlayingBroadcast) {\n                hud.SetHasClass(\"DemoControllerHidden\", false);\n                hud.SetHasClass(\"DemoControllerMinimal\", false);\n                hud.SetHasClass(\"DemoControllerFull\", false);\n            }\n            else {\n                let nUIMode = Number(GameInterfaceAPI.GetSettingString(\"demo_ui_mode\"));\n                hud.SetHasClass(\"DemoControllerHidden\", nUIMode == 0);\n                hud.SetHasClass(\"DemoControllerMinimal\", nUIMode == 1);\n                hud.SetHasClass(\"DemoControllerFull\", nUIMode == 2);\n            }\n            OnHighlightsModeChanged(state.bIsPlayingHighlights);\n            bHighlightsMode = state.bIsPlayingHighlights;\n            const sEndPlayback = state.bIsOverwatch ?\n                $.Localize('#CSGO_Demo_End_Playback_Overwatch') :\n                $.Localize('#CSGO_Demo_End_Playback');\n            cp.SetDialogVariable('end-playback', sEndPlayback);\n            const sMouseMode = $.Localize('#CSGO_Demo_Enable_Mouse_Camera', cp);\n            cp.SetDialogVariable('mouse-mode', sMouseMode);\n        }\n        lastState = state;\n        const pMarkers = $(\"#RoundMarkers\");\n        if (pMarkers.actuallayoutwidth > 0 && !bRoundsMarked) {\n            bRoundsMarked = true;\n            pMarkers.RemoveAndDeleteChildren();\n            const pThumb = $(\"#SliderThumb\");\n            const nThumbWidth = pThumb.actuallayoutwidth / pThumb.actualuiscale_x;\n            const nMarkersWidth = (pMarkers.actuallayoutwidth / pThumb.actualuiscale_x) - nThumbWidth;\n            for (let i = 0; i < state.RoundIntervals.length; i++) {\n                const nStartTick = state.RoundIntervals[i].nTickStart;\n                const nEndTick = state.RoundIntervals[i].nTickEnd;\n                let nLeft = nStartTick / state.nTotalTicks * nMarkersWidth + nThumbWidth / 2;\n                let nWidth = (nEndTick - nStartTick) / state.nTotalTicks * nMarkersWidth;\n                if (i === 0) {\n                    nWidth += nLeft;\n                    nLeft = 0;\n                }\n                else if (i === state.RoundIntervals.length - 1) {\n                    nWidth += nThumbWidth / 2;\n                }\n                const className = i % 2 === 0 ? \"roundMarker even\" : \"roundMarker odd\";\n                const pMarker = $.CreatePanel(\"Panel\", pMarkers, \"\", { class: className });\n                pMarker.style.position = `${nLeft}px 0 0`;\n                pMarker.style.width = nWidth + \"px\";\n            }\n        }\n        if (nSpectatingPlayerId != state.nSpectatingPlayerId) {\n            CreateHighlightIntervals();\n            CreateTimelineEvents();\n            nSpectatingPlayerId = state.nSpectatingPlayerId;\n            $(\"#HighlightsButton\")?.SetHasClass(\"hide\", !ShouldShowHighlightsButton());\n        }\n        if ((state.bIsPlayingHighlights != bHighlightsMode) || bStateChanged) {\n            OnHighlightsModeChanged(state.bIsPlayingHighlights);\n            bHighlightsMode = state.bIsPlayingHighlights;\n        }\n        cp.SetHasClass(\"paused\", state.bIsPaused);\n        cp.SetHasClass(\"mouseCamAllowed\", IsMouseCameraAllowed());\n        cp.SetHasClass(\"flyCamActive\", state.nObserverMode == ObserverMode.OBS_MODE_ROAMING);\n        slider.min = 0;\n        slider.max = state.nTotalTicks;\n        if (!slider.mousedown) {\n            slider.value = state.nTick;\n            cp.SetDialogVariable(\"current_time\", TicksToTimeText(state.nTick, state.nSecondsPerTick, true));\n            SetRoundNumberLabel();\n        }\n        timescale.text = parseFloat(state.fTimeScale.toFixed(4)).toString() + \"x\";\n        const bSettingsVisible = cp.BHasClass(\"SettingsVisible\");\n        if (bSettingsVisible) {\n            SettingsPanel.AddClass(\"Visible\");\n            const spec_show_xray = parseInt(GameInterfaceAPI.GetSettingString(\"spec_show_xray\"));\n            XRayToggleButton.SetSelected(spec_show_xray != 0);\n            const cl_demo_predict = parseInt(GameInterfaceAPI.GetSettingString(\"cl_demo_predict\"));\n            const cl_trueview_show_doa_predictions = parseInt(GameInterfaceAPI.GetSettingString(\"cl_trueview_show_doa_predictions\"));\n            TrueViewToggleButton.SetSelected(cl_demo_predict > 0);\n            TrueViewDOAToggleButton.SetSelected(cl_trueview_show_doa_predictions != 0);\n            TrueViewDOACheckBox.enabled = cl_demo_predict > 0;\n            TrueViewWrongVersionCheckBox.enabled = cl_demo_predict > 0;\n            if (cl_demo_predict > 0) {\n                TrueViewWrongVersionToggleButton.SetSelected(cl_demo_predict >= 2);\n            }\n        }\n        else {\n            SettingsPanel.RemoveClass(\"Visible\");\n        }\n        const cl_demo_predict = parseInt(GameInterfaceAPI.GetSettingString(\"cl_demo_predict\"));\n    }\n    $.Schedule(0, FrameUpdate);\n    $.RegisterEventHandler(\"SliderReleased\", slider, (_, fValue) => {\n        if (lastState == null)\n            return true;\n        cp.SetDialogVariable(\"current_time\", TicksToTimeText(fValue, lastState.nSecondsPerTick, true));\n        SetRoundNumberLabel();\n        cp.GotoTick(Math.floor(fValue));\n        return true;\n    });\n    $.RegisterEventHandler(\"SliderValueChanged\", slider, (_, fValue) => {\n        if (lastState == null)\n            return true;\n        cp.SetDialogVariable(\"current_time\", TicksToTimeText(fValue, lastState.nSecondsPerTick, true));\n        SetRoundNumberLabel();\n        return true;\n    });\n    function OnPlayClicked() {\n        cp.SetPaused(!cp.BHasClass(\"paused\"));\n        return true;\n    }\n    HudDemoController.OnPlayClicked = OnPlayClicked;\n    function OnStepTimeBackward() {\n        return OnStepTime(-timeStepSeconds);\n    }\n    HudDemoController.OnStepTimeBackward = OnStepTimeBackward;\n    function OnStepTimeForward() {\n        return OnStepTime(timeStepSeconds);\n    }\n    HudDemoController.OnStepTimeForward = OnStepTimeForward;\n    function OnStepTime(fStep) {\n        if (lastState) {\n            cp.GotoTick(lastState.nTick + (fStep / lastState.nSecondsPerTick));\n        }\n        return true;\n    }\n    function OnStepInterval(nStep) {\n        if (!lastState) {\n            return false;\n        }\n        if (lastState.bIsPlayingHighlights) {\n            if (lastState.HighlightIntervals?.length > 0) {\n                const nIntervalIndex = lastState.HighlightIntervals.findIndex(r => r.nTickStart > lastState.nTick) - 1;\n                let nNewInterval = nIntervalIndex + nStep;\n                if (nNewInterval < 0)\n                    nNewInterval = 0;\n                else if (nNewInterval > lastState.HighlightIntervals.length - 1)\n                    nNewInterval = lastState.HighlightIntervals.length - 1;\n                cp.GotoTick(lastState.HighlightIntervals[nNewInterval].nTickStart);\n            }\n        }\n        else if (lastState.RoundIntervals?.length > 0) {\n            const nIntervalIndex = lastState.RoundIntervals.findIndex(r => r.nTickStart > lastState.nTick) - 1;\n            let nNewInterval = nIntervalIndex + nStep;\n            if (nNewInterval < 0)\n                nNewInterval = 0;\n            else if (nNewInterval > lastState.RoundIntervals.length - 1)\n                nNewInterval = lastState.RoundIntervals.length - 1;\n            cp.GotoTick(lastState.RoundIntervals[nNewInterval].nTickStart);\n        }\n        return true;\n    }\n    HudDemoController.OnStepInterval = OnStepInterval;\n    function OnShowTimeScaleContextMenu() {\n        cp.OnShowTimeScaleContextMenu();\n        return true;\n    }\n    HudDemoController.OnShowTimeScaleContextMenu = OnShowTimeScaleContextMenu;\n    function OnStopPlayback() {\n        cp.StopPlayback();\n        return true;\n    }\n    HudDemoController.OnStopPlayback = OnStopPlayback;\n    function OnHighlightsToggle() {\n        let bIsEnabled = !lastState?.bIsPlayingHighlights;\n        cp.SetHighlightsModeEnabled(!!bIsEnabled);\n    }\n    HudDemoController.OnHighlightsToggle = OnHighlightsToggle;\n    function ShouldShowHighlightsButton() {\n        if (lastState?.bIsOverwatch)\n            return false;\n        return true;\n    }\n    function OnHighlightsModeChanged(bEnabled) {\n        cp.SetHasClass(\"highlightsActive\", bEnabled);\n        $(\"#IntervalLabel\").text = bEnabled ? $.Localize('#CSGO_Demo_Highlight') : $.Localize('#CSGO_Demo_Round');\n        CreateHighlightIntervals();\n        CreateTimelineEvents();\n        SetRoundNumberLabel();\n        return true;\n    }\n    function DestroyTimelineEvents() {\n        const pHighlightIcons = $(\"#HighlightIcons\");\n        pHighlightIcons.RemoveAndDeleteChildren();\n    }\n    function CreateTimelineEvents() {\n        DestroyTimelineEvents();\n        if (!lastState || !lastState.TimelineEvents)\n            return;\n        const pThumb = $(\"#SliderThumb\");\n        const pHighlightIcons = $(\"#HighlightIcons\");\n        const nThumbWidth = pThumb.actuallayoutwidth / pThumb.actualuiscale_x;\n        const nMarkersWidth = (pHighlightIcons.actuallayoutwidth / pHighlightIcons.actualuiscale_x) - nThumbWidth;\n        for (let iEvent = lastState.TimelineEvents.length - 1; iEvent >= 0; --iEvent) {\n            const timelineEvent = lastState.TimelineEvents[iEvent];\n            const nHalfIconWidth = 11;\n            const nLeft = (timelineEvent.nTick / lastState.nTotalTicks * nMarkersWidth + nThumbWidth / 2) - nHalfIconWidth;\n            const sClass = TimelineEventToLabel(timelineEvent.eEventType);\n            const pIcon = $.CreatePanel(\"Panel\", pHighlightIcons, \"\", { class: `highlight-icon ${sClass}` });\n            pIcon.style.marginLeft = nLeft + \"px\";\n            const flSkipToTicksBefore = 64 * 2;\n            pIcon.SetPanelEvent('onactivate', () => cp.GotoTick(timelineEvent.nTick - flSkipToTicksBefore));\n        }\n    }\n    function DestroyHighlightIntervals() {\n        const pMarkers = $(\"#HighlightMarkers\");\n        pMarkers.RemoveAndDeleteChildren();\n    }\n    function CreateHighlightIntervals() {\n        DestroyHighlightIntervals();\n        if (!lastState || !lastState.HighlightIntervals)\n            return;\n        const pMarkers = $(\"#HighlightMarkers\");\n        const pThumb = $(\"#SliderThumb\");\n        const nThumbWidth = pThumb.actuallayoutwidth / pThumb.actualuiscale_x;\n        const nMarkersWidth = (pMarkers.actuallayoutwidth / pThumb.actualuiscale_x) - nThumbWidth;\n        for (let i = 0; i < lastState.HighlightIntervals.length; i++) {\n            const highlight = lastState.HighlightIntervals[i];\n            const nStartTick = highlight.nTickStart;\n            const nEndTick = highlight.nTickEnd;\n            let nLeft = nStartTick / lastState.nTotalTicks * nMarkersWidth + nThumbWidth / 2;\n            let nWidth = (nEndTick - nStartTick) / lastState.nTotalTicks * nMarkersWidth;\n            const pMarker = $.CreatePanel(\"Panel\", pMarkers, \"\");\n            pMarker.style.marginLeft = nLeft + \"px\";\n            pMarker.style.width = nWidth + \"px\";\n        }\n    }\n    function GetCurrentIntervalNumber() {\n        if (!lastState)\n            return 0;\n        if (lastState.bIsPlayingHighlights) {\n            return 0;\n        }\n        return TicksToRound(lastState.nTick, lastState.RoundIntervals);\n    }\n    function TicksToTimeText(nTick, nSecondsPerTick, bFractionalSeconds) {\n        const nTime = nSecondsPerTick * nTick;\n        const nMinutes = Math.floor(nTime / 60.0);\n        const nSeconds = nTime - nMinutes * 60.0;\n        let sSeconds = \"\";\n        if (bFractionalSeconds) {\n            sSeconds = (Math.floor(nSeconds * 10.0) / 10.0).toFixed(1);\n            if (sSeconds.length < 4)\n                sSeconds = \"0\" + sSeconds;\n        }\n        else {\n            sSeconds = nSeconds.toFixed(0);\n            if (sSeconds.length < 2)\n                sSeconds = \"0\" + sSeconds;\n        }\n        return `${nMinutes}:${sSeconds}`;\n    }\n    function TicksToRound(nTick, rounds) {\n        if (rounds.length === 0 || rounds[0].nTickStart > nTick)\n            return 0;\n        for (let i = 0; i < rounds.length; i++) {\n            if (nTick < rounds[i].nTickStart) {\n                return i;\n            }\n        }\n        return rounds.length;\n    }\n    function IsMouseCameraAllowed() {\n        return lastState?.nObserverMode == ObserverMode.OBS_MODE_CHASE ||\n            lastState?.nObserverMode == ObserverMode.OBS_MODE_ROAMING;\n    }\n    function ToggleSettingsVisible() {\n        cp.ToggleClass(\"SettingsVisible\");\n        $.Schedule(0, FrameUpdate);\n    }\n    HudDemoController.ToggleSettingsVisible = ToggleSettingsVisible;\n    function ToggleXRay() {\n        let spec_show_xray = parseInt(GameInterfaceAPI.GetSettingString(\"spec_show_xray\"));\n        spec_show_xray = spec_show_xray ? 0 : 1;\n        GameInterfaceAPI.ConsoleCommand(`spec_show_xray ${spec_show_xray}`);\n    }\n    HudDemoController.ToggleXRay = ToggleXRay;\n    function ToggleTrueView() {\n        const cl_demo_predict = parseInt(GameInterfaceAPI.GetSettingString(\"cl_demo_predict\"));\n        if (cl_demo_predict) {\n            GameInterfaceAPI.ConsoleCommand(\"cl_demo_predict 0\");\n        }\n        else {\n            if (!TrueViewWrongVersionToggleButton.IsSelected()) {\n                GameInterfaceAPI.ConsoleCommand(\"cl_demo_predict 1\");\n            }\n            else {\n                GameInterfaceAPI.ConsoleCommand(\"cl_demo_predict 2\");\n            }\n        }\n    }\n    HudDemoController.ToggleTrueView = ToggleTrueView;\n    function ToggleTrueViewDOACommands() {\n        let cl_trueview_show_doa_predictions = parseInt(GameInterfaceAPI.GetSettingString(\"cl_trueview_show_doa_predictions\"));\n        cl_trueview_show_doa_predictions = cl_trueview_show_doa_predictions ? 0 : 1;\n        GameInterfaceAPI.ConsoleCommand(`cl_trueview_show_doa_predictions ${cl_trueview_show_doa_predictions}`);\n    }\n    HudDemoController.ToggleTrueViewDOACommands = ToggleTrueViewDOACommands;\n    function ToggleTrueViewWrongVersion() {\n        const cl_demo_predict = parseInt(GameInterfaceAPI.GetSettingString(\"cl_demo_predict\"));\n        if (cl_demo_predict == 1) {\n            GameInterfaceAPI.ConsoleCommand(\"cl_demo_predict 2\");\n        }\n        else if (cl_demo_predict == 2) {\n            GameInterfaceAPI.ConsoleCommand(\"cl_demo_predict 1\");\n        }\n    }\n    HudDemoController.ToggleTrueViewWrongVersion = ToggleTrueViewWrongVersion;\n    function SetRoundNumberLabel() {\n        if (lastState && lastState.bIsPlayingHighlights) {\n            var roundNumber = $(\"#RoundNumber\");\n            if (roundNumber) {\n                roundNumber.visible = false;\n            }\n        }\n        else {\n            var roundNumber = $(\"#RoundNumber\");\n            if (roundNumber) {\n                roundNumber.visible = true;\n            }\n            cp.SetDialogVariableInt(\"round_number\", GetCurrentIntervalNumber());\n        }\n    }\n})(HudDemoController || (HudDemoController = {}));\n","scripts/hud/hudinstructor.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\nvar HudInstructor;\n(function (HudInstructor) {\n    function ShowBinding(elLesson, hLocator, i) {\n        if (elLesson.BHasClass('hidden')) {\n            HideBindings(elLesson);\n            return;\n        }\n        let bindingTexture = 'icon_key_wide';\n        let bindingText = '#GameUI_Icons_NONE';\n        const binding = $.GetContextPanel().GetBinding(hLocator, i).toUpperCase();\n        if (binding != '') {\n            bindingText = '';\n            if (binding === 'MOUSE1') {\n                bindingTexture = 'icon_mouseLeft';\n            }\n            else if (binding === 'MOUSE2') {\n                bindingTexture = 'icon_mouseRight';\n            }\n            else if (binding === 'MOUSE3') {\n                bindingTexture = 'icon_mouseThree';\n            }\n            else if (binding === 'MWHEELUP') {\n                bindingTexture = 'icon_mouseWheel_up';\n            }\n            else if (binding === 'MWHEELDOWN') {\n                bindingTexture = 'icon_mouseWheel_down';\n            }\n            else if (binding === 'UPARROW') {\n                bindingTexture = 'icon_key_up';\n            }\n            else if (binding === 'LEFTARROW') {\n                bindingTexture = 'icon_key_left';\n            }\n            else if (binding === 'DOWNARROW') {\n                bindingTexture = 'icon_key_down';\n            }\n            else if (binding === 'RIGHTARROW') {\n                bindingTexture = 'icon_key_right';\n            }\n            else if (binding === 'SEMICOLON') {\n                bindingTexture = 'icon_key_generic';\n                bindingText = ';';\n            }\n            else if (binding.length <= 3) {\n                bindingTexture = 'icon_key_generic';\n                bindingText = binding;\n            }\n            else {\n                bindingTexture = 'icon_key_wide';\n                bindingText = binding;\n            }\n            const elBindingLabel = elLesson.FindChildTraverse('LocatorBindingText');\n            const bShowBindingText = (bindingText != '');\n            elLesson.SetHasClass('ShowBindingText', bShowBindingText);\n            if (bShowBindingText) {\n                elBindingLabel.text = $.Localize(bindingText);\n            }\n            elLesson.SwitchClass('BindingIcon', bindingTexture);\n            if (elLesson.bindingCount && elLesson.bindingCount > 1) {\n                let iNext = i + 1;\n                if (iNext == elLesson.bindingCount) {\n                    iNext = 0;\n                }\n                elLesson.animhandle = $.Schedule(.75, () => ShowBinding(elLesson, hLocator, iNext));\n            }\n        }\n    }\n    function HideBindings(elLesson) {\n        if (elLesson.animhandle) {\n            $.CancelScheduled(elLesson.animhandle);\n            elLesson.animhandle = undefined;\n        }\n        elLesson.SetHasClass('ShowBindingText', false);\n        elLesson.SwitchClass('BindingIcon', 'none');\n    }\n    function OnShowBindingsEvent(elLesson, hLocator, bindingCount) {\n        HideBindings(elLesson);\n        elLesson.bindingCount = bindingCount;\n        ShowBinding(elLesson, hLocator, 0);\n    }\n    function OnHideBindingsEvent(elLesson) {\n        HideBindings(elLesson);\n    }\n    {\n        $.RegisterEventHandler('CSGOHudInstructorShowBindings', $.GetContextPanel(), OnShowBindingsEvent);\n        $.RegisterEventHandler('CSGOHudInstructorHideBindings', $.GetContextPanel(), OnHideBindingsEvent);\n    }\n})(HudInstructor || (HudInstructor = {}));\n","scripts/hud/hudmissions.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\nvar HudMissions;\n(function (HudMissions) {\n    var _m_HudMissions = $.GetContextPanel();\n    function UpdateQuestUI() {\n        const missionDetails = MissionsAPI.GetActiveRecurringMission();\n        if (missionDetails === undefined || GameStateAPI.GetMapBSPName() === 'lobby_mapveto') {\n            _m_HudMissions.AddClass(\"hidden\");\n            return;\n        }\n        _m_HudMissions.RemoveClass(\"hidden\");\n        _m_HudMissions.FindChildInLayoutFile('MissionLabel').text = missionDetails.loc_description;\n        _m_HudMissions.SetDialogVariableInt(\"progress\", missionDetails.progress_saved);\n        _m_HudMissions.SetDialogVariableInt(\"goal\", missionDetails.goal_points.slice(-1)[0]);\n        if (missionDetails.string_tokens) {\n            for (const k in missionDetails.string_tokens) {\n                const val = missionDetails.string_tokens[k];\n                _m_HudMissions.SetDialogVariableLocString(k, val);\n            }\n        }\n    }\n    {\n        $.RegisterForUnhandledEvent(\"GameState_OnMatchStart\", UpdateQuestUI);\n        $.RegisterForUnhandledEvent(\"OnQuestProgressMade\", UpdateQuestUI);\n    }\n})(HudMissions || (HudMissions = {}));\n","scripts/hud/hudmoney.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../digitpanel.ts\" />\nvar MoneyPanel;\n(function (MoneyPanel) {\n    $.RegisterEventHandler('UpdateHudMoney', $.GetContextPanel(), _UpdateMoney);\n    function _UpdateMoney(amt, bInstant = false) {\n        const elContainer = $('#jsRotaryMoney');\n        if (elContainer) {\n            if (!$('#DigitPanel')) {\n                $.GetContextPanel().SetDialogVariableInt(\"money\", 16000);\n                const maxLen = $.Localize(\"#buymenu_money\", $.GetContextPanel());\n                DigitPanelFactory.MakeDigitPanel(elContainer, maxLen.length, '', 0.6, \"#buymenu_money_digitpanel_digits\");\n            }\n            $.GetContextPanel().SetDialogVariableInt(\"money\", amt);\n            const digitString = $.Localize(\"#buymenu_money\", $.GetContextPanel());\n            DigitPanelFactory.SetDigitPanelString(elContainer, digitString, bInstant);\n        }\n    }\n})(MoneyPanel || (MoneyPanel = {}));\n","scripts/hud/hudteamcounter.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\nvar HudTeamCounter;\n(function (HudTeamCounter) {\n    function ShowDamageReport(elTeamCounter, elAvatarPanel) {\n        const bannerDelay = 0;\n        const delayDelta = 0.1;\n        const bFriendlyFire = 1 == elAvatarPanel.GetAttributeInt(\"friendlyfire\", 0);\n        const healthRemoved = elAvatarPanel.GetAttributeInt(\"health_removed\", 0);\n        const numHits = elAvatarPanel.GetAttributeInt(\"num_hits\", 0);\n        const returnHealthRemoved = elAvatarPanel.GetAttributeInt(\"return_health_removed\", 0);\n        const returnNumHits = elAvatarPanel.GetAttributeInt(\"return_num_hits\", 0);\n        const orderIndex = elAvatarPanel.GetAttributeInt(\"order_index\", 0);\n        const elDamageReport = elAvatarPanel.FindChildTraverse('PostRoundDamageReport');\n        elDamageReport.SetHasClass('given', healthRemoved > 0);\n        elDamageReport.SetHasClass('taken', returnHealthRemoved > 0);\n        elDamageReport.SetHasClass('friendlyfire', bFriendlyFire);\n        elDamageReport.SetDialogVariableInt(\"health_removed\", healthRemoved);\n        elDamageReport.SetDialogVariableInt(\"num_hits\", numHits);\n        elDamageReport.SetDialogVariableInt(\"return_health_removed\", returnHealthRemoved);\n        elDamageReport.SetDialogVariableInt(\"return_num_hits\", returnNumHits);\n        elDamageReport.SwitchClass('advantage', healthRemoved > returnHealthRemoved ? 'won' : 'lost');\n        if (healthRemoved > 0 || returnHealthRemoved > 0) {\n            $.Schedule(bannerDelay + orderIndex * delayDelta, () => {\n                if (!elAvatarPanel || !elAvatarPanel.IsValid())\n                    return;\n                elAvatarPanel.AddClass('show-prdr');\n            });\n        }\n    }\n    function HideDamageReport() {\n        $.GetContextPanel().FindChildrenWithClassTraverse(\"show-prdr\").forEach(el => el.RemoveClass('show-prdr'));\n    }\n    {\n        $.RegisterForUnhandledEvent('RevealPostRoundDamageReportPanel', ShowDamageReport);\n        $.RegisterForUnhandledEvent('ClearAllPostRoundDamageReportPanels', HideDamageReport);\n    }\n})(HudTeamCounter || (HudTeamCounter = {}));\n","scripts/hud/hudwinpanel.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../avatar.ts\" />\n/// <reference path=\"../digitpanel.ts\" />\n/// <reference path=\"../particle_controls.ts\" />\n/// <reference path=\"../common/formattext.ts\" />\n/// <reference path=\"../common/scheduler.ts\" />\n/// <reference path=\"../common/teamcolor.ts\" />\n/// <reference path=\"../hud/hudwinpanel_background_map.ts\" />\nvar HudWinPanel;\n(function (HudWinPanel) {\n    let _m_elCanvas;\n    let _m_elPlotContainer;\n    let _m_canvasHeightInPixels;\n    let _m_canvasWidthInPixels;\n    let _m_teamPerspective;\n    let _m_localXuid;\n    let _m_timeslice;\n    let _m_bInit = false;\n    let _m_xRange;\n    let _m_prevChance;\n    let _m_ListeningForGameEvents = false;\n    let _m_bCanvasIsReady = false;\n    let _m_arrTimelineEvents = [];\n    let _m_arrPersonalDamageEvents = [];\n    let _m_winningTeam;\n    const TOTAL_TIME_REVEAL = 5;\n    const BEAM_ONLY_ON_DAMAGE = false;\n    function _Init() {\n        if (_m_bInit)\n            return;\n        $.RegisterForUnhandledEvent('HudWinPanel_ShowRoundEndReport', _ShowRoundEndReport);\n        $.RegisterForUnhandledEvent('Player_Hurt', _OnReceivePlayerHurt);\n        $.RegisterForUnhandledEvent('Player_Death', _OnReceivePlayerDeath);\n        _m_bInit = true;\n    }\n    function _SetMVP(xuid, reason, team) {\n        const avatar = $(\"#MVPAvatar\");\n        avatar.PopulateFromPlayerSlot(GameStateAPI.GetPlayerSlot(xuid));\n        avatar.SetHasClass(\"team--TERRORIST\", team === 2);\n        avatar.SetHasClass(\"team--CT\", team === 3);\n        $.GetContextPanel().SetDialogVariableInt('player_slot', GameStateAPI.GetPlayerSlot(xuid));\n        let sMvpReasonToken = \"#Panorama_winpanel_mvp_award\";\n        let elMapContainer = $.GetContextPanel().FindChildInLayoutFile('id-match-mvp-map-container');\n        MvpBackgroundMap.SetUpMapWinPanel(xuid, reason, team, elMapContainer);\n        switch (reason) {\n            case 1:\n                sMvpReasonToken = \"#Panorama_winpanel_mvp_award_kills\";\n                break;\n            case 2:\n                sMvpReasonToken = \"#Panorama_winpanel_mvp_award_bombplant\";\n                break;\n            case 3:\n                sMvpReasonToken = \"#Panorama_winpanel_mvp_award_bombdefuse\";\n                break;\n            case 4:\n                sMvpReasonToken = \"#Panorama_winpanel_mvp_award_rescue\";\n                break;\n            case 5:\n                sMvpReasonToken = \"#Panorama_winpanel_mvp_award_gungame\";\n                break;\n            case 7:\n                sMvpReasonToken = \"#Panorama_winpanel_mvp_winner\";\n                break;\n            case 9:\n                sMvpReasonToken = \"#Panorama_winpanel_mvp_award_ace\";\n                break;\n            case 10:\n                sMvpReasonToken = \"#Panorama_winpanel_mvp_award_inferno\";\n                break;\n            case 11:\n                sMvpReasonToken = \"#Panorama_winpanel_mvp_award_blast\";\n                break;\n            case 12:\n                sMvpReasonToken = \"#Panorama_winpanel_mvp_winner\";\n                break;\n            case 13:\n                sMvpReasonToken = \"#Panorama_winpanel_mvp_award_bombplant_clutch\";\n                break;\n            case 14:\n                sMvpReasonToken = \"#Panorama_winpanel_mvp_award_bombdefuse_clutch\";\n                break;\n            case 15:\n                sMvpReasonToken = \"#Panorama_winpanel_mvp_award_kills_three\";\n                break;\n            case 16:\n                sMvpReasonToken = \"#Panorama_winpanel_mvp_award_kills_four\";\n                break;\n        }\n        $.GetContextPanel().SetDialogVariable(\"mvp_name_and_reason\", $.Localize(sMvpReasonToken, $.GetContextPanel()));\n        const jsHonorIcon = $(\"#jsHonorIcon\");\n        jsHonorIcon.Set(GameStateAPI.GetPlayerXpTrailLevel(xuid), false);\n    }\n    function _OnReceivePlayerHurt(attackerXuid, victimXuid, damage) {\n        if (!_m_ListeningForGameEvents)\n            return;\n        if (!_m_bCanvasIsReady) {\n            $.Schedule(0.5, () => _OnReceivePlayerHurt(attackerXuid, victimXuid, damage));\n            return;\n        }\n        if (_m_localXuid != attackerXuid && _m_localXuid != victimXuid)\n            return;\n        const wasDamageGiven = _m_localXuid == attackerXuid;\n        const healthRemoved = wasDamageGiven ? damage : 0;\n        const numHits = wasDamageGiven ? 1 : 0;\n        const returnedHealthRemoved = wasDamageGiven ? 0 : damage;\n        const returnHits = wasDamageGiven ? 0 : 1;\n        _UpdateDamage(wasDamageGiven ? victimXuid : attackerXuid, healthRemoved, numHits, returnedHealthRemoved, returnHits);\n    }\n    function _OnReceivePlayerDeath(xuid) {\n        if (!_m_ListeningForGameEvents)\n            return;\n        if (!_m_bCanvasIsReady) {\n            $.Schedule(0.5, () => _OnReceivePlayerDeath(xuid));\n            return;\n        }\n        const elEvent = $.GetContextPanel().FindChildTraverse('Event-' + xuid);\n        if (!elEvent)\n            return;\n        const elDeath = elEvent.FindChildTraverse('Death');\n        if (!elDeath)\n            return;\n        elDeath.visible = true;\n    }\n    function _TransformPointIntoCanvasSpace(point) {\n        const denom = _m_xRange;\n        const x = _m_canvasWidthInPixels / denom * point[0];\n        const y = _m_canvasHeightInPixels - (_m_canvasHeightInPixels / 100 * point[1]);\n        return [x, y];\n    }\n    function _FlipY(plotPoint) {\n        return [plotPoint[0], _m_canvasHeightInPixels - plotPoint[1]];\n    }\n    function _ConvertToLocalOdds(terroristOdds) {\n        if (_m_teamPerspective == 2)\n            return terroristOdds;\n        else\n            return (100 - terroristOdds);\n    }\n    function _ShowRoundEndReport(msg) {\n        if (!msg)\n            return;\n        _Reset();\n        _m_ListeningForGameEvents = true;\n        if (!_m_elCanvas.IsSizeValid()) {\n            $.Schedule(0.5, () => _ShowRoundEndReport.bind(msg));\n            return;\n        }\n        _m_bCanvasIsReady = true;\n        $.GetContextPanel().SetDialogVariable('player_name', GameStateAPI.GetPlayerName(_m_localXuid));\n        _m_canvasHeightInPixels = _m_elCanvas.actuallayoutheight / _m_elCanvas.actualuiscale_y;\n        _m_canvasWidthInPixels = _m_elCanvas.actuallayoutwidth / _m_elCanvas.actualuiscale_x;\n        const oInitialConditions = msg.init_conditions;\n        const nStartingOdds = oInitialConditions.terrorist_odds;\n        const arrEvents = msg.all_rer_event_data;\n        _m_arrTimelineEvents = _ExtractTimelineEvents(arrEvents);\n        _m_arrPersonalDamageEvents = _ExtractLivingEnemies(arrEvents);\n        _m_winningTeam = '';\n        if (_m_arrTimelineEvents.length > 0) {\n            const FinalTOdds = _m_arrTimelineEvents[_m_arrTimelineEvents.length - 1]['terrorist_odds'];\n            _m_winningTeam = FinalTOdds == 100 ? 2 : FinalTOdds == 0 ? 3 : '';\n        }\n        _m_xRange = _m_arrTimelineEvents.length + _m_arrPersonalDamageEvents.length + 1.5;\n        _m_timeslice = TOTAL_TIME_REVEAL / _m_xRange;\n        const x = 0;\n        const y = _ConvertToLocalOdds(nStartingOdds);\n        const startPoint = [x, y];\n        const startPlotPoint = _TransformPointIntoCanvasSpace(startPoint);\n        const points = [];\n        points.push(startPoint);\n        const plotPoints = [];\n        plotPoints.push(startPlotPoint);\n        _PlotStartingOdds(nStartingOdds, startPlotPoint);\n        _ProcessTimelineEvents(_m_arrTimelineEvents, points, plotPoints, nStartingOdds);\n        const finalPoint = points[points.length - 1];\n        _ProcessDamageEvents(_m_arrPersonalDamageEvents, finalPoint[0]);\n        const bCT = _m_teamPerspective == 3;\n        const drawColor = bCT ? '#B5D4EEaa' : '#EAD18Aaa';\n        _m_elCanvas.DrawSoftLinePointsJS(plotPoints.length, plotPoints.flat(), 4, 1.0, drawColor);\n        _m_elCanvas.TriggerClass('show-canvas');\n        const graphWidth = (_m_arrTimelineEvents.length) / _m_xRange * 100;\n        const elGraphGuides = $.GetContextPanel().FindChildTraverse('GraphGuides');\n        elGraphGuides.style.width = graphWidth + \"%\";\n        const elLivingBG = $.GetContextPanel().FindChildTraverse('LivingBG');\n        elLivingBG.style.width = 100 - graphWidth + \"%\";\n        _Colorize();\n        const freezetime = Number(GameInterfaceAPI.GetSettingString('mp_freezetime'));\n        const roundRestartDelay = Number(GameInterfaceAPI.GetSettingString('mp_round_restart_delay'));\n        const shutdownDelay = roundRestartDelay + freezetime - 1;\n        Scheduler.Schedule(shutdownDelay, () => {\n            _m_ListeningForGameEvents = false;\n            _m_bCanvasIsReady = false;\n        });\n    }\n    function _ExtractTimelineEvents(arrEvents) {\n        const arrResults = [];\n        for (let oEvent of arrEvents) {\n            const oVictimData = oEvent['victim_data'];\n            const isLivingPlayer = oVictimData && !oVictimData['is_dead'];\n            if (!isLivingPlayer)\n                arrResults.push(oEvent);\n        }\n        return arrResults;\n    }\n    function _ExtractLivingEnemies(arrEvents) {\n        const arrResults = [];\n        for (let oEvent of arrEvents) {\n            const oVictimData = oEvent['victim_data'];\n            const isLivingPlayer = oVictimData && !oVictimData['is_dead'];\n            const localTeam = GameStateAPI.GetAssociatedTeamNumber(_m_localXuid);\n            const isEnemy = oVictimData && oVictimData['team_number'] != localTeam && (localTeam == 2 || localTeam == 3);\n            if (isLivingPlayer && isEnemy)\n                arrResults.push(oEvent);\n        }\n        return arrResults;\n    }\n    function _ProcessTimelineEvents(arrEvents, points, plotPoints, nStartingOdds) {\n        let loopingSfxHandle = null;\n        for (let index = 0; index < arrEvents.length; ++index) {\n            const oEvent = arrEvents[index];\n            const x = index + 1;\n            const y = _ConvertToLocalOdds(oEvent['terrorist_odds']);\n            const point = [x, y];\n            const plotPoint = _TransformPointIntoCanvasSpace(point);\n            points.push(point);\n            plotPoints.push(plotPoint);\n            let delta = 0;\n            if (index == 0)\n                delta = oEvent['terrorist_odds'] - nStartingOdds;\n            else\n                delta = oEvent['terrorist_odds'] - arrEvents[index - 1]['terrorist_odds'];\n            const sfx = delta < 0 ? \"UIPanorama.round_report_line_down\" : \"UIPanorama.round_report_line_up\";\n            const delay = index * _m_timeslice;\n            Scheduler.Schedule(delay, () => {\n                _AddDamageToDamagePanel(oEvent, plotPoint);\n                _DecoratePoint(oEvent, plotPoint);\n                if (loopingSfxHandle)\n                    UiToolkitAPI.StopSoundEvent(loopingSfxHandle, 0.1);\n                loopingSfxHandle = UiToolkitAPI.PlaySoundEvent(sfx);\n            });\n        }\n        Scheduler.Schedule(_m_arrTimelineEvents.length * _m_timeslice, () => {\n            if (loopingSfxHandle)\n                UiToolkitAPI.StopSoundEvent(loopingSfxHandle, 0.1);\n        });\n    }\n    function _ProcessDamageEvents(arrEvents, startX) {\n        for (let index = 0; index < arrEvents.length; ++index) {\n            const oEvent = arrEvents[index];\n            const x = startX + index + 1;\n            const y = 50;\n            const plotPoint = _TransformPointIntoCanvasSpace([x, y]);\n            const delay = (_m_arrTimelineEvents.length + index) * _m_timeslice;\n            Scheduler.Schedule(delay, () => {\n                _AddDamageToDamagePanel(oEvent, plotPoint);\n                _DecoratePoint(oEvent, plotPoint);\n            });\n        }\n    }\n    function _Colorize() {\n        const bCT = _m_winningTeam == 3;\n        for (let el of $.GetContextPanel().FindChildrenWithClassTraverse('team-colorize')) {\n            el.SetHasClass('color-ct', bCT);\n            el.SetHasClass('color-t', !bCT);\n        }\n    }\n    function _FindDamageDataForPlayer(oEvent, xuid) {\n        const oDamageData = oEvent.all_damage_data;\n        const returnObj = {};\n        for (let i = 0; i < oDamageData.length; i++) {\n            if (oDamageData[i].other_xuid.toString() == xuid)\n                Object.assign(returnObj, oDamageData[i]);\n        }\n        return returnObj;\n    }\n    function _UpdateDamage(xuid, healthRemoved, numHits, returnHealthRemoved, returnHits) {\n        const elDamage = $.GetContextPanel().FindChildTraverse('Damage-' + xuid);\n        if (!elDamage)\n            return;\n        elDamage.healthRemoved += healthRemoved;\n        elDamage.healthRemoved = Math.min(elDamage.healthRemoved, 100);\n        elDamage.numHits += numHits;\n        elDamage.returnHealthRemoved += returnHealthRemoved;\n        elDamage.returnHealthRemoved = Math.min(elDamage.returnHealthRemoved, 100);\n        elDamage.returnHits += returnHits;\n        if ((elDamage.returnHealthRemoved > 0) || (elDamage.healthRemoved > 0)) {\n            const elDGiven = elDamage.FindChildTraverse('DamageGiven');\n            const elDTaken = elDamage.FindChildTraverse('DamageTaken');\n            elDGiven.SetDialogVariable('health_removed', elDamage.healthRemoved.toString());\n            elDGiven.SetDialogVariable('num_hits', elDamage.numHits.toString());\n            elDTaken.SetDialogVariable('health_removed', elDamage.returnHealthRemoved.toString());\n            elDTaken.SetDialogVariable('num_hits', elDamage.returnHits.toString());\n            elDGiven.visible = elDamage.healthRemoved > 0;\n            elDTaken.visible = elDamage.returnHealthRemoved > 0;\n            if (BEAM_ONLY_ON_DAMAGE) {\n                const elTeamColorBar = $.GetContextPanel().FindChildTraverse('bar-' + xuid);\n                if (elTeamColorBar) {\n                    elTeamColorBar.RemoveClass('prereveal');\n                }\n            }\n            const dmgDelay = 0.1;\n            Scheduler.Schedule(dmgDelay, () => {\n                if (elDamage && elDamage.IsValid())\n                    elDamage.RemoveClass('prereveal');\n            });\n        }\n    }\n    function _AddDamageToDamagePanel(oEvent, plotPoint) {\n        const elDamageContainer = $.GetContextPanel().FindChildTraverse('DamageContainer');\n        const oDamage = _FindDamageDataForPlayer(oEvent, _m_localXuid);\n        const victimData = oEvent['victim_data'];\n        const objectiveData = oEvent['objective_data'];\n        if (objectiveData)\n            return;\n        const elDamage = $.CreatePanel('Panel', elDamageContainer, 'Damage-' + victimData['xuid']);\n        elDamage.BLoadLayoutSnippet('snippet-damage');\n        elDamage.healthRemoved = 0;\n        elDamage.numHits = 0;\n        elDamage.returnHealthRemoved = 0;\n        elDamage.returnHits = 0;\n        elDamage.style.x = plotPoint[0] + \"px\";\n        if (BEAM_ONLY_ON_DAMAGE) {\n            const bCT = _m_winningTeam == 3;\n            const elTeamColorBar = $.CreatePanel('Panel', _m_elPlotContainer, 'bar-' + victimData['xuid']);\n            elTeamColorBar.AddClass('ris-graph__bar');\n            elTeamColorBar.AddClass('prereveal');\n            elTeamColorBar.SetHasClass('color-ct', bCT);\n            elTeamColorBar.SetHasClass('color-t', !bCT);\n            elTeamColorBar.style.x = plotPoint[0] + \"px\";\n            elTeamColorBar.style.height = _FlipY(plotPoint)[1] + 70 + \"px\";\n        }\n        if (oDamage) {\n            const healthRemoved = oDamage.health_removed || 0;\n            const nHits = oDamage.num_hits || 0;\n            const returnedHealthRemoved = oDamage.return_health_removed || 0;\n            const nReturnHits = oDamage.return_num_hits || 0;\n            _UpdateDamage(victimData['xuid'], healthRemoved, nHits, returnedHealthRemoved, nReturnHits);\n        }\n    }\n    function _PlotStartingOdds(nStartingOdds, startPlotPoint) {\n        const elStartPlot = $.CreatePanel(\"Panel\", _m_elPlotContainer, 'Start');\n        elStartPlot.BLoadLayoutSnippet('snippet-starting-odds');\n        elStartPlot.style.y = startPlotPoint[1] + \"px\";\n        $.GetContextPanel().SetDialogVariable('starting_chance', _ConvertToLocalOdds(nStartingOdds) + '%');\n        _m_prevChance = nStartingOdds;\n    }\n    function _DecoratePoint(oEvent, plotPoint) {\n        const victimData = oEvent['victim_data'];\n        const objectiveData = oEvent['objective_data'];\n        const key = objectiveData ? objectiveData['type'] : victimData ? victimData['xuid'] : '';\n        const elEventPlot = $.CreatePanel(\"Panel\", _m_elPlotContainer, 'Event-' + key);\n        elEventPlot.BLoadLayoutSnippet('snippet-event');\n        const elEventIcon = elEventPlot.FindChildTraverse('EventIcon');\n        const elEventBG = elEventPlot.FindChildTraverse('EventBG');\n        const elEventChance = elEventPlot.FindChildTraverse('EventChance');\n        const elEventMain = elEventPlot.FindChildTraverse('EventMain');\n        const elDeath = elEventPlot.FindChildTraverse('Death');\n        const chance = _ConvertToLocalOdds(oEvent['terrorist_odds']);\n        if (victimData) {\n            const xuid = victimData['xuid'];\n            const isBot = victimData['is_bot'];\n            const teamNumber = victimData['team_number'];\n            const color = victimData['color'];\n            const isDead = victimData['is_dead'];\n            elEventChance.visible = isDead;\n            elDeath.visible = isDead;\n            elEventIcon.SetImage(\"file://{images}/icons/ui/kill.svg\");\n            elEventIcon.visible = false;\n            const elAvatarImage = elEventPlot.FindChildTraverse('Avatar');\n            elAvatarImage.PopulateFromPlayerSlot(GameStateAPI.GetPlayerSlot(xuid.toString()));\n            const bCT = teamNumber == 3;\n            elAvatarImage.SwitchClass('teamstyle', 'team--' + (bCT ? 'CT' : 'TERRORIST'));\n            if (!BEAM_ONLY_ON_DAMAGE) {\n                const elTeamColorBar = $.CreatePanel('Panel', _m_elPlotContainer, 'bar-' + victimData['xuid']);\n                elTeamColorBar.AddClass('ris-graph__bar');\n                elTeamColorBar.SetHasClass('color-ct', bCT);\n                elTeamColorBar.SetHasClass('color-t', !bCT);\n                elTeamColorBar.style.x = plotPoint[0] + \"px\";\n                elTeamColorBar.style.height = _FlipY(plotPoint)[1] + 70 + \"px\";\n            }\n            const rgbColor = TeamColor.GetTeamColor(Number(color));\n            elEventMain.FindChildTraverse('JsAvatarTeamColor').style.washColor = 'rgb(' + rgbColor + ')';\n        }\n        else if (objectiveData) {\n            const elAvatarImage = elEventPlot.FindChildTraverse('Avatar');\n            elAvatarImage.visible = false;\n            let src = \"\";\n            let bEventCT = false;\n            switch (objectiveData['type']) {\n                case 0:\n                    src = \"file://{images}/icons/ui/bomb_c4.svg\";\n                    bEventCT = false;\n                    break;\n                case 1:\n                    src = \"file://{images}/icons/ui/bomb.svg\";\n                    bEventCT = false;\n                    break;\n                case 2:\n                    src = \"file://{images}/icons/equipment/defuser.svg\";\n                    bEventCT = true;\n                    break;\n                case 3:\n                    src = \"file://{images}/icons/ui/time_exp.svg\";\n                    bEventCT = true;\n                    break;\n            }\n            elEventIcon.SetImage(src);\n            elEventIcon.AddClass('event__icon--objective');\n            elEventBG.SetHasClass('color-ct', bEventCT);\n            elEventBG.SetHasClass('color-t', !bEventCT);\n        }\n        const delta = chance - _m_prevChance;\n        const deltaSymbol = delta < 0 ? \"▼\" : delta > 0 ? \"▲\" : \"\";\n        if (chance == 100) {\n            elEventPlot.SetDialogVariable('chance', $.Localize('#ris_win'));\n            elEventChance.FindChildTraverse('EventChanceNumber').style.color = '#ffffff';\n        }\n        else if (chance == 0) {\n            elEventPlot.SetDialogVariable('chance', $.Localize('#ris_loss'));\n            elEventChance.FindChildTraverse('EventChanceNumber').style.color = '#ffffff';\n        }\n        else {\n            elEventPlot.SetDialogVariable('chance', deltaSymbol + chance + '%');\n            elEventChance.FindChildTraverse('EventChanceNumber').style.color = _RemapToTeamColorRGB(chance - _m_prevChance, -20, 20);\n        }\n        elEventPlot.style.x = plotPoint[0] + \"px\";\n        elEventPlot.style.y = plotPoint[1] + \"px\";\n        if (elEventMain && elEventMain.IsValid())\n            elEventMain.RemoveClass('prereveal');\n        if (elEventChance && elEventChance.IsValid())\n            elEventChance.RemoveClass('prereveal');\n        if (elDeath && elDeath.IsValid())\n            elDeath.RemoveClass('prereveal');\n        const sfx = delta > 0 ? \"UIPanorama.round_report_odds_up\" : delta < 0 ? \"UIPanorama.round_report_odds_dn\" : \"UIPanorama.round_report_odds_none\";\n        UiToolkitAPI.PlaySoundEvent(sfx);\n        _m_prevChance = chance;\n    }\n    function _RemapToTeamColorRGB(val, min, max) {\n        let frac = Math.min(1, Math.max(0, (val - min) / (max - min)));\n        const bCTWon = _m_winningTeam == 3;\n        if (bCTWon)\n            frac = 1 - frac;\n        const R = frac * (234 - 122) + 122;\n        const G = 210;\n        const B = (1 - frac) * (238 - 139) + 139;\n        return 'rgb(' + R + \",\" + G + \",\" + B + \")\";\n    }\n    function _Reset() {\n        const localTeamNumber = GameStateAPI.GetAssociatedTeamNumber(_m_localXuid);\n        const bUseInEye = GameStateAPI.IsDemoOrHltv() || (localTeamNumber != 2 && localTeamNumber != 3);\n        _m_localXuid = bUseInEye ? GameStateAPI.GetHudPlayerXuid() : GameStateAPI.GetLocalPlayerXuid();\n        _m_teamPerspective = (localTeamNumber == 2 || localTeamNumber == 3) ? localTeamNumber : 2;\n        const bCT = _m_teamPerspective == 3;\n        _m_elCanvas = $.GetContextPanel().FindChildTraverse('RisCanvas');\n        _m_elPlotContainer = $.GetContextPanel().FindChildTraverse('RisPlotContainer');\n        Scheduler.Cancel();\n        _m_arrTimelineEvents = [];\n        _m_arrPersonalDamageEvents = [];\n        _m_elPlotContainer.RemoveAndDeleteChildren();\n        const elDamageContainer = $.GetContextPanel().FindChildTraverse('DamageContainer');\n        elDamageContainer.RemoveAndDeleteChildren();\n        _m_elCanvas.ClearJS('rgba(0,0,0,0)');\n        $.GetContextPanel().SetDialogVariable('team', GameStateAPI.GetTeamClanName(bCT ? 'CT' : 'TERRORIST'));\n        const elTeamLogo = $.GetContextPanel().FindChildTraverse('RisTeamLogo');\n        if (elTeamLogo) {\n            elTeamLogo.SetImage(bCT ? \"file://{images}/icons/ui/ct_logo_1c.svg\" : \"file://{images}/icons/ui/t_logo_1c.svg\");\n        }\n        _Colorize();\n    }\n    {\n        $.RegisterEventHandler('HudWinPanel_MVP', $.GetContextPanel(), _SetMVP);\n        _Init();\n    }\n})(HudWinPanel || (HudWinPanel = {}));\n","scripts/hud/hudwinpanel_background_map.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../avatar.ts\" />\n/// <reference path=\"../digitpanel.ts\" />\n/// <reference path=\"../particle_controls.ts\" />\n/// <reference path=\"../common/iteminfo.ts\" />\n/// <reference path=\"../common/scheduler.ts\" />\n/// <reference path=\"../common/teamcolor.ts\" />\nvar MvpBackgroundMap;\n(function (MvpBackgroundMap) {\n    function SetUpMapWinPanel(xuid, reason, team, elParent) {\n        let strTeam = team === 3 ? 'ct' : 't';\n        let mvpCharItemId = GameStateAPI.GetPlayerCharacterItemID(xuid);\n        let oSettings;\n        let isNonPremier;\n        if (!mvpCharItemId)\n            mvpCharItemId = LoadoutAPI.GetItemID(strTeam, 'customplayer');\n        let teamOverride = $.GetContextPanel().Data().teamOverride;\n        if (teamOverride) {\n            $.GetContextPanel().SetHasClass('WinPanelRoot--Win--T', $.GetContextPanel().Data().teamOverride === 2);\n            $.GetContextPanel().SetHasClass('WinPanelRoot--Win--CT', $.GetContextPanel().Data().teamOverride === 3);\n        }\n        let mode = $.GetContextPanel().Data().gameModeOverride;\n        if (mode && !GameStateAPI.IsQueuedMatchmaking()) {\n            mode = $.GetContextPanel().Data().gameModeOverride;\n        }\n        else {\n            if (mode === 'competitive' && GameStateAPI.GetPlayerCompetitiveRankType(xuid) === 'Premier') {\n                mode = 'premier';\n            }\n            else {\n                mode = GameStateAPI.GetGameModeInternalName(false);\n            }\n        }\n        isNonPremier = mode.toLowerCase() !== 'premier';\n        $.GetContextPanel().SetHasClass('non-premier', isNonPremier);\n        let backgroundCharModel = \"\";\n        if (strTeam === 't')\n            backgroundCharModel = \"agents/models/ctm_sas/ctm_sas.vmdl\";\n        else\n            backgroundCharModel = \"agents/models/tm_phoenix/tm_phoenix.vmdl\";\n        oSettings = {\n            mapPanel: elParent.FindChild('id-match-mvp-map'),\n            numTeam: team,\n            mvpTeam: strTeam,\n            mvpCharModel: ItemInfo.GetModelPlayer(mvpCharItemId),\n            backgroundCharModel,\n            backgroundEntities: ['background_particles_squares', 'background_particles_basic', 'background_particles_vertical']\n        };\n        SetFlairModel(oSettings, xuid);\n        if (isNonPremier) {\n            _MvpMapPanelLogicNonPremier(oSettings);\n        }\n        else {\n            switch (reason) {\n                case 1:\n                    _MvpMapPanelLogicCelebrate(oSettings);\n                    break;\n                case 2:\n                    _MvpMapPanelLogicCelebrate(oSettings);\n                    break;\n                case 3:\n                    _MvpMapPanelLogicCelebrate(oSettings);\n                    break;\n                case 4:\n                    _MvpMapPanelLogicCelebrate(oSettings);\n                    break;\n                case 5:\n                    _MvpMapPanelLogicCelebrate(oSettings);\n                    break;\n                case 7:\n                    _MvpMapPanelLogicCelebrate(oSettings);\n                    break;\n                case 9:\n                    _MvpMapPanelLogicAceRound(oSettings);\n                    break;\n                case 10:\n                    _MvpMapPanelLogicBurnDamage(oSettings);\n                    break;\n                case 11:\n                    _MvpMapPanelLogicBlastDamage(oSettings);\n                    break;\n                case 12:\n                    break;\n                case 13:\n                    _MvpMapPanelLogicBombPlant(oSettings);\n                    break;\n                case 14:\n                    _MvpMapPanelLogicBombDefuse(oSettings);\n                    break;\n                case 15:\n                    _MvpMapPanelLogicThreeKills(oSettings);\n                    break;\n                case 16:\n                    _MvpMapPanelLogicFourKills(oSettings);\n                    break;\n            }\n        }\n    }\n    MvpBackgroundMap.SetUpMapWinPanel = SetUpMapWinPanel;\n    function MakeMvpMapPanel(elParent) {\n        if (elParent.FindChildInLayoutFile('id-match-mvp-map')) {\n            elParent.RemoveAndDeleteChildren();\n        }\n        return $.CreatePanel('MapPlayerPreviewPanel', elParent, 'id-match-mvp-map', {\n            \"require-composition-layer\": \"true\",\n            \"pin-fov\": \"vertical\",\n            \"transparent-background\": \"false\",\n            class: 'mvp_map',\n            camera: 'camera',\n            map: 'ui/match_mvp',\n            mouse_rotate: false,\n            playername: \"mvp_char\",\n            animgraphcharactermode: \"mvp-banner\"\n        });\n    }\n    function _MvpMapPanelLogicAceRound(oSettings) {\n        let elMap = oSettings.mapPanel;\n        let itemId = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(InventoryAPI.GetItemDefinitionIndexFromDefinitionName('weapon_awp'), 0);\n        elMap.TransitionToCamera('camera_start', 0);\n        HideCharacters(oSettings);\n        elMap.SetActiveCharacter(0);\n        elMap.SetPlayerModel(oSettings.mvpCharModel);\n        elMap.EquipPlayerWithItem(itemId);\n        elMap.PlayBannerAnimation('banner_awp_ace_gun');\n        let model = oSettings.backgroundCharModel;\n        elMap.SetActiveCharacter(1);\n        elMap.SetPlayerModel(model);\n        elMap.PlayBannerAnimation('banner_awp_ace_a');\n        elMap.SetActiveCharacter(2);\n        elMap.SetPlayerModel(model);\n        elMap.PlayBannerAnimation('banner_awp_ace_b');\n        elMap.SetActiveCharacter(3);\n        elMap.SetPlayerModel(model);\n        elMap.PlayBannerAnimation('banner_awp_ace_c');\n        elMap.SetActiveCharacter(4);\n        elMap.SetPlayerModel(model);\n        elMap.PlayBannerAnimation('banner_awp_ace_d');\n        elMap.SetActiveCharacter(5);\n        elMap.SetPlayerModel(model);\n        elMap.PlayBannerAnimation('banner_awp_ace_e');\n        oSettings.playerIndexes = [0, 1, 2, 3, 4, 5];\n        ShowCharacters(oSettings);\n        oSettings.backgroundIndex = 2;\n        SharedMapLogic(oSettings);\n        elMap.FireEntityInput(\"env_effects_ace\", \"start\");\n        $.Schedule(1.1, () => {\n            elMap.TransitionToCamera('camera', 1.2);\n        });\n        $.Schedule(1.8, () => {\n            elMap.FireEntityInput(\"card\", \"Enable\");\n            elMap.FireEntityInput(\"card\", \"SetAnimationNotLooping\", \"ace_card_anim\");\n        });\n        $.Schedule(2.8, () => {\n            elMap.FireEntityInput('mvp_awp_blast', 'Stop');\n            elMap.FireEntityInput('mvp_awp_blast', 'Start');\n        });\n        $.Schedule(2.8, () => {\n            elMap.TransitionToCamera('camera_card', .1);\n        });\n        $.Schedule(10.0, () => {\n            elMap.FireEntityInput(\"card\", \"Disable\");\n            elMap.FireEntityInput(\"card\", \"SetAnimationNotLooping\", \"idle_offscreen\");\n        });\n    }\n    function _MvpMapPanelLogicThreeKills(oSettings) {\n        let elMap = oSettings.mapPanel;\n        let itemId = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(InventoryAPI.GetItemDefinitionIndexFromDefinitionName('weapon_p250'), 0);\n        elMap.TransitionToCamera('camera_start', 0);\n        HideCharacters(oSettings);\n        elMap.SetActiveCharacter(0);\n        elMap.SetPlayerModel(oSettings.mvpCharModel);\n        elMap.EquipPlayerWithItem(itemId);\n        elMap.PlayBannerAnimation('banner_pistol3shot');\n        let model = oSettings.backgroundCharModel;\n        elMap.SetActiveCharacter(1);\n        elMap.SetPlayerModel(model);\n        elMap.PlayBannerAnimation('banner_3shot_a');\n        elMap.SetActiveCharacter(2);\n        elMap.SetPlayerModel(model);\n        elMap.PlayBannerAnimation('banner_3shot_b');\n        elMap.SetActiveCharacter(3);\n        elMap.SetPlayerModel(model);\n        elMap.PlayBannerAnimation('banner_3shot_c');\n        oSettings.playerIndexes = [0, 1, 2, 3];\n        ShowCharacters(oSettings);\n        oSettings.backgroundIndex = 2;\n        SharedMapLogic(oSettings);\n        elMap.FireEntityInput(\"env_effects_multikill\", \"Start\");\n        $.Schedule(1.2, () => {\n            elMap.TransitionToCamera('camera', 1);\n        });\n    }\n    function _MvpMapPanelLogicFourKills(oSettings) {\n        let elMap = oSettings.mapPanel;\n        let itemId = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(InventoryAPI.GetItemDefinitionIndexFromDefinitionName('weapon_p250'), 0);\n        elMap.TransitionToCamera('camera_start', 0);\n        HideCharacters(oSettings);\n        elMap.SetActiveCharacter(0);\n        elMap.SetPlayerModel(oSettings.mvpCharModel);\n        elMap.EquipPlayerWithItem(itemId);\n        elMap.PlayBannerAnimation('banner_pistol4shot');\n        let model = oSettings.backgroundCharModel;\n        elMap.SetActiveCharacter(1);\n        elMap.SetPlayerModel(model);\n        elMap.PlayBannerAnimation('banner_4shot_a');\n        elMap.SetActiveCharacter(2);\n        elMap.SetPlayerModel(model);\n        elMap.PlayBannerAnimation('banner_4shot_b');\n        elMap.SetActiveCharacter(3);\n        elMap.SetPlayerModel(model);\n        elMap.PlayBannerAnimation('banner_4shot_c');\n        elMap.SetActiveCharacter(4);\n        elMap.SetPlayerModel(model);\n        elMap.PlayBannerAnimation('banner_4shot_d');\n        oSettings.playerIndexes = [0, 1, 2, 3, 4];\n        ShowCharacters(oSettings);\n        oSettings.backgroundIndex = 2;\n        SharedMapLogic(oSettings);\n        elMap.FireEntityInput(\"env_effects_multikill\", \"Start\");\n        $.Schedule(1.2, () => {\n            elMap.TransitionToCamera('camera_4_kill', 1);\n        });\n    }\n    function _MvpMapPanelLogicCelebrate(oSettings) {\n        let elMap = oSettings.mapPanel;\n        elMap.TransitionToCamera('camera_celebrate', 0);\n        HideCharacters(oSettings);\n        $.Schedule(.1, () => {\n            elMap.TransitionToCamera('camera_start', 3);\n        });\n        elMap.SetActiveCharacter(6);\n        elMap.SetPlayerModel(oSettings.mvpCharModel);\n        elMap.PlayBannerAnimation('celebrate_stretch_noweap_idle0' + (Math.round(Math.random() * 3) + 1));\n        oSettings.playerIndexes = [6];\n        ShowCharacters(oSettings);\n        oSettings.backgroundIndex = 1;\n        SharedMapLogic(oSettings);\n    }\n    function _MvpMapPanelLogicBombPlant(oSettings) {\n        let elMap = oSettings.mapPanel;\n        let itemId = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(InventoryAPI.GetItemDefinitionIndexFromDefinitionName('weapon_c4'), 0);\n        elMap.TransitionToCamera('camera_plant', 0);\n        HideCharacters(oSettings);\n        elMap.SetActiveCharacter(12);\n        elMap.SetPlayerModel(oSettings.mvpCharModel);\n        elMap.EquipPlayerWithItem(itemId);\n        elMap.PlayBannerAnimation('banner_bomb_plant');\n        elMap.FireEntityInput('mvp_char12', 'Alpha');\n        elMap.SetActiveCharacter(13);\n        elMap.SetPlayerModel(oSettings.mvpCharModel);\n        elMap.EquipPlayerWithItem(itemId);\n        elMap.PlayBannerAnimation('banner_bomb_plant');\n        elMap.FireEntityInput('mvp_background_particles', 'SetControlPoint', '20: 0 0 ' + oSettings.numTeam);\n        oSettings.playerIndexes = [13];\n        ShowCharacters(oSettings);\n        oSettings.backgroundIndex = 2;\n        SharedMapLogic(oSettings);\n        elMap.FireEntityInput('mvp_chicken', 'Start');\n        $.Schedule(3.8, () => {\n            elMap.FireEntityInput('mvp_char12', 'Alpha', '255');\n        });\n        $.Schedule(4.0, () => {\n            elMap.FireEntityInput('mvp_bomb_light', 'start');\n        });\n    }\n    function _MvpMapPanelLogicBombDefuse(oSettings) {\n        let elMap = oSettings.mapPanel;\n        let itemId = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(InventoryAPI.GetItemDefinitionIndexFromDefinitionName('weapon_c4'), 0);\n        elMap.TransitionToCamera('camera_defuse', 0);\n        HideCharacters(oSettings);\n        elMap.SetActiveCharacter(1);\n        elMap.SetPlayerModel(oSettings.mvpCharModel);\n        elMap.EquipPlayerWithItem(itemId);\n        elMap.PlayBannerAnimation('banner_bomb_defusal_ver' + (Math.round(Math.random()) + 1));\n        elMap.FireEntityInput('mvp_background_particles', 'SetControlPoint', '20: 0 0 ' + oSettings.numTeam);\n        oSettings.playerIndexes = [1];\n        ShowCharacters(oSettings);\n        oSettings.backgroundIndex = 2;\n        SharedMapLogic(oSettings);\n    }\n    function _MvpMapPanelLogicBurnDamage(oSettings) {\n        let elMap = oSettings.mapPanel;\n        let model = oSettings.backgroundCharModel;\n        elMap.TransitionToCamera('camera_start', 0);\n        HideCharacters(oSettings);\n        elMap.SetActiveCharacter(7);\n        elMap.SetPlayerModel(model);\n        elMap.PlayBannerAnimation('banner_fire');\n        elMap.SetActiveCharacter(6);\n        elMap.SetPlayerModel(oSettings.mvpCharModel);\n        elMap.PlayBannerAnimation('celebrate_stretch_noweap_idle0' + (Math.round(Math.random() * 3) + 1));\n        oSettings.playerIndexes = [6, 7];\n        ShowCharacters(oSettings);\n        oSettings.backgroundIndex = 2;\n        SharedMapLogic(oSettings);\n        elMap.FireEntityInput('mvp_burndamage_effects', 'start');\n    }\n    function _MvpMapPanelLogicBlastDamage(oSettings) {\n        let elMap = oSettings.mapPanel;\n        elMap.TransitionToCamera('camera_grenade_start', 0);\n        HideCharacters(oSettings);\n        elMap.SetActiveCharacter(11);\n        elMap.SetPlayerModel(oSettings.mvpCharModel);\n        elMap.PlayBannerAnimation('banner_bomb_blast_toss');\n        elMap.SetActiveCharacter(8);\n        elMap.SetPlayerModel(oSettings.backgroundCharModel);\n        elMap.PlayBannerAnimation('banner_bomb_blast01');\n        elMap.SetActiveCharacter(9);\n        elMap.SetPlayerModel(oSettings.backgroundCharModel);\n        elMap.PlayBannerAnimation('banner_bomb_blast02');\n        elMap.SetActiveCharacter(10);\n        elMap.SetPlayerModel(oSettings.backgroundCharModel);\n        elMap.PlayBannerAnimation('banner_bomb_blast03');\n        oSettings.playerIndexes = [8, 9, 10];\n        ShowCharacters(oSettings);\n        oSettings.backgroundIndex = 2;\n        SharedMapLogic(oSettings);\n        $.Schedule(2, () => {\n            elMap.TransitionToCamera('camera_grenade', 1);\n            elMap.FireEntityInput('mvp_char11', 'Alpha', '255');\n        });\n        $.Schedule(5, () => {\n            elMap.FireEntityInput('mvp_char10', 'Alpha', '0');\n        });\n    }\n    function _MvpMapPanelLogicNonPremier(oSettings) {\n        let elMap = oSettings.mapPanel;\n        elMap.TransitionToCamera('camera_start', 0);\n        $.Schedule(.1, () => {\n            elMap.TransitionToCamera('camera_non_premier', 3);\n        });\n        oSettings.playerIndexes = [];\n        HideCharacters(oSettings);\n        oSettings.backgroundIndex = 0;\n        SharedMapLogic(oSettings);\n    }\n    function SharedMapLogic(oSettings) {\n        let ctLightColor = '67 162 230';\n        let tLightColor = '129 107 28';\n        oSettings.mapPanel.FireEntityInput('mvp_burndamage_effects', 'Stop');\n        oSettings.mapPanel.FireEntityInput(\"env_effects_multikill\", \"Stop\");\n        oSettings.mapPanel.FireEntityInput(\"env_effects_ace\", \"Stop\");\n        oSettings.mapPanel.FireEntityInput('mvp_bomb_light', 'Stop');\n        oSettings.mapPanel.FireEntityInput('mvp_chicken', 'Stop');\n        oSettings.mapPanel.FireEntityInput('env_effects_basic', 'Stop');\n        oSettings.mapPanel.FireEntityInput('mvp_light_spot', 'SetColor', oSettings.mvpTeam === 'ct' ? ctLightColor : tLightColor);\n        oSettings.mapPanel.FireEntityInput('mvp_light_spot2', 'SetColor', oSettings.mvpTeam === 'ct' ? ctLightColor : tLightColor);\n        SetBackgroundParticles(oSettings);\n    }\n    function SetBackgroundParticles(oSettings) {\n        oSettings.backgroundEntities.forEach(entry => { oSettings.mapPanel.FireEntityInput(entry, 'Stop'); });\n        oSettings.mapPanel.FireEntityInput(oSettings.backgroundEntities[oSettings.backgroundIndex], 'Start');\n        oSettings.mapPanel.FireEntityInput(oSettings.backgroundEntities[oSettings.backgroundIndex], 'SetControlPoint', '20: 0 0 ' + oSettings.numTeam);\n    }\n    function HideCharacters(oSettings) {\n        let numChars = 13;\n        for (let i = 0; i <= numChars; i++) {\n            oSettings.mapPanel.FireEntityInput('mvp_char' + i, 'Alpha', '0');\n            oSettings.mapPanel.SetActiveCharacter(i);\n            oSettings.mapPanel.PlayBannerAnimation('idle_offscreen');\n        }\n    }\n    function ShowCharacters(oSettings) {\n        for (let i = 0; i < oSettings.playerIndexes.length; i++) {\n            oSettings.mapPanel.FireEntityInput('mvp_char' + oSettings.playerIndexes[i], 'Alpha', '255');\n        }\n    }\n    function SetFlairModel(oSettings, xuid) {\n        let flairItemId = InventoryAPI.GetFlairItemId(xuid);\n        oSettings.mapPanel.FireEntityInput(\"item\", \"SetItem\", flairItemId);\n    }\n})(MvpBackgroundMap || (MvpBackgroundMap = {}));\n","scripts/inspect.js":"\"use strict\";\n/// <reference path=\"common/characteranims.ts\" />\n/// <reference path=\"common/iteminfo.ts\" />\n/// <reference path=\"common/tint_spray_icon.ts\" />\n/// <reference path=\"popups/popup_inspect_shared.ts\" />\nvar InspectModelImage;\n(function (InspectModelImage) {\n    let m_elPanel = null;\n    let m_elContainer = null;\n    let m_isLaptopOpening = false;\n    InspectModelImage.m_CameraSettingsPerWeapon = [\n        { type: 'weapon_awp', camera: '7', zoom_camera: 'weapon_awp_zoom,weapon_awp_front_zoom' },\n        { type: 'weapon_aug', camera: '3', zoom_camera: 'weapon_aug_zoom' },\n        { type: 'weapon_sg556', camera: '4', zoom_camera: 'weapon_ak47_zoom,weapon_ak47_front_zoom' },\n        { type: 'weapon_ssg08', camera: '6', zoom_camera: 'weapon_ssg08_zoom,weapon_ssg08_front_zoom' },\n        { type: 'weapon_ak47', camera: '4', zoom_camera: 'weapon_ak47_zoom,weapon_ak47_front_zoom' },\n        { type: 'weapon_m4a1_silencer', camera: '6', zoom_camera: 'weapon_m4a1_silencer_zoom,weapon_m4a1_silencer_front_zoom' },\n        { type: 'weapon_famas', camera: '4' },\n        { type: 'weapon_g3sg1', camera: '5', zoom_camera: 'weapon_g3sg1_zoom,weapon_g3sg1_front_zoom' },\n        { type: 'weapon_galilar', camera: '3', zoom_camera: 'weapon_galilar_zoom' },\n        { type: 'weapon_m4a1', camera: '4', zoom_camera: 'weapon_ak47_zoom,weapon_ak47_front_zoom' },\n        { type: 'weapon_scar20', camera: '5', zoom_camera: 'weapon_g3sg1_zoom,weapon_g3sg1_front_zoom' },\n        { type: 'weapon_mp5sd', camera: '3' },\n        { type: 'weapon_xm1014', camera: '4', zoom_camera: 'weapon_xm1014_zoom' },\n        { type: 'weapon_m249', camera: '6', zoom_camera: 'weapon_m249_zoom' },\n        { type: 'weapon_ump45', camera: '3' },\n        { type: 'weapon_bizon', camera: '3' },\n        { type: 'weapon_mag7', camera: '3' },\n        { type: 'weapon_nova', camera: '5', zoom_camera: 'weapon_g3sg1_zoom,weapon_g3sg1_front_zoom' },\n        { type: 'weapon_sawedoff', camera: '3' },\n        { type: 'weapon_negev', camera: '5', zoom_camera: 'weapon_negev_zoom' },\n        { type: 'weapon_usp_silencer', camera: '2', zoom_camera: '0' },\n        { type: 'weapon_elite', camera: '2' },\n        { type: 'weapon_tec9', camera: '2' },\n        { type: 'weapon_revolver', camera: '2' },\n        { type: 'weapon_c4', camera: '3' },\n        { type: 'weapon_taser', camera: '0' },\n    ];\n    function Init(elContainer, itemId) {\n        const strViewFunc = InspectShared.GetPopupSetting('force_inspect_view_type');\n        m_isLaptopOpening = (elContainer.Data().isLapTopOpening === true) ? true : false;\n        if (!InventoryAPI.IsValidItemID(itemId)) {\n            return '';\n        }\n        m_elContainer = elContainer;\n        if (ItemInfo.ItemDefinitionNameSubstrMatch(itemId, 'tournament_journal_') && strViewFunc === 'graffiti')\n            itemId = ItemInfo.GetFauxReplacementItemID(itemId, 'graffiti');\n        const model = ItemInfo.GetModelPathFromJSONOrAPI(itemId);\n        _InitSceneBasedOnItemType(model, itemId);\n        return model;\n    }\n    InspectModelImage.Init = Init;\n    function _UseAcknowledge() {\n        return m_elContainer.Data().useAcknowledge ? m_elContainer.Data().useAcknowledge : false;\n    }\n    function _InitSceneBasedOnItemType(model, itemId) {\n        if (ItemInfo.IsCharacter(itemId)) {\n            m_elPanel = _InitCharScene(itemId);\n        }\n        else if (ItemInfo.IsMelee(itemId)) {\n            m_elPanel = _InitMeleeScene(itemId);\n        }\n        else if (ItemInfo.IsWeapon(itemId)) {\n            DeleteExistingItemPanel(itemId, 'ItemPreviewPanel');\n            m_elPanel = _InitWeaponScene(itemId);\n        }\n        else if (ItemInfo.IsDisplayItem(itemId)) {\n            DeleteExistingItemPanel(itemId, 'ItemPreviewPanel');\n            m_elPanel = _InitDisplayScene(itemId);\n        }\n        else if (ItemInfo.IsKeychain(itemId)) {\n            m_elPanel = _InitKeyChainScene(itemId);\n        }\n        else if (InventoryAPI.DoesItemMatchDefinitionByName(itemId, \"sticker_display_case\")) {\n            const defKeychain = InventoryAPI.GetItemDefinitionIndexFromDefinitionName('keychain');\n            const kcModel = InventoryAPI.GetItemAttributeValue(itemId, '{uint32}display case keychain id');\n            const fauxItemId = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(defKeychain, kcModel);\n            m_elPanel = _InitKeyChainScene(fauxItemId);\n        }\n        else if (InventoryAPI.GetLoadoutCategory(itemId) == \"musickit\") {\n            m_elPanel = _InitMusicKitScene(itemId);\n        }\n        else if (ItemInfo.IsSprayPaint(itemId) || ItemInfo.IsSpraySealed(itemId)) {\n            DeleteExistingItemPanel(itemId, 'ItemPreviewPanel');\n            m_elPanel = _InitSprayScene(itemId);\n        }\n        else if (ItemInfo.IsCase(itemId)) {\n            m_elPanel = model ? _InitCaseScene(itemId) : _SetImage(itemId);\n        }\n        else if (ItemInfo.IsNameTag(itemId)) {\n            m_elPanel = _InitNametagScene(itemId);\n        }\n        else if (ItemInfo.IsSticker(itemId) || ItemInfo.IsPatch(itemId)) {\n            DeleteExistingItemPanel(itemId, 'ItemPreviewPanel');\n            m_elPanel = _InitStickerScene(itemId);\n        }\n        else if (ItemInfo.ItemDefinitionNameSubstrMatch(itemId, 'tournament_pass_') && ItemInfo.ItemDefinitionNameSubstrMatch(itemId, '_credits')) {\n            DeleteExistingItemPanel(itemId, 'ItemPreviewPanel');\n            m_elPanel = _InitDisplayScene(itemId, true);\n        }\n        else if (InventoryAPI.DoesItemMatchDefinitionByName(itemId, 'chicken_feed')) {\n            DeleteExistingItemPanel(itemId, 'ItemPreviewPanel');\n            m_elPanel = _InitChickenFeedScene(itemId);\n        }\n        else if (ItemInfo.IsPet(itemId)) {\n            m_elPanel = _InitPetScene(itemId);\n        }\n        else if (model) {\n            if (InventoryAPI.GetLoadoutCategory(itemId) === 'clothing') {\n                m_elPanel = _InitGlovesScene(itemId);\n            }\n            else if (ItemInfo.ItemHasCapability(itemId, 'decodable')) {\n                if (InventoryAPI.GetItemAttributeValue(itemId, '{uint32}volatile container')) {\n                    m_elPanel = _InitLaptopScene(itemId);\n                }\n                else {\n                    m_elPanel = _InitCaseScene(itemId);\n                }\n            }\n        }\n        else if (!model) {\n            m_elPanel = _SetImage(itemId);\n        }\n        return m_elPanel;\n    }\n    function _InitCharScene(itemId, bHide = false, weaponItemId = '', contextPanel = $.GetContextPanel()) {\n        let elPanel = GetExistingItemPanel('CharPreviewPanel');\n        let active_item_idx = 5;\n        let mapName = _GetBackGroundMap();\n        if (!elPanel) {\n            elPanel = $.CreatePanel('MapPlayerPreviewPanel', m_elContainer, 'CharPreviewPanel', {\n                \"require-composition-layer\": \"true\",\n                \"pin-fov\": \"vertical\",\n                class: 'full-width full-height hidden',\n                camera: 'cam_char_inspect_wide_intro',\n                player: \"true\",\n                map: mapName,\n                initial_entity: 'item',\n                mouse_rotate: false,\n                playername: \"vanity_character\",\n                animgraphcharactermode: \"inventory-inspect\",\n                animgraphturns: \"false\",\n                workshop_preview: InspectShared.GetPopupSetting('is_workshop_preview')\n            });\n            elPanel.Data().loadedMap = mapName;\n        }\n        elPanel.Data().itemId = itemId;\n        const settings = ItemInfo.GetOrUpdateVanityCharacterSettings(itemId);\n        elPanel.SetActiveCharacter(active_item_idx);\n        settings.panel = elPanel;\n        settings.weaponItemId = weaponItemId ? weaponItemId : settings.weaponItemId ? settings.weaponItemId : '';\n        CharacterAnims.PlayAnimsOnPanel(settings);\n        const worktype = InspectShared.GetPopupSetting('work_type', contextPanel);\n        if (worktype !== 'can_patch' && worktype !== 'remove_patch') {\n            _TransitionCamera(elPanel, 'char_inspect_wide');\n        }\n        if (!bHide) {\n            elPanel.RemoveClass('hidden');\n        }\n        _AdditionalMapLoadSettings(elPanel, active_item_idx, mapName);\n        let elInspectPanel = GetExistingItemPanel('ItemPreviewPanel');\n        if (elInspectPanel) {\n            settings.panel = elInspectPanel;\n            CharacterAnims.PlayAnimsOnPanel(settings);\n        }\n        return elPanel;\n    }\n    function StartWeaponLookat() {\n        let elItemPanel = GetExistingItemPanel('ItemPreviewPanel');\n        if (elItemPanel) {\n            elItemPanel.StartWeaponLookat();\n        }\n    }\n    InspectModelImage.StartWeaponLookat = StartWeaponLookat;\n    function EndWeaponLookat() {\n        let elItemPanel = GetExistingItemPanel('ItemPreviewPanel');\n        if (elItemPanel) {\n            elItemPanel.EndWeaponLookat();\n        }\n    }\n    InspectModelImage.EndWeaponLookat = EndWeaponLookat;\n    function PanZoomEnabled() {\n        let elItemPanel = GetExistingItemPanel('ItemPreviewPanel');\n        if (elItemPanel) {\n            return elItemPanel.PanZoomEnabled();\n        }\n        return false;\n    }\n    InspectModelImage.PanZoomEnabled = PanZoomEnabled;\n    function StartPetLookAt() {\n        let elInspectPanel = GetExistingItemPanel('ItemPreviewPanel');\n        if (elInspectPanel) {\n            elInspectPanel.StartPetLookAt();\n        }\n    }\n    InspectModelImage.StartPetLookAt = StartPetLookAt;\n    function _SetCSMSplitPlane0DistanceOverrideMainCharacter(elPanel, backgroundMap) {\n        let flSplitPlane0Distance = 0.0;\n        if (backgroundMap === 'de_ancient_vanity') {\n            flSplitPlane0Distance = 180.0;\n        }\n        else if (backgroundMap === 'de_anubis_vanity') {\n            flSplitPlane0Distance = 180.0;\n        }\n        else if (backgroundMap === 'ar_baggage_vanity') {\n            flSplitPlane0Distance = 200.0;\n        }\n        else if (backgroundMap === 'de_dust2_vanity') {\n            flSplitPlane0Distance = 160.0;\n        }\n        else if (backgroundMap === 'de_inferno_vanity') {\n            flSplitPlane0Distance = 160.0;\n        }\n        else if (backgroundMap === 'cs_italy_vanity') {\n            flSplitPlane0Distance = 200.0;\n        }\n        else if (backgroundMap === 'de_mirage_vanity') {\n            flSplitPlane0Distance = 180.0;\n        }\n        else if (backgroundMap === 'de_overpass_vanity') {\n            flSplitPlane0Distance = 150.0;\n        }\n        else if (backgroundMap === 'de_vertigo_vanity') {\n            flSplitPlane0Distance = 190.0;\n        }\n        else if (backgroundMap === 'ui/acknowledge_item') {\n            flSplitPlane0Distance = 200.0;\n        }\n        if (flSplitPlane0Distance > 0.0) {\n            elPanel.SetCSMSplitPlane0DistanceOverride(flSplitPlane0Distance);\n        }\n    }\n    function _SetCSMSplitPlane0DistanceOverrideItemInspect(elPanel, backgroundMap, itemId) {\n        let flSplitPlane0Distance = 0.0;\n        let bIsKeyChain = ItemInfo.IsKeychain(itemId);\n        let itemCategory = InventoryAPI.GetLoadoutCategory(itemId);\n        if (itemCategory === 'secondary')\n            flSplitPlane0Distance = 30.0;\n        else if (itemCategory === 'smg')\n            flSplitPlane0Distance = 40.0;\n        else if (itemCategory === 'rifle')\n            flSplitPlane0Distance = 55.0;\n        else if (itemCategory === 'clothing')\n            flSplitPlane0Distance = 15.0;\n        else if (itemCategory === 'melee')\n            flSplitPlane0Distance = 30.0;\n        else if (bIsKeyChain)\n            flSplitPlane0Distance = 10.0;\n        if (flSplitPlane0Distance > 0.0) {\n            elPanel.SetCSMSplitPlane0DistanceOverride(flSplitPlane0Distance);\n        }\n    }\n    function _SetBarnlightShadowScaleOverrideMainCharacter(elPanel, backgroundMap) {\n        let flBarnlightShadowScale = 0.0;\n        if (backgroundMap === 'ui/acknowledge_item') {\n            flBarnlightShadowScale = 1.0;\n        }\n        else if (backgroundMap === 'warehouse_vanity') {\n            flBarnlightShadowScale = 1.0;\n        }\n        else if (backgroundMap === 'de_train_vanity') {\n            flBarnlightShadowScale = 1.0;\n        }\n        if (flBarnlightShadowScale > 0.0) {\n            elPanel.SetBarnlightShadowScaleOverride(flBarnlightShadowScale);\n        }\n    }\n    function _SetBarnlightShadowScaleOverrideItemInspect(elPanel, backgroundMap, itemId) {\n        let flBarnlightShadowScale = 0.0;\n        const bIsKeyChain = ItemInfo.IsKeychain(itemId);\n        const bIsWeaponOrKnife = ItemInfo.IsWeapon(itemId) || ItemInfo.IsMelee(itemId);\n        const itemCategory = InventoryAPI.GetLoadoutCategory(itemId);\n        if (backgroundMap === 'ui/acknowledge_item') {\n            flBarnlightShadowScale = 1.0;\n        }\n        else if (itemCategory === 'clothing') {\n            if (backgroundMap === 'de_train_vanity')\n                flBarnlightShadowScale = 1.0;\n            else\n                flBarnlightShadowScale = 4.0;\n        }\n        else if (bIsWeaponOrKnife || bIsKeyChain) {\n            if (backgroundMap === 'warehouse_vanity')\n                flBarnlightShadowScale = 1.0;\n            else if (backgroundMap === 'de_train_vanity')\n                flBarnlightShadowScale = 1.0;\n            else\n                flBarnlightShadowScale = 4.0;\n        }\n        if (flBarnlightShadowScale > 0.0) {\n            elPanel.SetBarnlightShadowScaleOverride(flBarnlightShadowScale);\n        }\n    }\n    function _InitWeaponScene(itemId) {\n        const IsItemApplyRemove = InspectShared.GetPopupSetting('is_apply_remove_item');\n        let oSettings = {\n            panel_type: \"MapItemPreviewPanel\",\n            active_item_idx: 0,\n            camera: 'cam_default',\n            initial_entity: 'item',\n            mouse_rotate: \"true\",\n            rotation_limit_x: \"360\",\n            rotation_limit_y: \"90\",\n            auto_rotate_x: IsItemApplyRemove ? \"2\" : \"35\",\n            auto_rotate_y: IsItemApplyRemove ? \"3\" : \"10\",\n            auto_rotate_period_x: IsItemApplyRemove ? \"10\" : \"15\",\n            auto_rotate_period_y: IsItemApplyRemove ? \"10\" : \"25\",\n            auto_recenter: false,\n            player: \"false\",\n        };\n        const panel = _LoadInspectMap(itemId, oSettings);\n        _SetParticlesBg(itemId, panel);\n        SetItemCameraByWeaponType(itemId, panel, false);\n        const settings = ItemInfo.GetOrUpdateVanityCharacterSettings();\n        settings.panel = panel;\n        settings.weaponItemId = '';\n        return panel;\n    }\n    function _InitMeleeScene(itemId) {\n        let oSettings = {\n            panel_type: \"MapItemPreviewPanel\",\n            active_item_idx: 8,\n            camera: 'cam_melee_intro',\n            initial_entity: 'item',\n            mouse_rotate: \"true\",\n            rotation_limit_x: \"360\",\n            rotation_limit_y: \"90\",\n            auto_rotate_x: \"35\",\n            auto_rotate_y: \"10\",\n            auto_rotate_period_x: \"15\",\n            auto_rotate_period_y: \"25\",\n            auto_recenter: false,\n            player: \"false\",\n        };\n        const panel = _LoadInspectMap(itemId, oSettings);\n        _SetParticlesBg(itemId, panel);\n        _TransitionCamera(panel, 'melee');\n        return panel;\n    }\n    function _InitStickerScene(itemId) {\n        let oSettings = {\n            panel_type: \"MapItemPreviewPanel\",\n            active_item_idx: 1,\n            camera: 'cam_sticker_close_intro',\n            initial_entity: 'item',\n            mouse_rotate: \"true\",\n            rotation_limit_x: \"70\",\n            rotation_limit_y: \"60\",\n            auto_rotate_x: \"20\",\n            auto_rotate_y: \"0\",\n            auto_rotate_period_x: \"10\",\n            auto_rotate_period_y: \"10\",\n            auto_recenter: false,\n            player: \"false\",\n        };\n        const panel = _LoadInspectMap(itemId, oSettings);\n        _SetParticlesBg(itemId, panel);\n        _TransitionCamera(panel, 'sticker_close');\n        return panel;\n    }\n    function _InitSprayScene(itemId) {\n        let oSettings = {\n            panel_type: \"MapItemPreviewPanel\",\n            active_item_idx: 2,\n            camera: 'camera_path_spray',\n            initial_entity: 'item',\n            mouse_rotate: \"false\",\n            rotation_limit_x: \"\",\n            rotation_limit_y: \"\",\n            auto_rotate_x: \"\",\n            auto_rotate_y: \"\",\n            auto_rotate_period_x: \"\",\n            auto_rotate_period_y: \"\",\n            auto_recenter: false,\n            player: \"false\",\n        };\n        const panel = _LoadInspectMap(itemId, oSettings);\n        _TransitionCamera(panel, 'path_spray', true, 0);\n        return panel;\n    }\n    function _InitDisplayScene(itemId, bDoNotAllowRotate = false) {\n        let bOverrideItem = InventoryAPI.GetItemDefinitionIndex(itemId) === 996;\n        let rotationOverrideX = bOverrideItem ? \"360\" : \"70\";\n        let autoRotateOverrideX = bDoNotAllowRotate ? \"0\" : bOverrideItem ? \"180\" : \"45\";\n        let autoRotateTimeOverrideX = bDoNotAllowRotate ? \"1\" : bOverrideItem ? \"100\" : \"20\";\n        let oSettings = {\n            panel_type: \"MapItemPreviewPanel\",\n            active_item_idx: 3,\n            camera: 'cam_display_close_intro',\n            initial_entity: 'item',\n            mouse_rotate: bDoNotAllowRotate ? \"false\" : \"true\",\n            rotation_limit_x: rotationOverrideX,\n            rotation_limit_y: \"60\",\n            auto_rotate_x: autoRotateOverrideX,\n            auto_rotate_y: bDoNotAllowRotate ? \"0\" : \"12\",\n            auto_rotate_period_x: autoRotateTimeOverrideX,\n            auto_rotate_period_y: bDoNotAllowRotate ? \"1\" : \"20\",\n            auto_recenter: false,\n            player: \"false\",\n        };\n        const panel = _LoadInspectMap(itemId, oSettings);\n        _SetParticlesBg(itemId, panel);\n        _TransitionCamera(panel, 'display_close');\n        return panel;\n    }\n    function _InitChickenFeedScene(itemId, bDoNotAllowRotate = false) {\n        let bOverrideItem = InventoryAPI.GetItemDefinitionIndex(itemId) === 996;\n        let rotationOverrideX = bOverrideItem ? \"360\" : \"70\";\n        let autoRotateOverrideX = bDoNotAllowRotate ? \"0\" : bOverrideItem ? \"180\" : \"45\";\n        let autoRotateTimeOverrideX = bDoNotAllowRotate ? \"1\" : bOverrideItem ? \"100\" : \"20\";\n        let oSettings = {\n            panel_type: \"MapItemPreviewPanel\",\n            active_item_idx: 3,\n            camera: 'cam_display_close_intro',\n            initial_entity: 'item',\n            mouse_rotate: bDoNotAllowRotate ? \"false\" : \"true\",\n            rotation_limit_x: rotationOverrideX,\n            rotation_limit_y: \"60\",\n            auto_rotate_x: autoRotateOverrideX,\n            auto_rotate_y: bDoNotAllowRotate ? \"0\" : \"12\",\n            auto_rotate_period_x: autoRotateTimeOverrideX,\n            auto_rotate_period_y: bDoNotAllowRotate ? \"1\" : \"20\",\n            auto_recenter: false,\n            player: \"false\",\n        };\n        const panel = _LoadInspectMap(itemId, oSettings);\n        _SetParticlesBg(itemId, panel);\n        _TransitionCamera(panel, 'display_close');\n        return panel;\n    }\n    function _InitMusicKitScene(itemId) {\n        let oSettings = {\n            panel_type: \"MapItemPreviewPanel\",\n            active_item_idx: 4,\n            camera: 'cam_musickit_intro',\n            initial_entity: 'item',\n            mouse_rotate: \"true\",\n            rotation_limit_x: \"55\",\n            rotation_limit_y: \"55\",\n            auto_rotate_x: \"10\",\n            auto_rotate_y: \"0\",\n            auto_rotate_period_x: \"20\",\n            auto_rotate_period_y: \"20\",\n            auto_recenter: false,\n            player: \"false\",\n        };\n        const panel = _LoadInspectMap(itemId, oSettings);\n        _SetParticlesBg(itemId, panel);\n        _TransitionCamera(panel, 'musickit_close');\n        return panel;\n    }\n    function _InitCaseScene(itemId) {\n        let oSettings = {\n            panel_type: \"MapItemPreviewPanel\",\n            active_item_idx: 6,\n            camera: 'cam_case_intro',\n            initial_entity: 'item',\n            mouse_rotate: \"false\",\n            rotation_limit_x: \"\",\n            rotation_limit_y: \"\",\n            auto_rotate_x: \"\",\n            auto_rotate_y: \"\",\n            auto_rotate_period_x: \"\",\n            auto_rotate_period_y: \"\",\n            auto_recenter: false,\n            player: \"false\",\n        };\n        const panel = _LoadInspectMap(itemId, oSettings);\n        _SetParticlesBg(itemId, panel);\n        const useAcknowledge = _UseAcknowledge();\n        _TransitionCamera(panel, useAcknowledge ? 'case_new_item' : 'case', useAcknowledge ? true : false);\n        return panel;\n    }\n    function _InitLaptopScene(itemId) {\n        let oSettings = {\n            panel_type: \"MapItemPreviewPanel\",\n            active_item_idx: 10,\n            camera: 'cam_laptop_intro',\n            initial_entity: 'item',\n            mouse_rotate: \"false\",\n            rotation_limit_x: \"\",\n            rotation_limit_y: \"\",\n            auto_rotate_x: \"\",\n            auto_rotate_y: \"\",\n            auto_rotate_period_x: \"\",\n            auto_rotate_period_y: \"\",\n            auto_recenter: false,\n            map_override: 'ui/inspect_laptop',\n            player: \"false\",\n        };\n        const panel = _LoadInspectMap(itemId, oSettings);\n        _SetParticlesBg(itemId, panel);\n        if (m_isLaptopOpening) {\n            panel.TransitionToCamera('cam_laptop', 0);\n            $.Schedule(.25, () => {\n                if (panel.IsValid() && panel) {\n                    $.DispatchEvent('CSGOPlaySoundEffect', 'UI.Laptop.ZoomIn', 'MOUSE');\n                    panel.TransitionToCamera('cam_laptop_open', 1);\n                }\n            });\n        }\n        else {\n            const useAcknowledge = _UseAcknowledge();\n            _TransitionCamera(panel, useAcknowledge ? 'laptop_new_item' : 'laptop', useAcknowledge ? true : false);\n        }\n        return panel;\n    }\n    function _InitGlovesScene(itemId) {\n        let oSettings = {\n            panel_type: \"MapItemPreviewPanel\",\n            active_item_idx: 7,\n            camera: 'cam_gloves',\n            initial_entity: 'item',\n            mouse_rotate: \"false\",\n            rotation_limit_x: \"\",\n            rotation_limit_y: \"\",\n            auto_rotate_x: \"\",\n            auto_rotate_y: \"\",\n            auto_rotate_period_x: \"\",\n            auto_rotate_period_y: \"\",\n            auto_recenter: false,\n            player: \"false\",\n        };\n        const panel = _LoadInspectMap(itemId, oSettings);\n        _SetParticlesBg(itemId, panel);\n        _TransitionCamera(panel, 'gloves', true);\n        return panel;\n    }\n    function _InitNametagScene(itemId) {\n        let oSettings = {\n            panel_type: \"MapItemPreviewPanel\",\n            active_item_idx: 1,\n            camera: 'cam_nametag_close_intro',\n            initial_entity: 'item',\n            mouse_rotate: \"true\",\n            rotation_limit_x: \"70\",\n            rotation_limit_y: \"60\",\n            auto_rotate_x: \"20\",\n            auto_rotate_y: \"0\",\n            auto_rotate_period_x: \"10\",\n            auto_rotate_period_y: \"10\",\n            auto_recenter: false,\n            player: \"false\",\n        };\n        const panel = _LoadInspectMap(itemId, oSettings);\n        _SetParticlesBg(itemId, panel);\n        _TransitionCamera(panel, 'nametag_close');\n        return panel;\n    }\n    function _InitKeyChainScene(itemId) {\n        let oSettings = {\n            panel_type: \"MapItemPreviewPanel\",\n            active_item_idx: 1,\n            camera: 'cam_nametag_close_intro',\n            initial_entity: 'item',\n            mouse_rotate: \"true\",\n            rotation_limit_x: \"360\",\n            rotation_limit_y: \"360\",\n            auto_rotate_x: \"20\",\n            auto_rotate_y: \"0\",\n            auto_rotate_period_x: \"10\",\n            auto_rotate_period_y: \"10\",\n            auto_recenter: false,\n            player: \"false\",\n        };\n        const panel = _LoadInspectMap(itemId, oSettings);\n        _SetParticlesBg(itemId, panel);\n        _TransitionCamera(panel, 'nametag_close');\n        return panel;\n    }\n    function _InitPetScene(itemId) {\n        let oSettings = {\n            panel_type: \"MapItemPreviewPanel\",\n            active_item_idx: 9,\n            camera: 'cam_gloves',\n            initial_entity: 'item',\n            mouse_rotate: \"true\",\n            rotation_limit_x: \"180\",\n            rotation_limit_y: \"0\",\n            auto_rotate_x: \"0\",\n            auto_rotate_y: \"0\",\n            auto_rotate_period_x: \"0\",\n            auto_rotate_period_y: \"0\",\n            auto_recenter: false,\n            player: \"false\",\n        };\n        const panel = _LoadInspectMap(itemId, oSettings, true);\n        _SetParticlesBg(itemId, panel);\n        return panel;\n    }\n    function _GetBackGroundMap(bUseMainMenuMap = false) {\n        if (_UseAcknowledge()) {\n            return 'ui/acknowledge_item';\n        }\n        let backgroundMap = GameInterfaceAPI.GetSettingString('ui_inspect_bkgnd_map');\n        if (backgroundMap == 'mainmenu' || bUseMainMenuMap === true) {\n            backgroundMap = GameInterfaceAPI.GetSettingString('ui_mainmenu_bkgnd_movie');\n        }\n        backgroundMap = !backgroundMap ? backgroundMap : backgroundMap + '_vanity';\n        return backgroundMap;\n    }\n    function _LoadInspectMap(itemId, oSettings, bUseMainMenuMap = false) {\n        let mapName = oSettings.map_override ? oSettings.map_override : _GetBackGroundMap(bUseMainMenuMap);\n        let elPanel = GetExistingItemPanel('ItemPreviewPanel');\n        if (!elPanel) {\n            let strAsyncWorkType = InspectShared.GetPopupSetting('work_type');\n            elPanel = $.CreatePanel(oSettings.panel_type, m_elContainer, 'ItemPreviewPanel', {\n                \"require-composition-layer\": \"true\",\n                'transparent-background': 'false',\n                'disable-depth-of-field': _UseAcknowledge() ? 'true' : 'false',\n                \"pin-fov\": \"vertical\",\n                class: 'inspect-model-image-panel inspect-model-image-panel--hidden',\n                camera: oSettings.camera,\n                player: \"true\",\n                map: mapName,\n                initial_entity: 'item',\n                mouse_rotate: oSettings.mouse_rotate,\n                rotation_limit_x: oSettings.rotation_limit_x,\n                rotation_limit_y: oSettings.rotation_limit_y,\n                auto_rotate_x: oSettings.auto_rotate_x,\n                auto_rotate_y: oSettings.auto_rotate_y,\n                auto_rotate_period_x: oSettings.auto_rotate_period_x,\n                auto_rotate_period_y: oSettings.auto_rotate_period_y,\n                auto_recenter: oSettings.auto_recenter,\n                workshop_preview: InspectShared.GetPopupSetting('is_workshop_preview'),\n                panzoom_enabled: oSettings.mouse_rotate,\n                tabindex: \"auto\",\n                selectionpos: \"auto\",\n                sticker_application_mode: (strAsyncWorkType === \"can_sticker\"),\n                keychain_application_mode: (strAsyncWorkType === \"can_keychain\"),\n                sticker_scrape_mode: strAsyncWorkType === \"remove_sticker\",\n            });\n        }\n        elPanel.Data().itemId = itemId;\n        elPanel.Data().active_item_idx = oSettings.active_item_idx;\n        elPanel.Data().loadedMap = mapName;\n        elPanel.SetActiveItem(oSettings.active_item_idx);\n        elPanel.SetItemItemId(itemId, '');\n        elPanel.RemoveClass('inspect-model-image-panel--hidden');\n        _AdditionalMapLoadSettings(elPanel, oSettings.active_item_idx, mapName);\n        _SetParticlesBg(itemId, elPanel);\n        if (elPanel.PanZoomEnabled()) {\n            elPanel.SetAcceptsFocus(true);\n            elPanel.SetFocus();\n        }\n        return elPanel;\n    }\n    function GetExistingItemPanel(panelId) {\n        if (!m_elContainer || !m_elContainer.IsValid())\n            return null;\n        for (let elChild of m_elContainer.Children()) {\n            if (elChild && elChild.IsValid() && elChild.id === panelId && !elChild.Data().bPreviousLootlistItemPanel) {\n                return elChild;\n            }\n        }\n        return null;\n    }\n    function DeleteExistingItemPanel(itemId, panelType) {\n        let elExistingItemPanel = GetExistingItemPanel(panelType);\n        if (!elExistingItemPanel)\n            return;\n        if (elExistingItemPanel.Data().itemId !== itemId) {\n            elExistingItemPanel.Data().bPreviousLootlistItemPanel = true;\n            elExistingItemPanel.AddClass('inspect-model-image-panel--hidden');\n            elExistingItemPanel.DeleteAsync(.5);\n        }\n    }\n    function _AdditionalMapLoadSettings(elPanel, active_item_idx, mapName) {\n        if (elPanel.id === 'CharPreviewPanel') {\n            DisableItemLighting(elPanel);\n            _SetCSMSplitPlane0DistanceOverrideMainCharacter(elPanel, mapName);\n            _SetBarnlightShadowScaleOverrideMainCharacter(elPanel, mapName);\n        }\n        else if (elPanel.id === 'id-inspect-image-bg-map') {\n            DisableItemLighting(elPanel);\n        }\n        else {\n            _SetLightingForItem(active_item_idx, elPanel);\n            if (mapName === 'de_nuke_vanity') {\n                SetSpotlightBrightness(elPanel);\n            }\n            else {\n                SetSunBrightness(elPanel);\n            }\n            const itemId = elPanel.Data().itemId;\n            _SetCSMSplitPlane0DistanceOverrideItemInspect(elPanel, mapName, itemId);\n            _SetBarnlightShadowScaleOverrideItemInspect(elPanel, mapName, itemId);\n        }\n        _SetWorkshopPreviewPanelProperties(elPanel);\n    }\n    function _SetWorkshopPreviewPanelProperties(elItemPanel) {\n        if (InspectShared.GetPopupSetting('is_workshop_preview')) {\n            let sTransparentBackground = InventoryAPI.GetPreviewSceneStateAttribute(\"transparent_background\");\n            let sBackgroundColor = InventoryAPI.GetPreviewSceneStateAttribute(\"background_color\");\n            let sPreviewIdleAnimation = InventoryAPI.GetPreviewSceneStateAttribute(\"idle_animation\");\n            if (sTransparentBackground === \"1\") {\n                elItemPanel.SetHideStaticGeometry(true);\n                elItemPanel.SetHideParticles(true);\n                elItemPanel.SetTransparentBackground(true);\n                m_elContainer.SetHasClass('popup-inspect-background', false);\n            }\n            else if (sBackgroundColor) {\n                const oColor = _HexColorToRgb(sBackgroundColor);\n                elItemPanel.SetHideStaticGeometry(true);\n                elItemPanel.SetHideParticles(true);\n                elItemPanel.SetBackgroundColor(oColor.r, oColor.g, oColor.b, 0);\n                elItemPanel.SetTransparentBackground(false);\n            }\n            else {\n                elItemPanel.SetHideStaticGeometry(false);\n                elItemPanel.SetHideParticles(false);\n                elItemPanel.SetBackgroundColor(0, 0, 0, 255);\n                elItemPanel.SetTransparentBackground(false);\n            }\n            if (sPreviewIdleAnimation === \"1\") {\n                elItemPanel.SetWorkshopPreviewIdleAnimation(true);\n            }\n            else {\n                elItemPanel.SetWorkshopPreviewIdleAnimation(false);\n            }\n        }\n    }\n    function SetItemCameraByWeaponType(itemId, elItemPanel, bSkipIntro) {\n        const category = InventoryAPI.GetLoadoutCategory(itemId);\n        const defName = InventoryAPI.GetItemDefinitionName(itemId);\n        let strCamera = '3';\n        let result = InspectModelImage.m_CameraSettingsPerWeapon.find(({ type }) => type === defName);\n        if (result) {\n            strCamera = result.camera;\n        }\n        else {\n            switch (category) {\n                case 'secondary':\n                    strCamera = '0';\n                    break;\n                case 'smg':\n                    strCamera = '2';\n                    break;\n            }\n        }\n        _TransitionCamera(elItemPanel, strCamera, bSkipIntro);\n    }\n    InspectModelImage.SetItemCameraByWeaponType = SetItemCameraByWeaponType;\n    let m_scheduleHandle = -1;\n    function _TransitionCamera(elPanel, strCamera, bSkipIntro = false, nDuration = 0) {\n        elPanel.Data().camera = strCamera;\n        if (InspectShared.GetPopupSetting('is_workshop_preview')) {\n            elPanel.TransitionToCamera('cam_' + strCamera, 0);\n            return;\n        }\n        if (bSkipIntro || InspectShared.GetPopupSetting('is_item_in_lootlist')) {\n            elPanel.TransitionToCamera('cam_' + strCamera, nDuration);\n            return;\n        }\n        elPanel.TransitionToCamera('cam_' + strCamera + '_intro', 0);\n        if (m_scheduleHandle === -1) {\n            m_scheduleHandle = $.Schedule(.25, () => {\n                if (elPanel.IsValid() && elPanel) {\n                    elPanel.TransitionToCamera('cam_' + strCamera, 1);\n                    m_scheduleHandle = -1;\n                }\n            });\n        }\n    }\n    function ZoomCamera(bZoom) {\n        let elPanel = m_elPanel;\n        const defName = InventoryAPI.GetItemDefinitionName(m_elPanel.Data().itemId);\n        let result = InspectModelImage.m_CameraSettingsPerWeapon.find(({ type }) => type === defName);\n        let strCamera = bZoom ? result?.zoom_camera : result?.camera;\n        if (!strCamera || strCamera === '')\n            return;\n        let aCameras = strCamera.split(',');\n        elPanel.SetRotation(0, 0, 1);\n        _TransitionCamera(elPanel, aCameras[0], true, .75);\n    }\n    InspectModelImage.ZoomCamera = ZoomCamera;\n    function _SetImage(itemId) {\n        let elPanel = GetExistingItemPanel('InspectItemImage');\n        if (!elPanel) {\n            _SetImageBackgroundMap();\n            elPanel = $.CreatePanel('Panel', m_elContainer, 'InspectItemImage');\n            elPanel.BLoadLayoutSnippet(\"snippet-image\");\n        }\n        const elImagePanel = elPanel.FindChildTraverse('ImagePreviewPanel');\n        elImagePanel.itemid = itemId;\n        elImagePanel.RemoveClass('hidden');\n        _TintSprayImage(itemId, elImagePanel);\n        return elImagePanel;\n    }\n    function _SetImageBackgroundMap() {\n        let mapName = _GetBackGroundMap();\n        let elPanel = $.CreatePanel('MapPlayerPreviewPanel', m_elContainer, 'id-inspect-image-bg-map', {\n            \"require-composition-layer\": \"true\",\n            'transparent-background': 'false',\n            'disable-depth-of-field': 'false',\n            \"pin-fov\": \"vertical\",\n            class: 'full-width full-height',\n            camera: \"cam_default\",\n            player: \"false\",\n            map: mapName\n        });\n        _TransitionCamera(elPanel, \"default\", true, 0);\n        _AdditionalMapLoadSettings(elPanel, 0, mapName);\n    }\n    function _TintSprayImage(id, elImage) {\n        TintSprayIcon.CheckIsSprayAndTint(id, elImage);\n    }\n    function SetCharScene(characterItemId, weaponItemId, contextPanel = $.GetContextPanel()) {\n        ItemInfo.GetOrUpdateVanityCharacterSettings(characterItemId);\n        _InitCharScene(characterItemId, true, weaponItemId, contextPanel);\n    }\n    InspectModelImage.SetCharScene = SetCharScene;\n    function ShowHideItemPanel(bshow) {\n        if (!m_elContainer.IsValid())\n            return;\n        let elItemPanel = GetExistingItemPanel('ItemPreviewPanel');\n        if (elItemPanel) {\n            elItemPanel.SetHasClass('hidden', !bshow);\n            elItemPanel.SetReadyForDisplay(bshow);\n            if (bshow) {\n                if (elItemPanel.PanZoomEnabled()) {\n                    elItemPanel.SetFocus();\n                }\n                $.DispatchEvent(\"CSGOPlaySoundEffect\", \"weapon_showSolo\", \"MOUSE\");\n            }\n        }\n    }\n    InspectModelImage.ShowHideItemPanel = ShowHideItemPanel;\n    function ShowHideCharPanel(bshow) {\n        if (!m_elContainer.IsValid())\n            return;\n        const elCharPanel = GetExistingItemPanel('CharPreviewPanel');\n        if (elCharPanel) {\n            elCharPanel.SetHasClass('hidden', !bshow);\n            elCharPanel.SetReadyForDisplay(bshow);\n        }\n        if (bshow)\n            $.DispatchEvent(\"CSGOPlaySoundEffect\", \"weapon_showOnChar\", \"MOUSE\");\n    }\n    InspectModelImage.ShowHideCharPanel = ShowHideCharPanel;\n    function GetModelPanel() {\n        return m_elPanel;\n    }\n    InspectModelImage.GetModelPanel = GetModelPanel;\n    function UpdateModelOnly(itemId) {\n        let elpanel = m_elPanel;\n        if (elpanel && elpanel.IsValid()) {\n            elpanel.SetItemItemId(itemId, '');\n        }\n    }\n    InspectModelImage.UpdateModelOnly = UpdateModelOnly;\n    function SwitchMap(elParent) {\n        for (let element of ['ItemPreviewPanel', 'CharPreviewPanel', 'id-inspect-image-bg-map']) {\n            let elPanel = elParent.FindChildTraverse(element);\n            if (elPanel && elPanel.IsValid()) {\n                let mapName = _GetBackGroundMap();\n                if (mapName !== elPanel.Data().loadedMap) {\n                    elPanel.SwitchMap(mapName);\n                    elPanel.Data().loadedMap = mapName;\n                    _AdditionalMapLoadSettings(elPanel, elPanel.Data().active_item_idx, elPanel.Data().loadedMap);\n                    const itemId = elPanel.Data().itemId;\n                    const category = InventoryAPI.GetLoadoutCategory(itemId);\n                    if (ItemInfo.IsWeapon(itemId)) {\n                        SetItemCameraByWeaponType(itemId, elPanel, true);\n                    }\n                    else {\n                        _TransitionCamera(elPanel, elPanel.Data().camera, true);\n                    }\n                }\n            }\n        }\n    }\n    InspectModelImage.SwitchMap = SwitchMap;\n    function DisableItemLighting(elPanel) {\n        _SetLightingForItem(-1, elPanel);\n    }\n    InspectModelImage.DisableItemLighting = DisableItemLighting;\n    function _SetLightingForItem(indexShow, elPanel) {\n        let numItemEntitiesInMap = 10;\n        for (let i = 0; i <= numItemEntitiesInMap; i++) {\n            let itemIndexMod = i === 0 ? '' : i.toString();\n            if (indexShow !== i) {\n                elPanel.FireEntityInput('light_item' + itemIndexMod, 'Disable');\n                elPanel.FireEntityInput('light_item_new' + itemIndexMod, 'Disable');\n            }\n            else {\n                _SetRimLight(itemIndexMod, elPanel);\n            }\n        }\n    }\n    function _SetParticlesBg(itemId, elPanel) {\n        if (!_UseAcknowledge()) {\n            return;\n        }\n        const oColor = _HexColorToRgb(InventoryAPI.GetItemRarityColor(itemId));\n        const sColor = `${oColor.r} ${oColor.g} ${oColor.b}`;\n        elPanel.FireEntityInput('acknowledge_particle', 'SetControlPoint', '16: ' + sColor);\n    }\n    function _SetRimLight(indexShow, elPanel) {\n        if (_UseAcknowledge()) {\n            elPanel.FireEntityInput('light_item' + indexShow, 'Disable');\n            let itemId = InspectShared.GetPopupSetting('item_id');\n            if (!itemId) {\n                itemId = elPanel.Data().itemId;\n            }\n            const oColor = _HexColorToRgb(InventoryAPI.GetItemRarityColor(itemId));\n            const sColor = `${oColor.r} ${oColor.g} ${oColor.b}`;\n            let lightNameInMap = \"light_item_new\" + indexShow;\n            elPanel.FireEntityInput(lightNameInMap, 'SetColor', sColor);\n        }\n        else {\n            elPanel.FireEntityInput('light_item_new' + indexShow, 'Disable');\n        }\n    }\n    function SetSunBrightness(elPanel) {\n        elPanel.FireEntityInput('sun', 'SetLightBrightness', '1.1');\n    }\n    InspectModelImage.SetSunBrightness = SetSunBrightness;\n    function SetSpotlightBrightness(elPanel) {\n        elPanel.FireEntityInput('main_light', 'SetBrightness', '1.1');\n    }\n    InspectModelImage.SetSpotlightBrightness = SetSpotlightBrightness;\n    function _HexColorToRgb(hex) {\n        const r = parseInt(hex.slice(1, 3), 16);\n        const g = parseInt(hex.slice(3, 5), 16);\n        const b = parseInt(hex.slice(5, 7), 16);\n        return { r, g, b };\n    }\n})(InspectModelImage || (InspectModelImage = {}));\n","scripts/intromovie.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\nvar IntroMovie;\n(function (IntroMovie) {\n    var g_movieSoundEventInstanceHandle = null;\n    function ShowIntroMovie() {\n        var movieName = \"file://{resources}/videos/intro.webm\";\n        const launcherType = MyPersonaAPI.GetLauncherType();\n        if (launcherType == \"perfectworld\") {\n            movieName = \"file://{resources}/videos/intro-perfectworld.webm\";\n        }\n        $(\"#IntroMoviePlayer\").SetMovie(movieName);\n        $.Schedule(0.0, PlayIntroMovie);\n        $(\"#IntroMoviePlayer\").SetFocus();\n        $.RegisterKeyBind($(\"#IntroMoviePlayer\"), \"key_enter,key_space,key_escape\", SkipIntroMovie);\n    }\n    function StopIntroMovieSoundEvent() {\n        if (g_movieSoundEventInstanceHandle != null) {\n            UiToolkitAPI.StopSoundEvent(g_movieSoundEventInstanceHandle, 0.1);\n            g_movieSoundEventInstanceHandle = null;\n        }\n    }\n    function PlayIntroMovie() {\n        StopIntroMovieSoundEvent();\n        g_movieSoundEventInstanceHandle = UiToolkitAPI.PlaySoundEvent(\"UIPanorama.IntroLogo\");\n        $(\"#IntroMoviePlayer\").Play();\n    }\n    function SkipIntroMovie() {\n        StopIntroMovieSoundEvent();\n        $(\"#IntroMoviePlayer\").Stop();\n    }\n    function DestroyMoviePlayer() {\n        StopIntroMovieSoundEvent();\n        $(\"#IntroMoviePlayer\").SetMovie(\"\");\n    }\n    function HideIntroMovie() {\n        $.Schedule(0.0, DestroyMoviePlayer);\n        $.DispatchEventAsync(0.0, \"CSGOHideIntroMovie\");\n    }\n    {\n        $.RegisterForUnhandledEvent(\"CSGOShowIntroMovie\", ShowIntroMovie);\n        $.RegisterForUnhandledEvent(\"CSGOEndIntroMovie\", HideIntroMovie);\n        $.RegisterEventHandler(\"MoviePlayerPlaybackEnded\", $(\"#IntroMoviePlayer\"), HideIntroMovie);\n    }\n})(IntroMovie || (IntroMovie = {}));\n","scripts/itempreviewdebug.js":"\"use strict\";\n\nfunction OnReload()\n{\n                                       \n}\n\nfunction TestJS()\n{\n                       \n    var parent = $.GetContextPanel().GetParent();\n\n                             \n\n                            \n                           \n\n                        \n                       \n\n                                                                 \n                                                                           \n\n                                                      \n                                                                                                                \n                                                                                           \n                                                 \n\n                                                                                \n                                               \n                                                                                                         \n                                             \n                                                                            \n\n                                         \n                                                  \n\n                                                                          \n                                                                    \n\n                                                                                 \n                                                                                           \n\n                                                                                                            \n                                                 \n\n                                                \n                                                                  \n                                   \n                                   \n                                                                                    \n                                                           \n                                                                      \n                 \n                                                                                                                                                     \n                                                                                                                                               \n                                                                                                                                                                \n                                                                                                                                        \n                                                                                                                      \n                                                                                \n                                                                                                                     \n\n                                                                       \n                                                                                                       \n                                    \n                                                                         \n\n                                                                                                                          \n                                                                                        \n                                                                    \n\n                                                      \n                                                                                                                           \n\n                                                                                    \n                                                                               \n\n                                                                                                 \n                                                     \n                                     \n\n                                                 \n                                                                                                                        \n                                                                                 \n                                                                                                                                \n                                                                        \n\n                                                                               \n                                                                               \n                                   \n                                                                                                       \n                                                                                                                                                                                                                         \n                                                                        \n\n                                                                                  \n                                                                                    \n                                                         \n\n                                           \n                                                   \n                                                                                                                \n                                                                                                  \n                                                                                            \n\n              \n\n                                         \n                                                     \n                                          \n                                                             \n                                                                         \n    parent.EquipPlayerFromLoadout( 'ct', 'rifle3' );\n\n}\n\nfunction ParticleTest()\n{\n                             \n    var parent = $.GetContextPanel().GetParent();\n    \n    parent.SetParticleSystemOffsetPosition( 0.0, 0.0, 0.0 );\n\n    parent.AddParticleSystem( 'weapon_confetti_omni', 'weapon_hand_R', true );\n\n                                                                 \n                                                                \n\n                                                                       \n                                                                         \n\n                                                           \n }\n ","scripts/itemtile.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"common/iteminfo.ts\" />\n/// <reference path=\"popups/popup_select_item_for_capability.ts\" />\n/// <reference path=\"common/formattext.ts\" />\nvar ItemTile;\n(function (ItemTile) {\n    function _OnTileUpdated(elTeamTile) {\n        let id = elTeamTile.GetAttributeString('itemid', '0');\n        if (id === '0')\n            return;\n        let idForDisplay = id;\n        if (elTeamTile.GetAttributeString('filter_category', '') === 'inv_graphic_art') {\n            idForDisplay = ItemInfo.GetFauxReplacementItemID(id, 'graffiti');\n        }\n        _SetItemName(idForDisplay);\n        _SetItemRarity(id);\n        _SetEquippedState(id);\n        _SetStickers(id);\n        _SetRecentLabel(id);\n        _TintSprayImage(id);\n        _DisableTile(id);\n        _SetBackground(id);\n        _SetRentalTime(id);\n        _SetIsRentable(id);\n        _SetOriginalOwner(id);\n        let loadImage = $.GetContextPanel().GetAttributeString('loadimage', '');\n        if (loadImage) {\n            _SetImage(id);\n        }\n    }\n    ;\n    function _SetItemName(id) {\n        let fmtName = ItemInfo.GetFormattedName(id);\n        fmtName.SetOnLabel($('#JsItemName'));\n    }\n    ;\n    function _SetBackground(id) {\n        let elTeamTile = $.GetContextPanel().FindChildInLayoutFile('ItemTileTeam');\n        let subSlot = InventoryAPI.GetDefaultSlot(id);\n        if (subSlot == 'customplayer') {\n            elTeamTile.visible = true;\n            let isCT = ItemInfo.IsItemCt(id);\n            if (isCT) {\n                elTeamTile.SetImage(\"file://{images}/icons/ui/ct_logo_1c.svg\");\n                elTeamTile.style.washColor = '#B5D4EE';\n            }\n            else {\n                elTeamTile.SetImage(\"file://{images}/icons/ui/t_logo_1c.svg\");\n                elTeamTile.style.washColor = '#EAD18A';\n            }\n        }\n        else {\n            elTeamTile.visible = false;\n        }\n    }\n    function _SetImage(id) {\n        $.GetContextPanel().FindChildInLayoutFile('ItemImage').itemid = id;\n    }\n    ;\n    function _SetItemRarity(id) {\n        let color = InventoryAPI.GetItemRarityColor(id);\n        if (!color)\n            return;\n        $.GetContextPanel().FindChildInLayoutFile('JsRarity').style.backgroundColor = color;\n    }\n    ;\n    function _SetEquippedState(id) {\n        let elNoteamDot = $.GetContextPanel().FindChildInLayoutFile('ItemEquipped-noteam');\n        let elCtDot = $.GetContextPanel().FindChildInLayoutFile('ItemEquipped-ct');\n        let elTDot = $.GetContextPanel().FindChildInLayoutFile('ItemEquipped-t');\n        let elFavoriteIconNoteam = $.GetContextPanel().FindChildInLayoutFile('FavoriteIcon-noteam');\n        let elFavoriteIconCt = $.GetContextPanel().FindChildInLayoutFile('FavoriteIcon-ct');\n        let elFavoriteIconT = $.GetContextPanel().FindChildInLayoutFile('FavoriteIcon-t');\n        elTDot.AddClass('hidden');\n        elCtDot.AddClass('hidden');\n        elNoteamDot.AddClass('hidden');\n        elTDot.RemoveClass('item-tile__equipped__radiodot--filled');\n        elCtDot.RemoveClass('item-tile__equipped__radiodot--filled');\n        elNoteamDot.RemoveClass('item-tile__equipped__radiodot--filled');\n        elFavoriteIconNoteam.SetHasClass('hidden', !InventoryAPI.ItemIsInFavorites('noteam', id));\n        elFavoriteIconCt.SetHasClass('hidden', !InventoryAPI.ItemIsInFavorites('ct', id));\n        elFavoriteIconT.SetHasClass('hidden', !InventoryAPI.ItemIsInFavorites('t', id));\n        for (let team of ['t', 'ct', 'noteam']) {\n            if (_ItemIsInShuffle(id, team)) {\n                _SetEquipIcon(true, team);\n            }\n            else if (InventoryAPI.IsEquipped(id, team)) {\n                _SetEquipIcon(false, team);\n            }\n        }\n    }\n    ;\n    function _ItemIsInShuffle(id, team) {\n        let slot = InventoryAPI.GetRawDefinitionKey(id, 'flexible_loadout_group');\n        if (['secondary0', 'secondary', 'smg', 'rifle'].includes(slot)) {\n            let itemDefIndex = InventoryAPI.GetItemDefinitionIndex(id);\n            slot = LoadoutAPI.GetSlotEquippedWithDefIndex(team, itemDefIndex);\n        }\n        return LoadoutAPI.IsShuffleEnabled(team, slot) && InventoryAPI.ItemIsInFavorites(team, id);\n    }\n    ;\n    function _SetEquipIcon(isShuffle, team) {\n        let elCtDot = $.GetContextPanel().FindChildInLayoutFile('ItemEquipped-' + team);\n        elCtDot.RemoveClass('hidden');\n        elCtDot.AddClass('item-tile__equipped__radiodot--filled');\n        elCtDot.SetHasClass('shuffle', isShuffle);\n    }\n    ;\n    function _SetStickers(id) {\n        let elParentStickers = $.GetContextPanel().FindChildInLayoutFile('StickersOnWeapon');\n        elParentStickers.RemoveAndDeleteChildren();\n        let elParentKeychains = $.GetContextPanel().FindChildInLayoutFile('KeychainsOnWeapon');\n        elParentKeychains.RemoveAndDeleteChildren();\n        let listStickers = ItemInfo.GetitemStickerList(id);\n        for (let entry of listStickers) {\n            $.CreatePanel('Image', elParentStickers, 'ItemImage' + entry.image, {\n                src: 'file://{images}' + entry.image + '.png',\n                scaling: 'stretch-to-fit-preserve-aspect',\n                class: 'item-tile__stickers__image'\n            });\n        }\n        elParentStickers.SetHasClass('hidden', listStickers.length <= 0 || listStickers === undefined);\n        let listKeychains = ItemInfo.GetitemKeychainList(id);\n        for (let entry of listKeychains) {\n            $.CreatePanel('Image', elParentKeychains, 'ItemImage' + entry.image, {\n                src: 'file://{images}' + entry.image + '.png',\n                scaling: 'stretch-to-fit-preserve-aspect',\n                class: 'item-tile__stickers__image'\n            });\n        }\n        elParentKeychains.SetHasClass('hidden', listKeychains.length <= 0 || listKeychains === undefined);\n    }\n    ;\n    function _SetRecentLabel(id) {\n        let elLabel = $.GetContextPanel().FindChildInLayoutFile('JsRecent');\n        let unProtectedEscrowValue = InventoryAPI.GetItemAttributeValue(id, '{uint32}trade protected escrow date');\n        if ((unProtectedEscrowValue !== undefined) && (unProtectedEscrowValue == 0)) {\n            elLabel.RemoveClass('hidden');\n            elLabel.text = $.Localize('#inv_session_prop_marketlisting');\n            return;\n        }\n        let isRecentValue = InventoryAPI.GetItemSessionPropertyValue(id, 'recent');\n        let isUpdatedValue = InventoryAPI.GetItemSessionPropertyValue(id, 'updated');\n        if (isUpdatedValue === '1' || isRecentValue === '1') {\n            let locString = 'recent';\n            if (isRecentValue === '1') {\n                let strItemPickupMethod = InventoryAPI.GetItemSessionPropertyValue(id, 'item_pickup_method');\n                if (strItemPickupMethod && ['xpshopredeem', 'quest_reward'].includes(strItemPickupMethod)) {\n                    locString = strItemPickupMethod;\n                }\n            }\n            else {\n                locString = 'updated';\n            }\n            elLabel.RemoveClass('hidden');\n            elLabel.text = $.Localize('#inv_session_prop_' + locString);\n            return;\n        }\n        elLabel.AddClass('hidden');\n    }\n    ;\n    function _TintSprayImage(id) {\n        let elImage = $.GetContextPanel().FindChildInLayoutFile('ItemImage');\n        TintSprayIcon.CheckIsSprayAndTint(id, elImage);\n    }\n    ;\n    function _DisableTile(id) {\n        let capabilityInfo = _GetPopUpCapability();\n        if (capabilityInfo && capabilityInfo.capability === 'can_sticker' && !ItemInfo.IsSticker(id)) {\n            $.GetContextPanel().enabled = (InventoryAPI.GetItemStickerSlotCount(id) > InventoryAPI.GetItemStickerCount(id));\n        }\n        else if (capabilityInfo && capabilityInfo.capability === 'can_patch' && !ItemInfo.IsPatch(id)) {\n            $.GetContextPanel().enabled = (InventoryAPI.GetItemStickerSlotCount(id) > InventoryAPI.GetItemStickerCount(id));\n        }\n        else if (capabilityInfo && capabilityInfo.capability === 'can_keychain' && !ItemInfo.IsKeychain(id)) {\n            $.GetContextPanel().enabled = (InventoryAPI.GetItemKeychainSlotCount(id) > InventoryAPI.GetItemKeychainCount(id));\n        }\n    }\n    ;\n    function _SetRentalTime(id) {\n        let elLabel = $.GetContextPanel().FindChildInLayoutFile('JsItemRental');\n        let bHide = !InventoryAPI.IsRental(id);\n        if (bHide) {\n            elLabel.AddClass('hidden');\n            return;\n        }\n        const expirationDate = InventoryAPI.GetExpirationDate(id);\n        if (expirationDate <= 0) {\n            elLabel.AddClass('hidden');\n            return;\n        }\n        let oLocData = FormatText.FormatRentalTime(expirationDate);\n        elLabel.SetHasClass('item-expired', oLocData.isExpired);\n        elLabel.SetDialogVariable('time-remaining', oLocData.time);\n        elLabel.text = $.Localize(oLocData.locString, elLabel);\n        elLabel.RemoveClass('hidden');\n    }\n    function _SetIsRentable(id) {\n        let elLabel = $.GetContextPanel().FindChildInLayoutFile('JsCanRentItem');\n        if (!InventoryAPI.CanOpenForRental(id)) {\n            elLabel.AddClass('hidden');\n            return;\n        }\n        elLabel.text = $.Localize('#item-can-rent');\n        elLabel.RemoveClass('hidden');\n    }\n    ItemTile._SetIsRentable = _SetIsRentable;\n    function _SetOriginalOwner(id) {\n        const elImage = $.GetContextPanel().FindChildInLayoutFile('JsOriginalOwner');\n        elImage.SetHasClass('hidden', !(InventoryAPI.GetItemAttributeValue(id, '{uint32}purchaser account id') != undefined));\n    }\n    function OnActivate() {\n        HideTooltip();\n        let id = $.GetContextPanel().GetAttributeString('itemid', '0');\n        if ($.GetContextPanel().FindAncestor(\"id-popup-select-item-list\") != null) {\n            $.DispatchEvent(\"OnItemTileActivated\", $.GetContextPanel(), id);\n            return;\n        }\n        if ($.GetContextPanel().FindAncestor(\"id-pet-sticker-item-list\") != null) {\n            $.DispatchEvent(\"OnItemTileActivated\", $.GetContextPanel(), id);\n            return;\n        }\n        if ($.GetContextPanel().FindAncestor(\"Crafting-Items\") != null) {\n            InventoryAPI.AddCraftIngredient(id);\n            return;\n        }\n        if ($.GetContextPanel().FindAncestor(\"Crafting-Ingredients\") != null) {\n            InventoryAPI.RemoveCraftIngredient(id);\n            return;\n        }\n        let filterValue = $.GetContextPanel().GetAttributeString('context_menu_filter', '');\n        let filterForContextMenuEntries = filterValue ? '&populatefiltertext=' + filterValue : '';\n        let contextmenuparam = '';\n        if ($.GetContextPanel().GetAttributeString('filter_category', '') === 'inv_graphic_art')\n            contextmenuparam = '&contextmenuparam=graffiti';\n        let contextMenuPanel = UiToolkitAPI.ShowCustomLayoutContextMenuParametersDismissEvent('', '', 'file://{resources}/layout/context_menus/context_menu_inventory_item.xml', 'itemid=' + id + filterForContextMenuEntries + contextmenuparam, () => { });\n        contextMenuPanel.AddClass(\"ContextMenu_NoArrow\");\n        contextMenuPanel.AddClass(\"ContextMenuCursorTopLeft\");\n    }\n    ItemTile.OnActivate = OnActivate;\n    ;\n    let updateItemListCallback;\n    function OnActivateInspectButtonFromTile() {\n        let id = $.GetContextPanel().GetAttributeString('itemid', '0');\n        if ($.GetContextPanel().FindAncestor(\"Crafting-Items\") != null || $.GetContextPanel().FindAncestor(\"Crafting-Ingredients\") != null) {\n            $.DispatchEvent(\"InventoryItemPreview\", id, '');\n            return;\n        }\n        let oCapabilityInfo = _GetPopUpCapability();\n        if (oCapabilityInfo !== null && oCapabilityInfo.popupVisible) {\n            if (updateItemListCallback) {\n                UiToolkitAPI.UnregisterJSCallback(updateItemListCallback);\n            }\n            updateItemListCallback = UiToolkitAPI.RegisterJSCallback(SelectItemForCapability.UpdateSort);\n            const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('', 'file://{resources}/layout/popups/popup_inventory_inspect.xml');\n            let oSettings = {\n                item_id: id,\n                inspect_only: true,\n                is_inside_casket: oCapabilityInfo.initialItemId ? true : false,\n                capability: oCapabilityInfo.capability,\n                hide_all_action_items: true,\n                is_selected: $.GetContextPanel().BHasClass('capability_multistatus_selected'),\n                callback_handle: updateItemListCallback\n            };\n            elPanel.Data().oSettings = oSettings;\n        }\n    }\n    ItemTile.OnActivateInspectButtonFromTile = OnActivateInspectButtonFromTile;\n    function _GetPopUpCapability() {\n        if (typeof SelectItemForCapability === \"object\") {\n            if (SelectItemForCapability.oCapabilityInfo.popupVisible) {\n                return SelectItemForCapability.oCapabilityInfo;\n            }\n        }\n        return null;\n    }\n    ;\n    let jsTooltipDelayHandle = null;\n    function ShowVideoClip() {\n        const id = $.GetContextPanel().GetAttributeString('itemid', '0');\n        const reelId = InventoryAPI.GetItemAttributeValue(id, '{uint32}keychain slot 0 highlight');\n        if (reelId) {\n            const reelJson = InventoryAPI.BuildHighlightReelSchemaJSON(reelId);\n            const reelSchemaDef = JSON.parse(reelJson);\n            const videoPlayerContainer = $.GetContextPanel().FindChildTraverse('VideoClipMovieContainer');\n            const videoPlayer = $.GetContextPanel().FindChildTraverse('VideoClipMovie');\n            if (videoPlayerContainer && videoPlayer) {\n                videoPlayerContainer.AddClass('play');\n                videoPlayer.AddClass('play');\n                videoPlayer.SetMovie(reelSchemaDef[\"url_480p\"]);\n                videoPlayer.Play();\n            }\n        }\n    }\n    function HideVideoClip() {\n        let id = $.GetContextPanel().GetAttributeString('itemid', '0');\n        if (InventoryAPI.GetItemAttributeValue(id, '{uint32}keychain slot 0 highlight')) {\n            const videoPlayerContainer = $.GetContextPanel().FindChildTraverse('VideoClipMovieContainer');\n            const videoPlayer = $.GetContextPanel().FindChildTraverse('VideoClipMovie');\n            if (videoPlayerContainer && videoPlayer) {\n                videoPlayerContainer.RemoveClass('play');\n                videoPlayer.RemoveClass('play');\n                videoPlayer.Stop();\n            }\n        }\n    }\n    function ShowTooltip() {\n        jsTooltipDelayHandle = $.Schedule(.4, ShowToolTipOnDelay);\n    }\n    ItemTile.ShowTooltip = ShowTooltip;\n    function ShowToolTipOnDelay() {\n        let id = $.GetContextPanel().GetAttributeString('itemid', '0');\n        jsTooltipDelayHandle = null;\n        if (!InventoryAPI.IsItemInfoValid(id)) {\n            return;\n        }\n        UiToolkitAPI.ShowCustomLayoutParametersTooltip('ItemImage', 'JsItemTooltip', 'file://{resources}/layout/tooltips/tooltip_inventory_item.xml', 'itemid=' + id);\n        ShowVideoClip();\n    }\n    ;\n    function HideTooltip() {\n        UiToolkitAPI.HideCustomLayoutTooltip('JsItemTooltip');\n        if (jsTooltipDelayHandle) {\n            $.CancelScheduled(jsTooltipDelayHandle);\n            jsTooltipDelayHandle = null;\n        }\n        HideVideoClip();\n    }\n    ItemTile.HideTooltip = HideTooltip;\n    ;\n    {\n        $.RegisterEventHandler('CSGOInventoryItemLoaded', $.GetContextPanel(), _OnTileUpdated);\n        $.RegisterEventHandler('UpdateItemTile', $.GetContextPanel(), _OnTileUpdated);\n        $.RegisterEventHandler('CSGOInventoryHideTooltip', $.GetContextPanel(), HideTooltip);\n    }\n})(ItemTile || (ItemTile = {}));\n","scripts/itemtile_store.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"common/tint_spray_icon.ts\" />\n/// <reference path=\"common/store_items.ts\" />\n/// <reference path=\"common/formattext.ts\" />\n/// <reference path=\"common/iteminfo.ts\" />\n/// <reference path=\"rankup_redemption_store.ts\" />\nvar ItemTileStore;\n(function (ItemTileStore) {\n    function Init(elPanel, oItemData) {\n        if (!oItemData || (oItemData.hasOwnProperty('noDropsEarned') && oItemData.noDropsEarned)) {\n            elPanel.SetHasClass('no-drops-earned', true);\n            return;\n        }\n        elPanel.SetHasClass('no-drops-earned', false);\n        SetDropItemStyle(elPanel, oItemData);\n        SetMainMenuItemStyle(elPanel, oItemData);\n        SetItemImages(elPanel, oItemData);\n        SetName(elPanel, oItemData);\n        SetStatTrack(elPanel, oItemData.id);\n        SetNewRelease(elPanel, (isNewRelease(oItemData) || oItemData.isDropItem));\n        NotReleased(elPanel, oItemData.isNotReleased);\n        SetPrice(elPanel, oItemData);\n        SetOnActivate(elPanel, oItemData);\n        SetClaimed(elPanel, oItemData);\n        AddMouseOverEvents(elPanel, oItemData);\n    }\n    ItemTileStore.Init = Init;\n    function SetItemImages(elPanel, oItemData) {\n        let displayId = GetDisplayItemId(oItemData, oItemData.id);\n        let elImage = elPanel.FindChildInLayoutFile('id-itemtile-store-image-main');\n        elImage.itemid = displayId;\n        TintSprayImage(elImage, displayId);\n        elImage = GetBackgroundImage(elPanel, oItemData);\n        elImage.itemid = displayId;\n        if (oItemData.hasOwnProperty('linkedid')) {\n            displayId = GetDisplayItemId(oItemData, oItemData.linkedid);\n            elImage = elPanel.FindChildInLayoutFile('id-itemtile-store-image-linked');\n            elImage.itemid = displayId;\n        }\n        elPanel.FindChildInLayoutFile('id-itemtile-store-image-linked').visible = oItemData.hasOwnProperty('linkedid');\n        elPanel.SetHasClass('is-linked', oItemData.hasOwnProperty('linkedid'));\n    }\n    function GetBackgroundImage(elPanel, oItemData) {\n        if (oItemData.hasOwnProperty('isDisplayedInMainMenu')) {\n            return oItemData.isDisplayedInMainMenu ?\n                elPanel.FindChildInLayoutFile('id-itemtile-mainmenu-store-image-bg') :\n                elPanel.FindChildInLayoutFile('id-itemtile-store-image-bg');\n        }\n        return elPanel.FindChildInLayoutFile('id-itemtile-store-image-bg');\n    }\n    function TintSprayImage(elImage, ItemId) {\n        TintSprayIcon.CheckIsSprayAndTint(ItemId, elImage);\n    }\n    function GetDisplayItemId(oItemData, itemId) {\n        if (InventoryAPI.GetItemTypeFromEnum(itemId) === 'coupon')\n            return InventoryAPI.GetLootListItemIdByIndex(itemId, 0);\n        return itemId;\n    }\n    function SetName(elPanel, oItemData) {\n        var strItemName = '';\n        if (oItemData.useTinyNames) {\n            strItemName = $.Localize(InventoryAPI.GetRawDefinitionKey(oItemData.id, 'item_name') + '_tinyname');\n        }\n        else {\n            strItemName = InventoryAPI.GetItemName(oItemData.linkedid ? oItemData.linkedid : oItemData.id);\n        }\n        elPanel.SetDialogVariable('item-name', strItemName);\n    }\n    function SetStatTrack(elPanel, itemId) {\n        let elStattrak = elPanel.FindChildInLayoutFile('id-itemtile-store-stattrak');\n        elStattrak.SetHasClass('hidden', !ItemInfo.IsStatTrak(itemId));\n    }\n    function SetNewRelease(elPanel, isNew) {\n        let elNew = elPanel.FindChildInLayoutFile('id-itemtile-store-new');\n        elNew.SetHasClass('hidden', !isNew);\n    }\n    function NotReleased(elPanel, isnotReleased = false) {\n        let elNew = elPanel.FindChildInLayoutFile('id-itemtile-store-not-released');\n        elNew.SetHasClass('hidden', !isnotReleased);\n    }\n    function SetPrice(elPanel, oItemData) {\n        if (oItemData.isDropItem) {\n            elPanel.SetDialogVariable('sale-price', $.Localize('#op_reward_free'));\n            return;\n        }\n        let reduction = StoreAPI.GetStoreItemPercentReduction(oItemData.id);\n        let isMarketItem = IsMarketItem(oItemData);\n        elPanel.FindChildInLayoutFile('id-itemtile-store-price').SetHasClass('is-marketlink', isMarketItem);\n        elPanel.FindChildInLayoutFile('id-itemtile-store-price').SetHasClass('has-reduction', reduction !== '' && reduction !== undefined && !isMarketItem);\n        elPanel.SetDialogVariable('reduction', reduction);\n        let origPrice = (oItemData.hasOwnProperty('linkedid')) &&\n            ItemInfo.GetStoreOriginalPrice(oItemData.linkedid, 1) !== ItemInfo.GetStoreOriginalPrice(oItemData.id, 1) ?\n            ItemInfo.GetStoreOriginalPrice(oItemData.linkedid, 1) + ' - ' + ItemInfo.GetStoreOriginalPrice(oItemData.id, 1) :\n            ItemInfo.GetStoreOriginalPrice(oItemData.id, 1);\n        let salePrice = (isMarketItem) ?\n            $.Localize('#SFUI_Store_Market_Link') :\n            (oItemData.hasOwnProperty('linkedid')) &&\n                ItemInfo.GetStoreOriginalPrice(oItemData.linkedid, 1) !== ItemInfo.GetStoreOriginalPrice(oItemData.id, 1) ?\n                ItemInfo.GetStoreSalePrice(oItemData.linkedid, 1) + ' - ' + ItemInfo.GetStoreSalePrice(oItemData.id, 1) :\n                ItemInfo.GetStoreSalePrice(oItemData.id, 1);\n        elPanel.SetDialogVariable('original-price', origPrice);\n        elPanel.SetDialogVariable('sale-price', salePrice);\n    }\n    function SetDropItemStyle(elPanel, oItemData) {\n        if (oItemData.hasOwnProperty('isDropItem')) {\n            elPanel.SetHasClass('is-drop-item', oItemData.isDropItem);\n            if (oItemData.isDropItem) {\n                elPanel.SetHasClass('is-case-drop', ItemInfo.IsCase(oItemData.id));\n            }\n        }\n        else {\n            elPanel.SetHasClass('is-drop-item', false);\n        }\n    }\n    function SetMainMenuItemStyle(elPanel, oItemData) {\n        if (oItemData.hasOwnProperty('isDisplayedInMainMenu')) {\n            elPanel.SetHasClass('is-mainmenu-item', oItemData.isDisplayedInMainMenu);\n        }\n        else {\n            elPanel.SetHasClass('is-mainmenu-item', false);\n        }\n    }\n    function SetClaimed(elPanel, oItemData) {\n        if (oItemData.isDropItem) {\n            const bIsFauxItem = InventoryAPI.IsFauxItemID(oItemData.id);\n            const bIsExpiredClaimSlot = bIsFauxItem && InventoryAPI.DoesItemMatchDefinitionByName(oItemData.id, 'expired_itemdef');\n            elPanel.SetHasClass('item-claimed', bIsFauxItem);\n            elPanel.SetHasClass('item-claimslot-expired', bIsExpiredClaimSlot);\n        }\n    }\n    function isNewRelease(oItemData) {\n        if (oItemData.hasOwnProperty('isNewRelease')) {\n            return oItemData.isNewRelease ? true : false;\n        }\n        return false;\n    }\n    function IsMarketItem(oItemData) {\n        if (oItemData.hasOwnProperty('isMarketItem')) {\n            return oItemData.isMarketItem ? true : false;\n        }\n        return false;\n    }\n    function SetOnActivate(elPanel, oItemData) {\n        elPanel.enabled = !oItemData.isDisabled;\n        if (oItemData.isDropItem || oItemData.isDisabled) {\n            return;\n        }\n        else if (IsMarketItem(oItemData)) {\n            elPanel.SetPanelEvent('onactivate', OpenOverlayToMarket.bind(undefined, oItemData.id));\n        }\n        else if (oItemData.hasOwnProperty('linkedid')) {\n            let OpenContextMenu = function (itemId, linkedid, isNotReleased, warning) {\n                var contextMenuPanel = UiToolkitAPI.ShowCustomLayoutContextMenuParameters('', '', 'file://{resources}/layout/context_menus/context_menu_store_linked_items.xml', 'itemids=' + itemId + ',' + linkedid +\n                    '&' + 'is-not-released=' + isNotReleased +\n                    '&' + 'linkedWarning=' + warning);\n                contextMenuPanel.AddClass(\"ContextMenu_NoArrow\");\n            };\n            let isNotReleased = oItemData.isNotReleased ? 'true' : 'false';\n            let warning = oItemData.linkedWarning ? oItemData.linkedWarning : '';\n            elPanel.SetPanelEvent('onactivate', OpenContextMenu.bind(undefined, oItemData.id, oItemData.linkedid, isNotReleased, warning));\n            elPanel.SetPanelEvent('oncontextmenu', OpenContextMenu.bind(undefined, oItemData.id, oItemData.linkedid, isNotReleased, warning));\n        }\n        else if (ItemInfo.ItemHasCapability(oItemData.id, 'decodable')) {\n            let displayItemId = '';\n            let isNew = isNewRelease(oItemData);\n            const isVolatile = !!InventoryAPI.GetItemAttributeValue(oItemData.id, '{uint32}volatile container');\n            if (InventoryAPI.GetItemTypeFromEnum(oItemData.id) === 'coupon') {\n                displayItemId = InventoryAPI.GetLootListItemIdByIndex(oItemData.id, 0);\n                elPanel.SetPanelEvent('onactivate', ShowDecodePopup.bind(undefined, oItemData.id, displayItemId, isNew));\n            }\n            else if (isVolatile) {\n                elPanel.SetPanelEvent('onactivate', ShowVolatilePopup.bind(undefined, oItemData.id));\n            }\n            else if (InventoryAPI.GetLootListItemsCount(oItemData.id) > 0) {\n                elPanel.SetPanelEvent('onactivate', ShowDecodePopup.bind(undefined, oItemData.id, oItemData.id, isNew));\n            }\n            else {\n                elPanel.SetPanelEvent('onactivate', ShowInspectPopup.bind(undefined, oItemData.id));\n            }\n        }\n        else\n            elPanel.SetPanelEvent('onactivate', ShowInspectPopup.bind(undefined, oItemData.id));\n    }\n    function OpenOverlayToMarket(itemId) {\n        let m_AppID = SteamOverlayAPI.GetAppID();\n        let m_CommunityUrl = SteamOverlayAPI.GetSteamCommunityURL();\n        let strSetName = InventoryAPI.GetItemSet(itemId);\n        SteamOverlayAPI.OpenURL(m_CommunityUrl + \"/market/search?q=&appid=\" + m_AppID + \"&lock_appid=\" + m_AppID + \"&category_\" + m_AppID + \"_ItemSet%5B%5D=tag_\" + strSetName);\n    }\n    function ShowVolatilePopup(id) {\n        const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('popup-inspect-' + id, 'file://{resources}/layout/popups/popup_offers_laptop.xml');\n        let oSettings = {\n            item_id: id,\n            inspect_only: true,\n            work_type: 'decodeable',\n            only_close_btn: true\n        };\n        elPanel.Data().oSettings = oSettings;\n    }\n    function ShowDecodePopup(id, displayItemId, isNew) {\n        var strExtraSettings = '';\n        if (isNew) {\n            strExtraSettings = '&overridepurchasemultiple=1';\n        }\n        const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('popup-inspect-' + id, 'file://{resources}/layout/popups/popup_capability_decodable.xml');\n        let oSettings = {\n            item_id: displayItemId,\n            store_item_id: id,\n            force_hide_async_bar: true,\n            show_work_type_warning: false,\n            override_purchase_limit: isNew\n        };\n        elPanel.Data().oSettings = oSettings;\n    }\n    function ShowInspectPopup(id) {\n        const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('', 'file://{resources}/layout/popups/popup_inventory_inspect.xml');\n        let oSettings = {\n            item_id: id,\n            inspect_only: false,\n            show_work_type_warning: false,\n            store_item_id: id\n        };\n        elPanel.Data().oSettings = oSettings;\n    }\n    let jsTooltipDelayHandle = null;\n    function AddMouseOverEvents(elPanel, oItemData) {\n        const tooltipHotspot = elPanel.FindChildTraverse('tooltip-hotspot');\n        const tooltipTargetPanelId = oItemData.isDropItem ? elPanel.id :\n            oItemData.hasOwnProperty('linkedid') ? 'tooltip-hotspot' :\n                oItemData.isNotReleased ? 'tooltip-hotspot' :\n                    'id-itemtile-store-image-main';\n        tooltipHotspot.SetPanelEvent('onmouseover', ShowTooltip.bind(undefined, elPanel, oItemData, tooltipTargetPanelId));\n        tooltipHotspot.SetPanelEvent('onmouseout', HideTooltip);\n    }\n    function ShowTooltip(elPanel, oItemData, tooltipTargetPanelId) {\n        jsTooltipDelayHandle = $.Schedule(.1, ShowToolTipOnDelay.bind(undefined, elPanel, oItemData, tooltipTargetPanelId));\n    }\n    function ShowToolTipOnDelay(elPanel, oItemData, tooltipTargetPanelId) {\n        jsTooltipDelayHandle = null;\n        let itemId = GetDisplayItemId(oItemData, oItemData.id);\n        if (!InventoryAPI.IsItemInfoValid(itemId)) {\n            return;\n        }\n        if (oItemData.hasOwnProperty('linkedid')) {\n            UiToolkitAPI.ShowTextTooltip(tooltipTargetPanelId, '#store_linked_item_tooltip');\n            return;\n        }\n        if (oItemData.hasOwnProperty('isNotReleased') && oItemData.isNotReleased) {\n            if (oItemData.hasOwnProperty('linkedWarning') && oItemData.linkedWarning) {\n                UiToolkitAPI.ShowTextTooltip(tooltipTargetPanelId, oItemData.linkedWarning);\n            }\n            return;\n        }\n        UiToolkitAPI.ShowCustomLayoutParametersTooltip(tooltipTargetPanelId, 'JsItemStoreTooltip', 'file://{resources}/layout/tooltips/tooltip_inventory_item.xml', 'itemid=' + itemId);\n    }\n    function HideTooltip() {\n        UiToolkitAPI.HideCustomLayoutTooltip('JsItemStoreTooltip');\n        UiToolkitAPI.HideTextTooltip();\n        if (jsTooltipDelayHandle) {\n            $.CancelScheduled(jsTooltipDelayHandle);\n            jsTooltipDelayHandle = null;\n        }\n    }\n})(ItemTileStore || (ItemTileStore = {}));\n","scripts/leaderboard.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"rating_emblem.ts\" />\n/// <reference path=\"common/teamcolor.ts\" />\n$.LogChannel('p.leaderboard', \"LV_OFF\");\nvar regionToRegionName = {\n    'namc': 'NorthAmerica',\n    'samc': 'SouthAmerica',\n    'euro': 'Europe',\n    'asia': 'Asia',\n    'ausc': 'Australia',\n    'afrc': 'Africa',\n    'cn': 'China',\n};\nvar Leaderboard;\n(function (Leaderboard) {\n    let m_bEventsRegistered = false;\n    let m_myXuid = MyPersonaAPI.GetXuid();\n    let m_lbType;\n    let m_LeaderboardsDirtyEventHandler;\n    let m_LeaderboardsStateChangeEventHandler;\n    let m_LobbyPlayerUpdatedEventHandler;\n    let m_NameLockEventHandler;\n    let m_leaderboardName = '';\n    let m_onlyAvailableSeasonLeaderboard = '';\n    const IS_NEW_SEASON = false;\n    const IS_AROUND_PLAYER = true;\n    function RegisterEventHandlers() {\n        if (!m_bEventsRegistered) {\n            m_LeaderboardsDirtyEventHandler = $.RegisterForUnhandledEvent('PanoramaComponent_Leaderboards_Dirty', OnLeaderboardDirty);\n            m_LeaderboardsStateChangeEventHandler = $.RegisterForUnhandledEvent('PanoramaComponent_Leaderboards_StateChange', OnLeaderboardStateChange);\n            if (m_lbType === 'party') {\n                m_LobbyPlayerUpdatedEventHandler = $.RegisterForUnhandledEvent(\"PanoramaComponent_PartyList_RebuildPartyList\", _UpdatePartyList);\n            }\n            if (m_lbType === 'general') {\n                m_NameLockEventHandler = $.RegisterForUnhandledEvent('PanoramaComponent_MyPersona_SetPlayerLeaderboardSafeName', _UpdateNameLockButton);\n            }\n            m_bEventsRegistered = true;\n        }\n    }\n    Leaderboard.RegisterEventHandlers = RegisterEventHandlers;\n    function UnregisterEventHandlers() {\n        if (m_bEventsRegistered) {\n            $.UnregisterForUnhandledEvent('PanoramaComponent_Leaderboards_Dirty', m_LeaderboardsDirtyEventHandler);\n            $.UnregisterForUnhandledEvent('PanoramaComponent_Leaderboards_StateChange', m_LeaderboardsStateChangeEventHandler);\n            if (m_lbType === 'party') {\n                $.UnregisterForUnhandledEvent('PanoramaComponent_PartyList_RebuildPartyList', m_LobbyPlayerUpdatedEventHandler);\n            }\n            if (m_lbType === 'general') {\n                $.UnregisterForUnhandledEvent('PanoramaComponent_MyPersona_SetPlayerLeaderboardSafeName', m_NameLockEventHandler);\n            }\n            m_bEventsRegistered = false;\n        }\n    }\n    Leaderboard.UnregisterEventHandlers = UnregisterEventHandlers;\n    function _Init() {\n        m_lbType = $.GetContextPanel().GetAttributeString('lbtype', '');\n        RegisterEventHandlers();\n        _SetTitle();\n        _InitNavPanels();\n        _UpdateLeaderboardName();\n        if (m_lbType === 'party') {\n            _UpdatePartyList();\n            if (LeaderboardsAPI.DoesTheLocalPlayerNeedALeaderboardSafeNameSet()) {\n                _AutomaticLeaderboardNameLockPopup();\n            }\n        }\n        else if (m_lbType === 'general') {\n            UpdateLeaderboardList();\n            $.Schedule(0.5, _UpdateNameLockButton);\n        }\n        _ShowGlobalRank();\n    }\n    function _SetHonorIcon(elPanel, xuid) {\n        const elHonorIcon = elPanel.FindChildTraverse('jsHonorIcon');\n        if (elHonorIcon) {\n            elHonorIcon.Set(PartyListAPI.GetFriendXpTrailLevel(xuid), PartyListAPI.GetFriendPrimeEligible(xuid));\n        }\n    }\n    function _SetTitle() {\n        $.GetContextPanel().SetDialogVariable('leaderboard-title', $.Localize('#leaderboard_title_' + String(m_lbType)));\n    }\n    function _InitSeason() {\n        m_onlyAvailableSeasonLeaderboard = LeaderboardsAPI.GetCurrentSeasonPremierLeaderboard();\n        let elSeason = $.GetContextPanel().FindChildTraverse('jsNavSeason');\n        elSeason.text = $.Localize('#' + m_onlyAvailableSeasonLeaderboard + '_name');\n    }\n    let _LastRegionList = '';\n    function _MaybeRefreshRegionsDropdown() {\n        if (m_lbType === 'party')\n            return;\n        let currentRegionList = '(friends)';\n        const arrLBsOfInterest = LeaderboardsAPI.GetPremierLeaderboardsOfInterest();\n        for (let i = 0; i < arrLBsOfInterest.length; i++) {\n            currentRegionList = currentRegionList + '(' + arrLBsOfInterest[i] + ')';\n        }\n        if (_LastRegionList === currentRegionList) {\n            return;\n        }\n        _LastRegionList = currentRegionList;\n        _InitLocationDropdown();\n    }\n    function _InitLocationDropdown() {\n        let elLocationDropdown = $('#jsNavLocation');\n        elLocationDropdown.visible = true;\n        elLocationDropdown.RemoveAllOptions();\n        let regions = LeaderboardsAPI.GetAllSeasonPremierLeaderboardRegions();\n        regions.sort();\n        regions.unshift('World');\n        regions.unshift('Friends');\n        let defaultRegion = 'World';\n        for (let i = 0; i < regions.length; i++) {\n            const szRegion = regions[i];\n            const bCurrentRegion = _FindLocalPlayerInRegion(szRegion);\n            if (IS_AROUND_PLAYER && !bCurrentRegion && (szRegion != 'Friends'))\n                continue;\n            const elEntry = $.CreatePanel('Label', elLocationDropdown, szRegion);\n            elEntry.SetHasClass('of-interest', bCurrentRegion && (szRegion != 'Friends') && !IS_NEW_SEASON && !IS_AROUND_PLAYER);\n            switch (szRegion) {\n                case 'World':\n                    elEntry.SetAttributeString('leaderboard-class', szRegion.toLowerCase());\n                    break;\n                case 'Friends':\n                    elEntry.SetAttributeString('friendslb', 'true');\n                    elEntry.SetAttributeString('leaderboard-class', 'friends');\n                    break;\n                default:\n                    elEntry.SetAttributeString('location-suffix', '_' + szRegion);\n                    elEntry.SetAttributeString('leaderboard-class', szRegion.toLowerCase());\n                    if (bCurrentRegion) {\n                        defaultRegion = szRegion;\n                    }\n            }\n            elEntry.SetAcceptsFocus(true);\n            elEntry.text = $.Localize('#leaderboard_region_' + szRegion);\n            elLocationDropdown.AddOption(elEntry);\n        }\n        {\n            defaultRegion = 'friends';\n        }\n        elLocationDropdown.SetSelected(defaultRegion);\n    }\n    function _getRegionFromLeaderboardName(lbname) {\n        return lbname.split('_').slice(-1)[0];\n    }\n    function _isLeaderboardTheFriendsLeaderboard(lbname) {\n        return lbname.split('.').slice(-1)[0] === 'friends';\n    }\n    function _FindLocalPlayerInRegion(region) {\n        let arrLBsOfInterest = LeaderboardsAPI.GetPremierLeaderboardsOfInterest();\n        for (let i = 0; i < arrLBsOfInterest.length; i++) {\n            switch (region) {\n                case 'World':\n                    if (arrLBsOfInterest[i] === m_onlyAvailableSeasonLeaderboard)\n                        return true;\n                    break;\n                case 'Friends':\n                    if (_isLeaderboardTheFriendsLeaderboard(arrLBsOfInterest[i]))\n                        return true;\n                    break;\n                default:\n                    if (_getRegionFromLeaderboardName(arrLBsOfInterest[i]) === region)\n                        return true;\n            }\n        }\n        return false;\n    }\n    function _UpdateLeaderboardName() {\n        if (m_lbType === 'general') {\n            let elLocationDropdown = $('#jsNavLocation');\n            let elregion = elLocationDropdown.GetSelected();\n            if (elregion) {\n                if (elregion.GetAttributeString('friendslb', '') === 'true') {\n                    m_leaderboardName = m_onlyAvailableSeasonLeaderboard + '.friends';\n                }\n                else {\n                    m_leaderboardName = m_onlyAvailableSeasonLeaderboard + elregion.GetAttributeString('location-suffix', '') +\n                        (IS_AROUND_PLAYER ? '.self' : '');\n                }\n                $.GetContextPanel().SwitchClass('region', elregion.GetAttributeString('leaderboard-class', ''));\n            }\n        }\n        else if (m_lbType === 'party') {\n            m_leaderboardName = LeaderboardsAPI.GetCurrentSeasonPremierLeaderboard() + '.party';\n        }\n        return m_leaderboardName;\n    }\n    function _UpdateNameLockButton() {\n        let elNameButton = $.GetContextPanel().FindChildTraverse('lbNameButton');\n        elNameButton.visible = true;\n        let status = MyPersonaAPI.GetMyLeaderboardNameStatus();\n        let needsName = LeaderboardsAPI.DoesTheLocalPlayerNeedALeaderboardSafeNameSet();\n        let showButton = status !== '' || needsName;\n        elNameButton.visible = showButton;\n        elNameButton.SetHasClass('no-hover', status !== '');\n        elNameButton.ClearPanelEvent('onactivate');\n        let buttonText = '';\n        if (status) {\n            let name = MyPersonaAPI.GetMyLeaderboardName();\n            elNameButton.SetDialogVariable('leaderboard-name', name);\n            buttonText = $.Localize('#leaderboard_namelock_button_hasname', elNameButton);\n            let tooltipText = '';\n            switch (status) {\n                case 'submitted':\n                    elNameButton.SwitchClass('status', 'submitted');\n                    tooltipText = $.Localize('#leaderboard_namelock_button_tooltip_submitted');\n                    break;\n                case 'approved':\n                    elNameButton.SwitchClass('status', 'approved');\n                    tooltipText = $.Localize('#leaderboard_namelock_button_tooltip_approved');\n                    break;\n            }\n            function onMouseOver(id, tooltipText) {\n                UiToolkitAPI.ShowTextTooltip(id, tooltipText);\n            }\n            elNameButton.SetPanelEvent('onmouseover', onMouseOver.bind(elNameButton, elNameButton.id, tooltipText));\n            elNameButton.SetPanelEvent('onmouseout', () => UiToolkitAPI.HideTextTooltip());\n        }\n        else if (needsName) {\n            buttonText = $.Localize('#leaderboard_namelock_button_needsname');\n            elNameButton.SetPanelEvent('onactivate', _NameLockPopup);\n        }\n        elNameButton.SetDialogVariable('leaderboard_namelock_button', buttonText);\n    }\n    function _InitNavPanels() {\n        $('#jsNavLocation').visible = false;\n        $('#jsGoToTop').visible = (m_lbType === 'general') && !IS_AROUND_PLAYER;\n        $('#jsGoToMe').visible = (m_lbType === 'general') && !IS_AROUND_PLAYER;\n        if (m_lbType === 'party')\n            return;\n        _InitSeason();\n        _MaybeRefreshRegionsDropdown();\n    }\n    function _ShowGlobalRank() {\n        let showRank = $.GetContextPanel().GetAttributeString('showglobaloverride', 'true');\n        $.GetContextPanel().SetHasClass('hide-global-rank', showRank === 'false');\n    }\n    function _UpdateGoToMeButton() {\n        let lb = m_leaderboardName;\n        let arrLBsOfInterest = LeaderboardsAPI.GetPremierLeaderboardsOfInterest();\n        let myIndex = LeaderboardsAPI.GetIndexByXuid(lb, m_myXuid);\n        let bPresent = arrLBsOfInterest.includes(lb) && myIndex !== -1;\n        $.GetContextPanel().FindChildInLayoutFile('jsGoToMe').enabled = bPresent && !IS_NEW_SEASON && !IS_AROUND_PLAYER;\n    }\n    function _ShowNoData() {\n        $.GetContextPanel().FindChildInLayoutFile('id-leaderboard-list').visible = false;\n        $.GetContextPanel().SwitchClass('leaderboard-status', 'lb-status-nodata');\n    }\n    function _ShowNewSeason() {\n        $.GetContextPanel().FindChildInLayoutFile('id-leaderboard-list').visible = false;\n        $.GetContextPanel().SwitchClass('leaderboard-status', 'lb-status-newseason');\n    }\n    function _ShowNewSeasonFriends() {\n        $.GetContextPanel().FindChildInLayoutFile('id-leaderboard-list').visible = false;\n        $.GetContextPanel().SwitchClass('leaderboard-status', 'lb-status-newseason-friends');\n    }\n    function _ShowLoading() {\n        $.GetContextPanel().FindChildInLayoutFile('id-leaderboard-list').visible = false;\n        $.GetContextPanel().SwitchClass('leaderboard-status', 'lb-status-loading');\n    }\n    function _ShowLeaderboards() {\n        $.GetContextPanel().FindChildInLayoutFile('id-leaderboard-list').visible = true;\n        $.GetContextPanel().SwitchClass('leaderboard-status', 'lb-status-ready');\n        if (m_lbType === 'general' && IS_AROUND_PLAYER) {\n            GoToSelf();\n        }\n    }\n    function UpdateLeaderboardList() {\n        _UpdateGoToMeButton();\n        let count = LeaderboardsAPI.GetCount(m_leaderboardName);\n        let status = LeaderboardsAPI.GetState(m_leaderboardName);\n        let seasonName = $.Localize('#' + m_onlyAvailableSeasonLeaderboard + '_name');\n        $.GetContextPanel().SetDialogVariable('season_name', seasonName);\n        if (\"ready\" == status && count !== 0) {\n            _FillOutEntries();\n        }\n        if (1 <= LeaderboardsAPI.HowManyMinutesAgoCached(m_leaderboardName)) {\n            LeaderboardsAPI.Refresh(m_leaderboardName);\n        }\n        if (m_leaderboardName.includes('friends')) {\n            if (count == 0) {\n                _ShowNewSeasonFriends();\n            }\n            else {\n                _ShowLeaderboards();\n            }\n            return;\n        }\n        if (IS_NEW_SEASON) {\n            _ShowNewSeason();\n        }\n        else {\n            if ((\"none\" == status) || (\"ready\" == status && count == 0)) {\n                if (IS_AROUND_PLAYER)\n                    _ShowNewSeasonFriends();\n                else\n                    _ShowNoData();\n            }\n            else if (\"loading\" == status) {\n                _ShowLoading();\n            }\n            else if (\"ready\" == status) {\n                _ShowLeaderboards();\n            }\n        }\n    }\n    Leaderboard.UpdateLeaderboardList = UpdateLeaderboardList;\n    function _AddPlayer(elEntry, oPlayer, index) {\n        elEntry.SetDialogVariable('player-rank', '');\n        elEntry.SetDialogVariable('player-name', '');\n        elEntry.SetDialogVariable('player-wins', '');\n        elEntry.SetDialogVariable('player-winrate', '');\n        elEntry.SetDialogVariable('player-percentile', '');\n        elEntry.SetHasClass('no-hover', oPlayer === null);\n        elEntry.SetHasClass('background', index % 2 === 0);\n        let elAvatar = elEntry.FindChildInLayoutFile('leaderboard-entry-avatar');\n        elAvatar.visible = false;\n        if (oPlayer) {\n            function _AddOpenPlayerCardAction(elPanel, xuid) {\n                function openCard() {\n                    if (xuid && (xuid !== 0)) {\n                        $.DispatchEvent('SidebarContextMenuActive', true);\n                        let contextMenuPanel = UiToolkitAPI.ShowCustomLayoutContextMenuParametersDismissEvent('', '', 'file://{resources}/layout/context_menus/context_menu_playercard.xml', 'xuid=' + xuid, () => $.DispatchEvent('SidebarContextMenuActive', false));\n                        contextMenuPanel.AddClass(\"ContextMenu_NoArrow\");\n                    }\n                }\n                elPanel.SetPanelEvent(\"onactivate\", openCard);\n                elPanel.SetPanelEvent(\"oncontextmenu\", openCard);\n            }\n            elEntry.enabled = true;\n            if (m_lbType === 'party' && oPlayer.XUID) {\n                elAvatar.PopulateFromSteamID(oPlayer.XUID);\n                elAvatar.visible = true;\n                _SetHonorIcon(elEntry, oPlayer.XUID);\n            }\n            else {\n                elAvatar.visible = false;\n            }\n            let elRatingEmblem = elEntry.FindChildTraverse('jsRatingEmblem');\n            if (m_lbType === 'party') {\n                const teamColorIdx = PartyListAPI.GetPartyMemberSetting(oPlayer.XUID, 'game/teamcolor');\n                const teamColorRgb = TeamColor.GetTeamColor(Number(teamColorIdx));\n                elAvatar.style.border = '2px solid rgb(' + teamColorRgb + ')';\n            }\n            _AddOpenPlayerCardAction(elEntry, oPlayer.XUID);\n            let options;\n            if (m_lbType === 'party') {\n                options =\n                    {\n                        root_panel: elRatingEmblem,\n                        rating_type: 'Premier',\n                        do_fx: true,\n                        leaderboard_details: oPlayer,\n                        full_details: false,\n                        local_player: oPlayer.XUID === MyPersonaAPI.GetXuid()\n                    };\n            }\n            else {\n                options =\n                    {\n                        root_panel: elRatingEmblem,\n                        rating_type: 'Premier',\n                        do_fx: true,\n                        leaderboard_details: oPlayer,\n                        full_details: false,\n                        local_player: oPlayer.XUID === MyPersonaAPI.GetXuid()\n                    };\n            }\n            RatingEmblem.SetXuid(options);\n            elEntry.SetDialogVariable('partyxuid', oPlayer.XUID ?? '');\n            elEntry.SetDialogVariable('xuid', oPlayer.XUID ?? '');\n            elEntry.SetDialogVariable('player-name', oPlayer.displayName ?? '');\n            let elPlayerNameLabel = elEntry.FindChildTraverse('jsPlayerName');\n            if (m_lbType === 'party' && oPlayer.XUID) {\n                elPlayerNameLabel.SetLocString('#friends_name_in_party_leaderboard');\n            }\n            else if (oPlayer.displayName) {\n                elPlayerNameLabel.SetLocString('#friends_name_generic');\n            }\n            else {\n                elPlayerNameLabel.SetLocString('#friends_name_from_steam');\n            }\n            elEntry.SetDialogVariable('player-wins', oPlayer.hasOwnProperty('matchesWon') ? String(oPlayer.matchesWon) : '-');\n            let bHasRank = oPlayer.hasOwnProperty('rank') && oPlayer.rank > 0;\n            elEntry.SetDialogVariableInt('player-rank', bHasRank ? oPlayer.rank : 0);\n            elEntry.FindChildTraverse('jsPlayerRank').text = bHasRank ? $.Localize('{d:player-rank}', elEntry) : '-';\n            let canShowWinRate = oPlayer.hasOwnProperty('matchesWon') && oPlayer.hasOwnProperty('matchesTied') && oPlayer.hasOwnProperty('matchesLost');\n            if (canShowWinRate) {\n                let matchesPlayed = (oPlayer.matchesWon ? oPlayer.matchesWon : 0) +\n                    (oPlayer.matchesTied ? oPlayer.matchesTied : 0) +\n                    (oPlayer.matchesLost ? oPlayer.matchesLost : 0);\n                let winRate = matchesPlayed === 0 ? 0 : oPlayer.matchesWon * 100.00 / matchesPlayed;\n                elEntry.SetDialogVariable('player-winrate', winRate.toFixed(2) + '%');\n            }\n            else {\n                elEntry.SetDialogVariable('player-winrate', '-');\n            }\n            elEntry.SetDialogVariable('player-percentile', (oPlayer.hasOwnProperty('pct') && oPlayer.pct && oPlayer.pct > 0) ? oPlayer.pct.toFixed(0) + '%' : '-');\n            elEntry.SetDialogVariable('player-region', (oPlayer.hasOwnProperty('region')) ? $.Localize('#leaderboard_region_abbr_' + regionToRegionName[oPlayer.region]) : '-');\n        }\n        return elEntry;\n    }\n    function _UpdatePartyList() {\n        if (m_lbType !== 'party')\n            return;\n        let elStatus = $.GetContextPanel().FindChildInLayoutFile('id-leaderboard-loading');\n        let elNoData = $.GetContextPanel().FindChildInLayoutFile('id-leaderboard-nodata');\n        let elLeaderboardList = $.GetContextPanel().FindChildInLayoutFile('id-leaderboard-list');\n        elLeaderboardList.SetHasClass('hidden', false);\n        elStatus.SetHasClass('hidden', true);\n        elNoData.SetHasClass('hidden', true);\n        function OnMouseOver(xuid) {\n            $.DispatchEvent('LeaderboardHoverPlayer', xuid);\n        }\n        function OnMouseOut() {\n            $.DispatchEvent('LeaderboardHoverPlayer', '');\n        }\n        let elList = $.GetContextPanel().FindChildInLayoutFile('id-leaderboard-entries');\n        if (LobbyAPI.IsSessionActive()) {\n            let members = LobbyAPI.GetSessionSettings().members;\n            function GetPartyLBRow(idx) {\n                let oPlayer = null;\n                let machine = 'machine' + idx;\n                let bValidPartyPlayer = members.hasOwnProperty(machine) && members[machine].hasOwnProperty('player0') &&\n                    members[machine].player0.hasOwnProperty('xuid');\n                if (!bValidPartyPlayer)\n                    return null;\n                let xuid = members[machine].player0.xuid;\n                oPlayer = LeaderboardsAPI.GetEntryDetailsObjectByXuid(m_leaderboardName, xuid);\n                if (!oPlayer.XUID) {\n                    oPlayer.XUID = xuid;\n                }\n                if (PartyListAPI.GetFriendCompetitiveRankType(xuid) === \"Premier\") {\n                    let partyScore = PartyListAPI.GetFriendCompetitiveRank(xuid);\n                    let partyWins = PartyListAPI.GetFriendCompetitiveWins(xuid);\n                    if (partyScore || partyWins) {\n                        oPlayer.score = PartyListAPI.GetFriendCompetitiveRank(xuid);\n                        oPlayer.matchesWon = PartyListAPI.GetFriendCompetitiveWins(xuid);\n                        oPlayer.rankWindowStats = PartyListAPI.GetFriendCompetitivePremierWindowStatsObject(xuid);\n                    }\n                }\n                return oPlayer;\n            }\n            elList.SetLoadListItemFunction((parent, nPanelIdx, reusePanel) => {\n                let oPlayer = GetPartyLBRow(nPanelIdx);\n                if (!reusePanel || !reusePanel.IsValid()) {\n                    reusePanel = $.CreatePanel(\"Button\", elList, oPlayer ? oPlayer.XUID : '');\n                    reusePanel.BLoadLayoutSnippet(\"leaderboard-entry\");\n                }\n                _AddPlayer(reusePanel, oPlayer, nPanelIdx);\n                reusePanel.SetPanelEvent('onmouseover', oPlayer ? OnMouseOver.bind(reusePanel, oPlayer.XUID) : OnMouseOut);\n                reusePanel.SetPanelEvent('onmouseout', OnMouseOut);\n                return reusePanel;\n            });\n            elList.UpdateListItems(PartyListAPI.GetCount());\n        }\n    }\n    function OnLeaderboardDirty(type) {\n        if (m_leaderboardName && m_leaderboardName === type) {\n            _MaybeRefreshRegionsDropdown();\n            LeaderboardsAPI.Refresh(m_leaderboardName);\n        }\n    }\n    function ReadyForDisplay() {\n        RegisterEventHandlers();\n        _MaybeRefreshRegionsDropdown();\n        if (m_leaderboardName) {\n            LeaderboardsAPI.Refresh(m_leaderboardName);\n        }\n    }\n    Leaderboard.ReadyForDisplay = ReadyForDisplay;\n    function UnReadyForDisplay() {\n        UnregisterEventHandlers();\n    }\n    Leaderboard.UnReadyForDisplay = UnReadyForDisplay;\n    function _NameLockPopup() {\n        UiToolkitAPI.ShowCustomLayoutPopup('', 'file://{resources}/layout/popups/popup_leaderboard_namelock.xml');\n    }\n    function _AutomaticLeaderboardNameLockPopup() {\n        let data = $.GetContextPanel().Data();\n        let bAlreadyAsked = data && data.bPromptedForLeaderboardSafeName;\n        if (bAlreadyAsked)\n            return;\n        _NameLockPopup();\n        data.bPromptedForLeaderboardSafeName = true;\n    }\n    function _FillOutEntries() {\n        let nPlayers = LeaderboardsAPI.GetCount(m_leaderboardName);\n        const elList = $.GetContextPanel().FindChildInLayoutFile('id-leaderboard-entries');\n        elList.SetLoadListItemFunction((parent, nPanelIdx, reusePanel) => {\n            let oPlayer = LeaderboardsAPI.GetEntryDetailsObjectByIndex(m_leaderboardName, nPanelIdx);\n            if (!reusePanel || !reusePanel.IsValid()) {\n                reusePanel = $.CreatePanel(\"Button\", elList, oPlayer ? oPlayer.XUID : '');\n                reusePanel.BLoadLayoutSnippet(\"leaderboard-entry\");\n            }\n            _AddPlayer(reusePanel, oPlayer, nPanelIdx);\n            reusePanel.SetHasClass('local-player', (oPlayer ? oPlayer.XUID : '') === m_myXuid);\n            return reusePanel;\n        });\n        elList.UpdateListItems(nPlayers);\n        if (m_lbType === 'general' && IS_AROUND_PLAYER)\n            GoToSelf();\n        else\n            GoToTop();\n    }\n    function OnLeaderboardStateChange(type) {\n        if (m_leaderboardName === type) {\n            if (m_lbType === 'party') {\n                _UpdatePartyList();\n            }\n            else if (m_lbType === 'general') {\n                UpdateLeaderboardList();\n            }\n            return;\n        }\n    }\n    Leaderboard.OnLeaderboardStateChange = OnLeaderboardStateChange;\n    function OnLeaderboardChange() {\n        _UpdateLeaderboardName();\n        UpdateLeaderboardList();\n    }\n    Leaderboard.OnLeaderboardChange = OnLeaderboardChange;\n    function GoToSelf() {\n        let myIndex = LeaderboardsAPI.GetIndexByXuid(m_leaderboardName, m_myXuid);\n        const elList = $.GetContextPanel().FindChildInLayoutFile('id-leaderboard-entries');\n        $.DispatchEvent('ScrollToDelayLoadListItem', elList, myIndex, 'center', true);\n    }\n    Leaderboard.GoToSelf = GoToSelf;\n    function GoToTop() {\n        const elList = $.GetContextPanel().FindChildInLayoutFile('id-leaderboard-entries');\n        $.DispatchEvent('ScrollToDelayLoadListItem', elList, 0, 'topleft', true);\n    }\n    Leaderboard.GoToTop = GoToTop;\n    {\n        $.RegisterEventHandler('ReadyForDisplay', $.GetContextPanel(), Leaderboard.ReadyForDisplay);\n        $.RegisterEventHandler('UnreadyForDisplay', $.GetContextPanel(), Leaderboard.UnReadyForDisplay);\n        _Init();\n    }\n})(Leaderboard || (Leaderboard = {}));\n","scripts/loadingscreen.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\nvar LoadingScreen;\n(function (LoadingScreen) {\n    const cvars = ['mp_roundtime', 'mp_fraglimit', 'mp_maxrounds'];\n    const cvalues = ['0', '0', '0'];\n    const MAX_SLIDES = 10;\n    const SLIDE_DURATION = 4;\n    let m_slideShowJob = null;\n    let m_mapName = null;\n    let m_numImageLoading = 0;\n    function _Init() {\n        $('#ProgressBar').value = 0;\n        $('#LoadingScreenMapName').text = \"\";\n        $('#LoadingScreenGameMode').SetLocString(\"#SFUI_LOADING\");\n        $('#LoadingScreenModeDesc').text = \"\";\n        const elGameModeIcon = $('#LoadingScreenGameModeIcon');\n        elGameModeIcon.visible = false;\n        $('#LoadingScreenIcon').visible = false;\n        const elSlideShow = $.GetContextPanel().FindChildTraverse('LoadingScreenSlideShow');\n        elSlideShow.RemoveAndDeleteChildren();\n        m_numImageLoading = 0;\n        if (m_slideShowJob) {\n            $.CancelScheduled(m_slideShowJob);\n            m_slideShowJob = null;\n        }\n        m_mapName = null;\n    }\n    function _CreateSlide(n) {\n        const suffix = n == 0 ? '' : '_' + n;\n        const imagePath = 'file://{images}/map_icons/screenshots/1080p/' + m_mapName + suffix + '.png';\n        if (!$.BImageFileExists(imagePath)) {\n            return false;\n        }\n        const elSlideShow = $.GetContextPanel().FindChildTraverse('LoadingScreenSlideShow');\n        const elSlide = $.CreatePanel('Image', elSlideShow, 'slide_' + n);\n        elSlide.BLoadLayoutSnippet('snippet-loadingscreen-slide');\n        elSlide.SetImage(imagePath);\n        elSlide.Data().imagePath = imagePath;\n        elSlide.SwitchClass('viz', 'hide');\n        const titleToken = '#loadingscreen_title_' + m_mapName + suffix;\n        let title = $.Localize(titleToken);\n        if (title == titleToken)\n            title = '';\n        elSlide.SetDialogVariable('screenshot-title', title);\n        m_numImageLoading++;\n        $.RegisterEventHandler('ImageLoaded', elSlide, () => {\n            m_numImageLoading--;\n            if (m_numImageLoading <= 0)\n                _StartSlideShow();\n        });\n        $.RegisterEventHandler('ImageFailedLoad', elSlide, () => {\n            elSlide.DeleteAsync(0.0);\n            m_numImageLoading--;\n            if (m_numImageLoading <= 0)\n                _StartSlideShow();\n        });\n        return true;\n    }\n    function _InitSlideShow() {\n        if (m_slideShowJob)\n            return;\n        for (let n = 0; n < MAX_SLIDES; n++) {\n            _CreateSlide(n);\n        }\n    }\n    function _StartSlideShow() {\n        const elSlideShow = $.GetContextPanel().FindChildTraverse('LoadingScreenSlideShow');\n        const arrSlides = elSlideShow.Children();\n        const randomOffset = Math.floor(Math.random() * arrSlides.length);\n        _NextSlide(randomOffset, true);\n    }\n    function _NextSlide(n, bFirst = false) {\n        m_slideShowJob = null;\n        const elSlideShow = $.GetContextPanel().FindChildTraverse('LoadingScreenSlideShow');\n        const arrSlides = elSlideShow.Children();\n        if (arrSlides.length <= 1)\n            return;\n        if (n >= arrSlides.length)\n            n = n - arrSlides.length;\n        let m = n - 1;\n        if (m < 0)\n            m = arrSlides.length - 1;\n        if (arrSlides[n]) {\n            if (bFirst)\n                arrSlides[n].SwitchClass('viz', 'show-first');\n            else\n                arrSlides[n].SwitchClass('viz', 'show');\n        }\n        const slide = arrSlides[m];\n        if (slide)\n            $.Schedule(0.25, () => {\n                if (slide && slide.IsValid())\n                    slide.SwitchClass('viz', 'hide');\n            });\n        m_slideShowJob = $.Schedule(SLIDE_DURATION, () => _NextSlide(n + 1));\n    }\n    function _EndSlideShow() {\n        if (m_slideShowJob) {\n            $.CancelScheduled(m_slideShowJob);\n            m_slideShowJob = null;\n        }\n    }\n    function _OnMapLoadFinished() {\n        _EndSlideShow();\n    }\n    function _UpdateLoadingScreenInfo(mapName, prettyMapName, prettyGameModeName, gameType, gameMode, descriptionText = '') {\n        for (let j = 0; j < cvars.length; ++j) {\n            const val = GameInterfaceAPI.GetSettingString(cvars[j]);\n            if (val !== '0') {\n                cvalues[j] = val;\n            }\n        }\n        for (let j = 0; j < cvars.length; ++j) {\n            const regex = new RegExp('\\\\${d:' + cvars[j] + '}', 'gi');\n            descriptionText = descriptionText.replace(regex, cvalues[j]);\n            $.GetContextPanel().SetDialogVariable(cvars[j], cvalues[j]);\n        }\n        if (mapName) {\n            m_mapName = mapName;\n            $('#LoadingScreenIcon').visible = true;\n            $('#LoadingScreenMapName').RemoveClass(\"loading-screen-content__info__text-title-long\");\n            $('#LoadingScreenMapName').AddClass(\"loading-screen-content__info__text-title-short\");\n            $('#LoadingScreenIcon').SetImage('file://{images}/map_icons/map_icon_' + mapName + '.svg');\n            $('#LoadingScreenIcon').AddClass('show');\n            if (prettyMapName != \"\")\n                $('#LoadingScreenMapName').SetAlreadyLocalizedText(prettyMapName);\n            else\n                $('#LoadingScreenMapName').SetLocString(GameStateAPI.GetMapDisplayNameToken(mapName));\n        }\n        const elInfoBlock = $('#LoadingScreenInfo');\n        if (gameMode) {\n            elInfoBlock.RemoveClass('hidden');\n            if (prettyGameModeName != \"\")\n                $('#LoadingScreenGameMode').SetAlreadyLocalizedText(prettyGameModeName);\n            else\n                $('#LoadingScreenGameMode').SetLocString('#sfui_gamemode_' + gameMode);\n            $('#LoadingScreenGameModeIcon').visible = true;\n            if (GameStateAPI.IsQueuedMatchmakingMode_Team() || mapName === 'lobby_mapveto')\n                $('#LoadingScreenGameModeIcon').SetImage(\"file://{images}/icons/ui/competitive_teams.svg\");\n            else\n                $('#LoadingScreenGameModeIcon').SetImage('file://{images}/icons/ui/' + gameMode + '.svg');\n            if (descriptionText != \"\")\n                $('#LoadingScreenModeDesc').SetAlreadyLocalizedText(descriptionText);\n            else\n                $('#LoadingScreenModeDesc').SetLocString(\"\");\n        }\n        else\n            elInfoBlock.AddClass('hidden');\n        _InitSlideShow();\n    }\n    {\n        $.RegisterForUnhandledEvent('PopulateLoadingScreen', _UpdateLoadingScreenInfo);\n        $.RegisterForUnhandledEvent('UnloadLoadingScreenAndReinit', _Init);\n        $.RegisterForUnhandledEvent('JsOnMapLoadFinished', _OnMapLoadFinished);\n        const elGameModeIcon = $('#LoadingScreenGameModeIcon');\n        $.RegisterEventHandler('ImageFailedLoad', elGameModeIcon, () => elGameModeIcon.visible = false);\n        function mapIconFailedToLoad() {\n            $('#LoadingScreenMapName').RemoveClass(\"loading-screen-content__info__text-title-short\");\n            $('#LoadingScreenMapName').AddClass(\"loading-screen-content__info__text-title-long\");\n            $('#LoadingScreenIcon').visible = false;\n        }\n        $.RegisterEventHandler('ImageFailedLoad', $('#LoadingScreenIcon'), mapIconFailedToLoad.bind(undefined));\n    }\n})(LoadingScreen || (LoadingScreen = {}));\n","scripts/loadout_grid.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"inspect.ts\" />\n/// <reference path=\"common/iteminfo.ts\" />\n/// <reference path=\"common/tint_spray_icon.ts\" />\n/// <reference path=\"common/formattext.ts\" />\nvar LoadoutGrid;\n(function (LoadoutGrid) {\n    let m_hasRunFirstTime = false;\n    let m_equipSlotChangedHandler;\n    let m_setShuffleEnabledHandler;\n    let m_inventoryUpdatedHandler;\n    let m_selectedTeam;\n    let m_mouseOverSlot;\n    let m_elDragSource;\n    let m_dragItemId;\n    let m_filterItemId = '';\n    let m_updatedFromShowItemInLoadout = false;\n    let m_currentCharId = {\n        t: '',\n        ct: '',\n        noteam: '',\n    };\n    let m_currentCharGlovesId = {\n        t: '',\n        ct: '',\n        noteam: '',\n    };\n    let m_currentCharWeaponId = {\n        t: '',\n        ct: '',\n        noteam: '',\n    };\n    let m_currentPetId = {\n        t: '',\n        ct: '',\n        noteam: '',\n    };\n    const m_arrGenericCharacterGlobalSlots = [\n        { slot: 'customplayer', category: 'customplayer' },\n        { slot: 'clothing_hands', category: 'clothing' },\n        { slot: 'melee', category: 'melee', equip_on_hover: true },\n        { slot: 'equipment2', category: 'equipment2', equip_on_hover: true },\n        { slot: 'c4', category: 'c4', required_team: 't', equip_on_hover: true },\n        { slot: 'musickit', category: 'musickit' },\n        { slot: 'flair0', category: 'flair0' },\n        { slot: 'spray0', category: 'spray' },\n    ];\n    function _BCanFitIntoNonWeaponSlot(category, team) {\n        return m_arrGenericCharacterGlobalSlots.find((entry) => { return entry.category === category && (!entry.required_team || (entry.required_team === team)); })\n            ? true\n            : false;\n    }\n    function _BIsSlotAndTeamConfigurationValid(slot, team) {\n        return m_arrGenericCharacterGlobalSlots.find((entry) => { return entry.slot === slot && entry.required_team && (entry.required_team !== team); })\n            ? false\n            : true;\n    }\n    function OnReadyForDisplay() {\n        if (!m_hasRunFirstTime) {\n            m_hasRunFirstTime = true;\n            Init();\n        }\n        else {\n            FillOutRowItems('ct');\n            FillOutRowItems('t');\n            UpdateGridFilterIcons();\n            UpdateGridShuffleIcons();\n            UpdateItemList();\n            UpdateCharModel('ct');\n            UpdateCharModel('t');\n            FillOutGridItems('ct');\n            FillOutGridItems('t');\n            m_updatedFromShowItemInLoadout = m_updatedFromShowItemInLoadout ? false : false;\n        }\n        m_equipSlotChangedHandler = $.RegisterForUnhandledEvent('PanoramaComponent_Loadout_EquipSlotChanged', OnEquipSlotChanged);\n        m_setShuffleEnabledHandler = $.RegisterForUnhandledEvent('PanoramaComponent_Loadout_SetShuffleEnabled', UpdateGridShuffleIcons);\n        m_inventoryUpdatedHandler = $.RegisterForUnhandledEvent('PanoramaComponent_MyPersona_InventoryUpdated', () => {\n            OnMyPersonaInventoryUpdated();\n        });\n    }\n    function OnMyPersonaInventoryUpdated() {\n        UpdateItemList();\n        FillOutRowItems('ct');\n        FillOutRowItems('t');\n        UpdateCharModel('ct');\n        UpdateCharModel('t');\n    }\n    function OnUnreadyForDisplay() {\n        if (m_equipSlotChangedHandler) {\n            $.UnregisterForUnhandledEvent('PanoramaComponent_Loadout_EquipSlotChanged', m_equipSlotChangedHandler);\n            m_equipSlotChangedHandler = null;\n        }\n        if (m_setShuffleEnabledHandler) {\n            $.UnregisterForUnhandledEvent('PanoramaComponent_Loadout_SetShuffleEnabled', m_setShuffleEnabledHandler);\n            m_setShuffleEnabledHandler = null;\n        }\n        if (m_inventoryUpdatedHandler) {\n            $.UnregisterForUnhandledEvent('PanoramaComponent_MyPersona_InventoryUpdated', m_inventoryUpdatedHandler);\n            m_inventoryUpdatedHandler = null;\n        }\n        UiToolkitAPI.HideCustomLayoutTooltip('JsLoadoutItemTooltip');\n    }\n    function OnEquipSlotChanged(team, slot, oldItemId, newItemId, bNew) {\n        if (team == 't' || team == 'ct') {\n            FillOutGridItems(team);\n            if (['melee', 'secondary', 'smg', 'rifle', 'c4', 'equipment2'].includes(InventoryAPI.GetLoadoutCategory(newItemId)))\n                UpdateCharModel(team, newItemId);\n            else\n                UpdateCharModel(team);\n        }\n        else if (slot == 'pet') {\n            UpdateCharModel('ct');\n            UpdateCharModel('t');\n        }\n        FillOutRowItems('ct');\n        FillOutRowItems('t');\n        UpdateGridFilterIcons();\n    }\n    function Init() {\n        UpdateCharModel('ct');\n        UpdateCharModel('t');\n        SetUpTeamSelectBtns();\n        InitSortDropDown();\n        UpdateGridShuffleIcons();\n        $.DispatchEvent(\"Activated\", $.GetContextPanel().FindChildInLayoutFile('id-loadout-select-team-btn-t'), \"mouse\");\n        $.DispatchEvent(\"Activated\", $.GetContextPanel().FindChildInLayoutFile('id-loadout-select-team-btn-ct'), \"mouse\");\n        let elItemList = $('#id-loadout-item-list');\n        elItemList.SetAttributeInt('DragScrollSpeedHorizontal', 0);\n        elItemList.SetAttributeInt('DragScrollSpeedVertical', 0);\n        RegisterGridItemEvents('ct');\n        RegisterGridItemEvents('t');\n    }\n    function SetUpTeamSelectBtns() {\n        let aSectionSuffexes = ['ct', 't'];\n        for (let suffex of aSectionSuffexes) {\n            let elSection = $.GetContextPanel().FindChildInLayoutFile('id-loadout-grid-section-' + suffex);\n            let elBtn = elSection.FindChildInLayoutFile('id-loadout-select-team-btn-' + suffex);\n            elBtn.Data().team = suffex;\n            ItemDragTargetEvents(elBtn);\n            elBtn.SetPanelEvent('onactivate', ChangeSelectedTeam);\n            elBtn.SetPanelEvent('onmouseover', () => { UiToolkitAPI.HideCustomLayoutTooltip('JsLoadoutItemTooltip'); });\n        }\n    }\n    function ChangeSelectedTeam() {\n        let suffex = (m_selectedTeam == 't' ? 'ct' : 't');\n        let elSection = $.GetContextPanel().FindChildInLayoutFile('id-loadout-grid-section-' + suffex);\n        $.GetContextPanel().SetHasClass('loadout_t_selected', suffex === 't');\n        elSection.FindChildInLayoutFile('id-loadout-grid-slots-' + suffex).hittest = true;\n        let oppositeTeam = suffex === 't' ? 'ct' : 't';\n        let elOppositeSection = $.GetContextPanel().FindChildInLayoutFile('id-loadout-grid-section-' + oppositeTeam);\n        elOppositeSection.FindChildInLayoutFile('id-loadout-grid-slots-' + oppositeTeam).hittest = false;\n        m_selectedTeam = suffex;\n        FillOutGridItems(m_selectedTeam);\n        FillOutRowItems(m_selectedTeam);\n        if (!_BIsSlotAndTeamConfigurationValid(GetSelectedGroup(), m_selectedTeam)) {\n            let elGroupDropdown = $.GetContextPanel().FindChildInLayoutFile('id-loadout-filter-group');\n            elGroupDropdown.SetSelected('all');\n        }\n        else {\n            UpdateFilters();\n        }\n        UiToolkitAPI.HideCustomLayoutTooltip('JsLoadoutItemTooltip');\n        $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.submenu_select', 'MOUSE');\n    }\n    function OnActivateSideItem(slotName, TeamName) {\n        if (m_selectedTeam !== TeamName) {\n            ChangeSelectedTeam();\n            ToggleGroupDropdown(slotName, true);\n        }\n        else {\n            ClearItemIdFilter();\n            ToggleGroupDropdown(slotName, false);\n        }\n    }\n    function UpdateCharModel(team, weaponId = '') {\n        let elPanel = $.GetContextPanel().FindChildInLayoutFile('id-loadout-agent-' + team);\n        if (!elPanel)\n            return;\n        let charId = LoadoutAPI.GetItemID(team, 'customplayer');\n        let glovesId = LoadoutAPI.GetItemID(team, 'clothing_hands');\n        let petId = InventoryAPI.GetPetItemID();\n        const settings = ItemInfo.GetOrUpdateVanityCharacterSettings(charId);\n        if (team == m_selectedTeam) {\n            let selectedGroup = GetSelectedGroup();\n            if (['melee', 'secondary0', 'c4', 'equipment2'].includes(selectedGroup)) {\n                weaponId = LoadoutAPI.GetItemID(team, selectedGroup);\n            }\n            else if (['secondary', 'smg', 'rifle'].includes(selectedGroup)) {\n                let selectedItemDef = GetSelectedItemDef();\n                if (selectedItemDef != 'all') {\n                    let itemDefIndex = InventoryAPI.GetItemDefinitionIndexFromDefinitionName(selectedItemDef);\n                    if (LoadoutAPI.IsItemDefEquipped(team, itemDefIndex)) {\n                        let slot = LoadoutAPI.GetSlotEquippedWithDefIndex(team, itemDefIndex);\n                        weaponId = LoadoutAPI.GetItemID(team, slot);\n                    }\n                }\n            }\n        }\n        if (!weaponId || weaponId == '0') {\n            weaponId = m_currentCharWeaponId[team];\n            if (!weaponId || weaponId == '0')\n                weaponId = LoadoutAPI.GetItemID(team, 'melee');\n        }\n        if (charId != m_currentCharId[team] ||\n            glovesId != m_currentCharGlovesId[team] ||\n            weaponId != m_currentCharWeaponId[team]\n            || Number(petId) != 0 || Number(m_currentPetId[team]) != 0) {\n            m_currentCharId[team] = charId;\n            m_currentCharGlovesId[team] = glovesId;\n            m_currentCharWeaponId[team] = weaponId;\n            m_currentPetId[team] = petId;\n            settings.panel = elPanel;\n            settings.weaponItemId = weaponId;\n            settings.petItemId = petId;\n            elPanel.SetPetPlacement(!!petId && Number(petId) != 0 ? 'shoulder' : 'none');\n            CharacterAnims.PlayAnimsOnPanel(settings);\n        }\n    }\n    function FillOutGridItems(team) {\n        let elSection = $.GetContextPanel().FindChildInLayoutFile('id-loadout-grid-section-' + team);\n        let elGrid = elSection.FindChildInLayoutFile('id-loadout-grid-slots-' + team);\n        for (let column of elGrid.Children()) {\n            let aPanels = column.Children().filter(panel => panel.GetAttributeString('data-slot', '') !== '');\n            for (let i = 0; i < aPanels.length; i++) {\n                if (column.GetAttributeString('data-slot', '') === 'equipment' ||\n                    column.GetAttributeString('data-slot', '') === 'grenade') {\n                    UpdateSlotItemImage(team, aPanels[i], true, false, true);\n                }\n                else {\n                    UpdateSlotItemImage(team, aPanels[i], false, true);\n                    UpdateName(aPanels[i]);\n                    UpdateMoney(aPanels[i], team);\n                    UpdateIsRentable(aPanels[i], team);\n                }\n            }\n        }\n    }\n    function FillOutRowItems(team) {\n        let elSection = $.GetContextPanel().FindChildInLayoutFile('id-loadout-grid-section-' + team);\n        let elRow = elSection.FindChildInLayoutFile('id-loadout-row-slots-' + team);\n        for (let entry of m_arrGenericCharacterGlobalSlots) {\n            if (entry.required_team && entry.required_team !== team)\n                continue;\n            let panelId = 'id-loadout-row-slots-' + entry.slot + '-' + team;\n            let elBtn = elRow.FindChild(panelId);\n            if (!elBtn) {\n                elBtn = $.CreatePanel('ItemImage', elRow, panelId, {\n                    class: 'loadout-model-panel__slot'\n                });\n                elBtn.SetAttributeString('data-slot', entry.slot);\n            }\n            let slotName = entry.slot;\n            let itemid = LoadoutAPI.GetItemID(OverrideTeam(team, slotName), slotName);\n            let useIconSlots = ['musickit', 'spray0', 'flair0'];\n            let bUseIcon = useIconSlots.includes(slotName) && itemid === '0' ? true : false;\n            UpdateSlotItemImage(team, elBtn, bUseIcon, true);\n            if (itemid && itemid != '0' && elBtn) {\n                elBtn.SetPanelEvent('oncontextmenu', () => {\n                    let filterValue = '';\n                    if (LoadoutAPI.IsShuffleEnabled(OverrideTeam(team, slotName), slotName))\n                        filterValue = 'shuffle_slot_' + team;\n                    else\n                        filterValue = 'loadout_slot_' + team;\n                    if (slotName === 'spray0')\n                        filterValue += '&contextmenuparam=graffiti';\n                    OpenContextMenu(elBtn, filterValue);\n                });\n                elBtn.SetPanelEvent('onmouseover', () => {\n                    if (team == m_selectedTeam && entry.equip_on_hover)\n                        UpdateCharModel(team, LoadoutAPI.GetItemID(team, slotName));\n                    UiToolkitAPI.ShowCustomLayoutParametersTooltip(panelId, 'JsLoadoutItemTooltip', 'file://{resources}/layout/tooltips/tooltip_loadout_item.xml', 'itemid=' + elBtn.Data().itemid +\n                        '&' + 'slot=' + slotName +\n                        '&' + 'team=' + m_selectedTeam);\n                });\n                elBtn.SetPanelEvent('onmouseout', () => { UiToolkitAPI.HideCustomLayoutTooltip('JsLoadoutItemTooltip'); });\n            }\n            else {\n                elBtn.ClearPanelEvent('oncontextmenu');\n                elBtn.ClearPanelEvent('onmouseover');\n                elBtn.ClearPanelEvent('onmouseout');\n            }\n            elBtn.SetPanelEvent('onactivate', () => OnActivateSideItem(slotName, team));\n        }\n    }\n    function BTeamHasIconForSlot(team, slot) {\n        return (team == \"t\" && slot == \"equipment3\") ? false : true;\n    }\n    function UpdateSlotItemImage(team, elPanel, bUseIcon, bReplacable, bIsEquipment = false) {\n        let slot = elPanel.GetAttributeString('data-slot', '');\n        team = OverrideTeam(team, slot);\n        let itemImage = elPanel.FindChild('loudout-item-image-' + slot);\n        let itemid = LoadoutAPI.GetItemID(team, slot);\n        let elRarity = elPanel.FindChild('id-loadout-item-rarity');\n        if (!itemImage) {\n            itemImage = $.CreatePanel('ItemImage', elPanel, 'loudout-item-image-' + slot, {\n                class: 'loadout-slot__image'\n            });\n            if (slot === 'spray0') {\n                itemImage.SetAttributeInt('ItemInventoryImagePurpose', 1);\n            }\n            if (!bUseIcon) {\n                elRarity = $.CreatePanel('Panel', elPanel, 'id-loadout-item-rarity', {\n                    class: 'loadout-slot-rarity'\n                });\n            }\n            if (bReplacable) {\n                $.CreatePanel('Image', elPanel, 'id-loadout-item-filter-icon', {\n                    class: 'loadout-slot-filter-icon'\n                });\n                let elShuffleIcon = $.CreatePanel('Image', elPanel, 'id-loadout-item-shuffle-icon', {\n                    class: 'loadout-slot-shuffle-icon'\n                });\n                elShuffleIcon.visible = LoadoutAPI.IsShuffleEnabled(team, slot);\n            }\n        }\n        itemImage.SetHasClass('loadout-slot__image', !bUseIcon);\n        itemImage.SetHasClass('loadout-slot-svg__image', bUseIcon);\n        if (!bIsEquipment) {\n            TintSprayImage(itemImage, itemid);\n        }\n        if (bUseIcon && BTeamHasIconForSlot(team, slot)) {\n            itemImage.itemid = '';\n            itemImage.SetImage('file://{images}/icons/equipment/' + GetDefName(itemid, slot) + '.svg');\n        }\n        else {\n            itemImage.itemid = itemid;\n        }\n        if (LoadoutAPI.IsShuffleEnabled(team, slot)) {\n            let sShuffleIds = GetShuffleItems(team, slot);\n            let elContainer = elPanel.FindChild('loudout-item-image-' + slot + '-shuffle');\n            if (!elContainer) {\n                elContainer = $.CreatePanel('Panel', elPanel, 'loudout-item-image-' + slot + '-shuffle', {});\n            }\n            for (let element of sShuffleIds) {\n                $.CreatePanel('ItemImage', elContainer, 'loudout-item-image-' + slot, {\n                    class: 'loadout-slot__image'\n                });\n            }\n        }\n        elPanel.Data().itemid = itemid;\n        elPanel.Data().visuals_itemid = itemid;\n        if (slot === 'spray0') {\n            elPanel.Data().visuals_itemid = ItemInfo.GetFauxReplacementItemID(itemid, 'graffiti');\n        }\n        let color = InventoryAPI.GetItemRarityColor(itemid);\n        if (elRarity) {\n            elRarity.visible = color ? true : false;\n            if (color)\n                elRarity.style.backgroundColor = color;\n            return;\n        }\n    }\n    function TintSprayImage(itemImage, itemId) {\n        TintSprayIcon.CheckIsSprayAndTint(itemId, itemImage);\n    }\n    function UpdateName(elPanel) {\n        let elName = elPanel.FindChild('id-loadout-item-name');\n        if (!elName) {\n            elName = $.CreatePanel('Label', elPanel, 'id-loadout-item-name', {\n                class: 'loadout-slot__name stratum-regular',\n                text: '{s:item-name}'\n            });\n        }\n        elPanel.SetDialogVariable('item-name', $.Localize(InventoryAPI.GetItemBaseName(elPanel.Data().visuals_itemid)));\n    }\n    function UpdateMoney(elPanel, team) {\n        let elMoney = elPanel.FindChild('id-loadout-item-money');\n        if (!elMoney) {\n            elMoney = $.CreatePanel('Label', elPanel, 'id-loadout-item-money', {\n                class: 'loadout-slot__money stratum-regular',\n                text: '{d:money}'\n            });\n        }\n        elPanel.SetDialogVariableInt('money', LoadoutAPI.GetItemGamePrice(team, elPanel.GetAttributeString('data-slot', '')));\n        elMoney.text = $.Localize(\"#buymenu_money\", elPanel);\n    }\n    function GetDefName(itemid, slot) {\n        let defName = InventoryAPI.GetItemDefinitionName(itemid);\n        let aDefName = [];\n        if (slot === 'clothing_hands' || slot === 'melee' || slot === 'customplayer' || itemid === '0') {\n            return slot;\n        }\n        else {\n            aDefName = defName ? defName.split('_') : [];\n            return aDefName[1];\n        }\n    }\n    function UpdateIsRentable(elPanel, team) {\n        let elLabel = elPanel.FindChild('id-loadout-item-is-rentable');\n        if (!elLabel) {\n            elLabel = $.CreatePanel('Label', elPanel, 'id-loadout-item-is-rentable', {\n                html: 'true',\n                class: 'item-tile__rental-expiration stratum-regular-italic',\n                text: '#item-rental-time-remaining'\n            });\n        }\n        let slot = elPanel.GetAttributeString('data-slot', '');\n        let itemId = LoadoutAPI.GetItemID(team, slot);\n        if (!InventoryAPI.IsRental(itemId)) {\n            elLabel.AddClass('hide');\n            return;\n        }\n        let expirationDate = InventoryAPI.GetExpirationDate(itemId);\n        if (expirationDate <= 0) {\n            elLabel.AddClass('hide');\n            return;\n        }\n        let oLocData = FormatText.FormatRentalTime(expirationDate);\n        elLabel.SetHasClass('item-expired', oLocData.isExpired);\n        elLabel.SetDialogVariable('time-remaining', oLocData.time);\n        elLabel.text = $.Localize(oLocData.locString, elLabel);\n        elLabel.RemoveClass('hide');\n    }\n    function OverrideTeam(team, slot) {\n        let noteamSlots = ['musickit', 'spray0', 'flair0'];\n        return noteamSlots.includes(slot) ? 'noteam' : team;\n    }\n    function LoadoutSlotItemTileEvents(elPanel) {\n        elPanel.SetPanelEvent('onactivate', () => {\n            ClearItemIdFilter();\n            FilterByItemType(elPanel.Data().itemid, true);\n        });\n        elPanel.SetPanelEvent('onmouseover', () => {\n            m_mouseOverSlot = elPanel.GetAttributeString('data-slot', '');\n            UpdateCharModel(m_selectedTeam, LoadoutAPI.GetItemID(m_selectedTeam, m_mouseOverSlot));\n            UiToolkitAPI.ShowCustomLayoutParametersTooltip('loudout-item-image-' + m_mouseOverSlot, 'JsLoadoutItemTooltip', 'file://{resources}/layout/tooltips/tooltip_loadout_item.xml', 'itemid=' + elPanel.Data().itemid +\n                '&' + 'slot=' + m_mouseOverSlot +\n                '&' + 'team=' + m_selectedTeam +\n                '&' + 'nameonly=' + 'true');\n        });\n        elPanel.SetPanelEvent('onmouseout', () => {\n            m_mouseOverSlot = '';\n            elPanel.SetPanelEvent('onmouseout', () => { UiToolkitAPI.HideCustomLayoutTooltip('JsLoadoutItemTooltip'); });\n        });\n        elPanel.SetPanelEvent('oncontextmenu', () => {\n            let slot = elPanel.GetAttributeString('data-slot', '');\n            let filterValue = '';\n            if (LoadoutAPI.IsShuffleEnabled(m_selectedTeam, slot))\n                filterValue = 'shuffle_slot_' + m_selectedTeam;\n            else\n                filterValue = 'loadout_slot_' + m_selectedTeam;\n            if (slot === 'spray0')\n                filterValue += '&contextmenuparam=graffiti';\n            OpenContextMenu(elPanel, filterValue);\n        });\n        elPanel.SetDraggable(true);\n        $.RegisterEventHandler('DragStart', elPanel, (elPanel, drag) => {\n            if (m_mouseOverSlot !== null) {\n                let itemid = LoadoutAPI.GetItemID(m_selectedTeam, m_mouseOverSlot);\n                let bShuffle = LoadoutAPI.IsShuffleEnabled(m_selectedTeam, m_mouseOverSlot);\n                OnDragStart(elPanel, drag, itemid, bShuffle);\n            }\n        });\n        $.RegisterEventHandler('DragEnd', elPanel, (elRadial, elDragImage) => {\n            OnDragEnd(elDragImage);\n        });\n    }\n    function OpenContextMenu(elPanel, filterValue) {\n        UiToolkitAPI.HideCustomLayoutTooltip('JsLoadoutItemTooltip');\n        let filterForContextMenuEntries = '&populatefiltertext=' + filterValue;\n        let contextMenuPanel = UiToolkitAPI.ShowCustomLayoutContextMenuParametersDismissEvent('', '', 'file://{resources}/layout/context_menus/context_menu_inventory_item.xml', 'itemid=' + elPanel.Data().itemid + filterForContextMenuEntries, () => { });\n        contextMenuPanel.AddClass(\"ContextMenu_NoArrow\");\n    }\n    function ItemDragTargetEvents(elPanel) {\n        $.RegisterEventHandler('DragEnter', elPanel, () => {\n            elPanel.AddClass('loadout-drag-enter');\n            m_mouseOverSlot = elPanel.GetAttributeString('data-slot', '');\n        });\n        $.RegisterEventHandler('DragLeave', elPanel, () => {\n            elPanel.RemoveClass('loadout-drag-enter');\n            m_mouseOverSlot = '';\n        });\n        $.RegisterEventHandler('DragDrop', elPanel, (dispayId, elDragImage) => {\n            OnDragDrop(elPanel, elDragImage);\n        });\n    }\n    function OnDragStart(elDragSource, drag, itemid, bShuffle) {\n        let elDragImage = $.CreatePanel('ItemImage', $.GetContextPanel(), '', {\n            class: 'loadout-drag-icon',\n            textureheight: '128',\n            texturewidth: '128'\n        });\n        elDragImage.itemid = itemid;\n        elDragImage.Data().bShuffle = bShuffle;\n        TintSprayImage(elDragImage, itemid);\n        drag.displayPanel = elDragImage;\n        drag.offsetX = 96;\n        drag.offsetY = 64;\n        drag.removePositionBeforeDrop = false;\n        elDragImage.AddClass('drag-start');\n        m_elDragSource = elDragSource;\n        m_elDragSource.AddClass('dragged-away');\n        m_dragItemId = itemid;\n        UpdateValidDropTargets();\n        let elItemList = $('#id-loadout-item-list');\n        elItemList.hittest = false;\n        elItemList.hittestchildren = false;\n        $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.inventory_item_pickup', 'MOUSE');\n    }\n    function OnDragEnd(elDragImage) {\n        elDragImage.DeleteAsync(0.1);\n        elDragImage.AddClass('drag-end');\n        m_elDragSource.RemoveClass('dragged-away');\n        m_dragItemId = '';\n        UpdateValidDropTargets();\n        let elItemList = $('#id-loadout-item-list');\n        elItemList.hittest = true;\n        elItemList.hittestchildren = true;\n    }\n    function OnDragDrop(elPanel, elDragImage) {\n        let newSlot = elPanel.GetAttributeString('data-slot', '');\n        if (newSlot !== null) {\n            if (newSlot === 'side_slots' && m_selectedTeam === elPanel.GetAttributeString('data-team', '')) {\n                let itemId = elDragImage.itemid;\n                let bShuffle = elDragImage.Data().bShuffle;\n                if (ItemInfo.IsSpraySealed(itemId)) {\n                    const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('', 'file://{resources}/layout/popups/popup_capability_decodable.xml');\n                    let oSettings = {\n                        item_id: itemId,\n                        work_type: 'decodeable'\n                    };\n                    elPanel.Data().oSettings = oSettings;\n                }\n                else {\n                    let category = InventoryAPI.GetLoadoutCategory(itemId);\n                    if (_BCanFitIntoNonWeaponSlot(category, m_selectedTeam)) {\n                        let slot = category === 'spray' ? 'spray0' : category === 'clothing' ? 'clothing_hands' : category;\n                        let team = OverrideTeam(m_selectedTeam, slot);\n                        let elRow = $.GetContextPanel().FindChildInLayoutFile('id-loadout-row-slots-' + m_selectedTeam);\n                        let elItemPanel = elRow.FindChildInLayoutFile('id-loadout-row-slots-' + slot + '-' + m_selectedTeam);\n                        let isSameId = elDragImage.itemid === elItemPanel.Data().itemid ? true : false;\n                        let equipSuccess = TryEquipItemInSlot(team, itemId, slot);\n                        PlayDropSounds(equipSuccess, isSameId);\n                        if (equipSuccess && bShuffle) {\n                            LoadoutAPI.SetShuffleEnabled(team, slot, true);\n                        }\n                    }\n                }\n                return;\n            }\n            let canEquip = LoadoutAPI.CanEquipItemInSlot(m_selectedTeam, elDragImage.itemid, newSlot);\n            if (canEquip) {\n                let itemId = elDragImage.itemid;\n                let bShuffle = elDragImage.Data().bShuffle;\n                if (InventoryAPI.IsValidItemID(itemId)) {\n                    let itemDefIndex = InventoryAPI.GetItemDefinitionIndex(itemId);\n                    let oldSlot = LoadoutAPI.GetSlotEquippedWithDefIndex(m_selectedTeam, itemDefIndex);\n                    let isSameId = elDragImage.itemid === elPanel.Data().itemid ? true : false;\n                    let equipSuccess = TryEquipItemInSlot(m_selectedTeam, itemId, newSlot);\n                    PlayDropSounds(equipSuccess, isSameId);\n                    if (equipSuccess && bShuffle) {\n                        LoadoutAPI.SetShuffleEnabled(m_selectedTeam, newSlot, true);\n                    }\n                    elPanel.TriggerClass('drop-target');\n                    $.Schedule(.5, () => { if (elPanel) {\n                        elPanel.RemoveClass('drop-target');\n                    } });\n                    elPanel.hittestchildren = false;\n                    $.Schedule(1, () => { elPanel.hittestchildren = true; });\n                    let oldTile = FindGridTile(oldSlot);\n                    if (oldTile) {\n                        oldTile.AddClass('old-item-slot');\n                        $.Schedule(.5, () => { if (oldTile) {\n                            oldTile.RemoveClass('old-item-slot');\n                        } });\n                    }\n                }\n            }\n        }\n    }\n    function PlayDropSounds(equipSuccess, isSameId) {\n        if (equipSuccess && !isSameId) {\n            $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.inventory_item_putdown', 'MOUSE');\n        }\n        else {\n            $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.inventory_item_notequipped', 'MOUSE');\n        }\n    }\n    const m_aActiveUsedColumns = [\n        'id-loadout-column1',\n        'id-loadout-column2',\n        'id-loadout-column3',\n    ];\n    function UpdateValidDropTargets() {\n        if (m_dragItemId && InventoryAPI.IsValidItemID(m_dragItemId)) {\n            let category = InventoryAPI.GetLoadoutCategory(m_dragItemId);\n            if (!category || _BCanFitIntoNonWeaponSlot(category, m_selectedTeam)) {\n                let elBtn = $.GetContextPanel().FindChildInLayoutFile('id-loadout-agent-' + m_selectedTeam);\n                elBtn.SetHasClass('loadout-valid-target', true);\n                return;\n            }\n        }\n        let aSectionSuffexes = ['ct', 't'];\n        for (let suffex of aSectionSuffexes) {\n            let elBtn = $.GetContextPanel().FindChildInLayoutFile('id-loadout-agent-' + suffex);\n            elBtn.SetHasClass('loadout-valid-target', false);\n        }\n        let elSection = $.GetContextPanel().FindChildInLayoutFile('id-loadout-grid-section-' + m_selectedTeam);\n        let elGrid = elSection.FindChildInLayoutFile('id-loadout-grid-slots-' + m_selectedTeam);\n        for (let columnId of m_aActiveUsedColumns) {\n            let elColumn = elGrid.FindChildInLayoutFile(columnId);\n            for (let elPanel of elColumn.Children()) {\n                let slot = elPanel.GetAttributeString('data-slot', '');\n                let canEquip = LoadoutAPI.CanEquipItemInSlot(m_selectedTeam, m_dragItemId, slot);\n                elPanel.SetHasClass('loadout-valid-target', canEquip);\n            }\n        }\n    }\n    function FindGridTile(oldSlot) {\n        let elGrid = $.GetContextPanel().FindChildInLayoutFile('id-loadout-grid-slots-' + m_selectedTeam);\n        {\n            for (let columnId of m_aActiveUsedColumns) {\n                let elColumn = elGrid.FindChildInLayoutFile(columnId);\n                for (let elPanel of elColumn.Children()) {\n                    let slot = elPanel.GetAttributeString('data-slot', '');\n                    if (slot === oldSlot) {\n                        return elPanel;\n                    }\n                }\n            }\n        }\n        return null;\n    }\n    function InitSortDropDown() {\n        let elDropdown = $.GetContextPanel().FindChildInLayoutFile('id-loadout-sort');\n        let count = InventoryAPI.GetSortMethodsCount();\n        for (let i = 0; i < count; i++) {\n            let id = InventoryAPI.GetSortMethodByIndex(i);\n            let newEntry = $.CreatePanel('Label', elDropdown, id, { class: 'DropDownMenu' });\n            newEntry.text = $.Localize('#' + id);\n            elDropdown.AddOption(newEntry);\n        }\n        elDropdown.SetSelected(GameInterfaceAPI.GetSettingString(\"cl_loadout_saved_sort\"));\n    }\n    function UpdateFilters() {\n        let group = GetSelectedGroup();\n        if (!_BIsSlotAndTeamConfigurationValid(group, m_selectedTeam)) {\n            $.DispatchEvent(\"Activated\", $.GetContextPanel().FindChildInLayoutFile('id-loadout-select-team-btn-t'), \"mouse\");\n            return;\n        }\n        let elClearBtn = $.GetContextPanel().FindChildInLayoutFile('id-loadout-clear-filters');\n        elClearBtn.visible = (group != 'all' || m_filterItemId !== '');\n        let itemDefNames = null;\n        if (['secondary', 'smg', 'rifle'].includes(group)) {\n            itemDefNames = JSON.parse(LoadoutAPI.GetGroupItemDefNames(m_selectedTeam, group));\n            itemDefNames.sort();\n        }\n        let elItemDefDropdown = $.GetContextPanel().FindChildInLayoutFile('id-loadout-filter-itemdef');\n        if (itemDefNames) {\n            let prevSelected = GetSelectedItemDef();\n            elItemDefDropdown.RemoveAllOptions();\n            {\n                let elOption = $.CreatePanel('Label', elItemDefDropdown, 'all', { class: 'DropDownMenu' });\n                elOption.text = $.Localize('#inv_filter_all_' + group);\n                elItemDefDropdown.AddOption(elOption);\n            }\n            let itemDefNames = JSON.parse(LoadoutAPI.GetGroupItemDefNames(m_selectedTeam, group)).sort();\n            for (let itemDefName of itemDefNames) {\n                let itemDefIndex = InventoryAPI.GetItemDefinitionIndexFromDefinitionName(itemDefName);\n                let itemId = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(itemDefIndex, 0);\n                let elOption = $.CreatePanel('Label', elItemDefDropdown, itemDefName, { class: 'DropDownMenu' });\n                elOption.text = $.Localize(InventoryAPI.GetItemBaseName(itemId));\n                elItemDefDropdown.AddOption(elOption);\n                ;\n            }\n            elItemDefDropdown.visible = true;\n            if (elItemDefDropdown.HasOption(prevSelected))\n                elItemDefDropdown.SetSelected(prevSelected);\n            else\n                elItemDefDropdown.SetSelected('all');\n        }\n        else {\n            elItemDefDropdown.visible = false;\n            elItemDefDropdown.SetSelected('all');\n            UpdateItemList();\n        }\n        UpdateGridFilterIcons();\n    }\n    LoadoutGrid.UpdateFilters = UpdateFilters;\n    function UpdateItemList() {\n        let loadoutSlotParams = m_selectedTeam;\n        let group = GetSelectedGroup();\n        loadoutSlotParams += ',flexible_loadout_group:' + (group == 'all' ? 'any' : group);\n        let elItemDefDropdown = $.GetContextPanel().FindChildInLayoutFile('id-loadout-filter-itemdef');\n        if (elItemDefDropdown.visible) {\n            let itemDefName = GetSelectedItemDef();\n            if (itemDefName != 'all')\n                loadoutSlotParams += ',item_definition:' + itemDefName;\n        }\n        let elSortDropdown = $.GetContextPanel().FindChildInLayoutFile('id-loadout-sort');\n        let sortType = elSortDropdown.GetSelected().id;\n        if (GameInterfaceAPI.GetSettingString(\"cl_loadout_saved_sort\") != sortType) {\n            GameInterfaceAPI.SetSettingString(\"cl_loadout_saved_sort\", sortType);\n            GameInterfaceAPI.ConsoleCommand(\"host_writeconfig\");\n        }\n        if (m_filterItemId !== '' &&\n            InventoryAPI.IsValidItemID(m_filterItemId) &&\n            group === InventoryAPI.GetRawDefinitionKey(m_filterItemId, 'flexible_loadout_group') &&\n            m_updatedFromShowItemInLoadout) {\n            loadoutSlotParams += ',item_id:' + m_filterItemId;\n        }\n        else if (m_filterItemId) {\n            ClearItemIdFilter();\n        }\n        let elItemList = $.GetContextPanel().FindChildInLayoutFile('id-loadout-item-list');\n        $.DispatchEvent('SetInventoryFilter', elItemList, 'any', 'any', 'any', sortType, loadoutSlotParams, '');\n        UpdateGridFilterIcons();\n        ShowHideItemFilterText(m_filterItemId != '');\n    }\n    LoadoutGrid.UpdateItemList = UpdateItemList;\n    function ClearFilters() {\n        let elGroupDropdown = $.GetContextPanel().FindChildInLayoutFile('id-loadout-filter-group');\n        if ($.GetContextPanel().FindChildInLayoutFile('id-loadout-clear-filters-label').visible) {\n            ShowHideItemFilterText(false);\n            ClearItemIdFilter();\n            UpdateItemList();\n            return;\n        }\n        elGroupDropdown.SetSelected('all');\n    }\n    LoadoutGrid.ClearFilters = ClearFilters;\n    function ShowHideItemFilterText(bShow) {\n        $.GetContextPanel().FindChildInLayoutFile('id-loadout-clear-filters-label').visible = bShow;\n    }\n    function FilterByItemType(itemId, bToggle = false) {\n        let group = InventoryAPI.GetRawDefinitionKey(itemId, 'flexible_loadout_group');\n        let elGroupDropdown = $.GetContextPanel().FindChildInLayoutFile('id-loadout-filter-group');\n        let elItemDefDropdown = $.GetContextPanel().FindChildInLayoutFile('id-loadout-filter-itemdef');\n        if (bToggle && GetSelectedGroup() == group && !elItemDefDropdown.visible) {\n            elGroupDropdown.SetSelected('all');\n            return;\n        }\n        elGroupDropdown.SetSelected(group);\n        if (elItemDefDropdown.visible) {\n            let itemDefName = InventoryAPI.GetItemDefinitionName(itemId);\n            if (bToggle && GetSelectedItemDef() == itemDefName)\n                elItemDefDropdown.SetSelected('all');\n            else\n                elItemDefDropdown.SetSelected(itemDefName);\n        }\n    }\n    function ToggleGroupDropdown(group, bDisallowToggle = false) {\n        let elGroupDropdown = $.GetContextPanel().FindChildInLayoutFile('id-loadout-filter-group');\n        let elItemDefDropdown = $.GetContextPanel().FindChildInLayoutFile('id-loadout-filter-itemdef');\n        if (GetSelectedGroup() == group && !bDisallowToggle) {\n            if (GetSelectedItemDef() != 'all')\n                elItemDefDropdown.SetSelected('all');\n            else\n                elGroupDropdown.SetSelected('all');\n        }\n        else {\n            elGroupDropdown.SetSelected(group);\n            if (elItemDefDropdown.visible)\n                elItemDefDropdown.SetSelected('all');\n        }\n    }\n    LoadoutGrid.ToggleGroupDropdown = ToggleGroupDropdown;\n    function OnItemTileLoaded(elItemTile) {\n        elItemTile.SetPanelEvent('onactivate', () => { });\n        elItemTile.SetDraggable(true);\n        $.RegisterEventHandler('DragStart', elItemTile, (elItemTile, drag) => {\n            $.DispatchEvent('CSGOInventoryHideTooltip');\n            OnDragStart(elItemTile, drag, elItemTile.GetAttributeString('itemid', '0'), false);\n        });\n        $.RegisterEventHandler('DragEnd', elItemTile, (elItemTile, elDragImage) => {\n            OnDragEnd(elDragImage);\n        });\n    }\n    function ShowLoadoutForItem(itemId) {\n        if (!DoesItemTeamMatchTeamRequired(m_selectedTeam, itemId)) {\n            ChangeSelectedTeam();\n        }\n        m_filterItemId = itemId;\n        m_updatedFromShowItemInLoadout = true;\n        let elClearBtn = $.GetContextPanel().FindChildInLayoutFile('id-loadout-clear-filters');\n        elClearBtn.SetDialogVariable('item_name', InventoryAPI.GetItemName(m_filterItemId));\n        ShowHideItemFilterText(true);\n        FilterByItemType(itemId);\n    }\n    function ClearItemIdFilter() {\n        m_filterItemId = m_filterItemId !== '' ? '' : '';\n    }\n    function DoesItemTeamMatchTeamRequired(team, id) {\n        if (team === 't') {\n            return ItemInfo.IsItemT(id) || ItemInfo.IsItemAnyTeam(id);\n        }\n        if (team === 'ct') {\n            return ItemInfo.IsItemCt(id) || ItemInfo.IsItemAnyTeam(id);\n        }\n        return false;\n    }\n    function UpdateGridFilterIcons() {\n        let selectedGroup = GetSelectedGroup();\n        let selectedItemDef = GetSelectedItemDef();\n        let elGrid = $.GetContextPanel().FindChildInLayoutFile('id-loadout-grid-slots-' + m_selectedTeam);\n        if (elGrid) {\n            for (let group of ['secondary0', 'secondary', 'smg', 'rifle']) {\n                let btn = elGrid.FindChildInLayoutFile('id-loadout-btn-' + group);\n                if (btn) {\n                    btn.checked = (group == selectedGroup && (!selectedItemDef || selectedItemDef == 'all'));\n                }\n            }\n            for (let columnId of m_aActiveUsedColumns) {\n                let elColumn = elGrid.FindChildInLayoutFile(columnId);\n                for (let elPanel of elColumn.Children()) {\n                    let elFilterIcon = elPanel.FindChildInLayoutFile('id-loadout-item-filter-icon');\n                    if (elFilterIcon) {\n                        let slot = elPanel.GetAttributeString('data-slot', '');\n                        let itemId = LoadoutAPI.GetItemID(m_selectedTeam, slot);\n                        let itemDef = InventoryAPI.GetItemDefinitionName(itemId);\n                        elFilterIcon.visible = (itemDef == selectedItemDef);\n                    }\n                }\n            }\n        }\n        for (let team of ['ct', 't']) {\n            let elSection = $.GetContextPanel().FindChildInLayoutFile('id-loadout-grid-section-' + team);\n            let elRow = elSection.FindChildInLayoutFile('id-loadout-row-slots-' + team);\n            for (let elPanel of elRow.Children()) {\n                let elFilterIcon = elPanel.FindChildInLayoutFile('id-loadout-item-filter-icon');\n                if (elFilterIcon) {\n                    if (team == m_selectedTeam) {\n                        let slot = elPanel.GetAttributeString('data-slot', '');\n                        elFilterIcon.visible = (slot == selectedGroup);\n                    }\n                    else {\n                        elFilterIcon.visible = false;\n                    }\n                }\n            }\n        }\n        UpdateCharModel(m_selectedTeam);\n    }\n    function UpdateGridShuffleIcons() {\n        let elGrid = $.GetContextPanel().FindChildInLayoutFile('id-loadout-grid-slots-' + m_selectedTeam);\n        if (elGrid) {\n            for (let columnId of m_aActiveUsedColumns) {\n                let elColumn = elGrid.FindChildInLayoutFile(columnId);\n                for (let elPanel of elColumn.Children()) {\n                    let elShuffleIcon = elPanel.FindChildInLayoutFile('id-loadout-item-shuffle-icon');\n                    if (elShuffleIcon) {\n                        let slot = elPanel.GetAttributeString('data-slot', '');\n                        elShuffleIcon.visible = LoadoutAPI.IsShuffleEnabled(OverrideTeam(m_selectedTeam, slot), slot);\n                    }\n                }\n            }\n        }\n        for (let team of ['ct', 't']) {\n            let elSection = $.GetContextPanel().FindChildInLayoutFile('id-loadout-grid-section-' + team);\n            let elRow = elSection.FindChildInLayoutFile('id-loadout-row-slots-' + team);\n            for (let elPanel of elRow.Children()) {\n                let elShuffleIcon = elPanel.FindChildInLayoutFile('id-loadout-item-shuffle-icon');\n                if (elShuffleIcon) {\n                    let slot = elPanel.GetAttributeString('data-slot', '');\n                    elShuffleIcon.visible = LoadoutAPI.IsShuffleEnabled(OverrideTeam(team, slot), slot);\n                }\n            }\n        }\n    }\n    function GetSelectedGroup() {\n        let elDropdown = $.GetContextPanel().FindChildInLayoutFile('id-loadout-filter-group');\n        return (elDropdown?.visible ? elDropdown.GetSelected()?.id : null) ?? 'all';\n    }\n    function GetSelectedItemDef() {\n        let elDropdown = $.GetContextPanel().FindChildInLayoutFile('id-loadout-filter-itemdef');\n        return (elDropdown?.visible ? elDropdown.GetSelected()?.id : null) ?? 'all';\n    }\n    function GetShuffleItems(team, slot) {\n        return JSON.parse(LoadoutAPI.GetShuffleItems(team, slot));\n    }\n    function RegisterGridItemEvents(team) {\n        let elSection = $.GetContextPanel().FindChildInLayoutFile('id-loadout-grid-section-' + team);\n        let elGrid = elSection.FindChildInLayoutFile('id-loadout-grid-slots-' + team);\n        for (let column of elGrid.Children()) {\n            let aPanels = column.Children().filter(panel => panel.GetAttributeString('data-slot', '') !== '');\n            for (let i = 0; i < aPanels.length; i++) {\n                if (column.GetAttributeString('data-slot', '') !== 'equipment' &&\n                    column.GetAttributeString('data-slot', '') !== 'grenade') {\n                    LoadoutSlotItemTileEvents(aPanels[i]);\n                    ItemDragTargetEvents(aPanels[i]);\n                }\n            }\n        }\n    }\n    function TryEquipItemInSlot(szTeam, szItemID, szSlot) {\n        let bSuccess = LoadoutAPI.EquipItemInSlot(szTeam, szItemID, szSlot);\n        if (!bSuccess && LoadoutAPI.CanEquipItemInSlot(szTeam, szItemID, szSlot)) {\n            UiToolkitAPI.ShowGenericPopupOk($.Localize('#LoadoutLockedPopupTitle'), $.Localize('#LoadoutLockedPopupText'), '', () => { });\n        }\n        return bSuccess;\n    }\n    {\n        $.RegisterEventHandler('ReadyForDisplay', $.GetContextPanel(), OnReadyForDisplay);\n        $.RegisterEventHandler('UnreadyForDisplay', $.GetContextPanel(), OnUnreadyForDisplay);\n        $.RegisterForUnhandledEvent('LoadoutFilterByItemType', FilterByItemType);\n        $.RegisterEventHandler('CSGOInventoryItemLoaded', $.GetContextPanel(), OnItemTileLoaded);\n        $.RegisterForUnhandledEvent('ShowLoadoutForItem', ShowLoadoutForItem);\n    }\n})(LoadoutGrid || (LoadoutGrid = {}));\n","scripts/mainmenu.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"common/characteranims.ts\" />\n/// <reference path=\"common/licenseutil.ts\" />\n/// <reference path=\"common/promoted_settings.ts\" />\n/// <reference path=\"popups/popup_acknowledge_item.ts\" />\n/// <reference path=\"new_news_entry_check.ts\" />\n/// <reference path=\"inspect.ts\" />\n/// <reference path=\"avatar.ts\" />\n/// <reference path=\"vanity_player_info.ts\" />\n/// <reference path=\"vanity_pet_info.ts\" />\n/// <reference path=\"particle_controls.ts\" />\n/// <reference path=\"video_setting_recommendations.ts\" />\n/// <reference path=\"generated/items_event_current_generated_store.d.ts\" />\n$.LogChannel('p.mainmenu', \"LV_OFF\");\nvar MainMenu;\n(function (MainMenu) {\n    const _m_bPerfectWorld = (MyPersonaAPI.GetLauncherType() === \"perfectworld\");\n    let _m_activeTab = null;\n    let _m_sideBarElementContextMenuActive = false;\n    const _m_elContentPanel = $('#JsMainMenuContent');\n    let _m_playedInitalFadeUp = false;\n    const _m_maxMainMenuDisplayAgents = 5;\n    let _m_nPetUpgradeLevel = null;\n    const _m_elNotificationsContainer = $('#id-notifications-container');\n    let _m_notificationSchedule = false;\n    let _m_bVanityAnimationAlreadyStarted = false;\n    let _m_bHasPopupNotification = false;\n    let _m_popupNotificationCallbackHandle = -1;\n    let _m_bRemindUsersToSpendMajorTokens = false;\n    let _m_tLastSeenDisconnectedFromGC = 0;\n    const _m_NotificationBarColorClasses = [\n        \"NotificationRed\", \"NotificationYellow\", \"NotificationGreen\", \"NotificationLoggingOn\"\n    ];\n    let _m_LobbyPlayerUpdatedEventHandler = null;\n    let _m_LobbyMatchmakingSessionUpdateEventHandler = null;\n    let _m_LobbyForceRestartVanityEventHandler = null;\n    let _m_LobbyMainMenuSwitchVanityEventHandler = null;\n    let _m_UiSceneFrameBoundaryEventHandler = null;\n    let _m_equipSlotChangedHandler = null;\n    let _m_storePopupElement = null;\n    let m_TournamentPickBanPopup = null;\n    let _m_jobFetchTournamentData = null;\n    const TOURNAMENT_FETCH_DELAY = 10;\n    const nNumNewSettings = UpdateSettingsMenuAlert();\n    const m_MainMenuTopBarParticleFX = $('#MainMenuNavigateParticles');\n    ParticleControls.UpdateMainMenuTopBar(m_MainMenuTopBarParticleFX, '');\n    let _m_nActiveFrameCount = 0;\n    let _m_bTriedShowVideoSettingRecommendation = false;\n    const _m_acknowledgedRentalExpirationCrateIds = new Set();\n    let _m_bPreLoadedTabs = false;\n    function UpdateSettingsMenuAlert() {\n        let elNewSettingsAlert = $(\"#MainMenuSettingsAlert\");\n        if (elNewSettingsAlert) {\n            let nNewSettings = PromotedSettingsUtil.GetUnacknowledgedPromotedSettings().length;\n            elNewSettingsAlert.SetDialogVariable(\"alert_value\", $.Localize(\"#Store_Price_New\"));\n            elNewSettingsAlert.SetHasClass('hidden', nNewSettings < 1);\n            return nNewSettings;\n        }\n        return 0;\n    }\n    if (nNumNewSettings > 0) {\n        const hPromotedSettingsViewedEvt = $.RegisterForUnhandledEvent(\"MainMenu_PromotedSettingsViewed\", () => {\n            UpdateSettingsMenuAlert();\n            $.UnregisterForUnhandledEvent(\"MainMenu_PromotedSettingsViewed\", hPromotedSettingsViewedEvt);\n        });\n    }\n    function _OnInitFadeUp() {\n        if (!_m_playedInitalFadeUp) {\n            $('#MainMenuContainerPanel').TriggerClass('show');\n            _m_playedInitalFadeUp = true;\n            _RegisterOnShowEvents();\n            _UpdateBackgroundMap();\n        }\n    }\n    function SetHideTranstionOnLeftColumn() {\n        const elLeftColumn = $.FindChildInContext('#JsLeftColumn');\n        function fnOnPropertyTransitionEndEvent(panel, propertyName) {\n            if (elLeftColumn === panel && propertyName === 'opacity') {\n                if (elLeftColumn.visible === true && elLeftColumn.BIsTransparent()) {\n                    elLeftColumn.SetReadyForDisplay(false);\n                    elLeftColumn.visible = false;\n                    return true;\n                }\n            }\n            return false;\n        }\n        $.RegisterEventHandler('PropertyTransitionEnd', elLeftColumn, fnOnPropertyTransitionEndEvent);\n    }\n    function _FetchTournamentData() {\n        if (_m_jobFetchTournamentData)\n            return;\n        TournamentsAPI.RequestTournaments();\n        _m_jobFetchTournamentData = $.Schedule(TOURNAMENT_FETCH_DELAY, () => {\n            _m_jobFetchTournamentData = null;\n            _FetchTournamentData();\n        });\n    }\n    function _StopFetchingTournamentData() {\n        if (_m_jobFetchTournamentData) {\n            $.CancelScheduled(_m_jobFetchTournamentData);\n            _m_jobFetchTournamentData = null;\n        }\n    }\n    function _UpdateBackgroundMap() {\n        let savedMapName = GameInterfaceAPI.GetSettingString('ui_mainmenu_bkgnd_movie');\n        let backgroundMap = !savedMapName ? 'de_dust2_vanity' : savedMapName + '_vanity';\n        let elMapPanel = $('#JsMainmenu_Vanity');\n        if (!(elMapPanel && elMapPanel.IsValid())) {\n            elMapPanel = $.CreatePanel('MapVanityPreviewPanel', $('#JsMainmenu_Vanity-Container'), 'JsMainmenu_Vanity', {\n                \"require-composition-layer\": \"true\",\n                \"pin-fov\": \"vertical\",\n                class: 'align-preview',\n                camera: 'cam_default',\n                player: \"true\",\n                playermodel: \"\",\n                map: backgroundMap,\n                playername: \"vanity_character\",\n                animgraphcharactermode: 'main-menu',\n                initial_entity: 'vanity_character',\n                mouse_rotate: 'false',\n                parallax_degrees: \".5\",\n                parallax_offset: \"200.0\",\n                hittest: 'false'\n            });\n            elMapPanel.Data().loadedMap = backgroundMap;\n            elMapPanel.Data().parallax_zoomed = 50;\n            elMapPanel.Data().parallax_unzoomed = 200;\n            m_bRestartBackgroundMapSound = true;\n        }\n        else if (elMapPanel.Data().loadedMap !== backgroundMap) {\n            elMapPanel.SwitchMap(backgroundMap);\n            elMapPanel.Data().loadedMap = backgroundMap;\n            m_bRestartBackgroundMapSound = true;\n            _ResetPetZoom();\n        }\n        if (m_bRestartBackgroundMapSound) {\n            $.Schedule(0.1, function () {\n                _PlayBackgroundMapSound(savedMapName);\n            });\n            m_bRestartBackgroundMapSound = false;\n        }\n        if (backgroundMap === 'de_nuke_vanity') {\n            elMapPanel.FireEntityInput('main_light', 'SetBrightness', '2');\n            elMapPanel.FireEntityInput('main_light', 'Enable');\n        }\n        InspectModelImage.DisableItemLighting(elMapPanel);\n        _SetCSMSplitPlane0DistanceOverride(elMapPanel, backgroundMap);\n        _SetBarnlightShadowScaleOverride(elMapPanel, backgroundMap);\n        _ShowLeaderPet(elMapPanel);\n        _SetPetInteractionEnabled(elMapPanel, true);\n        return elMapPanel;\n    }\n    function _SetCSMSplitPlane0DistanceOverride(elPanel, backgroundMap) {\n        let flSplitPlane0Distance = 0.0;\n        if (backgroundMap === 'de_ancient_vanity') {\n            flSplitPlane0Distance = 80.0;\n        }\n        else if (backgroundMap === 'de_anubis_vanity') {\n            flSplitPlane0Distance = 100.0;\n        }\n        else if (backgroundMap === 'ar_baggage_vanity') {\n            flSplitPlane0Distance = 200.0;\n        }\n        else if (backgroundMap === 'de_dust2_vanity') {\n            flSplitPlane0Distance = 130.0;\n        }\n        else if (backgroundMap === 'de_inferno_vanity') {\n            flSplitPlane0Distance = 150.0;\n        }\n        else if (backgroundMap === 'cs_italy_vanity') {\n            flSplitPlane0Distance = 200.0;\n        }\n        else if (backgroundMap === 'de_mirage_vanity') {\n            flSplitPlane0Distance = 120.0;\n        }\n        else if (backgroundMap === 'de_overpass_vanity') {\n            flSplitPlane0Distance = 150.0;\n        }\n        else if (backgroundMap === 'de_vertigo_vanity') {\n            flSplitPlane0Distance = 90.0;\n        }\n        if (flSplitPlane0Distance > 0.0) {\n            elPanel.SetCSMSplitPlane0DistanceOverride(flSplitPlane0Distance);\n        }\n    }\n    function _SetBarnlightShadowScaleOverride(elPanel, backgroundMap) {\n        let flBarnlightShadowScale = 4.0;\n        if (backgroundMap === 'warehouse_vanity') {\n            flBarnlightShadowScale = 1.0;\n        }\n        else if (backgroundMap === 'de_train_vanity') {\n            flBarnlightShadowScale = 1.0;\n        }\n        if (flBarnlightShadowScale > 0.0) {\n            elPanel.SetBarnlightShadowScaleOverride(flBarnlightShadowScale);\n        }\n    }\n    let m_backgroundMapSoundHandle = null;\n    let m_bRestartBackgroundMapSound = false;\n    function _PlayBackgroundMapSound(backgroundMap) {\n        let soundName = 'UIPanorama.BG_' + backgroundMap;\n        if (m_backgroundMapSoundHandle) {\n            UiToolkitAPI.StopSoundEvent(m_backgroundMapSoundHandle, 0.1);\n            m_backgroundMapSoundHandle = null;\n        }\n        m_backgroundMapSoundHandle = UiToolkitAPI.PlaySoundEvent(soundName);\n    }\n    function _ShowLeaderPet(elMapPanel) {\n        const leaderPetItemId = elMapPanel.GetLeaderPetItemId();\n        if (!VanityPetInfo.BShouldKeepZoom(leaderPetItemId)) {\n            _ResetPetZoom();\n        }\n        if (leaderPetItemId === '0') {\n            _HidePetEntities(elMapPanel);\n        }\n        else {\n            _ShowPetEntities(elMapPanel, leaderPetItemId);\n        }\n    }\n    function _HidePetEntities(elPanel) {\n        _m_nPetUpgradeLevel = null;\n        UpdatePetInfoPanel(elPanel, '0');\n    }\n    function _ShowPetEntities(elPanel, petItemId) {\n        _m_nPetUpgradeLevel = Number(InventoryAPI.GetItemAttributeValue(petItemId, '{uint32}upgrade level'));\n        UpdatePetInfoPanel(elPanel, petItemId);\n    }\n    function UpdatePetInfoPanel(elMapPanel, petItemId) {\n        let elParent = $.GetContextPanel().FindChildInLayoutFile('MainMenuVanityInfo');\n        let elInfoPanel = VanityPetInfo.CreateOrUpdatePetInfoPanel(elParent, petItemId);\n        if (elInfoPanel) {\n            VanityPetInfo.SetZoomBtns(elMapPanel, elInfoPanel, petItemId);\n            $.GetContextPanel().FindChildInLayoutFile('MainMenuVanityParent').AddBlurPanel(elInfoPanel.FindChildInLayoutFile('vanity-pet-actions'));\n            $.GetContextPanel().FindChildInLayoutFile('MainMenuVanityParent').AddBlurPanel(elInfoPanel.FindChildInLayoutFile('id-pet-milestone-egg'));\n            $.GetContextPanel().FindChildInLayoutFile('MainMenuVanityParent').AddBlurPanel(elInfoPanel.FindChildInLayoutFile('id-pet-milestone-chick'));\n            $.GetContextPanel().FindChildInLayoutFile('MainMenuVanityParent').AddBlurPanel(elInfoPanel.FindChildInLayoutFile('id-pet-milestone-pullet'));\n            $.GetContextPanel().FindChildInLayoutFile('MainMenuVanityParent').AddBlurPanel(elInfoPanel.FindChildInLayoutFile('id-pet-milestone-hen'));\n        }\n    }\n    function _ResetPetZoom() {\n        const vanityPanel = $('#JsMainmenu_Vanity');\n        if (vanityPanel && vanityPanel.IsValid()) {\n            VanityPetInfo.ResetPetZoom(vanityPanel);\n        }\n    }\n    function _RegisterOnShowEvents() {\n        NewNewsEntryCheck.RegisterForRssReceivedEvent();\n        if (!_m_LobbyMatchmakingSessionUpdateEventHandler && !GameStateAPI.IsLocalPlayerPlayingMatch()) {\n            _m_LobbyMatchmakingSessionUpdateEventHandler = $.RegisterForUnhandledEvent(\"PanoramaComponent_Lobby_MatchmakingSessionUpdate\", _LobbyPlayerUpdated);\n            _m_LobbyPlayerUpdatedEventHandler = $.RegisterForUnhandledEvent(\"PanoramaComponent_PartyList_RebuildPartyList\", _LobbyPlayerUpdated);\n            _m_LobbyForceRestartVanityEventHandler = $.RegisterForUnhandledEvent(\"ForceRestartVanity\", _ForceRestartVanity);\n            _m_LobbyMainMenuSwitchVanityEventHandler = $.RegisterForUnhandledEvent(\"MainMenuSwitchVanity\", _SwitchVanity);\n        }\n        if (!_m_UiSceneFrameBoundaryEventHandler) {\n            _m_UiSceneFrameBoundaryEventHandler = $.RegisterForUnhandledEvent(\"UISceneFrameBoundary\", _OnUISceneFrameBoundary);\n        }\n        if (!_m_equipSlotChangedHandler) {\n            _m_equipSlotChangedHandler = $.RegisterForUnhandledEvent('PanoramaComponent_Loadout_EquipSlotChanged', _UpdateLocalPlayerVanity);\n        }\n    }\n    function _OnShowMainMenu() {\n        $.DispatchEvent('PlayMainMenuMusic', true, true);\n        GameInterfaceAPI.ResetChickenAudio();\n        m_bRestartBackgroundMapSound = true;\n        _RegisterOnShowEvents();\n        _m_bVanityAnimationAlreadyStarted = false;\n        _LobbyPlayerUpdated();\n        _OnInitFadeUp();\n        $('#MainMenuNavBarPlay').SetHasClass('pausemenu-navbar__btn-small--hidden', false);\n        _UpdateOverwatch();\n        _UpdateNotifications();\n        _UpdateInventoryBtnAlert();\n        _UpdateStoreAlert();\n        _GcLogonNotificationReceived();\n        _CheckPopupNotificationsAtLogon();\n        _UpdateUnlockCompAlert();\n        _FetchTournamentData();\n        _ShowFloatingPanels();\n        $('#MainMenuNavBarHome').checked = true;\n        if (GameTypesAPI.ShouldShowNewUserPopup()) {\n            _NewUser_ShowTrainingCompletePopup();\n        }\n        if (!_m_bPreLoadedTabs) {\n            _LoadTab('JsSettings', 'settings/settings');\n            _OpenPlayMenu();\n            OnHomeButtonPressed();\n            _m_bPreLoadedTabs = true;\n        }\n        _ResetAnnotationsDropDown();\n        _UpdateBackgroundMap();\n    }\n    function _TournamentDraftUpdate() {\n        if (!m_TournamentPickBanPopup || !m_TournamentPickBanPopup.IsValid()) {\n            m_TournamentPickBanPopup = UiToolkitAPI.ShowCustomLayoutPopup('tournament_pickban_popup', 'file://{resources}/layout/popups/popup_tournament_pickban.xml');\n        }\n    }\n    let _m_bPopupNotificationAtLogonShown = false;\n    function _CheckPopupNotificationsAtLogon() {\n        if (_m_bPopupNotificationAtLogonShown)\n            return;\n        const strNotification = MyPersonaAPI.GetTradeBanNotification();\n        if (strNotification) {\n            const refTS = 1695849359;\n            const numSTill = -NewsAPI.GetNumSecondsTillGcTimestamp(refTS);\n            const valSnooze = GameInterfaceAPI.GetSettingString('ui_notification_tb_snooze');\n            const numSnooze = valSnooze ? parseInt(valSnooze) : 0;\n            if (numSTill && (!numSnooze || Math.abs(numSTill - numSnooze) > (30 * 24 * 3600))) {\n                _m_bPopupNotificationAtLogonShown = true;\n                UiToolkitAPI.ShowGenericPopupOneOptionBgStyle(\"#SFUI_LoginPerfectWorld_Title_Info\", strNotification, \"\", \"#UI_OK\", () => { GameInterfaceAPI.SetSettingString('ui_notification_tb_snooze', '' + numSTill); }, \"dim\");\n            }\n        }\n    }\n    let _m_bGcLogonNotificationReceivedOnce = false;\n    function _GcLogonNotificationReceived() {\n        if (_m_bGcLogonNotificationReceivedOnce)\n            return;\n        const strFatalError = MyPersonaAPI.GetClientLogonFatalError();\n        if (strFatalError\n            && (strFatalError !== \"ShowGameLicenseNoOnlineLicensePW\")\n            && (strFatalError !== \"ShowGameLicenseNoOnlineLicense\")) {\n            _m_bGcLogonNotificationReceivedOnce = true;\n            if (strFatalError === \"ShowGameLicenseNeedToLinkAccountsWithMoreInfo\") {\n                UiToolkitAPI.ShowGenericPopupThreeOptionsBgStyle(\"#CSGO_Purchasable_Game_License_Short\", \"#SFUI_LoginLicenseAssist_PW_NeedToLinkAccounts_WW_hint\", \"\", \"#UI_Yes\", () => SteamOverlayAPI.OpenURL(\"https://community.csgo.com.cn/join/pwlink_csgo\"), \"#UI_No\", () => { }, \"#ShowFAQ\", () => _OnGcLogonNotificationReceived_ShowFaqCallback(), \"dim\");\n            }\n            else if (strFatalError === \"ShowGameLicenseNeedToLinkAccounts\") {\n                _OnGcLogonNotificationReceived_ShowLicenseYesNoBox(\"#SFUI_LoginLicenseAssist_PW_NeedToLinkAccounts\", \"https://community.csgo.com.cn/join/pwlink_csgo\");\n            }\n            else if (strFatalError === \"ShowGameLicenseHasLicensePW\") {\n                _OnGcLogonNotificationReceived_ShowLicenseYesNoBox(\"#SFUI_LoginLicenseAssist_HasLicense_PW\", \"https://community.csgo.com.cn/join/pwlink_csgo?needlicense=1\");\n            }\n            else if (strFatalError === \"ShowGameLicenseNoOnlineLicensePW\") {\n            }\n            else if (strFatalError === \"ShowGameLicenseNoOnlineLicense\") {\n            }\n            else {\n                UiToolkitAPI.ShowGenericPopupOneOptionBgStyle(\"#SFUI_LoginPerfectWorld_Title_Error\", strFatalError, \"\", \"#GameUI_Quit\", () => GameInterfaceAPI.ConsoleCommand(\"quit\"), \"dim\");\n            }\n            return;\n        }\n        const nAntiAddictionTrackingState = MyPersonaAPI.GetTimePlayedTrackingState();\n        if (nAntiAddictionTrackingState > 0) {\n            _m_bGcLogonNotificationReceivedOnce = true;\n            const pszDialogTitle = \"#SFUI_LoginPerfectWorld_Title_Info\";\n            let pszDialogMessageText = \"#SFUI_LoginPerfectWorld_AntiAddiction1\";\n            let pszOverlayUrlToOpen = null;\n            if (nAntiAddictionTrackingState != 2) {\n                pszDialogMessageText = \"#SFUI_LoginPerfectWorld_AntiAddiction2\";\n                pszOverlayUrlToOpen = \"https://community.csgo.com.cn/join/pwcompleteaccountinfo\";\n            }\n            if (pszOverlayUrlToOpen) {\n                UiToolkitAPI.ShowGenericPopupYesNo(pszDialogTitle, pszDialogMessageText, \"\", () => SteamOverlayAPI.OpenURL(pszOverlayUrlToOpen), () => { });\n            }\n            else {\n                UiToolkitAPI.ShowGenericPopup(pszDialogTitle, pszDialogMessageText, \"\");\n            }\n            return;\n        }\n    }\n    let _m_numGameMustExitNowForAntiAddictionHandled = 0;\n    let _m_panelGameMustExitDialog = null;\n    function _GameMustExitNowForAntiAddiction() {\n        if (_m_panelGameMustExitDialog && _m_panelGameMustExitDialog.IsValid())\n            return;\n        if (_m_numGameMustExitNowForAntiAddictionHandled >= 100)\n            return;\n        ++_m_numGameMustExitNowForAntiAddictionHandled;\n        _m_panelGameMustExitDialog =\n            UiToolkitAPI.ShowGenericPopupOneOptionBgStyle(\"#GameUI_QuitConfirmationTitle\", \"#UI_AntiAddiction_ExitGameNowMessage\", \"\", \"#GameUI_Quit\", () => GameInterfaceAPI.ConsoleCommand(\"quit\"), \"dim\");\n    }\n    function _OnGcLogonNotificationReceived_ShowLicenseYesNoBox(strTextMessage, pszOverlayUrlToOpen) {\n        UiToolkitAPI.ShowGenericPopupTwoOptionsBgStyle(\"#CSGO_Purchasable_Game_License_Short\", strTextMessage, \"\", \"#UI_Yes\", () => SteamOverlayAPI.OpenURL(pszOverlayUrlToOpen), \"#UI_No\", () => { }, \"dim\");\n    }\n    function _OnGcLogonNotificationReceived_ShowFaqCallback() {\n        SteamOverlayAPI.OpenURL(\"https://support.steampowered.com/kb_article.php?ref=6026-IFKZ-7043&l=schinese\");\n        _m_bGcLogonNotificationReceivedOnce = false;\n        _GcLogonNotificationReceived();\n    }\n    function _OnHideMainMenu() {\n        const vanityPanel = $('#JsMainmenu_Vanity');\n        if (vanityPanel) {\n            CharacterAnims.CancelScheduledAnim(vanityPanel);\n        }\n        _m_elContentPanel.RemoveClass('mainmenu-content--animate');\n        _m_elContentPanel.AddClass('mainmenu-content--offscreen');\n        _CancelNotificationSchedule();\n        _UnregisterShowEvents();\n        _CloseAllVisiblePopups();\n        _StopFetchingTournamentData();\n        if (vanityPanel) {\n            _SetPetInteractionEnabled(vanityPanel, false);\n        }\n    }\n    function _UnregisterShowEvents() {\n        NewNewsEntryCheck.UnRegisterForRssReceivedEvent();\n        if (_m_LobbyMatchmakingSessionUpdateEventHandler) {\n            $.UnregisterForUnhandledEvent(\"PanoramaComponent_Lobby_MatchmakingSessionUpdate\", _m_LobbyMatchmakingSessionUpdateEventHandler);\n            _m_LobbyMatchmakingSessionUpdateEventHandler = null;\n        }\n        if (_m_LobbyPlayerUpdatedEventHandler) {\n            $.UnregisterForUnhandledEvent(\"PanoramaComponent_PartyList_RebuildPartyList\", _m_LobbyPlayerUpdatedEventHandler);\n            _m_LobbyPlayerUpdatedEventHandler = null;\n        }\n        if (_m_LobbyForceRestartVanityEventHandler) {\n            $.UnregisterForUnhandledEvent(\"ForceRestartVanity\", _m_LobbyForceRestartVanityEventHandler);\n            _m_LobbyForceRestartVanityEventHandler = null;\n        }\n        if (_m_LobbyMainMenuSwitchVanityEventHandler) {\n            $.UnregisterForUnhandledEvent(\"MainMenuSwitchVanity\", _m_LobbyMainMenuSwitchVanityEventHandler);\n            _m_LobbyMainMenuSwitchVanityEventHandler = null;\n        }\n        if (_m_UiSceneFrameBoundaryEventHandler) {\n            $.UnregisterForUnhandledEvent(\"UISceneFrameBoundary\", _m_UiSceneFrameBoundaryEventHandler);\n            _m_UiSceneFrameBoundaryEventHandler = null;\n        }\n        if (_m_equipSlotChangedHandler) {\n            $.UnregisterForUnhandledEvent(\"PanoramaComponent_Loadout_EquipSlotChanged\", _m_equipSlotChangedHandler);\n            _m_equipSlotChangedHandler = null;\n        }\n    }\n    function _OnShowPauseMenu() {\n        const elContextPanel = $.GetContextPanel();\n        elContextPanel.AddClass('MainMenuRootPanel--PauseMenuMode');\n        elContextPanel.SetHasClass('MainMenuRootPanel--PauseMenuDuringDemoPlayback', GameStateAPI.IsDemoOrHltv());\n        $('#id-pausemenu-mission-panel').SetHasClass('hide-non-prime', MyPersonaAPI.GetElevatedState() != 'elevated');\n        const bQueuedMatchmaking = GameStateAPI.IsQueuedMatchmaking();\n        const bGotvSpectating = elContextPanel.IsGotvSpectating();\n        const bIsCommunityServer = !_m_bPerfectWorld && MatchStatsAPI.IsConnectedToCommunityServer();\n        $('#MainMenuNavBarPlay').SetHasClass('pausemenu-navbar__btn-small--hidden', true);\n        $('#MainMenuNavBarSwitchTeams').SetHasClass('pausemenu-navbar__btn-small--hidden', (bQueuedMatchmaking || bGotvSpectating));\n        $('#MainMenuNavBarVote').SetHasClass('pausemenu-navbar__btn-small--hidden', (bGotvSpectating));\n        $('#MainMenuNavBarReportServer').SetHasClass('pausemenu-navbar__btn-small--hidden', !bIsCommunityServer);\n        OnHomeButtonPressed();\n        _SetupAnnotationOptions(false);\n    }\n    function _ResetAnnotationsDropDown() {\n        let elAnnotationDropDown = $('#id-play-menu-pausemenu-annotations-dropdown');\n        elAnnotationDropDown.SetSelectedIndex(0);\n        elAnnotationDropDown.Data().m_mapBspName = \"\";\n    }\n    function _EnableGuidesDropdown() {\n        let elAnnotationsInternal = $(\"#id-play-menu-pausemenu-annotations__internal\");\n        let elAnnotationDropDown = $('#id-play-menu-pausemenu-annotations-dropdown');\n        let elAnnotationsRoundRestrictionLabel = $('#id-play-menu-pausemenu-annotations-roundrestricted');\n        elAnnotationsInternal.enabled = true;\n        elAnnotationsInternal.visible = true;\n        elAnnotationDropDown.visible = true;\n        elAnnotationsRoundRestrictionLabel.visible = false;\n    }\n    function _DisableGuidesDropdown() {\n        let elAnnotationsInternal = $(\"#id-play-menu-pausemenu-annotations__internal\");\n        let elAnnotationDropDown = $('#id-play-menu-pausemenu-annotations-dropdown');\n        let elAnnotationsRoundRestrictionLabel = $('#id-play-menu-pausemenu-annotations-roundrestricted');\n        elAnnotationsInternal.enabled = false;\n        elAnnotationsInternal.visible = false;\n        elAnnotationDropDown.visible = false;\n        elAnnotationsRoundRestrictionLabel.visible = false;\n    }\n    function _RoundRestrictedGuidesDropdown() {\n        let elAnnotationsInternal = $(\"#id-play-menu-pausemenu-annotations__internal\");\n        let elAnnotationDropDown = $('#id-play-menu-pausemenu-annotations-dropdown');\n        let elAnnotationsRoundRestrictionLabel = $('#id-play-menu-pausemenu-annotations-roundrestricted');\n        elAnnotationsInternal.enabled = false;\n        elAnnotationsInternal.visible = true;\n        elAnnotationDropDown.visible = false;\n        elAnnotationsRoundRestrictionLabel.visible = true;\n        let nMaxRound = GameInterfaceAPI.GetSettingString('sv_annotation_limits_max_rounds_per_half');\n        elAnnotationsRoundRestrictionLabel.SetDialogVariable('rounds', nMaxRound);\n    }\n    function _SetupAnnotationOptions(bForce) {\n        switch (GameStateAPI.GetAnnotationsViewingLevel()) {\n            case 3:\n            case 2:\n                _EnableGuidesDropdown();\n                break;\n            case 1:\n                _RoundRestrictedGuidesDropdown();\n                break;\n            case 0:\n                _DisableGuidesDropdown();\n                break;\n        }\n        let elAnnotationDropDown = $('#id-play-menu-pausemenu-annotations-dropdown');\n        if (elAnnotationDropDown.Data().m_mapBspName !== GameStateAPI.GetMapBSPName() ||\n            bForce) {\n            elAnnotationDropDown.RebuildOptions(GameStateAPI.GetMapBSPName(), true);\n            elAnnotationDropDown.Data().m_mapBspName = GameStateAPI.GetMapBSPName();\n        }\n    }\n    function _OnHidePauseMenu() {\n        $.GetContextPanel().RemoveClass('MainMenuRootPanel--PauseMenuMode');\n        $.GetContextPanel().SetHasClass('MainMenuRootPanel--PauseMenuDuringDemoPlayback', false);\n        _DeletePauseMenuMissionPanel();\n        OnHomeButtonPressed();\n    }\n    function _BCheckTabCanBeOpenedRightNow(tab) {\n        if (tab === 'JsInventory' || tab === 'JsMainMenuStore' || tab === 'JsLoadout') {\n            const restrictions = LicenseUtil.GetCurrentLicenseRestrictions();\n            if (restrictions !== false) {\n                LicenseUtil.ShowLicenseRestrictions(restrictions);\n                return false;\n            }\n        }\n        if (tab === 'JsInventory' || tab === 'JsPlayerStats' || tab === 'JsLoadout' || tab === 'JsMainMenuStore') {\n            if (!MyPersonaAPI.IsInventoryValid() || !MyPersonaAPI.IsConnectedToGC()) {\n                UiToolkitAPI.ShowGenericPopupOk($.Localize('#SFUI_SteamConnectionErrorTitle'), $.Localize('#SFUI_Steam_Error_LinkUnexpected'), '', () => { });\n                return false;\n            }\n        }\n        return true;\n    }\n    function _LoadTab(tab, XmlName, setActiveSection = '') {\n        if (!$.GetContextPanel().FindChildInLayoutFile(tab)) {\n            const newPanel = $.CreatePanel('Panel', _m_elContentPanel, tab);\n            if (setActiveSection !== '') {\n                newPanel.SetAttributeString('set-active-section', setActiveSection);\n            }\n            newPanel.BLoadLayout('file://{resources}/layout/' + XmlName + '.xml', false, false);\n            newPanel.SetReadyForDisplay(false);\n            newPanel.RegisterForReadyEvents(true);\n            $.RegisterEventHandler('PropertyTransitionEnd', newPanel, (panel, propertyName) => {\n                if (newPanel.id === panel.id && propertyName === 'opacity') {\n                    if (newPanel.visible === true && newPanel.BIsTransparent()) {\n                        newPanel.SetReadyForDisplay(false);\n                        newPanel.visible = false;\n                        return true;\n                    }\n                    else if (newPanel.visible === true) {\n                        $.DispatchEvent('MainMenuTabShown', tab);\n                    }\n                }\n                return false;\n            });\n            newPanel.AddClass('mainmenu-content--hidden');\n            newPanel.visible = false;\n        }\n    }\n    function NavigateToTab(tab, XmlName, setActiveSection = '') {\n        if (!_BCheckTabCanBeOpenedRightNow(tab)) {\n            OnHomeButtonPressed();\n            return;\n        }\n        if (tab === 'JsPlayerStats') {\n            return;\n        }\n        $.DispatchEvent('PlayMainMenuMusic', true, false);\n        GameInterfaceAPI.SetSettingString('panorama_play_movie_ambient_sound', '0');\n        _LoadTab(tab, XmlName, setActiveSection);\n        ParticleControls.UpdateMainMenuTopBar(m_MainMenuTopBarParticleFX, tab);\n        if (_m_activeTab !== tab) {\n            if (XmlName && _m_bPreLoadedTabs) {\n                let soundName = '';\n                if (XmlName === 'mainmenu_store_fullscreen') {\n                    if (setActiveSection !== '') {\n                        $.GetContextPanel().FindChildInLayoutFile(tab).SetAttributeString('set-active-section', setActiveSection);\n                    }\n                    soundName = 'UIPanorama.tab_mainmenu_shop';\n                    $.DispatchEvent('UpdateXpShop');\n                }\n                else if (XmlName === 'loadout_grid') {\n                    soundName = 'UIPanorama.tab_mainmenu_loadout';\n                }\n                else {\n                    soundName = 'tab_' + XmlName.replace('/', '_');\n                }\n                $.DispatchEvent('CSGOPlaySoundEffect', soundName, 'MOUSE');\n            }\n            if (_m_activeTab) {\n                $.GetContextPanel().CancelDrag();\n                const panelToHide = $.GetContextPanel().FindChildInLayoutFile(_m_activeTab);\n                panelToHide.AddClass('mainmenu-content--hidden');\n            }\n            _m_activeTab = tab;\n            const activePanel = $.GetContextPanel().FindChildInLayoutFile(tab);\n            activePanel.RemoveClass('mainmenu-content--hidden');\n            activePanel.visible = true;\n            activePanel.SetReadyForDisplay(true);\n        }\n        _ShowContentPanel();\n    }\n    MainMenu.NavigateToTab = NavigateToTab;\n    function _UpdateChickenAudioForContentPanel(bContentPanelOpen) {\n        GameInterfaceAPI.SetChickenAudioSuppressed('mainmenu_content', bContentPanelOpen);\n    }\n    function _ShowContentPanel() {\n        if (_m_elContentPanel.BHasClass('mainmenu-content--offscreen')) {\n            _m_elContentPanel.AddClass('mainmenu-content--animate');\n            _m_elContentPanel.RemoveClass('mainmenu-content--offscreen');\n            _m_elContentPanel.SetFocus();\n        }\n        $.GetContextPanel().AddClass(\"mainmenu-content--open\");\n        _UpdateChickenAudioForContentPanel(true);\n        $.DispatchEvent('ShowContentPanel');\n        _DimMainMenuBackground(false);\n        _HideFloatingPanels();\n    }\n    function _OnHideContentPanel() {\n        _m_elContentPanel.AddClass('mainmenu-content--animate');\n        _m_elContentPanel.AddClass('mainmenu-content--offscreen');\n        $.GetContextPanel().RemoveClass(\"mainmenu-content--open\");\n        _UpdateChickenAudioForContentPanel(false);\n        const elActiveNavBarBtn = _GetActiveNavBarButton();\n        if (elActiveNavBarBtn && elActiveNavBarBtn.id !== 'MainMenuNavBarHome') {\n            elActiveNavBarBtn.checked = false;\n        }\n        _DimMainMenuBackground(true);\n        if (_m_activeTab) {\n            $.GetContextPanel().CancelDrag();\n            const panelToHide = $.GetContextPanel().FindChildInLayoutFile(_m_activeTab);\n            panelToHide.AddClass('mainmenu-content--hidden');\n        }\n        _m_activeTab = '';\n        _ShowFloatingPanels();\n    }\n    function _OnShowFullScreenOpaquePopup() {\n        $('#MainMenuInput').SetHasClass('HiddenByPopup', true);\n    }\n    function _OnCloseAllFullScreenOpaquePopups() {\n        $('#MainMenuInput').SetHasClass('HiddenByPopup', false);\n    }\n    function _GetActiveNavBarButton() {\n        const elNavBar = $('#MainMenuNavBarTop');\n        const children = elNavBar.Children();\n        const count = children.length;\n        for (let i = 0; i < count; i++) {\n            if (children[i].IsSelected()) {\n                return children[i];\n            }\n        }\n    }\n    function ExpandSidebar(AutoClose = false) {\n        const elSidebar = $('#JsMainMenuSidebar');\n        if (elSidebar.BHasClass('mainmenu-sidebar--minimized')) {\n            $.DispatchEvent('CSGOPlaySoundEffect', 'sidemenu_slidein', 'MOUSE');\n        }\n        elSidebar.RemoveClass('mainmenu-sidebar--minimized');\n        _SlideSearchPartyParticles(true);\n        $.DispatchEvent('SidebarIsCollapsed', false);\n        _DimMainMenuBackground(false);\n        if (AutoClose) {\n            $.Schedule(1, MinimizeSidebar);\n        }\n    }\n    MainMenu.ExpandSidebar = ExpandSidebar;\n    function MinimizeSidebar() {\n        if (_m_elContentPanel == null) {\n            return;\n        }\n        if (_m_sideBarElementContextMenuActive) {\n            return;\n        }\n        const elSidebar = $('#JsMainMenuSidebar');\n        if (!elSidebar.BHasClass('mainmenu-sidebar--minimized')) {\n            $.DispatchEvent('CSGOPlaySoundEffect', 'sidemenu_slideout', 'MOUSE');\n        }\n        elSidebar.AddClass('mainmenu-sidebar--minimized');\n        _SlideSearchPartyParticles(false);\n        $.DispatchEvent('SidebarIsCollapsed', true);\n        _DimMainMenuBackground(true);\n    }\n    MainMenu.MinimizeSidebar = MinimizeSidebar;\n    function _OnSideBarElementContextMenuActive(bActive) {\n        _m_sideBarElementContextMenuActive = bActive;\n        $.Schedule(0.25, () => {\n            if (!$('#JsMainMenuSidebar').BHasHoverStyle())\n                MinimizeSidebar();\n        });\n        _DimMainMenuBackground(false);\n    }\n    function _DimMainMenuBackground(removeDim) {\n        if (removeDim && _m_elContentPanel.BHasClass('mainmenu-content--offscreen') &&\n            $('#mainmenu-content__blur-target').BHasHoverStyle() === false) {\n            $('#MainMenuBackground').RemoveClass('Dim');\n        }\n        else\n            $('#MainMenuBackground').AddClass('Dim');\n    }\n    function OnHomeButtonPressed() {\n        $.DispatchEvent('HideContentPanel');\n        ParticleControls.UpdateMainMenuTopBar(m_MainMenuTopBarParticleFX, '');\n        const vanityPanel = $('#JsMainmenu_Vanity');\n        if (vanityPanel && vanityPanel.IsValid()) {\n            vanityPanel.Pause();\n            _ResetPetZoom();\n        }\n        $('#MainMenuNavBarHome').checked = true;\n        _CheckRankUpRedemptionStore();\n    }\n    MainMenu.OnHomeButtonPressed = OnHomeButtonPressed;\n    function OnQuitButtonPressed() {\n        UiToolkitAPI.ShowGenericPopupOneOptionCustomCancelBgStyle('#UI_ConfirmExitTitle', '#UI_ConfirmExitMessage', '', '#UI_Quit', () => QuitGame('Option1'), '#UI_Return', () => { }, 'dim');\n    }\n    MainMenu.OnQuitButtonPressed = OnQuitButtonPressed;\n    function QuitGame(msg) {\n        GameInterfaceAPI.ConsoleCommand('quit');\n    }\n    function _InitFriendsList() {\n        const friendsList = $.CreatePanel('Panel', $.FindChildInContext('#mainmenu-sidebar__blur-target'), 'JsFriendsList');\n        friendsList.BLoadLayout('file://{resources}/layout/friendslist.xml', false, false);\n    }\n    function _HideMainMenuNewsPanel() {\n        const elNews = $.FindChildInContext('#JsNewsContainer');\n        elNews.SetHasClass('news-panel--hide-news-panel', true);\n        elNews.SetHasClass('news-panel-style-feature-panel-visible', false);\n    }\n    function _ShowFloatingPanels() {\n        $.FindChildInContext('#JsLeftColumn').SetHasClass('hidden', false);\n        $.FindChildInContext('#JsRightColumn').SetHasClass('hidden', false);\n        $.FindChildInContext('#MainMenuVanityInfo').SetHasClass('hidden', false);\n    }\n    function _HideFloatingPanels() {\n        $.FindChildInContext('#JsLeftColumn').SetHasClass('hidden', true);\n        $.FindChildInContext('#JsRightColumn').SetHasClass('hidden', true);\n        $.FindChildInContext('#MainMenuVanityInfo').SetHasClass('hidden', true);\n    }\n    function _OnSteamIsPlaying() {\n        const elNewsContainer = $.FindChildInContext('#JsNewsContainer');\n        if (elNewsContainer) {\n            elNewsContainer.SetHasClass('mainmenu-news-container-stream-active', EmbeddedStreamAPI.IsVideoPlaying());\n        }\n    }\n    function _ResetNewsEntryStyle() {\n        const elNewsContainer = $.FindChildInContext('#JsNewsContainer');\n        if (elNewsContainer) {\n            elNewsContainer.RemoveClass('mainmenu-news-container-stream-active');\n        }\n    }\n    function _UpdatePartySearchParticlesType(isPremier) {\n        const particle_container = $('#party-search-particles');\n        if (isPremier) {\n            particle_container.SetParticleNameAndRefresh(\"particles/ui/ui_mainmenu_active_search_gold.vpcf\");\n        }\n        else {\n            particle_container.SetParticleNameAndRefresh(\"particles/ui/ui_mainmenu_active_search.vpcf\");\n        }\n    }\n    function _UpdatePartySearchSetControlPointParticles(cpArray) {\n        const particle_container = $('#party-search-particles');\n        particle_container.StopParticlesImmediately(true);\n        particle_container.StartParticles();\n        for (const [cp, xpos, ypos, zpos] of cpArray) {\n            particle_container.SetControlPoint(cp, xpos, ypos, zpos);\n        }\n        m_isParticleActive = true;\n    }\n    let m_verticalSpread = 0;\n    let m_isParticleActive = false;\n    function _UpdatePartySearchParticles() {\n        const particle_container = $('#party-search-particles');\n        if (particle_container.type !== \"ParticleScenePanel\")\n            return;\n        let AddServerErrors = 0;\n        let serverWarning = NewsAPI.GetCurrentActiveAlertForUser();\n        let isWarning = serverWarning !== '' && serverWarning !== undefined ? true : false;\n        let bAttemptPremierMode = LobbyAPI.GetSessionSettings()?.game?.mode_ui === 'premier';\n        if (isWarning)\n            AddServerErrors = 5;\n        let strStatus = LobbyAPI.GetMatchmakingStatusString();\n        const bShowParticles = strStatus != null && (strStatus.endsWith(\"searching\") || strStatus.endsWith(\"registering\") || strStatus.endsWith(\"reserved\"));\n        if (!bShowParticles) {\n            if (m_isParticleActive) {\n                particle_container.StopParticlesImmediately(true);\n                m_isParticleActive = false;\n            }\n            return;\n        }\n        let verticlSpread = 14 + (PartyListAPI.GetCount() - 1) * 5 + AddServerErrors;\n        if (m_verticalSpread === verticlSpread && m_isParticleActive)\n            return;\n        _UpdatePartySearchParticlesType(bAttemptPremierMode);\n        m_verticalSpread = verticlSpread;\n        let CpArray = [\n            [1, verticlSpread, .5, 1],\n            [2, 1, .25, 0],\n            [16, 15, 230, 15],\n        ];\n        _UpdatePartySearchSetControlPointParticles(CpArray);\n    }\n    function _ForceRestartVanity() {\n        if (GameStateAPI.IsLocalPlayerPlayingMatch()) {\n            return;\n        }\n        _m_bVanityAnimationAlreadyStarted = false;\n        _InitVanity();\n    }\n    let m_aDisplayLobbyVanityData = [];\n    function _InitVanity() {\n        if (MatchStatsAPI.GetUiExperienceType()) {\n            return;\n        }\n        if (!MyPersonaAPI.IsInventoryValid()) {\n            if (MyPersonaAPI.GetClientLogonFatalError()) {\n                _ShowVanity();\n            }\n            return;\n        }\n        if (_m_bVanityAnimationAlreadyStarted) {\n            return;\n        }\n        _ShowVanity();\n    }\n    function _ShowVanity() {\n        const vanityPanel = $('#JsMainmenu_Vanity');\n        if (!vanityPanel) {\n            return;\n        }\n        _m_bVanityAnimationAlreadyStarted = true;\n        if (vanityPanel.BHasClass('hidden')) {\n            vanityPanel.RemoveClass('hidden');\n        }\n        _UpdateLocalPlayerVanity();\n    }\n    function _ShowDebugLobbyModels() {\n    }\n    function _UpdateLocalPlayerVanity() {\n        const oSettings = ItemInfo.GetOrUpdateVanityCharacterSettings();\n        const oLocalPlayer = m_aDisplayLobbyVanityData.filter(storedEntry => { return storedEntry.isLocalPlayer === true; });\n        if (oLocalPlayer.length > 0 && (oLocalPlayer[0].playeridx > (_m_maxMainMenuDisplayAgents - 1))) {\n            return;\n        }\n        oSettings.playeridx = oLocalPlayer.length > 0 ? oLocalPlayer[0].playeridx : 0;\n        oSettings.xuid = MyPersonaAPI.GetXuid();\n        oSettings.isLocalPlayer = true;\n        _ApplyVanitySettingsToLobbyMetadata(oSettings);\n        _UpdatePlayerVanityModel(oSettings);\n        _CreateUpdateVanityInfo(oSettings);\n    }\n    function _ApplyVanitySettingsToLobbyMetadata(oSettings) {\n        PartyListAPI.SetLocalPlayerVanityPresence(oSettings.team, oSettings.charItemId, oSettings.glovesItemId, oSettings.loadoutSlot, oSettings.weaponItemId, oSettings.petItemId);\n    }\n    function _UpdatePlayerVanityModel(oSettings) {\n        const vanityPanel = _UpdateBackgroundMap();\n        vanityPanel.SetActiveCharacter(oSettings.playeridx);\n        oSettings.panel = vanityPanel;\n        if (!!oSettings.petItemId && Number(oSettings.petItemId) != 0) {\n            if (oSettings.playeridx === 0) {\n                _ShowPetEntities(vanityPanel, oSettings.petItemId);\n                vanityPanel.SetPetPlacement('main-menu-foreground');\n            }\n            else\n                vanityPanel.SetPetPlacement('main-menu-background');\n        }\n        else {\n            if (oSettings.playeridx === 0)\n                _HidePetEntities(vanityPanel);\n            vanityPanel.SetPetPlacement('none');\n        }\n        CharacterAnims.PlayAnimsOnPanel(oSettings);\n    }\n    function _CreateUpdateVanityInfo(oSettings) {\n        $.Schedule(.1, () => {\n            const elVanityPlayerInfo = VanityPlayerInfo.CreateOrUpdateVanityInfoPanel($.GetContextPanel().FindChildInLayoutFile('MainMenuVanityInfo'), oSettings);\n            if (elVanityPlayerInfo) {\n                $.GetContextPanel().FindChildInLayoutFile('MainMenuVanityParent').AddBlurPanel(elVanityPlayerInfo.FindChildInLayoutFile('vanity-info-container'));\n                let defName = '';\n                let weaponId = oSettings.weaponItemId\n                    ? oSettings.weaponItemId\n                    : (oSettings.hasOwnProperty('vanity_data') && oSettings.vanity_data)\n                        ? oSettings.vanity_data.split(',')[4]\n                        : '';\n                let team = oSettings.hasOwnProperty('team') && oSettings.team\n                    ? oSettings.team\n                    : (oSettings.hasOwnProperty('vanity_data') && oSettings.vanity_data)\n                        ? oSettings.vanity_data.split(',')[0]\n                        : '';\n                if (weaponId) {\n                    defName = InventoryAPI.GetItemDefinitionName(weaponId);\n                }\n                elVanityPlayerInfo.SetHasClass('move-up', (defName === 'weapon_negev' || defName === 'weapon_m249') && team === 'ct');\n            }\n        });\n    }\n    function _LobbyPlayerUpdated() {\n        _UpdatePartySearchParticles();\n        let numPlayersActuallyInParty = PartyListAPI.GetCount();\n        if (!LobbyAPI.IsSessionActive() || MatchStatsAPI.GetUiExperienceType() || numPlayersActuallyInParty < 1 || !numPlayersActuallyInParty) {\n            _ClearLobbyPlayers();\n            _m_bVanityAnimationAlreadyStarted = false;\n            $.Schedule(.1, _InitVanity);\n            return;\n        }\n        const aCurrentLobbyVanityData = [];\n        if (numPlayersActuallyInParty > 0) {\n            numPlayersActuallyInParty = (numPlayersActuallyInParty > _m_maxMainMenuDisplayAgents) ? _m_maxMainMenuDisplayAgents : numPlayersActuallyInParty;\n            for (let k = 0; k < numPlayersActuallyInParty; k++) {\n                const xuid = PartyListAPI.GetXuidByIndex(k);\n                aCurrentLobbyVanityData.push({\n                    xuid: xuid,\n                    isLocalPlayer: xuid === MyPersonaAPI.GetXuid(),\n                    playeridx: k,\n                    vanity_data: PartyListAPI.GetPartyMemberVanity(xuid)\n                });\n            }\n            _CompareLobbyPlayers(aCurrentLobbyVanityData);\n        }\n        else {\n            _ClearLobbyPlayers();\n            _ForceRestartVanity();\n        }\n    }\n    function _CompareLobbyPlayers(aCurrentLobbyVanityData) {\n        for (let i = 0; i < _m_maxMainMenuDisplayAgents; i++) {\n            if (aCurrentLobbyVanityData[i]) {\n                if (!m_aDisplayLobbyVanityData[i]) {\n                    m_aDisplayLobbyVanityData[i] = {\n                        xuid: \"\",\n                        playeridx: 0,\n                        vanity_data: \"\",\n                        isLocalPlayer: false\n                    };\n                }\n                m_aDisplayLobbyVanityData[i].playeridx = aCurrentLobbyVanityData[i].playeridx;\n                m_aDisplayLobbyVanityData[i].isLocalPlayer = aCurrentLobbyVanityData[i].isLocalPlayer;\n                if (m_aDisplayLobbyVanityData[i].xuid !== aCurrentLobbyVanityData[i].xuid) {\n                    VanityPlayerInfo.DeleteVanityInfoPanel($.GetContextPanel().FindChildInLayoutFile('MainMenuVanityInfo'), aCurrentLobbyVanityData[i].playeridx);\n                    if (aCurrentLobbyVanityData[i].isLocalPlayer) {\n                        _UpdateLocalPlayerVanity();\n                    }\n                }\n                m_aDisplayLobbyVanityData[i].xuid = aCurrentLobbyVanityData[i].xuid;\n                if (m_aDisplayLobbyVanityData[i].vanity_data !== aCurrentLobbyVanityData[i].vanity_data) {\n                    if (!aCurrentLobbyVanityData[i].isLocalPlayer && aCurrentLobbyVanityData[i].vanity_data) {\n                        _UpdateVanityFromLobbyUpdate(aCurrentLobbyVanityData[i].vanity_data, aCurrentLobbyVanityData[i].playeridx, aCurrentLobbyVanityData[i].xuid);\n                    }\n                }\n                _CreateUpdateVanityInfo(aCurrentLobbyVanityData[i]);\n                m_aDisplayLobbyVanityData[i].vanity_data = aCurrentLobbyVanityData[i].vanity_data;\n            }\n            else if (m_aDisplayLobbyVanityData[i]) {\n                _ClearLobbyVanityModel(m_aDisplayLobbyVanityData[i].playeridx);\n                delete m_aDisplayLobbyVanityData[i];\n            }\n        }\n    }\n    function _ClearLobbyPlayers() {\n        for (let i = 0; i < m_aDisplayLobbyVanityData.length; ++i) {\n            _ClearLobbyVanityModel(i);\n        }\n        m_aDisplayLobbyVanityData = [];\n    }\n    function _ClearLobbyVanityModel(index) {\n        VanityPlayerInfo.DeleteVanityInfoPanel($.GetContextPanel().FindChildInLayoutFile('MainMenuVanityInfo'), index);\n        $('#JsMainmenu_Vanity').SetActiveCharacter(index);\n        $('#JsMainmenu_Vanity').RemoveCharacterModel();\n    }\n    function _UpdateVanityFromLobbyUpdate(strVanityData, index, xuid) {\n        const arrVanityInfo = strVanityData.split(',');\n        const oSettings = {\n            xuid: xuid,\n            team: arrVanityInfo[0],\n            charItemId: arrVanityInfo[1],\n            glovesItemId: arrVanityInfo[2],\n            loadoutSlot: arrVanityInfo[3],\n            weaponItemId: arrVanityInfo[4],\n            petItemId: arrVanityInfo[5],\n            playeridx: index\n        };\n        _UpdatePlayerVanityModel(oSettings);\n    }\n    function _PlayerActivityVoice(xuid) {\n        const vanityPanel = $('#MainMenuVanityInfo');\n        const elAvatar = vanityPanel.FindChildTraverse('JsPlayerVanityAvatar-' + xuid);\n        if (elAvatar && elAvatar.IsValid()) {\n            VanityPlayerInfo.UpdateVoiceIcon(elAvatar, xuid);\n        }\n    }\n    function _OnUISceneFrameBoundary() {\n        const elVanityPanel = $('#JsMainmenu_Vanity');\n        if (elVanityPanel && elVanityPanel.IsValid()) {\n            const elVanityPlayerInfoParent = $.GetContextPanel().FindChildInLayoutFile('MainMenuVanityInfo');\n            for (let i = 0; i < _m_maxMainMenuDisplayAgents; i++) {\n                if (elVanityPanel.SetActiveCharacter(i) === true) {\n                    const oPanelPos = elVanityPanel.GetBonePositionInPanelSpace((i === 0) ? 'pelvis' : 'head_0');\n                    oPanelPos.y -= 0.0;\n                    VanityPlayerInfo.SetVanityInfoPanelPos(elVanityPlayerInfoParent, i, oPanelPos, \"id-player-vanity-info-\" + i);\n                    if (i === 0) {\n                        let oPetPanelPos;\n                        if (_m_nPetUpgradeLevel === 0) {\n                            oPetPanelPos = elVanityPanel.GetPetBonePositionInPanelSpace('egg');\n                            oPetPanelPos.y -= 0.0;\n                            VanityPetInfo.SetVanityPetInfoPos(elVanityPlayerInfoParent, oPetPanelPos);\n                        }\n                        else if (_m_nPetUpgradeLevel && _m_nPetUpgradeLevel > 0) {\n                            oPetPanelPos = elVanityPanel.GetPetBonePositionInPanelSpace('root_motion');\n                            oPetPanelPos.y -= 0.0;\n                            VanityPetInfo.SetVanityPetInfoPos(elVanityPlayerInfoParent, oPetPanelPos);\n                        }\n                    }\n                }\n            }\n        }\n        if (GameInterfaceAPI.IsAppActive()) {\n            _m_nActiveFrameCount++;\n            if (_m_nActiveFrameCount == 100 && !_m_bTriedShowVideoSettingRecommendation) {\n                VideoSettingRecommendations.MaybeShowPopup();\n                _m_bTriedShowVideoSettingRecommendation = true;\n            }\n        }\n        else {\n            _m_nActiveFrameCount = 0;\n        }\n    }\n    function _OpenPlayMenu() {\n        if (MatchStatsAPI.GetUiExperienceType())\n            return;\n        _InsureSessionCreated();\n        NavigateToTab('JsPlay', 'mainmenu_play');\n    }\n    function _OpenWatchMenu() {\n        NavigateToTab('JsWatch', 'mainmenu_watch');\n    }\n    function _OpenInventory() {\n        NavigateToTab('JsInventory', 'mainmenu_inventory');\n    }\n    function _OpenFullscreenStore(openToSection = '') {\n        NavigateToTab('JsMainMenuStore', 'mainmenu_store_fullscreen', openToSection !== '' ? openToSection : 'id-store-nav-coupon');\n    }\n    function _OpenStatsMenu() {\n        NavigateToTab('JsPlayerStats', 'mainmenu_playerstats');\n    }\n    function _OpenSettingsMenu() {\n        NavigateToTab('JsSettings', 'settings/settings');\n    }\n    var _UpdateOverwatch = function () {\n        var strCaseDescription = OverwatchAPI.GetAssignedCaseDescription();\n        $('#MainMenuNavBarOverwatch').SetHasClass('pausemenu-navbar__btn-small--hidden', strCaseDescription == \"\");\n    };\n    function _OpenSubscriptionUpsell() {\n        UiToolkitAPI.ShowCustomLayoutPopupParameters('', 'file://{resources}/layout/popups/popup_subscription_upsell.xml', '');\n    }\n    function _ShowLoadoutForItem(itemId) {\n        let bLoadoutPanelExisted = !!$.GetContextPanel().FindChildInLayoutFile('JsLoadout');\n        $.DispatchEvent(\"Activated\", $.GetContextPanel().FindChildInLayoutFile('MainMenuNavBarLoadout'), \"mouse\");\n        let bLoadoutPanelExists = !!$.GetContextPanel().FindChildInLayoutFile('JsLoadout');\n        if (!bLoadoutPanelExisted && bLoadoutPanelExists) {\n            $.DispatchEvent(\"ShowLoadoutForItem\", itemId);\n        }\n    }\n    function _OpenSettings() {\n        NavigateToTab('JsSettings', 'settings/settings', 'KeybdMouseSettings');\n    }\n    function _InsureSessionCreated() {\n        if (!LobbyAPI.IsSessionActive()) {\n            LobbyAPI.CreateSession();\n        }\n    }\n    function OnEscapeKeyPressed() {\n        if (_m_activeTab) {\n            if (_m_activeTab === 'JsMainMenuStore') {\n                const xpStoreMenu = _m_elContentPanel.FindChildInLayoutFile('JsMainMenuStore').FindChildInLayoutFile('id-store-page-xpshop');\n                if (xpStoreMenu && xpStoreMenu.IsValid()) {\n                    const xpShopNavBar = xpStoreMenu.FindChildInLayoutFile('id-xpshop-top-nav');\n                    if (xpShopNavBar && xpShopNavBar.IsValid()) {\n                        const navBtns = xpShopNavBar.Children();\n                        let selectedTab = navBtns.filter(btn => btn.checked === true);\n                        if (selectedTab[0].id !== navBtns[0].id) {\n                            $.DispatchEvent('Activated', navBtns[0], 'mouse');\n                            return;\n                        }\n                    }\n                }\n            }\n            OnHomeButtonPressed();\n        }\n        else\n            GameInterfaceAPI.ConsoleCommand(\"gameui_hide\");\n    }\n    MainMenu.OnEscapeKeyPressed = OnEscapeKeyPressed;\n    function _InventoryUpdated() {\n        _UpdatePetNotification();\n        _ForceRestartVanity();\n        if (GameStateAPI.IsLocalPlayerPlayingMatch()) {\n            return;\n        }\n        _UpdateInventoryBtnAlert();\n        _UpdateStoreAlert();\n    }\n    function _RegisterPopupNotificationCallback(fnOnClose) {\n        const handle = UiToolkitAPI.RegisterJSCallback(() => {\n            UiToolkitAPI.UnregisterJSCallback(handle);\n            if (_m_popupNotificationCallbackHandle === handle)\n                _m_popupNotificationCallbackHandle = -1;\n            fnOnClose();\n        });\n        _m_popupNotificationCallbackHandle = handle;\n        return handle;\n    }\n    function _CloseAllVisiblePopups() {\n        UiToolkitAPI.CloseAllVisiblePopups();\n        if (_m_popupNotificationCallbackHandle !== -1) {\n            UiToolkitAPI.UnregisterJSCallback(_m_popupNotificationCallbackHandle);\n            _m_popupNotificationCallbackHandle = -1;\n        }\n        _m_bHasPopupNotification = false;\n    }\n    function _CheckRankUpRedemptionStore() {\n        if (_m_bHasPopupNotification)\n            return;\n        if (GameStateAPI.IsLocalPlayerPlayingMatch())\n            return;\n        if (!$('#MainMenuNavBarHome').checked)\n            return;\n        const objStore = InventoryAPI.GetCacheTypeElementJSOByIndex(\"PersonalStore\", 0);\n        if (!objStore)\n            return;\n        if (!MyPersonaAPI.IsConnectedToGC() || !MyPersonaAPI.IsInventoryValid())\n            return;\n        const genTime = objStore.generation_time;\n        const balance = objStore.redeemable_balance;\n        const prevClientGenTime = Number(GameInterfaceAPI.GetSettingString(\"cl_redemption_reset_timestamp\"));\n        if (prevClientGenTime != genTime && balance > 0) {\n            _m_bHasPopupNotification = true;\n            const RankUpRedemptionStoreClosedCallbackHandle = _RegisterPopupNotificationCallback(_OnRankUpRedemptionStoreClosed);\n            let elPopupPanel = UiToolkitAPI.ShowCustomLayoutPopupParameters('', 'file://{resources}/layout/popups/popup_rankup_redemption_store.xml', 'callback=' + RankUpRedemptionStoreClosedCallbackHandle);\n            elPopupPanel.Data().elMainMenu = $.GetContextPanel();\n        }\n    }\n    function _CheckMajorStoreBalance() {\n        if (!_m_bRemindUsersToSpendMajorTokens || _m_bHasPopupNotification)\n            return;\n        if (GameStateAPI.IsLocalPlayerPlayingMatch())\n            return;\n        if (!$('#MainMenuNavBarHome').checked)\n            return;\n        const elPopups = $('#PopupManager');\n        if (elPopups && elPopups.BHasClass('HaveActivePopups'))\n            return;\n        if (!MyPersonaAPI.IsConnectedToGC() || !MyPersonaAPI.IsInventoryValid())\n            return;\n        _m_bRemindUsersToSpendMajorTokens = false;\n        const idxLookup = InventoryAPI.GetCacheTypeElementIndexByKey('SeasonalOperations', g_ActiveTournamentInfo.credits_id);\n        if (g_ActiveTournamentInfo.credits_id != InventoryAPI.GetCacheTypeElementFieldByIndex('SeasonalOperations', idxLookup, 'season_value'))\n            return;\n        const nBalance = InventoryAPI.GetCacheTypeElementFieldByIndex('SeasonalOperations', idxLookup, 'redeemable_balance') ?? 0;\n        if (nBalance < 99)\n            return;\n        _m_bHasPopupNotification = true;\n        const closedCallbackHandle = _RegisterPopupNotificationCallback(() => { _m_bHasPopupNotification = false; });\n        UiToolkitAPI.ShowCustomLayoutPopupParameters('', 'file://{resources}/layout/popups/popup_major_store_balance.xml', 'balance=' + nBalance + '&callback=' + closedCallbackHandle);\n    }\n    function _OnRankUpRedemptionStoreClosed() {\n        _m_bHasPopupNotification = false;\n    }\n    function _UpdateInventoryBtnAlert() {\n        const aNewItems = AcknowledgeItems.GetItems();\n        const count = aNewItems.length;\n        const elNavBar = $.GetContextPanel().FindChildInLayoutFile('MainMenuNavBarTop'), elAlert = elNavBar.FindChildInLayoutFile('MainMenuInvAlert');\n        elAlert.SetDialogVariable(\"alert_value\", count.toString());\n        elAlert.SetHasClass('hidden', count < 1);\n    }\n    function _OnInventoryInspect(id, contextmenuparam) {\n        let inspectviewfunc = contextmenuparam ? contextmenuparam : 'primary';\n        const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('', 'file://{resources}/layout/popups/popup_inventory_inspect.xml');\n        let oSettings = {\n            item_id: id,\n            inspect_only: true,\n            force_inspect_view_type: inspectviewfunc\n        };\n        elPanel.Data().oSettings = oSettings;\n    }\n    function _OnShowCustomLayoutPopupParametersAsEvent(dimstyle, xmlname, panelparams) {\n        const elPanel = UiToolkitAPI.ShowCustomLayoutPopup(dimstyle, xmlname);\n        const aParams = panelparams.split(',');\n        let oSettings = { item_id: '' };\n        aParams.forEach(entry => {\n            const settingPair = entry.split('=');\n            oSettings[settingPair[0]] = settingPair[1];\n        });\n        elPanel.Data().oSettings = oSettings;\n    }\n    function _OnShowXrayCasePopup(toolid, caseId, bShowPopupWarning = false) {\n        const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('popup-inspect-' + caseId, 'file://{resources}/layout/popups/popup_capability_decodable.xml');\n        let oSettings = {\n            item_id: caseId,\n            tool_id: toolid,\n            work_type: 'decodeable',\n            is_xray_machine: true,\n            show_xray_warning: bShowPopupWarning\n        };\n        elPanel.Data().oSettings = oSettings;\n    }\n    let JsInspectCallback = -1;\n    function _OnLootlistItemPreview(id, params) {\n        if (JsInspectCallback != -1) {\n            UiToolkitAPI.UnregisterJSCallback(JsInspectCallback);\n            JsInspectCallback = -1;\n        }\n        const ParamsList = params.split(',');\n        const caseId = ParamsList[0];\n        const lootlistNameOverride = ParamsList[3] && ParamsList[3] !== '' ? ParamsList[3] : 'false';\n        JsInspectCallback = UiToolkitAPI.RegisterJSCallback(() => {\n        });\n        const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('popup-lootlist-item-inspect-' + id, 'file://{resources}/layout/popups/popup_inventory_inspect.xml');\n        let oSettings = {\n            item_id: id,\n            inspect_only: true,\n            hide_all_action_items: true,\n            hide_item_cert: true,\n            show_market_link: _m_bPerfectWorld ? false : true,\n            callback_handle: JsInspectCallback,\n            case_id_for_lootlist: caseId,\n            lootlist_name_override: lootlistNameOverride\n        };\n        elPanel.Data().oSettings = oSettings;\n    }\n    function _WeaponPreviewRequest(id, bWorkshopItemPreview = false) {\n        const workshopPreview = bWorkshopItemPreview ? 'true' : 'false';\n        _CloseAllVisiblePopups();\n        const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('popup-weapon-preview-inspect-' + id, 'file://{resources}/layout/popups/popup_inventory_inspect.xml');\n        let oSettings = {\n            item_id: id,\n            inspect_only: true,\n            hide_all_action_items: true,\n            is_workshop_preview: bWorkshopItemPreview\n        };\n        elPanel.Data().oSettings = oSettings;\n    }\n    function _SelectItemForWorkshopPreviewCapability(capability, itemid, itemid2) {\n        _CloseAllVisiblePopups();\n        _OpenInventory();\n        $.DispatchEvent('ShowSelectItemForWorkshopPreviewCapability', capability, itemid, itemid2);\n    }\n    function _UpdateStoreAlert() {\n        let hideAlert;\n        const objStore = InventoryAPI.GetCacheTypeElementJSOByIndex(\"PersonalStore\", 0);\n        const gcConnection = MyPersonaAPI.IsConnectedToGC();\n        const validInventory = MyPersonaAPI.IsInventoryValid();\n        hideAlert = !gcConnection || !validInventory || !objStore || objStore.redeemable_balance === 0;\n        const elNavBar = $.GetContextPanel().FindChildInLayoutFile('MainMenuNavBarTop');\n        const elAlert = elNavBar.FindChildInLayoutFile('MainMenuStoreAlert');\n        elAlert.SetDialogVariable(\"alert_value\", $.Localize(\"#Store_Price_New\"));\n        elAlert.SetHasClass('hidden', hideAlert);\n    }\n    function _CancelNotificationSchedule() {\n        if (_m_notificationSchedule !== false) {\n            $.CancelScheduled(_m_notificationSchedule);\n            _m_notificationSchedule = false;\n        }\n    }\n    function _AcknowledgePenaltyNotificationsCallback() {\n        CompetitiveMatchAPI.ActionAcknowledgePenalty();\n        _m_bHasPopupNotification = false;\n    }\n    function _AcknowledgeMsgNotificationsCallback() {\n        MyPersonaAPI.ActionAcknowledgeNotifications();\n        _m_bHasPopupNotification = false;\n    }\n    let _m_petEventCache = null;\n    function GetPetPopupNotification() {\n        if (_m_bHasPopupNotification)\n            return null;\n        if (GameStateAPI.IsLocalPlayerPlayingMatch())\n            return null;\n        if (!$('#MainMenuNavBarHome').checked)\n            return null;\n        if (!MyPersonaAPI.IsConnectedToGC() || !MyPersonaAPI.IsInventoryValid())\n            return null;\n        const petItemId = InventoryAPI.GetPetItemID();\n        if (!petItemId && !_m_petEventCache)\n            return null;\n        let nUpgradeLevelDetected = 0;\n        if (petItemId) {\n            const nUpgradeLevel = Number(InventoryAPI.GetItemAttributeValue(petItemId, '{uint32}upgrade level'));\n            if (!_m_petEventCache || petItemId !== _m_petEventCache.petItemId) {\n                _m_petEventCache = {\n                    petItemId: petItemId,\n                    nLastKnownUpgradeLevel: nUpgradeLevel,\n                    strExpiryReason: '',\n                };\n            }\n            const strExpectExpiry = InventoryAPI.TryAckPetEventAndCheckExpiration(petItemId);\n            if (strExpectExpiry) {\n                _m_petEventCache.strExpiryReason = strExpectExpiry;\n            }\n            else if (nUpgradeLevel > _m_petEventCache.nLastKnownUpgradeLevel) {\n                nUpgradeLevelDetected = nUpgradeLevel;\n            }\n        }\n        if (_m_petEventCache && _m_petEventCache.strExpiryReason) {\n            if (!petItemId) {\n                const ackExpPetItemId = _m_petEventCache.petItemId;\n                const savedPetId = InventoryAPI.RestorePetItemData();\n                return {\n                    title: \"#pet_expired_notification_title\",\n                    msg: \"#pet_expired_notification_msg\",\n                    color_class: \"NotificationYellow\",\n                    callback: () => {\n                        _m_bHasPopupNotification = false;\n                        if (_m_petEventCache && _m_petEventCache.petItemId === ackExpPetItemId)\n                            _m_petEventCache = null;\n                    },\n                    html: false,\n                    rental_id: \"\",\n                    pet_id: savedPetId + ',' + _m_petEventCache.strExpiryReason,\n                    ack_exp_pet_id: ackExpPetItemId\n                };\n            }\n            else\n                return null;\n        }\n        if (petItemId && (nUpgradeLevelDetected > 0)) {\n            const savedPetId = InventoryAPI.RestorePetItemData();\n            return {\n                title: \"#pet_upgrade_notification_title\",\n                msg: \"#pet_upgrade_notification_msg\",\n                color_class: \"NotificationGreen\",\n                callback: () => {\n                    _m_bHasPopupNotification = false;\n                    if (_m_petEventCache && _m_petEventCache.petItemId === petItemId\n                        && nUpgradeLevelDetected > _m_petEventCache.nLastKnownUpgradeLevel)\n                        _m_petEventCache.nLastKnownUpgradeLevel = nUpgradeLevelDetected;\n                },\n                html: false,\n                rental_id: \"\",\n                pet_id: petItemId + ',' + savedPetId,\n            };\n        }\n        return null;\n    }\n    let _m_bCheckHasLowAvailableVirtualMemory = true;\n    let _m_bCheckHasInsufficientPagefile = true;\n    function _GetPopupNotification() {\n        const popupNotification = {\n            title: \"\",\n            msg: \"\",\n            color_class: \"NotificationYellow\",\n            callback: () => { },\n            html: false,\n            rental_id: \"\",\n        };\n        if (_m_bCheckHasLowAvailableVirtualMemory && GameInterfaceAPI.HasLowAvailableVirtualMemory()) {\n            popupNotification.title = \"#GameUI_SystemInfo_Title\";\n            popupNotification.msg = $.Localize(\"#GameUI_SystemInfo_Attention_Low_System_Memory\");\n            popupNotification.callback = () => {\n                _m_bCheckHasLowAvailableVirtualMemory = _m_bHasPopupNotification = false;\n                GameInterfaceAPI.Acknowledged_HasLowAvailableVirtualMemory();\n            };\n            return popupNotification;\n        }\n        if (_m_bCheckHasInsufficientPagefile && GameInterfaceAPI.HasInsufficientPagefile()) {\n            popupNotification.title = \"#GameUI_SystemInfo_Title\";\n            popupNotification.msg = $.Localize(\"#GameUI_SystemInfo_Attention_LowDiskSpaceForSwapfile\");\n            popupNotification.callback = () => {\n                _m_bCheckHasInsufficientPagefile = _m_bHasPopupNotification = false;\n                GameInterfaceAPI.Acknowledged_HasInsufficientPagefile();\n            };\n            return popupNotification;\n        }\n        const nBanRemaining = CompetitiveMatchAPI.GetCooldownSecondsRemaining();\n        if (nBanRemaining < 0) {\n            popupNotification.title = \"#SFUI_MainMenu_Competitive_Ban_Confirm_Title\";\n            popupNotification.msg = $.Localize(\"#SFUI_CooldownExplanationReason_Expired_Cooldown\") + $.Localize(CompetitiveMatchAPI.GetCooldownReason());\n            popupNotification.callback = _AcknowledgePenaltyNotificationsCallback;\n            popupNotification.html = true;\n            return popupNotification;\n        }\n        const strNotifications = MyPersonaAPI.GetMyNotifications();\n        if (strNotifications !== \"\") {\n            const arrayOfNotifications = strNotifications.split(',');\n            for (let notificationType of arrayOfNotifications) {\n                if (notificationType !== \"6\") {\n                    popupNotification.color_class = 'NotificationBlue';\n                }\n                popupNotification.title = '#SFUI_PersonaNotification_Title_' + notificationType;\n                popupNotification.msg = '#SFUI_PersonaNotification_Msg_' + notificationType;\n                popupNotification.callback = _AcknowledgeMsgNotificationsCallback;\n            }\n            return popupNotification;\n        }\n        if (MyPersonaAPI.IsConnectedToGC()) {\n            const nRentalHistoryCount = InventoryAPI.GetCacheTypeElementsCount('RentalHistory');\n            const nCurrentDate = Math.trunc(Date.now() / 1000);\n            for (let i = 0; i < nRentalHistoryCount; ++i) {\n                const oRentalHistory = InventoryAPI.GetCacheTypeElementJSOByIndex('RentalHistory', i);\n                const crateItemId = oRentalHistory.crate_item_id;\n                if (oRentalHistory.expiration_date <= nCurrentDate &&\n                    !_m_acknowledgedRentalExpirationCrateIds.has(crateItemId)) {\n                    _m_acknowledgedRentalExpirationCrateIds.add(crateItemId);\n                    const fauxItemId = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(oRentalHistory.crate_def_index, 0);\n                    const crateName = InventoryAPI.GetItemName(fauxItemId);\n                    const issueDate = InventoryAPI.LocalizeRentalDate(oRentalHistory.issue_date);\n                    const expirationDate = InventoryAPI.LocalizeRentalDate(oRentalHistory.expiration_date);\n                    const elContainer = $('#MainMenuContainerPanel');\n                    elContainer.SetDialogVariable('rental_expired_crate_name', crateName);\n                    elContainer.SetDialogVariable('rental_expired_issue_date', issueDate);\n                    elContainer.SetDialogVariable('rental_expired_expiration_date', expirationDate);\n                    popupNotification.rental_id = fauxItemId;\n                    popupNotification.title = '#RentalExpiredPopupTitle';\n                    popupNotification.msg = $.Localize('#RentalExpiredPopupMessage', elContainer);\n                    popupNotification.callback = () => {\n                        InventoryAPI.AcknowledgeRentalExpiration(crateItemId);\n                        _m_bHasPopupNotification = false;\n                    };\n                    return popupNotification;\n                }\n            }\n        }\n        return null;\n    }\n    function _UpdatePopupnotification() {\n        if (!_m_bHasPopupNotification) {\n            const popupNotification = _GetPopupNotification();\n            if (popupNotification != null) {\n                if (popupNotification.rental_id) {\n                    const OnCloseRentalExpireNotification = _RegisterPopupNotificationCallback(popupNotification.callback);\n                    UiToolkitAPI.ShowCustomLayoutPopupParameters('', 'file://{resources}/layout/popups/popup_container_open_confirm.xml', 'action-type=expire'\n                        + '&' + 'case=' + popupNotification.rental_id\n                        + '&' + 'msg_override=' + popupNotification.msg\n                        + '&' + 'callback=' + OnCloseRentalExpireNotification);\n                }\n                else {\n                    const elPopup = UiToolkitAPI.ShowGenericPopupOneOption(popupNotification.title, popupNotification.msg, popupNotification.color_class, '#SFUI_MainMenu_ConfirmBan', popupNotification.callback);\n                    if (elPopup) {\n                        elPopup.SetPanelEvent('oncancel', () => {\n                            $.DispatchEvent('UIPopupButtonClicked', elPopup, '');\n                            popupNotification.callback();\n                        });\n                    }\n                    if (popupNotification.html)\n                        elPopup.EnableHTML();\n                }\n                _m_bHasPopupNotification = true;\n            }\n        }\n    }\n    function PopUpPetNotification(popupNotification) {\n        if (popupNotification != null && popupNotification.pet_id) {\n            _m_bHasPopupNotification = true;\n            const OnClosePetEventNotification = _RegisterPopupNotificationCallback(popupNotification.callback);\n            let Panel = UiToolkitAPI.ShowCustomLayoutPopupParameters('', 'file://{resources}/layout/popups/popup_pet_event.xml', 'action-type=expire'\n                + '&' + 'title=' + popupNotification.title\n                + '&' + 'msg=' + popupNotification.msg\n                + '&' + 'pet_id=' + popupNotification.pet_id\n                + '&' + 'callback=' + OnClosePetEventNotification\n                + '&' + 'ack_exp_pet_id=' + popupNotification.ack_exp_pet_id);\n        }\n    }\n    function _GetNotificationBarData() {\n        let aAlerts = [];\n        if (LicenseUtil.GetCurrentLicenseRestrictions() === false) {\n            const notification = { color_class: \"\", title: \"\", tooltip: \"\", link: \"\", icon: \"\" };\n            const bIsConnectedToGC = MyPersonaAPI.IsConnectedToGC();\n            $('#MainMenuInput').SetHasClass('GameClientConnectingToGC', !bIsConnectedToGC);\n            if (bIsConnectedToGC) {\n                _m_tLastSeenDisconnectedFromGC = 0;\n            }\n            else if (!_m_tLastSeenDisconnectedFromGC) {\n                _m_tLastSeenDisconnectedFromGC = +new Date();\n            }\n            else if (Math.abs((+new Date()) - _m_tLastSeenDisconnectedFromGC) > 500) {\n                notification.title = $.Localize(\"#Store_Connecting_ToGc\");\n                notification.tooltip = $.Localize(\"#Store_Connecting_ToGc_Tooltip\");\n                notification.color_class = \"\";\n                notification.icon = \"gc-connecting\";\n                notification.is_gc_connecting = true;\n                aAlerts.push(notification);\n            }\n        }\n        if (NewsAPI.IsNewClientAvailable()) {\n            const notification = { color_class: \"\", title: \"\", tooltip: \"\", link: \"\", icon: \"\" };\n            notification.color_class = \"yellow-alert\";\n            notification.icon = \"client_update\";\n            notification.title = $.Localize(\"#SFUI_MainMenu_Outofdate_Title\");\n            notification.tooltip = $.Localize(\"#SFUI_MainMenu_Outofdate_Body\");\n            aAlerts.push(notification);\n        }\n        const nIsVacBanned = MyPersonaAPI.IsVacBanned();\n        if (nIsVacBanned != 0) {\n            const notification = { color_class: \"\", title: \"\", tooltip: \"\", link: \"\", icon: \"\" };\n            notification.color_class = \"red-alert\";\n            notification.icon = \"ban_global\";\n            if ((nIsVacBanned & 1) == 1) {\n                notification.title = $.Localize(\"#SFUI_MainMenu_Vac_Title\");\n                notification.tooltip = $.Localize(\"#SFUI_MainMenu_Vac_Info\");\n                notification.link = \"https://help.steampowered.com/faqs/view/647C-5CC1-7EA9-3C29\";\n            }\n            else if ((nIsVacBanned & 4) == 4) {\n                notification.title = $.Localize(\"#SFUI_MainMenu_AccountLocked_Title\");\n                notification.tooltip = $.Localize(\"#SFUI_MainMenu_AccountLocked_Info\");\n                notification.link = \"https://help.steampowered.com/en/faqs/view/4F62-35F9-F395-5C23\";\n            }\n            else {\n                notification.title = $.Localize(\"#SFUI_MainMenu_GameBan_Title\");\n                notification.tooltip = $.Localize(\"#SFUI_MainMenu_GameBan_Info\");\n                notification.link = \"https://help.steampowered.com/faqs/view/4E54-0B96-D0A4-1557\";\n            }\n            aAlerts.push(notification);\n        }\n        else {\n            const nPlayBanGlobalRemaining = MyPersonaAPI.GetPlayBanSecondsRemaining();\n            if (nPlayBanGlobalRemaining > 0) {\n                const notification = { color_class: \"\", title: \"\", tooltip: \"\", link: \"\", icon: \"\" };\n                notification.tooltip = $.Localize(\"#CSGO_Purchasable_Game_License_BannedInChina\");\n                notification.title = $.Localize(\"#SFUI_MainMenu_GameBan_Title\") + ' ' + FormatText.SecondsToSignificantTimeString(nPlayBanGlobalRemaining);\n                notification.color_class = \"red-alert\";\n                notification.icon = \"ban_global\";\n                aAlerts.push(notification);\n            }\n            else {\n                const nBanRemaining = CompetitiveMatchAPI.GetCooldownSecondsRemaining();\n                if (nBanRemaining > 0) {\n                    const notification = { color_class: \"\", title: \"\", tooltip: \"\", link: \"\", icon: \"\" };\n                    notification.tooltip = CompetitiveMatchAPI.GetCooldownReason();\n                    const strType = CompetitiveMatchAPI.GetCooldownType();\n                    if (strType == \"global\") {\n                        notification.title = $.Localize(\"#SFUI_MainMenu_Global_Ban_Title\");\n                        notification.color_class = \"yellow-alert\";\n                        notification.icon = \"ban_competitive\";\n                    }\n                    else if (strType == \"green\") {\n                        notification.title = $.Localize(\"#SFUI_MainMenu_Temporary_Ban_Title\");\n                        notification.color_class = \"yellow-alert\";\n                        notification.icon = \"ban_competitive\";\n                    }\n                    else if (strType == \"competitive\") {\n                        notification.title = $.Localize(\"#SFUI_MainMenu_Competitive_Ban_Title\");\n                        notification.color_class = \"yellow-alert\";\n                        notification.icon = \"ban_competitive\";\n                    }\n                    if (!CompetitiveMatchAPI.CooldownIsPermanent()) {\n                        const title = notification.title;\n                        if (CompetitiveMatchAPI.ShowFairPlayGuidelinesForCooldown()) {\n                            notification.link = \"https://blog.counter-strike.net/index.php/fair-play-guidelines/\";\n                        }\n                        notification.title = title + ' ' + FormatText.SecondsToSignificantTimeString(nBanRemaining);\n                    }\n                    aAlerts.push(notification);\n                }\n            }\n        }\n        const nCommsMuteRemaining = MyPersonaAPI.GetCommunicationsBanSecondsRemaining();\n        if (nCommsMuteRemaining > 0) {\n            const notification = { color_class: \"\", title: \"\", tooltip: \"\", link: \"\", icon: \"\" };\n            notification.tooltip = $.Localize(\"#GameUI_AccountInfo_CommsBanNagYouIngame\");\n            notification.title = $.Localize(\"#tooltip_cannot_unmute\") + ' ' + FormatText.SecondsToSignificantTimeString(nCommsMuteRemaining);\n            notification.color_class = \"yellow-alert\";\n            notification.icon = \"message\";\n            aAlerts.push(notification);\n        }\n        const strNotification = MyPersonaAPI.GetTradeBanNotification();\n        if (strNotification) {\n            const notification = { color_class: \"\", title: \"\", tooltip: \"\", link: \"\", icon: \"\" };\n            notification.color_class = \"yellow-alert\";\n            notification.icon = \"ban_trade\";\n            const idxspace = strNotification.indexOf(' ', 60);\n            notification.title = (idxspace > 0)\n                ? strNotification.substring(0, idxspace) + '...'\n                : $.Localize('#SFUI_LoginPerfectWorld_Title_Info');\n            notification.tooltip = strNotification;\n            aAlerts.push(notification);\n        }\n        return aAlerts;\n    }\n    function _UpdateNotificationBar() {\n        const aNotifications = _GetNotificationBarData();\n        _m_elNotificationsContainer.Children().forEach(icon => {\n            if (icon && icon.IsValid()) {\n                icon.SetHasClass('show', false);\n            }\n        });\n        if (aNotifications?.length < 1) {\n            _m_elNotificationsContainer.SetHasClass('show', false);\n            return;\n        }\n        _m_elNotificationsContainer.SetHasClass('show', true);\n        aNotifications.forEach(notification => {\n            let oNotification = notification;\n            let elIcon = _m_elNotificationsContainer.FindChildInLayoutFile('id-alert-navbar-' + oNotification.icon);\n            if (oNotification.is_gc_connecting && elIcon) {\n                elIcon.SetHasClass('show', true);\n            }\n            else {\n                if (!elIcon) {\n                    elIcon = $.CreatePanel(('Image'), _m_elNotificationsContainer, 'id-alert-navbar-' + oNotification.icon, { class: 'mainmenu-top-navbar__radio-btn__icon mainmenu-top-navbar__alerts-icon',\n                        src: 'file://{images}/icons/ui/' + oNotification.icon + '.svg'\n                    });\n                }\n                elIcon.SwitchClass('alert-color', oNotification.color_class);\n                elIcon.SetHasClass('show', true);\n            }\n            elIcon.SetPanelEvent('onactivate', () => {\n                let gc = oNotification.is_gc_connecting === true ? 'true' : 'false';\n                let elContextMenu = UiToolkitAPI.ShowCustomLayoutContextMenuParameters('', '', 'file://{resources}/layout/context_menus/context_menu_navbar_notification.xml', 'icon=' + oNotification.icon + '&' +\n                    'color=' + oNotification.color_class + '&' +\n                    'title=' + oNotification.title + '&' +\n                    'tooltip=' + oNotification.tooltip + '&' +\n                    'link=' + oNotification.link + '&' +\n                    'gcconnecting=' + gc);\n                elContextMenu.AddClass(\"ContextMenu_NoArrow\");\n                elContextMenu.SetFocus();\n            });\n            elIcon.SetPanelEvent('onmouseover', () => {\n                UiToolkitAPI.ShowTitleTextTooltip('id-alert-navbar-' + oNotification.icon, oNotification.title, oNotification.tooltip);\n            });\n            elIcon.SetPanelEvent('onmouseout', () => { UiToolkitAPI.HideTitleTextTooltip(); });\n        });\n    }\n    function _UpdateNotifications() {\n        if (_m_notificationSchedule == false) {\n            _LoopUpdateNotifications();\n        }\n    }\n    function _UpdatePetNotification() {\n        if (GameStateAPI.IsLocalPlayerPlayingMatch())\n            return;\n        const elPopups = $('#PopupManager');\n        if (elPopups && elPopups.BHasClass('HaveActivePopups'))\n            return;\n        const petNotification = GetPetPopupNotification();\n        if (petNotification) {\n            PopUpPetNotification(petNotification);\n        }\n    }\n    function _LoopUpdateNotifications() {\n        _UpdatePopupnotification();\n        _UpdateNotificationBar();\n        const REDEMPTION_ENABLED = true;\n        if (REDEMPTION_ENABLED) {\n            _CheckRankUpRedemptionStore();\n        }\n        _CheckMajorStoreBalance();\n        _UpdatePetNotification();\n        _m_notificationSchedule = $.Schedule(1, _LoopUpdateNotifications);\n    }\n    let _m_acknowledgePopupHandler = null;\n    function _ShowAcknowledgePopup(type = '', itemid = '') {\n        if (type === 'xpgrant') {\n            UiToolkitAPI.ShowCustomLayoutPopupParameters('', 'file://{resources}/layout/popups/popup_acknowledge_xpgrant.xml', 'none');\n            $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.inventory_new_item', 'MOUSE');\n            return;\n        }\n        let updatedItemTypeAndItemid = '';\n        if (itemid && type)\n            updatedItemTypeAndItemid = 'ackitemid=' + itemid + '&acktype=' + type;\n        if (!_m_acknowledgePopupHandler) {\n            let jsPopupCallbackHandle;\n            jsPopupCallbackHandle = UiToolkitAPI.RegisterJSCallback(_ResetAcknowlegeHandler);\n            _m_acknowledgePopupHandler = UiToolkitAPI.ShowCustomLayoutPopupParameters('', 'file://{resources}/layout/popups/popup_acknowledge_item.xml', updatedItemTypeAndItemid + '&callback=' + jsPopupCallbackHandle);\n            $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.inventory_new_item', 'MOUSE');\n        }\n    }\n    function _ResetAcknowlegeHandler() {\n        _m_acknowledgePopupHandler = null;\n    }\n    function ShowVote() {\n        const contextMenuPanel = UiToolkitAPI.ShowCustomLayoutContextMenuParametersDismissEvent('MainMenuNavBarVote', '', 'file://{resources}/layout/context_menus/context_menu_vote.xml', '', () => { });\n        contextMenuPanel.AddClass(\"ContextMenu_NoArrow\");\n    }\n    MainMenu.ShowVote = ShowVote;\n    function _HasStoreStatusPanelTrapPopups() {\n        let elStorePanels = $.GetContextPanel().FindChildInLayoutFile('PopupManager').\n            Children().filter(panel => panel.BHasClass('ShowStoreStatusPanelHandler'));\n        return (elStorePanels && (elStorePanels.length > 0));\n    }\n    function _HideStoreStatusPanelInternal() {\n        if (_m_storePopupElement && _m_storePopupElement.IsValid()) {\n            _m_storePopupElement.DeleteAsync(0);\n        }\n        _m_storePopupElement = null;\n    }\n    function _HideStoreStatusPanel() {\n        if (_HasStoreStatusPanelTrapPopups())\n            return;\n        _HideStoreStatusPanelInternal();\n    }\n    function _ShowStoreStatusPanel(strText, bAllowClose, bCancel, strOkCmd) {\n        _HideStoreStatusPanelInternal();\n        let paramclose = '0';\n        if (bAllowClose) {\n            paramclose = '1';\n        }\n        let paramcancel = '0';\n        if (bCancel) {\n            paramcancel = '1';\n        }\n        if (_HasStoreStatusPanelTrapPopups())\n            return;\n        _m_storePopupElement = UiToolkitAPI.ShowCustomLayoutPopupParameters('store_popup', 'file://{resources}/layout/popups/popup_store_status.xml', 'text=' + strText +\n            '&' + 'allowclose=' + paramclose +\n            '&' + 'cancel=' + paramcancel +\n            '&' + 'okcmd=' + strOkCmd);\n    }\n    function _DeletePauseMenuMissionPanel() {\n        if ($.GetContextPanel().FindChildInLayoutFile('JsActiveMission')) {\n            $.GetContextPanel().FindChildInLayoutFile('JsActiveMission').DeleteAsync(0.0);\n        }\n    }\n    function _SlideSearchPartyParticles(bSlidout) {\n        const particle_container = $('#party-search-particles');\n        particle_container.SetHasClass(\"mainmenu-party-search-particle--slide-out\", bSlidout);\n        particle_container.SetControlPoint(3, 0, 0, 0);\n        particle_container.SetControlPoint(3, 1, 0, 0);\n    }\n    function _OnGcHelloReceived() {\n        _CheckPopupNotificationsAtLogon();\n        _UpdateUnlockCompAlert();\n        VacNetAPI.UpdateReviewerInfo();\n    }\n    function _OnReviewInfoRecieved(bHasAccess) {\n        $.GetContextPanel().SetHasClass('show-vacnet-link', bHasAccess);\n    }\n    function _UpdateUnlockCompAlert() {\n        const btn = $.GetContextPanel().FindChildInLayoutFile('MainMenuNavBarPlay');\n        const alert = btn.FindChildInLayoutFile('MainMenuPlayAlert');\n        alert.SetDialogVariable(\"alert_value\", $.Localize(\"#Store_Price_New\"));\n        if (!MyPersonaAPI.IsConnectedToGC()) {\n            alert.AddClass('hidden');\n            return;\n        }\n        const bHide = GameInterfaceAPI.GetSettingString('ui_show_unlock_competitive_alert') === '1' ||\n            MyPersonaAPI.HasPrestige() ||\n            MyPersonaAPI.GetCurrentLevel() !== 2;\n        alert.SetHasClass('hidden', bHide);\n    }\n    function _SwitchVanity(team) {\n        $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.generic_button_press', 'MOUSE');\n        GameInterfaceAPI.SetSettingString('ui_vanitysetting_team', team);\n        _ForceRestartVanity();\n    }\n    function _GoToCharacterLoadout(team) {\n        _OpenInventory();\n        let teamName = ((team == '2') ? 't' : 'ct');\n        $.DispatchEvent(\"ShowLoadoutForItem\", LoadoutAPI.GetItemID(teamName, 'customplayer'));\n    }\n    function _OnGoToCharacterLoadoutPressed() {\n        if (!MyPersonaAPI.IsInventoryValid() || !MyPersonaAPI.IsConnectedToGC()) {\n            UiToolkitAPI.ShowGenericPopupOk($.Localize('#SFUI_SteamConnectionErrorTitle'), $.Localize('#SFUI_Steam_Error_LinkUnexpected'), '', () => { });\n            return;\n        }\n        const team = GameInterfaceAPI.GetSettingString('ui_vanitysetting_team') == 't' ? 2 : 3;\n        const elVanityContextMenu = UiToolkitAPI.ShowCustomLayoutContextMenuParametersDismissEvent('id-vanity-contextmenu', '', 'file://{resources}/layout/context_menus/context_menu_mainmenu_vanity.xml', 'type=catagory' +\n            '&' + 'team=' + team, () => { });\n        elVanityContextMenu.AddClass(\"ContextMenu_NoArrow\");\n    }\n    function _OnChangeClanTagPressed() {\n        if (!MyPersonaAPI.IsInventoryValid() || !MyPersonaAPI.IsConnectedToGC()) {\n            UiToolkitAPI.ShowGenericPopupOk($.Localize('#SFUI_SteamConnectionErrorTitle'), $.Localize('#SFUI_Steam_Error_LinkUnexpected'), '', () => { });\n            return;\n        }\n        const elClanTagContextMenu = UiToolkitAPI.ShowCustomLayoutContextMenuParametersDismissEvent('id-vanity-contextmenu-clanchange', '', 'file://{resources}/layout/context_menus/context_menu_clan_tags.xml', '', () => { });\n        elClanTagContextMenu.AddClass(\"ContextMenu_NoArrow\");\n    }\n    function _CheckConnection() {\n        if (!MyPersonaAPI.IsConnectedToGC()) {\n            if (!_BCheckTabCanBeOpenedRightNow(_m_activeTab)) {\n                OnHomeButtonPressed();\n            }\n        }\n    }\n    function OnPlayButtonPressed() {\n        if (GameTypesAPI.ShouldForceNewUserTraining()) {\n            OnHomeButtonPressed();\n            _NewUser_ShowForceTrainingPopup();\n        }\n        else if (GameTypesAPI.ShouldShowNewUserPopup()) {\n            OnHomeButtonPressed();\n            _NewUser_ShowTrainingCompletePopup();\n        }\n        else {\n            $.DispatchEvent('OpenPlayMenu');\n        }\n    }\n    MainMenu.OnPlayButtonPressed = OnPlayButtonPressed;\n    function _NewUser_ShowForceTrainingPopup() {\n        UiToolkitAPI.ShowGenericPopupOkCancel('#ForceNewUserTraining_title', '#ForceNewUserTraining_text', '', () => {\n            $.DispatchEvent('OpenPlayMenu');\n            $.Schedule(0.1, _NewUser_TrainingMatch);\n            GameTypesAPI.OnStartForcedNewUserTraining();\n        }, () => { });\n    }\n    function _NewUser_ShowTrainingCompletePopup() {\n        UiToolkitAPI.ShowGenericPopupThreeOptions('#PlayMenu_NewUser_title', '#PlayMenu_NewUser_text', '', '#PlayMenu_NewUser_casual', () => {\n            GameTypesAPI.DisableNewUserExperience();\n            $.DispatchEvent('OpenPlayMenu');\n            $.Schedule(0.1, _NewUser_CasualMatchmaking);\n        }, '#PlayMenu_NewUser_training', () => {\n            $.DispatchEvent('OpenPlayMenu');\n            $.Schedule(0.1, _NewUser_TrainingMatch);\n        }, '#PlayMenu_NewUser_other', () => {\n            GameTypesAPI.DisableNewUserExperience();\n            $.DispatchEvent('OpenPlayMenu');\n        });\n    }\n    function _NewUser_TrainingMatch() {\n        const settings = {\n            update: {\n                Options: {\n                    action: 'custommatch',\n                    server: 'listen',\n                },\n                Game: {\n                    mode: 'new_user_training',\n                    type: 'classic',\n                    mapgroupname: 'mg_de_dust2',\n                    map: 'de_dust2'\n                }\n            },\n            delete: {}\n        };\n        LobbyAPI.UpdateSessionSettings(settings);\n        LobbyAPI.StartMatchmaking('', '', '', '');\n    }\n    function _NewUser_CasualMatchmaking() {\n        const settings = {\n            update: {\n                Options: {\n                    action: 'custommatch',\n                    server: 'official',\n                },\n                Game: {\n                    mode: 'casual',\n                    mode_ui: 'casual',\n                    type: 'classic',\n                    gamemodeflags: 0,\n                    mapgroupname: 'mg_casualalpha',\n                    map: 'de_dust2'\n                }\n            },\n            delete: {}\n        };\n        LobbyAPI.UpdateSessionSettings(settings);\n        LobbyAPI.StartMatchmaking('', '', '', '');\n    }\n    function _MainInitBackgroundMovie() {\n        _UpdateBackgroundMap();\n    }\n    function _SetPetInteractionEnabled(mapPanel, bEnabled) {\n        mapPanel.hittest = bEnabled;\n        mapPanel.SetAcceptsInput(bEnabled);\n        mapPanel.SetMapEntitiesCanReceiveInput(bEnabled);\n    }\n    {\n        $.LogChannel(\"p.mainmenu\", \"LV_DEFAULT\", \"#aaff80\");\n        $.RegisterForUnhandledEvent('HideContentPanel', _OnHideContentPanel);\n        $.RegisterForUnhandledEvent('SidebarContextMenuActive', _OnSideBarElementContextMenuActive);\n        $.RegisterForUnhandledEvent('OpenPlayMenu', _OpenPlayMenu);\n        $.RegisterForUnhandledEvent('OpenInventory', _OpenInventory);\n        $.RegisterForUnhandledEvent('OpenWatchMenu', _OpenWatchMenu);\n        $.RegisterForUnhandledEvent('OpenStatsMenu', _OpenStatsMenu);\n        $.RegisterForUnhandledEvent('OpenSettingsMenu', _OpenSettingsMenu);\n        $.RegisterForUnhandledEvent('OpenSubscriptionUpsell', _OpenSubscriptionUpsell);\n        $.RegisterForUnhandledEvent('CSGOShowMainMenu', _OnShowMainMenu);\n        $.RegisterForUnhandledEvent('CSGOHideMainMenu', _OnHideMainMenu);\n        $.RegisterForUnhandledEvent('CSGOShowPauseMenu', _OnShowPauseMenu);\n        $.RegisterForUnhandledEvent('CSGOHidePauseMenu', _OnHidePauseMenu);\n        $.RegisterForUnhandledEvent('OpenSidebarPanel', ExpandSidebar);\n        $.RegisterForUnhandledEvent('PanoramaComponent_MyPersona_GameMustExitNowForAntiAddiction', _GameMustExitNowForAntiAddiction);\n        $.RegisterForUnhandledEvent('PanoramaComponent_MyPersona_GcLogonNotificationReceived', _GcLogonNotificationReceived);\n        $.RegisterForUnhandledEvent('PanoramaComponent_GC_Hello', _OnGcHelloReceived);\n        $.RegisterForUnhandledEvent('PanoramaComponent_MyPersona_InventoryUpdated', _InventoryUpdated);\n        $.RegisterForUnhandledEvent('InventoryItemPreview', _OnInventoryInspect);\n        $.RegisterForUnhandledEvent('ShowCustomLayoutPopupParametersAsEvent', _OnShowCustomLayoutPopupParametersAsEvent);\n        $.RegisterForUnhandledEvent('LootlistItemPreview', _OnLootlistItemPreview);\n        $.RegisterForUnhandledEvent('ShowXrayCasePopup', _OnShowXrayCasePopup);\n        $.RegisterForUnhandledEvent('PanoramaComponent_Inventory_WeaponPreviewRequest', _WeaponPreviewRequest);\n        $.RegisterForUnhandledEvent('PanoramaComponent_Overwatch_CaseUpdated', _UpdateOverwatch);\n        $.RegisterForUnhandledEvent('PanoramaComponent_Inventory_SelectItemForWorkshopPreviewCapability', _SelectItemForWorkshopPreviewCapability);\n        $.RegisterForUnhandledEvent(\"PanoramaComponent_TournamentMatch_DraftUpdate\", _TournamentDraftUpdate);\n        $.RegisterForUnhandledEvent('ShowLoadoutForItem', _ShowLoadoutForItem);\n        $.RegisterForUnhandledEvent('ShowAcknowledgePopup', _ShowAcknowledgePopup);\n        $.RegisterForUnhandledEvent('ShowStoreStatusPanel', _ShowStoreStatusPanel);\n        $.RegisterForUnhandledEvent('HideStoreStatusPanel', _HideStoreStatusPanel);\n        $.RegisterForUnhandledEvent('MainMenu_OnGoToCharacterLoadoutPressed', _OnGoToCharacterLoadoutPressed);\n        $.RegisterForUnhandledEvent('MainMenu_OnChangeClanTagPressed', _OnChangeClanTagPressed);\n        $.RegisterForUnhandledEvent(\"PanoramaComponent_EmbeddedStream_VideoPlaying\", _OnSteamIsPlaying);\n        $.RegisterForUnhandledEvent(\"StreamPanelClosed\", _ResetNewsEntryStyle);\n        $.RegisterForUnhandledEvent(\"HideMainMenuNewsPanel\", _HideMainMenuNewsPanel);\n        $.RegisterForUnhandledEvent(\"CSGOMainInitBackgroundMovie\", _MainInitBackgroundMovie);\n        $.RegisterForUnhandledEvent(\"MainMenuGoToSettings\", _OpenSettings);\n        $.RegisterForUnhandledEvent(\"MainMenuGoToStore\", _OpenFullscreenStore);\n        $.RegisterForUnhandledEvent(\"MainMenuGoToCharacterLoadout\", _GoToCharacterLoadout);\n        $.RegisterForUnhandledEvent(\"PanoramaComponent_PartyList_PlayerActivityVoice\", _PlayerActivityVoice);\n        $.RegisterForUnhandledEvent('PanoramaComponent_MyPersona_UpdateConnectionToGC', _CheckConnection);\n        MinimizeSidebar();\n        _InitVanity();\n        MinimizeSidebar();\n        _InitFriendsList();\n        $.RegisterForUnhandledEvent('CSGOMainMenuEscapeKeyPressed', OnEscapeKeyPressed);\n        $.RegisterForUnhandledEvent('PanoramaComponent_GC_Hello', _UpdateLocalPlayerVanity);\n        $.RegisterForUnhandledEvent('PanoramaComponent_FriendsList_ProfileUpdated', _UpdateLocalPlayerVanity);\n        $.RegisterForUnhandledEvent('PanoramaComponent_MyPersona_PipRankUpdate', _UpdateLocalPlayerVanity);\n        $.RegisterForUnhandledEvent('PanoramaComponent_FriendsList_NameChanged', _UpdateLocalPlayerVanity);\n        $.RegisterForUnhandledEvent('ShowFullScreenOpaquePopup', _OnShowFullScreenOpaquePopup);\n        $.RegisterForUnhandledEvent('CloseAllFullScreenOpaquePopups', _OnCloseAllFullScreenOpaquePopups);\n        $.RegisterForUnhandledEvent(\"CSGOWorkshopAnnotationSubscriptionsChanged\", () => _SetupAnnotationOptions(true));\n        $.RegisterForUnhandledEvent('VacNet_OnReviewerInfoReceived', _OnReviewInfoRecieved);\n    }\n})(MainMenu || (MainMenu = {}));\n","scripts/mainmenu_inventory.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"common/iteminfo.ts\" />\n/// <reference path=\"notification/notification_equip.ts\" />\n/// <reference path=\"popups/popup_acknowledge_item.ts\" />\n/// <reference path=\"mainmenu_inventory_search.ts\" />\nvar InventoryPanel;\n(function (InventoryPanel) {\n    let _m_activeCategory;\n    let _m_elInventoryMain = $.GetContextPanel().FindChildInLayoutFile('InventoryMain');\n    let _m_elInventorySearch = $.GetContextPanel().FindChildInLayoutFile('InvSearchPanel');\n    let _m_isCapabliltyPopupOpen = false;\n    let _m_InventoryUpdatedHandler = null;\n    let _m_bFilterRentals = false;\n    let _m_HiddenContentClassname = 'mainmenu-content--hidden';\n    function _Init() {\n        if (!_m_InventoryUpdatedHandler) {\n            _m_InventoryUpdatedHandler = $.RegisterForUnhandledEvent('PanoramaComponent_MyPersona_InventoryUpdated', _InventoryUpdated);\n        }\n        _RunEveryTimeInventoryIsShown();\n        _CreateCategoriesNavBar();\n        _InitMarketLink();\n        _InitXrayBtn();\n        _LoadEquipNotification();\n        _ShowHideRentalTab();\n    }\n    function _RunEveryTimeInventoryIsShown() {\n        _OnShowAcknowledgePanel();\n        if (!MyPersonaAPI.IsInventoryValid() || !MyPersonaAPI.IsConnectedToGC()) {\n            UiToolkitAPI.ShowGenericPopupOk($.Localize('#SFUI_SteamConnectionErrorTitle'), $.Localize('#SFUI_Steam_Error_LinkUnexpected'), '', () => $.DispatchEvent('HideContentPanel'));\n        }\n    }\n    function _CreateCategoriesNavBar() {\n        let aCategories = StripEmptyStringsFromArray(InventoryAPI.GetCategories().split(','));\n        let elCategoryBtns = _CreateCatagoryBtns(aCategories);\n        _CreateSubmenusAndListerPanelsForEachCategory(aCategories, _CreateInventoryContentPanel());\n        $.DispatchEvent(\"Activated\", elCategoryBtns.FindChildInLayoutFile(aCategories[0]), \"mouse\");\n        elCategoryBtns.Children()[0].checked = true;\n    }\n    function _CreateCatagoryBtns(aCategories) {\n        let elPanel = $.GetContextPanel().FindChildInLayoutFile('id-navbar-tabs-catagory-btns-container');\n        for (let category of aCategories) {\n            let elBtn = elPanel.FindChildInLayoutFile(category);\n            if (!elBtn) {\n                elBtn = $.CreatePanel('RadioButton', elPanel, category, {\n                    class: 'content-navbar__tabs__btn', group: 'inv-top-nav'\n                });\n                let tag = category;\n                let metaData = _GetMetadata(tag, '', '');\n                let nameToken = _GetValueForKeyFromMetadata('nametoken', metaData);\n                $.CreatePanel('Label', elBtn, '', {\n                    text: '#' + nameToken\n                });\n                elBtn.SetAttributeString('tag', tag);\n                elBtn.Data().tag = tag;\n                elBtn.SetPanelEvent('onactivate', () => NavigateToTab(tag));\n            }\n        }\n        return elPanel;\n    }\n    function _CreateInventoryContentPanel() {\n        return $.CreatePanel('Panel', _m_elInventoryMain, 'InventoryMenuContent', {\n            class: 'inv-category__list-container'\n        });\n    }\n    function _CreateSubmenusAndListerPanelsForEachCategory(aCategories, elParent) {\n        for (let tag of aCategories) {\n            if (tag) {\n                let subCategories = StripEmptyStringsFromArray(InventoryAPI.GetSubCategories(tag).split(','));\n                let elCategory = $.CreatePanel('Panel', elParent, tag, {\n                    class: 'inv-category'\n                });\n                _AddTransitionEventToPanel(elCategory);\n                let elNavBar = _CreateNavBar(tag, elCategory);\n                if (subCategories.length > 1) {\n                    _MakeNavBarButtons(elNavBar, subCategories, (subCategory) => {\n                        _UpdateFilterRentalBtnInCategoryVisibility(tag, subCategory);\n                        _UpdateActiveInventoryList();\n                    });\n                }\n                _AddSortDropdownToNavBar(elNavBar.GetParent(), false);\n                if (tag === 'any' || tag === 'inv_group_equipment') {\n                    _AddFilterToNavBar(elNavBar.GetParent());\n                }\n                $.CreatePanel('InventoryItemList', elCategory, tag + '-List');\n            }\n        }\n    }\n    function _AddTransitionEventToPanel(newPanel) {\n        $.RegisterEventHandler('PropertyTransitionEnd', newPanel, (panelName, propertyName) => {\n            if (propertyName === 'opacity') {\n                if (newPanel.visible === true && newPanel.BIsTransparent()) {\n                    newPanel.visible = false;\n                    return true;\n                }\n            }\n            return false;\n        });\n    }\n    function _CreateNavBar(idForNavBar, elParent) {\n        let elNavBar = $.CreatePanel('Panel', elParent, idForNavBar + '-NavBarParent', {\n            class: 'content-navbar__tabs content-navbar__tabs--dark content-navbar__tabs--noflow'\n        });\n        let elNavBarButtonsContainer = $.CreatePanel('Panel', elNavBar, idForNavBar + '-NavBar', {\n            class: 'content-navbar__tabs__center-container'\n        });\n        elNavBarButtonsContainer.SetAttributeString('data-type', idForNavBar);\n        return elNavBarButtonsContainer;\n    }\n    function _MakeNavBarButtons(elNavBar, listOfTags, onActivate) {\n        let groupName = elNavBar.id;\n        for (let tag of listOfTags) {\n            let elButton = $.CreatePanel('RadioButton', elNavBar, tag + 'Btn', {\n                group: groupName,\n                class: 'content-navbar__tabs__btn'\n            });\n            let metaData = {};\n            let catagory = elNavBar.GetAttributeString('data-type', '');\n            if (catagory === \"InvCategories\")\n                metaData = _GetMetadata(tag, '', '');\n            else\n                metaData = _GetMetadata(catagory, tag, '');\n            let nameToken = _GetValueForKeyFromMetadata('nametoken', metaData);\n            if (!nameToken) {\n                nameToken = _GetValueForKeyFromMetadata('nameprefix', metaData);\n                if (nameToken !== '')\n                    nameToken = nameToken + tag;\n            }\n            if (nameToken) {\n                $.CreatePanel('Label', elButton, '', {\n                    text: '#' + nameToken\n                });\n            }\n            else {\n                let icon = _GetValueForKeyFromMetadata('usetournamenticons', metaData);\n                if (icon) {\n                    let imageIndex = tag.replace(/^\\D+/g, '');\n                    $.CreatePanel('Image', elButton, '', {\n                        src: 'file://{images}/tournaments/events/tournament_logo_' + imageIndex + '.svg',\n                        textureheight: '48',\n                        scaling: 'stretch-to-fit-preserve-aspect'\n                    });\n                    nameToken = 'CSGO_Tournament_Event_NameShort_' + imageIndex;\n                    elButton.SetPanelEvent('onmouseover', () => UiToolkitAPI.ShowTextTooltip(elButton.id, nameToken));\n                    elButton.SetPanelEvent('onmouseout', () => UiToolkitAPI.HideTextTooltip());\n                }\n            }\n            if (onActivate)\n                elButton.SetPanelEvent('onactivate', () => onActivate(tag));\n            elButton.SetAttributeString('data-type', tag);\n            elButton.SetAttributeString('nice-name', nameToken);\n        }\n        elNavBar.GetChild(0).checked = true;\n    }\n    function _UpdateActiveInventoryList() {\n        if (_m_activeCategory === \"tradeup\") {\n            return;\n        }\n        let activePanel = _m_elInventoryMain.FindChildInLayoutFile(_m_activeCategory);\n        _UpdateActiveItemList(_GetActiveCategoryLister(activePanel), _m_activeCategory, _GetSelectedSubCategory(activePanel), _GetSelectedSort(activePanel), _GetFilterRentedItemsSetting(activePanel));\n    }\n    function NavigateToTab(category) {\n        if (_m_activeCategory !== category) {\n            if (_m_activeCategory) {\n                if (_m_activeCategory === 'tradeup') {\n                    _UpdateCraftingPanelVisibility(false);\n                }\n                else if (_m_activeCategory === 'search') {\n                    _UpdateSearchPanelVisibility(false);\n                }\n                else {\n                    let panelToHide = _m_elInventoryMain.FindChildInLayoutFile(_m_activeCategory);\n                    panelToHide.RemoveClass('Active');\n                }\n            }\n            _m_activeCategory = category;\n            if (category === \"tradeup\") {\n                _UpdateCraftingPanelVisibility(true);\n                $.GetContextPanel().FindChildInLayoutFile('InvCraftingBtn').checked = true;\n            }\n            else if (_m_activeCategory === 'search') {\n                _UpdateSearchPanelVisibility(true);\n                $.GetContextPanel().FindChildInLayoutFile('InvSearchPanel').checked = true;\n            }\n            else {\n                let activePanel = _m_elInventoryMain.FindChildInLayoutFile(category);\n                activePanel.AddClass('Active');\n                activePanel.visible = true;\n                activePanel.SetReadyForDisplay(true);\n                _m_activeCategory = category;\n                _UpdateFilterRentalBtnInCategoryVisibility(category);\n                _UpdateActiveItemList(_GetActiveCategoryLister(activePanel), category, _GetSelectedSubCategory(activePanel), _GetSelectedSort(activePanel), _GetFilterRentedItemsSetting(activePanel));\n            }\n        }\n    }\n    InventoryPanel.NavigateToTab = NavigateToTab;\n    function _AddSortDropdownToNavBar(elNavBar, bIsCapabliltyPopup) {\n        let elDropdown = elNavBar.FindChildInLayoutFile('InvSortDropdown');\n        if (!elDropdown) {\n            let elDropdownParent = $.CreatePanel('Panel', elNavBar, 'InvExtraNavOptions', { class: 'overflow-noclip' });\n            elDropdownParent.BLoadLayoutSnippet('InvSortDropdownSnippet');\n            elDropdown = elDropdownParent.FindChildInLayoutFile('InvSortDropdown');\n            let count = InventoryAPI.GetSortMethodsCount();\n            for (let i = 0; i < count; i++) {\n                let sort = InventoryAPI.GetSortMethodByIndex(i);\n                let newEntry = $.CreatePanel('Label', elDropdownParent, sort, {\n                    class: 'DropDownMenu'\n                });\n                newEntry.text = $.Localize('#' + sort);\n                elDropdown.AddOption(newEntry);\n            }\n            if (!bIsCapabliltyPopup) {\n                elDropdown.SetPanelEvent('oninputsubmit', () => _UpdateSort(elDropdown));\n            }\n            elDropdown.SetSelected(GameInterfaceAPI.GetSettingString(\"cl_inventory_saved_sort2\"));\n        }\n    }\n    function _AddFilterToNavBar(elNavBar) {\n        let elFilter = elNavBar.FindChildInLayoutFile('InvFilterRentedItems');\n        if (!elFilter) {\n            let elFilter = $.CreatePanel('ToggleButton', elNavBar, 'InvFilterRentedItems', { class: 'overflow-noclip' });\n            elFilter.BLoadLayoutSnippet('InvFilterRentedItemsSnippet');\n            elFilter.SetPanelEvent('onactivate', () => {\n                let activePanel = _m_elInventoryMain.FindChildInLayoutFile(_m_activeCategory);\n                let elDropdown = elNavBar.FindChildInLayoutFile('InvSortDropdown');\n                let dropdownSetting = elDropdown ? elDropdown.GetSelected().id : '';\n                elFilter.checked = !_m_bFilterRentals;\n                _m_bFilterRentals = elFilter.checked;\n                let filterSetting = elFilter.checked ? 'is_rental:false' : '';\n                _UpdateActiveItemList(_GetActiveCategoryLister(activePanel), _m_activeCategory, _GetSelectedSubCategory(activePanel), dropdownSetting, filterSetting);\n            });\n        }\n    }\n    function _GetFilterRentedItemsSetting(activePanel) {\n        if (activePanel) {\n            let elFilterBtn = activePanel.FindChildInLayoutFile('InvFilterRentedItems');\n            return (elFilterBtn && elFilterBtn.checked) ? 'is_rental:false' : '';\n        }\n        return '';\n    }\n    function _UpdateFilterRentalBtnInCategoryVisibility(category, subCategory = '') {\n        let elNavBtn = $.GetContextPanel().FindChildInLayoutFile(category + '-NavBarParent');\n        if (!elNavBtn || !elNavBtn.IsValid()) {\n            return;\n        }\n        let elFilterBtn = elNavBtn.FindChildInLayoutFile('InvFilterRentedItems');\n        if (!elFilterBtn || !elFilterBtn.IsValid()) {\n            return;\n        }\n        elFilterBtn.SetHasClass('hide', (category !== 'any' && category !== 'inv_group_equipment') ||\n            !InventoryAPI.CategoryContainsItems('rentals') ||\n            (subCategory === 'customplayer' ||\n                subCategory === 'misc' ||\n                subCategory === 'clothing_hands' ||\n                subCategory === 'musickit'));\n        if (!elFilterBtn.BHasClass('hide')) {\n            elFilterBtn.checked = _m_bFilterRentals;\n        }\n    }\n    function _UpdateSort(elDropdown) {\n        let activePanel = _m_elInventoryMain.FindChildInLayoutFile(_m_activeCategory);\n        if (activePanel) {\n            _UpdateActiveItemList(_GetActiveCategoryLister(activePanel), _m_activeCategory, _GetSelectedSubCategory(activePanel), elDropdown.GetSelected().id, _GetFilterRentedItemsSetting(activePanel));\n            if (typeof elDropdown.GetSelected().id === \"string\" && elDropdown.GetSelected().id !== GameInterfaceAPI.GetSettingString(\"cl_inventory_saved_sort2\")) {\n                GameInterfaceAPI.SetSettingString(\"cl_inventory_saved_sort2\", elDropdown.GetSelected().id);\n                GameInterfaceAPI.ConsoleCommand(\"host_writeconfig\");\n            }\n        }\n    }\n    function _ShowHideXrayBtn() {\n        let elXrayBtnContainer = $.GetContextPanel().FindChildInLayoutFile(\"InvXrayBtnContainer\");\n        let xrayRewardId = ItemInfo.GetItemsInXray().reward;\n        let sRestriction = InventoryAPI.GetDecodeableRestriction('capsule');\n        elXrayBtnContainer.visible = xrayRewardId !== '' &&\n            xrayRewardId !== undefined &&\n            xrayRewardId !== null &&\n            (sRestriction === 'xray' || !InventoryAPI.IsFauxItemID(xrayRewardId));\n    }\n    function _InitMarketLink() {\n        let elMarketLink = $.GetContextPanel().FindChildInLayoutFile(\"InvMarketBtn\");\n        if (MyPersonaAPI.GetLauncherType() === \"perfectworld\") {\n            elMarketLink.SetHasClass('hide', true);\n            return;\n        }\n        elMarketLink.SetHasClass('hide', false);\n        elMarketLink.SetPanelEvent('onactivate', onActivate);\n        let appId = SteamOverlayAPI.GetAppID();\n        let communityUrl = SteamOverlayAPI.GetSteamCommunityURL();\n        function onActivate() {\n            SteamOverlayAPI.OpenURL(communityUrl + \"/market/search?q=&appid=\" + appId + \"&lock_appid=\" + appId);\n        }\n    }\n    function _InitXrayBtn() {\n        _ShowHideXrayBtn();\n        $.GetContextPanel().FindChildrenWithClassTraverse('inv-nav-solid-btn-notification').forEach(el => el.SetDialogVariable('alert_value', '1'));\n        let elXrayBtn = $.GetContextPanel().FindChildInLayoutFile(\"InvXrayBtnContainer\");\n        elXrayBtn.SetPanelEvent('onactivate', () => {\n            let oData = ItemInfo.GetItemsInXray();\n            let keyId = ItemInfo.GetKeyForCaseInXray(oData.case);\n            $.DispatchEvent(\"ShowXrayCasePopup\", keyId, oData.case, false);\n        });\n    }\n    function _GotoTradeUpPanel() {\n        NavigateToTab('tradeup');\n    }\n    function _HideInventoryMainListers() {\n        if (_m_activeCategory === \"search\") {\n            $('#InvSearchPanel').AddClass(_m_HiddenContentClassname);\n        }\n        else if (_m_activeCategory === \"tradeup\") {\n            $('#InvCraftingPanel').AddClass(_m_HiddenContentClassname);\n        }\n        else {\n            _m_elInventoryMain.AddClass(_m_HiddenContentClassname);\n        }\n    }\n    function _ShowInventoryMainListers() {\n        if (_m_activeCategory === \"search\") {\n            $('#InvSearchPanel').RemoveClass(_m_HiddenContentClassname);\n        }\n        else if (_m_activeCategory === \"tradeup\") {\n            $('#InvCraftingPanel').RemoveClass(_m_HiddenContentClassname);\n        }\n        else {\n            _m_elInventoryMain.RemoveClass(_m_HiddenContentClassname);\n        }\n    }\n    function _UpdateCraftingPanelVisibility(bShow) {\n        let elCrafting = $('#InvCraftingPanel');\n        if (bShow) {\n            if (elCrafting.BHasClass(_m_HiddenContentClassname)) {\n                elCrafting.RemoveClass(_m_HiddenContentClassname);\n                elCrafting.SetFocus();\n                $.GetContextPanel().FindChildTraverse('Crafting-Items').SetReadyForDisplay(true);\n                $.GetContextPanel().FindChildTraverse('Crafting-Ingredients').SetReadyForDisplay(true);\n                let RecipeId = InventoryAPI.GetTradeUpContractItemID();\n                let strCraftingFilter = InventoryAPI.GetItemAttributeValue(RecipeId, \"recipe filter\");\n                InventoryAPI.SetInventorySortAndFilters('inv_sort_age', false, 'ingredient', '', '');\n                if (InventoryAPI.GetInventoryCount() !== 1) {\n                    InventoryAPI.ClearCraftIngredients();\n                }\n                InventoryAPI.SetCraftTarget(Number(strCraftingFilter));\n                $.DispatchEvent('UpdateTradeUpPanel');\n            }\n        }\n        else {\n            elCrafting.AddClass(_m_HiddenContentClassname);\n            _m_elInventoryMain.SetFocus();\n            $.GetContextPanel().FindChildTraverse('Crafting-Items').SetReadyForDisplay(false);\n            $.GetContextPanel().FindChildTraverse('Crafting-Ingredients').SetReadyForDisplay(false);\n            InventoryAPI.ClearCraftIngredients();\n            return true;\n        }\n    }\n    function _UpdateCraftingPanelContentsIfCrafting() {\n        let elCrafting = $('#InvCraftingPanel');\n        if (!elCrafting.BHasClass(_m_HiddenContentClassname)) {\n            $.DispatchEvent('UpdateTradeUpPanel');\n        }\n    }\n    function _UpdateSearchPanelVisibility(bShow) {\n        let elSearch = $('#InvSearchPanel');\n        if (bShow) {\n            if (elSearch.BHasClass(_m_HiddenContentClassname)) {\n                elSearch.RemoveClass(_m_HiddenContentClassname);\n                elSearch.SetFocus();\n            }\n        }\n        else {\n            elSearch.AddClass(_m_HiddenContentClassname);\n            _m_elInventoryMain.SetFocus();\n            return true;\n        }\n    }\n    function _ClosePopups() {\n        if (_m_elInventoryMain.updatePlayerEquipSlotChangedHandler) {\n            $.UnregisterForUnhandledEvent('PanoramaComponent_Loadout_EquipSlotChanged', _m_elInventoryMain.updatePlayerEquipSlotChangedHandler);\n            _m_elInventoryMain.updatePlayerEquipSlotChangedHandler = null;\n        }\n        if (_m_InventoryUpdatedHandler) {\n            $.UnregisterForUnhandledEvent('PanoramaComponent_MyPersona_InventoryUpdated', _m_InventoryUpdatedHandler);\n            _m_InventoryUpdatedHandler = null;\n        }\n        return false;\n    }\n    function _GetActiveCategoryLister(activePanel) {\n        if (activePanel) {\n            let elList = activePanel.FindChildInLayoutFile(_m_activeCategory + '-List');\n            return (elList) ? elList : null;\n        }\n        return null;\n    }\n    function _GetSelectedSort(activePanel) {\n        let elDropdown = null;\n        if (activePanel) {\n            elDropdown = activePanel.FindChildInLayoutFile('InvSortDropdown');\n        }\n        return (elDropdown) ? elDropdown.GetSelected().id : '';\n    }\n    function _GetSelectedSubCategoryPanel(activePanel) {\n        if (!activePanel || !activePanel.IsValid()) {\n            return null;\n        }\n        let elSubCategoryNavBar = activePanel.FindChildInLayoutFile(_m_activeCategory + '-NavBar');\n        if (!elSubCategoryNavBar) {\n            return null;\n        }\n        let tabs = elSubCategoryNavBar.Children();\n        tabs = tabs.filter(e => e.checked);\n        return tabs;\n    }\n    function _GetSelectedSubCategory(activePanel) {\n        let tabs = _GetSelectedSubCategoryPanel(activePanel);\n        return (tabs && tabs.length > 0) ? tabs[0].GetAttributeString('data-type', 'any') : 'any';\n    }\n    function StripEmptyStringsFromArray(dataRaw) {\n        return dataRaw.filter(v => v !== '');\n    }\n    function _GetValueForKeyFromMetadata(key, metaData) {\n        if (metaData.hasOwnProperty(key))\n            return metaData[key];\n        return '';\n    }\n    function _GetMetadata(category, subCategory, group) {\n        return JSON.parse(InventoryAPI.GetInventoryStructureJSON(category, subCategory, group));\n    }\n    function _IsSearchActivePanel(category) {\n        return category === 'InvSearchPanel';\n    }\n    function _UpdateActiveItemList(elListerToUpdate, category, subCategory, sortString, capabilityFilter) {\n        if (!elListerToUpdate || !subCategory || !category) {\n            return;\n        }\n        if (_IsSearchActivePanel(category)) {\n            InventorySearch.UpdateItemList();\n            return;\n        }\n        $.DispatchEvent('SetInventoryFilter', elListerToUpdate, category, subCategory, 'any', sortString, capabilityFilter, '');\n        _ShowHideNoItemsMessage(elListerToUpdate);\n    }\n    function _ShowHideNoItemsMessage(elLister) {\n        let count = elLister.count;\n        let elParent = elLister.GetParent();\n        let elEmpty = elParent.FindChildInLayoutFile('JsInvEmptyLister');\n        if (count > 0) {\n            if (elEmpty) {\n                elEmpty.DeleteAsync(0.0);\n            }\n            return;\n        }\n        let elNewEmpty = elParent.FindChildInLayoutFile('JsInvEmptyLister');\n        if (!elNewEmpty) {\n            elNewEmpty = $.CreatePanel('Panel', elParent, 'JsInvEmptyLister');\n            elNewEmpty.BLoadLayoutSnippet('InvEmptyLister');\n            elParent.MoveChildBefore(elNewEmpty, elLister);\n        }\n        let activePanel = _m_elInventoryMain.FindChildInLayoutFile(_m_activeCategory);\n        let elSubCat = _GetSelectedSubCategoryPanel(activePanel);\n        let elLabel = elNewEmpty.FindChildInLayoutFile('JsInvEmptyListerLabel');\n        const str = $.Localize(\"#\" + elSubCat[0].GetAttributeString('nice-name', ''));\n        elLabel.SetDialogVariable('type', str);\n        elLabel.text = $.Localize('#inv_empty_lister', elLabel);\n    }\n    function _OnReadyForDisplay() {\n        _RunEveryTimeInventoryIsShown();\n        _UpdateActiveInventoryList();\n        _ShowHideRentalTab();\n        _UpdateCraftingPanelContentsIfCrafting();\n        if (!_m_elInventoryMain.updatePlayerEquipSlotChangedHandler) {\n            _m_elInventoryMain.updatePlayerEquipSlotChangedHandler = $.RegisterForUnhandledEvent('PanoramaComponent_Loadout_EquipSlotChanged', _ShowNotification);\n        }\n        if (!_m_InventoryUpdatedHandler) {\n            _m_InventoryUpdatedHandler = $.RegisterForUnhandledEvent('PanoramaComponent_MyPersona_InventoryUpdated', _InventoryUpdated);\n        }\n    }\n    function _InventoryUpdated() {\n        _ShowHideXrayBtn();\n        _ShowHideRentalTab();\n        _UpdateFilterRentalBtnInCategoryVisibility(_m_activeCategory);\n        _UpdateCraftingPanelContentsIfCrafting();\n        if ($.GetContextPanel().BHasClass(_m_HiddenContentClassname) || _m_isCapabliltyPopupOpen)\n            return;\n        _OnShowAcknowledgePanel();\n        if (!_m_elInventorySearch.BHasClass(_m_HiddenContentClassname)) {\n            InventorySearch.UpdateItemList();\n        }\n        else if (_m_activeCategory) {\n            _UpdateActiveInventoryList();\n        }\n    }\n    function _OnShowAcknowledgePanel() {\n        let itemsToAcknowledge = AcknowledgeItems.GetItems();\n        if (itemsToAcknowledge.length > 0) {\n            $.DispatchEvent('ShowAcknowledgePopup', '', '');\n        }\n    }\n    function _SetIsCapabilityPopUpOpen(isOpen) {\n        _m_isCapabliltyPopupOpen = isOpen;\n        if (isOpen === false) {\n            _InventoryUpdated();\n        }\n    }\n    function _ShowDeleteItemConfirmation(id) {\n        UiToolkitAPI.ShowGenericPopupYesNo('#inv_context_delete', '#inv_confirm_delete_desc', \"\", () => _DeleteItemAnim(id), () => { });\n    }\n    function _DeleteItemAnim(id) {\n        let activePanel = _m_elInventoryMain.FindChildInLayoutFile(_m_activeCategory);\n        let elList = _GetActiveCategoryLister(activePanel);\n        let childrenList = elList.Children();\n        for (let element of childrenList) {\n            if (id === element.GetAttributeString('itemid', '0')) {\n                element.AddClass('delete');\n            }\n        }\n        $.Schedule(.3, () => InventoryAPI.DeleteItem(id));\n    }\n    function _ShowUseItemOnceConfirmationPopup(id) {\n        let pPopup = UiToolkitAPI.ShowGenericPopupYesNo('#inv_context_useitem', '#inv_confirm_useitem_desc', \"\", () => InventoryAPI.UseTool(id, ''), () => { });\n        if (pPopup != null) {\n            pPopup.SetDialogVariable('type', InventoryAPI.GetItemName(id));\n        }\n    }\n    function _LoadEquipNotification() {\n        let elParent = $.GetContextPanel().FindChildInLayoutFile('InventoryMainContainer');\n        let elNotification = $.CreatePanel('Panel', elParent, 'InvNotificationEquip');\n        elNotification.BLoadLayout('file://{resources}/layout/notification/notification_equip.xml', false, false);\n    }\n    function _ShowNotification(team, slot, oldItemId, newItemId, bNew) {\n        if (!bNew || _m_isCapabliltyPopupOpen || $.GetContextPanel().BHasClass(_m_HiddenContentClassname)) {\n            return;\n        }\n        let elNotification = $.GetContextPanel().FindChildInLayoutFile('InvNotificationEquip');\n        EquipNotification.ShowEquipNotification(elNotification, slot, newItemId);\n    }\n    function _ShowHideRentalTab() {\n        let elNavBarBtnsContainer = $.GetContextPanel().FindChildInLayoutFile('id-navbar-tabs-catagory-btns-container');\n        if (elNavBarBtnsContainer) {\n            let elNavBarRentalsBtn = elNavBarBtnsContainer.FindChild('rentals');\n            if (elNavBarRentalsBtn) {\n                let bInventoryContainsRentals = InventoryAPI.CategoryContainsItems('rentals');\n                if (!bInventoryContainsRentals && _m_activeCategory === 'rentals') {\n                    let elNavBarEverythingBtn = elNavBarBtnsContainer.FindChild('any');\n                    if (elNavBarEverythingBtn) {\n                        elNavBarEverythingBtn.checked = true;\n                        NavigateToTab('any');\n                    }\n                }\n                elNavBarRentalsBtn.SetHasClass('hide', !bInventoryContainsRentals);\n            }\n        }\n    }\n    {\n        _Init();\n        let elJsInventory = $('#JsInventory');\n        $.RegisterEventHandler('ReadyForDisplay', elJsInventory, _OnReadyForDisplay);\n        $.RegisterEventHandler('UnreadyForDisplay', elJsInventory, _ClosePopups);\n        $.RegisterEventHandler('Cancelled', elJsInventory, _ClosePopups);\n        $.RegisterForUnhandledEvent('CapabilityPopupIsOpen', _SetIsCapabilityPopUpOpen);\n        $.RegisterForUnhandledEvent('RefreshActiveInventoryList', _InventoryUpdated);\n        $.RegisterForUnhandledEvent('ShowDeleteItemConfirmationPopup', _ShowDeleteItemConfirmation);\n        $.RegisterForUnhandledEvent('ShowUseItemOnceConfirmationPopup', _ShowUseItemOnceConfirmationPopup);\n        $.RegisterForUnhandledEvent('PanoramaComponent_Inventory_CraftIngredientAdded', () => NavigateToTab('tradeup'));\n        $.RegisterForUnhandledEvent('ShowTradeUpPanel', _GotoTradeUpPanel);\n    }\n})(InventoryPanel || (InventoryPanel = {}));\n","scripts/mainmenu_inventory_search.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\nvar InventorySearch;\n(function (InventorySearch) {\n    let m_elList = null;\n    let m_elSearchPanel = $.GetContextPanel();\n    let m_elSuggestedPanel = null;\n    let m_InventoryUpdatedHandler = null;\n    function _Init() {\n        _RegisterForInventoryUpdate();\n        let elTextEntry = m_elSearchPanel.FindChildInLayoutFile('InvSearchTextEntry');\n        elTextEntry.SetPanelEvent('ontextentrychange', UpdateItemList);\n        _PopulateSuggested(m_elSearchPanel.FindChildInLayoutFile('InvSearchSuggestionsList'));\n        _TextEntrySettings.SetTextEntryPanel(elTextEntry);\n        m_elSuggestedPanel = m_elSearchPanel.FindChildInLayoutFile('InvSearchSuggestions');\n        m_elList = m_elSearchPanel.FindChildInLayoutFile('InvSearchPanel-List');\n        _AddSortDropdownEntries();\n        UpdateItemList();\n    }\n    function _RegisterForInventoryUpdate() {\n        m_InventoryUpdatedHandler = $.RegisterForUnhandledEvent('PanoramaComponent_MyPersona_InventoryUpdated', UpdateItemList);\n        m_elSearchPanel.RegisterForReadyEvents(true);\n        $.RegisterEventHandler('ReadyForDisplay', m_elSearchPanel, () => {\n            if (!m_InventoryUpdatedHandler) {\n                m_InventoryUpdatedHandler = $.RegisterForUnhandledEvent('PanoramaComponent_MyPersona_InventoryUpdated', UpdateItemList);\n            }\n        });\n        $.RegisterEventHandler('UnreadyForDisplay', m_elSearchPanel, () => {\n            if (m_InventoryUpdatedHandler) {\n                $.UnregisterForUnhandledEvent('PanoramaComponent_MyPersona_InventoryUpdated', m_InventoryUpdatedHandler);\n                m_InventoryUpdatedHandler = null;\n            }\n        });\n    }\n    function UpdateItemList() {\n        if (!m_elList) {\n            return;\n        }\n        let filterString = _TextEntrySettings.GetText();\n        if (filterString === '') {\n            _ShowHideSuggestedPanel(true);\n        }\n        else {\n            let sortText = m_elSearchPanel.FindChildInLayoutFile('InvSortDropdown').GetSelected().id;\n            $.DispatchEvent('SetInventoryFilter', m_elList, 'any', 'any', 'any', sortText, '', filterString);\n            _ShowHideSuggestedPanel(m_elList.count < 1);\n        }\n    }\n    InventorySearch.UpdateItemList = UpdateItemList;\n    let _TextEntrySettings;\n    (function (_TextEntrySettings) {\n        let elTextEntry = null;\n        function SetTextEntryPanel(elPanel) {\n            elTextEntry = elPanel;\n        }\n        _TextEntrySettings.SetTextEntryPanel = SetTextEntryPanel;\n        function UpdateText(selectedEntryText) {\n            elTextEntry.text = selectedEntryText;\n        }\n        _TextEntrySettings.UpdateText = UpdateText;\n        function GetText() {\n            return elTextEntry ? elTextEntry.text : '';\n        }\n        _TextEntrySettings.GetText = GetText;\n    })(_TextEntrySettings || (_TextEntrySettings = {}));\n    function _PopulateSuggested(elSearchResults) {\n        let settings = {\n            0: ['inv_sort_rarity', 'melee'],\n            1: ['inv_sort_age', 'not_equipment'],\n            2: ['inv_sort_rarity', 'rifle'],\n            3: ['inv_sort_age', 'flair0'],\n            4: ['inv_sort_rarity', 'smg'],\n            5: ['inv_sort_age', 'spray'],\n            6: ['inv_sort_rarity', 'secondary']\n        };\n        let delay = 0.25;\n        let count = 0;\n        for (let entry of Object.values(settings)) {\n            count++;\n            let sortType = entry[0];\n            let searchText = entry[1];\n            $.Schedule(count * delay, () => {\n                let id = _GetSuggested(sortType, searchText);\n                if (id !== '')\n                    _AddSuggestedEntry(id, elSearchResults);\n            });\n        }\n    }\n    function _GetSuggested(sortType, searchText) {\n        InventoryAPI.SetInventorySortAndFilters(sortType, false, searchText, '', '');\n        let count = InventoryAPI.GetInventoryCount();\n        let itemsList = [];\n        let itemsValid = 0;\n        let itemsNeedToCollect = 5;\n        for (let i = 0; i < count; i++) {\n            let itemId = InventoryAPI.GetInventoryItemIDByIndex(i);\n            itemsValid++;\n            itemsList.push(itemId);\n            if (itemsValid > itemsNeedToCollect)\n                break;\n        }\n        let countValidItems = itemsList.length;\n        if (countValidItems > 0) {\n            let index = countValidItems > itemsNeedToCollect ?\n                Math.floor(Math.random() * itemsNeedToCollect) :\n                Math.floor(Math.random() * countValidItems);\n            return itemsList[index];\n        }\n        return '';\n    }\n    function _AddSuggestedEntry(id, elSearchResults) {\n        let elEntry = $.CreatePanel('Panel', elSearchResults, id);\n        elEntry.BLoadLayoutSnippet('SuggestedEntry');\n        let itemName = InventoryAPI.GetItemName(id);\n        elEntry.SetPanelEvent('onactivate', () => {\n            _TextEntrySettings.UpdateText(itemName);\n        });\n        elEntry.SetDialogVariable('suggestion_text', itemName);\n        let elImage = elEntry.FindChildInLayoutFile('SuggestedImage');\n        elImage.itemid = id;\n        let elPanel = elEntry.FindChildInLayoutFile('SuggestedRarity');\n        elPanel.style.washColor = InventoryAPI.GetItemRarityColor(id);\n    }\n    function _ShowHideSuggestedPanel(bShow) {\n        m_elSuggestedPanel.SetHasClass('collapse', !bShow);\n        m_elList.SetHasClass('hide', bShow);\n    }\n    function _AddSortDropdownEntries() {\n        let elDropdown = m_elSearchPanel.FindChildInLayoutFile('InvSortDropdown');\n        elDropdown.SetPanelEvent('oninputsubmit', UpdateItemList);\n        let count = InventoryAPI.GetSortMethodsCount();\n        for (let i = 0; i < count; i++) {\n            let sort = InventoryAPI.GetSortMethodByIndex(i);\n            let newEntry = $.CreatePanel('Label', elDropdown, sort, {\n                class: 'DropDownMenu'\n            });\n            newEntry.text = $.Localize('#' + sort);\n            elDropdown.AddOption(newEntry);\n        }\n        elDropdown.SetSelected(InventoryAPI.GetSortMethodByIndex(0));\n    }\n    {\n        _Init();\n    }\n})(InventorySearch || (InventorySearch = {}));\n","scripts/mainmenu_license.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"common/licenseutil.ts\" />\nvar MainMenulicense;\n(function (MainMenulicense) {\n    const _m_licensePanel = $.GetContextPanel();\n    function Init() {\n        CheckLicense();\n    }\n    function CheckLicense() {\n        let restrictions = LicenseUtil.GetCurrentLicenseRestrictions();\n        if (restrictions) {\n            _m_licensePanel.SetDialogVariable('restriction', $.Localize(restrictions.license_msg));\n            _m_licensePanel.SetDialogVariable('restriction_act', $.Localize(restrictions.license_act));\n        }\n        _m_licensePanel.SetHasClass('hidden', !restrictions);\n        SetStyleOnRootPanel(restrictions);\n    }\n    function ActionBuyLicense() {\n        let restrictions = LicenseUtil.GetCurrentLicenseRestrictions();\n        LicenseUtil.BuyLicenseForRestrictions(restrictions);\n    }\n    MainMenulicense.ActionBuyLicense = ActionBuyLicense;\n    function SetStyleOnRootPanel(restrictions) {\n        let elMainMenuInput = _m_licensePanel;\n        while (elMainMenuInput) {\n            elMainMenuInput = elMainMenuInput.GetParent();\n            if (elMainMenuInput.id === 'MainMenuInput')\n                break;\n        }\n        if (elMainMenuInput) {\n            elMainMenuInput.SetHasClass('steam-license-restricted', restrictions !== false);\n        }\n    }\n    {\n        Init();\n        $.RegisterForUnhandledEvent('PanoramaComponent_MyPersona_GcLogonNotificationReceived', Init);\n        $.RegisterForUnhandledEvent('PanoramaComponent_MyPersona_UpdateConnectionToGC', Init);\n    }\n})(MainMenulicense || (MainMenulicense = {}));\n","scripts/mainmenu_major_tile.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"common/licenseutil.ts\" />\n/// <reference path=\"generated/items_event_current_generated_store.d.ts\" />\n/// <reference path=\"generated/items_event_current_generated_store.ts\" />\nvar MainMenuMajorTile;\n(function (MainMenuMajorTile) {\n    const _m_cp = $.GetContextPanel();\n    function _Init() {\n        const bForceHidden = true;\n        let bVisible = !bForceHidden;\n        if (!MyPersonaAPI.IsConnectedToGC())\n            bVisible = false;\n        else if (LicenseUtil.GetCurrentLicenseRestrictions())\n            bVisible = false;\n        else if (!g_ActiveTournamentInfo.active)\n            bVisible = false;\n        _m_cp.SetHasClass('hidden', !bVisible);\n        if (!bVisible)\n            return;\n        StoreAPI.VolatileShopSubscribe(g_ActiveTournamentInfo.itemid_rankings_stickers, false);\n        _m_cp.FindChildInLayoutFile('id-img-open-major-hub').SetPanelEvent('onactivate', OpenMajorHub);\n        _m_cp.SetHasClass('major-' + g_ActiveTournamentInfo.eventid.toString(), true);\n        _m_cp.FindChildInLayoutFile('id-major-promo-image').SetImage('file://{images}/tournaments/backgrounds/pickem_mainmenu_promo_' + g_ActiveTournamentInfo.eventid + '.psd');\n        let bHasActualCapsulesForPurchase = false;\n        _m_cp.SetHasClass('has-reduction', false);\n        let tournamentEventId = NewsAPI.GetActiveTournamentEventID();\n        if ((tournamentEventId !== 0)) {\n            let arrSorted = [];\n            const defidxStickerItem = InventoryAPI.GetItemDefinitionIndexFromDefinitionName('sticker');\n            const fnStickerKit = (nStickerKit) => {\n                const fauxId = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(defidxStickerItem, nStickerKit);\n                const cHigh = MissionsAPI.GetSeasonalOperationFauxItemTrend(g_ActiveTournamentInfo.credits_id, fauxId, 'high');\n                const cPrice = MissionsAPI.GetSeasonalOperationFauxCreditsCost(g_ActiveTournamentInfo.credits_id, fauxId);\n                const weeklyPctReductionFromHigh = (cHigh > cPrice) ? ((cHigh - cPrice) * 100.0 / cHigh) : 0.0;\n                arrSorted.push({ discount: weeklyPctReductionFromHigh, price: cPrice, fauxid: fauxId });\n            };\n            g_ActiveTournamentTeams.forEach((tt) => {\n                tt.players.forEach((tp) => tp.rankingids.forEach(fnStickerKit));\n            });\n            g_ActiveTournamentInfo.rankingids.forEach(fnStickerKit);\n            for (let i = arrSorted.length; i-- > 0;) {\n                const j = Math.floor(Math.random() * (i + 1));\n                [arrSorted[i], arrSorted[j]] = [arrSorted[j], arrSorted[i]];\n            }\n            arrSorted.sort((a, b) => b.price - a.price);\n            const nBaseIndex = Math.floor(Math.random() * (arrSorted.length / 10));\n            let elParent = $.GetContextPanel().FindChildInLayoutFile('id-major-mini-store-carousel');\n            const _m_numMiniStoreItemsToShow = 10;\n            for (let i = 0; i < _m_numMiniStoreItemsToShow; i++) {\n                const nIndex = nBaseIndex + i;\n                let elTile = elParent.FindChildInLayoutFile('id-mini-store-tile-' + i);\n                if (!elTile) {\n                    elTile = $.CreatePanel('Button', elParent, 'id-mini-store-tile-' + i);\n                    elTile.BLoadLayoutSnippet('major-shop-item');\n                    elTile.hittest = false;\n                }\n                elTile.FindChildInLayoutFile('id-item-image').itemid = arrSorted[nIndex].fauxid;\n                elTile.SetDialogVariableInt('price', arrSorted[nIndex].price);\n                elTile.FindChildInLayoutFile('id-item-inspect-btn').SetPanelEvent('onactivate', () => {\n                    const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('', 'file://{resources}/layout/popups/popup_inventory_inspect.xml');\n                    let oSettings = {\n                        item_id: arrSorted[nIndex].fauxid,\n                        inspect_only: true,\n                        hide_all_action_items: true,\n                        price_in_tokens: arrSorted[nIndex].price,\n                    };\n                    elPanel.Data().oSettings = oSettings;\n                });\n            }\n            bHasActualCapsulesForPurchase = true;\n        }\n        _m_cp.SetDialogVariable('hub-title-bar-caption', $.Localize(bHasActualCapsulesForPurchase ? '#mainmenu_major_hub' : '#mainmenu_major_hub_no_items'));\n        _m_cp.SetHasClass('can-sell-items', bHasActualCapsulesForPurchase);\n    }\n    function OpenMajorHub() {\n        UiToolkitAPI.ShowCustomLayoutPopupParameters('id-popup-major-hub', 'file://{resources}/layout/popups/popup_major_hub.xml', 'eventid=' + (g_ActiveTournamentInfo.eventid));\n    }\n    {\n        _Init();\n        $.RegisterForUnhandledEvent('PanoramaComponent_MyPersona_GcLogonNotificationReceived', _Init);\n        $.RegisterForUnhandledEvent('PanoramaComponent_MyPersona_UpdateConnectionToGC', _Init);\n        $.RegisterForUnhandledEvent('PanoramaComponent_Store_PriceSheetChanged', _Init);\n        $.RegisterForUnhandledEvent('PanoramaComponent_Store_VolatileShopSubscribe', _Init);\n    }\n})(MainMenuMajorTile || (MainMenuMajorTile = {}));\n","scripts/mainmenu_mini_store.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"common/licenseutil.ts\" />\n/// <reference path=\"common/store_items.ts\" />\n/// <reference path=\"itemtile_store.ts\" />\nvar MainMenuMiniStore;\n(function (MainMenuMiniStore) {\n    const _m_StorePanel = $.GetContextPanel();\n    function _Init() {\n        if (!MyPersonaAPI.IsConnectedToGC()) {\n            _m_StorePanel.SetHasClass('hidden', true);\n            return;\n        }\n        let restrictions = LicenseUtil.GetCurrentLicenseRestrictions();\n        if (restrictions) {\n            _m_StorePanel.SetHasClass('hidden', true);\n            return;\n        }\n        $.GetContextPanel().FindChildInLayoutFile('id-open-fullscreen-store-btn').SetPanelEvent('onactivate', () => {\n            $.DispatchEvent('MainMenuGoToStore', '');\n        });\n        _GetStoreItems();\n    }\n    function _GetStoreItems() {\n        if (StoreItems.GetStoreItems().coupon && StoreItems.GetStoreItems().coupon.length < 1) {\n            StoreItems.MakeStoreItemList();\n        }\n        let aItemsList = StoreItems.GetStoreItems().coupon;\n        if (aItemsList.length < 1) {\n            _m_StorePanel.SetHasClass('hidden', true);\n            return;\n        }\n        _MakeStoreItemTiles(aItemsList);\n        _m_StorePanel.SetHasClass('hidden', false);\n    }\n    let _m_numMiniStoreItemsToShow = 5;\n    function _MakeStoreItemTiles(aItemsList) {\n        let elParent = $.GetContextPanel().FindChildInLayoutFile('id-mini-store-carousel');\n        let numNewPinnedOffers = 0;\n        for (let i = 0; i < aItemsList.length; i++) {\n            let oItemData = aItemsList[i];\n            if (oItemData.isNewRelease)\n                ++numNewPinnedOffers;\n            else\n                break;\n        }\n        _m_numMiniStoreItemsToShow = Math.max(_m_numMiniStoreItemsToShow, numNewPinnedOffers);\n        for (let i = 0; i < _m_numMiniStoreItemsToShow; i++) {\n            let oItemData = aItemsList[i];\n            oItemData.isDisplayedInMainMenu = true;\n            let elTile = elParent.FindChildInLayoutFile('id-mini-store-tile' + aItemsList[i].id);\n            if (!elTile) {\n                elTile = $.CreatePanel('Button', elParent, 'id-mini-store-tile' + aItemsList[i].id);\n                elTile.BLoadLayout('file://{resources}/layout/itemtile_store.xml', false, false);\n            }\n            ItemTileStore.Init(elTile, aItemsList[i]);\n        }\n    }\n    {\n        _Init();\n        $.RegisterForUnhandledEvent('PanoramaComponent_MyPersona_GcLogonNotificationReceived', _Init);\n        $.RegisterForUnhandledEvent('PanoramaComponent_MyPersona_UpdateConnectionToGC', _Init);\n        $.RegisterForUnhandledEvent('PanoramaComponent_Store_PriceSheetChanged', _Init);\n    }\n})(MainMenuMiniStore || (MainMenuMiniStore = {}));\n","scripts/mainmenu_missions.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\nvar MainMenuMissions;\n(function (MainMenuMissions) {\n    const _m_missionPanel = $.GetContextPanel();\n    function Init() {\n        UpdateMissionEntries();\n    }\n    function UpdateMissionEntries() {\n        let missionInfo = MissionsAPI.GetRecurringMission();\n        const missionContainer = $(\"#mission-container-root\");\n        if (!missionContainer)\n            return;\n        missionContainer.RemoveAndDeleteChildren();\n        if (missionInfo != undefined) {\n            if (missionContainer) {\n                $.GetContextPanel().RemoveClass('hidden');\n                const elMissionPanel = $.CreatePanel('Button', missionContainer, missionInfo.name);\n                elMissionPanel.BLoadLayoutSnippet(\"mission\");\n                const elNameLabel = elMissionPanel.FindChildTraverse(\"name\");\n                elNameLabel.text = missionInfo.loc_description;\n                elMissionPanel.SetDialogVariableInt(\"progress\", missionInfo.progress_saved);\n                elMissionPanel.SetDialogVariableInt(\"points\", missionInfo.goal_points[0]);\n                elMissionPanel.SetDialogVariableInt(\"xp\", Number(missionInfo.xp_reward[0]));\n                elMissionPanel.SetPanelEvent(\"onactivate\", PlayMission.bind(undefined, missionInfo));\n                function ExtractStringTokens(string_tokens) {\n                    for (const k in string_tokens) {\n                        if (typeof string_tokens[k] === 'object' && !Array.isArray(string_tokens[k]) && string_tokens[k] !== null) {\n                            ExtractStringTokens(string_tokens[k]);\n                        }\n                        const val = string_tokens[k];\n                        elMissionPanel.SetDialogVariableLocString(k, val);\n                    }\n                }\n                if (missionInfo.string_tokens) {\n                    ExtractStringTokens(missionInfo.string_tokens);\n                    let imagePath = 'undefined';\n                    if (missionInfo.hasOwnProperty('mapgroup') && missionInfo.mapgroup != '') {\n                        const cfg = GameTypesAPI.GetConfig();\n                        const mg = cfg.mapgroups[missionInfo['mapgroup']];\n                        const keysList = Object.keys(mg.maps);\n                        imagePath = keysList[0];\n                    }\n                    else if (missionInfo.hasOwnProperty('map') && missionInfo.map != '' && missionInfo.map) {\n                        imagePath = missionInfo.map;\n                    }\n                    const elBg = $.GetContextPanel().FindChildTraverse('id-mission-art');\n                    elBg.style.backgroundImage = 'url(\"file://{images}/map_icons/screenshots/720p/' + (imagePath) + '.png\")';\n                }\n            }\n        }\n        else {\n            $.GetContextPanel().AddClass('hidden');\n        }\n    }\n    function PlayMission(m) {\n        LobbyAPI.CreateSession();\n        const gameMode = m.gamemode;\n        let gameType = \"classic\";\n        let gmFlags = 0;\n        if (gameMode === \"deathmatch\") {\n            gameType = \"gungame\";\n            gmFlags = 32;\n        }\n        let mg = m.mapgroup;\n        if (gameMode == \"competitive\") {\n            mg = \"mg_\" + m.map;\n            gmFlags = 16;\n        }\n        var settings = {\n            update: {\n                Options: {\n                    action: \"custommatch\",\n                    server: \"official\"\n                },\n                Game: {\n                    mode: gameMode,\n                    type: gameType,\n                    mapgroupname: mg,\n                    map: m.map,\n                    gamemodeflags: gmFlags,\n                },\n            },\n            delete: {\n                Options: {\n                    challengekey: 1\n                }\n            }\n        };\n        LobbyAPI.UpdateSessionSettings(settings);\n        LobbyAPI.StartMatchmaking('', '', '', '');\n    }\n    {\n        Init();\n        $.RegisterForUnhandledEvent('OnRecurringMissionsReceived', Init);\n        $.RegisterForUnhandledEvent('OnRecurringMissionsChanged', Init);\n    }\n})(MainMenuMissions || (MainMenuMissions = {}));\n","scripts/mainmenu_news.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\nvar NewsPanel;\n(function (NewsPanel) {\n    function _GetRssFeed() {\n        BlogAPI.RequestRSSFeed();\n    }\n    function _OnRssFeedReceived(feed) {\n        if ($.GetContextPanel().BHasClass('news-panel--hide-news-panel')) {\n            return;\n        }\n        ;\n        let elLister = $.GetContextPanel().FindChildInLayoutFile('NewsPanelLister');\n        if (elLister === undefined || elLister === null || !feed)\n            return;\n        elLister.RemoveAndDeleteChildren();\n        let foundFirstNewsItem = false;\n        feed['items'].forEach(function (item, i) {\n            let elEntry = $.CreatePanel('Panel', elLister, 'NewEntry' + i, {\n                acceptsinput: true\n            });\n            if (!foundFirstNewsItem && !item.categories.includes('Minor')) {\n                foundFirstNewsItem = true;\n                elEntry.AddClass('new');\n            }\n            elEntry.BLoadLayoutSnippet('featured-news-full-entry');\n            let elImage = elEntry.FindChildInLayoutFile('NewsHeaderImage');\n            if (item.imageUrl) {\n                elImage.SetImage(item.imageUrl);\n            }\n            else {\n                elImage.SetImage(\"file://{images}/store/default-news.png\");\n            }\n            let elEntryInfo = $.CreatePanel('Panel', elEntry, 'NewsInfo' + i);\n            elEntryInfo.BLoadLayoutSnippet('featured-news-info');\n            elEntryInfo.SetDialogVariable('news_item_date', item.date);\n            elEntryInfo.SetDialogVariable('news_item_title', item.title);\n            elEntryInfo.SetDialogVariable('news_item_body', item.description);\n            elEntry.BLoadLayoutSnippet('history-news-full-entry');\n            elImage = elEntry.FindChildInLayoutFile('NewsHeaderImage');\n            if (item.imageUrl) {\n                elImage.SetImage(item.imageUrl);\n            }\n            else {\n                elImage.SetImage(\"file://{images}/store/default-news.png\");\n            }\n            elEntryInfo = $.CreatePanel('Panel', elEntry, 'NewsInfo' + i);\n            elEntryInfo.BLoadLayoutSnippet('history-news-info');\n            elEntryInfo.SetDialogVariable('news_item_date', item.date);\n            elEntryInfo.SetDialogVariable('news_item_title', item.title);\n            elEntryInfo.SetDialogVariable('news_item_body', item.description);\n            elEntry.FindChildInLayoutFile('NewsEntryBlurTarget').AddBlurPanel(elEntryInfo);\n            let link = item.link;\n            let clearNew = i == 0;\n            elEntry.SetPanelEvent(\"onactivate\", () => {\n                SteamOverlayAPI.OpenURL(link);\n                if (clearNew) {\n                    elEntry.RemoveClass('new');\n                }\n            });\n        });\n    }\n    {\n        _GetRssFeed();\n        $.RegisterForUnhandledEvent(\"PanoramaComponent_Blog_RSSFeedReceived\", _OnRssFeedReceived);\n    }\n})(NewsPanel || (NewsPanel = {}));\n","scripts/mainmenu_overwatch.js":"'use strict';\n\nvar mainmenu_overwatch = ( function()\n{\n\tvar _m_btnDownload;\n\tvar _m_btnReview;\n\tvar _m_panError;\n\tvar _m_lblErrorText;\n\tvar _m_downloadingProgressBar;\n\n    function _Init()\n    {\n        _m_btnDownload = $( \"#overwatch-download-evidence\" );\n        _m_btnReview = $( \"#overwatch-review-evidence\" );\n\t\t_m_panError = $(\"#overwatch-error-message\");\n\t\t_m_lblErrorText = $(\"#overwatch-error-message-textlabel\");\n        _m_downloadingProgressBar = $( \"#overwatch-downloading-progress\" );\n\n\t\t_UpdateAllControlsFromComponent();\n\t}\n\t\n\tfunction _OnReadyForDisplay()\n\t{\n\t\t_UpdateAllControlsFromComponent();\n\t};\n\n\tfunction _UpdateAllControlsFromComponent()\n\t{\n\t\t  \n\t\t                      \n\t\t  \n\t\tvar strErrorCode = OverwatchAPI.GetEvidencePreparationError();\n        if ( !strErrorCode )\n        {\n\t\t\tvar strCaseDescription = OverwatchAPI.GetAssignedCaseDescription();\n            if( strCaseDescription == \"\" )\n            {\n\t\t\t\tstrErrorCode = \"#Overwatch_Error_DownloadFailed\";\n\t\t\t}\n\t\t}\n\t\t_m_lblErrorText.text = strErrorCode ? $.Localize( strErrorCode ) : '';\n\t\t_m_panError.enabled = !!strErrorCode;\n\n\t\t  \n\t\t                              \n\t\t                  \n\t\t                    \n\t\t                              \n\t\t  \n\t\tvar nProgress = OverwatchAPI.GetEvidencePreparationPercentage();\n\t\t_m_btnDownload.enabled = ( nProgress === 0 );\n\t\t_m_btnReview.enabled = ( nProgress === 100 );\n\t\t_m_downloadingProgressBar.value = ( nProgress / 100 );\n\t};\n\n    function _DownloadEvidence()\n    {\n        OverwatchAPI.StartDownloadingCaseEvidence();\n    }\n\n                                                    \n    function _CaseUpdated()\n    {\n        _UpdateAllControlsFromComponent();\n    }\n\n    function _ReviewEvidence()\n    {\n\t\t$.DispatchEvent( 'HideContentPanel' );\n        OverwatchAPI.PlaybackEvidence();\n    }\n\n\tvar _m_overwatchPopupPanel = null;\n\t\n\tfunction _ShowVerdictPopup ()\n    {\n\t\tif ( !_m_overwatchPopupPanel || !_m_overwatchPopupPanel.IsValid())\n\t\t{\n\t\t\t_m_overwatchPopupPanel = UiToolkitAPI.ShowGlobalCustomLayoutPopup( 'PopupVerdict', 'file://{resources}/layout/popups/popup_mainmenu_overwatch_verdict.xml', '' );\n\t\t}\n    }\n\n                          \n    return {\n\t\tInit                : _Init,\n\t\tOnReadyForDisplay\t: _OnReadyForDisplay,\n        DownloadEvidence    : _DownloadEvidence,\n        ReviewEvidence      : _ReviewEvidence,\n        CaseUpdated         : _CaseUpdated,\n        ShowVerdictPopup    : _ShowVerdictPopup,\n    };\n\n})();\n\n                                                                                                    \n                                           \n                                                                                                    \n(function()\n{\n\tmainmenu_overwatch.Init();\n\n\tvar elJsMainMenuOverwatch = $( '#JsOverwatch' );\n\n\t$.RegisterEventHandler( 'ReadyForDisplay', elJsMainMenuOverwatch, mainmenu_overwatch.OnReadyForDisplay );\n\n    $.RegisterForUnhandledEvent( 'PanoramaComponent_Overwatch_CaseUpdated', mainmenu_overwatch.CaseUpdated );\n    $.RegisterForUnhandledEvent( 'PanoramaComponent_Overwatch_DemoFileEndReached', mainmenu_overwatch.ShowVerdictPopup );\n})();\n","scripts/mainmenu_play.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"common/scheduler.ts\" />\n/// <reference path=\"avatar.ts\" />\n/// <reference path=\"particle_controls.ts\" />\n/// <reference path=\"util_gamemodeflags.ts\" />\n/// <reference path=\"common/formattext.ts\" />\n/// <reference path=\"common/icon.ts\" />\n/// <reference path=\"common/licenseutil.ts\" />\n/// <reference path=\"common/sessionutil.ts\" />\n/// <reference path=\"rating_emblem.ts\" />\n$.LogChannel(\"p.mainmenu\", \"LV_OFF\");\nvar PlayMenu;\n(function (PlayMenu) {\n    const k_workshopPanelId = 'gameModeButtonContainer_workshop';\n    let _m_inventoryUpdatedHandler;\n    const m_mapSelectionButtonContainers = {};\n    let m_gameModeConfigs = {};\n    let m_arrGameModeRadios = [];\n    let GetMGDetails;\n    let GetGameType;\n    const m_bPerfectWorld = (MyPersonaAPI.GetLauncherType() === 'perfectworld');\n    let m_activeMapGroupSelectionPanelID = null;\n    let m_serverSetting = '';\n    let m_gameModeSetting = '';\n    let m_singleSkirmishMapGroup = null;\n    let m_arrSingleSkirmishMapGroups = [];\n    const m_gameModeFlags = {};\n    let m_isWorkshop = false;\n    let m_jsTimerUpdateHandle = false;\n    let m_challengeKey = '';\n    let m_bDidShowActiveMapSelectionTab = false;\n    let m_selectedPracticeMap = '';\n    const k_workshopModes = {\n        classic: 'casual,competitive',\n        casual: 'casual',\n        competitive: 'competitive',\n        wingman: 'scrimcomp2v2',\n        deathmatch: 'deathmatch',\n        training: 'training',\n        coopstrike: 'coopmission',\n        armsrace: 'gungameprogressive',\n        rush: 'rush',\n        custom: 'custom',\n        flyingscoutsman: 'flyingscoutsman',\n        retakes: 'retakes'\n    };\n    const m_PlayMenuActionBarParticleFX = $('#PlayMenuActionBar_Searching_particles');\n    ParticleControls.InitMainMenuTopBar(m_PlayMenuActionBarParticleFX);\n    function inDirectChallenge() {\n        return _GetDirectChallengeKey() != '';\n    }\n    function StartSearch() {\n        const btnStartSearch = $('#StartMatchBtn');\n        if (btnStartSearch === null)\n            return;\n        btnStartSearch.AddClass('pressed');\n        $.DispatchEvent('CSGOPlaySoundEffect', 'mainmenu_press_GO', 'MOUSE');\n        ParticleControls.UpdateActionBar(m_PlayMenuActionBarParticleFX, \"StartMatchBtn\");\n        if (inDirectChallenge()) {\n            _DirectChallengeStartSearch();\n            return;\n        }\n        if (m_isWorkshop) {\n            _DisplayWorkshopModePopup();\n        }\n        else {\n            if (m_gameModeSetting !== 'premier') {\n                if (!_CheckContainerHasAnyChildChecked(_GetMapListForServerTypeAndGameMode(m_activeMapGroupSelectionPanelID)) && !m_isWorkshop) {\n                    _NoMapSelectedPopup();\n                    btnStartSearch.RemoveClass('pressed');\n                    return;\n                }\n            }\n            if (GameModeFlags.DoesModeUseFlags(_RealGameMode()) && !m_gameModeFlags[m_serverSetting + _RealGameMode()]) {\n                btnStartSearch.RemoveClass('pressed');\n                const resumeSearchFnHandle = UiToolkitAPI.RegisterJSCallback(StartSearch);\n                _OnGameModeFlagsBtnClicked(resumeSearchFnHandle);\n                return;\n            }\n            let stage = _GetTournamentStage();\n            LobbyAPI.StartMatchmaking(MyPersonaAPI.GetMyOfficialTournamentName(), MyPersonaAPI.GetMyOfficialTeamName(), _GetTournamentOpponent(), stage);\n        }\n    }\n    function _Init() {\n        const cfg = GameTypesAPI.GetConfig();\n        for (const type in cfg.gameTypes) {\n            for (const mode in cfg.gameTypes[type].gameModes) {\n                let obj = cfg.gameTypes[type].gameModes[mode];\n                m_gameModeConfigs[mode] = obj;\n            }\n        }\n        GetGameType = (mode) => {\n            for (const gameType in cfg.gameTypes) {\n                if (cfg.gameTypes[gameType].gameModes.hasOwnProperty(mode))\n                    return gameType;\n            }\n        };\n        GetMGDetails = (mg) => {\n            return cfg.mapgroups[mg];\n        };\n        const elGameModeSelectionRadios = $('#GameModeSelectionRadios');\n        if (elGameModeSelectionRadios !== null) {\n            m_arrGameModeRadios = elGameModeSelectionRadios.Children();\n        }\n        m_arrGameModeRadios = m_arrGameModeRadios.filter(elPanel => !elPanel.BHasClass('mainmenu-top-navbar__play_seperator'));\n        for (let entry of m_arrGameModeRadios) {\n            entry.SetPanelEvent('onactivate', () => {\n                m_isWorkshop = false;\n                _LoadGameModeFlagsFromSettings();\n                if (!_IsSingleSkirmishString(entry.id)) {\n                    m_singleSkirmishMapGroup = null;\n                }\n                if (entry.id === \"JsDirectChallengeBtn\") {\n                    m_gameModeSetting = 'competitive';\n                    _OnDirectChallengeBtn();\n                    return;\n                }\n                else if (_IsSingleSkirmishString(entry.id)) {\n                    m_gameModeSetting = 'skirmish';\n                    m_singleSkirmishMapGroup = _GetSingleSkirmishMapGroupFromSingleSkirmishString(entry.id);\n                }\n                else {\n                    m_gameModeSetting = entry.id;\n                }\n                const alert = entry.FindChild('GameModeAlert');\n                if ((entry.id === \"competitive\" || entry.id === 'scrimcomp2v2') && alert && !alert.BHasClass('hidden')) {\n                    if (GameInterfaceAPI.GetSettingString('ui_show_unlock_competitive_alert') !== '1') {\n                        GameInterfaceAPI.SetSettingString('ui_show_unlock_competitive_alert', '1');\n                    }\n                }\n                m_challengeKey = '';\n                _ApplySessionSettings();\n            });\n        }\n        for (let entry of m_arrGameModeRadios) {\n            if (_IsSingleSkirmishString(entry.id)) {\n                m_arrSingleSkirmishMapGroups.push(_GetSingleSkirmishMapGroupFromSingleSkirmishString(entry.id));\n            }\n        }\n        _SetUpGameModeFlagsRadioButtons();\n        const elBtnContainer = $('#PermissionsSettings');\n        const elPermissionsButton = elBtnContainer.FindChild(\"id-slider-btn\");\n        elPermissionsButton.SetPanelEvent('onactivate', () => {\n            const bCurrentlyPrivate = (LobbyAPI.GetSessionSettings().system.access === \"private\");\n            const sNewAccessSetting = bCurrentlyPrivate ? \"public\" : \"private\";\n            const settings = {\n                update: {\n                    system: {\n                        access: sNewAccessSetting\n                    }\n                }\n            };\n            GameInterfaceAPI.SetSettingString('lobby_default_privacy_bits', (sNewAccessSetting === \"public\") ? \"1\" : \"0\");\n            LobbyAPI.UpdateSessionSettings(settings);\n            $.DispatchEvent('UIPopupButtonClicked', '');\n        });\n        const elPracticeSettingsContainer = $('#id-play-menu-practicesettings-container');\n        for (let elChild of elPracticeSettingsContainer.Children()) {\n            if (!elChild.id.startsWith('id-play-menu-practicesettings-'))\n                continue;\n            let strFeatureName = elChild.id;\n            strFeatureName = strFeatureName.replace('id-play-menu-practicesettings-', '');\n            strFeatureName = strFeatureName.replace('-tooltip', '');\n            const elFeatureFrame = elChild.FindChildTraverse('id-play-menu-practicesettings-' + strFeatureName);\n            const elFeatureSliderBtn = elFeatureFrame.FindChildTraverse('id-slider-btn');\n            elFeatureSliderBtn.text = $.Localize('#practicesettings_' + strFeatureName + '_button');\n            elFeatureSliderBtn.SetPanelEvent('onactivate', () => {\n                UiToolkitAPI.HideTextTooltip();\n                const sessionSettings = LobbyAPI.GetSessionSettings();\n                const curvalue = (sessionSettings && sessionSettings.options && sessionSettings.options.hasOwnProperty('practicesettings_' + strFeatureName))\n                    ? sessionSettings.options['practicesettings_' + strFeatureName] : 0;\n                const newvalue = curvalue ? 0 : 1;\n                GameInterfaceAPI.SetSettingString('ui_playsettings_listen_' + strFeatureName, newvalue ? '1' : '0');\n                const setting = 'practicesettings_' + strFeatureName;\n                const newSettings = { update: { options: {} } };\n                newSettings.update.options[setting] = newvalue;\n                LobbyAPI.UpdateSessionSettings(newSettings);\n            });\n        }\n        const btnStartSearch = $('#StartMatchBtn');\n        btnStartSearch.SetPanelEvent('onactivate', StartSearch);\n        const btnCancel = $.GetContextPanel().FindChildInLayoutFile('PartyCancelBtn');\n        btnCancel.SetPanelEvent('onactivate', () => {\n            LobbyAPI.StopMatchmaking();\n            $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.generic_button_press', 'MOUSE');\n            ParticleControls.UpdateActionBar(m_PlayMenuActionBarParticleFX, \"RmoveBtnEffects\");\n        });\n        const elWorkshopSearch = $(\"#WorkshopSearchTextEntry\");\n        elWorkshopSearch.SetPanelEvent('ontextentrychange', _UpdateWorkshopMapFilter);\n        _SyncDialogsFromSessionSettings(LobbyAPI.GetSessionSettings());\n        _ApplySessionSettings();\n        const strFavoriteMaps = GameInterfaceAPI.GetSettingString('ui_playsettings_custom_preset');\n        if (strFavoriteMaps === '') {\n            SaveMapSelectionToCustomPreset(true);\n        }\n        _UpdateGameModeFlagsBtn();\n        _UpdateDirectChallengePage();\n    }\n    function _SetUpGameModeFlagsRadioButtons() {\n        const oFlags = GameModeFlags.GetFlags();\n        for (let key of Object.keys(oFlags)) {\n            const elParent = $.GetContextPanel().FindChildInLayoutFile('id-gamemode-flag-' + key);\n            const mode = oFlags[key];\n            for (let flag of mode.flags) {\n                if (!elParent.FindChildInLayoutFile(elParent.id + '-' + flag)) {\n                    const btn = $.CreatePanel('RadioButton', elParent, elParent.id + '-' + flag, {\n                        class: 'gamemode-setting-radiobutton',\n                        group: 'game_mode_flag_' + key,\n                        text: '#play_settings_' + key + '_dialog_' + flag\n                    });\n                    btn.SetPanelEvent('onactivate', () => _OnGameModeFlagOptionActivate(flag));\n                    let btnId = btn.id;\n                    btn.SetPanelEvent('onmouseover', () => {\n                        if (key === 'competitive') {\n                            UiToolkitAPI.ShowTextTooltip(btnId, '#play_settings_competitive_dialog_' + flag + '_desc');\n                        }\n                    });\n                    btn.SetPanelEvent('onmouseout', UiToolkitAPI.HideTextTooltip);\n                }\n            }\n        }\n    }\n    function _RevertForceDirectChallengeSettings() {\n        _LoadGameModeFlagsFromSettings();\n    }\n    function _TurnOffDirectChallenge() {\n        _SetDirectChallengeKey('');\n        _RevertForceDirectChallengeSettings();\n        _ApplySessionSettings();\n        Scheduler.Cancel(\"directchallenge\");\n    }\n    function _OnDirectChallengeBtn() {\n        if (!inDirectChallenge()) {\n            const savedKey = GameInterfaceAPI.GetSettingString('ui_playsettings_directchallengekey');\n            if (!savedKey)\n                _SetDirectChallengeKey(CompetitiveMatchAPI.GetDirectChallengeCode());\n            else\n                _SetDirectChallengeKey(savedKey);\n            _ApplySessionSettings();\n        }\n    }\n    function _SetDirectChallengeKey(key) {\n        let keySource;\n        let keySourceLabel;\n        let type, id, id32;\n        if (key != '') {\n            const oReturn = { value: [] };\n            const bValid = _IsChallengeKeyValid(key, oReturn, 'set');\n            type = oReturn.value[2];\n            id = oReturn.value[3];\n            id32 = parseInt(oReturn.value[4]);\n            if (bValid) {\n                switch (type) {\n                    case 'u':\n                        keySource = FriendsListAPI.GetFriendName(id);\n                        keySourceLabel = $.Localize('#DirectChallenge_CodeSourceLabelUser2');\n                        break;\n                    case 'g':\n                        keySource = FriendsListAPI.GetClanInfoById32Bit(id32, 'name');\n                        keySourceLabel = $.Localize('#DirectChallenge_CodeSourceLabelClan2');\n                        if (!keySource) {\n                            keySource = $.Localize(\"#DirectChallenge_UnknownSource\");\n                        }\n                        break;\n                }\n            }\n            GameInterfaceAPI.SetSettingString('ui_playsettings_directchallengekey', key);\n        }\n        const DirectChallengeCheckBox = $.GetContextPanel().FindChildTraverse('JsDirectChallengeBtn');\n        DirectChallengeCheckBox.checked = key != '';\n        if (type !== undefined && id != undefined)\n            _SetDirectChallengeIcons(type, id);\n        $.GetContextPanel().SetDialogVariable('queue-code', key);\n        if (keySource)\n            $.GetContextPanel().SetDialogVariable('code-source', keySource);\n        if (keySourceLabel)\n            $.GetContextPanel().SetDialogVariable('code-source-label', keySourceLabel);\n        if (id)\n            $.GetContextPanel().SetAttributeString('code-xuid', id);\n        if (type)\n            $.GetContextPanel().SetAttributeString('code-type', type);\n        if (key && (m_challengeKey != key)) {\n            $.Schedule(0.01, () => {\n                const elHeader = $.GetContextPanel().FindChildTraverse(\"JsDirectChallengeKey\");\n                if (elHeader && elHeader.IsValid())\n                    elHeader.TriggerClass('directchallenge-status__header__queuecode');\n            });\n        }\n        $.GetContextPanel().SetHasClass('directchallenge', key != '');\n        m_challengeKey = key;\n    }\n    function _ClansInfoUpdated() {\n        if (m_challengeKey && $.GetContextPanel().GetAttributeString('code-type', '') === 'g') {\n            _SetDirectChallengeKey(m_challengeKey);\n        }\n    }\n    function _AddOpenPlayerCardAction(elAvatar, xuid) {\n        elAvatar.SetPanelEvent(\"onactivate\", () => {\n            $.DispatchEvent('SidebarContextMenuActive', true);\n            if (xuid !== '') {\n                const contextMenuPanel = UiToolkitAPI.ShowCustomLayoutContextMenuParametersDismissEvent('', '', 'file://{resources}/layout/context_menus/context_menu_playercard.xml', 'xuid=' + xuid, () => $.DispatchEvent('SidebarContextMenuActive', false));\n                contextMenuPanel.AddClass(\"ContextMenu_NoArrow\");\n            }\n        });\n    }\n    function _SetDirectChallengeIcons(type, id) {\n        const btn = $(\"#JsDirectChallengeBtn\");\n        if (!btn.checked)\n            return;\n        const elAvatar = $.GetContextPanel().FindChildInLayoutFile('JsDirectChallengeAvatar');\n        if (!elAvatar) {\n            $.Schedule(0.1, () => _SetDirectChallengeIcons(type, id));\n            return;\n        }\n        elAvatar.PopulateFromSteamID(id);\n        if (!type || !id) {\n            elAvatar.SetPanelEvent('onactivate', () => { });\n        }\n        switch (type) {\n            case 'u':\n                _AddOpenPlayerCardAction(elAvatar, id);\n                break;\n            case 'g':\n                _AddGoToClanPageAction(elAvatar, id);\n                break;\n        }\n    }\n    function _AddGoToClanPageAction(elAvatar, id) {\n        elAvatar.SetPanelEvent('onactivate', () => {\n            SteamOverlayAPI.OpenUrlInOverlayOrExternalBrowser(\"https://\" + SteamOverlayAPI.GetSteamCommunityURL() + \"/gid/\" + id);\n        });\n    }\n    function _GetDirectChallengeKey() {\n        return m_challengeKey;\n    }\n    function _OnDirectChallengeRandom() {\n        UiToolkitAPI.ShowGenericPopupOkCancel($.Localize('#DirectChallenge_CreateNewKey2'), $.Localize('#DirectChallenge_CreateNewKeyMsg'), '', () => {\n            _SetDirectChallengeKey(CompetitiveMatchAPI.GenerateDirectChallengeCode());\n            _ApplySessionSettings();\n        }, () => { });\n    }\n    function _GetChallengeKeyType(key) {\n        const oReturn = { value: [] };\n        if (_IsChallengeKeyValid(key.toUpperCase(), oReturn, '')) {\n            return oReturn.value[2];\n        }\n        else {\n            return '';\n        }\n    }\n    function _OnDirectChallengeEdit() {\n        const submitCallback = UiToolkitAPI.RegisterJSCallback((value) => {\n            _SetDirectChallengeKey(value.toUpperCase());\n            _ApplySessionSettings();\n            StartSearch();\n        });\n        UiToolkitAPI.ShowCustomLayoutPopupParameters('', 'file://{resources}/layout/popups/popup_directchallenge_join.xml', '&' + 'submitCallback=' + submitCallback);\n    }\n    function _OnDirectChallengeCopy() {\n        SteamOverlayAPI.CopyTextToClipboard(_GetDirectChallengeKey());\n        UiToolkitAPI.ShowTextTooltip('CopyChallengeKey', '#DirectChallenge_Copied2');\n    }\n    function _IsChallengeKeyValid(key, oReturn = { string: [] }, how = '') {\n        const code = CompetitiveMatchAPI.ValidateDirectChallengeCode(key, how);\n        const bValid = (typeof code === 'string') && code.includes(',');\n        if (bValid) {\n            oReturn.value = code.split(',');\n        }\n        return bValid;\n    }\n    function _DirectChallengeStartSearch() {\n        const oReturn = { value: [] };\n        const bValid = _IsChallengeKeyValid(m_challengeKey.toUpperCase(), oReturn, 'set');\n        if (!bValid) {\n            $.DispatchEvent('CSGOPlaySoundEffect', 'mainmenu_press_GO', 'MOUSE');\n            return;\n        }\n        _OnPrivateQueuesUpdate();\n        LobbyAPI.StartMatchmaking('', oReturn.value[0], oReturn.value[1], '1');\n    }\n    function _NoMapSelectedPopup() {\n        UiToolkitAPI.ShowGenericPopupOk($.Localize('#no_maps_selected_title'), $.Localize('#no_maps_selected_text'), '', () => { });\n    }\n    function _SetGameModeRadioButtonAvailableTooltip(gameMode, isAvailable, txtTooltip) {\n        const elGameModeSelectionRadios = $('#GameModeSelectionRadios');\n        const elTab = elGameModeSelectionRadios ? elGameModeSelectionRadios.FindChildInLayoutFile(gameMode) : null;\n        if (elTab) {\n            if (!isAvailable && txtTooltip) {\n                let targetLevel = 2;\n                let showbar = true;\n                if (gameMode === 'premier') {\n                    targetLevel = 10;\n                    if (!MyPersonaAPI.IsConnectedToGC()) {\n                        txtTooltip += '_nogcconnection';\n                        showbar = false;\n                    }\n                    else if (MyPersonaAPI.GetElevatedState() !== 'elevated') {\n                        txtTooltip += '_nonprime';\n                        showbar = false;\n                    }\n                    else if (TournamentsAPI.IsPremierSeasonOffseason()) {\n                        txtTooltip += '_offseason';\n                        showbar = false;\n                    }\n                }\n                elTab.SetPanelEvent('onmouseover', () => {\n                    UiToolkitAPI.ShowCustomLayoutParametersTooltip(elTab.id, 'GamemodesLockedneedPrime', 'file://{resources}/layout/tooltips/tooltip_title_progressbar.xml', 'titletext=' + '#PlayMenu_unavailable_locked_mode_title' +\n                        '&' + 'bodytext=' + txtTooltip +\n                        '&' + 'usexp=' + 'true' +\n                        '&' + 'targetlevel=' + targetLevel +\n                        '&' + 'showbar=' + (showbar ? 'true' : 'false'));\n                });\n                elTab.SetPanelEvent('onmouseout', () => {\n                    UiToolkitAPI.HideCustomLayoutTooltip('GamemodesLockedneedPrime');\n                });\n            }\n            else {\n                elTab.SetPanelEvent('onmouseover', () => { });\n                elTab.SetPanelEvent('onmouseout', () => { });\n            }\n        }\n    }\n    function _SetGameModeRadioButtonVisible(gameMode, isVisible) {\n        const elGameModeSelectionRadios = $('#GameModeSelectionRadios');\n        const elTab = elGameModeSelectionRadios ? elGameModeSelectionRadios.FindChildInLayoutFile(gameMode) : null;\n        if (elTab) {\n            elTab.visible = isVisible;\n        }\n    }\n    function _IsGameModeAvailable(serverType, gameMode) {\n        let isAvailable = true;\n        if (gameMode === \"cooperative\" || gameMode === \"coopmission\") {\n            _SetGameModeRadioButtonVisible(gameMode, false);\n            return false;\n        }\n        else if (m_gameModeConfigs[gameMode] &&\n            _GetAvailableMapGroups(gameMode, _IsValveOfficialServer(serverType)).length == 0) {\n            _SetGameModeRadioButtonAvailableTooltip(gameMode, false, '');\n            return false;\n        }\n        if (_IsValveOfficialServer(serverType) &&\n            LobbyAPI.BIsHost()) {\n            if (gameMode === 'premier') {\n                isAvailable = ((MyPersonaAPI.GetElevatedState() === 'elevated') &&\n                    (MyPersonaAPI.HasPrestige() || MyPersonaAPI.GetCurrentLevel() >= 10)) &&\n                    !TournamentsAPI.IsPremierSeasonOffseason();\n            }\n            else if (MyPersonaAPI.HasPrestige()) {\n                isAvailable = true;\n            }\n            else if (MyPersonaAPI.GetCurrentLevel() < 2) {\n                isAvailable = (gameMode == 'deathmatch' || gameMode == 'casual' || gameMode == 'gungameprogressive' || gameMode == 'retakes');\n            }\n        }\n        else if (!_IsValveOfficialServer(serverType)) {\n            (isAvailable = (gameMode != 'premier'));\n        }\n        _SetGameModeRadioButtonAvailableTooltip(gameMode, isAvailable, _IsPlayingOnValveOfficial() ? '#PlayMenu_unavailable_newuser_2' : '');\n        return isAvailable;\n    }\n    function _GetTournamentOpponent() {\n        const elTeamDropdown = $.GetContextPanel().FindChildInLayoutFile('TournamentTeamDropdown');\n        if (elTeamDropdown.GetSelected() === null)\n            return '';\n        return elTeamDropdown.GetSelected().GetAttributeString('data', '');\n    }\n    function _GetTournamentStage() {\n        const elStageDropdown = $.GetContextPanel().FindChildInLayoutFile('TournamentStageDropdown');\n        if (elStageDropdown.GetSelected() === null)\n            return '';\n        return elStageDropdown.GetSelected().GetAttributeString('data', '');\n    }\n    function _UpdateStartSearchBtn(isSearchingForTournament) {\n        const btnStartSearch = $.GetContextPanel().FindChildInLayoutFile('StartMatchBtn');\n        btnStartSearch.enabled = isSearchingForTournament ? (_GetTournamentOpponent() != '' && _GetTournamentStage() != '') : true;\n    }\n    function _UpdateTournamentButton(isHost) {\n        const bIsOfficialCompetitive = _RealGameMode() === \"competitive\" && _IsPlayingOnValveOfficial();\n        const strTeamName = MyPersonaAPI.GetMyOfficialTeamName();\n        const strTournament = MyPersonaAPI.GetMyOfficialTournamentName();\n        const isInTournament = isHost && strTeamName != \"\" && strTournament != \"\";\n        $.GetContextPanel().SetHasClass(\"play-menu__tournament\", isInTournament);\n        const isSearchingForTournament = bIsOfficialCompetitive && isInTournament;\n        const elTeamDropdown = $.GetContextPanel().FindChildInLayoutFile('TournamentTeamDropdown');\n        const elStageDropdown = $.GetContextPanel().FindChildInLayoutFile('TournamentStageDropdown');\n        if (isInTournament) {\n            function AddDropdownOption(elDropdown, entryID, strText, strData, strSelectedData) {\n                const newEntry = $.CreatePanel('Label', elDropdown, entryID, { data: strData });\n                newEntry.text = strText;\n                elDropdown.AddOption(newEntry);\n                if (strSelectedData === strData) {\n                    elDropdown.SetSelected(entryID);\n                }\n            }\n            const strCurrentOpponent = _GetTournamentOpponent();\n            const strCurrentStage = _GetTournamentStage();\n            elTeamDropdown.RemoveAllOptions();\n            AddDropdownOption(elTeamDropdown, 'PickOpponent', $.Localize('#SFUI_Tournament_Pick_Opponent'), '', strCurrentOpponent);\n            const teamCount = CompetitiveMatchAPI.GetTournamentTeamCount(strTournament);\n            for (let i = 0; i < teamCount; i++) {\n                const strTeam = CompetitiveMatchAPI.GetTournamentTeamNameByIndex(strTournament, i);\n                if (strTeamName === strTeam)\n                    continue;\n                AddDropdownOption(elTeamDropdown, 'team_' + i, strTeam, strTeam, strCurrentOpponent);\n            }\n            elTeamDropdown.SetPanelEvent('oninputsubmit', () => _UpdateStartSearchBtn(isSearchingForTournament));\n            elStageDropdown.RemoveAllOptions();\n            AddDropdownOption(elStageDropdown, 'PickStage', $.Localize('#SFUI_Tournament_Stage'), '', strCurrentStage);\n            const stageCount = CompetitiveMatchAPI.GetTournamentStageCount(strTournament);\n            for (let i = 0; i < stageCount; i++) {\n                const strStage = CompetitiveMatchAPI.GetTournamentStageNameByIndex(strTournament, i);\n                AddDropdownOption(elStageDropdown, 'stage_' + i, strStage, strStage, strCurrentStage);\n            }\n            elStageDropdown.SetPanelEvent('oninputsubmit', () => _UpdateStartSearchBtn(isSearchingForTournament));\n        }\n        elTeamDropdown.enabled = isSearchingForTournament;\n        elStageDropdown.enabled = isSearchingForTournament;\n        _UpdateStartSearchBtn(isSearchingForTournament);\n        _ShowActiveMapSelectionTab(!isSearchingForTournament);\n    }\n    function _SyncDialogsFromSessionSettings(settings) {\n        if (!settings || !settings.game || !settings.system) {\n            return;\n        }\n        m_serverSetting = settings.options.server;\n        m_gameModeSetting = settings.game.mode_ui;\n        $.GetContextPanel().SetHasClass('premier', m_gameModeSetting === 'premier');\n        _SetDirectChallengeKey(settings.options.hasOwnProperty('challengekey') ? settings.options.challengekey : '');\n        _setAndSaveGameModeFlags(parseInt(settings.game.gamemodeflags));\n        $.GetContextPanel().SwitchClass(\"gamemode\", m_isWorkshop ? \"workshop\" : _RealGameMode());\n        $.GetContextPanel().SwitchClass(\"serversetting\", m_serverSetting);\n        $.GetContextPanel().SetHasClass(\"directchallenge\", inDirectChallenge());\n        m_singleSkirmishMapGroup = null;\n        if (m_gameModeSetting === 'skirmish' && settings.game.mapgroupname && m_arrSingleSkirmishMapGroups.includes(settings.game.mapgroupname)) {\n            m_singleSkirmishMapGroup = settings.game.mapgroupname;\n        }\n        const isHost = LobbyAPI.BIsHost();\n        const isSearching = _IsSearching();\n        const isEnabled = !isSearching && isHost ? true : false;\n        const elPlayCommunity = $('#PlayCommunity');\n        elPlayCommunity.enabled = !isSearching;\n        if (m_isWorkshop) {\n            _SwitchToWorkshopTab(isEnabled);\n            _SelectMapButtonsFromSettings(settings);\n        }\n        else if (m_gameModeSetting) {\n            for (let i = 0; i < m_arrGameModeRadios.length; ++i) {\n                const strGameModeForButton = m_arrGameModeRadios[i].id;\n                if (inDirectChallenge()) {\n                    m_arrGameModeRadios[i].checked = m_arrGameModeRadios[i].id === 'JsDirectChallengeBtn';\n                }\n                else if (m_singleSkirmishMapGroup) {\n                    if (_IsSingleSkirmishString(strGameModeForButton)) {\n                        if (m_singleSkirmishMapGroup === _GetSingleSkirmishMapGroupFromSingleSkirmishString(strGameModeForButton)) {\n                            m_arrGameModeRadios[i].checked = true;\n                        }\n                    }\n                }\n                else if (!_IsSingleSkirmishString(strGameModeForButton)) {\n                    if (strGameModeForButton === m_gameModeSetting) {\n                        m_arrGameModeRadios[i].checked = true;\n                    }\n                }\n                if (strGameModeForButton === 'competitive' || strGameModeForButton === 'scrimcomp2v2') {\n                    const bHide = GameInterfaceAPI.GetSettingString('ui_show_unlock_competitive_alert') === '1' ||\n                        MyPersonaAPI.HasPrestige() ||\n                        MyPersonaAPI.GetCurrentLevel() !== 2 ||\n                        !_IsPlayingOnValveOfficial();\n                    if (m_arrGameModeRadios[i].FindChildInLayoutFile('GameModeAlert')) {\n                        m_arrGameModeRadios[i].FindChildInLayoutFile('GameModeAlert').SetHasClass('hidden', bHide);\n                    }\n                }\n                const isAvailable = _IsGameModeAvailable(m_serverSetting, strGameModeForButton);\n                m_arrGameModeRadios[i].enabled = isAvailable && isEnabled;\n                m_arrGameModeRadios[i].SetHasClass('locked', !isAvailable || !isEnabled);\n            }\n            _UpdateMapGroupButtons(isEnabled, isSearching, isHost);\n            _CancelRotatingMapGroupSchedule();\n            if (settings.game.mode === \"survival\") {\n                _GetRotatingMapGroupStatus(_RealGameMode(), m_singleSkirmishMapGroup, settings.game.mapgroupname);\n            }\n            _SelectMapButtonsFromSettings(settings);\n        }\n        else {\n            m_arrGameModeRadios[0].checked = true;\n        }\n        _ShowHideStartSearchBtn(isSearching, isHost);\n        _ShowCancelSearchButton(isSearching, isHost);\n        _UpdateTournamentButton(isHost);\n        _UpdatePrimeBtn(isSearching, isHost);\n        _UpdatePermissionBtnText(settings, isEnabled);\n        _UpdatePracticeSettingsBtns(isSearching, isHost);\n        _UpdateLeaderboardBtn(m_gameModeSetting);\n        _UpdateSurvivalAutoFillSquadBtn(m_gameModeSetting);\n        _UpdateRushFriendLeaderboards(m_gameModeSetting);\n        _SelectActivePlayPlayTypeBtn();\n        _UpdateReplayNewUserTrainingBtn(m_gameModeSetting);\n        _UpdateDirectChallengePage(isSearching, isHost);\n        _UpdateGameModeFlagsBtn();\n        const elPlayTypeNav = $('#PlayTypeTopNav');\n        const aPlayTypeBtns = elPlayTypeNav.Children();\n        const bIsTopNavBtsEnabled = IsTopNavBtsEnabled();\n        aPlayTypeBtns.forEach(btn => btn.enabled = bIsTopNavBtsEnabled);\n        _SetClientViewLobbySettingsTitle(isHost);\n        function IsTopNavBtsEnabled() {\n            if (_IsPlayingOnValveOfficial() &&\n                (m_gameModeSetting === \"cooperative\" || m_gameModeSetting === \"coopmission\"))\n                return false;\n            else\n                return isEnabled;\n        }\n        _OnPrivateQueuesUpdate();\n        _PipRankUpdate();\n    }\n    function _UpdateDirectChallengePage(isSearching = false, isHost = true) {\n        const elBtn = $('#JsDirectChallengeBtn');\n        elBtn.enabled = (m_serverSetting === \"official\") && !m_isWorkshop ? true : false;\n        if (m_serverSetting !== \"official\" || m_isWorkshop) {\n            return;\n        }\n        const fnEnableKey = (id, bEnable) => { const p = $(id); if (p)\n            p.enabled = bEnable; };\n        const bEnable = !isSearching && isHost;\n        fnEnableKey(\"#RandomChallengeKey\", bEnable);\n        fnEnableKey(\"#EditChallengeKey\", bEnable);\n        fnEnableKey(\"#ClanChallengeKey\", bEnable);\n        fnEnableKey(\"#JsDirectChallengeBtn\", bEnable && (MyPersonaAPI.HasPrestige() || (MyPersonaAPI.GetCurrentLevel() >= 2)));\n    }\n    function _OnClanChallengeKeySelected(key) {\n        _SetDirectChallengeKey(key);\n        _ApplySessionSettings();\n        StartSearch();\n    }\n    function _OnChooseClanKeyBtn() {\n        if (MyPersonaAPI.GetMyClanCount() == 0) {\n            UiToolkitAPI.ShowGenericPopupThreeOptions('#DirectChallenge_no_steamgroups', '#DirectChallenge_no_steamgroups_desc', '', '#DirectChallenge_create_steamgroup', () => {\n                SteamOverlayAPI.OpenUrlInOverlayOrExternalBrowser(\"https://\" + SteamOverlayAPI.GetSteamCommunityURL() + \"/actions/GroupCreate\");\n            }, '#DirectChallenge_openurl2', () => {\n                SteamOverlayAPI.OpenUrlInOverlayOrExternalBrowser(\"https://\" + SteamOverlayAPI.GetSteamCommunityURL() + \"/search/groups\");\n            }, '#UI_OK', () => { });\n            return;\n        }\n        const clanKey = _GetChallengeKeyType(m_challengeKey) == 'g' ? m_challengeKey : '';\n        const elClanSelector = UiToolkitAPI.ShowCustomLayoutPopupParameters('id-popup_directchallenge_steamgroups', 'file://{resources}/layout/popups/popup_directchallenge_steamgroups.xml', 'currentkey=' + clanKey);\n        elClanSelector.AddClass(\"ContextMenu_NoArrow\");\n    }\n    function _CreatePlayerTile(elTile, xuid, delay = 0) {\n        elTile.BLoadLayout('file://{resources}/layout/simple_player_tile.xml', false, false);\n        $.Schedule(.1, () => {\n            if (!elTile || !elTile.IsValid())\n                return;\n            const elAvatar = elTile.FindChildTraverse('JsAvatarImage');\n            elAvatar.PopulateFromSteamID(xuid);\n            const strName = FriendsListAPI.GetFriendName(xuid);\n            elTile.SetDialogVariable('player_name', strName);\n            _AddOpenPlayerCardAction(elTile, xuid);\n            Scheduler.Schedule(delay, () => {\n                if (elTile && elTile.IsValid())\n                    elTile.RemoveClass('hidden');\n            }, \"directchallenge\");\n        });\n    }\n    function _OnPlayerNameChangedUpdate(xuid) {\n        let strName = null;\n        const strCodeXuid = $.GetContextPanel().GetAttributeString('code-xuid', '');\n        if (strCodeXuid === xuid) {\n            if (!strName)\n                strName = FriendsListAPI.GetFriendName(xuid);\n            $.GetContextPanel().SetDialogVariable('code-source', strName);\n        }\n        const elMembersContainer = $('#DirectChallengeQueueMembers');\n        if (!elMembersContainer)\n            return;\n        const elUserTile = elMembersContainer.FindChildTraverse(xuid);\n        if (!elUserTile)\n            return;\n        if (!strName)\n            strName = FriendsListAPI.GetFriendName(xuid);\n        elUserTile.SetDialogVariable('player_name', strName);\n    }\n    function _GetPartyID(partyXuid, arrMembers = []) {\n        let partyId = '';\n        const partySize = PartyBrowserAPI.GetPartyMembersCount(partyXuid);\n        for (let j = 0; j < partySize; j++) {\n            const memberXuid = PartyBrowserAPI.GetPartyMemberXuid(partyXuid, j);\n            partyId += '_' + memberXuid;\n            arrMembers.push(memberXuid);\n        }\n        return partyId;\n    }\n    function _OnPrivateQueuesUpdate() {\n        const elMembersContainer = $.GetContextPanel().FindChildTraverse('DirectChallengeQueueMembers');\n        if (!elMembersContainer)\n            return;\n        const elExplanation = $(\"#id-directchallenge-explanation\");\n        if (elExplanation)\n            elExplanation.SetHasClass('hidden', _IsSearching());\n        const elQueueMembers = $(\"#id-directchallenge-status__queue-members\");\n        if (elQueueMembers)\n            elQueueMembers.SetHasClass('hidden', !_IsSearching());\n        if (!_IsSearching()) {\n            Scheduler.Cancel(\"directchallenge\");\n            const elStatus = $('#id-directchallenge-status');\n            if (elStatus)\n                elStatus.text = '';\n            if (elMembersContainer)\n                elMembersContainer.RemoveAndDeleteChildren();\n            return;\n        }\n        const NumberOfParties = PartyBrowserAPI.GetPrivateQueuesCount();\n        const NumberOfPlayers = PartyBrowserAPI.GetPrivateQueuesPlayerCount();\n        const NumberOfMorePartiesNotShown = PartyBrowserAPI.GetPrivateQueuesMoreParties();\n        const elStatus = $('#id-directchallenge-status');\n        if (elStatus) {\n            $.GetContextPanel().SetDialogVariableInt('directchallenge_players', NumberOfPlayers);\n            $.GetContextPanel().SetDialogVariableInt('directchallenge_moreparties', NumberOfMorePartiesNotShown);\n            let strStatus = $.Localize(LobbyAPI.GetMatchmakingStatusString());\n            if (NumberOfParties > 0) {\n                strStatus += \"\\t\";\n                strStatus += $.Localize((NumberOfMorePartiesNotShown > 0) ? \"#DirectChallenge_SearchingMembersAndMoreParties2\" : \"#DirectChallenge_SearchingMembersLabel2\", $.GetContextPanel());\n            }\n            elStatus.text = strStatus;\n        }\n        for (let child of elMembersContainer.Children()) {\n            child.SetAttributeInt(\"marked_for_delete\", 1);\n        }\n        let delay = 0;\n        for (let i = NumberOfParties; i-- > 0;) {\n            const DELAY_INCREMENT = 0.25;\n            const arrMembers = [];\n            const partyXuid = PartyBrowserAPI.GetPrivateQueuePartyXuidByIndex(i);\n            const partyId = _GetPartyID(partyXuid, arrMembers);\n            let elParty = elMembersContainer.FindChild(partyId);\n            if (!elParty) {\n                elParty = $.CreatePanel('Panel', elMembersContainer, partyId, { class: 'directchallenge__party hidden' });\n                elParty.SetHasClass('multi', arrMembers.length > 1);\n                elMembersContainer.MoveChildBefore(elParty, elMembersContainer.Children()[0]);\n                elParty.SetAttributeString(\"xuid\", partyXuid);\n                Scheduler.Schedule(delay, () => {\n                    if (elParty && elParty.IsValid())\n                        elParty.RemoveClass('hidden');\n                }, \"directchallenge\");\n                for (let xuid of arrMembers) {\n                    if (elParty) {\n                        const elTile = $.CreatePanel('Panel', elParty, xuid, { class: \"directchallenge__party__member\" });\n                        _CreatePlayerTile(elTile, xuid, delay);\n                    }\n                    delay += DELAY_INCREMENT;\n                }\n            }\n            else {\n            }\n            elParty.SetAttributeInt(\"marked_for_delete\", 0);\n        }\n        for (let child of elMembersContainer.Children()) {\n            if (child.GetAttributeInt(\"marked_for_delete\", 0) !== 0) {\n                child.DeleteAsync(0.0);\n            }\n        }\n    }\n    function _SetClientViewLobbySettingsTitle(isHost) {\n        const elPanel = $.GetContextPanel().FindChildInLayoutFile('play-lobby-leader-panel');\n        if (!elPanel || !elPanel.IsValid()) {\n            return;\n        }\n        if (isHost) {\n            elPanel.visible = false;\n            return;\n        }\n        elPanel.visible = true;\n        const elTitle = elPanel.FindChildInLayoutFile('play-lobby-leader-text');\n        const xuid = PartyListAPI.GetPartySystemSetting(\"xuidHost\");\n        const leaderName = FriendsListAPI.GetFriendName(xuid);\n        elTitle.text = leaderName;\n        const elAvatar = elPanel.FindChildInLayoutFile('lobby-leader-avatar');\n        elAvatar.PopulateFromSteamID(xuid);\n    }\n    function _GetAvailableMapGroups(gameMode, isPlayingOnValveOfficial) {\n        const gameModeCfg = m_gameModeConfigs[gameMode];\n        if (gameModeCfg === undefined)\n            return [];\n        const mapgroup = isPlayingOnValveOfficial ? gameModeCfg.mapgroupsMP : gameModeCfg.mapgroupsSP;\n        if (mapgroup !== undefined && mapgroup !== null) {\n            delete mapgroup['mg_lobby_mapveto'];\n            return Object.keys(mapgroup);\n        }\n        return [];\n    }\n    function _GetMapGroupPanelID() {\n        if (inDirectChallenge()) {\n            return \"gameModeButtonContainer_directchallenge\";\n        }\n        else if (m_gameModeSetting === 'premier') {\n            return \"gameModeButtonContainer_premier\";\n        }\n        const gameModeId = _RealGameMode() + (m_singleSkirmishMapGroup ? '@' + m_singleSkirmishMapGroup : '');\n        const panelID = 'gameModeButtonContainer_' + gameModeId + '_' + m_serverSetting;\n        return panelID;\n    }\n    function _OnActivateMapOrMapGroupButton(mapgroupButton) {\n        const mapGroupNameClicked = mapgroupButton.GetAttributeString(\"mapname\", '');\n        if ($.GetContextPanel().BHasClass('play-menu__lobbymapveto_activated') && mapGroupNameClicked !== 'mg_lobby_mapveto') {\n            return;\n        }\n        if (mapgroupButton.checked) {\n            $.DispatchEvent('CSGOPlaySoundEffect', 'submenu_leveloptions_select', 'MOUSE');\n        }\n        else {\n            $.DispatchEvent('CSGOPlaySoundEffect', 'submenu_leveloptions_deselect', 'MOUSE');\n        }\n        let mapGroupName = mapGroupNameClicked;\n        if (mapGroupName) {\n            const siblingSuffix = '_scrimmagemap';\n            if (mapGroupName.toLowerCase().endsWith(siblingSuffix))\n                mapGroupName = mapGroupName.substring(0, mapGroupName.length - siblingSuffix.length);\n            else\n                mapGroupName = mapGroupName + siblingSuffix;\n            let elParent = mapgroupButton.GetParent();\n            if (elParent)\n                elParent = elParent.GetParent();\n            if (elParent && elParent.GetAttributeString('hassections', '')) {\n                for (let section of elParent.Children()) {\n                    for (let tile of section.Children()) {\n                        const mapGroupNameSibling = tile.GetAttributeString(\"mapname\", '');\n                        if (mapGroupNameSibling.toLowerCase() === mapGroupName.toLowerCase()) {\n                            tile.checked = false;\n                        }\n                    }\n                }\n            }\n        }\n        _MatchMapSelectionWithQuickSelect();\n        if (_CheckContainerHasAnyChildChecked(_GetMapListForServerTypeAndGameMode(m_activeMapGroupSelectionPanelID))) {\n            _ApplySessionSettings();\n        }\n    }\n    function _ShowActiveMapSelectionTab(isEnabled) {\n        const panelID = m_activeMapGroupSelectionPanelID;\n        for (const key in m_mapSelectionButtonContainers) {\n            const elButtonContainer = m_mapSelectionButtonContainers[key];\n            if (!m_bDidShowActiveMapSelectionTab) {\n                elButtonContainer.AddClass(\"skip-transition\");\n            }\n            if (key !== panelID) {\n                elButtonContainer.AddClass(\"hidden\");\n            }\n            else {\n                elButtonContainer.RemoveClass(\"hidden\");\n                elButtonContainer.visible = true;\n                elButtonContainer.enabled = isEnabled;\n            }\n            elButtonContainer.RemoveClass(\"skip-transition\");\n        }\n        const isWorkshop = panelID === k_workshopPanelId;\n        $('#WorkshopSearchBar').visible = isWorkshop;\n        for (let element of $('#GameModeSelectionRadios').Children()) {\n            element.enabled = element.enabled && !isWorkshop && !_IsSearching() && LobbyAPI.BIsHost();\n        }\n        $('#WorkshopVisitButton').visible = isWorkshop;\n        $('#WorkshopVisitButton').enabled = SteamOverlayAPI.IsEnabled();\n        m_bDidShowActiveMapSelectionTab = true;\n    }\n    function _GetMapTileContainer() {\n        return $.GetContextPanel().FindChildInLayoutFile(_GetMapGroupPanelID());\n    }\n    function CSGOOpenSteamWorkshop_helper(tag) {\n        $.DispatchEvent('CSGOOpenSteamWorkshop', tag);\n    }\n    PlayMenu.CSGOOpenSteamWorkshop_helper = CSGOOpenSteamWorkshop_helper;\n    function OnMapQuickSelect(mgName) {\n        const arrMapsToSelect = _GetMapsFromQuickSelectMapGroup(mgName);\n        let bScrolled = false;\n        const prevSelection = _GetSelectedMapsForServerTypeAndGameMode(m_serverSetting, _RealGameMode(), true);\n        const elMapGroupContainer = _GetMapTileContainer();\n        for (let elMapBtn of elMapGroupContainer.Children()) {\n            let bFound = false;\n            if (mgName === \"all\") {\n                bFound = true;\n            }\n            else if (mgName === \"none\") {\n                bFound = false;\n            }\n            else {\n                for (let mapname of arrMapsToSelect) {\n                    if (elMapBtn.GetAttributeString(\"mapname\", \"\") == mapname) {\n                        bFound = true;\n                    }\n                }\n            }\n            elMapBtn.checked = bFound;\n            if (bFound && !bScrolled) {\n                elMapBtn.ScrollParentToMakePanelFit(2, false);\n                bScrolled = true;\n            }\n        }\n        const newSelection = _GetSelectedMapsForServerTypeAndGameMode(m_serverSetting, _RealGameMode(), true);\n        if (prevSelection != newSelection) {\n            $.DispatchEvent('CSGOPlaySoundEffect', 'submenu_leveloptions_select', 'MOUSE');\n            _MatchMapSelectionWithQuickSelect();\n            if (_CheckContainerHasAnyChildChecked(_GetMapListForServerTypeAndGameMode(m_activeMapGroupSelectionPanelID))) {\n                _ApplySessionSettings();\n            }\n        }\n    }\n    PlayMenu.OnMapQuickSelect = OnMapQuickSelect;\n    function _ValidateMaps(arrMapList) {\n        let arrMapTileNames = [];\n        const arrMapButtons = _GetMapListForServerTypeAndGameMode(m_activeMapGroupSelectionPanelID);\n        arrMapButtons.forEach(elMapTile => arrMapTileNames.push(elMapTile.GetAttributeString(\"mapname\", \"\")));\n        const filteredMapList = arrMapList.filter(strMap => arrMapTileNames.includes(strMap));\n        return filteredMapList;\n    }\n    function _GetMapGroupsWithAttribute(strAttribute, strValue) {\n        const arrNewMapgroups = [];\n        const elMapGroupContainer = _GetMapTileContainer();\n        for (let elMapBtn of elMapGroupContainer.Children()) {\n            const mgName = elMapBtn.GetAttributeString(\"mapname\", \"\");\n            if (GameTypesAPI.GetMapGroupAttribute(mgName, strAttribute) === strValue) {\n                arrNewMapgroups.push(mgName);\n            }\n        }\n        return arrNewMapgroups;\n    }\n    function _GetMapsFromQuickSelectMapGroup(mgName) {\n        if (mgName === (\"favorites\")) {\n            const mapsAsString = GameInterfaceAPI.GetSettingString('ui_playsettings_custom_preset');\n            if (mapsAsString === '')\n                return [];\n            else {\n                const arrMapList = mapsAsString.split(',');\n                const filteredMapList = _ValidateMaps(arrMapList);\n                if (arrMapList.length != filteredMapList.length)\n                    GameInterfaceAPI.SetSettingString('ui_playsettings_custom_preset', filteredMapList.length > 0 ? filteredMapList.join(',') : \"\");\n                return filteredMapList;\n            }\n        }\n        else if (mgName === \"new\") {\n            return _GetMapGroupsWithAttribute('showtagui', 'new');\n        }\n        else if (mgName === \"hostage\") {\n            return _GetMapGroupsWithAttribute('icontag', 'hostage');\n        }\n        else if (mgName === \"activeduty\") {\n            return _GetMapGroupsWithAttribute('grouptype', 'active').filter(x => x !== 'mg_lobby_mapveto');\n        }\n        else {\n            return [];\n        }\n    }\n    function _MatchMapSelectionWithQuickSelect() {\n        const elQuickSelectContainer = $.GetContextPanel().FindChildInLayoutFile(\"JsQuickSelectParent\");\n        if (!elQuickSelectContainer || m_isWorkshop)\n            return;\n        for (let elQuickBtn of elQuickSelectContainer.FindChildrenWithClassTraverse('preset-button')) {\n            const arrQuickSelectMaps = _GetMapsFromQuickSelectMapGroup(elQuickBtn.id);\n            let bMatch = true;\n            const elMapGroupContainer = _GetMapTileContainer();\n            for (let i = 0; i < elMapGroupContainer.Children().length; i++) {\n                const elMapBtn = elMapGroupContainer.Children()[i];\n                const mapName = elMapBtn.GetAttributeString(\"mapname\", \"\");\n                if (elQuickBtn.id == \"none\") {\n                    if (elMapBtn.checked) {\n                        bMatch = false;\n                        break;\n                    }\n                }\n                else if (elQuickBtn.id == \"all\") {\n                    if (!elMapBtn.checked) {\n                        bMatch = false;\n                        break;\n                    }\n                }\n                else {\n                    if (elMapBtn.checked != (arrQuickSelectMaps.includes(mapName))) {\n                        bMatch = false;\n                        break;\n                    }\n                }\n            }\n            elQuickBtn.checked = bMatch;\n        }\n    }\n    function _LazyCreateMapListPanel() {\n        const serverType = m_serverSetting;\n        const gameMode = _RealGameMode();\n        const panelID = _GetMapGroupPanelID();\n        if (panelID in m_mapSelectionButtonContainers) {\n            let bAllowReuseExistingContainer = true;\n            const elExistingContainer = m_mapSelectionButtonContainers[panelID];\n            const elFriendLeaderboards = elExistingContainer ? elExistingContainer.FindChildTraverse(\"FriendLeaderboards\") : null;\n            if (elFriendLeaderboards) {\n                const strEmbeddedLeaderboardName = elFriendLeaderboards.GetAttributeString(\"type\", '');\n                if (strEmbeddedLeaderboardName) {\n                    LeaderboardsAPI.Refresh(strEmbeddedLeaderboardName);\n                }\n            }\n            if (bAllowReuseExistingContainer)\n                return panelID;\n            else\n                elExistingContainer.DeleteAsync(0.0);\n        }\n        const container = $.CreatePanel(\"Panel\", $('#MapSelectionList'), panelID, {\n            class: 'map-selection-list map-selection-list--inner hidden'\n        });\n        container.AddClass('map-selection-list--' + serverType + '-' + gameMode);\n        m_mapSelectionButtonContainers[panelID] = container;\n        let strSnippetNameOverride;\n        if (inDirectChallenge()) {\n            strSnippetNameOverride = \"MapSelectionContainer_directchallenge\";\n        }\n        else if (m_gameModeSetting === 'premier') {\n            strSnippetNameOverride = \"MapSelectionContainer_premier\";\n        }\n        else {\n            strSnippetNameOverride = \"MapSelectionContainer_\" + serverType + \"_\" + gameMode;\n        }\n        if (container.BHasLayoutSnippet(strSnippetNameOverride)) {\n            container.BLoadLayoutSnippet(strSnippetNameOverride);\n            const elMapTile = container.FindChildTraverse(\"MapTile\");\n            if (elMapTile)\n                elMapTile.BLoadLayoutSnippet(\"MapGroupSelection\");\n        }\n        else {\n            strSnippetNameOverride = '';\n        }\n        const isPlayingOnValveOfficial = _IsValveOfficialServer(serverType);\n        const arrMapGroups = _GetAvailableMapGroups(gameMode, isPlayingOnValveOfficial);\n        const numTiles = arrMapGroups.length;\n        if (gameMode === 'skirmish' && m_singleSkirmishMapGroup) {\n            _UpdateOrCreateMapGroupTile(m_singleSkirmishMapGroup, container, null, panelID + m_singleSkirmishMapGroup, numTiles);\n        }\n        else {\n            arrMapGroups.forEach((item, index, aMapGroups) => {\n                if (gameMode === 'skirmish' && m_arrSingleSkirmishMapGroups.includes(aMapGroups[index])) {\n                    return;\n                }\n                let elSectionContainer = null;\n                elSectionContainer = container;\n                if (strSnippetNameOverride)\n                    elSectionContainer = container.FindChildTraverse(\"MapTile\");\n                if (elSectionContainer)\n                    _UpdateOrCreateMapGroupTile(aMapGroups[index], elSectionContainer, null, panelID + aMapGroups[index], numTiles);\n            });\n        }\n        $.RegisterEventHandler('PropertyTransitionEnd', container, (panel, propertyName) => {\n            if (container === panel && propertyName === 'opacity' &&\n                !container.id.startsWith(\"FriendLeaderboards\")) {\n                if (container.visible === true && container.BIsTransparent()) {\n                    container.visible = false;\n                    return true;\n                }\n            }\n            return false;\n        });\n        return panelID;\n    }\n    function _PopulateQuickSelectBar(isSearching, isHost) {\n        const elQuickSelectContainer = $.GetContextPanel().FindChildInLayoutFile(\"jsQuickSelectionSetsContainer\");\n        if (!elQuickSelectContainer)\n            return;\n        if (m_isWorkshop)\n            return;\n        _MatchMapSelectionWithQuickSelect();\n        _EnableDisableQuickSelectBtns(isSearching, isHost);\n    }\n    function _EnableDisableQuickSelectBtns(isSearching, isHost) {\n        const bEnable = !isSearching && isHost;\n        const elQuickSelectContainer = $.GetContextPanel().FindChildInLayoutFile(\"JsQuickSelectParent\");\n        elQuickSelectContainer.FindChildrenWithClassTraverse('preset-button').forEach(element => element.enabled = bEnable);\n    }\n    function SaveMapSelectionToCustomPreset(bSilent = false) {\n        if (inDirectChallenge())\n            return;\n        if (m_gameModeSetting === 'premier')\n            return;\n        if (!LobbyAPI.BIsHost())\n            return;\n        const selectedMaps = _GetSelectedMapsForServerTypeAndGameMode(m_serverSetting, _RealGameMode(), true);\n        if (selectedMaps === \"\") {\n            if (!bSilent)\n                $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.buymenu_failure', 'MOUSE');\n            _NoMapSelectedPopup();\n            return;\n        }\n        GameInterfaceAPI.SetSettingString('ui_playsettings_custom_preset', selectedMaps);\n        if (!bSilent) {\n            $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.generic_button_press', 'MOUSE');\n            $.GetContextPanel().FindChildInLayoutFile(\"jsQuickSelectionSave\").TriggerClass('save');\n        }\n        _MatchMapSelectionWithQuickSelect();\n    }\n    PlayMenu.SaveMapSelectionToCustomPreset = SaveMapSelectionToCustomPreset;\n    function _GetPanelTypeForMapGroupTile(gameMode, singleSkirmishMapGroup) {\n        const bIsCompetitive = gameMode === 'competitive';\n        const bIsWingman = gameMode === 'scrimcomp2v2';\n        return (((bIsCompetitive || bIsWingman) && _IsValveOfficialServer(m_serverSetting)) ? \"ToggleButton\" : \"RadioButton\");\n    }\n    function _UpdateOrCreateMapGroupTile(mapGroupName, container, elTilePanel, newTileID, numTiles) {\n        const mg = GetMGDetails(mapGroupName);\n        if (!mg)\n            return;\n        let p = elTilePanel;\n        if (!p) {\n            const panelType = _GetPanelTypeForMapGroupTile(_RealGameMode(), m_singleSkirmishMapGroup);\n            const panelID = newTileID ? newTileID : (container.id + mapGroupName);\n            p = $.CreatePanel(panelType, container, panelID);\n            p.BLoadLayoutSnippet(\"MapGroupSelection\");\n            if (panelType === \"RadioButton\") {\n                let radioGroupID;\n                if (panelID.endsWith(mapGroupName))\n                    radioGroupID = panelID.substring(0, panelID.length - mapGroupName.length);\n                else\n                    radioGroupID = container.id;\n                const group = \"radiogroup_\" + radioGroupID;\n                p.SetAttributeString(\"group\", group);\n            }\n        }\n        p.SetAttributeString(\"mapname\", mapGroupName);\n        p.SetPanelEvent('onactivate', () => _OnActivateMapOrMapGroupButton(p));\n        p.SetHasClass('map-selection-btn-activedutymap', mg.grouptype === 'active');\n        p.FindChildInLayoutFile('ActiveGroupIcon').visible = mg.grouptype === 'active';\n        p.FindChildInLayoutFile('MapGroupName').text = $.Localize(mg.nameID);\n        UpdateIconsAndScreenshots(p, numTiles, mapGroupName, mg);\n        return p;\n    }\n    function _UpdateRatingEmblem(p, mapGroupName) {\n        let elRatingEmblem = p.FindChildTraverse('jsRatingEmblem');\n        if (!elRatingEmblem || !elRatingEmblem.IsValid())\n            return;\n        elRatingEmblem.visible = m_serverSetting == 'official' &&\n            m_gameModeSetting === 'competitive' &&\n            !m_isWorkshop &&\n            LobbyAPI.GetSessionSettings() &&\n            LobbyAPI.GetSessionSettings().hasOwnProperty('game') &&\n            LobbyAPI.GetSessionSettings().game.hasOwnProperty('prime') &&\n            LobbyAPI.GetSessionSettings().game.prime;\n        let pmso = MyPersonaAPI.GetCompetitivePerMapStatsObject();\n        let score = pmso[mapGroupName] ? pmso[mapGroupName][\"skillgroup\"] : -1;\n        let wins = pmso[mapGroupName] ? pmso[mapGroupName][\"wins\"] : -1;\n        let options = {\n            root_panel: p,\n            rating_type: 'Competitive',\n            rating_map: mapGroupName,\n            full_details: true,\n            leaderboard_details: { score: score, matchesWon: wins },\n            local_player: true\n        };\n        RatingEmblem.SetXuid(options);\n        let winCountString = RatingEmblem.GetWinCountString(p);\n        p.SetDialogVariable('map-win-count', winCountString);\n        p.SetHasClass('show-win-count', winCountString != '');\n    }\n    function UpdateIconsAndScreenshots(p, numTiles, mapGroupName, mg) {\n        const keysList = Object.keys(mg.maps);\n        const iconSize = 200;\n        const iconPath = mapGroupName === 'random_classic' ? 'file://{images}/icons/ui/random_map.svg' : 'file://{images}/' + mg.icon_image_path + '.svg';\n        let mapGroupIcon = p.FindChildInLayoutFile('MapSelectionButton').FindChildInLayoutFile('MapGroupCollectionIcon');\n        if (keysList.length < 2) {\n            if (mapGroupIcon) {\n                mapGroupIcon.SetImage(iconPath);\n            }\n            else {\n                mapGroupIcon = $.CreatePanel('Image', p.FindChildInLayoutFile('MapSelectionButton'), 'MapGroupCollectionIcon', {\n                    defaultsrc: 'file://{images}/icons/ui/random_map.svg',\n                    texturewidth: iconSize,\n                    textureheight: iconSize,\n                    src: iconPath,\n                    class: 'map-selection-btn__map-icon'\n                });\n                p.FindChildInLayoutFile('MapSelectionButton').MoveChildBefore(mapGroupIcon, p.FindChildInLayoutFile('MapGroupCollectionMultiIcons'));\n            }\n        }\n        let mapImage = null;\n        let mapIcon = null;\n        if (mapGroupName === 'random_classic') {\n            mapImage = p.FindChildInLayoutFile('MapGroupImagesCarousel').FindChildInLayoutFile('MapSelectionScreenshot');\n            if (!mapImage) {\n                mapImage = $.CreatePanel('Panel', p.FindChildInLayoutFile('MapGroupImagesCarousel'), 'MapSelectionScreenshot');\n                mapImage.AddClass('map-selection-btn__screenshot');\n            }\n            mapImage.style.backgroundImage = 'url(\"file://{images}/map_icons/screenshots/360p/random.png\")';\n            mapImage.style.backgroundPosition = '50% 0%';\n            mapImage.style.backgroundSize = 'auto 100%';\n        }\n        _SetMapGroupModifierLabelElements(mapGroupName, p);\n        for (let i = 0; i < keysList.length; i++) {\n            mapImage = p.FindChildInLayoutFile('MapGroupImagesCarousel').FindChildInLayoutFile('MapSelectionScreenshot' + i);\n            if (!mapImage) {\n                mapImage = $.CreatePanel('Panel', p.FindChildInLayoutFile('MapGroupImagesCarousel'), 'MapSelectionScreenshot' + i);\n                mapImage.AddClass('map-selection-btn__screenshot');\n            }\n            if (m_gameModeSetting === 'survival' || m_gameModeSetting === 'rush') {\n                mapImage.style.backgroundImage = 'url(\"file://{resources}/videos/' + keysList[i] + '_preview.webm\")';\n            }\n            else {\n                mapImage.style.backgroundImage = 'url(\"file://{images}/map_icons/screenshots/720p/' + keysList[i] + '.png\")';\n            }\n            mapImage.style.backgroundPosition = '50% 0%';\n            mapImage.style.backgroundSize = 'auto 100%';\n            if (keysList.length > 1) {\n                const mapIconsContainer = p.FindChildInLayoutFile('MapGroupCollectionMultiIcons');\n                mapIconsContainer.SetHasClass('left-right-flow-wrap', numTiles === 1);\n                mapIconsContainer.SetHasClass('top-bottom-flow-wrap', numTiles > 1);\n                const subMapIconImagePanelID = 'MapIcon' + i;\n                mapIcon = mapIconsContainer.FindChildInLayoutFile(subMapIconImagePanelID);\n                if (!mapIcon) {\n                    mapIcon = $.CreatePanel('Image', mapIconsContainer, subMapIconImagePanelID, {\n                        defaultsrc: 'file://{images}/map_icons/map_icon_NONE.png',\n                        texturewidth: iconSize,\n                        textureheight: iconSize,\n                        src: 'file://{images}/map_icons/map_icon_' + keysList[i] + '.svg'\n                    });\n                }\n                mapIcon.AddClass('map-selection-btn__map-icon');\n                IconUtil.SetupFallbackMapIcon(mapIcon, 'file://{images}/map_icons/map_icon_' + keysList[i]);\n            }\n        }\n        if (mg.tooltipID) {\n            let pid = p.id;\n            let tooltipID = mg.tooltipID;\n            p.SetPanelEvent('onmouseover', () => OnMouseOverMapTile(pid, tooltipID, keysList));\n            p.SetPanelEvent('onmouseout', OnMouseOutMapTile);\n        }\n    }\n    function OnMouseOverMapTile(id, tooltipText, mapsList) {\n        tooltipText = $.Localize(tooltipText);\n        const mapNamesList = [];\n        if (mapsList.length > 1) {\n            for (let element of mapsList) {\n                mapNamesList.push($.Localize('#SFUI_Map_' + element));\n            }\n            const mapGroupsText = mapNamesList.join(', ');\n            tooltipText = tooltipText + '<br><br>' + mapGroupsText;\n        }\n        UiToolkitAPI.ShowTextTooltip(id, tooltipText);\n    }\n    function OnMouseOutMapTile() {\n        UiToolkitAPI.HideTextTooltip();\n    }\n    let m_timerMapGroupHandler = null;\n    function _GetRotatingMapGroupStatus(gameMode, singleSkirmishMapGroup, mapgroupname) {\n        m_timerMapGroupHandler = null;\n        const strSchedule = CompetitiveMatchAPI.GetRotatingOfficialMapGroupCurrentState(gameMode);\n        const elTimer = m_mapSelectionButtonContainers[m_activeMapGroupSelectionPanelID].FindChildInLayoutFile('PlayMenuMapRotationTimer');\n        if (elTimer) {\n            if (strSchedule) {\n                const strCurrentMapGroup = strSchedule.split(\"+\")[0];\n                const numSecondsRemaining = strSchedule.split(\"+\")[1].split(\"=\")[0];\n                const strNextMapGroup = strSchedule.split(\"=\")[1];\n                const numWait = FormatText.SecondsToDDHHMMSSWithSymbolSeperator(numSecondsRemaining);\n                if (!numWait) {\n                    elTimer.AddClass('hidden');\n                    return;\n                }\n                elTimer.RemoveClass('hidden');\n                elTimer.SetDialogVariable('map-rotate-timer', numWait);\n                const mg = GetMGDetails(strNextMapGroup);\n                elTimer.SetDialogVariable('next-mapname', $.Localize(mg.nameID));\n                const mapGroupPanelID = _GetMapGroupPanelID() + strCurrentMapGroup;\n                const mapGroupContainer = m_mapSelectionButtonContainers[m_activeMapGroupSelectionPanelID].FindChildTraverse('MapTile');\n                const mapGroupPanel = mapGroupContainer.FindChildInLayoutFile(mapGroupPanelID);\n                if (!mapGroupPanel) {\n                    mapGroupContainer.RemoveAndDeleteChildren();\n                    const btnMapGroup = _UpdateOrCreateMapGroupTile(strCurrentMapGroup, mapGroupContainer, null, mapGroupPanelID, 1);\n                    btnMapGroup.checked = true;\n                    _UpdateSurvivalAutoFillSquadBtn(m_gameModeSetting);\n                }\n                m_timerMapGroupHandler = $.Schedule(1, () => _GetRotatingMapGroupStatus(gameMode, singleSkirmishMapGroup, mapgroupname));\n            }\n            else {\n                elTimer.AddClass('hidden');\n            }\n        }\n    }\n    function _StartRotatingMapGroupTimer() {\n        _CancelRotatingMapGroupSchedule();\n        const activeMapGroup = m_activeMapGroupSelectionPanelID;\n        if (_RealGameMode() === \"survival\"\n            && m_mapSelectionButtonContainers && m_mapSelectionButtonContainers[activeMapGroup]\n            && m_mapSelectionButtonContainers[activeMapGroup].Children()) {\n            const btnSelectedMapGroup = m_mapSelectionButtonContainers[activeMapGroup].Children().filter(entry => entry.GetAttributeString('mapname', '') !== '');\n            if (btnSelectedMapGroup[0]) {\n                const mapSelectedGroupName = btnSelectedMapGroup[0].GetAttributeString('mapname', '');\n                if (mapSelectedGroupName) {\n                    _GetRotatingMapGroupStatus(_RealGameMode(), m_singleSkirmishMapGroup, mapSelectedGroupName);\n                }\n            }\n        }\n    }\n    function _CancelRotatingMapGroupSchedule() {\n        if (m_timerMapGroupHandler) {\n            $.CancelScheduled(m_timerMapGroupHandler);\n            m_timerMapGroupHandler = null;\n        }\n    }\n    function _SetMapGroupModifierLabelElements(mapName, elMapPanel) {\n        const isNew = (GameTypesAPI.GetMapGroupAttribute(mapName, 'showtagui') === 'new');\n        elMapPanel.FindChildInLayoutFile('MapGroupNewTag').SetHasClass('hidden', !isNew || mapName === \"mg_lobby_mapveto\");\n        elMapPanel.FindChildInLayoutFile('MapSelectionTopRowIcons').SetHasClass('tall', mapName === \"mg_lobby_mapveto\");\n    }\n    function _ReloadLeaderboardLayoutGivenSettings(container, lbName, strTitleOverride, strPointsTitle) {\n        const elFriendLeaderboards = container.FindChildTraverse(\"FriendLeaderboards\");\n        elFriendLeaderboards.SetAttributeString(\"type\", lbName + \".friends\");\n        if (strPointsTitle)\n            elFriendLeaderboards.SetAttributeString(\"points-title\", strPointsTitle);\n        if (strTitleOverride)\n            elFriendLeaderboards.SetAttributeString(\"titleoverride\", strTitleOverride);\n        elFriendLeaderboards.BLoadLayout('file://{resources}/layout/popups/popup_leaderboards.xml', true, false);\n        elFriendLeaderboards.AddClass('leaderboard_embedded');\n        elFriendLeaderboards.RemoveClass('Hidden');\n    }\n    function _UpdateMapGroupButtons(isEnabled, isSearching, isHost) {\n        const panelID = _LazyCreateMapListPanel();\n        switch (_IsPlayingOnValveOfficial() ? _RealGameMode() : '') {\n            case 'competitive':\n            case 'scrimcomp2v2':\n            case 'rush':\n                _UpdateWaitTime(_GetMapListForServerTypeAndGameMode(panelID));\n                break;\n        }\n        if (!inDirectChallenge())\n            _SetEnabledStateForMapBtns(m_mapSelectionButtonContainers[panelID], isSearching, isHost);\n        m_activeMapGroupSelectionPanelID = panelID;\n        _ShowActiveMapSelectionTab(isEnabled);\n        _PopulateQuickSelectBar(isSearching, isHost);\n    }\n    function _SelectMapButtonsFromSettings(settings) {\n        m_selectedPracticeMap = '';\n        const mapsGroups = settings.game.mapgroupname.split(',');\n        const aListMaps = _GetMapListForServerTypeAndGameMode(m_activeMapGroupSelectionPanelID);\n        for (let e of aListMaps) {\n            const mapName = e.GetAttributeString(\"mapname\", \"invalid\");\n            e.checked = mapsGroups.includes(mapName);\n            if (m_serverSetting === 'listen' && e.checked) {\n                m_selectedPracticeMap = mapName.replace(/^mg_/, '');\n            }\n        }\n    }\n    function _ShowHideStartSearchBtn(isSearching, isHost) {\n        let bShow = !isSearching && isHost ? true : false;\n        const btnStartSearch = $.GetContextPanel().FindChildInLayoutFile('StartMatchBtn');\n        if (bShow) {\n            if (btnStartSearch.BHasClass('pressed')) {\n                btnStartSearch.RemoveClass('pressed');\n            }\n            btnStartSearch.RemoveClass('hidden');\n        }\n        else if (!btnStartSearch.BHasClass('pressed')) {\n            btnStartSearch.AddClass('hidden');\n        }\n    }\n    function _ShowCancelSearchButton(isSearching, isHost) {\n        const btnCancel = $.GetContextPanel().FindChildInLayoutFile('PartyCancelBtn');\n        btnCancel.enabled = (isSearching && isHost);\n        if (!btnCancel.enabled)\n            ParticleControls.UpdateActionBar(m_PlayMenuActionBarParticleFX, \"RmoveBtnEffects\");\n    }\n    function _UpdatePracticeSettingsBtns(isSearching, isHost) {\n        let elPracticeSettingsContainer = $('#id-play-menu-practicesettings-container');\n        let sessionSettings = LobbyAPI.GetSessionSettings();\n        let bForceHidden = (m_serverSetting !== 'listen') || m_isWorkshop || !LobbyAPI.IsSessionActive() || !sessionSettings;\n        let bAnnotationAvailable = true;\n        let bAnnotationSelected = GameInterfaceAPI.GetSettingString('ui_playsettings_listen_annotations') === '1';\n        let elAnnotationDropDown = $('#id-play-menu-practicesettings-annotations-dropdown');\n        elAnnotationDropDown.RebuildOptions(m_selectedPracticeMap, false);\n        let elAnnotationsDropDown = elPracticeSettingsContainer.FindChildTraverse('id-play-menu-practicesettings-annotations-dropdown');\n        for (let elChild of elPracticeSettingsContainer.Children()) {\n            if (!elChild.id.startsWith('id-play-menu-practicesettings-'))\n                continue;\n            let strFeatureName = elChild.id;\n            strFeatureName = strFeatureName.replace('id-play-menu-practicesettings-', '');\n            strFeatureName = strFeatureName.replace('-tooltip', '');\n            let elFeatureFrame = elChild.FindChildTraverse('id-play-menu-practicesettings-' + strFeatureName);\n            let elFeatureSliderBtn = elFeatureFrame.FindChildTraverse('id-slider-btn');\n            if (strFeatureName === \"annotations\") {\n                elAnnotationsDropDown.enabled = bAnnotationAvailable && bAnnotationSelected;\n            }\n            if (bForceHidden || (sessionSettings.game.type !== 'classic')) {\n                elChild.visible = false;\n                continue;\n            }\n            if (strFeatureName === \"annotations\" && !bAnnotationAvailable) {\n                elChild.visible = true;\n                elFeatureSliderBtn.enabled = false;\n                elFeatureSliderBtn.checked = false;\n                continue;\n            }\n            elChild.visible = true;\n            elFeatureSliderBtn.enabled = isHost && !isSearching;\n            let curvalue = 0;\n            if (sessionSettings && sessionSettings.options && sessionSettings.options.hasOwnProperty('practicesettings_' + strFeatureName)) {\n                curvalue = sessionSettings.options['practicesettings_' + strFeatureName];\n            }\n            else {\n                curvalue = GameInterfaceAPI.GetSettingString('ui_playsettings_listen_' + strFeatureName) === '1' ? 1 : 0;\n                if (curvalue === 1) {\n                    const setting = 'practicesettings_' + strFeatureName;\n                    const newSettings = { update: { options: {} } };\n                    newSettings.update.options[setting] = curvalue;\n                    LobbyAPI.UpdateSessionSettings(newSettings);\n                }\n            }\n            elFeatureSliderBtn.checked = curvalue ? true : false;\n            if (strFeatureName === \"grenades\" || strFeatureName === \"infammo\" || strFeatureName === \"infwarmup\") {\n                if (bAnnotationAvailable && bAnnotationSelected) {\n                    elFeatureSliderBtn.enabled = false;\n                    elFeatureSliderBtn.checked = true;\n                }\n            }\n        }\n    }\n    function _UpdatePrimeBtn(isSearching, isHost) {\n        const elPrimePanel = $('#PrimeStatusPanel');\n        const elGetPrimeBtn = $('#id-play-menu-get-prime');\n        const elPrimeStatus = $('#PrimeStatusLabelContainer');\n        if (!_IsPlayingOnValveOfficial() || !MyPersonaAPI.IsInventoryValid() || inDirectChallenge() || m_isWorkshop) {\n            elPrimePanel.visible = false;\n            return;\n        }\n        const LocalPlayerHasPrime = PartyListAPI.GetFriendPrimeEligible(MyPersonaAPI.GetXuid());\n        elPrimePanel.visible = true;\n        elPrimePanel.SetHasClass('play-menu-prime-logo-bg', LocalPlayerHasPrime);\n        elGetPrimeBtn.visible = !LocalPlayerHasPrime;\n        elPrimeStatus.visible = LocalPlayerHasPrime;\n        if (!LocalPlayerHasPrime) {\n            const sPrice = StoreAPI.GetStoreItemSalePrice(InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(1353, 0), 1, '');\n            elGetPrimeBtn.SetDialogVariable(\"price\", sPrice ? sPrice : '$0');\n            elGetPrimeBtn.SetPanelEvent('onactivate', () => {\n                UiToolkitAPI.HideTextTooltip();\n                UiToolkitAPI.ShowCustomLayoutPopup('prime_status', 'file://{resources}/layout/popups/popup_prime_status.xml');\n            });\n        }\n    }\n    function _UpdatePermissionBtnText(settings, isEnabled) {\n        let elBtnContainer = $('#PermissionsSettings');\n        let elBtn = elBtnContainer.FindChild(\"id-slider-btn\");\n        elBtn.SetDialogVariable('slide_toggle_text', $.Localize(\"#permissions_open_party\"));\n        elBtn.SetSelected(settings.system.access === 'public');\n        elBtn.enabled = isEnabled;\n    }\n    function _UpdateLeaderboardBtn(gameMode, isOfficalMatchmaking = false) {\n        const elLeaderboardButton = $('#PlayMenulLeaderboards');\n        {\n            elLeaderboardButton.visible = false;\n        }\n    }\n    function _UpdateReplayNewUserTrainingBtn(gameMode) {\n        const elButton = $('#PlayMenuReplayNewUserTrainingButton');\n        if (gameMode === 'competitive' && m_serverSetting === 'listen' && !m_isWorkshop) {\n            elButton.visible = true;\n            elButton.SetPanelEvent('onactivate', () => {\n                UiToolkitAPI.ShowGenericPopupOkCancel('#ForceNewUserTraining_title', '#ForceNewUserTraining_text', '', () => $.Schedule(0.1, () => {\n                    const settings = {\n                        update: {\n                            Options: {\n                                action: 'custommatch',\n                                server: 'listen',\n                            },\n                            Game: {\n                                mode: 'new_user_training',\n                                type: 'classic',\n                                mapgroupname: 'mg_de_dust2',\n                                map: 'de_dust2'\n                            }\n                        },\n                        delete: {}\n                    };\n                    LobbyAPI.UpdateSessionSettings(settings);\n                    LobbyAPI.StartMatchmaking('', '', '', '');\n                }), () => { });\n            });\n        }\n        else {\n            elButton.visible = false;\n        }\n    }\n    function _UpdateSurvivalAutoFillSquadBtn(gameMode) {\n        const elBtn = $('#SurvivalAutoSquadToggle');\n        if (!elBtn) {\n            return;\n        }\n        if (gameMode === 'survival' && _IsPlayingOnValveOfficial() && (PartyListAPI.GetCount() <= 1)) {\n            elBtn.visible = true;\n            const bAutoFill = !(GameInterfaceAPI.GetSettingString('ui_playsettings_survival_solo') === '1');\n            elBtn.checked = bAutoFill;\n            elBtn.enabled = !_IsSearching();\n            function _OnActivate() {\n                const bAutoFill = !(GameInterfaceAPI.GetSettingString('ui_playsettings_survival_solo') === '1');\n                GameInterfaceAPI.SetSettingString('ui_playsettings_survival_solo', bAutoFill ? '1' : '0');\n                _UpdateSurvivalAutoFillSquadBtn('survival');\n            }\n            elBtn.SetPanelEvent('onactivate', _OnActivate);\n        }\n        else {\n            elBtn.visible = false;\n        }\n        if (gameMode === 'survival') {\n            const lbType = ((elBtn.visible && !elBtn.checked) ? 'solo' : 'squads');\n            const lbName = \"official_leaderboard_survival_\" + lbType;\n            const container = elBtn.GetParent().GetParent();\n            const elFriendLeaderboards = container.FindChildTraverse(\"FriendLeaderboards\");\n            const sPreviousType = elFriendLeaderboards.GetAttributeString(\"type\", '');\n            if (!sPreviousType || !sPreviousType.startsWith(lbName)) {\n                _ReloadLeaderboardLayoutGivenSettings(container, lbName, \"#CSGO_official_leaderboard_survival_\" + lbType, \"#Cstrike_TitlesTXT_WINS\");\n            }\n        }\n    }\n    function _UpdateRushFriendLeaderboards(gameMode) {\n        const elRoot = $('#gameModeButtonContainer_rush_official');\n        if (!elRoot)\n            return;\n        if (gameMode === 'rush') {\n            const lbType = 'solo';\n            const lbName = \"official_leaderboard_rush_\" + lbType;\n            const elFriendLeaderboards = elRoot.FindChildTraverse(\"FriendLeaderboards\");\n            const sPreviousType = elFriendLeaderboards.GetAttributeString(\"type\", '');\n            if (!sPreviousType || !sPreviousType.startsWith(lbName)) {\n                _ReloadLeaderboardLayoutGivenSettings(elRoot, lbName, \"#CSGO_official_leaderboard_rush_\" + lbType, \"#Cstrike_TitlesTXT_WINS\");\n            }\n        }\n    }\n    function _SetEnabledStateForMapBtns(elMapList, isSearching, isHost) {\n        elMapList.SetHasClass('is-client', (isSearching || !isHost));\n        const childrenList = _GetMapListForServerTypeAndGameMode();\n        const bEnable = !isSearching && isHost;\n        for (let element of childrenList) {\n            if (!element.BHasClass('no-lock')) {\n                element.enabled = bEnable;\n            }\n        }\n    }\n    function _UpdateWaitTime(elMapList) {\n        const childrenList = elMapList;\n        for (let i = 0; i < childrenList.length; i++) {\n            const elWaitTime = childrenList[i].FindChildTraverse('MapGroupWaitTime');\n            const mapName = childrenList[i].GetAttributeString(\"mapname\", \"invalid\");\n            if (mapName === 'invalid') {\n                continue;\n            }\n            const seconds = LobbyAPI.GetMapWaitTimeInSeconds(_RealGameMode(), mapName);\n            const numWait = FormatText.SecondsToDDHHMMSSWithSymbolSeperator(seconds);\n            if (numWait) {\n                elWaitTime.SetDialogVariable(\"time\", numWait);\n                elWaitTime.FindChild('MapGroupWaitTimeLabel').text = $.Localize('#matchmaking_expected_wait_time', elWaitTime);\n                elWaitTime.RemoveClass('hidden');\n            }\n            else {\n                elWaitTime.AddClass('hidden');\n            }\n        }\n    }\n    function _SelectActivePlayPlayTypeBtn() {\n        const aPlayTypeBtns = $('#PlayTypeTopNav').Children();\n        for (let btn of aPlayTypeBtns) {\n            if (m_activeMapGroupSelectionPanelID === k_workshopPanelId) {\n                btn.checked = btn.id === 'PlayWorkshop';\n            }\n            else {\n                btn.checked = btn.id === 'Play-' + m_serverSetting;\n            }\n        }\n    }\n    function _IsValveOfficialServer(serverType) {\n        return serverType === \"official\" ? true : false;\n    }\n    function _IsPlayingOnValveOfficial() {\n        return _IsValveOfficialServer(m_serverSetting);\n    }\n    function _IsSearching() {\n        const searchingStatus = LobbyAPI.GetMatchmakingStatusString();\n        return searchingStatus !== '' && searchingStatus !== undefined ? true : false;\n    }\n    function _GetSelectedMapsForServerTypeAndGameMode(serverType, gameMode, bDontToggleMaps = false) {\n        const isPlayingOnValveOfficial = _IsValveOfficialServer(serverType);\n        const aListMapPanels = _GetMapListForServerTypeAndGameMode();\n        if (!_CheckContainerHasAnyChildChecked(aListMapPanels)) {\n            let preferencesMapsForThisMode = GameInterfaceAPI.GetSettingString('ui_playsettings_maps_' + serverType + '_' + gameMode);\n            if (!preferencesMapsForThisMode)\n                preferencesMapsForThisMode = '';\n            const savedMapIds = preferencesMapsForThisMode.split(',');\n            for (let strMapNameIndividual of savedMapIds) {\n                const mapsWithThisName = aListMapPanels.filter((map) => {\n                    const mapName = map.GetAttributeString(\"mapname\", \"invalid\");\n                    return mapName === strMapNameIndividual;\n                });\n                if (mapsWithThisName.length > 0) {\n                    if (!bDontToggleMaps)\n                        mapsWithThisName[0].checked = true;\n                }\n            }\n            if (aListMapPanels.length > 0 && !_CheckContainerHasAnyChildChecked(aListMapPanels)) {\n                if (!bDontToggleMaps)\n                    aListMapPanels[0].checked = true;\n            }\n        }\n        if ((serverType === 'official' && gameMode === 'survival')\n            || (gameMode === 'rush')) {\n            return GameInterfaceAPI.GetSettingString('ui_playsettings_maps_' + serverType + '_' + gameMode);\n        }\n        const selectedMaps = aListMapPanels.filter((e) => {\n            return e.checked;\n        })\n            .reduce((accumulator, e) => {\n            const mapName = e.GetAttributeString(\"mapname\", \"invalid\");\n            return (accumulator) ? (accumulator + \",\" + mapName) : mapName;\n        }, '');\n        return selectedMaps;\n    }\n    function _GetMapListForServerTypeAndGameMode(mapGroupOverride = null) {\n        const mapGroupPanelID = !mapGroupOverride ? _LazyCreateMapListPanel() : mapGroupOverride;\n        const elParent = m_mapSelectionButtonContainers[mapGroupPanelID];\n        if (_RealGameMode() === 'competitive' && elParent.GetAttributeString('hassections', '')) {\n            let aListMapPanels = [];\n            for (let section of elParent.Children()) {\n                for (let tile of section.Children()) {\n                    if (tile.id != 'play-maps-section-header-container') {\n                        aListMapPanels.push(tile);\n                    }\n                }\n            }\n            return aListMapPanels;\n        }\n        else if ((_IsPlayingOnValveOfficial() && (_RealGameMode() === 'survival'\n            || _RealGameMode() === 'cooperative'\n            || _RealGameMode() === 'coopmission'))\n            || (_RealGameMode() === 'rush')) {\n            let elMapTile = elParent.FindChildTraverse(\"MapTile\");\n            if (elMapTile)\n                return elMapTile.Children();\n            else\n                return elParent.Children();\n        }\n        else {\n            return elParent.Children();\n        }\n    }\n    function _GetSelectedWorkshopMapButtons() {\n        const mapGroupPanelID = _LazyCreateWorkshopTab();\n        const mapContainer = m_mapSelectionButtonContainers[mapGroupPanelID];\n        const children = mapContainer.Children();\n        if (children.length == 0 || !children[0].GetAttributeString('group', \"\")) {\n            return [];\n        }\n        if (!_CheckContainerHasAnyChildChecked(children)) {\n            let preferencesMapsForThisMode = GameInterfaceAPI.GetSettingString('ui_playsettings_maps_workshop');\n            if (!preferencesMapsForThisMode)\n                preferencesMapsForThisMode = '';\n            const savedMapIds = preferencesMapsForThisMode.split(',');\n            for (let strMapNameIndividual of savedMapIds) {\n                const mapsWithThisName = children.filter((map) => {\n                    const mapName = map.GetAttributeString(\"mapname\", \"invalid\");\n                    return mapName === strMapNameIndividual;\n                });\n                if (mapsWithThisName.length > 0) {\n                    mapsWithThisName[0].checked = true;\n                }\n            }\n            if (!_CheckContainerHasAnyChildChecked(children) && children.length > 0) {\n                children[0].checked = true;\n            }\n        }\n        const selectedMaps = children.filter((e) => {\n            return e.checked;\n        });\n        return Array.from(selectedMaps);\n    }\n    function _GetSelectedWorkshopMap() {\n        const mapButtons = _GetSelectedWorkshopMapButtons();\n        const selectedMaps = mapButtons.reduce((accumulator, e) => {\n            const mapName = e.GetAttributeString(\"mapname\", \"invalid\");\n            return (accumulator) ? (accumulator + \",\" + mapName) : mapName;\n        }, '');\n        return selectedMaps;\n    }\n    function _GetSingleSkirmishIdFromMapGroup(mapGroup) {\n        return mapGroup.replace('mg_skirmish_', '');\n    }\n    function _GetSingleSkirmishMapGroupFromId(skirmishId) {\n        return 'mg_skirmish_' + skirmishId;\n    }\n    function _GetSingleSkirmishIdFromSingleSkirmishString(entry) {\n        return entry.replace('skirmish_', '');\n    }\n    function _GetSingleSkirmishMapGroupFromSingleSkirmishString(entry) {\n        return _GetSingleSkirmishMapGroupFromId(_GetSingleSkirmishIdFromSingleSkirmishString(entry));\n    }\n    function _IsSingleSkirmishString(entry) {\n        return entry.startsWith('skirmish_');\n    }\n    function _CheckContainerHasAnyChildChecked(aMapList) {\n        if (aMapList.length < 1)\n            return false;\n        return aMapList.filter(map => map.checked).length > 0;\n    }\n    function _ValidateSessionSettings() {\n        if (m_isWorkshop) {\n            m_serverSetting = \"listen\";\n        }\n        if (!_IsGameModeAvailable(m_serverSetting, m_gameModeSetting)) {\n            m_gameModeSetting = GameInterfaceAPI.GetSettingString(\"ui_playsettings_mode_\" + m_serverSetting);\n            m_singleSkirmishMapGroup = null;\n            if (_IsSingleSkirmishString(_RealGameMode())) {\n                m_singleSkirmishMapGroup = _GetSingleSkirmishMapGroupFromSingleSkirmishString(_RealGameMode());\n                m_gameModeSetting = 'skirmish';\n            }\n            if (!_IsGameModeAvailable(m_serverSetting, m_gameModeSetting)) {\n                const modes = [\n                    \"premier\",\n                    \"competitive\",\n                    \"scrimcomp2v2\",\n                    \"casual\",\n                    \"deathmatch\",\n                ];\n                for (let i = 0; i < modes.length; i++) {\n                    if (_IsGameModeAvailable(m_serverSetting, modes[i])) {\n                        m_gameModeSetting = modes[i];\n                        m_singleSkirmishMapGroup = null;\n                        break;\n                    }\n                }\n            }\n        }\n        if (!m_gameModeFlags[m_serverSetting + _RealGameMode()])\n            _LoadGameModeFlagsFromSettings();\n        if (GameModeFlags.DoesModeUseFlags(_RealGameMode())) {\n            if (!GameModeFlags.AreFlagsValid(_RealGameMode(), m_gameModeFlags[m_serverSetting + _RealGameMode()])) {\n                _setAndSaveGameModeFlags(0);\n            }\n        }\n    }\n    function _LoadGameModeFlagsFromSettings() {\n        m_gameModeFlags[m_serverSetting + _RealGameMode()] = parseInt(GameInterfaceAPI.GetSettingString('ui_playsettings_flags_' + m_serverSetting + '_' + _RealGameMode()));\n    }\n    function _ApplySessionSettings() {\n        if (m_serverSetting === 'official' && !m_isWorkshop && !inDirectChallenge()) {\n            if (m_gameModeSetting === 'scrimcomp2v2') {\n                MyPersonaAPI.HintLoadPipRanks('wingman');\n            }\n            else if (m_gameModeSetting === 'competitive') {\n                MyPersonaAPI.HintLoadPipRanks('competitive');\n            }\n        }\n        if (!LobbyAPI.BIsHost()) {\n            return;\n        }\n        _ValidateSessionSettings();\n        const serverType = m_serverSetting;\n        let gameMode = _RealGameMode();\n        let gameModeFlags = m_gameModeFlags[m_serverSetting + gameMode] ? m_gameModeFlags[m_serverSetting + gameMode] : 0;\n        let primePreference = PartyListAPI.GetFriendPrimeEligible(MyPersonaAPI.GetXuid()) ? 1 : 0;\n        let selectedMaps;\n        if (m_isWorkshop)\n            selectedMaps = _GetSelectedWorkshopMap();\n        else if (inDirectChallenge()) {\n            selectedMaps = 'mg_lobby_mapveto';\n            gameModeFlags = 16;\n            primePreference = 0;\n        }\n        else if (m_gameModeSetting === 'premier') {\n            selectedMaps = 'mg_lobby_mapveto';\n            primePreference = 1;\n            m_challengeKey = '';\n        }\n        else if (m_singleSkirmishMapGroup) {\n            selectedMaps = m_singleSkirmishMapGroup;\n        }\n        else {\n            selectedMaps = _GetSelectedMapsForServerTypeAndGameMode(serverType, gameMode);\n        }\n        const settings = {\n            update: {\n                Options: {\n                    action: \"custommatch\",\n                    server: serverType,\n                    challengekey: _GetDirectChallengeKey(),\n                },\n                Game: {\n                    mode: gameMode,\n                    mode_ui: m_gameModeSetting,\n                    type: GetGameType(gameMode),\n                    mapgroupname: selectedMaps,\n                    gamemodeflags: gameModeFlags,\n                    prime: primePreference,\n                    map: ''\n                }\n            },\n            delete: {}\n        };\n        if (!inDirectChallenge()) {\n            settings.delete = {\n                Options: {\n                    challengekey: 1\n                }\n            };\n        }\n        if (selectedMaps.startsWith(\"random_\")) {\n            const arrMapGroups = _GetAvailableMapGroups(gameMode, false);\n            const idx = 1 + Math.floor((Math.random() * (arrMapGroups.length - 1)));\n            settings.update.Game.map = arrMapGroups[idx].substring(3);\n        }\n        if (m_isWorkshop) {\n            GameInterfaceAPI.SetSettingString('ui_playsettings_maps_workshop', selectedMaps);\n        }\n        else {\n            let singleSkirmishSuffix = '';\n            if (m_singleSkirmishMapGroup) {\n                singleSkirmishSuffix = '_' + _GetSingleSkirmishIdFromMapGroup(m_singleSkirmishMapGroup);\n            }\n            GameInterfaceAPI.SetSettingString('ui_playsettings_mode_' + serverType, m_gameModeSetting + singleSkirmishSuffix);\n            if (!inDirectChallenge() && m_gameModeSetting !== 'premier') {\n                GameInterfaceAPI.SetSettingString('ui_playsettings_maps_' + serverType + '_' + m_gameModeSetting + singleSkirmishSuffix, selectedMaps);\n            }\n        }\n        LobbyAPI.UpdateSessionSettings(settings);\n    }\n    function _SessionSettingsUpdate(sessionState) {\n        if (sessionState === \"ready\") {\n            if (m_jsTimerUpdateHandle && typeof m_jsTimerUpdateHandle === \"number\") {\n                $.CancelScheduled(m_jsTimerUpdateHandle);\n                m_jsTimerUpdateHandle = false;\n            }\n            _Init();\n        }\n        else if (sessionState === \"updated\") {\n            const settings = LobbyAPI.GetSessionSettings();\n            _SyncDialogsFromSessionSettings(settings);\n        }\n        else if (sessionState === \"closed\") {\n            m_jsTimerUpdateHandle = $.Schedule(0.5, _HalfSecondDelay_HideContentPanel);\n        }\n    }\n    function _PipRankUpdate() {\n        if (m_serverSetting == 'official' &&\n            m_gameModeSetting === 'competitive') {\n            const activeMapGroup = m_activeMapGroupSelectionPanelID;\n            const btnSelectedMapGroup = m_mapSelectionButtonContainers[activeMapGroup].Children();\n            for (let elPanel of btnSelectedMapGroup) {\n                const mapGroupName = elPanel.GetAttributeString('mapname', '').replace(/^mg_/, '');\n                _UpdateRatingEmblem(elPanel, mapGroupName);\n            }\n        }\n    }\n    function _HalfSecondDelay_HideContentPanel() {\n        m_jsTimerUpdateHandle = false;\n        $.DispatchEvent('HideContentPanel');\n    }\n    function _ReadyForDisplay() {\n        _StartRotatingMapGroupTimer();\n        _m_inventoryUpdatedHandler = $.RegisterForUnhandledEvent('PanoramaComponent_MyPersona_InventoryUpdated', _InventoryUpdated);\n        _InventoryUpdated();\n    }\n    function _UnreadyForDisplay() {\n        _CancelRotatingMapGroupSchedule();\n        if (_m_inventoryUpdatedHandler) {\n            $.UnregisterForUnhandledEvent('PanoramaComponent_MyPersona_InventoryUpdated', _m_inventoryUpdatedHandler);\n            _m_inventoryUpdatedHandler = null;\n        }\n    }\n    function _OnHideMainMenu() {\n        for (let entry of $('#MapSelectionList').FindChildrenWithClassTraverse(\"map-selection-btn__carousel\")) {\n            entry.SetAutoScrollEnabled(false);\n        }\n    }\n    function _OnShowMainMenu() {\n        for (let entry of $('#MapSelectionList').FindChildrenWithClassTraverse(\"map-selection-btn__carousel\")) {\n            entry.SetAutoScrollEnabled(true);\n        }\n    }\n    function _InitializeWorkshopTags(panel, mapInfo) {\n        const mapTags = mapInfo.tags ? mapInfo.tags.split(\",\") : [];\n        const rawModes = [];\n        const modes = [];\n        const tags = [];\n        for (let i = 0; i < mapTags.length; ++i) {\n            const modeTag = mapTags[i].toLowerCase().split(' ').join('').split('-').join('');\n            if (modeTag in k_workshopModes) {\n                const gameTypes = k_workshopModes[modeTag].split(',');\n                for (let iType = 0; iType < gameTypes.length; ++iType) {\n                    if (!rawModes.includes(gameTypes[iType]))\n                        rawModes.push(gameTypes[iType]);\n                }\n                modes.push($.Localize('#CSGO_Workshop_Mode_' + modeTag));\n            }\n            else {\n                tags.push($.HTMLEscape(mapTags[i]));\n            }\n        }\n        let tooltip = mapInfo.desc ? $.HTMLEscape(mapInfo.desc) : '';\n        if (modes.length > 0) {\n            if (tooltip)\n                tooltip += '<br><br>';\n            tooltip += $.Localize(\"#CSGO_Workshop_Modes\");\n            tooltip += ' ';\n            tooltip += modes.join(', ');\n        }\n        if (tags.length > 0) {\n            if (tooltip)\n                tooltip += '<br><br>';\n            tooltip += $.Localize(\"#CSGO_Workshop_Tags\");\n            tooltip += ' ';\n            tooltip += tags.join(', ');\n        }\n        panel.SetAttributeString('data-tooltip', tooltip);\n        panel.SetAttributeString('data-workshop-modes', rawModes.join(','));\n    }\n    function _ShowWorkshopMapInfoTooltip(panel) {\n        const text = panel.GetAttributeString('data-tooltip', '');\n        if (text)\n            UiToolkitAPI.ShowTextTooltip(panel.id, text);\n    }\n    function _HideWorkshopMapInfoTooltip() {\n        UiToolkitAPI.HideTextTooltip();\n    }\n    function _LazyCreateWorkshopTab() {\n        const panelId = k_workshopPanelId;\n        if (panelId in m_mapSelectionButtonContainers)\n            return panelId;\n        const container = $.CreatePanel(\"Panel\", $('#MapSelectionList'), panelId, {\n            class: 'map-selection-list map-selection-list--inner hidden'\n        });\n        container.AddClass('map-selection-list--workshop');\n        m_mapSelectionButtonContainers[panelId] = container;\n        const arrMaps = WorkshopAPI.GetAvailableWorkshopMaps().filter((mapInfo) => typeof mapInfo === 'object');\n        const _SortRank = (mapInfo) => (mapInfo.ready === false ? 2 : 0) + (mapInfo.subscribed ? 0 : 1);\n        arrMaps.sort((a, b) => _SortRank(a) - _SortRank(b));\n        for (let idxMap = 0; idxMap < arrMaps.length; ++idxMap) {\n            const mapInfo = arrMaps[idxMap];\n            const bReady = mapInfo.ready !== false;\n            const bInstalledOnly = !!mapInfo.installed && !mapInfo.subscribed;\n            const p = $.CreatePanel(bReady ? 'RadioButton' : 'Panel', container, panelId + '_' + idxMap);\n            p.BLoadLayoutSnippet('MapGroupSelection');\n            if (!mapInfo.hasOwnProperty('imageUrl') || !mapInfo.imageUrl)\n                mapInfo.imageUrl = 'file://{images}/map_icons/screenshots/360p/random.png';\n            if (bReady) {\n                p.SetAttributeString('group', 'radiogroup_' + panelId);\n                p.SetAttributeString('mapname', '@workshop/' + mapInfo.workshop_id + '/' + mapInfo.map);\n                p.SetPanelEvent('onactivate', () => _OnActivateMapOrMapGroupButton(p));\n            }\n            else {\n                p.AddClass('map-selection-btn--workshop-unplayable');\n            }\n            p.SetAttributeString('addon', mapInfo.workshop_id);\n            p.FindChildInLayoutFile('ActiveGroupIcon').visible = false;\n            p.FindChildInLayoutFile('MapGroupName').text = mapInfo.name;\n            if (bInstalledOnly || mapInfo.legacy) {\n                p.AddClass('map-selection-btn--workshop-installed');\n                const elBadge = p.FindChildInLayoutFile('MapGroupNewTag');\n                elBadge.text = $.Localize(mapInfo.legacy ? '#CSGO_Workshop_Legacy_Badge' : '#CSGO_Workshop_Installed_Badge');\n                elBadge.RemoveClass('hidden');\n            }\n            _AddWorkshopTileActions(p, mapInfo, bInstalledOnly);\n            const mapImage = $.CreatePanel('Panel', p.FindChildInLayoutFile('MapGroupImagesCarousel'), 'MapSelectionScreenshot0');\n            mapImage.AddClass('map-selection-btn__screenshot');\n            mapImage.style.backgroundImage = 'url(\"' + mapInfo.imageUrl + '\")';\n            mapImage.style.backgroundPosition = '50% 0%';\n            mapImage.style.backgroundSize = 'auto 100%';\n            _InitializeWorkshopTags(p, mapInfo);\n            p.SetPanelEvent('onmouseover', () => _ShowWorkshopMapInfoTooltip(p));\n            p.SetPanelEvent('onmouseout', () => _HideWorkshopMapInfoTooltip());\n        }\n        if (arrMaps.length == 0) {\n            const p = $.CreatePanel('Panel', container, undefined);\n            p.BLoadLayoutSnippet('NoWorkshopMaps');\n        }\n        _UpdateWorkshopMapFilter();\n        return panelId;\n    }\n    function _AddWorkshopTileActions(elTile, mapInfo, bInstalledOnly) {\n        const elTileBtn = elTile.FindChildrenWithClassTraverse('map-selection-btn')[0] ?? elTile;\n        const elActions = $.CreatePanel('Panel', elTileBtn, undefined);\n        elActions.BLoadLayoutSnippet('WorkshopMapTileActions');\n        const strFileId = mapInfo.workshop_id;\n        const strTitle = mapInfo.name;\n        const elViewBtn = elActions.FindChildInLayoutFile('WorkshopViewPageBtn');\n        elViewBtn.enabled = SteamOverlayAPI.IsEnabled();\n        elViewBtn.SetPanelEvent('onactivate', () => $.DispatchEvent('CSGOOpenSteamWorkshop', strFileId));\n        elActions.FindChildInLayoutFile('WorkshopUnsubscribe').visible = !bInstalledOnly;\n        elActions.FindChildInLayoutFile('WorkshopRemoveInstalled').visible = bInstalledOnly;\n        const elRemoveBtn = elActions.FindChildInLayoutFile(bInstalledOnly ? 'WorkshopRemoveInstalledBtn' : 'WorkshopUnsubscribeBtn');\n        elRemoveBtn.SetPanelEvent('onactivate', () => _ConfirmWorkshopItemRemoval(strFileId, strTitle, bInstalledOnly));\n    }\n    function _ConfirmWorkshopItemRemoval(strFileId, strTitle, bInstalledOnly) {\n        const strPrefix = bInstalledOnly ? '#CSGO_Workshop_Remove_Confirm' : '#CSGO_Workshop_Unsubscribe_Confirm';\n        $.GetContextPanel().SetDialogVariable('workshop_item_name', strTitle);\n        UiToolkitAPI.ShowGenericPopupOkCancel($.Localize(strPrefix + '_Title'), $.Localize(strPrefix + '_Text', $.GetContextPanel()), '', () => {\n            if (bInstalledOnly)\n                WorkshopAPI.RemoveInstalledItem(strFileId);\n            else\n                WorkshopAPI.UnsubscribeItem(strFileId);\n        }, () => { });\n    }\n    function _SwitchToWorkshopTab(isEnabled) {\n        const panelId = _LazyCreateWorkshopTab();\n        m_activeMapGroupSelectionPanelID = panelId;\n        _ShowActiveMapSelectionTab(isEnabled);\n    }\n    function _UpdateGameModeFlagsBtn() {\n        const elPanel = $.GetContextPanel().FindChildTraverse('id-gamemode-flag-' + _RealGameMode());\n        if (!elPanel || !GameModeFlags.DoesModeUseFlags(_RealGameMode()) || m_isWorkshop) {\n            return;\n        }\n        else {\n            let elFlag = (m_gameModeFlags[m_serverSetting + _RealGameMode()]) ? elPanel.FindChildInLayoutFile('id-gamemode-flag-' + _RealGameMode() + '-' + m_gameModeFlags[m_serverSetting + _RealGameMode()]) : null;\n            if (elFlag && elFlag.IsValid()) {\n                elFlag.checked = true;\n            }\n            else {\n                for (let element of elPanel.Children()) {\n                    element.checked = false;\n                }\n            }\n        }\n        for (let element of elPanel.Children()) {\n            element.enabled = !inDirectChallenge() && !_IsSearching() && LobbyAPI.BIsHost();\n        }\n    }\n    function _setAndSaveGameModeFlags(value) {\n        m_gameModeFlags[m_serverSetting + _RealGameMode()] = value;\n        _UpdateGameModeFlagsBtn();\n        if (!inDirectChallenge())\n            GameInterfaceAPI.SetSettingString('ui_playsettings_flags_' + m_serverSetting + '_' + _RealGameMode(), m_gameModeFlags[m_serverSetting + _RealGameMode()].toString());\n    }\n    function _OnGameModeFlagOptionActivate(value) {\n        _setAndSaveGameModeFlags(value);\n        _ApplySessionSettings();\n    }\n    function _OnGameModeFlagsBtnClicked(resumeMatchmakingHandle) {\n        function _Callback(value, resumeMatchmakingHandle = '') {\n            _setAndSaveGameModeFlags(parseInt(value));\n            _ApplySessionSettings();\n            if (resumeMatchmakingHandle) {\n                UiToolkitAPI.InvokeJSCallback(parseInt(resumeMatchmakingHandle));\n                UiToolkitAPI.UnregisterJSCallback(parseInt(resumeMatchmakingHandle));\n            }\n        }\n        const callback = UiToolkitAPI.RegisterJSCallback(_Callback);\n        UiToolkitAPI.ShowCustomLayoutPopupParameters('', 'file://{resources}/layout/popups/popup_play_gamemodeflags.xml', '&callback=' + callback +\n            '&searchfn=' + resumeMatchmakingHandle +\n            '&textToken=' + '#play_settings_' + _RealGameMode() + '_dialog' +\n            GameModeFlags.GetOptionsString(_RealGameMode()) +\n            '&currentvalue=' + m_gameModeFlags[m_serverSetting + _RealGameMode()]);\n    }\n    function OnPressOfficialServers() {\n        m_isWorkshop = false;\n        m_serverSetting = 'official';\n        _TurnOffDirectChallenge();\n        _ApplySessionSettings();\n    }\n    PlayMenu.OnPressOfficialServers = OnPressOfficialServers;\n    function OnPressListenServers() {\n        m_isWorkshop = false;\n        m_serverSetting = 'listen';\n        _TurnOffDirectChallenge();\n        _ApplySessionSettings();\n    }\n    PlayMenu.OnPressListenServers = OnPressListenServers;\n    function OnPressWorkshop() {\n        m_isWorkshop = true;\n        _SetPlayDropdownToWorkshop();\n        _TurnOffDirectChallenge();\n        _UpdateDirectChallengePage(_IsSearching(), LobbyAPI.BIsHost());\n        _UpdateGameModeFlagsBtn();\n        _SelectActivePlayPlayTypeBtn();\n    }\n    PlayMenu.OnPressWorkshop = OnPressWorkshop;\n    function OnPressServerBrowser() {\n        if ('0' === GameInterfaceAPI.GetSettingString('player_nevershow_communityservermessage')) {\n            UiToolkitAPI.ShowCustomLayoutPopup('server_browser_popup', 'file://{resources}/layout/popups/popup_serverbrowser.xml');\n        }\n        else {\n            if (m_bPerfectWorld) {\n                SteamOverlayAPI.OpenURL('https://csgo.wanmei.com/communityserver');\n            }\n            else {\n                SteamOverlayAPI.OpenUrlInOverlayOrExternalBrowser('steam://open/servers');\n            }\n        }\n    }\n    PlayMenu.OnPressServerBrowser = OnPressServerBrowser;\n    function BotDifficultyChanged() {\n        const elDropDownEntry = $('#BotDifficultyDropdown').GetSelected();\n        const botDiff = elDropDownEntry.id;\n        GameTypesAPI.SetCustomBotDifficulty(parseInt(botDiff));\n        GameInterfaceAPI.SetSettingString('player_botdifflast_s', botDiff);\n    }\n    PlayMenu.BotDifficultyChanged = BotDifficultyChanged;\n    function _DisplayWorkshopModePopup() {\n        const elSelectedMaps = _GetSelectedWorkshopMapButtons();\n        let modes = [];\n        if (elSelectedMaps.length === 0) {\n            UiToolkitAPI.ShowGenericPopupTwoOptions($.Localize('#SFUI_Maps_Workshop_Title'), $.Localize('#SFUI_No_Subscribed_Maps_Desc'), '', '#CSGO_Workshop_Visit', () => $.DispatchEvent('CSGOOpenSteamWorkshop', 'Map'), \"OK\", () => { });\n            $('#StartMatchBtn').RemoveClass('pressed');\n            return;\n        }\n        for (let iMap = 0; iMap < elSelectedMaps.length; ++iMap) {\n            const mapModes = elSelectedMaps[iMap].GetAttributeString('data-workshop-modes', '').split(',');\n            if (iMap == 0)\n                modes = mapModes;\n            else\n                modes = modes.filter(mode => mapModes.includes(mode));\n        }\n        const strModes = modes.join(',');\n        UiToolkitAPI.ShowCustomLayoutPopupParameters('workshop_map_mode', 'file://{resources}/layout/popups/popup_workshop_mode_select.xml', 'workshop-modes=' + $.HTMLEscape(strModes));\n        $('#StartMatchBtn').RemoveClass('pressed');\n    }\n    function _UpdateWorkshopMapFilter() {\n        const elTextLabel = $('#WorkshopSearchTextEntry');\n        const filter = $.HTMLEscape(elTextLabel.text).toLowerCase();\n        const container = m_mapSelectionButtonContainers[k_workshopPanelId];\n        const elCanelBtn = $('#WorkshopSearchTextEntryCanel');\n        if (elCanelBtn) {\n            elCanelBtn.SetHasClass('hide', filter == '');\n            elCanelBtn.SetPanelEvent('onactivate', () => { elTextLabel.text = ''; _UpdateWorkshopMapFilter(); });\n        }\n        if (!container) {\n            return;\n        }\n        const children = container.Children();\n        for (let i = 0; i < children.length; ++i) {\n            const panel = children[i];\n            const mapname = panel.GetAttributeString('mapname', '');\n            if (mapname === '')\n                continue;\n            if (filter === '') {\n                panel.visible = true;\n                continue;\n            }\n            if (mapname.toLowerCase().includes(filter)) {\n                panel.visible = true;\n                continue;\n            }\n            const modes = panel.GetAttributeString('data-workshop-modes', '');\n            if (modes.toLowerCase().includes(filter)) {\n                panel.visible = true;\n                continue;\n            }\n            const tooltip = panel.GetAttributeString('data-tooltip', '');\n            if (tooltip.toLowerCase().includes(filter)) {\n                panel.visible = true;\n                continue;\n            }\n            const elMapNameLabel = panel.FindChildTraverse('MapGroupName');\n            if (elMapNameLabel && elMapNameLabel.text && elMapNameLabel.text.toLowerCase().includes(filter)) {\n                panel.visible = true;\n                continue;\n            }\n            panel.visible = false;\n        }\n    }\n    function _SetPlayDropdownToWorkshop() {\n        m_serverSetting = 'listen';\n        m_isWorkshop = true;\n        _UpdatePrimeBtn(false, LobbyAPI.BIsHost());\n        _UpdatePracticeSettingsBtns(false, LobbyAPI.BIsHost());\n        if (_GetSelectedWorkshopMap()) {\n            _ApplySessionSettings();\n        }\n        else {\n            _SwitchToWorkshopTab(true);\n        }\n        $.GetContextPanel().SwitchClass(\"gamemode\", 'workshop');\n        $.GetContextPanel().SwitchClass(\"serversetting\", m_serverSetting);\n    }\n    function _WorkshopSubscriptionsChanged() {\n        const panel = m_mapSelectionButtonContainers[k_workshopPanelId];\n        if (panel) {\n            panel.DeleteAsync(0.0);\n            delete m_mapSelectionButtonContainers[k_workshopPanelId];\n        }\n        if (m_activeMapGroupSelectionPanelID != k_workshopPanelId) {\n            return;\n        }\n        if (!LobbyAPI.IsSessionActive()) {\n            m_activeMapGroupSelectionPanelID = null;\n            return;\n        }\n        _SyncDialogsFromSessionSettings(LobbyAPI.GetSessionSettings());\n        if (LobbyAPI.BIsHost()) {\n            _ApplySessionSettings();\n            _SetPlayDropdownToWorkshop();\n        }\n    }\n    function _WorkshopAnnotationSubscriptionsChanged() {\n        _UpdatePracticeSettingsBtns(_IsSearching(), LobbyAPI.BIsHost());\n    }\n    function _InventoryUpdated() {\n        _UpdatePrimeBtn(_IsSearching(), LobbyAPI.BIsHost());\n        _UpdatePracticeSettingsBtns(_IsSearching(), LobbyAPI.BIsHost());\n    }\n    function _RealGameMode() {\n        if (m_gameModeSetting === 'premier')\n            return 'competitive';\n        else if (m_gameModeSetting == 'gungameprogressive' && _IsPlayingOnValveOfficial())\n            return 'skirmish';\n        return m_gameModeSetting;\n    }\n    function OnClearFilterText() {\n        const elTextLabel = $('#WorkshopSearchTextEntry');\n        const elCanelBtn = $('#WorkshopSearchTextEntryCanel');\n        elCanelBtn.SetPanelEvent('onactivate', () => { elTextLabel.text = ''; _UpdateWorkshopMapFilter(); });\n    }\n    PlayMenu.OnClearFilterText = OnClearFilterText;\n    function _SwitchGameModeTab(gameMode) {\n        $('#GameModeSelectionRadios');\n        for (let element of $('#GameModeSelectionRadios').Children()) {\n            if (element.id === gameMode) {\n                $.DispatchEvent(\"Activated\", element, \"mouse\");\n            }\n        }\n    }\n    {\n        _Init();\n        $.RegisterEventHandler(\"ReadyForDisplay\", $.GetContextPanel(), _ReadyForDisplay);\n        $.RegisterEventHandler(\"UnreadyForDisplay\", $.GetContextPanel(), _UnreadyForDisplay);\n        $.RegisterForUnhandledEvent(\"PanoramaComponent_Lobby_MatchmakingSessionUpdate\", _SessionSettingsUpdate);\n        $.RegisterForUnhandledEvent(\"CSGOHideMainMenu\", _OnHideMainMenu);\n        $.RegisterForUnhandledEvent(\"CSGOHidePauseMenu\", _OnHideMainMenu);\n        $.RegisterForUnhandledEvent(\"CSGOShowMainMenu\", _OnShowMainMenu);\n        $.RegisterForUnhandledEvent(\"CSGOShowPauseMenu\", _OnShowMainMenu);\n        $.RegisterForUnhandledEvent(\"CSGOWorkshopSubscriptionsChanged\", _WorkshopSubscriptionsChanged);\n        $.RegisterForUnhandledEvent(\"CSGOWorkshopAnnotationSubscriptionsChanged\", _WorkshopAnnotationSubscriptionsChanged);\n        $.RegisterForUnhandledEvent('PanoramaComponent_MyPersona_ClansInfoUpdated', _ClansInfoUpdated);\n        $.RegisterForUnhandledEvent('PanoramaComponent_FriendsList_NameChanged', _OnPlayerNameChangedUpdate);\n        $.RegisterForUnhandledEvent('PanoramaComponent_MyPersona_PipRankUpdate', _PipRankUpdate);\n        $.RegisterForUnhandledEvent('PlayMenu_SwitchGameModeTab', _SwitchGameModeTab);\n        $.RegisterForUnhandledEvent('DirectChallenge_GenRandomKey', _OnDirectChallengeRandom);\n        $.RegisterForUnhandledEvent('DirectChallenge_EditKey', _OnDirectChallengeEdit);\n        $.RegisterForUnhandledEvent('DirectChallenge_CopyKey', _OnDirectChallengeCopy);\n        $.RegisterForUnhandledEvent('DirectChallenge_ChooseClanKey', _OnChooseClanKeyBtn);\n        $.RegisterForUnhandledEvent('DirectChallenge_ClanChallengeKeySelected', _OnClanChallengeKeySelected);\n        $.RegisterForUnhandledEvent('PanoramaComponent_PartyBrowser_PrivateQueuesUpdate', _OnPrivateQueuesUpdate);\n        WorkshopAPI.QueryUGCItemSubscriptions();\n    }\n})(PlayMenu || (PlayMenu = {}));\n","scripts/mainmenu_select_item_for_capability.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\nvar MainMenuSelectItemForCapability;\n(function (MainMenuSelectItemForCapability) {\n    function _ShowSelectItemForCapabilityPopup(itemid, itemid2, capability, bWorkshopItemPreview = false) {\n        _OpenSelectItemForCapabilityPopUp(itemid, itemid2, capability, bWorkshopItemPreview);\n    }\n    function _ShowSelectItemForWorkshopPreviewCapability(capability, itemid, itemid2) {\n        _OpenSelectItemForCapabilityPopUp(capability, itemid, itemid2, true);\n    }\n    function _PromptShowSelectItemForCapabilityPopup(titletxt, messagetxt, capability, itemid, itemid2) {\n        UiToolkitAPI.ShowGenericPopupOkCancel($.Localize(titletxt), $.Localize(messagetxt), '', () => $.DispatchEvent('ShowSelectItemForCapabilityPopup', itemid, itemid2, capability), () => { });\n    }\n    function _OpenSelectItemForCapabilityPopUp(itemid, itemid2 = '', capability, bWorkshopItemPreview = false) {\n        const CloseItemForCapabilityCallbackHandle = UiToolkitAPI.RegisterJSCallback(() => {\n            if (CloseItemForCapabilityCallbackHandle) {\n                UiToolkitAPI.UnregisterJSCallback(CloseItemForCapabilityCallbackHandle);\n            }\n        });\n        const sWorkshop = bWorkshopItemPreview === true ? bWorkshopItemPreview : false;\n        $.DispatchEvent('CSGOPlaySoundEffect', 'tab_mainmenu_inventory', 'MOUSE');\n        UiToolkitAPI.ShowCustomLayoutPopupParameters('id-select-item-for-capability=' + itemid, 'file://{resources}/layout/popups/popup_select_item_for_capability.xml', 'itemid=' + itemid +\n            '&' + 'secondaryItemid=' + itemid2 +\n            '&' + 'bWorkshopItemPreview=' + sWorkshop +\n            '&' + 'capability=' + capability +\n            '&' + 'callback=' + CloseItemForCapabilityCallbackHandle);\n    }\n    {\n        $.RegisterForUnhandledEvent('PromptShowSelectItemForCapabilityPopup', _PromptShowSelectItemForCapabilityPopup);\n        $.RegisterForUnhandledEvent('ShowSelectItemForCapabilityPopup', _ShowSelectItemForCapabilityPopup);\n        $.RegisterForUnhandledEvent('ShowSelectItemForWorkshopPreviewCapability', _ShowSelectItemForWorkshopPreviewCapability);\n    }\n})(MainMenuSelectItemForCapability || (MainMenuSelectItemForCapability = {}));\n","scripts/mainmenu_store_fullscreen.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"common/formattext.ts\" />\n/// <reference path=\"common/iteminfo.ts\" />\n/// <reference path=\"common/store_items.ts\" />\n/// <reference path=\"common/prime_button_action.ts\" />\n/// <reference path=\"itemtile_store.ts\" />\n/// <reference path=\"xpshop.ts\" />\n/// <reference path=\"generated/items_event_current_generated_store.d.ts\" />\n/// <reference path=\"popups/popup_acknowledge_item.ts\" />\nvar MainMenuStore;\n(function (MainMenuStore) {\n    const _m_cp = $.GetContextPanel();\n    let _m_activePanelId = '';\n    let _m_pagePrefix = 'id-store-page-';\n    let _m_inventoryUpdatedHandler;\n    function ReadyForDisplay() {\n        if (!ConnectedToGcCheck()) {\n            return;\n        }\n        _m_inventoryUpdatedHandler = $.RegisterForUnhandledEvent('PanoramaComponent_MyPersona_InventoryUpdated', InventoryUpdated);\n        if (_m_activePanelId === '' ||\n            !_m_activePanelId ||\n            (StoreItems.GetStoreItems().coupon && StoreItems.GetStoreItems().coupon.length < 1)) {\n            StoreItems.MakeStoreItemList();\n        }\n        ShowPrimePanelOnHomePage();\n        MakeTabsBtnsFromStoreData();\n        let openToSection = _m_cp.GetAttributeString('set-active-section', '');\n        if (_m_activePanelId === '' || !_m_activePanelId || openToSection !== '') {\n            SetDefaultTab(openToSection);\n        }\n        else {\n            NavigateToTab(_m_activePanelId);\n        }\n        AccountWalletUpdated();\n    }\n    let jsAcknowledgeDelayHandle = null;\n    function InventoryUpdated() {\n        const aNewItems = AcknowledgeItems.GetItems().filter(item => (item.pickuptype\n            && ['xpshopredeem', 'quest_reward'].includes(item.pickuptype)));\n        if (aNewItems.length > 0) {\n            jsAcknowledgeDelayHandle = null;\n            jsAcknowledgeDelayHandle = $.Schedule(1.5, () => {\n                $.DispatchEvent('ShowAcknowledgePopup', '', '');\n                $.DispatchEvent('UpdateXpShop');\n            });\n        }\n        else {\n            $.DispatchEvent('UpdateXpShop');\n        }\n        ShowPrimePanelOnHomePage();\n    }\n    function UnreadyForDisplay() {\n        if (jsAcknowledgeDelayHandle) {\n            $.CancelScheduled(jsAcknowledgeDelayHandle);\n            jsAcknowledgeDelayHandle = null;\n        }\n        $.DispatchEvent('UpdateXpShop');\n        if (_m_inventoryUpdatedHandler) {\n            $.UnregisterForUnhandledEvent('PanoramaComponent_MyPersona_InventoryUpdated', _m_inventoryUpdatedHandler);\n            _m_inventoryUpdatedHandler = null;\n        }\n    }\n    function ConnectedToGcCheck() {\n        if (!MyPersonaAPI.IsInventoryValid() || !MyPersonaAPI.IsConnectedToGC()) {\n            UiToolkitAPI.ShowGenericPopupOk($.Localize('#SFUI_SteamConnectionErrorTitle'), $.Localize('#SFUI_Steam_Error_LinkUnexpected'), '', () => $.DispatchEvent('HideContentPanel'));\n            return false;\n        }\n        return true;\n    }\n    function ShowPrimePanelOnHomePage() {\n        let bHasPrime = FriendsListAPI.GetFriendPrimeEligible(MyPersonaAPI.GetXuid());\n        let elUpsellPanel = $.GetContextPanel().FindChildInLayoutFile('id-prime-background');\n        elUpsellPanel.SetHasClass('hidden', bHasPrime);\n        if (!bHasPrime) {\n            PrimeButtonAction.SetUpPurchaseBtn(_m_cp.FindChildInLayoutFile('id-store-buy-prime'));\n        }\n        $.GetContextPanel().FindChildInLayoutFile('id-rewards-background').SetHasClass('hidden', !bHasPrime);\n    }\n    function SetDefaultTab(openToSection) {\n        let navBtn = null;\n        if (openToSection !== '') {\n            navBtn = _m_cp.FindChildInLayoutFile(openToSection);\n            _m_cp.SetAttributeString('set-active-section', '');\n        }\n        else if (_m_activePanelId === '' || !_m_activePanelId) {\n            navBtn = _m_cp.FindChildInLayoutFile('id-store-nav-home');\n        }\n        if (navBtn) {\n            $.DispatchEvent(\"Activated\", navBtn, \"mouse\");\n        }\n    }\n    function NavigateToTab(panelId, keyType = '') {\n        if (keyType) {\n            panelId = _m_pagePrefix + keyType;\n        }\n        if (_m_activePanelId !== panelId) {\n            if (panelId === _m_pagePrefix + 'home') {\n                UpdateItemsInHomeSection('coupon', 'id-store-popular-items', 6);\n                UpdateItemsInHomeSection('tournament', 'id-store-tournament-items', 1);\n            }\n            else {\n                MakePageFromStoreData(keyType);\n                if (panelId === _m_pagePrefix + 'xpshop') {\n                    $.DispatchEvent('UpdateXpShop');\n                }\n            }\n            if (_m_activePanelId) {\n                _m_cp.FindChildInLayoutFile(_m_activePanelId).SetHasClass('Active', false);\n            }\n            _m_activePanelId = panelId;\n            let activePanel = _m_cp.FindChildInLayoutFile(panelId);\n            activePanel.SetHasClass('Active', true);\n        }\n    }\n    MainMenuStore.NavigateToTab = NavigateToTab;\n    function UpdateItemsInHomeSection(sSectionName, parentId, numItemsToShow) {\n        let oItemsByCategory = StoreItems.GetStoreItems();\n        let aItemsList = oItemsByCategory[sSectionName];\n        let extraSuffix = '';\n        if ((sSectionName === 'coupon') && (aItemsList.length > 0) &&\n            (aItemsList[0].isNewRelease)) {\n            if ('17293822569102711679' === aItemsList[0].id)\n                extraSuffix = '_nightmode2';\n        }\n        let elPanel = _m_cp.FindChildInLayoutFile(parentId);\n        let elParent = _m_cp.FindChildInLayoutFile('id-store-home-section-' + sSectionName);\n        elParent.style.backgroundImage = 'url(\"file://{images}/backgrounds/store_home_' + sSectionName + extraSuffix + '.psd\")';\n        elParent.style.backgroundPosition = '50% 50%';\n        elParent.style.backgroundSize = 'cover';\n        let elTitleLabel = elParent.FindChildInLayoutFile('id-store-home-section-' + sSectionName + '-title');\n        if (elTitleLabel && extraSuffix) {\n            elTitleLabel.text = $.Localize('#store_nav_section_' + sSectionName + extraSuffix, elTitleLabel);\n        }\n        if (sSectionName === 'tournament') {\n            elParent.SetDialogVariable('tournament-name', $.Localize(\"#store_nav_tournament_\" + g_ActiveTournamentInfo.eventid));\n            elParent.SetDialogVariable('tournament_name', $.Localize('#CSGO_Tournament_Event_NameShort_' + g_ActiveTournamentInfo.eventid));\n            const getRandomInt = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min;\n            let elStickerLink = elParent.FindChildInLayoutFile('id-store-home-section-major-store-btn');\n            if (!elStickerLink) {\n                elStickerLink = $.CreatePanel('Panel', elParent, 'id-store-home-section-major-store-btn');\n                elStickerLink.BLoadLayoutSnippet('TournamentStickers');\n                elStickerLink.SetPanelEvent('onactivate', () => {\n                    OpenMajorHub();\n                });\n            }\n            const defidxStickerItem = InventoryAPI.GetItemDefinitionIndexFromDefinitionName('sticker');\n            const numSticker = 5;\n            for (let i = 0; i < numSticker; i++) {\n                const itemId = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(defidxStickerItem, g_ActiveTournamentTeams[getRandomInt(0, g_ActiveTournamentTeams.length - 1)].players[getRandomInt(0, 4)].stickerids[getRandomInt(0, 3)]);\n                elStickerLink.FindChildInLayoutFile('id-sticker-' + i).itemid = itemId;\n            }\n        }\n        const bHasItems = aItemsList.length > 0;\n        const bForceTournamentVisible = ((sSectionName === 'tournament') && g_ActiveTournamentInfo.active);\n        if (!bHasItems && !bForceTournamentVisible) {\n            elParent.visible = false;\n            return;\n        }\n        elParent.visible = true;\n        elParent.SetHasClass('store-home-section--no-items', !bHasItems);\n        if (!bHasItems)\n            return;\n        for (let i = 0; i < numItemsToShow; i++) {\n            let elTile = elPanel.FindChildInLayoutFile('home-' + sSectionName + '-' + i);\n            if (!elTile) {\n                elTile = $.CreatePanel(\"Button\", elPanel, 'home-' + sSectionName + '-' + i);\n                elTile.BLoadLayout('file://{resources}/layout/itemtile_store.xml', false, false);\n            }\n            UpdateItem(elTile, sSectionName, i);\n        }\n    }\n    function OpenMajorHub() {\n        UiToolkitAPI.ShowCustomLayoutPopupParameters('id-popup-major-hub', 'file://{resources}/layout/popups/popup_major_hub.xml', 'eventid=' + (g_ActiveTournamentInfo.eventid));\n        $.DispatchEvent(\"CSGOPlaySoundEffect\", \"UIPanorama.tab_mainmenu_shop\", \"MOUSE\");\n    }\n    function OpenMajorStore() {\n        UiToolkitAPI.ShowCustomLayoutPopup('id-popup-major-store', 'file://{resources}/layout/popups/popup_major_store.xml');\n        $.DispatchEvent(\"CSGOPlaySoundEffect\", \"UIPanorama.tab_mainmenu_shop\", \"MOUSE\");\n    }\n    function MakeTabsBtnsFromStoreData() {\n        let elParent = _m_cp.FindChildInLayoutFile('id-store-lister-tabs');\n        let oItemsByCategory = StoreItems.GetStoreItems();\n        for (let [key, value] of Object.entries(oItemsByCategory)) {\n            let panelIdString = 'id-store-nav-' + key;\n            let elButton = elParent.FindChildInLayoutFile(panelIdString);\n            if (value.length > 0 && !elButton) {\n                elButton = $.CreatePanel('RadioButton', elParent, panelIdString, {\n                    group: 'store-top-nav',\n                    class: 'content-navbar__tabs__btn'\n                });\n                let btnString = key === 'tournament' ?\n                    `#store_nav_${key}_${g_ActiveTournamentInfo.eventid}` :\n                    `#store_nav_${key}`;\n                $.CreatePanel('Label', elButton, '', {\n                    text: btnString\n                });\n                elButton.SetPanelEvent('onactivate', () => {\n                    NavigateToTab(_m_pagePrefix + key, key);\n                });\n            }\n        }\n        let elButton = elParent.FindChildInLayoutFile('id-store-nav-xpshop');\n        if (!elButton) {\n            let nTrack = MissionsAPI.GetSeasonalOperationXpShopIndex();\n            let nNewItemCount = 0;\n            if (nTrack > 0) {\n                let nCount = MissionsAPI.GetSeasonalOperationRedeemableGoodsCount(nTrack);\n                for (let i = 0; i < nCount; i++) {\n                    if (nNewItemCount > 1) {\n                        break;\n                    }\n                    let ShopEntry = {\n                        item_name: \"\",\n                        ui_show_new_tag: \"\"\n                    };\n                    ShopEntry.ui_show_new_tag = MissionsAPI.GetSeasonalOperationRedeemableGoodsSchema(nTrack, i, 'ui_show_new_tag');\n                    if (XpShop.ShouldShowNewTagForShopEntry(ShopEntry)) {\n                        nNewItemCount++;\n                    }\n                }\n            }\n            elButton = $.CreatePanel('RadioButton', elParent, 'id-store-nav-xpshop', {\n                group: 'store-top-nav',\n                class: 'content-navbar__tabs__btn'\n            });\n            $.CreatePanel('Label', elButton, '', {\n                text: '#store_tab_xpshop'\n            });\n            if (nNewItemCount > 0) {\n                elButton.SetDialogVariableInt('new-count', nNewItemCount);\n                $.CreatePanel('Label', elButton, '', {\n                    class: 'content-navbar__tabs__btn-new', text: '#xpshop_new_items:f'\n                });\n            }\n            elButton.SetPanelEvent('onactivate', () => {\n                NavigateToTab(_m_pagePrefix + 'xpshop', 'xpshop');\n            });\n        }\n    }\n    function MakePageFromStoreData(typeKey) {\n        let panelIdString = _m_pagePrefix + typeKey;\n        let elParent = _m_cp.FindChildInLayoutFile('id-store-pages');\n        let elPanel = elParent.FindChildInLayoutFile(panelIdString);\n        if (!elPanel) {\n            if (typeKey === 'xpshop') {\n                elPanel = $.CreatePanel('Panel', elParent, panelIdString, {});\n                elPanel.BLoadLayout(\"file://{resources}/layout/xpshop.xml\", false, false);\n            }\n            else {\n                elPanel = $.CreatePanel('JSDelayLoadList', elParent, panelIdString, {\n                    class: 'store-dynamic-lister',\n                    itemwidth: \"178px\",\n                    itemheight: \"280px\",\n                    spacersize: \"4px\",\n                    spacerperiod: \"4px\"\n                });\n                UpdateDynamicLister(elPanel, typeKey);\n            }\n        }\n    }\n    function UpdateDynamicLister(elList, typeKey) {\n        let oItemsByCategory = StoreItems.GetStoreItems();\n        let aItemsList = oItemsByCategory[typeKey];\n        elList.SetLoadListItemFunction((parent, nPanelIdx, reusePanel) => {\n            if (!reusePanel || !reusePanel.IsValid()) {\n                reusePanel = $.CreatePanel(\"Button\", elList, aItemsList[nPanelIdx].id);\n                reusePanel.BLoadLayout('file://{resources}/layout/itemtile_store.xml', false, false);\n            }\n            UpdateItem(reusePanel, typeKey, nPanelIdx);\n            return reusePanel;\n        });\n        elList.UpdateListItems(aItemsList.length);\n    }\n    function UpdateItem(elPanel, typeKey, idx) {\n        let oItemData = StoreItems.GetStoreItemData(typeKey, idx);\n        ItemTileStore.Init(elPanel, oItemData);\n    }\n    function GotoStorePage(location) {\n        let navBtn = _m_cp.FindChildInLayoutFile(location);\n        $.DispatchEvent(\"Activated\", navBtn, \"mouse\");\n        navBtn.checked = true;\n    }\n    MainMenuStore.GotoStorePage = GotoStorePage;\n    function AccountWalletUpdated() {\n        var elBalance = _m_cp.FindChildInLayoutFile('id-store-nav-wallet');\n        if ((MyPersonaAPI.GetLauncherType() === 'perfectworld') && (MyPersonaAPI.GetSteamType() !== 'china')) {\n            elBalance.RemoveClass('hidden');\n            elBalance.text = '#Store_SteamChina_Wallet';\n            return;\n        }\n        var balance = (MyPersonaAPI.GetLauncherType() === 'perfectworld') ? StoreAPI.GetAccountWalletBalance() : '';\n        if (balance === '' || balance === undefined || balance === null) {\n            elBalance.AddClass('hidden');\n        }\n        else {\n            elBalance.SetDialogVariable('balance', balance);\n            elBalance.RemoveClass('hidden');\n        }\n    }\n    {\n        ReadyForDisplay();\n        let elJsStore = $('#JsMainMenuStore');\n        $.RegisterEventHandler('ReadyForDisplay', elJsStore, ReadyForDisplay);\n        $.RegisterEventHandler('UnreadyForDisplay', elJsStore, UnreadyForDisplay);\n        $.RegisterForUnhandledEvent('PanoramaComponent_Store_AccountWalletUpdated', AccountWalletUpdated);\n        $.RegisterForUnhandledEvent('PanoramaComponent_Store_PriceSheetChanged', ReadyForDisplay);\n    }\n})(MainMenuStore || (MainMenuStore = {}));\n","scripts/mainmenu_store_tile_linked.js":"'use strict';\n\nvar MainMenuStoreTileLinked = ( function()\n{\n\tvar elItem = $.GetContextPanel();\n\t\n\tvar _Init = function()\n\t{\n\t\t_FillOutLinkedItemData();\n\t\t_SetOnActivateEventLinkedItemTile();\n\t}\n\t\n\tvar _FillOutLinkedItemData = function()\n\t{\n\t\tvar itemId = elItem.Data().oData.itemid;\n\t\tvar itemIdLinked = elItem.Data().oData.linkedid;\n\n\t\tvar LootListItemID = ( InventoryAPI.GetItemTypeFromEnum( itemId ) !== 'coupon' ) ? itemId : InventoryAPI.GetLootListItemIdByIndex( itemId, 0 );\n\t\tvar elImage = elItem.FindChildInLayoutFile( 'StoreItemImage' );\n\t\telImage.itemid = LootListItemID;\n\n\t\tLootListItemID =  ( InventoryAPI.GetItemTypeFromEnum( itemIdLinked ) !== 'coupon' ) ? itemIdLinked : InventoryAPI.GetLootListItemIdByIndex( itemIdLinked, 0 );\n\t\telImage = elItem.FindChildInLayoutFile( 'StoreItemImageLinked' );\n\t\telImage.itemid = LootListItemID;\n\n\t\tvar elStattrak = elImage.FindChildInLayoutFile( 'StoreItemStattrak' );\n\t\telStattrak.SetHasClass( 'hidden', !ItemInfo.IsStatTrak( itemIdLinked ) && !ItemInfo.IsStatTrak( itemId ) );\n\n\t\tvar elStoreItemName = elItem.FindChildInLayoutFile( 'StoreItemName' );\n\t\tvar elShortNameHeader = elItem.FindChildInLayoutFile( 'ShortName' );\n\t\tvar strItemName = '';\n\t\tif ( elItem.Data().oData.usegroupname )\n\t\t\tstrItemName = $.Localize( elItem.Data().oData.usegroupname );\n\t\telse if ( elItem.Data().oData.usetinynames )\n\t\t\tstrItemName = $.Localize( InventoryAPI.GetRawDefinitionKey(LootListItemID, 'item_name') + '_tinyname' );\n\t\telse\n\t\t\tstrItemName = InventoryAPI.GetItemName( LootListItemID );\n\t\t\n\t\tif ( elItem.Data().oData.usegroupname )\n\t\t{\n\t\t\telShortNameHeader.text = strItemName;\n\t\t\telShortNameHeader.visible = true;\n\t\t\telStoreItemName.text = '';\n\t\t}\n\t\telse\n\t\t{\n\t\t\telShortNameHeader.text = '';\n\t\t\telShortNameHeader.visible = false;\n\t\t\telStoreItemName.text = strItemName;\n\t\t}\n\n\t\tvar elSale = elItem.FindChildInLayoutFile( 'StoreItemSalePrice' );\n\t\tvar elPrecent = elItem.FindChildInLayoutFile( 'StoreItemPercent' );\n\t\tvar reduction = StoreAPI.GetStoreItemPercentReduction( itemId, 1 );\n\n\t\t  \n\t\t                 \n\t\t  \n\t\tvar priceItemFirst = itemIdLinked;\n\t\tvar priceItemLast = itemId;\n\t\tif ( elItem.Data().oData.linkpricing === 'reverse' )\n\t\t{\n\t\t\tpriceItemFirst = itemId;\n\t\t\tpriceItemLast = itemIdLinked;\n\t\t}\n\n\t\tif ( reduction )\n\t\t{\n\t\t\telSale.visible = true;\n\t\t\telSale.text = ItemInfo.GetStoreOriginalPrice( priceItemFirst, 1 ) + ' - ' +  ItemInfo.GetStoreOriginalPrice( priceItemLast, 1 );\n\n\t\t\telPrecent.visible = true;\n\t\t\telPrecent.text = reduction;\n\t\t}\n\t\telse\n\t\t{\n\t\t\telSale.visible = false;\n\t\t\telPrecent.visible = false;\n\t\t}\n\n\t\tvar elPrice = elItem.FindChildInLayoutFile( 'StoreItemPrice' );\n\t\tif ( ItemInfo.GetStoreSalePrice( priceItemFirst, 1 ) )\n\t\t{\n\t\t\telPrice.text = ItemInfo.GetStoreSalePrice( priceItemFirst, 1 ) + ' - ' + ItemInfo.GetStoreSalePrice( priceItemLast, 1 );\n\t\t}\n\t\telse\n\t\t{\n\t\t\telPrice.text = '';\n\t\t}\n\t};\n\n\tvar _SetOnActivateEventLinkedItemTile = function()\n\t{\n\t\tvar OpenContextMenu = function( itemId, itemIdLinked, usetinynames )\n\t\t{\n\t\t\tvar contextMenuPanel = UiToolkitAPI.ShowCustomLayoutContextMenuParameters(\n\t\t\t\t'',\n\t\t\t\t'',\n\t\t\t\t'file://{resources}/layout/context_menus/context_menu_store_linked_items.xml',\n\t\t\t\t'itemids=' + itemId + ',' + itemIdLinked +\n\t\t\t\t( usetinynames ? '&usetinynames=' + usetinynames : '' ) +\n\t\t\t\t( elItem.Data().oData.extrapopupfullscreenstyle ? '&extrapopupfullscreenstyle=solidbkgnd' : '' ) +\n\t\t\t\t( elItem.Data().oData.isdisabled ? '&disablepurchase=true' : '' ) +\n\t\t\t\t( elItem.Data().oData.warningtext ? '&warningtext=' + elItem.Data().oData.warningtext  : '' )\n\t\t\t);\n\t\t\tcontextMenuPanel.AddClass( \"ContextMenu_NoArrow\" );\n\t\t};\n\n\t\telItem.SetPanelEvent( 'onactivate', OpenContextMenu.bind(\n\t\t\tundefined,\n\t\t\telItem.Data().oData.itemid,\n\t\t\telItem.Data().oData.linkedid,\n\t\t\telItem.Data().oData.usetinynames\n\t\t) );\n\t\telItem.SetPanelEvent( 'oncontextmenu', OpenContextMenu.bind(\n\t\t\tundefined,\n\t\t\telItem.Data().oData.itemid,\n\t\t\telItem.Data().oData.linkedid,\n\t\t\telItem.Data().oData.usetinynames\n\t\t) );\n\t}\n\n\treturn {\n\t\tInit: _Init\n\t};\n\n} )();","scripts/mainmenu_stream.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />m_cp\nvar StreamPanel;\n(function (StreamPanel) {\n    let m_cp;\n    let m_elEmbeddedStream;\n    let m_bAllowStream = true;\n    let m_bMainMenuActive = true;\n    let m_valLastKnownVolume = 0;\n    let m_nVolumeSliderChangedFromScript = 0;\n    let m_userClosedStream = false;\n    const m_pinnedParent = $.GetContextPanel().GetParent();\n    const m_dragParent = $.GetContextPanel().GetParent().GetParent().GetParent();\n    function _Init() {\n        m_cp = $.GetContextPanel();\n        _UpdateEmbeddedStream();\n        m_cp.SetHasClass('stream-drag-enabled', false);\n    }\n    function _CloseStream() {\n        m_bAllowStream = false;\n        m_userClosedStream = true;\n        _UpdateEmbeddedStream();\n    }\n    ;\n    function _MinimizeStream() {\n        m_cp.SetHasClass('minimize_stream', true);\n        let elDragPanel = m_dragParent.FindChildInLayoutFile('main-menu-drag-panel');\n        if (m_cp.GetParent().id === elDragPanel.id) {\n            $.Schedule(.25, () => { elDragPanel.style.width = 'fit-children'; });\n        }\n    }\n    ;\n    function _FullSizeStream() {\n        m_cp.SetHasClass('minimize_stream', false);\n    }\n    ;\n    function _StreamDragEnable() {\n        let elDragPanel = m_dragParent.FindChildInLayoutFile('main-menu-drag-panel');\n        m_cp.SetParent(elDragPanel);\n        m_cp.style.y = \"0px\";\n        m_cp.style.x = \"0px\";\n        $.Schedule(.25, () => { elDragPanel.style.width = 'fit-children'; });\n        let rightOffset = 140;\n        let xpos = (elDragPanel.GetParent().actuallayoutwidth / elDragPanel.GetParent().actualuiscale_x);\n        xpos = xpos - ((m_cp.actuallayoutwidth / m_cp.actualuiscale_x) + rightOffset);\n        let ypos = (elDragPanel.GetParent().actuallayoutheight / elDragPanel.GetParent().actualuiscale_y);\n        ypos = ypos - ((m_cp.actuallayoutheight / m_cp.actualuiscale_y) + rightOffset);\n        elDragPanel.SetDragPosition(xpos, ypos);\n        m_cp.SetHasClass('stream-drag-enabled', true);\n    }\n    function _StreamDragDisable() {\n        m_cp.style.y = m_cp.actualyoffset + 150 + 'px';\n        m_cp.style.x = m_cp.actualxoffset - 55 + 'px';\n        m_cp.FindChild('StreamPanelFeed').style.opacity = '0';\n        $.Schedule(.3, () => {\n            m_cp.SetParent(m_pinnedParent);\n            m_cp.SetHasClass('stream-drag-enabled', false);\n            m_cp.FindChild('StreamPanelFeed').style.opacity = '1';\n            m_pinnedParent.MoveChildBefore(m_cp, m_pinnedParent.FindChild('VanityControls'));\n        });\n    }\n    function _CSGOHideMainMenu() {\n        m_bMainMenuActive = false;\n        _UpdateEmbeddedStream();\n    }\n    ;\n    function _CSGOShowMainMenu() {\n        m_bMainMenuActive = true;\n        m_bAllowStream = true;\n        _UpdateEmbeddedStream();\n    }\n    ;\n    function _UpdateEmbeddedStream() {\n        let urlStreamFeed = EmbeddedStreamAPI.GetStreamFeedSourceURL();\n        let elStreamPanelFeed = m_cp.FindChildInLayoutFile('StreamPanelFeed');\n        if (!m_bAllowStream || !m_bMainMenuActive) {\n            urlStreamFeed = '';\n        }\n        if (urlStreamFeed) {\n            if (!elStreamPanelFeed) {\n                elStreamPanelFeed = $.CreatePanel('Panel', m_cp, 'StreamPanelFeed');\n                elStreamPanelFeed.BLoadLayoutSnippet('stream-panel');\n                let elSlider = elStreamPanelFeed.FindChildInLayoutFile('VolumeSlider');\n                if (elSlider) {\n                    elSlider.min = 0;\n                    elSlider.max = 100;\n                    elSlider.increment = 1;\n                    ++m_nVolumeSliderChangedFromScript;\n                    elSlider.value = EmbeddedStreamAPI.GetAudioVolume();\n                    elSlider.SetPanelEvent('onvaluechanged', OnVolumeSliderValueChanged);\n                }\n                _UpdateVolumeImageFromSlider();\n                let elVolumeImage = elStreamPanelFeed.FindChildInLayoutFile('VolumeImage');\n                if (elVolumeImage) {\n                    elVolumeImage.SetPanelEvent('onactivate', ToggleVolumeMute);\n                }\n                elStreamPanelFeed.FindChildInLayoutFile(\"id-close-btn\").SetPanelEvent('onactivate', _CloseStream);\n                elStreamPanelFeed.FindChildInLayoutFile(\"id-minimize-btn\").SetPanelEvent('onactivate', _MinimizeStream);\n                elStreamPanelFeed.FindChildInLayoutFile(\"id-full-size-btn\").SetPanelEvent('onactivate', _FullSizeStream);\n                elStreamPanelFeed.FindChildInLayoutFile(\"id-popout-btn\").SetPanelEvent('onactivate', _StreamDragEnable);\n                elStreamPanelFeed.FindChildInLayoutFile(\"id-popout-reset-btn\").SetPanelEvent('onactivate', _StreamDragDisable);\n            }\n            m_elEmbeddedStream = elStreamPanelFeed.FindChildInLayoutFile('StreamHTML');\n            m_elEmbeddedStream.SetURL(urlStreamFeed);\n            _SetClassesForVideoPlaying(EmbeddedStreamAPI.IsVideoPlaying());\n        }\n        else if (elStreamPanelFeed) {\n            elStreamPanelFeed.DeleteAsync(0);\n            _SetClassesForVideoPlaying(false);\n        }\n    }\n    ;\n    function ToggleVolumeMute() {\n        let valCurrentVolume = EmbeddedStreamAPI.GetAudioVolume();\n        if (valCurrentVolume > 0) {\n            m_valLastKnownVolume = valCurrentVolume;\n            EmbeddedStreamAPI.SetAudioVolume(0);\n        }\n        else {\n            if (m_valLastKnownVolume < 15)\n                m_valLastKnownVolume = 20;\n            EmbeddedStreamAPI.SetAudioVolume(m_valLastKnownVolume);\n        }\n        _OnVolumeCodeValueChanged();\n    }\n    StreamPanel.ToggleVolumeMute = ToggleVolumeMute;\n    ;\n    function OnVolumeSliderValueChanged() {\n        if (m_nVolumeSliderChangedFromScript > 0) {\n            --m_nVolumeSliderChangedFromScript;\n            return;\n        }\n        let elSlider = m_cp.FindChildInLayoutFile('VolumeSlider');\n        if (elSlider) {\n            let vol = elSlider.value;\n            EmbeddedStreamAPI.SetAudioVolume(vol);\n            _UpdateVolumeImageFromSlider();\n        }\n    }\n    StreamPanel.OnVolumeSliderValueChanged = OnVolumeSliderValueChanged;\n    ;\n    function _MuteStream() {\n        let elSlider = m_cp.FindChildInLayoutFile('VolumeSlider');\n        if (elSlider && elSlider.IsValid()) {\n            let valCurrentVolume = EmbeddedStreamAPI.GetAudioVolume();\n            if (valCurrentVolume > 0) {\n                m_valLastKnownVolume = valCurrentVolume;\n                EmbeddedStreamAPI.SetAudioVolume(0);\n                _OnVolumeCodeValueChanged();\n            }\n        }\n    }\n    function _OnVolumeCodeValueChanged() {\n        let elSlider = m_cp.FindChildInLayoutFile('VolumeSlider');\n        if (elSlider) {\n            ++m_nVolumeSliderChangedFromScript;\n            elSlider.value = EmbeddedStreamAPI.GetAudioVolume();\n            _UpdateVolumeImageFromSlider();\n        }\n    }\n    StreamPanel._OnVolumeCodeValueChanged = _OnVolumeCodeValueChanged;\n    ;\n    function _UpdateVolumeImageFromSlider() {\n        let elSlider = m_cp.FindChildInLayoutFile('VolumeSlider');\n        let elVolumeImage = m_cp.FindChildInLayoutFile('VolumeImage');\n        if (elSlider && elVolumeImage) {\n            elVolumeImage.SetImage((elSlider.value > 0) ? 'file://{images}/icons/ui/unmuted.svg' : 'file://{images}/icons/ui/sound_off.svg');\n        }\n    }\n    function _UpdateEmbeddedStreamVisibility() {\n        _SetClassesForVideoPlaying(EmbeddedStreamAPI.IsVideoPlaying());\n    }\n    StreamPanel._UpdateEmbeddedStreamVisibility = _UpdateEmbeddedStreamVisibility;\n    ;\n    function _HTMLJSAlertV8(elPanel, sAlertText) {\n        EmbeddedStreamAPI.PanoramaJSAlert(m_elEmbeddedStream, sAlertText);\n    }\n    StreamPanel._HTMLJSAlertV8 = _HTMLJSAlertV8;\n    ;\n    function _HTMLFinishRequest(elPanel, sUrl, sPageTitle) {\n        EmbeddedStreamAPI.PanoramaFinishRequest(m_elEmbeddedStream, sUrl, sPageTitle);\n    }\n    StreamPanel._HTMLFinishRequest = _HTMLFinishRequest;\n    ;\n    function _SetClassesForVideoPlaying(bIsVideoPlaying) {\n        if (m_cp) {\n            if (bIsVideoPlaying) {\n                m_cp.SetDialogVariable('title', $.Localize('#SFUI_MajorEventVenue_StreamTitle_' + NewsAPI.GetActiveTournamentEventID() + '_' + EmbeddedStreamAPI.GetStreamEventVenueID()));\n                let elNavBarWatchExternalExtraButtons = m_cp.FindChildInLayoutFile(\"NavBarWatchExternalExtraButtons\");\n                let sSupportedStreamTypes = EmbeddedStreamAPI.GetStreamExternalLinkTypes();\n                let sChildrenWithTypeName = \"NavBarWatchExternal\";\n                elNavBarWatchExternalExtraButtons.Children().forEach(function (elchild) {\n                    if (elchild.id.startsWith(sChildrenWithTypeName)) {\n                        let chrLookupTypeCharacter = elchild.id.substring(sChildrenWithTypeName.length, sChildrenWithTypeName.length + 1);\n                        elchild.SetHasClass('hidden', sSupportedStreamTypes.indexOf(chrLookupTypeCharacter) < 0);\n                    }\n                });\n                if (m_userClosedStream) {\n                    m_userClosedStream = false;\n                    _MinimizeStream();\n                    _StreamDragDisable();\n                    _MuteStream();\n                }\n            }\n            else {\n                $.DispatchEvent('StreamPanelClosed');\n            }\n            m_cp.SetHasClass('hidden', !bIsVideoPlaying);\n        }\n    }\n    ;\n    {\n        _Init();\n        $.RegisterForUnhandledEvent(\"PanoramaComponent_EmbeddedStream_VideoReload\", _UpdateEmbeddedStream);\n        $.RegisterForUnhandledEvent(\"PanoramaComponent_EmbeddedStream_VideoPlaying\", _UpdateEmbeddedStreamVisibility);\n        $.RegisterForUnhandledEvent(\"PanoramaComponent_EmbeddedStream_VolumeChanged\", _OnVolumeCodeValueChanged);\n        $.RegisterForUnhandledEvent(\"CSGOHideMainMenu\", _CSGOHideMainMenu);\n        $.RegisterForUnhandledEvent(\"CSGOShowMainMenu\", _CSGOShowMainMenu);\n        $.RegisterForUnhandledEvent(\"MuteStreamPanel\", _MuteStream);\n        $.RegisterEventHandler(\"HTMLJSAlertV8\", $.GetContextPanel(), _HTMLJSAlertV8);\n        $.RegisterEventHandler(\"HTMLFinishRequest\", $.GetContextPanel(), _HTMLFinishRequest);\n    }\n})(StreamPanel || (StreamPanel = {}));\n;\n","scripts/mainmenu_watch.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"matchlist.ts\" />\n/// <reference path=\"watchtile.ts\" />\n/// <reference path=\"common/commonutil.ts\" />\n/// <reference path=\"common/scheduler.ts\" />\n/// <reference path=\"common/licenseutil.ts\" />\n/// <reference path=\"common/iteminfo.ts\" />\n/// <reference path=\"common/formattext.ts\" />\n/// <reference path=\"generated/items_event_current_generated_store.ts\" />\nvar mainmenu_watch;\n(function (mainmenu_watch) {\n    let _m_bPerfectWorld = (MyPersonaAPI.GetLauncherType() === 'perfectworld');\n    let _m_activeTab;\n    let _m_contextTab;\n    let _m_tabStack = [];\n    let _m_contextPanel;\n    let _m_myXuid = MyPersonaAPI.GetXuid();\n    let MATCHLISTDESCRIPTOR = {\n        \"JsLive\": \"live\",\n        \"JsYourMatches\": _m_myXuid,\n        \"JsDownloaded\": \"downloaded\"\n    };\n    let MATCHLISTTABBYNAME = {\n        \"live\": \"JsLive\",\n        \"downloaded\": \"JsDownloaded\",\n        [_m_myXuid]: \"JsYourMatches\"\n    };\n    function GetActiveTab() {\n        return _m_activeTab;\n    }\n    mainmenu_watch.GetActiveTab = GetActiveTab;\n    function _PopulateStreamList(parentPanel) {\n        let streamNum = StreamsAPI.GetStreamCount();\n        let count = 9;\n        if (streamNum < 9) {\n            count = streamNum;\n        }\n        let elStreamList = parentPanel.FindChildTraverse(\"JsStreamList\");\n        for (let i = 0; i < elStreamList.GetChildCount(); i++) {\n            elStreamList.GetChild(i).Data().markForDelete = true;\n        }\n        if (count === 0) {\n            matchList.ShowListSpinner(false, parentPanel);\n            matchList.SetListMessage($.Localize(\"#CSGO_Watch_NoSteams\"), true, parentPanel);\n            matchList.ShowInfoPanel(false, parentPanel);\n        }\n        else {\n            matchList.SetListMessage(\"\", false, parentPanel);\n            matchList.ShowInfoPanel(true, parentPanel);\n        }\n        function _SendToTwitch(streamId) {\n            let url = StreamsAPI.GetStreamVideoFeedByName(streamId);\n            SteamOverlayAPI.OpenExternalBrowserURL(url);\n        }\n        function _ClearList(elListPanel) {\n            let activeTiles = elListPanel.Children();\n            for (let i = activeTiles.length - 1; i >= 0; i--) {\n                if (activeTiles[i].Data().markForDelete) {\n                    if (elListPanel.Data().activeButton === activeTiles[i]) {\n                        elListPanel.Data().activeButton = undefined;\n                    }\n                    activeTiles[i].checked = false;\n                    watchTile.Delete(activeTiles[i]);\n                }\n            }\n        }\n        for (let i = 0; i < count; i++) {\n            let streamName = StreamsAPI.GetStreamNameByIndex(i);\n            let elStreamPanel = elStreamList.FindChildInLayoutFile(\"TwitchStream_\" + streamName);\n            if (elStreamPanel == undefined) {\n                let elStreamPanel = $.CreatePanel('Button', elStreamList, \"TwitchStream_\" + streamName);\n                let streamCountry = StreamsAPI.GetStreamCountryByName(streamName);\n                elStreamPanel.BLoadLayout(\"file://{resources}/layout/matchtiles/streams.xml\", false, false);\n                let elStreamText = elStreamPanel.FindChildTraverse('Text-Panel');\n                elStreamPanel.FindChildInLayoutFile('stream-button__blur-target').AddBlurPanel(elStreamText);\n                elStreamPanel.SetDialogVariable('streamText', StreamsAPI.GetStreamTextDescriptionByName(streamName));\n                elStreamPanel.SetDialogVariable(\"numberOfViewers\", (StreamsAPI.GetStreamViewersByName(streamName)).toString());\n                elStreamPanel.SetDialogVariable(\"channel\", StreamsAPI.GetStreamDisplayNameByName(streamName));\n                elStreamPanel.FindChildTraverse(\"TwitchThumb\").SetImage(StreamsAPI.GetStreamPreviewImageByName(streamName));\n                CommonUtil.SetLanguageOnLabel(streamCountry, elStreamPanel);\n                elStreamPanel.SetPanelEvent('onactivate', _SendToTwitch.bind(undefined, streamName));\n            }\n            elStreamPanel.Data().markForDelete = false;\n        }\n        _ClearList(parentPanel.FindChildTraverse(\"JsStreamList\"));\n    }\n    function _OnMouseOverTextTooltip(_panel, _text) {\n        UiToolkitAPI.ShowTextTooltip(_panel, _text);\n    }\n    function _OnMouseOutTextTooltip() {\n        UiToolkitAPI.HideTextTooltip();\n    }\n    function _PopulateTournamentPage(parentPanel) {\n        let elTournamentList = parentPanel.FindChildTraverse(\"JsTournamentList\");\n        if (!elTournamentList.FindChildTraverse(\"other-tournaments\")) {\n            elTournamentList.BLoadLayout(\"file://{resources}/layout/matchtiles/tournament_page.xml\", false, false);\n            let pastTournamentPanel = elTournamentList.FindChildTraverse(\"other-tournaments\");\n            let maxTournaments = g_ActiveTournamentInfo.eventid;\n            for (let i = maxTournaments; i >= 1; i--) {\n                if (i == 2)\n                    continue;\n                if (i == 17)\n                    continue;\n                let elTournamentPanel = $.CreatePanel('Panel', pastTournamentPanel, \"Tournament_\" + i);\n                elTournamentPanel.BLoadLayoutSnippet(\"tournament_tile\");\n                elTournamentPanel.SetDialogVariable('tournament-title', $.Localize('#CSGO_Tournament_Event_Location_' + i));\n                let elTOLogo = elTournamentPanel.FindChildTraverse('id-tournament-to-logo');\n                elTOLogo.SetImage('file://{images}/tournaments/events/tournament_logo_' + i + '.svg');\n                elTOLogo.GetParent().SetHasClass('tall-logo', i == 22 || i == 24 || i == 25);\n                let ProEventJSO = TournamentsAPI.GetProEventDataJSO(i, 8);\n                let oWinningTeam;\n                let hasEventData = false;\n                if (ProEventJSO\n                    && ProEventJSO.hasOwnProperty('eventdata')\n                    && ProEventJSO['eventdata'].hasOwnProperty(i)) {\n                    oWinningTeam = ProEventJSO['eventdata'][i][0];\n                    hasEventData = true;\n                }\n                let elChampions = elTournamentPanel.FindChildTraverse('JsChampions');\n                _SetTeam(elChampions, oWinningTeam, i, false);\n                let elLegendsContainer = elTournamentPanel.FindChildTraverse('JsLegendsContainer');\n                let elPlayerRoot = elTournamentPanel.FindChildTraverse(\"JsPlayersContainer\");\n                let elHoverPanel = elTournamentPanel.FindChildTraverse('JsChampionsHoverTarget');\n                _PopulateTeamPlayers(elPlayerRoot, elHoverPanel, elLegendsContainer, oWinningTeam, i);\n                for (let iTeam = 1; iTeam < 8; iTeam++) {\n                    let oTeam;\n                    if (hasEventData &&\n                        ProEventJSO['eventdata'][i].hasOwnProperty(iTeam) &&\n                        ProEventJSO['eventdata'][i][iTeam]) {\n                        oTeam = ProEventJSO['eventdata'][i][iTeam];\n                    }\n                    let elLegend = $.CreatePanel('Panel', elLegendsContainer, iTeam.toString());\n                    elLegend.BLoadLayoutSnippet(\"snippet-tournament-legends\");\n                    _SetTeam(elLegend, oTeam, i);\n                }\n                let elModel = elTournamentPanel.FindChildTraverse('ParticleModel');\n                elModel.StopParticlesImmediately(true);\n                elModel.StartParticles();\n                elModel.SetControlPoint(4, 0, 0, -80);\n                let elButton = elTournamentPanel.FindChild('JsTournamentContent');\n                let image = 'url(\"file://{images}/tournaments/events/bg_' + i + '.png\")';\n                if (elButton?.IsValid() && elButton) {\n                    elButton.style.backgroundImage = image;\n                    elButton.style.backgroundPosition = '50% 50%';\n                    elButton.style.backgroundSize = 'auto 110%';\n                    elButton.style.backgroundImgOpacity = '.7';\n                    if ((i == maxTournaments) && (g_ActiveTournamentInfo.active)) {\n                        elButton.SetPanelEvent('onactivate', () => {\n                            UiToolkitAPI.ShowCustomLayoutPopupParameters('id-popup-major-hub', 'file://{resources}/layout/popups/popup_major_hub.xml', 'eventid=' + i);\n                        });\n                    }\n                }\n            }\n        }\n        function _SetTeam(elTeam, oTeamData, uniqueIdentifier, bTooltip = true) {\n            let elTeamLogo = elTeam.FindChildTraverse('JsTeamLogo');\n            let teamName = $.Localize(\"#CSGO_PickEm_Team_TBD\");\n            let teamPlaceStr = \"\";\n            if (oTeamData) {\n                let team = oTeamData['team_id'];\n                let teamTag = oTeamData['tag'];\n                let teamGeo = oTeamData['geo'];\n                let teamPlaceToken = oTeamData['place_token'];\n                let teamLogo = 'file://{images}/tournaments/teams/' + teamTag.toLowerCase() + '.svg';\n                teamName = $.Localize('#CSGO_TeamID_' + team);\n                teamPlaceStr = $.Localize(teamPlaceToken);\n                elTeamLogo.SetImage(teamLogo);\n                if (bTooltip) {\n                    let TooltipString = $.Localize(teamName);\n                    let elTooltipAnchor = $.CreatePanel(\"Panel\", elTeam, uniqueIdentifier + \"_\" + elTeam.id, { style: \"\ttooltip-position: bottom;\" });\n                }\n            }\n            elTeam.SetDialogVariable(\"team-place\", teamPlaceStr);\n            elTeam.SetDialogVariable(\"team-name\", teamName);\n        }\n        function _PopulateTeamPlayers(elPlayerContainer, elHoverPanel, elLegendsContainer, oTeamData, eventid) {\n            if (!oTeamData)\n                return;\n            let arrIndices = [0, 1, 2, 3, 4];\n            for (let i = 0; i < 5; i++) {\n                let n = arrIndices.splice(Math.floor(Math.random() * 5), 1)[0];\n                arrIndices.push(n);\n            }\n            let arrTeamPlayers = Object.entries(oTeamData['players']);\n            arrIndices.forEach(function (i) {\n                let oPlayer = arrTeamPlayers[i][1];\n                let elPlayer = $.CreatePanel('Panel', elPlayerContainer, 'JsPlayerCard');\n                elPlayer.BLoadLayoutSnippet('snippet-tournament-player');\n                let playername = oPlayer['name'];\n                let steamid64 = oPlayer['accountid64'];\n                if (eventid === 26 && playername === 'kyxsan') {\n                    playername = 'karrigan';\n                    steamid64 = '76561197989430253';\n                }\n                elPlayer.SetDialogVariable('tournament-player-name', playername);\n                let elPlayerImage = elPlayer.FindChildTraverse('JsTournamentPlayerPhoto');\n                if (elPlayerImage) {\n                    let photo_url = \"file://{images}/tournaments/avatars/\" + eventid + \"/\" + steamid64 + \".png\";\n                    elPlayerImage.SetImage(photo_url);\n                }\n            });\n            elHoverPanel.AddClass(\"has-team-data\");\n            elHoverPanel.SetPanelEvent('onmouseover', function (elPlayerContainer, elLegendsContainer) { _RevealPlayers(elPlayerContainer, elLegendsContainer); }.bind(undefined, elPlayerContainer, elLegendsContainer));\n            elHoverPanel.SetPanelEvent('onmouseout', function (elPlayerContainer, elLegendsContainer) { _HidePlayers(elPlayerContainer, elLegendsContainer); }.bind(undefined, elPlayerContainer, elLegendsContainer));\n            function _RevealPlayers(elPlayerContainer, elLegendsContainer) {\n                let arrElPlayers = elPlayerContainer.Children();\n                elLegendsContainer.AddClass('hidden');\n                const DELAY_INIT = 0;\n                const DELAY_DELTA = 0.1;\n                arrElPlayers.forEach(function (elPlayer, i) {\n                    let delay = DELAY_INIT + i * DELAY_DELTA;\n                    Scheduler.Schedule(delay, () => {\n                        if (elPlayer && elPlayer.IsValid())\n                            elPlayer.RemoveClass('hidden');\n                        Scheduler.Schedule(0.1, function () {\n                            $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.mainmenu_rollover', 'MOUSE');\n                        }, \"player-reveal\");\n                    }, \"player-reveal\");\n                });\n            }\n            function _HidePlayers(elPlayerContainer, elLegendsContainer) {\n                elLegendsContainer.RemoveClass('hidden');\n                let arrElPlayers = elPlayerContainer.Children();\n                Scheduler.Cancel(\"player-reveal\");\n                arrElPlayers.forEach(function (elPlayer) {\n                    elPlayer.AddClass('hidden');\n                });\n            }\n        }\n    }\n    function _UpdateTab(elTab, optbFromMatchListChangeEvent = false) {\n        elTab.SetReadyForDisplay(true);\n        elTab.visible = true;\n        switch (elTab.id) {\n            case \"JsTournaments\":\n                _PopulateTournamentPage(elTab);\n                break;\n            case \"JsYourMatches\":\n            case \"JsDownloaded\":\n            case \"JsLive\":\n                matchList.UpdateMatchList(elTab, MATCHLISTDESCRIPTOR[elTab.id], optbFromMatchListChangeEvent);\n                break;\n            case \"JsEvents\":\n                TournamentsAPI.RequestTournaments();\n                break;\n        }\n    }\n    function UpdateActiveTab() {\n        if (_m_activeTab) {\n            if (_m_activeTab.id === 'JsActiveTournament') {\n                $.DispatchEvent('RefreshPickemPage', 'tournament:' + g_ActiveTournamentInfo.eventid);\n                return;\n            }\n            _UpdateTab(_m_activeTab);\n        }\n    }\n    mainmenu_watch.UpdateActiveTab = UpdateActiveTab;\n    function _UpdateMatchList(listId, optbFromMatchListChangeEvent) {\n        let tabbyid = MATCHLISTTABBYNAME[listId];\n        if (tabbyid) {\n            _UpdateTab($(\"#\" + tabbyid), optbFromMatchListChangeEvent);\n        }\n    }\n    function _UpdateMatchListFromMatchListChangeEvent(listId) {\n        _UpdateMatchList(listId, true);\n    }\n    function NavigateToTab(tab = '', xmlName = '', tournament_id = '', isSubTab = false, addToStack = false) {\n        if (isSubTab && addToStack) {\n            if (_m_tabStack.length > 0) {\n                _m_tabStack[_m_tabStack.length - 1].AddClass(\"mainmenu-content--hidden\");\n            }\n            else {\n                if (!_m_contextPanel) {\n                    _m_contextPanel = $(\"#main-content\");\n                }\n                if (_m_contextPanel) {\n                    _m_contextPanel.AddClass(\"mainmenu-content--hidden\");\n                }\n            }\n        }\n        let parent = $.GetContextPanel().FindChildInLayoutFile(tab);\n        if (isSubTab && !parent) {\n            let newPanel = undefined;\n            parent = $.CreatePanel('Panel', $('#JsWatchContent'), tab);\n            parent.AddClass(\"mainmenu-content--popuptab\");\n            parent.AddClass(\"mainmenu-content--hidden\");\n            parent.AddClass(\"mainmenu-content__container\");\n            parent.AddClass(\"no-margin\");\n            parent.AddClass('hide');\n            newPanel = $.CreatePanel('Panel', parent, \"tournament_content_\" + tournament_id);\n            newPanel.Data().elMainMenuRoot = $.GetContextPanel().Data().elMainMenuRoot;\n            parent.RemoveClass('hide');\n            parent.RemoveClass('mainmenu-content--hidden');\n            parent.Data().tournament_id = tournament_id;\n            newPanel.BLoadLayout('file://{resources}/layout/' + xmlName + '.xml', false, false);\n            newPanel.RegisterForReadyEvents(true);\n            parent.Data().isSubTab = true;\n            _InitResourceManagement(newPanel);\n            $.DispatchEvent('InitializeTournamentsPage', newPanel, tournament_id);\n        }\n        let pressedTab = $('#' + tab);\n        if (_m_activeTab != pressedTab) {\n            if (!isSubTab) {\n                if (_m_activeTab) {\n                    if (!_m_activeTab.Data().isSubTab) {\n                        _m_activeTab.AddClass('WatchMenu--Hide');\n                    }\n                    else {\n                        _m_activeTab.AddClass('mainmenu-content--hidden');\n                    }\n                }\n                _m_activeTab = pressedTab;\n                _m_contextTab = pressedTab;\n                if (!_m_contextPanel) {\n                    _m_contextPanel = $(\"#main-content\");\n                }\n                if (_m_contextPanel) {\n                    _m_contextPanel.RemoveClass(\"mainmenu-content--hidden\");\n                }\n                if (!_m_activeTab) {\n                    return;\n                }\n                _m_activeTab.RemoveClass('WatchMenu--Hide');\n            }\n            else {\n                if (!addToStack)\n                    _m_activeTab.AddClass('mainmenu-content--hidden');\n                _m_activeTab = pressedTab;\n                _m_activeTab.SetFocus();\n                if (!_m_activeTab) {\n                    return;\n                }\n                _m_activeTab.RemoveClass('mainmenu-content--hidden');\n                if (_m_activeTab.Data().tournament_id) {\n                    matchList.ReselectActiveTile(_m_activeTab);\n                }\n                if (addToStack)\n                    _m_tabStack.push(_m_activeTab);\n            }\n        }\n        _UpdateTab(_m_activeTab);\n    }\n    mainmenu_watch.NavigateToTab = NavigateToTab;\n    function CloseSubMenuContent() {\n        if ((!_m_tabStack) || (_m_tabStack.length == 0) || (!_m_tabStack[_m_tabStack.length - 1].visible)) {\n            return false;\n        }\n        _m_tabStack.pop();\n        if (_m_tabStack.length >= 1) {\n            NavigateToTab(_m_tabStack[_m_tabStack.length - 1].id, undefined, undefined, false);\n        }\n        else {\n            NavigateToTab(_m_contextTab.id);\n        }\n        return true;\n    }\n    mainmenu_watch.CloseSubMenuContent = CloseSubMenuContent;\n    function _InitResourceManagement(elTab) {\n        $.RegisterEventHandler('PropertyTransitionEnd', elTab, (panelName, propertyName) => {\n            if (elTab === panelName && propertyName === 'opacity') {\n                if (elTab.visible === true && elTab.BIsTransparent()) {\n                    elTab.visible = false;\n                    elTab.SetReadyForDisplay(false);\n                    return true;\n                }\n            }\n            return false;\n        });\n        elTab.Data().elMainMenuRoot = $.GetContextPanel().Data().elMainMenuRoot;\n    }\n    function _InitTab(tab) {\n        let elTab = $('#' + tab);\n        if (!elTab.BLoadLayoutSnippet(\"MatchListAndInfo\")) {\n        }\n        _InitResourceManagement(elTab);\n    }\n    function InitMainWatchPanel() {\n        _m_activeTab = null;\n        _m_contextPanel = $(\"#main-content\");\n        $.RegisterForUnhandledEvent(\"PanoramaComponent_MatchList_StateChange\", _UpdateMatchListFromMatchListChangeEvent);\n        $.RegisterForUnhandledEvent(\"CloseSubMenuContent\", CloseSubMenuContent);\n        $.RegisterForUnhandledEvent(\"NavigateToTab\", NavigateToTab);\n        _InitTab('JsYourMatches');\n        _InitTab('JsDownloaded');\n        _InitTab('JsLive');\n        _InitResourceManagement($('#JsTournaments'));\n        if (_m_bPerfectWorld) {\n            let elWatchNavBarButtonStreams = $('#WatchNavBarButtonStreams');\n            if (elWatchNavBarButtonStreams)\n                elWatchNavBarButtonStreams.DeleteAsync(.0);\n            elWatchNavBarButtonStreams = $('#WatchNavBarButtonEvents');\n            if (elWatchNavBarButtonStreams)\n                elWatchNavBarButtonStreams.DeleteAsync(.0);\n        }\n        else {\n            _InitResourceManagement($('#JsEvents'));\n        }\n        let restrictions = LicenseUtil.GetCurrentLicenseRestrictions();\n        if (restrictions === false) {\n        }\n        NavigateToTab('JsYourMatches');\n        $('#WatchNavBarYourMatches').checked = true;\n    }\n    mainmenu_watch.InitMainWatchPanel = InitMainWatchPanel;\n    let _RunEveryTimeWatchIsShown = function () {\n        if (!MyPersonaAPI.IsInventoryValid() || !MyPersonaAPI.IsConnectedToGC()) {\n            UiToolkitAPI.ShowGenericPopupOk($.Localize('#SFUI_SteamConnectionErrorTitle'), $.Localize('#SFUI_Steam_Error_LinkUnexpected'), '', function () {\n                $.DispatchEvent('HideContentPanel');\n            });\n        }\n    };\n    function OnReadyForDisplay() {\n    }\n    mainmenu_watch.OnReadyForDisplay = OnReadyForDisplay;\n    ;\n    function ShowActiveTournamentPage(idOfTab = '') {\n        while (CloseSubMenuContent())\n            continue;\n        NavigateToTab('JsTournaments');\n        $('#WatchNavBarButtonTournaments').checked = true;\n        let i = g_ActiveTournamentInfo.eventid;\n        NavigateToTab('JsMainMenuSubContent_Tournament' + i, 'mainmenu_watch_tournament', 'tournament:' + i, true, true);\n        let elTournamentActive = _m_activeTab;\n        if (idOfTab && elTournamentActive) {\n            let elTabToActivate = elTournamentActive.FindChildTraverse('content-navbar__tabs');\n            if (elTabToActivate) {\n                elTabToActivate = elTabToActivate.FindChildInLayoutFile(idOfTab);\n            }\n            if (elTabToActivate) {\n                $.DispatchEvent(\"Activated\", elTabToActivate, \"mouse\");\n            }\n            else {\n            }\n        }\n    }\n    mainmenu_watch.ShowActiveTournamentPage = ShowActiveTournamentPage;\n})(mainmenu_watch || (mainmenu_watch = {}));\n(function () {\n    $.RegisterEventHandler('Cancelled', $('#JsWatch'), mainmenu_watch.CloseSubMenuContent);\n    $.RegisterEventHandler('ReadyForDisplay', $('#JsWatch'), mainmenu_watch.OnReadyForDisplay);\n    $.RegisterForUnhandledEvent('ShowActiveTournamentPage', mainmenu_watch.ShowActiveTournamentPage);\n})();\n","scripts/mainmenu_watch_eventsched.js":"'use strict';\n\n\nvar mainmenu_watch_eventsched = ( function()\n{\n\n\tvar _m_cP = $.GetContextPanel();\n\tvar _m_ElEventLister = $( \"#id-eventsched-master\" );\n\tvar _m_arrEvents = undefined;                         \n\tvar _m_arrFavorites = undefined;                                             \n\tvar _m_prevSchedeventsString = \"\";\n\tvar _m_IsPrime = false;\n\tvar _m_isPerfectWorld = MyPersonaAPI.GetLauncherType() === \"perfectworld\";\n\tvar _m_InventoryUpdatedHandle;\n\n\n\tfunction _Init ()\n\t{\n\t\tif ( _m_isPerfectWorld )\n\t\t\treturn;\n\t\t\n\t\t                                                                      \n\t\t$.RegisterForUnhandledEvent( 'Tournaments_EventsReceived', _EventsReceived );\n\t\t$.RegisterForUnhandledEvent( 'Tournaments_FavoritesReceived', _FavoritesReceived );\n\t\t$.RegisterForUnhandledEvent( 'Tournaments_RequestMatch', _RequestMatchString );\n\t\t_m_InventoryUpdatedHandle = $.RegisterForUnhandledEvent( 'PanoramaComponent_MyPersona_InventoryUpdated', _PopulateLister );\n\n\t\t                            \n\t\t_m_cP.RegisterForReadyEvents( true );\n\t\t                                                                             \n\t\t$.RegisterEventHandler( 'ReadyForDisplay', _m_cP, function()\n\t\t{\n\t\t\tif ( !_m_InventoryUpdatedHandle )\n\t\t\t{\n\t\t\t\t_m_InventoryUpdatedHandle = $.RegisterForUnhandledEvent( 'PanoramaComponent_MyPersona_InventoryUpdated', _PopulateLister );\n\t\t\t}\n\t\t} );\n\t\t$.RegisterEventHandler( 'UnreadyForDisplay', _m_cP, function()\n\t\t{\n\t\t\tif ( _m_InventoryUpdatedHandle )\n\t\t\t{\n\t\t\t\t$.UnregisterForUnhandledEvent( 'PanoramaComponent_MyPersona_InventoryUpdated', _m_InventoryUpdatedHandle );\n\t\t\t\t_m_InventoryUpdatedHandle = null;\n\t\t\t}\n\t\t} );\n\n\n\t\tTournamentsAPI.RequestFavorites();\n\t\tTournamentsAPI.RequestTournaments();\n\t};\n\n\t                               \n\t  \n\tfunction _OnMouseOverCustomLayoutTooltip ( _panel, _tooltipId, _xmlsrc, _parms )\n\t{\n\t\tUiToolkitAPI.ShowCustomLayoutParametersTooltip(\n\t\t\t_panel,\n\t\t\t_tooltipId,\n\t\t\t_xmlsrc,\n\t\t\t_parms );\n\t}\n\n\tfunction _CheckForPrime ()\n\t{\n\t\t_m_IsPrime = MyPersonaAPI.GetElevatedState() == \"elevated\";\n\t}\n\n\tfunction _OnMouseOutCustomLayoutTooltip ( _tooltipId )\n\t{\n\t\tUiToolkitAPI.HideCustomLayoutTooltip( _tooltipId );\n\t}\n\n\t                              \n\t  \n\tfunction _OnMouseOverTextTooltip ( _panel, _text )\n\t{\n\t\tUiToolkitAPI.ShowTextTooltip(\n\t\t\t_panel,\n\t\t\t_text );\n\t}\n\n\tfunction _OnMouseOutTextTooltip ( __tooltipId )\n\t{\n\t\tUiToolkitAPI.HideTextTooltip();\n\t}\n\n\tfunction _RequestMatchString ( matchId )\n\t{\n\t\t_m_arrEvents.forEach( o =>\n\t\t{\n\t\t\to[ 'live_matches' ].forEach( m =>\n\t\t\t{\n\t\t\t\tif ( m[ 'match_id' ] == matchId )\n\t\t\t\t{\n\t\t\t\t\t$.DispatchEvent( 'Tournaments_RequestMatch_Response', JSON.stringify( m ) );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} )\n\t\t} )\n\n\t\treturn undefined;\n\n\t}\n\n\tfunction _StartDateCompareFunction ( a, b )\n\t{\n\t\treturn a[ 'start_date_time' ][ 'seconds' ] - b[ 'start_date_time' ][ 'seconds' ];\n\t}\n\n\t  \n\t                                   \n\t \n\t\t                                                                                           \n\n\t\t                                 \n\t\t\t                       \n\t \n\n\t                                   \n\t \n\t\t                                                                        \n\t\t              \n\t \n\t  \n\n\tfunction _EventsReceived ( eventsAsString )\n\t{\n\t\tif ( eventsAsString != _m_prevSchedeventsString )\n\t\t{\n\t\t\t_IngestEvents( eventsAsString );\n\n\t\t\t_m_prevSchedeventsString = eventsAsString;\n\t\t}\n\n\t\t_PopulateLister();\n\t}\n\n\tfunction _FavoritesReceived ( jsonFavorites, jsonFeatured )\n\t{\n\t\t_m_arrFavorites = JSON.parse( jsonFavorites );\n\n\t\t_PopulateLister();\n\t}\n\n\tfunction _DisplayAsFavorite ( element, stateToSet )\n\t{\n\t\telement.SetHasClass( 'eventsched-favorite', stateToSet );\n\n\t\t_AddToFavoriteCountAndDisplay( element, stateToSet ? +1 : -1 );\n\n\t\t                                                                       \n\t\tif ( stateToSet )\n\t\t{\n\t\t\telement.m_elMonthContainer.AddClass( 'eventsched-month-show' );\n\t\t}\n\t\telse\n\t\t{\n\t\t\t                                                                            \n\t\t\t_ClearEmptyMonth( element.m_elMonthContainer );\n\t\t}\n\t}\n\n\tfunction _ClearEmptyMonth ( elMonth )\n\t{\n\t\t  \n\t\t                                 \n\t\t  \n\t\t{\n\t\t\tvar bAnyVisible = false;\n\n\t\t\telMonth.Children().forEach( element =>\n\t\t\t{\n\t\t\t\tif ( element.visible == true && element.BHasClass( 'eventsched__capsule' ) )\n\t\t\t\t\tbAnyVisible = true;\n\t\t\t} )\n\n\t\t\tif ( !bAnyVisible )\n\t\t\t\telMonth.RemoveClass( 'eventsched-month-show' );\n\t\t}\n\t}\n\n\tfunction _ClearAllEmptyMonths ()\n\t{\n\t\t_m_ElEventLister.Children().forEach( elMonth => _ClearEmptyMonth( elMonth ) );\n\t}\n\n\tfunction _UpdateAllFavorites ()\n\t{\n\t\tif ( !_m_cP || !_m_cP.IsValid() )\n\t\t\treturn;\n\n\t\tif ( !_m_arrFavorites || _m_arrFavorites.length === 0 )\n\t\t\treturn;\n\n\t\tfor ( var idx in _m_arrEvents )\n\t\t{\n\t\t\tvar oEvent = _m_arrEvents[ idx ];\n\t\t\tvar elEvent = _m_cP.FindChildTraverse( oEvent[ 'event_id' ] );\n\n\t\t\tif ( elEvent && elEvent.IsValid() )\n\t\t\t{\n\t\t\t\tvar bFavorite = _m_arrFavorites.includes( Number( oEvent[ 'event_id' ] ) );\n\n\t\t\t\t_DisplayAsFavorite( elEvent, bFavorite );\n\n\t\t\t\tvar elFavoriteBtn = elEvent.FindChildTraverse( 'id-capsule__main__favorite' );\n\t\t\t\tif ( elFavoriteBtn && elFavoriteBtn.IsValid() )\n\t\t\t\t{\n\t\t\t\t\telFavoriteBtn.checked = bFavorite;\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction GetEventMonthString ( oEvent )\n\t{\n\t\tvar startTimeUTCSeconds = -1;\n\t\tvar endTimeUTCSeconds = -1;\n\n\t\tvar startDate = new Date( 0 );\n\t\tvar endDate = new Date( 0 );\n\n\t\tif ( 'start_date_time' in oEvent && 'seconds' in oEvent[ 'start_date_time' ] )\n\t\t{\n\t\t\tstartTimeUTCSeconds = Number( oEvent[ 'start_date_time' ][ 'seconds' ] );\n\t\t\tstartDate.setUTCSeconds( startTimeUTCSeconds );\n\n\t\t\tif ( 'end_date_time' in oEvent && 'seconds' in oEvent[ 'end_date_time' ] )\n\t\t\t{\n\t\t\t\tendTimeUTCSeconds = Number( oEvent[ 'end_date_time' ][ 'seconds' ] );\n\t\t\t\tendDate.setUTCSeconds( endTimeUTCSeconds );\n\t\t\t}\n\n\t\t\tvar monthPaddedNumber = ( '0' + ( startDate.getMonth() + 1 ) ).slice( -2 );\n\t\t\treturn $.Localize( '#MonthName' + monthPaddedNumber + '_long' );                      \n\t\t}\n\t}\n\n\t                          \n\tfunction _IngestEvents ( eventsAsString )\n\t{\n\t\tif ( eventsAsString != undefined && eventsAsString != \"\" )\n\t\t{\n\t\t\tvar jsonEvents = JSON.parse( eventsAsString );\n\t\t\t_m_arrEvents = EventUtil.AnnotateOfficialEvents( jsonEvents );\n\t\t\t_m_arrEvents.sort( _StartDateCompareFunction );\n\t\t}\n\n\t\tif ( ADD_DEBUG_EVENT == 1 )\n\t\t{\n\t\t\twatchEventLiveExample_01[ 'DEBUG_IGNORE_DATES_FORCE_SHOW' ] = true;\n\t\t\twatchEventLiveExample_02[ 'DEBUG_IGNORE_DATES_FORCE_SHOW' ] = true;\n\t\t\twatchEventLiveExample_03[ 'DEBUG_IGNORE_DATES_FORCE_SHOW' ] = true;\n\t\t\t_m_arrEvents.unshift( watchEventLiveExample_01 );\n\t\t\t_m_arrEvents.unshift( watchEventLiveExample_02 );\n\t\t\t_m_arrEvents.unshift( watchEventLiveExample_03 );\n\t\t}\n\t}\n\n\tfunction _AddToFavoriteCountAndDisplay ( element, amount )\n\t{\n\t\telement.m_favoriteCount += amount;\n\n\t\tif ( element.m_favoriteCount < 0 )\n\t\t{\n\t\t\telement.m_favoriteCount = 0;\n\t\t}\n\n\t\tvar displayFavorites = FormatText.AbbreviateNumber( element.m_favoriteCount );\n\t\telement.SetDialogVariable( 'eventsched_fave_count', displayFavorites );\n\n\t}\n\n\tvar openUrl = function( url )\n\t{\n\t\tSteamOverlayAPI.OpenUrlInOverlayOrExternalBrowser( url );\n\t\t$.DispatchEvent( 'CSGOPlaySoundEffect', 'UIPanorama.sidemenu_select', 'MOUSE' );\n\t}\n\n\n\t                   \n\tfunction _PopulateLister ()\n\t{\n\t\tif ( !_m_cP || !_m_cP.IsValid() )\n\t\t\treturn;\n\n\t\t_CheckForPrime();\n\n\t\t_m_ElEventLister.RemoveAndDeleteChildren();\n\n\t\tvar isOddEvent = true;\n\n\t\tfor ( var idx in _m_arrEvents )\n\t\t{\n\t\t\tvar oEvent = _m_arrEvents[ idx ];\n\n\t\t\tvar startTimeUTCSeconds = -1;\n\t\t\tvar endTimeUTCSeconds = -1;\n\n\t\t\tvar startDate = new Date( 0 );\n\t\t\tvar endDate = new Date( 0 );\n\n\n\t\t\tif ( 'start_date_time' in oEvent && 'seconds' in oEvent[ 'start_date_time' ] )\n\t\t\t{\n\t\t\t\tstartTimeUTCSeconds = Number( oEvent[ 'start_date_time' ][ 'seconds' ] );\n\t\t\t\tstartDate.setUTCSeconds( startTimeUTCSeconds );\n\n\t\t\t\tif ( 'end_date_time' in oEvent && 'seconds' in oEvent[ 'end_date_time' ] )\n\t\t\t\t{\n\t\t\t\t\tendTimeUTCSeconds = Number( oEvent[ 'end_date_time' ][ 'seconds' ] );\n\t\t\t\t\tendDate.setUTCSeconds( endTimeUTCSeconds );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar curDateUTCSeconds = Date.now() / 1000;\n\n\t\t\tvar isOngoing = false;\n\n\n\t\t\tif ( 'DEBUG_IGNORE_DATES_FORCE_SHOW' in oEvent )\n\t\t\t{\n\t\t\t\tisOngoing = true;\n\t\t\t\tstartTimeUTCSeconds = curDateUTCSeconds;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t                                \n\t\t\t\tif ( endTimeUTCSeconds > -1 && curDateUTCSeconds > endTimeUTCSeconds )\n\t\t\t\t{\n\t\t\t\t\t                          \n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\telse if ( startTimeUTCSeconds > -1 &&\n\t\t\t\t\tendTimeUTCSeconds > -1 &&\n\t\t\t\t\tcurDateUTCSeconds > startTimeUTCSeconds &&\n\t\t\t\t\tcurDateUTCSeconds < endTimeUTCSeconds )\n\t\t\t\t{\n\t\t\t\t\t                                       \n\t\t\t\t\tisOngoing = true;\n\t\t\t\t}\n\t\t\t\telse if ( endTimeUTCSeconds == -1 && curDateUTCSeconds > startTimeUTCSeconds )\n\t\t\t\t{\n\t\t\t\t\t                                                     \n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\n\t\t\tvar elYearContainer;\n\t\t\tvar elMonthContainer;\n\n\t\t\tif ( isOngoing )\n\t\t\t{\n\t\t\t\tvar idOngoing = \"id-eventsched-ONGOING\";\n\n\t\t\t\tvar elMonthContainer = _m_ElEventLister.FindChildTraverse( idOngoing );\n\t\t\t\tif ( !elMonthContainer || !elMonthContainer.IsValid() )\n\t\t\t\t{\n\t\t\t\t\telMonthContainer = $.CreatePanel( 'Panel', _m_ElEventLister, idOngoing );\n\t\t\t\t\telMonthContainer.BLoadLayoutSnippet( 'snippet_eventsched_month_container' );\n\t\t\t\t\telMonthContainer.AddClass( \"eventsched__month-container--ongoing\" );\n\t\t\t\t\tvar elHeader = elMonthContainer.FindChildTraverse( \"id-eventsched__month-container__header\" );\n\t\t\t\t\tif ( elHeader )\n\t\t\t\t\t{\n\t\t\t\t\t\telHeader.text = $.Localize( '#eventsched_ongoing' );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t                \n\t\t\t\tconst ID_YEAR_PREFIX = 'eventsched__year__';\n\t\t\t\tvar idYear = ID_YEAR_PREFIX + startDate.getFullYear();\n\n\t\t\t\telYearContainer = _m_ElEventLister.FindChildTraverse( idYear );\n\t\t\t\tif ( !elYearContainer || !elYearContainer.IsValid() )\n\t\t\t\t{\n\t\t\t\t\telYearContainer = $.CreatePanel( 'Panel', _m_ElEventLister, idYear );\n\t\t\t\t\telYearContainer.BLoadLayoutSnippet( 'snippet_eventsched_year_container' );\n\t\t\t\t\tvar elYearHeader = elYearContainer.FindChildTraverse( \"id-eventsched__year-container__header\" );\n\t\t\t\t\tif ( elYearHeader )\n\t\t\t\t\t{\n\t\t\t\t\t\telYearHeader.text = startDate.getFullYear();\n\n\t\t\t\t\t\t                           \n\t\t\t\t\t\tif ( new Date().getFullYear() == startDate.getFullYear() )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\telYearHeader.visible = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\t\t\t\t\n\n\t\t\t\t                      \n\t\t\t\tconst ID_MONTH_PREFIX = 'eventsched__month__';\n\t\t\t\tvar idMonth = ID_MONTH_PREFIX + ( startDate.getMonth() + 1 );\n\n\t\t\t\telMonthContainer = elYearContainer.FindChildTraverse( idMonth );\n\t\t\t\tif ( !elMonthContainer || !elMonthContainer.IsValid() )\n\t\t\t\t{\n\t\t\t\t\telMonthContainer = $.CreatePanel( 'Panel', elYearContainer, idMonth );\n\t\t\t\t\telMonthContainer.BLoadLayoutSnippet( 'snippet_eventsched_month_container' );\n\t\t\t\t\tvar elMonthHeader = elMonthContainer.FindChildTraverse( \"id-eventsched__month-container__header\" );\n\t\t\t\t\tif ( elMonthHeader )\n\t\t\t\t\t{\n\t\t\t\t\t\tvar monthPaddedNumber = ( '0' + ( startDate.getMonth() + 1 ) ).slice( -2 );\n\t\t\t\t\t\telMonthHeader.text = $.Localize( '#MonthName' + monthPaddedNumber + '_long' );                      \n\t\t\t\t\t}\n\n\t\t\t\t\tisOddEvent = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t                 \n\t\t\t  \n\t\t\tvar elEvent = $.CreatePanel( 'Panel', elMonthContainer, oEvent[ 'event_id' ] );\n\t\t\telEvent.BLoadLayoutSnippet( 'snippet_eventsched__capsule' );\n\t\t\telEvent.SetHasClass( \"eventsched__capsule--odd\", isOddEvent );\n\t\t\telEvent.SetHasClass( \"eventsched__capsule--ongoing\", isOngoing );\n\t\t\telEvent.m_elMonthContainer = elMonthContainer;\n\n\t\t\t                 \n\t\t\telEvent.m_event_id = oEvent[ 'event_id' ];\n\n\t\t\t             \n\t\t\telEvent.m_favoriteCount = ( 'favorites' in oEvent ) ? Number( oEvent[ 'favorites' ] ) : 0;\n\t\t\t_AddToFavoriteCountAndDisplay( elEvent, 0 );                                  \n\n\t\t\t           \n\n\t\t\t\n\t\t\tif ( oEvent[ 'is_official'] )\n\t\t\t{\n\t\t\t\tvar elEventBtn = elEvent.FindChildTraverse( 'id-eventsched__capsule__main__btn' );\n\n\t\t\t\telEventBtn.SetPanelEvent( 'onmouseover', _OnMouseOverTextTooltip.bind( undefined, elEvent.id, $.Localize( \"#eventsched_official\" ) ) );\n\t\t\t\telEventBtn.SetPanelEvent( 'onmouseout', _OnMouseOutTextTooltip );\n\n\t\t\t\telEvent.AddClass( 'eventsched-official' );\n\t\t\t}\n\t\t\telse if ( oEvent[ 'is_featured' ] )\n\t\t\t{\n\t\t\t\telEvent.AddClass( 'eventsched-featured' );\n\n\t\t\t\tvar elEventBtn = elEvent.FindChildTraverse( 'id-eventsched__capsule__main__btn' );\n\n\t\t\t\telEvent.SetDialogVariable( 'eventsched_fave_month', GetEventMonthString( oEvent ) );\n\t\t\t\telEvent.SetDialogVariable( 'eventsched_featured', $.Localize( '#eventsched_featured', elEvent ) )\n\n\t\t\t\telEventBtn.SetPanelEvent( 'onmouseover', _OnMouseOverTextTooltip.bind( undefined, elEvent.id, $.Localize( '{s:eventsched_featured}', elEvent ) ) );\n\t\t\t\telEventBtn.SetPanelEvent( 'onmouseout', _OnMouseOutTextTooltip );\n\t\t\t}\n\n\t\t\t       \n\n\t\t\tvar elLogo = elEvent.FindChildTraverse( \"id-eventsched__logo\" );\n\n\t\t\tif ( oEvent.hasOwnProperty( \"logo_url\" ) && oEvent[ 'logo_url' ] !== \"\" )\n\t\t\t{\n\t\t\t\telLogo.SetImage( oEvent[ 'logo_url' ] );\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\telLogo.SetImage( \"file://{images}/icons/ui/pro_event.svg\" );\n\t\t\t}\n\n\t\t\t       \n\t\t\telEvent.SetDialogVariable( 'eventsched_name', oEvent[ 'name' ] );\n\n\n\t\t\t           \n\t\t\tif ( 'flag_url' in oEvent )\n\t\t\t{\n\t\t\t\tCommonUtil.SetRegionOnLabel( oEvent[ 'country_iso' ], elEvent, false );\n\t\t\t\t                                                                   \n\n\t\t\t\t                                           \n\t\t\t\t  \t\t\t                                                                       \n\n\t\t\t\t                                                                                                                           \n\n\t\t\t\t                                                                                                                                      \n\t\t\t\tvar cc = $.Localize( '#SFUI_Country_' + oEvent[ 'country_iso' ]);\n\n\t\t\t\t                                     \n\t\t\t\t          \n\t\t\t\t          \n\t\t\t\t \n\t\t\t\t\t                                   \n\t\t\t\t\t                                                \n\t\t\t\t \n\t\t\t\t          \n\n\t\t\t\telEvent.SetDialogVariable( 'eventsched_country', cc );\n\t\t\t}\n\n\t\t\t       \n\n\t\t\tvar elStartDateLabel = elEvent.FindChildTraverse( 'id-eventsched__dates__start' );\n\t\t\tvar elEndDateLabel = elEvent.FindChildTraverse( 'id-eventsched__dates__end' );\n\t\t\tvar elDateHyphen = elEvent.FindChildTraverse( 'id-eventsched__dates__hyphen' );\n\n\t\t\tvar startMonthString;\n\t\t\tvar startDatePaddedDayNumber;\n\t\t\tvar startDayString;\n\n\t\t\tvar endMonthString;\n\t\t\tvar endDatePaddedDayNumber;\n\t\t\tvar endDayString;\n\n\n\n\t\t\tif ( startDate != undefined )\n\t\t\t{\n\t\t\t\tstartMonthString = $.Localize( '#SFUI_Date_Format_Month' + Number( startDate.getMonth() + 1 ) );\n\t\t\t\telStartDateLabel.SetDialogVariable( 'eventsched_date_month', startMonthString );\n\t\t\t\tstartDatePaddedDayNumber = ( '0' + ( startDate.getDate() ) ).slice( -2 );\n\t\t\t\tstartDayString = $.Localize( '#SFUI_Date_Format_DayOfMonth' + startDatePaddedDayNumber );\n\t\t\t\telStartDateLabel.SetDialogVariable( 'eventsched_date_day', startDayString );\n\t\t\t}\n\n\t\t\tif ( endDate != undefined )\n\t\t\t{\n\t\t\t\tendMonthString = $.Localize( '#SFUI_Date_Format_Month' + Number( endDate.getMonth() + 1 ) );\n\t\t\t\telEndDateLabel.SetDialogVariable( 'eventsched_date_month', endMonthString );\n\t\t\t\tendDatePaddedDayNumber = ( '0' + ( endDate.getDate() ) ).slice( -2 );\n\t\t\t\tendDayString = $.Localize( '#SFUI_Date_Format_DayOfMonth' + endDatePaddedDayNumber );\n\n\t\t\t\t                \n\t\t\t\tif ( endDayString == startDayString )\n\t\t\t\t{\n\t\t\t\t\telEndDateLabel.visible = false;\n\t\t\t\t\telDateHyphen.visible = false;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\telEndDateLabel.SetDialogVariable( 'eventsched_date_day', endDayString );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t                    \n\t\t\t\telEndDateLabel.visible = false;\n\t\t\t}\n\n\t\t\t                          \n\n\t\t\t                                                                     \n\t\t\t                                                                                      \n\t\t\t                                                                                  \n\n\n\t\t\t        \n\n\t\t\tvar arrTeams = oEvent[ 'teams' ];\n\n\t\t\tvar numKnownTeams = 0;\n\n\t\t\tvar elTeamMasterContainer = elEvent.FindChildTraverse( 'id-eventsched__teams' );\n\n\t\t\tvar TEAMS_PER_ROW = 16;\n\n\t\t\tif ( arrTeams )\n\t\t\t{\n\n\t\t\t\tnumKnownTeams = arrTeams.length;\n\n\t\t\t\tfor ( var idx in arrTeams )\n\t\t\t\t{\n\t\t\t\t\t\n\t\t\t\t\tvar nRow = Math.floor( idx / TEAMS_PER_ROW );\n\n\t\t\t\t\t                                         \n\t\t\t\t\tvar elTeamSubContainer = elEvent.FindChildTraverse( 'id-eventsched__teams__' + nRow );\n\t\t\t\t\tif ( !elTeamSubContainer || !elTeamSubContainer.IsValid() )\n\t\t\t\t\t{\n\t\t\t\t\t\telTeamSubContainer = $.CreatePanel( \"Panel\", elTeamMasterContainer, 'id-eventsched__teams__' + nRow );\n\t\t\t\t\t\telTeamSubContainer.AddClass( 'eventsched__teams' );\n\t\t\t\t\t}\n\n\t\t\t\t\tvar oTeam = arrTeams[ idx ];\n\n\t  \t\t\t\t                                                \n\n\t\t\t\t\t                                  \n\t\t\t\t\tvar elTeamButton = $.CreatePanel( \"Button\", elTeamSubContainer, 'button-' + oEvent[ 'event_id' ] + \"_\" + oTeam[ 'name' ] );\n\t\t\t\t\telTeamButton.AddClass( 'eventsched__teams__team__button' );\n\n\t\t\t\t\tvar elTeamLogo = $.CreatePanel( \"Image\", elTeamButton, oTeam[ 'name' ], {\n\t\t\t\t\t\tclampfractionalpixelpositions: 'false'\n\t\t\t\t\t} );\n\n\t\t\t\t\telTeamLogo.SetImage( oTeam[ 'logo_url' ] );\n\t\t\t\t\telTeamLogo.AddClass( 'eventsched__teams__teamlogo' );\n\t\t\t\t\t  \t                                    \n\n\t\t\t\t\t               \n\t\t\t\t\t  \n\t\t\t\t\t  \n\n\t\t\t\t\tvar parms = \"team_id=\" + oTeam[ 'name' ] +\n\t\t\t\t\t\t\"&team_name=\" + oTeam[ 'name' ] +\n\t\t\t\t\t\t\"&team_logo_url=\" + oTeam[ 'logo_url_large' ] +\n\t\t\t\t\t\t\"&team_url=\" + oTeam[ 'link' ];\n\n\t\t\t\t\tvar onTeamActivate_f = undefined;\n\t\t\t\t\tvar onTeamHoverOn_f = undefined;\n\t\t\t\t\tvar onTeamHoverOff_f = undefined;\n\t\t\t\t\tvar xmlsrc = undefined;\n\n\t\t\t\t\tif ( \"lineup\" in oTeam && Object.keys( oTeam[ 'lineup' ] ).length != 0 ) \n\t\t\t\t\t{\n\t\t\t\t\t\tvar bHaveAnyPhoto = false;\n\n\t\t\t\t\t\tfor ( var pIdx in oTeam[ 'lineup' ] )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvar oPlayer = oTeam[ 'lineup' ][ pIdx ];\n\n\t\t\t\t\t\t\tif ( 'profile_photo_url' in oPlayer && oPlayer[ 'profile_photo_url' ] !== \"\" )\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tparms += \"&player_photo\" + pIdx + \"=\" + oPlayer[ 'profile_photo_url' ];\n\t\t\t\t\t\t\t\tbHaveAnyPhoto = true;\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tparms += \"&player_photo\" + pIdx + \"=\" + \"file://{images}/icons/ui/pro_player.svg\";\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tparms += \"&player_name\" + pIdx + \"=\" + oPlayer[ 'nickname' ];\n\n\t\t\t\t\t\t\tif ( 'profile_url' in oPlayer )\n\t\t\t\t\t\t\t\tparms += \"&player_url\" + pIdx + \"=\" + oPlayer[ 'profile_url' ];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( bHaveAnyPhoto ) \n\t\t\t\t\t\t{\n\t\t\t\t\t\t\txmlsrc = 'file://{resources}/layout/context_menus/context_menu_eventsched_team.xml';\n\t\t\t\t\t\t\telTeamLogo.AddClass( 'eventsched__teams__teamlogo--plus' );\n\n\t\t\t\t\t\t\tfunction _OnTeamContextMenu ( xmlsrc, parms )\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tvar elTeamContextPanel = UiToolkitAPI.ShowCustomLayoutContextMenuParameters( '', '', xmlsrc, parms );\n\t\t\t\t\t\t\t\telTeamContextPanel.AddClass( \"ContextMenu_NoArrow\" );\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tonTeamActivate_f = _OnTeamContextMenu.bind( undefined, xmlsrc, parms );\n\t\t\t\t\t\t\telTeamButton.AddClass( 'has_data' );\n\t\t\t\t\t\t}\n\n                                                                                  \n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t                                    \n\t\t\t\t\t\t\t    \n\t\t\t\t\t\t\t   \t                                                          \n\t\t\t\t\t\t\t   \t                                                                                \n\t\t\t\t\t\t\t    \n\n\t\t\t\t\t\t\t                                                                    \n\n\t\t\t\t\t\t\tfunction OnSimpleContextMenu ( url )\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tvar items = [];\n\t\t\t\t\t\t\t\titems.push( {\n\t\t\t\t\t\t\t\t\tlabel: $.Localize( '#eventsched_team_link' ), jsCallback: function()\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tStoreAPI.RecordUIEvent( \"WatchEventSchedTeamLink\" );\n\t\t\t\t\t\t\t\t\t\topenUrl( url );\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t\t\tUiToolkitAPI.ShowSimpleContextMenu( '', 'externallink', items );\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( !onTeamActivate_f)\n\t\t\t\t\t\t\t\tonTeamActivate_f = OnSimpleContextMenu.bind( undefined, oTeam[ 'link' ] );\n\n\t\t\t\t\t\t\txmlsrc = 'file://{resources}/layout/tooltips/tooltip_eventsched_team_simple.xml';\n\n\t\t\t\t\t\t\tonTeamHoverOn_f = _OnMouseOverCustomLayoutTooltip.bind( undefined, elTeamButton.id, 'tt_' + elTeamButton.id, xmlsrc, parms );\n\t\t\t\t\t\t\tonTeamHoverOff_f = _OnMouseOutCustomLayoutTooltip.bind( undefined, 'tt_' + elTeamButton.id );\n\t\t\t\t\t\t}\n\n\n\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tfunction textTooltipOn ( panelId, text )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tUiToolkitAPI.ShowTextTooltip( panelId, text );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tonTeamHoverOn_f = textTooltipOn.bind( undefined, elTeamButton.id, oTeam[ 'name' ] );\n\t\t\t\t\t\tonTeamHoverOff_f = function() {UiToolkitAPI.HideTextTooltip()};\n\n\t\t\t\t\t\t                                    \n\t\t\t\t\t\t    \n\t\t\t\t\t\t   \t                                                          \n\t\t\t\t\t\t   \t                                                                                \n\t\t\t\t\t\t    \n\n\t\t\t\t\t\t                                                                    \n\n\t\t\t\t\t\tfunction OnSimpleContextMenu ( url )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvar items = [];\n\t\t\t\t\t\t\titems.push( {\n\t\t\t\t\t\t\t\tlabel: $.Localize( '#eventsched_team_link' ), jsCallback: function()\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tStoreAPI.RecordUIEvent( \"WatchEventSchedTeamLink\" );\n\t\t\t\t\t\t\t\t\topenUrl( url );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t\tUiToolkitAPI.ShowSimpleContextMenu( '', 'externallink', items );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tonTeamActivate_f = OnSimpleContextMenu.bind( undefined, oTeam[ 'link' ] );\n\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( onTeamHoverOn_f )\n\t\t\t\t\t\telTeamButton.SetPanelEvent( 'onmouseover', onTeamHoverOn_f );\n\n\t\t\t\t\tif ( onTeamHoverOff_f )\n\t\t\t\t\t\telTeamButton.SetPanelEvent( 'onmouseout', onTeamHoverOff_f );\n\n\t\t\t\t\tif ( onTeamActivate_f )\n\t\t\t\t\t\telTeamButton.SetPanelEvent( 'onactivate', onTeamActivate_f );\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t                                       \n\t\t\tif ( 'number_of_teams' in oEvent )\n\t\t\t{\n\t\t\t\tvar numOfTeams = Number( oEvent[ 'number_of_teams' ] );\n\n\t\t\t\tfor ( var idx = numKnownTeams; idx < numOfTeams; idx++ )\n\t\t\t\t{\n\t\t\t\t\tvar nRow = Math.floor( idx / TEAMS_PER_ROW );\n\n\t\t\t\t\tvar elTeamSubContainer = elEvent.FindChildTraverse( 'id-eventsched__teams__' + nRow );\n\t\t\t\t\tif ( !elTeamSubContainer || !elTeamSubContainer.IsValid() )\n\t\t\t\t\t{\n\t\t\t\t\t\telTeamSubContainer = $.CreatePanel( \"Panel\", elTeamMasterContainer, 'id-eventsched__teams__' + nRow );\n\t\t\t\t\t\telTeamSubContainer.AddClass( 'eventsched__teams' );\n\t\t\t\t\t}\n\n\t\t\t\t\tvar teamLogoId = 'id-eventsched__teams__' + oEvent[ 'event_id' ] + '_' + idx;\n\t\t\t\t\tvar elTeamLogo = $.CreatePanel( \"Image\", elTeamSubContainer, teamLogoId );\n\t\t\t\t\telTeamLogo.AddClass( 'eventsched__teams__teamlogo' );\n\t\t\t\t\telTeamLogo.AddClass( 'eventsched__teams__teamlogo--unknown' );\n\n\t\t\t\t\telTeamLogo.SetPanelEvent( 'onmouseover', _OnMouseOverTextTooltip.bind( undefined, elTeamLogo.id, $.Localize( \"#eventsched_tbd\" ) ) );\n\t\t\t\t\telTeamLogo.SetPanelEvent( 'onmouseout', _OnMouseOutTextTooltip );\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t\telMonthContainer.AddClass( \"eventsched-month-show\" );\n\t\t\t  \n\t\t\t                                   \n\t\t\t                                 \n\t\t\t \n\t\t\t\t                                                                     \n\t\t\t\t                                                                           \n\n\t\t\t\t                                                                                     \n\t\t\t\t                                                                                           \n\n\t\t\t\t                                                 \n\t\t\t\t \n\t\t\t\t\t           \n\t\t\t\t\t\t                                                     \n\t\t\t\t\t\t      \n\t\t\t\t\t\n\t\t\t\t\t              \n\t\t\t\t\t\t                                                  \n\t\t\t\t\t\t      \n\t\t\t\t \n\t\t\t \n\t\t\t  \n\n\t\t\t      \n\t\t\tif ( 'event_page_url' in oEvent )\n\t\t\t{\n\n\t\t\t\tvar url = oEvent[ 'event_page_url' ];\n\t\t\t\tvar elLinkBtn = elEvent.FindChildTraverse( \"id-eventsched__capsule__main__btn\" );\n\n\t\t\t\tfunction OnSimpleContextMenu ( url )\n\t\t\t\t{\n\t\t\t\t\tvar items = [];\n\t\t\t\t\titems.push( {\n\t\t\t\t\t\tlabel: $.Localize( '#eventsched_event_link' ), jsCallback: function()\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tStoreAPI.RecordUIEvent( \"WatchEventSchedEventLink\" );\n\t\t\t\t\t\t\topenUrl( url );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t\tUiToolkitAPI.ShowSimpleContextMenu( '', 'externallink', items );\n\t\t\t\t}\n\n\t\t\t\telLinkBtn.SetPanelEvent( 'onactivate', OnSimpleContextMenu.bind( undefined, url ) );\n\t\t\t}\n\n\t\t\t                  \n\t\t\tvar elFavoriteBtn = elEvent.FindChildTraverse( 'id-capsule__main__favorite' );\n\t\t\tif ( elFavoriteBtn && elFavoriteBtn.IsValid() )\n\t\t\t{\n\t\t\t\telFavoriteBtn.enabled = false;\n\n\t\t\t\tvar tooltipText = _m_IsPrime ? \"#eventsched_favorite_tooltip_prime\" : \"#eventsched_favorite_tooltip_not_prime\";\n\n\t\t\t\tvar onMouseOver = function( id, tooltipText ) {UiToolkitAPI.ShowTextTooltip( id, tooltipText );};\n\t\t\t\telFavoriteBtn.SetPanelEvent( 'onmouseover', onMouseOver.bind( undefined, oEvent[ 'event_id' ], tooltipText ) );\n\t\t\t\telFavoriteBtn.SetPanelEvent( 'onmouseout', function() {UiToolkitAPI.HideTextTooltip();} );\n\n\t\t\t\tif ( _m_arrFavorites )\n\t\t\t\t{\n\t\t\t\t\tvar onActivate = function( element, btn )\n\t\t\t\t\t{\n\t\t\t\t\t\t_DisplayAsFavorite( element, btn.IsSelected() );\n\n\t\t\t\t\t\tTournamentsAPI.SetTournamentFavorite( Number( element.m_event_id ), btn.IsSelected() );\n\n\t\t\t\t\t\tif ( btn.IsSelected() )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t_m_arrFavorites.push( Number( element.m_event_id ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvar idx = _m_arrFavorites.indexOf( Number( element.m_event_id ) );\n\t\t\t\t\t\t\tif ( idx !== -1 )\n\t\t\t\t\t\t\t\t_m_arrFavorites.splice( idx, 1 );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t$.DispatchEvent( 'CSGOPlaySoundEffect', 'UIPanorama.sidemenu_select', 'MOUSE' );\n\t\t\t\t\t}\n\n\t\t\t\t\telFavoriteBtn.SetPanelEvent( 'onactivate', onActivate.bind( undefined, elEvent, elFavoriteBtn ) );\n\n\t\t\t\t\telFavoriteBtn.enabled = _m_IsPrime;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t          \t\n\t\t\tif ( 'live_matches' in oEvent && oEvent[ 'live_matches' ].length > 0 )\n\t\t\t{\n\t\t\t\tvar elMatchContainer = elEvent.FindChildTraverse( 'id-eventsched__capsule-container__matches' );\n\t\t\t\telMatchContainer.RemoveClass( 'hidden' );\n\n\t\t\t\tfor ( var idx in oEvent[ 'live_matches' ] )\n\t\t\t\t{\n\t\t\t\t\tvar oMatch = oEvent[ 'live_matches' ][ idx ];\n\n\t\t\t\t\tvar elMatch = $.CreatePanel( \"Panel\", elMatchContainer, oMatch[ 'match_id' ] );\n\t\t\t\t\telMatch.BLoadLayout( 'file://{resources}/layout/watchmatchtile.xml', false, false );\n\t\t\t\t\telMatch.Data().isofficial = oEvent[ 'is_official'];\n\n\t\t\t\t\tfunction _GetTeam ( num )\n\t\t\t\t\t{\n\t\t\t\t\t\tvar arrTeams = oEvent[ 'teams' ];\n\n\t\t\t\t\t\tif ( !arrTeams )\n\t\t\t\t\t\t\treturn undefined;\n\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfor ( var idx in arrTeams )\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tvar oTeam = arrTeams[ idx ];\n\n\t\t\t\t\t\t\t\tvar matchTeamName = num == 1 ? 'team1_name' : 'team2_name';\n\n\t\t\t\t\t\t\t\tif ( oTeam[ 'name' ] == oMatch[ matchTeamName ] )\n\t\t\t\t\t\t\t\t\treturn oTeam;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t}\n\n\t\t\t\t\t                                    \n\t\t\t\t\t                                                                       \n\t\t\t\t}\n\t\t\t}\n\t\t\telse if ( isOngoing )\n\t\t\t{\n\t\t\t\tvar elMatchContainer = elEvent.FindChildTraverse( 'id-eventsched__capsule-container__matches' );\n\t\t\t\telMatchContainer.RemoveClass( 'hidden' );\n\n\t\t\t\tvar elNoLiveMatchNotice = elMatchContainer.FindChildTraverse( 'id-no-live-matches-notice' );\n\t\t\t\telNoLiveMatchNotice.RemoveClass( 'hidden' );\n\t\t\t}\n\n\t\t\tisOddEvent = !isOddEvent;\n\t\t}\n\n\t\t_UpdateAllFavorites();\n\t}\n\n\n\treturn {\n\t\tInit: _Init,\n\t\tRefresh: _EventsReceived,\n\n\t\t  \n\t\t                                                \n\t\t  \n\t};\n\n} )();\n\n( function()\n{\n\tmainmenu_watch_eventsched.Init();\n\n\n} )();","scripts/mainmenu_watch_tournament.js":"'use strict';\n\nvar mainmenu_watch_tournament = (function () {\n\n\tvar _m_activeTab;\n\tvar _m_bInitializedTournamentOnce = false;\n\tvar _m_matchesTab;\n\n\tvar _NavigateToTab = function( tab, tournament_id, oInitData = null )\n\t{\n\t\tif ( tab !== 'JsTournamentMatches' )\n\t\t{\n\t\t\tvar restrictions = LicenseUtil.GetCurrentLicenseRestrictions();\n\t\t\tif ( restrictions !== false )\n\t\t\t{\n\t\t\t\tLicenseUtil.ShowLicenseRestrictions( restrictions );\n\t\t\t\tif ( _m_matchesTab )\n\t\t\t\t{\n\t\t\t\t\t_m_matchesTab.checked = true;\n\t\t\t\t}\n\t\t\t\t_NavigateToTab( \"JsTournamentMatches\", tournament_id );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t                                                                 \n\t\tvar pressedTab = $.FindChildInContext( '#' + tab );\n\t\tif ( !pressedTab && oInitData )\n\t\t{\n\t\t\t                                                               \n\t\t\t                                                                   \n\t\t\t                                                                                            \n\n\t\t\tpressedTab = $.CreatePanel( 'Panel', $.FindChildInContext( '#JsTournamentContainer' ), tab );\n\t\t\t                                                      \n\n\t\t\tpressedTab.BLoadLayout('file://{resources}/layout/tournaments/pickem_' + oInitData.xmltype + '.xml', false, false );\n\t\t\tpressedTab.RegisterForReadyEvents( true );\n\t\t\tpressedTab.SetReadyForDisplay( false );\n\n\t\t\t                                                                      \n\t\t\tif ( typeof pressedTab._oPickemData !== 'object' )\n\t\t\t{\n\t\t\t\tpressedTab._oPickemData = {};\n\t\t\t}\n\n\t\t\tpressedTab._oPickemData.oInitData = oInitData;\n\t\t\tPickemCommon.Init( pressedTab );\n\t\t\t_AddEventHandlers( pressedTab );\n\t\t}\n\n\t\tif ( _m_activeTab !== pressedTab )\n\t\t{\n\t\t\tif ( _m_activeTab )\n\t\t\t{\n\t\t\t\t                                                                     \n\t\t\t\t                                                                                          \n\t\t\t\t                          \n\t\t\t\t                                   \n\t\t\t\t    \n\t\t\t\t   \t                                              \n\t\t\t\t    \n\t\t\t\t\n\t\t\t\t_m_activeTab.AddClass( 'tournament-content-container--hidden' );\n\t\t\t}\n\n\t\t\t_m_activeTab = pressedTab;\n\t\t\t_m_activeTab.RemoveClass( 'tournament-content-container--hidden' );\n\n\t\t\t_m_activeTab.visible = true;\n\t\t\t_m_activeTab.SetReadyForDisplay( true );\n\t\t}\n\n\t\tif ( _m_activeTab.id === \"JsTournamentMatches\" )\n\t\t{\n\t\t\t_RefreshMatchesTab(tournament_id );\n\t\t}\n\t};\n\n\tvar _RefreshMatchesTab = function( tournament_id )\n\t{\n\t\tmatchList.UpdateMatchList( _m_activeTab, tournament_id );\n\t};\n\n\tvar _RefreshActivePage = function( tournament_id )\n\t{\n\t\tif ( _m_activeTab.id === \"JsTournamentMatches\" )\n\t\t{\n\t\t\t_RefreshMatchesTab( tournament_id );\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tPickemCommon.RefreshData( _m_activeTab );\n\t}\n\n\tvar _AddEventHandlers = function( elPanel )\n\t{\n\t\t$.RegisterEventHandler( 'ReadyForDisplay', elPanel, PickemCommon.ReadyForDisplay.bind( undefined, elPanel ) );\n\t\t$.RegisterEventHandler( 'UnreadyForDisplay', elPanel, PickemCommon.UnregisterEvents.bind( undefined, elPanel )  );\n\n\t\t                                                                          \n\t\t                                                       \n\t\telPanel.OnPropertyTransitionEndEvent = function ( panelName, propertyName )\n\t\t{\n\t\t\tif( elPanel.id === panelName && propertyName === 'opacity' )\n\t\t\t{\n\t\t\t\t                                         \n\t\t\t\tif( elPanel.visible === true && elPanel.BIsTransparent() )\n\t\t\t\t{\n\t\t\t\t\t                                               \n\t\t\t\t\telPanel.visible = false;\n\t\t\t\t\telPanel.SetReadyForDisplay( false );\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false;\n\t\t};\n\n\t\t$.RegisterEventHandler( 'PropertyTransitionEnd', elPanel, elPanel.OnPropertyTransitionEndEvent );\n\t};\n\n\tfunction _UpdateMatchList( listId )\n\t{\n\t\tif ( _m_activeTab && ( _m_activeTab.tournament_id === listId ) )\n\t\t{\n\t\t\t_RefreshActivePage(listId);\n\t\t}\n\t}\n\n\t                        \n\tvar _PopulateTournamentNavBarButtons = function( tournament_id, elTournamentTab )\n\t{\n\t\tvar tournamentNumber = PickemCommon.GetTournamentIdNumFromString( tournament_id );\n\t\tvar navBarPanel = elTournamentTab.FindChildTraverse( 'content-navbar__tabs' );\n\n\t\tif ( !elTournamentTab.hasSetUpNavBar )\n\t\t{\n\n\t\t\tvar _CreateNavBarButton = function( buttonId, buttonTitle, targetTab, oInitData = null, isSelected = false )\n\t\t\t{\n\t\t\t\t                                                                                                 \n\t\t\t\t\n\t\t\t\tvar elButton = $.CreatePanel( 'RadioButton', navBarPanel, buttonId, {\n\t\t\t\t\tselected: isSelected,\n\t\t\t\t\tgroup: 'TournamentNavBar' + tournamentNumber\n\t\t\t\t} );\n\n\t\t\t\t$.CreatePanel( 'Label', elButton, '', {\n\t\t\t\t\ttext: buttonTitle,\n\t\t\t\t\thittest: false\n\t\t\t\t} );\n\n\t\t\t\telButton.SetPanelEvent( 'onactivate', _NavigateToTab.bind( undefined, targetTab, tournament_id, oInitData ) );\n\n\t\t\t\treturn elButton;\n\t\t\t};\n\n\t\t\tvar isCurrentTourament = ( tournamentNumber === g_ActiveTournamentInfo.eventid );\n\n\t\t\tvar restrictions = LicenseUtil.GetCurrentLicenseRestrictions();\n\t\t\tvar bDefaultToMatches = ( ( restrictions === false ) && isCurrentTourament ) ? false : true;\n\n\t\t\t                                                \n\t\t\t\n\t\t\t                           \n\t\t\tif ( tournamentNumber <= g_ActiveTournamentInfo.eventid && tournamentNumber >= 13 )\n\t\t\t{\n\t\t\t\t_CreateNavBarButton( \n\t\t\t\t\t'id-nav-pick-prelims', \n\t\t\t\t\t$.Localize( '#CSGO_Fantasy_PickEm_Qualifier_Title' ), \n\t\t\t\t\t'JsPickemPrelims', \n\t\t\t\t\t{\t\n\t\t\t\t\t\ttournamentid: tournament_id, \n\t\t\t\t\t\tsectionindex: 0, \n\t\t\t\t\t\txmltype: 'group',\n\t\t\t\t\t\toPickemType: PickEmGroup\n\t\t\t\t\t} ,\n\t\t\t\t\t!bDefaultToMatches\n\t\t\t\t);\n\t\t\t\t_CreateNavBarButton( 'id-nav-pick-group', $.Localize( '#CSGO_Fantasy_PickEm_Groups_Title' ), 'JsPickemGroup', \n\t\t\t\t\t{\t\n\t\t\t\t\t\ttournamentid: tournament_id, \n\t\t\t\t\t\tsectionindex: 1, \n\t\t\t\t\t\txmltype: 'group',\n\t\t\t\t\t\toPickemType: PickEmGroup\n\t\t\t\t\t},\n\t\t\t\t\t!bDefaultToMatches\n\t\t\t\t);\n\n\t\t\t\t_CreateNavBarButton( 'id-nav-pick-playoffs', $.Localize( '#CSGO_Fantasy_PickEm_Playoffs_Title' ), 'JsPickemPlayoffs', \n\t\t\t\t\t{\t\n\t\t\t\t\t\ttournamentid: tournament_id, \n\t\t\t\t\t\tsectionindex: 2, \n\t\t\t\t\t\txmltype: 'bracket',\n\t\t\t\t\t\toPickemType: PickEmBracket\n\t\t\t\t\t},\n\t\t\t\t\t!bDefaultToMatches\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif ( tournamentNumber === 12 )\n\t\t\t{\n\t\t\t\t_CreateNavBarButton( 'id-nav-pick-group', $.Localize( '#CSGO_Fantasy_PickEm_Groups_Title' ), 'JsPickemGroup', \n\t\t\t\t\t{\t\n\t\t\t\t\t\ttournamentid: tournament_id, \n\t\t\t\t\t\tsectionindex: 0, \n\t\t\t\t\t\txmltype: 'group',\n\t\t\t\t\t\toPickemType: PickEmGroup\n\t\t\t\t\t},\n\t\t\t\t\t!bDefaultToMatches\n\t\t\t\t);\n\n\t\t\t\t_CreateNavBarButton( 'id-nav-pick-playoffs', $.Localize( '#CSGO_Fantasy_PickEm_Playoffs_Title' ), 'JsPickemPlayoffs', \n\t\t\t\t\t{\t\n\t\t\t\t\t\ttournamentid: tournament_id, \n\t\t\t\t\t\tsectionindex: 1, \n\t\t\t\t\t\txmltype: 'bracket',\n\t\t\t\t\t\toPickemType: PickEmBracket\n\t\t\t\t\t},\n\t\t\t\t\t!bDefaultToMatches\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t         \n\t\t\t_m_matchesTab = _CreateNavBarButton( 'id-nav-matches', $.Localize( '#CSGO_Watch_Tournament_Matches_T2' ), 'JsTournamentMatches', null, bDefaultToMatches );\n\n\n\t\t\t                                \n\t\t\t                                                            \n\t\t\t    \n\t\t\t   \t                                                                                                                     \n\t\t\t   \t\t \t\n\t\t\t   \t\t\t                             \n\t\t\t   \t\t\t                 \n\t\t\t   \t\t\t                   \n\t\t\t   \t\t\t                        \n\t\t\t   \t\t    \n\t\t\t   \t                                                                                                              \n\t\t\t   \t\t \t\n\t\t\t   \t\t\t                             \n\t\t\t   \t\t\t                 \n\t\t\t   \t\t\t                 \n\t\t\t   \t\t\t                        \n\t\t\t   \t\t    \n\t\t\t    \n\n\t\t\t          \n\t\t\t             \n\t\t\t                                                      \n\t\t\t \n\t\t\t\t                                                                                                   \n\t\t\t \n\n\t\t\t              \n\t\t\t                                                      \n\t\t\t \n\t\t\t\t                                                                                                            \n\t\t\t \n\n\t\t\t          \n\t\t\telTournamentTab.hasSetUpNavBar = true;\n\t\t}\n\t};\n\n\t                                                                \n\tvar _InitializeTournamentsPage = function( tournament_id )\n\t{\n\t\t                                                                                                                            \n\t\tif ( _m_bInitializedTournamentOnce )\n\t\t\treturn;\n\n        var elParentPanel = _GetParentPanel(tournament_id);\n        if ( !elParentPanel )\n            return;\n\n\t\t_m_bInitializedTournamentOnce = true;\n\t\telParentPanel.SetDialogVariable( 'tournament_name', $.Localize( \"#CSGO_Tournament_Event_Name_\" + tournament_id.split( ':' )[ 1 ] ) );\n\t\t\t\n\t\t                                                                                                      \n\t\telParentPanel.FindChildInLayoutFile( \"id-tournament-title-bar\" ).visible = elParentPanel.id !== 'JsActiveTournament';\n\n\t\t_PopulateTournamentNavBarButtons( tournament_id, elParentPanel );\n\t\telParentPanel.FindChildInLayoutFile( \"JsTournamentMatches\" ).tournament_id = tournament_id;\n\t\telParentPanel.isInitialized = true;\n\t\t\t\n\t\tvar tournamentNumber = PickemCommon.GetTournamentIdNumFromString( tournament_id );\n\t\tvar isCurrentTourament = ( tournamentNumber === g_ActiveTournamentInfo.eventid );\n\n\t\tvar navBarPanel = elParentPanel.FindChildTraverse( 'content-navbar__tabs' );\n\n\t\tif ( isCurrentTourament )\n\t\t{\n\t\t\tvar tabIdToActivate = 'id-nav-pick-prelims';\n\n\t\t\t$.DispatchEvent( \"Activated\", navBarPanel.FindChildInLayoutFile( tabIdToActivate ), \"mouse\" );\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$.DispatchEvent( \"Activated\", navBarPanel.FindChildInLayoutFile( 'id-nav-matches' ), \"mouse\" );\n\t\t}\n\n\t\t_SetUpTournamentInfoLink( elParentPanel, tournament_id );\n\t\t_SetUpTournamentControlRoom( elParentPanel, tournament_id );\n\t\t_SetStyleOverridesForTournament( elParentPanel, tournamentNumber )\n\t};\n\n\tvar _SetStyleOverridesForTournament = function( elParentPanel, tournamentNumber )\n\t{\n\t\tif ( tournamentNumber >= 15 )\n\t\t{\n\t\t\t                                                                           \n\t\t\telParentPanel.AddClass( 'tournament-has-challenges' );\n\t\t}\n\t};\n\n\tvar _GetParentPanel = function( tournament_id )\n\t{\n\t\t                                           \n\t\t                                               \n\t\t\n\t\tvar elParent =  $( '#tournament_content_' + tournament_id );\n\t\tif ( elParent )\n\t\t{\n\t\t\treturn elParent;\n\t\t}\n\n\t\telParent =  $( '#JsActiveTournament' );\n\t\tif ( elParent )\n\t\t{\n\t\t\treturn elParent;\n\t\t}\n\t};\n\n\tvar _SetUpTournamentInfoLink = function( elPanel, tournament_id )\n    {\n        var elLink = elPanel.FindChildInLayoutFile( 'JsTournamentInfoLink' );\n\t\tvar olinks = {\n\t\t\t26: \"https://store.steampowered.com/sale/csmajorcologne2026\",\n\t\t\t25: \"https://store.steampowered.com/sale/csmajorbud2025\",\n\t\t\t24: \"https://store.steampowered.com/sale/csmajoraus2025\",\n\t\t\t23: \"https://store.steampowered.com/sale/csmajorsha2024\",\n\t\t\t22: \"https://store.steampowered.com/sale/csmajorcph2024\",\n\t\t\t21: \"https://store.steampowered.com/sale/csgoparis2023\",\n\t\t\t20: \"https://store.steampowered.com/sale/csgorio2022\",\n\t\t\t19: \"https://store.steampowered.com/sale/csgomajorantwerp2022\",\n\t\t\t18: \"https://store.steampowered.com/sale/csgostockholm\",\n\t\t\t16: \"https://csgomajor.starladder.com/\",\n\t\t\t15: \"https://www.intelextrememasters.com/season-13/katowice/schedule/\",\n            14: \"https://www.faceitmajor.com/\",\n            13: \"http://www.eleague.com/major-2018\",\n            12: \"https://major.pglesports.com/\"\n        };\n\n        var tournamentNum = PickemCommon.GetTournamentIdNumFromString( tournament_id );\n\n\t\tif ( olinks.hasOwnProperty( tournamentNum ) )\n\t\t{\n\t\t\tvar link = olinks[ tournamentNum ];\n\t\t\t\n\t\t\telLink.SetPanelEvent( 'onactivate', function() { SteamOverlayAPI.OpenURL( link ); } );\n            return;\n        }\n\n        elLink.visible = false;\n\t};\n\t\n\tvar _SetUpTournamentControlRoom = function( elPanel, tournament_id )\n    {\n        var elBtn = elPanel.FindChildInLayoutFile( 'JsTournamentOperatorBtn' );\n\t\tvar tournamentNum = PickemCommon.GetTournamentIdNumFromString( tournament_id );\n\t\tvar bCanControl = false;\n\t\tif ( MyPersonaAPI.GetMyOfficialTournamentName() &&                                                       \n\t\t\ttournamentNum === NewsAPI.GetActiveTournamentEventID() )\n\t\t{\n\t\t\tbCanControl = true;\n\t\t\telBtn.SetPanelEvent( 'onactivate', function() {\n\t\t\t\tUiToolkitAPI.ShowCustomLayoutPopupParameters(\n\t\t\t\t\t'',\n\t\t\t\t\t'file://{resources}/layout/popups/popup_tournament_controlroom.xml',\n\t\t\t\t\t'type=matches' +\n\t\t\t\t\t'&' + 'eventid=' + tournament_id +\n\t\t\t\t\t'&' + 'titleoverride=#Control',\n\t\t\t\t\t'none'\n\t\t\t\t);\n\t\t\t} );\n\t\t}\n\t\telBtn.SetHasClass( 'hidden', !bCanControl );\n    };\n\n\t                                                       \n\tvar _CloseSubMenu = function()\n\t{\n\t\t$.DispatchEvent( 'CloseSubMenuContent' );\n\t};\n\n\tfunction _Refresh( tabid )\n\t{\n\t\tif ( tabid === 'JsWatch' )\n\t\t{\n\t\t\tif ( _m_activeTab )\n\t\t\t{\n\t\t\t\tif ( _m_activeTab.activeMatchInfoPanel )\n\t\t\t\t{\n\t\t\t\t\tmatchList.ReselectActiveTile( _m_activeTab );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tvar _RefreshBtnPress = function ()\n\t{\n\t\t_RefreshActivePage( _m_activeTab.tournament_id );\n\t};\n\n\n\tfunction _Init()\n\t{\n\t\t_m_activeTab = undefined;\n\t\t$.RegisterEventHandler( \"InitializeTournamentsPage\", $.GetContextPanel(), _InitializeTournamentsPage );\n\t\t$.RegisterForUnhandledEvent( \"RefreshPickemPage\", _RefreshActivePage );\n\t\t$.RegisterForUnhandledEvent( \"PanoramaComponent_MatchList_StateChange\", _UpdateMatchList );\n\t\t$.RegisterForUnhandledEvent( \"MainMenuTabShown\", _Refresh );\n\t}\n\n\treturn {\n\t\tCloseSubMenu: _CloseSubMenu,\n\t\tNavigateToTab: _NavigateToTab,\n\t\tInit: _Init,\n\t\tRefreshActivePage: _RefreshActivePage,\n\t\tRefreshBtnPress: _RefreshBtnPress\n\t};\n\n})();\n\n(function()\n{\n\tmainmenu_watch_tournament.Init();\n})();","scripts/mainmenu_xpshop_tile.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"common/licenseutil.ts\" />\n/// <reference path=\"common/icon.ts\" />\n/// <reference path=\"common/iteminfo.ts\" />\n/// <reference path=\"common/store_items.ts\" />\n/// <reference path=\"popups/popup_acknowledge_item.ts\" />\n/// <reference path=\"xpshop_track.ts\" />\n/// <reference path=\"itemtile_store.ts\" />\n/// <reference path=\"xpshop.ts\" />\nvar MainMenuXpShop;\n(function (MainMenuXpShop) {\n    const _m_XpShopPanel = $.GetContextPanel();\n    const m_passDefName = 'XpShopTicket1';\n    const m_passId = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(InventoryAPI.GetItemDefinitionIndexFromDefinitionName(m_passDefName), 0);\n    let m_displayStarted = false;\n    let m_nTrack;\n    let m_scheduleHandleRepeatCollage = null;\n    function _Init() {\n        if (!_ShouldShow()) {\n            return;\n        }\n        $.GetContextPanel().FindChildInLayoutFile('id-btn-open-xpshop').SetPanelEvent('onactivate', () => {\n            $.DispatchEvent('MainMenuGoToStore', 'id-store-nav-xpshop');\n        });\n        _GetXpShopItems();\n    }\n    function _GetXpShopItems() {\n        m_nTrack = MissionsAPI.GetSeasonalOperationXpShopIndex();\n        if (!m_nTrack || m_nTrack === 0) {\n            _m_XpShopPanel.SetHasClass('hidden', true);\n            return;\n        }\n        _SetUpTracks();\n        if (!m_displayStarted) {\n            _MakeStoreItemTiles(_GetItemsForDisplay());\n            m_displayStarted = true;\n        }\n        _m_XpShopPanel.SetHasClass('hidden', false);\n    }\n    function _ShouldShow() {\n        if (!MyPersonaAPI.IsConnectedToGC()) {\n            _m_XpShopPanel.SetHasClass('hidden', true);\n            return false;\n        }\n        let restrictions = LicenseUtil.GetCurrentLicenseRestrictions();\n        if (restrictions) {\n            _m_XpShopPanel.SetHasClass('hidden', true);\n            return false;\n        }\n        return true;\n    }\n    function _SetUpTracks() {\n        let bHasPrime = FriendsListAPI.GetFriendPrimeEligible(MyPersonaAPI.GetXuid());\n        AcknowledgeItems.GetItemsByType([m_passDefName], true);\n        InventoryAPI.SetInventorySortAndFilters('inv_sort_age', false, 'item_definition:' + m_passDefName, '', '');\n        let nPass = bHasPrime ? InventoryAPI.GetInventoryCount() : 0;\n        let passIndex = 0;\n        let oXpShopTrackProgress = InventoryAPI.GetCacheTypeElementJSOByIndex('XpShop', 0);\n        const elTracksContainer = $.GetContextPanel().FindChildInLayoutFile('id-tracks-container');\n        const elBalance = $.GetContextPanel().FindChildInLayoutFile('id-balance');\n        const elUpsell = $.GetContextPanel().FindChildInLayoutFile('id-upsell');\n        const elTitle = $.GetContextPanel().FindChildInLayoutFile('id-xpshop-title');\n        elTracksContainer.SetDialogVariableInt('max-stars', StoreAPI.GetXpShopMaxTrackLevel());\n        const bHasXpShopTracksOrBalance = oXpShopTrackProgress && (oXpShopTrackProgress.xp_tracks.length > 0 || oXpShopTrackProgress.redeemable_balance > 0);\n        if (nPass > 0 || bHasXpShopTracksOrBalance) {\n            elTracksContainer.visible = true;\n            elTitle.visible = true;\n            elBalance.visible = false;\n            elUpsell.visible = false;\n            let numVisiblePassesOrTracks = 0;\n            let elParent = $.GetContextPanel().FindChildInLayoutFile('id-tracks');\n            for (let i = 0; i < StoreAPI.GetXpShopMaxTracks(); i++) {\n                let elTrack = elParent.FindChildInLayoutFile('id-xpshop_track_' + i);\n                if (!elTrack) {\n                    elTrack = $.CreatePanel('Panel', elParent, 'id-xpshop_track_' + i);\n                    elTrack.BLoadLayoutSnippet('mainmenu-shop-ticket');\n                    elTrack.FindChildInLayoutFile('id-mainmenu-xpshop-track-progress').BLoadLayout('file://{resources}/layout/xpshop_track.xml', false, false);\n                }\n                let elTrackProgress = elTrack.FindChildInLayoutFile('id-mainmenu-xpshop-track-progress');\n                let elPass = elTrack.FindChildInLayoutFile('id-mainmenu-xpshop-pass');\n                let oSettings;\n                if (oXpShopTrackProgress && oXpShopTrackProgress.xp_tracks[i]) {\n                    oSettings = {\n                        xpshop_track_frame_panel: elTrack,\n                        xpshop_track_value: parseInt(oXpShopTrackProgress.xp_tracks[i]),\n                    };\n                    XpShopTrack.XpShopInit(oSettings);\n                    elTrack.visible = true;\n                    elTrackProgress.visible = true;\n                    elPass.visible = false;\n                    ++numVisiblePassesOrTracks;\n                }\n                else if (nPass > 0 && passIndex < nPass) {\n                    passIndex++;\n                    oSettings = {\n                        xpshop_track_frame_panel: elTrack,\n                        xpshop_track_value: 0,\n                    };\n                    XpShopTrack.XpShopInit(oSettings);\n                    elTrackProgress.visible = false;\n                    elPass.visible = true;\n                    elPass.SetHasClass('small-passes', nPass > 2 ? true : false);\n                    elTrack.visible = true;\n                    ++numVisiblePassesOrTracks;\n                }\n                else {\n                    elTrack.visible = false;\n                }\n            }\n            if (oXpShopTrackProgress && oXpShopTrackProgress.redeemable_balance !== undefined) {\n                elBalance.SetDialogVariableInt('redeemable-points', oXpShopTrackProgress.redeemable_balance);\n                elBalance.Data().balance = oXpShopTrackProgress.redeemable_balance;\n                elBalance.visible = true;\n            }\n            if (!numVisiblePassesOrTracks) {\n                elUpsell.visible = true;\n                elTracksContainer.visible = false;\n            }\n        }\n        else {\n            elTracksContainer.visible = false;\n            elBalance.visible = false;\n            elUpsell.visible = true;\n            elTitle.visible = false;\n            elUpsell.FindChildInLayoutFile('id-upsell-pass-image').itemid = m_passId;\n        }\n    }\n    let m_tilePreviouslyUpdated = null;\n    function _GetItemsForDisplay() {\n        let nCount = MissionsAPI.GetSeasonalOperationRedeemableGoodsCount(m_nTrack);\n        let aXpShopItems = [];\n        let nNewItemCount = 0;\n        if (nCount < 1) {\n            return [];\n        }\n        for (let i = 0; i < nCount; i++) {\n            const ShopEntry = {\n                item_name: MissionsAPI.GetSeasonalOperationRedeemableGoodsSchema(m_nTrack, i, 'item_name'),\n                lootlist: [],\n                ui_show_new_tag: MissionsAPI.GetSeasonalOperationRedeemableGoodsSchema(m_nTrack, i, 'ui_show_new_tag')\n            };\n            const isNew = XpShop.ShouldShowNewTagForShopEntry(ShopEntry);\n            nNewItemCount = isNew ? nNewItemCount++ : nNewItemCount;\n            _GetLootListForReward(ShopEntry.item_name).forEach(itemId => {\n                aXpShopItems.push({\n                    item_name: InventoryAPI.GetItemName(itemId),\n                    itemId: itemId,\n                    ui_show_new_tag: isNew\n                });\n            });\n        }\n        const newItems = aXpShopItems.filter(item => item.ui_show_new_tag);\n        const oldItems = aXpShopItems.filter(item => !item.ui_show_new_tag);\n        const numItemsInCarousel = 12;\n        let aShuffleItems = [];\n        if (newItems.length > 0) {\n            const nMaxNewItems = Math.round(.6 * numItemsInCarousel);\n            const sampleSize = Math.min(newItems.length, nMaxNewItems);\n            aShuffleItems = _GetRandomSample([..._GetRandomSample(newItems, sampleSize), ..._GetRandomSample(oldItems, numItemsInCarousel - sampleSize)], numItemsInCarousel);\n            aShuffleItems.sort((a, b) => {\n                if (a.ui_show_new_tag && !b.ui_show_new_tag)\n                    return -1;\n                if (!a.ui_show_new_tag && b.ui_show_new_tag)\n                    return 1;\n                return 0;\n            });\n        }\n        else {\n            aShuffleItems = _GetRandomSample(oldItems, numItemsInCarousel);\n        }\n        return aShuffleItems;\n    }\n    function _GetRandomSample(items, sampleSize = 10) {\n        const size = Math.min(sampleSize, items.length);\n        const copy = [...items];\n        for (let i = 0; i < size; i++) {\n            const randomIndex = i + Math.floor(Math.random() * (copy.length - i));\n            [copy[i], copy[randomIndex]] = [copy[randomIndex], copy[i]];\n        }\n        return copy.slice(0, size);\n    }\n    function _GetLootListForReward(rewardId) {\n        if (rewardId.startsWith('crate_')) {\n            let nDefinitionIndex = InventoryAPI.GetItemDefinitionIndexFromDefinitionName(rewardId);\n            let idCrate = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(nDefinitionIndex, 0);\n            return [idCrate];\n        }\n        var count = InventoryAPI.GetLootListItemsCount(rewardId);\n        var itemsList = [];\n        if (!count) {\n            itemsList.push(rewardId);\n        }\n        else {\n            for (var i = 0; i < count; i++) {\n                var itemId = InventoryAPI.GetLootListItemIdByIndex(rewardId, i);\n                itemsList.push(itemId);\n            }\n        }\n        return itemsList;\n    }\n    ;\n    function _MakeStoreItemTiles(aItemsList) {\n        let elParent = $.GetContextPanel().FindChildInLayoutFile('id-mainmenu-xpshop-carousel');\n        for (let i = 0; i < aItemsList.length; i++) {\n            let elTile = elParent.FindChildInLayoutFile('id-mainmenu-xpshop-store-tile' + aItemsList[i].itemId);\n            if (!elTile) {\n                elTile = $.CreatePanel('Panel', elParent, 'id-mainmenu-xpshop-store-tile' + aItemsList[i].itemId);\n                elTile.BLoadLayoutSnippet('mainmenu-xpshop-itemtile');\n                elTile.FindChildInLayoutFile('id-item-image').itemid = aItemsList[i].itemId;\n                const setName = ItemInfo.GetSet(aItemsList[i].itemId);\n                const SetImage = elTile.FindChildInLayoutFile('id-item-set-image');\n                IconUtil.SetupFallbackItemSetIcon(SetImage, setName);\n                IconUtil.SetItemSetSVGImage(SetImage, setName);\n            }\n            elTile.SetHasClass('new', aItemsList[i].ui_show_new_tag);\n        }\n    }\n    function _UpdateTile() {\n        if (GameStateAPI.IsLocalPlayerPlayingMatch() || !_ShouldShow()) {\n            return;\n        }\n        _GetXpShopItems();\n    }\n    {\n        _Init();\n        $.RegisterForUnhandledEvent('PanoramaComponent_MyPersona_GcLogonNotificationReceived', _Init);\n        $.RegisterForUnhandledEvent('PanoramaComponent_MyPersona_UpdateConnectionToGC', _Init);\n        $.RegisterForUnhandledEvent('PanoramaComponent_Store_PriceSheetChanged', _Init);\n        $.RegisterForUnhandledEvent('PanoramaComponent_MyPersona_InventoryUpdated', _UpdateTile);\n        $.RegisterForUnhandledEvent('CSGOShowMainMenu', _UpdateTile);\n    }\n})(MainMenuXpShop || (MainMenuXpShop = {}));\n","scripts/mapdraft.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"avatar.ts\" />\nvar MapDraft;\n(function (MapDraft) {\n    const _m_cp = $.GetContextPanel();\n    let _m_nPhase = 0;\n    let _m_hDenyInputToGame = null;\n    let _m_isThisPhasePick = false;\n    const _m_phaseTitleText = _m_cp.FindChildInLayoutFile('id-map-draft-phase-info');\n    const _m_rowsContainer = _m_cp.FindChildInLayoutFile('id-map-draft-phase-rows');\n    const _m_rowPhaseName = 'id-map-draft-phase-buttons-container';\n    const _m_nT = 2;\n    const _m_nCt = 3;\n    let _m_msLastSoundTimestamp = (new Date()).getTime();\n    function _PlaySoundEffect(strSoundEffect, msThrottleRequired = 0) {\n        const msTimestampNow = (new Date()).getTime();\n        if (msThrottleRequired && (msThrottleRequired > 0)) {\n            if (msTimestampNow - _m_msLastSoundTimestamp < msThrottleRequired)\n                return;\n        }\n        $.DispatchEvent('CSGOPlaySoundEffect', strSoundEffect, 'MOUSE');\n        _m_msLastSoundTimestamp = msTimestampNow;\n    }\n    function _Update() {\n        let sGameUiState = GameStateAPI.GetCSGOGameUIStateName();\n        let bThisPanelIsVisible = true;\n        if (sGameUiState === 'CSGO_GAME_UI_STATE_LOADINGSCREEN' || MatchDraftAPI.GetDraft() !== 'ingame' || MatchDraftAPI.GetIngamePhase() < 1) {\n            bThisPanelIsVisible = false;\n        }\n        _m_cp.visible = bThisPanelIsVisible;\n        _m_cp.SetHasClass('map-draft--show', bThisPanelIsVisible);\n        let bMouseCaptureActive = _m_hDenyInputToGame ? true : false;\n        if (bMouseCaptureActive != bThisPanelIsVisible) {\n            if (bThisPanelIsVisible) {\n                _m_hDenyInputToGame = UiToolkitAPI.AddDenyInputFlagsToGame(_m_cp, \"MapDraft\", \"ShareMouse\");\n                _PopulatePlayerList();\n            }\n            else {\n                UiToolkitAPI.ReleaseDenyInputFlagsToGame(_m_hDenyInputToGame);\n                _m_hDenyInputToGame = null;\n            }\n        }\n        if (!bThisPanelIsVisible) {\n            _m_rowsContainer.RemoveAndDeleteChildren();\n            return;\n        }\n        _m_cp.visible = true;\n        _m_cp.SetHasClass('map-draft--show', true);\n        if (MatchDraftAPI.GetIngamePhase() != _m_nPhase) {\n            _PlaySoundEffect('tab_mainmenu_watch');\n        }\n        else {\n            const ingameTeamToActNow = MatchDraftAPI.GetIngameTeamToActNow();\n            if (ingameTeamToActNow && (ingameTeamToActNow == GameStateAPI.GetPlayerTeamNumber(MyPersonaAPI.GetXuid()))) {\n                _PlaySoundEffect('UIPanorama.mainmenu_rollover', 400);\n            }\n        }\n        _m_nPhase = MatchDraftAPI.GetIngamePhase();\n        if (_m_nPhase > 6) {\n            _m_nPhase = 6;\n        }\n        _HideFinishedPhaseRows();\n        _MakeVoteButtons(_UpdateButtonsRow());\n        _UpdateActionText();\n        _UpdatePhaseProgressBar();\n    }\n    function _UpdatePhaseProgressBar() {\n        const aChildren = _m_cp.FindChildInLayoutFile('id-map-draft-phasebar-container').Children();\n        for (let phase of aChildren) {\n            const nPhaseBarIndex = parseInt(phase.GetAttributeString('data-phase', ''));\n            phase.SetHasClass('map-draft-phasebar--ban', !_m_isThisPhasePick && nPhaseBarIndex === _m_nPhase);\n            phase.SetHasClass('map-draft-phasebar--pick', _m_isThisPhasePick && nPhaseBarIndex === _m_nPhase);\n            phase.SetHasClass('map-draft-phasebar--pre', nPhaseBarIndex > _m_nPhase);\n            phase.SetHasClass('map-draft-phasebar--post', nPhaseBarIndex < _m_nPhase);\n            phase.FindChildInLayoutFile('id-map-draft-phase-name').text = $.Localize('#matchdraft_phase_' + nPhaseBarIndex);\n            if (nPhaseBarIndex === _m_nPhase) {\n                const nTimeRemaining = MatchDraftAPI.GetIngamePhaseSecondsRemaining() || 0;\n                phase.FindChildInLayoutFile('id-map-draft-phase-timer').timeleft = nTimeRemaining;\n            }\n        }\n    }\n    function _UpdateButtonsRow() {\n        let elContainer = _m_rowsContainer.FindChildInLayoutFile(_m_rowPhaseName + _m_nPhase);\n        if (!elContainer) {\n            elContainer = $.CreatePanel('Panel', _m_rowsContainer, _m_rowPhaseName + _m_nPhase);\n            elContainer.AddClass('map-draft-phase-buttons-container');\n            elContainer.AddClass('map-draft-phase-buttons-container--show');\n            elContainer.Data().phase = _m_nPhase;\n        }\n        elContainer.SetHasClass('map-draft-phase-buttons-container--show', true);\n        elContainer.SetHasClass('map-draft-phase-buttons-container--hide', false);\n        elContainer.hittest = true;\n        elContainer.hittestchildren = true;\n        return elContainer;\n    }\n    function _HideFinishedPhaseRows() {\n        const aRows = _m_rowsContainer.Children();\n        for (let row of aRows) {\n            if (row.Data().phase !== _m_nPhase) {\n                row.RemoveClass('map-draft-phase-buttons-container--show');\n                row.AddClass('map-draft-phase-buttons-container--hide');\n                row.hittest = false;\n                row.hittestchildren = false;\n            }\n        }\n    }\n    function _MakeVoteButtons(elContainer) {\n        if (_m_nPhase === 1) {\n            _m_isThisPhasePick = true;\n            const nYourTeam = GameStateAPI.GetPlayerTeamNumber(MyPersonaAPI.GetXuid());\n            const nOtherTeam = nYourTeam === _m_nT ? _m_nCt : _m_nT;\n            _MakeButton(elContainer, {\n                id: 'id-phase-1-btn-ban-first',\n                image: 'url(\"file://{images}/mapdraft/ban_first.png\")',\n                selectorimg: \"file://{images}/mapdraft/green_check.png\",\n                name: \"#matchdraft_vote_ban_first\",\n                statustext: '#matchdraft_vote_status_pick',\n                ispick: _m_isThisPhasePick,\n                voteid: nYourTeam\n            });\n            _MakeButton(elContainer, {\n                id: 'id-phase-1-btn-pick-side',\n                image: 'url(\"file://{images}/mapdraft/pick_team.png\")',\n                selectorimg: \"file://{images}/mapdraft/green_check.png\",\n                name: \"#matchdraft_vote_pick_team\",\n                statustext: '#matchdraft_vote_status_pick',\n                ispick: _m_isThisPhasePick,\n                voteid: nOtherTeam\n            });\n        }\n        else if (_m_nPhase === 5) {\n            _m_isThisPhasePick = true;\n            _MakeButton(elContainer, {\n                id: 'id-phase-5-btn-start-ct',\n                image: 'url(\"file://{images}/mapdraft/pick_ct.png\")',\n                selectorimg: \"file://{images}/mapdraft/green_check.png\",\n                name: \"#CSGO_Inventory_Team_CT\",\n                statustext: '#matchdraft_vote_status_pick',\n                ispick: _m_isThisPhasePick,\n                voteid: _m_nCt\n            });\n            _MakeLargeMap(elContainer);\n            _MakeButton(elContainer, {\n                id: 'id-phase-5-btn-start-t',\n                image: 'url(\"file://{images}/mapdraft/pick_t.png\")',\n                selectorimg: \"file://{images}/mapdraft/green_check.png\",\n                name: \"#CSGO_Inventory_Team_T\",\n                statustext: '#matchdraft_vote_status_pick',\n                ispick: _m_isThisPhasePick,\n                voteid: _m_nT\n            });\n        }\n        else if (_m_nPhase === 6) {\n            _MakeLargeMap(elContainer, 'map-draft-phase-pick-map-image--large');\n        }\n        else if (_m_nPhase < 5) {\n            _m_isThisPhasePick = false;\n            const aVoteIds = MatchDraftAPI.GetIngameMapIdsList().split(',');\n            for (let i = 0; i < aVoteIds.length; i++) {\n                const nVoteId = parseInt(aVoteIds[i]);\n                const mapName = DeepStatsAPI.MapIDToString(nVoteId);\n                if (_m_nPhase !== 4 ||\n                    (_m_nPhase === 4 && MatchDraftAPI.GetIngameTeamToActNow() !== GameStateAPI.GetPlayerTeamNumber(MyPersonaAPI.GetXuid())) ||\n                    (_m_nPhase === 4 && MatchDraftAPI.GetIngameTeamToActNow() === GameStateAPI.GetPlayerTeamNumber(MyPersonaAPI.GetXuid()) &&\n                        MatchDraftAPI.GetIngameMapIdState(nVoteId) !== 'veto')) {\n                    _MakeButton(elContainer, {\n                        id: 'id-phase-' + _m_nPhase + '-btn-' + aVoteIds[i],\n                        image: 'url(\"file://{images}/map_icons/screenshots/360p/' + mapName + '.png\")',\n                        selectorimg: \"file://{images}/mapdraft/red_x.png\",\n                        name: '#SFUI_Map_' + mapName,\n                        statustext: '#matchdraft_vote_status_ban',\n                        ispick: _m_isThisPhasePick,\n                        mapstatus: MatchDraftAPI.GetIngameMapIdState(nVoteId),\n                        voteid: nVoteId\n                    });\n                }\n            }\n        }\n    }\n    function _MakeButton(elContainer, oBtnData) {\n        let elButton = elContainer.FindChildInLayoutFile(oBtnData.id);\n        if (!elButton) {\n            elButton = $.CreatePanel('Button', elContainer, oBtnData.id);\n            elButton.BLoadLayoutSnippet('ButtonMapTile');\n            const bgImage = elButton.FindChildInLayoutFile('draft-phase-button-image');\n            bgImage.style.backgroundImage = oBtnData.image;\n            bgImage.style.backgroundPosition = '50% 0%';\n            bgImage.style.backgroundSize = 'auto 100%';\n            elButton.FindChildInLayoutFile('draft-phase-button-selectorimg').SetImage(oBtnData.selectorimg);\n            elButton.SetDialogVariable('mapname', $.Localize(oBtnData.name));\n            const elStatusText = elButton.FindChildInLayoutFile('draft-phase-button-statustext');\n            elStatusText.text = $.Localize(oBtnData.statustext);\n            elButton.SetPanelEvent('onactivate', () => _OnActivateVoteTile(elContainer, oBtnData));\n            elButton.SetPanelEvent('onmouseover', () => {\n                if (elButton.enabled) {\n                    _PlaySoundEffect('UIPanorama.mainmenu_rollover');\n                }\n            });\n            elButton.Data().voteid = oBtnData.voteid;\n        }\n        elButton.SetHasClass('map-draft-phase-button__status--positive', oBtnData.ispick);\n        elButton.enabled = true;\n        if (MatchDraftAPI.GetIngameTeamToActNow() !== GameStateAPI.GetPlayerTeamNumber(MyPersonaAPI.GetXuid()) ||\n            oBtnData.hasOwnProperty('mapstatus') && oBtnData.mapstatus === 'veto') {\n            elButton.SetHasClass('map-draft-phase-button--vetoed', oBtnData.mapstatus === 'veto');\n            elButton.enabled = false;\n            return;\n        }\n        const aVotedXuids = MatchDraftAPI.GetIngameXuidsForVote(Number(oBtnData.voteid)).split(',');\n        elButton.SetHasClass('map-draft-phase-button--selected', aVotedXuids.indexOf(MyPersonaAPI.GetXuid()) !== -1);\n        if (MatchDraftAPI.GetIngameXuidsForVote(Number(oBtnData.voteid))) {\n            const aVoteIds = MatchDraftAPI.GetIngameWinningVotes().split(',');\n            elButton.SetHasClass('map-draft-phase-button--winning-vote', aVoteIds.indexOf(oBtnData.voteid.toString()) !== -1);\n        }\n        else {\n            elButton.SetHasClass('map-draft-phase-button--winning-vote', false);\n        }\n        const elAvatarsContainer = elButton.FindChildInLayoutFile('id-map-draft-phase-avatars-container');\n        elAvatarsContainer.RemoveAndDeleteChildren();\n        for (let i = 0; i < aVotedXuids.length; i++) {\n            _MakeAvatar(aVotedXuids[i], elAvatarsContainer);\n        }\n    }\n    function _OnActivateVoteTile(elContainer, oBtnData) {\n        const aCurrentVotes = _GetCurrentVotes();\n        const matchingVoteSlot = aCurrentVotes.indexOf(oBtnData.voteid);\n        if (matchingVoteSlot !== -1) {\n            MatchDraftAPI.ActionIngameCastMyVote(_m_nPhase, matchingVoteSlot, 0);\n            _PlaySoundEffect('buymenu_select');\n            return;\n        }\n        const aBtns = elContainer.Children().filter(btn => btn.Data().voteid);\n        if (aBtns.length < 3) {\n            MatchDraftAPI.ActionIngameCastMyVote(_m_nPhase, 0, oBtnData.voteid);\n            _PlaySoundEffect('buymenu_purchase');\n            return;\n        }\n        const freeSlot = _GetFirstFreeVoteSlot(aCurrentVotes);\n        if (freeSlot !== null) {\n            MatchDraftAPI.ActionIngameCastMyVote(_m_nPhase, freeSlot, oBtnData.voteid);\n            _PlaySoundEffect('buymenu_purchase');\n        }\n        else {\n            for (let btn of aBtns) {\n                if (btn.BHasClass('map-draft-phase-button--selected')) {\n                    btn.RemoveClass('map-draft-phase-button--pulse');\n                    btn.AddClass('map-draft-phase-button--pulse');\n                }\n            }\n            _PlaySoundEffect('buymenu_failure');\n        }\n    }\n    function _GetCurrentVotes() {\n        const aCurrentVotes = [];\n        for (let i = 0; i < _GetNumVoteSlots(); i++) {\n            const voteId = MatchDraftAPI.GetIngameMyVoteInSlot(i) || \"empty\";\n            aCurrentVotes.push(voteId);\n        }\n        return aCurrentVotes;\n    }\n    function _GetFirstFreeVoteSlot(aCurrentVotes) {\n        for (let i = 0; i < aCurrentVotes.length; i++) {\n            if (aCurrentVotes[i] === 'empty') {\n                return i;\n            }\n        }\n        return null;\n    }\n    function _GetNumVoteSlots() {\n        if (_m_nPhase === 1 || _m_nPhase === 5) {\n            return 1;\n        }\n        if (_m_nPhase === 2) {\n            return 2;\n        }\n        if (_m_nPhase === 3) {\n            return 3;\n        }\n        if (_m_nPhase === 4) {\n            return 1;\n        }\n        return 0.;\n    }\n    function _UpdateActionText() {\n        const isWaiting = MatchDraftAPI.GetIngameTeamToActNow() !== GameStateAPI.GetPlayerTeamNumber(MyPersonaAPI.GetXuid());\n        _m_cp.FindChildInLayoutFile('id-map-draft-phase-info').SetHasClass('map-draft-phase-info--hidden', isWaiting);\n        _m_cp.FindChildInLayoutFile('id-map-draft-phase-waiting').SetHasClass('map-draft-phase-info--hidden', !isWaiting);\n        if (isWaiting) {\n            _m_cp.FindChildInLayoutFile('id-map-draft-phase-wait').text = $.Localize('#matchdraft_phase_action_wait_' + _m_nPhase);\n            return;\n        }\n        const elContainer = _m_rowsContainer.FindChildInLayoutFile(_m_rowPhaseName + _m_nPhase);\n        const nPickedMaps = elContainer.Children().filter(btn => btn.BHasClass('map-draft-phase-button--selected'));\n        _m_cp.SetDialogVariableInt('maps', nPickedMaps.length);\n        _m_phaseTitleText.text = $.Localize('#matchdraft_phase_action_' + _m_nPhase, _m_cp);\n    }\n    function _MakeLargeMap(elContainer, style) {\n        const aMapIds = MatchDraftAPI.GetIngameMapIdsList().split(',');\n        const mapPickId = aMapIds.filter(id => MatchDraftAPI.GetIngameMapIdState(parseInt(id)) === 'pick')[0];\n        const mapName = DeepStatsAPI.MapIDToString(parseInt(mapPickId));\n        let elMapImage = elContainer.FindChildInLayoutFile('id-map-draft-phase-pick-map-image');\n        if (!elMapImage) {\n            elMapImage = $.CreatePanel('Panel', elContainer, 'id-map-draft-phase-pick-map-image');\n            elMapImage.BLoadLayoutSnippet('FinalMapPick');\n        }\n        elMapImage.SetDialogVariable('mapname', $.Localize('#SFUI_Map_' + mapName));\n        elMapImage.style.backgroundImage = 'url(\"file://{images}/map_icons/screenshots/360p/' + mapName + '.png\")';\n        elMapImage.style.backgroundPosition = '50% 0%';\n        elMapImage.style.backgroundSize = 'auto 100%';\n        elMapImage.style.backgroundImgOpacity = '.5';\n        if (style) {\n            elMapImage.AddClass(style);\n            const nYourTeam = GameStateAPI.GetPlayerTeamNumber(MyPersonaAPI.GetXuid());\n            const nOtherTeam = nYourTeam === _m_nT ? _m_nCt : _m_nT;\n            const nStartingTeam = (MatchDraftAPI.GetIngameTeamWithFirstChoice() === MatchDraftAPI.GetIngameTeamStartingCT())\n                ? nOtherTeam : nYourTeam;\n            const teamLogo = nStartingTeam === _m_nT ? 't_logo.svg' : 'ct_logo.svg';\n            const startingTeam = nStartingTeam === _m_nT ? '#CSGO_Inventory_Team_T' : '#CSGO_Inventory_Team_CT';\n            elContainer.FindChildInLayoutFile('id-map-draft-starting-team').visible = true;\n            elContainer.FindChildInLayoutFile('id-map-draft-starting-team-icon').SetImage(\"file://{images}/icons/\" + teamLogo);\n            elContainer.SetDialogVariable('teamname', $.Localize(startingTeam));\n        }\n    }\n    function _PopulatePlayerList() {\n        const yourXuid = MyPersonaAPI.GetXuid();\n        const oPlayerData = GameStateAPI.GetPlayerDataJSO();\n        const teamNames = ['TERRORIST', 'CT'];\n        let iYourXuidTeamIdx = 1;\n        for (let iTeam = 0; iTeam < teamNames.length; ++iTeam) {\n            const teamName = teamNames[iTeam];\n            const teamIndex = oPlayerData.teams.findIndex(t => t.name === teamName);\n            if (iTeam === 0 && oPlayerData.players.find(p => p.team === teamIndex)) {\n                iYourXuidTeamIdx = 0;\n            }\n            const teamPanelId = (iYourXuidTeamIdx === iTeam) ? 'id-map-draft-phase-your-team' : 'id-map-draft-phase-other-team';\n            const elTeammates = _m_cp.FindChildInLayoutFile(teamPanelId).FindChild('id-map-draft-phase-avatars');\n            elTeammates.RemoveAndDeleteChildren();\n            for (const p of oPlayerData.players) {\n                if (p.team == teamIndex) {\n                    const xuid = p.xuid;\n                    if (!GameStateAPI.IsFakePlayer(xuid)) {\n                        _MakeAvatar(xuid, elTeammates, true);\n                    }\n                }\n            }\n        }\n    }\n    function _MakeAvatar(xuid, elTeammates, bisTeamLister = false) {\n        if (xuid === \"0\")\n            return;\n        if (xuid) {\n            let elAvatar = elTeammates.FindChildInLayoutFile(xuid);\n            const panelType = bisTeamLister ? 'Button' : 'Panel';\n            if (!elAvatar || elAvatar.BHasClass('hidden')) {\n                elAvatar = $.CreatePanel(panelType, elTeammates, xuid);\n                elAvatar.BLoadLayoutSnippet('SmallAvatar');\n                if (bisTeamLister) {\n                    _AddOpenPlayerCardAction(elAvatar, xuid);\n                }\n            }\n            elAvatar.FindChildTraverse('JsAvatarImage').PopulateFromSteamID(xuid);\n            const teamColor = GameStateAPI.GetPlayerColor(xuid);\n            const elTeamColor = elAvatar.FindChildInLayoutFile('JsAvatarTeamColor');\n            if (!teamColor) {\n                elTeamColor.visible = false;\n            }\n            else {\n                elTeamColor.visible = true;\n                elTeamColor.style.washColor = teamColor;\n            }\n            elAvatar.SetDialogVariable('teammate_name', FriendsListAPI.GetFriendName(xuid));\n        }\n    }\n    function _AddOpenPlayerCardAction(elAvatar, xuid) {\n        elAvatar.SetPanelEvent(\"onactivate\", () => {\n            $.DispatchEvent('SidebarContextMenuActive', true);\n            if (xuid !== \"0\") {\n                const contextMenuPanel = UiToolkitAPI.ShowCustomLayoutContextMenuParametersDismissEvent('', '', 'file://{resources}/layout/context_menus/context_menu_playercard.xml', 'xuid=' + xuid, () => $.DispatchEvent('SidebarContextMenuActive', false));\n                contextMenuPanel.AddClass(\"ContextMenu_NoArrow\");\n            }\n        });\n    }\n    const m_eventHandles = [];\n    function _OnReadyForDisplay() {\n        m_eventHandles.push(['PanoramaComponent_IngameDraft_DraftUpdate', $.RegisterForUnhandledEvent('PanoramaComponent_IngameDraft_DraftUpdate', _Update)]);\n        m_eventHandles.push(['UnloadLoadingScreenAndReinit', $.RegisterForUnhandledEvent('UnloadLoadingScreenAndReinit', _Update)]);\n        m_eventHandles.push(['PlayerTeamChanged', $.RegisterForUnhandledEvent('PlayerTeamChanged', _PopulatePlayerList)]);\n    }\n    function _OnUnreadyForDisplay() {\n        while (m_eventHandles.length > 0) {\n            const h = m_eventHandles.pop();\n            $.UnregisterForUnhandledEvent(h[0], h[1]);\n        }\n    }\n    {\n        $.RegisterEventHandler('ReadyForDisplay', $.GetContextPanel(), _OnReadyForDisplay);\n        $.RegisterEventHandler('UnreadyForDisplay', $.GetContextPanel(), _OnUnreadyForDisplay);\n    }\n})(MapDraft || (MapDraft = {}));\n","scripts/match-reconnect.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\nvar MatchmakingReconnect;\n(function (MatchmakingReconnect) {\n    const m_elOngoingMatch = $.GetContextPanel();\n    let m_bAcceptIsShowing = false;\n    let m_bOngoingMatchHasEnded = false;\n    function Init() {\n        const btnReconnect = m_elOngoingMatch.FindChildInLayoutFile('MatchmakingReconnect');\n        btnReconnect.SetPanelEvent('onactivate', () => {\n            CompetitiveMatchAPI.ActionReconnectToOngoingMatch();\n            $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.generic_button_press', 'MOUSE');\n            UpdateState();\n        });\n        const btnAbandon = m_elOngoingMatch.FindChildInLayoutFile('MatchmakingAbandon');\n        btnAbandon.SetPanelEvent('onactivate', () => {\n            CompetitiveMatchAPI.ActionAbandonOngoingMatch();\n            $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.generic_button_press', 'MOUSE');\n            UpdateState();\n        });\n        const btnCancel = m_elOngoingMatch.FindChildInLayoutFile('MatchmakingCancel');\n        btnCancel.SetPanelEvent('onactivate', () => {\n            LobbyAPI.StopMatchmaking();\n            $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.generic_button_press', 'MOUSE');\n            UpdateState();\n        });\n        UpdateState();\n    }\n    function UpdateState() {\n        const bHasOngoingMatch = CompetitiveMatchAPI.HasOngoingMatch();\n        if (!bHasOngoingMatch) {\n            m_bOngoingMatchHasEnded = false;\n        }\n        const bCanReconnect = bHasOngoingMatch && !m_bOngoingMatchHasEnded;\n        const sessionSettings = LobbyAPI.GetSessionSettings();\n        const bIsReconnecting = sessionSettings?.game?.mapgroupname === \"reconnect\";\n        m_elOngoingMatch.SetHasClass('show-actions', bCanReconnect && !bIsReconnecting && !m_bAcceptIsShowing);\n        m_elOngoingMatch.SetHasClass('show-cancel', bCanReconnect && bIsReconnecting && !m_bAcceptIsShowing);\n    }\n    function ReadyUpForMatch(shouldShow) {\n        m_bAcceptIsShowing = shouldShow;\n        UpdateState();\n    }\n    function OnGamePhaseChange(nGamePhase) {\n        m_bOngoingMatchHasEnded = nGamePhase === 5;\n        UpdateState();\n    }\n    function OnSidebarIsCollapsed(bIsCollapsed) {\n        m_elOngoingMatch.SetHasClass('sidebar-collapsed', bIsCollapsed);\n    }\n    {\n        Init();\n        $.RegisterForUnhandledEvent(\"PanoramaComponent_Lobby_MatchmakingSessionUpdate\", UpdateState);\n        $.RegisterForUnhandledEvent('PanoramaComponent_GC_Hello', UpdateState);\n        $.RegisterForUnhandledEvent('PanoramaComponent_Lobby_ReadyUpForMatch', ReadyUpForMatch);\n        $.RegisterForUnhandledEvent('GameState_OnGamePhaseChange', OnGamePhaseChange);\n        $.RegisterForUnhandledEvent('SidebarIsCollapsed', OnSidebarIsCollapsed);\n    }\n})(MatchmakingReconnect || (MatchmakingReconnect = {}));\n","scripts/matchinfo.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"mainmenu_watch.ts\" />\n/// <reference path=\"common/iteminfo.ts\" />\n/// <reference path=\"common/formattext.ts\" />\n/// <reference path=\"generated/items_event_current_generated_store.ts\" />\nvar matchInfo;\n(function (matchInfo) {\n    let PLAYERSTATS = ['kills', 'assists', 'deaths', 'mvps', 'score'];\n    let TEAMS = ['CT', 'TERRORIST'];\n    let TEAMSIZE = 5;\n    function _ShowMatchSpinner(value, tab) {\n        if (tab) {\n            let elSpinner = tab.FindChildInLayoutFile(\"id-match-spinner\");\n            if (elSpinner) {\n                if (value) {\n                    elSpinner.RemoveClass('hide');\n                }\n                else {\n                    elSpinner.AddClass('hide');\n                }\n            }\n        }\n    }\n    function _SetMatchMessage(value, show, tab) {\n        if (tab) {\n            let elMessage = tab.FindChildInLayoutFile(\"id-match-message\");\n            if (elMessage) {\n                elMessage.text = value;\n            }\n            let elMessageContainer = tab.FindChildInLayoutFile(\"id-match-message-container\");\n            if (elMessageContainer) {\n                if (show) {\n                    elMessageContainer.RemoveClass('hide');\n                }\n                else {\n                    elMessageContainer.AddClass('hide');\n                }\n            }\n        }\n    }\n    function _IsMatchMetadataFullyLoaded(elParentPanel) {\n        return (((elParentPanel.Data().matchListDescriptor == 'live') && (elParentPanel.Data().matchId != 'gotv')) || (MatchInfoAPI.GetMatchMetadataFullState(elParentPanel.Data().matchId)));\n    }\n    function _DownloadMatch(elParentPanel) {\n        MatchInfoAPI.Delete(elParentPanel.Data().matchId);\n        MatchInfoAPI.Download(elParentPanel.Data().matchId);\n        _UpdateMatchMenu(elParentPanel);\n    }\n    function _DownloadFailedNotify(elParentPanel) {\n        let canDownload = !(elParentPanel.Data().matchListDescriptor === 'downloaded')\n            && ((MatchInfoAPI.GetMatchState(elParentPanel.Data().matchInfo) === 'recent') || (elParentPanel.Data().isTournament));\n        if (canDownload) {\n            UiToolkitAPI.ShowGenericPopupYesNo($.Localize(\"#WatchMenu_Info_Download_Failed\"), $.Localize(\"#WatchMenu_Info_Download_Failed_Retry\"), '', function () { _DownloadMatch(elParentPanel); }, function () { });\n        }\n        else {\n            UiToolkitAPI.ShowGenericPopupOk($.Localize(\"#WatchMenu_Info_Download_Failed\"), $.Localize(\"#WatchMenu_Info_Download_Failed_Info\"), '', function () { });\n        }\n    }\n    function _DeleteDemo(elParentPanel) {\n        MatchInfoAPI.Delete(elParentPanel.Data().matchId);\n        if (elParentPanel.Data().matchListDescriptor === 'downloaded') {\n            mainmenu_watch.UpdateActiveTab();\n        }\n        else {\n            _UpdateMatchMenu(elParentPanel);\n        }\n    }\n    function _Watch(elParentPanel) {\n        MatchInfoAPI.Watch(elParentPanel.Data().matchId, 0);\n    }\n    function _WatchHighlights(elParentPanel) {\n        MatchInfoAPI.WatchHighlights(elParentPanel.Data().matchId, elParentPanel.Data().activePlayerRow.Data().playerXuid);\n    }\n    function _WatchLowlights(elParentPanel) {\n        MatchInfoAPI.WatchLowlights(elParentPanel.Data().matchId, elParentPanel.Data().activePlayerRow.Data().playerXuid);\n    }\n    function _ShareMatch(elParentPanel) {\n        SteamOverlayAPI.CopyTextToClipboard(MatchInfoAPI.GetMatchShareToken(elParentPanel.Data().matchId, \"copyurl\"));\n        let elShareLinkButton = elParentPanel.FindChildInLayoutFile('id-mi-copy');\n        UiToolkitAPI.HideTextTooltip();\n        UiToolkitAPI.ShowTextTooltipOnPanel(elShareLinkButton, $.Localize(\"#WatchMenu_Share_Link_Copied\"));\n    }\n    let _CanRedeem = function (elParentPanel) {\n        if (!elParentPanel.Data().tournamentIndex) {\n            return false;\n        }\n        let id = InventoryAPI.GetActiveTournamentCoinItemId(elParentPanel.Data().tournamentIndex);\n        if (!id || id === '0') {\n            return false;\n        }\n        else {\n            let coinLevel = Number(InventoryAPI.GetItemAttributeValue(id, \"upgrade level\"));\n            let coinRedeemsPurchased = Number(InventoryAPI.GetItemAttributeValue(id, \"operation drops awarded 1\"));\n            if (coinRedeemsPurchased && coinLevel != undefined) {\n                coinLevel += coinRedeemsPurchased;\n            }\n            let redeemed = Number(InventoryAPI.GetItemAttributeValue(id, \"operation drops awarded 0\"));\n            let redeemsAvailable = coinLevel - redeemed;\n            if ((elParentPanel.Data().tournamentIndex == g_ActiveTournamentInfo.eventid) &&\n                g_ActiveTournamentInfo.itemid_charge &&\n                ItemInfo.GetStoreSalePrice(InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(g_ActiveTournamentInfo.itemid_charge, 0), 1, '')) {\n                ++redeemsAvailable;\n            }\n            let tournamentName = MatchInfoAPI.GetMatchTournamentName(elParentPanel.Data().matchId);\n            return redeemsAvailable > 0 &&\n                ((tournamentName != undefined) && (tournamentName != \"\"));\n        }\n    };\n    function _RedeemSouvenir(tournamentIndex, matchId) {\n        UiToolkitAPI.ShowCustomLayoutPopupParameters('', 'file://{resources}/layout/popups/popup_redeem_souvenir.xml', 'matchid=' + matchId +\n            '&' + 'tournamentindex=' + tournamentIndex);\n    }\n    function _RefreshRoundWatchEnabled(elParentPanel) {\n        let isLive = Boolean(MatchInfoAPI.IsLive(elParentPanel.Data().matchId));\n        if (isLive) {\n            return;\n        }\n        let elStatsContainer = elParentPanel.FindChildInLayoutFile('id-mi-round-stats__container');\n        let totalBars = elStatsContainer.Children().length;\n        if (totalBars == 0) {\n            return;\n        }\n        let canWatch = false;\n        for (let i = 1; i <= totalBars; i++) {\n            let elRoundStats = elStatsContainer.GetChild(i - 1);\n            if (!canWatch) {\n                elRoundStats.AddClass('no-hover');\n            }\n            else {\n                elRoundStats.RemoveClass('no-hover');\n                elRoundStats.style.tooltipPosition = \"bottom\";\n                elRoundStats.style.tooltipBodyPosition = \"50% 0%\";\n                function _OnRoundMouseOver(elButton) {\n                    UiToolkitAPI.ShowTextTooltipOnPanel(elButton, $.Localize(\"#CSGO_Watch_Round\"));\n                }\n                function _OnRoundActivate(nMatch, nRound) {\n                    MatchInfoAPI.Watch(nMatch.toString(), nRound);\n                }\n                elRoundStats.SetPanelEvent('onmouseover', _OnRoundMouseOver.bind(undefined, elRoundStats));\n                elRoundStats.SetPanelEvent('onmouseout', function () { UiToolkitAPI.HideTextTooltip(); });\n                elRoundStats.SetPanelEvent('onactivate', _OnRoundActivate.bind(undefined, elParentPanel.Data().matchId, i));\n            }\n        }\n    }\n    function _UpdateMatchMenu(elParentPanel) {\n        let matchState = MatchInfoAPI.GetMatchState(elParentPanel.Data().matchId);\n        let elDownloadButton = elParentPanel.FindChildInLayoutFile('id-mi-download');\n        let elShareLinkButton = elParentPanel.FindChildInLayoutFile('id-mi-copy');\n        let elWatchButton = elParentPanel.FindChildInLayoutFile('id-mi-watch');\n        let elSouvenirButton = elParentPanel.FindChildInLayoutFile('id-mi-souvenir');\n        let elWatchHighlightsButton = elParentPanel.FindChildInLayoutFile('id-mi-watch-highlights');\n        let elWatchLowlightsButton = elParentPanel.FindChildInLayoutFile('id-mi-watch-lowlights');\n        let elDeleteButton = elParentPanel.FindChildInLayoutFile('id-mi-delete');\n        let elDownloadingButton = elParentPanel.FindChildInLayoutFile('id-mi-downloading');\n        let elDownloadFailedButton = elParentPanel.FindChildInLayoutFile('id-mi-error-delete');\n        function _ShowButton(elButton, value) {\n            if (elButton) {\n                if (value) {\n                    elButton.RemoveClass('hide');\n                }\n                else {\n                    elButton.AddClass('hide');\n                }\n            }\n        }\n        function _EnableButton(elButton, value) {\n            if (elButton) {\n                if (value) {\n                    elButton.enabled = true;\n                }\n                else {\n                    elButton.enabled = false;\n                }\n            }\n        }\n        let canWatch = MatchInfoAPI.CanWatch(elParentPanel.Data().matchId);\n        _EnableButton(elWatchButton, canWatch);\n        if (elParentPanel.Data().matchListDescriptor != 'live') {\n            _ShowButton(elWatchButton, canWatch);\n            _ShowButton(elWatchHighlightsButton, canWatch);\n            _ShowButton(elWatchLowlightsButton, canWatch);\n            _ShowButton(elDownloadButton, !canWatch);\n            _ShowButton(elSouvenirButton, (matchState !== \"live\") && _CanRedeem(elParentPanel));\n            let szSouvenirButtonHint = '#popup_redeem_souvenir_title';\n            elSouvenirButton.SetPanelEvent('onmouseover', function () { UiToolkitAPI.ShowTextTooltipOnPanel(elSouvenirButton, szSouvenirButtonHint); });\n            elSouvenirButton.SetPanelEvent('onmouseout', function () { UiToolkitAPI.HideTextTooltip(); });\n            if (elParentPanel.Data().matchListDescriptor != 'downloaded') {\n                let szDownloadButtonHint = '#WatchMenu_Download_Demo';\n                if (matchState === \"downloaded\") {\n                    _EnableButton(elDownloadButton, false);\n                    _ShowButton(elDownloadingButton, false);\n                    _ShowButton(elDownloadFailedButton, false);\n                }\n                else if (matchState === \"downloading\") {\n                    _EnableButton(elDownloadButton, false);\n                    _ShowButton(elDownloadingButton, true);\n                    _ShowButton(elDownloadFailedButton, false);\n                    _ShowButton(elWatchHighlightsButton, false);\n                    _ShowButton(elWatchLowlightsButton, false);\n                    _ShowButton(elWatchButton, false);\n                }\n                else if (MatchInfoAPI.CanDownload(elParentPanel.Data().matchId)) {\n                    _EnableButton(elDownloadButton, true);\n                    _ShowButton(elDownloadingButton, false);\n                    _ShowButton(elDownloadFailedButton, false);\n                }\n                else {\n                    szDownloadButtonHint = '#WatchMenu_Download_Disabled_Hint';\n                    _EnableButton(elDownloadButton, false);\n                    _ShowButton(elDownloadingButton, false);\n                    _ShowButton(elDownloadFailedButton, false);\n                }\n                _EnableButton(elShareLinkButton, (elParentPanel.Data().matchShareToken != \"\") && (elParentPanel.Data().matchShareToken != undefined));\n                elDownloadButton.SetPanelEvent('onmouseover', function () { UiToolkitAPI.ShowTextTooltipOnPanel(elDownloadButton, szDownloadButtonHint); });\n                elDownloadButton.SetPanelEvent('onmouseout', function () { UiToolkitAPI.HideTextTooltip(); });\n            }\n            else {\n                _ShowButton(elDownloadButton, false);\n                _ShowButton(elDownloadingButton, false);\n                _ShowButton(elDownloadFailedButton, false);\n            }\n            let bEnabledReelLightsButton = ((elParentPanel.Data().activePlayerRow) && (MatchInfoAPI.CanWatchHighlights(elParentPanel.Data().matchId, elParentPanel.Data().activePlayerRow.Data().playerXuid)));\n            _EnableButton(elWatchHighlightsButton, bEnabledReelLightsButton);\n            _EnableButton(elWatchLowlightsButton, bEnabledReelLightsButton);\n            let canDelete = MatchInfoAPI.CanDelete(elParentPanel.Data().matchId);\n            _EnableButton(elDeleteButton, canDelete);\n            if (!canWatch && canDelete) {\n                _ShowButton(elDownloadFailedButton, true);\n            }\n        }\n        else {\n            _ShowButton(elDownloadButton, false);\n            _ShowButton(elDownloadingButton, false);\n            _ShowButton(elDownloadFailedButton, false);\n            _ShowButton(elWatchHighlightsButton, false);\n            _ShowButton(elWatchLowlightsButton, false);\n            _ShowButton(elShareLinkButton, false);\n            _ShowButton(elDeleteButton, false);\n            _ShowButton(elSouvenirButton, false);\n        }\n        _RefreshRoundWatchEnabled(elParentPanel);\n    }\n    function Refresh(elParentPanel) {\n        function _ShowLoadingError(elBoundParentPanel) {\n            _ShowMatchSpinner(false, elBoundParentPanel);\n            _SetMatchMessage($.Localize('#CSGO_Watch_NoMatchData'), true, elBoundParentPanel);\n            if (elBoundParentPanel.Data().updateMatchInfoHandler) {\n                $.UnregisterForUnhandledEvent('PanoramaComponent_MatchInfo_StateChange', elBoundParentPanel.Data().updateMatchInfoHandler);\n            }\n            elParentPanel.Data().downloadFailedHandler = undefined;\n        }\n        if (_IsMatchMetadataFullyLoaded(elParentPanel)) {\n            _PopulateMatchInfo(elParentPanel);\n        }\n        else if (MatchInfoAPI.IsServerLogTournamentMatch(elParentPanel.Data().matchId)) {\n            _PopulateServerLogTournamentMatchInfo(elParentPanel);\n        }\n        else if (!elParentPanel.Data().downloadFailedHandler) {\n            MatchInfoAPI.DownloadWithShareToken(elParentPanel.Data().matchId);\n            elParentPanel.Data().downloadFailedHandler = $.Schedule(3.0, _ShowLoadingError.bind(undefined, elParentPanel));\n            elParentPanel.Data().updateMatchInfoHandler = $.RegisterForUnhandledEvent('PanoramaComponent_MatchInfo_StateChange', _PopulateMatchInfo.bind(undefined, elParentPanel));\n        }\n    }\n    matchInfo.Refresh = Refresh;\n    function _PopulateMatchInfo(elParentPanel) {\n        if (elParentPanel.Data().downloadFailedHandler) {\n            $.CancelScheduled(elParentPanel.Data().downloadFailedHandler);\n            elParentPanel.Data().downloadFailedHandler = undefined;\n        }\n        _FillScoreboard(elParentPanel);\n        _UpdateMatchMenu(elParentPanel);\n        if (elParentPanel.Data().matchListDescriptor != 'live') {\n            _FillRoundStats(elParentPanel, elParentPanel.Data().activePlayerRow);\n        }\n        _Show(elParentPanel);\n    }\n    function _PopulateServerLogTournamentMatchInfo(elParentPanel) {\n        _FillServerLogTournamentInfo(elParentPanel);\n        _UpdateMatchMenu(elParentPanel);\n        _Show(elParentPanel);\n    }\n    function _UpdateName(elParentPanel, elPlayerName) {\n        if (elParentPanel.Data().isTournament) {\n            elPlayerName.text = MatchInfoAPI.GetMatchPlayerStat(elParentPanel.Data().matchId, elPlayerName.Data().playerXuid, 'name');\n        }\n        else {\n            elPlayerName.text = FriendsListAPI.GetFriendName(elPlayerName.Data().playerXuid);\n        }\n    }\n    function _UpdateTitle(elParentPanel, playerXuid) {\n        if (elParentPanel.Data().isTournament) {\n            elParentPanel.SetDialogVariable('playerNameTitle', MatchInfoAPI.GetMatchPlayerStat(elParentPanel.Data().matchId, playerXuid, 'name'));\n        }\n        else {\n            elParentPanel.SetDialogVariable('playerNameTitle', FriendsListAPI.GetFriendName(playerXuid));\n        }\n        let elWatchHighlightsButton = elParentPanel.FindChildInLayoutFile('id-mi-watch-highlights');\n        let elWatchLowlightsButton = elParentPanel.FindChildInLayoutFile('id-mi-watch-lowlights');\n        if (elWatchHighlightsButton) {\n            elWatchHighlightsButton.SetPanelEvent('onmouseover', function () { UiToolkitAPI.ShowTextTooltipOnPanel(elWatchHighlightsButton, UiToolkitAPI.MakeStringSafe($.Localize('#WatchMenu_Watch_Highlights_Player_Selected', elParentPanel))); });\n            elWatchLowlightsButton.SetPanelEvent('onmouseover', function () { UiToolkitAPI.ShowTextTooltipOnPanel(elWatchLowlightsButton, UiToolkitAPI.MakeStringSafe($.Localize('#WatchMenu_Watch_Lowlights_Player_Selected', elParentPanel))); });\n        }\n    }\n    function _Show(elParentPanel) {\n        elParentPanel.SetReadyForDisplay(true);\n        elParentPanel.visible = true;\n        elParentPanel.RemoveClass('mi-sb--hidden');\n        elParentPanel.Data().updateMatchMenuHandler = $.RegisterForUnhandledEvent('PanoramaComponent_MatchInfo_StateChange', _UpdateMatchMenu.bind(undefined, elParentPanel));\n    }\n    function _OnFadeOutEnd(elParentPanel) {\n        if (elParentPanel.visible === true && elParentPanel.BIsTransparent()) {\n            elParentPanel.visible = false;\n            elParentPanel.SetReadyForDisplay(false);\n        }\n    }\n    function Hide(elParentPanel) {\n        for (let teamId in TEAMS) {\n            let elTeam = elParentPanel.FindChildInLayoutFile('players-table-' + TEAMS[teamId]);\n            for (let i = 0; i < TEAMSIZE; i++) {\n                let elPlayerName = elTeam.GetChild(i).FindChildTraverse('name__label');\n                if (elPlayerName.Data().nameUpdateHandler) {\n                    $.UnregisterForUnhandledEvent('PanoramaComponent_FriendsList_NameChanged', elPlayerName.Data().nameUpdateHandler);\n                    elPlayerName.Data().nameUpdateHandler = undefined;\n                }\n            }\n        }\n        if (elParentPanel.Data().downloadFailedHandler) {\n            $.CancelScheduled(elParentPanel.Data().downloadFailedHandler);\n            elParentPanel.Data().downloadFailedHandler = undefined;\n        }\n        if (elParentPanel.Data().updateMatchInfoHandler) {\n            $.UnregisterForUnhandledEvent('PanoramaComponent_MatchInfo_StateChange', elParentPanel.Data().updateMatchInfoHandler);\n            elParentPanel.Data().updateMatchInfoHandler = undefined;\n        }\n        let elTitle = elParentPanel.FindChildInLayoutFile('id-mi-player-stats-title');\n        if (elTitle.Data().nameUpdateHandler) {\n            $.UnregisterForUnhandledEvent('PanoramaComponent_FriendsList_NameChanged', elTitle.Data().nameUpdateHandler);\n            elTitle.Data().nameUpdateHandler = undefined;\n        }\n        elParentPanel.AddClass('mi-sb--hidden');\n    }\n    matchInfo.Hide = Hide;\n    function _FillRoundStats(elParentPanel, elPlayerRow) {\n        let tickPatternOvertime = [\n            'mi-round-tick--right-of-team-switch',\n            'mi-round-tick--sub',\n            'mi-round-tick--sub',\n            'mi-round-tick--sub',\n            'mi-round-tick--sub',\n            'mi-round-tick--major'\n        ];\n        function flipBit(n) {\n            if (n == 0)\n                return 1;\n            return 0;\n        }\n        let elTitle = elParentPanel.FindChildInLayoutFile('id-mi-player-stats-title');\n        if (elTitle.Data().nameUpdateHandler == undefined) {\n            elTitle.Data().nameUpdateHandler = $.RegisterForUnhandledEvent('PanoramaComponent_FriendsList_NameChanged', _UpdateTitle.bind(undefined, elParentPanel, elPlayerRow.Data().playerXuid));\n        }\n        _UpdateTitle(elParentPanel, elPlayerRow.Data().playerXuid);\n        let currentTeamId = elPlayerRow.Data().teamId;\n        if (elParentPanel.Data().activePlayerRow) {\n            elParentPanel.Data().activePlayerRow.checked = false;\n            elParentPanel.Data().activePlayerRow.RemoveClass('no-hover');\n        }\n        elPlayerRow.checked = true;\n        elPlayerRow.AddClass('no-hover');\n        elParentPanel.Data().activePlayerRow = elPlayerRow;\n        let isLive = Boolean(MatchInfoAPI.IsLive(elParentPanel.Data().matchId));\n        if (isLive == false) {\n            elParentPanel.FindChildInLayoutFile('id-mi-player-stats').RemoveClass('mi-player-stats__collapse');\n        }\n        let elStatsContainer = elParentPanel.FindChildInLayoutFile('id-mi-round-stats__container');\n        let elTickLabels = elParentPanel.FindChildInLayoutFile('id-mi-round-stats__tick-labels');\n        let team0Score = MatchInfoAPI.GetMatchRoundScoreForTeam(elParentPanel.Data().matchId, 0);\n        if (team0Score === undefined)\n            team0Score = 0;\n        let team1Score = MatchInfoAPI.GetMatchRoundScoreForTeam(elParentPanel.Data().matchId, 1);\n        if (team1Score === undefined)\n            team1Score = 0;\n        let playedRounds = team0Score + team1Score;\n        let maxRounds = MatchInfoAPI.GetMatchMaxRounds(elParentPanel.Data().matchId);\n        let totalRounds = Math.max(playedRounds, maxRounds);\n        let nOvertime = Math.ceil((totalRounds - maxRounds) / 6);\n        if (nOvertime > 0) {\n            totalRounds = maxRounds + 6 * nOvertime;\n        }\n        let totalBars = elStatsContainer.Children().length;\n        elStatsContainer.SetHasClass(\"horizontal-center\", nOvertime == 0);\n        let roundWinsStat = MatchInfoAPI.GetMatchPlayerRoundStats(elParentPanel.Data().matchId, elParentPanel.Data().activePlayerRow.Data().playerXuid, \"round_wins\");\n        let roundWins = roundWinsStat ? roundWinsStat.split(',') : Array(totalRounds).fill(0);\n        let mvpsStat = MatchInfoAPI.GetMatchPlayerRoundStats(elParentPanel.Data().matchId, elParentPanel.Data().activePlayerRow.Data().playerXuid, \"mvps\");\n        let mvps = mvpsStat ? mvpsStat.split(',') : Array(totalRounds).fill(0);\n        let killsStat = MatchInfoAPI.GetMatchPlayerRoundStats(elParentPanel.Data().matchId, elParentPanel.Data().activePlayerRow.Data().playerXuid, \"enemy_kills\");\n        let kills = killsStat ? killsStat.split(',') : Array(totalRounds).fill(0);\n        let headshotsStat = MatchInfoAPI.GetMatchPlayerRoundStats(elParentPanel.Data().matchId, elParentPanel.Data().activePlayerRow.Data().playerXuid, \"enemy_headshots\");\n        let headshots = headshotsStat ? headshotsStat.split(',') : Array(totalRounds).fill(0);\n        let deathsStat = MatchInfoAPI.GetMatchPlayerRoundStats(elParentPanel.Data().matchId, elParentPanel.Data().activePlayerRow.Data().playerXuid, \"deaths\");\n        let deaths = deathsStat ? deathsStat.split(',') : Array(totalRounds).fill(0);\n        function _IsMajorTick(n) {\n            if (n == 1)\n                return true;\n            if (n == maxRounds)\n                return true;\n            if (n == totalRounds)\n                return true;\n            if (n > maxRounds && ((n - maxRounds) % 6 == 0))\n                return true;\n            return false;\n        }\n        function _IsMinorTick(n) {\n            if (n < maxRounds) {\n                if (maxRounds % 5 == 0)\n                    return (n % 5 == 0);\n                else if (maxRounds % 4 == 0)\n                    return (n % 4 == 0);\n                else if (maxRounds <= 12 && maxRounds % 3 == 0)\n                    return (n % 3 == 0);\n                else if (maxRounds <= 8 && maxRounds % 2 == 0)\n                    return (n % 2 == 0);\n            }\n            else {\n            }\n            return false;\n        }\n        function _IsRightOfHalftime(n) {\n            if (n == (maxRounds / 2 + 1))\n                return true;\n        }\n        function _IsLeftOfHalftime(n) {\n            if (n == (maxRounds / 2))\n                return true;\n        }\n        function _GetTickStyleForRound(n) {\n            if (_IsRightOfHalftime(n))\n                return 'mi-round-tick--right-of-team-switch';\n            else if (_IsLeftOfHalftime(n))\n                return 'mi-round-tick--left-of-team-switch';\n            else if (_IsMajorTick(n))\n                return 'mi-round-tick--major';\n            else if (_IsMinorTick(n))\n                return 'mi-round-tick--minor';\n            else\n                return 'mi-round-tick--sub';\n        }\n        function _IsOvertime(n) {\n            return (n > maxRounds);\n        }\n        function _OverTimeLabel(n) {\n            if (n <= maxRounds)\n                return '';\n            let ot = Math.ceil(n - maxRounds) / 6;\n            if (nOvertime > 1) {\n                return $.Localize('#MatchInfo_Overtime') + ' ' + (ot);\n            }\n            else {\n                return $.Localize('#MatchInfo_Overtime');\n            }\n        }\n        function _GetLabelForTick(n) {\n            if (_IsRightOfHalftime(n))\n                return '<>';\n            else if (_IsRightOfHalftime(n) || _IsLeftOfHalftime(n))\n                return '';\n            else if (_IsMajorTick(n) || _IsMinorTick(n))\n                return n;\n            else\n                return '';\n        }\n        let numTimesPlayersChangedSides = 0;\n        numTimesPlayersChangedSides += ((totalRounds > (maxRounds / 2)) ? 1 : 0);\n        if (totalRounds > maxRounds) {\n            let numRoundsPlayedInLastOvertime = (totalRounds - maxRounds) % 6;\n            let numFullOvertimesPlayed = (totalRounds - maxRounds - numRoundsPlayedInLastOvertime) / 6;\n            numTimesPlayersChangedSides += numFullOvertimesPlayed + ((numRoundsPlayedInLastOvertime > 3) ? 1 : 0);\n        }\n        if (numTimesPlayersChangedSides % 2 == 1) {\n            currentTeamId = flipBit(currentTeamId);\n        }\n        for (let i = 1; i <= totalRounds; i++) {\n            let elRoundStats = undefined;\n            if (i > totalBars) {\n                elRoundStats = $.CreatePanel('Button', elStatsContainer, 'id-stat-bar-round' + i);\n                elRoundStats.BLoadLayoutSnippet('snippet_mi-round-summary-bar');\n                elRoundStats.AddClass('round-selection-button');\n            }\n            else {\n                elRoundStats = elStatsContainer.GetChild(i - 1);\n            }\n            let elRoundBar = elRoundStats.FindChildTraverse('id-mi-round-summary-bar__container');\n            let elIconContainer = elRoundStats.FindChildTraverse('id-mi-icons__container');\n            if (i > totalBars) {\n                let elTick = elRoundBar.GetChild(2).GetChild(1);\n                {\n                    elTick.AddClass(_GetTickStyleForRound(i));\n                }\n            }\n            else {\n                elRoundBar.RemoveClass('hide');\n            }\n            let elWinBar = elRoundBar.GetChild(0).GetChild(0);\n            let elWinLossBorder = elRoundBar.GetChild(1);\n            let elLossBar = elRoundBar.GetChild(2).GetChild(0);\n            if (i > playedRounds) {\n                elWinLossBorder.RemoveClass('sb-tint--CT');\n                elWinLossBorder.RemoveClass('sb-tint--TERRORIST');\n                elWinBar.AddClass('mi-round-summary-bar--EMPTY');\n                elLossBar.AddClass('mi-round-summary-bar--EMPTY');\n                elIconContainer.AddClass('hide');\n                elRoundStats.AddClass('no-hover');\n            }\n            else {\n                _RefreshRoundWatchEnabled(elParentPanel);\n                elIconContainer.RemoveClass('hide');\n                let n = i - 1;\n                let elMVPStarImg = elRoundStats.FindChildTraverse('id-mvp-star');\n                if (mvps[n] != 0) {\n                    elMVPStarImg.RemoveClass('hide');\n                    elMVPStarImg.RemoveClass('sb-tint--' + TEAMS[flipBit(currentTeamId)]);\n                    elMVPStarImg.AddClass('sb-tint--' + TEAMS[currentTeamId]);\n                }\n                else {\n                    elMVPStarImg.AddClass('hide');\n                }\n                let nKills = parseInt(kills[n]);\n                let nHeadshots = parseInt(headshots[n]);\n                let elEliminationWinIcons = elRoundStats.FindChildTraverse('id-mi-eliminations-win');\n                for (let k = 0; k < 5; k++) {\n                    let kIcon = elEliminationWinIcons.FindChildTraverse('id-mi-icon-elimination_' + k);\n                    let hIcon = elEliminationWinIcons.FindChildTraverse('id-mi-icon-elimination--headshot_' + k);\n                    if (k >= (nKills)) {\n                        kIcon.AddClass('hide');\n                        hIcon.AddClass('hide');\n                    }\n                    else if (k >= nHeadshots) {\n                        kIcon.RemoveClass('hide');\n                        hIcon.AddClass('hide');\n                    }\n                    else {\n                        kIcon.AddClass('hide');\n                        hIcon.RemoveClass('hide');\n                    }\n                }\n                let elDeathIcon = elIconContainer.FindChildTraverse('id-mi-elimination-death');\n                if (deaths[n] == 1) {\n                    elDeathIcon.RemoveClass('hide');\n                }\n                else {\n                    elDeathIcon.AddClass('hide');\n                }\n                if (roundWins[n] == 1) {\n                    elWinBar.RemoveClass('mi-round-summary-bar--EMPTY');\n                    elLossBar.AddClass('mi-round-summary-bar--EMPTY');\n                }\n                else {\n                    elWinBar.AddClass('mi-round-summary-bar--EMPTY');\n                    elLossBar.RemoveClass('mi-round-summary-bar--EMPTY');\n                }\n                elWinBar.RemoveClass('sb-tint--' + TEAMS[flipBit(currentTeamId)]);\n                elWinBar.AddClass('sb-tint--' + TEAMS[currentTeamId]);\n                elWinLossBorder.RemoveClass('sb-tint--' + TEAMS[flipBit(currentTeamId)]);\n                elWinLossBorder.AddClass('sb-tint--' + TEAMS[currentTeamId]);\n                elEliminationWinIcons.RemoveClass('sb-tint--' + TEAMS[flipBit(currentTeamId)]);\n                elEliminationWinIcons.AddClass('sb-tint--' + TEAMS[currentTeamId]);\n            }\n            if ((i == maxRounds / 2) || ((i > maxRounds) && (((i - maxRounds) % 6) == 3))) {\n                currentTeamId = flipBit(currentTeamId);\n            }\n        }\n        elParentPanel.FindChildInLayoutFile('id-mi-round-stats__tick-labels');\n        elTickLabels.RemoveAndDeleteChildren();\n        for (let i = 1; i <= totalRounds; i++) {\n            let elTick = $.CreatePanel('Panel', elTickLabels, 'id-tick' + i);\n            elTick.BLoadLayoutSnippet('snippet-tick');\n            let strLabelForTick = _GetLabelForTick(i);\n            elTick.SetDialogVariable('n', strLabelForTick.toString());\n            elTick.SetHasClass('mi-tick-class-halftime-align', strLabelForTick === '<>');\n        }\n    }\n    function _OpenPlayerCard(xuid) {\n        $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.sidemenu_select', 'MOUSE');\n        let elPlayerCardContextMenu = UiToolkitAPI.ShowCustomLayoutContextMenuParametersDismissEvent('id-player-' + xuid, '', 'file://{resources}/layout/context_menus/context_menu_playercard.xml', 'xuid=' + xuid, function () { });\n        elPlayerCardContextMenu.AddClass(\"ContextMenu_NoArrow\");\n    }\n    function _FillScoreboard(elParentPanel) {\n        let elScoreboard = elParentPanel.FindChildInLayoutFile('Scoreboard');\n        elScoreboard.visible = true;\n        _ShowMatchSpinner(false, elParentPanel);\n        _SetMatchMessage(\"\", false, elParentPanel);\n        let currentTopPanelTeamId = MatchInfoAPI.GetMatchTournamentTeamID(elParentPanel.Data().matchId, 0);\n        if (elParentPanel.Data().teamsFilled) {\n            if (currentTopPanelTeamId != elParentPanel.Data().cachedTopPanelTeamId) {\n                elParentPanel.Data().teamsFilled = false;\n            }\n        }\n        elParentPanel.Data().cachedTopPanelTeamId = currentTopPanelTeamId;\n        function Helper_FillTeamStats(teamId) {\n            let elTeam = elParentPanel.FindChildInLayoutFile('players-table-' + TEAMS[teamId]);\n            let elScoreboxBackdrop = elParentPanel.FindChildInLayoutFile('id-sb-scorebox_backdrop--' + TEAMS[teamId]);\n            if (elParentPanel.Data().isTournament) {\n                let tag = MatchInfoAPI.GetMatchTournamentTeamTag(elParentPanel.Data().matchId, teamId);\n                if (!tag) {\n                    tag = '';\n                }\n                elScoreboxBackdrop.SetImage('file://{images}/tournaments/teams/' + tag.toLowerCase() + '.svg');\n                elScoreboxBackdrop.AddClass('scorebox_backdrop--tournament');\n                elParentPanel.SetDialogVariable('sb_team_name--' + TEAMS[teamId], MatchInfoAPI.GetMatchTournamentTeamName(elParentPanel.Data().matchId, teamId));\n            }\n            else {\n                elParentPanel.SetDialogVariable('sb_team_name--' + TEAMS[teamId], $.Localize('#teamname_' + TEAMS[teamId]));\n            }\n            elParentPanel.SetDialogVariable('score_' + TEAMS[teamId], (MatchInfoAPI.GetMatchRoundScoreForTeam(elParentPanel.Data().matchId, teamId)).toString());\n            for (let i = 0; i < TEAMSIZE; i++) {\n                let elPlayerRow = elTeam.GetChild(i);\n                if (!elParentPanel.Data().teamsFilled) {\n                    elPlayerRow.Data().playerXuid = MatchInfoAPI.GetMatchPlayerXuidByIndexForTeam(elParentPanel.Data().matchId, teamId, i);\n                }\n                let playerXuid = elPlayerRow.Data().playerXuid;\n                let elPlayerName = elPlayerRow.FindChildTraverse('name__label');\n                let elAvatarImage = elPlayerRow.FindChildTraverse('avatar');\n                let elAvatarTeamLogo = elPlayerRow.FindChildTraverse('avatarteamlogo');\n                if (!elParentPanel.Data().teamsFilled) {\n                    elPlayerName.Data().matchId = elParentPanel.Data().matchId;\n                    elPlayerName.Data().playerXuid = playerXuid;\n                    elAvatarImage.SetPanelEvent('onactivate', _OpenPlayerCard.bind(undefined, playerXuid));\n                    elAvatarTeamLogo.SetPanelEvent('onactivate', _OpenPlayerCard.bind(undefined, playerXuid));\n                }\n                if (elPlayerName.Data().nameUpdateHandler == undefined) {\n                    elPlayerName.Data().nameUpdateHandler = $.RegisterForUnhandledEvent('PanoramaComponent_FriendsList_NameChanged', _UpdateName.bind(undefined, elParentPanel, elPlayerName));\n                }\n                _UpdateName(elParentPanel, elPlayerName);\n                if (!elParentPanel.Data().teamsFilled) {\n                    let tag = MatchInfoAPI.GetMatchTournamentTeamTag(elParentPanel.Data().matchId, teamId);\n                    if (!tag) {\n                        tag = '';\n                    }\n                    elAvatarImage.visible = !elParentPanel.Data().isTournament;\n                    elAvatarTeamLogo.visible = elParentPanel.Data().isTournament;\n                    if (elParentPanel.Data().isTournament) {\n                        elAvatarTeamLogo.SetImage('file://{images}/tournaments/teams/' + tag.toLowerCase() + '.svg');\n                    }\n                    else if (elAvatarImage.Data().steamid !== playerXuid) {\n                        elAvatarImage.PopulateFromSteamID(playerXuid);\n                        elAvatarImage.Data().steamid = playerXuid;\n                    }\n                }\n                for (let p in PLAYERSTATS) {\n                    let elStat = elPlayerRow.FindChildTraverse(PLAYERSTATS[p]);\n                    let elStatData = MatchInfoAPI.GetMatchPlayerStat(elParentPanel.Data().matchId, playerXuid, PLAYERSTATS[p]);\n                    elStat.text = elStatData;\n                    if (PLAYERSTATS[p] === 'mvps') {\n                        if (elStatData == '0' || !elStatData) {\n                            elPlayerRow.FindChildTraverse('mvps__panel').AddClass('hide-mvps');\n                        }\n                        else {\n                            elPlayerRow.FindChildTraverse('mvps__panel').RemoveClass('hide-mvps');\n                        }\n                    }\n                }\n            }\n        }\n        Helper_FillTeamStats(0);\n        Helper_FillTeamStats(1);\n        elParentPanel.Data().teamsFilled = true;\n        let rawModeName = MatchInfoAPI.GetMatchMode(elParentPanel.Data().matchId);\n        let rawMapName = MatchInfoAPI.GetMatchMap(elParentPanel.Data().matchId);\n        let mapStringPrefix = '#SFUI_Map_';\n        let mapName = $.Localize(mapStringPrefix + rawMapName);\n        if (mapName === mapStringPrefix + rawMapName)\n            mapName = rawMapName;\n        elParentPanel.SetDialogVariable('map_name', mapName);\n        let elMatchMapIcon = elParentPanel.FindChildTraverse(\"id-mi-map-icon\");\n        let setDefaultMapImage = function (mapIcon) {\n            mapIcon.SetImage(\"file://{images}/map_icons/map_icon_NONE.png\");\n        };\n        if (elMatchMapIcon) {\n            $.RegisterEventHandler('ImageFailedLoad', elMatchMapIcon, setDefaultMapImage.bind(undefined, elMatchMapIcon));\n            elMatchMapIcon.SetImage(\"file://{images}/map_icons/map_icon_\" + rawMapName + \".svg\");\n        }\n        let elMatchModeIcon = elParentPanel.FindChildTraverse(\"id-mi-mode-icon\");\n        let setDefaultModeImage = function (mapIcon) {\n            mapIcon.SetImage(\"file://{images}/icons/ui/competitive.vsvg\");\n        };\n        if (elMatchModeIcon) {\n            $.RegisterEventHandler('ImageFailedLoad', elMatchModeIcon, setDefaultModeImage.bind(undefined, elMatchModeIcon));\n            elMatchModeIcon.SetImage(\"file://{images}/icons/ui/\" + rawModeName + \".svg\");\n        }\n        let matchDuration = MatchInfoAPI.GetMatchDuration(elParentPanel.Data().matchId);\n        matchDuration = Math.max(Math.floor(matchDuration / 60), 1);\n        elParentPanel.SetDialogVariable('duration', $.ConstructString('#CSGO_Watch_Minute:f', { value: matchDuration }));\n        if (elParentPanel.Data().matchListDescriptor === 'live') {\n            let round = 1 + MatchInfoAPI.GetMatchRoundScoreForTeam(elParentPanel.Data().matchId, 0) + MatchInfoAPI.GetMatchRoundScoreForTeam(elParentPanel.Data().matchId, 1);\n            let progressionStateString = '#WatchMenu_FirstHalf';\n            if (round > 31) {\n                progressionStateString = '#WatchMenu_Overtime';\n            }\n            else if (round > 15) {\n                progressionStateString = '#WatchMenu_SecondHalf';\n            }\n            elParentPanel.SetDialogVariable('dateOrRound', $.Localize(progressionStateString));\n            elParentPanel.SetDialogVariable('dateOrRoundLabel', $.Localize('#CSGO_Watch_Info_4'));\n            elParentPanel.SetDialogVariable('durationLabel', $.Localize(\"#CSGO_Watch_Info_5\"));\n        }\n        else {\n            elParentPanel.SetDialogVariable('dateOrRound', MatchInfoAPI.IsLive(elParentPanel.Data().matchId) ? $.Localize('#CSGO_Watch_Cat_LiveMatches') : MatchInfoAPI.GetMatchTimestamp(elParentPanel.Data().matchId));\n            elParentPanel.SetDialogVariable('dateOrRoundLabel', $.Localize('#CSGO_Watch_Info_2'));\n            elParentPanel.SetDialogVariable('durationLabel', $.Localize(\"#CSGO_Watch_Info_1\"));\n        }\n    }\n    function _FillServerLogTournamentInfo(elParentPanel) {\n        PopulateForTeam(0);\n        PopulateForTeam(1);\n        function PopulateForTeam(nTeam) {\n            let tag = MatchInfoAPI.GetMatchTournamentTeamTag(elParentPanel.Data().matchId, nTeam);\n            if (tag) {\n                let strFilename = 'file://{images}/tournaments/teams/' + tag.toLowerCase() + '.svg';\n                let img = elParentPanel.FindChildTraverse('team_image' + nTeam);\n                img.SetImage(strFilename);\n            }\n            elParentPanel.SetDialogVariable('teamname' + nTeam, MatchInfoAPI.GetMatchTournamentTeamName(elParentPanel.Data().matchId, nTeam));\n            elParentPanel.SetDialogVariable('score' + nTeam, (MatchInfoAPI.GetMatchRoundScoreForTeam(elParentPanel.Data().matchId, nTeam)).toString());\n        }\n        let rawMapName = MatchInfoAPI.GetMatchMap(elParentPanel.Data().matchId);\n        let mapStringPrefix = '#SFUI_Map_';\n        let mapName = $.Localize(mapStringPrefix + rawMapName);\n        if (mapName === mapStringPrefix + rawMapName)\n            mapName = rawMapName;\n        elParentPanel.SetDialogVariable('mapname', mapName);\n        let elMatchMapIcon = elParentPanel.FindChildTraverse(\"map_image\");\n        if (elMatchMapIcon) {\n            elMatchMapIcon.SetImage(\"file://{images}/map_icons/map_icon_\" + rawMapName + \".svg\");\n        }\n        let elTournamentLogo = elParentPanel.FindChildTraverse(\"tournament_logo\");\n        elTournamentLogo.SetImage('file://{images}/tournaments/events/tournament_logo_' + elParentPanel.Data().tournamentIndex + '.svg');\n        elParentPanel.SetDialogVariable('tournamentphase', $.Localize(MatchInfoAPI.GetMatchTournamentStageName(elParentPanel.Data().matchId)));\n        elParentPanel.SetDialogVariable('matchphase', MatchInfoAPI.IsLive(elParentPanel.Data().matchId) ? $.Localize('#CSGO_Watch_Cat_LiveMatches') : MatchInfoAPI.GetMatchTimestamp(elParentPanel.Data().matchId));\n    }\n    function Init(elParentPanel) {\n        _ShowMatchSpinner(true, elParentPanel);\n        _SetMatchMessage(\"\", false, elParentPanel);\n        let bIsMinimalMatchInfo = MatchInfoAPI.IsServerLogTournamentMatch(elParentPanel.Data().matchId);\n        elParentPanel.SetHasClass('matchinfo--minimal', bIsMinimalMatchInfo);\n        if (bIsMinimalMatchInfo) {\n            let minimalInfoBody = $.CreatePanel('Panel', elParentPanel, 'minimal-match-info');\n            minimalInfoBody.BLoadLayoutSnippet('matchinfo_serverlogtournament_minimal');\n        }\n        let myXuid = MyPersonaAPI.GetXuid();\n        function Helper_CreateScoreboard(teamId) {\n            let elRowToActivate = undefined;\n            let elTeam = elParentPanel.FindChildInLayoutFile('players-table-' + TEAMS[teamId]);\n            for (let i = 0; i < TEAMSIZE; i++) {\n                let playerXuid = MatchInfoAPI.GetMatchPlayerXuidByIndexForTeam(elParentPanel.Data().matchId, teamId, i);\n                let elPlayerRow = $.CreatePanel('Panel', elTeam, 'id-player-' + playerXuid);\n                if (!playerXuid) {\n                    elTeam.AddClass('with-empty-rows');\n                }\n                elPlayerRow.Data().playerXuid = playerXuid;\n                elPlayerRow.Data().teamId = teamId;\n                if (elParentPanel.Data().matchListDescriptor != 'live') {\n                    elPlayerRow.SetPanelEvent('onactivate', _FillRoundStats.bind(undefined, elParentPanel, elPlayerRow));\n                    if (((i == 0) && (teamId == 0)) || (myXuid === playerXuid)) {\n                        elParentPanel.Data().activePlayerRow = elPlayerRow;\n                    }\n                }\n                elPlayerRow.BLoadLayoutSnippet('snippet_scoreboard-classic__row--comp');\n                let elAvatarImage = elPlayerRow.FindChildTraverse('avatar');\n                elAvatarImage.AddClass('sb-row__cell--avatar--' + TEAMS[teamId]);\n                let elPlayerNameLabel = elPlayerRow.FindChildTraverse('name__label');\n                elPlayerNameLabel.AddClass('sb-tint--' + TEAMS[teamId]);\n                elPlayerNameLabel.SetPanelEvent('onactivate', function (elParentPanel, elPlayerRow, playerXuid) {\n                    if (elParentPanel.Data().matchListDescriptor != 'live')\n                        _FillRoundStats(elParentPanel, elPlayerRow);\n                    _OpenPlayerCard(playerXuid);\n                }\n                    .bind(undefined, elParentPanel, elPlayerRow, playerXuid));\n                let elStatsContainer = elPlayerRow.FindChildTraverse('id-sb-row-stats');\n                for (let p in PLAYERSTATS) {\n                    let elStat;\n                    if (PLAYERSTATS[p] === 'mvps') {\n                        let elMvpsPanel = $.CreatePanel('Panel', elStatsContainer, 'mvps__panel');\n                        let elStar = $.CreatePanel(\"Image\", elMvpsPanel, 'mvps--image');\n                        elStar.SetImage('file://{images}/icons/ui/star.svg');\n                        elStat = $.CreatePanel('Label', elMvpsPanel, PLAYERSTATS[p]);\n                        elStat.AddClass('mi-mvps-shrink-overflow');\n                        elMvpsPanel.AddClass('sb-row__cell');\n                        elMvpsPanel.AddClass('sb-row__cell--mvps');\n                        elStar.AddClass('sb-row__cell--mvps__star');\n                        elStat.AddClass('sb-row__cell--mvps__count');\n                        elStat = elMvpsPanel;\n                    }\n                    else {\n                        elStat = $.CreatePanel('Panel', elStatsContainer, \"\");\n                        elStat.AddClass('sb-row__cell');\n                        elStat.AddClass('sb-row__cell--' + PLAYERSTATS[p]);\n                        elStat = $.CreatePanel('Label', elStat, PLAYERSTATS[p]);\n                    }\n                    elStat.AddClass('sb-tint--' + TEAMS[teamId]);\n                }\n            }\n        }\n        Helper_CreateScoreboard(0);\n        Helper_CreateScoreboard(1);\n        let tournamentName = MatchInfoAPI.GetMatchTournamentName(elParentPanel.Data().matchId);\n        elParentPanel.Data().isTournament = ((tournamentName != \"\") && (tournamentName != undefined));\n        elParentPanel.Data().matchShareToken = MatchInfoAPI.GetMatchShareToken(elParentPanel.Data().matchId, \"text\");\n        elParentPanel.Data().downloadFailedTest = undefined;\n        elParentPanel.Data().updateMatchInfoHandler = undefined;\n        elParentPanel.Data().teamsFilled = false;\n        let elColumnLabels = elParentPanel.FindChildInLayoutFile('players-table__labels-row');\n        for (let p in PLAYERSTATS) {\n            let elStatContainter = $.CreatePanel('Panel', elColumnLabels, \"\");\n            elStatContainter.AddClass('sb-row__cell');\n            elStatContainter.AddClass('sb-row__cell--' + PLAYERSTATS[p]);\n            elStatContainter.AddClass('matchinfo-scoreboard-header-stat-cell');\n            let elStatLabel = $.CreatePanel('Label', elStatContainter, PLAYERSTATS[p]);\n            elStatLabel.text = $.Localize('#Scoreboard_' + PLAYERSTATS[p] + '_header');\n        }\n        $.RegisterEventHandler('PropertyTransitionEnd', elParentPanel, _OnFadeOutEnd.bind(undefined, elParentPanel));\n        let elDownloadButton = elParentPanel.FindChildInLayoutFile('id-mi-download');\n        let elShareLinkButton = elParentPanel.FindChildInLayoutFile('id-mi-copy');\n        let elWatchButton = elParentPanel.FindChildInLayoutFile('id-mi-watch');\n        let elWatchHighlightsButton = elParentPanel.FindChildInLayoutFile('id-mi-watch-highlights');\n        let elWatchLowlightsButton = elParentPanel.FindChildInLayoutFile('id-mi-watch-lowlights');\n        let elDeleteButton = elParentPanel.FindChildInLayoutFile('id-mi-delete');\n        let elDownloadingButton = elParentPanel.FindChildInLayoutFile('id-mi-downloading');\n        let elDownloadFailedButton = elParentPanel.FindChildInLayoutFile('id-mi-error-delete');\n        let elSouvenirButton = elParentPanel.FindChildInLayoutFile('id-mi-souvenir');\n        if (elWatchButton && (elParentPanel.Data().matchListDescriptor == 'live')) {\n            let elWatchLabel = elWatchButton.GetChild(0);\n            elWatchLabel.text = $.Localize(\"#WatchMenu_Watch_Live\");\n            elWatchLabel.style.textTransform = \"uppercase\";\n        }\n        elDownloadButton.SetPanelEvent('onactivate', _DownloadMatch.bind(undefined, elParentPanel));\n        elShareLinkButton.SetPanelEvent('onactivate', _ShareMatch.bind(undefined, elParentPanel));\n        elShareLinkButton.SetDialogVariable('matchcode', elParentPanel.Data().matchShareToken);\n        elShareLinkButton.SetPanelEvent('onmouseover', function () { UiToolkitAPI.ShowTextTooltipOnPanel(elShareLinkButton, $.Localize('#WatchMenu_Get_Share_Link')); });\n        elShareLinkButton.SetPanelEvent('onmouseout', function () { UiToolkitAPI.HideTextTooltip(); });\n        elWatchButton.SetPanelEvent('onactivate', _Watch.bind(undefined, elParentPanel));\n        elWatchHighlightsButton.SetPanelEvent('onactivate', _WatchHighlights.bind(undefined, elParentPanel));\n        elWatchHighlightsButton.SetPanelEvent('onmouseover', function () { UiToolkitAPI.ShowTextTooltipOnPanel(elWatchHighlightsButton, $.Localize('#WatchMenu_Watch_Highlights')); });\n        elWatchHighlightsButton.SetPanelEvent('onmouseout', function () { UiToolkitAPI.HideTextTooltip(); });\n        elWatchLowlightsButton.SetPanelEvent('onactivate', _WatchLowlights.bind(undefined, elParentPanel));\n        elWatchLowlightsButton.SetPanelEvent('onmouseover', function () { UiToolkitAPI.ShowTextTooltipOnPanel(elWatchLowlightsButton, $.Localize('#WatchMenu_Watch_Lowlights')); });\n        elWatchLowlightsButton.SetPanelEvent('onmouseout', function () { UiToolkitAPI.HideTextTooltip(); });\n        elDeleteButton.SetPanelEvent('onactivate', _DeleteDemo.bind(undefined, elParentPanel));\n        elDeleteButton.SetPanelEvent('onmouseover', function () { UiToolkitAPI.ShowTextTooltipOnPanel(elDeleteButton, $.Localize('#WatchMenu_Delete')); });\n        elDeleteButton.SetPanelEvent('onmouseout', function () { UiToolkitAPI.HideTextTooltip(); });\n        elDownloadFailedButton.SetPanelEvent('onactivate', _DownloadFailedNotify.bind(undefined, elParentPanel));\n        elSouvenirButton.SetPanelEvent('onactivate', _RedeemSouvenir.bind(undefined, elParentPanel.Data().tournamentIndex, elParentPanel.Data().matchId));\n        Refresh(elParentPanel);\n    }\n    matchInfo.Init = Init;\n})(matchInfo || (matchInfo = {}));\n","scripts/matchlist.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"mainmenu_watch.ts\" />\n/// <reference path=\"matchinfo.ts\" />\nvar matchList;\n(function (matchList) {\n    let _m_myXuid = MyPersonaAPI.GetXuid();\n    function ShowListSpinner(value, tab) {\n        if (tab) {\n            let elSpinner = tab.FindChildInLayoutFile(\"id-list-spinner\");\n            ShowInfoPanel(false, tab);\n            _ShowListPanel(false, tab);\n            if (elSpinner) {\n                if (value) {\n                    elSpinner.RemoveClass('hide');\n                }\n                else {\n                    elSpinner.AddClass('hide');\n                }\n            }\n        }\n    }\n    matchList.ShowListSpinner = ShowListSpinner;\n    function SetListMessage(value, show, tab = null) {\n        if (tab) {\n            let elMessage = tab.FindChildInLayoutFile(\"id-list-message\");\n            if (elMessage) {\n                elMessage.text = value;\n            }\n            let elMessageContainer = tab.FindChildInLayoutFile(\"id-list-message-container\");\n            if (elMessageContainer) {\n                if (show) {\n                    elMessageContainer.RemoveClass('hide');\n                }\n                else {\n                    elMessageContainer.AddClass('hide');\n                }\n            }\n        }\n    }\n    matchList.SetListMessage = SetListMessage;\n    function ShowInfoPanel(value, tab = null) {\n        if (tab) {\n            let elInfoPanel = tab.FindChildInLayoutFile(\"Info\");\n            let elMatchList = tab.FindChildInLayoutFile(\"JsMatchList\");\n            if (elInfoPanel) {\n                if (value) {\n                    elInfoPanel.AddClass('subsection-content__background-color--dark');\n                    if (tab.Data().activeMatchInfoPanel) {\n                        matchInfo.Refresh(tab.Data().activeMatchInfoPanel);\n                    }\n                }\n                else {\n                    elInfoPanel.RemoveClass('subsection-content__background-color--dark');\n                    if (tab.Data().activeMatchInfoPanel) {\n                        matchInfo.Hide(tab.Data().activeMatchInfoPanel);\n                    }\n                }\n            }\n            if (elMatchList) {\n                if (value) {\n                    elMatchList.AddClass(\"MatchList--Filled\");\n                }\n                else {\n                    elMatchList.RemoveClass(\"MatchList--Filled\");\n                }\n            }\n        }\n    }\n    matchList.ShowInfoPanel = ShowInfoPanel;\n    function _ShowListPanel(value, tab = undefined) {\n        if (tab) {\n            let elMatchList = tab.FindChildInLayoutFile(\"JsMatchList\");\n            if (elMatchList) {\n                if (!value) {\n                    elMatchList.AddClass('hide');\n                }\n                else {\n                    elMatchList.RemoveClass('hide');\n                }\n            }\n        }\n    }\n    function _ClearList(elListPanel, tournament_id) {\n        let activeTiles = elListPanel.Children();\n        for (let i = activeTiles.length - 1; i >= 0; i--) {\n            if (activeTiles[i].Data().markForDelete) {\n                if (elListPanel.Data().activeButton === activeTiles[i]) {\n                    elListPanel.Data().activeButton = undefined;\n                }\n                activeTiles[i].checked = false;\n                if (watchTile.GetDownloadHandler(activeTiles[i])) {\n                    $.UnregisterForUnhandledEvent('PanoramaComponent_MatchInfo_StateChange', watchTile.GetDownloadHandler(activeTiles[i]));\n                    watchTile.SetDownloadHandler(activeTiles[i], null);\n                }\n                if (tournament_id) {\n                    activeTiles[i].AddClass('MatchTile--Collapse');\n                }\n                else {\n                    watchTile.Delete(activeTiles[i]);\n                }\n            }\n        }\n    }\n    function _SelectFirstTile(parentPanel, elMatchList, matchListDescriptor) {\n        if (elMatchList && !(elMatchList.Data().activeButton) && (elMatchList.GetChildCount() > 0)) {\n            let tileIsVisible = false;\n            let elFirstTile = null;\n            let n = 0;\n            do {\n                elFirstTile = elMatchList.GetChild(n);\n                tileIsVisible = (elFirstTile && !elFirstTile.BHasClass('MatchTile--Collapse'));\n                n = n + 1;\n            } while ((!tileIsVisible) && (elFirstTile != undefined));\n            if (elFirstTile) {\n                elFirstTile.checked = true;\n                elMatchList.Data().activeButton = elFirstTile;\n                elFirstTile.ScrollParentToMakePanelFit(2, false);\n                _PopulateMatchInfo(parentPanel, matchListDescriptor, elFirstTile.Data().matchId);\n            }\n        }\n    }\n    function ReselectActiveTile(elListRoot) {\n        let elMatchList = elListRoot.FindChildTraverse(\"JsMatchList\");\n        if (elMatchList && elMatchList.Data().activeButton) {\n            (elMatchList.Data().activeButton).checked = true;\n            _PopulateMatchInfo(elListRoot, elListRoot.Data().matchListDescriptor, elMatchList.Data().activeButton.Data().matchId);\n        }\n        else {\n            _SelectFirstTile(elListRoot, elMatchList, elListRoot.Data().matchListDescriptor);\n        }\n    }\n    matchList.ReselectActiveTile = ReselectActiveTile;\n    let _OnTournamentTeamSelected = function (elParentPanel, elMatchList, matchListDescriptor) {\n        elParentPanel.Data().matchListIsPopulated = false;\n        UpdateMatchList(elParentPanel, elParentPanel.Data().tournament_id);\n        elMatchList.Data().activeButton = undefined;\n        _SelectFirstTile(elParentPanel, elMatchList, matchListDescriptor);\n    };\n    let _OnTournamentSectionSelected = function (elParentPanel, elMatchList, matchListDescriptor) {\n        _PopulateMatchTeamsDropdown(elParentPanel, elParentPanel.Data().tournament_id);\n        elParentPanel.Data().matchListIsPopulated = false;\n        UpdateMatchList(elParentPanel, elParentPanel.Data().tournament_id);\n        elMatchList.Data().activeButton = undefined;\n        _SelectFirstTile(elParentPanel, elMatchList, matchListDescriptor);\n    };\n    function MakeDropDownEntry(index, sectionDesc, sectionName, elMatchlistDropdown) {\n        let elSection = $.CreatePanel('Label', elMatchlistDropdown, 'group_' + sectionDesc, { text: sectionName });\n        elSection.AddClass(\"DropDownMenu\");\n        elSection.AddClass(\"Width-300\");\n        elSection.AddClass(\"White\");\n        elSection.SetAttributeString('value', index.toString());\n        elSection.SetAttributeString('section_id', sectionDesc.toString());\n        elMatchlistDropdown.AddOption(elSection);\n    }\n    let _PopulateMatchlistDropdown = function (elParentPanel, tournamentId) {\n        let elMatchlistDropdown = elParentPanel.FindChildTraverse(\"id-match-list-selector\");\n        elMatchlistDropdown.ClearPanelEvent('oninputsubmit');\n        let nSections = PredictionsAPI.GetEventSectionsCount(tournamentId);\n        elMatchlistDropdown.RemoveAllOptions();\n        for (let i = 0; i < nSections; i++) {\n            let sectionDesc = PredictionsAPI.GetEventSectionIDByIndex(tournamentId, i);\n            let sectionName = PredictionsAPI.GetSectionName(tournamentId, sectionDesc);\n            sectionName = $.Localize(\"#CSGO_MatchInfo_Stage_\" + sectionName.replace(/\\s+/g, ''));\n            MakeDropDownEntry(i, sectionDesc.toString(), sectionName, elMatchlistDropdown);\n        }\n        let sectionsCount = PredictionsAPI.GetEventSectionsCount(tournamentId);\n        let activeIndex = sectionsCount - 1;\n        for (let i = 0; i < sectionsCount; i++) {\n            let sectionId = PredictionsAPI.GetEventSectionIDByIndex(tournamentId, i);\n            if (PredictionsAPI.GetSectionIsActive(tournamentId, sectionId)) {\n                activeIndex = i;\n                break;\n            }\n        }\n        elMatchlistDropdown.SetSelectedIndex(activeIndex);\n        elMatchlistDropdown.RemoveClass('hide');\n        let elMatchList = elParentPanel.FindChildTraverse(\"JsMatchList\");\n        elMatchlistDropdown.SetPanelEvent('oninputsubmit', _OnTournamentSectionSelected.bind(undefined, elParentPanel, elMatchList, tournamentId));\n    };\n    let _PopulateMatchTeamsDropdown = function (elParentPanel, tournamentId) {\n        let elMatchistTeamDropdown = elParentPanel.FindChildTraverse(\"id-match-list-selector-teams\");\n        elMatchistTeamDropdown.ClearPanelEvent('oninputsubmit');\n        elMatchistTeamDropdown.RemoveAllOptions();\n        let elStageDropdown = elParentPanel.FindChildTraverse(\"id-match-list-selector\");\n        let sectionId = elStageDropdown.GetSelected().GetAttributeString('section_id', '');\n        let teamsList = [];\n        let numGroups = PredictionsAPI.GetSectionGroupsCount(tournamentId, parseInt(sectionId));\n        MakeDropDownEntry(0, 'allteams', '#Matchlist_Team_Selection', elMatchistTeamDropdown);\n        teamsList.push('allteams');\n        for (let j = 0; j < numGroups; j++) {\n            let numGroupId = PredictionsAPI.GetSectionGroupIDByIndex(tournamentId, parseInt(sectionId), j);\n            let count = PredictionsAPI.GetGroupTeamsPickableCount(tournamentId, numGroupId);\n            for (let h = 0; h < count; h++) {\n                let teamId = PredictionsAPI.GetGroupTeamIDByIndex(tournamentId, numGroupId, h);\n                if (teamsList.indexOf(teamId) === -1 && teamId) {\n                    teamsList.push(teamId);\n                    let teamName = PredictionsAPI.GetTeamName(teamId);\n                    MakeDropDownEntry((teamsList.length - 1), teamId.toString(), teamName, elMatchistTeamDropdown);\n                }\n            }\n        }\n        elMatchistTeamDropdown.SetSelectedIndex(teamsList.indexOf('allteams'));\n        elMatchistTeamDropdown.RemoveClass('hide');\n        elMatchistTeamDropdown.enabled = (teamsList.length > 1);\n        let elMatchList = elParentPanel.FindChildTraverse(\"JsMatchList\");\n        elMatchistTeamDropdown.SetPanelEvent('oninputsubmit', _OnTournamentTeamSelected.bind(undefined, elParentPanel, elMatchList, tournamentId));\n    };\n    function UpdateMatchList(elTab, matchListDescriptor, optbFromMatchListChangeEvent = false) {\n        let listState = MatchListAPI.GetState(matchListDescriptor);\n        if (listState === 'none') {\n            listState = _RequestMatchListUpdate(elTab, matchListDescriptor);\n        }\n        else if (listState === 'ready' && !optbFromMatchListChangeEvent) {\n            listState = _RequestMatchListUpdate(elTab, matchListDescriptor);\n        }\n        if (elTab && (listState !== \"loading\")) {\n            _PopulateMatchList(elTab, matchListDescriptor);\n        }\n    }\n    matchList.UpdateMatchList = UpdateMatchList;\n    function _PopulateMatchInfo(parentPanel, matchListDescriptor, matchId) {\n        let elMatchList = parentPanel.FindChildTraverse(\"JsMatchList\");\n        let elButton = parentPanel.FindChildTraverse(matchListDescriptor + \"_\" + matchId);\n        if (elMatchList.Data().activeButton) {\n            watchTile.SetParentActive(elMatchList.Data().activeButton, false);\n        }\n        if (elButton) {\n            elMatchList.Data().activeButton = elButton;\n        }\n        if ((parentPanel.Data().activeMatchInfoPanel) && (parentPanel.Data().activeMatchInfoPanel.Data().matchId === matchId) && (matchId != 'gotv')) {\n            matchInfo.Refresh(parentPanel.Data().activeMatchInfoPanel);\n            return;\n        }\n        if ((parentPanel.Data().activeMatchInfoPanel) && (parentPanel.Data().activeMatchInfoPanel.Data().matchId != matchId)) {\n            matchInfo.Hide(parentPanel.Data().activeMatchInfoPanel);\n            parentPanel.Data().activeMatchInfoPanel = undefined;\n        }\n        let parentInfoPanel = parentPanel.FindChildTraverse('Info');\n        parentPanel.Data().activeMatchInfoPanel = parentInfoPanel.FindChild('info_' + matchId);\n        if (parentPanel.Data().activeMatchInfoPanel == undefined) {\n            parentPanel.Data().activeMatchInfoPanel = $.CreatePanel('Panel', parentInfoPanel, 'info_' + matchId);\n            parentPanel.Data().activeMatchInfoPanel.Data().matchId = matchId;\n            parentPanel.Data().activeMatchInfoPanel.Data().matchListDescriptor = matchListDescriptor;\n            parentPanel.Data().activeMatchInfoPanel.BLoadLayout(\"file://{resources}/layout/matchinfo.xml\", false, false);\n            parentPanel.Data().activeMatchInfoPanel.Data().tournament_id = parentPanel.Data().tournament_id;\n            parentPanel.Data().activeMatchInfoPanel.Data().tournamentIndex = parentPanel.Data().tournamentIndex;\n            matchInfo.Init(parentPanel.Data().activeMatchInfoPanel);\n        }\n        else {\n            matchInfo.Refresh(parentPanel.Data().activeMatchInfoPanel);\n        }\n    }\n    function _RequestMatchListUpdate(elTab, matchListDescriptor) {\n        function _ShowLoadingError(elBoundTab) {\n            ShowListSpinner(false, elBoundTab);\n            let msg = \"\";\n            if (elBoundTab.Data().tournament_id) {\n                msg = \"#CSGO_Watch_NoMatch_Tournament_\" + elBoundTab.Data().tournament_id.split(':')[1];\n            }\n            else {\n                switch (elTab.id) {\n                    case \"JsLive\":\n                        msg = \"#CSGO_Watch_NoMatch_live\";\n                        break;\n                    case \"JsYourMatches\":\n                        msg = \"#CSGO_Watch_NoMatch_your_ranked\";\n                        break;\n                }\n            }\n            SetListMessage($.Localize(msg), true, elBoundTab);\n            elBoundTab.Data().downloadFailedHandler = undefined;\n        }\n        if (elTab) {\n            MatchListAPI.Refresh(matchListDescriptor);\n            let newState = MatchListAPI.GetState(matchListDescriptor);\n            if (newState === \"loading\") {\n                ShowListSpinner(true, elTab);\n                SetListMessage(\"\", false, elTab);\n                elTab.Data().matchListIsPopulated = false;\n                if (elTab.Data().downloadFailedHandler) {\n                    $.CancelScheduled(elTab.Data().downloadFailedHandler);\n                    elTab.Data().downloadFailedHandler = undefined;\n                }\n                elTab.Data().downloadFailedHandler = $.Schedule(3.0, _ShowLoadingError.bind(undefined, elTab));\n            }\n            return newState;\n        }\n    }\n    function _MarkActiveTabUnpopulated() {\n        mainmenu_watch.GetActiveTab().Data().matchListIsPopulated = false;\n    }\n    function _PopulateMatchList(parentPanel, matchListDescriptor) {\n        if (!parentPanel)\n            return;\n        function OnMouseOverButton(currentParentPanel, buttonId) {\n            let elButton = currentParentPanel.FindChildTraverse(buttonId);\n            watchTile.SetParentActive(elButton, true);\n        }\n        function OnMouseOutButton(currentParentPanel, buttonId) {\n            let elButton = currentParentPanel.FindChildTraverse(buttonId);\n            if (!elButton.IsSelected()) {\n                watchTile.SetParentActive(elButton, false);\n            }\n        }\n        function _ClearMatchInfo() {\n            if (parentPanel.Data().activeMatchInfoPanel) {\n                matchInfo.Hide(parentPanel.Data().activeMatchInfoPanel);\n                parentPanel.Data().activeMatchInfoPanel = undefined;\n            }\n        }\n        function _ShowGOTVConfirmPopup(elListRoot) {\n            _ClearMatchInfo();\n            UiToolkitAPI.ShowGenericPopupOkCancel($.Localize('#CSGO_Watch_Gotv_Theater'), $.Localize('#CSGO_Watch_Gotv_Theater_tip'), '', function () { MatchListAPI.StartGOTVTheater(\"live\"); }, ReselectActiveTile.bind(undefined, elListRoot));\n        }\n        if (parentPanel.Data().downloadFailedHandler) {\n            $.CancelScheduled(parentPanel.Data().downloadFailedHandler);\n            parentPanel.Data().downloadFailedHandler = undefined;\n        }\n        function GetListOfMatchIds(matchListDescriptor, tournamentIndex, unfilteredCount, sectionDesc, teamId = null) {\n            let MatchIds = [];\n            for (let i = 0; i < unfilteredCount; i++) {\n                let matchId = '';\n                if (tournamentIndex > 3) {\n                    matchId = PredictionsAPI.GetSectionMatchByIndex(matchListDescriptor, sectionDesc, i);\n                }\n                else if (tournamentIndex <= 3 || !tournamentIndex) {\n                    matchId = MatchListAPI.GetMatchByIndex(matchListDescriptor, i).toString();\n                }\n                if (tournamentIndex && teamId && teamId != 0) {\n                    if (IsTeamInMatch(teamId, matchId)) {\n                        MatchIds.push(matchId);\n                    }\n                }\n                else {\n                    MatchIds.push(matchId);\n                }\n            }\n            return MatchIds;\n        }\n        function IsTeamInMatch(teamId, matchId) {\n            for (let i = 0; i <= 1; i++) {\n                if (MatchInfoAPI.GetMatchTournamentTeamID(matchId, i) === teamId) {\n                    return true;\n                }\n            }\n            return false;\n        }\n        let unfilteredCount = MatchListAPI.GetCount(matchListDescriptor);\n        let nCount = 0;\n        let sectionDesc = 0;\n        let tournamentIndex = 0;\n        let MatchIdsFiltered = [];\n        if ((unfilteredCount > 0) && (parentPanel.Data().tournament_id)) {\n            tournamentIndex = parentPanel.Data().tournament_id.split(':')[1];\n            parentPanel.Data().tournamentIndex = tournamentIndex;\n            if (!parentPanel.Data().matchListDropdownIsPopulated) {\n                if (tournamentIndex > 3) {\n                    _PopulateMatchlistDropdown(parentPanel, parentPanel.Data().tournament_id);\n                    _PopulateMatchTeamsDropdown(parentPanel, parentPanel.Data().tournament_id);\n                }\n                parentPanel.Data().matchListDropdownIsPopulated = true;\n            }\n            if (tournamentIndex > 3) {\n                let elDropdown = parentPanel.FindChildTraverse(\"id-match-list-selector\");\n                sectionDesc = parseInt(elDropdown.GetSelected().GetAttributeString('section_id', ''));\n                unfilteredCount = PredictionsAPI.GetSectionMatchesCount(parentPanel.Data().tournament_id, sectionDesc);\n                let elStageDropdown = parentPanel.FindChildTraverse(\"id-match-list-selector-teams\");\n                ;\n                let strTeamId = elStageDropdown.GetSelected().GetAttributeString('section_id', '');\n                let nteamId = strTeamId === 'allteams' ? 0 : Number(strTeamId);\n                MatchIdsFiltered = GetListOfMatchIds(parentPanel.Data().tournament_id, tournamentIndex, unfilteredCount, sectionDesc, nteamId);\n                nCount = MatchIdsFiltered.length;\n            }\n            else if (tournamentIndex == 1) {\n                MatchIdsFiltered = GetListOfMatchIds(parentPanel.Data().tournament_id, tournamentIndex, unfilteredCount, sectionDesc, null);\n                nCount = MatchIdsFiltered.length - 3;\n            }\n            else if (tournamentIndex == 3) {\n                MatchIdsFiltered = GetListOfMatchIds(parentPanel.Data().tournament_id, tournamentIndex, unfilteredCount, sectionDesc, null);\n                nCount = MatchIdsFiltered.length - 1;\n            }\n        }\n        else {\n            MatchIdsFiltered = GetListOfMatchIds(matchListDescriptor, null, unfilteredCount, null, null);\n            nCount = unfilteredCount;\n        }\n        ShowListSpinner(false, parentPanel);\n        if (nCount <= 0) {\n            ShowInfoPanel(false, parentPanel);\n            _ShowListPanel(false, parentPanel);\n            let msg = \"\";\n            if (parentPanel.Data().tournament_id) {\n                msg = \"#CSGO_Watch_NoMatch_Tournament_\" + parentPanel.Data().tournament_id.split(':')[1];\n            }\n            else {\n                switch (parentPanel.id) {\n                    case \"JsLive\":\n                        msg = \"#CSGO_Watch_NoMatch_live\";\n                        break;\n                    case \"JsYourMatches\":\n                        msg = \"#CSGO_Watch_NoMatch_your_ranked\";\n                        break;\n                    case \"JsDownloaded\":\n                        msg = \"#CSGO_Watch_NoMatch_downloaded\";\n                        break;\n                }\n            }\n            SetListMessage($.Localize(msg), true, parentPanel);\n        }\n        let elMatchList = parentPanel.FindChildTraverse(\"JsMatchList\");\n        if (!elMatchList) {\n            return;\n        }\n        for (let i = 0; i < elMatchList.GetChildCount(); i++) {\n            elMatchList.GetChild(i).Data().markForDelete = true;\n        }\n        function _CreateOrValidateMatchTile(matchId) {\n            let elMatchButton = elMatchList.FindChildInLayoutFile(matchListDescriptor + \"_\" + matchId);\n            if (!elMatchButton || matchListDescriptor === 'live') {\n                if (matchListDescriptor === 'live') {\n                    if (elMatchButton) {\n                        elMatchButton.DeleteAsync(0.0);\n                    }\n                }\n                elMatchButton = $.CreatePanel('RadioButton', elMatchList, matchListDescriptor + \"_\" + matchId);\n                elMatchButton.Data().downloadStateHandler = undefined;\n                elMatchButton.Data().group = parentPanel.id;\n                elMatchButton.Data().myXuid = _m_myXuid;\n                elMatchButton.Data().matchId = matchId;\n                elMatchButton.Data().matchListDescriptor = matchListDescriptor;\n                if (matchId != 'gotv') {\n                    elMatchButton.SetPanelEvent('onactivate', _PopulateMatchInfo.bind(undefined, parentPanel, matchListDescriptor, matchId));\n                }\n                else {\n                    elMatchButton.SetPanelEvent('onactivate', _ShowGOTVConfirmPopup.bind(undefined, parentPanel));\n                }\n                elMatchButton.SetPanelEvent('onmouseover', OnMouseOverButton.bind(undefined, parentPanel, matchListDescriptor + \"_\" + matchId));\n                elMatchButton.SetPanelEvent('onmouseout', OnMouseOutButton.bind(undefined, parentPanel, matchListDescriptor + \"_\" + matchId));\n                watchTile.Init(elMatchButton);\n                elMatchButton.RemoveClass('MatchTile--Collapse');\n            }\n            else {\n                watchTile.Refresh(elMatchButton);\n            }\n            elMatchButton.Data().markForDelete = false;\n            function _UpdateDownloadState(elBoundMatchButton) {\n                if ((elBoundMatchButton) && (!elBoundMatchButton.Data().markForDelete)) {\n                    let elDownloadIndicator = elBoundMatchButton.FindChildInLayoutFile('id-download-state');\n                    if (elDownloadIndicator) {\n                        let isDownloading = Boolean((MatchInfoAPI.GetMatchState(elBoundMatchButton.Data().matchId) === \"downloading\"));\n                        let canWatch = Boolean(MatchInfoAPI.CanWatch(elBoundMatchButton.Data().matchId));\n                        let isLive = Boolean(MatchInfoAPI.IsLive(elBoundMatchButton.Data().matchId));\n                        elDownloadIndicator.SetHasClass(\"download-animation\", isDownloading);\n                        elDownloadIndicator.SetHasClass(\"watchlive\", isLive);\n                        elDownloadIndicator.SetHasClass(\"downloaded\", canWatch && !isLive);\n                    }\n                }\n            }\n            if ((elMatchButton.Data().downloadStateHandler == undefined) && elMatchButton.FindChildInLayoutFile('id-download-state')) {\n                elMatchButton.Data().downloadStateHandler = $.RegisterForUnhandledEvent('PanoramaComponent_MatchInfo_StateChange', _UpdateDownloadState.bind(undefined, elMatchButton));\n            }\n            _UpdateDownloadState(elMatchButton);\n            elMatchButton.RemoveClass('MatchTile--Collapse');\n        }\n        for (let i = 0; i < nCount; i++) {\n            if ((parentPanel.Data().tournament_id) && (tournamentIndex > 3)) {\n                _CreateOrValidateMatchTile(MatchIdsFiltered[i]);\n            }\n            else {\n                let matchbyindex = MatchListAPI.GetMatchByIndex(matchListDescriptor, i);\n                _CreateOrValidateMatchTile(MatchIdsFiltered[i]);\n            }\n        }\n        if ((matchListDescriptor === 'live') && elMatchList.FindChildInLayoutFile(\"live_gotv\")) {\n            elMatchList.FindChildInLayoutFile(\"live_gotv\").Data().markForDelete = true;\n        }\n        _ClearList(elMatchList, parentPanel.Data().tournament_id);\n        _SelectFirstTile(parentPanel, elMatchList, matchListDescriptor);\n        if (nCount > 0) {\n            _ShowListPanel(true, parentPanel);\n            ShowInfoPanel(true, parentPanel);\n            SetListMessage(\"\", false, parentPanel);\n        }\n        if ((matchListDescriptor === 'live') && (nCount > 0)) {\n            _CreateOrValidateMatchTile('gotv');\n        }\n        parentPanel.Data().matchListIsPopulated = true;\n    }\n})(matchList || (matchList = {}));\n","scripts/matchmaking_status.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"common/formattext.ts\" />\nvar MatchmakingStatus;\n(function (MatchmakingStatus) {\n    let _m_searchTimeUpdateHandle = false;\n    let _m_elStatusPanel = $.GetContextPanel();\n    let _m_showMatchingMissions = true;\n    function _BCanShow() {\n        if (_m_elStatusPanel.GetAttributeString('data-type', '') === 'hud') {\n            let mode = GameStateAPI.GetGameModeInternalName(false);\n            if (mode === 'survival') {\n                let teamCount = Number(GameInterfaceAPI.GetSettingString('sv_dz_team_count'));\n                if (teamCount > 1)\n                    return false;\n                else\n                    return true;\n            }\n            else {\n                return false;\n            }\n        }\n        return true;\n    }\n    function _SessionUpdate() {\n        if (!_m_elStatusPanel || !_m_elStatusPanel.IsValid())\n            return;\n        _UpdateMatchmakingStatus();\n    }\n    function _UpdateMatchmakingStatus() {\n        let lobbySettings = LobbyAPI.GetSessionSettings().game;\n        if (!LobbyAPI.IsSessionActive() || !_BCanShow()) {\n            _m_elStatusPanel.SetHasClass('hidden', true);\n            return;\n        }\n        _m_elStatusPanel.SetHasClass('hidden', false);\n        _UpdateStatusPanel(lobbySettings);\n    }\n    ;\n    function _UpdateStatusPanel(lobbySettings) {\n        _CancelSearchTimeUpdate();\n        _UpdateSearchWaitPanel(lobbySettings);\n        _SearchPanelSearching(lobbySettings);\n        _ShowMatchmakingWarnings(lobbySettings);\n        _CheckForMatchingMissions(lobbySettings);\n    }\n    function _UpdateSearchWaitPanel(lobbySettings) {\n        let elStatusWait = _m_elStatusPanel.FindChildInLayoutFile('MatchStatusWait');\n        if (!lobbySettings || _IsHost() || _IsSeaching()) {\n            elStatusWait.AddClass('hidden');\n            return;\n        }\n        elStatusWait.RemoveClass('hidden');\n        elStatusWait.FindChildInLayoutFile('MatchStatusWaitLabel').text = $.Localize(\"#party_waiting_lobby_leader\");\n    }\n    ;\n    function _SearchPanelSearching(lobbySettings) {\n        let elStatusSearching = _m_elStatusPanel.FindChildInLayoutFile('MatchStatusSearching');\n        if (!lobbySettings || !_IsSeaching()) {\n            elStatusSearching.AddClass('hidden');\n            _m_showMatchingMissions = true;\n            _CancelSearchTimeUpdate();\n            return;\n        }\n        elStatusSearching.RemoveClass('hidden');\n        let unavailableMatch = _GetSearchStatus().indexOf('unavailable') !== -1 ? true : false;\n        let elWarningIcon = elStatusSearching.FindChildInLayoutFile('MatchStatusFailIcon');\n        elWarningIcon.SetHasClass('hidden', !unavailableMatch);\n        let elSearchTime = elStatusSearching.FindChildInLayoutFile('MatchStatusTime');\n        elSearchTime.SetHasClass('hidden', unavailableMatch);\n        let elLabel = elStatusSearching.FindChildInLayoutFile('MatchStatusSearchingLabel');\n        elLabel.text = $.Localize(_GetSearchStatus());\n        if (unavailableMatch)\n            return;\n        _UpdateSearchTime();\n    }\n    ;\n    function _ShowMatchmakingWarnings(lobbySettings) {\n        let elStatusWarnings = _m_elStatusPanel.FindChildInLayoutFile('MatchStatusWarning');\n        if (!lobbySettings || !_IsSeaching()) {\n            elStatusWarnings.AddClass('hidden');\n            return;\n        }\n        elStatusWarnings.RemoveClass('hidden');\n        let serverWarning = NewsAPI.GetCurrentActiveAlertForUser();\n        let isWarning = serverWarning !== '' && serverWarning !== undefined ? true : false;\n        elStatusWarnings.SetHasClass('hidden', !isWarning);\n        if (isWarning)\n            elStatusWarnings.FindChild('MatchStatusWarningLabel').text = $.Localize(serverWarning);\n    }\n    ;\n    function _CheckForMatchingMissions(lobbySettings) {\n        let nSeasonAccess = GameTypesAPI.GetActiveSeasionIndexValue();\n        if (nSeasonAccess < 0 || nSeasonAccess === null) {\n            return;\n        }\n        if (_IsSeaching() && lobbySettings && lobbySettings.mapgroupname && _m_showMatchingMissions) {\n            // @ts-expect-error OperationUtil is still JS\n            OperationUtil.MissionsThatMatchYourMatchMakingSettings(lobbySettings.mode, lobbySettings.mapgroupname.split(','), nSeasonAccess);\n            _m_showMatchingMissions = false;\n        }\n    }\n    function _IsHost() {\n        return LobbyAPI.BIsHost();\n    }\n    function _GetSearchStatus() {\n        return LobbyAPI.GetMatchmakingStatusString();\n    }\n    ;\n    function _IsSeaching() {\n        let StatusString = _GetSearchStatus();\n        return (StatusString !== '' && StatusString !== null) ? true : false;\n    }\n    function _UpdateSearchTime() {\n        let seconds = LobbyAPI.GetTimeSpentMatchmaking();\n        let elSearchTime = _m_elStatusPanel.FindChildInLayoutFile('MatchStatusTime');\n        elSearchTime.text = FormatText.SecondsToDDHHMMSSWithSymbolSeperator(seconds);\n        _m_searchTimeUpdateHandle = $.Schedule(1.0, _UpdateSearchTime);\n    }\n    function _CancelSearchTimeUpdate() {\n        if (_m_searchTimeUpdateHandle !== false) {\n            $.CancelScheduled(_m_searchTimeUpdateHandle);\n            _m_searchTimeUpdateHandle = false;\n        }\n    }\n    function _OnHideMainMenu() {\n        _CancelSearchTimeUpdate();\n    }\n    function _OnHidePauseMenu() {\n        _CancelSearchTimeUpdate();\n    }\n    ;\n    function _OnShowMenu() {\n        _UpdateMatchmakingStatus();\n    }\n    {\n        _UpdateMatchmakingStatus();\n        $.RegisterForUnhandledEvent(\"PanoramaComponent_Lobby_MatchmakingSessionUpdate\", _SessionUpdate);\n        $.RegisterForUnhandledEvent('PanoramaComponent_GC_Hello', _SessionUpdate);\n        $.RegisterForUnhandledEvent(\"CSGOHideMainMenu\", _OnHideMainMenu);\n        $.RegisterForUnhandledEvent(\"CSGOHidePauseMenu\", _OnHidePauseMenu);\n        $.RegisterForUnhandledEvent(\"CSGOShowPauseMenu\", _OnShowMenu);\n        $.RegisterForUnhandledEvent(\"CSGOShowMainMenu\", _OnShowMenu);\n    }\n})(MatchmakingStatus || (MatchmakingStatus = {}));\n","scripts/match_stakes.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"rating_emblem.ts\" />\n/// <reference path=\"mock_adapter.ts\" />\n$.LogChannel('p.matchstakes', \"LV_OFF\");\nvar MatchStakes;\n(function (MatchStakes) {\n    let m_elMatchStakes = undefined;\n    function _GetRootPanel() {\n        let parent = $.GetContextPanel().GetParent();\n        let newParent = parent.GetParent();\n        while (newParent) {\n            parent = newParent;\n            newParent = parent.GetParent();\n        }\n        return parent;\n    }\n    function _GetMatchStakesPanel() {\n        if (!m_elMatchStakes) {\n            let elHud = _GetRootPanel();\n            m_elMatchStakes = elHud.FindChildTraverse('MatchStakes');\n        }\n        return m_elMatchStakes;\n    }\n    function EndTeamIntro() {\n        const type = MockAdapter.GetPlayerCompetitiveRankType(GameStateAPI.GetLocalPlayerXuid());\n        if (type !== 'Premier')\n            return;\n        let elMatchStakes = _GetMatchStakesPanel();\n        elMatchStakes.style.visibility = 'collapse';\n        elMatchStakes.Data().teamIntroInProgress = false;\n    }\n    MatchStakes.EndTeamIntro = EndTeamIntro;\n    function StartTeamIntro() {\n        const mysteamid = GameStateAPI.GetLocalPlayerXuid();\n        let rankStats = MockAdapter.GetPlayerPremierRankStatsObject(mysteamid);\n        if (!rankStats || rankStats.rankType !== 'Premier')\n            return;\n        let elMatchStakes = _GetMatchStakesPanel();\n        elMatchStakes.style.visibility = 'visible';\n        elMatchStakes.Data().teamIntroInProgress = true;\n        elMatchStakes.SetHasClass('no-rating', rankStats.score === 0);\n        let elWin = elMatchStakes.FindChildTraverse('jsMatchStakesWin');\n        let elLoss = elMatchStakes.FindChildTraverse('jsMatchStakesLoss');\n        let elPfx = elMatchStakes.FindChildTraverse('jsMatchStakes_pfx');\n        const score = MockAdapter.GetPlayerCompetitiveRanking(mysteamid);\n        const wins = MockAdapter.GetPlayerCompetitiveWins(mysteamid);\n        let options = {\n            root_panel: elMatchStakes,\n            rating_type: 'Premier',\n            do_fx: false,\n            full_details: true,\n            leaderboard_details: { score: score, matchesWon: wins },\n            local_player: true\n        };\n        RatingEmblem.SetXuid(options);\n        let introText = RatingEmblem.GetIntroText(elMatchStakes);\n        elMatchStakes.SetHasClass('show-intro-text', introText !== '');\n        elMatchStakes.SetDialogVariable('introtext', introText);\n        elMatchStakes.TriggerClass('reveal-stakes');\n        let promotionState = RatingEmblem.GetPromotionState(elMatchStakes);\n        let ParticleEffect = '';\n        let majorRating = '';\n        let arrRating = RatingEmblem.SplitRating(rankStats.score);\n        majorRating = arrRating[0];\n        let tier = Math.floor(+majorRating / 5.0);\n        let tierColor = RatingParticleControls.ColorConvert(tier);\n        if (promotionState === 'relegation') {\n            ParticleEffect = \"particles/ui/premier_ratings_matchstakes_relegation.vpcf\";\n        }\n        else if (promotionState === 'promotion') {\n            ParticleEffect = \"particles/ui/premier_ratings_matchstakes_promo.vpcf\";\n        }\n        function _SetDelta(panel, prediction, score, promotionState, bLoss) {\n            let delta = prediction - score;\n            let deltaStr;\n            let arrPrediction = RatingEmblem.SplitRating(prediction);\n            if (arrPrediction[2] === '2') {\n                deltaStr = $.Localize('#cs_rating_relegation_match');\n            }\n            else if (arrPrediction[2] === '1') {\n                deltaStr = $.Localize('#cs_rating_promotion_match');\n            }\n            else if (delta === 0) {\n                deltaStr = bLoss ? '-0' : '+0';\n            }\n            else if (delta < 0) {\n                deltaStr = String(delta);\n            }\n            else {\n                deltaStr = String('+' + delta);\n            }\n            panel.SetDialogVariable('delta', deltaStr);\n            panel.SetHasClass('animate', true);\n            panel.AddClass('reveal-stakes');\n        }\n        _SetDelta(elWin, rankStats.predictedRankingIfWin, rankStats.score, promotionState, false);\n        _SetDelta(elLoss, rankStats.predictedRankingIfLoss, rankStats.score, promotionState, true);\n        if (promotionState) {\n            elPfx.SetParticleNameAndRefresh(ParticleEffect);\n            elPfx.SetControlPoint(16, tierColor.R, tierColor.G, tierColor.B);\n        }\n    }\n    MatchStakes.StartTeamIntro = StartTeamIntro;\n})(MatchStakes || (MatchStakes = {}));\n","scripts/mission_tile.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"common/formattext.ts\" />\n/// <reference path=\"segmented_progress_bar.ts\" />\n$.LogChannel(\"p.missions\", \"LV_OFF\");\nvar MissionTile;\n(function (MissionTile) {\n    function IsTheInGamePanel() {\n        return ($.GetContextPanel().id === 'HudMissionPanel');\n    }\n    function IsThePauseMenuPanel() {\n        return ($.GetContextPanel().id === 'id-pausemenu-mission-panel');\n    }\n    function IsTheMainMenuPanel() {\n        return ($.GetContextPanel().id === 'id-mainmenu-mission-panel');\n    }\n    function Init(srcText) {\n        if (MyPersonaAPI.GetElevatedState() != \"elevated\")\n            return;\n        const logPrefix = '[p.missions] ' + srcText + ': ' + $.GetContextPanel().id + ': ';\n        let missionData = undefined;\n        if (IsThePauseMenuPanel()) {\n            missionData = MissionsAPI.GetRecurringMission(false);\n        }\n        if (!missionData) {\n            missionData = MissionsAPI.GetRecurringMission(!IsTheInGamePanel());\n        }\n        $.GetContextPanel().Data().m_oMissionData = missionData;\n        if (!$.GetContextPanel().Data().m_oMissionData) {\n            $.GetContextPanel().AddClass('hidden');\n            return;\n        }\n        if (IsTheInGamePanel()) {\n            if (!$.GetContextPanel().Data().m_livePointsCache) {\n                $.GetContextPanel().Data().m_livePointsCache = -1;\n            }\n            if (FriendsListAPI.IsGameInWarmup()) {\n                $.GetContextPanel().AddClass('hidden');\n                return;\n            }\n            if (GameStateAPI.GetMapBSPName() === 'lobby_mapveto') {\n                $.GetContextPanel().AddClass('hidden');\n                return;\n            }\n            if (!GameStateAPI.GetActiveQuestID()) {\n                $.GetContextPanel().AddClass('hidden');\n                return;\n            }\n            $.GetContextPanel().SetHasClass('stop-anims', missionData.progress_saved +\n                $.GetContextPanel().Data().m_livePointsCache >= missionData.goal_points.slice(-1)[0]);\n            if (missionData.progress_this_match &&\n                missionData.progress_this_match > $.GetContextPanel().Data().m_livePointsCache) {\n                $.GetContextPanel().TriggerClass('progress-pulse');\n                $.GetContextPanel().Data().m_livePointsCache = missionData.progress_this_match;\n                $.DispatchEvent('CSGOPlaySoundEffect', 'UI.Mission.QuotaUp', 'MOUSE');\n            }\n        }\n        else if (!IsTheInGamePanel()) {\n            if (!MyPersonaAPI.IsConnectedToGC()) {\n                $.GetContextPanel().AddClass('hidden');\n                return;\n            }\n            let imagePath = 'undefined';\n            if (missionData.hasOwnProperty('mapgroup') && missionData.mapgroup != '') {\n                const cfg = GameTypesAPI.GetConfig();\n                const mg = cfg.mapgroups[$.GetContextPanel().Data().m_oMissionData['mapgroup']];\n                const keysList = Object.keys(mg.maps);\n                imagePath = keysList[0];\n            }\n            else if (missionData.hasOwnProperty('map') && missionData.map && missionData.map != '') {\n                imagePath = missionData.map;\n            }\n            const elBgArt = $.GetContextPanel().FindChildTraverse('missionArtBG');\n            if (elBgArt) {\n                elBgArt.style.backgroundImage = 'url(\"file://{images}/map_icons/screenshots/720p/' + (imagePath) + '.png\")';\n                elBgArt.style.backgroundPosition = '50% 0%';\n                elBgArt.style.backgroundSize = 'cover';\n            }\n            SetButtonPlayMission();\n            SessionUpdate();\n        }\n        $.GetContextPanel().SetHasClass('COMPLETE', missionData.progress_saved +\n            (missionData.progress_this_match ? missionData.progress_this_match : 0) >= missionData.goal_points.slice(-1)[0]);\n        $.GetContextPanel().RemoveClass('hidden');\n        ConstructMissionStrings($.GetContextPanel());\n        if (!$.GetContextPanel().Data().hasOwnProperty('id') ||\n            $.GetContextPanel().Data().m_oMissionData.id != $.GetContextPanel().Data().id) {\n            const elProg = $.GetContextPanel().FindChildTraverse('progressBaContainer');\n            if (elProg) {\n                SegmentedProgressBar.Init(elProg, missionData);\n            }\n            $.GetContextPanel().Data().id = missionData.id;\n        }\n        UpdateProgressBar(missionData);\n    }\n    MissionTile.Init = Init;\n    function SetButtonPlayMission() {\n        if (!GetButtonPanel())\n            return;\n        GetButtonPanel().SetPanelEvent(\"onactivate\", () => PlayMission());\n    }\n    function SetButtonCancelSearch() {\n        if (!GetButtonPanel())\n            return;\n        GetButtonPanel().SetPanelEvent(\"onactivate\", () => LobbyAPI.StopMatchmaking());\n    }\n    function SetButtonEnabled(enabled) {\n        if (!GetButtonPanel())\n            return;\n        GetButtonPanel().enabled = enabled;\n        GetButtonPanel().SetHasClass('DISABLED', !enabled);\n    }\n    function GetButtonPanel() {\n        return $.GetContextPanel().FindChildTraverse('missionButton');\n    }\n    function GetToolTip(elPanel) {\n        return elPanel.Data().missionText;\n    }\n    MissionTile.GetToolTip = GetToolTip;\n    function ConstructMissionStrings(elPanel) {\n        const missionData = elPanel.Data().m_oMissionData;\n        let progress = missionData.progress_saved;\n        if (missionData.progress_this_match) {\n            progress = missionData.progress_saved + missionData.progress_this_match;\n            progress = Math.min(progress, missionData.goal_points.slice(-1)[0]);\n        }\n        let offsetProgress = progress;\n        let nextXp = missionData.xp_reward.slice(0)[0];\n        let goal = missionData.goal_points.slice(0)[0];\n        for (let i = 0; i < missionData.goal_points.length; i++) {\n            if ((progress < missionData.goal_points[i])) {\n                if (i > 0) {\n                    goal = missionData.goal_points[i] - missionData.goal_points[i - 1];\n                    offsetProgress -= missionData.goal_points[i - 1];\n                }\n                nextXp = missionData.xp_reward[i];\n                break;\n            }\n        }\n        const totalXp = missionData.xp_reward.reduceRight((acc, cur) => acc + cur, 0);\n        let missionPoints = missionData.goal_points.slice(-1)[0];\n        elPanel.SetDialogVariableInt(\"mission-points\", missionPoints);\n        elPanel.SetDialogVariableInt(\"mission-progress\", progress);\n        elPanel.SetDialogVariableInt(\"mission-points-checkpoint\", goal);\n        elPanel.SetDialogVariable(\"mission-xp\", totalXp);\n        const elDirective = elPanel.FindChildTraverse('mission-main-label');\n        if (elDirective) {\n            const actionId = missionData.string_tokens?.action_id;\n            const actionDirective = actionId ? $.Localize(`#mission_directive_${actionId}:f`, elPanel) : '';\n            elPanel.SetDialogVariable('action_directive', actionDirective);\n            const frame = progress > 0 ? '#mission_directive_progress:f' : '#mission_directive:f';\n            elDirective.SetLocString(frame);\n        }\n        const timeRemaining = FormatText.SecondsToSignificantTimeString(missionData.seconds_remaining);\n        elPanel.SetDialogVariable('mission-time-remaining', timeRemaining);\n        elPanel.SetHasClass('hide-time', missionData.seconds_remaining <= 0);\n        ExtractStringTokens(elPanel, missionData.string_tokens);\n        const desc = $.Localize(missionData.loc_description, elPanel);\n        elPanel.SetDialogVariable('mission_desc', desc);\n        const partialToken = missionData.loc_description.replace(\"desc\", \"partial\");\n        const partial = $.Localize(partialToken, elPanel);\n        elPanel.SetDialogVariable('mission_partial', partial);\n        const ingameToken = missionData.loc_description.replace(\"desc\", \"ingame\");\n        const ingame = $.Localize(ingameToken, elPanel);\n        elPanel.SetDialogVariable('mission_ingame', ingame);\n        const elMapIcon = elPanel.FindChildTraverse('missionMapicon');\n        if (elMapIcon) {\n            if (missionData.map) {\n                const iconPath = \"file://{images}/map_icons/map_icon_\" + missionData.map + \".svg\";\n                elMapIcon.SetImage(iconPath);\n                elMapIcon.style.visibility = 'visible';\n            }\n            else {\n                elMapIcon.style.visibility = 'collapse';\n            }\n        }\n        const elModeIcon = elPanel.FindChildTraverse('missionModeicon');\n        if (elModeIcon) {\n            if (missionData.gamemode) {\n                const iconPath = \"file://{images}/icons/ui/\" + missionData.gamemode + \".svg\";\n                elModeIcon.SetImage(iconPath);\n                elModeIcon.style.visibility = 'visible';\n            }\n            else {\n                elModeIcon.style.visibility = 'collapse';\n            }\n        }\n    }\n    function ExtractStringTokens(elPanel, strings) {\n        for (const k in strings) {\n            if (typeof strings[k] === 'object' && !Array.isArray(strings[k]) && strings[k] !== null) {\n                ExtractStringTokens(elPanel, strings[k]);\n            }\n            else {\n                let val = strings[k];\n                val = $.Localize(val);\n                switch (k) {\n                    case 'gamemode':\n                    case 'location':\n                    case 'actions':\n                    case 'action':\n                        val = val.toUpperCase();\n                }\n                elPanel.SetDialogVariable(k, val);\n            }\n        }\n    }\n    MissionTile.ExtractStringTokens = ExtractStringTokens;\n    function UpdateProgressBar(missionData) {\n        const elProg = $.GetContextPanel().FindChildTraverse('progressBaContainer');\n        if (!elProg)\n            return;\n        SegmentedProgressBar.SetValue(elProg, missionData.progress_saved, 'Base');\n        if (missionData.progress_this_match) {\n            const liveValue = missionData.progress_saved + missionData.progress_this_match;\n            SegmentedProgressBar.SetValue(elProg, liveValue, 'Live');\n        }\n    }\n    function GetSearchStatus() {\n        return LobbyAPI.GetMatchmakingStatusString();\n    }\n    ;\n    function IsSearching() {\n        let StatusString = GetSearchStatus();\n        return (StatusString !== '' && StatusString !== null) ? true : false;\n    }\n    function SessionUpdate() {\n        if (IsTheInGamePanel() || IsThePauseMenuPanel())\n            return;\n        $.GetContextPanel().Data().m_oMissionData = MissionsAPI.GetRecurringMission(true);\n        if (!$.GetContextPanel().Data().m_oMissionData) {\n            $.GetContextPanel().AddClass('hidden');\n            return;\n        }\n        const xuid = MyPersonaAPI.GetXuid();\n        const inParty = PartyListAPI.GetCount() > 1;\n        const isLobbyLeader = LobbyAPI.GetHostSteamID() === xuid;\n        let isSearchingForMission = false;\n        const lobbySettings = LobbyAPI.GetSessionSettings();\n        if (IsSearching() && lobbySettings && lobbySettings.game) {\n            const lobbySettings = LobbyAPI.GetSessionSettings();\n            isSearchingForMission = lobbySettings.game.mode == $.GetContextPanel().Data().m_oMissionData.gamemode &&\n                (lobbySettings.game.mapgroupname == $.GetContextPanel().Data().m_oMissionData.mapgroup ||\n                    lobbySettings.game.map == $.GetContextPanel().Data().m_oMissionData.map);\n        }\n        GetButtonPanel().SetHasClass('LOBBY_SUB', inParty && !isLobbyLeader);\n        $.GetContextPanel().SetHasClass('SEARCHING', IsSearching());\n        $.GetContextPanel().SetHasClass('SEARCHING_FOR_MISSION', isSearchingForMission);\n        SetButtonEnabled((!inParty || (inParty && isLobbyLeader)) && !(IsSearching() && !isSearchingForMission));\n        if (isSearchingForMission) {\n            SetButtonCancelSearch();\n        }\n        else {\n            SetButtonPlayMission();\n        }\n    }\n    function PlayMission() {\n        $.DispatchEvent('PlayMenu_SwitchGameModeTab', $.GetContextPanel().Data().m_oMissionData.gamemode);\n        $.DispatchEvent('CSGOPlaySoundEffect', 'mainmenu_mission_start', 'MOUSE');\n        LobbyAPI.CreateSession();\n        const gameMode = $.GetContextPanel().Data().m_oMissionData.gamemode;\n        let gameType = \"classic\";\n        let gmFlags = 0;\n        if (gameMode === \"deathmatch\") {\n            gameType = \"gungame\";\n            gmFlags = 32;\n        }\n        let mg = $.GetContextPanel().Data().m_oMissionData.mapgroup;\n        if (gameMode == \"competitive\") {\n            mg = \"mg_\" + $.GetContextPanel().Data().m_oMissionData.map;\n            gmFlags = 16;\n        }\n        var settings = {\n            update: {\n                Options: {\n                    action: \"custommatch\",\n                    server: \"official\"\n                },\n                Game: {\n                    mode: gameMode,\n                    type: gameType,\n                    mapgroupname: mg,\n                    map: $.GetContextPanel().Data().m_oMissionData.map ? $.GetContextPanel().Data().m_oMissionData.map : \"\",\n                    gamemodeflags: gmFlags,\n                },\n            },\n            delete: {\n                Options: {\n                    challengekey: 1\n                }\n            }\n        };\n        LobbyAPI.UpdateSessionSettings(settings);\n        LobbyAPI.StartMatchmaking('', '', '', '');\n    }\n    function OnRoundStart() {\n        $.GetContextPanel().AddClass('FREEZETIME');\n    }\n    function OnFreezeTimeEnd() {\n        $.GetContextPanel().RemoveClass('FREEZETIME');\n    }\n    function UpdateHud() {\n        if (IsTheInGamePanel()) {\n            Init(\"UpdateHud\");\n        }\n    }\n    function UpdatePauseMenu() {\n        if (IsThePauseMenuPanel()) {\n            Init(\"UpdatePauseMenu\");\n        }\n    }\n    function UpdateMainMenu() {\n        if (IsTheMainMenuPanel()) {\n            Init(\"UpdateMainMenu\");\n        }\n    }\n    {\n        Init('default');\n        $.RegisterForUnhandledEvent('OnRecurringMissionsReceived', Init.bind(null, \"OnRecurringMissionsReceived\"));\n        $.RegisterForUnhandledEvent('OnRecurringMissionsChanged', Init.bind(null, \"OnRecurringMissionsChanged\"));\n        $.RegisterForUnhandledEvent(\"GameState_OnMatchStart\", UpdateHud);\n        $.RegisterForUnhandledEvent('PanoramaComponent_MyPersona_UpdateConnectionToGC', Init.bind(null, \"PanoramaComponent_MyPersona_UpdateConnectionToGC\"));\n        $.RegisterForUnhandledEvent('PanoramaComponent_MyPersona_GcLogonNotificationReceived', Init.bind(null, \"PanoramaComponent_MyPersona_GcLogonNotificationReceived\"));\n        $.RegisterForUnhandledEvent(\"CSGOShowPauseMenu\", UpdatePauseMenu);\n        $.RegisterForUnhandledEvent('OnQuestProgressMade', UpdateHud);\n        $.RegisterForUnhandledEvent('PanoramaComponent_Lobby_MatchmakingSessionUpdate', () => { UpdateMainMenu(); UpdatePauseMenu(); });\n        $.RegisterForUnhandledEvent('OnRoundFreezeTimeEnd', OnFreezeTimeEnd);\n        $.RegisterForUnhandledEvent('OnRoundStart', OnRoundStart);\n        $.RegisterForUnhandledEvent('CSGOShowMainMenu', UpdateMainMenu);\n    }\n})(MissionTile || (MissionTile = {}));\n","scripts/mock_adapter.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"common/iteminfo.ts\" />\n/// <reference path=\"rating_emblem.ts\" />\n$.LogChannel('p.mock', \"LV_OFF\");\nvar MockAdapter = (function () {\n    const k_GetMatchEndWinDataJSO = \"k_GetMatchEndWinDataJSO\";\n    const k_GetScoreDataJSO = \"k_GetScoreDataJSO\";\n    const k_GetPlayerName = \"k_GetPlayerName\";\n    const k_IsFakePlayer = \"k_IsFakePlayer\";\n    const k_XpDataJSO = \"k_XpDataJSO\";\n    const k_XpShopDataJSO = \"k_XpShopDataJSO\";\n    const k_GetGameModeInternalName = \"k_GetGameModeInternalName\";\n    const k_GetGameModeName = \"k_GetGameModeName\";\n    const k_SkillgroupDataJSO = \"k_SkillgroupDataJSO\";\n    const k_DropListJSO = \"k_DropListJSO\";\n    const k_GetTimeDataJSO = \"k_GetTimeDataJSO\";\n    const k_NextMatchVotingData = \"k_NextMatchVotingData\";\n    const k_GetPlayerStatsJSO = \"k_GetPlayerStatsJSO\";\n    const k_GetPlayerDataJSO = \"k_GetPlayerDataJSO\";\n    const k_IsTournamentMatch = \"k_IsTournamentMatch\";\n    const k_GetServerName = \"k_GetServerName\";\n    const k_GetMapName = \"k_GetMapName\";\n    const k_GetTournamentEventStage = \"k_GetTournamentEventStage\";\n    const k_GetGameModeImagePath = \"k_GetGameModeImagePath\";\n    const k_GetMapBSPName = \"k_GetMapBSPName\";\n    const k_GetPlayerTeamName = \"k_GetPlayerTeamName\";\n    const k_GetPlayerTeamNumber = \"k_GetPlayerTeamNumber\";\n    const k_GetTeamNextRoundLossBonus = \"k_GetTeamNextRoundLossBonus\";\n    const k_AreTeamsPlayingSwitchedSides = \"k_AreTeamsPlayingSwitchedSides\";\n    const k_AreTeamsPlayingSwitchedSidesInRound = \"k_AreTeamsPlayingSwitchedSidesInRound\";\n    const k_HasHalfTime = \"k_HasHalfTime\";\n    const k_IsDemoOrHltv = \"k_IsDemoOrHltv\";\n    const k_IsHLTVAutodirectorOn = \"k_IsHLTVAutodirectorOn\";\n    const k_GetTeamLogoImagePath = \"k_GetTeamLogoImagePath\";\n    const k_GetTeamLivingPlayerCount = \"k_GetTeamLivingPlayerCount\";\n    const k_GetTeamTotalPlayerCount = \"k_GetTeamTotalPlayerCount\";\n    const k_GetTeamClanName = \"k_GetTeamClanName\";\n    const k_IsXuidValid = \"k_IsXuidValid\";\n    const k_GetPlayerSlot = \"k_GetPlayerSlot\";\n    const k_GetLocalPlayerXuid = \"k_GetLocalPlayerXuid\";\n    const k_IsLocalPlayerHLTV = \"k_IsLocalPlayerHLTV\";\n    const k_GetPlayerStatus = \"k_GetPlayerStatus\";\n    const k_GetPlayerCommendsLeader = \"k_GetPlayerCommendsLeader\";\n    const k_GetPlayerCommendsFriendly = \"k_GetPlayerCommendsFriendly\";\n    const k_GetPlayerCommendsTeacher = \"k_GetPlayerCommendsTeacher\";\n    const k_GetPlayerCompetitiveRanking = \"k_GetPlayerCompetitiveRanking\";\n    const k_GetPlayerCompetitiveWins = \"k_GetPlayerCompetitiveWins\";\n    const k_GetPlayerXpLevel = \"k_GetPlayerXpLevel\";\n    const k_GetPlayerScore = \"k_GetPlayerScore\";\n    const k_GetPlayerMVPs = \"k_GetPlayerMVPs\";\n    const k_GetPlayerKills = \"k_GetPlayerKills\";\n    const k_GetPlayerRoundKills = \"k_GetPlayerRoundKills\";\n    const k_GetPlayerAssists = \"k_GetPlayerAssists\";\n    const k_GetPlayerDeaths = \"k_GetPlayerDeaths\";\n    const k_GetPlayerPing = \"k_GetPlayerPing\";\n    const k_GetPlayerColor = \"k_GetPlayerColor\";\n    const k_HasCommunicationAbuseMute = \"k_HasCommunicationAbuseMute\";\n    const k_IsSelectedPlayerMuted = \"IsSelectedPlayerMuted\";\n    const k_IsPlayerConnected = \"k_IsPlayerConnected\";\n    const k_ArePlayersEnemies = \"k_ArePlayersEnemies\";\n    const k_GetPlayerClanTag = \"k_GetPlayerClanTag\";\n    const k_GetPlayerMoney = \"k_GetPlayerMoney\";\n    const k_GetPlayerActiveWeaponItemId = \"k_GetPlayerActiveWeaponItemId\";\n    const k_GetPlayerModel = \"k_GetPlayerModel\";\n    const k_GetPlayerItemCT = \"k_GetPlayerItemCT\";\n    const k_GetPlayerItemTerrorist = \"k_GetPlayerItemTerrorist\";\n    const k_AccoladesJSO = \"k_AccoladesJSO\";\n    const k_GetCharacterDefaultCheerByXuid = \"k_GetCharacterDefaultCheerByXuid\";\n    const k_GetAllPlayersMatchDataJSO = \"k_GetAllPlayersMatchDataJSO\";\n    const k_GetPlayerCharacterItemID = \"k_GetPlayerCharacterItemID\";\n    const k_GetFauxItemIDFromDefAndPaintIndex = \"k_GetFauxItemIDFromDefAndPaintIndex\";\n    const k_GetPlayerCompetitiveRankType = \"k_GetPlayerCompetitiveRankType\";\n    const k_bSkillgroupDataReady = \"k_bSkillgroupDataReady\";\n    const k_GetPipRankCount = \"k_GetPipRankCount\";\n    const k_GetPlayerPremierRankStatsObject = \"k_GetPlayerPremierRankStatsObject\";\n    const k_bXpDataReady = \"k_bXpDataReady\";\n    const k_bXpShopDataReady = \"k_bXpShopDataReady\";\n    var _m_mockData = _GetMockData();\n    function _GetRootPanel() {\n        let parent = $.GetContextPanel().GetParent();\n        let newParent = parent.GetParent();\n        while (newParent) {\n            parent = newParent;\n            newParent = parent.GetParent();\n        }\n        return parent;\n    }\n    function _SetMockData(dummydata) {\n        let elRoot = _GetRootPanel();\n        elRoot.Data().m_mockData = dummydata;\n    }\n    function _GetMockData() {\n        let elRoot = _GetRootPanel();\n        if (!elRoot.Data().hasOwnProperty('m_mockData'))\n            return undefined;\n        else\n            return elRoot.Data().m_mockData;\n    }\n    function _GetMockTables() {\n        let elRoot = _GetRootPanel();\n        if (!elRoot.Data().hasOwnProperty('m_mockTables'))\n            return undefined;\n        else\n            return elRoot.Data().m_mockTables;\n    }\n    function _AddTable(name, table) {\n        let elRoot = _GetRootPanel();\n        if (!elRoot.Data().hasOwnProperty('m_mockTables'))\n            elRoot.Data().m_mockTables = {};\n        elRoot.Data().m_mockTables[name] = table;\n    }\n    function FindMockTable(key) {\n        const arrTablesInUse = _m_mockData.split(',');\n        for (let group of arrTablesInUse) {\n            let mockTables = _GetMockTables();\n            if (mockTables && mockTables.hasOwnProperty(group) && mockTables[group].hasOwnProperty(key)) {\n                return mockTables[group];\n            }\n        }\n        return undefined;\n    }\n    function _APIAccessor(val, key, xuid = -1) {\n        if (!_m_mockData) {\n            return val;\n        }\n        const table = FindMockTable(key);\n        if (!table) {\n            return val;\n        }\n        let tableVal;\n        if (xuid !== -1 && table[key].hasOwnProperty(xuid)) {\n            tableVal = table[key][xuid];\n        }\n        else if (xuid !== -1 && !table[key].hasOwnProperty(xuid)) {\n            tableVal = table[key][0];\n        }\n        else {\n            tableVal = table[key];\n        }\n        if (tableVal && typeof tableVal === \"function\") {\n            return tableVal(xuid);\n        }\n        else {\n            return tableVal;\n        }\n    }\n    const _getLoadoutWeapons = function (team) {\n        const list = [];\n        const slotStrings = LoadoutAPI.GetLoadoutSlotNames(false);\n        const slots = JSON.parse(slotStrings);\n        slots.forEach(slot => {\n            const itemId = LoadoutAPI.GetItemID(team, slot);\n            const bIsWeapon = ItemInfo.IsWeapon(itemId) || ItemInfo.IsMelee(itemId);\n            if (bIsWeapon) {\n                list.push(itemId);\n            }\n        });\n        return list;\n    };\n    function _GetRandomWeaponFromLoadout() {\n        const team = (_m_mockData.search('team_ct') !== -1) ? 'ct' : 't';\n        const list = _getLoadoutWeapons(team);\n        return list[_r(0, list.length)];\n    }\n    function _GetRandomPlayerStatsJSO(xuid) {\n        const oPlayerStats = { \"damage\": 0, \"kills\": 0, \"assists\": 0, \"deaths\": 0, \"adr\": 0, \"kdr\": 0, \"3k\": 0, \"4k\": 0, \"5k\": 0, \"headshotkills\": 0, \"hsp\": 0, \"worth\": 0, \"killreward\": 0, \"cashearned\": 99, \"livetime\": 0, \"objective\": 0, \"utilitydamage\": 0, \"enemiesflashed\": 0 };\n        Object.keys(oPlayerStats).forEach(stat => {\n            oPlayerStats[stat] = _r();\n        });\n        return oPlayerStats;\n    }\n    function _r(min = 0, max = 100) {\n        return Math.round(Math.random() * ((max - min) + min) + 0.5);\n    }\n    ;\n    function _GetRandomXP() {\n        const ret = {\n            xp_earned: {\n                \"2\": _r(0, 1000),\n                \"6\": _r(0, 1000),\n            },\n            current_level: _r(0, 39),\n            current_xp: _r(0, 4999),\n        };\n        return ret;\n    }\n    function _GetRandomSkillGroup() {\n        const oldrank = _r(1, 18);\n        const newrank = oldrank + _r(-1, 1);\n        const ret = {\n            \"old_rank\": oldrank,\n            \"new_rank\": newrank,\n            \"num_wins\": _r(10, 1000),\n            \"rank_change\": newrank - oldrank,\n            \"rank_type\": \"Premier\"\n        };\n        return ret;\n    }\n    function _GetRandomPlayerModel(team) {\n        const PlayerModels = {\n            \"ct\": [\n                \"agents/models/ctm_fbi/ctm_fbi.vmdl\",\n                \"agents/models/ctm_fbi/ctm_fbi_varianta.vmdl\",\n                \"agents/models/ctm_fbi/ctm_fbi_variantb.vmdl\",\n                \"agents/models/ctm_fbi/ctm_fbi_variantc.vmdl\",\n                \"agents/models/ctm_fbi/ctm_fbi_variantd.vmdl\",\n                \"agents/models/ctm_fbi/ctm_fbi_variante.vmdl\",\n                \"agents/models/ctm_fbi/ctm_fbi_varianth.vmdl\",\n                \"agents/models/ctm_fbi/ctm_fbi_variantf.vmdl\",\n                \"agents/models/ctm_fbi/ctm_fbi_variantg.vmdl\",\n                \"agents/models/ctm_st6.vmdl\",\n                \"agents/models/ctm_st6_varianta.vmdl\",\n                \"agents/models/ctm_st6_variantb.vmdl\",\n                \"agents/models/ctm_st6_variantc.vmdl\",\n                \"agents/models/ctm_st6_variantd.vmdl\",\n                \"agents/models/ctm_st6_varianti.vmdl\",\n                \"agents/models/ctm_st6_variantm.vmdl\",\n                \"agents/models/ctm_st6_variantg.vmdl\",\n                \"agents/models/ctm_st6_variantk.vmdl\",\n                \"agents/models/ctm_st6_variante.vmdl\",\n                \"agents/models/ctm_gign/ctm_gign.vmdl\",\n                \"agents/models/ctm_gign/ctm_gign_varianta.vmdl\",\n                \"agents/models/ctm_gign/ctm_gign_variantb.vmdl\",\n                \"agents/models/ctm_gign/ctm_gign_variantc.vmdl\",\n                \"agents/models/ctm_gign/ctm_gign_variantd.vmdl\",\n                \"agents/models/ctm_gsg9.vmdl\",\n                \"agents/models/ctm_gsg9_varianta.vmdl\",\n                \"agents/models/ctm_gsg9_variantb.vmdl\",\n                \"agents/models/ctm_gsg9_variantc.vmdl\",\n                \"agents/models/ctm_gsg9_variantd.vmdl\",\n                \"agents/models/ctm_idf/ctm_idf.vmdl\",\n                \"agents/models/ctm_idf/ctm_idf_variantb.vmdl\",\n                \"agents/models/ctm_idf/ctm_idf_variantc.vmdl\",\n                \"agents/models/ctm_idf/ctm_idf_variantd.vmdl\",\n                \"agents/models/ctm_idf/ctm_idf_variante.vmdl\",\n                \"agents/models/ctm_idf/ctm_idf_variantf.vmdl\",\n                \"agents/models/ctm_sas/ctm_sas.vmdl\",\n                \"agents/models/ctm_sas/ctm_sas_variantf.vmdl\",\n                \"agents/models/ctm_swat/ctm_swat.vmdl\",\n                \"agents/models/ctm_swat/ctm_swat_varianta.vmdl\",\n                \"agents/models/ctm_swat/ctm_swat_variantb.vmdl\",\n                \"agents/models/ctm_swat/ctm_swat_variantc.vmdl\",\n                \"agents/models/ctm_swat/ctm_swat_variantd.vmdl\",\n                \"agents/models/ctm_heavy/ctm_heavy.vmdl\",\n            ],\n            \"t\": [\n                \"agents/models/tm_balkan/tm_balkan_variante.vmdl\",\n                \"agents/models/tm_balkan/tm_balkan_varianta.vmdl\",\n                \"agents/models/tm_balkan/tm_balkan_variantb.vmdl\",\n                \"agents/models/tm_balkan/tm_balkan_variantc.vmdl\",\n                \"agents/models/tm_balkan/tm_balkan_variantd.vmdl\",\n                \"agents/models/tm_balkan/tm_balkan_variantf.vmdl\",\n                \"agents/models/tm_balkan/tm_balkan_variantg.vmdl\",\n                \"agents/models/tm_balkan/tm_balkan_varianth.vmdl\",\n                \"agents/models/tm_balkan/tm_balkan_varianti.vmdl\",\n                \"agents/models/tm_balkan/tm_balkan_variantj.vmdl\",\n                \"agents/models/tm_leet/tm_leet_variante.vmdl\",\n                \"agents/models/tm_leet/tm_leet_varianta.vmdl\",\n                \"agents/models/tm_leet/tm_leet_variantb.vmdl\",\n                \"agents/models/tm_leet/tm_leet_variantc.vmdl\",\n                \"agents/models/tm_leet/tm_leet_variantd.vmdl\",\n                \"agents/models/tm_leet/tm_leet_variantf.vmdl\",\n                \"agents/models/tm_leet/tm_leet_varianth.vmdl\",\n                \"agents/models/tm_leet/tm_leet_variantg.vmdl\",\n                \"agents/models/tm_leet/tm_leet_varianti.vmdl\",\n                \"agents/models/tm_anarchist/tm_anarchist.vmdl\",\n                \"agents/models/tm_anarchist/tm_anarchist_varianta.vmdl\",\n                \"agents/models/tm_anarchist/tm_anarchist_variantb.vmdl\",\n                \"agents/models/tm_anarchist/tm_anarchist_variantc.vmdl\",\n                \"agents/models/tm_anarchist/tm_anarchist_variantd.vmdl\",\n                \"agents/models/tm_phoenix/tm_phoenix.vmdl\",\n                \"agents/models/tm_phoenix/tm_phoenix_varianta.vmdl\",\n                \"agents/models/tm_phoenix/tm_phoenix_variantb.vmdl\",\n                \"agents/models/tm_phoenix/tm_phoenix_variantc.vmdl\",\n                \"agents/models/tm_phoenix/tm_phoenix_variantd.vmdl\",\n                \"agents/models/tm_pirate/tm_pirate.vmdl\",\n                \"agents/models/tm_pirate/tm_pirate_varianta.vmdl\",\n                \"agents/models/tm_pirate/tm_pirate_variantb.vmdl\",\n                \"agents/models/tm_pirate/tm_pirate_variantc.vmdl\",\n                \"agents/models/tm_pirate/tm_pirate_variantd.vmdl\",\n                \"agents/models/tm_professional/tm_professional.vmdl\",\n                \"agents/models/tm_professional_const1.vmdl\",\n                \"agents/models/tm_professional_const2.vmdl\",\n                \"agents/models/tm_professional_const3.vmdl\",\n                \"agents/models/tm_professional_const4.vmdl\",\n                \"agents/models/tm_separatist/tm_separatist.vmdl\",\n                \"agents/models/tm_separatist/tm_separatist_varianta.vmdl\",\n                \"agents/models/tm_separatist/tm_separatist_variantb.vmdl\",\n                \"agents/models/tm_separatist/tm_separatist_variantc.vmdl\",\n                \"agents/models/tm_separatist/tm_separatist_variantd.vmdl\",\n                \"agents/models/tm_phoenix/tm_phoenix_variantg.vmdl\",\n                \"agents/models/tm_phoenix/tm_phoenix_variante.vmdl\",\n                \"agents/models/tm_phoenix/tm_phoenix_variantf.vmdl\",\n                \"agents/models/tm_phoenix_heavy/tm_phoenix_heavy.vmdl\",\n            ]\n        };\n        return PlayerModels[team][Math.floor(Math.random() * PlayerModels[team].length)];\n    }\n    function _GetRandomAccolades() {\n        function _GetRandomAccoladeTitle() {\n            const titles = [\n                \"kills\",\n                \"damage\",\n                \"adr\",\n                \"mvps\",\n                \"assists\",\n                \"hsp\",\n                \"3k\",\n                \"4k\",\n                \"5k\",\n                \"headshotkills\",\n                \"killreward\",\n                \"utilitydamage\",\n                \"enemiesflashed\",\n                \"objective\",\n                \"worth\",\n                \"score\",\n                \"livetime\",\n                \"deaths\",\n                \"nopurchasewins\",\n                \"clutchkills\",\n                \"footsteps\",\n                \"pistolkills\",\n                \"firstkills\",\n                \"sniperkills\",\n                \"roundssurvived\",\n                \"chickenskilled\",\n                \"killswhileblind\",\n                \"bombcarrierkills\",\n                \"burndamage\",\n                \"cashspent\",\n                \"uniqueweaponkills\",\n                \"gimme_01\",\n                \"gimme_02\",\n                \"gimme_03\",\n                \"gimme_04\",\n                \"gimme_05\",\n                \"gimme_06\",\n            ];\n            return titles[Math.floor(Math.random() * titles.length)];\n        }\n        function _GetRandomAccolade(xuid) {\n            const name = _GetRandomAccoladeTitle();\n            const pos = name.includes(\"gimme_\") ? 1 : 1 + Math.floor(Math.random() * 2);\n            const accolade = {\n                accolade: name,\n                value: Math.floor(Math.random() * 1000),\n                xuid: xuid,\n                position: pos\n            };\n            return accolade;\n        }\n        const oAccolades = {\n            titles: [\n                _GetRandomAccolade(1),\n                _GetRandomAccolade(3),\n                _GetRandomAccolade(5),\n                _GetRandomAccolade(7),\n                _GetRandomAccolade(9),\n                _GetRandomAccolade(2),\n                _GetRandomAccolade(4),\n                _GetRandomAccolade(6),\n                _GetRandomAccolade(8),\n                _GetRandomAccolade(10),\n                _GetRandomAccolade(11),\n                _GetRandomAccolade(13),\n                _GetRandomAccolade(15),\n                _GetRandomAccolade(17),\n                _GetRandomAccolade(19),\n                _GetRandomAccolade(12),\n                _GetRandomAccolade(14),\n                _GetRandomAccolade(16),\n                _GetRandomAccolade(18),\n                _GetRandomAccolade(20),\n            ]\n        };\n        return oAccolades;\n    }\n    function _InternalGetFauxItemId(defid, paintid) {\n        return String(InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(defid, paintid));\n    }\n    function _GetRandomModelDefIndex(teamnum) {\n        const models = [\n            [],\n            [],\n            [\n                4780,\n                4777,\n                4774,\n            ],\n            [\n                4771,\n                4757,\n                4751\n            ],\n        ];\n        const random = _r(0, 2);\n        return (models[teamnum][random]);\n    }\n    let MOCK_TABLE = {};\n    return {\n        AddTable: _AddTable,\n        GetMatchEndWinDataJSO: function _APIGetMatchEndWinDataJSO() { return _APIAccessor(GameStateAPI.GetMatchEndWinDataJSO(), k_GetMatchEndWinDataJSO); },\n        GetScoreDataJSO: function _GetScoreDataJSO() { return _APIAccessor(GameStateAPI.GetScoreDataJSO(), k_GetScoreDataJSO); },\n        GetPlayerName: function _GetPlayerName(xuid) { return _APIAccessor(GameStateAPI.GetPlayerName(xuid), k_GetPlayerName, xuid); },\n        IsFakePlayer: function _IsFakePlayer(xuid) { return _APIAccessor(GameStateAPI.IsFakePlayer(xuid), k_IsFakePlayer); },\n        XPDataJSO: function _XPDataJSO(panel) { return _APIAccessor(panel.XpDataJSO, k_XpDataJSO); },\n        XPShopDataJSO: function _XPShopDataJSO(panel) { return _APIAccessor(panel.XpShopDataJSO, k_XpShopDataJSO); },\n        GetGameModeInternalName: function _GetGameModeInternalName(bUseSkirmishName) { return _APIAccessor(GameStateAPI.GetGameModeInternalName(bUseSkirmishName), k_GetGameModeInternalName); },\n        GetGameModeName: function _GetGameModeName(bUseSkirmishName) { return _APIAccessor(GameStateAPI.GetGameModeName(bUseSkirmishName), k_GetGameModeName); },\n        SkillgroupDataJSO: function _SkillgroupDataJSO(panel) { return _APIAccessor(panel.SkillgroupDataJSO, k_SkillgroupDataJSO); },\n        DropListJSO: function _DropListJSO(panel) { return _APIAccessor(panel.DropListJSO, k_DropListJSO); },\n        GetTimeDataJSO: function _GetTimeDataJSO() { return _APIAccessor(GameStateAPI.GetTimeDataJSO(), k_GetTimeDataJSO); },\n        NextMatchVotingData: function _NextMatchVotingData(panel) { return _APIAccessor(panel.NextMatchVotingData, k_NextMatchVotingData); },\n        GetPlayerStatsJSO: function _GetPlayerStatsJSO(xuid) { return _APIAccessor(MatchStatsAPI.GetPlayerStatsJSO(xuid), k_GetPlayerStatsJSO, xuid); },\n        GetPlayerDataJSO: function _GetPlayerDataJSO() { return _APIAccessor(GameStateAPI.GetPlayerDataJSO(), k_GetPlayerDataJSO); },\n        IsTournamentMatch: function _IsTournamentMatch() { return _APIAccessor(MatchStatsAPI.IsTournamentMatch(), k_IsTournamentMatch); },\n        GetServerName: function _GetServerName() { return _APIAccessor(GameStateAPI.GetServerName(), k_GetServerName); },\n        GetMapName: function _GetMapName() { return _APIAccessor(GameStateAPI.GetMapName(), k_GetMapName); },\n        GetTournamentEventStage: function _GetTournamentEventStage() { return _APIAccessor(GameStateAPI.GetTournamentEventStage(), k_GetTournamentEventStage); },\n        GetGameModeImagePath: function _GetGameModeImagePath() {\n            const path = GameStateAPI.GetGameModeImagePath();\n            const modPath = _APIAccessor(path, k_GetGameModeImagePath);\n            if (typeof modPath === 'string') {\n                return modPath;\n            }\n            return path;\n        },\n        GetMapBSPName: function _GetMapBSPName() { return _APIAccessor(GameStateAPI.GetMapBSPName(), k_GetMapBSPName); },\n        GetPlayerTeamName: function _GetPlayerTeamName(xuid) { return _APIAccessor(GameStateAPI.GetPlayerTeamName(xuid), k_GetPlayerTeamName, xuid); },\n        GetPlayerTeamNumber: function _GetPlayerTeamNumber(xuid) { return _APIAccessor(GameStateAPI.GetPlayerTeamNumber(xuid), k_GetPlayerTeamNumber, xuid); },\n        GetTeamNextRoundLossBonus: function _GetTeamNextRoundLossBonus(team) { return _APIAccessor(GameStateAPI.GetTeamNextRoundLossBonus(team), k_GetTeamNextRoundLossBonus); },\n        AreTeamsPlayingSwitchedSides: function _AreTeamsPlayingSwitchedSides() { return _APIAccessor(GameStateAPI.AreTeamsPlayingSwitchedSides(), k_AreTeamsPlayingSwitchedSides); },\n        AreTeamsPlayingSwitchedSidesInRound: function _AreTeamsPlayingSwitchedSidesInRound(rnd) { return _APIAccessor(GameStateAPI.AreTeamsPlayingSwitchedSidesInRound(rnd), k_AreTeamsPlayingSwitchedSidesInRound); },\n        HasHalfTime: function _HasHalfTime() { return _APIAccessor(GameStateAPI.HasHalfTime(), k_HasHalfTime); },\n        IsDemoOrHltv: function _IsDemoOrHltv() { return _APIAccessor(GameStateAPI.IsDemoOrHltv(), k_IsDemoOrHltv); },\n        IsHLTVAutodirectorOn: function _IsHLTVAutodirectorOn() { return _APIAccessor(GameStateAPI.IsHLTVAutodirectorOn(), k_IsHLTVAutodirectorOn); },\n        GetTeamLogoImagePath: function _GetTeamLogoImagePath(team) { return _APIAccessor(GameStateAPI.GetTeamLogoImagePath(team), k_GetTeamLogoImagePath); },\n        GetTeamLivingPlayerCount: function _GetTeamLivingPlayerCount(team) { return _APIAccessor(GameStateAPI.GetTeamLivingPlayerCount(team), k_GetTeamLivingPlayerCount); },\n        GetTeamTotalPlayerCount: function _GetTeamTotalPlayerCount(team) { return _APIAccessor(GameStateAPI.GetTeamTotalPlayerCount(team), k_GetTeamTotalPlayerCount); },\n        GetTeamClanName: function _GetTeamClanName(team) { return _APIAccessor(GameStateAPI.GetTeamClanName(team), k_GetTeamClanName, team); },\n        IsXuidValid: function _IsXuidValid(xuid) { return _APIAccessor(GameStateAPI.IsXuidValid(xuid), k_IsXuidValid); },\n        GetPlayerSlot: function _GetPlayerSlot(xuid) { return _APIAccessor(GameStateAPI.GetPlayerSlot(xuid), k_GetPlayerSlot, xuid); },\n        GetLocalPlayerXuid: function _GetLocalPlayerXuid() { return _APIAccessor(GameStateAPI.GetLocalPlayerXuid(), k_GetLocalPlayerXuid); },\n        IsLocalPlayerHLTV: function _IsLocalPlayerHLTV() { return _APIAccessor(GameStateAPI.IsLocalPlayerHLTV(), k_IsLocalPlayerHLTV); },\n        GetPlayerStatus: function _GetPlayerStatus(xuid) { return _APIAccessor(GameStateAPI.GetPlayerStatus(xuid), k_GetPlayerStatus); },\n        GetPlayerCommendsLeader: function _GetPlayerCommendsLeader(xuid) { return _APIAccessor(GameStateAPI.GetPlayerCommendsLeader(xuid), k_GetPlayerCommendsLeader); },\n        GetPlayerCommendsFriendly: function _GetPlayerCommendsFriendly(xuid) { return _APIAccessor(GameStateAPI.GetPlayerCommendsFriendly(xuid), k_GetPlayerCommendsFriendly); },\n        GetPlayerCommendsTeacher: function _GetPlayerCommendsTeacher(xuid) { return _APIAccessor(GameStateAPI.GetPlayerCommendsTeacher(xuid), k_GetPlayerCommendsTeacher); },\n        GetPlayerCompetitiveRanking: function _GetPlayerCompetitiveRanking(xuid) { return _APIAccessor(GameStateAPI.GetPlayerCompetitiveRanking(xuid), k_GetPlayerCompetitiveRanking); },\n        GetPlayerCompetitiveWins: function _GetPlayerCompetitiveWins(xuid) { return _APIAccessor(GameStateAPI.GetPlayerCompetitiveWins(xuid), k_GetPlayerCompetitiveWins); },\n        GetPlayerXpLevel: function _GetPlayerXpLevel(xuid) { return _APIAccessor(GameStateAPI.GetPlayerXpLevel(xuid), k_GetPlayerXpLevel, xuid); },\n        GetPlayerScore: function _GetPlayerScore(xuid) { return _APIAccessor(GameStateAPI.GetPlayerScore(xuid), k_GetPlayerScore, xuid); },\n        GetPlayerMVPs: function _GetPlayerMVPs(xuid) { return _APIAccessor(GameStateAPI.GetPlayerMVPs(xuid), k_GetPlayerMVPs, xuid); },\n        GetPlayerKills: function _GetPlayerKills(xuid) { return _APIAccessor(GameStateAPI.GetPlayerKills(xuid), k_GetPlayerKills, xuid); },\n        GetPlayerRoundKills: function GetPlayerRoundKills(xuid) { return _APIAccessor(GameStateAPI.GetPlayerRoundKills(xuid), k_GetPlayerRoundKills, xuid); },\n        GetPlayerAssists: function _GetPlayerAssists(xuid) { return _APIAccessor(GameStateAPI.GetPlayerAssists(xuid), k_GetPlayerAssists, xuid); },\n        GetPlayerDeaths: function _GetPlayerDeaths(xuid) { return _APIAccessor(GameStateAPI.GetPlayerDeaths(xuid), k_GetPlayerDeaths, xuid); },\n        GetPlayerPing: function _GetPlayerPing(xuid) { return _APIAccessor(GameStateAPI.GetPlayerPing(xuid), k_GetPlayerPing, xuid); },\n        GetPlayerColor: function _GetPlayerColor(xuid) { return _APIAccessor(GameStateAPI.GetPlayerColor(xuid), k_GetPlayerColor, xuid); },\n        HasCommunicationAbuseMute: function _HasCommunicationAbuseMute(xuid) { return _APIAccessor(GameStateAPI.HasCommunicationAbuseMute(xuid), k_HasCommunicationAbuseMute); },\n        IsSelectedPlayerMuted: function _IsSelectedPlayerMuted(xuid) { return _APIAccessor(GameStateAPI.IsSelectedPlayerMuted(xuid), k_IsSelectedPlayerMuted); },\n        IsPlayerConnected: function _IsPlayerConnected(xuid) { return _APIAccessor(GameStateAPI.IsPlayerConnected(xuid), k_IsPlayerConnected); },\n        ArePlayersEnemies: function _ArePlayersEnemies(xuid1, xuid2) { return _APIAccessor(GameStateAPI.ArePlayersEnemies(xuid1, xuid2), k_ArePlayersEnemies); },\n        GetPlayerClanTag: function _GetPlayerClanTag(xuid) { return _APIAccessor(GameStateAPI.GetPlayerClanTag(xuid), k_GetPlayerClanTag); },\n        GetPlayerMoney: function _GetPlayerMoney(xuid) { return _APIAccessor(GameStateAPI.GetPlayerMoney(xuid), k_GetPlayerMoney); },\n        GetPlayerActiveWeaponItemId: function _GetPlayerActiveWeaponItemId(xuid) { return _APIAccessor(GameStateAPI.GetPlayerActiveWeaponItemId(xuid), k_GetPlayerActiveWeaponItemId, xuid); },\n        GetPlayerModel: function _GetPlayerModel(xuid) { return _APIAccessor(GameStateAPI.GetPlayerModel(xuid), k_GetPlayerModel, xuid); },\n        GetPlayerItemCT: function _GetPlayerItemCT(panel) { return _APIAccessor(panel.GetPlayerItemCT(), k_GetPlayerItemCT); },\n        GetPlayerItemTerrorist: function _GetPlayerItemTerrorist(panel) { return _APIAccessor(panel.GetPlayerItemTerrorist(), k_GetPlayerItemTerrorist); },\n        GetCharacterDefaultCheerByXuid: function _GetCharacterDefaultCheerByXuid(xuid) { return _APIAccessor(GameStateAPI.GetCharacterDefaultCheerByXuid(xuid), k_GetCharacterDefaultCheerByXuid, xuid); },\n        GetCharacterDefaultDefeatByXuid: function _GetCharacterDefaultDefeatByXuid(xuid) { return _APIAccessor(GameStateAPI.GetCharacterDefaultDefeatByXuid(xuid), k_GetCharacterDefaultCheerByXuid, xuid); },\n        GetAllPlayersMatchDataJSO: function _GetAllPlayersMatchDataJSO() { return _APIAccessor(GameStateAPI.GetAllPlayersMatchDataJSO(), k_GetAllPlayersMatchDataJSO); },\n        GetPlayerCharacterItemID: function _GetPlayerCharacterItemID(xuid) { return _APIAccessor(GameStateAPI.GetPlayerCharacterItemID(xuid), k_GetPlayerCharacterItemID); },\n        GetFauxItemIDFromDefAndPaintIndex: function _GetFauxItemIDFromDefAndPaintIndex(defindex, paintid) { return _APIAccessor(InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(defindex, paintid), k_GetFauxItemIDFromDefAndPaintIndex); },\n        GetPlayerCompetitiveRankType: function _GetPlayerCompetitiveRankType(xuid) { return _APIAccessor(GameStateAPI.GetPlayerCompetitiveRankType(xuid), k_GetPlayerCompetitiveRankType, xuid); },\n        bSkillgroupDataReady: function _bSkillgroupDataReady(panel) { return _APIAccessor(panel.bSkillgroupDataReady, k_bSkillgroupDataReady); },\n        bXpDataReady: function _bXpDataReady(panel) { return _APIAccessor(panel.bXpDataReady, k_bXpDataReady); },\n        bXpShopDataReady: function _bXpShopDataReady(panel) { return _APIAccessor(panel.bXpShopDataReady, k_bXpShopDataReady); },\n        GetPipRankCount: function _GetPipRankCount(type) { return _APIAccessor(MyPersonaAPI.GetPipRankCount(type), k_GetPipRankCount); },\n        GetPlayerPremierRankStatsObject: function (xuid) { return _APIAccessor(GameStateAPI.GetPlayerPremierRankStatsObject(xuid), k_GetPlayerPremierRankStatsObject, xuid); },\n        SetMockData: _SetMockData,\n        GetMockData: _GetMockData,\n    };\n})();\n(function () {\n})();\n","scripts/mute_spinner.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\nvar MuteSpinner;\n(function (MuteSpinner) {\n    let m_curVal;\n    let m_isMuted;\n    let m_hFadeOutMuteBar = undefined;\n    function HasXuid(elPanel) {\n        return 'xuid' in elPanel;\n    }\n    function ToggleMute() {\n        let elSpinner = $.GetContextPanel().FindChildTraverse('id-mute-spinner');\n        const elParent = $.GetContextPanel().GetParent();\n        if (HasXuid(elParent)) {\n            let xuid = elParent.xuid;\n            GameStateAPI.ToggleMute(xuid);\n            UpdateVolumeDisplay();\n        }\n    }\n    MuteSpinner.ToggleMute = ToggleMute;\n    function _GetCurrentValues() {\n        const elParent = $.GetContextPanel().GetParent();\n        if (HasXuid(elParent)) {\n            let xuid = elParent.xuid;\n            m_curVal = GameStateAPI.GetPlayerVoiceVolume(xuid).toFixed(2);\n            m_isMuted = GameStateAPI.IsSelectedPlayerMuted(xuid);\n            let locMsg = GameStateAPI.HasCommunicationBan(xuid) ? '#tooltip_cannot_unmute' : '#tooltip_mute';\n            $.GetContextPanel().SetDialogVariableLocString('mute_tooltip_message', locMsg);\n            if (m_isMuted === undefined)\n                m_isMuted = false;\n        }\n    }\n    function _OnValueChanged(panel, flNewVal) {\n        const elParent = $.GetContextPanel().GetParent();\n        if (HasXuid(elParent)) {\n            let xuid = elParent.xuid;\n            let sNewVal = flNewVal.toFixed(2);\n            _GetCurrentValues();\n            if (m_curVal != sNewVal) {\n                GameStateAPI.SetPlayerVoiceVolume(xuid, Number(sNewVal));\n                UpdateVolumeDisplay();\n                let elMuteBar = $.GetContextPanel().FindChildTraverse('id-mute-bar');\n                if (elMuteBar) {\n                    elMuteBar.RemoveClass(\"fade\");\n                    elMuteBar.style.height = Number(m_curVal) * 100 + \"%\";\n                    if (m_hFadeOutMuteBar != undefined)\n                        $.CancelScheduled(m_hFadeOutMuteBar);\n                    m_hFadeOutMuteBar = $.Schedule(0.5, () => {\n                        elMuteBar.AddClass(\"fade\");\n                        m_hFadeOutMuteBar = undefined;\n                    });\n                }\n            }\n        }\n    }\n    function UpdateVolumeDisplay() {\n        _GetCurrentValues();\n        $.GetContextPanel().SetDialogVariable('value', (Number(m_curVal) * 100).toFixed(0));\n        let elSpinner = $.GetContextPanel().FindChildTraverse('id-mute-spinner');\n        let elSpinnerBar = $.GetContextPanel().FindChildTraverse('id-mute-bar');\n        if (!elSpinnerBar || !elSpinnerBar.IsValid())\n            return;\n        let elSpinnerLabel = $.GetContextPanel().FindChildTraverse('id-mute-value');\n        if (!elSpinnerLabel || !elSpinnerLabel.IsValid())\n            return;\n        let elMutedImage = $.GetContextPanel().FindChildTraverse('id-mute-muted-img');\n        if (!elMutedImage || !elMutedImage.IsValid())\n            return;\n        if (m_isMuted) {\n            elMutedImage.RemoveClass(\"hidden\");\n            elSpinnerLabel.AddClass(\"hidden\");\n            elSpinnerBar.AddClass(\"hidden\");\n            elSpinner.AddClass('muted');\n        }\n        else {\n            elMutedImage.AddClass(\"hidden\");\n            elSpinnerLabel.RemoveClass(\"hidden\");\n            elSpinnerBar.RemoveClass(\"hidden\");\n            elSpinner.RemoveClass('muted');\n        }\n        elSpinner.spinlock = m_isMuted;\n    }\n    MuteSpinner.UpdateVolumeDisplay = UpdateVolumeDisplay;\n    {\n        $.RegisterEventHandler(\"SpinnerValueChanged\", $.GetContextPanel(), _OnValueChanged);\n    }\n})(MuteSpinner || (MuteSpinner = {}));\n","scripts/new_news_entry_check.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\nvar NewNewsEntryCheck;\n(function (NewNewsEntryCheck) {\n    let _m_RSSFeedReceivedEventHandler = null;\n    function GetRssFeed() {\n        BlogAPI.RequestRSSFeed();\n    }\n    NewNewsEntryCheck.GetRssFeed = GetRssFeed;\n    function _OnRssFeedReceived(feed) {\n        let feeds = [\n            {\n                linkmatch: '/newsentry/',\n                cvarname: 'ui_news_last_read_link',\n                processed: false\n            },\n            {\n                linkmatch: '/newsentry2/',\n                cvarname: 'ui_news_last_read_link2',\n                processed: false\n            }\n        ];\n        feed['items'].forEach(function (item, i) {\n            if (item.categories.includes('Minor'))\n                return;\n            feeds.forEach(function (feed) {\n                if (feed.processed)\n                    return;\n                const urlpos = item.link.indexOf(feed.linkmatch);\n                if (urlpos === -1)\n                    return;\n                feed.processed = true;\n                const postid = item.link.substring(urlpos + feed.linkmatch.length);\n                const lastseen = GameInterfaceAPI.GetSettingString(feed.cvarname);\n                if (postid === lastseen)\n                    return;\n                UiToolkitAPI.ShowCustomLayoutPopupParameters('', 'file://{resources}/layout/popups/popup_news.xml', 'date=' + item.date + \"&\" +\n                    'title=' + item.title + \"&\" +\n                    'link=' + item.link);\n                GameInterfaceAPI.SetSettingString(feed.cvarname, postid);\n            });\n        });\n    }\n    function RegisterForRssReceivedEvent() {\n        if (!_m_RSSFeedReceivedEventHandler)\n            _m_RSSFeedReceivedEventHandler = $.RegisterForUnhandledEvent(\"PanoramaComponent_Blog_RSSFeedReceived\", _OnRssFeedReceived);\n    }\n    NewNewsEntryCheck.RegisterForRssReceivedEvent = RegisterForRssReceivedEvent;\n    function UnRegisterForRssReceivedEvent() {\n        if (_m_RSSFeedReceivedEventHandler) {\n            $.UnregisterForUnhandledEvent(\"PanoramaComponent_Blog_RSSFeedReceived\", _m_RSSFeedReceivedEventHandler);\n            _m_RSSFeedReceivedEventHandler = null;\n        }\n    }\n    NewNewsEntryCheck.UnRegisterForRssReceivedEvent = UnRegisterForRssReceivedEvent;\n    {\n        GetRssFeed();\n    }\n})(NewNewsEntryCheck || (NewNewsEntryCheck = {}));\n","scripts/notification/notification_equip.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\nvar EquipNotification;\n(function (EquipNotification) {\n    function ShowEquipNotification(elPanel, slot, itemId) {\n        if (!elPanel || !InventoryAPI.IsItemInfoValid(itemId))\n            return;\n        if (elPanel.BHasClass('show')) {\n            elPanel.RemoveClass('show');\n        }\n        if (itemId === '0') {\n            DisplayNotification(elPanel, itemId, '');\n            return;\n        }\n        let team = '';\n        let teamsList = ['ct', 't', 'noteam'];\n        for (let i = 0; i < teamsList.length; i++) {\n            itemId = (itemId === '0') ? LoadoutAPI.GetDefaultItem(teamsList[i], slot) : itemId;\n            let teamsEquippedList = WhatTeamIsDefaultItemEquippedFor(itemId, teamsList);\n            if (teamsEquippedList.length > 0) {\n                team = (teamsEquippedList.length > 1) ? 'bothteams' : teamsEquippedList[0];\n                break;\n            }\n        }\n        DisplayNotification(elPanel, itemId, team);\n    }\n    EquipNotification.ShowEquipNotification = ShowEquipNotification;\n    function DisplayNotification(elPanel, itemId, team) {\n        let descText = '';\n        if (itemId === '0') {\n            descText = $.Localize('#inv_unequipp_item');\n        }\n        else {\n            descText = MakeDescString(elPanel, itemId, team);\n        }\n        let elLabel = elPanel.FindChildInLayoutFile('InvNotificationLabel');\n        elLabel.text = descText;\n        elPanel.AddClass('show');\n    }\n    function WhatTeamIsDefaultItemEquippedFor(itemId, teamsList) {\n        return teamsList.filter(team => InventoryAPI.IsEquipped(itemId, team));\n    }\n    function MakeDescString(elPanel, id, team) {\n        let rarityColor = InventoryAPI.GetItemRarityColor(id);\n        let sName = InventoryAPI.HasCustomName(id) ? $.HTMLEscape(InventoryAPI.GetItemNameCustomized(id)) : InventoryAPI.GetItemName(id);\n        let itemName = '<font color=\"' + rarityColor + '\">' + sName + '</font>';\n        elPanel.SetDialogVariable('name', itemName);\n        if (team === 'noteam') {\n            return $.Localize('#inv_equipped_item_noteam', elPanel);\n        }\n        else {\n            let hintString = '';\n            if (team === 'bothteams') {\n                hintString = '#inv_team_both';\n            }\n            else {\n                hintString = '#SFUI_InvUse_Equipped_' + team;\n            }\n            elPanel.SetDialogVariable('team', $.Localize(hintString));\n            return $.Localize('#inv_equipped_item', elPanel);\n        }\n    }\n})(EquipNotification || (EquipNotification = {}));\n","scripts/operation/operation_main.js":"'use strict';\n\n\nvar OperationMain = ( function() \n{\n\tvar _m_cp = $.GetContextPanel();\n\tvar _m_nSeasonAccess;\n\tvar _m_oProgressFlipModule = null;\n\tvar _m_oNamesFlipModuleInspect = null;\n\tvar _m_activeRewardBtn = null;\n\tconst SECTIONS_IN_BAR = 100;\n\n\tvar _CheckUsersOperationStatus = function()\n\t{\n\t\t_m_nSeasonAccess = $.GetContextPanel().GetAttributeInt( \"season_access\", 0 );\n\n\t\tOperationUtil.ValidateOperationInfo( _m_nSeasonAccess );\n\t\tvar oStatus = OperationUtil.GetOperationInfo();\n\n\t\tif ( _m_nSeasonAccess === -1 ||\n\t\t\t!_m_nSeasonAccess ||\n\t\t\toStatus.nCoinRank === -1 ||\n\t\t\toStatus.nCoinRank === undefined ||\n\t\t\toStatus.nCoinRank === null )\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t_m_activeRewardBtn = null;\n\t\t_SetupHeader( oStatus );\n\n\t\tvar indexToOpenTo = _m_cp.GetAttributeInt( \"start_reward\", -1 );\n\t\t                                                                                   \n\t\t_m_cp.SetAttributeInt( \"start_reward\", -1 );\n\n\t\t                                         \n\t\t_UpdateDefaultProgressData( oStatus, indexToOpenTo );\n\n\t\t                        \n\t\t_UpdateRewardTiles();\n\n\t\tvar elVisibleBar = _m_oProgressFlipModule.DetermineVisiblePanel(\n\t\t\t_m_oProgressFlipModule.oData.animPanelA,\n\t\t\t_m_oProgressFlipModule.oData.animPanelB\n\t\t);\n\n\t\t                                                         \n\t\t_UpdateProgressBarSections( _m_oProgressFlipModule.oData, elVisibleBar );\n\t\t\n\t\t                                                                    \n\t\tvar oRewardToHighlight = _GetRewardToHighlight( indexToOpenTo );\n\n\t\t                                                                 \n\t\t_UpdateRewardsOnProgressBar( elVisibleBar, oRewardToHighlight );\n\t\t\n\t\tvar aChildren = elVisibleBar.FindChildInLayoutFile( 'op-main-progressbar-rewards' ).Children();\n\t\t                        \n\n\t\t_m_activeRewardBtn = aChildren.filter( element =>\n\t\t\telement.Data().oReward.itempremium.ids[ 0 ] === oRewardToHighlight.itempremium.ids[ 0 ] &&\n\t\t\telement.Data().oReward.idx === oRewardToHighlight.idx\n\t\t)[ 0 ];\n\t\t\n\t\t_SetActiveReward( _m_activeRewardBtn );\n\t\t_ShowPurchaseSpecificStarsBtn();\n\t\t_SetCheckedMatchingTile();\n\n\t\t                                                                                                                    \n\t\t$.Schedule( 0.3, _UpdateInspectPanel );\n\t\t_SetPurchaseBtn();\n\t};\n\n\tvar _SetupHeader = function( oStatus )\n\t{\n\t\tif ( oStatus.bPremiumUser )\n\t\t{\n\t\t\t$.GetContextPanel().SetDialogVariableInt( 'total_value', oStatus.nTierUnlocked );\n\t\t}\n\n\t\t$.GetContextPanel().FindChildInLayoutFile( 'id-op-main-header' ).visible = oStatus.bPremiumUser;\n\t\t$.GetContextPanel().FindChildInLayoutFile( 'id-op-main-header-preview' ).visible = !oStatus.bPremiumUser;\n\t};\n\n\tvar _SetPurchaseBtn = function( )\n\t{\n\t\tvar elUpSell = $.GetContextPanel().FindChildInLayoutFile( 'op-main-upsell' );\n\n\t\tvar bPremiumUser = OperationUtil.GetOperationInfo().bPremiumUser;\n\t\tvar sUserOwnedOperationPassItemID = InventoryAPI.GetActiveSeasonPassItemId();\n\t\tvar sFauxPassItemID = OperationUtil.GetPassFauxId();\n\n\t\telUpSell.FindChildInLayoutFile( 'op-main-upsell-label' ).text = $.Localize( bPremiumUser ?\n\t\t\t'#op_get_more_stars' : sUserOwnedOperationPassItemID ? \n\t\t\t'#SFUI_ConfirmBtn_ActivatePassNow' : '#op_get_premium'\n\t\t\t).toUpperCase();\n\n\t\tvar imgPath = bPremiumUser ?\n\t\t\t'file://{images}/icons/ui/shoppingcart.svg' :\n\t\t\t'file://{images}/icons/ui/ticket.svg';\n\t\t\n\t\telUpSell.FindChildInLayoutFile( 'op-main-upsell-image' ).SetImage( imgPath );\n\t\telUpSell.SetPanelEvent( 'onactivate', OperationUtil.OpenUpSell.bind( undefined ) );\n\n\t\t  \n\t\t                               \n\t\t  \n\t\tvar elPassSaleDiscount = elUpSell.FindChildInLayoutFile( 'id-op-reward-open-operation-hub-passsalediscount' );\n\t\telPassSaleDiscount.visible = ( !bPremiumUser && sUserOwnedOperationPassItemID ) ? false : true;\n\t\tvar sPctReduction = StoreAPI.GetStoreItemPercentReduction( sFauxPassItemID );\n\t\tif ( bPremiumUser )\n\t\t{\n\t\t\tsPctReduction = '';\n\t\t\tvar minDiscount, maxDiscount;\n\t\t\tvar storeids = OperationUtil.GetOperationStarDefIdxArray();\n\t\t\tstoreids.forEach( function( defIndex )\n\t\t\t{\n\t\t\t\tvar sPctReductionPerStar = StoreAPI.GetStoreItemPercentReduction(\n\t\t\t\t\tInventoryAPI.GetFauxItemIDFromDefAndPaintIndex( defIndex, 0 )\n\t\t\t\t\t);\n\t\t\t\tif ( sPctReductionPerStar && sPctReductionPerStar !== '-0%' )\n\t\t\t\t{\n\t\t\t\t\tvar numericStarDiscount = parseInt( sPctReductionPerStar );\n\t\t\t\t\tif ( sPctReduction )\n\t\t\t\t\t{\n\t\t\t\t\t\tsPctReduction += ' / ';\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tminDiscount = numericStarDiscount;\n\t\t\t\t\t\tmaxDiscount = numericStarDiscount;\n\t\t\t\t\t}\n\t\t\t\t\tsPctReduction += sPctReductionPerStar;\n\n\t\t\t\t\tif ( numericStarDiscount < minDiscount ) minDiscount = numericStarDiscount;\n\t\t\t\t\tif ( numericStarDiscount > maxDiscount ) maxDiscount = numericStarDiscount;\n\t\t\t\t}\n\t\t\t} );\n\t\t\t\n\t\t\tif ( sPctReduction )\n\t\t\t{\n\t\t\t\telPassSaleDiscount.SetDialogVariable( 'salediscount', ''+minDiscount+'%' );\n\t\t\t\tsPctReduction = $.Localize( '#Store_Price_UpToSale', elPassSaleDiscount ).toUpperCase();\n\t\t\t}\n\t\t}\n\t\tif ( sPctReduction && sPctReduction !== '-0%' )\n\t\t\telPassSaleDiscount.text = sPctReduction;\n\t\telse\n\t\t\telPassSaleDiscount.visible = false;\n\t};\n\n\tvar _UpdateDefaultProgressData = function( oStatus, openToRewardIndex )\n\t{\n\t\tvar oCallbackData = {\n\t\t\tnTierUnlocked: oStatus.nTierUnlocked,\n\t\t\tsectionStart: 0,\n\t\t\tsectionEnd: 0\n\t\t};\n\n\t\t                                    \n\t\t                                                \n\t\t                                                         \n\t\tvar activeIndex = openToRewardIndex > -1 ? Math.floor( openToRewardIndex / SECTIONS_IN_BAR ) : Math.floor( oStatus.nTierUnlocked / SECTIONS_IN_BAR );\n\t\t_m_oProgressFlipModule.CallbackData = oCallbackData;\n\t\t_m_oProgressFlipModule.ActiveIndex = activeIndex;\n\t\t_m_oProgressFlipModule.AddParamToCallbackData( 'maxIndex', activeIndex );\n\t\t_m_oProgressFlipModule.AddParamToCallbackData( 'sectionStart', ( SECTIONS_IN_BAR * activeIndex ) );\n\t\t_m_oProgressFlipModule.AddParamToCallbackData( 'sectionEnd', ( SECTIONS_IN_BAR * activeIndex ) + SECTIONS_IN_BAR );\n\n\t\t_UpdateProgressBarEnableDisable( _m_oProgressFlipModule.oData );\n\t\t\n\t\t                                                                  \n\t\t                                        \n\t};\n\n\t                        \n\t                        \n\t                        \n\tvar _UpdateRewardTiles = function(  )\n\t{\n\t\tvar aTiles = _GetRewardsForTiles();\n\n\t\tif ( aTiles.length < 1 )\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tfunction GetPanel ( idPrefix, modifier, elParent, panelType, snippetToLoad = '' )\n\t\t{\n\t\t\tvar elPanel = elParent.FindChildInLayoutFile( idPrefix + modifier );\n\t\t\tif ( !elPanel )\n\t\t\t{\n\t\t\t\telPanel = $.CreatePanel( panelType, elParent, idPrefix + modifier );\n\n\t\t\t\tif ( snippetToLoad )\n\t\t\t\t{\n\t\t\t\t\telPanel.BLoadLayoutSnippet( snippetToLoad );\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\treturn elPanel;\n\t\t}\n\t\tvar elParent = _m_cp.FindChildInLayoutFile( 'id-op-rewards-list' );\n\t\t                                                                      \n\t\tvar currentRow = 0;\n\t\tvar maxTiles = 12;\n\t\tvar numTileRow = 0;\n\n\t\tfor ( var i = 0; i < maxTiles; i++ )\n\t\t{\n\t\t\t                                                            \n\t\t\tnumTileRow = aTiles[ i ] ? parseInt( aTiles[ i ].rewardsData[ 0 ].uiOrder ) : numTileRow;\n\t\t\tif( numTileRow !== currentRow )\n\t\t\t{\n\t\t\t\tcurrentRow = numTileRow;\n\t\t\t\tvar elTitle  = GetPanel( 'id-op-rewards-section-', currentRow, elParent, 'Label' );\n\t\t\t\telTitle.text = $.Localize( '#op_rewards_section_'+ currentRow );\n\t\t\t\telTitle.AddClass( 'op-main-progress__title' );\n\n\t\t\t\tvar elRow = GetPanel( 'id-op-rewards-row-', currentRow, elParent, 'Panel' );\n\t\t\t\telRow.AddClass( 'op-main-rewards_row' );\n\t\t\t}\n\n\t\t\tvar elTile = GetPanel( 'id-op-rewards-list-tile-', i, elRow, 'RadioButton', 'reward-tile' );\n\n\t\t\tif( i >= aTiles.length)\n\t\t\t{\n\t\t\t\telTile.SetHasClass( 'hidden', true );\n\t\t\t\tif( elTile.checked )\n\t\t\t\t{\n\t\t\t\t\telTile.checked = false;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\telTile.SetHasClass( 'hidden', false );\n\t\t\tif ( aTiles[ i ].rewardsData[ 0 ].imagePath )\n\t\t\t{\n\t\t\t\telTile.FindChildInLayoutFile( 'id-op-reward-image' ).SetImage( 'file://{images}' + aTiles[ i ].rewardsData[ 0 ].imagePath + '.png' );\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\telTile.FindChildInLayoutFile( 'id-op-reward-image' ).itemid = aTiles[ i ].rewardId;\n\t\t\t}\n\n\t\t\telTile.SetHasClass( 'small', currentRow !== 1 );\n\t\t\telTile.FindChildInLayoutFile( 'id-op-reward-name' ).text = InventoryAPI.GetItemName( aTiles[ i ].rewardId );\n\t\t\t                                                                                                 \n\n\t\t\t                                                                                                                                \n\t\t\telTile.Data().oReward = aTiles[ i ].rewardsData[ 0 ];\n\t\t\telTile.Data().showSingleReward = aTiles[ i ].rewardsData.length === 1 ? true : false;\n\t\t\telTile.Data().nCategoryButtonIdx = i;                                                                                                                         \n\t\t\telTile.SetPanelEvent( 'onactivate', _OnSelectReward.bind( undefined, elTile ) );\n\n\t\t\t_CacheWeaponMouseOver( elTile, aTiles[ i ].rewardId  );\n\t\t}\n\t};\n\n\tvar _GetRewardsForTiles = function()\n\t{\n\t\tvar aRewards = OperationUtil.GetRewardsData();\n\t\tvar aTiles = [];\n\n\t\tfor ( var i = _m_oProgressFlipModule.oData.oCallbackData.sectionStart;\n\t\t\ti < _m_oProgressFlipModule.oData.oCallbackData.sectionEnd;\n\t\t\ti++ )\n\t\t{\n\t\t\tif ( aRewards[ i ].isGap !== \"none\" )\n\t\t\t{\n\t\t\t\tvar rewardId = aRewards[ i ].itempremium.ids[ 0 ];\n\n\t\t\t\t                                                                     \n\n\t\t\t\tif ( !aTiles.find( tile =>\n\t\t\t\t{\n\t\t\t\t\treturn tile[ 'rewardId' ] && ( tile[ 'rewardId' ] === rewardId ) ? true : false;\n\t\t\t\t} ) )\n\t\t\t\t{\n\t\t\t\t\taTiles.push( {\n\t\t\t\t\t\trewardId: rewardId,\n\t\t\t\t\t\trewardsData: aRewards.filter( reward =>\n\t\t\t\t\t\t\t( reward.idx >= _m_oProgressFlipModule.oData.oCallbackData.sectionStart &&\n\t\t\t\t\t\t\treward.idx <= _m_oProgressFlipModule.oData.oCallbackData.sectionEnd ) &&\n\t\t\t\t\t\t\treward.itempremium.ids[ 0 ] === rewardId )\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\taTiles.sort( function( a, b ) { return parseInt( a.rewardsData[ 0 ].uiOrder ) - parseInt( b.rewardsData[ 0 ].uiOrder ); } );\n\t\treturn aTiles;\n\t};\n\n\tvar _UpdateProgressBarEnableDisable = function( oData )\n\t{\n\t\toData.controlBtnPrev.enabled = oData.activeIndex > 0;\n\t\toData.controlBtnNext.enabled = oData.activeIndex < oData.oCallbackData.maxIndex;\n\n\t\t                                                                         \n\t\toData.controlBtnPrev.visible = oData.oCallbackData.nTierUnlocked >= 100;\n\t\toData.controlBtnNext.visible = oData.oCallbackData.nTierUnlocked >= 100;\n\t};\n\n\tvar _UpdateProgressBarSections = function( oData, elBarParent )\n\t{\n\t\t                                                                  \n\t\t                                        \n\t\t\n\t\tvar elBar = elBarParent.FindChildInLayoutFile( 'op-main-progressbar-sections' );\n\t\telBar.RemoveAndDeleteChildren();\n\n\t\tfor ( var i = oData.oCallbackData.sectionStart; i <= oData.oCallbackData.sectionEnd; i++ )\n\t\t{\n\t\t\tvar elSection = $.CreatePanel( \"Panel\", elBar, \"bar-section-\" + i );\n\t\t\telSection.BLoadLayoutSnippet( \"progressbar-section\" );\n\t\t\telSection.SetHasClass( 'op-main-progress__bar__inner--fill', i < oData.oCallbackData.nTierUnlocked );\n\t\t}\n\t};\n\n\tvar _UpdateRewardsOnProgressBar = function( elBar, oRewardTohighlight = null )\n\t{\n\t\tvar aGetRewardsInRange = _GetRewardsInRange();\n\n\t\tif ( !aGetRewardsInRange || aGetRewardsInRange.length < 1 )\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t_UpdateRewardPanelsOnProgressBar( _GetRewardsInRange(), elBar, oRewardTohighlight );\n\t};\n\n\tvar _GetRewardToHighlight = function( rewardTohighlightIndex )\n\t{\n\t\t                                                                                         \n\t\tvar oRewards = OperationUtil.GetRewardsData();\n\t\tvar count = oRewards.length;\n\n\t\tif ( rewardTohighlightIndex > -1 )\n\t\t{\n\t\t\treturn oRewards[ rewardTohighlightIndex ];\n\t\t}\n\n\t\tfor ( var i = _m_oProgressFlipModule.oData.oCallbackData.nTierUnlocked; i < count; i++ )\n\t\t{\n\t\t\tif ( !oRewards[ i ].isUnlocked && !oRewards[ i ].isGap )\n\t\t\t{\n\t\t\t\t                                                            \n\t\t\t\treturn oRewards[ i ];\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t};\n\n\tvar _GetRewardsInRange = function()\n\t{\n\t\tvar oAllRewards = OperationUtil.GetRewardsData();\n\t\tvar aGetRewardsInRange = oAllRewards.filter( reward => !reward.isGap  &&\n\t\t\t( reward.idx >= _m_oProgressFlipModule.oData.oCallbackData.sectionStart &&\n\t\t\treward.idx <= _m_oProgressFlipModule.oData.oCallbackData.sectionEnd ) \n\t\t);\n\t\t\n\t\treturn aGetRewardsInRange;\n\t};\n\n\tvar _UpdateRewardPanelsOnProgressBar = function( aGetRewardsInRange, elBar, oRewardToHighlight = null )\n\t{\n\t\tvar elRewardsPanel = elBar.FindChildInLayoutFile( \"op-main-progressbar-rewards\" );\n\t\t                                           \n\n\t\taGetRewardsInRange.forEach(function( reward, index )\n\t\t{\n\t\t\tvar elReward = elRewardsPanel.FindChildInLayoutFile( \"bar-reward-\" + reward.idx );\n\t\t\tvar bPlayAnim = false;                                                   \n\n\t\t\tif ( !elReward )\n\t\t\t{\n\t\t\t\tvar elReward = $.CreatePanel( \"RadioButton\", elRewardsPanel, \"bar-reward-\" + reward.idx, { group: 'bar-reward' } );\n\t\t\t\telReward.BLoadLayoutSnippet( \"progressbar-reward\" );\n\t\t\t\tbPlayAnim = true;\n\t\t\t\telReward.Data().showSingleReward = true;\n\t\t\t\telReward.Data().oReward = reward;\n\t\t\t}\n\n\t\t\t                                                                                                          \n\t\t\t                                                       \n\t\t\t                                                                                          \n\t\t\tif( reward.idx !== elReward.Data().oReward.idx )\n\t\t\t{\n\t\t\t\telReward.Data().oReward = reward;\n\n\t\t\t\tif( elReward.BHasClass( 'highlight' ) )\n\t\t\t\t{\n\t\t\t\t\telReward.RemoveClass( 'highlight' );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( reward.imagePathThumbnail )\n\t\t\t{\n\t\t\t\telReward.FindChildInLayoutFile( 'id-op-progressbar-reward-image' ).SetImage( 'file://{images}' + reward.imagePathThumbnail + '.png' );\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\telReward.FindChildInLayoutFile( 'id-op-progressbar-reward-image' ).itemid = reward.itempremium.ids[ 0 ];\n\t\t\t}\n\t\n\t\t\telReward.SetDialogVariableInt( 'reward_index', reward.idx + 1 );\n\t\t\telReward.FindChildInLayoutFile( 'id-op-progressbar-reward-hitbox' ).SetPanelEvent(\n\t\t\t\t'onactivate',\n\t\t\t\t_OnSelectReward.bind(\n\t\t\t\t\tundefined,\n\t\t\t\t\telReward,\n\t\t\t\t\telBar\n\t\t\t\t) );\n\t\t\t\n\t\t\tvar oAnimInfo = {\n\t\t\t\tpanel: elReward,\n\t\t\t\tbar: elBar,\n\t\t\t\tidx: reward.idx,\n\t\t\t\tplay_anim: bPlayAnim\n\t\t\t};\n\n\t\t\t_CacheWeaponMouseOver( elReward ,reward.itempremium.ids[ 0 ] );\n\t\t\t\n\t\t\t                                                                                           \n\t\t\t                                                                                                                             \n\t\t\tvar rewardTohighlight = _m_activeRewardBtn ? _m_activeRewardBtn.Data().oReward : oRewardToHighlight;\n\t\t\t\n\t\t\tif ( rewardTohighlight )\n\t\t\t{\n\t\t\t\tif ( oRewardToHighlight || _m_activeRewardBtn.Data().showSingleReward )\n\t\t\t\t{\n\t\t\t\t\telReward.SetHasClass( 'highlight',\n\t\t\t\t\t\treward.idx === rewardTohighlight.idx\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\telReward.SetHasClass( 'highlight',\n\t\t\t\t\t\treward.itempremium.ids[ 0 ] === rewardTohighlight.itempremium.ids[ 0 ]\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\telReward.SetHasClass( 'claimed', reward.idx < _m_oProgressFlipModule.oData.oCallbackData.nTierUnlocked );\n\n\t\t\tif ( bPlayAnim )\n\t\t\t{\n\t\t\t\t$.Schedule( 0.25, _PositionRewardOnProgressBar.bind( undefined, oAnimInfo ) );\n\t\t\t}\n\t\t} );\n\t};\n\n\tvar _PositionRewardOnProgressBar = function( oAnimInfo )\n\t{\n\t\tvar elSectionsContainer = oAnimInfo.bar.FindChildInLayoutFile( \"op-main-progressbar-sections\" );\n\t\tvar elSection = elSectionsContainer.FindChild( \"bar-section-\" + ( oAnimInfo.idx ));\n\t\tlet pos = elSection.GetPositionWithinWindow();\n\n\t\tvar widthOffset = -( Math.floor( oAnimInfo.panel.actuallayoutwidth / 2 ) - Math.floor( elSection.actuallayoutwidth / 2 ) ) /\n\t\t\toAnimInfo.panel.actualuiscale_x;\n\t\t\n\t\toAnimInfo.panel.style.x = (( pos.x / oAnimInfo.panel.actualuiscale_x ) + widthOffset ) + 'px;';\n\n\t\tif ( oAnimInfo.play_anim )\n\t\t{\n\t\t\toAnimInfo.panel.TriggerClass( 'op-main-progress__bar__reward__show-anim' );\n\t\t}\n\t};\n\n\t                          \n\t                          \n\t                          \n\tvar _OnSelectReward = function( elSelected, elBar = undefined, bTrackStats = true )\n\t{\n\t\tif ( _m_activeRewardBtn === elSelected )\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\t\n\t\t_SetActiveReward( elSelected );\n\n\t\tvar visibleBar = elBar ?\n\t\t\telBar : _m_oProgressFlipModule.DetermineVisiblePanel(\n\t\t\t\t_m_oProgressFlipModule.oData.animPanelA,\n\t\t\t\t_m_oProgressFlipModule.oData.animPanelB\n\t\t\t);\n\n\t\t_UpdateRewardsOnProgressBar( visibleBar );\n\n\t\tif ( _m_activeRewardBtn.Data().showSingleReward )\n\t\t{\n\t\t\t_SetCheckedMatchingTile();\n\t\t}\n\n\t\t_ShowPurchaseSpecificStarsBtn();\n\t\t\n\t\t                                                               \n\t\t$.Schedule( .3, _UpdateInspectPanel );\n\t};\n\n\tvar _SetActiveReward = function( elSelected )\n\t{\n\t\tif ( _m_activeRewardBtn )\n\t\t{\n\t\t\t_m_activeRewardBtn.checked = false;\n\t\t}\n\t\t\n\t\telSelected.checked = true;\n\t\t_m_activeRewardBtn = elSelected;\n\t\t$.DispatchEvent( 'CSGOPlaySoundEffect', 'UIPanorama.generic_button_press', 'MOUSE' );\n\t};\n\n\tvar _SetCheckedMatchingTile = function()\n\t{\n\t\tvar aChildren = _m_cp.FindChildInLayoutFile( 'id-op-rewards-list' ).FindChildrenWithClassTraverse( 'op-main-reward' );\n\t\taChildren.forEach(element => {\n\t\t\tif (element.Data().oReward) {\n\t\t\t\telement.checked = element.Data().oReward.itempremium.ids[0] ===\n\t\t\t\t\t_m_activeRewardBtn.Data().oReward.itempremium.ids[0]\n\t\t\t}\n\t\t});\n\t};\n\n\tvar _ShowPurchaseSpecificStarsBtn = function()\n\t{\n\t\tvar elPurchaseBtn = _m_cp.FindChildInLayoutFile( 'id-op-rewards-upsell-stars-btn' );\n\n\t\tvar bShow = _m_activeRewardBtn &&\n\t\t\t_m_activeRewardBtn.Data().showSingleReward && OperationUtil.GetOperationInfo().bPremiumUser &&\n\t\t\t( _m_activeRewardBtn.Data().oReward.idx >= OperationUtil.GetOperationInfo().nTierUnlocked );\n\t\t\n\t\telPurchaseBtn.SetHasClass( 'hidden', !bShow );\n\t\t\n\t\tif ( bShow )\n\t\t{\n\t\t\tvar starsNeeded = ( _m_activeRewardBtn.Data().oReward.idx + 1 ) - OperationUtil.GetOperationInfo().nTierUnlocked;\n\t\t\telPurchaseBtn.SetDialogVariableInt( 'stars_needed', starsNeeded );\n\t\t\telPurchaseBtn.TriggerClass( 'update' );\n\t\t\telPurchaseBtn.SetPanelEvent( 'onactivate',\n\t\t\t\tOperationUtil.OpenUpSell.bind(\n\t\t\t\t\tundefined,\n\t\t\t\t\tstarsNeeded\n\t\t\t) );\n\t\t}\n\t};\n\n\t                  \n\t                  \n\t                  \n\tvar _UpdateInspectPanel = function()\n\t{\n\t\tif ( !_m_activeRewardBtn )\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t_m_cp.FindChildInLayoutFile( 'id-op-main-inspect' ).SetHasClass( 'show', true );\n\n\t\tvar rewardId = _m_activeRewardBtn.Data().oReward.itempremium.ids[ 0 ];\n\t\t_m_cp.FindChildInLayoutFile( 'id-op-reward-tag' ).SetHasClass( 'hidden', rewardId !== _GetRewardToHighlight().itempremium.ids[ 0 ] );\n\n\t\tvar itemsList = [];\n\t\tvar toolsKey = InventoryAPI.GetRawDefinitionKey( rewardId, \"inv_container_and_tools\" );\n\t\tvar bIsCase = ( toolsKey === \"weapon_case\" );\n\t\tvar bIsGraffiti = ( toolsKey === \"graffiti_box\" );\n\t\tvar bIsCoin = ( InventoryAPI.GetRawDefinitionKey( rewardId, \"item_type\" ) === \"operation_coin\" );\n\n\t\t_m_activeRewardBtn.Data().bIsGraffiti = bIsGraffiti;\n\t\t_m_activeRewardBtn.Data().bIsCoin = bIsCoin;\n\t\t_UpdateWarning( bIsCoin, bIsCase );\n\n\t\tvar btnPreviewCase = _m_cp.FindChildInLayoutFile( 'id-op-main-inspect-preview-item' );\n\t\tif( bIsCase )\n\t\t{\n\t\t\tif( bIsCase )\n\t\t\t{\n\t\t\t\tbtnPreviewCase.SetPanelEvent( 'onactivate', function()\n\t\t\t\t{\n\t\t\t\t\tUiToolkitAPI.ShowCustomLayoutPopupParameters(\n\t\t\t\t\t\t'',\n\t\t\t\t\t\t'file://{resources}/layout/popups/popup_capability_decodable.xml',\n\t\t\t\t\t\t'key-and-case=,' + rewardId +\n\t\t\t\t\t\t'&' + 'inspectonly=true' +\n\t\t\t\t\t\t'&' + 'asyncworktype=decodeable' +\n\t\t\t\t\t\t'&' + 'asyncworkbtnstyle=hidden' +\n\t\t\t\t\t\t'&' + 'bluroperationpanel=true'\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t\tbtnPreviewCase.SetPanelEvent( 'onmouseover', function()\n\t\t\t\t{\t                                                                                                        \n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar count = InventoryAPI.GetLootListItemsCount( rewardId );\n\t\t\t\n\t\t\tif ( !count )\n\t\t\t{\n\t\t\t\titemsList.push( rewardId );\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tfor ( var i = 0; i < count; i++ )\n\t\t\t\t{\n\t\t\t\t\titemsList.push( InventoryAPI.GetLootListItemIdByIndex( rewardId , i ) );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif( ItemInfo.IsCharacter( itemsList[0] )|| ItemInfo.IsWeapon( itemsList[0] ) )\n\t\t\t{\n\t\t\t\tvar _getSelectedIdInLayoutChildrenRow = function() {\n\t\t\t\t\tvar selectedId = '';\n\t\t\t\t\tvar aPips = _m_cp.FindChildInLayoutFile( 'id-op-main-inspect-rarity' ).Children();\n\t\t\t\t\tif( aPips.length > 0 )\n\t\t\t\t\t{\n\t\t\t\t\t\tselectedId = aPips[0].GetSelectedButton().Data().itemid;\n\t\t\t\t\t}\n\t\t\t\t\treturn selectedId;\n\t\t\t\t};\n\n\t\t\t\tbtnPreviewCase.SetPanelEvent( 'onactivate', function()\n\t\t\t\t{\n\t\t\t\t\tvar selectedId = _getSelectedIdInLayoutChildrenRow();\n\t\t\t\t\tUiToolkitAPI.ShowCustomLayoutPopupParameters(\n\t\t\t\t\t\t'',\n\t\t\t\t\t\t'file://{resources}/layout/popups/popup_inventory_inspect.xml',\n\t\t\t\t\t\t'itemid=' + selectedId +\n\t\t\t\t\t\t'&' + 'inspectonly=true' +\n\t\t\t\t\t\t'&' + 'showallitemactions=false' +\n\t\t\t\t\t\t'&' + 'allowsave=false' +\n\t\t\t\t\t\t'&' + 'bluroperationpanel=true' +\n\t\t\t\t\t\t'&' + 'showitemcert=false',\n\t\t\t\t\t\t'none'\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t\tbtnPreviewCase.SetPanelEvent( 'onmouseover', function()\n\t\t\t\t{\n\t\t\t\t\tvar selectedId = _getSelectedIdInLayoutChildrenRow();\n\t\t\t\t\tvar settingsForSelectedCharacter = ItemInfo.GetOrUpdateVanityCharacterSettings( selectedId );\n\t\t\t\t\tItemInfo.PrecacheVanityCharacterSettings( settingsForSelectedCharacter );\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tbtnPreviewCase.visible = bIsCase || ItemInfo.IsCharacter( itemsList[ 0 ] )|| ItemInfo.IsWeapon( itemsList[0] );\n\n\t\t_m_cp.SetDialogVariable(\n\t\t\t'reward_name',\n\t\t\tInventoryAPI.GetItemName(\n\t\t\t\trewardId\n\t\t\t));\n\n\t\t_m_activeRewardBtn.Data().bShowPips = ( !bIsCoin && !bIsGraffiti && !bIsCase );\n\n\t\t_MakePips( itemsList, rewardId );\n\t\t_UpdateInpsectNameFlipModule( itemsList, rewardId );\n\t};\n\n\tvar _UpdateWarning = function( bIsCoin, bIsCase, rewardId  )\n\t{\n\t\tvar elWarning = _m_cp.FindChildInLayoutFile( 'id-op-main-inspect-warning' );\n\t\tvar bHideWarning = bIsCase || ( bIsCoin && !OperationUtil.GetOperationInfo().bPremiumUser );\n\t\telWarning.SetHasClass( 'hidden', bHideWarning );\n\n\t\tif ( bHideWarning )\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tvar warningText = '';\n\t\tif ( bIsCoin )\n\t\t{\n\t\t\tvar id = InventoryAPI.GetActiveSeasonCoinItemId();\n\t\t\tvar missionsThreshold = InventoryAPI.GetItemAttributeValue( id, 'upgrade threshold' );\n\n\t\t\t                                                                                  \n\t\t\tif ( !missionsThreshold || missionsThreshold < 0 || missionsThreshold > 1000 )\n\t\t\t{\n\t\t\t\telWarning.SetHasClass( 'hidden', true );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar missionsRemaining = missionsThreshold - OperationUtil.GetOperationInfo().nMissionsCompleted;\n\t\t\t_m_cp.SetDialogVariableInt( 'missions_remaining', missionsRemaining );\n\n\t\t\tvar missionText = missionsRemaining === 1 ? $.Localize( '#op_rewards_mission' ) : $.Localize( '#op_rewards_missions' );\n\t\t\t_m_cp.SetDialogVariable( 'mission_plural', missionText );\n\t\t\twarningText = $.Localize( '#op_rewards_inspect_coin_progress', _m_cp );\n\t\t}\n\t\telse\n\t\t{\n\t\t\twarningText = $.Localize( '#op_rewards_inspect_warning' );\n\t\t}\n\n\t\telWarning.text = warningText;\n\t};\n\n\tvar _MakePips = function( itemsList, rewardId )\n\t{\n\t\tvar elPips = _m_cp.FindChildInLayoutFile( 'id-op-main-inspect-rarity' );\n\t\telPips.RemoveAndDeleteChildren();\n\n\t\telPips.SetHasClass( 'hidden', ( !_m_activeRewardBtn.Data().bShowPips ) );\n\t\tif( !_m_activeRewardBtn.Data().bShowPips )\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\titemsList.forEach( function( itemId, index )\n\t\t{\n\t\t\tvar elPip = $.CreatePanel(\n\t\t\t\t\"RadioButton\",\n\t\t\t\telPips,\n\t\t\t\t'id-tier-pip-' + itemId, {\n\t\t\t\t\tclass: 'op-mission-reward__rarity__pip',\n\t\t\t\t\tgroup:'rewardPip'\n\t\t\t\t}\n\t\t\t);\n\n\t\t\t$.CreatePanel(\n\t\t\t\t\"ItemImage\",\n\t\t\t\telPip,\n\t\t\t\t'', {\n\t\t\t\t\titemid: itemId,\n\t\t\t\t\tscaling:\"stretch-to-fit-y-preserve-aspect\"\n\t\t\t\t}\n\t\t\t);\n\n\t\t\t$.CreatePanel(\n\t\t\t\t\"Panel\",\n\t\t\t\telPip,\n\t\t\t\t'id-pip-rarity', {\n\t\t\t\t\tclass:\"op-mission-reward__rarity__pip__rarity\"\n\t\t\t\t}\n\t\t\t);\n\n\t\t\telPip.Data().itemid = itemId;\n\n\t\t\tif ( ( itemsList.length <= 1 ) )\n\t\t\t{\n\t\t\t\telPip.visible = false;\n\t\t\t}\n\n\t\t\telPip.SetPanelEvent( 'onactivate', _OnPipActivate.bind( undefined, itemId, rewardId, index, itemsList.length ) );\n\n\t\t\tvar rarityColor = ( itemId === '0' && bIsCase ) ?\n\t\t\t\t'#ffd700' :\n\t\t\t\tInventoryAPI.GetItemRarityColor( itemId );\n\t\t\n\t\t\tif ( ItemInfo.IsWeapon( itemId ) )\n\t\t\t{\n\t\t\t\telPip.SetPanelEvent( 'onmouseover', _CacheWeapon.bind( undefined, itemId ) );\n\t\t\t}\n\n\t\t\tif ( rarityColor )\n\t\t\t{\n\t\t\t\telPip.FindChild( 'id-pip-rarity' ).style.backgroundColor = rarityColor + ';';\n\t\t\t}\n\t\t\telPip.checked = index === 0;\n\t\t} );\n\t};\n\n\tvar _OnPipActivate = function( itemId, rewardId, index )\n\t{\n\t\tif ( _m_oNamesFlipModuleInspect.ActiveIndex === index )\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\t\n\t\t_m_oNamesFlipModuleInspect.ActiveIndex = index - 1;\n\t\t_m_oNamesFlipModuleInspect.UseCallback();\n\t\t$.DispatchEvent( 'CSGOPlaySoundEffect', 'UIPanorama.generic_button_press', 'MOUSE' );\n\t};\n\n\tvar _UpdateInpsectNameFlipModule = function( aItems, rewardId )\n\t{\t\n\t\t_m_oNamesFlipModuleInspect.CallbackData = {\n\t\t\titems: aItems,\n\t\t\trewardid: rewardId\n\t\t};\n\n\t\t_m_oNamesFlipModuleInspect.ActiveIndex = -1;\n\t\t_m_oNamesFlipModuleInspect.AddParamToCallbackData( 'maxIndex', aItems.length - 1 );\n\t\t_m_oNamesFlipModuleInspect.UseCallback();\n\t};\n\t\n\tvar _CacheWeapon = function( id )\n\t{\n\t\tInventoryAPI.PrecacheCustomMaterials( id );\n\t};\n\n\tvar _CacheWeaponMouseOver = function( elTile, id, islootlistItem = false)\n\t{\n\t\tvar count = 0;\n\t\tif( !islootlistItem )\n\t\t{\n\t\t\tcount = InventoryAPI.GetLootListItemsCount( id );\n\t\t}\n\n\t\tif ( count > 0 || islootlistItem )\n\t\t{\n\t\t\tvar lootListItem = islootlistItem ? id : InventoryAPI.GetLootListItemIdByIndex( id, 0 );\n\t\t\tif( ItemInfo.IsWeapon( lootListItem ) )\n\t\t\t{\n\t\t\t\telTile.SetPanelEvent( 'onmouseover', _CacheWeapon.bind( undefined, lootListItem ) );\n\t\t\t}\n\t\t}\n\t};\n\n\treturn {\n\t\tCheckUsersOperationStatus: _CheckUsersOperationStatus,\n\t};\n} )();\n\n(function () {\n\n\t$.RegisterForUnhandledEvent( 'PanoramaComponent_MyPersona_InventoryUpdated', OperationMain.CheckUsersOperationStatus );\n})();\n\n","scripts/operation/operation_util.js":"'use strict';\n\nvar OperationUtil = ( function () {\n\n\tvar m_nSeasonAccess = -1;\n\tvar m_numTierUnlocked = 0;\n\tvar m_numMissionsCompleted = 0;\n\n\t                         \n\tvar m_nRedeemableGoodsCount = 0;\n\n\tvar m_numMissionsRewardThresholds = 0;\n\tvar m_bPremiumUser = false;\n\tvar m_nCoinRank = 0;\n\tvar m_nActiveCardIndex = 0;\n\tvar m_nRewardsCount = 0;\n\tvar m_numRedeemableBalance = 0;\n\tvar m_nLoopingRewardsCount = 0;\n\tvar m_bPrime = false;\n\tvar m_aStarDefIndexes = [4763, 4764, 4765]\n\tvar m_passStoreId = 4758;\n\n\tvar _ValidateOperationInfo = function( nSeasonAccess )\n\t{\n\t\t                                               \n\t\t                               \n\t\t                                                                          \n\t\tm_nSeasonAccess = nSeasonAccess;\n\t\t\n\t\tif ( nSeasonAccess < 0 || nSeasonAccess === null || nSeasonAccess === undefined )\n\t\t\treturn false;\n\t\t\n\t\tm_nSeasonAccess = nSeasonAccess;\n\t\t                                                 \n\n\t\tm_nCoinRank = MyPersonaAPI.GetMyMedalRankByType( ( m_nSeasonAccess + 1 ) + \"Operation$OperationCoin\" );\n\t\t                                           \n\n\t\tm_bPrime = PartyListAPI.GetFriendPrimeEligible( MyPersonaAPI.GetXuid() );\n\t\tm_nRewardsCount = MissionsAPI.GetSeasonalOperationTrackRewardsCount( m_nSeasonAccess );\n\t\tm_nRedeemableGoodsCount = MissionsAPI.GetSeasonalOperationRedeemableGoodsCount( m_nSeasonAccess );\n\t\tm_nLoopingRewardsCount = MissionsAPI.GetSeasonalOperationLoopingRewardsCount( m_nSeasonAccess );\n\t\tm_numMissionsRewardThresholds = MissionsAPI.GetSeasonalOperationXpRewardsThresholds( m_nSeasonAccess );\n\n\t\t                                                                                                                         \n\t\tvar idxOperation = InventoryAPI.GetCacheTypeElementIndexByKey( 'SeasonalOperations', m_nSeasonAccess );\n\t\tif ( idxOperation != undefined && idxOperation != null\n\t\t\t&& InventoryAPI.GetCacheTypeElementFieldByIndex( 'SeasonalOperations', idxOperation, 'season_value' ) == m_nSeasonAccess )\n\t\t{\t                                                         \n\t\t\tm_numMissionsCompleted = InventoryAPI.GetCacheTypeElementFieldByIndex( 'SeasonalOperations', idxOperation, 'missions_completed' );\n\t\t\tm_numTierUnlocked = InventoryAPI.GetCacheTypeElementFieldByIndex( 'SeasonalOperations', idxOperation, 'tier_unlocked' );\n\t\t\tif ( m_nRedeemableGoodsCount && m_nRedeemableGoodsCount > 0 )\n\t\t\t{\n\t\t\t\tvar spt = InventoryAPI.GetCacheTypeElementFieldByIndex( 'SeasonalOperations', idxOperation, 'season_pass_time' );\n\t\t\t\tm_bPremiumUser = ( spt && ( spt > 0 ) ) ? true : false;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tvar spt = InventoryAPI.GetCacheTypeElementFieldByIndex( 'SeasonalOperations', idxOperation, 'premium_tiers' );\n\t\t\t\tm_bPremiumUser = ( spt && ( spt >= 1 ) ) ? true : false;\n\t\t\t}\n\t\t\tm_nActiveCardIndex = MissionsAPI.GetSeasonalOperationMissionCardActiveIdx( m_nSeasonAccess );\n\t\t\tm_numRedeemableBalance = InventoryAPI.GetCacheTypeElementFieldByIndex( 'SeasonalOperations', idxOperation, 'redeemable_balance' );\n\t\t}\n\t\telse\n\t\t{\n\t\t\t                                             \n\n\t\t\tm_numMissionsCompleted = 0;\n\t\t\tm_numTierUnlocked = 0;\n\t\t\tm_bPremiumUser = false;\n\t\t\tm_nActiveCardIndex = -1;\n\t\t\tm_numRedeemableBalance = 0;\n\t\t}\n\n\t\t_AddLoopingRewardsToDisplay();\n\n\t\t                                                 \n\t\t                                                            \n\t\t                                                          \n\t\t                                                            \n\t\t                                                  \n\t\t                                         \n\t\t                                 \n\t\t                                                  \n\t\t                                                                  \n\n\t\treturn true;\n\t};\n\n\tvar _AddLoopingRewardsToDisplay = function()\n\t{\n\t\t                                    \n\t\tif ( m_nLoopingRewardsCount > 0 )\n\t\t{\t                                                \n\t\t\tm_nRewardsCount += m_nLoopingRewardsCount;\n\t\t\t                                                                        \n\t\t\twhile ( m_numTierUnlocked > m_nRewardsCount - m_nLoopingRewardsCount )\n\t\t\t{\n\t\t\t\tm_nRewardsCount += m_nLoopingRewardsCount;\n\t\t\t}\n\t\t}\n\t};\n\n\tvar _GetObjValue= function( bHasStoreItems, rewardIndex, item )\n\t{\n\t\t                     \n\t\tvar data;\n\t\t\n\t\tif( bHasStoreItems )\n\t\t{\n\t\t\tdata = MissionsAPI.GetSeasonalOperationRedeemableGoodsSchema( m_nSeasonAccess, rewardIndex, item.value );\n\t\t}\n\t\telse\n\t\t{\n\t\t\tdata = MissionsAPI.GetSeasonalOperationTrackRewardSchema( m_nSeasonAccess, rewardIndex, item.value );\n\t\t}\n\n\t\t                                                                                          \n\t\tif( item.value === 'ui_order')\n\t\t{\n\t\t\treturn data ? data : '';\n\t\t}\n\t\telse{\n\t\t\treturn data;\n\t\t}\n\t};\n\n\tvar _GetContainerTypeForReward = function( oRewardData )\n\t{\n\t\tvar rewardId = oRewardData.itempremium.ids[ 0 ];\n\t\t\n\t\tvar toolsKey = InventoryAPI.GetRawDefinitionKey( rewardId, \"inv_container_and_tools\" ); \n\n\t\t                                  \n\n\t\tif( ( toolsKey === \"weapon_case\" ) )\n\t\t{\n\t\t\treturn 'isWeaponsCase';\n\t\t}\n\t\telse if ( toolsKey === \"graffiti_box\" ){\n\t\t\treturn 'isGraffitiBox';\n\t\t}\n\t\telse if( InventoryAPI.GetRawDefinitionKey( rewardId, \"item_type\" ) === \"operation_coin\" )\n\t\t{\n\t\t\treturn 'isCoin';\n\t\t}\n\t\telse if( ItemInfo.IsCharacter( oRewardData.lootlist[0] ) )\n\t\t{\n\t\t\treturn 'isCharacterLootlist';\n\t\t}\n\t\telse if( ItemInfo.IsWeapon( oRewardData.lootlist[0] ) )\n\t\t{\n\t\t\treturn 'isWeaponLootlist';\n\t\t}\n\n\t\treturn 'isStickerLootlist';\n\t};\n\n\tvar _GetRewardsData = function()\n\t{\n\t\t                                    \n\t\tif ( !m_nSeasonAccess || m_nSeasonAccess === -1 )\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tvar bHasStoreItems = _HasStoreItems();\n\t\tvar nRewardsCount  = bHasStoreItems ? m_nRedeemableGoodsCount : m_nRewardsCount;\n\t\t                                                              \n\n\t\tvar aRewardDataFields = [\n\t\t\t{ objHandle:'points', value: 'points'},\n\t\t\t{ objHandle:'flags', value: 'flags'},\n\t\t\t{ objHandle:'uiOrder', value: 'ui_order'},\n\t\t\t{ objHandle:'imagePath', value: 'ui_image'},\n\t\t\t{ objHandle:'imagePathInspect', value: 'ui_image_inspect'},\n\t\t\t{ objHandle:'imagePathThumbnail', value: 'ui_image_thumbnail'},\n\t\t\t{ objHandle:'RewardItemsNames', value: 'item_name'},\n\t\t\t{ objHandle:'RewardItemGroups', value: 'item_name_groups'},\n\t\t\t{ objHandle:'FreeRewardItemsNames', value: 'item_name_free'},\n\t\t\t{ objHandle:'useAsCallout', value: 'callout'},\n\t\t\t{ objHandle:'isGap', value: 'none'},\n\t\t\t{ objHandle:'lootlist', value: []},\n\t\t\t{ containerType:'' }\n\t\t];\n\n\t\tvar _allRewardsData = [];\n\n\t\tfor ( var i = 0; i < nRewardsCount; i++ )\n\t\t{\n\t\t\tvar _rewardData = {};\n\t\t\t_rewardData.idx = i;\n\t\t\taRewardDataFields.forEach(function( item, index ) \n\t\t\t{\n\t\t\t\t                                              \n\t\t\t\t_rewardData[item.objHandle] = _GetObjValue( bHasStoreItems, i, item );\n\t\t\t});\n\n\t\t\t                                                                                                                                  \n\t\t\t                                                                                                                 \n\t\t\t                                                                             \n\t\t\t                                                                                                           \n\t\t\t                                              \n\t\t\tvar rewardTypes = [\n\t\t\t\t{ type: 'premium', names: _rewardData.RewardItemsNames },\n\t\t\t\t{ type: 'free', names: _rewardData.FreeRewardItemsNames }\n\t\t\t];\n\n\t\t\trewardTypes.forEach( rType =>\n\t\t\t{\n\t\t\t\tif( !rType.names )\n\t\t\t\t{\n\t\t\t\t\trType.names = '';\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tvar items = { type: rType.type, ids: [] };\n\t\t\t\tvar nameList = rType.names.split( ',' );\n\t\t\t\tnameList.forEach( reward =>\n\t\t\t\t{\n\t\t\t\t\tif ( reward )\n\t\t\t\t\t{\n\t\t\t\t\t\tvar itemidForReward;\n\t\t\t\t\t\tif ( reward.startsWith( 'lootlist:' ) )\n\t\t\t\t\t\t{                                               \n\t\t\t\t\t\t\titemidForReward = InventoryAPI.GetLootListItemIdByIndex( reward, 0 );\n\t\t\t\t\t\t} else\n\t\t\t\t\t\t{\t                                                  \n\t\t\t\t\t\t\tvar nDefinitionIndex = InventoryAPI.GetItemDefinitionIndexFromDefinitionName( reward );\n\t\t\t\t\t\t\titemidForReward = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex( nDefinitionIndex, 0 );\n\t\t\t\t\t\t}\n\t\t\t\t\t\titems.ids.push( itemidForReward );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\t_rewardData[ 'item' + rType.type ] = items;\n\t\t\t} );\n\t\t\t\n\t\t\tif ( _rewardData.RewardItemGroups )\n\t\t\t{\n\t\t\t\tvar posUnderscore = _rewardData.RewardItemGroups.lastIndexOf('_');\n\t\t\t\tvar numGroups = parseInt( _rewardData.RewardItemGroups.substr( posUnderscore + 1 ) ) + 1;\n\t\t\t\tvar strBaseLootlistName = _rewardData.RewardItemGroups.substr( 0, posUnderscore + 1 );\n\t\t\t\t_rewardData.lootlistGroups = [];\n\t\t\t\t_rewardData.lootlist = [];\n\t\t\t\tfor ( var k = 0; k < numGroups; ++ k )\n\t\t\t\t{\n\t\t\t\t\tvar idxFistGroupElement = _rewardData.lootlist.length;\n\t\t\t\t\tvar strListName = 'lootlist:'+strBaseLootlistName+k;\n\t\t\t\t\tvar moreItems = _GetLootListForReward( strListName );\n\t\t\t\t\t                                                                                                     \n\t\t\t\t\tif ( moreItems.length > 0 )\n\t\t\t\t\t{\n\t\t\t\t\t\tfor ( var mm = 0; mm < moreItems.length; ++ mm )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t_rewardData.lootlist.push( moreItems[mm] );\n\t\t\t\t\t\t}\n\t\t\t\t\t\t_rewardData.lootlistGroups.push( { idxBegin: idxFistGroupElement, idxEnd: _rewardData.lootlist.length } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t_rewardData.lootlist = _GetLootListForReward( _rewardData.itempremium.ids[ 0 ] );\n\t\t\t}\n\t\t\t_rewardData.containerType = _GetContainerTypeForReward( _rewardData );\n\n\t\t\t_allRewardsData.push( _rewardData );\n\t\t}\n\n\t\treturn _allRewardsData;\n\t};\n\n\tvar _GetLootListForReward = function( rewardId )\n\t{\n\t\tvar count = InventoryAPI.GetLootListItemsCount( rewardId );\n\t\tvar itemsList = [];\n\t\tif ( !count )\n\t\t{\n\t\t\titemsList.push( rewardId );\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfor ( var i = 0; i < count; i++ )\n\t\t\t{\n\t\t\t\t  \n\t\t\t\t                                                                \n\t\t\t\t                                                              \n\t\t\t\t                            \n\t\t\t\t  \n\t\t\t\tvar itemId = InventoryAPI.GetLootListItemIdByIndex( rewardId, i );\n\t\t\t\tif ( ItemInfo.IsSprayPaint( itemId ) || ItemInfo.IsSpraySealed( itemId ) )\n\t\t\t\t{\n\t\t\t\t\titemId = InventoryAPI.GenerateSprayTintedItemID( itemId );\n\t\t\t\t}\n\t\t\t\titemsList.push( itemId );\n\t\t\t}\n\t\t}\n\n\t\treturn itemsList;\n\t};\n\n\tfunction _IfOperationEndedGetExtendedSeasonWithRedeemableBalance( bAlwaysShowOperationEndedMessageBox )\n\t{\n\t\tvar nActiveSeason = 10;                                                                                                                   \n\t\t\n\t\tif ( bAlwaysShowOperationEndedMessageBox )\n\t\t{\n\t\t\tnActiveSeason = -1;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t_ValidateOperationInfo( nActiveSeason );\n\t\t\tif ( m_numRedeemableBalance <= 0 )\n\t\t\t\tnActiveSeason = -1;\n\t\t}\n\t\t\t\n\t\tif ( nActiveSeason < 0 )\n\t\t\tUiToolkitAPI.ShowGenericPopup( '#op_stars_shop_title', '#op_stars_shop_operation_over', \"\" );\n\t\t\t\n\t\treturn nActiveSeason;\n\t}\n\n\tfunction _OpenUpSell( starsNeeded = 0, bForceOpenStarsPurchase = false )\n\t{\n\t\tfunction _OpenStarStore()\n\t\t{\n\t\t\tvar elPopup = UiToolkitAPI.ShowCustomLayoutPopupParameters(\n\t\t\t\t'',\n\t\t\t\t'file://{resources}/layout/popups/popup_operation_store.xml',\n\t\t\t\t'bluroperationpanel=true',\n\t\t\t\t'none'\n\t\t\t);\n\n\t\t\telPopup.SetAttributeInt( \"starsneeded\", starsNeeded );\n\t\t\t                                                              \n\t\t\t\n\t\t\tvar oOldStarsActivate = _UpdateOldStars();\n\t\t\t                                                                                                                                                            \n\t\t\tif ( oOldStarsActivate.ids.length > 0 )\n\t\t\t{\n\t\t\t\telPopup.SetAttributeString( \"oldstarstoactivate\", oOldStarsActivate.ids.join( ',' ) );\n\t\t\t\telPopup.SetAttributeInt( \"oldstarstoactivatevalue\", oOldStarsActivate.value );\n\t\t\t}\n\t\t}\n\n\t\tfunction _OpenStoreForPass( passId )\n\t\t{\n\t\t\tif( passId )\n\t\t\t{\n\t\t\t\tUiToolkitAPI.ShowCustomLayoutPopupParameters(\n\t\t\t\t\t'',\n\t\t\t\t\t'file://{resources}/layout/popups/popup_inventory_inspect.xml',\n\t\t\t\t\t'itemid=' + passId +\n\t\t\t\t\t'&' + 'asyncworktype=useitem' + \n\t\t\t\t\t'&' + 'seasonpass=true' +\n\t\t\t\t\t'&' + 'bluroperationpanel=true'\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tvar passDefIndex = _GetPassFauxId();\n\t\t\tUiToolkitAPI.ShowCustomLayoutPopupParameters(\n\t\t\t\t'',\n\t\t\t\t'file://{resources}/layout/popups/popup_inventory_inspect.xml',\n\t\t\t\t'itemid=' + passDefIndex +\n\t\t\t\t'&' + 'inspectonly=false' +\n\t\t\t\t'&' + 'asyncworkitemwarning=no' +\n\t\t\t\t'&' + 'bluroperationpanel=true' +\n\t\t\t\t'&' + 'storeitemid=' + passDefIndex +\n\t\t\t\t'&' + 'overridepurchasemultiple=0',\n\t\t\t\t'none'\n\t\t\t);\n\t\t}\n\n\t\t$.DispatchEvent( 'CSGOPlaySoundEffect', 'tab_mainmenu_inventory', 'MOUSE' );\n\n\t\t                                                \n\t\tvar nActiveSeason = GameTypesAPI.GetActiveSeasionIndexValue();\n\t\tif ( nActiveSeason < 0 )\n\t\t{\n\t\t\t_IfOperationEndedGetExtendedSeasonWithRedeemableBalance( true );\n\t\t\treturn;\n\t\t}\n\n\t\tvar passId = InventoryAPI.GetActiveSeasonPassItemId();\n\n\t\tif ( m_bPremiumUser || bForceOpenStarsPurchase )\n\t\t{\n\t\t\t_OpenStarStore();\n\t\t}\n\t\telse\n\t\t{\n\t\t\t_OpenStoreForPass( passId );\n\t\t}\n\t}\n\n\tvar _GetPassFauxId = function()\n\t{\n\t\treturn  InventoryAPI.GetFauxItemIDFromDefAndPaintIndex( m_passStoreId, 0 );\n\t};\n\n\tvar _GetOperationStarDefIdxArray = function()\n\t{\n\t\treturn m_aStarDefIndexes;\n\t}\n\n\tvar _UpdateOldStars = function()\n\t{\n\t\tvar oDefNames = [ {},{},{} ];\n\t\toDefNames[0] = {def:InventoryAPI.GetItemDefinitionName(InventoryAPI.GetFauxItemIDFromDefAndPaintIndex( m_aStarDefIndexes[0], 0 )),value:1};\n\t\toDefNames[1] = {def:InventoryAPI.GetItemDefinitionName(InventoryAPI.GetFauxItemIDFromDefAndPaintIndex( m_aStarDefIndexes[1], 0 )),value:10};\n\t\toDefNames[2] = {def:InventoryAPI.GetItemDefinitionName(InventoryAPI.GetFauxItemIDFromDefAndPaintIndex( m_aStarDefIndexes[2], 0 )),value:100};\n\n\t\tvar oTotalStars = { ids: [], value: 0 };\n\t\toDefNames.forEach( element =>\n\t\t{\n\t\t\tInventoryAPI.SetInventorySortAndFilters( 'inv_sort_age', false, 'item_definition:' + element.def, '', '' );\n\t\t\tvar count = InventoryAPI.GetInventoryCount();\n\t\t\tfor ( var i = 0; i < count; i++ )\n\t\t\t{\n\t\t\t\toTotalStars.ids.push( InventoryAPI.GetInventoryItemIDByIndex( i ) );\n\t\t\t\toTotalStars.value += element.value;\n\t\t\t}\n\t\t} );\n\n\t\treturn oTotalStars;\n\t};\n\n\tvar _MissionsThatMatchYourMatchMakingSettings = function( SessionGameMode, sessionMaps, nSeasonAccess )\n\t{\n\t\t                                                                                              \n\n\t\tvar numMissionCards = MissionsAPI.GetSeasonalOperationMissionCardsCount( nSeasonAccess );\n\t\tfor ( var i = 0; i < numMissionCards; ++ i )\n\t\t{\n\t\t\tvar jsoCardDetails = MissionsAPI.GetSeasonalOperationMissionCardDetails( nSeasonAccess, i );\n\t\t\t_GetMatchingMission( i, jsoCardDetails, SessionGameMode, sessionMaps );\n\t\t}\n\t};\n\n\tvar _GetMatchingMission = function( idx, jsoCardDetails, SessionGameMode, sessionMaps )\n\t{\n\t\tvar oMatchingMissions = {};\n\t\tfor ( var iMission = 0; iMission < jsoCardDetails.quests.length; ++iMission )\n\t\t{\n\t\t\tvar MissionItemID = InventoryAPI.GetQuestItemIDFromQuestID( Number( jsoCardDetails.quests[ iMission ] ) );\n\t\t\tvar gameMode = InventoryAPI.GetQuestGameMode( MissionItemID );\n\t\t\tvar mapGroup = InventoryAPI.GetQuestMapGroup( MissionItemID );\n\n\t\t\tif ( !mapGroup )\n\t\t\t{\t                                                                               \n\t\t\t\tmapGroup = 'mg_' + InventoryAPI.GetQuestMap( MissionItemID );\n\t\t\t}\n\n\t\t\tif ( SessionGameMode === gameMode &&\n\t\t\t\t_HasMatchtingMapGroup( sessionMaps, mapGroup ) &&\n\t\t\t\tjsoCardDetails.isunlocked &&\n\t\t\t\tMissionsAPI.GetQuestPoints( jsoCardDetails.quests[ iMission ], \"remaining\" ) === 0 )\n\t\t\t{\n\t\t\t\tif ( !oMatchingMissions.hasOwnProperty( 'card' + idx ) )\n\t\t\t\t{\n\t\t\t\t\toMatchingMissions[ 'card' + idx ] = idx;\n\t\t\t\t\toMatchingMissions.missions = [];\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\toMatchingMissions.missions.push( MissionItemID );\n\t\t\t}\n\t\t}\n\n\t\treturn oMatchingMissions;\n\t};\n\n\tvar _HasMatchtingMapGroup = function( sessionMaps, mapGroup )\n\t{\n\t\treturn sessionMaps.filter( element => mapGroup.includes( element ) ).length > 0 ? true : false;\n\t};\n\n\tvar _HasStoreItems = function ( )\n\t{\n\t\treturn m_nRedeemableGoodsCount > 0 && m_nRedeemableGoodsCount !== null && m_nRedeemableGoodsCount != undefined ? true : false;\n\t};\n\n\tvar _GetOperationInfo = function()\n\t{\n\t\treturn {\n\t\t\tnSeasonAccess: m_nSeasonAccess,\n\t\t\tnTierUnlocked: m_numTierUnlocked,\n\t\t\tnRewardsCount: m_nRewardsCount,\n\t\t\tbShopIsFreeForAll: false,\n\t\t\tnRedeemableGoodsCount: m_nRedeemableGoodsCount,\n\t\t\tnRedeemableBalance : m_numRedeemableBalance,\n\t\t\tnMissionsCompleted: m_numMissionsCompleted,\n\t\t\tnMissionsRewardThresholds: m_numMissionsRewardThresholds,\n\t\t\tbPremiumUser: m_bPremiumUser,\n\t\t\tnCoinRank: m_nCoinRank,\n\t\t\tnActiveCardIndex: m_nActiveCardIndex,\n\t\t\tbPrime: m_bPrime\n\t\t};\n\t};\n\n\treturn {\n\t\tValidateOperationInfo: _ValidateOperationInfo,\n\t\tGetOperationInfo: _GetOperationInfo,\n\t\tGetRewardsData: _GetRewardsData,\n\t\tOpenUpSell: _OpenUpSell,\n\t\tGetPassFauxId: _GetPassFauxId,\n\t\tGetOperationStarDefIdxArray: _GetOperationStarDefIdxArray,\n\t\tMissionsThatMatchYourMatchMakingSettings: _MissionsThatMatchYourMatchMakingSettings,\n\t};\n\n})();\n","scripts/particle_controls.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\nvar ParticleControls;\n(function (ParticleControls) {\n    function GetAllChildren(panel) {\n        const children = panel.Children();\n        return [...children, ...children.flatMap(GetAllChildren)];\n    }\n    function IsParticleScenePanel(panel) {\n        return panel.type === \"ParticleScenePanel\";\n    }\n    ParticleControls.IsParticleScenePanel = IsParticleScenePanel;\n    function GetWorldExtendsFromCamFov(fov, xpos, ypos, zpos, pheight, pwidth) {\n        let height = Math.tan(fov * .5) * Math.sqrt((xpos * xpos) + (ypos * ypos) + (zpos * zpos));\n        let width = (pwidth / pheight) * height;\n        return { height, width };\n    }\n    function StartAllChildrenParticles(elContainerPanel) {\n        const AllPanels = GetAllChildren(elContainerPanel);\n        for (const panel of AllPanels) {\n            if (IsParticleScenePanel(panel)) {\n                panel.StopParticlesImmediately(true);\n                panel.StartParticles();\n            }\n        }\n    }\n    ParticleControls.StartAllChildrenParticles = StartAllChildrenParticles;\n    function StopAllChildrenParticlesImmediately(elContainerPanel) {\n        const AllPanels = GetAllChildren(elContainerPanel);\n        for (const panel of AllPanels) {\n            if (IsParticleScenePanel(panel))\n                panel.StopParticlesImmediately(true);\n        }\n    }\n    ParticleControls.StopAllChildrenParticlesImmediately = StopAllChildrenParticlesImmediately;\n    function StopParticlesWithEndCap(panelId) {\n        if (panelId && IsParticleScenePanel(panelId))\n            panelId.StopParticlesWithEndcaps();\n    }\n    ParticleControls.StopParticlesWithEndCap = StopParticlesWithEndCap;\n    function SetPanelParticleControlPoint(panelId, cp, x, y, z) {\n        const AllPanels = GetAllChildren($(panelId));\n        for (const panel of AllPanels) {\n            if (panel && IsParticleScenePanel(panel)) {\n                panel.StopParticlesImmediately(true);\n                panel.StartParticles();\n                panel.SetControlPoint(cp, x, y, z);\n            }\n        }\n    }\n    ParticleControls.SetPanelParticleControlPoint = SetPanelParticleControlPoint;\n    function SetPanelParticleControlPointDirect(panelId, cp, x, y, z) {\n        if (panelId && IsParticleScenePanel(panelId)) {\n            panelId.SetControlPoint(cp, x + 1, y, z);\n            panelId.SetControlPoint(cp, x, y, z);\n        }\n    }\n    ParticleControls.SetPanelParticleControlPointDirect = SetPanelParticleControlPointDirect;\n    function ForcePanelToParticleName(panelId, particleName) {\n        if (panelId && IsParticleScenePanel(panelId)) {\n            panelId.SetParticleNameAndRefresh(particleName);\n        }\n    }\n    ParticleControls.ForcePanelToParticleName = ForcePanelToParticleName;\n    function RestartStatusRank(panelId, x, y, z) {\n        const panel = $(panelId);\n        if (panel && IsParticleScenePanel(panel)) {\n            panel.StopParticlesImmediately(true);\n            panel.StartParticles();\n            panel.SetControlPoint(3, x, y, z);\n        }\n    }\n    ParticleControls.RestartStatusRank = RestartStatusRank;\n    function UpdateMainMenuTopBar(elPanel, curTabID) {\n        let g_RadioButtonIdLookup = {\n            JsInventory: \"#MainMenuNavBarInventory\",\n            JsLoadout: \"#MainMenuNavBarLoadout\",\n            JsPlay: \"#MainMenuNavBarPlay\",\n            JsMainMenuStore: \"#MainMenuNavBarStore\",\n            JsPlayerStats: \"#MainMenuNavBarStats\",\n            JsMainMenuNews: \"#MainMenuNavBarNews\",\n        };\n        const Color = [85, 212, 238];\n        const HColor = [0, 255, 212];\n        if (g_RadioButtonIdLookup[curTabID] == null) {\n            elPanel.SetControlPoint(1, 1, 1, 1);\n            elPanel.SetControlPoint(1, 0, 0, 0);\n            elPanel.SetControlPoint(2, 96, 0, .75);\n            elPanel.SetControlPoint(16, Color[0], Color[1], Color[2]);\n            elPanel.SetControlPoint(17, HColor[0], HColor[1], HColor[2]);\n            return;\n        }\n        const elContainer = $(\"#MainMenuNavBarCenterContainer\");\n        let curTabButton = $(g_RadioButtonIdLookup[curTabID]);\n        const particleWidthInGameUnits = 32 * 35;\n        if (curTabButton && elContainer) {\n            const particlePanelScalar = particleWidthInGameUnits / elPanel.actuallayoutwidth;\n            curTabButton.checked = true;\n            const curLabel = curTabButton.FindChildrenWithClassTraverse(\"mainmenu-top-navbar__radio-btn__label\")[0];\n            let center = ((elContainer.actuallayoutwidth * .5) - (curTabButton.actualxoffset + (curTabButton.actuallayoutwidth * .5)));\n            center *= (particlePanelScalar);\n            const buffer = 20;\n            const width = (curLabel.actuallayoutwidth * .5 + buffer) * particlePanelScalar;\n            elPanel.SetControlPoint(1, center + 1, 0, 0);\n            elPanel.SetControlPoint(1, center, 0, 0);\n            elPanel.SetControlPoint(2, width, .1, .25);\n        }\n        else {\n            elPanel.SetControlPoint(1, 0, 0, 0);\n            elPanel.SetControlPoint(2, 96, 0, .25);\n            elPanel.SetControlPoint(16, Color[0], Color[1], Color[2]);\n            elPanel.SetControlPoint(17, HColor[0], HColor[1], HColor[2]);\n        }\n    }\n    ParticleControls.UpdateMainMenuTopBar = UpdateMainMenuTopBar;\n    function InitMainMenuTopBar(elPanel) {\n        const Color = [85, 212, 238];\n        const HColor = [0, 255, 212];\n        elPanel.SetControlPoint(16, Color[0], Color[1], Color[2]);\n    }\n    ParticleControls.InitMainMenuTopBar = InitMainMenuTopBar;\n    function UpdateActionBar(elPanel, curTabID) {\n        const myParent = elPanel.GetParent();\n        const marginx = 20;\n        const ButtonBg = myParent.FindChildrenWithClassTraverse('play-menu__playbtn__bg')[0];\n        const buttonWidth = ButtonBg.actuallayoutwidth + 2;\n        const lookat = [550, 0, 70];\n        let g_RadioButtonIdLookup = {\n            RmoveBtnEffects: \"#PartyCancelBtn\",\n            StartMatchBtn: \"#StartMatchBtn\",\n        };\n        if (g_RadioButtonIdLookup[curTabID] == null)\n            return;\n        if (g_RadioButtonIdLookup[curTabID] == \"#StartMatchBtn\") {\n            const buttonHeight = ButtonBg.actuallayoutheight;\n            const camOffsetFromLookat = [0, 330, 0];\n            let PanelWorldSize = GetWorldExtendsFromCamFov(120, camOffsetFromLookat[0], camOffsetFromLookat[1], camOffsetFromLookat[2], elPanel.actuallayoutheight, elPanel.actuallayoutwidth);\n            let gametoWorldScalar = (PanelWorldSize.width * 2) / elPanel.actuallayoutwidth;\n            const Color = [15, 231, 15];\n            elPanel.StartParticleSystem(\"particles/ui/ui_mainmenu_playaction_active.vpcf\");\n            elPanel.StartParticles();\n            const col = 17;\n            const row = Math.floor((buttonHeight * gametoWorldScalar) / 32);\n            elPanel.SetControlPoint(1, (buttonWidth * .5 - marginx) * gametoWorldScalar + Math.random(), 0, lookat[2]);\n            elPanel.SetControlPoint(2, col, row, .25);\n            elPanel.SetControlPoint(5, 1, 20, 0);\n            elPanel.SetControlPoint(16, Color[0], Color[1], Color[2]);\n        }\n        else if (g_RadioButtonIdLookup[curTabID] == \"#PartyCancelBtn\") {\n            const Color = [0, 0, 0];\n            elPanel.SetControlPoint(16, Color[0], Color[1], Color[2]);\n            elPanel.StopParticlesImmediately(true);\n        }\n        else {\n            const Color = [60, 60, 60];\n            elPanel.SetControlPoint(5, 0, 0, 0);\n            elPanel.SetControlPoint(2, 17, 3, .25);\n            elPanel.SetControlPoint(16, Color[0], Color[1], Color[2]);\n            elPanel.StopParticlesImmediately(true);\n        }\n    }\n    ParticleControls.UpdateActionBar = UpdateActionBar;\n})(ParticleControls || (ParticleControls = {}));\n","scripts/party.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"avatar.ts\" />\n/// <reference path=\"friendslist.ts\" />\nvar PartyMenu;\n(function (PartyMenu) {\n    let elPartySection = $('#PartyList');\n    let m_eventRebuildPartyList;\n    let m_prevMembersInParty = 1;\n    function _Init() {\n        _RefreshPartyMembers();\n        _AddOnActivateLeaveBtn();\n        _ShowMatchmakingStatusTooltipEvent();\n    }\n    function _RefreshPartyMembers() {\n        if (!_IsSessionActive()) {\n            return;\n        }\n        let lobbySettings = LobbyAPI.GetSessionSettings().game;\n        if (!lobbySettings) {\n            return;\n        }\n        let elPartyMembersList = elPartySection.FindChildInLayoutFile('PartyMembers');\n        _UpdateNumPlayersInparty();\n        let bIsSearching = _IsSearching();\n        if (m_prevMembersInParty >= PartyListAPI.GetPartySessionUiThreshold() || bIsSearching) {\n            elPartyMembersList.RemoveAndDeleteChildren();\n            _UpdateMembersList(lobbySettings, m_prevMembersInParty);\n        }\n        else {\n            elPartySection.AddClass('hidden');\n            FriendsList.UpdateHeightOpenSection();\n            elPartyMembersList.RemoveAndDeleteChildren();\n        }\n        elPartySection.GetParent().SetHasClass('friendslist-party-searching', bIsSearching && (m_prevMembersInParty <= 1));\n        _UpdateLeaveBtn();\n    }\n    function _UpdateNumPlayersInparty() {\n        let numPlayersActuallyInParty = PartyListAPI.GetCount();\n        if (numPlayersActuallyInParty > m_prevMembersInParty) {\n            $.DispatchEvent('CSGOPlaySoundEffectMuteBypass', 'PanoramaUI.Lobby.Joined', 'PartyList', 1.0);\n        }\n        else if (numPlayersActuallyInParty < m_prevMembersInParty) {\n            $.DispatchEvent('CSGOPlaySoundEffectMuteBypass', 'PanoramaUI.Lobby.Left', 'PartyList', 1.0);\n        }\n        m_prevMembersInParty = numPlayersActuallyInParty;\n        elPartySection.SetDialogVariable('alert_value', String(numPlayersActuallyInParty));\n    }\n    function _IsSessionActive() {\n        if (!LobbyAPI.IsSessionActive()) {\n            elPartySection.AddClass('hidden');\n            FriendsList.UpdateHeightOpenSection();\n            elPartySection.GetParent().SetHasClass('friendslist-party-searching', false);\n            return false;\n        }\n        return true;\n    }\n    function _UpdateMembersList(lobbySettings, numPlayersActuallyInParty) {\n        let maxAllowedInLobby = 10;\n        let numPlayersPossibleInMode = SessionUtil.GetMaxLobbySlotsForGameMode(lobbySettings.mode);\n        if (elPartySection.BHasClass('hidden')) {\n            elPartySection.RemoveClass('hidden');\n        }\n        FriendsList.UpdateHeightOpenSection();\n        for (let i = 0; i < maxAllowedInLobby; i++) {\n            let xuid = i < numPlayersActuallyInParty ? PartyListAPI.GetXuidByIndex(i) : '0';\n            let isOverPossible = (numPlayersActuallyInParty > numPlayersPossibleInMode) ? true : false;\n            let elPartyMemberCurrent = null;\n            if (i < numPlayersActuallyInParty) {\n                elPartyMemberCurrent = _MakeNewPartyMemberTile(\"PartyMember\" + i, xuid);\n                _SetPartyMemberRank(elPartyMemberCurrent, xuid);\n                _SetPrimeForMember(elPartyMemberCurrent, xuid);\n                _UpdateAvatar(elPartyMemberCurrent, xuid);\n                _TintForOverPlayerCountForMode(elPartyMemberCurrent, isOverPossible);\n            }\n        }\n        _SetLobbyTitle(numPlayersPossibleInMode, numPlayersActuallyInParty);\n    }\n    function _MakeNewPartyMemberTile(panelIdToLoad, xuid) {\n        let elParent = $.GetContextPanel().FindChildInLayoutFile('PartyMembers');\n        let elPartyMember = $.CreatePanel(\"Panel\", elParent, panelIdToLoad);\n        elPartyMember.BLoadLayoutSnippet('PartyMember');\n        elPartyMember.Data().xuid = xuid;\n        elPartyMember.SetDialogVariable('partyxuid', xuid);\n        let memberBtn = elPartyMember.FindChildInLayoutFile('PartyMemberBtn');\n        let elAvatar = $.CreatePanel(\"Panel\", memberBtn, xuid);\n        _SetAttributeStringsOnAvatarPanel(elAvatar, xuid);\n        elAvatar.BLoadLayout('file://{resources}/layout/avatar.xml', false, false);\n        elAvatar.BLoadLayoutSnippet(\"AvatarParty\");\n        elAvatar.enabled = false;\n        _SetHonorIcon(elPartyMember, xuid);\n        memberBtn.MoveChildBefore(elAvatar, memberBtn.GetChild(0));\n        if (xuid != '0' && xuid)\n            _AddOpenPlayerCardAction(memberBtn, xuid);\n        else\n            _ClearExisitingOnActivateEvent(memberBtn);\n        return elPartyMember;\n    }\n    function _SetHonorIcon(elPartyMember, xuid) {\n        const elHonorIcon = elPartyMember.FindChildTraverse('jsHonorIcon');\n        if (elHonorIcon) {\n            elHonorIcon.Set(PartyListAPI.GetFriendXpTrailLevel(xuid), PartyListAPI.GetFriendPrimeEligible(xuid));\n        }\n    }\n    function _UpdateAvatar(elPartyMember, xuid) {\n        let elAvatar = elPartyMember.FindChildInLayoutFile(xuid);\n        Avatar.Init(elAvatar, xuid, 'partymember');\n    }\n    function _SetPartyMemberRank(elPartyMember, xuid) {\n        let skillgroupType = PartyListAPI.GetFriendCompetitiveRankType(xuid);\n        let skillGroup = PartyListAPI.GetFriendCompetitiveRank(xuid);\n        let wins = PartyListAPI.GetFriendCompetitiveWins(xuid);\n        let winsNeededForRank = SessionUtil.GetNumWinsNeededForRank(skillgroupType);\n        let elRank = elPartyMember.FindChildInLayoutFile('PartyRank');\n        if (wins < winsNeededForRank || (wins >= winsNeededForRank && skillGroup < 1) || !PartyListAPI.GetFriendPrimeEligible(xuid)) {\n            elRank.visible = false;\n            return;\n        }\n        let imageName = (skillgroupType !== 'Competitive') ? skillgroupType : 'skillgroup';\n        elRank.SetImage('file://{images}/icons/skillgroups/' + imageName + skillGroup + '.svg');\n        elRank.visible = true;\n    }\n    function _SetPrimeForMember(elPartyMember, xuid) {\n        return;\n    }\n    function _TintForOverPlayerCountForMode(elPartyMember, isOverCount) {\n        elPartyMember.SetHasClass('friendtile--warning', isOverCount);\n    }\n    function _SetLobbyTitle(numPlayersPossibleInMode, numPlayersActuallyInParty) {\n        let elPanel = $('#PartyList').FindChildInLayoutFile('PartyListHeader');\n        elPanel.FindChildInLayoutFile('PartyCancelBtn').visible = LobbyAPI.BIsHost() && _IsSearching();\n        let elCount = elPanel.FindChildInLayoutFile('PartyTitleAlertText');\n        elCount.text = numPlayersActuallyInParty + '/' + numPlayersPossibleInMode;\n    }\n    function _SetAttributeStringsOnAvatarPanel(elAvatar, xuid) {\n        elAvatar.SetAttributeString('xuid', xuid);\n        elAvatar.SetAttributeString('showleader', _ShowLobbyLeaderIcon(xuid));\n    }\n    function _ShowLobbyLeaderIcon(xuid) {\n        return LobbyAPI.GetHostSteamID() === xuid ? 'show' : '';\n    }\n    function _AddOpenPlayerCardAction(elPartyMember, xuid) {\n        function openCard() {\n            $.DispatchEvent('SidebarContextMenuActive', true);\n            if (xuid != '0') {\n                let contextMenuPanel = UiToolkitAPI.ShowCustomLayoutContextMenuParametersDismissEvent('', '', 'file://{resources}/layout/context_menus/context_menu_playercard.xml', 'xuid=' + xuid, () => $.DispatchEvent('SidebarContextMenuActive', false));\n                contextMenuPanel.AddClass(\"ContextMenu_NoArrow\");\n            }\n        }\n        ;\n        elPartyMember.SetPanelEvent(\"onactivate\", openCard);\n        elPartyMember.SetPanelEvent(\"oncontextmenu\", openCard);\n    }\n    function _ClearExisitingOnActivateEvent(elPartyMember) {\n        elPartyMember.SetPanelEvent(\"onactivate\", () => { });\n        elPartyMember.SetPanelEvent(\"onmouseover\", () => UiToolkitAPI.ShowTextTooltip(elPartyMember.id, '#tooltip_invite_to_lobby'));\n        elPartyMember.SetPanelEvent(\"onmouseout\", () => UiToolkitAPI.HideTextTooltip());\n    }\n    function _SessionUpdate(updateType) {\n        if (LobbyAPI.IsSessionActive()) {\n            if (m_eventRebuildPartyList == undefined) {\n                m_eventRebuildPartyList = $.RegisterForUnhandledEvent(\"PanoramaComponent_PartyList_RebuildPartyList\", _RefreshPartyMembers);\n            }\n        }\n        else {\n            if (m_eventRebuildPartyList) {\n                $.UnregisterForUnhandledEvent(\"PanoramaComponent_PartyList_RebuildPartyList\", m_eventRebuildPartyList);\n                m_eventRebuildPartyList = undefined;\n            }\n        }\n        _RefreshPartyMembers();\n        _TintBgForSearch();\n    }\n    function _TintBgForSearch() {\n        let serverWarning = NewsAPI.GetCurrentActiveAlertForUser();\n        let isWarning = serverWarning !== '' && serverWarning !== undefined ? true : false;\n        $.GetContextPanel().FindChildInLayoutFile('MatchStatusBackground').SetHasClass('party-list__bg--warning', (isWarning && _IsSeaching()));\n        $.GetContextPanel().FindChildInLayoutFile('MatchStatusBackground').SetHasClass('party-list__bg--searching', _IsSeaching());\n    }\n    function _IsSeaching() {\n        let StatusString = _GetSearchStatus();\n        return (StatusString !== '' && StatusString !== null) ? true : false;\n    }\n    function _PlayerActivityVoice(xuid) {\n        let elPartyMembersList = elPartySection.FindChildInLayoutFile('PartyMembers');\n        elPartyMembersList.Children().forEach(element => {\n            if (element.Data().xuid === xuid) {\n                let elAvatar = element.FindChildInLayoutFile(xuid);\n                if (elAvatar) {\n                    Avatar.UpdateTalkingState(elAvatar, xuid);\n                }\n            }\n        });\n    }\n    function _UpdateLeaveBtn() {\n        let elLeaveBtn = elPartySection.FindChildInLayoutFile('PartyLeaveBtn');\n        elLeaveBtn.visible = (!GameStateAPI.IsLocalPlayerPlayingMatch() && LobbyAPI.IsSessionActive());\n    }\n    function _AddOnActivateLeaveBtn() {\n        let elLeaveBtn = elPartySection.FindChildInLayoutFile('PartyLeaveBtn');\n        elLeaveBtn.SetPanelEvent('onactivate', () => LobbyAPI.CloseSession());\n    }\n    function _GetSearchStatus() {\n        return LobbyAPI.GetMatchmakingStatusString();\n    }\n    function _IsSearching() {\n        let StatusString = _GetSearchStatus();\n        return (StatusString !== '' && StatusString !== null) ? true : false;\n    }\n    function _ShowMatchmakingStatusTooltipEvent() {\n        let btnSettings = $.GetContextPanel().FindChildInLayoutFile('MatchStatusInfo');\n        btnSettings.SetPanelEvent('onmouseover', () => {\n            UiToolkitAPI.ShowCustomLayoutParametersTooltip('MatchStatusInfo', 'LobbySettingsTooltip', 'file://{resources}/layout/tooltips/tooltip_lobby_settings.xml', 'xuid=' + '');\n        });\n        btnSettings.SetPanelEvent('onmouseout', () => UiToolkitAPI.HideCustomLayoutTooltip('LobbySettingsTooltip'));\n    }\n    {\n        _Init();\n        $.RegisterForUnhandledEvent(\"PanoramaComponent_Lobby_MatchmakingSessionUpdate\", _SessionUpdate);\n        $.RegisterForUnhandledEvent(\"PanoramaComponent_Lobby_PlayerUpdated\", _SessionUpdate);\n        $.RegisterForUnhandledEvent(\"PanoramaComponent_PartyList_PlayerActivityVoice\", _PlayerActivityVoice);\n    }\n})(PartyMenu || (PartyMenu = {}));\n","scripts/playercard.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"common/sessionutil.ts\" />\n/// <reference path=\"rating_emblem.ts\" />\n/// <reference path=\"avatar.ts\" />\nvar PlayerCard;\n(function (PlayerCard) {\n    let _m_xuid = '';\n    let _m_currentLvl = null;\n    let _m_isSelf = false;\n    let _m_bShownInFriendsList = false;\n    let _m_tooltipDelayHandle = null;\n    let _m_arrAdditionalSkillGroups = ['Wingman'];\n    let _m_InventoryUpdatedHandler = null;\n    let _m_ShowLockedRankSkillGroupState = false;\n    let _m_cp = $.GetContextPanel();\n    function Init() {\n        _m_xuid = $.GetContextPanel().GetAttributeString('xuid', 'no XUID found');\n        _m_isSelf = _m_xuid === MyPersonaAPI.GetXuid() ? true : false;\n        _m_bShownInFriendsList = $.GetContextPanel().GetAttributeString('data-slot', '') !== '';\n        $(\"#AnimBackground\").PopulateFromSteamID(_m_xuid);\n        _RegisterForInventoryUpdate();\n        if (!_m_isSelf)\n            FriendsListAPI.RequestFriendProfileUpdateFromScript(_m_xuid);\n        FillOutFriendCard();\n    }\n    function _RegisterForInventoryUpdate() {\n        _m_InventoryUpdatedHandler = $.RegisterForUnhandledEvent('PanoramaComponent_MyPersona_InventoryUpdated', UpdateAvatar);\n        _m_cp.RegisterForReadyEvents(true);\n        $.RegisterEventHandler('ReadyForDisplay', _m_cp, () => {\n            if (!_m_InventoryUpdatedHandler) {\n                _m_InventoryUpdatedHandler = $.RegisterForUnhandledEvent('PanoramaComponent_MyPersona_InventoryUpdated', UpdateAvatar);\n            }\n        });\n        $.RegisterEventHandler('UnreadyForDisplay', _m_cp, () => {\n            if (_m_InventoryUpdatedHandler) {\n                $.UnregisterForUnhandledEvent('PanoramaComponent_MyPersona_InventoryUpdated', _m_InventoryUpdatedHandler);\n                _m_InventoryUpdatedHandler = null;\n            }\n        });\n    }\n    function FillOutFriendCard() {\n        if (_m_xuid) {\n            _m_currentLvl = FriendsListAPI.GetFriendLevel(_m_xuid);\n            _m_ShowLockedRankSkillGroupState = !_IsPlayerPrime() && _HasXpProgressToFreeze();\n            UpdateName();\n            _SetHonorIcon();\n            _SetAvatar();\n            _SetFlairItems();\n            _SetPlayerBackground();\n            _SetRank();\n            _SetPrimeUpsell();\n            if (_m_isSelf) {\n                if (MyPersonaAPI.GetPipRankWins(\"Premier\") >= 0) {\n                    if (_m_bShownInFriendsList)\n                        _SetSkillGroup('Premier');\n                    else\n                        SetAllSkillGroups();\n                }\n                else {\n                    let elToggleBtn = $.GetContextPanel().FindChildInLayoutFile('SkillGroupExpand');\n                    elToggleBtn.visible = false;\n                }\n            }\n            else {\n                SetAllSkillGroups();\n            }\n            if (_m_bShownInFriendsList) {\n                $.GetContextPanel().FindChildInLayoutFile('JsPlayerCommendations').AddClass('hidden');\n                $.GetContextPanel().FindChildInLayoutFile('JsPlayerPrime').AddClass('hidden');\n                _SetTeam();\n            }\n            else {\n                let bHasNoCommendsToShow = _SetCommendations();\n                _SetPrime(bHasNoCommendsToShow);\n            }\n        }\n    }\n    function ProfileUpdated(xuid) {\n        if (_m_xuid === xuid)\n            FillOutFriendCard();\n    }\n    function UpdateName() {\n        $.GetContextPanel().SetDialogVariable('xuid', _m_xuid);\n    }\n    function _SetHonorIcon() {\n        const elHonorIcon = $.GetContextPanel().FindChildInLayoutFile('jsHonorIcon');\n        if (elHonorIcon)\n            elHonorIcon.Set(FriendsListAPI.GetFriendXpTrailLevel(_m_xuid), false);\n    }\n    function _SetAvatar() {\n        let elAvatarExisting = $.GetContextPanel().FindChildInLayoutFile('JsPlayerCardAvatar');\n        if (!elAvatarExisting) {\n            let elParent = $.GetContextPanel().FindChildInLayoutFile('JsPlayerCardTop');\n            let elAvatar = $.CreatePanel(\"Panel\", elParent, 'JsPlayerCardAvatar');\n            elAvatar.SetAttributeString('xuid', _m_xuid);\n            elAvatar.BLoadLayout('file://{resources}/layout/avatar.xml', false, false);\n            elAvatar.BLoadLayoutSnippet(\"AvatarPlayerCard\");\n            Avatar.Init(elAvatar, _m_xuid, 'playercard');\n            elParent.MoveChildBefore(elAvatar, $.GetContextPanel().FindChildInLayoutFile('JsPlayerCardName'));\n        }\n        else {\n            Avatar.Init(elAvatarExisting, _m_xuid, 'playercard');\n        }\n    }\n    function _SetPlayerBackground() {\n        let flairDefIdx = FriendsListAPI.GetFriendDisplayItemDefFeatured(_m_xuid);\n        let flairItemId = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(flairDefIdx, 0);\n        let imagePath = InventoryAPI.GetItemInventoryImage(flairItemId);\n        let elBgImage = $.GetContextPanel().FindChildInLayoutFile('AnimBackground');\n        elBgImage.style.backgroundImage = (imagePath) ? 'url(\"file://{images}' + imagePath + '.png\")' : 'none';\n        elBgImage.style.backgroundPosition = '50% 50%';\n        elBgImage.style.backgroundSize = 'auto 165%';\n        elBgImage.style.backgroundRepeat = 'no-repeat';\n        elBgImage.style.blur = 'gaussian(2,2,1)';\n        elBgImage.AddClass('player-card-bg-anim');\n    }\n    function _SetRank() {\n        let elRank = $.GetContextPanel().FindChildInLayoutFile('JsPlayerXp');\n        if (!MyPersonaAPI.IsInventoryValid() || !_m_currentLvl || (!_HasXpProgressToFreeze() && !_IsPlayerPrime())) {\n            elRank.AddClass('hidden');\n            return;\n        }\n        if (!_IsPlayerPrime() && !_m_isSelf) {\n            elRank.AddClass('hidden');\n            return;\n        }\n        let bHasRankToFreezeButNoPrestige = (_m_ShowLockedRankSkillGroupState) ? true : false;\n        let currentPoints = FriendsListAPI.GetFriendXp(_m_xuid), pointsPerLevel = MyPersonaAPI.GetXpPerLevel();\n        let elXpBarInner = $.GetContextPanel().FindChildInLayoutFile('JsPlayerXpBarInner');\n        if (bHasRankToFreezeButNoPrestige) {\n            elXpBarInner.GetParent().visible = false;\n        }\n        else {\n            let percentComplete = (currentPoints / pointsPerLevel) * 100;\n            elXpBarInner.style.width = percentComplete + '%';\n            elXpBarInner.GetParent().visible = true;\n        }\n        if (_m_isSelf) {\n            const xpBonuses = MyPersonaAPI.GetActiveXpBonuses();\n            const bEligibleForCarePackage = xpBonuses.split(',').includes('2');\n            $.GetContextPanel().SetHasClass('care-package-eligible', bEligibleForCarePackage);\n            const petId = InventoryAPI.GetPetItemID();\n            const nStage = petId ? Number(InventoryAPI.GetItemAttributeValue(petId, '{uint32}upgrade level')) : 0;\n            $.GetContextPanel().SetHasClass('pet-feed-eligible', bEligibleForCarePackage && !!petId && nStage > 0);\n        }\n        let elRankText = $.GetContextPanel().FindChildInLayoutFile('JsPlayerRankName');\n        elRankText.SetHasClass('player-card-prime-text', bHasRankToFreezeButNoPrestige);\n        elRank.SetHasClass('player-card-nonprime-locked-xp-row', bHasRankToFreezeButNoPrestige);\n        if (bHasRankToFreezeButNoPrestige) {\n            elRankText.text = $.Localize('#Xp_RankName_Locked');\n        }\n        else {\n            elRankText.SetDialogVariable('name', $.Localize('#SFUI_XP_RankName_' + _m_currentLvl));\n            elRankText.SetDialogVariableInt('level', _m_currentLvl);\n        }\n        let elRankIcon = $.GetContextPanel().FindChildInLayoutFile('JsPlayerXpIcon');\n        elRankIcon.SetImage('file://{images}/icons/xp/level' + _m_currentLvl + '.png');\n        elRank.RemoveClass('hidden');\n        let bPrestigeAvailable = _m_isSelf && (_m_currentLvl >= InventoryAPI.GetMaxLevel());\n        $.GetContextPanel().FindChildInLayoutFile('GetPrestigeButton').SetHasClass('hidden', !bPrestigeAvailable);\n        if (bPrestigeAvailable) {\n            $.GetContextPanel().FindChildInLayoutFile('GetPrestigeButtonClickable').SetPanelEvent('onactivate', _OnActivateGetPrestigeButtonClickable);\n        }\n    }\n    function _OnActivateGetPrestigeButtonClickable() {\n        const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('', 'file://{resources}/layout/popups/popup_inventory_inspect.xml');\n        let oSettings = {\n            item_id: '0',\n            show_work_type_warning: false,\n            work_type: 'prestigecheck'\n        };\n        elPanel.Data().oSettings = oSettings;\n    }\n    function SetAllSkillGroups() {\n        let elSkillGroupContainer = $.GetContextPanel().FindChildInLayoutFile('JsPlayerCardSkillGroupContainer');\n        if (!_HasXpProgressToFreeze() && !_IsPlayerPrime()) {\n            elSkillGroupContainer.AddClass('hidden');\n            return;\n        }\n        _SetSkillGroup('Premier');\n        _m_arrAdditionalSkillGroups.forEach(type => _SetSkillGroup(type));\n        elSkillGroupContainer.RemoveClass('hidden');\n    }\n    function _SetSkillGroup(type) {\n        _UpdateSkillGroup(_LoadSkillGroupSnippet(type), type);\n    }\n    function _LoadSkillGroupSnippet(type) {\n        let id = 'JsPlayerCardSkillGroup-' + type;\n        let elParent = $.GetContextPanel().FindChildInLayoutFile('SkillGroupContainer');\n        let elSkillGroup = elParent.FindChildInLayoutFile(id);\n        if (!elSkillGroup) {\n            elSkillGroup = $.CreatePanel(\"Panel\", elParent, id);\n            elSkillGroup.BLoadLayoutSnippet('PlayerCardRatingEmblem');\n            _ShowOtherRanksByDefault(elSkillGroup, type);\n        }\n        return elSkillGroup;\n    }\n    function _ShowOtherRanksByDefault(elSkillGroup, type) {\n        let elToggleBtn = $.GetContextPanel().FindChildInLayoutFile('SkillGroupExpand');\n        if (type !== 'Competitive' && _m_bShownInFriendsList) {\n            elSkillGroup.AddClass('collapsed');\n            return;\n        }\n        elToggleBtn.visible = _m_bShownInFriendsList ? true : false;\n        if (!_m_bShownInFriendsList && _m_isSelf) {\n            _AskForLocalPlayersAdditionalSkillGroups();\n        }\n    }\n    function _AskForLocalPlayersAdditionalSkillGroups() {\n        let hintLoadSkillGroups = '';\n        for (let type of _m_arrAdditionalSkillGroups) {\n            if (FriendsListAPI.GetFriendCompetitiveRank(_m_xuid, type) === -1) {\n                hintLoadSkillGroups += (hintLoadSkillGroups ? ',' : '') + type;\n            }\n        }\n        if (hintLoadSkillGroups) {\n            MyPersonaAPI.HintLoadPipRanks(hintLoadSkillGroups);\n        }\n        _m_arrAdditionalSkillGroups.forEach(type => _SetSkillGroup(type));\n    }\n    function _UpdateSkillGroup(elSkillGroup, type) {\n        const score = FriendsListAPI.GetFriendCompetitiveRank(_m_xuid, type);\n        const wins = FriendsListAPI.GetFriendCompetitiveWins(_m_xuid, type);\n        let options = {\n            root_panel: elSkillGroup,\n            rating_type: type,\n            do_fx: true,\n            full_details: true,\n            leaderboard_details: { score: score, matchesWon: wins },\n            local_player: _m_xuid === MyPersonaAPI.GetXuid()\n        };\n        let haveRating = RatingEmblem.SetXuid(options);\n        let showRating = haveRating || MyPersonaAPI.GetXuid() === _m_xuid;\n        elSkillGroup.SetHasClass('hidden', !showRating);\n        elSkillGroup.SetDialogVariable('rating-text', RatingEmblem.GetRatingDesc(elSkillGroup));\n        let skillGroupId = elSkillGroup.id;\n        let tooltipText = RatingEmblem.GetTooltipText(elSkillGroup);\n        elSkillGroup.SetPanelEvent('onmouseover', () => ShowSkillGroupTooltip(skillGroupId, tooltipText));\n        elSkillGroup.SetPanelEvent('onmouseout', HideSkillGroupTooltip);\n    }\n    function _SetPrimeUpsell() {\n        let elUpsellPanel = $.GetContextPanel().FindChildInLayoutFile('JsPlayerCardPrimeUpsell');\n        elUpsellPanel.SetHasClass('hidden', !MyPersonaAPI.IsInventoryValid() || _IsPlayerPrime() || !_m_isSelf);\n        elUpsellPanel.FindChildInLayoutFile(\"id-player-card-prime-upsell-xp\").visible = !_HasXpProgressToFreeze() && !_IsPlayerPrime();\n        elUpsellPanel.FindChildInLayoutFile(\"id-player-card-prime-upsell-skillgroup\").visible = !_HasXpProgressToFreeze() && !_IsPlayerPrime();\n    }\n    function _SetCommendations() {\n        let catagories = [\n            { key: 'friendly', value: 0 },\n            { key: 'teaching', value: 0 },\n            { key: 'leader', value: 0 }\n        ];\n        let catagoriesCount = catagories.length;\n        let countHiddenCommends = 0;\n        let elCommendsBlock = $.GetContextPanel().FindChildInLayoutFile('JsPlayerCommendations');\n        for (let i = 0; i < catagoriesCount; i++) {\n            catagories[i].value = FriendsListAPI.GetFriendCommendations(_m_xuid, catagories[i].key);\n            let elCommend = $.GetContextPanel().FindChildInLayoutFile('JsPlayer' + catagories[i].key);\n            if (!catagories[i].value || catagories[i].value === 0) {\n                elCommend.AddClass('hidden');\n                countHiddenCommends++;\n            }\n            else {\n                if (elCommendsBlock.BHasClass('hidden'))\n                    elCommendsBlock.RemoveClass('hidden');\n                elCommend.RemoveClass('hidden');\n                elCommend.FindChild('JsCommendLabel').text = String(catagories[i].value);\n            }\n        }\n        elCommendsBlock.SetHasClass('hidden', countHiddenCommends === catagoriesCount && !_IsPlayerPrime());\n        return countHiddenCommends === catagoriesCount;\n    }\n    function _SetPrime(bHasNoCommendsToShow) {\n        let elPrime = $.GetContextPanel().FindChildInLayoutFile('JsPlayerPrime');\n        if (!MyPersonaAPI.IsInventoryValid())\n            elPrime.AddClass('hidden');\n        if (_IsPlayerPrime()) {\n            elPrime.RemoveClass('hidden');\n            elPrime.FindChildInLayoutFile('JsCommendLabel').visible = bHasNoCommendsToShow;\n            return;\n        }\n        else\n            elPrime.AddClass('hidden');\n    }\n    function _IsPlayerPrime() {\n        return FriendsListAPI.GetFriendPrimeEligible(_m_xuid);\n    }\n    function _HasXpProgressToFreeze() {\n        return MyPersonaAPI.HasPrestige() || MyPersonaAPI.GetCurrentLevel() > 2;\n    }\n    function _SetTeam() {\n        if (!_m_isSelf)\n            return;\n        let teamName = MyPersonaAPI.GetMyOfficialTeamName(), tournamentName = MyPersonaAPI.GetMyOfficialTournamentName();\n        if (!teamName || !tournamentName) {\n            $.GetContextPanel().FindChildInLayoutFile('JsPlayerTeam').AddClass('hidden');\n            return;\n        }\n        $.GetContextPanel().FindChildInLayoutFile('JsPlayerXp').AddClass('hidden');\n        $.GetContextPanel().FindChildInLayoutFile('JsPlayerCardSkillGroupContainer').AddClass('hidden');\n        $.GetContextPanel().FindChildInLayoutFile('JsPlayerTeam').RemoveClass('hidden');\n        let teamTag = MyPersonaAPI.GetMyOfficialTeamTag();\n        $.GetContextPanel().FindChildInLayoutFile('JsTeamIcon').SetImage('file://{images}/tournaments/teams/' + teamTag + '.svg');\n        $.GetContextPanel().FindChildInLayoutFile('JsTeamLabel').text = teamName;\n        $.GetContextPanel().FindChildInLayoutFile('JsTournamentLabel').text = tournamentName;\n    }\n    function _SetFlairItems() {\n        let flairItems = FriendsListAPI.GetFriendDisplayItemDefCount(_m_xuid);\n        let flairItemIdList = [];\n        let elFlairPanal = $.GetContextPanel().FindChildInLayoutFile('FlairCarouselAndControls');\n        if (!flairItems) {\n            elFlairPanal.AddClass('hidden');\n            return;\n        }\n        for (let i = 0; i < flairItems; i++) {\n            let flairDefIdx = FriendsListAPI.GetFriendDisplayItemDefByIndex(_m_xuid, i);\n            let flairItemId = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(flairDefIdx, 0);\n            flairItemIdList.push(flairItemId);\n        }\n        $.GetContextPanel().FindChildInLayoutFile('FlairCarousel').RemoveAndDeleteChildren();\n        _MakeFlairCarouselPages(flairItemIdList);\n        elFlairPanal.RemoveClass('hidden');\n    }\n    function _MakeFlairCarouselPages(flairItemIdList) {\n        let countFlairItems = flairItemIdList.length;\n        let elFlairCarousel = $.GetContextPanel().FindChildInLayoutFile('FlairCarousel');\n        let elCarouselPage = null;\n        for (let i = 0; i < countFlairItems; i++) {\n            if (i % 5 === 0) {\n                elCarouselPage = $.CreatePanel('Panel', elFlairCarousel, '', { class: 'playercard-flair-carousel__page' });\n            }\n            function onMouseOver(flairItemId, idForTooltipLocaation) {\n                let tooltipText = InventoryAPI.GetItemName(flairItemId);\n                UiToolkitAPI.ShowTextTooltip(idForTooltipLocaation, tooltipText);\n            }\n            ;\n            let imagePath = InventoryAPI.GetItemInventoryImage(flairItemIdList[i]);\n            let panelName = _m_xuid + flairItemIdList[i];\n            if (elCarouselPage) {\n                if (imagePath !== '') {\n                    let elFlair = $.CreatePanel('Image', elCarouselPage, panelName, {\n                        class: 'playercard-flair__icon',\n                        src: 'file://{images}' + imagePath + '_small.png',\n                        scaling: 'stretch-to-fit-preserve-aspect'\n                    });\n                    let flairItemId = flairItemIdList[i];\n                    elFlair.SetPanelEvent('onmouseover', () => onMouseOver(flairItemId, panelName));\n                    elFlair.SetPanelEvent('onmouseout', () => UiToolkitAPI.HideTextTooltip());\n                }\n            }\n        }\n    }\n    function ShowXpTooltip() {\n        if (_m_ShowLockedRankSkillGroupState) {\n            ShowSkillGroupTooltip('JsPlayerXpIcon', '#tooltip_xp_locked');\n            return;\n        }\n        function ShowTooltip() {\n            _m_tooltipDelayHandle = null;\n            if (!_m_isSelf)\n                return;\n            if (_m_currentLvl && _m_currentLvl > 0)\n                UiToolkitAPI.ShowCustomLayoutParametersTooltip('JsPlayerXpIcon', 'XpToolTip', 'file://{resources}/layout/tooltips/tooltip_player_xp.xml', 'xuid=' + _m_xuid);\n        }\n        ;\n        _m_tooltipDelayHandle = $.Schedule(0.3, ShowTooltip);\n    }\n    PlayerCard.ShowXpTooltip = ShowXpTooltip;\n    function HideXpTooltip() {\n        if (_m_ShowLockedRankSkillGroupState) {\n            HideSkillGroupTooltip();\n            return;\n        }\n        if (_m_tooltipDelayHandle) {\n            $.CancelScheduled(_m_tooltipDelayHandle);\n            _m_tooltipDelayHandle = null;\n        }\n        UiToolkitAPI.HideCustomLayoutTooltip('XpToolTip');\n    }\n    PlayerCard.HideXpTooltip = HideXpTooltip;\n    function ShowSkillGroupTooltip(id, tooltipText) {\n        function ShowTooltipSkill() {\n            _m_tooltipDelayHandle = null;\n            UiToolkitAPI.ShowTextTooltip(id, tooltipText);\n        }\n        ;\n        _m_tooltipDelayHandle = $.Schedule(0.3, ShowTooltipSkill);\n    }\n    function HideSkillGroupTooltip() {\n        if (_m_tooltipDelayHandle) {\n            $.CancelScheduled(_m_tooltipDelayHandle);\n            _m_tooltipDelayHandle = null;\n        }\n        UiToolkitAPI.HideTextTooltip();\n    }\n    function UpdateAvatar() {\n        _SetAvatar();\n        _SetPlayerBackground();\n        _SetFlairItems();\n        _SetPrimeUpsell();\n        _SetRank();\n    }\n    function ShowHideAdditionalRanks() {\n        let elToggleBtn = $.GetContextPanel().FindChildInLayoutFile('SkillGroupExpand');\n        if (elToggleBtn.checked) {\n            _AskForLocalPlayersAdditionalSkillGroups();\n        }\n        for (let type of _m_arrAdditionalSkillGroups) {\n            $.GetContextPanel().FindChildInLayoutFile('JsPlayerCardSkillGroup-' + type).SetHasClass('collapsed', !elToggleBtn.checked);\n        }\n    }\n    PlayerCard.ShowHideAdditionalRanks = ShowHideAdditionalRanks;\n    {\n        if ($.DbgIsReloadingScript()) {\n        }\n        Init();\n        $.RegisterForUnhandledEvent('PanoramaComponent_GC_Hello', FillOutFriendCard);\n        $.RegisterForUnhandledEvent('PanoramaComponent_FriendsList_ProfileUpdated', ProfileUpdated);\n        $.RegisterForUnhandledEvent('PanoramaComponent_MyPersona_PipRankUpdate', SetAllSkillGroups);\n        $.RegisterForUnhandledEvent(\"PanoramaComponent_Lobby_PlayerUpdated\", UpdateAvatar);\n    }\n})(PlayerCard || (PlayerCard = {}));\n","scripts/player_stats_card.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"common/async.ts\" />\n/// <reference path=\"rating_emblem.ts\" />\n/// <reference path=\"mock_adapter.ts\" />\nvar PlayerStatsCard;\n(function (PlayerStatsCard) {\n    const CARD_ID = 'card';\n    function Init(elParent, xuid, index) {\n        $.RegisterForUnhandledEvent(\"EndOfMatch_SkillGroupUpdated\", _UpdateSkillGroup);\n        let elCard = $.CreatePanel('Panel', elParent, CARD_ID);\n        elCard.BLoadLayout(\"file://{resources}/layout/player_stats_card.xml\", false, false);\n        elCard.SetDialogVariableInt('playerslot', Number(MockAdapter.GetPlayerSlot(xuid)));\n        elCard.SetDialogVariableInt('xuid', Number(xuid));\n        elCard.SetHasClass('localplayer', xuid === MockAdapter.GetLocalPlayerXuid());\n        let snippet = '';\n        switch (MockAdapter.GetGameModeInternalName(false)) {\n            case 'training':\n            case 'deathmatch':\n                snippet = 'snippet-banner-dm';\n                break;\n            case 'gungameprogressive':\n                snippet = \"snippet-banner-ar\";\n                break;\n            default:\n                snippet = 'snippet-banner-classic';\n                break;\n        }\n        elCard.FindChildTraverse('JsBanner').BLoadLayoutSnippet(snippet);\n        let elBannerBG = elCard.FindChildTraverse('JsBannerBG');\n        elBannerBG.SetImage('file://{images}/stats_cards/stats_card_banner_' + index + '.png');\n        let elCardBG = elCard.FindChildTraverse('JsCardBG');\n        let maxCoord = 100;\n        let minCoord = -100;\n        let randX = Math.floor(Math.random() * (maxCoord - minCoord) + minCoord);\n        let randY = Math.floor(Math.random() * (maxCoord - minCoord) + minCoord);\n        elCardBG.style.backgroundPosition = randX + '% ' + randY + '%';\n        _SetHonorIcon(elCard, xuid);\n        return elCard;\n    }\n    PlayerStatsCard.Init = Init;\n    function GetCard(elParent) {\n        return elParent.FindChildTraverse(CARD_ID);\n    }\n    PlayerStatsCard.GetCard = GetCard;\n    function SetAccolade(elCard, accValue, accName, accPosition) {\n        if (!isNaN(Number(accValue))) {\n            accValue = String(Math.floor(Number(accValue)));\n        }\n        elCard.SetDialogVariable('accolade-value-string', accValue);\n        elCard.SetDialogVariableTime('accolade-value-time', Number(accValue));\n        elCard.SetDialogVariableInt('accolade-value-int', Number(accValue));\n        let secondPlaceSuffix = (accPosition != '1') ? '_2' : '';\n        elCard.SetDialogVariable('accolade-the-title', $.Localize('#accolade_' + accName + secondPlaceSuffix));\n        elCard.SetDialogVariable('accolade-desc', $.Localize('#accolade_' + accName + '_desc' + secondPlaceSuffix, elCard));\n        let valueToken = '#accolade_' + accName + '_value';\n        let valueLocalized = $.Localize('#accolade_' + accName + '_value', elCard);\n        if (valueToken == valueLocalized)\n            valueLocalized = '';\n        elCard.SetDialogVariable('accolade-value', valueLocalized);\n        elCard.SetHasClass('show-accolade', true);\n    }\n    PlayerStatsCard.SetAccolade = SetAccolade;\n    function SetAvatar(elCard, xuid) {\n        let elAvatarImage = elCard.FindChildTraverse('jsAvatar');\n        elAvatarImage.PopulateFromPlayerSlot(MockAdapter.GetPlayerSlot(xuid));\n        let team = MockAdapter.GetPlayerTeamName(xuid);\n        elAvatarImage.SwitchClass('teamstyle', 'team--' + team);\n    }\n    PlayerStatsCard.SetAvatar = SetAvatar;\n    function SetFlair(elCard, xuid) {\n        let flairItemId = InventoryAPI.GetFlairItemId(xuid);\n        if (flairItemId === \"0\" || !flairItemId) {\n            const flairDefIdx = FriendsListAPI.GetFriendDisplayItemDefFeatured(xuid);\n            flairItemId = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(flairDefIdx, 0);\n            if (flairItemId === \"0\" || !flairItemId || flairDefIdx == 65535)\n                return false;\n        }\n        const imagePath = InventoryAPI.GetItemInventoryImage(flairItemId);\n        let elFlairImage = elCard.FindChildTraverse('jsFlairImage');\n        elFlairImage.SetImage('file://{images}' + imagePath + '_small.png');\n        elCard.SetHasClass('show-flair', true);\n    }\n    PlayerStatsCard.SetFlair = SetFlair;\n    function _UpdateSkillGroup(strSkillgroupData) {\n        const oSkillgroupData = JSON.parse(strSkillgroupData);\n        Object.keys(oSkillgroupData).forEach((xuid, i) => {\n            const cardId = 'cardcontainer-' + xuid;\n            const elCard = $.GetContextPanel().FindChildTraverse(cardId);\n            if (elCard) {\n                const newPlayerData = oSkillgroupData[xuid];\n                if (newPlayerData && newPlayerData.hasOwnProperty('new_rank') &&\n                    newPlayerData.hasOwnProperty('rank_type')) {\n                    const wins = newPlayerData.hasOwnProperty('num_wins') ? newPlayerData.num_wins : 0;\n                    const options = {\n                        root_panel: elCard.FindChildTraverse('jsRatingEmblem'),\n                        do_fx: true,\n                        full_details: false,\n                        leaderboard_details: { score: newPlayerData.new_rank, matchesWon: wins },\n                        rating_type: newPlayerData.rank_type,\n                        local_player: xuid === MyPersonaAPI.GetXuid()\n                    };\n                    $.Schedule(1.0 + 0.5 * i, () => {\n                        if (elCard && elCard.IsValid()) {\n                            RatingEmblem.SetXuid(options);\n                            elCard.TriggerClass('skillgroup-update');\n                        }\n                    });\n                }\n            }\n        });\n    }\n    function SetSkillGroup(elCard, xuid) {\n        if (!elCard.FindChildTraverse('jsRatingEmblem'))\n            return;\n        const rating_type = MockAdapter.GetPlayerCompetitiveRankType(xuid);\n        const score = MockAdapter.GetPlayerCompetitiveRanking(xuid);\n        const wins = MockAdapter.GetPlayerCompetitiveWins(xuid);\n        const options = {\n            root_panel: elCard.FindChildTraverse('jsRatingEmblem'),\n            do_fx: true,\n            full_details: true,\n            rating_type: rating_type,\n            leaderboard_details: { score: score, matchesWon: wins },\n            local_player: xuid === MyPersonaAPI.GetXuid()\n        };\n        const bShowSkillGroup = RatingEmblem.SetXuid(options);\n        if (bShowSkillGroup) {\n            elCard.RemoveClass('show-skillgroup');\n            $.Schedule(0, () => elCard && elCard.IsValid() ? elCard.AddClass('show-skillgroup') : '');\n        }\n        else {\n            elCard.RemoveClass('show-skillgroup');\n        }\n    }\n    PlayerStatsCard.SetSkillGroup = SetSkillGroup;\n    function _SetHonorIcon(elPanel, xuid) {\n        const elHonorIcon = elPanel.FindChildTraverse('jsHonorIcon');\n        elHonorIcon.Set(GameStateAPI.GetPlayerXpTrailLevel(xuid), false);\n    }\n    function SetStats(elCard, xuid, arrBestStats = null) {\n        let oStats = MockAdapter.GetPlayerStatsJSO(xuid);\n        let score = MockAdapter.GetPlayerScore(xuid);\n        if (arrBestStats) {\n            for (let oBest of arrBestStats) {\n                let stat = oBest.stat;\n                if (oStats[stat] > 0 && (!oBest.value || oStats[stat] > oBest.value)) {\n                    oBest.value = oStats[stat];\n                    oBest.elCard = elCard;\n                }\n            }\n        }\n        elCard.SetDialogVariableInt('playercardstats-kills', Number(oStats.kills));\n        elCard.SetDialogVariableInt('playercardstats-deaths', Number(oStats.deaths));\n        elCard.SetDialogVariableInt('playercardstats-assists', Number(oStats.assists));\n        elCard.SetDialogVariableInt('playercardstats-adr', Number(oStats.adr));\n        elCard.SetDialogVariableInt('playercardstats-hsp', Number(oStats.hsp));\n        elCard.SetDialogVariableInt('playercardstats-ef', Number(oStats.enemiesflashed));\n        elCard.SetDialogVariableInt('playercardstats-ud', Number(oStats.utilitydamage));\n        elCard.SetDialogVariableInt('playercardstats-score', Number(score));\n        elCard.SetDialogVariableInt('playercardstats-gglevel', Number(Math.floor(score / 2)));\n        elCard.SetDialogVariableInt('playercardstats-knifekills', Number(oStats.knifekills));\n        elCard.SetHasClass('show-stats', true);\n    }\n    PlayerStatsCard.SetStats = SetStats;\n    function SetTeammateColor(elCard, xuid) {\n        for (let elPlayerColor of elCard.FindChildrenWithClassTraverse('colorize-teammate-color')) {\n            let teammateColor = MockAdapter.GetPlayerColor(xuid);\n            let teamName = MockAdapter.GetPlayerTeamName(xuid);\n            let teamColor = teammateColor ? teammateColor : teamName == 'CT' ? '#5ab8f4' : '#f0c941';\n            elPlayerColor.style.washColor = (teamColor !== '') ? teamColor : 'black';\n        }\n    }\n    PlayerStatsCard.SetTeammateColor = SetTeammateColor;\n    async function RevealStats(elCard) {\n        const DELAY_DELTA = 0.1;\n        for (const elPanel of elCard.FindChildrenWithClassTraverse('sliding-panel')) {\n            await Async.Delay(DELAY_DELTA);\n            elPanel.AddClass('slide');\n        }\n    }\n    PlayerStatsCard.RevealStats = RevealStats;\n    function HighlightStat(elCard, stat) {\n        elCard.AddClass('highlight-' + stat);\n    }\n    PlayerStatsCard.HighlightStat = HighlightStat;\n})(PlayerStatsCard || (PlayerStatsCard = {}));\n","scripts/popups/pet_book_pages.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../popups/pet_photo_library.ts\" />\n/// <reference path=\"../popups/pet_photo_tag.ts\" />\nvar PetBookPages;\n(function (PetBookPages) {\n    const _m_cp = $.GetContextPanel();\n    const STAGE_EGG = 0;\n    const STAGE_CHICK = 1;\n    const STAGE_ADOLESCENT = 2;\n    const STAGE_ADULT = 3;\n    const NAME_PLACEHOLDER = $.Localize('#pet_book_name_placeholder');\n    let _m_pet = { strId: '', strName: NAME_PLACEHOLDER, nStage: STAGE_EGG, rtHatch: 0, bookdata: {} };\n    let _m_strBookKey = '';\n    let _m_bHasLivePet = false;\n    function _NewestBookOnDisk() {\n        const aBooks = GameInterfaceAPI.GetPetBookCloudFileKeys();\n        if (aBooks.length <= 0) {\n            return '';\n        }\n        const petKey = GameInterfaceAPI.UnpackPetBookCloudFile(aBooks[aBooks.length - 1]);\n        if (!petKey) {\n            return '';\n        }\n        _m_pet = _ReadPet(petKey);\n        return petKey;\n    }\n    function _ItemAttr(strId, strAttrName) {\n        const value = Number(InventoryAPI.GetItemAttributeValue(strId, '{uint32}' + strAttrName));\n        return isNaN(value) ? 0 : value;\n    }\n    function _ReadPet(strId) {\n        if (!strId)\n            strId = InventoryAPI.GetPetItemID();\n        if (!strId) {\n            return { strId: '', strName: NAME_PLACEHOLDER, nStage: STAGE_EGG, rtHatch: 0, bookdata: {} };\n        }\n        const nStage = _ItemAttr(strId, 'upgrade level');\n        return {\n            strId: strId,\n            strName: _PetName(strId, nStage),\n            nStage: nStage,\n            rtHatch: _ItemAttr(strId, 'deployment date'),\n            bookdata: {},\n        };\n    }\n    function _PetName(strId, nStage) {\n        if (nStage <= STAGE_EGG)\n            return NAME_PLACEHOLDER;\n        let nPreviousStage = nStage;\n        while (nPreviousStage > 0) {\n            const utf8name = InventoryAPI.GetItemAttributeValue(strId, '{bytestring}custom name attr'\n                + ((nPreviousStage >= 2) ? ' ' + nPreviousStage : ''));\n            if (utf8name)\n                return utf8name;\n            --nPreviousStage;\n        }\n        let nNextStage = nStage + 1;\n        while (nNextStage <= 3) {\n            const utf8name = InventoryAPI.GetItemAttributeValue(strId, '{bytestring}custom name attr'\n                + ((nNextStage >= 2) ? ' ' + nNextStage : ''));\n            if (utf8name)\n                return utf8name;\n            ++nNextStage;\n        }\n        return InventoryAPI.GetItemNameUncustomized(strId);\n    }\n    function _HatchDateText() {\n        const rtHatch = _m_pet.rtHatch;\n        if (!rtHatch) {\n            return '';\n        }\n        const strDate = InventoryAPI.LocalizeRentalDate(rtHatch);\n        if (_m_pet.nStage !== STAGE_EGG) {\n            return strDate;\n        }\n        _m_cp.SetDialogVariable('hatch_day', strDate);\n        return $.Localize('#pet_book_hatch_due', _m_cp);\n    }\n    function PetItemID() {\n        return _m_pet.strId;\n    }\n    PetBookPages.PetItemID = PetItemID;\n    function PetStage() {\n        return _m_pet.nStage;\n    }\n    PetBookPages.PetStage = PetStage;\n    function HasLivePet() {\n        return _m_bHasLivePet;\n    }\n    PetBookPages.HasLivePet = HasLivePet;\n    const FREE_LAYOUTS = [\n        { name: 'single', slots: [0] },\n        { name: 'pair', slots: [1, 2] },\n        { name: 'trio', slots: [3, 4, 5] },\n        { name: 'quad', slots: [6, 7, 8, 9] },\n    ];\n    const FREE_HOLES = {};\n    FREE_LAYOUTS.forEach(shape => shape.slots.forEach(nSlot => {\n        FREE_HOLES[nSlot] = { hint: '#pet_book_hint_free' };\n    }));\n    const LAYOUTS = {\n        'intro': { id: 1, snippet: 'page-intro', holes: {\n                0: { alsoRequires: 'zoom:closeup', hint: '#pet_book_hint_chick_intro' },\n            } },\n        'feet': { id: 2, snippet: 'page-feet', holes: {\n                0: { alsoRequires: 'zoom:wide', hint: '#pet_book_hint_chick_feet' },\n            } },\n        'early-days': { id: 3, snippet: 'page-early-days', holes: {\n                0: { alsoRequires: 'pose:8|9|10', hint: '#pet_book_hint_chick_and_you' },\n            } },\n        'chick-park': { id: 4, snippet: 'page-chick-park', holes: {\n                0: { alsoRequires: 'stage:picnic', hint: '#pet_book_hint_chick_park' },\n            } },\n        'teen-warehouse': { id: 5, snippet: 'page-teen-warehouse', holes: {\n                0: { alsoRequires: 'stage:warehouse', hint: '#pet_book_hint_adolescent_intro' },\n            } },\n        'teen-trip-1': { id: 6, snippet: 'page-teen-trip-set-1', holes: {\n                0: { alsoRequires: 'stage:dust2|airport|inferno|train', hint: '#pet_book_hint_adolescent_road_trip_1' },\n            } },\n        'teen-trip-2': { id: 7, snippet: 'page-teen-trip-set-2', holes: {\n                0: { alsoRequires: 'stage:mirage|nuke|cache|ancient', hint: '#pet_book_hint_adolescent_road_trip_2' },\n            } },\n        'birthday': { id: 8, snippet: 'page-birthday', holes: {\n                0: { alsoRequires: 'activity:jump,headwear:party', hint: '#pet_book_hint_birthday' },\n            } },\n        'adult-perch': { id: 10, snippet: 'page-adult-perch', holes: {\n                0: { alsoRequires: 'pose:1|3|6|7,filter:sepia', hint: '#pet_book_hint_adult_perch' },\n            } },\n        'adult-tricks': { id: 11, snippet: 'page-adult-tricks', holes: {\n                0: { alsoRequires: 'activity:kick|fly', hint: '#pet_book_hint_adult_tricks' },\n            } },\n        'adult-close': { id: 13, snippet: 'page-adult-close', holes: {\n                0: { alsoRequires: 'pose:4|5', hint: '#pet_book_hint_adult_close' },\n            } },\n        'brave-fire': { id: 15, snippet: 'page-brave-fire', achievement: 'killed-by-burn', holes: {} },\n        'brave-taser': { id: 16, snippet: 'page-brave-taser', achievement: 'killed-by-taser', holes: {} },\n        'brave-c4': { id: 17, snippet: 'page-brave-c4', achievement: 'killed-by-planted-c4', holes: {} },\n        'free': { id: 14, snippet: 'page-free', holes: FREE_HOLES },\n    };\n    const SECTIONS = [\n        {\n            name: 'chick', icon: 'pet_chick.svg', stage: STAGE_CHICK,\n            pages: ['intro', 'feet', 'early-days', 'chick-park', 'free', 'free'],\n        },\n        {\n            name: 'pullet', icon: 'pet_pullet.svg', stage: STAGE_ADOLESCENT,\n            pages: ['teen-warehouse', 'teen-trip-1', 'teen-trip-2', 'birthday', 'free', 'free'],\n        },\n        {\n            name: 'brave', icon: 'pet_field_report.svg', stage: STAGE_ADULT,\n            pages: ['brave-fire', 'brave-taser', 'brave-c4'],\n        },\n        {\n            name: 'hen', icon: 'pet_hen.svg', stage: STAGE_ADULT,\n            pages: ['adult-perch', 'adult-tricks', 'adult-close', 'free', 'free'],\n        },\n    ];\n    const PAGES = [];\n    SECTIONS.forEach(section => section.pages.forEach(strName => {\n        const layout = LAYOUTS[strName];\n        PAGES.push({ num: PAGES.length + 1, section: section, layout: layout });\n    }));\n    function _PageAt(nPageNum) {\n        return PAGES[nPageNum - 1];\n    }\n    function _RequireOf(page, hole) {\n        const strGrowth = PetPhotoTag.GrowthTerm(page.section.stage);\n        return hole.alsoRequires === undefined ? strGrowth : strGrowth + ',' + hole.alsoRequires;\n    }\n    function _RequireAt(nPageNum, nSlot) {\n        const page = _PageAt(nPageNum);\n        if (page === undefined) {\n            return undefined;\n        }\n        const hole = page.layout.holes[nSlot];\n        return hole === undefined ? undefined : _RequireOf(page, hole);\n    }\n    let _m_aShown = [];\n    function _IsBehindTheBird(page) {\n        return _m_pet.nStage > page.section.stage;\n    }\n    function _IsUnlocked(page) {\n        const strAchievement = page.layout.achievement;\n        if (strAchievement === undefined || _HasPhotos(page)) {\n            return true;\n        }\n        return _m_pet.strId !== '' && InventoryAPI.PetHasAchievement(_m_pet.strId, strAchievement);\n    }\n    function _CanFill(page, aPhotos) {\n        return Object.values(page.layout.holes).some(hole => {\n            const strRequire = _RequireOf(page, hole);\n            return aPhotos.some(strFileName => PetPhotoTag.Matches(strFileName, strRequire));\n        });\n    }\n    function _AllPhotos() {\n        if (_m_strBookKey === '') {\n            return [];\n        }\n        return GameInterfaceAPI.FindFiles(PetPhotoTag.LibraryFolder(_m_strBookKey) + '/*' + PetPhotoTag.EXT, 'USRLOCAL')\n            .concat(GameInterfaceAPI.FindFiles(PetPhotoTag.BookFolder(_m_strBookKey) + '/*' + PetPhotoTag.EXT, 'USRLOCAL'));\n    }\n    function _BuildShown() {\n        const aPhotos = _AllPhotos();\n        _m_aShown = PAGES\n            .filter(page => _IsUnlocked(page) && (!_IsBehindTheBird(page) || _HasPhotos(page) || _CanFill(page, aPhotos)))\n            .map(page => page.num);\n    }\n    function ShownPages() {\n        return _m_aShown;\n    }\n    PetBookPages.ShownPages = ShownPages;\n    function Chapters() {\n        const aChapters = [];\n        SECTIONS.forEach(section => {\n            const nFirst = _m_aShown.find(nPage => PAGES[nPage - 1].section === section);\n            if (nFirst !== undefined) {\n                aChapters.push({ name: section.name, icon: section.icon, page: nFirst });\n            }\n        });\n        return aChapters;\n    }\n    PetBookPages.Chapters = Chapters;\n    function _LayoutIdForPage(nPageNum) {\n        const page = _PageAt(nPageNum);\n        return page === undefined ? 0 : page.layout.id;\n    }\n    const _m_photos = {};\n    function _PhotosOn(nPageNum) {\n        if (!_m_photos[nPageNum]) {\n            _m_photos[nPageNum] = {};\n        }\n        return _m_photos[nPageNum];\n    }\n    function _PhotoAt(nPage, nSlot) {\n        const photos = _m_photos[nPage];\n        return photos ? photos[nSlot] || '' : '';\n    }\n    function _HasPhotos(page) {\n        const photos = _m_photos[page.num];\n        return photos !== undefined && Object.keys(photos).length > 0;\n    }\n    function _SlotPlace(elSlot) {\n        return {\n            page: elSlot.GetAttributeInt('data-page', -1),\n            slot: elSlot.GetAttributeInt('data-slot', -1),\n        };\n    }\n    function _Load() {\n        if (_m_strBookKey === '') {\n            return;\n        }\n        GameInterfaceAPI.FindFiles(PetPhotoTag.BookFolder(_m_strBookKey) + '/*' + PetPhotoTag.EXT, 'USRLOCAL').forEach(strFileName => {\n            const place = PetPhotoTag.PlaceOf(strFileName);\n            if (!place || place.slot === PetPhotoTag.SLOT_UNPLACED) {\n                return;\n            }\n            if (place.layout !== _LayoutIdForPage(place.page)) {\n                return;\n            }\n            const slots = _PhotosOn(place.page);\n            const strSitting = slots[place.slot];\n            if (!strSitting) {\n                slots[place.slot] = strFileName;\n                return;\n            }\n            const bNewer = PetPhotoTag.CaptureMS(strFileName) > PetPhotoTag.CaptureMS(strSitting);\n            slots[place.slot] = bNewer ? strFileName : strSitting;\n        });\n    }\n    function _Reload(bRoll) {\n        Object.keys(_m_photos).forEach(strPageNum => { delete _m_photos[Number(strPageNum)]; });\n        _Load();\n        if (bRoll) {\n            PetPhotoLibrary.LoadFromDisk(_m_strBookKey);\n        }\n        $.Schedule(0, _m_fnRefreshSpread);\n    }\n    function _EmptyLibraryText() {\n        return PAGES.some(_HasPhotos) ? '#pet_photo_library_empty_in_book' : '#pet_photo_library_empty';\n    }\n    function _BookName(strFileName, nPage, nSlot) {\n        return PetPhotoTag.BookName(strFileName, { page: nPage, layout: _LayoutIdForPage(nPage), slot: nSlot });\n    }\n    function _MoveIntoBook(strFileName, nPage, nSlot) {\n        const strNew = _BookName(strFileName, nPage, nSlot);\n        return GameInterfaceAPI.MovePetPhotoToBook(_m_strBookKey, strFileName, strNew) ? strNew : '';\n    }\n    function _MoveWithinBook(strFileName, nPage, nSlot) {\n        const strNew = _BookName(strFileName, nPage, nSlot);\n        return GameInterfaceAPI.RenameBookPhoto(_m_strBookKey, strFileName, strNew) ? strNew : '';\n    }\n    function _MoveToLibrary(strFileName) {\n        const strNew = PetPhotoTag.RollName(strFileName);\n        return GameInterfaceAPI.MoveBookPhotoToPet(_m_strBookKey, strFileName, strNew) ? strNew : '';\n    }\n    function _Reconcile() {\n        if (_m_strBookKey === '') {\n            return;\n        }\n        const aBook = GameInterfaceAPI.FindFiles(PetPhotoTag.BookFolder(_m_strBookKey) + '/*' + PetPhotoTag.EXT, 'USRLOCAL');\n        const inBook = {};\n        aBook.forEach(strFileName => { inBook[PetPhotoTag.CaptureMS(strFileName)] = true; });\n        GameInterfaceAPI.FindFiles(PetPhotoTag.LibraryFolder(_m_strBookKey) + '/*' + PetPhotoTag.EXT, 'USRLOCAL').forEach(strFileName => {\n            if (inBook[PetPhotoTag.CaptureMS(strFileName)]) {\n                GameInterfaceAPI.DeletePetPhoto(_m_strBookKey, strFileName);\n            }\n        });\n        const byHole = {};\n        const byPhoto = {};\n        const aHome = [];\n        aBook.sort().reverse().forEach(strFileName => {\n            const place = PetPhotoTag.PlaceOf(strFileName);\n            const strMS = PetPhotoTag.CaptureMS(strFileName);\n            if (!place || place.slot === PetPhotoTag.SLOT_UNPLACED) {\n                aHome.push(strFileName);\n                return;\n            }\n            if (place.layout !== _LayoutIdForPage(place.page)) {\n                aHome.push(strFileName);\n                return;\n            }\n            const strKey = place.page + '_' + place.slot;\n            if (byHole[strKey] || byPhoto[strMS]) {\n                aHome.push(strFileName);\n                return;\n            }\n            byHole[strKey] = true;\n            byPhoto[strMS] = true;\n        });\n        aHome.forEach(strFileName => {\n            _MoveToLibrary(strFileName);\n        });\n    }\n    let _m_strDragFile = '';\n    let _m_dragFrom = null;\n    let _m_bDropHandled = false;\n    let _m_elDragImage = null;\n    let _m_justDropped = null;\n    let _m_fnRefreshSpread = () => { };\n    function Init(fnRefreshSpread) {\n        _m_fnRefreshSpread = fnRefreshSpread;\n        const strAskedFor = _m_cp.GetAttributeString('bookkey', '');\n        const strAskedPet = strAskedFor === '' ? '' : GameInterfaceAPI.UnpackPetBookCloudFile(strAskedFor);\n        _m_pet = _ReadPet();\n        _m_bHasLivePet = _m_pet.strId !== '' && (strAskedPet === '' || strAskedPet === _m_pet.strId);\n        if (_m_bHasLivePet) {\n            GameInterfaceAPI.UnpackPetBookCloudFile(_m_pet.strId);\n            GameInterfaceAPI.PreparePetPhoto(_m_pet.strId, '');\n            _m_strBookKey = _m_pet.strId;\n        }\n        else if (strAskedPet !== '') {\n            _m_pet = _ReadPet(strAskedPet);\n            _m_strBookKey = strAskedPet;\n        }\n        else {\n            _m_strBookKey = _NewestBookOnDisk();\n        }\n        if (_m_strBookKey)\n            _m_pet.bookdata = GameInterfaceAPI.GetPetPhotoBookData(_m_strBookKey);\n        _m_cp.SetDialogVariable('pet_name', _m_pet.strName);\n        for (let iLifeStage = 1; iLifeStage <= 3; ++iLifeStage) {\n            _m_cp.SetDialogVariable('pet_name_' + iLifeStage, _PetName(_m_pet.strId, iLifeStage));\n        }\n        _m_cp.SetDialogVariable('hatch_date', _HatchDateText());\n        const elBody = _m_cp.FindChildInLayoutFile('id-photo-library-body');\n        elBody.BLoadLayout('file://{resources}/layout/popups/pet_photo_library.xml', false, false);\n        _Reconcile();\n        PetPhotoLibrary.Init(elBody, {\n            bDraggable: true,\n            bDeletable: true,\n            fnEmpty: _EmptyLibraryText,\n            fnOnDragStart: _OnLibraryDragStart,\n            fnOnDragEnd: _EndDrag,\n        });\n        PetPhotoLibrary.LoadFromDisk(_m_strBookKey);\n        _m_cp.FindChildInLayoutFile('id-pb-booth-btn').visible = HasLivePet();\n        _Load();\n        _BuildShown();\n    }\n    PetBookPages.Init = Init;\n    function _Image(elParent, strClass) {\n        const aImages = elParent.FindChildrenWithClassTraverse(strClass);\n        return aImages.length > 0 ? aImages[0] : null;\n    }\n    function _SetSlotHint(elSlot, strAgainst) {\n        const place = _SlotPlace(elSlot);\n        const page = _PageAt(place.page);\n        const aLabels = elSlot.FindChildrenWithClassTraverse('pb-slot__hint');\n        if (page === undefined || aLabels.length === 0) {\n            return;\n        }\n        const hole = page.layout.holes[place.slot];\n        if (hole === undefined) {\n            return;\n        }\n        const strRequire = _RequireOf(page, hole);\n        const aUnmet = strAgainst === '' ? [] : PetPhotoTag.Unmet(strAgainst, strRequire);\n        const elLabel = aLabels[0];\n        PetPhotoTag.TermWords(strRequire).forEach(term => {\n            const strOwn = hole.hint + '_' + term.name;\n            const strWord = $.CanLocalize(strOwn) ? $.Localize(strOwn) : term.word;\n            const strClass = 'pb-hint-' + term.name +\n                (aUnmet.indexOf(term.name) >= 0 ? ' pb-hint-unmet' : '');\n            elLabel.SetDialogVariable(term.name, '<span class=\"' + strClass + '\">' + strWord + '</span>');\n        });\n        elLabel.text = hole.hint;\n    }\n    const _m_freeChoice = {};\n    function _FreeLayoutNamed(strName) {\n        return FREE_LAYOUTS.find(layout => layout.name === strName);\n    }\n    function _FreeLayoutOf(nPageNum) {\n        const slots = _PhotosOn(nPageNum);\n        const worn = FREE_LAYOUTS.find(layout => layout.slots.some(nSlot => slots[nSlot] !== undefined));\n        return worn || _FreeLayoutNamed(_m_freeChoice[nPageNum]) || FREE_LAYOUTS[0];\n    }\n    function _ChooseLayout(elPage, nPageNum, strName) {\n        if (!_FreeLayoutNamed(strName)) {\n            return;\n        }\n        _m_freeChoice[nPageNum] = strName;\n        const slots = _PhotosOn(nPageNum);\n        const aOn = Object.keys(slots).map(Number);\n        if (aOn.length === 0) {\n            _ShowFreeLayout(elPage, nPageNum);\n            return;\n        }\n        aOn.forEach(nSlot => { _MoveToLibrary(slots[nSlot]); });\n        _Reload(true);\n    }\n    function _FreeBtnId(nPageNum, strName) {\n        return 'id-pb-free-' + nPageNum + '-' + strName;\n    }\n    function _ShowFreeLayout(elPage, nPageNum) {\n        const worn = _FreeLayoutOf(nPageNum);\n        elPage.FindChildrenWithClassTraverse('pb-free-group').forEach(elGroup => {\n            elGroup.visible = elGroup.GetAttributeString('data-free', '') === worn.name;\n        });\n        const elBtn = _m_cp.FindChildTraverse(_FreeBtnId(nPageNum, worn.name));\n        if (elBtn) {\n            elBtn.checked = true;\n        }\n    }\n    function _DressFreePage(elPage, nPageNum) {\n        const elStrip = elPage.FindChildrenWithClassTraverse('pb-free-strip')[0];\n        if (!elStrip) {\n            return;\n        }\n        FREE_LAYOUTS.forEach(layout => {\n            const elBtn = $.CreatePanel('RadioButton', elStrip, _FreeBtnId(nPageNum, layout.name), {\n                class: 'pb-free-btn',\n                group: 'pb-free-' + nPageNum\n            });\n            $.CreatePanel('Image', elBtn, '', {\n                src: 'file://{images}/icons/ui/page_layout_' + layout.name + '.svg',\n                textureheight: '20',\n                texturewidth: '-1',\n                scaling: 'stretch-to-fit-preserve-aspect'\n            });\n            elBtn.SetPanelEvent('onactivate', () => { _ChooseLayout(elPage, nPageNum, layout.name); });\n        });\n        _ShowFreeLayout(elPage, nPageNum);\n    }\n    function FillPage(elPage, nPageNum) {\n        const page = _PageAt(nPageNum);\n        if (page === undefined) {\n            return;\n        }\n        const photos = _PhotosOn(nPageNum);\n        elPage.BLoadLayoutSnippet(page.layout.snippet);\n        elPage.SetDialogVariableInt('num', nPageNum);\n        if (page.layout === LAYOUTS.free) {\n            _DressFreePage(elPage, nPageNum);\n        }\n        const aClaimed = [];\n        elPage.FindChildrenWithClassTraverse('pb-slot').forEach(elSlot => {\n            const nSlot = elSlot.GetAttributeInt('data-slot', -1);\n            if (nSlot < 0) {\n                return;\n            }\n            _BuildHole(elSlot);\n            aClaimed.push(nSlot);\n            if (page.layout.holes[nSlot] === undefined) {\n            }\n            elSlot.SetAttributeInt('data-page', nPageNum);\n            const strPhoto = photos[nSlot];\n            elSlot.SetHasClass('pb-slot--filled', !!strPhoto);\n            _SetSlotHint(elSlot, '');\n            if (strPhoto) {\n                _SetSlotPhoto(elSlot, strPhoto);\n            }\n            elSlot.SetDraggable(!!strPhoto);\n            if (strPhoto) {\n                $.RegisterEventHandler('DragStart', elSlot, (el, drag) => {\n                    _m_dragFrom = _SlotPlace(elSlot);\n                    _BeginDrag(strPhoto, drag);\n                });\n                $.RegisterEventHandler('DragEnd', elSlot, _EndDrag);\n            }\n            $.RegisterEventHandler('DragEnter', elSlot, () => {\n                const bTakes = _CanDrop(elSlot);\n                elSlot.SetHasClass('pb-slot--drag-over', bTakes);\n                elSlot.SetHasClass('pb-slot--drag-reject', !bTakes);\n                _SetSlotHint(elSlot, bTakes ? '' : _m_strDragFile);\n                _ShowDragWillRemove(false);\n            });\n            $.RegisterEventHandler('DragLeave', elSlot, () => {\n                _ClearDragOver(elSlot);\n                _ShowDragWillRemove(true);\n            });\n            $.RegisterEventHandler('DragDrop', elSlot, () => {\n                _ClearDragOver(elSlot);\n                _DropPhoto(elSlot);\n            });\n            if (_m_justDropped && _m_justDropped.page === nPageNum && _m_justDropped.slot === nSlot) {\n                _m_justDropped = null;\n                elSlot.TriggerClass('pb-slot--dropped');\n            }\n        });\n        Object.keys(photos).forEach(strSlot => {\n            const nSlot = Number(strSlot);\n            if (aClaimed.indexOf(nSlot) >= 0) {\n                return;\n            }\n            delete photos[nSlot];\n        });\n        elPage.SetHasClass('pb-dressed', Object.keys(photos).length > 0 || Object.keys(page.layout.holes).length === 0);\n        _FillParagraph(elPage, nPageNum);\n        _ApplyDragState();\n    }\n    PetBookPages.FillPage = FillPage;\n    function _BuildHole(elSlot) {\n        const elClip = $.CreatePanel('Panel', elSlot, '', { class: 'pb-slot__clip' });\n        $.CreatePanel('Image', elClip, '', { class: 'pb-slot__image', scaling: 'cover' });\n        $.CreatePanel('Label', elSlot, '', { class: 'pb-slot__hint', html: 'true' });\n    }\n    function _FillParagraph(elPage, nPageNum) {\n        const strFileName = _PhotosOn(nPageNum)[0];\n        const nCaptureMS = strFileName ? Number(PetPhotoTag.CaptureMS(strFileName)) : 0;\n        elPage.FindChildrenWithClassTraverse('pb-page__paragraph').forEach(elLabel => {\n            const strToken = elLabel.GetAttributeString('data-paragraph', '');\n            const nCount = elLabel.GetAttributeInt('data-variants', 0);\n            if (strToken === '' || nCount <= 0) {\n                return;\n            }\n            elLabel.text = $.Localize(strToken + '_' + (nCaptureMS % nCount), elLabel);\n        });\n    }\n    function _SetSlotPhoto(elSlot, strFileName) {\n        const elImage = _Image(elSlot, 'pb-slot__image');\n        if (!elImage) {\n            return;\n        }\n        elImage.SetImageFromFile(PetPhotoTag.PhotoUrl(_m_strBookKey, strFileName));\n        _ApplyFrame(elSlot, elImage, strFileName, PetPhotoTag.FrameOf(strFileName));\n        _MakeFrameButton(elSlot);\n    }\n    function _MakeFrameButton(elSlot) {\n        if (elSlot.FindChildrenWithClassTraverse('pb-slot__frame-btn').length > 0) {\n            return;\n        }\n        const elBtn = $.CreatePanel('Button', elSlot, '', { class: 'pb-slot__frame-btn' });\n        $.CreatePanel('Image', elBtn, '', {\n            src: 'file://{images}/icons/ui/tune.svg',\n            textureheight: '24',\n            texturewidth: '-1',\n            scaling: 'stretch-to-fit-preserve-aspect'\n        });\n        elBtn.SetPanelEvent('onactivate', () => { OpenFrame(elSlot); });\n    }\n    const _m_holeAspect = {};\n    function _HoleAspect(elSlot) {\n        const place = _SlotPlace(elSlot);\n        const strKey = _LayoutIdForPage(place.page) + ':' + place.slot;\n        if (_m_holeAspect[strKey] > 0) {\n            return _m_holeAspect[strKey];\n        }\n        const flW = elSlot.actuallayoutwidth / (elSlot.actualuiscale_x || 1);\n        const flH = elSlot.actuallayoutheight / (elSlot.actualuiscale_y || 1);\n        if (flW <= 0 || flH <= 0) {\n            return 0;\n        }\n        _m_holeAspect[strKey] = flW / flH;\n        return _m_holeAspect[strKey];\n    }\n    function _FrameSize(flHole, strFileName, frame) {\n        const flPhoto = PetPhotoTag.Aspect(strFileName);\n        const flZoom = frame.zoom / 100;\n        return {\n            w: (flPhoto >= flHole ? 100 * flPhoto / flHole : 100) * flZoom,\n            h: (flPhoto >= flHole ? 100 : 100 * flHole / flPhoto) * flZoom,\n        };\n    }\n    function _ApplyFrame(elSlot, elImage, strFileName, frame) {\n        if (PetPhotoTag.IsDefaultFrame(frame)) {\n            elImage.style.width = '100%;';\n            elImage.style.height = '100%;';\n            elImage.style.transform = 'none;';\n            elImage.style.opacity = '1;';\n            return;\n        }\n        const flHole = _HoleAspect(elSlot);\n        if (flHole <= 0) {\n            elImage.style.opacity = '0;';\n            _DeferFrame(elSlot);\n            return;\n        }\n        const { w: flW, h: flH } = _FrameSize(flHole, strFileName, frame);\n        elImage.style.width = flW.toFixed(2) + '%;';\n        elImage.style.height = flH.toFixed(2) + '%;';\n        const flX = (flW - 100) * (0.5 - frame.x / 100);\n        const flY = (flH - 100) * (0.5 - frame.y / 100);\n        elImage.style.transform = 'translateX( ' + flX.toFixed(2) + '% ) translateY( ' + flY.toFixed(2) + '% );';\n        elImage.style.opacity = '1;';\n    }\n    const FRAME_MEASURE_TRIES = 8;\n    function _DeferFrame(elSlot) {\n        const nTried = elSlot.GetAttributeInt('data-frame-tries', 0);\n        if (nTried >= FRAME_MEASURE_TRIES) {\n            return;\n        }\n        elSlot.SetAttributeInt('data-frame-tries', nTried + 1);\n        $.Schedule(0, () => {\n            if (!elSlot.IsValid()) {\n                return;\n            }\n            const place = _SlotPlace(elSlot);\n            const strPhoto = _PhotoAt(place.page, place.slot);\n            if (strPhoto) {\n                _SetSlotPhoto(elSlot, strPhoto);\n            }\n        });\n    }\n    let _m_framing = null;\n    let _m_frameJob = undefined;\n    const FRAME_COMMIT_SEC = 0.4;\n    function _FrameBar() { return _m_cp.FindChildInLayoutFile('id-pb-frame-bar'); }\n    function _FrameSlider(strWhich) { return _m_cp.FindChildInLayoutFile('id-pb-frame-' + strWhich); }\n    function OpenFrame(elSlot) {\n        const place = _SlotPlace(elSlot);\n        const strPhoto = _PhotoAt(place.page, place.slot);\n        if (!strPhoto) {\n            return;\n        }\n        CloseFrame();\n        _m_framing = { page: place.page, slot: place.slot, frame: PetPhotoTag.FrameOf(strPhoto) };\n        elSlot.SetHasClass('pb-slot--framing', true);\n        elSlot.SetDraggable(false);\n        _SetSliders(_m_framing.frame);\n        _FrameBar().SetHasClass('pb-frame-bar--open', true);\n        _PlaceFrameBar(elSlot);\n        _EnablePanSliders();\n    }\n    PetBookPages.OpenFrame = OpenFrame;\n    const FRAME_BAR_W = 260;\n    const FRAME_BAR_H = 156;\n    const FRAME_BAR_GAP = 10;\n    function _PlaceFrameBar(elSlot) {\n        const elBar = _FrameBar();\n        const flScaleX = _m_cp.actualuiscale_x || 1;\n        const flScaleY = _m_cp.actualuiscale_y || 1;\n        const pos = elSlot.GetPositionWithinAncestor(_m_cp);\n        const flSlotX = pos.x / flScaleX;\n        const flSlotY = pos.y / flScaleY;\n        const flSlotW = elSlot.actuallayoutwidth / flScaleX;\n        const flSlotH = elSlot.actuallayoutheight / flScaleY;\n        const flRoomW = _m_cp.actuallayoutwidth / flScaleX;\n        const flRoomH = _m_cp.actuallayoutheight / flScaleY;\n        const flRight = flSlotX + flSlotW + FRAME_BAR_GAP;\n        const flX = (flRight + FRAME_BAR_W <= flRoomW) ? flRight : flSlotX - FRAME_BAR_W - FRAME_BAR_GAP;\n        const flWanted = flSlotY + flSlotH / 2 - FRAME_BAR_H / 2;\n        const flY = Math.max(FRAME_BAR_GAP, Math.min(flRoomH - FRAME_BAR_H - FRAME_BAR_GAP, flWanted));\n        elBar.style.position = Math.max(FRAME_BAR_GAP, flX).toFixed(0) + 'px ' + flY.toFixed(0) + 'px 0px;';\n    }\n    function _SetSliders(frame) {\n        const aRows = [\n            { which: 'zoom', min: 100, max: PetPhotoTag.FRAME_ZOOM_MAX, value: frame.zoom },\n            { which: 'x', min: 0, max: 100, value: frame.x },\n            { which: 'y', min: 0, max: 100, value: frame.y },\n        ];\n        aRows.forEach(row => {\n            const elSlider = _FrameSlider(row.which);\n            if (!elSlider) {\n                return;\n            }\n            elSlider.ClearPanelEvent('onvaluechanged');\n            elSlider.min = row.min;\n            elSlider.max = row.max;\n            elSlider.value = row.value;\n            elSlider.SetPanelEvent('onvaluechanged', _OnFrameChanged);\n        });\n    }\n    function _EnablePanSliders() {\n        if (!_m_framing) {\n            return;\n        }\n        const strPhoto = _PhotoAt(_m_framing.page, _m_framing.slot);\n        const elSlot = _SlotPanel(_m_framing.page, _m_framing.slot);\n        if (!strPhoto || !elSlot) {\n            return;\n        }\n        const flHole = _HoleAspect(elSlot);\n        if (flHole <= 0) {\n            return;\n        }\n        const size = _FrameSize(flHole, strPhoto, _m_framing.frame);\n        _EnablePanRow('x', size.w > 100.5);\n        _EnablePanRow('y', size.h > 100.5);\n    }\n    function _EnablePanRow(strWhich, bEnable) {\n        const elSlider = _FrameSlider(strWhich);\n        elSlider.enabled = bEnable;\n        elSlider.GetParent().SetHasClass('pb-frame-bar__row--off', !bEnable);\n    }\n    function _ReadSliders() {\n        return {\n            x: _FrameSlider('x').value,\n            y: _FrameSlider('y').value,\n            zoom: _FrameSlider('zoom').value,\n        };\n    }\n    function _OnFrameChanged() {\n        if (!_m_framing) {\n            return;\n        }\n        _m_framing.frame = _ReadSliders();\n        _PreviewFrame();\n        _EnablePanSliders();\n        if (_m_frameJob !== undefined) {\n            $.CancelScheduled(_m_frameJob);\n        }\n        _m_frameJob = $.Schedule(FRAME_COMMIT_SEC, _CommitFrame);\n    }\n    function _PreviewFrame() {\n        if (!_m_framing) {\n            return;\n        }\n        const strPhoto = _PhotoAt(_m_framing.page, _m_framing.slot);\n        const elSlot = _SlotPanel(_m_framing.page, _m_framing.slot);\n        if (!elSlot || !strPhoto) {\n            return;\n        }\n        const elImage = _Image(elSlot, 'pb-slot__image');\n        if (elImage) {\n            _ApplyFrame(elSlot, elImage, strPhoto, _m_framing.frame);\n        }\n    }\n    function _CommitFrame() {\n        _m_frameJob = undefined;\n        if (!_m_framing) {\n            return;\n        }\n        const strPhoto = _PhotoAt(_m_framing.page, _m_framing.slot);\n        if (!strPhoto) {\n            return;\n        }\n        const strNew = PetPhotoTag.WithFrame(strPhoto, _m_framing.frame);\n        if (strNew === strPhoto) {\n            return;\n        }\n        if (!GameInterfaceAPI.RenameBookPhoto(_m_strBookKey, strPhoto, strNew)) {\n            return;\n        }\n        _PhotosOn(_m_framing.page)[_m_framing.slot] = strNew;\n        const elSlot = _SlotPanel(_m_framing.page, _m_framing.slot);\n        const elImage = elSlot ? _Image(elSlot, 'pb-slot__image') : null;\n        if (elImage) {\n            elImage.SetImageFromFile(PetPhotoTag.PhotoUrl(_m_strBookKey, strNew));\n        }\n    }\n    function ResetFrame() {\n        if (!_m_framing) {\n            return;\n        }\n        _SetSliders(PetPhotoTag.FRAME_DEFAULT);\n        _OnFrameChanged();\n    }\n    PetBookPages.ResetFrame = ResetFrame;\n    function CloseFrame() {\n        if (_m_frameJob !== undefined) {\n            $.CancelScheduled(_m_frameJob);\n            _m_frameJob = undefined;\n            _CommitFrame();\n        }\n        if (_m_framing) {\n            const elSlot = _SlotPanel(_m_framing.page, _m_framing.slot);\n            if (elSlot) {\n                elSlot.SetHasClass('pb-slot--framing', false);\n                elSlot.SetDraggable(true);\n            }\n        }\n        _m_framing = null;\n        _FrameBar().SetHasClass('pb-frame-bar--open', false);\n    }\n    PetBookPages.CloseFrame = CloseFrame;\n    function _TakesAt(nPage, nSlot, strFileName) {\n        const strRequire = _RequireAt(nPage, nSlot);\n        return strRequire !== undefined && PetPhotoTag.Matches(strFileName, strRequire);\n    }\n    function _SlotPanel(nPage, nSlot) {\n        const aFound = _m_cp.FindChildrenWithClassTraverse('pb-slot').filter(elSlot => {\n            const place = _SlotPlace(elSlot);\n            return place.page === nPage && place.slot === nSlot;\n        });\n        if (aFound.length > 1) {\n        }\n        return aFound.length > 0 ? aFound[0] : null;\n    }\n    function _CanDrop(elSlot) {\n        const place = _SlotPlace(elSlot);\n        if (!_TakesAt(place.page, place.slot, _m_strDragFile)) {\n            return false;\n        }\n        const from = _m_dragFrom;\n        if (!from) {\n            return true;\n        }\n        const strDisplaced = _PhotoAt(place.page, place.slot);\n        if (!strDisplaced || (from.page === place.page && from.slot === place.slot)) {\n            return true;\n        }\n        return _TakesAt(from.page, from.slot, strDisplaced);\n    }\n    function _ClearDragOver(elSlot) {\n        elSlot.SetHasClass('pb-slot--drag-over', false);\n        elSlot.SetHasClass('pb-slot--drag-reject', false);\n        _SetSlotHint(elSlot, '');\n    }\n    function _ApplyDragState() {\n        const bDragging = _m_strDragFile !== '';\n        _m_cp.FindChildrenWithClassTraverse('pb-slot').forEach(elSlot => {\n            elSlot.SetHasClass('pb-slot--eligible', bDragging && _CanDrop(elSlot));\n            _ClearDragOver(elSlot);\n        });\n    }\n    function _OnLibraryDragStart(strFileName, drag) {\n        _m_dragFrom = null;\n        _BeginDrag(strFileName, drag);\n    }\n    function _BeginDrag(strFileName, drag) {\n        const elDragImage = $.CreatePanel('Image', $.GetContextPanel(), '', { class: 'pb-drag-image', scaling: 'stretch-to-fit-y-preserve-aspect' });\n        elDragImage.SetImageFromFile(PetPhotoTag.PhotoUrl(_m_strBookKey, strFileName));\n        _m_strDragFile = strFileName;\n        _m_elDragImage = elDragImage;\n        _m_bDropHandled = false;\n        drag.displayPanel = elDragImage;\n        drag.offsetX = 40;\n        drag.offsetY = 30;\n        drag.removePositionBeforeDrop = false;\n        _ApplyDragState();\n        _ShowDragWillRemove(true);\n        $.DispatchEvent('CSGOPlaySoundEffect', 'Chicken.Photo.Pickup', 'MOUSE');\n    }\n    function _ShowDragWillRemove(bWillRemove) {\n        if (_m_elDragImage && _m_elDragImage.IsValid()) {\n            _m_elDragImage.SetHasClass('pb-drag-image--remove', bWillRemove && !!_m_dragFrom);\n        }\n    }\n    function CancelDrag() {\n        if (_m_elDragImage && _m_elDragImage.IsValid()) {\n            _m_elDragImage.DeleteAsync(0.1);\n        }\n        _m_strDragFile = '';\n        _m_dragFrom = null;\n        _m_elDragImage = null;\n    }\n    PetBookPages.CancelDrag = CancelDrag;\n    function _EndDrag() {\n        const from = _m_dragFrom;\n        const bHandled = _m_bDropHandled;\n        CancelDrag();\n        _ApplyDragState();\n        PetPhotoLibrary.SetTakesInput(true);\n        if (!bHandled) {\n            _PlayRejected();\n            if (from) {\n                _RemovePhoto(from.page, from.slot);\n            }\n        }\n    }\n    function _RemovePhoto(nPage, nSlot) {\n        const strFileName = _PhotoAt(nPage, nSlot);\n        if (!strFileName) {\n            return;\n        }\n        if (_MoveToLibrary(strFileName) === '') {\n            const elSlot = _SlotPanel(nPage, nSlot);\n            if (elSlot) {\n                elSlot.TriggerClass('pb-slot--reject');\n            }\n            return;\n        }\n        _Reload(true);\n    }\n    function _PlayRejected() {\n        $.DispatchEvent('CSGOPlaySoundEffect', 'Chicken.Photo.Rejected', 'MOUSE');\n    }\n    function _DropPhoto(elSlot) {\n        CloseFrame();\n        _m_bDropHandled = true;\n        const { page: nPage, slot: nSlot } = _SlotPlace(elSlot);\n        if (nPage < 0 || nSlot < 0 || _m_strDragFile === '') {\n            return;\n        }\n        if (!_CanDrop(elSlot)) {\n            elSlot.TriggerClass('pb-slot--reject');\n            _PlayRejected();\n            return;\n        }\n        const from = _m_dragFrom;\n        if (from && from.page === nPage && from.slot === nSlot) {\n            return;\n        }\n        const strDisplaced = _PhotoAt(nPage, nSlot);\n        let strParked = '';\n        if (strDisplaced) {\n            strParked = _MoveWithinBook(strDisplaced, nPage, PetPhotoTag.SLOT_UNPLACED);\n            if (strParked === '') {\n                _PlayRejected();\n                return;\n            }\n        }\n        const strPlaced = from ? _MoveWithinBook(_m_strDragFile, nPage, nSlot) :\n            _MoveIntoBook(_m_strDragFile, nPage, nSlot);\n        if (strPlaced === '') {\n            _PlayRejected();\n            if (strParked !== '') {\n                _MoveWithinBook(strParked, nPage, nSlot);\n            }\n        }\n        else {\n            if (strParked !== '') {\n                if (from) {\n                    _MoveWithinBook(strParked, from.page, from.slot);\n                }\n                else {\n                    _MoveToLibrary(strParked);\n                }\n            }\n            _m_justDropped = { page: nPage, slot: nSlot };\n            $.DispatchEvent('CSGOPlaySoundEffect', 'Chicken.Photo.Accepted', 'MOUSE');\n        }\n        _Reload(!from);\n    }\n})(PetBookPages || (PetBookPages = {}));\n","scripts/popups/pet_book_turn.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\nvar PetBookTurn;\n(function (PetBookTurn) {\n    const _m_cp = $.GetContextPanel();\n    const PAGE_W = 560;\n    const PAGE_H = 640;\n    const MARGIN = 8;\n    const BOOK_W = PAGE_W * 2 + MARGIN * 2;\n    const BOOK_H = PAGE_H + MARGIN * 16;\n    const LEFT_X = MARGIN;\n    const SPINE_X = MARGIN + PAGE_W;\n    const CLOSED_SHIFT = -PAGE_W / 2;\n    const FLIP_MS = 650;\n    const FRAME_SEC = 0.016;\n    const NO_PENDING = -1;\n    const PAGE_SHADOW_DX = 4;\n    const PAGE_SHADOW_A = 0.40;\n    const LEAF_SHADE_MAX = 0.32;\n    const BACK_SHADE_BIAS = 1.25;\n    const CAST_MAX = 0.28;\n    const CAST_W = 170;\n    const GUTTER_MAX = 0.40;\n    let _m_host;\n    let _m_book;\n    let _m_left;\n    let _m_right;\n    let _m_gutter;\n    let _m_leaf;\n    let _m_leafFront;\n    let _m_leafBack;\n    let _m_leafShade;\n    let _m_leafCast;\n    let _m_sides = [];\n    let _m_spread = 0;\n    let _m_busy = false;\n    let _m_pending = NO_PENDING;\n    let _m_mode = 'page';\n    function Init(host, aPages, startSpread) {\n        _m_host = host;\n        _m_book = _m_cp.FindChildInLayoutFile('id-pet-book');\n        _m_left = _m_cp.FindChildInLayoutFile('id-book-left');\n        _m_right = _m_cp.FindChildInLayoutFile('id-book-right');\n        _m_gutter = _m_cp.FindChildInLayoutFile('id-book-gutter');\n        _m_leaf = _m_cp.FindChildInLayoutFile('id-book-leaf');\n        _m_leafFront = _m_cp.FindChildInLayoutFile('id-leaf-front');\n        _m_leafBack = _m_cp.FindChildInLayoutFile('id-leaf-back');\n        _m_leafShade = _m_cp.FindChildInLayoutFile('id-leaf-shade');\n        _m_leafCast = _m_cp.FindChildInLayoutFile('id-leaf-cast');\n        _m_book.style.width = BOOK_W + 'px;';\n        _m_book.style.height = BOOK_H + 'px;';\n        _SizePage(_m_left);\n        _SizePage(_m_right);\n        _SizePage(_m_leaf);\n        _m_left.style.transform = 'translateX( ' + LEFT_X + 'px );';\n        _m_right.style.transform = 'translateX( ' + SPINE_X + 'px );';\n        _m_leaf.style.marginRight = MARGIN + 'px;';\n        _m_leaf.style.transform = 'rotateY( 0deg );';\n        _m_gutter.style.height = PAGE_H + 'px;';\n        _m_leafCast.style.width = CAST_W + 'px;';\n        _m_leafCast.style.height = PAGE_H + 'px;';\n        _HideLeaf();\n        _BuildSides(aPages);\n        _ShowSpread(_Bound(startSpread));\n    }\n    PetBookTurn.Init = Init;\n    function Spread() {\n        return _m_spread;\n    }\n    PetBookTurn.Spread = Spread;\n    function NumSpreads() {\n        return _m_sides.length / 2;\n    }\n    PetBookTurn.NumSpreads = NumSpreads;\n    function _Bound(spread) {\n        return Math.max(0, Math.min(spread, NumSpreads() - 1));\n    }\n    function _SizePage(p) {\n        p.style.width = PAGE_W + 'px;';\n        p.style.height = PAGE_H + 'px;';\n    }\n    function _Lerp(a, b, t) {\n        return a + (b - a) * t;\n    }\n    function _ShadowEnvelope(deg) {\n        const rad = deg * Math.PI / 180;\n        return _m_mode === 'page' ? Math.abs(Math.sin(rad)) : Math.abs(Math.sin(rad / 2));\n    }\n    function _SetLeaf(deg) {\n        _m_leaf.style.transform = 'rotateY( ' + deg + 'deg );';\n        _m_leaf.style.opacity = '1';\n        const facingFront = deg > -90 && deg < 90;\n        _m_leafFront.style.opacity = facingFront ? '1' : '0';\n        _m_leafBack.style.opacity = facingFront ? '0' : '1';\n        const lift = Math.abs(Math.sin(deg * Math.PI / 180));\n        _m_leafShade.style.opacity = (lift * LEAF_SHADE_MAX * (facingFront ? 1 : BACK_SHADE_BIAS)).toFixed(3);\n        _m_leaf.style.boxShadow = PAGE_SHADOW_DX + 'px 8px 26px 0px rgba( 0, 0, 0, '\n            + (_ShadowEnvelope(deg) * PAGE_SHADOW_A).toFixed(3) + ' );';\n        _SetCastShadow(deg, lift, facingFront);\n    }\n    function _HideLeaf() {\n        _m_leaf.style.opacity = '0';\n        _m_leafFront.style.opacity = '0';\n        _m_leafBack.style.opacity = '0';\n        _m_leafShade.style.opacity = '0';\n        _m_leafCast.style.opacity = '0';\n        _m_leafFront.RemoveAndDeleteChildren();\n        _m_leafBack.RemoveAndDeleteChildren();\n        _m_leaf.style.boxShadow = PAGE_SHADOW_DX + 'px 8px 26px 0px rgba( 0, 0, 0, 0 );';\n    }\n    function _SetCastShadow(deg, lift, overRight) {\n        const pageBelow = overRight || _m_mode === 'page';\n        if (!pageBelow || lift <= 0) {\n            _m_leafCast.style.opacity = '0';\n            return;\n        }\n        const projW = PAGE_W * Math.abs(Math.cos(deg * Math.PI / 180));\n        const x = overRight ? SPINE_X + projW : SPINE_X - projW - CAST_W;\n        _m_leafCast.style.transform = 'translateX( ' + x.toFixed(0) + 'px )'\n            + (overRight ? ';' : ' scale3d( -1, 1, 1 );');\n        _m_leafCast.style.opacity = (lift * CAST_MAX).toFixed(3);\n    }\n    function _ApplySpreadState() {\n        const closed = _m_spread === 0;\n        _m_book.style.transform = 'translateX( ' + (closed ? CLOSED_SHIFT : 0) + 'px );';\n        _m_left.style.opacity = closed ? '0' : '1';\n        _m_gutter.style.opacity = closed ? '0' : GUTTER_MAX.toFixed(3);\n    }\n    function _BuildSides(aPages) {\n        _m_sides = [];\n        _m_sides.push({ kind: 'blank' });\n        _m_sides.push({ kind: 'cover' });\n        aPages.forEach(nPage => _m_sides.push({ kind: 'page', num: nPage }));\n        if (_m_sides.length % 2 === 0) {\n            _m_sides.push({ kind: 'blank' });\n        }\n        _m_sides.push({ kind: 'back' });\n    }\n    function SpreadOfPage(nPage) {\n        const index = _m_sides.findIndex(side => side.kind === 'page' && side.num === nPage);\n        return index < 0 ? 0 : Math.floor(index / 2);\n    }\n    PetBookTurn.SpreadOfPage = SpreadOfPage;\n    function _FillSide(container, index) {\n        container.RemoveAndDeleteChildren();\n        const side = _m_sides[index];\n        if (!side || side.kind === 'blank') {\n            return;\n        }\n        const inner = $.CreatePanel('Panel', container, '', { class: 'pb-page-inner' });\n        if (side.kind === 'cover') {\n            inner.BLoadLayoutSnippet('page-cover');\n        }\n        else if (side.kind === 'back') {\n            inner.BLoadLayoutSnippet('page-back');\n        }\n        else {\n            _m_host.FillPage(inner, side.num || 0);\n        }\n    }\n    function RefreshSpread() {\n        if (_m_busy) {\n            return;\n        }\n        _ShowSpread(_m_spread);\n    }\n    PetBookTurn.RefreshSpread = RefreshSpread;\n    function _ShowSpread(spread) {\n        _m_spread = spread;\n        _FillSide(_m_left, spread * 2);\n        _FillSide(_m_right, spread * 2 + 1);\n        _ApplySpreadState();\n    }\n    function _Ease(t) {\n        const s = t * t * (3 - 2 * t);\n        return Math.pow(s, 0.72);\n    }\n    function _Tween(onFrame, onDone) {\n        const start = Date.now();\n        const tick = () => {\n            const t = (Date.now() - start) / FLIP_MS;\n            if (t >= 1) {\n                onFrame(1);\n                onDone();\n                return;\n            }\n            onFrame(_Ease(t));\n            $.Schedule(FRAME_SEC, tick);\n        };\n        tick();\n    }\n    function _RunTurn(leafFrom, leafTo, onDone) {\n        const opening = _m_mode === 'open';\n        const closing = _m_mode === 'close';\n        const bookFrom = opening ? CLOSED_SHIFT : 0;\n        const bookTo = closing ? CLOSED_SHIFT : 0;\n        _Tween((e) => {\n            _SetLeaf(_Lerp(leafFrom, leafTo, e));\n            if (bookFrom !== bookTo) {\n                _m_book.style.transform = 'translateX( ' + _Lerp(bookFrom, bookTo, e).toFixed(0) + 'px );';\n            }\n            if (opening) {\n                _m_gutter.style.opacity = (e * GUTTER_MAX).toFixed(3);\n            }\n            else if (closing) {\n                _m_gutter.style.opacity = ((1 - e) * GUTTER_MAX).toFixed(3);\n            }\n        }, onDone);\n    }\n    function TurnTo(target) {\n        _m_host.OnBeforeTurn();\n        const to = _Bound(target);\n        if (to === _m_spread) {\n            return;\n        }\n        if (_m_busy) {\n            _m_pending = to;\n            return;\n        }\n        _m_busy = true;\n        const from = _m_spread;\n        const forward = to > from;\n        _m_mode = to === 0 ? 'close' : from === 0 ? 'open' : 'page';\n        if (forward) {\n            _FillSide(_m_right, to * 2 + 1);\n            _FillSide(_m_leafFront, from * 2 + 1);\n            _FillSide(_m_leafBack, to * 2);\n            _SetLeaf(0);\n        }\n        else {\n            if (_m_mode === 'close') {\n                _m_left.style.opacity = '0';\n            }\n            else {\n                _FillSide(_m_left, to * 2);\n            }\n            _FillSide(_m_leafBack, from * 2);\n            _FillSide(_m_leafFront, to * 2 + 1);\n            _SetLeaf(-180);\n        }\n        _m_spread = to;\n        _PlayTurnSound(forward);\n        _m_host.OnSpreadChanged(to);\n        _RunTurn(forward ? 0 : -180, forward ? -180 : 0, () => {\n            if (forward) {\n                _FillSide(_m_left, to * 2);\n            }\n            else {\n                _FillSide(_m_right, to * 2 + 1);\n            }\n            _FinishTurn();\n        });\n    }\n    PetBookTurn.TurnTo = TurnTo;\n    function _FinishTurn() {\n        $.Schedule(FRAME_SEC, () => {\n            _HideLeaf();\n            _ApplySpreadState();\n            _m_busy = false;\n            const pending = _m_pending;\n            _m_pending = NO_PENDING;\n            if (pending !== NO_PENDING) {\n                TurnTo(pending);\n            }\n        });\n    }\n    function _PlayTurnSound(forward) {\n        const strSound = _m_mode === 'open' ? 'UI.BookOpen'\n            : _m_mode === 'close' ? 'UI.BookClose'\n                : forward ? 'UI.BookPageFwd' : 'UI.BookPageBwd';\n        $.DispatchEvent('CSGOPlaySoundEffect', strSound, 'MOUSE');\n    }\n})(PetBookTurn || (PetBookTurn = {}));\n","scripts/popups/pet_photo_library.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../popups/pet_photo_tag.ts\" />\nvar PetPhotoLibrary;\n(function (PetPhotoLibrary) {\n    let _m_aFiles = [];\n    let _m_elList = null;\n    let _m_elEmpty = null;\n    let _m_opts = {};\n    function Init(elRoot, opts) {\n        _m_opts = opts;\n        _m_elList = elRoot.FindChildTraverse('id-photo-library-list');\n        _m_elEmpty = elRoot.FindChildTraverse('id-photo-library-empty');\n        _m_elList.SetLoadListItemFunction((parent, nPanelIdx, reusePanel) => {\n            let elItem = reusePanel;\n            if (!elItem || !elItem.IsValid()) {\n                elItem = _BuildRow();\n            }\n            _PointRowAt(elItem, _m_aFiles[nPanelIdx]);\n            return elItem;\n        });\n    }\n    PetPhotoLibrary.Init = Init;\n    function _BuildRow() {\n        const elItem = $.CreatePanel(_m_opts.bDraggable ? 'Button' : 'Panel', _m_elList, '', { class: 'photo-library__item' });\n        $.CreatePanel('Image', elItem, '', { scaling: 'stretch-to-fit-y-preserve-aspect', class: 'photo-library__image' });\n        if (_m_opts.bDeletable) {\n            const elDelete = $.CreatePanel('Button', elItem, '', { class: 'photo-library__delete-btn' });\n            $.CreatePanel('Image', elDelete, '', { src: 'file://{images}/icons/ui/trash.svg', textureheight: '16', scaling: 'stretch-to-fit-preserve-aspect' });\n        }\n        if (_m_opts.bDraggable) {\n            $.RegisterEventHandler('DragStart', elItem, _OnDragStart);\n            $.RegisterEventHandler('DragEnd', elItem, _OnDragEnd);\n        }\n        return elItem;\n    }\n    function _PointRowAt(elItem, strFileName) {\n        elItem.SetAttributeString('data-file', strFileName);\n        const aImages = elItem.FindChildrenWithClassTraverse('photo-library__image');\n        if (aImages.length > 0) {\n            aImages[0].SetImageFromFile(PetPhotoTag.PhotoUrl(_m_strPetKey, strFileName));\n        }\n        elItem.SetPanelEvent('onactivate', () => { ShowViewer(strFileName); });\n        elItem.SetPanelEvent('onmouseover', () => { _ShowSettings(elItem, strFileName); });\n        elItem.SetPanelEvent('onmouseout', () => { UiToolkitAPI.HideTextTooltip(); });\n        if (_m_opts.bDeletable) {\n            const aDelete = elItem.FindChildrenWithClassTraverse('photo-library__delete-btn');\n            if (aDelete.length > 0) {\n                aDelete[0].SetPanelEvent('onactivate', () => { _ConfirmDelete(strFileName); });\n            }\n        }\n        elItem.SetDraggable(!!_m_opts.bDraggable);\n        elItem.SetHasClass('photo-library__item--draggable', !!_m_opts.bDraggable);\n    }\n    let _m_strPetKey = '';\n    function LoadFromDisk(strPetKey) {\n        _m_strPetKey = strPetKey;\n        const aFiles = (strPetKey === '') ? [] :\n            GameInterfaceAPI.FindFiles(PetPhotoTag.LibraryFolder(strPetKey) + '/*' + PetPhotoTag.EXT, 'USRLOCAL');\n        aFiles.sort();\n        aFiles.reverse();\n        _m_aFiles = aFiles;\n        Refresh();\n    }\n    PetPhotoLibrary.LoadFromDisk = LoadFromDisk;\n    function Insert(strFileName) {\n        if (strFileName === '' || _m_aFiles.indexOf(strFileName) >= 0) {\n            return;\n        }\n        _m_aFiles.unshift(strFileName);\n        Refresh();\n    }\n    PetPhotoLibrary.Insert = Insert;\n    function Refresh() {\n        if (!_m_elList) {\n            return;\n        }\n        const bAny = _m_aFiles.length !== 0;\n        _m_elList.visible = bAny;\n        _m_elList.UpdateListItems(_m_aFiles.length);\n        if (_m_elEmpty) {\n            const strEmpty = (!bAny && _m_opts.fnEmpty) ? _m_opts.fnEmpty() : '';\n            _m_elEmpty.visible = strEmpty !== '';\n            _m_elEmpty.text = strEmpty === '' ? '' : $.Localize(strEmpty);\n        }\n    }\n    PetPhotoLibrary.Refresh = Refresh;\n    function _ShowSettings(elItem, strFileName) {\n        const strSettings = PetPhotoTag.Describe(strFileName);\n        if (strSettings !== '') {\n            UiToolkitAPI.ShowTextTooltipOnPanelStyled(elItem, strSettings, 'tooltip-pet-photo-settings');\n        }\n    }\n    function ShowViewer(strFileName) {\n        const elMenu = UiToolkitAPI.ShowCustomLayoutContextMenuParameters('id-photo-library-list', '', 'file://{resources}/layout/context_menus/context_menu_photo_viewer.xml', 'src=' + PetPhotoTag.PhotoUrl(_m_strPetKey, strFileName) +\n            '&' + 'path=' + PetPhotoTag.LibraryFolder(_m_strPetKey) + '/' + strFileName +\n            '&' + 'pathid=USRLOCAL');\n        elMenu.AddClass('ContextMenu_NoArrow');\n    }\n    PetPhotoLibrary.ShowViewer = ShowViewer;\n    function _ConfirmDelete(strFileName) {\n        UiToolkitAPI.ShowGenericPopupYesNo('#pet_photo_library_delete_title', '#pet_photo_library_delete_desc', '', () => { _Delete(strFileName); }, () => { });\n    }\n    function _Delete(strFileName) {\n        if (!GameInterfaceAPI.DeletePetPhoto(_m_strPetKey, strFileName)) {\n            return;\n        }\n        const nIndex = _m_aFiles.indexOf(strFileName);\n        if (nIndex >= 0) {\n            _m_aFiles.splice(nIndex, 1);\n        }\n        if (_m_opts.fnOnDeleted) {\n            _m_opts.fnOnDeleted(strFileName);\n        }\n        Refresh();\n    }\n    function _OnDragStart(elRow, drag) {\n        const strFileName = elRow.GetAttributeString('data-file', '');\n        if (strFileName === '' || !_m_opts.fnOnDragStart) {\n            return;\n        }\n        _m_opts.fnOnDragStart(strFileName, drag);\n        UiToolkitAPI.HideTextTooltip();\n        SetTakesInput(false);\n    }\n    function _OnDragEnd() {\n        if (_m_opts.fnOnDragEnd) {\n            _m_opts.fnOnDragEnd();\n        }\n        SetTakesInput(true);\n    }\n    function SetTakesInput(bEnabled) {\n        if (_m_elList) {\n            _m_elList.hittest = bEnabled;\n            _m_elList.hittestchildren = bEnabled;\n        }\n    }\n    PetPhotoLibrary.SetTakesInput = SetTakesInput;\n})(PetPhotoLibrary || (PetPhotoLibrary = {}));\n","scripts/popups/pet_photo_tag.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\nvar PetPhotoTag;\n(function (PetPhotoTag) {\n    PetPhotoTag.EXT = '.jpg';\n    PetPhotoTag.FILTERS = [\n        { id: 0, name: 'normal' },\n        { id: 1, name: 'bw' },\n        { id: 2, name: 'sepia' },\n        { id: 3, name: 'warm' },\n        { id: 4, name: 'cool' },\n        { id: 5, name: 'crisp' },\n        { id: 6, name: 'moonlight' },\n        { id: 7, name: 'silvertone' },\n        { id: 8, name: 'psychedelic' },\n    ];\n    PetPhotoTag.ACTIVITIES = [\n        { id: 2, name: 'sit', activity: 'trick', variation: 2, icon: 'pet_activity_sit',\n            sound: { Chick: 'Chicken.Idle.Single.Chick.PhotoBooth',\n                Pullet: 'Chicken.Idle.Single.PhotoBooth',\n                Hen: 'Chicken.Idle.Single.PhotoBooth' } },\n        { id: 0, name: 'panic', activity: 'panic', icon: 'pet_activity_panic',\n            sound: { Chick: 'Chicken.Panic.Chick.PhotoBooth',\n                Pullet: 'Chicken.Panic.Pullet.PhotoBooth',\n                Hen: 'Chicken.Panic.Hen.PhotoBooth' } },\n        { id: 6, name: 'wag', activity: 'trick', variation: 9, icon: 'pet_activity_wag' },\n        { id: 4, name: 'moonwalk', activity: 'trick', variation: 5, icon: 'pet_activity_dance' },\n        { id: 5, name: 'jump', activity: 'trick', variation: 11, icon: 'pet_activity_jump' },\n        { id: 7, name: 'kick', activity: 'trick', variation: 12, icon: 'pet_activity_kick' },\n        { id: 1, name: 'fly', activity: 'trick', variation: 1, icon: 'pet_activity_fly' },\n    ];\n    const GROWTHS = [\n        { id: 0, name: 'egg' },\n        { id: 1, name: 'chick' },\n        { id: 2, name: 'adolescent' },\n        { id: 3, name: 'adult' },\n    ];\n    function GrowthTerm(nGrowth) {\n        const aFound = GROWTHS.filter(row => row.id === nGrowth);\n        return aFound.length > 0 ? 'growth:' + aFound[0].name : '';\n    }\n    PetPhotoTag.GrowthTerm = GrowthTerm;\n    PetPhotoTag.HEADWEAR = [\n        { id: 0, name: 'helmet', model: 'models/photobooth/silly_hats/helmet.vmdl' },\n        { id: 1, name: 'armor', model: 'models/photobooth/silly_hats/armor_helmet.vmdl' },\n        { id: 2, name: 'alien', model: 'models/photobooth/silly_hats/alien.vmdl' },\n        { id: 3, name: 'banana', model: 'models/photobooth/silly_hats/banana.vmdl' },\n        { id: 4, name: 'glasses', model: 'models/photobooth/silly_hats/glasses.vmdl' },\n        { id: 5, name: 'nose_glasses', model: 'models/photobooth/silly_hats/nose_glasses.vmdl' },\n        { id: 6, name: 'party', model: 'models/photobooth/silly_hats/party.vmdl' },\n        { id: 7, name: 'sprout', model: 'models/photobooth/silly_hats/sprout.vmdl' },\n        { id: 8, name: 'top_hat', model: 'models/photobooth/silly_hats/top_hat.vmdl' },\n        { id: 9, name: 'wizard_hat', model: 'models/photobooth/silly_hats/wizard_hat.vmdl' },\n    ];\n    const ZOOMS = [\n        { name: 'wide', band: [0, 9] },\n        { name: 'mid', band: [10, 19] },\n        { name: 'closeup', band: [20, 25] },\n    ];\n    PetPhotoTag.STAGES = [\n        { id: 0, name: 'studio', map: 'ui/pet_photo_studio', word: '#SFUI_MAP_pet_photo_studio' },\n        { id: 1, name: 'picnic', map: 'ui/pet_photo_park', word: '#SFUI_MAP_pet_photo_park' },\n        { id: 4, name: 'warehouse', map: 'warehouse_vanity', word: '#SFUI_Map_warehouse', age_requirement: 2 },\n        { id: 3, name: 'airport', map: 'ar_baggage_vanity', word: '#SFUI_Map_ar_baggage', achievement: 'visited-ar_baggage' },\n        { id: 2, name: 'dust2', map: 'de_dust2_vanity', word: '#SFUI_Map_de_dust2', achievement: 'visited-de_dust2' },\n        { id: 5, name: 'mirage', map: 'de_mirage_vanity', word: '#SFUI_Map_de_mirage', achievement: 'visited-de_mirage' },\n        { id: 6, name: 'inferno', map: 'de_inferno_vanity', word: '#SFUI_Map_de_inferno', achievement: 'visited-de_inferno' },\n        { id: 7, name: 'nuke', map: 'de_nuke_vanity', word: '#SFUI_Map_de_nuke', achievement: 'visited-de_nuke' },\n        { id: 8, name: 'cache', map: 'de_cache_vanity', word: '#SFUI_Map_de_cache', achievement: 'visited-de_cache' },\n        { id: 9, name: 'train', map: 'de_train_vanity', word: '#SFUI_Map_de_train', achievement: 'visited-de_train' },\n        { id: 10, name: 'ancient', map: 'de_ancient_vanity', word: '#SFUI_Map_de_ancient', achievement: 'visited-de_ancient' },\n    ];\n    PetPhotoTag.ASPECTS = [\n        { id: 3, name: '1x1', ratio: 1 },\n        { id: 1, name: '4x3', ratio: 4 / 3 },\n        { id: 2, name: '5x4', ratio: 5 / 4 },\n        { id: 0, name: '16x9', ratio: 16 / 9 },\n        { id: 5, name: '3x4', ratio: 3 / 4 },\n        { id: 4, name: '4x5', ratio: 4 / 5 },\n        { id: 6, name: '9x16', ratio: 9 / 16 },\n    ];\n    function Orientation(strAspect) {\n        const aFound = PetPhotoTag.ASPECTS.filter(row => row.name === strAspect);\n        if (aFound.length === 0 || aFound[0].ratio === 1) {\n            return '';\n        }\n        return aFound[0].ratio > 1 ? 'horizontal' : 'vertical';\n    }\n    PetPhotoTag.Orientation = Orientation;\n    function FlipAspect(strAspect) {\n        return strAspect.split('x').reverse().join('x');\n    }\n    PetPhotoTag.FlipAspect = FlipAspect;\n    PetPhotoTag.POSES = [\n        { name: '0' },\n        { name: '8', orbit: 80 },\n        { name: '9', orbit: 80 },\n        { name: '10', orbit: 80 },\n        { name: '2', orbit: 100 },\n        { name: '4', orbit: 110 },\n        { name: '5', orbit: 80 },\n        { name: '6', orbit: 90 },\n        { name: '1', orbit: 100 },\n        { name: '3', orbit: 100 },\n        { name: '7', orbit: 100 },\n    ];\n    const FIELDS = [\n        { letter: 'p', require: ['pose'], words: PetPhotoTag.POSES, caption: '#pet_photo_caption_pose',\n            loc: '#pet_photo_booth_pose_' },\n        { letter: 'f', require: ['filter'], codes: PetPhotoTag.FILTERS, caption: '#pet_photo_caption_filter',\n            loc: '#pet_photo_booth_filter_' },\n        { letter: 's', require: ['stage', 'scene'], codes: PetPhotoTag.STAGES, caption: '#pet_photo_caption_stage' },\n        { letter: 'g', require: ['growth'], codes: GROWTHS, caption: '#pet_photo_caption_growth',\n            loc: '#pet_growth_' },\n        { letter: 'a', require: ['aspect'], codes: PetPhotoTag.ASPECTS,\n            loc: '#pet_photo_booth_aspect_' },\n        { letter: 'z', require: ['zoom'], bands: ZOOMS, caption: '#pet_photo_caption_zoom',\n            loc: '#pet_photo_booth_zoom_' },\n        { letter: 'v', require: ['activity'], codes: PetPhotoTag.ACTIVITIES, caption: '#pet_photo_caption_activity',\n            loc: '#pet_photo_booth_activity_' },\n        { letter: 'e', require: ['headwear'], codes: PetPhotoTag.HEADWEAR, caption: '#pet_photo_caption_headwear',\n            loc: '#pet_photo_booth_headwear_' },\n    ];\n    function _RequireIndex() {\n        const byName = {};\n        FIELDS.forEach(field => { field.require.forEach(name => { byName[name] = field; }); });\n        return byName;\n    }\n    const REQUIRE = _RequireIndex();\n    function _IdOf(aValues, strName) {\n        const aFound = aValues.filter(value => value.name === strName);\n        return aFound.length > 0 ? String(aFound[0].id) : '';\n    }\n    function _Coded(strLetter, strId, strValue, strTable) {\n        if (strId === '') {\n            return '';\n        }\n        return '_' + strLetter + strId;\n    }\n    function _StageId(strMap) {\n        const aFound = PetPhotoTag.STAGES.filter(stage => stage.map === strMap);\n        return aFound.length > 0 ? String(aFound[0].id) : '';\n    }\n    function _HeadwearId(strModel) {\n        const aFound = PetPhotoTag.HEADWEAR.filter(row => row.model === strModel);\n        return aFound.length > 0 ? String(aFound[0].id) : '';\n    }\n    function Compose(shot) {\n        const strFilter = shot.filter || 'normal';\n        const strAspect = shot.aspect || '1x1';\n        return '_p' + shot.pose +\n            _Coded('f', _IdOf(PetPhotoTag.FILTERS, strFilter), strFilter, 'FILTERS') +\n            _Coded('s', _StageId(shot.stageMap), shot.stageMap, 'STAGES') +\n            '_g' + shot.growth +\n            _Coded('a', _IdOf(PetPhotoTag.ASPECTS, strAspect), strAspect, 'ASPECTS') +\n            '_z' + shot.zoom +\n            (shot.activity === '' ? '' : _Coded('v', _IdOf(PetPhotoTag.ACTIVITIES, shot.activity), shot.activity, 'ACTIVITIES')) +\n            (shot.headwear === '' ? '' : _Coded('e', _HeadwearId(shot.headwear), shot.headwear, 'HEADWEAR'));\n    }\n    PetPhotoTag.Compose = Compose;\n    function Parse(strFileName) {\n        const fields = {};\n        const aTokens = strFileName.replace(PetPhotoTag.EXT, '').split('_');\n        for (let i = 2; i < aTokens.length; i++) {\n            if (aTokens[i].length > 1) {\n                fields[aTokens[i].charAt(0)] = aTokens[i].substring(1);\n            }\n        }\n        return fields;\n    }\n    function CaptureMS(strFileName) {\n        return strFileName.replace(PetPhotoTag.EXT, '').split('_')[1] || '';\n    }\n    PetPhotoTag.CaptureMS = CaptureMS;\n    function Aspect(strFileName) {\n        const aFound = PetPhotoTag.ASPECTS.filter(row => String(row.id) === Parse(strFileName)['a']);\n        return aFound.length > 0 ? aFound[0].ratio : 1;\n    }\n    PetPhotoTag.Aspect = Aspect;\n    const PLACE_LETTERS = ['k', 'y', 'l', 'x', 'w', 'm'];\n    PetPhotoTag.SLOT_UNPLACED = 255;\n    function IsBookName(strFileName) {\n        return strFileName.indexOf('book_') === 0;\n    }\n    PetPhotoTag.IsBookName = IsBookName;\n    function LibraryFolder(strPetKey) {\n        return 'pet/' + strPetKey + '/library';\n    }\n    PetPhotoTag.LibraryFolder = LibraryFolder;\n    function BookFolder(strPetKey) {\n        return 'pet/' + strPetKey + '/book';\n    }\n    PetPhotoTag.BookFolder = BookFolder;\n    function PhotoUrl(strPetKey, strFileName) {\n        return 'file://{pet}/' + strPetKey + (IsBookName(strFileName) ? '/book/' : '/library/') + strFileName;\n    }\n    PetPhotoTag.PhotoUrl = PhotoUrl;\n    function PlaceOf(strFileName) {\n        const fields = Parse(strFileName);\n        const nPage = Number(fields['k']);\n        const nLayout = Number(fields['y']);\n        const nSlot = Number(fields['l']);\n        if (isNaN(nPage) || isNaN(nLayout) || isNaN(nSlot)) {\n            return undefined;\n        }\n        return { page: nPage, layout: nLayout, slot: nSlot };\n    }\n    PetPhotoTag.PlaceOf = PlaceOf;\n    PetPhotoTag.FRAME_DEFAULT = { x: 50, y: 50, zoom: 100 };\n    PetPhotoTag.FRAME_ZOOM_MAX = 300;\n    function _Clamp(n, min, max) {\n        return isNaN(n) ? min : Math.max(min, Math.min(max, Math.round(n)));\n    }\n    function FrameOf(strFileName) {\n        const fields = Parse(strFileName);\n        return {\n            x: fields['x'] === undefined ? PetPhotoTag.FRAME_DEFAULT.x : _Clamp(Number(fields['x']), 0, 100),\n            y: fields['w'] === undefined ? PetPhotoTag.FRAME_DEFAULT.y : _Clamp(Number(fields['w']), 0, 100),\n            zoom: fields['m'] === undefined ? PetPhotoTag.FRAME_DEFAULT.zoom : _Clamp(Number(fields['m']), 100, PetPhotoTag.FRAME_ZOOM_MAX),\n        };\n    }\n    PetPhotoTag.FrameOf = FrameOf;\n    function IsDefaultFrame(frame) {\n        return frame.x === PetPhotoTag.FRAME_DEFAULT.x && frame.y === PetPhotoTag.FRAME_DEFAULT.y && frame.zoom === PetPhotoTag.FRAME_DEFAULT.zoom;\n    }\n    PetPhotoTag.IsDefaultFrame = IsDefaultFrame;\n    function _FrameFields(frame) {\n        return IsDefaultFrame(frame) ? '' :\n            '_x' + _Clamp(frame.x, 0, 100) +\n                '_w' + _Clamp(frame.y, 0, 100) +\n                '_m' + _Clamp(frame.zoom, 100, PetPhotoTag.FRAME_ZOOM_MAX);\n    }\n    function WithFrame(strFileName, frame) {\n        const place = PlaceOf(strFileName);\n        return place === undefined ? strFileName : BookName(strFileName, place, frame);\n    }\n    PetPhotoTag.WithFrame = WithFrame;\n    function _Stem(strFileName) {\n        const aTokens = strFileName.replace(PetPhotoTag.EXT, '').split('_');\n        const aFields = aTokens.filter((strToken, i) => i >= 2 && PLACE_LETTERS.indexOf(strToken.charAt(0)) < 0);\n        return aFields.length === 0 ? aTokens[1] : aTokens[1] + '_' + aFields.join('_');\n    }\n    function RollName(strFileName) {\n        return 'pet_' + _Stem(strFileName) + PetPhotoTag.EXT;\n    }\n    PetPhotoTag.RollName = RollName;\n    function BookName(strFileName, place, frame) {\n        return 'book_' + _Stem(strFileName) +\n            '_k' + place.page + '_y' + place.layout + '_l' + place.slot +\n            _FrameFields(frame === undefined ? PetPhotoTag.FRAME_DEFAULT : frame) + PetPhotoTag.EXT;\n    }\n    PetPhotoTag.BookName = BookName;\n    function _LetterIndex() {\n        const byLetter = {};\n        FIELDS.forEach(field => { byLetter[field.letter] = field; });\n        return byLetter;\n    }\n    const BY_LETTER = _LetterIndex();\n    function _Word(field, strHas) {\n        if (field.codes) {\n            const aFound = field.codes.filter(value => value.id === Number(strHas));\n            return aFound.length > 0 ? aFound[0].name : strHas;\n        }\n        if (field.bands) {\n            const nHas = Number(strHas);\n            const aIn = field.bands.filter(row => nHas >= row.band[0] && nHas <= row.band[1]);\n            return aIn.length > 0 ? aIn[0].name : strHas;\n        }\n        return strHas;\n    }\n    const DESCRIBE_ORDER = ['g', 'z', 's', 'v', 'e', 'f', 'p'];\n    function WordFor(strLetter, strValue) {\n        const field = BY_LETTER[strLetter];\n        return field === undefined ? strValue : _NameWord(strLetter, _Word(field, strValue));\n    }\n    PetPhotoTag.WordFor = WordFor;\n    function Describe(strFileName) {\n        const fields = Parse(strFileName);\n        const aLines = [];\n        DESCRIBE_ORDER.forEach(strLetter => {\n            const field = BY_LETTER[strLetter];\n            const strHas = fields[strLetter];\n            if (field !== undefined && field.caption !== undefined && strHas !== undefined) {\n                aLines.push($.Localize(field.caption) + ': <b>' + WordFor(strLetter, strHas) + '</b>');\n            }\n        });\n        return aLines.join('<br>');\n    }\n    PetPhotoTag.Describe = Describe;\n    function _Satisfies(field, strName, strHas, strAsked) {\n        if (field.bands) {\n            const aBand = field.bands.filter(row => row.name === strAsked);\n            if (aBand.length === 0) {\n                return true;\n            }\n            const nHas = Number(strHas);\n            return nHas >= aBand[0].band[0] && nHas <= aBand[0].band[1];\n        }\n        if (field.codes) {\n            const strWanted = _IdOf(field.codes, strAsked);\n            if (strWanted === '') {\n                return true;\n            }\n            return strHas === strWanted;\n        }\n        return strHas === strAsked;\n    }\n    function _Terms(strRequire) {\n        if (strRequire === '') {\n            return [];\n        }\n        const aTerms = [];\n        strRequire.split(',').forEach(strTerm => {\n            const aParts = strTerm.split(':');\n            const field = REQUIRE[aParts[0]];\n            if (aParts.length !== 2 || field === undefined) {\n                return;\n            }\n            aTerms.push({ name: aParts[0], field: field, asked: aParts[1].split('|') });\n        });\n        return aTerms;\n    }\n    function Unmet(strFileName, strRequire) {\n        const fields = Parse(strFileName);\n        function bHolds(term) {\n            const strHas = fields[term.field.letter];\n            return strHas !== undefined &&\n                term.asked.some(strAsked => _Satisfies(term.field, term.name, strHas, strAsked));\n        }\n        return _Terms(strRequire).filter(term => !bHolds(term)).map(term => term.name);\n    }\n    PetPhotoTag.Unmet = Unmet;\n    function Matches(strFileName, strRequire) {\n        return Unmet(strFileName, strRequire).length === 0;\n    }\n    PetPhotoTag.Matches = Matches;\n    function _NameWord(strLetter, strName) {\n        const field = BY_LETTER[strLetter];\n        if (field === undefined) {\n            return strName;\n        }\n        const aValues = field.codes || field.bands || field.words || [];\n        const aFound = aValues.filter(value => value.name === strName);\n        if (aFound.length === 0) {\n            return strName;\n        }\n        if (field.loc !== undefined) {\n            return $.Localize(field.loc + strName);\n        }\n        const strWord = aFound[0].word || strName;\n        return strWord.charAt(0) === '#' ? $.Localize(strWord) : strWord;\n    }\n    function TermWords(strRequire) {\n        return _Terms(strRequire).map(term => ({\n            name: term.name,\n            word: term.asked.map(strAsked => _InlineWord(term.field, strAsked)).join(' or '),\n        }));\n    }\n    PetPhotoTag.TermWords = TermWords;\n    function _InlineWord(field, strName) {\n        const strInline = field.loc === undefined ? '' : field.loc + strName + '_inline';\n        return (strInline !== '' && $.CanLocalize(strInline)) ?\n            $.Localize(strInline) : _NameWord(field.letter, strName);\n    }\n})(PetPhotoTag || (PetPhotoTag = {}));\n","scripts/popups/popup_accept_match.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../util_gamemodeflags.ts\" />\n/// <reference path=\"../common/formattext.ts\" />\n/// <reference path=\"../common/sessionutil.ts\" />\n/// <reference path=\"../popups/popup_premier_pick_ban.ts\" />\n/// <reference path=\"../common/teamcolor.ts\" />\n/// <reference path=\"../rating_emblem.ts\" />\n/// <reference path=\"../avatar.ts\" />\nvar PopupAcceptMatch;\n(function (PopupAcceptMatch) {\n    let m_hasPressedAccept = false;\n    let m_numPlayersReady = 0;\n    let m_numTotalClientsInReservation = 0;\n    let m_numSecondsRemaining = 0;\n    let m_isReconnect = false;\n    let m_isNqmmAnnouncementOnly = false;\n    let m_gsLocation = '';\n    let m_gsPing = 0;\n    let m_lobbySettings = null;\n    const m_elTimer = $.GetContextPanel().FindChildInLayoutFile('AcceptMatchCountdown');\n    let m_jsTimerUpdateHandle = false;\n    function Init() {\n        const elPlayerSlots = $.GetContextPanel().FindChildInLayoutFile('AcceptMatchSlots');\n        elPlayerSlots.RemoveAndDeleteChildren();\n        const settings = $.GetContextPanel().GetAttributeString('map_and_isreconnect', '');\n        m_gsLocation = $.GetContextPanel().GetAttributeString('location', '');\n        m_gsPing = parseInt($.GetContextPanel().GetAttributeString('ping', '0'));\n        $.GetContextPanel().SetDialogVariable('region', m_gsLocation);\n        $.GetContextPanel().SetDialogVariableInt('ping', m_gsPing);\n        const settingsList = settings.split(',');\n        let map = settingsList[0];\n        if (map.charAt(0) === '@') {\n            m_isNqmmAnnouncementOnly = true;\n            m_hasPressedAccept = true;\n            map = map.substr(1);\n        }\n        m_isReconnect = settingsList[1] === 'true' ? true : false;\n        m_lobbySettings = LobbyAPI.GetSessionSettings();\n        if (!m_isReconnect && m_lobbySettings && m_lobbySettings.game) {\n            const elAgreement = $.GetContextPanel().FindChildInLayoutFile('Agreement');\n            elAgreement.visible = true;\n            const elAgreementComp = $.GetContextPanel().FindChildInLayoutFile('AcceptMatchAgreementCompetitive');\n            elAgreementComp.visible = m_lobbySettings.game.mode === \"competitive\";\n        }\n        $.DispatchEvent(\"ShowReadyUpPanel\");\n        _SetMatchData(map);\n        _UpdateGameServerUi();\n        if (m_isNqmmAnnouncementOnly) {\n            $('#AcceptMatchDataContainer').SetHasClass('auto', true);\n            _UpdateUiState();\n            $.DispatchEvent('CSGOPlaySoundEffectMuteBypass', 'popup_accept_match_confirmed_casual', 'MOUSE', 6.0);\n            m_jsTimerUpdateHandle = $.Schedule(4.5, _OnNqmmAutoReadyUp);\n        }\n        _PopulatePlayerList();\n        $.DispatchEvent('MuteStreamPanel');\n    }\n    PopupAcceptMatch.Init = Init;\n    function _PopulatePlayerList() {\n        let numPlayers = LobbyAPI.GetConfirmedMatchPlayerCount();\n        if (!numPlayers || numPlayers <= 2)\n            return;\n        $.GetContextPanel().SetHasClass(\"accept-match-with-player-list\", true);\n        $.GetContextPanel().FindChildInLayoutFile('id-map-draft-phase-teams').RemoveClass('hidden');\n        let iYourXuidTeamIdx = 0;\n        const yourXuid = MyPersonaAPI.GetXuid();\n        for (let i = 0; i < numPlayers; ++i) {\n            const xuidPlayer = LobbyAPI.GetConfirmedMatchPlayerByIdx(i);\n            if (xuidPlayer && xuidPlayer === yourXuid)\n                iYourXuidTeamIdx = (i < (numPlayers / 2)) ? 0 : 1;\n        }\n        for (let i = 0; i < numPlayers; ++i) {\n            let xuid = LobbyAPI.GetConfirmedMatchPlayerByIdx(i);\n            if (!xuid) {\n                continue;\n            }\n            const iThisPlayerTeamIdx = (i < (numPlayers / 2)) ? 0 : 1;\n            const teamPanelId = (iYourXuidTeamIdx === iThisPlayerTeamIdx) ? 'id-map-draft-phase-your-team' : 'id-map-draft-phase-other-team';\n            const elTeammates = $.GetContextPanel().FindChildInLayoutFile(teamPanelId).FindChild('id-map-draft-phase-avatars');\n            _MakeAvatar(xuid, elTeammates, true);\n        }\n    }\n    function _MakeAvatar(xuid, elTeammates, bisTeamLister = false) {\n        const panelType = bisTeamLister ? 'Button' : 'Panel';\n        const elAvatar = $.CreatePanel(panelType, elTeammates, xuid);\n        elAvatar.BLoadLayoutSnippet('SmallAvatar');\n        if (bisTeamLister) {\n            _AddOpenPlayerCardAction(elAvatar, xuid);\n        }\n        elAvatar.FindChildTraverse('JsAvatarImage').PopulateFromSteamID(xuid);\n        const elTeamColor = elAvatar.FindChildInLayoutFile('JsAvatarTeamColor');\n        elTeamColor.visible = false;\n        elAvatar.SetDialogVariable('xuid', xuid);\n    }\n    function _AddOpenPlayerCardAction(elAvatar, xuid) {\n        elAvatar.SetPanelEvent(\"onactivate\", () => {\n            $.DispatchEvent('SidebarContextMenuActive', true);\n            if (xuid !== \"0\") {\n                const contextMenuPanel = UiToolkitAPI.ShowCustomLayoutContextMenuParametersDismissEvent('', '', 'file://{resources}/layout/context_menus/context_menu_playercard.xml', 'xuid=' + xuid, () => $.DispatchEvent('SidebarContextMenuActive', false));\n                contextMenuPanel.AddClass(\"ContextMenu_NoArrow\");\n            }\n        });\n    }\n    function _UpdateGameServerUi() {\n        const elGameServer = $.GetContextPanel().FindChildInLayoutFile('AcceptMatchGameServer');\n        elGameServer.SetHasClass('hidden', m_hasPressedAccept || m_isReconnect || m_isNqmmAnnouncementOnly ||\n            !(m_gsLocation && m_gsPing));\n    }\n    function _UpdateUiState() {\n        _UpdateGameServerUi();\n        const btnAccept = $.GetContextPanel().FindChildInLayoutFile('AcceptMatchBtn');\n        const elPlayerSlots = $.GetContextPanel().FindChildInLayoutFile('AcceptMatchSlots');\n        let bHideTimer = false;\n        let bShowPlayerSlots = m_hasPressedAccept || m_isReconnect;\n        if (m_isNqmmAnnouncementOnly) {\n            bShowPlayerSlots = false;\n            bHideTimer = true;\n        }\n        btnAccept.SetHasClass('hidden', m_hasPressedAccept || m_isReconnect);\n        elPlayerSlots.SetHasClass('hidden', !bShowPlayerSlots);\n        if (bShowPlayerSlots) {\n            _UpdatePlayerSlots(elPlayerSlots);\n            bHideTimer = true;\n        }\n        m_elTimer.GetChild(0).text = \"0:\" + ((m_numSecondsRemaining < 10) ? \"0\" : \"\") + m_numSecondsRemaining;\n        m_elTimer.SetHasClass(\"hidden\", bHideTimer || (m_numSecondsRemaining <= 0));\n        CancelTimerSound();\n    }\n    function CancelTimerSound() {\n        if (m_jsTimerUpdateHandle) {\n            $.CancelScheduled(m_jsTimerUpdateHandle);\n            m_jsTimerUpdateHandle = false;\n        }\n    }\n    function _UpdateTimeRemainingSeconds() {\n        m_numSecondsRemaining = LobbyAPI.GetReadyTimeRemainingSeconds();\n    }\n    function _OnTimerUpdate() {\n        m_jsTimerUpdateHandle = false;\n        _UpdateTimeRemainingSeconds();\n        _UpdateUiState();\n        if (m_numSecondsRemaining > 0) {\n            if (m_hasPressedAccept) {\n                $.DispatchEvent('CSGOPlaySoundEffectMuteBypass', 'popup_accept_match_waitquiet', 'MOUSE', 1.0);\n            }\n            else {\n                $.DispatchEvent('CSGOPlaySoundEffectMuteBypass', 'popup_accept_match_beep', 'MOUSE', 1.0);\n            }\n            m_jsTimerUpdateHandle = $.Schedule(1.0, _OnTimerUpdate);\n        }\n    }\n    function _ReadyForMatch(shouldShow, playersReadyCount, numTotalClientsInReservation) {\n        if (!shouldShow) {\n            if (m_jsTimerUpdateHandle) {\n                $.CancelScheduled(m_jsTimerUpdateHandle);\n                m_jsTimerUpdateHandle = false;\n            }\n            $.DispatchEvent(\"CloseAcceptPopup\");\n            $.DispatchEvent('UIPopupButtonClicked', '');\n            return;\n        }\n        if (m_hasPressedAccept && m_numPlayersReady && (playersReadyCount > m_numPlayersReady)) {\n            $.DispatchEvent('CSGOPlaySoundEffectMuteBypass', 'popup_accept_match_person', 'MOUSE', 1.0);\n        }\n        if (playersReadyCount == 1 && numTotalClientsInReservation == 1 && (m_numTotalClientsInReservation > 1)) {\n            numTotalClientsInReservation = m_numTotalClientsInReservation;\n            playersReadyCount = m_numTotalClientsInReservation;\n        }\n        m_numPlayersReady = playersReadyCount;\n        m_numTotalClientsInReservation = numTotalClientsInReservation;\n        _UpdateTimeRemainingSeconds();\n        _UpdateUiState();\n        m_jsTimerUpdateHandle = $.Schedule(1.0, _OnTimerUpdate);\n    }\n    function _UpdatePlayerSlots(elPlayerSlots) {\n        for (let i = 0; i < m_numTotalClientsInReservation; i++) {\n            let Slot = $.GetContextPanel().FindChildInLayoutFile('AcceptMatchSlot' + i);\n            if (!Slot) {\n                Slot = $.CreatePanel('Panel', elPlayerSlots, 'AcceptMatchSlot' + i);\n                Slot.BLoadLayoutSnippet('AcceptMatchPlayerSlot');\n            }\n            Slot.SetHasClass('accept-match__slots__player--accepted', (i < m_numPlayersReady));\n        }\n        const labelPlayersAccepted = $.GetContextPanel().FindChildInLayoutFile('AcceptMatchPlayersAccepted');\n        labelPlayersAccepted.SetDialogVariableInt('accepted', m_numPlayersReady);\n        labelPlayersAccepted.SetDialogVariableInt('slots', m_numTotalClientsInReservation);\n        labelPlayersAccepted.text = $.Localize('#match_ready_players_accepted', labelPlayersAccepted);\n    }\n    function _SetMatchData(map) {\n        if (!m_lobbySettings || !m_lobbySettings.game)\n            return;\n        let gameMode = m_lobbySettings.game.mode;\n        if (gameMode === \"skirmish\")\n            gameMode = \"gungameprogressive\";\n        const labelData = $.GetContextPanel().FindChildInLayoutFile('AcceptMatchModeMap');\n        let strLocalize = '#match_ready_match_data';\n        labelData.SetDialogVariable('mode', $.Localize('#SFUI_GameMode_' + gameMode));\n        const flags = parseInt(m_lobbySettings.game.gamemodeflags);\n        if (GameModeFlags.DoesModeUseFlags(gameMode) && flags &&\n            GameModeFlags.DoesModeShowUserVisibleFlags(gameMode)) {\n            labelData.SetDialogVariable('modifier', $.Localize('#play_setting_gamemodeflags_' + gameMode + '_' + flags));\n            strLocalize = '#match_ready_match_data_modifier';\n        }\n        if (MyPersonaAPI.GetElevatedState() === 'elevated' && SessionUtil.DoesGameModeHavePrimeQueue(gameMode) && ((m_lobbySettings.game.prime !== 1) || !SessionUtil.AreLobbyPlayersPrime())) {\n            $.GetContextPanel().FindChildInLayoutFile('AcceptMatchWarning').RemoveClass('hidden');\n        }\n        labelData.SetDialogVariable('map', $.Localize('#SFUI_Map_' + map));\n        if ((gameMode === 'competitive') && (map === 'lobby_mapveto')) {\n            $('#AcceptMatchModeIcon').SetImage(\"file://{images}/icons/ui/competitive_teams.svg\");\n            if (m_lobbySettings.options && m_lobbySettings.options.challengekey) {\n                strLocalize = '#match_ready_match_data_map';\n                labelData.SetDialogVariable('map', $.Localize('#SFUI_Lobby_LeaderMatchmaking_Type_PremierPrivateQueue'));\n            }\n        }\n        labelData.text = $.Localize(strLocalize, labelData);\n        const imgMap = $.GetContextPanel().FindChildInLayoutFile('AcceptMatchMapImage');\n        imgMap.style.backgroundImage = 'url(\"file://{images}/map_icons/screenshots/360p/' + map + '.png\")';\n    }\n    function _OnNqmmAutoReadyUp() {\n        m_jsTimerUpdateHandle = false;\n        LobbyAPI.SetLocalPlayerReady('deferred');\n        $.DispatchEvent(\"CloseAcceptPopup\");\n        $.DispatchEvent('UIPopupButtonClicked', '');\n    }\n    function OnAcceptMatchPressed() {\n        m_hasPressedAccept = true;\n        $.DispatchEvent('CSGOPlaySoundEffectMuteBypass', 'popup_accept_match_person', 'MOUSE', 1.0);\n        LobbyAPI.SetLocalPlayerReady('accept');\n    }\n    PopupAcceptMatch.OnAcceptMatchPressed = OnAcceptMatchPressed;\n    function ShowPreMatchInterface() {\n        PremierPickBan.Init();\n        $.GetContextPanel().FindChildInLayoutFile('id-accept-match').AddClass('hide');\n        CancelTimerSound();\n    }\n    PopupAcceptMatch.ShowPreMatchInterface = ShowPreMatchInterface;\n    $.RegisterForUnhandledEvent('PanoramaComponent_Lobby_ReadyUpForMatch', _ReadyForMatch);\n    $.RegisterForUnhandledEvent('MatchAssistedAccept', OnAcceptMatchPressed);\n    $.RegisterForUnhandledEvent('PanoramaComponent_Lobby_ShowPreMatchInterface', ShowPreMatchInterface);\n})(PopupAcceptMatch || (PopupAcceptMatch = {}));\n","scripts/popups/popup_acknowledge_item.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../common/iteminfo.ts\" />\n/// <reference path=\"../common/icon.ts\" />\n/// <reference path=\"popup_capability_can_sticker.ts\" />\nvar AcknowledgeItems;\n(function (AcknowledgeItems_1) {\n    let m_elEquipBtn = $('#EquipItemBtn');\n    let m_focusedItemId = '';\n    function OnLoad() {\n        $.RegisterForUnhandledEvent('PanoramaComponent_MyPersona_InventoryUpdated', Init);\n        $.RegisterEventHandler(\"SetCarouselSelectedChild\", $.GetContextPanel(), CarouselUpdated);\n        $.RegisterForUnhandledEvent('CSGOShowMainMenu', Init);\n        $.RegisterForUnhandledEvent('PopulateLoadingScreen', AcknowledgeItems.AcknowledgeAllItems.OnCloseEvents);\n        Init();\n    }\n    AcknowledgeItems_1.OnLoad = OnLoad;\n    function Init() {\n        const items = GetItems();\n        if (items.length < 1) {\n            AcknowledgeAllItems.InvokeJSCallback();\n            $.DispatchEvent('UIPopupButtonClicked', '');\n            return;\n        }\n        const numItems = items.length;\n        AcknowledgeAllItems.SetItemsToSaveAsNew(items);\n        const elParent = $.GetContextPanel().FindChildInLayoutFile('AcknowledgeItemsCarousel');\n        elParent.RemoveAndDeleteChildren();\n        for (let i = 0; i < items.length; i++) {\n            const elDelayLoadPanel = $.CreatePanel('CSGODelayLoadPanel', elParent, 'carousel_delay_load_' + i, { class: 'Offscreen' });\n            elDelayLoadPanel.SetLoadFunction(MakeItemPanel.bind(null, items[i], i, numItems));\n            elDelayLoadPanel.ListenForClassRemoved('Offscreen');\n        }\n        $.Schedule(.25, () => {\n            let aPanels = $.GetContextPanel().FindChildInLayoutFile('AcknowledgeItemsCarousel').Children();\n            if (aPanels.length > 0) {\n                for (let i = 0; i < aPanels.length; i++) {\n                    if (aPanels[i].BHasClass('Focused')) {\n                        ShowHideOpenItemInLayoutBtn(aPanels[i].Data().itemId);\n                        if (m_elEquipBtn)\n                            m_elEquipBtn.SetPanelEvent('onactivate', () => {\n                                AcknowledgeAllItems.OnActivate();\n                                $.DispatchEvent(\"ShowLoadoutForItem\", m_focusedItemId);\n                            });\n                        break;\n                    }\n                }\n            }\n        });\n        $.Schedule(1, SetFocusForNavButton);\n    }\n    function SetFocusForNavButton() {\n        let elParent = $.GetContextPanel().FindChildInLayoutFile('AcknowledgeItemsCarouselNav');\n        elParent.FindChildInLayoutFile('NextItemButton').SetPanelEvent('onmouseover', () => {\n            elParent.FindChildInLayoutFile('NextItemButton').SetFocus();\n        });\n        elParent.FindChildInLayoutFile('PreviousItemButton').SetPanelEvent('onmouseover', () => {\n            elParent.FindChildInLayoutFile('PreviousItemButton').SetFocus();\n        });\n    }\n    function MakeItemPanel(item, index, numItems, elParent) {\n        const elItemTile = $.CreatePanel('Panel', elParent, item.id);\n        elItemTile.BLoadLayoutSnippet('Item');\n        const modelPath = ShowModelOrItem(elItemTile, item.id, item.type);\n        ResizeForVerticalItem(elItemTile, item.id);\n        const rarityColor = InventoryAPI.GetItemRarityColor(item.id);\n        SetTitle(elItemTile, item, rarityColor);\n        SetParticlesBg(elItemTile, rarityColor, modelPath, item.id);\n        ColorRarityBar(elItemTile, rarityColor);\n        SetItemName(elItemTile, item.id);\n        ShowGiftPanel(elItemTile, item.id);\n        ShowSetPanel(elItemTile, item);\n        ItemCount(elItemTile, index, numItems);\n        elParent.Data().itemId = item.id;\n    }\n    function ShowModelOrItem(elItemTile, id, type = \"\") {\n        let elItemModelImagePanel = elItemTile.FindChildInLayoutFile('PopUpInspectModelOrImage');\n        elItemModelImagePanel.Data().useAcknowledge = !(ItemInfo.IsSprayPaint(id) || ItemInfo.IsSpraySealed(id));\n        return InspectModelImage.Init(elItemModelImagePanel, id);\n    }\n    function ResizeForVerticalItem(elItemTile, id) {\n        if (ItemInfo.IsCharacter(id)) {\n            let elPanel = elItemTile.FindChildInLayoutFile('AcknowledgeItemContainer');\n            elPanel.AddClass('popup-acknowledge__item__model--vertical');\n        }\n    }\n    function SetItemName(elItemTile, id) {\n        const elLabel = elItemTile.FindChildInLayoutFile('AcknowledgeItemLabel');\n        elLabel.text = InventoryAPI.GetItemName(id);\n    }\n    function SetTitle(elItemTile, item, rarityColor) {\n        const defName = InventoryAPI.GetItemDefinitionName(item.id);\n        const elTitle = elItemTile.FindChildInLayoutFile('AcknowledgeItemTitle');\n        const titleSuffex = (item.pickuptype\n            && ['xpshopredeem', 'quest_reward'].includes(item.pickuptype)) ? item.pickuptype : item.type;\n        if (defName === 'casket' && item.type === 'nametag_add') {\n            elTitle.text = $.Localize('#CSGO_Tool_Casket_Tag');\n        }\n        else {\n            const idxOfExtraParams = titleSuffex.indexOf(\"[\");\n            const typeWithoutParams = (idxOfExtraParams > 0) ? titleSuffex.substring(0, idxOfExtraParams) : titleSuffex;\n            elTitle.text = $.Localize('#popup_title_' + typeWithoutParams);\n        }\n        elTitle.style.washColor = rarityColor;\n    }\n    function SetParticlesBg(elItemTile, rarityColor, modelPath, itemId) {\n        const oColor = HexColorToRgb(rarityColor);\n        let elParticlePanel = elItemTile.FindChildInLayoutFile('popup-acknowledge__item__particle');\n        elParticlePanel.visible = !modelPath;\n        if (!modelPath) {\n            elParticlePanel.SetParticleNameAndRefresh('particles/ui/ui_item_present_bokeh.vpcf');\n            elParticlePanel.SetControlPoint(16, oColor.r, oColor.g, oColor.b);\n            elParticlePanel.StartParticles();\n            return;\n        }\n        elParticlePanel.StopParticlesImmediately(false);\n    }\n    function HexColorToRgb(hex) {\n        const r = parseInt(hex.slice(1, 3), 16);\n        const g = parseInt(hex.slice(3, 5), 16);\n        const b = parseInt(hex.slice(5, 7), 16);\n        return { r, g, b };\n    }\n    function ColorRarityBar(elItemTile, rarityColor) {\n        const elBar = elItemTile.FindChildInLayoutFile('AcknowledgeBar');\n        elBar.style.washColor = rarityColor;\n    }\n    function ShowGiftPanel(elItemTile, id) {\n        const elPanel = elItemTile.FindChildInLayoutFile('AcknowledgeItemGift');\n        const gifterId = ItemInfo.GetGifter(id);\n        elPanel.SetHasClass('hidden', gifterId === '');\n        const elLabel = elItemTile.FindChildInLayoutFile('AcknowledgeItemGiftLabel');\n        elLabel.SetDialogVariable('name', FriendsListAPI.GetFriendName(gifterId));\n        elLabel.text = $.Localize('#acknowledge_gifter', elLabel);\n    }\n    function ShowSetPanel(elItemTile, item) {\n        const id = item.id;\n        const elPanel = elItemTile.FindChildInLayoutFile('AcknowledgeItemSet');\n        const elLabel = elItemTile.FindChildInLayoutFile('AcknowledgeItemSetLabel');\n        const elImage = elItemTile.FindChildInLayoutFile('AcknowledgeItemSetImage');\n        const strSetName = InventoryAPI.GetTag(id, 'ItemSet');\n        if (!strSetName || strSetName === '0') {\n            if (ItemInfo.IsKeychain(id) && item.pickuptype === 'xpshopredeem') {\n                let m_szRemoveKeychainToolChargesForPurchase = 'Remove Keychain Tool Pack';\n                let defidxForPurchase = InventoryAPI.GetItemDefinitionIndexFromDefinitionName(m_szRemoveKeychainToolChargesForPurchase);\n                let fauxPurchaseItemID = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(defidxForPurchase, 0);\n                elLabel.SetDialogVariableInt('item_count', Number(InventoryAPI.GetItemAttributeValue(fauxPurchaseItemID, '{uint32}items count')));\n                elLabel.text = $.Localize('#CSGO_RemoveKeychainToolCharges_Reward:f', elLabel);\n                elImage.SetImage('file://{images}/icons/ui/keychain_removal.svg');\n                elImage.SetHasClass('popup-acknowledge__subtitle_seticon_tiny', true);\n                elPanel.SetHasClass('hide', false);\n                return;\n            }\n            elPanel.SetHasClass('hide', true);\n            return;\n        }\n        const setName = InventoryAPI.GetTagString(strSetName);\n        if (!setName) {\n            elPanel.SetHasClass('hide', true);\n            return;\n        }\n        elLabel.text = setName;\n        IconUtil.SetupFallbackItemSetIcon(elImage, strSetName);\n        IconUtil.SetItemSetSVGImage(elImage, strSetName);\n        elImage.SetHasClass('popup-acknowledge__subtitle_seticon_tiny', false);\n        elPanel.SetHasClass('hide', false);\n    }\n    function ItemCount(elItemTile, index, numItems) {\n        const elCountLabel = elItemTile.FindChildInLayoutFile('AcknowledgeItemCount');\n        if (numItems < 2) {\n            elCountLabel.visible = false;\n            return;\n        }\n        elCountLabel.visible = true;\n        elCountLabel.text = (index + 1) + ' / ' + numItems;\n    }\n    function GetItems() {\n        const newItems = [];\n        const itemCount = InventoryAPI.GetUnacknowledgeItemsCount();\n        for (let i = 0; i < itemCount; i++) {\n            const itemId = InventoryAPI.GetUnacknowledgeItemByIndex(i);\n            const pickUpType = InventoryAPI.GetItemPickupMethod(itemId);\n            let strCustomization = InventoryAPI.GetItemSessionPropertyValue(itemId, 'item_customization');\n            if (!strCustomization || !(strCustomization.startsWith('crate_')\n                || strCustomization.startsWith('nametag_')\n                || strCustomization.startsWith('sticker_')\n                || strCustomization.startsWith('keychain_')\n                || strCustomization.startsWith('patch_')\n                || strCustomization.startsWith('stattrack_')\n                || strCustomization.startsWith('quest_')\n                || strCustomization.startsWith('xpshop'))) {\n                strCustomization = 'acknowledge';\n            }\n            if (ItemstoAcknowlegeRightAway(itemId))\n                InventoryAPI.AcknowledgeNewItembyItemID(itemId);\n            else\n                newItems.unshift({ type: strCustomization, id: itemId, pickuptype: pickUpType });\n        }\n        const getUpdateItem = GetUpdatedItem();\n        if (getUpdateItem && newItems.filter(item => item.id === getUpdateItem.id).length < 1) {\n            newItems.push(getUpdateItem);\n        }\n        const priorityItemAckTypes = [\"xpshopredeem\", \"quest_reward\"];\n        const rewardItems = newItems.filter(item => item.pickuptype && priorityItemAckTypes.includes(item.pickuptype));\n        const otherItems = newItems.filter(item => !(item.pickuptype && priorityItemAckTypes.includes(item.pickuptype)));\n        return rewardItems.concat(otherItems);\n    }\n    AcknowledgeItems_1.GetItems = GetItems;\n    function GetItemsByType(afilters, bShouldAcknowledgeItems) {\n        const aItems = GetItems();\n        const alist = aItems.filter(oItem => afilters.includes(InventoryAPI.GetItemDefinitionName(oItem.id)));\n        if (bShouldAcknowledgeItems) {\n            AcknowledgeAllItems.AcknowledgeItems(alist);\n        }\n        return alist.map(item => item.id);\n    }\n    AcknowledgeItems_1.GetItemsByType = GetItemsByType;\n    function GetUpdatedItem() {\n        const itemidExplicitAcknowledge = $.GetContextPanel().GetAttributeString(\"ackitemid\", '');\n        if (itemidExplicitAcknowledge === '')\n            return null;\n        return {\n            id: itemidExplicitAcknowledge,\n            type: $.GetContextPanel().GetAttributeString(\"acktype\", '')\n        };\n    }\n    function ItemstoAcknowlegeRightAway(id) {\n        const itemType = InventoryAPI.GetItemTypeFromEnum(id);\n        return itemType === 'quest' ||\n            itemType === 'coupon_crate' ||\n            itemType === 'campaign';\n    }\n    function CarouselUpdated(elPanel) {\n        $.Schedule(.15, () => {\n            if (elPanel && elPanel.IsValid())\n                ShowHideOpenItemInLayoutBtn(elPanel.Data().itemId);\n        });\n    }\n    function ShowHideOpenItemInLayoutBtn(itemId) {\n        m_focusedItemId = itemId;\n        let category = InventoryAPI.GetLoadoutCategory(itemId);\n        let isHidden = !category || ItemInfo.ItemHasCapability(itemId, 'decodable');\n        if (m_elEquipBtn) {\n            m_elEquipBtn.SetHasClass('hide', isHidden);\n        }\n    }\n    let AcknowledgeAllItems;\n    (function (AcknowledgeAllItems) {\n        let itemsToSave = [];\n        function SetItemsToSaveAsNew(items) {\n            itemsToSave = items;\n        }\n        AcknowledgeAllItems.SetItemsToSaveAsNew = SetItemsToSaveAsNew;\n        function AcknowledgeItems(alist) {\n            const acklist = alist ? alist : itemsToSave;\n            for (let item of acklist) {\n                InventoryAPI.SetItemSessionPropertyValue(item.id, 'item_pickup_method', InventoryAPI.GetItemPickupMethod(item.id));\n                if (item.type === 'acknowledge') {\n                    InventoryAPI.SetItemSessionPropertyValue(item.id, 'recent', '1');\n                    InventoryAPI.AcknowledgeNewItembyItemID(item.id);\n                }\n                else {\n                    const bWasNew = InventoryAPI.AcknowledgeNewItembyItemID(item.id);\n                    InventoryAPI.SetItemSessionPropertyValue(item.id, bWasNew ? 'recent' : 'updated', '1');\n                    $.DispatchEvent('RefreshActiveInventoryList');\n                }\n            }\n        }\n        AcknowledgeAllItems.AcknowledgeItems = AcknowledgeItems;\n        function OnActivate() {\n            AcknowledgeItems();\n            InventoryAPI.AcknowledgeNewBaseItems();\n            InvokeJSCallback();\n            OnCloseEvents();\n        }\n        AcknowledgeAllItems.OnActivate = OnActivate;\n        function InvokeJSCallback() {\n            const callbackResetAcknowlegePopupHandle = $.GetContextPanel().GetAttributeInt(\"callback\", -1);\n            if (callbackResetAcknowlegePopupHandle != -1) {\n                UiToolkitAPI.InvokeJSCallback(callbackResetAcknowlegePopupHandle);\n            }\n        }\n        AcknowledgeAllItems.InvokeJSCallback = InvokeJSCallback;\n        function OnCloseEvents() {\n            $.DispatchEvent('UIPopupButtonClicked', '');\n            $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.inventory_new_item_accept', 'MOUSE');\n        }\n        AcknowledgeAllItems.OnCloseEvents = OnCloseEvents;\n    })(AcknowledgeAllItems = AcknowledgeItems_1.AcknowledgeAllItems || (AcknowledgeItems_1.AcknowledgeAllItems = {}));\n})(AcknowledgeItems || (AcknowledgeItems = {}));\n","scripts/popups/popup_acknowledge_xpgrant.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\nvar AcknowledgeXpGrant;\n(function (AcknowledgeXpGrant) {\n    let _m_xuid = MyPersonaAPI.GetXuid();\n    let _m_currentLvl = FriendsListAPI.GetFriendLevel(_m_xuid);\n    function OnLoad() {\n        let elRankIcon = $.GetContextPanel().FindChildInLayoutFile('JsPlayerXpIcon');\n        let elRankText = $.GetContextPanel().FindChildInLayoutFile('JsPlayerRankName');\n        elRankText.SetDialogVariable('name', $.Localize('#SFUI_XP_RankName_' + _m_currentLvl));\n        elRankText.SetDialogVariableInt('level', _m_currentLvl);\n        elRankIcon.SetImage('file://{images}/icons/xp/level' + _m_currentLvl + '.png');\n        let fauxItemID = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(4607, 0);\n        let rarityColor = InventoryAPI.GetItemRarityColor(fauxItemID);\n        rarityColor = \"#8847ff\";\n        let elMovie = $.GetContextPanel().FindChildInLayoutFile('AcknowledgeMovie');\n        elMovie.style.washColor = rarityColor;\n        let elBar = $.GetContextPanel().FindChildInLayoutFile('AcknowledgeBar');\n        elBar.style.washColor = rarityColor;\n    }\n    AcknowledgeXpGrant.OnLoad = OnLoad;\n    ;\n    function OnActivate() {\n        $.DispatchEvent('UIPopupButtonClicked', '');\n        $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.inventory_new_item_accept', 'MOUSE');\n    }\n    AcknowledgeXpGrant.OnActivate = OnActivate;\n})(AcknowledgeXpGrant || (AcknowledgeXpGrant = {}));\n","scripts/popups/popup_add_friend.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../friendtile.ts\" />\nvar PopupAddFriend;\n(function (PopupAddFriend) {\n    let m_xuidToInvite = '';\n    function Init() {\n        let yourCode = MyPersonaAPI.GetFriendCode();\n        let elYourCodeBtn = $('#JsPopupYourFriendCode');\n        elYourCodeBtn.SetPanelEvent('onmouseover', () => UiToolkitAPI.ShowTextTooltip('JsPopupYourFriendCode', yourCode));\n        elYourCodeBtn.SetPanelEvent('onmouseout', () => UiToolkitAPI.HideTextTooltip());\n        elYourCodeBtn.SetPanelEvent('onactivate', () => {\n            SteamOverlayAPI.CopyTextToClipboard(yourCode);\n            UiToolkitAPI.ShowTextTooltip('JsPopupYourFriendCode', '#AddFriend_copy_code_Hint');\n        });\n        $('#JsPopupYourSendRequest').enabled = false;\n        $('#JsFriendCodeNotFound').visible = false;\n        $('#JsFriendCodeFound').visible = false;\n        $('#JsAddFriendTextEntryLabel').SetFocus();\n        $('#JsAddFriendTextEntryLabel').SetPanelEvent('ontextentrychange', OnEntrySubmit);\n    }\n    PopupAddFriend.Init = Init;\n    function OnEntrySubmit() {\n        let elNotFoundLabel = $('#JsFriendCodeNotFound');\n        let elTextEntry = $('#JsAddFriendTextEntryLabel');\n        let xuid = FriendsListAPI.GetXuidFromFriendCode(elTextEntry.text.toUpperCase());\n        if (xuid) {\n            let elTile = $.GetContextPanel().FindChildTraverse('JsPopupFriendTile');\n            if (!elTile) {\n                elTile = $.CreatePanel(\"Panel\", $('#JsFriendCodeFound'), 'JsPopupFriendTile');\n                elTile.SetAttributeString('xuid', xuid);\n                elTile.BLoadLayout('file://{resources}/layout/friendtile.xml', false, false);\n            }\n            $.Schedule(.1, () => {\n                FriendTile.Init(elTile);\n                elTile.RemoveClass('hidden');\n            });\n            $('#JsAddFriendInviteImg').AddClass('hidden');\n            $('#JsFriendCodeFound').visible = true;\n            $('#JsPopupYourSendRequest').enabled = true;\n            elNotFoundLabel.visible = false;\n            $.GetContextPanel().FindChildInLayoutFile('JSFriendValidIcon').SetHasClass('valid', true);\n            m_xuidToInvite = xuid;\n        }\n        else {\n            if (elTextEntry.text === '') {\n                elNotFoundLabel.visible = false;\n                return;\n            }\n            elNotFoundLabel.SetDialogVariable('code', elTextEntry.text.toUpperCase());\n            elNotFoundLabel.text = $.Localize('#AddFriend_not_found', elNotFoundLabel);\n            $.GetContextPanel().FindChildInLayoutFile('JSFriendValidIcon').SetHasClass('valid', false);\n            elNotFoundLabel.visible = true;\n            $('#JsPopupYourSendRequest').enabled = false;\n            $('#JsFriendCodeFound').visible = false;\n        }\n    }\n    PopupAddFriend.OnEntrySubmit = OnEntrySubmit;\n    function OnSendInvite() {\n        $('#JsAddFriendInviteImg').RemoveClass('hidden');\n        $('#JsPopupYourSendRequest').enabled = false;\n        SteamOverlayAPI.InteractWithUser(m_xuidToInvite, 'friendadd');\n        $.DispatchEvent('UIPopupButtonClicked', '');\n    }\n    PopupAddFriend.OnSendInvite = OnSendInvite;\n    function _FriendsListUpdateName(xuid) {\n        let elTile = $.GetContextPanel().FindChildTraverse('JsPopupFriendTile');\n        if (elTile && elTile.IsValid() && (xuid === elTile.GetAttributeString('xuid', ''))) {\n            FriendTile.Init(elTile);\n        }\n    }\n    {\n        $.RegisterForUnhandledEvent('PanoramaComponent_FriendsList_NameChanged', _FriendsListUpdateName);\n    }\n})(PopupAddFriend || (PopupAddFriend = {}));\n","scripts/popups/popup_can_apply_header.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../common/iteminfo.ts\" />\n/// <reference path=\"popup_inspect_shared.ts\" />\n/// <reference path=\"../generated/items_event_current_generated_store.ts\" />\nvar CanApplyHeader;\n(function (CanApplyHeader) {\n    function Init(oTitleSettings) {\n        oTitleSettings.headerPanel.RemoveClass('hidden');\n        _SetTitle(oTitleSettings);\n        _SetUpDesc(oTitleSettings);\n        _SetUpWarning(oTitleSettings);\n    }\n    CanApplyHeader.Init = Init;\n    function _SetTitle(oTitleSettings) {\n        if (oTitleSettings.type === 'sticker' && !oTitleSettings.isRemove) {\n            const listStickers = ItemInfo.GetitemStickerList(oTitleSettings.itemId);\n            oTitleSettings.contextPanel.SetDialogVariableInt(\"sticker_count\", listStickers.length + 1);\n            oTitleSettings.contextPanel.SetDialogVariableInt(\"max_stickers\", 5);\n            oTitleSettings.contextPanel.SetDialogVariable(\"CanApplyTitle\", $.Localize('#popup_can_sticker_button', oTitleSettings.contextPanel));\n            return;\n        }\n        let title = oTitleSettings.isRemove ? '#SFUI_InvContextMenu_can_stick_Wear_full_' + oTitleSettings.type : '#SFUI_InvContextMenu_stick_use_' + oTitleSettings.type;\n        switch (InspectShared.GetPopupSetting('work_type')) {\n            case 'remove_sticker':\n                if (InspectShared.GetPopupSetting('remove_sticker_all_at_once', oTitleSettings.contextPanel))\n                    title = '#SFUI_InvUse_Remove_Stickers';\n                break;\n            case 'can_wrap_sticker':\n                title = oTitleSettings.toolId ? '#CSGO_Tool_WrapStickerInDisplayCase_Title' : '#CSGO_Tool_UnWrapStickerInDisplayCase_Title';\n                break;\n            case 'craft_souvenir':\n                title = \"#popup_craft_souvenir_button\";\n                break;\n        }\n        oTitleSettings.contextPanel.SetDialogVariable(\"CanApplyTitle\", $.Localize(title, oTitleSettings.contextPanel));\n    }\n    function _SetUpDesc(oTitleSettings) {\n        const currentName = InventoryAPI.GetItemNameUncustomized(oTitleSettings.itemId);\n        oTitleSettings.contextPanel.SetDialogVariable('tool_target_name', currentName);\n        let desc = oTitleSettings.isRemove ? '#popup_can_stick_scrape_full_' + oTitleSettings.type : '#popup_can_stick_desc';\n        switch (InspectShared.GetPopupSetting('work_type')) {\n            case 'remove_sticker':\n                if (InspectShared.GetPopupSetting('remove_sticker_all_at_once', oTitleSettings.contextPanel))\n                    desc += '_wipestickers';\n                break;\n            case 'can_wrap_sticker':\n                desc = '';\n                break;\n            case 'craft_souvenir':\n                desc = '#popup_craft_souvenir_desc';\n                break;\n        }\n        oTitleSettings.contextPanel.SetDialogVariable(\"CanApplyDesc\", $.Localize(desc, oTitleSettings.contextPanel));\n    }\n    function _SetUpWarning(oTitleSettings) {\n        const elLabel = oTitleSettings.headerPanel.FindChildTraverse('id-can-apply-warning');\n        switch (InspectShared.GetPopupSetting('work_type')) {\n            case 'can_wrap_sticker':\n                elLabel.visible = true;\n                elLabel.FindChildInLayoutFile('id-can-apply-warning-text').SetLocString(oTitleSettings.toolId ? '#CSGO_Tool_WrapStickerInDisplayCase_Desc' : '#CSGO_Tool_UnWrapStickerInDisplayCase_Desc');\n                return;\n            case 'craft_souvenir':\n                elLabel.visible = true;\n                const balanceCredits = InspectShared.GetPopupSetting('credits_owned_souvenir');\n                elLabel.SetDialogVariableInt('credits_owned_souvenir', balanceCredits);\n                elLabel.SetDialogVariableLocString('event_credits', '#CSGO_TournamentPass_' + g_ActiveTournamentInfo.location + '_credits');\n                elLabel.FindChildInLayoutFile('id-can-apply-warning-text').SetLocString('#popup_craft_souvenir_warn');\n                return;\n        }\n        if (oTitleSettings.isRemove && InspectShared.GetPopupSetting('work_type') == 'remove_keychain') {\n            elLabel.visible = true;\n            const numKeychainRemoveToolChargesRemaining = InventoryAPI.GetCacheTypeElementFieldByIndex('KeychainRemoveToolCharges', 0, 'charges');\n            elLabel.SetDialogVariableInt('item_count', numKeychainRemoveToolChargesRemaining);\n            elLabel.FindChildInLayoutFile('id-can-apply-warning-text').SetLocString('#Notify_KeychainRemoveTool_ChargesUseToRemove');\n            return;\n        }\n        elLabel.visible = !oTitleSettings.isRemove;\n        if (oTitleSettings.isRemove) {\n            return;\n        }\n        let warningText = _GetWarningTradeRestricted(oTitleSettings);\n        warningText = !warningText ? '#SFUI_InvUse_Warning_use_can_stick_' + oTitleSettings.type : warningText;\n        if (ItemInfo.IsFauxOrRentalOrPreviewTool(oTitleSettings.toolId)) {\n            warningText = '#SFUI_InvUse_Warning_use_can_stick_previewonly_' + oTitleSettings.type;\n            let bPhantomDisplayItemCannotApply = true;\n            oTitleSettings.contextPanel.SetHasClass('can_apply_previewonly_phantom_display', bPhantomDisplayItemCannotApply);\n        }\n        warningText = $.Localize(warningText, elLabel);\n        oTitleSettings.contextPanel.SetDialogVariable(\"CanApplyWarning\", warningText);\n    }\n    function _GetWarningTradeRestricted(oTitleSettings) {\n        let strSpecialWarning = '';\n        let strSpecialParam = null;\n        const bIsPerfectWorld = MyPersonaAPI.GetLauncherType() === \"perfectworld\" ? true : false;\n        if (!bIsPerfectWorld) {\n            if (InventoryAPI.IsMarketable(oTitleSettings.itemId)) {\n                if (!InventoryAPI.IsPotentiallyMarketable(oTitleSettings.toolId)) {\n                    strSpecialParam = String(InventoryAPI.GetItemAttributeValue(oTitleSettings.toolId, \"tradable after date\"));\n                    if (strSpecialParam !== undefined && strSpecialParam !== null) {\n                        strSpecialWarning = _GetSpecialWarningString(oTitleSettings, strSpecialParam, \"marketrestricted\");\n                    }\n                }\n                else {\n                    strSpecialWarning = _GetStickerMarketDateGreater(oTitleSettings);\n                }\n            }\n        }\n        else {\n            strSpecialWarning = _GetStickerMarketDateGreater(oTitleSettings);\n        }\n        return strSpecialWarning;\n    }\n    function _GetStickerMarketDateGreater(oTitleSettings) {\n        const rtTradableAfterSticker = InventoryAPI.GetItemAttributeValue(oTitleSettings.toolId, \"{uint32}tradable after date\");\n        const rtTradableAfterWeapon = InventoryAPI.GetItemAttributeValue(oTitleSettings.itemId, \"{uint32}tradable after date\");\n        if (rtTradableAfterSticker != undefined && rtTradableAfterSticker != null &&\n            (rtTradableAfterWeapon == undefined || rtTradableAfterWeapon == null || rtTradableAfterSticker > rtTradableAfterWeapon)) {\n            let strSpecialParam = null;\n            strSpecialParam = String(InventoryAPI.GetItemAttributeValue(oTitleSettings.toolId, \"tradable after date\"));\n            if (strSpecialParam != undefined && strSpecialParam != null) {\n                return _GetSpecialWarningString(oTitleSettings, strSpecialParam, \"traderestricted\");\n            }\n        }\n        return '';\n    }\n    function _GetSpecialWarningString(oTitleSettings, strSpecialParam, warningText) {\n        const elLabel = oTitleSettings.headerPanel.FindChildInLayoutFile('id-can-apply-warning');\n        elLabel.SetDialogVariable('date', strSpecialParam);\n        return \"#popup_can_stick_warning_\" + warningText + \"_\" + oTitleSettings.type;\n    }\n})(CanApplyHeader || (CanApplyHeader = {}));\n","scripts/popups/popup_can_apply_pick_slot.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../inspect.ts\" />\n/// <reference path=\"../common/iteminfo.ts\" />\n/// <reference path=\"../popups/popup_capability_can_sticker.ts\" />\n/// <reference path=\"../popups/popup_can_apply_header.ts\" />\nvar CanApplyPickSlot;\n(function (CanApplyPickSlot) {\n    function Init(oSettings) {\n        ShowHideInfoPanel(oSettings.isRemove && oSettings.type === 'keychain', oSettings.infoPanel);\n        const worktype = InspectShared.GetPopupSetting('work_type');\n        if (oSettings.isRemove || (worktype === 'craft_souvenir')) {\n            ShowItemIconsToRemove(oSettings, worktype);\n        }\n        else {\n            _AddItemImage(oSettings, oSettings.toolId);\n        }\n        _ShowHideApplyHints(oSettings);\n        _BtnActions(oSettings);\n    }\n    CanApplyPickSlot.Init = Init;\n    function UpdateSelectedRemoveForSticker(slotIndex, oSettings) {\n        const elContainer = oSettings.infoPanel.FindChildInLayoutFile('CanStickerItemIcons');\n        let itemId = '';\n        elContainer.Children().forEach(element => {\n            element.SetHasClass('is_sticker_remove_unselected', element.Data().slot !== slotIndex);\n            element.SetHasClass('is_sticker_remove_selected', element.Data().slot === slotIndex);\n            element.checked = element.Data().slot === slotIndex;\n            if (element.Data().slot === slotIndex) {\n                itemId = element.Data().itemId;\n                element.TriggerClass('popup-can-apply-item-image--anim');\n            }\n        });\n        const elStickerScrapeLevelContainer = oSettings.infoPanel.FindChildInLayoutFile('StickerScrapeLevelContainer');\n        if (elStickerScrapeLevelContainer) {\n            const bShowScrapeLevelSlider = itemId && !InspectShared.GetPopupSetting('remove_sticker_all_at_once', oSettings.contextPanel);\n            elStickerScrapeLevelContainer.SetHasClass('StickerScrapeLevelContainerHidden', bShowScrapeLevelSlider ? false : true);\n            const elStickerScrapeLevelSlider = elStickerScrapeLevelContainer.FindChildInLayoutFile('StickerScrapeLevelSlider');\n            if (elStickerScrapeLevelSlider && bShowScrapeLevelSlider) {\n                let valWear = InventoryAPI.GetItemAttributeValue(itemId, \"sticker slot \" + slotIndex + \" wear\");\n                if (!valWear)\n                    valWear = 0.0;\n                valWear = Math.ceil(valWear * 100.0);\n                elStickerScrapeLevelSlider.default = valWear;\n                elStickerScrapeLevelSlider.SetValueNoEvents(valWear);\n                if (oSettings.asyncBarPanel) {\n                    const elGreenButton = oSettings.asyncBarPanel.FindChildInLayoutFile('AsyncItemWorkAcceptConfirm');\n                    if (elGreenButton)\n                        elGreenButton.SetHasClass('AsyncItemWorkAcceptConfirmDisabled', true);\n                    InventoryAPI.HighlightStickerBySlot(slotIndex);\n                    CapabilityCanSticker.SetStickerScrapeLevel(0, oSettings.contextPanel);\n                }\n            }\n            else if (itemId && oSettings.asyncBarPanel) {\n                InventoryAPI.HighlightStickerBySlot(slotIndex);\n            }\n        }\n    }\n    CanApplyPickSlot.UpdateSelectedRemoveForSticker = UpdateSelectedRemoveForSticker;\n    function _ShowHideApplyHints(oSettings) {\n        oSettings.infoPanel.FindChildInLayoutFile('popup-capability-keychain-hints').SetHasClass('show-keychain-apply-hints', !oSettings.isRemove && oSettings.type === \"keychain\");\n        oSettings.infoPanel.FindChildInLayoutFile('popup-capability-sticker-hints').SetHasClass('show-sticker-apply-hints', !oSettings.isRemove && oSettings.type === \"sticker\");\n        oSettings.infoPanel.FindChildInLayoutFile('popup-capability-sticker-remove-hint').SetHasClass('show-sticker-remove-hints', oSettings.isRemove && oSettings.type === \"sticker\"\n            && !InspectShared.GetPopupSetting('remove_sticker_all_at_once', oSettings.contextPanel));\n        oSettings.infoPanel.FindChildInLayoutFile('popup-capability-sticker-wipestickers-hint').SetHasClass('show-sticker-remove-hints', oSettings.isRemove && oSettings.type === \"sticker\"\n            && !!InspectShared.GetPopupSetting('remove_sticker_all_at_once', oSettings.contextPanel));\n        if ('craft_souvenir' === InspectShared.GetPopupSetting('work_type')) {\n            const elHintBar = oSettings.infoPanel.FindChildInLayoutFile('popup-capability-sticker-craft-souvenir-hint');\n            elHintBar.SetHasClass('show-craft-souvenir-hints', true);\n            const elHintLabel = elHintBar.FindChildInLayoutFile('popup-capability-sticker-craft-souvenir-inscription');\n            elHintLabel.SetDialogVariableLocString('event_name', '#CSGO_Tournament_Event_Name_' + InventoryAPI.GetItemAttributeValue(oSettings.itemId, '{uint32}tournament event id'));\n            elHintLabel.SetDialogVariableLocString('event_stage', '#CSGO_Tournament_Event_Stage_' + InventoryAPI.GetItemAttributeValue(oSettings.itemId, '{uint32}tournament event stage id'));\n            elHintLabel.SetDialogVariableLocString('event_team1', '#CSGO_TeamID_' + InventoryAPI.GetItemAttributeValue(oSettings.itemId, '{uint32}tournament event team0 id'));\n            elHintLabel.SetDialogVariableLocString('event_team2', '#CSGO_TeamID_' + InventoryAPI.GetItemAttributeValue(oSettings.itemId, '{uint32}tournament event team1 id'));\n            let locStringPlayer = '#SFUI_Character_Guest';\n            let unAutographPlayerID = InventoryAPI.GetItemAttributeValue(oSettings.itemId, '{uint32}tournament mvp account id');\n            g_ActiveTournamentTeams.forEach((tt) => tt.players.forEach((tp) => {\n                if (tp.playerid === unAutographPlayerID) {\n                    locStringPlayer = '#SFUI_ProPlayer_' + tp.code;\n                }\n            }));\n            elHintLabel.SetDialogVariableLocString('autograph_player', locStringPlayer);\n        }\n    }\n    function ShowHideInfoPanel(bHide, elInfoPanel) {\n        elInfoPanel.SetHasClass('hidden', bHide);\n    }\n    CanApplyPickSlot.ShowHideInfoPanel = ShowHideInfoPanel;\n    function IsContinueEnabled(elInfoPanel) {\n        if (elInfoPanel.FindChildInLayoutFile('CanApplyContinue')) {\n            return elInfoPanel.FindChildInLayoutFile('CanApplyContinue').enabled;\n        }\n        return false;\n    }\n    CanApplyPickSlot.IsContinueEnabled = IsContinueEnabled;\n    const defidxStickerItem = InventoryAPI.GetItemDefinitionIndexFromDefinitionName('sticker');\n    function ShowItemIconsToRemove(oSettings, worktype) {\n        const slotCount = InventoryAPI.GetItemStickerSlotCount(oSettings.itemId);\n        const elContainer = oSettings.infoPanel.FindChildInLayoutFile('CanStickerItemIcons');\n        elContainer.RemoveAndDeleteChildren();\n        let slots = [];\n        for (let i = 0; i < slotCount; i++) {\n            const imagePath = InventoryAPI.GetItemStickerImageBySlot(oSettings.itemId, i);\n            if (imagePath) {\n                let unCostInCredits = 0;\n                if (worktype === 'craft_souvenir') {\n                    const idStickerKit = InventoryAPI.GetItemAttributeValue(oSettings.itemId, '{uint32}sticker slot ' + i + ' id');\n                    const idFauxSticker = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(defidxStickerItem, idStickerKit);\n                    unCostInCredits = MissionsAPI.GetSeasonalOperationFauxCreditsCost(g_ActiveTournamentInfo.credits_id, idFauxSticker);\n                    if (!unCostInCredits)\n                        unCostInCredits = g_ActiveTournamentInfo.souvenir_cost;\n                }\n                slots.push({ index: i, imagePath: imagePath, cost: unCostInCredits });\n            }\n        }\n        if (worktype === 'craft_souvenir') {\n            slots.sort((a, b) => (b.cost - a.cost) * 100 + (a.index - b.index));\n        }\n        for (let j = 0; j < slots.length; j++) {\n            const elPatch = $.CreatePanel('RadioButton', elContainer, slots[j].imagePath, { group: \"remove-btns\" });\n            elPatch.Data().slot = slots[j].index;\n            elPatch.Data().itemId = oSettings.itemId;\n            elPatch.BLoadLayoutSnippet('RemoveBtn');\n            const elImage = elPatch.FindChildInLayoutFile('RemoveImage');\n            elImage.SetImage('file://{images}' + slots[j].imagePath + '.png');\n            if (worktype === 'craft_souvenir') {\n                elPatch.enabled = false;\n                const elCostLabel = elPatch.FindChildInLayoutFile('CostLabel');\n                elCostLabel.RemoveClass('hidden');\n                elCostLabel.SetDialogVariableInt('cost', slots[j].cost);\n            }\n            else {\n                elPatch.SetPanelEvent('onactivate', () => oSettings.funcOnSelectForRemove(slots[j].index, oSettings));\n            }\n        }\n    }\n    CanApplyPickSlot.ShowItemIconsToRemove = ShowItemIconsToRemove;\n    function _AddItemImage(oSettings, itemid) {\n        const elContainer = oSettings.infoPanel.FindChildInLayoutFile('CanStickerItemIcons');\n        let aItems;\n        aItems = itemid.split(',');\n        for (let itemId of aItems) {\n            const elImage = elContainer.FindChildInLayoutFile(itemId);\n            if (!elImage) {\n                const elImage = $.CreatePanel('ItemImage', elContainer, itemId);\n                elImage.itemid = itemId;\n                elImage.AddClass('popup-can-apply-item-image');\n            }\n        }\n    }\n    function _BtnActions(oSettings) {\n        const slotsCount = oSettings.isRemove ? InventoryAPI.GetItemStickerSlotCount(oSettings.itemId) : CanApplySlotInfo.GetEmptySlotList().length;\n        const elContinueBtn = oSettings.infoPanel.FindChildInLayoutFile('CanApplyContinue');\n        const elNextSlotBtn = oSettings.infoPanel.FindChildInLayoutFile('CanApplyNextPos');\n        const elCancelBtn = oSettings.infoPanel.FindChildInLayoutFile('CanApplyCancel');\n        const worktype = InspectShared.GetPopupSetting('work_type', oSettings.contextPanel);\n        if (elContinueBtn)\n            elContinueBtn.SetHasClass('hidden', oSettings.isRemove || InspectShared.GetPopupSetting('is_workshop_preview', oSettings.contextPanel)\n                || (worktype === 'craft_souvenir'));\n        if (elNextSlotBtn) {\n            elNextSlotBtn.enabled = !(oSettings.isRemove);\n            elNextSlotBtn.SetHasClass('hidden', oSettings.isRemove || (worktype === 'craft_souvenir'));\n        }\n        if (elCancelBtn) {\n            elCancelBtn.SetHasClass('hidden', true);\n            elCancelBtn.SetPanelEvent('onactivate', () => _OnCancel(elContinueBtn, elCancelBtn, elNextSlotBtn, oSettings));\n        }\n        const elStickerScrapeLevelContainer = oSettings.infoPanel.FindChildInLayoutFile('StickerScrapeLevelContainer');\n        if (elStickerScrapeLevelContainer) {\n            elStickerScrapeLevelContainer.visible = worktype === 'can_sticker' || worktype === 'remove_sticker';\n            if (worktype === 'remove_sticker')\n                elStickerScrapeLevelContainer.AddClass('StickerScrapeLevelContainerHidden');\n            const elStickerScrapeLevelSlider = elStickerScrapeLevelContainer.FindChildInLayoutFile('StickerScrapeLevelSlider');\n            if (elStickerScrapeLevelSlider) {\n                elStickerScrapeLevelSlider.min = 0;\n                elStickerScrapeLevelSlider.increment = 1;\n                elStickerScrapeLevelSlider.max = 100;\n                elStickerScrapeLevelSlider.default = 0;\n                elStickerScrapeLevelSlider.SetValueNoEvents(0);\n                const contextPanel = $.GetContextPanel();\n                CapabilityCanSticker.SetStickerScrapeLevel(0, contextPanel);\n                elStickerScrapeLevelSlider.SetPanelEvent('onvaluechanged', () => {\n                    {\n                        const elStickerScrapeLevelSlider = oSettings.infoPanel.FindChildInLayoutFile('StickerScrapeLevelSlider');\n                        if (elStickerScrapeLevelSlider) {\n                            const newvalue = elStickerScrapeLevelSlider.value;\n                            if (worktype === 'can_sticker') {\n                                $.DispatchEvent('CSGOPlaySoundEffect', 'UI.StickerScratch', 'MOUSE');\n                                CapabilityCanSticker.SetStickerScrapeLevel(newvalue, contextPanel);\n                            }\n                            else if (worktype === 'remove_sticker') {\n                                let bCanScrapeStickerToTargetWear = false;\n                                if (oSettings.asyncBarPanel) {\n                                    const elGreenButton = oSettings.asyncBarPanel.FindChildInLayoutFile('AsyncItemWorkAcceptConfirm');\n                                    if (elGreenButton) {\n                                        bCanScrapeStickerToTargetWear = (newvalue > elStickerScrapeLevelSlider.default);\n                                        elGreenButton.SetHasClass('AsyncItemWorkAcceptConfirmDisabled', !bCanScrapeStickerToTargetWear);\n                                        if (bCanScrapeStickerToTargetWear) {\n                                            $.DispatchEvent('CSGOPlaySoundEffect', 'UI.StickerScratch', 'MOUSE');\n                                            CapabilityCanSticker.SetStickerScrapeLevel(newvalue, contextPanel);\n                                        }\n                                    }\n                                }\n                                if (!bCanScrapeStickerToTargetWear) {\n                                    elStickerScrapeLevelSlider.SetValueNoEvents(elStickerScrapeLevelSlider.default);\n                                    CapabilityCanSticker.SetStickerScrapeLevel(0, contextPanel);\n                                }\n                            }\n                        }\n                    }\n                    ;\n                });\n            }\n        }\n        if (oSettings.isRemove) {\n            return;\n        }\n        if (slotsCount >= 1 || worktype === 'can_keychain') {\n            if (elContinueBtn)\n                elContinueBtn.SetPanelEvent('onactivate', () => _OnContinue(elContinueBtn, elCancelBtn, elNextSlotBtn, oSettings));\n            if (elNextSlotBtn)\n                elNextSlotBtn.SetPanelEvent('onactivate', () => _NextSlot(elContinueBtn, oSettings));\n        }\n        if (oSettings.type === 'sticker' || oSettings.type === 'keychain') {\n            elContinueBtn.enabled = false;\n            $.Schedule(3.0, () => elContinueBtn.enabled = true);\n        }\n    }\n    function DisableBtns(elPanel) {\n        elPanel.FindChildInLayoutFile('CanApplyContinue').enabled = false;\n        ;\n        elPanel.FindChildInLayoutFile('CanApplyNextPos').enabled = false;\n        elPanel.FindChildInLayoutFile('CanApplyCancel').enabled = false;\n    }\n    CanApplyPickSlot.DisableBtns = DisableBtns;\n    function _OnContinue(elContinueBtn, elCancelBtn, elNextSlotBtn, oSettings) {\n        oSettings.funcOnConfirm(oSettings);\n        const elItemToApply = oSettings.infoPanel.FindChildInLayoutFile('CanStickerItemIcons').Children()[0];\n        elItemToApply.ToggleClass('popup-can-apply-item-image--anim');\n        elCancelBtn.SetHasClass('hidden', false);\n        elNextSlotBtn.SetHasClass('hidden', true);\n        elContinueBtn.enabled = false;\n        InspectAsyncActionBar.ZoomCamera(true, oSettings.contextPanel.FindChildInLayoutFile('PopUpInspectAsyncBar'));\n        const elStickerScrapeLevelContainer = oSettings.infoPanel.FindChildInLayoutFile('StickerScrapeLevelContainer');\n        if (elStickerScrapeLevelContainer) {\n            elStickerScrapeLevelContainer.enabled = false;\n        }\n    }\n    function _OnCancel(elContinueBtn, elCancelBtn, elNextSlotBtn, oSettings) {\n        oSettings.funcOnCancel(oSettings);\n        elContinueBtn.enabled = true;\n        elNextSlotBtn.enabled = true;\n        elNextSlotBtn.SetHasClass('hidden', false);\n        elCancelBtn.SetHasClass('hidden', true);\n        const elStickerScrapeLevelContainer = oSettings.infoPanel.FindChildInLayoutFile('StickerScrapeLevelContainer');\n        if (elStickerScrapeLevelContainer) {\n            elStickerScrapeLevelContainer.enabled = true;\n        }\n    }\n    function _NextSlot(elContinueBtn, oSettings) {\n        const delayTime = (oSettings.type === 'sticker' || oSettings.type === 'keychain') ? 0 : 1;\n        CanApplySlotInfo.IncrementIndex();\n        oSettings.funcOnNext(oSettings.toolId, CanApplySlotInfo.GetSelectedEmptySlot(), oSettings);\n        const elNextSlotBtn = oSettings.infoPanel.FindChildInLayoutFile('CanApplyNextPos');\n        elNextSlotBtn.enabled = false;\n        $.Schedule(delayTime, () => {\n            if (elNextSlotBtn && elNextSlotBtn.IsValid()) {\n                elNextSlotBtn.enabled = true;\n            }\n        });\n        elContinueBtn.enabled = true;\n    }\n    function SelectFirstRemoveItem() {\n        const elContainer = $.GetContextPanel().FindChildInLayoutFile('PopUpCanApplyPickSlot').FindChildInLayoutFile('CanStickerItemIcons');\n        if (elContainer.Children()[0] !== undefined && elContainer.Children()[0].IsValid()) {\n            $.DispatchEvent(\"Activated\", elContainer.Children()[0], \"mouse\");\n        }\n    }\n    CanApplyPickSlot.SelectFirstRemoveItem = SelectFirstRemoveItem;\n})(CanApplyPickSlot || (CanApplyPickSlot = {}));\nvar CanApplySlotInfo;\n(function (CanApplySlotInfo) {\n    let m_emptySlotList = [];\n    let m_slotIndex = 0;\n    function ResetSlotIndex() {\n        m_slotIndex = 0;\n        m_emptySlotList = [];\n    }\n    CanApplySlotInfo.ResetSlotIndex = ResetSlotIndex;\n    function UpdateEmptySlotList(itemId) {\n        m_emptySlotList = _GetEmptySlots(_GetSlotInfo(itemId));\n    }\n    CanApplySlotInfo.UpdateEmptySlotList = UpdateEmptySlotList;\n    function _GetSlotInfo(itemId) {\n        let aSlotInfoList = [];\n        let slotsCount = InventoryAPI.GetItemStickerSlotCount(itemId);\n        for (let i = 0; i < slotsCount; i++) {\n            let ImagePath = InventoryAPI.GetItemStickerImageBySlot(itemId, i);\n            if (!ImagePath)\n                ImagePath = 'empty';\n            aSlotInfoList.push({ index: i, path: ImagePath });\n        }\n        return aSlotInfoList;\n    }\n    function _GetEmptySlots(slotInfoList) {\n        return slotInfoList.filter(slot => slot.path === 'empty');\n    }\n    function GetSelectedEmptySlot() {\n        const emptySlotCount = m_emptySlotList.length;\n        if (emptySlotCount === 0) {\n            return 0;\n        }\n        const activeIndex = (m_slotIndex % emptySlotCount);\n        return m_emptySlotList[activeIndex].index;\n    }\n    CanApplySlotInfo.GetSelectedEmptySlot = GetSelectedEmptySlot;\n    function GetSelectedRemoveSlot() {\n        const elContainer = $.GetContextPanel().FindChildInLayoutFile('PopUpCanApplyPickSlot').FindChildInLayoutFile('CanStickerItemIcons');\n        if (elContainer.IsValid() && elContainer.Children().length > 0) {\n            const aSelected = elContainer.Children().filter(entry => (entry.checked === true));\n            return aSelected.length > 0 ? aSelected[0].Data().slot : 0;\n        }\n    }\n    CanApplySlotInfo.GetSelectedRemoveSlot = GetSelectedRemoveSlot;\n    function IncrementIndex() {\n        m_slotIndex++;\n    }\n    CanApplySlotInfo.IncrementIndex = IncrementIndex;\n    function GetEmptySlotList() {\n        return m_emptySlotList;\n    }\n    CanApplySlotInfo.GetEmptySlotList = GetEmptySlotList;\n})(CanApplySlotInfo || (CanApplySlotInfo = {}));\n","scripts/popups/popup_capability_can_keychain.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../inspect.ts\" />\n/// <reference path=\"../common/iteminfo.ts\" />\n/// <reference path=\"popup_can_apply_pick_slot.ts\" />\n/// <reference path=\"popup_inspect_async-bar.ts\" />\nvar CapabilityCanKeychain;\n(function (CapabilityCanKeychain) {\n    function ResetPos() {\n        const m_pos = 0;\n        const m_prevCameraSlot = 0;\n        const m_firstCameraAnim = false;\n    }\n    CapabilityCanKeychain.ResetPos = ResetPos;\n})(CapabilityCanKeychain || (CapabilityCanKeychain = {}));\n","scripts/popups/popup_capability_can_patch.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../inspect.ts\" />\n/// <reference path=\"../common/iteminfo.ts\" />\n/// <reference path=\"popup_can_apply_pick_slot.ts\" />\n/// <reference path=\"popup_inspect_async-bar.ts\" />\nvar CapabilityCanPatch;\n(function (CapabilityCanPatch) {\n    function ResetPos() {\n        $.GetContextPanel().Data().charCardinal = 'e';\n        $.GetContextPanel().Data().bFirstCameraAnim = false;\n        $.GetContextPanel().Data().prevCameraSlot = 0;\n    }\n    CapabilityCanPatch.ResetPos = ResetPos;\n    function PreviewPatchOnChar(toolId, activeIndex, contextPanel) {\n        $.DispatchEvent('CSGOPlaySoundEffect', 'sticker_nextPosition', 'MOUSE');\n        let elPreviewPanel = contextPanel.FindChildInLayoutFile('CanApplyItemModel');\n        let elCharPanel = elPreviewPanel.FindChildInLayoutFile(\"CharPreviewPanel\");\n        if (!elCharPanel || !elCharPanel.IsValid()) {\n            return;\n        }\n        InventoryAPI.PreviewStickerInModelPanel(toolId, activeIndex, elCharPanel);\n        CameraAnim(activeIndex, contextPanel);\n    }\n    CapabilityCanPatch.PreviewPatchOnChar = PreviewPatchOnChar;\n    ;\n    function CameraAnim(activeIndex, contextPanel) {\n        let prevCameraSlot = contextPanel.Data().prevCameraSlot;\n        if ((prevCameraSlot === activeIndex || activeIndex == -1) && prevCameraSlot)\n            return;\n        let elPreviewPanel = contextPanel.FindChildInLayoutFile('CanApplyItemModel');\n        if (!InventoryAPI.IsItemInfoValid(elPreviewPanel.Data().id))\n            return;\n        contextPanel.Data().bFirstCameraAnim = true;\n        InventoryAPI.HighlightPatchBySlot(activeIndex);\n        _UpdatePreviewPanelSettingsForPatchPosition(elPreviewPanel.Data().id, activeIndex, contextPanel);\n        prevCameraSlot = activeIndex;\n    }\n    CapabilityCanPatch.CameraAnim = CameraAnim;\n    ;\n    let m_positionData = [\n        { type: 'chest', loadoutSlot: 'melee', direction: 'e' },\n        { type: 'rightarm', loadoutSlot: 'rifle1', direction: 'n' },\n        { type: 'rightleg', loadoutSlot: 'rifle1', direction: 'n' },\n        { type: 'rightside', loadoutSlot: 'rifle1', direction: 'n' },\n        { type: 'back', loadoutSlot: 'rifle1', direction: 'w' },\n        { type: 'leftarm', loadoutSlot: 'rifle1', direction: 's' },\n        { type: 'leftside', loadoutSlot: 'rifle1', direction: 's' },\n        { type: 'leftleg', loadoutSlot: 'rifle1', direction: 's' },\n    ];\n    function _UpdatePreviewPanelSettingsForPatchPosition(charItemId, activeIndex = 0, contextPanel) {\n        const elPreviewPanel = contextPanel.FindChildInLayoutFile('CanApplyItemModel');\n        const charTeam = InventoryAPI.GetItemTeam(elPreviewPanel.Data().id);\n        const setting_team = charTeam.search('Team_CT') !== -1 ? 'ct' : 't';\n        const patchPosition = InventoryAPI.GetCharacterPatchPosition(charItemId, activeIndex.toString());\n        const oPositionData = m_positionData.filter(entry => entry.type === patchPosition)[0];\n        if (!oPositionData) {\n            contextPanel.Data().bFirstCameraAnim = false;\n            return;\n        }\n        InspectModelImage.SetCharScene(elPreviewPanel.Data().id, LoadoutAPI.GetItemID(setting_team, oPositionData.loadoutSlot), contextPanel);\n        if (contextPanel.Data().charCardinal !== oPositionData.direction) {\n            contextPanel.Data().charCardinal = oPositionData.direction;\n        }\n        const elModelPanel = elPreviewPanel.FindChildInLayoutFile(\"CharPreviewPanel\");\n        $.Schedule(.1, () => { elModelPanel.SetCardinalFacing(contextPanel.Data().charCardinal); });\n        const camSuffix = !patchPosition ? 'wide_intro' : patchPosition + _CameraForModel(charItemId, activeIndex);\n        elModelPanel.Data().camera = 'char_inspect_' + camSuffix;\n        elModelPanel.TransitionToCamera('cam_char_inspect_' + camSuffix, 1.2);\n    }\n    function _CameraForModel(charItemId, activeIndex) {\n        const modelplayer = ItemInfo.GetModelPlayer(charItemId);\n        if (modelplayer.indexOf('tm_jungle_raider_variantb2') !== -1 && activeIndex === 2) {\n            return '_low';\n        }\n        if (modelplayer.indexOf('tm_professional_letg') !== -1 && activeIndex === 0) {\n            return '_shoulder';\n        }\n        if (modelplayer.indexOf('tm_professional_letg') !== -1 && activeIndex === 2) {\n            return '_offset';\n        }\n        if (modelplayer.indexOf('tm_professional_leth') !== -1 && activeIndex === 2) {\n            return '_shoulder_top_left';\n        }\n        return '';\n    }\n})(CapabilityCanPatch || (CapabilityCanPatch = {}));\n","scripts/popups/popup_capability_can_stattrack_swap.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../inspect.ts\" />\n/// <reference path=\"popup_inspect_shared.ts\" />\nvar CapabilityCanStatTrackSwap;\n(function (CapabilityCanStatTrackSwap) {\n    function Init() {\n        const itemids = [\n            InspectShared.GetPopupSetting('item_id'),\n            InspectShared.GetPopupSetting('stattrak_swap_second_item_id')\n        ];\n        const contextPanel = $.GetContextPanel();\n        contextPanel.Data().statNumbersOriginal = [0, 0];\n        contextPanel.Data().distanceLerped = 9999999;\n        contextPanel.Data().flLerpProgress = 0.0;\n        contextPanel.Data().scheduleHandle = null;\n        itemids.forEach((item, idx) => {\n            contextPanel.Data().statNumbersOriginal[idx] = parseInt(String(InventoryAPI.GetItemAttributeValue(item, \"kill eater\")));\n            _SetItemModel(itemids[idx], idx);\n        });\n        _SetUpButtonStates();\n        $.DispatchEvent('CapabilityPopupIsOpen', true);\n        contextPanel.Data().scheduleHandle = $.Schedule(0.01, () => _LerpTimer(contextPanel));\n    }\n    CapabilityCanStatTrackSwap.Init = Init;\n    function _SetItemModel(itemId, idx) {\n        let elPanel = $.GetContextPanel().FindChildInLayoutFile('StatTrackSwapItemModel' + idx);\n        InspectModelImage.Init(elPanel, itemId);\n        elPanel.AddClass('darken');\n        elPanel.RemoveClass('full-width');\n        elPanel.RemoveClass('full-height');\n    }\n    function _SetUpButtonStates() {\n        const contextPanel = $.GetContextPanel();\n        contextPanel.FindChildInLayoutFile('StatTrackSwapAcceptConfirm').SetPanelEvent('onactivate', () => _OnAccept(contextPanel));\n        contextPanel.FindChildInLayoutFile('StatTrackSwapCancelBtn').SetPanelEvent('onactivate', ClosePopup);\n    }\n    function _LerpTimer(contextPanel) {\n        contextPanel.Data().scheduleHandle = null;\n        let originalLen = contextPanel.Data().statNumbersOriginal[1] - contextPanel.Data().statNumbersOriginal[0];\n        let newDistanceLerped = (contextPanel.Data().flLerpProgress < 1.0) ? Math.round(contextPanel.Data().flLerpProgress * originalLen) : originalLen;\n        if (newDistanceLerped != contextPanel.Data().distanceLerped) {\n            contextPanel.Data().distanceLerped = newDistanceLerped;\n            $.DispatchEvent('CSGOPlaySoundEffectMuteBypass', 'popup_accept_match_waitquiet', 'MOUSE', 1.0);\n            let elSwapNumber0 = contextPanel.FindChildInLayoutFile('StatTrackSwapNumber0');\n            let elSwapNumber1 = contextPanel.FindChildInLayoutFile('StatTrackSwapNumber1');\n            elSwapNumber0.text = (contextPanel.Data().statNumbersOriginal[0] + contextPanel.Data().distanceLerped).toString().padStart(6, \"0\");\n            elSwapNumber1.text = (contextPanel.Data().statNumbersOriginal[1] - contextPanel.Data().distanceLerped).toString().padStart(6, \"0\");\n        }\n        if (contextPanel.Data().flLerpProgress < 1.0) {\n            contextPanel.Data().flLerpProgress += 0.01;\n            contextPanel.Data().scheduleHandle = $.Schedule(0.04, () => _LerpTimer(contextPanel));\n        }\n        else {\n        }\n    }\n    function _OnAccept(contextPanel) {\n        if (contextPanel.Data().scheduleHandle) {\n            $.CancelScheduled(contextPanel.Data().scheduleHandle);\n            contextPanel.Data().flLerpProgress = 1.0;\n            _LerpTimer(contextPanel);\n        }\n        contextPanel.FindChildInLayoutFile('NameableSpinner').RemoveClass('hidden');\n        contextPanel.Data().scheduleHandle = $.Schedule(5, () => _CancelWaitforCallBack(contextPanel));\n        InventoryAPI.SetStatTrakSwapToolItems(InspectShared.GetPopupSetting('item_id', contextPanel), InspectShared.GetPopupSetting('stattrak_swap_second_item_id', contextPanel));\n        const toolId = InspectShared.GetPopupSetting('tool_id', contextPanel);\n        InventoryAPI.UseTool(toolId, '');\n    }\n    function ClosePopup() {\n        $.DispatchEvent('HideSelectItemForCapabilityPopup');\n        $.DispatchEvent('UIPopupButtonClicked', '');\n        $.DispatchEvent('CapabilityPopupIsOpen', false);\n    }\n    CapabilityCanStatTrackSwap.ClosePopup = ClosePopup;\n    function _CancelWaitforCallBack(contextPanel) {\n        let elSpinner = contextPanel.FindChildInLayoutFile('NameableSpinner');\n        elSpinner.AddClass('hidden');\n        ClosePopup();\n        UiToolkitAPI.ShowGenericPopupOk($.Localize('#SFUI_SteamConnectionErrorTitle'), $.Localize('#SFUI_InvError_Item_Not_Given'), '', () => { });\n    }\n    function _OnItemCustomization(numericType, type, itemid) {\n        const contextPanel = $.GetContextPanel();\n        if (contextPanel.Data().scheduleHandle) {\n            $.CancelScheduled(contextPanel.Data().scheduleHandle);\n            contextPanel.Data().scheduleHandle = null;\n        }\n        ClosePopup();\n        $.DispatchEvent('ShowAcknowledgePopup', type, itemid);\n    }\n    $.RegisterForUnhandledEvent('PanoramaComponent_Inventory_ItemCustomizationNotification', _OnItemCustomization);\n})(CapabilityCanStatTrackSwap || (CapabilityCanStatTrackSwap = {}));\n","scripts/popups/popup_capability_can_sticker.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../inspect.ts\" />\n/// <reference path=\"../common/iteminfo.ts\" />\n/// <reference path=\"popup_inspect_purchase-bar.ts\" />\n/// <reference path=\"popup_capability_can_keychain.ts\" />\n/// <reference path=\"popup_capability_can_patch.ts\" />\n/// <reference path=\"popup_can_apply_pick_slot.ts\" />\n/// <reference path=\"popup_can_apply_header.ts\" />\n/// <reference path=\"popup_acknowledge_item.ts\" />\n/// <reference path=\"popup_inspect_shared.ts\" />\nvar CapabilityCanApplyAction;\n(function (CapabilityCanApplyAction) {\n    const m_szRemoveKeychainToolChargesForPurchase = 'Remove Keychain Tool Pack';\n    function Init() {\n        InspectShared.SetPopupSetting('is_apply_remove_item', true);\n        const itemId = InspectShared.GetPopupSetting('item_id');\n        const toolId = InspectShared.GetPopupSetting('tool_id');\n        const worktype = InspectShared.GetPopupSetting('work_type');\n        const isRemove = _IsRemove(worktype);\n        if (isRemove) {\n            if (!itemId) {\n                ClosePopUp();\n                return;\n            }\n        }\n        else {\n            if (worktype === 'can_keychain' || worktype === 'can_sticker') {\n                const tempCreatedItem = InventoryAPI.CreateTempCombinedItemWithTool(itemId, toolId);\n                if (!tempCreatedItem) {\n                    ClosePopUp();\n                    return;\n                }\n                InspectShared.SetPopupSetting('temp_display_item_id', tempCreatedItem);\n            }\n            if ((worktype === 'can_wrap_sticker') && toolId) {\n                const tempCreatedItem = InventoryAPI.CreateTempCombinedItemWithTool(itemId, toolId);\n                if (!tempCreatedItem) {\n                    ClosePopUp();\n                    return;\n                }\n                InspectShared.SetPopupSetting('temp_display_item_id', tempCreatedItem);\n            }\n            if (worktype === 'craft_souvenir') {\n                const craftSouvenirFauxTool = 'craft_souvenir:' + InspectShared.GetPopupSetting('umid_souvenir');\n                const tempCreatedItem = InventoryAPI.CreateTempCombinedItemWithTool(itemId, craftSouvenirFauxTool);\n                if (!tempCreatedItem) {\n                    ClosePopUp();\n                    return;\n                }\n                let nRedeemableBalance = 0;\n                {\n                    const idxLookup = InventoryAPI.GetCacheTypeElementIndexByKey('SeasonalOperations', g_ActiveTournamentInfo.credits_id);\n                    if (g_ActiveTournamentInfo.credits_id == InventoryAPI.GetCacheTypeElementFieldByIndex('SeasonalOperations', idxLookup, 'season_value')) {\n                        nRedeemableBalance = InventoryAPI.GetCacheTypeElementFieldByIndex('SeasonalOperations', idxLookup, 'redeemable_balance');\n                        nRedeemableBalance = (nRedeemableBalance === null || nRedeemableBalance === undefined) ? 0 : nRedeemableBalance;\n                    }\n                }\n                InspectShared.SetPopupSetting('temp_display_item_id', tempCreatedItem);\n                InspectShared.SetPopupSetting('credits_owned_souvenir', nRedeemableBalance);\n            }\n        }\n        let oSettings = {\n            headerPanel: $.GetContextPanel().FindChildInLayoutFile('PopUpCanApplyHeader'),\n            infoPanel: $.GetContextPanel().FindChildInLayoutFile('PopUpCanApplyPickSlot'),\n            asyncBarPanel: $.GetContextPanel().FindChildInLayoutFile('PopUpInspectAsyncBar'),\n            contextPanel: $.GetContextPanel(),\n            itemId: InspectShared.GetPopupSetting('temp_display_item_id') ? InspectShared.GetPopupSetting('temp_display_item_id') : itemId,\n            toolId: toolId,\n            isRemove: (worktype === 'can_wrap_sticker') ? true\n                : isRemove,\n            type: (worktype === 'can_wrap_sticker') ? 'keychain'\n                : (worktype.indexOf('sticker') !== -1) ? 'sticker'\n                    : (worktype.indexOf('patch') !== -1) ? 'patch'\n                        : (worktype.indexOf('keychain') !== -1) ? 'keychain'\n                            : '',\n            funcOnConfirm: _OnConfirmPressed,\n            funcOnNext: _OnNextPressed,\n            funcOnCancel: _OnCancelPressed,\n            funcOnSelectForRemove: _OnSelectForRemove\n        };\n        CanApplyHeader.Init(oSettings);\n        CanApplySlotInfo.ResetSlotIndex();\n        CapabilityCanPatch.ResetPos();\n        CapabilityCanKeychain.ResetPos();\n        CanApplySlotInfo.UpdateEmptySlotList(itemId);\n        CanApplyPickSlot.Init(oSettings);\n        $.GetContextPanel().Data().oApplySettings = oSettings;\n        _SetItemModel(toolId, itemId, isRemove);\n        _SetUpAsyncActionBar(toolId);\n        _UpdateEnableDisableOkBtn(false, oSettings);\n        if (oSettings.isRemove && ((oSettings.type === 'keychain')\n            || (oSettings.type === 'sticker' && !!InspectShared.GetPopupSetting('remove_sticker_all_at_once')))) {\n            _OnConfirmPressed(oSettings);\n        }\n        if (worktype === \"remove_sticker\") {\n            $.RegisterForUnhandledEvent('PanoramaComponent_MyPersona_InventoryUpdated', CapabilityCanSticker.OnFinishedScratch);\n        }\n        $.DispatchEvent('CapabilityPopupIsOpen', true);\n        if (worktype === 'remove_keychain') {\n            const numKeychainRemoveToolChargesRemaining = InventoryAPI.GetCacheTypeElementFieldByIndex('KeychainRemoveToolCharges', 0, 'charges');\n            if (numKeychainRemoveToolChargesRemaining > 0) {\n            }\n            else {\n                let ownedKeychainRemoveChargesID = '';\n                const bAutoAcknowledge = true;\n                const unackItems = AcknowledgeItems.GetItemsByType([m_szRemoveKeychainToolChargesForPurchase], bAutoAcknowledge);\n                if (unackItems && unackItems.length > 0) {\n                    ownedKeychainRemoveChargesID = unackItems[0];\n                }\n                if (!ownedKeychainRemoveChargesID) {\n                    InventoryAPI.SetInventorySortAndFilters('inv_sort_age', false, 'item_definition:' + m_szRemoveKeychainToolChargesForPurchase, '', '');\n                    const countOfChargeItemsOwned = InventoryAPI.GetInventoryCount();\n                    if (countOfChargeItemsOwned > 0) {\n                        ownedKeychainRemoveChargesID = InventoryAPI.GetInventoryItemIDByIndex(0);\n                    }\n                }\n                if (ownedKeychainRemoveChargesID) {\n                    ClosePopUp();\n                    const elPanel = $.DispatchEvent(\"ShowCustomLayoutPopupParametersAsEvent\", '', 'file://{resources}/layout/popups/popup_inventory_inspect.xml', 'item_id=' + ownedKeychainRemoveChargesID +\n                        ',' + 'work_type=useitem');\n                }\n                else {\n                }\n            }\n        }\n    }\n    CapabilityCanApplyAction.Init = Init;\n    function _IsRemove(worktype) {\n        return (worktype === \"remove_sticker\" || worktype === \"remove_patch\" || worktype === \"remove_keychain\");\n    }\n    function _OnConfirmPressed(oSettings) {\n        $.DispatchEvent('CSGOPlaySoundEffect', 'generic_button_press', 'MOUSE');\n        _SetSelectedSlot(CanApplySlotInfo.GetSelectedEmptySlot(), oSettings);\n        _UpdateEnableDisableOkBtn(true, oSettings);\n        InspectAsyncActionBar.EnableDisableChangeSceneryBtn(false, oSettings.contextPanel.FindChildInLayoutFile('PopUpInspectAsyncBar'));\n    }\n    function _OnNextPressed(itemToApplyId, activeSlot, oSettings) {\n        const worktype = InspectShared.GetPopupSetting('work_type', oSettings.contextPanel);\n        _UpdateEnableDisableOkBtn(false, oSettings);\n        if (worktype === 'can_sticker' || worktype === 'can_keychain') {\n            CapabilityCanSticker.NextStickerButtonPressed(oSettings.contextPanel);\n        }\n        else if (worktype === 'can_patch') {\n            CapabilityCanPatch.PreviewPatchOnChar(itemToApplyId, activeSlot, oSettings.contextPanel);\n        }\n    }\n    function _OnCancelPressed(oSettings) {\n        _UpdateEnableDisableOkBtn(false, oSettings);\n        InspectAsyncActionBar.EnableDisableChangeSceneryBtn(true, oSettings.contextPanel.FindChildInLayoutFile('PopUpInspectAsyncBar'));\n    }\n    function _StickerPlacementUpdated() {\n        const elParent = $.GetContextPanel().FindChildInLayoutFile('PopUpCanApplyPickSlot');\n        const elCancelBtn = elParent.FindChildInLayoutFile('CanApplyCancel');\n        if (elCancelBtn.visible)\n            $.DispatchEvent(\"Activated\", elParent.FindChildInLayoutFile('CanApplyCancel'), \"mouse\");\n    }\n    function _OnSelectForRemove(slotIndex, oSettings) {\n        const worktype = InspectShared.GetPopupSetting('work_type', oSettings.contextPanel);\n        if (worktype === 'remove_sticker') {\n            _SetSelectedSlot(slotIndex, oSettings);\n            CanApplyPickSlot.UpdateSelectedRemoveForSticker(slotIndex, oSettings);\n            _UpdateEnableDisableOkBtn(true, oSettings);\n        }\n        else if (worktype === 'remove_patch') {\n            _SetSelectedSlot(slotIndex, oSettings);\n            _UpdateEnableDisableOkBtn(true, oSettings);\n            CapabilityCanPatch.CameraAnim(slotIndex, oSettings.contextPanel);\n        }\n    }\n    function _UpdateEnableDisableOkBtn(bEnable, oSettings) {\n        const elAsyncActionBarPanel = oSettings.contextPanel.FindChildInLayoutFile('PopUpInspectAsyncBar');\n        InspectAsyncActionBar.EnableDisableOkBtn(elAsyncActionBarPanel, bEnable);\n        return;\n    }\n    function _SetSelectedSlot(slotIndex, oSettings) {\n        oSettings.asyncBarPanel.SetAttributeString('selectedItemToApplySlot', slotIndex.toString());\n    }\n    function _UpdateInspectMap() {\n        InspectModelImage.SwitchMap($.GetContextPanel());\n        const worktype = InspectShared.GetPopupSetting('work_type');\n        if (worktype === 'can_patch') {\n            CapabilityCanPatch.ResetPos();\n        }\n        InspectAsyncActionBar.ZoomCamera(true, $.GetContextPanel().FindChildInLayoutFile('PopUpInspectAsyncBar'));\n        _UpdateItemToApplyPreview(InspectShared.GetPopupSetting('tool_id'), $.GetContextPanel());\n    }\n    function _SetItemModel(toolId, itemId, m_isRemove) {\n        if (!InventoryAPI.IsItemInfoValid(itemId))\n            return;\n        const elPreviewPanel = $.GetContextPanel().FindChildInLayoutFile('CanApplyItemModel');\n        const worktype = InspectShared.GetPopupSetting('work_type');\n        const displayItemId = InspectShared.GetPopupSetting('temp_display_item_id');\n        InspectModelImage.Init(elPreviewPanel, displayItemId ? displayItemId : itemId);\n        elPreviewPanel.Data().id = itemId;\n        if (m_isRemove) {\n            if (worktype === 'remove_patch') {\n                $.Schedule(.3, () => CanApplyPickSlot.SelectFirstRemoveItem());\n            }\n        }\n        else {\n            _UpdateItemToApplyPreview(toolId, $.GetContextPanel());\n        }\n    }\n    function _UpdateItemToApplyPreview(toolId, contextPanel) {\n        const worktype = InspectShared.GetPopupSetting('work_type');\n        if (worktype === 'can_sticker') {\n            CapabilityCanSticker.PreviewStickerInSlot(toolId, CanApplySlotInfo.GetSelectedEmptySlot());\n        }\n        if (worktype === 'can_patch') {\n            $.Schedule(.3, () => CapabilityCanPatch.PreviewPatchOnChar(toolId, CanApplySlotInfo.GetSelectedEmptySlot(), contextPanel));\n        }\n    }\n    function _SetUpAsyncActionBar(toolId) {\n        const worktype = InspectShared.GetPopupSetting('work_type');\n        const itemId = InspectShared.GetPopupSetting('item_id');\n        const elAsyncActionBarPanel = $.GetContextPanel().FindChildInLayoutFile('PopUpInspectAsyncBar');\n        InspectAsyncActionBar.Init();\n        const elPurchase = $.GetContextPanel().FindChildInLayoutFile('PopUpInspectPurchaseBar');\n        let bConfigurePurchaseBar = false;\n        let mustPurchaseItemID = '';\n        if (worktype === 'can_wrap_sticker' && InventoryAPI.IsFauxItemID(itemId)) {\n            bConfigurePurchaseBar = true;\n            mustPurchaseItemID = itemId;\n        }\n        if (worktype === 'remove_keychain' || worktype === 'can_keychain') {\n            bConfigurePurchaseBar = true;\n            if (worktype === 'remove_keychain') {\n                const numKeychainRemoveToolChargesRemaining = InventoryAPI.GetCacheTypeElementFieldByIndex('KeychainRemoveToolCharges', 0, 'charges');\n                const defidxForPurchase = (numKeychainRemoveToolChargesRemaining > 0) ? 0 : InventoryAPI.GetItemDefinitionIndexFromDefinitionName(m_szRemoveKeychainToolChargesForPurchase);\n                if (defidxForPurchase) {\n                    mustPurchaseItemID = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(defidxForPurchase, 0);\n                }\n            }\n        }\n        if (elPurchase && bConfigurePurchaseBar) {\n            if (mustPurchaseItemID) {\n                InspectShared.SetPopupSetting('purchase_item_id', mustPurchaseItemID);\n                $.GetContextPanel().SetAttributeString('toolid', '');\n            }\n            InspectPurchaseBar.Init();\n            if (mustPurchaseItemID) {\n                $.GetContextPanel().SetAttributeString('toolid', toolId);\n                elAsyncActionBarPanel.AddClass('hidden');\n            }\n        }\n    }\n    function _OnStorePurchaseCompleted(ItemId) {\n        if (InventoryAPI.DoesItemMatchDefinitionByName(ItemId, m_szRemoveKeychainToolChargesForPurchase)) {\n            $.DispatchEvent('HideStoreStatusPanel');\n            const bAutoAcknowledge = true;\n            AcknowledgeItems.GetItemsByType([m_szRemoveKeychainToolChargesForPurchase], bAutoAcknowledge);\n            ClosePopUp();\n            $.DispatchEvent(\"ShowCustomLayoutPopupParametersAsEvent\", '', 'file://{resources}/layout/popups/popup_inventory_inspect.xml', 'item_id=' + ItemId +\n                ',' + 'work_type=useitem');\n        }\n        const worktype = InspectShared.GetPopupSetting('work_type');\n        const itemId = InspectShared.GetPopupSetting('item_id');\n        const toolId = InspectShared.GetPopupSetting('tool_id');\n        if (worktype === 'can_wrap_sticker' &&\n            InventoryAPI.IsFauxItemID(itemId) &&\n            InventoryAPI.DoesItemMatchDefinitionByName(ItemId, \"sticker_display_case\")) {\n            $.DispatchEvent('HideStoreStatusPanel');\n            const bAutoAcknowledge = true;\n            AcknowledgeItems.GetItemsByType([\"sticker_display_case\"], bAutoAcknowledge);\n            ClosePopUp();\n            const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('popup-inspect-' + ItemId, 'file://{resources}/layout/popups/popup_capability_can_keychain.xml');\n            let oSettings = {\n                popup_panel: elPanel,\n                tool_id: toolId,\n                item_id: ItemId,\n                work_type: 'can_wrap_sticker'\n            };\n            elPanel.Data().oSettings = oSettings;\n        }\n    }\n    ;\n    function ClosePopUp() {\n        const elAsyncActionBarPanel = $.GetContextPanel().FindChildInLayoutFile('PopUpInspectAsyncBar');\n        const elPurchase = $.GetContextPanel().FindChildInLayoutFile('PopUpInspectPurchaseBar');\n        if (!elAsyncActionBarPanel.BHasClass('hidden')) {\n            InspectAsyncActionBar.OnEventToClose();\n        }\n        else if (elPurchase && elPurchase.IsValid() && !elPurchase.BHasClass('hidden')) {\n            InspectPurchaseBar.ClosePopup();\n        }\n    }\n    CapabilityCanApplyAction.ClosePopUp = ClosePopUp;\n    function StickerScrapeClickedStickerIndex(stickerIndex) {\n        _OnSelectForRemove(stickerIndex, $.GetContextPanel().Data().oApplySettings);\n    }\n    {\n        let _m_PanelRegisteredForEventsStickerApply;\n        if (!_m_PanelRegisteredForEventsStickerApply) {\n            _m_PanelRegisteredForEventsStickerApply = $.RegisterForUnhandledEvent('CSGOShowMainMenu', Init);\n            $.RegisterForUnhandledEvent('PanoramaComponent_Store_PurchaseCompleted', _OnStorePurchaseCompleted);\n            $.RegisterForUnhandledEvent(\"CSGOInspectBackgroundMapChanged\", _UpdateInspectMap);\n            $.RegisterForUnhandledEvent(\"CS2StickerPreviewMoved\", _StickerPlacementUpdated);\n            $.RegisterForUnhandledEvent(\"CS2StickerScrapeClickedStickerIndex\", StickerScrapeClickedStickerIndex);\n            $.RegisterForUnhandledEvent('PopulateLoadingScreen', ClosePopUp);\n        }\n    }\n})(CapabilityCanApplyAction || (CapabilityCanApplyAction = {}));\nvar CapabilityCanSticker;\n(function (CapabilityCanSticker) {\n    let m_isFinalScratch = false;\n    let m_firstCameraAnim = false;\n    function NextStickerButtonPressed(contextPanel) {\n        const m_elPreviewPanel = contextPanel.FindChildInLayoutFile('CanApplyItemModel');\n        const elPanel = m_elPreviewPanel.FindChildTraverse('ItemPreviewPanel') || null;\n        if (elPanel != null) {\n            $.DispatchEvent('CSGOPlaySoundEffect', 'sticker_nextPosition', 'MOUSE');\n            InventoryAPI.OnNextStickerButtonPressed(elPanel);\n        }\n    }\n    CapabilityCanSticker.NextStickerButtonPressed = NextStickerButtonPressed;\n    function SetStickerScrapeLevel(valScrapeLevel, contextPanel) {\n        const m_elPreviewPanel = contextPanel.FindChildInLayoutFile('CanApplyItemModel');\n        const elPanel = m_elPreviewPanel.FindChildTraverse('ItemPreviewPanel') || null;\n        if (elPanel != null) {\n            InventoryAPI.SetStickerScrapeLevel(elPanel, valScrapeLevel);\n        }\n    }\n    CapabilityCanSticker.SetStickerScrapeLevel = SetStickerScrapeLevel;\n    function PreviewStickerInSlot(stickerId, slot) {\n        $.DispatchEvent('CSGOPlaySoundEffect', 'sticker_nextPosition', 'MOUSE');\n        const m_elPreviewPanel = $.GetContextPanel().FindChildInLayoutFile('CanApplyItemModel');\n        const elPanel = m_elPreviewPanel.FindChildTraverse('ItemPreviewPanel') || null;\n        InventoryAPI.PreviewStickerInModelPanel(stickerId, slot, elPanel);\n    }\n    CapabilityCanSticker.PreviewStickerInSlot = PreviewStickerInSlot;\n    function CameraAnim(slot) {\n        const m_elPreviewPanel = $.GetContextPanel().FindChildInLayoutFile('CanApplyItemModel');\n        const elPanel = m_elPreviewPanel.FindChildTraverse('ItemPreviewPanel') || null;\n        if (!m_firstCameraAnim) {\n            m_firstCameraAnim = true;\n            return;\n        }\n        InspectModelImage.SetItemCameraByWeaponType(m_elPreviewPanel.Data().id, elPanel, true);\n        elPanel.SetRotation(0, 0, 1);\n    }\n    CapabilityCanSticker.CameraAnim = CameraAnim;\n    function OnScratchSticker(itemId, slotIndex, bRemoveCompletely, popup_panel) {\n        if (bRemoveCompletely || InventoryAPI.IsItemStickerAtExtremeWear(itemId, slotIndex)) {\n            $.DispatchEvent('CSGOPlaySoundEffect', 'UI.StickerScratch', 'MOUSE');\n            m_isFinalScratch = true;\n            InspectAsyncActionBar.ResetTimeouthandle();\n            InventoryAPI.WearItemSticker(itemId, slotIndex, 111);\n            InspectAsyncActionBar.SetCallbackTimeout();\n        }\n        else {\n            let valTargetWear = 0;\n            const elStickerScrapeLevelContainer = popup_panel.FindChildInLayoutFile('PopUpCanApplyPickSlot').FindChildInLayoutFile('StickerScrapeLevelContainer');\n            if (elStickerScrapeLevelContainer) {\n                const elStickerScrapeLevelSlider = elStickerScrapeLevelContainer.FindChildInLayoutFile('StickerScrapeLevelSlider');\n                if (elStickerScrapeLevelSlider) {\n                    valTargetWear = elStickerScrapeLevelSlider.value;\n                    if (valTargetWear <= elStickerScrapeLevelSlider.default) {\n                        InspectAsyncActionBar.ResetTimeouthandle();\n                        const elAsyncActionBarPanel = popup_panel.FindChildInLayoutFile('PopUpInspectAsyncBar');\n                        InspectAsyncActionBar.OnCloseRemove(elAsyncActionBarPanel);\n                        return;\n                    }\n                }\n            }\n            $.DispatchEvent('CSGOPlaySoundEffect', 'UI.StickerScratch', 'MOUSE');\n            HighlightStickerBySlot(slotIndex);\n            InventoryAPI.WearItemSticker(itemId, slotIndex, valTargetWear);\n        }\n    }\n    CapabilityCanSticker.OnScratchSticker = OnScratchSticker;\n    function HighlightStickerBySlot(slotIndex) {\n        InventoryAPI.HighlightStickerBySlot(slotIndex);\n    }\n    CapabilityCanSticker.HighlightStickerBySlot = HighlightStickerBySlot;\n    function OnFinishedScratch() {\n        if (m_isFinalScratch || !$.GetContextPanel()) {\n            return;\n        }\n        const m_elPreviewPanel = $.GetContextPanel().FindChildInLayoutFile('CanApplyItemModel');\n        const elAsyncActionBarPanel = $.GetContextPanel().FindChildInLayoutFile('PopUpInspectAsyncBar');\n        InspectAsyncActionBar.ResetTimeouthandle();\n        InspectAsyncActionBar.OnCloseRemove(elAsyncActionBarPanel);\n        InspectModelImage.UpdateModelOnly(m_elPreviewPanel.Data().id);\n        const elStickersToRemove = $.GetContextPanel().FindChildInLayoutFile('PopUpCanApplyPickSlot').FindChildInLayoutFile('CanStickerItemIcons');\n        if (elStickersToRemove && InspectShared.GetPopupSetting('work_type') === \"remove_patch\") {\n            const panelsList = elStickersToRemove.Children();\n            panelsList.forEach(element => element.enabled = true);\n        }\n        if (elStickersToRemove && InspectShared.GetPopupSetting('work_type') === \"remove_sticker\") {\n            const panelsList = elStickersToRemove.Children();\n            panelsList.forEach(element => { if (element.checked) {\n                $.DispatchEvent(\"Activated\", element, \"mouse\");\n            } });\n        }\n    }\n    CapabilityCanSticker.OnFinishedScratch = OnFinishedScratch;\n})(CapabilityCanSticker || (CapabilityCanSticker = {}));\n","scripts/popups/popup_capability_decodable.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"popup_capability_header.ts\" />\n/// <reference path=\"../common/iteminfo.ts\" />\n/// <reference path=\"../inspect.ts\" />\n/// <reference path=\"popup_inspect_async-bar.ts\" />\n/// <reference path=\"popup_inspect_purchase-bar.ts\" />\n/// <reference path=\"popup_inspect_rental-bar.ts\" />\n/// <reference path=\"popup_inspect_header.ts\" />\n/// <reference path=\"popup_acknowledge_item.ts\" />\n/// <reference path=\"popup_inspect_shared.ts\" />\nvar CapabilityDecodable;\n(function (CapabilityDecodable) {\n    function Init() {\n        $.GetContextPanel().Data().itemFromContainer = '';\n        $.GetContextPanel().Data().existingRewardFromXrayId = '';\n        $.GetContextPanel().Data().unusualItemImagePath = '';\n        $.GetContextPanel().Data().showInspectScheduleHandle = null;\n        let aItemsInLootlist = [];\n        $.GetContextPanel().Data().aItemsInLootlist = aItemsInLootlist;\n        let elCaseModelImagePanel = null;\n        $.GetContextPanel().Data().elCaseModelImagePanel = elCaseModelImagePanel;\n        $.GetContextPanel().Data().scrollListsPanelIds = ['ScrollList', 'ScrollListMagnified'];\n        const showXrayMachineUi = InspectShared.GetPopupSetting('is_xray_machine');\n        if (showXrayMachineUi) {\n            $.GetContextPanel().SetHasClass('popup-in-xray', showXrayMachineUi);\n            let oData = ItemInfo.GetItemsInXray();\n            $.GetContextPanel().Data().existingRewardFromXrayId = oData.reward;\n            if (oData.reward) {\n                if (oData.reward) {\n                    if (InventoryAPI.IsFauxItemID(oData.reward)) {\n                        const elPopup = UiToolkitAPI.ShowGenericPopupOk('#popup_xray_first_use_title', '#popup_xray_first_use_desc', '', () => { });\n                        const elMessageLabel = elPopup.FindChildInLayoutFile('MessageLabel');\n                        elMessageLabel.html = true;\n                        elPopup.SetDialogVariable('itemname', InventoryAPI.GetItemName(oData.reward));\n                        elMessageLabel.text = $.Localize('#popup_xray_first_use_desc', elPopup);\n                    }\n                    else if (InspectShared.GetPopupSetting('show_xray_warning')) {\n                        UiToolkitAPI.ShowGenericPopupOk('#popup_xray_in_use_title', '#popup_xray_in_use_desc', '', () => { });\n                    }\n                }\n                InspectShared.SetPopupSetting('item_id', oData.case);\n            }\n            if (!InspectShared.GetPopupSetting('tool_id')) {\n                let keyId = ItemInfo.GetKeyForCaseInXray(InspectShared.GetPopupSetting('item_id'));\n                if (keyId) {\n                    InspectShared.SetPopupSetting('tool_id', keyId);\n                }\n            }\n        }\n        const caseId = InspectShared.GetPopupSetting('item_id');\n        const keyId = InspectShared.GetPopupSetting('tool_id');\n        if ((keyId && InventoryAPI.IsRental(keyId)) ||\n            InventoryAPI.IsRental(InspectShared.GetPopupSetting('item_id'))) {\n            InspectShared.SetPopupSetting('show_work_type_warning', false);\n            InspectShared.SetPopupSetting('inspect_only', true);\n            InspectShared.SetPopupSetting('only_close_btn', true);\n            InspectShared.SetPopupSetting('force_hide_async_bar', true);\n        }\n        if (!keyId) {\n            const associatedItemCount = InventoryAPI.GetAssociatedItemsCount(caseId);\n            if (!InventoryAPI.IsItemInfoValid(caseId)) {\n                return;\n            }\n            const storeItemId = InspectShared.GetPopupSetting('store_item_id');\n            InspectShared.SetPopupSetting('is_keyless', ((associatedItemCount === 0 || !associatedItemCount) && !storeItemId));\n            if (!storeItemId && associatedItemCount > 0) {\n                const keyToSellId = InventoryAPI.GetAssociatedItemIdByIndex(caseId, 0);\n                InspectShared.SetPopupSetting('purchase_item_id', keyToSellId);\n            }\n        }\n        else {\n            if (!InventoryAPI.IsItemInfoValid(keyId)) {\n                return;\n            }\n        }\n        _SetUpPanelElements();\n        $.DispatchEvent('CapabilityPopupIsOpen', true);\n    }\n    CapabilityDecodable.Init = Init;\n    function _SetUpPanelElements() {\n        const caseId = InspectShared.GetPopupSetting('item_id');\n        const keyId = InspectShared.GetPopupSetting('tool_id');\n        const existingRewardFromXrayId = $.GetContextPanel().Data().existingRewardFromXrayId;\n        if (!keyId) {\n            InspectShared.SetPopupSetting('show_work_type_warning', false);\n            InspectShared.SetPopupSetting('override_async_bar_desc', false);\n            if (existingRewardFromXrayId) {\n                InspectShared.SetPopupSetting('allow_xray_purchase', true);\n            }\n        }\n        else {\n            InspectShared.SetPopupSetting('show_work_type_warning', true);\n            InspectShared.SetPopupSetting('override_async_bar_desc', true);\n            if (existingRewardFromXrayId) {\n                InspectShared.SetPopupSetting('allow_xray_claim', true);\n            }\n        }\n        if (InspectShared.GetPopupSetting('is_keyless')) {\n            if (existingRewardFromXrayId) {\n                InspectShared.SetPopupSetting('allow_xray_claim', true);\n            }\n            InspectShared.SetPopupSetting('show_work_type_warning', true);\n            InspectShared.SetPopupSetting('override_async_bar_desc', true);\n        }\n        const category = InventoryAPI.GetLoadoutCategory(caseId);\n        if (category == \"musickit\") {\n            InventoryAPI.PlayItemPreviewMusic(caseId, '');\n        }\n        InspectShared.SetPopupSetting('allow_rent', InventoryAPI.CanOpenForRental(caseId));\n        InspectPurchaseBar.Init();\n        InspectAsyncActionBar.Init();\n        InspectRentalBar.Init();\n        CapabilityHeader.Init();\n        _SetupDescription(caseId);\n        if (InspectShared.GetPopupSetting('is_xray_machine')) {\n            _SetUpXrayPanel();\n        }\n        else {\n            _SetCaseModelImage(caseId, 'PopUpInspectModelOrImage');\n            if (!ItemInfo.IsSpraySealed(caseId) && !ItemInfo.ItemDefinitionNameSubstrMatch(caseId, 'tournament_pass_')) {\n                _PlayContainerSound(caseId, 'fall');\n            }\n            _SetLootListItems(caseId, keyId);\n        }\n    }\n    function _SetupDescription(caseId) {\n        const elPanel = $.GetContextPanel().FindChildInLayoutFile('InspectItemDesc');\n        const count = InventoryAPI.GetLootListItemsCount(caseId);\n        if (count === 0 && InspectShared.GetPopupSetting('store_item_id')) {\n            elPanel.visible = true;\n            elPanel.text = InventoryAPI.GetItemDescription(caseId, '');\n        }\n        else {\n            elPanel.visible = false;\n        }\n    }\n    function _SetCaseModelImage(caseId, PanelId) {\n        const elItemModelImagePanel = $.GetContextPanel().FindChildInLayoutFile(PanelId);\n        const item_attributes = 'item_attributes' in $.GetContextPanel().Data().oSettings ? $.GetContextPanel().Data().oSettings.item_attributes : '';\n        InspectModelImage.Init(elItemModelImagePanel, caseId);\n        $.GetContextPanel().Data().elCaseModelImagePanel = InspectModelImage.GetModelPanel();\n    }\n    function _SetLootListItems(caseId, keyId) {\n        const count = InventoryAPI.GetLootListItemsCount(caseId);\n        const elLootList = $.GetContextPanel().FindChildInLayoutFile('DecodableLootlist');\n        const specialItemId = 'id-special-item';\n        if (count === 0) {\n            _ShowHideLootList(false);\n            return;\n        }\n        const elCaseModelImagePanel = $.GetContextPanel().Data().elCaseModelImagePanel;\n        if (elCaseModelImagePanel && elCaseModelImagePanel.IsValid() && elCaseModelImagePanel.id === 'ImagePreviewPanel') {\n            elCaseModelImagePanel.AddClass('y-offset');\n        }\n        _ShowHideLootList(true);\n        _SetLootlistHintText(caseId, count);\n        for (let i = 0; i < count; i++) {\n            const itemid = InventoryAPI.GetLootListItemIdByIndex(caseId, i) === '0' ? specialItemId : InventoryAPI.GetLootListItemIdByIndex(caseId, i);\n            let elItem = elLootList.FindChildInLayoutFile(itemid);\n            if (!elItem) {\n                let elItem = $.CreatePanel('Panel', elLootList, itemid);\n                elItem.SetAttributeString('itemid', itemid);\n                elItem.BLoadLayoutSnippet('LootListItem');\n                const isAllowedToInteractWithLootlistItems = true;\n                _UpdateLootListItemInfo(elItem, itemid, caseId);\n                const funcActivation = isAllowedToInteractWithLootlistItems ? _OnActivateLootlistTile : () => { };\n                elItem.SetPanelEvent('onactivate', funcActivation.bind(undefined, itemid, caseId, keyId));\n                elItem.SetPanelEvent('oncontextmenu', funcActivation.bind(undefined, itemid, caseId, keyId));\n                if (i === 0 && isAllowedToInteractWithLootlistItems) {\n                    $.GetContextPanel().FindChildInLayoutFile('CanDecodableBrowseBtn').SetPanelEvent('onactivate', callBackFunc.bind(undefined, itemid, caseId, keyId));\n                }\n                if (itemid !== specialItemId) {\n                    $.GetContextPanel().Data().aItemsInLootlist.push({\n                        id: itemid,\n                        weight: _GetDisplayWeightForScroll(itemid),\n                    });\n                }\n            }\n        }\n    }\n    function _OnActivateLootlistTile(itemid, caseId, keyId) {\n        if (!InventoryAPI.IsValidItemID(itemid))\n            return;\n        let items = [];\n        items.push({ label: '#UI_Inspect', jsCallback: callBackFunc.bind(undefined, itemid, caseId, keyId) });\n        if (MyPersonaAPI.GetLauncherType() !== \"perfectworld\" && !InventoryAPI.CannotTrade(itemid)) {\n            items.push({ label: '#SFUI_Store_Market_Link', jsCallback: _ViewOnMarket.bind(undefined, itemid) });\n        }\n        UiToolkitAPI.ShowSimpleContextMenu('', 'ControlLibSimpleContextMenu', items);\n    }\n    function callBackFunc(itemid, caseId, keyId) {\n        $.DispatchEvent('ContextMenuEvent', '');\n        const storeid = InspectShared.GetPopupSetting('store_item_id') ? InspectShared.GetPopupSetting('store_item_id') : '';\n        $.DispatchEvent(\"LootlistItemPreview\", itemid, caseId +\n            ',' + storeid);\n    }\n    function _ViewOnMarket(id) {\n        SteamOverlayAPI.OpenURL(ItemInfo.GetMarketLinkForLootlistItem(id));\n    }\n    function _GetDisplayWeightForScroll(itemid) {\n        const rarityVal = InventoryAPI.GetItemRarity(itemid);\n        const displayItemWeight = [150000, 30000, 6000, 1250, 250, 50, 10];\n        return displayItemWeight[rarityVal];\n    }\n    function _UpdateLootListItemInfo(elItem, itemid, caseId) {\n        const specialItemId = 'id-special-item';\n        if (itemid == specialItemId) {\n            $.GetContextPanel().Data().unusualItemImagePath = InventoryAPI.GetLootListUnusualItemImage(caseId) + \".png\";\n            _UpdateUnusualItemInfo(elItem, caseId, $.GetContextPanel().Data().unusualItemImagePath, true);\n        }\n        else {\n            elItem.FindChildInLayoutFile('ItemImage').itemid = itemid;\n            elItem.FindChildInLayoutFile('JsRarity').style.backgroundColor = InventoryAPI.GetItemRarityColor(itemid);\n            ItemInfo.GetFormattedName(itemid).SetOnLabel(elItem.FindChildInLayoutFile('JsItemName'));\n        }\n    }\n    function _ShowHideLootList(bshow) {\n        const elLootListContainer = $.GetContextPanel().FindChildInLayoutFile('DecodableLootlistContainer');\n        elLootListContainer.SetHasClass('hidden', !bshow);\n    }\n    function _SetLootlistHintText(caseId, count) {\n        const bAllItems = InventoryAPI.GetLootListAllEntriesAreAdditionalDrops(caseId);\n        $.GetContextPanel().FindChildInLayoutFile('CanDecodableDesc').visible = !bAllItems;\n        if (count > 1 || bAllItems) {\n            $.GetContextPanel().FindChildInLayoutFile('CanDecodableDescMulti').SetDialogVariableInt('num_items', count);\n            $.GetContextPanel().FindChildInLayoutFile('CanDecodableDescMulti').visible = (count > 1 && bAllItems);\n        }\n    }\n    function _UpdateUnusualItemInfo(elItem, caseId, unusualItemImagePath, bisDisplayedInLootlist = false) {\n        if (!elItem || !elItem.IsValid()) {\n            return;\n        }\n        elItem.FindChildInLayoutFile('ItemImage').SetImage(\"file://{images}/\" + unusualItemImagePath);\n        if (bisDisplayedInLootlist) {\n            elItem.FindChildInLayoutFile('JsRarity').AddClass('popup-decodable-wash-color-unusual');\n            const elBg = elItem.FindChildInLayoutFile('ItemTileBg');\n            elBg.AddClass('popup-decodable-wash-color-unusual-bg');\n            const elName = elItem.FindChildInLayoutFile('JsItemName');\n            elName.text = InventoryAPI.GetLootListUnusualItemName(caseId);\n        }\n        else {\n            elItem.FindChildInLayoutFile('JsRarity').style.washColor = '#ffd700';\n            elItem.FindChildInLayoutFile('JItemTint').style.washColor = '#ffd700';\n        }\n    }\n    function _SetUpCaseOpeningScroll() {\n        _ShowHideLootList(false);\n        let delay = 0;\n        const elCaseModelImagePanel = $.GetContextPanel().Data().elCaseModelImagePanel;\n        if (elCaseModelImagePanel &&\n            elCaseModelImagePanel.IsValid() &&\n            elCaseModelImagePanel.id == 'ImagePreviewPanel' &&\n            !elCaseModelImagePanel.BHasClass('hidden')) {\n            elCaseModelImagePanel.RemoveClass('y-offset');\n            delay = 0.1;\n        }\n        else {\n            elCaseModelImagePanel.TransitionToCamera('cam_case_open', 1.5);\n            $.Schedule(0.75, () => { elCaseModelImagePanel?.SetAnimgraphBool('open', true); });\n            delay = 2.0;\n        }\n        $.Schedule(delay, () => _ShowScroll(elCaseModelImagePanel));\n    }\n    function _ShowScroll(elCase) {\n        const elScroll = $.GetContextPanel().FindChildInLayoutFile('DecodableItemsScroll');\n        if (!elScroll || !elScroll.IsValid() || !elCase || !elCase.IsValid()) {\n            return;\n        }\n        elScroll.RemoveClass('hidden');\n        elCase.AddClass('popup-inspect-modelpanel_darken_blur');\n        const scrollListsPanelIds = $.GetContextPanel().Data().scrollListsPanelIds;\n        _FillScrollsWithItems(scrollListsPanelIds);\n        $.Schedule(0.1, _PlayScrollAnim.bind(undefined, scrollListsPanelIds));\n    }\n    function _PlayScrollAnim(scrolllists) {\n        const targetId = 'ItemFromContainer';\n        const xOffsetSlackPercent = (Math.floor(Math.random() * ((90) - 10 + 1) + 10) / 100);\n        for (let element of scrolllists) {\n            let xPos = _GetStopPosition($.GetContextPanel().FindChildInLayoutFile(element), targetId, xOffsetSlackPercent);\n            const elScroll = $.GetContextPanel().FindChildInLayoutFile(element);\n            elScroll.ScrollToFitRegion(xPos, xPos, 0, 0, 3, true, false);\n        }\n        const revealDelay = 6;\n        const contextPanel = $.GetContextPanel();\n        contextPanel.Data().showInspectScheduleHandle = $.Schedule(revealDelay, () => _ShowInspect(contextPanel));\n        const itemDefName = InventoryAPI.GetItemDefinitionName(InspectShared.GetPopupSetting('item_id'));\n        let soundEventName = \"container_weapon_ticker\";\n        if (itemDefName && itemDefName.indexOf(\"sticker\") != -1) {\n            soundEventName = \"container_sticker_ticker\";\n        }\n        for (let i = 0; i < _TickSoundIntervals.length; ++i) {\n            $.Schedule(_TickSoundIntervals[i], _ScrollTick.bind(undefined, soundEventName));\n        }\n    }\n    const _TickSoundIntervals = [0.000, 0.063, 0.125, 0.188, 0.250, 0.313, 0.375, 0.438, 0.500, 0.563, 0.625, 0.688, 0.750, 0.813, 0.875, 0.938, 1.000, 1.063, 1.125, 1.188, 1.250, 1.313, 1.375, 1.483, 1.351, 1.620, 1.701, 1.786, 1.872, 2.003, 2.154, 2.313, 2.466, 2.615, 2.773, 2.941, 3.104, 3.339, 3.630, 3.953, 4.385, 5.004,];\n    function _ScrollTick(soundEventName) {\n        $.DispatchEvent(\"CSGOPlaySoundEffect\", soundEventName, \"MOUSE\");\n    }\n    function _GetStopPosition(elParent, targetId, xOffsetSlackPercent) {\n        const elTile = elParent.FindChildInLayoutFile(targetId);\n        if (!elTile || !elTile.IsValid())\n            return 0;\n        const tileWidth = elTile.contentwidth;\n        return (elTile.actualxoffset + (tileWidth * xOffsetSlackPercent));\n    }\n    function _ShowInspect(contextPanel) {\n        contextPanel.Data().showInspectScheduleHandle = null;\n        if (contextPanel.Data().itemFromContainer) {\n            InventoryAPI.SetItemSessionPropertyValue(contextPanel.Data().itemFromContainer, 'recent', '1');\n            InventoryAPI.AcknowledgeNewItembyItemID(contextPanel.Data().itemFromContainer);\n            if (ItemInfo.ItemDefinitionNameSubstrMatch(contextPanel.Data().itemFromContainer, 'tournament_journal_')) {\n                $.Schedule(0.2, () => {\n                    UiToolkitAPI.ShowCustomLayoutPopupParameters('', 'file://{resources}/layout/popups/popup_major_hub.xml', 'journalid=' + contextPanel.Data().itemFromContainer);\n                });\n            }\n            else {\n                $.DispatchEvent(\"InventoryItemPreview\", contextPanel.Data().itemFromContainer, '');\n            }\n            CapabilityDecodable.ClosePopUp();\n            const rarityVal = InventoryAPI.GetItemRarity(contextPanel.Data().itemFromContainer);\n            let soundEvent = \"ItemRevealRarityCommon\";\n            if (rarityVal == 4) {\n                soundEvent = \"ItemRevealRarityUncommon\";\n            }\n            else if (rarityVal == 5) {\n                soundEvent = \"ItemRevealRarityRare\";\n            }\n            else if (rarityVal == 6) {\n                soundEvent = \"ItemRevealRarityMythical\";\n            }\n            else if (rarityVal == 7) {\n                soundEvent = \"ItemRevealRarityLegendary\";\n            }\n            else if (rarityVal == 8) {\n                soundEvent = \"ItemRevealRarityAncient\";\n            }\n            $.DispatchEvent(\"CSGOPlaySoundEffect\", soundEvent, \"MOUSE\");\n        }\n        else {\n            _TimeoutPopup();\n        }\n    }\n    function _TimeoutPopup() {\n        CapabilityDecodable.ClosePopUp();\n        UiToolkitAPI.ShowGenericPopupOk($.Localize('#SFUI_SteamConnectionErrorTitle'), $.Localize('#SFUI_InvError_Item_Not_Given'), '', () => { });\n    }\n    function _FillScrollsWithItems(lists) {\n        const numTilesInScroll = 38;\n        const indexItemsFromContainer = 3;\n        const indexStart = (numTilesInScroll - 3);\n        let totalWeight = 0;\n        for (let element of $.GetContextPanel().Data().aItemsInLootlist) {\n            totalWeight += element.weight;\n        }\n        let displayItemsList = [];\n        for (let i = 0; i < numTilesInScroll; i++) {\n            const itemToAdd = GetItemBasedOnDisplayWeight(totalWeight, $.GetContextPanel().Data().aItemsInLootlist);\n            if (itemToAdd)\n                displayItemsList.push(itemToAdd);\n        }\n        for (let element of lists) {\n            const elParent = $.GetContextPanel().FindChildInLayoutFile(element);\n            for (let i = 0; i < displayItemsList.length; i++) {\n                const itemId = displayItemsList[i];\n                const tileId = (i === indexItemsFromContainer) ? 'ItemFromContainer' : (i === indexStart) ? 'ItemStart' : itemId;\n                const elTile = $.CreatePanel('Panel', elParent, tileId);\n                elTile.BLoadLayoutSnippet('ScrollItem');\n                _UpdateScrollTile(element, elTile, itemId);\n            }\n        }\n    }\n    function _UpdateScrollTile(listId, elTile, itemId) {\n        if (listId === 'ScrollListMagnified') {\n            elTile.AddClass('magnified');\n        }\n        itemId = (elTile.id === 'ItemFromContainer' && $.GetContextPanel().Data().itemFromContainer) ? $.GetContextPanel().Data().itemFromContainer : itemId;\n        if ((InventoryAPI.GetItemQuality(itemId) === 3) && $.GetContextPanel().Data().unusualItemImagePath) {\n            _UpdateUnusualItemInfo(elTile, InspectShared.GetPopupSetting('item_id'), $.GetContextPanel().Data().unusualItemImagePath);\n        }\n        else {\n            elTile.FindChildInLayoutFile('ItemImage').itemid = itemId;\n            elTile.FindChildInLayoutFile('JsRarity').style.washColor = InventoryAPI.GetItemRarityColor(itemId);\n            elTile.FindChildInLayoutFile('JItemTint').style.washColor = InventoryAPI.GetItemRarityColor(itemId);\n        }\n    }\n    function GetItemBasedOnDisplayWeight(totalWeight, aItemsInLootlist) {\n        let weightOfItem = 0;\n        const Random = Math.floor(Math.random() * totalWeight);\n        for (let i = 0; i < aItemsInLootlist.length; i++) {\n            weightOfItem += aItemsInLootlist[i].weight;\n            if (Random <= weightOfItem)\n                return aItemsInLootlist[i].id;\n        }\n    }\n    function _SetUpCaseOpeningCountdown() {\n        _UpdateOpeningCounter.SetIsGraffiti(_GetContainerType(InspectShared.GetPopupSetting('item_id')) === 'graffiti');\n        _UpdateOpeningCounter.ShowCounter();\n        _UpdateOpeningCounter.UpdateCounter();\n        _ShowHideLootList(false);\n    }\n    let _UpdateOpeningCounter;\n    (function (_UpdateOpeningCounter) {\n        let counterVal = 6;\n        const elCountdown = $.GetContextPanel().FindChildInLayoutFile('DecodableCountdown');\n        const elCountdownLabel = elCountdown.FindChildInLayoutFile('DecodableCountdownLabel');\n        const elCountdownRadial = elCountdown.FindChildInLayoutFile('DecodableCountdownRadial');\n        let timerHandle = null;\n        let isGraffitiUnseal = false;\n        function UpdateCounter() {\n            timerHandle = null;\n            counterVal = counterVal - 1;\n            if (counterVal === 0) {\n                elCountdown.AddClass('hidden');\n                _ShowInspect($.GetContextPanel());\n            }\n            else {\n                $.DispatchEvent(\"CSGOPlaySoundEffect\", \"container_countdown\", \"MOUSE\");\n                elCountdownLabel.text = String(counterVal);\n                if (!isGraffitiUnseal) {\n                    elCountdownLabel.visible = true;\n                    elCountdownLabel.RemoveClass('popup-countdown-anim');\n                    elCountdownLabel.AddClass('popup-countdown-anim');\n                }\n                else {\n                    elCountdownLabel.visible = false;\n                }\n                elCountdownRadial.RemoveClass('popup-countdown-timer-circle-anim');\n                elCountdownRadial.AddClass('popup-countdown-timer-circle-anim');\n                timerHandle = $.Schedule(1, UpdateCounter);\n            }\n        }\n        _UpdateOpeningCounter.UpdateCounter = UpdateCounter;\n        function ShowCounter() {\n            elCountdown.RemoveClass('hidden');\n        }\n        _UpdateOpeningCounter.ShowCounter = ShowCounter;\n        function CancelTimer() {\n            if (timerHandle) {\n                $.CancelScheduled(timerHandle);\n                timerHandle = null;\n            }\n        }\n        _UpdateOpeningCounter.CancelTimer = CancelTimer;\n        function SetIsGraffiti(isGraffiti) {\n            isGraffitiUnseal = isGraffiti;\n        }\n        _UpdateOpeningCounter.SetIsGraffiti = SetIsGraffiti;\n    })(_UpdateOpeningCounter || (_UpdateOpeningCounter = {}));\n    function _SetUpXrayPanel() {\n        const caseId = InspectShared.GetPopupSetting('item_id');\n        if (!caseId) {\n            return;\n        }\n        const elActionsPanel = $.GetContextPanel().FindChildInLayoutFile('XrayItemsActionPanel');\n        const existingRewardFromXrayId = $.GetContextPanel().Data().existingRewardFromXrayId;\n        elActionsPanel.AddClass('hidden');\n        if (!existingRewardFromXrayId) {\n            elActionsPanel.RemoveClass('hidden');\n            _SetCaseModelImage(caseId, 'PopUpXrayModelOrImage');\n            const elBtn = $.GetContextPanel().FindChildInLayoutFile('ConfirmXray');\n            elBtn.SetPanelEvent('onactivate', _OnActivateXray.bind(undefined, elBtn));\n            $.GetContextPanel().FindChildInLayoutFile('PopUpXrayStatusLabel').text = $.Localize(\"#popup_xray_ready_for_use\");\n        }\n        else if (existingRewardFromXrayId) {\n            InspectHeader.Init();\n            $.GetContextPanel().FindChildInLayoutFile('XrayItemsActionPanelItemName').RemoveClass('hidden');\n            const elImagePanel = $.GetContextPanel().FindChildInLayoutFile('PopUpXrayModelOrImageReveal');\n            if (!elImagePanel.BHasClass('popup-xray-reverse-effect')) {\n                elImagePanel.AddClass('no-anim');\n                elImagePanel.AddClass('popup-xray-reverse-effect');\n                $.GetContextPanel().FindChildInLayoutFile('PopUpXrayModelOrImage').AddClass('hide');\n                _SetCaseModelImage(existingRewardFromXrayId, 'PopUpXrayModelOrImageReveal');\n            }\n            $.GetContextPanel().FindChildInLayoutFile('PopUpXrayStatusLabel').text = $.Localize(\"#popup_xray_already_in_use\");\n            $.GetContextPanel().FindChildInLayoutFile('PopUpXrayStatusDot').AddClass('in-use');\n        }\n        const elXrayPanel = $.GetContextPanel().FindChildInLayoutFile('XrayItemsPanel');\n        elXrayPanel.RemoveClass('hidden');\n        const aPanels = $.GetContextPanel().FindChildInLayoutFile('PopUpXrayBgSquares').Children();\n        _AnimSquares(aPanels);\n    }\n    function _OnActivateXray(elBtn) {\n        const caseId = InspectShared.GetPopupSetting('item_id');\n        InventoryAPI.UseTool(caseId, caseId);\n        elBtn.enabled = false;\n        _XrayReveal();\n        $.DispatchEvent('CSGOPlaySoundEffect', 'XrayStart', 'MOUSE');\n    }\n    function _XrayReveal() {\n        const revealDelay = 3.5;\n        $.GetContextPanel().Data().showInspectScheduleHandle = $.Schedule(revealDelay, _ShowXrayReward);\n        let oData = {\n            clipValue: 0,\n            lineValue: 100,\n            clipPanel: $.GetContextPanel().FindChildInLayoutFile('PopUpXrayModelOrImage'),\n            linePanel: $.GetContextPanel().FindChildInLayoutFile('PopUpXrayModelOrImageRevealLine')\n        };\n        oData.clipPanel.AddClass('popup-xray-inverse-effect');\n        $.GetContextPanel().FindChildInLayoutFile('PopUpXrayModelOrImageReveal').AddClass('popup-xray-reverse-effect');\n        $.Schedule(1, () => {\n            oData.linePanel.visible = true;\n            _AnimClip(oData);\n        });\n    }\n    function _AnimClip(oData) {\n        if (oData.clipValue <= 100) {\n            oData.clipPanel.style.clip = 'rect( 0%, 100%, 100%, ' + oData.clipValue + '% );';\n            oData.clipValue = oData.clipValue + 1;\n            oData.linePanel.style.transform = 'translatex( -' + oData.lineValue + '%);';\n            oData.lineValue = oData.lineValue - 1;\n            $.Schedule(0.02, _AnimClip.bind(undefined, oData));\n        }\n        else {\n            oData.linePanel.AddClass('hide');\n            oData.clipPanel.AddClass('hide');\n            _SetUpPanelElements();\n        }\n    }\n    function _AnimSquares(aPanels) {\n        if ($.GetContextPanel().FindChildInLayoutFile('XrayItemsPanel').visible) {\n            for (let panel of aPanels) {\n                panel.style.backgroundColor = 'rgba(255, 255, 255, 0.0' + Math.ceil(Math.random() * 10) + ');';\n            }\n            $.Schedule(1, _AnimSquares.bind(undefined, aPanels));\n        }\n    }\n    function _ShowXrayReward() {\n        $.GetContextPanel().Data().showInspectScheduleHandle = null;\n        if ($.GetContextPanel().Data().existingRewardFromXrayId) {\n            _SetUpPanelElements();\n        }\n        else {\n            _TimeoutPopup();\n        }\n    }\n    function _UpdateXrayRewardTile(itemId) {\n        const oData = ItemInfo.GetItemsInXray();\n        $.GetContextPanel().Data().existingRewardFromXrayId = itemId === oData.reward ? oData.reward : '';\n        _SetCaseModelImage(itemId, 'PopUpXrayModelOrImageReveal');\n    }\n    function _UpdateScrollResultTile(numericType, type, itemId) {\n        if (type === \"crate_unlock\" ||\n            type === 'graffity_unseal' ||\n            type === 'xray_item_reveal' ||\n            type === \"xray_item_claim\") {\n            if (InspectShared.GetPopupSetting('is_xray_machine')) {\n                let oData = ItemInfo.GetItemsInXray();\n                if (oData.reward && type === 'xray_item_reveal') {\n                    _UpdateXrayRewardTile(itemId);\n                    return;\n                }\n                else if (type === 'xray_item_claim') {\n                    $.GetContextPanel().Data().itemFromContainer = itemId;\n                    _ShowInspect($.GetContextPanel());\n                    return;\n                }\n            }\n            else {\n                $.GetContextPanel().Data().itemFromContainer = itemId;\n            }\n            if ($.GetContextPanel().FindChildInLayoutFile('DecodableItemsScroll').BHasClass('hidden')) {\n                if (type === 'graffity_unseal') {\n                    _ShowInspect($.GetContextPanel());\n                }\n                return;\n            }\n            else {\n                for (let element of $.GetContextPanel().Data().scrollListsPanelIds) {\n                    const elScroll = $.GetContextPanel().FindChildInLayoutFile(element);\n                    const elTile = elScroll.FindChildInLayoutFile('ItemFromContainer');\n                    _UpdateScrollTile(element, elTile, itemId);\n                }\n            }\n        }\n        else if (type === \"ticket_activated\") {\n            $.GetContextPanel().Data().itemFromContainer = itemId;\n            _ShowInspect($.GetContextPanel());\n        }\n    }\n    function _ItemAcquired(ItemId) {\n        $.DispatchEvent(\"CSGOPlaySoundEffect\", \"rename_purchaseSuccess\", \"MOUSE\");\n        const keyId = InspectShared.GetPopupSetting('tool_id');\n        const keyToSellId = InventoryAPI.GetAssociatedItemIdByIndex(InspectShared.GetPopupSetting('item_id'), 0);\n        if (!keyId && keyToSellId) {\n            let matchingKeyDefName = InventoryAPI.GetItemDefinitionName(keyToSellId);\n            if (InventoryAPI.DoesItemMatchDefinitionByName(ItemId, matchingKeyDefName)) {\n                InspectShared.SetPopupSetting('tool_id', ItemId);\n                $.DispatchEvent('HideStoreStatusPanel');\n                _AcknowledgeMatchingKeys(matchingKeyDefName);\n                InspectShared.SetPopupSetting('purchase_item_id', '');\n                _SetUpPanelElements();\n            }\n        }\n        else if (InspectShared.GetPopupSetting('store_item_id')) {\n            ClosePopUp();\n            $.DispatchEvent('ShowAcknowledgePopup', '', ItemId);\n            $.DispatchEvent('HideStoreStatusPanel');\n        }\n    }\n    function _AcknowledgeMatchingKeys(matchingKeyDefName) {\n        const bShouldAcknowledge = true;\n        AcknowledgeItems.GetItemsByType([matchingKeyDefName], bShouldAcknowledge);\n    }\n    function _ShowUnlockAnimation() {\n        const caseId = InspectShared.GetPopupSetting('item_id');\n        const lootListCount = InventoryAPI.GetLootListItemsCount(caseId);\n        if (lootListCount === undefined) {\n            if (InventoryAPI.IsValidItemID($.GetContextPanel().Data().itemFromContainer)) {\n                _ShowInspect($.GetContextPanel());\n            }\n            else {\n                _SetUpCaseOpeningCountdown();\n            }\n            return;\n        }\n        if (lootListCount <= 1) {\n            _SetUpCaseOpeningCountdown();\n        }\n        else {\n            _SetUpCaseOpeningScroll();\n        }\n        _PlayContainerSound(caseId, 'open');\n        _PlayContainerSound(caseId, 'ticker');\n    }\n    function _PlayContainerSound(caseId, soundName) {\n        $.DispatchEvent(\"CSGOPlaySoundEffect\", \"container_\" + _GetContainerType(caseId) + \"_\" + soundName, \"MOUSE\");\n    }\n    function _GetContainerType(caseId) {\n        const itemDefName = InventoryAPI.GetItemDefinitionName(InspectShared.GetPopupSetting('item_id'));\n        if (itemDefName && (itemDefName.indexOf(\"spray\") != -1 || itemDefName.indexOf(\"tournament_pass_\") != -1))\n            return 'graffiti';\n        else if (itemDefName && itemDefName.indexOf(\"sticker\") != -1)\n            return 'sticker';\n        else if (itemDefName && itemDefName.indexOf(\"pins\") != -1)\n            return 'pins';\n        else if (itemDefName && itemDefName.indexOf(\"patch\") != -1)\n            return 'patch';\n        else if (itemDefName && (itemDefName.indexOf(\"coupon\") == 0 || itemDefName.indexOf(\"musickit\") != -1))\n            return 'music';\n        else\n            return 'weapon';\n    }\n    function ClosePopUp() {\n        InventoryAPI.StopItemPreviewMusic();\n        if ($.GetContextPanel().IsValid()) {\n            if ($.GetContextPanel().Data().showInspectScheduleHandle) {\n                $.CancelScheduled($.GetContextPanel().Data().showInspectScheduleHandle);\n                $.GetContextPanel().Data().showInspectScheduleHandle = null;\n            }\n            const elRentalBar = $.GetContextPanel().FindChildInLayoutFile('PopUpInspectRentalBar');\n            const elAsyncActionBarPanel = $.GetContextPanel().FindChildInLayoutFile('PopUpInspectAsyncBar');\n            const elPurchase = $.GetContextPanel().FindChildInLayoutFile('PopUpInspectPurchaseBar');\n            if (!elRentalBar.BHasClass('hidden')) {\n                InspectRentalBar.ClosePopup($.GetContextPanel());\n            }\n            if (!elAsyncActionBarPanel.BHasClass('hidden')) {\n                InspectAsyncActionBar.OnEventToClose();\n            }\n            else if (!elPurchase.BHasClass('hidden')) {\n                InspectPurchaseBar.ClosePopup();\n            }\n        }\n        _UpdateOpeningCounter.CancelTimer();\n    }\n    CapabilityDecodable.ClosePopUp = ClosePopUp;\n    function _Refresh() {\n        const caseId = InspectShared.GetPopupSetting('item_id');\n        if (!caseId || !InventoryAPI.IsValidItemID(caseId)) {\n            ClosePopUp();\n            return;\n        }\n        _SetUpPanelElements();\n    }\n    function UpdateInspectMap() {\n        InspectModelImage.SwitchMap($.GetContextPanel());\n    }\n    CapabilityDecodable.UpdateInspectMap = UpdateInspectMap;\n    function _PlayOpenCaseAnimForRental() {\n        _ShowHideLootList(false);\n        _PlayContainerSound(InspectShared.GetPopupSetting('item_id'), 'open');\n        $.GetContextPanel().Data().elCaseModelImagePanel.TransitionToCamera('cam_case_open', 1.5);\n        $.Schedule(0.75, () => { $.GetContextPanel().Data().elCaseModelImagePanel?.SetAnimgraphBool('open', true); });\n    }\n    CapabilityDecodable._PlayOpenCaseAnimForRental = _PlayOpenCaseAnimForRental;\n    $.RegisterForUnhandledEvent('PanoramaComponent_Inventory_ItemCustomizationNotification', _UpdateScrollResultTile);\n    $.RegisterForUnhandledEvent('PanoramaComponent_Store_PurchaseCompleted', _ItemAcquired);\n    $.RegisterForUnhandledEvent('StartDecodeableAnim', _ShowUnlockAnimation);\n    $.RegisterForUnhandledEvent('StartRentalAnim', _PlayOpenCaseAnimForRental);\n    $.RegisterForUnhandledEvent(\"CSGOInspectBackgroundMapChanged\", UpdateInspectMap);\n    $.RegisterForUnhandledEvent('CSGOShowMainMenu', _Refresh);\n    $.RegisterForUnhandledEvent('PopulateLoadingScreen', ClosePopUp);\n    $.RegisterForUnhandledEvent('OpenInventory', ClosePopUp);\n})(CapabilityDecodable || (CapabilityDecodable = {}));\n","scripts/popups/popup_capability_header.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"popup_inspect_shared.ts\" />\nvar CapabilityHeader;\n(function (CapabilityHeader) {\n    function Init() {\n        let elCapabilityHeaderPanel = $.GetContextPanel().FindChildInLayoutFile('PopUpCapabilityHeader');\n        const itemId = InspectShared.GetPopupSetting('item_id');\n        const worktype = InspectShared.GetPopupSetting('work_type');\n        const storeItemid = InspectShared.GetPopupSetting('store_item_id');\n        if (!worktype && !storeItemid)\n            return;\n        let itemType = '';\n        if (itemId != undefined && itemId != null && itemId !== '') {\n            let itemDefName = InventoryAPI.GetItemDefinitionName(itemId);\n            if (worktype === 'decodeable') {\n                if (itemDefName && itemDefName.indexOf(\"spray\") != -1)\n                    itemType = \"_graffiti\";\n                else if (itemDefName && itemDefName.indexOf(\"tournament_pass_\") != -1)\n                    itemType = \"_fantoken\";\n                else if (InventoryAPI.GetItemAttributeValue(itemId, '{uint32}volatile container'))\n                    itemType = \"_terminal\";\n            }\n            else if (worktype === 'useitem') {\n                if (itemDefName && itemDefName.startsWith('Remove Keychain Tool'))\n                    itemType = \"_getkeychaincharges\";\n            }\n        }\n        elCapabilityHeaderPanel.RemoveClass('hidden');\n        _SetDialogVariables(elCapabilityHeaderPanel, itemId);\n        _SetUpHeaders(elCapabilityHeaderPanel, itemType);\n    }\n    CapabilityHeader.Init = Init;\n    function _SetDialogVariables(elPanel, itemId) {\n        const showXrayMachineUi = InspectShared.GetPopupSetting('is_xray_machine');\n        let displayItemId = '';\n        if (showXrayMachineUi && InventoryAPI.IsFauxItemID($.GetContextPanel().Data().existingRewardFromXrayId)) {\n            displayItemId = $.GetContextPanel().Data().existingRewardFromXrayId;\n        }\n        else {\n            displayItemId = itemId;\n        }\n        elPanel.SetDialogVariable(\"itemname\", InventoryAPI.GetItemNameUncustomized(displayItemId));\n    }\n    function _SetUpHeaders(elPanel, itemType) {\n        _SetUpTitle(elPanel, itemType);\n        _SetUpWarning(elPanel, itemType);\n        _SetUpDesc(elPanel, itemType);\n    }\n    function _SetUpTitle(elPanel, itemType) {\n        let elTitle = elPanel.FindChildInLayoutFile('CapabilityTitle');\n        const itemId = InspectShared.GetPopupSetting('item_id');\n        const inspectOnly = InspectShared.GetPopupSetting('inspect_only');\n        const toolId = InspectShared.GetPopupSetting('tool_id');\n        const showXrayMachineUi = InspectShared.GetPopupSetting('is_xray_machine');\n        const allowXrayPurchase = InspectShared.GetPopupSetting('allow_xray_purchase');\n        const allowXrayClaim = InspectShared.GetPopupSetting('allow_xray_claim');\n        const worktype = _GetWorkType();\n        if (inspectOnly && worktype === 'decodeable') {\n            elTitle.text = '#popup_cartpreview_title';\n        }\n        else if (showXrayMachineUi) {\n            if (allowXrayPurchase || allowXrayClaim) {\n                elTitle.text = \"#popup_xray_claim_title\";\n            }\n            else {\n                elTitle.text = \"#popup_xray_title\";\n            }\n        }\n        else if (worktype === 'decodeable' && InventoryAPI.GetDecodeableRestriction(itemId) === 'xray') {\n            elTitle.text = '#popup_' + worktype + '_xray_title';\n        }\n        else if (!toolId && worktype === 'decodeable') {\n            elTitle.text = '#popup_totool_' + worktype + '_header' + itemType;\n        }\n        else {\n            let defName = InventoryAPI.GetItemDefinitionName(itemId);\n            if (defName === 'casket' && worktype === 'nameable')\n                elTitle.text = '#popup_newcasket_title';\n            else\n                elTitle.text = '#popup_' + worktype + '_title' + itemType;\n        }\n    }\n    function _SetUpWarning(elPanel, itemType) {\n        let elWarn = elPanel.FindChildInLayoutFile('CapabilityWarning');\n        const storeItemId = InspectShared.GetPopupSetting('store_item_id');\n        const itemId = InspectShared.GetPopupSetting('item_id');\n        const showXrayMachineUi = InspectShared.GetPopupSetting('is_xray_machine');\n        const allowRental = InspectShared.GetPopupSetting('allow_rent');\n        const worktype = _GetWorkType();\n        let sWarnLocString = '';\n        if (InspectShared.GetPopupSetting('show_work_type_warning') === false ? false : true) {\n            sWarnLocString = '#popup_' + worktype + '_warning' + itemType;\n        }\n        if (worktype === 'decodeable') {\n            let sRestriction = storeItemId ? '' : InventoryAPI.GetDecodeableRestriction(itemId);\n            if ((sRestriction === 'restricted' && !allowRental) || (sRestriction === 'xray' && showXrayMachineUi)) {\n                sWarnLocString = '#popup_' + worktype + '_err_' + sRestriction;\n                elWarn.AddClass('popup-capability__error');\n            }\n        }\n        const warningText = InspectShared.GetPopupSetting('async_work_type_warning_text');\n        if (warningText) {\n            sWarnLocString = warningText;\n        }\n        elWarn.SetHasClass('hidden', sWarnLocString ? false : true);\n        if (sWarnLocString) {\n            let elWarnLabel = elWarn.FindChildInLayoutFile('CapabilityWarningLabel');\n            elWarnLabel.text = sWarnLocString;\n        }\n    }\n    function _SetUpDesc(elPanel, itemType) {\n        let sDescString = '';\n        const itemId = InspectShared.GetPopupSetting('item_id');\n        const showXrayMachineUi = InspectShared.GetPopupSetting('is_xray_machine');\n        const allowXrayPurchase = InspectShared.GetPopupSetting('allow_xray_purchase');\n        const allowXrayClaim = InspectShared.GetPopupSetting('allow_xray_claim');\n        const inspectOnly = InspectShared.GetPopupSetting('inspect_only');\n        const worktype = _GetWorkType();\n        if (worktype === 'decodeable' && inspectOnly) {\n            sDescString = \"#popup_preview_desc\";\n        }\n        else if (showXrayMachineUi) {\n            if (allowXrayClaim || allowXrayPurchase) {\n                sDescString = \"#popup_xray_claim_desc\";\n            }\n            else {\n                sDescString = '#popup_xray_desc';\n            }\n        }\n        else if ((worktype === 'decodeable') && (InventoryAPI.GetDecodeableRestriction(itemId) === 'xray')) {\n            sDescString = '#popup_' + worktype + '_xray_desc';\n        }\n        else {\n            sDescString = '#popup_' + worktype + '_desc' + itemType;\n        }\n        elPanel.FindChildInLayoutFile('CapabilityDesc').text = sDescString;\n    }\n    function _GetWorkType() {\n        let worktype = InspectShared.GetPopupSetting('work_type');\n        const storeItemId = InspectShared.GetPopupSetting('store_item_id');\n        return storeItemId ? 'purchase' : worktype;\n    }\n})(CapabilityHeader || (CapabilityHeader = {}));\n","scripts/popups/popup_capability_nameable.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../inspect.ts\" />\n/// <reference path=\"popup_inspect_async-bar.ts\" />\n/// <reference path=\"popup_inspect_purchase-bar.ts\" />\n/// <reference path=\"popup_capability_header.ts\" />\n/// <reference path=\"popup_acknowledge_item.ts\" />\n/// <reference path=\"popup_inspect_shared.ts\" />\nvar CapabilityNameable;\n(function (CapabilityNameable) {\n    function Init() {\n        const itemId = InspectShared.GetPopupSetting('item_id');\n        if (ItemInfo.IsWeapon(itemId) || ItemInfo.IsMelee(itemId)) {\n            InspectShared.SetPopupSetting('temp_display_item_id', InventoryAPI.CreateTempCombinedItemWithTool(itemId, _GetNameTagFauxItemID()));\n        }\n        else {\n            InspectShared.SetPopupSetting('temp_display_item_id', itemId);\n        }\n        const defName = InventoryAPI.GetItemDefinitionName(itemId);\n        const contextPanel = $.GetContextPanel();\n        contextPanel.SetHasClass('isstorageunit', (defName === 'casket'));\n        _SetUpPanelElements(contextPanel);\n        $.Schedule(1, () => { contextPanel.FindChildTraverse('NameableTextEntry').SetPanelEvent('ontextentrychange', _OnEntryChanged.bind(undefined, contextPanel)); });\n        $.DispatchEvent('CapabilityPopupIsOpen', true);\n    }\n    CapabilityNameable.Init = Init;\n    ;\n    function _GetNameTagFauxItemID() {\n        const nameTagStoreId = InventoryAPI.GetItemDefinitionIndexFromDefinitionName(\"Name Tag\");\n        const fakeItem = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(nameTagStoreId, 0);\n        return fakeItem;\n    }\n    function _SetItemModel(id) {\n        const elItemModelImagePanel = $.GetContextPanel().FindChildInLayoutFile('PopUpInspectModelOrImage');\n        InspectModelImage.Init(elItemModelImagePanel, id);\n        elItemModelImagePanel.AddClass('popup-inspect-modelpanel_darken');\n        const elNameTagModel = $.GetContextPanel().FindChildInLayoutFile('id-inspect-nametag-model');\n        if (elNameTagModel && elNameTagModel.IsValid()) {\n            elNameTagModel.TransitionToCamera('cam_nametag', 1.0);\n            elNameTagModel.SetItemModel('weapons/models/shared/nametag/nametag_module.vmdl');\n            elNameTagModel.SetItemLabel('');\n        }\n    }\n    ;\n    function _RefreshItemPresentationWithUpdatedName(bNameTagModelVisible, strTextForTempItem) {\n        if (InspectShared.GetPopupSetting('temp_display_item_id') === InspectShared.GetPopupSetting('item_id'))\n            return;\n        const elItemModelImagePanel = $.GetContextPanel().FindChildInLayoutFile('PopUpInspectModelOrImage');\n        if (elItemModelImagePanel && elItemModelImagePanel.IsValid()) {\n            const elItemPanel = elItemModelImagePanel.FindChildInLayoutFile('ItemPreviewPanel');\n            if (elItemPanel && elItemPanel.IsValid()) {\n                elItemPanel.RefreshWeaponItemNameTag(InspectShared.GetPopupSetting('temp_display_item_id'), strTextForTempItem);\n            }\n            if (elItemPanel && elItemPanel.PanZoomEnabled()) {\n                if (bNameTagModelVisible) {\n                    elItemPanel.ResetPanZoom();\n                }\n                else {\n                    elItemPanel.SetFocus();\n                }\n            }\n        }\n        const elNameTagModel = $.GetContextPanel().FindChildInLayoutFile('id-inspect-nametag-model');\n        if (elNameTagModel && elNameTagModel.IsValid()) {\n            elNameTagModel.visible = bNameTagModelVisible;\n        }\n    }\n    function _SetUpPanelElements(contextPanel) {\n        const toolId = InspectShared.GetPopupSetting('tool_id');\n        if (!toolId) {\n            InspectShared.SetPopupSetting('show_work_type_warning', false);\n        }\n        const itemId = InspectShared.GetPopupSetting('item_id');\n        InspectAsyncActionBar.Init();\n        _ShowPurchase(toolId);\n        CapabilityHeader.Init();\n        _SetItemModel(InspectShared.GetPopupSetting('temp_display_item_id'));\n        const noTool = (toolId === '');\n        const hasName = InventoryAPI.HasCustomName(itemId);\n        _SetUpButtonStates(itemId, hasName, noTool, contextPanel);\n        _UpdateAcceptState(false, contextPanel);\n    }\n    ;\n    function _ShowPurchase(toolId) {\n        if (!toolId) {\n            const fakeItem = _GetNameTagFauxItemID();\n            InspectShared.SetPopupSetting('purchase_item_id', fakeItem);\n        }\n        InspectPurchaseBar.Init();\n    }\n    ;\n    function _SetUpButtonStates(itemId, hasName, noTool, contextPanel) {\n        const elAsyncActionBarPanel = contextPanel.FindChildInLayoutFile('PopUpInspectAsyncBar');\n        const elTextEntry = contextPanel.FindChildInLayoutFile('NameableTextEntry');\n        const elValidBtn = contextPanel.FindChildInLayoutFile('NameableValidBtn');\n        const elRemoveBtn = contextPanel.FindChildInLayoutFile('NameableRemoveBtn');\n        InspectAsyncActionBar.EnableDisableOkBtn(elAsyncActionBarPanel, false);\n        elValidBtn.SetHasClass('hidden', noTool);\n        elValidBtn.SetPanelEvent('onactivate', () => {\n            $.DispatchEvent(\"CSGOPlaySoundEffect\", \"rename_select\", \"MOUSE\");\n            InspectAsyncActionBar.EnableDisableOkBtn(elAsyncActionBarPanel, true);\n            elTextEntry.enabled = false;\n            elRemoveBtn.SetHasClass('hidden', false);\n            elValidBtn.SetHasClass('hidden', true);\n            _UpdateAcceptState(true, contextPanel);\n        });\n        elRemoveBtn.SetPanelEvent('onactivate', _RemoveButtonAction.bind(undefined, contextPanel));\n        const RemoveConfirm = contextPanel.FindChildInLayoutFile('NameableRemoveConfirm');\n        RemoveConfirm.SetPanelEvent('onactivate', _OnRemoveConfirm.bind(undefined, itemId));\n        const defName = InventoryAPI.GetItemDefinitionName(itemId);\n        RemoveConfirm.SetHasClass('hidden', !hasName || defName === 'casket' || defName === 'pet');\n        elTextEntry.SetFocus();\n        elTextEntry.SetMaxChars(20);\n        elTextEntry.text = _SetDefaultTextForTextEntry(hasName, itemId, contextPanel);\n    }\n    ;\n    function _RemoveButtonAction(contextPanel) {\n        const elAsyncActionBarPanel = $.GetContextPanel().FindChildInLayoutFile('PopUpInspectAsyncBar');\n        const elTextEntry = contextPanel.FindChildTraverse('NameableTextEntry');\n        const elValidBtn = contextPanel.FindChildInLayoutFile('NameableValidBtn');\n        const elRemoveBtn = contextPanel.FindChildInLayoutFile('NameableRemoveBtn');\n        InspectAsyncActionBar.EnableDisableOkBtn(elAsyncActionBarPanel, false);\n        elTextEntry.enabled = true;\n        elTextEntry.SetFocus();\n        elRemoveBtn.SetHasClass('hidden', true);\n        elValidBtn.SetHasClass('hidden', false);\n        elTextEntry.text = '';\n        const itemId = InspectShared.GetPopupSetting('item_id', contextPanel);\n        const strOriginalItemName = InventoryAPI.HasCustomName(itemId) ? InventoryAPI.GetItemNameCustomized(itemId) : '';\n        if (InspectShared.GetPopupSetting('temp_display_item_id') !== InspectShared.GetPopupSetting('item_id')) {\n            InventoryAPI.SetNameToolString(strOriginalItemName, '');\n            _RefreshItemPresentationWithUpdatedName(true, strOriginalItemName);\n        }\n    }\n    function _SetDefaultTextForTextEntry(hasName, itemId, contextPanel) {\n        const elTextEntry = contextPanel.FindChildTraverse('NameableTextEntry');\n        if (elTextEntry.text !== '') {\n            return elTextEntry.text;\n        }\n        if (!hasName) {\n            return '';\n        }\n        const nameWithQuotes = InventoryAPI.GetItemName(itemId);\n        if (nameWithQuotes && nameWithQuotes.length > 4\n            && nameWithQuotes[0] == \"'\" && nameWithQuotes[1] == \"'\"\n            && nameWithQuotes[nameWithQuotes.length - 1] == \"'\" && nameWithQuotes[nameWithQuotes.length - 2] == \"'\") {\n            return nameWithQuotes.substr(2, nameWithQuotes.length - 4);\n        }\n        else {\n            return nameWithQuotes;\n        }\n    }\n    ;\n    function _OnRemoveConfirm(itemId) {\n        const temp = UiToolkitAPI.ShowGenericPopupOkCancel($.Localize('#popup_nameable_remove_confirm_title'), $.Localize('#tooltip_nameable_remove'), '', () => {\n            InventoryAPI.ClearCustomName(itemId);\n            ClosePopup();\n            $.DispatchEvent('HideSelectItemForCapabilityPopup');\n        }, () => { });\n    }\n    ;\n    function _OnEntryChanged(contextPanel) {\n        const elNameTagModel = contextPanel.FindChildInLayoutFile('id-inspect-nametag-model');\n        if (elNameTagModel && elNameTagModel.IsValid()) {\n            const elTextEntry = contextPanel.FindChildTraverse('NameableTextEntry');\n            elNameTagModel.SetItemLabel(elTextEntry.text);\n            $.DispatchEvent(\"CSGOPlaySoundEffect\", \"rename_teletype\", \"MOUSE\");\n            _UpdateAcceptState(false, contextPanel);\n        }\n    }\n    ;\n    function _UpdateAcceptState(bApplyToItem, contextPanel) {\n        if (InspectShared.GetPopupSetting('temp_display_item_id') === InspectShared.GetPopupSetting('item_id'))\n            bApplyToItem = false;\n        const elTextEntry = contextPanel.FindChildTraverse('NameableTextEntry');\n        const elValidBtn = contextPanel.FindChildInLayoutFile('NameableValidBtn');\n        const isValid = InventoryAPI.SetNameToolString(elTextEntry.text, '');\n        elValidBtn.enabled = isValid;\n        elValidBtn.SetPanelEvent('onmouseover', () => {\n            if (!isValid)\n                UiToolkitAPI.ShowTextTooltip('NameableValidBtn', '#tooltip_nameable_invalid');\n        });\n        elValidBtn.SetPanelEvent('onmouseout', () => {\n            UiToolkitAPI.HideTextTooltip();\n        });\n        if (bApplyToItem) {\n            _RefreshItemPresentationWithUpdatedName(false, elTextEntry.text);\n        }\n    }\n    ;\n    function _NameTagAcquired(nameTagId) {\n        const tool_id = InspectShared.GetPopupSetting('tool_id');\n        if (!tool_id) {\n            if (ItemInfo.IsNameTag(nameTagId)) {\n                InspectShared.SetPopupSetting('tool_id', nameTagId);\n                $.DispatchEvent('HideStoreStatusPanel');\n                InspectShared.SetPopupSetting('purchase_item_id', '');\n                _SetUpPanelElements($.GetContextPanel());\n                _AcknowlegeNameTags();\n            }\n        }\n    }\n    ;\n    function _AcknowlegeNameTags() {\n        const bShouldAcknowledge = true;\n        AcknowledgeItems.GetItemsByType(['name tag'], bShouldAcknowledge);\n    }\n    ;\n    function _UpdateInspectMap() {\n        InspectModelImage.SwitchMap($.GetContextPanel());\n    }\n    function ClosePopup() {\n        const elAsyncActionBarPanel = $.GetContextPanel().FindChildInLayoutFile('PopUpInspectAsyncBar');\n        const elPurchase = $.GetContextPanel().FindChildInLayoutFile('PopUpInspectPurchaseBar');\n        if (!elAsyncActionBarPanel.BHasClass('hidden')) {\n            InspectAsyncActionBar.OnEventToClose();\n        }\n        else if (!elPurchase.BHasClass('hidden')) {\n            InspectPurchaseBar.ClosePopup();\n        }\n    }\n    CapabilityNameable.ClosePopup = ClosePopup;\n    ;\n    $.RegisterForUnhandledEvent('PanoramaComponent_Store_PurchaseCompleted', _NameTagAcquired);\n    $.RegisterForUnhandledEvent('CSGOShowMainMenu', Init);\n    $.RegisterForUnhandledEvent('PopulateLoadingScreen', ClosePopup);\n    $.RegisterForUnhandledEvent(\"CSGOInspectBackgroundMapChanged\", _UpdateInspectMap);\n})(CapabilityNameable || (CapabilityNameable = {}));\n","scripts/popups/popup_casket_operation.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../common/iteminfo.ts\" />\nvar PopupCasketOperations;\n(function (PopupCasketOperations) {\n    let m_strOperation = '';\n    let m_CasketOperationTimeoutScheduledHandle = null;\n    let m_strShowSelectItemForCapabilityPopupCapability = '';\n    let m_numSubjectItems = 1;\n    let m_itemidCasket = '';\n    let m_itemidSubject = '';\n    let m_arrSubjectItemsRemaining = [];\n    function _BIsBatchMode() {\n        if (m_strShowSelectItemForCapabilityPopupCapability && (m_strShowSelectItemForCapabilityPopupCapability === 'batch'))\n            return true;\n        else\n            return false;\n    }\n    ;\n    function SetupPopup() {\n        m_strOperation = $.GetContextPanel().GetAttributeString(\"op\", \"\");\n        $.GetContextPanel().SetDialogVariable(\"title\", $.Localize(\"#popup_casket_title_\" + m_strOperation));\n        m_itemidCasket = $.GetContextPanel().GetAttributeString(\"casket_item_id\", \"\");\n        m_strShowSelectItemForCapabilityPopupCapability = $.GetContextPanel().GetAttributeString(\"nextcapability\", \"\");\n        let itemidsList = $.GetContextPanel().GetAttributeString(\"subject_item_id\", \"\");\n        ConfigurePopupFromItemsList(itemidsList);\n        $.RegisterForUnhandledEvent('PanoramaComponent_Inventory_ItemCustomizationNotification', OnItemCustomizationNotification);\n    }\n    PopupCasketOperations.SetupPopup = SetupPopup;\n    ;\n    function ConfigurePopupFromItemsList(itemidsList) {\n        m_arrSubjectItemsRemaining = itemidsList.split(\",\");\n        m_numSubjectItems = m_arrSubjectItemsRemaining.length;\n        $.GetContextPanel().SetDialogVariableInt(\"count\", m_numSubjectItems);\n        $('#ItemsRemaining').visible = (m_numSubjectItems > 1);\n        $('#PopupButtonRow').visible = _BIsBatchMode() && (m_numSubjectItems > 1);\n        let itemid = m_arrSubjectItemsRemaining.splice(0, 1)[0];\n        m_itemidSubject = itemid;\n        if (!InventoryAPI.GetItemRarityColor(m_itemidSubject)) {\n            PanelTimedOut();\n            return;\n        }\n        let elItem = $(\"#CasketItemPanel\");\n        elItem.SetAttributeString('itemid', itemid);\n        elItem.BLoadLayoutSnippet(\"LootListItem\");\n        elItem.FindChildInLayoutFile('ItemImage').itemid = itemid;\n        elItem.FindChildInLayoutFile('JsRarity').style.backgroundColor = InventoryAPI.GetItemRarityColor(itemid);\n        ItemInfo.GetFormattedName(itemid).SetOnLabel(elItem.FindChildInLayoutFile('JsItemName'));\n        let spinnerVisible = $.GetContextPanel().GetAttributeInt(\"spinner\", 0) !== 0 ? true : false;\n        $(\"#Spinner\").SetHasClass(\"SpinnerVisible\", spinnerVisible);\n        m_CasketOperationTimeoutScheduledHandle = $.Schedule(10, PanelTimedOut);\n        let schOperation = 0.75;\n        if (m_strOperation === 'loadcontents') {\n            schOperation = 0.5;\n        }\n        else if ((m_strOperation === 'add') && m_strShowSelectItemForCapabilityPopupCapability) {\n            schOperation = 0.25;\n        }\n        else if (_BIsBatchMode()) {\n            schOperation = 0.2;\n        }\n        $.Schedule(schOperation, LaunchOperation);\n    }\n    ;\n    var PanelTimedOut = function () {\n        m_CasketOperationTimeoutScheduledHandle = null;\n        $.DispatchEvent('UIPopupButtonClicked', '');\n        UiToolkitAPI.ShowGenericPopupOk($.Localize('#SFUI_SteamConnectionErrorTitle'), $.Localize('#SFUI_Steam_Error_LinkUnexpected'), '', function () {\n        });\n    };\n    var _CancelCasketOperationTimeoutScheduledHandle = function () {\n        if (m_CasketOperationTimeoutScheduledHandle) {\n            $.CancelScheduled(m_CasketOperationTimeoutScheduledHandle);\n            m_CasketOperationTimeoutScheduledHandle = null;\n        }\n    };\n    var _ClosePopUp = function () {\n        $.DispatchEvent('UIPopupButtonClicked', '');\n    };\n    var _TeardownPreviousInventoryCapabilitiesPopup = function () {\n        $.DispatchEvent('ContextMenuEvent', '');\n        $.DispatchEvent('HideSelectItemForCapabilityPopup');\n        $.DispatchEvent('UIPopupButtonClicked', '');\n        $.DispatchEvent('CapabilityPopupIsOpen', false);\n    };\n    function OnRequestCancelBatch() {\n        m_arrSubjectItemsRemaining = [];\n    }\n    PopupCasketOperations.OnRequestCancelBatch = OnRequestCancelBatch;\n    function OnItemCustomizationNotification(numericType, type, itemid) {\n        _CancelCasketOperationTimeoutScheduledHandle();\n        switch (type) {\n            case 'casket_added':\n            case 'casket_removed':\n                if (_BIsBatchMode()) {\n                    if (m_arrSubjectItemsRemaining.length > 0) {\n                        var strItemIDs = m_arrSubjectItemsRemaining.join(\",\");\n                        ConfigurePopupFromItemsList(strItemIDs);\n                    }\n                    else {\n                        _ClosePopUp();\n                    }\n                    return;\n                }\n        }\n        _ClosePopUp();\n        switch (type) {\n            case 'casket_too_full':\n            case 'casket_inv_full':\n                UiToolkitAPI.ShowGenericPopupOk($.Localize('#popup_casket_title_error_' + type), $.Localize('#popup_casket_message_error_' + type), '', function () {\n                });\n                break;\n            case 'casket_added':\n                if (m_strShowSelectItemForCapabilityPopupCapability) {\n                    _TeardownPreviousInventoryCapabilitiesPopup();\n                    $.DispatchEvent('ShowSelectItemForCapabilityPopup', itemid, '', m_strShowSelectItemForCapabilityPopupCapability);\n                }\n                else {\n                    $.DispatchEvent(\"PromptShowSelectItemForCapabilityPopup\", '#popup_casket_title_prompt_bulkstore', '#popup_casket_message_prompt_bulkstore', 'casketstore', itemid, '');\n                }\n                break;\n            case 'casket_removed':\n                _TeardownPreviousInventoryCapabilitiesPopup();\n                if (InventoryAPI.GetItemAttributeValue(itemid, 'items count')) {\n                    $.DispatchEvent('ShowSelectItemForCapabilityPopup', itemid, '', m_strShowSelectItemForCapabilityPopupCapability);\n                }\n                break;\n            case 'casket_contents':\n                $.DispatchEvent('ShowSelectItemForCapabilityPopup', itemid, '', m_strShowSelectItemForCapabilityPopupCapability);\n                break;\n            default:\n                break;\n        }\n    }\n    ;\n    function LaunchOperation() {\n        var nOpRequestNumber = 0;\n        switch (m_strOperation) {\n            case \"add\":\n                nOpRequestNumber = 1;\n                break;\n            case \"remove\":\n                nOpRequestNumber = -1;\n                break;\n        }\n        InventoryAPI.PerformItemCasketTransaction(nOpRequestNumber, m_itemidCasket, m_itemidSubject);\n    }\n})(PopupCasketOperations || (PopupCasketOperations = {}));\n","scripts/popups/popup_commend_player.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\nvar PopupCommendPlayer;\n(function (PopupCommendPlayer) {\n    let m_loadingJob = 0;\n    let m_elStatus = null;\n    let m_elCommend = null;\n    function Init() {\n        m_elStatus = $(\"#id-commend-status\");\n        m_elCommend = $(\"#id-commend\");\n        let xuid = $.GetContextPanel().GetAttributeString(\"xuid\", \"\");\n        $.GetContextPanel().SetDialogVariable(\"target_player\", GameStateAPI.GetPlayerName(xuid));\n        _Update();\n    }\n    PopupCommendPlayer.Init = Init;\n    function _CancelLoading() {\n        m_loadingJob = 0;\n        if (m_elStatus && m_elStatus.IsValid()) {\n            m_elStatus.text = $.Localize('#SFUI_PlayerDetails_Loading_Failed');\n        }\n        m_elCommend.visible = false;\n    }\n    function _ReceivedCommendationFromServer() {\n        if (m_loadingJob) {\n            $.CancelScheduled(m_loadingJob);\n            m_loadingJob = 0;\n        }\n        _Update();\n    }\n    function _Update() {\n        let xuid = $.GetContextPanel().GetAttributeString(\"xuid\", \"\");\n        let bAskedServersForCommendation = GameStateAPI.QueryServersForCommendation(xuid);\n        if (bAskedServersForCommendation) {\n            let numTokens = GameStateAPI.GetCommendationTokensAvailable();\n            if (numTokens == 0) {\n                if (m_elStatus && m_elStatus.IsValid()) {\n                    m_elStatus.text = $.Localize(\"#SFUI_PlayerDetails_NoCommendations_Left\");\n                }\n                m_elCommend.visible = false;\n            }\n            else {\n                if (m_elStatus && m_elStatus.IsValid()) {\n                    m_elStatus.SetDialogVariableInt(\"num_token\", numTokens);\n                    m_elStatus.text = $.Localize(\"#Panorama_PlayerDetails_Commendations_Left:f\", m_elStatus);\n                }\n                m_elCommend.visible = true;\n            }\n            if (m_elCommend.visible) {\n                let oCommends = GameStateAPI.GetMyCommendationsJSOForUser(xuid);\n                if (oCommends['valid']) {\n                    let bHasPrevCommendations = false;\n                    $.GetContextPanel().FindChildInLayoutFile(\"id-commend\").Children().forEach(el => {\n                        let category = el.GetAttributeString(\"data-category\", \"\");\n                        if (oCommends[category]) {\n                            el.checked = true;\n                            bHasPrevCommendations = true;\n                        }\n                    });\n                    if (bHasPrevCommendations) {\n                        m_elStatus.text = $.Localize(\"#SFUI_PlayerDetails_Previously_Submitted\");\n                    }\n                }\n            }\n        }\n        else {\n            m_loadingJob = $.Schedule(10, _CancelLoading);\n            if (m_elStatus && m_elStatus.IsValid()) {\n                m_elStatus.text = $.Localize(\"#SFUI_PlayerDetails_Loading\");\n            }\n            m_elCommend.visible = false;\n        }\n        $(\"#id-commend-submit\").visible = m_elCommend.visible;\n    }\n    function Submit() {\n        let xuid = $.GetContextPanel().GetAttributeString(\"xuid\", \"\");\n        let commendString = \"\";\n        $.GetContextPanel().FindChildInLayoutFile(\"id-commend\").Children().forEach(el => {\n            let category = el.GetAttributeString(\"data-category\", \"\");\n            if (el.checked) {\n                commendString += category + \",\";\n            }\n        });\n        GameStateAPI.SubmitCommendation(xuid, commendString);\n        $.DispatchEvent('UIPopupButtonClicked', '');\n    }\n    PopupCommendPlayer.Submit = Submit;\n    {\n        $.RegisterForUnhandledEvent(\"GameState_CommendPlayerQueryResponse\", _ReceivedCommendationFromServer);\n    }\n})(PopupCommendPlayer || (PopupCommendPlayer = {}));\n","scripts/popups/popup_confirm_picks.js":"'use strict';\n\nvar PopupConfirmPickemPicks = ( function(){\n\n    var m_timeoutHandle = false;\n    var _Init = function()\n    {\n                                                                                      \n        \n        var applyImmediate = $.GetContextPanel()._oPicksData.applyImmediate;\n\n\n        if ( !applyImmediate )\n        {\n            _ShowStickers();\n            _ShowTeams();\n            _ShowAllClearingMsg();\n        }\n        else\n        {\n            _ApplyPicks();\n        }\n\n        $.GetContextPanel().SetHasClass( 'apply-immediate', applyImmediate );\n    };\n\n    var _ShowStickers = function()\n    {\n        var aPicksForConfirm = $.GetContextPanel()._oPicksData.picksforconfirm;\n        var elStickerItemImages = $.GetContextPanel().FindChildInLayoutFile( 'id-popup-confirm-apply' );\n        elStickerItemImages.visible = aPicksForConfirm.length > 0;\n\n        if( aPicksForConfirm.length > 0 )\n        {\n           for( var i = 0; i < aPicksForConfirm.length; i++ )\n           {\n                $.CreatePanel( \n                    \"ItemImage\", \n                    $.GetContextPanel().FindChildInLayoutFile( 'id-popup-confirm-stickers' ), \n                    aPicksForConfirm[i],\n                    {\n                        class:\"popup-confirm-picks-icons__stickers\",\n                        large:\"true\",\n                        scaling:\"stretch-to-fit-preserve-aspect\",\n                        itemid: aPicksForConfirm[i]\n                    } );\n           }\n        }\n    };\n\n    var _ShowTeams = function()\n    {\n        var aTeamIds = $.GetContextPanel()._oPicksData.picksnoitems;\n        var elTeamItemImages = $.GetContextPanel().FindChildInLayoutFile( 'id-popup-confirm-purchase' );\n        elTeamItemImages.visible = aTeamIds.length > 0;\n\n        if( aTeamIds.length > 0 )\n        {\n           for( var i = 0; i < aTeamIds.length; i++ )\n           {\n            var teamTag = PredictionsAPI.GetTeamTag( aTeamIds[i] );    \n            $.CreatePanel( \n                    \"Image\", \n                    $.GetContextPanel().FindChildInLayoutFile( 'id-popup-confirm-teams' ),\n                    aTeamIds[i],\n                    {\n                        textureheight: '52',\n                        texturewidth: '52',\n                        src: 'file://{images}/tournaments/teams/' + teamTag + '.svg',\n                        class:'popup-confirm-picks-icons__teams'\n                    } );\n           }\n        }\n\t};\n\t\n\tvar _ShowAllClearingMsg = function()\n\t{\n\t\tvar aPicksForConfirm = $.GetContextPanel()._oPicksData.picksforconfirm;\n\t\tvar aTeamIds = $.GetContextPanel()._oPicksData.picksnoitems;\n\t\t                                                                       \n\t\tvar elStickerItemImages = $.GetContextPanel().FindChildInLayoutFile( 'id-popup-confirm-clearall' );\n\t\telStickerItemImages.visible = ( aPicksForConfirm.length <= 0 && aTeamIds.length <= 0 );\n\t}\n\n    var _ApplyPicks = function()\n    {\n        $.DispatchEvent( 'CSGOPlaySoundEffect', 'UIPanorama.inventory_new_item_accept', 'MOUSE' );\t\n        $.GetContextPanel().FindChildInLayoutFile( 'id-popup-confrim-apply-btn').enabled = false;\n        $.GetContextPanel().FindChildInLayoutFile( 'id-popup-confirm-spinner' ).RemoveClass('hidden');\n        PredictionsAPI.SetMyPredictionUsingItemID.apply( PredictionsAPI, $.GetContextPanel()._oPicksData.args );\n        $.Schedule( 5, _OnTimeout );\n    };\n\n    var _OnTimeout = function ()\n    {\n        m_timeoutHandle = false;\n\n        $.GetContextPanel().FindChildInLayoutFile( 'id-popup-confirm-spinner' ).AddClass('hidden');\n        _Close();\n\n        UiToolkitAPI.ShowGenericPopupOk(\n\t\t\t$.Localize( '#SFUI_SteamConnectionErrorTitle' ),\n\t\t\t$.Localize( '#pickem_apply_timeout' ),\n\t\t\t'',\n\t\t\tfunction()\n\t\t\t{\n\t\t\t},\n\t\t\tfunction()\n\t\t\t{\n\t\t\t}\n\t\t);\n    };\n\n    var _CancelTimeout= function()\n    {\n        if( m_timeoutHandle )\n        {\n            $.CancelScheduled( m_timeoutHandle );\n            m_timeoutHandle = false;\n        }\n    };\n\n    var _Close = function()\n    {\n        _CancelTimeout();\n        $.DispatchEvent( 'UIPopupButtonClicked', '' );\n    };\n\n\treturn {\n        Init: _Init,\n        ApplyPicks: _ApplyPicks,\n        CancelTimeout: _CancelTimeout,\n        Close: _Close\n\t};\n\n})();\n\n(function(){\n\n    $.RegisterForUnhandledEvent( 'PanoramaComponent_MatchList_PredictionUploaded', PopupConfirmPickemPicks.Close );\n\n})();","scripts/popups/popup_container_open_confirm.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../common/formattext.ts\" />\nvar PopupContainerOpenConfirm;\n(function (PopupContainerOpenConfirm) {\n    function Init() {\n        let itemId = $.GetContextPanel().GetAttributeString('case', '');\n        let actionType = $.GetContextPanel().GetAttributeString('action-type', '');\n        SetImage(itemId);\n        SetWarningText(actionType);\n        $.GetContextPanel().SetHasClass('open-container', actionType === 'open');\n        $.GetContextPanel().SetDialogVariable('name', InventoryAPI.GetItemName(itemId));\n        $.GetContextPanel().SetDialogVariable('title', $.Localize(\"#popup_container_confirm_title_\" + actionType, $.GetContextPanel()));\n        let msg_override = $.GetContextPanel().GetAttributeString('msg_override', '');\n        $.GetContextPanel().SetDialogVariable('body', msg_override ? msg_override : $.Localize(\"#popup_container_confirm_body_\" + actionType, $.GetContextPanel()));\n        let actionBtn = $.GetContextPanel().FindChildInLayoutFile('id-open-confirm-btn');\n        let closeBtn = $.GetContextPanel().FindChildInLayoutFile('id-close-confirm-btn');\n        var callbackHandle = $.GetContextPanel().GetAttributeInt(\"callback\", -1);\n        if (actionType === 'expire') {\n            closeBtn.text = \"#UI_OK\";\n            closeBtn.SetPanelEvent('onactivate', () => {\n                if (callbackHandle != -1) {\n                    UiToolkitAPI.InvokeJSCallback(callbackHandle, '');\n                }\n                $.DispatchEvent('UIPopupButtonClicked', '');\n                $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.mainmenu_press_quit', 'MOUSE');\n            });\n            actionBtn.visible = false;\n            return;\n        }\n        closeBtn.text = \"#UI_Cancel\";\n        closeBtn.SetPanelEvent('onactivate', () => {\n            $.DispatchEvent('UIPopupButtonClicked', '');\n            $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.mainmenu_press_quit', 'MOUSE');\n        });\n        actionBtn.SwitchClass('action-type', actionType === 'open' ? 'Positive' : 'Blue');\n        actionBtn.text = actionType === 'open' ? '#popup_decodable_open_case' : '#popup_decodable_rent_weapons';\n        actionBtn.SetPanelEvent('onactivate', () => {\n            if (callbackHandle != -1) {\n                UiToolkitAPI.InvokeJSCallback(callbackHandle, actionType);\n            }\n            $.DispatchEvent('UIPopupButtonClicked', '');\n        });\n    }\n    PopupContainerOpenConfirm.Init = Init;\n    function SetImage(itemId) {\n        $.GetContextPanel().FindChildInLayoutFile('id-confirm-item-image').itemid = itemId;\n        let reflection = $.GetContextPanel().FindChildInLayoutFile('id-confirm-item-image-ref');\n        $.Schedule(.1, () => reflection.SetImageFromPanel($.GetContextPanel().FindChildInLayoutFile('id-confirm-item-image'), false));\n    }\n    function SetWarningText(actionType) {\n        $.GetContextPanel().FindChildInLayoutFile('id-warning-label').visible = actionType === 'rent';\n        if (actionType === 'rent') {\n            $.GetContextPanel().SetDialogVariable('warning', $.Localize(\"#popup_container_confirm_warning_\" + actionType));\n        }\n    }\n})(PopupContainerOpenConfirm || (PopupContainerOpenConfirm = {}));\n","scripts/popups/popup_crosshair_code.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\nvar PopupCrosshairCode;\n(function (PopupCrosshairCode) {\n    let elTextEntry = $('#Code');\n    let elNotFoundLabel = $('#InvalidCode');\n    let elApplyCode = $('#ApplyCode');\n    function Init() {\n        let elYourCodeBtn = $('#Copy');\n        let code = MyPersonaAPI.GetCrosshairCode();\n        elYourCodeBtn.SetPanelEvent('onmouseover', () => UiToolkitAPI.ShowTextTooltip('Copy', code));\n        elYourCodeBtn.SetPanelEvent('onmouseout', () => UiToolkitAPI.HideTextTooltip());\n        elYourCodeBtn.SetPanelEvent('onactivate', () => {\n            SteamOverlayAPI.CopyTextToClipboard(code);\n            UiToolkitAPI.ShowTextTooltip('Copy', 'Copied your code to clipboard');\n            elTextEntry.text = code;\n        });\n        elApplyCode.enabled = false;\n        elNotFoundLabel.visible = false;\n    }\n    PopupCrosshairCode.Init = Init;\n    function ValidateCode() {\n        let bCodeValid = MyPersonaAPI.BValidateCrosshairCode(elTextEntry.text);\n        elNotFoundLabel.visible = !bCodeValid;\n        elApplyCode.enabled = bCodeValid;\n        return bCodeValid;\n    }\n    function OnTextEntryChange() {\n        ValidateCode();\n    }\n    PopupCrosshairCode.OnTextEntryChange = OnTextEntryChange;\n    function OnEntrySubmit() {\n        let bSuccess = MyPersonaAPI.BApplyCrosshairCode(elTextEntry.text);\n        if (bSuccess) {\n            $.DispatchEvent('RefreshSettingsPanels');\n            $.DispatchEvent('UIPopupButtonClicked', '');\n        }\n        else {\n            ValidateCode();\n        }\n    }\n    PopupCrosshairCode.OnEntrySubmit = OnEntrySubmit;\n})(PopupCrosshairCode || (PopupCrosshairCode = {}));\n","scripts/popups/popup_custom_layout.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\nvar PopupCustomLayout;\n(function (PopupCustomLayout) {\n    let g_sWatchEvent;\n    let g_nWatchEventHandlerId;\n    function CleanupWatchEvent() {\n        if (g_sWatchEvent !== undefined && g_nWatchEventHandlerId !== undefined) {\n            $.UnregisterForUnhandledEvent(g_sWatchEvent, g_nWatchEventHandlerId);\n        }\n        g_sWatchEvent = undefined;\n        g_nWatchEventHandlerId = undefined;\n    }\n    function Init() {\n        const oSettings = $.GetContextPanel().Data().oSettings;\n        $.GetContextPanel().SetHasClass('HideTitle', oSettings.title === undefined || oSettings.title === null || oSettings.title === '');\n        $.GetContextPanel().SetDialogVariable(\"title\", oSettings.title);\n        $.GetContextPanel().SetDialogVariable(\"message\", oSettings.message);\n        $.GetContextPanel().SetHasClass('NoMinWidth', oSettings.no_min_width);\n        $(\"#popupimage\").SetImage(oSettings.image);\n        $(\"#Spinner\").SetHasClass(\"SpinnerVisible\", oSettings.show_spinner != 0);\n        if (oSettings.show_loading_bar) {\n            let progressBar = $(\"#ProgressBar\");\n            progressBar.SetHasClass(\"ProgressBarVisible\", true);\n            progressBar.min = 0.0;\n            progressBar.max = 1.0;\n            progressBar.value = 0.0;\n            $.Schedule(0.1, UpdateProgressBar);\n        }\n        if (oSettings.timeout > 0) {\n            $.Schedule(oSettings.timeout, () => {\n                CleanupWatchEvent();\n                $.DispatchEvent('UIPopupButtonClicked', '');\n            });\n        }\n        $.GetContextPanel().SetHasClass('HideButtons', oSettings.hide_buttons);\n        if (oSettings.watch_event && oSettings.watch_event_callback) {\n            const sWatchEvent = oSettings.watch_event;\n            const nCallbackHandle = oSettings.watch_event_callback;\n            CleanupWatchEvent();\n            g_sWatchEvent = sWatchEvent;\n            g_nWatchEventHandlerId = $.RegisterForUnhandledEvent(sWatchEvent, () => {\n                CleanupWatchEvent();\n                UiToolkitAPI.InvokeJSCallback(nCallbackHandle);\n                OnOKPressed();\n            });\n        }\n    }\n    PopupCustomLayout.Init = Init;\n    ;\n    function OnOKPressed() {\n        CleanupWatchEvent();\n        let callbackHandle = $.GetContextPanel().GetAttributeInt(\"callback\", -1);\n        if (callbackHandle != -1) {\n            UiToolkitAPI.InvokeJSCallback(callbackHandle, 'OK');\n        }\n        $.DispatchEvent('UIPopupButtonClicked', '');\n    }\n    function UpdateProgressBar() {\n        let loadingBarCallbackHandle = $.GetContextPanel().GetAttributeInt(\"loadingBarCallback\", -1);\n        if (loadingBarCallbackHandle != -1) {\n            $(\"#ProgressBar\").value = UiToolkitAPI.InvokeJSCallback(loadingBarCallbackHandle);\n            $.Schedule(0.1, UpdateProgressBar);\n        }\n    }\n    {\n    }\n})(PopupCustomLayout || (PopupCustomLayout = {}));\n","scripts/popups/popup_custom_layout_test.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\nfunction SetupPopup() {\n    var strPopupValue = $.GetContextPanel().GetAttributeString(\"popupvalue\", \"(not found)\");\n    $.GetContextPanel().SetDialogVariable(\"popupvalue\", strPopupValue);\n}\nfunction OnOKPressed() {\n    var callbackHandle = $.GetContextPanel().GetAttributeInt(\"callback\", -1);\n    if (callbackHandle != -1) {\n        UiToolkitAPI.InvokeJSCallback(callbackHandle, 'OK');\n    }\n    $.DispatchEvent('UIPopupButtonClicked', '');\n}\n","scripts/popups/popup_custom_layout_test_image.js":"\"use strict\";\n\nvar SetupPopup = function()\n{\n                      \n    var strMsg = $.GetContextPanel().GetAttributeString( \"message\", \"(not found)\" );\n    $.GetContextPanel().SetDialogVariable( \"message\", strMsg );\n\n                    \n    $( \"#popupimage\" ).SetImage( $.GetContextPanel().GetAttributeString( \"image\", \"\" ) );\n\n                             \n    var spinnerVisible = $.GetContextPanel().GetAttributeInt( \"spinner\", 0 );\n    $( \"#Spinner\" ).SetHasClass( \"SpinnerVisible\", spinnerVisible );\n\n                                                             \n    var loadingBarCallbackHandle = $.GetContextPanel().GetAttributeInt( \"loadingBarCallback\", -1 );\n    if ( loadingBarCallbackHandle != -1 )\n    {\n                                                 \n        var progressBar = $( \"#ProgressBar\" );\n        progressBar.SetHasClass( \"ProgressBarVisible\", true );\n                                                          \n        progressBar.min = 0.0;\n        progressBar.max = 1.0;\n        progressBar.value = 0.0;\n                                                  \n        $.Schedule( 0.1, UpdateProgressBar );\n    }\n};\n\nfunction OnOKPressed()\n{\n                       \n                                                                      \n    \n                                                          \n    var callbackHandle = $.GetContextPanel().GetAttributeInt( \"callback\", -1 );\n    if ( callbackHandle != -1 )\n    {\n        UiToolkitAPI.InvokeJSCallback( callbackHandle, 'OK' );\n    }\n    \n                                                                          \n                                        \n    $.DispatchEvent( 'UIPopupButtonClicked', '' );\n}\n\nfunction UpdateProgressBar()\n{\n    var loadingBarCallbackHandle = $.GetContextPanel().GetAttributeInt( \"loadingBarCallback\", -1 );\n    if ( loadingBarCallbackHandle != -1 )\n    {\n        $( \"#ProgressBar\" ).value = UiToolkitAPI.InvokeJSCallback( loadingBarCallbackHandle );\n        \n                             \n        $.Schedule( 0.1, UpdateProgressBar );\n    }\n}","scripts/popups/popup_directchallenge_join.js":"\"use strict\";\n\t\n\nvar DirectChallengeJoin = ( function ()\n{\n\tvar m_submitFn = null;\n\tvar m_elErrortext = $.GetContextPanel().FindChildInLayoutFile( 'id-error_text' );\n\n\tfunction _Init()\n\t{\n\t\t$.GetContextPanel().SetDialogVariable( 'text', $.Localize( '#DirectChallenge_EnterKeyField2' ) );\n\n\t\tm_submitFn = parseInt( $.GetContextPanel().GetAttributeInt( \"submitCallback\", -1 ) );\n\n\t\t$( \"#submit\" ).enabled = false;\n\t\t$( '#TextEntry' ).SetPanelEvent( 'ontextentrychange', OnTextEntryChanged );\n\t\tOnTextEntryChanged();\n\t\t$( '#TextEntry' ).SetFocus();\n\t}\n\n\tfunction OnTextEntryChanged ()\n\t{\n\t\t                                                \n\n\t\t                          \n\t\tvar hasText = /.*\\S.*/;\n\t\tif ( !hasText.test( $( '#TextEntry' ).text ) )\n\t\t{\n\t\t\t_Validate();\n\t\t\treturn;\n\t\t}\n\n\t\t                                                                 \n\t\tvar arrStrings = $( '#TextEntry' ).text.split( /\\s/ ).filter( s => /^\\w+$/.test( s ) );\n\t\t_Validate();\n\n\t}\n\n\tfunction _Submit()\n\t{\n\t\tvar value = $( '#TextEntry' ).text;\n\n\t\tUiToolkitAPI.InvokeJSCallback( m_submitFn, value );\n\t\t_Close();\n\t}\n\n\tfunction _IsChallengeKeyValid ( key, oReturn = { value: [] }, how = '' )\n\t{\n\t\tvar code = CompetitiveMatchAPI.ValidateDirectChallengeCode( key, how );\n\n\t\tvar bValid = ( typeof code === 'string' ) && code.includes( ',' );\n\n\t\tif ( bValid )\n\t\t{\n\t\t\toReturn.value = code.split( ',' );\n\t\t}\n\n\t\treturn bValid;\n\t}\n\n\tfunction _IsPartOfGroup ( groupId )\n\t{\n\t\tvar nNumClans = MyPersonaAPI.GetMyClanCount();\n\t\tfor ( var i = 0; i < nNumClans; i++ )\n\t\t{\n\t\t\t                                                   \n\t\t\tvar clanId32 = MyPersonaAPI.GetMyClanId32BitByIndex( i );\n\n\t\t\tif ( groupId === clanId32 )\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\tfunction _Validate ()\n\t{\n\t\tvar elResultsPanel = $( \"#validation-result\" );\n\t\tif ( elResultsPanel && elResultsPanel.IsValid() )\n\t\t{\n\t\t\telResultsPanel.RemoveAndDeleteChildren();\n\t\t}\n\n\t\tvar bSuccess = false;\n\t\tvar elAvatarContainer = $.CreatePanel( 'Panel', elResultsPanel, 'avatar-container', { class: 'avatar-container' } );\n\n\t\tvar value = $( '#TextEntry' ).text;\n\t\tvar oReturn = { value: [] };\n\n\t\tif ( _IsChallengeKeyValid( value.toUpperCase(), oReturn, '' ) )\n\t\t{\n\t\t\t                             \n\t\t\tvar type = oReturn.value[ 2 ];                           \n\t\t\tvar id = oReturn.value[ 3 ];                                 \n\t\t\tvar id32 = parseInt( oReturn.value[ 4 ] );                                 \n\n\t\t\tvar elTile = $.CreatePanel( \"Panel\", elAvatarContainer, 'JsKeyValidatedResult', { class: \"directchallenge__join-validator\" } );\n\t\t\telTile.codeXuid = id;\n\t\t\telTile.codeType = type ;\n\n\t\t\telTile.SetAttributeString( 'xuid', id );\n\t\t\telTile.BLoadLayout( 'file://{resources}/layout/friendtile.xml', false, false );\n\t\t\t$.GetContextPanel().FindChildInLayoutFile( 'id-direct-challenge-icon' ).SetHasClass( 'valid', true );\n\n\t\t\t                                               \n\t\t\tif ( type == 'g' )\n\t\t\t{\n\t\t\t\telTile.SetAttributeString( 'isClan', 'true' );\n\n\t\t\t\t$.CreatePanel( \"Image\", elTile.FindChildInLayoutFile( 'JsFriendTileBtn' ), '', {\n\t\t\t\t\tsrc: \"file://{images}/icons/ui/link.svg\",\n\t\t\t\t\tclass: \"vertical-center left-padding right-padding horizontal-align-right\",\n\t\t\t\t\ttextureheight: \"24\",\n\t\t\t\t\ttexturewidth: \"24\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t                                                                \n\t\t\t$.Schedule( .1, function ()\n\t\t\t{\n\t\t\t\tif ( !elTile.IsValid() )\n\t\t\t\t\treturn;\n\t\t\t\tFriendTile.Init( elTile );\n\t\t\t\telTile.RemoveClass( 'hidden' );\n\t\t\t} );\n\n\t\t\t                                              \n\t\t\tif ( type == 'g' && !_IsPartOfGroup( id32 ) )\n\t\t\t{\n\t\t\t\tbSuccess = false;\n\t\t\t\tm_elErrortext.visible = true;\n\t\t\t\tm_elErrortext.text = $.Localize( \"#DirectChallenge_not_member2\" );\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbSuccess = true;\n\t\t\t\tm_elErrortext.visible = false;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\n\t\t\tm_elErrortext.visible = $( '#TextEntry' ).text === '' ? false : true;\n\n\t\t\t$.GetContextPanel().FindChildInLayoutFile( 'id-direct-challenge-icon' ).SetHasClass( 'valid', false );\n\t\t\t\n\t\t\t                          \n\t\t\tm_elErrortext.SetDialogVariable( 'code', $( '#TextEntry' ).text.toUpperCase() );\n\t\t\tm_elErrortext.text = $.Localize( '#DirectChallenge_BadKeyText', m_elErrortext );\n\t\t}\n\n\t\t$( \"#submit\" ).enabled = bSuccess;\n\t\t$.GetContextPanel().SetHasClass( 'results-panel-valid', bSuccess );\n\t}\n\n\tfunction _Cancel ()\n\t{\n\t\t_Close();\n\t}\n\n\tfunction _Close ()\n\t{\n\t\tif ( m_submitFn != -1 )\n\t\t\tUiToolkitAPI.UnregisterJSCallback( m_submitFn );\n\t\t\n\t\t$.DispatchEvent( 'UIPopupButtonClicked', '' );\n\t}\n\n\treturn {\n\t\tInit: \t\t\t\t\t_Init,\n\t\tSubmit:\t\t\t\t\t_Submit,\n\t\tClose: \t\t\t\t\t_Close,\n\t\tCancel: \t\t\t\t_Cancel,\n\t\tValidate: \t\t\t\t_Validate,\n\t};\n\n} )();\n\n                                                                                                    \n                                            \n                                                                                                    \n( function ()\n{\n} )();","scripts/popups/popup_directchallenge_steamgroups.js":"\"use strict\";\n\t\n\nvar DirectChallengeSteamGroupSelector = ( function ()\n{\n\tvar m_key;\n\n\tfunction _Init()\n\t{\n\t\tm_key = $.GetContextPanel().GetAttributeString( 'currentkey', '' );\n\n\t\t$( \"#submit\" ).enabled = m_key != '';\n\n\t\tvar elClansLister = $.GetContextPanel().FindChildTraverse( 'JsClansLister' );\n\n\t\tvar nNumClans = MyPersonaAPI.GetMyClanCount();\n\t\tfor ( var i = 0; i < nNumClans; i++ )\n\t\t{\n\t\t\t                                                   \n\t\t\tvar clanID32 = MyPersonaAPI.GetMyClanId32BitByIndex( i );\n\t\t\tvar clanChallengeKey = CompetitiveMatchAPI.GetDirectChallengeCodeForClan( clanID32 );\n\t\t\tvar clanName = FriendsListAPI.GetClanInfoById32Bit( clanID32, 'name' );\n\n\t\t\tvar elItem = $.CreatePanel( 'RadioButton', elClansLister, 'clan_' + clanID32, { group: 'clans'} );\n\t\t\telItem.BLoadLayoutSnippet( 'snippet-clan-item' );\n\t\t\telItem.AddClass( 'clan-item' );\n\t\t\telItem.SetDialogVariable( 'clan-name', clanName );\n\t\t\telItem.SetPanelEvent( 'onactivate', function ( clanChallengeKey )\n\t\t\t{\n\t\t\t\t$( \"#submit\" ).enabled = true;\n\t\t\t\tm_key = clanChallengeKey;\n\n\t\t\t}.bind( this, clanChallengeKey ) );\n\t\t\t\n\t\t\tif ( clanChallengeKey == m_key )\n\t\t\t{\n\t\t\t\telItem.checked = true;\n\t\t\t}\n\n\t\t\tvar elAvatar = elItem.FindChildTraverse( \"id-clan__avatar\" );\n\t\t\telAvatar.PopulateFromSteamID( FriendsListAPI.GetClanInfoById32Bit( clanID32, 'steamid' ) );\n\t\t}\n\n\t\t$.GetContextPanel().SetFocus();\n\t}\n\n\tfunction _Submit()\n\t{\n\t\t$.DispatchEvent( 'DirectChallenge_ClanChallengeKeySelected', m_key );\n\t\t_Close();\n\t}\n\n\n\tfunction _Cancel ()\n\t{\n\t\t_Close();\n\t}\n\n\tfunction _Close ()\n\t{\n\t\t$.DispatchEvent( 'UIPopupButtonClicked', '' );\n\t}\n\n\tfunction _Create()\n\t{\n\t\tSteamOverlayAPI.OpenUrlInOverlayOrExternalBrowser( \"https://\" + SteamOverlayAPI.GetSteamCommunityURL() + \"/actions/GroupCreate\" );\n\t}\n\n\treturn {\n\t\tInit: _Init,\n\t\tSubmit: _Submit,\n\t\tClose: _Close,\n\t\tCancel: _Cancel,\n\t\tCreate: _Create,\n\t};\n\n} )();\n\n                                                                                                    \n                                            \n                                                                                                    \n( function ()\n{\n  \t                                                                                                                  \n} )();","scripts/popups/popup_hud_edge_positions.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../common/async.ts\" />\nvar HudEdgePositions;\n(function (HudEdgePositions) {\n    const m_CP = $.GetContextPanel();\n    const m_Edge = $('#HudEdge');\n    const m_XSlider = $('#HudEdgeX');\n    const m_YSlider = $('#HudEdgeY');\n    async function Init() {\n        m_XSlider.OnShow();\n        m_YSlider.OnShow();\n        await Async.NextFrame();\n        HudEdgePositions.Update();\n    }\n    HudEdgePositions.Init = Init;\n    function Update() {\n        const height = m_CP.actuallayoutheight / m_CP.actualuiscale_y;\n        const width = m_CP.actuallayoutwidth / m_CP.actualuiscale_x;\n        const minHeight = m_YSlider.actualvalue * height;\n        m_XSlider.min = minHeight / width;\n        if (m_XSlider.actualvalue < m_XSlider.min)\n            m_XSlider.actualvalue = m_XSlider.min;\n        m_XSlider.min = Math.max(m_XSlider.min, OptionsMenuAPI.GetHudSafeZoneXMin());\n        m_Edge.style.margin = `${(1 - m_YSlider.actualvalue) * 100 / 2}% ${(1 - m_XSlider.actualvalue) * 100 / 2}%`;\n    }\n    HudEdgePositions.Update = Update;\n    ;\n})(HudEdgePositions || (HudEdgePositions = {}));\n","scripts/popups/popup_inspect_action-bar.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../common/item_context_entries.ts\" />\n/// <reference path=\"../inspect.ts\" />\n/// <reference path=\"../characterbuttons.ts\" />\n/// <reference path=\"../common/shopping_cart.ts\" />\nvar InspectActionBar;\n(function (InspectActionBar) {\n    function Init() {\n        const elActionBar = $.GetContextPanel().FindChildInLayoutFile('PopUpInspectActionBar');\n        if (!InspectShared.GetPopupSetting('inspect_only')) {\n            elActionBar.AddClass('hidden');\n            return;\n        }\n        elActionBar.Data().schfnMusicMvpPreviewEnd = null;\n        elActionBar.Data().previewingMusic = false;\n        elActionBar.RemoveClass('hidden');\n        elActionBar.Data().panelRegisteredForEvents = false;\n        const itemId = InspectShared.GetPopupSetting('item_id');\n        _SetUpItemCertificate(elActionBar, itemId);\n        _SetupEquipItemBtns(elActionBar, itemId);\n        _ShowButtonsForWeaponInspect(elActionBar, itemId);\n        _ShowButtonsForCharacterInspect(elActionBar, itemId);\n        _SetCloseBtnAction(elActionBar, $.GetContextPanel());\n        _SetUpMarketLink(elActionBar, itemId);\n        _SetUpOpenSeasonStatsAction(elActionBar, $.GetContextPanel(), itemId);\n        _SetUpViewHighlightReelAction(elActionBar, itemId);\n        const nPrice = InspectShared.GetPopupSetting('price_in_tokens');\n        _SetupAddRemoveToCartButtons(elActionBar, itemId, nPrice);\n        _SetupCartActionsBtn(elActionBar, nPrice, itemId);\n        _ShowHideCartBtn(elActionBar, nPrice);\n        _ShowHideFavoriteBtn($.GetContextPanel(), elActionBar, nPrice);\n        if (!elActionBar.Data().panelRegisteredForEvents) {\n            elActionBar.Data().panelRegisteredForEvents = true;\n            $.RegisterForUnhandledEvent('PanoramaComponent_Loadout_EquipSlotChanged', () => _SetupEquipItemBtns(elActionBar, itemId));\n        }\n        if (nPrice) {\n            $.RegisterForUnhandledEvent('PanoramaComponent_Store_VolatileShopSubscribe', (...args) => { _OnVolatileShopSubscribe(...args, elActionBar); });\n            _EnsureVolatileShopSubscribed($.GetContextPanel());\n        }\n        const contentPanel = $.GetContextPanel();\n        elActionBar.FindChildInLayoutFile('InspectPlayMvpBtn').SetPanelEvent('onactivate', () => InspectPlayMusic('mvp', contentPanel));\n        const category = InventoryAPI.GetLoadoutCategory(itemId);\n        if (category == \"musickit\") {\n            InventoryAPI.PlayItemPreviewMusic(itemId, '');\n            elActionBar.Data().previewingMusic = true;\n            const elMusicBtn = elActionBar.FindChildInLayoutFile('InspectPlayMvpBtn');\n            elMusicBtn.SetHasClass('hidden', (InventoryAPI.GetItemRarity(itemId) <= 0));\n        }\n        const bisItemInLootlist = InspectShared.GetPopupSetting('is_item_in_lootlist');\n        elActionBar.FindChildInLayoutFile('InspectWeaponBtn').checked =\n            (!elActionBar.FindChildInLayoutFile('InspectCharBtn').checked &&\n                !elActionBar.FindChildInLayoutFile('LookatWeaponBtn').checked) ||\n                bisItemInLootlist;\n        if (bisItemInLootlist) {\n            $.DispatchEvent(\"Activated\", elActionBar.FindChildInLayoutFile('InspectWeaponBtn'), \"mouse\");\n        }\n    }\n    InspectActionBar.Init = Init;\n    function _EnsureVolatileShopSubscribed(cp) {\n        if (!cp || !cp.IsValid())\n            return;\n        if (cp.Data().refreshSubscriptionHandle) {\n            $.CancelScheduled(cp.Data().refreshSubscriptionHandle);\n            cp.Data().refreshSubscriptionHandle = null;\n        }\n        g_ActiveTournamentDynamicContainers.forEach((id) => StoreAPI.VolatileShopSubscribe(id, true));\n        cp.Data().refreshSubscriptionHandle = $.Schedule(150, () => _EnsureVolatileShopSubscribed(cp));\n    }\n    function _OnVolatileShopSubscribe(nContainerDef, bNewPricesParsed, elActionBar) {\n        const nPrice = InspectShared.GetPopupSetting('price_in_tokens');\n        const itemId = InspectShared.GetPopupSetting('item_id');\n        _SetupAddRemoveToCartButtons(elActionBar, itemId, nPrice);\n        _SetupCartActionsBtn(elActionBar, nPrice, itemId);\n        _ShowHideCartBtn(elActionBar, nPrice);\n        _ShowHideFavoriteBtn($.GetContextPanel(), elActionBar, nPrice);\n    }\n    function _SetUpItemCertificate(elPanel, id) {\n        const elCert = elPanel.FindChildInLayoutFile('InspectItemCert');\n        if (!elCert || !elCert.IsValid()) {\n            return;\n        }\n        const certData = InventoryAPI.GetItemCertificateInfo(id);\n        if (!certData || InspectShared.GetPopupSetting('hide_item_cert')) {\n            elCert.visible = false;\n            return;\n        }\n        const aCertData = certData.split(\"\\n\");\n        let strLine = \"\";\n        for (let i = 0; i < aCertData.length - 1; i++) {\n            if (i % 2 == 0) {\n                strLine = strLine + \"<b>\" + aCertData[i] + \"</b>\" + \": \" + aCertData[i + 1] + \"<br><br>\";\n            }\n        }\n        elCert.visible = true;\n        elCert.SetPanelEvent('onmouseover', () => UiToolkitAPI.ShowTextTooltip('InspectItemCert', strLine));\n        elCert.SetPanelEvent('onmouseout', () => UiToolkitAPI.HideTextTooltip());\n    }\n    function _SetUpMarketLink(elPanel, id) {\n        const elMarketLinkBtn = elPanel.FindChildInLayoutFile('InspectMarketLink');\n        const bMarketLink = InspectShared.GetPopupSetting('show_market_link');\n        elMarketLinkBtn.SetHasClass('hidden', !bMarketLink);\n        if (!bMarketLink) {\n            return;\n        }\n        elMarketLinkBtn.SetPanelEvent('onmouseover', () => UiToolkitAPI.ShowTextTooltip('InspectMarketLink', '#SFUI_Store_Market_Link'));\n        elMarketLinkBtn.SetPanelEvent('onmouseout', () => UiToolkitAPI.HideTextTooltip());\n        elMarketLinkBtn.SetPanelEvent('onactivate', () => {\n            SteamOverlayAPI.OpenURL(ItemInfo.GetMarketLinkForLootlistItem(id));\n        });\n    }\n    function _SetUpOpenSeasonStatsAction(elPanel, contextPanel, id) {\n        if (InspectShared.GetPopupSetting('hide_all_action_items'))\n            return;\n        const elOpenSeasonPanel = elPanel.FindChildInLayoutFile('OpenSeasonStats');\n        if (ItemInfo.ItemDefinitionNameStartsWith(id, 'premier season coin')) {\n            const season = InventoryAPI.GetItemAttributeValue(id, 'premier season');\n            elOpenSeasonPanel.SetPanelEvent('onactivate', () => {\n                UiToolkitAPI.ShowCustomLayoutPopupParameters('id-popup-season-stats', 'file://{resources}/layout/popups/popup_season_stats.xml', 'seasonid=' + season + '&' +\n                    'itemid=' + id);\n                CloseBtnAction(_GetSettingCallback(contextPanel), elPanel);\n            });\n            $.DispatchEvent('ContextMenuEvent', '');\n            elOpenSeasonPanel.SetHasClass('hidden', false);\n        }\n    }\n    function _SetUpViewHighlightReelAction(elPanel, id) {\n        const reelId = InventoryAPI.GetItemAttributeValue(id, '{uint32}keychain slot 0 highlight');\n        if (!reelId)\n            return;\n        const elViewHighlightReelAction = elPanel.FindChildInLayoutFile('ViewHighlightReelAction');\n        const fnPopupVideoClip = () => {\n            UiToolkitAPI.ShowCustomLayoutPopupParameters('popup-videoclip-' + reelId, 'file://{resources}/layout/popups/popup_videoclip.xml', 'reelid=' + reelId + '&' +\n                'itemid=' + id);\n        };\n        elViewHighlightReelAction.SetPanelEvent('onactivate', fnPopupVideoClip);\n        elViewHighlightReelAction.SetHasClass('hidden', false);\n        if (ItemInfo.IsKeychain(id)) {\n            $.Schedule(0.0001, fnPopupVideoClip);\n        }\n    }\n    function _SetupEquipItemBtns(elPanel, id) {\n        const elMoreActionsBtn = elPanel.FindChildInLayoutFile('InspectActionsButton');\n        const contextPanel = $.GetContextPanel();\n        elMoreActionsBtn.SetPanelEvent('onactivate', () => ShowContextMenu(contextPanel));\n        const elSingleActionBtn = elPanel.FindChildInLayoutFile('SingleAction');\n        if (InspectShared.GetPopupSetting('is_inside_casket')) {\n            elMoreActionsBtn.AddClass('hidden');\n            elSingleActionBtn.RemoveClass('hidden');\n            elSingleActionBtn.text = !InspectShared.GetPopupSetting('is_selected') ? '#UI_Select' : '#UI_Unselect';\n            elSingleActionBtn.SetPanelEvent('onactivate', () => _OnActivateUpdateSelectionForMultiSelect(id, contextPanel));\n            return;\n        }\n        if (InspectShared.GetPopupSetting('hide_all_action_items')) {\n            elMoreActionsBtn.AddClass('hidden');\n            elSingleActionBtn.AddClass('hidden');\n            _TrySetUpSingleActionPreviewBtn(elPanel, id);\n            return;\n        }\n        const isFanToken = ItemInfo.ItemDefinitionNameSubstrMatch(id, 'tournament_pass_');\n        const isStickerDisplaySleeve = InventoryAPI.DoesItemMatchDefinitionByName(id, 'sticker_display_case');\n        const isSticker = ItemInfo.IsSticker(id);\n        const isPatch = ItemInfo.IsPatch(id);\n        const isKeychain = ItemInfo.IsKeychain(id);\n        const isSpraySealed = ItemInfo.IsSpraySealed(id);\n        const bCloseInspectOnSingleAction = (isSticker || isSpraySealed || isFanToken || isPatch || isKeychain || isStickerDisplaySleeve);\n        let isEquipped = InventoryAPI.IsEquipped(id, 't') || InventoryAPI.IsEquipped(id, 'ct') || InventoryAPI.IsEquipped(id, \"noteam\");\n        isEquipped ||= ItemInfo.IsPet(id);\n        if (ItemInfo.IsEquippalbleButNotAWeapon(id) ||\n            bCloseInspectOnSingleAction ||\n            isEquipped) {\n            elMoreActionsBtn.AddClass('hidden');\n            if (!isEquipped) {\n                elSingleActionBtn.RemoveClass('hidden');\n                _SetUpSingleActionBtn(elPanel, id, bCloseInspectOnSingleAction, contextPanel);\n            }\n            return;\n        }\n        else {\n            elMoreActionsBtn.RemoveClass('hidden');\n            elSingleActionBtn.AddClass('hidden');\n        }\n    }\n    function _SetUpSingleActionBtn(elPanel, id, closeInspect, contextPanel) {\n        const validEntries = ItemContextEntries.FilterEntries(id, 'inspect');\n        const elSingleActionBtn = elPanel.FindChildInLayoutFile('SingleAction');\n        for (let i = 0; i < validEntries.length; i++) {\n            const entry = validEntries[i];\n            let displayName = '';\n            if (entry.name instanceof Function) {\n                displayName = entry.name(id);\n            }\n            else {\n                displayName = entry.name;\n            }\n            elSingleActionBtn.text = '#inv_context_' + displayName;\n            elSingleActionBtn.SetPanelEvent('onactivate', () => _OnSingleAction(entry, id, closeInspect, contextPanel));\n            elSingleActionBtn.RemoveClass('hidden');\n        }\n    }\n    function _TrySetUpSingleActionPreviewBtn(elPanel, id) {\n        const validEntries = ItemContextEntries.FilterEntries(id, 'preview');\n        const elSingleActionBtn = elPanel.FindChildInLayoutFile('SingleAction');\n        for (let i = 0; i < validEntries.length; i++) {\n            const entry = validEntries[i];\n            let displayName = '';\n            if (entry.name instanceof Function) {\n                displayName = entry.name(id);\n            }\n            else {\n                displayName = entry.name;\n            }\n            const previewActionPrefix = displayName.startsWith('preview_') ? '' : 'preview_';\n            const contextPanel = $.GetContextPanel();\n            elSingleActionBtn.text = '#inv_context_' + previewActionPrefix + displayName;\n            elSingleActionBtn.SetPanelEvent('onactivate', () => {\n                const bCloseInspect = (contextPanel.IsValid()) ? false : true;\n                _OnSingleAction(entry, id, bCloseInspect, contextPanel);\n                if (!bCloseInspect) {\n                    $.DispatchEvent('BlurPopupPanel', contextPanel.id, true);\n                }\n            });\n            elSingleActionBtn.RemoveClass('hidden');\n        }\n    }\n    function _OnSingleAction(entry, id, closeInspect, contextPanel) {\n        if (closeInspect) {\n            CloseBtnAction(_GetSettingCallback(contextPanel), contextPanel);\n        }\n        entry.OnSelected(id);\n    }\n    function _SetupAddRemoveToCartButtons(elPanel, id, price) {\n        const elAddToCartContainer = elPanel.FindChildInLayoutFile('AddToCartContainer');\n        const elPrice = elPanel.FindChildInLayoutFile('MajorItemPrice');\n        if (!price) {\n            elAddToCartContainer.SetHasClass('hidden', true);\n            return;\n        }\n        elPrice.visible = price > 0;\n        elAddToCartContainer.SetHasClass('hidden', false);\n        elPanel.SetDialogVariableInt('cart-count', ShoppingCart.cart.getItemQuantity(id));\n        elPanel.SetDialogVariableInt('total-items', ShoppingCart.cart.getTotalItems());\n        const shopItem = { id: id, name: ItemInfo.GetFormattedName(id), price: price };\n        elAddToCartContainer.FindChildInLayoutFile('AddToCart').SetPanelEvent('onactivate', () => {\n            ShoppingCart.cart.addItem(shopItem, 1);\n            const quantity = ShoppingCart.cart.getItemQuantity(id);\n            elPanel.SetDialogVariableInt('cart-count', quantity);\n            _ShowHideCartBtn(elPanel, price);\n            elPrice.visible = quantity > 0;\n        });\n        elAddToCartContainer.FindChildInLayoutFile('RemoveFromCart').SetPanelEvent('onactivate', () => {\n            ShoppingCart.cart.decrementItem(id);\n            const quantity = ShoppingCart.cart.getItemQuantity(id);\n            elPanel.SetDialogVariableInt('cart-count', quantity);\n            _ShowHideCartBtn(elPanel, price);\n            elPrice.visible = price > 0;\n        });\n    }\n    function _SetupCartActionsBtn(elPanel, price, id) {\n        if (!price) {\n            return;\n        }\n        const elOpenCartBtn = elPanel.FindChildInLayoutFile('InspectOpenCheckout');\n        const cp = $.GetContextPanel();\n        function _Callback() {\n            CloseBtnAction(_GetSettingCallback(cp), elPanel);\n        }\n        ;\n        const callback = UiToolkitAPI.RegisterJSCallback(_Callback);\n        elOpenCartBtn.SetPanelEvent('onactivate', () => {\n            if (InspectShared.GetPopupSetting('back_to_checkout', cp)) {\n                CloseBtnAction(_GetSettingCallback(cp), elPanel);\n                return;\n            }\n            const popupPanel = UiToolkitAPI.ShowCustomLayoutPopupParameters('id-popup-shopping-cart-checkout', 'file://{resources}/layout/popups/popup_shopping_cart_checkout.xml', '&callback=' + callback);\n            popupPanel.Data().eventId = g_ActiveTournamentInfo.eventid;\n            popupPanel.Data().isFromInspect = true;\n        });\n        ShoppingCart.cart.subscribeToUpdates(elOpenCartBtn, 'inspect-sticker', () => {\n            const quantityInCart = ShoppingCart.cart.getItemQuantity(id);\n            elPanel.SetDialogVariableInt('cart-count', ShoppingCart.cart.getItemQuantity(id));\n            elPanel.SetDialogVariableInt('total-items', ShoppingCart.cart.getTotalItems());\n            elPanel.SetDialogVariableInt('price', quantityInCart == 0 ? price : ShoppingCart.cart.getItemLinePrice(id));\n        });\n    }\n    function _ShowHideCartBtn(elPanel, price) {\n        const elOpenCartBtn = elPanel.FindChildInLayoutFile('InspectOpenCheckout');\n        if (!price) {\n            elOpenCartBtn.SetHasClass('hidden', true);\n            return;\n        }\n        if (ShoppingCart.cart.getTotalItems() < 1) {\n            elOpenCartBtn.SetHasClass('hidden', true);\n            return;\n        }\n        elOpenCartBtn.SetHasClass('hidden', false);\n    }\n    function _ShowHideFavoriteBtn(cp, elPanel, nPrice) {\n        const elBtn = elPanel.FindChildInLayoutFile('id-sticker-bookmark');\n        const defIndex = InspectShared.GetPopupSetting('sticker_def_index', cp);\n        if (!nPrice || !defIndex) {\n            elBtn.SetHasClass('hidden', true);\n            return;\n        }\n        elBtn.checked = GameInterfaceAPI.GetSettingString('cl_major_store_watch_list').split(',').includes(defIndex.toString());\n        elBtn.SetPanelEvent('onactivate', () => {\n            const aDefIndexes = GameInterfaceAPI.GetSettingString('cl_major_store_watch_list').split(',');\n            const idIndex = aDefIndexes.findIndex(id => id === defIndex.toString());\n            if (idIndex === -1) {\n                aDefIndexes.push(defIndex.toString());\n            }\n            else {\n                aDefIndexes.splice(idIndex, 1);\n            }\n            GameInterfaceAPI.SetSettingString('cl_major_store_watch_list', aDefIndexes.length > 0 ? aDefIndexes.join(',') : \"\");\n        });\n        elBtn.SetPanelEvent('onmouseover', () => {\n            UiToolkitAPI.ShowTextTooltip('id-sticker-bookmark', '#major_store_bookmark_tooltip');\n        });\n        elBtn.SetPanelEvent('onmouseout', () => {\n            UiToolkitAPI.HideTextTooltip();\n        });\n        elBtn.SetHasClass('hidden', false);\n    }\n    function _OnActivateUpdateSelectionForMultiSelect(idSubjectItem, contextPanel) {\n        CloseBtnAction(_GetSettingCallback(contextPanel), contextPanel);\n        $.DispatchEvent('UpdateSelectItemForCapabilityPopup', InspectShared.GetPopupSetting('capability', contextPanel), idSubjectItem, !InspectShared.GetPopupSetting('is_selected', contextPanel));\n    }\n    function _ShowButtonsForWeaponInspect(elPanel, id) {\n        const hasAnims = ItemInfo.IsCharacter(id) || ItemInfo.IsWeapon(id) || ItemInfo.IsMelee(id);\n        if (InspectShared.GetPopupSetting('hide_char_select')) {\n            return;\n        }\n        if (hasAnims &&\n            !ItemInfo.IsEquippalbleButNotAWeapon(id) &&\n            !ItemInfo.IsSticker(id) &&\n            !ItemInfo.IsSpraySealed(id) &&\n            !ItemInfo.ItemDefinitionNameSubstrMatch(id, \"tournament_journal_\") &&\n            !ItemInfo.ItemDefinitionNameSubstrMatch(id, \"tournament_pass_\")) {\n            elPanel.FindChildInLayoutFile('InspectCharBtn').SetHasClass('hidden', !hasAnims);\n            elPanel.FindChildInLayoutFile('InspectWeaponBtn').SetHasClass('hidden', !hasAnims);\n            elPanel.FindChildInLayoutFile('LookatWeaponBtn').SetHasClass('hidden', !(ItemInfo.IsWeapon(id) || ItemInfo.IsMelee(id)));\n            const list = CharacterAnims.GetValidCharacterModels(true).filter((entry) => {\n                return (ItemInfo.IsItemCt(id) && (entry.team === 'ct' || entry.team === 'any')) ||\n                    (ItemInfo.IsItemT(id) && (entry.team === 't' || entry.team === 'any')) ||\n                    ItemInfo.IsItemAnyTeam(id);\n            });\n            if (list && (list.length > 0) && !elPanel.FindChildInLayoutFile('InspectDropdownCharModels').Data().selectedId)\n                _SetDropdown(elPanel, list, id);\n        }\n        elPanel.FindChildInLayoutFile('ChangeScenery').SetHasClass('hidden', ItemInfo.IsCharacter(id) || ItemInfo.IsPet(id));\n    }\n    function _ShowButtonsForCharacterInspect(elPanel, id) {\n        const elPreviewPanel = InspectModelImage.GetModelPanel();\n        if (!ItemInfo.IsCharacter(id))\n            return;\n        elPanel.FindChildInLayoutFile('id-character-button-container').SetHasClass('hidden', false);\n        const inspectCameraPresets = {\n            \"AspectRatio4x3\": [16, 17],\n            \"AspectRatio16x9\": [26, 27],\n            \"AspectRatio21x9\": [28, 29]\n        };\n        let arrCameraSetToUse = inspectCameraPresets.AspectRatio4x3;\n        if ($.GetContextPanel().BAscendantHasClass(\"AspectRatio16x9\") ||\n            $.GetContextPanel().BAscendantHasClass(\"AspectRatio16x10\")) {\n            arrCameraSetToUse = inspectCameraPresets.AspectRatio16x9;\n        }\n        else if ($.GetContextPanel().BAscendantHasClass(\"AspectRatio21x9\")) {\n            arrCameraSetToUse = inspectCameraPresets.AspectRatio21x9;\n        }\n        const characterToolbarButtonSettings = {\n            charItemId: id,\n            cameraPresetUnzoomed: arrCameraSetToUse[0],\n            cameraPresetZoomed: arrCameraSetToUse[1]\n        };\n        const elCharacterButtons = elPanel.FindChildInLayoutFile('id-character-buttons');\n        CharacterButtons.InitCharacterButtons(elCharacterButtons, elPreviewPanel, characterToolbarButtonSettings);\n    }\n    function _SetDropdown(elPanel, validEntiresList, id) {\n        const currentMainMenuVanitySettings = ItemInfo.GetOrUpdateVanityCharacterSettings(ItemInfo.IsItemAnyTeam(id) ? null\n            : LoadoutAPI.GetItemID(ItemInfo.IsItemCt(id) ? 'ct' : 't', 'customplayer'));\n        const elDropdown = elPanel.FindChildInLayoutFile('InspectDropdownCharModels');\n        for (let entry of validEntiresList) {\n            const rarityColor = InventoryAPI.GetItemRarityColor(entry.itemId);\n            const newEntry = $.CreatePanel('Label', elDropdown, entry.itemId, {\n                'class': 'DropDownMenu',\n                'html': 'true',\n                'text': \"<font color='\" + rarityColor + \"'>•</font> \" + entry.label,\n                'data-team': (entry.team === 'any') ? ((ItemInfo.IsItemT(id) || ItemInfo.IsItemAnyTeam(id)) ? 't' : 'ct') : entry.team\n            });\n            elDropdown.AddOption(newEntry);\n        }\n        const itemId = InspectShared.GetPopupSetting('item_id');\n        const contextPanel = $.GetContextPanel();\n        elDropdown.SetPanelEvent('oninputsubmit', () => InspectActionBar.OnUpdateCharModel(elDropdown, itemId, contextPanel));\n        elDropdown.SetSelected(currentMainMenuVanitySettings.charItemId);\n    }\n    function OnUpdateCharModel(elDropdown, weaponItemId, contextPanel) {\n        const characterItemId = elDropdown.GetSelected().id;\n        elDropdown.Data().selectedId = elDropdown.GetSelected().id;\n        InspectModelImage.SetCharScene(characterItemId, weaponItemId, contextPanel);\n    }\n    InspectActionBar.OnUpdateCharModel = OnUpdateCharModel;\n    function NavigateModelPanel(type, bEndWeaponLookat = true) {\n        InspectModelImage.ShowHideItemPanel((type !== 'InspectModelChar'));\n        InspectModelImage.ShowHideCharPanel((type === 'InspectModelChar'));\n        $.GetContextPanel().FindChildTraverse('InspectCharModelsControls').SetHasClass('hidden', type !== 'InspectModelChar');\n        if (bEndWeaponLookat) {\n            InspectModelImage.EndWeaponLookat();\n        }\n        const elDesc = $.GetContextPanel().GetParent().FindChildInLayoutFile('InspectItemDesc');\n        if (elDesc && elDesc.IsValid()) {\n            elDesc.SetHasClass('hidden', false);\n        }\n    }\n    InspectActionBar.NavigateModelPanel = NavigateModelPanel;\n    function InspectPlayMusic(type, contentPanel) {\n        const elActionBar = contentPanel.FindChildInLayoutFile('PopUpInspectActionBar');\n        if (!elActionBar.Data().previewingMusic)\n            return;\n        const itemId = InspectShared.GetPopupSetting('item_id', contentPanel);\n        if (type === 'mvp') {\n            if (elActionBar.Data().schfnMusicMvpPreviewEnd)\n                return;\n            InventoryAPI.StopItemPreviewMusic();\n            InventoryAPI.PlayItemPreviewMusic(itemId, 'MVPPreview');\n            elActionBar.Data().schfnMusicMvpPreviewEnd = $.Schedule(6.8, () => InspectActionBar.InspectPlayMusic('schfn', contentPanel));\n        }\n        else if (type === 'schfn') {\n            elActionBar.Data().schfnMusicMvpPreviewEnd = null;\n            InventoryAPI.StopItemPreviewMusic();\n            InventoryAPI.PlayItemPreviewMusic(itemId, '');\n        }\n    }\n    InspectActionBar.InspectPlayMusic = InspectPlayMusic;\n    function ShowContextMenu(contextPanel) {\n        const elBtn = contextPanel.FindChildTraverse('InspectActionsButton');\n        const id = InspectShared.GetPopupSetting('item_id', contextPanel);\n        const contextMenuPanel = UiToolkitAPI.ShowCustomLayoutContextMenuParametersDismissEvent(elBtn.id, '', 'file://{resources}/layout/context_menus/context_menu_inventory_item.xml', 'itemid=' + id + '&populatefiltertext=inspect', () => $.DispatchEvent(\"CSGOPlaySoundEffect\", \"weapon_selectReplace\", \"MOUSE\"));\n        contextMenuPanel.AddClass(\"ContextMenu_NoArrow\");\n    }\n    InspectActionBar.ShowContextMenu = ShowContextMenu;\n    function _SetCloseBtnAction(elPanel, contextPanel) {\n        const elBtn = elPanel.FindChildInLayoutFile('InspectCloseBtn');\n        elBtn.SetPanelEvent('onactivate', () => CloseBtnAction(_GetSettingCallback(contextPanel), elPanel));\n    }\n    function _GetSettingCallback(contextPanel) {\n        let callbackFromPopup = InspectShared.GetPopupSetting('callback_handle', contextPanel);\n        return !callbackFromPopup ? -1 : callbackFromPopup;\n    }\n    function UpdateScenery() {\n        UiToolkitAPI.ShowCustomLayoutContextMenuParametersDismissEvent('id-inspect-contextmenu-maps', '', 'file://{resources}/layout/context_menus/context_menu_mainmenu_vanity.xml', 'type=maps' +\n            '&' + 'inspect-map=true', () => $.DispatchEvent('ContextMenuEvent', ''));\n    }\n    InspectActionBar.UpdateScenery = UpdateScenery;\n    function LookatWeapon() {\n        const bEndWeaponLookat = false;\n        NavigateModelPanel('InspectModel', bEndWeaponLookat);\n        const elDesc = $.GetContextPanel().GetParent().FindChildInLayoutFile('InspectItemDesc');\n        if (elDesc && elDesc.IsValid()) {\n            elDesc.SetHasClass('hidden', true);\n        }\n        InspectModelImage.StartWeaponLookat();\n    }\n    InspectActionBar.LookatWeapon = LookatWeapon;\n    function CloseBtnAction(callbackHandle = -1, elActionBar) {\n        $.DispatchEvent(\"CSGOPlaySoundEffect\", \"inventory_inspect_close\", \"MOUSE\");\n        $.DispatchEvent('UIPopupButtonClicked', '');\n        UiToolkitAPI.HideTextTooltip();\n        if (callbackHandle != -1) {\n            UiToolkitAPI.InvokeJSCallback(callbackHandle);\n        }\n        if (elActionBar.Data().previewingMusic) {\n            InventoryAPI.StopItemPreviewMusic();\n            elActionBar.Data().previewingMusic = false;\n            if (elActionBar.Data().schfnMusicMvpPreviewEnd) {\n                $.CancelScheduled(elActionBar.Data().schfnMusicMvpPreviewEnd);\n                elActionBar.Data().schfnMusicMvpPreviewEnd = null;\n            }\n        }\n    }\n    InspectActionBar.CloseBtnAction = CloseBtnAction;\n})(InspectActionBar || (InspectActionBar = {}));\n","scripts/popups/popup_inspect_async-bar.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../common/hold_button.ts\" />\n/// <reference path=\"../common/iteminfo.ts\" />\n/// <reference path=\"../inspect.ts\" />\n/// <reference path=\"popup_inspect_shared.ts\" />\n/// <reference path=\"popup_can_apply_pick_slot.ts\" />\n/// <reference path=\"../generated/items_event_current_generated_store.ts\" />\n/// <reference path=\"../common/shopping_cart.ts\" />\nvar InspectAsyncActionBar;\n(function (InspectAsyncActionBar) {\n    let m_scheduleHandle = null;\n    function Init() {\n        const worktype = InspectShared.GetPopupSetting('work_type');\n        const toolId = InspectShared.GetPopupSetting('tool_id');\n        const showXrayMachineUi = InspectShared.GetPopupSetting('is_xray_machine');\n        const allowRental = InspectShared.GetPopupSetting('allow_rent');\n        const elAsyncActionBarPanel = $.GetContextPanel().FindChildInLayoutFile('PopUpInspectAsyncBar');\n        $.GetContextPanel().AddClass('PopupPanelCapability_' + worktype);\n        const purchaseItemId = InspectShared.GetPopupSetting('purchase_item_id');\n        if (InspectShared.GetPopupSetting('force_hide_async_bar') ||\n            !worktype ||\n            (allowRental && !showXrayMachineUi) ||\n            (worktype === 'nameable' && !toolId) ||\n            purchaseItemId && showXrayMachineUi ||\n            _DoesNotMeetDecodalbeRequirements()) {\n            elAsyncActionBarPanel.AddClass('hidden');\n            return;\n        }\n        elAsyncActionBarPanel.RemoveClass('hidden');\n        _SetUpDescription(elAsyncActionBarPanel);\n        _SetUpButtonStates(elAsyncActionBarPanel);\n        elAsyncActionBarPanel.FindChildInLayoutFile('InspectWeaponBtn').checked = true;\n        _ShowHideInspectViewButtons(elAsyncActionBarPanel);\n        _ChangeSceneryBtn(elAsyncActionBarPanel);\n        _ShowZoomBtn(elAsyncActionBarPanel);\n        elAsyncActionBarPanel.FindChildInLayoutFile('AsyncItemWorkCancelBtn').SetPanelEvent('onactivate', () => {\n            if (_DefaultZoomView(worktype, elAsyncActionBarPanel) === false)\n                _ClosePopup();\n        });\n        if (worktype === 'prestigecheck') {\n            _OnAccept($.GetContextPanel().Data().oSettings, elAsyncActionBarPanel);\n        }\n        const cp = $.GetContextPanel();\n        if (!elAsyncActionBarPanel.Data().PanelRegisteredForEvents) {\n            elAsyncActionBarPanel.Data().PanelRegisteredForEvents = $.RegisterForUnhandledEvent('PanoramaComponent_Inventory_ItemCustomizationNotification', (...args) => {\n                return _OnItemCustomization(...args, cp);\n            });\n            if (worktype !== 'decodeable' && worktype !== 'nameable' && worktype !== 'remove_sticker') {\n                $.RegisterForUnhandledEvent('PanoramaComponent_MyPersona_InventoryUpdated', _OnMyPersonaInventoryUpdated);\n                $.RegisterForUnhandledEvent('PanoramaComponent_Inventory_PrestigeCoinResponse', _OnInventoryPrestigeCoinResponse);\n            }\n            if (worktype === 'craft_souvenir') {\n                $.RegisterForUnhandledEvent('PanoramaComponent_Store_VolatileShopSubscribe', (...args) => { _OnVolatileShopSubscribe(...args, cp); });\n                _EnsureVolatileShopSubscribed(cp);\n            }\n        }\n    }\n    InspectAsyncActionBar.Init = Init;\n    function _EnsureVolatileShopSubscribed(cp) {\n        if (!cp || !cp.IsValid())\n            return;\n        if (cp.Data().refreshSubscriptionHandle) {\n            $.CancelScheduled(cp.Data().refreshSubscriptionHandle);\n            cp.Data().refreshSubscriptionHandle = null;\n        }\n        StoreAPI.VolatileShopSubscribe(g_ActiveTournamentInfo.itemid_dynamic_stickers, true);\n        cp.Data().refreshSubscriptionHandle = $.Schedule(150, () => _EnsureVolatileShopSubscribed(cp));\n    }\n    function _DoesNotMeetDecodalbeRequirements() {\n        if (InspectShared.GetPopupSetting('work_type') === 'decodeable') {\n            const sRestriction = InventoryAPI.GetDecodeableRestriction(InspectShared.GetPopupSetting('item_id'));\n            const showXrayMachineUi = InspectShared.GetPopupSetting('is_xray_machine');\n            if (sRestriction === 'restricted' || (sRestriction === 'xray' && !showXrayMachineUi) || InspectShared.GetPopupSetting('inspect_only'))\n                return false;\n            return (!InspectShared.GetPopupSetting('tool_id') && !InspectShared.GetPopupSetting('is_keyless'));\n        }\n        return false;\n    }\n    function _PerformAsyncAction(oSettings, bForceRemoveSticker = false) {\n        const worktype = oSettings.work_type;\n        const itemId = oSettings.item_id;\n        const toolId = oSettings.tool_id;\n        const bAllowXray = oSettings.allow_xray_claim;\n        const selectedSlot = parseInt($.GetContextPanel().GetAttributeString('selectedItemToApplySlot', ''));\n        if (worktype === 'useitem' || worktype === 'usegift') {\n            InventoryAPI.UseTool(itemId, '');\n        }\n        else if (worktype === 'delete') {\n            InventoryAPI.DeleteItem(itemId);\n        }\n        else if (worktype === 'prestigecheck') {\n            InventoryAPI.RequestPrestigeCoinCheck();\n        }\n        else if (worktype === 'prestigeget' || worktype === 'prestigeupgrade') {\n            InventoryAPI.RequestPrestigeCoin(InventoryAPI.GetItemDefinitionIndex(itemId));\n        }\n        else if (worktype === 'nameable') {\n            $.DispatchEvent(\"CSGOPlaySoundEffect\", \"rename_applyConfirm\", \"MOUSE\");\n            InventoryAPI.UseTool(toolId, itemId);\n            if ($.GetContextPanel().FindChildInLayoutFile('NameableRemoveConfirm')) {\n                $.GetContextPanel().FindChildInLayoutFile('NameableRemoveConfirm').enabled = false;\n                $.GetContextPanel().FindChildInLayoutFile('NameableValidBtn').enabled = false;\n            }\n        }\n        else if (worktype === 'remove_patch') {\n            $.DispatchEvent('CSGOPlaySoundEffect', 'UI.StickerScratch', 'MOUSE');\n            InventoryAPI.WearItemSticker(itemId, selectedSlot, 0);\n        }\n        else if (worktype === 'remove_keychain') {\n            $.DispatchEvent('CSGOPlaySoundEffect', 'UI.StickerScratch', 'MOUSE');\n            InventoryAPI.RemoveKeychain(itemId, 0);\n        }\n        else if (worktype === 'remove_sticker') {\n            if (oSettings.remove_sticker_all_at_once) {\n                $.DispatchEvent('CSGOPlaySoundEffect', 'UI.StickerScratch', 'MOUSE');\n                _ClosePopup();\n                const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('popup-inspect-' + itemId, 'file://{resources}/layout/popups/popup_capability_can_keychain.xml');\n                let oSouvenirSettings = {\n                    item_id: itemId,\n                    tool_id: '',\n                    umid_souvenir: oSettings.umid_souvenir,\n                    work_type: 'craft_souvenir'\n                };\n                elPanel.Data().oSettings = oSouvenirSettings;\n                return;\n            }\n            CapabilityCanSticker.OnScratchSticker(itemId, selectedSlot, bForceRemoveSticker, oSettings.popup_panel);\n        }\n        else if (worktype === 'can_wrap_sticker' && !oSettings.tool_id) {\n            $.DispatchEvent('CSGOPlaySoundEffect', 'sticker_applyConfirm', 'MOUSE');\n            InventoryAPI.RemoveKeychain(itemId, 0);\n        }\n        else if (worktype === 'can_sticker' || worktype === 'can_patch' || worktype === 'can_keychain' || worktype === 'can_wrap_sticker') {\n            $.DispatchEvent('CSGOPlaySoundEffect', 'sticker_applyConfirm', 'MOUSE');\n            InventoryAPI.SetStickerToolSlot(itemId, selectedSlot);\n            InventoryAPI.UseTool(toolId, itemId);\n        }\n        else if (worktype === 'craft_souvenir') {\n            const fauxCartItemID = oSettings.temp_display_item_id;\n            const nPurchaseCost = _ComputeTotalSouvenirCost(oSettings.popup_panel, fauxCartItemID).discountPrice;\n            const strPurchaseCommand = 'craft_souvenir:' + itemId + ':' + oSettings.umid_souvenir;\n            m_SouvenirCheckoutCart = ShoppingCart.findOrCreateTempCart(itemId, true);\n            const shopItem = {\n                id: fauxCartItemID,\n                name: ItemInfo.GetFormattedName(fauxCartItemID),\n                price: nPurchaseCost,\n                checkout_id: strPurchaseCommand\n            };\n            m_SouvenirCheckoutCart.clearCart();\n            m_SouvenirCheckoutCart.addItem(shopItem);\n            $.DispatchEvent('CSGOPlaySoundEffect', 'sticker_applyConfirm', 'MOUSE');\n            const popupPanel = UiToolkitAPI.ShowCustomLayoutPopupParameters('id-popup-shopping-cart-checkout', 'file://{resources}/layout/popups/popup_shopping_cart_checkout.xml', 'cartid=' + itemId +\n                '&checkoutsuffix=_souvenir');\n            popupPanel.Data().eventId = g_ActiveTournamentInfo.eventid;\n        }\n        else if (worktype === 'decodeable') {\n            if (ItemInfo.IsSpraySealed(itemId) || ItemInfo.ItemDefinitionNameSubstrMatch(itemId, 'tournament_pass_')) {\n                InventoryAPI.UseTool(itemId, '');\n            }\n            else if (InventoryAPI.GetDecodeableRestriction(itemId) === \"xray\" && !bAllowXray) {\n                InventoryAPI.UseTool(itemId, itemId);\n            }\n            else if (InventoryAPI.GetItemAttributeValue(itemId, '{uint32}volatile container')) {\n                $.DispatchEvent('CSGOPlaySoundEffect', 'UI.Laptop.Unlock', 'MOUSE');\n                InventoryAPI.UseTool(toolId, itemId);\n            }\n            else {\n                InventoryAPI.UseTool(toolId, itemId);\n            }\n            if (InventoryAPI.GetDecodeableRestriction(itemId) !== \"xray\") {\n                $.DispatchEvent('StartDecodeableAnim');\n            }\n        }\n    }\n    function _SetUpButtonStates(elPanel) {\n        const elOK = elPanel.FindChildInLayoutFile('AsyncItemWorkAcceptConfirm');\n        const elNegative = elPanel.FindChildInLayoutFile('AsyncItemWorkAcceptNegative');\n        const worktype = InspectShared.GetPopupSetting('work_type');\n        const itemId = InspectShared.GetPopupSetting('item_id');\n        let sOkButtonText = '#popup_' + worktype + '_button';\n        if (InspectShared.GetPopupSetting('is_workshop_preview')) {\n            elOK.AddClass('hidden');\n            if (elNegative)\n                elNegative.AddClass('hidden');\n        }\n        const oSettings = $.GetContextPanel().Data().oSettings;\n        function _SetPanelEventOnAccept() {\n            elOK.SetPanelEvent('onactivate', () => _OnAccept(oSettings, elPanel));\n        }\n        if (worktype === '') {\n            return;\n        }\n        if (worktype === 'can_wrap_sticker') {\n            elOK.visible = false;\n            elNegative.visible = false;\n            const toolId = InspectShared.GetPopupSetting('tool_id');\n            ;\n            const btnId = toolId ? 'AsyncItemWorkAcceptConfirmHold' : 'AsyncItemWorkAcceptNegativeHold';\n            const btnHoldAction = elPanel.FindChildInLayoutFile(btnId);\n            const locString = !toolId ? '#popup_' + worktype + '_button_negative' : '#popup_' + worktype + '_button';\n            btnHoldAction.RemoveClass('AsyncItemWorkAcceptNegativeHidden');\n            const btnSettings = {\n                btn: btnHoldAction,\n                tooltip: !toolId ? '#popup_' + worktype + '_button_negative_tooltip' : '#popup_' + worktype + '_button_tooltip',\n                locString: locString,\n                loopingSound: 'UI.Laptop.ButtonFillLoop',\n                timerCompleteAction: () => {\n                    _OnAccept(oSettings, elPanel);\n                    btnHoldAction.enabled = false;\n                }\n            };\n            HoldButton.SetupButton(btnSettings);\n            return;\n        }\n        if (worktype === 'craft_souvenir') {\n            elOK.visible = false;\n            elNegative.visible = false;\n            const btnId = 'AsyncItemWorkAcceptConfirmHold';\n            const btnHoldAction = elPanel.FindChildInLayoutFile(btnId);\n            let locString = '#popup_' + worktype + '_button';\n            btnHoldAction.RemoveClass('AsyncItemWorkAcceptNegativeHidden');\n            const btnSettings = {\n                btn: btnHoldAction,\n                locString: locString,\n                loopingSound: 'UI.Laptop.ButtonFillLoop',\n                timerCompleteAction: () => {\n                    _OnAccept(oSettings, elPanel);\n                }\n            };\n            const tempCreatedItem = InspectShared.GetPopupSetting('temp_display_item_id');\n            btnHoldAction.SetPanelEvent('onmouseover', () => {\n                UiToolkitAPI.ShowCustomLayoutParametersTooltip(btnHoldAction.id, 'tooltip-souvenir-receipt', 'file://{resources}/layout/tooltips/tooltip_souvenir_receipt.xml', 'itemid=' + tempCreatedItem);\n            });\n            btnHoldAction.SetPanelEvent('onmouseout', () => {\n                UiToolkitAPI.HideCustomLayoutTooltip('tooltip-souvenir-receipt');\n            });\n            HoldButton.SetupButton(btnSettings);\n            btnHoldAction.enabled = true;\n            _DiscountPanel(oSettings.popup_panel, elPanel);\n            const umidSouvenir = InspectShared.GetPopupSetting('umid_souvenir');\n            const elButtonChangeSouvenirItem = elPanel.FindChildInLayoutFile('ChangeSouvenirItem');\n            elButtonChangeSouvenirItem.RemoveClass('hidden');\n            elButtonChangeSouvenirItem.SetPanelEvent('onactivate', () => {\n                $.DispatchEvent('CSGOPlaySoundEffect', 'sticker_applySticker', 'MOUSE');\n                _ClosePopup();\n                $.DispatchEvent('ShowSelectItemForCapabilityPopup', umidSouvenir, '', 'craft_souvenir');\n            });\n            const elMakeSouvenirPlayerSelect = elPanel.FindChildInLayoutFile('MakeSouvenirPlayerSelect');\n            elMakeSouvenirPlayerSelect.RemoveClass('hidden');\n            const goldenItemId = InspectShared.GetPopupSetting('temp_display_item_id');\n            const unTeamIDs = [InventoryAPI.GetItemAttributeValue(goldenItemId, '{uint32}tournament event team0 id'),\n                InventoryAPI.GetItemAttributeValue(goldenItemId, '{uint32}tournament event team1 id')];\n            const unPlayerID = InventoryAPI.GetItemAttributeValue(goldenItemId, '{uint32}tournament mvp account id');\n            let arrSelections = [];\n            const defidxStickerItem = InventoryAPI.GetItemDefinitionIndexFromDefinitionName('sticker');\n            g_ActiveTournamentTeams.filter((tt) => unTeamIDs.includes(tt.teamid)).forEach((tt) => {\n                tt.players.forEach((tp) => {\n                    let sPlayerName = $.Localize('#SFUI_ProPlayer_' + tp.code, elPanel).split(\" \");\n                    sPlayerName.splice(1, 0, ...[\"'\" + tp.nick + \"'\"]);\n                    const idFauxSticker = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(defidxStickerItem, tp.stickerids[tp.stickerids.length - 1]);\n                    let unCostInCredits = MissionsAPI.GetSeasonalOperationFauxCreditsCost(g_ActiveTournamentInfo.credits_id, idFauxSticker);\n                    arrSelections.push({\n                        unPlayerID: tp.playerid,\n                        sPlayerName: sPlayerName.join(\" \"),\n                        sTeamTag: tt.team,\n                        unCostInCredits: unCostInCredits,\n                        unStickerID: tp.stickerids[tp.stickerids.length - 1]\n                    });\n                });\n            });\n            arrSelections.sort((a, b) => (a.unCostInCredits - b.unCostInCredits) * 100000 + (a.unStickerID - b.unStickerID));\n            arrSelections.forEach((sel) => {\n                let elOption = $.CreatePanel('Panel', elMakeSouvenirPlayerSelect, 'id-MakeSouvenirPlayerSelect-p' + sel.unPlayerID);\n                elOption.BLoadLayoutSnippet('craft-souvenir-dropdown-select-player-entry');\n                let elNamePanel = elOption.FindChildInLayoutFile('id-craft-souvenir-dropdown-select-player-entry-name');\n                elNamePanel.text = sel.sPlayerName;\n                elOption.FindChildInLayoutFile('id-craft-souvenir-dropdown-select-player-entry-cost')\n                    .SetDialogVariableInt('cost', sel.unCostInCredits);\n                elOption.FindChildInLayoutFile('id-team-player-logo')\n                    .SetImage(\"file://{images}/tournaments/teams/\" + sel.sTeamTag + \".svg\");\n                elOption.SetAttributeUInt32('playerid', sel.unPlayerID);\n                if (sel.unPlayerID != unPlayerID) {\n                    elNamePanel.SetPanelEvent('onactivate', () => {\n                        $.DispatchEvent(\"Activated\", elNamePanel.GetParent(), \"mouse\");\n                    });\n                }\n                else {\n                    elOption.AddClass('craft_souvenir_dropdown_selected');\n                }\n                elMakeSouvenirPlayerSelect.AddOption(elOption);\n            });\n            elMakeSouvenirPlayerSelect.SetPanelEvent('oninputsubmit', () => {\n                const elSelected = elMakeSouvenirPlayerSelect.GetSelected();\n                const nNewPlayerID = elSelected.GetAttributeUInt32('playerid', 0);\n                if (nNewPlayerID && unPlayerID != nNewPlayerID) {\n                    let oNewSettings = {\n                        item_id: itemId,\n                        tool_id: '',\n                        umid_souvenir: 'pid_' + nNewPlayerID + ':' + (umidSouvenir.split(':').pop()),\n                        work_type: 'craft_souvenir'\n                    };\n                    _ClosePopup();\n                    const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('popup-inspect-' + itemId, 'file://{resources}/layout/popups/popup_capability_can_keychain.xml');\n                    elPanel.AddClass('PopupPanelCapability_' + oNewSettings.work_type);\n                    elPanel.Data().oSettings = oNewSettings;\n                }\n            });\n            elMakeSouvenirPlayerSelect.SetSelected('id-MakeSouvenirPlayerSelect-p' + unPlayerID);\n            return;\n        }\n        if (worktype === 'remove_keychain') {\n            elOK.visible = false;\n            elNegative.visible = false;\n            const btnHoldAction = elPanel.FindChildInLayoutFile('AsyncItemWorkAcceptNegativeHold');\n            btnHoldAction.RemoveClass('AsyncItemWorkAcceptNegativeHidden');\n            const btnSettings = {\n                btn: btnHoldAction,\n                tooltip: '#SFUI_Keychain_Remove_Tooltip',\n                locString: '#popup_' + worktype + '_button',\n                loopingSound: 'UI.Laptop.ButtonFillLoop',\n                timerCompleteAction: () => {\n                    _OnAccept(oSettings, elPanel);\n                    btnHoldAction.enabled = false;\n                }\n            };\n            HoldButton.SetupButton(btnSettings);\n            return;\n        }\n        if (worktype === 'remove_patch') {\n            elOK.visible = false;\n            elNegative.visible = false;\n            const btnHoldAction = elPanel.FindChildInLayoutFile('AsyncItemWorkAcceptNegativeHold');\n            btnHoldAction.RemoveClass('AsyncItemWorkAcceptNegativeHidden');\n            const btnSettings = {\n                btn: btnHoldAction,\n                tooltip: '#SFUI_Patch_Remove_Desc_Tooltip',\n                locString: '#popup_' + worktype + '_button',\n                loopingSound: 'UI.Laptop.ButtonFillLoop',\n                timerCompleteAction: () => {\n                    _OnAccept(oSettings, elPanel);\n                    btnHoldAction.enabled = false;\n                }\n            };\n            HoldButton.SetupButton(btnSettings);\n            return;\n        }\n        if (worktype === 'remove_sticker') {\n            const bRemovingAllStickersForSouvenir = !!InspectShared.GetPopupSetting('remove_sticker_all_at_once');\n            if (bRemovingAllStickersForSouvenir)\n                elOK.visible = false;\n            elNegative.visible = false;\n            const btnHoldAction = elPanel.FindChildInLayoutFile('AsyncItemWorkAcceptNegativeHold');\n            btnHoldAction.RemoveClass('AsyncItemWorkAcceptNegativeHidden');\n            const btnSettings = {\n                btn: btnHoldAction,\n                tooltip: bRemovingAllStickersForSouvenir ? '#SFUI_Sticker_WipeStickersImmediate_Tooltip' : '#SFUI_Sticker_RemoveImmediate_Tooltip',\n                locString: '#popup_' + worktype + '_button_negative' + (bRemovingAllStickersForSouvenir ? '_wipestickers' : ''),\n                loopingSound: 'UI.Laptop.ButtonFillLoop',\n                timerCompleteAction: () => {\n                    _OnAccept(oSettings, elPanel, true);\n                    btnHoldAction.enabled = false;\n                }\n            };\n            HoldButton.SetupButton(btnSettings);\n        }\n        if (worktype === 'delete') {\n            elNegative.visible = false;\n            elOK.visible = false;\n            const btnHoldAction = elPanel.FindChildInLayoutFile('AsyncItemWorkAcceptNegativeHold');\n            btnHoldAction.RemoveClass('AsyncItemWorkAcceptNegativeHidden');\n            const btnSettings = {\n                btn: btnHoldAction,\n                tooltip: '#popup_delete_tooltip',\n                locString: '#popup_' + worktype + '_button',\n                loopingSound: 'UI.Laptop.ButtonFillLoop',\n                timerCompleteAction: () => {\n                    _OnAccept(oSettings, elPanel, true);\n                    btnHoldAction.enabled = false;\n                }\n            };\n            HoldButton.SetupButton(btnSettings);\n            return;\n        }\n        const toolId = InspectShared.GetPopupSetting('tool_id');\n        const itemDefName = InventoryAPI.GetItemDefinitionName(itemId);\n        const btnStyle = InspectShared.GetPopupSetting('override_async_btn_style') === false ?\n            'Positive' :\n            InspectShared.GetPopupSetting('override_async_btn_style');\n        if (worktype === 'decodeable') {\n            const sRestriction = InventoryAPI.GetDecodeableRestriction(itemId);\n            const elDescLabel = elPanel.FindChildInLayoutFile('AsyncItemWorkDesc');\n            const elDescImage = elPanel.FindChildInLayoutFile('AsyncItemWorkDescImage');\n            const inspectOnly = InspectShared.GetPopupSetting('inspect_only');\n            if (inspectOnly || sRestriction === 'restricted' && !$.GetContextPanel().Data().existingRewardFromXrayId) {\n                elOK.visible = false;\n                elDescLabel.visible = false;\n                elDescImage.visible = false;\n                return;\n            }\n            if (InspectShared.GetPopupSetting('is_xray_machine')) {\n                const enabled = InspectShared.GetPopupSetting('allow_xray_claim') ? true : false;\n                EnableDisableOkBtn(elPanel, enabled);\n                elOK.AddClass(btnStyle);\n                elOK.text = '#popup_xray_claim_item';\n                _SetPanelEventOnAccept();\n                return;\n            }\n            if (sRestriction === 'xray' && !inspectOnly) {\n                elOK.visible = true;\n                elOK.text = '#popup_xray_button_goto';\n                elOK.AddClass(btnStyle);\n                elOK.SetPanelEvent('onactivate', () => {\n                    $.DispatchEvent(\"ShowXrayCasePopup\", !toolId ? '' : toolId, itemId, true);\n                    _ClosePopup();\n                });\n                elDescLabel.visible = true;\n                elDescLabel.text = '#popup_decodeable_async_xray_desc';\n                elDescImage.visible = false;\n                return;\n            }\n            const terminalValue = InventoryAPI.GetItemAttributeValue(itemId, '{uint32}volatile container');\n            const isTerminal = (terminalValue == '' || terminalValue == undefined || terminalValue == 0) ? false : true;\n            if (itemDefName && itemDefName.indexOf(\"spray\") != -1)\n                sOkButtonText = sOkButtonText + \"_graffiti\";\n            else if (itemDefName && itemDefName.indexOf(\"tournament_pass_\") != -1)\n                sOkButtonText = sOkButtonText + \"_fantoken\";\n            else if (terminalValue)\n                sOkButtonText = sOkButtonText + \"_terminal\";\n            const elDropdown = elPanel.FindChildInLayoutFile('AsyncOfferLimitDropdown');\n            elDropdown.SetHasClass('hidden', !isTerminal);\n            if (isTerminal)\n                _SetUpOfferLimitDropdown(elDropdown);\n        }\n        if (worktype === 'can_sticker') {\n            const listStickers = ItemInfo.GetitemStickerList(itemId);\n            elOK.SetDialogVariableInt('sticker_count', listStickers.length + 1);\n            elOK.SetDialogVariableInt('max_stickers', 5);\n        }\n        if (worktype === 'nameable' && itemDefName === 'casket') {\n            sOkButtonText = '#popup_newcasket_button';\n        }\n        if (worktype === 'useitem') {\n            if (itemDefName && itemDefName.startsWith('Remove Keychain Tool')) {\n                elOK.SetDialogVariableInt('item_count', Number(InventoryAPI.GetItemAttributeValue(itemId, '{uint32}items count')));\n                sOkButtonText = '#popup_useitem_button_getkeychaincharges:f';\n            }\n            if (itemDefName && itemDefName.startsWith('XpShopTicket')) {\n                const bHasPrime = FriendsListAPI.GetFriendPrimeEligible(MyPersonaAPI.GetXuid());\n                sOkButtonText = bHasPrime ? '#xpshop_pass_activate_open_armory' : '#SFUI_Elevated_Status_upgrade_status';\n            }\n            if (itemDefName?.includes('tournament_pass_') && itemDefName?.includes('_credits')) {\n                $.GetContextPanel().Data().majorCreditsToClaim = Number(InventoryAPI.GetItemAttributeValue(itemId, '{uint32}upgrade level'));\n            }\n        }\n        elOK.text = sOkButtonText;\n        elOK.AddClass(btnStyle);\n        _SetPanelEventOnAccept();\n    }\n    function _DiscountPanel(popup_panel, elAsyncBar) {\n        const oPriceData = _ComputeTotalSouvenirCost(popup_panel);\n        const elDiscount = elAsyncBar.FindChildInLayoutFile('id-souvenir-discount');\n        if (oPriceData.discountAmount > 0) {\n            elDiscount.SetHasClass('hidden', false);\n            elDiscount.SetDialogVariableInt('discount', oPriceData.discountAmount);\n            elDiscount.SetDialogVariableInt('price', oPriceData.discountPrice);\n            elDiscount.SetDialogVariableInt('original-price', oPriceData.originalPrice);\n        }\n        else\n            elDiscount.SetHasClass('hidden', true);\n    }\n    function _SetUpOfferLimitDropdown(elDropdown) {\n        const oLimits = JSON.parse(InventoryAPI.GetVolatileLimits());\n        for (let i = 0; i < oLimits.choices.length; i++) {\n            if (!elDropdown.HasOption('id-dropdown-limit-' + oLimits.choices[i].limit)) {\n                let elOption = $.CreatePanel('Label', elDropdown, 'id-dropdown-limit-' + oLimits.choices[i].limit, {\n                    class: 'DropDownMenu'\n                });\n                elOption.SetDialogVariable('limit', $.Localize(oLimits.choices[i].label));\n                elOption.text = $.Localize('#offer_limit_setting', elOption);\n                elOption.SetAttributeUInt32('limit', oLimits.choices[i].limit);\n                elDropdown.AddOption(elOption);\n            }\n        }\n        elDropdown.SetPanelEvent('oninputsubmit', () => _OnOfferLimitDropdownSubmit(elDropdown));\n        elDropdown.SetSelected('id-dropdown-limit-' + oLimits.limit);\n    }\n    function _OnOfferLimitDropdownSubmit(elDropdown) {\n        const elSelected = elDropdown.GetSelected();\n        const nLimit = elSelected.GetAttributeUInt32('limit', 0);\n        InventoryAPI.SetVolatileLimits(nLimit);\n    }\n    function _SetUpDescription(elPanel) {\n        const elDescLabel = elPanel.FindChildInLayoutFile('AsyncItemWorkDesc');\n        const elDescImage = elPanel.FindChildInLayoutFile('AsyncItemWorkDescImage');\n        const worktype = InspectShared.GetPopupSetting('work_type');\n        const toolId = InspectShared.GetPopupSetting('tool_id');\n        const showAsyncActionDesc = InspectShared.GetPopupSetting('override_async_bar_desc');\n        const showXrayMachineUi = InspectShared.GetPopupSetting('is_xray_machine');\n        elDescLabel.SetHasClass('popup-capability-faded', showXrayMachineUi && !InspectShared.GetPopupSetting('allow_xray_claim'));\n        elDescImage.SetHasClass('popup-capability-faded', showXrayMachineUi && !InspectShared.GetPopupSetting('allow_xray_claim'));\n        if (showAsyncActionDesc) {\n            elDescImage.itemid = toolId;\n            const itemName = InventoryAPI.GetItemName(toolId);\n            if (itemName) {\n                elDescLabel.SetDialogVariable('itemname', itemName);\n                elDescLabel.text = $.Localize('#popup_' + worktype + '_async_desc', elDescLabel);\n            }\n        }\n        elDescLabel.visible = showAsyncActionDesc;\n    }\n    function EnableDisableOkBtn(elPanel, bEnable) {\n        const elOK = elPanel.FindChildInLayoutFile('AsyncItemWorkAcceptConfirm');\n        if (elOK.visible) {\n            if (elOK.enabled !== bEnable)\n                elOK.TriggerClass('popup-capability-update-anim');\n            elOK.enabled = bEnable;\n        }\n        let elNegative = elPanel.FindChildInLayoutFile('AsyncItemWorkAcceptNegative');\n        if (elNegative && elNegative.visible) {\n            if (elNegative.enabled !== bEnable)\n                elNegative.TriggerClass('popup-capability-update-anim');\n            elNegative.enabled = bEnable;\n        }\n        elNegative = elPanel.FindChildInLayoutFile('AsyncItemWorkAcceptNegativeHold');\n        if (elNegative && elNegative.visible) {\n            if (elNegative.enabled !== bEnable)\n                elNegative.TriggerClass('popup-capability-update-anim');\n            elNegative.enabled = bEnable;\n        }\n    }\n    InspectAsyncActionBar.EnableDisableOkBtn = EnableDisableOkBtn;\n    function ShowHideOkBtn(elPanel, bShow) {\n        const elOK = elPanel.FindChildInLayoutFile('AsyncItemWorkAcceptConfirm');\n        elOK.SetHasClass('move-down', !bShow);\n        let elNegative = elPanel.FindChildInLayoutFile('AsyncItemWorkAcceptNegative');\n        if (elNegative)\n            elNegative.SetHasClass('move-down', !bShow);\n        elNegative = elPanel.FindChildInLayoutFile('AsyncItemWorkAcceptNegativeHold');\n        if (elNegative)\n            elNegative.SetHasClass('move-down', !bShow);\n    }\n    InspectAsyncActionBar.ShowHideOkBtn = ShowHideOkBtn;\n    function _OnAccept(oSettings, elAsyncActionBarPanel, bForceRemoveSticker = false) {\n        ResetTimeouthandle();\n        const worktype = oSettings.work_type;\n        const itemId = oSettings.item_id;\n        if (worktype === 'useitem') {\n            if (ItemInfo.ItemDefinitionNameSubstrMatch(itemId, 'XpShopTicket')) {\n                const bHasPrime = FriendsListAPI.GetFriendPrimeEligible(MyPersonaAPI.GetXuid());\n                if (!bHasPrime) {\n                    UiToolkitAPI.ShowCustomLayoutPopup('prime_status', 'file://{resources}/layout/popups/popup_prime_status.xml');\n                    return;\n                }\n                const oXpShopTrackProgress = InventoryAPI.GetCacheTypeElementJSOByIndex('XpShop', 0);\n                const bTooManyTracks = (oXpShopTrackProgress && (oXpShopTrackProgress.xp_tracks.length >= StoreAPI.GetXpShopMaxTracks()));\n                if (bTooManyTracks) {\n                    UiToolkitAPI.ShowGenericPopupOk('#CSGO_Purchasable_XpShop_Ticket', '#CSGO_Purchasable_XpShop_Ticket_TooManyTracks', '', () => { });\n                    return;\n                }\n                ResetTimeouthandle();\n                _ClosePopup();\n                $.DispatchEvent('MainMenuGoToStore', 'id-store-nav-xpshop');\n                return;\n            }\n        }\n        if (worktype === 'useitem' || worktype === 'decodeable') {\n            const strToolType = InventoryAPI.GetToolType(itemId);\n            if (strToolType === 'fantoken') {\n                const nTournamentEventID = InventoryAPI.GetItemAttributeValue(itemId, '{uint32}tournament event id');\n                if (nTournamentEventID && (nTournamentEventID > 0)) {\n                    const coinItemId = InventoryAPI.GetActiveTournamentCoinItemId(nTournamentEventID);\n                    if (coinItemId && (coinItemId !== '0')) {\n                        $.DispatchEvent('CSGOPlaySoundEffect', 'sticker_applyConfirm', 'MOUSE');\n                        UiToolkitAPI.ShowGenericPopupOk(InventoryAPI.GetItemName(coinItemId), '#Store_DuplicateItemInBackpack', '', () => {\n                            ResetTimeouthandle();\n                            _ClosePopup();\n                            $.DispatchEvent(\"ShowCustomLayoutPopupParametersAsEvent\", '', 'file://{resources}/layout/popups/popup_inventory_inspect.xml', 'item_id=' + coinItemId +\n                                ',inspect_only=true,force_inspect_view_type=primary');\n                        });\n                        return;\n                    }\n                }\n            }\n        }\n        _PerformAsyncAction(oSettings, bForceRemoveSticker);\n        if (worktype === 'craft_souvenir')\n            return;\n        let elNegative = elAsyncActionBarPanel.FindChildInLayoutFile('AsyncItemWorkAcceptNegative');\n        if (elNegative)\n            elNegative.AddClass('hidden');\n        elNegative = elAsyncActionBarPanel.FindChildInLayoutFile('AsyncItemWorkAcceptNegativeHold');\n        if (elNegative)\n            elNegative.AddClass('hidden');\n        elAsyncActionBarPanel.FindChildInLayoutFile('NameableSpinner').RemoveClass('hidden');\n        elAsyncActionBarPanel.FindChildInLayoutFile('AsyncItemWorkAcceptConfirm').AddClass('hidden');\n    }\n    function _ShowHideInspectViewButtons(elAsyncActionBarPanel) {\n        const worktype = InspectShared.GetPopupSetting('work_type');\n        if (worktype === 'can_sticker' || worktype === 'can_keychain') {\n            const elApplyPickSlot = $.GetContextPanel().FindChildInLayoutFile('PopUpCanApplyPickSlot');\n            elAsyncActionBarPanel.FindChildInLayoutFile('InspectWeaponBtn').SetPanelEvent('onactivate', () => {\n                InspectModelImage.EndWeaponLookat();\n                CanApplyPickSlot.ShowHideInfoPanel(false, elApplyPickSlot);\n                CanApplyPickSlot.IsContinueEnabled(elApplyPickSlot);\n                ShowHideOkBtn(elAsyncActionBarPanel, true);\n                EnableDisableOkBtn(elAsyncActionBarPanel, !CanApplyPickSlot.IsContinueEnabled(elApplyPickSlot));\n                elAsyncActionBarPanel.FindChildInLayoutFile('AsyncItemWorkCancelBtn').text = \"#GameUI_Close\";\n                if (elAsyncActionBarPanel.FindChildInLayoutFile('InspectItemModelZoom').visible) {\n                    elAsyncActionBarPanel.FindChildInLayoutFile('InspectItemModelZoom').enabled = true;\n                }\n            });\n            elAsyncActionBarPanel.FindChildInLayoutFile('LookatWeaponBtn').SetPanelEvent('onactivate', () => {\n                InspectModelImage.StartWeaponLookat();\n                CanApplyPickSlot.ShowHideInfoPanel(true, elApplyPickSlot);\n                ShowHideOkBtn(elAsyncActionBarPanel, false);\n                EnableDisableOkBtn(elAsyncActionBarPanel, false);\n                elAsyncActionBarPanel.FindChildInLayoutFile('AsyncItemWorkCancelBtn').text = \"#SFUI_Back\";\n                elAsyncActionBarPanel.FindChildInLayoutFile('InspectItemModelZoom').enabled = false;\n            });\n            elAsyncActionBarPanel.FindChildInLayoutFile('InspectWeaponBtn').GetParent().SetHasClass('hidden', false);\n        }\n        else {\n            elAsyncActionBarPanel.FindChildInLayoutFile('InspectWeaponBtn').GetParent().SetHasClass('hidden', true);\n        }\n        elAsyncActionBarPanel.FindChildInLayoutFile('ChangeScenery').SetHasClass('hidden', worktype === 'decodeable' || worktype === 'remove_patch'\n            || worktype === 'can_wrap_sticker' || worktype === 'craft_souvenir'\n            || worktype === 'remove_sticker' || worktype === 'remove_keychain');\n    }\n    function _ChangeSceneryBtn(elAsyncActionBarPanel) {\n        elAsyncActionBarPanel.FindChildInLayoutFile('ChangeScenery').SetPanelEvent('onactivate', UpdateScenery);\n    }\n    function UpdateScenery() {\n        UiToolkitAPI.ShowCustomLayoutContextMenuParametersDismissEvent('id-inspect-contextmenu-maps', '', 'file://{resources}/layout/context_menus/context_menu_mainmenu_vanity.xml', 'type=maps' +\n            '&' + 'inspect-map=true', () => { $.DispatchEvent('ContextMenuEvent', ''); });\n    }\n    InspectAsyncActionBar.UpdateScenery = UpdateScenery;\n    function EnableDisableChangeSceneryBtn(bEnable, elAsyncActionBarPanel) {\n        elAsyncActionBarPanel.FindChildInLayoutFile('ChangeScenery').enabled = bEnable;\n    }\n    InspectAsyncActionBar.EnableDisableChangeSceneryBtn = EnableDisableChangeSceneryBtn;\n    function _ShowZoomBtn(elAsyncActionBarPanel) {\n        if (InspectModelImage.PanZoomEnabled() || InspectShared.GetPopupSetting('work_type') === 'nameable')\n            return;\n        const defName = InventoryAPI.GetItemDefinitionName(InspectShared.GetPopupSetting('item_id'));\n        const result = InspectModelImage.m_CameraSettingsPerWeapon.find(({ type }) => type === defName);\n        if (!result || !result.hasOwnProperty('zoom_camera'))\n            return;\n        const elZoomBtn = elAsyncActionBarPanel.FindChildInLayoutFile('InspectItemModelZoom');\n        elZoomBtn.SetPanelEvent('onactivate', () => ZoomCamera(false, elAsyncActionBarPanel));\n        elZoomBtn.SetHasClass('hidden', false);\n    }\n    function ZoomCamera(bForceZoomOut = false, elAsyncActionBarPanel) {\n        const elZoomButton = elAsyncActionBarPanel.FindChildInLayoutFile('InspectItemModelZoom');\n        if (bForceZoomOut) {\n            InspectModelImage.ZoomCamera(false);\n            elZoomButton.checked = false;\n            return;\n        }\n        if (elZoomButton.checked) {\n            InspectModelImage.ZoomCamera(true);\n        }\n        else {\n            InspectModelImage.ZoomCamera(false);\n        }\n    }\n    InspectAsyncActionBar.ZoomCamera = ZoomCamera;\n    function OnCloseRemove(elAsyncActionBarPanel) {\n        if (elAsyncActionBarPanel.IsValid()) {\n            elAsyncActionBarPanel.FindChildInLayoutFile('NameableSpinner').AddClass('hidden');\n            elAsyncActionBarPanel.FindChildInLayoutFile('AsyncItemWorkAcceptConfirm').RemoveClass('hidden');\n            let elNegative = elAsyncActionBarPanel.FindChildInLayoutFile('AsyncItemWorkAcceptNegative');\n            if (elNegative)\n                elNegative.RemoveClass('hidden');\n            elNegative = elAsyncActionBarPanel.FindChildInLayoutFile('AsyncItemWorkAcceptNegativeHold');\n            if (elNegative)\n                elNegative.RemoveClass('hidden');\n        }\n    }\n    InspectAsyncActionBar.OnCloseRemove = OnCloseRemove;\n    function _ClosePopup() {\n        ResetTimeouthandle();\n        HoldButton.StopLoopingSound('UI.Laptop.ButtonFillLoop');\n        $.DispatchEvent('HideSelectItemForCapabilityPopup');\n        $.DispatchEvent('UIPopupButtonClicked', '');\n        $.DispatchEvent('CapabilityPopupIsOpen', false);\n    }\n    function SetCallbackTimeout() {\n        const elPanel = $.GetContextPanel();\n        m_scheduleHandle = $.Schedule(5, () => _CancelWaitforCallBack(elPanel));\n    }\n    InspectAsyncActionBar.SetCallbackTimeout = SetCallbackTimeout;\n    function _CancelWaitforCallBack(elPanel) {\n        m_scheduleHandle = null;\n        const elSpinner = elPanel.FindChildInLayoutFile('NameableSpinner');\n        elSpinner.AddClass('hidden');\n        _ClosePopup();\n        UiToolkitAPI.ShowGenericPopupOk($.Localize('#SFUI_SteamConnectionErrorTitle'), $.Localize('#SFUI_InvError_Item_Not_Given'), '', () => { });\n    }\n    function OnEventToClose() {\n        const worktype = InspectShared.GetPopupSetting('work_type');\n        const elAsyncActionBarPanel = $.GetContextPanel().FindChildInLayoutFile('PopUpInspectAsyncBar');\n        if (_DefaultZoomView(worktype, elAsyncActionBarPanel) === false)\n            _ClosePopup();\n    }\n    InspectAsyncActionBar.OnEventToClose = OnEventToClose;\n    function _DefaultZoomView(worktype, elAsyncActionBarPanel) {\n        if (elAsyncActionBarPanel && (worktype === 'can_sticker' || worktype === 'can_keychain')) {\n            const elLookatBtn = elAsyncActionBarPanel.FindChildInLayoutFile('LookatWeaponBtn');\n            if (elLookatBtn && elLookatBtn.IsValid()\n                && elLookatBtn.checked\n                && m_scheduleHandle === null) {\n                $.DispatchEvent(\"Activated\", elAsyncActionBarPanel.FindChildInLayoutFile('InspectWeaponBtn'), \"mouse\");\n                return true;\n            }\n        }\n        return false;\n    }\n    function ResetTimeouthandle() {\n        if (m_scheduleHandle) {\n            $.CancelScheduled(m_scheduleHandle);\n            m_scheduleHandle = null;\n        }\n    }\n    InspectAsyncActionBar.ResetTimeouthandle = ResetTimeouthandle;\n    function _OnItemCustomization(numericType, type, itemid, cp = $.GetContextPanel()) {\n        const worktype = InspectShared.GetPopupSetting('work_type');\n        if (_IgnoreClose()) {\n            ResetTimeouthandle();\n            return;\n        }\n        if (worktype === 'craft_souvenir' && type === 'reward_redeemed') {\n            _ClosePopup();\n            return;\n        }\n        if (type === 'xp_shop_use_ticket' || type === 'xp_shop_ack_tracks') {\n        }\n        else if (type === 'keychain_tool_charges' && worktype === 'useitem') {\n            const defidxContract = InventoryAPI.GetItemDefinitionIndexFromDefinitionName(\"Remove Keychain Tool\");\n            const fauxItemID = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(defidxContract, 0);\n            $.DispatchEvent(\"ShowCustomLayoutPopupParametersAsEvent\", '', 'file://{resources}/layout/popups/popup_inventory_inspect.xml', 'item_id=' + fauxItemID +\n                ',' + 'inspect_only=true');\n        }\n        else if (type === 'seasontiers') {\n            if (worktype === 'useitem') {\n                const popupPanel = UiToolkitAPI.ShowCustomLayoutPopup('id-popup-major-store', 'file://{resources}/layout/popups/popup_major_store.xml');\n                popupPanel.Data().activatedCredits = cp.Data().majorCreditsToClaim;\n            }\n            else {\n                return;\n            }\n        }\n        else {\n            $.DispatchEvent('ShowAcknowledgePopup', type, itemid);\n        }\n        OnEventToClose();\n    }\n    function _IgnoreClose() {\n        return InspectShared.GetPopupSetting('work_type') === 'decodeable';\n    }\n    function _ComputeTotalSouvenirCost(cp, itemIdSouvenir) {\n        const tempCreatedItem = itemIdSouvenir ?? InspectShared.GetPopupSetting('temp_display_item_id');\n        let nTotalCostInCredits = 0;\n        {\n            const defidxStickerItem = InventoryAPI.GetItemDefinitionIndexFromDefinitionName('sticker');\n            for (let i = 0; i < 6; ++i) {\n                const idStickerKit = InventoryAPI.GetItemAttributeValue(tempCreatedItem, '{uint32}sticker slot ' + i + ' id');\n                if (!idStickerKit)\n                    continue;\n                const idFauxSticker = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(defidxStickerItem, idStickerKit);\n                const unCostInCredits = MissionsAPI.GetSeasonalOperationFauxCreditsCost(g_ActiveTournamentInfo.credits_id, idFauxSticker);\n                if (unCostInCredits)\n                    nTotalCostInCredits += unCostInCredits;\n                else\n                    nTotalCostInCredits += g_ActiveTournamentInfo.souvenir_cost;\n            }\n        }\n        const discountAmount = InventoryAPI.GetItemSouvenirDiscountPercent(tempCreatedItem);\n        const discountCredits = Math.trunc(nTotalCostInCredits * discountAmount / 100);\n        let discountPrice = nTotalCostInCredits;\n        if (discountCredits < nTotalCostInCredits)\n            discountPrice -= discountCredits;\n        return { discountPrice: discountPrice, originalPrice: nTotalCostInCredits, discountAmount: discountAmount };\n    }\n    let m_SouvenirCheckoutCart = ShoppingCart.cart;\n    function _OnVolatileShopSubscribe(nContainerDef, bNewPricesParsed, cp) {\n        if (nContainerDef != g_ActiveTournamentInfo.itemid_dynamic_stickers)\n            return;\n        const nTotalCostInCredits = _ComputeTotalSouvenirCost(cp).discountPrice;\n        if (m_SouvenirCheckoutCart !== ShoppingCart.cart) {\n            m_SouvenirCheckoutCart.syncPrices((itemId) => {\n                return nTotalCostInCredits;\n            });\n        }\n        let oApplySettings = {\n            headerPanel: $.GetContextPanel().FindChildInLayoutFile('PopUpCanApplyHeader'),\n            infoPanel: $.GetContextPanel().FindChildInLayoutFile('PopUpCanApplyPickSlot'),\n            asyncBarPanel: $.GetContextPanel().FindChildInLayoutFile('PopUpInspectAsyncBar'),\n            contextPanel: $.GetContextPanel(),\n            itemId: InspectShared.GetPopupSetting('temp_display_item_id') ? InspectShared.GetPopupSetting('temp_display_item_id') : InspectShared.GetPopupSetting('item_id'),\n            toolId: InspectShared.GetPopupSetting('tool_id'),\n            isRemove: false,\n            type: '',\n            funcOnConfirm: () => { },\n            funcOnNext: () => { },\n            funcOnCancel: () => { },\n            funcOnSelectForRemove: () => { }\n        };\n        CanApplyPickSlot.Init(oApplySettings);\n        _DiscountPanel(oApplySettings.contextPanel, oApplySettings.asyncBarPanel);\n    }\n    function _OnMyPersonaInventoryUpdated() {\n        if (InspectShared.GetPopupSetting('is_season_pass') && InventoryAPI.IsValidItemID(InspectShared.GetPopupSetting('item_id'))) {\n            return;\n        }\n        const worktype = InspectShared.GetPopupSetting('work_type');\n        if (worktype === \"remove_sticker\" ||\n            worktype === \"remove_patch\" ||\n            worktype === \"remove_keychain\" ||\n            worktype === \"can_sticker\" ||\n            worktype === \"can_wrap_sticker\" ||\n            worktype === \"craft_souvenir\" ||\n            worktype === \"can_patch\" ||\n            worktype === \"can_keychain\" ||\n            worktype === \"useitem\" ||\n            worktype === \"nameable\") {\n            return;\n        }\n        OnEventToClose();\n    }\n    function _OnInventoryPrestigeCoinResponse(defidx, upgradeid, hours, prestigetime) {\n        OnEventToClose();\n        if (InspectShared.GetPopupSetting('work_type') === 'prestigecheck') {\n            const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('', 'file://{resources}/layout/popups/popup_inventory_inspect.xml');\n            let oSettings = {\n                item_id: InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(defidx, 0),\n                show_work_type_warning: false,\n                work_type: (upgradeid === '0') ? 'prestigeget' : 'prestigeupgrade'\n            };\n            elPanel.Data().oSettings = oSettings;\n        }\n        else if (upgradeid !== '0') {\n            InventoryAPI.AcknowledgeNewItembyItemID(upgradeid);\n            InventoryAPI.SetItemSessionPropertyValue(upgradeid, 'recent', '1');\n            $.DispatchEvent('InventoryItemPreview', upgradeid, '');\n        }\n    }\n})(InspectAsyncActionBar || (InspectAsyncActionBar = {}));\n","scripts/popups/popup_inspect_header.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../common/icon.ts\" />\n/// <reference path=\"../common/iteminfo.ts\" />\n/// <reference path=\"popup_inspect_shared.ts\" />\nvar InspectHeader;\n(function (InspectHeader) {\n    function Init() {\n        const elHeaderPanel = $.GetContextPanel().FindChildInLayoutFile('PopUpInspectHeader');\n        const showXRayMachineUi = InspectShared.GetPopupSetting('is_xray_machine');\n        const isInspectOnly = InspectShared.GetPopupSetting('inspect_only');\n        if (isInspectOnly === false && !showXRayMachineUi)\n            return;\n        const itemId = showXRayMachineUi ? $.GetContextPanel().Data().existingRewardFromXrayId : InspectShared.GetPopupSetting('item_id');\n        elHeaderPanel.RemoveClass('hidden');\n        _SetName(elHeaderPanel, itemId);\n        _SetRarity(elHeaderPanel, itemId);\n        _SetCollectionInfo(elHeaderPanel, itemId);\n        _SetRentalTime(elHeaderPanel, itemId);\n        _SetOriginalOwner(elHeaderPanel, itemId);\n    }\n    InspectHeader.Init = Init;\n    function _SetName(elPanel, ItemId) {\n        const strViewFunc = InspectShared.GetPopupSetting('force_inspect_view_type');\n        if (ItemInfo.ItemDefinitionNameSubstrMatch(ItemId, 'tournament_journal_'))\n            ItemId = (strViewFunc === 'primary') ? ItemId : ItemInfo.GetFauxReplacementItemID(ItemId, 'graffiti');\n        elPanel.SetDialogVariable('item_name', InventoryAPI.GetItemNameUncustomized(ItemId));\n        elPanel.SetDialogVariable('item_custom_name', InventoryAPI.GetItemNameCustomized(ItemId));\n        const bShowCustomName = InventoryAPI.HasCustomName(ItemId);\n        elPanel.FindChildInLayoutFile('InspectCustomName').visible = bShowCustomName;\n        elPanel.FindChildInLayoutFile('InspectName').SetHasClass('text-align-left', ItemInfo.GetSet(ItemId) !== '');\n    }\n    function _SetRentalTime(elPanel, ItemId) {\n        const elLabel = elPanel.FindChildInLayoutFile('ItemRentalTime');\n        const expirationDate = InventoryAPI.IsRental(ItemId) ? InventoryAPI.GetExpirationDate(ItemId) : 0;\n        const bHasExpirationDate = (expirationDate > 0);\n        if (bHasExpirationDate) {\n            const oLocData = FormatText.FormatRentalTime(expirationDate);\n            elPanel.SetDialogVariable('time-remaining', oLocData.time);\n            elLabel.RemoveClass('hide');\n        }\n        elLabel.SetHasClass('hide', !bHasExpirationDate);\n    }\n    function _SetOriginalOwner(elPanel, itemId) {\n        const elOriginalOwner = elPanel.FindChildInLayoutFile('InspectOriginalOwner');\n        elOriginalOwner.visible = (InventoryAPI.GetItemAttributeValue(itemId, '{uint32}purchaser account id') != undefined);\n        const elImage = elPanel.FindChildInLayoutFile('InspectSetImage');\n        elOriginalOwner.SetHasClass('horizontal-center', !elImage.visible);\n    }\n    function _SetRarity(elPanel, itemId) {\n        const rarityColor = InventoryAPI.GetItemRarityColor(itemId);\n        if (rarityColor) {\n            elPanel.FindChildInLayoutFile('InspectBar').style.washColor = rarityColor;\n        }\n    }\n    function _SetCollectionInfo(elPanel, itemId) {\n        const setName = ItemInfo.GetSet(itemId);\n        const elImage = elPanel.FindChildInLayoutFile('InspectSetImage');\n        const elLabel = elPanel.FindChildInLayoutFile('InspectCollection');\n        if (InventoryAPI.DoesItemMatchDefinitionByName(itemId, \"Remove Keychain Tool\")) {\n            elImage.SetImage('file://{images}/icons/ui/keychain_removal.svg');\n            elImage.visible = true;\n            const numKeychainRemoveToolChargesRemaining = InventoryAPI.GetCacheTypeElementFieldByIndex('KeychainRemoveToolCharges', 0, 'charges');\n            elLabel.SetDialogVariableInt('item_count', numKeychainRemoveToolChargesRemaining);\n            elLabel.text = $.Localize('#Attrib_KeychainRemoveTool_Charges', elLabel);\n            elLabel.visible = true;\n            return;\n        }\n        if (setName === '') {\n            elImage.visible = false;\n            elLabel.visible = false;\n            return;\n        }\n        elLabel.text = $.Localize('#CSGO_' + setName);\n        elLabel.visible = true;\n        IconUtil.SetupFallbackItemSetIcon(elImage, setName);\n        IconUtil.SetItemSetSVGImage(elImage, setName);\n        elImage.visible = true;\n    }\n})(InspectHeader || (InspectHeader = {}));\n","scripts/popups/popup_inspect_purchase-bar.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../common/iteminfo.ts\" />\n/// <reference path=\"../popups/popup_inspect_shared.ts\" />\nvar InspectPurchaseBar;\n(function (InspectPurchaseBar) {\n    function Init() {\n        const elPurchaseBar = $.GetContextPanel().FindChildInLayoutFile('PopUpInspectPurchaseBar');\n        elPurchaseBar.FindChildInLayoutFile('id-popup-purchase').SetPanelEvent('onactivate', ClosePopup);\n        if (InspectShared.GetPopupSetting('only_close_btn')) {\n            elPurchaseBar.FindChildInLayoutFile('id-purchase-section').visible = false;\n            elPurchaseBar.RemoveClass('hidden');\n            return;\n        }\n        const storeItemId = InspectShared.GetPopupSetting(\"store_item_id\");\n        const purchaseItemId = (!storeItemId ? InspectShared.GetPopupSetting('purchase_item_id') : storeItemId);\n        if (!InventoryAPI.IsValidItemID(purchaseItemId)) {\n            elPurchaseBar.AddClass('hidden');\n            return;\n        }\n        InspectShared.SetPopupSetting('purchase_item_id', purchaseItemId);\n        const bFauxItemIdForPurchase = InventoryAPI.IsFauxItemID(purchaseItemId);\n        const priceOriginal = bFauxItemIdForPurchase ? ItemInfo.GetStoreOriginalPrice(purchaseItemId, 1) : '';\n        const sRestriction = InspectShared.GetPopupSetting('store_item_id') ? '' :\n            InventoryAPI.GetDecodeableRestriction(InspectShared.GetPopupSetting('item_id'));\n        const showXrayMachineUi = InspectShared.GetPopupSetting(\"is_xray_machine\");\n        if ((InspectShared.GetPopupSetting(\"work_type\") === 'delete') ||\n            (InspectShared.GetPopupSetting('inspect_only') === true) ||\n            !InventoryAPI.IsValidItemID(purchaseItemId) ||\n            !priceOriginal ||\n            sRestriction === 'xray' && !showXrayMachineUi ||\n            sRestriction === 'restricted' && !$.GetContextPanel().Data().existingRewardFromXrayId) {\n            elPurchaseBar.AddClass('hidden');\n            return;\n        }\n        elPurchaseBar.RemoveClass('hidden');\n        _SetPurchaseImage(elPurchaseBar, InspectShared.GetPopupSetting('item_id'));\n        elPurchaseBar.SetDialogVariable(\"itemname\", InventoryAPI.GetItemName(purchaseItemId));\n        const descString = InspectShared.GetPopupSetting('allow_rent') ? '#popup_capability_upsell_rental' : '#popup_capability_upsell';\n        _UpdateDecString(elPurchaseBar, storeItemId, descString);\n        _SetUpPurchaseBtn(elPurchaseBar);\n        _SetUpDropdownAction(elPurchaseBar, $.GetContextPanel());\n        _UpdatePurchasePrice(elPurchaseBar, $.GetContextPanel());\n    }\n    InspectPurchaseBar.Init = Init;\n    function _SetPurchaseImage(elPanel, itemId) {\n        const elImage = elPanel.FindChildInLayoutFile('PurchaseItemImage');\n        const showXrayMachineUi = InspectShared.GetPopupSetting(\"is_xray_machine\");\n        elImage.itemid = itemId;\n        elImage.SetHasClass('popup-capability-faded', showXrayMachineUi && !InspectShared.GetPopupSetting('allow_xray_purchase'));\n    }\n    function _UpdateDecString(elPanel, storeItemId, descString) {\n        const elDesc = elPanel.FindChildInLayoutFile('PurchaseItemName');\n        const showXrayMachineUi = InspectShared.GetPopupSetting(\"is_xray_machine\");\n        if (showXrayMachineUi) {\n            elPanel.SetDialogVariable(\"itemprice\", ItemInfo.GetStoreSalePrice(InspectShared.GetPopupSetting('purchase_item_id'), 1));\n            elDesc.text = \"#popup_capability_upsell_xray\";\n        }\n        else if (!storeItemId && !InspectShared.GetPopupSetting('tool_id')) {\n            elDesc.text = descString;\n        }\n        else {\n            elDesc.text = \"#popup_capability_use\";\n        }\n        const allowXrayPurchase = InspectShared.GetPopupSetting('allow_xray_purchase');\n        elDesc.SetHasClass('popup-capability-faded', showXrayMachineUi && !allowXrayPurchase);\n    }\n    function _UpdatePurchasePrice(elPurchaseBar, contextPanel) {\n        if (!elPurchaseBar || !elPurchaseBar.IsValid())\n            return;\n        const elBtn = elPurchaseBar.FindChildInLayoutFile('PurchaseBtn');\n        const elDropdown = elPurchaseBar.FindChildInLayoutFile('PurchaseCountDropdown');\n        let qty = 1;\n        const showXrayMachineUi = InspectShared.GetPopupSetting(\"is_xray_machine\", contextPanel);\n        const bCanShowQuantityDropdown = !showXrayMachineUi && _isAllowedToPurchaseMultiple(contextPanel);\n        elDropdown.visible = bCanShowQuantityDropdown;\n        if (bCanShowQuantityDropdown) {\n            qty = Number(elDropdown.GetSelected().id);\n        }\n        const salePrice = ItemInfo.GetStoreSalePrice(InspectShared.GetPopupSetting('purchase_item_id', contextPanel), qty);\n        elBtn.text = showXrayMachineUi ? '#popup_totool_purchase_header2' : salePrice;\n        _UpdateSalePrice(elPurchaseBar, qty, contextPanel);\n    }\n    function _isAllowedToPurchaseMultiple(contextPanel) {\n        const OverridePurchaseMultiple = InspectShared.GetPopupSetting(\"override_purchase_limit\", contextPanel);\n        const purchaseItemId = InspectShared.GetPopupSetting('purchase_item_id', contextPanel);\n        if (OverridePurchaseMultiple)\n            return (OverridePurchaseMultiple);\n        const attValue = InventoryAPI.GetItemAttributeValue(purchaseItemId, 'season access');\n        if (attValue)\n            return false;\n        const strToolType = InventoryAPI.GetToolType(purchaseItemId);\n        if (strToolType === 'fantoken')\n            return false;\n        const defName = InventoryAPI.GetItemDefinitionName(purchaseItemId);\n        if (defName === 'casket')\n            return false;\n        if (defName && defName.startsWith('XpShopTicket'))\n            return false;\n        return true;\n    }\n    function _SetUpPurchaseBtn(elPurchaseBar) {\n        const allowXrayPurchase = InspectShared.GetPopupSetting('allow_xray_purchase');\n        const showXrayMachineUi = InspectShared.GetPopupSetting(\"is_xray_machine\");\n        const purchaseItemId = InspectShared.GetPopupSetting('purchase_item_id');\n        const elDropdown = elPurchaseBar.FindChildInLayoutFile('PurchaseCountDropdown');\n        elPurchaseBar.FindChildInLayoutFile('PurchaseBtn').enabled = !showXrayMachineUi || (showXrayMachineUi && allowXrayPurchase);\n        elPurchaseBar.FindChildInLayoutFile('PurchaseBtn').SetPanelEvent('onactivate', () => {\n            const qty = Number(elDropdown.GetSelected().id);\n            const itemDefitionNameString = InventoryAPI.GetItemDefinitionName(purchaseItemId);\n            const purchaseList = [];\n            for (let i = 0; i < qty; i++) {\n                purchaseList.push(purchaseItemId);\n            }\n            const purchaseString = purchaseList.join(',');\n            if (itemDefitionNameString && itemDefitionNameString.startsWith('coupon - crate_patch_') &&\n                !ItemInfo.FindAnyUserOwnedCharacterItemID()) {\n                UiToolkitAPI.ShowGenericPopupYesNo($.Localize('#CSGO_Patch_NoAgent_Title'), $.Localize('#CSGO_Patch_NoAgent_Message'), '', () => StoreAPI.StoreItemPurchase(purchaseString), () => { });\n            }\n            else {\n                StoreAPI.StoreItemPurchase(purchaseString);\n            }\n            $.DispatchEvent(\"CSGOPlaySoundEffect\", \"UIPanorama.buymenu_purchase\", \"MOUSE\");\n        });\n    }\n    function _UpdateSalePrice(elPurchaseBar, qty, contextPanel) {\n        const purchaseItemId = InspectShared.GetPopupSetting('purchase_item_id', contextPanel);\n        const price = ItemInfo.GetStoreOriginalPrice(purchaseItemId, qty);\n        const elSalePrice = elPurchaseBar.FindChildInLayoutFile('PurchaseSalePrice');\n        const elSalePercent = elPurchaseBar.FindChildInLayoutFile('PurchaseItemPercent');\n        const salePercent = StoreAPI.GetStoreItemPercentReduction(purchaseItemId);\n        if (salePercent) {\n            elSalePrice.visible = true;\n            elSalePrice.text = price;\n            elSalePercent.visible = true;\n            elSalePercent.text = salePercent;\n            return;\n        }\n        elSalePrice.visible = false;\n        elSalePercent.visible = false;\n    }\n    function _SetUpDropdownAction(elPurchaseBar, contextPanel) {\n        elPurchaseBar.FindChildInLayoutFile('PurchaseCountDropdown').SetPanelEvent('oninputsubmit', () => _OnDropdownUpdate(elPurchaseBar, contextPanel));\n    }\n    function _OnDropdownUpdate(elPurchaseBar, contextPanel) {\n        _UpdatePurchasePrice(elPurchaseBar, contextPanel);\n    }\n    function ClosePopup() {\n        InventoryAPI.StopItemPreviewMusic();\n        $.DispatchEvent('HideSelectItemForCapabilityPopup');\n        $.DispatchEvent('UIPopupButtonClicked', '');\n        $.DispatchEvent('CapabilityPopupIsOpen', false);\n    }\n    InspectPurchaseBar.ClosePopup = ClosePopup;\n})(InspectPurchaseBar || (InspectPurchaseBar = {}));\n","scripts/popups/popup_inspect_rental-bar.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../common/iteminfo.ts\" />\n/// <reference path=\"popup_acknowledge_item.ts\" />\n/// <reference path=\"popup_capability_decodable.ts\" />\n/// <reference path=\"popup_inspect_shared.ts\" />\nvar InspectRentalBar;\n(function (InspectRentalBar) {\n    function Init() {\n        const elRentalBar = $.GetContextPanel().FindChildInLayoutFile('PopUpInspectRentalBar');\n        const itemId = InspectShared.GetPopupSetting('item_id');\n        const toolId = InspectShared.GetPopupSetting('tool_id');\n        const worktype = InspectShared.GetPopupSetting('work_type');\n        const contextPanel = $.GetContextPanel();\n        contextPanel.Data().rentalBarPanelRegisteredForEvents = false;\n        contextPanel.Data().onlyRentalItemIds = [];\n        const allowRental = InspectShared.GetPopupSetting('allow_rent');\n        const sRestriction = InspectShared.GetPopupSetting('store_item_id') ? '' : InventoryAPI.GetDecodeableRestriction(itemId);\n        const showXrayMachineUi = InspectShared.GetPopupSetting('is_xray_machine');\n        let isXrayRestriction = sRestriction === 'xray';\n        if (InspectShared.GetPopupSetting('inspect_only') ||\n            worktype !== 'decodeable' ||\n            !allowRental ||\n            (InspectShared.GetPopupSetting('purchase_item_id') && !sRestriction) ||\n            showXrayMachineUi ||\n            !InventoryAPI.IsValidItemID(itemId)) {\n            elRentalBar.AddClass('hidden');\n            return;\n        }\n        elRentalBar.RemoveClass('hidden');\n        elRentalBar.SetHasClass('show-xray-buttons', sRestriction !== '');\n        _SetNumLootlistItems(elRentalBar, itemId);\n        _SetuUpButtonsBasedOnRestrictions(sRestriction, elRentalBar);\n        if (!isXrayRestriction && toolId) {\n            elRentalBar.FindChildInLayoutFile('UseItemImage').itemid = toolId;\n            _SetDescString(elRentalBar);\n        }\n        if (!contextPanel.Data().rentalBarPanelRegisteredForEvents) {\n            contextPanel.Data().rentalBarPanelRegisteredForEvents = true;\n            $.RegisterForUnhandledEvent('PanoramaComponent_MyPersona_InventoryUpdated', () => _OnMyPersonaInventoryUpdated(contextPanel));\n        }\n    }\n    InspectRentalBar.Init = Init;\n    function _SetDescString(elRentalBar) {\n        const elLabel = elRentalBar.FindChildInLayoutFile('UseItemName');\n        const toolId = InspectShared.GetPopupSetting('tool_id');\n        const worktype = InspectShared.GetPopupSetting('work_type');\n        elLabel.SetDialogVariable('itemname', InventoryAPI.GetItemName(toolId));\n        elLabel.text = $.Localize('#popup_' + worktype + '_async_desc', elLabel);\n        elLabel.visible = true;\n    }\n    function _SetuUpButtonsBasedOnRestrictions(sRestriction, elRentalBar) {\n        const contextPanel = $.GetContextPanel();\n        const itemId = InspectShared.GetPopupSetting('item_id');\n        const keyToSellId = InspectShared.GetPopupSetting('purchase_item_id');\n        if (sRestriction) {\n            const elPurchaseBtn = elRentalBar.FindChildInLayoutFile('PurchaseKeyBtn');\n            const elXrayRentBtn = elRentalBar.FindChildInLayoutFile('RentBtnXray');\n            if (keyToSellId) {\n                elPurchaseBtn.SetHasClass('hide', false);\n                elXrayRentBtn.SetHasClass('hide', true);\n                elPurchaseBtn.FindChildInLayoutFile('SellItemImage').itemid = keyToSellId;\n                elRentalBar.SetDialogVariable('itemname', InventoryAPI.GetItemName(keyToSellId));\n                elRentalBar.SetDialogVariable(\"price\", ItemInfo.GetStoreSalePrice(keyToSellId, 1));\n                elPurchaseBtn.SetPanelEvent('onactivate', () => {\n                    StoreAPI.StoreItemPurchase(keyToSellId);\n                    contextPanel.Data().confirmPopUpOpen = true;\n                });\n                if (sRestriction === 'xray')\n                    _HoverEvents(elPurchaseBtn, null, contextPanel);\n            }\n            else {\n                elPurchaseBtn.SetHasClass('hide', true);\n                elXrayRentBtn.SetHasClass('hide', false);\n                elXrayRentBtn.SetPanelEvent('onactivate', () => {\n                    _SetUpRentActionBtn('rent', contextPanel);\n                });\n                if (sRestriction === 'xray')\n                    _HoverEvents(elXrayRentBtn, null, contextPanel);\n            }\n            let xrayBtn = elRentalBar.FindChildInLayoutFile('OpenXray');\n            xrayBtn.SetHasClass('hide', sRestriction === 'restricted');\n            if (sRestriction !== 'restricted') {\n                xrayBtn.SetPanelEvent('onactivate', () => {\n                    $.DispatchEvent(\"ShowXrayCasePopup\", '', itemId, false);\n                    ClosePopup(contextPanel);\n                });\n                _HoverEvents(null, xrayBtn, contextPanel);\n            }\n            if (sRestriction === 'restricted') {\n                elRentalBar?.GetParent().GetParent().SetHasClass('rental-mode', true);\n            }\n        }\n        else {\n            let RentBtn = elRentalBar.FindChildInLayoutFile('RentBtn');\n            let ActionBtn = elRentalBar.FindChildInLayoutFile('OpenBtn');\n            _HoverEvents(RentBtn, ActionBtn, contextPanel);\n            RentBtn.SetPanelEvent('onactivate', () => {\n                _SetUpRentActionBtn('rent', contextPanel);\n            });\n            ActionBtn.SetPanelEvent('onactivate', () => {\n                OpenConfirmPopup('open', itemId, contextPanel);\n            });\n        }\n    }\n    function _SetNumLootlistItems(elRentalBar, itemId) {\n        let count = InventoryAPI.GetLootListItemsCount(itemId);\n        count = InventoryAPI.GetLootListItemIdByIndex(itemId, (count - 1)) == '0' ? count - 1 : count;\n        elRentalBar?.SetDialogVariableInt('numlootlist', count);\n    }\n    function _SetUpRentActionBtn(type, contextPanel) {\n        let sTimeRemainingString = GetAlreadyRentedItemsExpirationTime(contextPanel);\n        const itemId = InspectShared.GetPopupSetting('item_id', contextPanel);\n        contextPanel.Data().confirmPopUpOpen = true;\n        if (sTimeRemainingString) {\n            contextPanel.SetDialogVariable('time-remaining', sTimeRemainingString);\n            contextPanel.SetDialogVariable('name', InventoryAPI.GetItemName(itemId));\n            contextPanel.SetDialogVariable('expiration-time', $.Localize(sTimeRemainingString));\n            UiToolkitAPI.ShowGenericPopupOk('#popup_container_confirm_title_rent', $.Localize('#popup_container_confirm_already_rented', contextPanel), '', () => $.DispatchEvent('UIPopupButtonClicked', ''));\n        }\n        else {\n            OpenConfirmPopup(type, itemId, contextPanel);\n        }\n    }\n    function OpenConfirmPopup(type, itemId, contextPanel) {\n        contextPanel.Data().rentalBarPopupActionCallbackHandle = UiToolkitAPI.RegisterJSCallback(() => _OnPopupActionPressed(type, contextPanel));\n        UiToolkitAPI.ShowCustomLayoutPopupParameters('', 'file://{resources}/layout/popups/popup_container_open_confirm.xml', 'action-type=' + type\n            + '&' + 'case=' + itemId\n            + '&' + 'callback=' + contextPanel.Data().rentalBarPopupActionCallbackHandle);\n    }\n    function _OnPopupActionPressed(actionType, contextPanel) {\n        _OpenActions(contextPanel);\n        contextPanel.Data().actionType = actionType;\n        const toolId = InspectShared.GetPopupSetting('tool_id', contextPanel);\n        const itemId = InspectShared.GetPopupSetting('item_id', contextPanel);\n        if (actionType === 'open') {\n            InventoryAPI.UseTool(toolId, itemId);\n            $.DispatchEvent('StartDecodeableAnim');\n            return;\n        }\n        InventoryAPI.UseToolWithIntArg(toolId, itemId, 5318008);\n        $.DispatchEvent('StartRentalAnim');\n        $.Schedule(2.75, () => ShowRentalInspect(contextPanel));\n    }\n    function _OpenActions(contextPanel) {\n        if (contextPanel.Data().rentalBarPopupActionCallbackHandle) {\n            UiToolkitAPI.UnregisterJSCallback(contextPanel.Data().rentalBarPopupActionCallbackHandle);\n        }\n        const elRentalBar = contextPanel.FindChildInLayoutFile('PopUpInspectRentalBar');\n        elRentalBar.FindChildInLayoutFile('OpenBtn').SetHasClass('is-active-action', true);\n        elRentalBar.FindChildInLayoutFile('OpenBtn').enabled = false;\n        elRentalBar.FindChildInLayoutFile('RentBtn').enabled = false;\n        _ResetTimeoutHandle(contextPanel);\n        contextPanel.Data().rentalBarScheduleActionTimoutHandle = $.Schedule(6, () => _ShowActionTimeOutPopup(contextPanel));\n    }\n    function _HoverEvents(RentBtn, ActionBtn, contextPanel) {\n        const elRentalBar = contextPanel.FindChildInLayoutFile('PopUpInspectRentalBar');\n        if (RentBtn) {\n            RentBtn.SetPanelEvent('onmouseover', () => {\n                contextPanel.Data().confirmPopUpOpen = false;\n                elRentalBar?.GetParent().GetParent().SetHasClass('rental-mode', true);\n            });\n            RentBtn.SetPanelEvent('onmouseout', () => {\n                if (!contextPanel.Data().confirmPopUpOpen) {\n                    elRentalBar?.GetParent().GetParent().SetHasClass('rental-mode', false);\n                }\n            });\n        }\n        if (ActionBtn) {\n            ActionBtn.SetPanelEvent('onmouseover', () => {\n                elRentalBar?.GetParent().GetParent().SetHasClass('rental-mode', false);\n            });\n        }\n    }\n    function GetAlreadyRentedItemsExpirationTime(contextPanel) {\n        const itemId = InspectShared.GetPopupSetting('item_id', contextPanel);\n        let defIndex = InventoryAPI.GetItemDefinitionIndex(itemId);\n        const nRentalHistoryCount = InventoryAPI.GetCacheTypeElementsCount('RentalHistory');\n        if (nRentalHistoryCount < 1) {\n            return '';\n        }\n        let nExpirationDate = 0;\n        for (let i = 0; i < nRentalHistoryCount; ++i) {\n            const oRentalHistory = InventoryAPI.GetCacheTypeElementJSOByIndex('RentalHistory', i);\n            if (oRentalHistory.crate_def_index === defIndex) {\n                nExpirationDate = nExpirationDate < oRentalHistory.expiration_date ? oRentalHistory.expiration_date : nExpirationDate;\n            }\n        }\n        let oLocData = FormatText.FormatRentalTime(nExpirationDate);\n        return oLocData.time;\n    }\n    function _ShowActionTimeOutPopup(contextPanel) {\n        contextPanel.Data().rentalBarScheduleActionTimoutHandle = null;\n        const elRentalBar = contextPanel.FindChildInLayoutFile('PopUpInspectRentalBar');\n        if (!elRentalBar || !elRentalBar?.IsValid()) {\n            return;\n        }\n        ClosePopup(contextPanel);\n        UiToolkitAPI.ShowGenericPopupOk($.Localize('#SFUI_SteamConnectionErrorTitle'), $.Localize('#SFUI_InvError_Item_Not_Given'), '', () => { });\n    }\n    InspectRentalBar._ShowActionTimeOutPopup = _ShowActionTimeOutPopup;\n    function _ResetTimeoutHandle(contextPanel) {\n        if (contextPanel.Data().rentalBarScheduleActionTimoutHandle && typeof contextPanel.Data().rentalBarScheduleActionTimoutHandle === \"number\") {\n            $.CancelScheduled(contextPanel.Data().rentalBarScheduleActionTimoutHandle);\n            contextPanel.Data().rentalBarScheduleActionTimoutHandle = null;\n        }\n    }\n    function ClosePopup(contextPanel) {\n        _ResetTimeoutHandle(contextPanel);\n        $.DispatchEvent('HideSelectItemForCapabilityPopup');\n        $.DispatchEvent('UIPopupButtonClicked', '');\n        $.DispatchEvent('CapabilityPopupIsOpen', false);\n    }\n    InspectRentalBar.ClosePopup = ClosePopup;\n    function _OnMyPersonaInventoryUpdated(contextPanel) {\n        const worktype = InspectShared.GetPopupSetting('work_type');\n        const actionType = $.GetContextPanel().Data().actionType;\n        if (worktype === 'decodeable') {\n            const newItems = AcknowledgeItems.GetItems();\n            if (newItems.length > 0 && newItems.filter(entry => entry.pickuptype === 'found_in_crate').length > 0) {\n                _ResetTimeoutHandle(contextPanel);\n            }\n            if (actionType === 'rent') {\n                newItems.filter(entry => InventoryAPI.IsRental(entry.id)).forEach(entry => {\n                    contextPanel.Data().onlyRentalItemIds.push(entry.id);\n                    InventoryAPI.SetItemSessionPropertyValue(entry.id, 'recent', '1');\n                    InventoryAPI.AcknowledgeNewItembyItemID(entry.id);\n                });\n            }\n        }\n    }\n    function ShowRentalInspect(contextPanel) {\n        if (contextPanel.Data().onlyRentalItemIds.length > 0) {\n            const itemId = InspectShared.GetPopupSetting('item_id', contextPanel);\n            const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('', 'file://{resources}/layout/popups/popup_inventory_inspect.xml');\n            let oSettings = {\n                item_id: contextPanel.Data().onlyRentalItemIds[0],\n                inspect_only: true,\n                hide_all_action_items: true,\n                rental_item_ids: contextPanel.Data().onlyRentalItemIds.join(','),\n                case_id_for_lootlist: itemId,\n            };\n            elPanel.Data().oSettings = oSettings;\n            ClosePopup(contextPanel);\n            return;\n        }\n        else {\n            _ShowActionTimeOutPopup(contextPanel);\n        }\n    }\n})(InspectRentalBar || (InspectRentalBar = {}));\n","scripts/popups/popup_inspect_shared.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\nvar InspectShared;\n(function (InspectShared) {\n    function GetPopupSetting(key, contextPanel = null) {\n        let cp = !contextPanel ? $.GetContextPanel() : contextPanel;\n        let oSettings = cp.Data().oSettings;\n        if (oSettings) {\n            const value = oSettings[key];\n            return value === undefined ? false : value;\n        }\n        return false;\n    }\n    InspectShared.GetPopupSetting = GetPopupSetting;\n    function SetPopupSetting(setting, value, contextPanel = null) {\n        let cp = !contextPanel ? $.GetContextPanel() : contextPanel;\n        let oSettings = cp.Data().oSettings;\n        if (oSettings) {\n            oSettings[setting] = value;\n        }\n    }\n    InspectShared.SetPopupSetting = SetPopupSetting;\n})(InspectShared || (InspectShared = {}));\n","scripts/popups/popup_inventory_inspect.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../inspect.ts\" />\n/// <reference path=\"../notification/notification_equip.ts\" />\n/// <reference path=\"popup_inspect_action-bar.ts\" />\n/// <reference path=\"popup_inspect_async-bar.ts\" />\n/// <reference path=\"popup_inspect_header.ts\" />\n/// <reference path=\"popup_capability_header.ts\" />\n/// <reference path=\"popup_inspect_purchase-bar.ts\" />\n/// <reference path=\"popup_inspect_shared.ts\" />\nvar InventoryInspect;\n(function (InventoryInspect) {\n    let _m_PanelRegisteredForEvents;\n    function Init() {\n        const itemId = InspectShared.GetPopupSetting('item_id');\n        $.GetContextPanel().SetAttributeString('popup-id', $.GetContextPanel().id);\n        if (InventoryAPI.IsRental(itemId)) {\n            InspectShared.SetPopupSetting('hide_all_action_items', true);\n            InspectShared.SetPopupSetting('inspect_only', true);\n        }\n        if (!_m_PanelRegisteredForEvents) {\n            _m_PanelRegisteredForEvents = $.RegisterForUnhandledEvent('PanoramaComponent_Loadout_EquipSlotChanged', _ShowNotification);\n            $.RegisterForUnhandledEvent('PanoramaComponent_Store_PurchaseCompleted', _ItemAcquired);\n            $.RegisterForUnhandledEvent(\"CSGOInspectBackgroundMapChanged\", _UpdateInspectMap);\n        }\n        _SetupLootlistNavPanels(itemId);\n        _UpdatePanelData(itemId);\n        _PlayShowPanelSound(itemId);\n        _LoadEquipNotification();\n    }\n    InventoryInspect.Init = Init;\n    function _UpdatePanelData(itemId) {\n        InspectShared.SetPopupSetting('item_id', itemId);\n        const elItemModelImagePanel = $.GetContextPanel().FindChildInLayoutFile('PopUpInspectModelOrImage');\n        InspectModelImage.Init(elItemModelImagePanel, itemId);\n        InspectActionBar.Init();\n        InspectAsyncActionBar.Init();\n        InspectHeader.Init();\n        CapabilityHeader.Init();\n        InspectPurchaseBar.Init();\n        _SetDescription(itemId);\n        if (ItemInfo.IsPet(itemId)) {\n            InspectModelImage.StartPetLookAt();\n        }\n    }\n    function _PlayShowPanelSound(itemId) {\n        const category = InventoryAPI.GetLoadoutCategory(itemId);\n        const slot = InventoryAPI.GetDefaultSlot(itemId);\n        let inspectSound = \"\";\n        if (category == \"heavy\" || category == \"rifle\" || category == \"smg\" || category == \"secondary\") {\n            inspectSound = \"inventory_inspect_weapon\";\n        }\n        else if (category == \"melee\") {\n            inspectSound = \"inventory_inspect_knife\";\n        }\n        else if (ItemInfo.IsSticker(itemId)) {\n            inspectSound = \"inventory_inspect_sticker\";\n        }\n        else if (category == \"spray\") {\n            inspectSound = \"inventory_inspect_graffiti\";\n        }\n        else if (category == \"musickit\") {\n            inspectSound = \"inventory_inspect_musicKit\";\n        }\n        else if (category == \"flair0\") {\n            inspectSound = \"inventory_inspect_coin\";\n        }\n        else if (category == \"clothing\" && slot == \"clothing_hands\") {\n            inspectSound = \"inventory_inspect_gloves\";\n        }\n        else {\n            inspectSound = \"inventory_inspect_sticker\";\n        }\n        $.DispatchEvent(\"CSGOPlaySoundEffect\", inspectSound, \"MOUSE\");\n    }\n    function _SetDescription(id) {\n        $.GetContextPanel().SetDialogVariable('item_description', '');\n        if (!InventoryAPI.IsValidItemID(id)) {\n            return;\n        }\n        const descText = InventoryAPI.GetItemDescription(id, '');\n        const shortString = descText.substring(0, descText.indexOf(\"</font></b><br><font color='#9da1a9'>\"));\n        $.GetContextPanel().SetDialogVariable('item_description', shortString === '' ? descText : shortString);\n    }\n    function _LoadEquipNotification() {\n        const elParent = $.GetContextPanel();\n        const elNotification = $.CreatePanel('Panel', elParent, 'InspectNotificationEquip');\n        elNotification.BLoadLayout('file://{resources}/layout/notification/notification_equip.xml', false, false);\n    }\n    function _ShowNotification(team, slot, oldItemId, newItemId, bNew) {\n        if (!bNew)\n            return;\n        const elNotification = $.GetContextPanel().FindChildInLayoutFile('InspectNotificationEquip');\n        if (elNotification && elNotification.IsValid()) {\n            EquipNotification.ShowEquipNotification(elNotification, slot, newItemId);\n        }\n    }\n    function _UpdateInspectMap() {\n        InspectModelImage.SwitchMap($.GetContextPanel());\n    }\n    let m_lootlistItemIndex = 0;\n    function _SetupLootlistNavPanels(itemId) {\n        m_lootlistItemIndex = 0;\n        let aLootlistIds = _GetLootlistItems();\n        if (aLootlistIds.length < 1) {\n            const rentalItemIds = InspectShared.GetPopupSetting('rental_item_ids');\n            if (!rentalItemIds) {\n                $.GetContextPanel().FindChildInLayoutFile('id-lootlist-btns-container').visible = false;\n                $.GetContextPanel().FindChildInLayoutFile('id-lootlist-title-container').visible = false;\n                return;\n            }\n            aLootlistIds = rentalItemIds.split(',');\n        }\n        InspectShared.SetPopupSetting('is_item_in_lootlist', true);\n        $.GetContextPanel().FindChildInLayoutFile('id-lootlist-btns-container').visible = true;\n        $.GetContextPanel().FindChildInLayoutFile('id-lootlist-title-container').visible = true;\n        m_lootlistItemIndex = aLootlistIds.indexOf(itemId);\n        const btnNext = $.GetContextPanel().FindChildInLayoutFile('id-lootlist-next');\n        const btnPrev = $.GetContextPanel().FindChildInLayoutFile('id-lootlist-prev');\n        const count = aLootlistIds.length;\n        _EnableNextPrevBtns(aLootlistIds);\n        _UpdateLootlistTitleBar(count);\n        btnNext.SetPanelEvent('onactivate', () => {\n            m_lootlistItemIndex = (m_lootlistItemIndex < (count - 1)) ? m_lootlistItemIndex + 1 : m_lootlistItemIndex;\n            _EnableNextPrevBtns(aLootlistIds);\n            _UpdatePanelData(aLootlistIds[m_lootlistItemIndex]);\n            _UpdateCharacterModelPanel(aLootlistIds[m_lootlistItemIndex]);\n        });\n        btnPrev.SetPanelEvent('onactivate', () => {\n            m_lootlistItemIndex = m_lootlistItemIndex > 0 ? m_lootlistItemIndex - 1 : m_lootlistItemIndex;\n            _EnableNextPrevBtns(aLootlistIds);\n            _UpdatePanelData(aLootlistIds[m_lootlistItemIndex]);\n            _UpdateCharacterModelPanel(aLootlistIds[m_lootlistItemIndex]);\n        });\n    }\n    function _UpdateCharacterModelPanel(itemId) {\n        if (!(ItemInfo.IsWeapon(itemId) || ItemInfo.IsMelee(itemId))) {\n            return;\n        }\n        const elCp = $.GetContextPanel();\n        const elActionBarPanel = elCp.FindChildInLayoutFile('PopUpInspectActionBar');\n        InspectActionBar.OnUpdateCharModel(elActionBarPanel.FindChildInLayoutFile('InspectDropdownCharModels'), itemId, elCp);\n    }\n    function _EnableNextPrevBtns(aLootlistIds) {\n        const btnNext = $.GetContextPanel().FindChildInLayoutFile('id-lootlist-next');\n        const btnPrev = $.GetContextPanel().FindChildInLayoutFile('id-lootlist-prev');\n        btnNext.enabled = (m_lootlistItemIndex < aLootlistIds.length - 1) && (aLootlistIds[m_lootlistItemIndex + 1] !== '0');\n        btnPrev.enabled = m_lootlistItemIndex > 0;\n        _SetBtnLabel(btnNext, btnPrev, aLootlistIds);\n        _UpdateLootlistTitleBar(aLootlistIds.length);\n    }\n    function _SetBtnLabel(btnNext, btnPrev, aLootlistIds) {\n        if (btnNext.enabled) {\n            const elNextLabel = btnNext.FindChildInLayoutFile('id-lootlist-label');\n            elNextLabel.text = InventoryAPI.GetItemName(aLootlistIds[m_lootlistItemIndex + 1]);\n            const rarityColor = InventoryAPI.GetItemRarityColor(aLootlistIds[m_lootlistItemIndex + 1]);\n            if (rarityColor) {\n                btnNext.FindChildInLayoutFile('id-lootlist-rarity').style.washColor = rarityColor;\n            }\n        }\n        if (btnPrev.enabled) {\n            const elPrevLabel = btnPrev.FindChildInLayoutFile('id-lootlist-label');\n            elPrevLabel.text = InventoryAPI.GetItemName(aLootlistIds[m_lootlistItemIndex - 1]);\n            const rarityColor = InventoryAPI.GetItemRarityColor(aLootlistIds[m_lootlistItemIndex - 1]);\n            if (rarityColor) {\n                btnPrev.FindChildInLayoutFile('id-lootlist-rarity').style.washColor = rarityColor;\n            }\n        }\n    }\n    function _GetLootlistItems() {\n        m_lootlistItemIndex = 0;\n        const aLootlistIds = [];\n        const caseId = InspectShared.GetPopupSetting('case_id_for_lootlist');\n        if (!caseId) {\n            return aLootlistIds;\n        }\n        const count = InventoryAPI.GetLootListItemsCount(caseId);\n        for (let i = 0; i < count; i++) {\n            aLootlistIds.push(InventoryAPI.GetLootListItemIdByIndex(caseId, i));\n        }\n        return aLootlistIds;\n    }\n    function _UpdateLootlistTitleBar(count) {\n        const elPanel = $.GetContextPanel().FindChildInLayoutFile('id-lootlist-title-container');\n        const lootlistOverride = InspectShared.GetPopupSetting('lootlist_name_override');\n        let caseName;\n        if (lootlistOverride !== 'false' && lootlistOverride !== '') {\n            caseName = $.Localize(lootlistOverride, $.GetContextPanel());\n        }\n        else {\n            const caseId = InspectShared.GetPopupSetting('case_id_for_lootlist');\n            caseName = InventoryAPI.GetItemName(caseId);\n        }\n        elPanel.SetDialogVariable('container', caseName);\n        elPanel.SetDialogVariableInt('index', m_lootlistItemIndex + 1);\n        elPanel.SetDialogVariableInt('total', count);\n        const rentalItemIds = InspectShared.GetPopupSetting('rental_item_ids');\n        const text = !rentalItemIds ? $.Localize('#popup_inv_lootlist_header', elPanel) : $.Localize('#popup_inv_lootlist_rental_header', elPanel);\n        elPanel.SetDialogVariable('lootlist-header', text);\n    }\n    function _ItemAcquired(ItemId) {\n        const storeItemId = InspectShared.GetPopupSetting('store_item_id');\n        if (storeItemId) {\n            const storeItemSeasonAccess = InventoryAPI.GetItemAttributeValue(storeItemId, 'season access');\n            const acquiredItemSeasonAccess = InventoryAPI.GetItemAttributeValue(ItemId, 'season access');\n            if (acquiredItemSeasonAccess && (storeItemSeasonAccess === acquiredItemSeasonAccess)) {\n                const nSeasonAccess = GameTypesAPI.GetActiveSeasionIndexValue();\n                const nCoinRank = MyPersonaAPI.GetMyMedalRankByType((nSeasonAccess + 1) + \"Operation$OperationCoin\");\n                if (nCoinRank === 1 && nSeasonAccess === acquiredItemSeasonAccess) {\n                    ShowActiveItemPopup(ItemId);\n                    return;\n                }\n            }\n            const storeItemToolType = InventoryAPI.GetToolType(storeItemId);\n            const acquiredItemToolType = InventoryAPI.GetToolType(ItemId);\n            if (storeItemToolType === 'xp_shop_ticket' && acquiredItemToolType === 'xp_shop_ticket') {\n                InventoryAPI.AcknowledgeNewItembyItemID(ItemId);\n                ClosePopup();\n                $.DispatchEvent('HideStoreStatusPanel');\n            }\n            const defName = InventoryAPI.GetItemDefinitionName(InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(g_ActiveTournamentInfo.itemid_charge, 0));\n            if (InventoryAPI.DoesItemMatchDefinitionByName(storeItemId, defName) && InventoryAPI.DoesItemMatchDefinitionByName(ItemId, defName)) {\n                ClosePopup();\n                $.DispatchEvent('ShowAcknowledgePopup', '', '');\n                $.DispatchEvent('HideStoreStatusPanel');\n                return;\n            }\n            ClosePopup();\n            $.DispatchEvent('ShowAcknowledgePopup', '', ItemId);\n            $.DispatchEvent('HideStoreStatusPanel');\n        }\n    }\n    function ShowActiveItemPopup(itemId) {\n        InventoryAPI.AcknowledgeNewItembyItemID(itemId);\n        ClosePopup();\n        $.DispatchEvent('HideStoreStatusPanel');\n        const elPanel = UiToolkitAPI.ShowCustomLayoutPopupParameters('', 'file://{resources}/layout/popups/popup_inventory_inspect.xml', 'itemid=' + itemId +\n            '&' + 'asyncworktype=useitem' +\n            '&' + 'seasonpass=true');\n        const oSettings = {\n            item_id: itemId,\n            work_type: 'useitem',\n            is_season_pass: true\n        };\n        elPanel.Data().oSettings = oSettings;\n    }\n    function ClosePopup() {\n        const elAsyncActionBarPanel = $.GetContextPanel().FindChildInLayoutFile('PopUpInspectAsyncBar');\n        const elPurchase = $.GetContextPanel().FindChildInLayoutFile('PopUpInspectPurchaseBar');\n        if (!elAsyncActionBarPanel.BHasClass('hidden')) {\n            InspectAsyncActionBar.OnEventToClose();\n        }\n        else if (!elPurchase.BHasClass('hidden')) {\n            InspectPurchaseBar.ClosePopup();\n        }\n        else {\n            if ($.GetContextPanel().IsValid()) {\n                let callbackFromPopup = InspectShared.GetPopupSetting('callback_handle');\n                callbackFromPopup = !callbackFromPopup ? -1 : callbackFromPopup;\n                InspectActionBar.CloseBtnAction(callbackFromPopup, elAsyncActionBarPanel);\n            }\n        }\n    }\n    InventoryInspect.ClosePopup = ClosePopup;\n    function _Refresh() {\n        const itemId = InspectShared.GetPopupSetting('item_id');\n        if (!itemId || !InventoryAPI.IsValidItemID(itemId)) {\n            ClosePopup();\n            return;\n        }\n        _UpdatePanelData(itemId);\n        InspectActionBar.NavigateModelPanel('InspectModel');\n    }\n    function _BlurPanel(panelId, shouldBlur) {\n        if (shouldBlur) {\n            if (panelId == $.GetContextPanel().id) {\n                $.GetContextPanel().SetHasClass('popup-inspect-modelpanel_darken_blur', shouldBlur);\n            }\n        }\n        else {\n            if ($.GetContextPanel().BHasClass('popup-inspect-modelpanel_darken_blur')) {\n                $.GetContextPanel().SetHasClass('popup-inspect-modelpanel_darken_blur', false);\n            }\n        }\n    }\n    $.RegisterForUnhandledEvent('CSGOShowMainMenu', _Refresh);\n    $.RegisterForUnhandledEvent('PopulateLoadingScreen', ClosePopup);\n    $.RegisterForUnhandledEvent('BlurPopupPanel', _BlurPanel);\n})(InventoryInspect || (InventoryInspect = {}));\n","scripts/popups/popup_leaderboards.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\nvar PopupLeaderboards;\n(function (PopupLeaderboards) {\n    var m_type = '';\n    var m_myXuid = MyPersonaAPI.GetXuid();\n    PopupLeaderboards.Init = function () {\n        var type = $.GetContextPanel().GetAttributeString('type', '');\n        if (type === '') {\n            return;\n        }\n        var aTypes = type.split(',');\n        _SetTitle(aTypes[0]);\n        _SetBackground();\n        _SetPointsTitle();\n        _MakeTabs(aTypes);\n        _ShowGlobalRank();\n        var extraStyle = $.GetContextPanel().GetAttributeString('popup-style', '');\n        if (extraStyle) {\n            $.GetContextPanel().AddClass(extraStyle);\n        }\n        $('#id-popup-leaderboard-refresh-button')?.SetPanelEvent('onactivate', function (lbType) { LeaderboardsAPI.Refresh(lbType); }.bind(undefined, type));\n    };\n    function _SetTitle(type) {\n        var titleOverride = $.GetContextPanel().GetAttributeString('titleoverride', '');\n        var title = titleOverride;\n        if (!title) {\n            title = '#CSGO_' + (type.split('.')[0]);\n        }\n        $.GetContextPanel().FindChildInLayoutFile('id-popup-leaderboard-title').text = $.Localize(title);\n    }\n    ;\n    function _SetBackground() {\n        const eventId = $.GetContextPanel().GetAttributeString('eventid', '');\n        if (!eventId) {\n            return;\n        }\n        let elBackground = $.GetContextPanel().FindChild('id-popup-leaderboard-bg');\n        elBackground.style.backgroundImage = 'url( \"file://{images}/tournaments/backgrounds/pickem_bg_' + $.GetContextPanel().GetAttributeString('eventid', '') + '.png\");';\n        elBackground.style.backgroundSize = 'cover';\n        elBackground.style.backgroundPosition = ' 50% 50%;';\n        elBackground.visible = true;\n        $.GetContextPanel().SetHasClass('major-' + $.GetContextPanel().GetAttributeString('eventid', ''), true);\n    }\n    function _SetPointsTitle() {\n        var strPointsTitle = $.GetContextPanel().GetAttributeString('points-title', '');\n        if (strPointsTitle !== '') {\n            $.GetContextPanel().FindChildInLayoutFile('id-header-score').text = $.Localize(strPointsTitle);\n        }\n    }\n    ;\n    function _MakeTabs(aTypes) {\n        if (aTypes.length <= 1) {\n            m_type = aTypes[0];\n            _UpdateLeaderboard(aTypes[0]);\n            return;\n        }\n        var elNavBar = $.GetContextPanel().FindChildInLayoutFile('id-popup-leaderboard-navbar');\n        elNavBar.RemoveClass('hidden');\n        var elTabs = elNavBar.FindChild('id-popup-leaderboard-tabs');\n        for (var i = 0; i < aTypes.length; i++) {\n            var elTab = $.CreatePanel(\"RadioButton\", elTabs, aTypes[i]);\n            elTab.BLoadLayoutSnippet(\"leaderboard-tab\");\n            elTab.SetPanelEvent('onactivate', _UpdateLeaderboard.bind(undefined, aTypes[i]));\n            elTab.FindChildInLayoutFile('leaderboard-tab-label').text = $.Localize('#CSGO_' + aTypes[i] + '_tab');\n        }\n        $.DispatchEvent(\"Activated\", elTabs.Children()[0], \"mouse\");\n    }\n    ;\n    function _ShowGlobalRank() {\n        var showRank = $.GetContextPanel().GetAttributeString('showglobaloverride', 'true');\n        $.GetContextPanel().SetHasClass('hide-global-rank', showRank === 'false');\n    }\n    ;\n    function _UpdateLeaderboard(type) {\n        m_type = type;\n        var count = 0;\n        var status = LeaderboardsAPI.GetState(type);\n        var elStatus = $.GetContextPanel().FindChildInLayoutFile('id-popup-leaderboard-loading');\n        var elData = $.GetContextPanel().FindChildInLayoutFile('id-popup-leaderboard-nodata');\n        var elLeaderboardList = $.GetContextPanel().FindChildInLayoutFile('id-popup-leaderboard-list');\n        if (\"none\" == status) {\n            elStatus.SetHasClass('hidden', false);\n            elData.SetHasClass('hidden', true);\n            elLeaderboardList.SetHasClass('hidden', true);\n            LeaderboardsAPI.Refresh(type);\n        }\n        if (\"loading\" == status) {\n            elStatus.SetHasClass('hidden', false);\n            elData.SetHasClass('hidden', true);\n            elLeaderboardList.SetHasClass('hidden', true);\n        }\n        if (\"ready\" == status) {\n            count = LeaderboardsAPI.GetCount(type);\n            let limitRows = $.GetContextPanel().GetAttributeInt('limitrows', 0);\n            if (limitRows > 0 && limitRows < count) {\n                count = limitRows;\n            }\n            if (count === 0) {\n                elData.SetHasClass('hidden', false);\n                elStatus.SetHasClass('hidden', true);\n                elLeaderboardList.SetHasClass('hidden', true);\n            }\n            else {\n                elLeaderboardList.SetHasClass('hidden', false);\n                elStatus.SetHasClass('hidden', true);\n                elData.SetHasClass('hidden', true);\n                _FillOutEntries(type, count);\n            }\n            if (1 <= LeaderboardsAPI.HowManyMinutesAgoCached(type)) {\n                LeaderboardsAPI.Refresh(type);\n            }\n        }\n        $.GetContextPanel().SetHasClass('leaderboard-has-nodata', count === 0);\n        if ($.GetContextPanel().BHasClass('leaderboard_embedded')) {\n            let elParent = $.GetContextPanel().GetParent();\n            if (elParent) {\n                elParent.SetHasClass('leaderboard-has-nodata', count === 0);\n            }\n        }\n    }\n    ;\n    function _FillOutEntries(type, count) {\n        var elParent = $.GetContextPanel().FindChildInLayoutFile('id-popup-leaderboard-entries');\n        elParent.RemoveAndDeleteChildren();\n        function _AddOpenPlayerCardAction(elAvatar, xuid) {\n            var openCard = function (xuid) {\n                $.DispatchEvent('SidebarContextMenuActive', true);\n                if (xuid !== '0' && xuid) {\n                    var contextMenuPanel = UiToolkitAPI.ShowCustomLayoutContextMenuParametersDismissEvent('', '', 'file://{resources}/layout/context_menus/context_menu_playercard.xml', 'xuid=' + xuid, function () {\n                        $.DispatchEvent('SidebarContextMenuActive', false);\n                    });\n                    contextMenuPanel.AddClass(\"ContextMenu_NoArrow\");\n                }\n            };\n            elAvatar.SetPanelEvent(\"onactivate\", openCard.bind(undefined, xuid));\n            elAvatar.SetPanelEvent(\"oncontextmenu\", openCard.bind(undefined, xuid));\n        }\n        for (var i = 0; i < count; i++) {\n            var lbData = LeaderboardsAPI.GetEntryDetailsObjectByIndex(type, i);\n            var xuid = lbData.XUID;\n            var score = lbData.score;\n            var elEntry = $.CreatePanel(\"Panel\", elParent, xuid);\n            elEntry.BLoadLayoutSnippet(\"leaderboard-entry\");\n            elEntry.FindChildInLayoutFile('popup-leaderboard-entry-avatar').PopulateFromSteamID(xuid);\n            _AddOpenPlayerCardAction(elEntry, xuid);\n            elEntry.SetDialogVariable('player-rank', (i + 1).toString());\n            elEntry.SetDialogVariable('player-score', score?.toString());\n            elEntry.SetDialogVariable('player-name', FriendsListAPI.GetFriendName(xuid));\n            var children = elEntry.FindChildrenWithClassTraverse('popup-leaderboard__list__column');\n            if (i % 2 === 0) {\n                children.forEach(element => {\n                    element.AddClass('background');\n                });\n            }\n        }\n        _HighightMySelf();\n    }\n    ;\n    function _HighightMySelf() {\n        var elParent = $.GetContextPanel().FindChildInLayoutFile('id-popup-leaderboard-entries');\n        var elEntry = elParent.FindChildInLayoutFile(m_myXuid);\n        if (elEntry) {\n            elEntry.AddClass('local-player');\n            elEntry.ScrollParentToMakePanelFit(1, false);\n        }\n    }\n    ;\n    function RefreshLeaderBoard(type) {\n        if (m_type === type) {\n            _UpdateLeaderboard(type);\n            return;\n        }\n    }\n    PopupLeaderboards.RefreshLeaderBoard = RefreshLeaderBoard;\n    ;\n    function UpdateName(xuid) {\n        var elParent = $.GetContextPanel().FindChildInLayoutFile('id-popup-leaderboard-entries');\n        var elEntry = elParent.FindChildInLayoutFile(xuid);\n        if (elEntry) {\n            elEntry.SetDialogVariable('player-name', FriendsListAPI.GetFriendName(xuid));\n        }\n    }\n    PopupLeaderboards.UpdateName = UpdateName;\n    ;\n    function Close() {\n        $.DispatchEvent('UIPopupButtonClicked', '');\n    }\n    PopupLeaderboards.Close = Close;\n    ;\n})(PopupLeaderboards || (PopupLeaderboards = {}));\n(function () {\n    $.RegisterForUnhandledEvent('PanoramaComponent_Leaderboards_StateChange', PopupLeaderboards.RefreshLeaderBoard);\n    $.RegisterForUnhandledEvent('PanoramaComponent_FriendsList_NameChanged', PopupLeaderboards.UpdateName);\n    PopupLeaderboards.Init();\n})();\n","scripts/popups/popup_leaderboards__vpk_vjs_c.js":"'use strict';\n\nvar PopupLeaderboards = ( function()\n{\n\tvar m_type = '';\n\tvar m_myXuid = MyPersonaAPI.GetXuid();\n\n\tvar _Init = function()\n\t{\n\t\tvar type = $.GetContextPanel().GetAttributeString( 'type', '' );\n\n\t\tif ( type === '' )\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tvar aTypes = type.split( ',' );\n\n\t\t_SetTitle( aTypes[ 0 ] );\n\t\t_SetPointsTitle();\n\t\t_MakeTabs( aTypes );\n\t\t_ShowGlobalRank();\n\n\t\tvar extraStyle = $.GetContextPanel().GetAttributeString( 'popup-style', '' );\n\t\tif ( extraStyle )\n\t\t{\n\t\t\t$.GetContextPanel().AddClass( extraStyle );\n\t\t}\n\n\t\t$( '#id-popup-leaderboard-refresh-button' ).SetPanelEvent(\n\t\t\t'onactivate',\n\t\t\tfunction( lbType ) { LeaderboardsAPI.Refresh( lbType ); }.bind( undefined, type )\n\t\t);\n\t};\n\n\tvar _SetTitle = function( type )\n\t{\n\t\tvar titleOverride = $.GetContextPanel().GetAttributeString( 'titleoverride', '' );\n\t\tvar title = titleOverride;\n\t\tif ( !title )\n\t\t{\n\t\t\t                                                                                       \n\t\t\ttitle = '#CSGO_' + (type.split('.')[0]);\n\t\t}\n\t\t$.GetContextPanel().FindChildInLayoutFile( 'id-popup-leaderboard-title' ).text = $.Localize( title );\n\t};\n\n\tvar _SetPointsTitle = function()\n\t{\n\t\tvar strPointsTitle = $.GetContextPanel().GetAttributeString( 'points-title', '' );\n\t\tif ( strPointsTitle !== '' )\n\t\t{\n\t\t\t$.GetContextPanel().FindChildInLayoutFile( 'id-header-score' ).text = $.Localize( strPointsTitle );\n\t\t}\n\t};\n\n\tvar _MakeTabs = function( aTypes )\n\t{\n\t\tif ( aTypes.length <= 1 )\n\t\t{\n\t\t\tm_type = aTypes[ 0 ];\n\t\t\t_UpdateLeaderboard( aTypes[ 0 ] );\n\t\t\treturn;\n\t\t}\n\n\t\tvar elNavBar = $.GetContextPanel().FindChildInLayoutFile( 'id-popup-leaderboard-navbar' );\n\t\telNavBar.RemoveClass( 'hidden' );\n\n\t\tvar elTabs = elNavBar.FindChild( 'id-popup-leaderboard-tabs' );\n\n\t\tfor ( var i = 0; i < aTypes.length; i++ )\n\t\t{\n\t\t\tvar elTab = $.CreatePanel( \"RadioButton\", elTabs, aTypes[ i ] );\n\t\t\telTab.BLoadLayoutSnippet( \"leaderboard-tab\" );\n\t\t\telTab.SetPanelEvent(\n\t\t\t\t'onactivate',\n\t\t\t\t_UpdateLeaderboard.bind( undefined, aTypes[ i ] )\n\t\t\t);\n\n\t\t\telTab.FindChildInLayoutFile( 'leaderboard-tab-label' ).text = $.Localize( '#CSGO_' + aTypes[ i ] + '_tab' );\n\t\t}\n\t\t\n\t\t$.DispatchEvent( \"Activated\", elTabs.Children()[ 0 ], \"mouse\" );\n\t};\n\n\tvar _ShowGlobalRank = function()\n\t{\n\t\tvar showRank = $.GetContextPanel().GetAttributeString( 'showglobaloverride', 'true' );\n\t\t$.GetContextPanel().SetHasClass( 'hide-global-rank', showRank === 'false' );\n\t};\n\n\tvar _UpdateLeaderboard = function( type )\n\t{\n\t\t                                \n\t\tm_type = type;\n\n\t\tvar count = 0;\n\n\t\tvar status = LeaderboardsAPI.GetState( type );\n\t\t                                         \n\n\t\tvar elStatus = $.GetContextPanel().FindChildInLayoutFile( 'id-popup-leaderboard-loading' );\n\t\tvar elData = $.GetContextPanel().FindChildInLayoutFile( 'id-popup-leaderboard-nodata' );\n\t\tvar elLeaderboardList = $.GetContextPanel().FindChildInLayoutFile( 'id-popup-leaderboard-list' );\n\n\t\tif ( \"none\" == status )\n\t\t{\n\t\t\telStatus.SetHasClass( 'hidden', false );\n\t\t\telData.SetHasClass( 'hidden', true );\n\t\t\telLeaderboardList.SetHasClass( 'hidden', true );\n\t\t\tLeaderboardsAPI.Refresh( type );\n\t\t}\n\t\n\t\tif ( \"loading\" == status )\n\t\t{\n\t\t\telStatus.SetHasClass( 'hidden', false );\n\t\t\telData.SetHasClass( 'hidden', true );\n\t\t\telLeaderboardList.SetHasClass( 'hidden', true );\n\t\t}\n\t\n\t\tif ( \"ready\" == status )\n\t\t{\n\t\t\tcount = LeaderboardsAPI.GetCount( type );\n\t\t\tlet limitRows = $.GetContextPanel().GetAttributeInt( 'limitrows', 0 );\n\t\t\tif ( limitRows > 0 && limitRows < count )\n\t\t\t{\t                                                 \n\t\t\t\tcount = limitRows;\n\t\t\t}\n\n\t\t\tif ( count === 0 )\n\t\t\t{\n\t\t\t\telData.SetHasClass( 'hidden', false );\n\t\t\t\telStatus.SetHasClass( 'hidden', true );\n\t\t\t\telLeaderboardList.SetHasClass( 'hidden', true );\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\telLeaderboardList.SetHasClass( 'hidden', false );\n\t\t\t\telStatus.SetHasClass( 'hidden', true );\n\t\t\t\telData.SetHasClass( 'hidden', true );\n\n\t\t\t\t_FillOutEntries( type, count );\n\t\t\t}\n\t\t\t\n\t\t\tif ( 1 <= LeaderboardsAPI.HowManyMinutesAgoCached( type ) )\n\t\t\t{\n\t\t\t\tLeaderboardsAPI.Refresh( type );\n\t\t\t}\n\t\t}\n\n\t\t$.GetContextPanel().SetHasClass( 'leaderboard-has-nodata', count === 0 );\n\t\tif ( $.GetContextPanel().BHasClass( 'leaderboard_embedded' ) )\n\t\t{\n\t\t\tlet elParent = $.GetContextPanel().GetParent();\n\t\t\tif ( elParent )\n\t\t\t{\n\t\t\t\telParent.SetHasClass( 'leaderboard-has-nodata', count === 0 );\n\t\t\t}\n\t\t}\n\t};\n\n\tvar _FillOutEntries = function( type, count )\n\t{\n\t\tvar elParent = $.GetContextPanel().FindChildInLayoutFile( 'id-popup-leaderboard-entries' );\n\t\telParent.RemoveAndDeleteChildren();\n\n\t\tfunction _AddOpenPlayerCardAction( elAvatar, xuid ) {\n\t\t\tvar openCard = function ( xuid ) {\n\t\t\t\t                                                                                             \n\t\t\t\t$.DispatchEvent( 'SidebarContextMenuActive', true );\n\t\n\t\t\t\tif ( xuid !== 0 )\n\t\t\t\t{\n\t\t\t\t\tvar contextMenuPanel = UiToolkitAPI.ShowCustomLayoutContextMenuParametersDismissEvent(\n\t\t\t\t\t\t'',\n\t\t\t\t\t\t'',\n\t\t\t\t\t\t'file://{resources}/layout/context_menus/context_menu_playercard.xml',\n\t\t\t\t\t\t'xuid=' + xuid,\n\t\t\t\t\t\tfunction () {\n\t\t\t\t\t\t\t$.DispatchEvent( 'SidebarContextMenuActive', false );\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t\tcontextMenuPanel.AddClass( \"ContextMenu_NoArrow\" );\n\t\t\t\t}\n\t\t\t};\n\t\n\t\t\telAvatar.SetPanelEvent( \"onactivate\", openCard.bind( undefined, xuid ) );\n\t\t\telAvatar.SetPanelEvent( \"oncontextmenu\", openCard.bind( undefined, xuid ) );\n\t\t}\n\n\t\t                                                                         \n\t\tfor ( var i = 0; i < count; i++ )\n\t\t{\n\t\t\tvar lbData = LeaderboardsAPI.GetEntryDetailsObjectByIndex( type, i );\n\t\t\tvar xuid = lbData.XUID;\n\t\t\tvar score = lbData.score;\n\t\t\t                            \n\n\t\t\tvar elEntry = $.CreatePanel( \"Panel\", elParent, xuid );\n\t\t\telEntry.BLoadLayoutSnippet( \"leaderboard-entry\" );\n\n\t\t\telEntry.FindChildInLayoutFile('popup-leaderboard-entry-avatar').PopulateFromSteamID(xuid);\n\t\t\t_AddOpenPlayerCardAction( elEntry, xuid );\n\n\t\t\telEntry.SetDialogVariable( 'player-rank', i + 1 );\n\t\t\telEntry.SetDialogVariable( 'player-score', score );\n\t\t\telEntry.SetDialogVariable( 'player-name', FriendsListAPI.GetFriendName(xuid) );\n\n\t\t\tlet elItemImage = elEntry.FindChildInLayoutFile( 'id-itemimage' );\n\t\t\tlet itemid = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex( lbData.defidx, 0 );\n\t\t\tif ( $.GetContextPanel().BHasClass( 'leaderboard_embedded' ) )\n\t\t\t{\n\t\t\t\telItemImage.small = true;\n\t\t\t}\n\t\t\telItemImage.itemid = itemid;\n\n\t\t\tvar children = elEntry.FindChildrenWithClassTraverse( 'popup-leaderboard__list__column' );\n\t\t\t\n\t\t\tif ( i % 2 === 0 )\n\t\t\t{\n\t\t\t\tchildren.forEach(element => {\n\t\t\t\t\telement.AddClass( 'background' );\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t_HighightMySelf();\n\t};\n\n\tvar _HighightMySelf = function()\n\t{\n\t\tvar elParent = $.GetContextPanel().FindChildInLayoutFile( 'id-popup-leaderboard-entries' );\n\t\tvar elEntry = elParent.FindChildInLayoutFile( m_myXuid );\n\n\t\tif ( elEntry )\n\t\t{\n\t\t\telEntry.AddClass( 'local-player' );\n\t\t\telEntry.ScrollParentToMakePanelFit( 1, false );\n\t\t}\n\t};\n\n\tvar _RefreshLeaderBoard = function( type )\n\t{\n\t\tif ( m_type === type )\n\t\t{\n\t\t\t_UpdateLeaderboard( type );\n\t\t\treturn;\n\t\t}\n\t};\n\n\tvar _UpdateName = function( xuid )\n\t{\n\t\tvar elParent = $.GetContextPanel().FindChildInLayoutFile( 'id-popup-leaderboard-entries' );\n\t\tvar elEntry = elParent.FindChildInLayoutFile( xuid );\n\n\t\tif ( elEntry )\n\t\t{\n\t\t\telEntry.FindChildInLayoutFile( 'popup-leaderboard-entry-name' ).text = FriendsListAPI.GetFriendName( xuid );\n\t\t}\n\t};\n\n\tvar _Close = function()\n\t{\n\t\t                   \n\t\t$.DispatchEvent( 'UIPopupButtonClicked', '' );\n\t};\n\n\treturn {\n\t\tInit: _Init,\n\t\tRefreshLeaderBoard: _RefreshLeaderBoard,\n\t\tUpdateName: _UpdateName,\n\t\tClose: _Close\n\t};\n\n})();\n\n(function(){\n\n\t$.RegisterForUnhandledEvent( 'PanoramaComponent_Leaderboards_StateChange', PopupLeaderboards.RefreshLeaderBoard );\n\t$.RegisterForUnhandledEvent( 'PanoramaComponent_FriendsList_NameChanged', PopupLeaderboards.UpdateName );\n\t                                                                                                                             \n\tPopupLeaderboards.Init();\n})();","scripts/popups/popup_leaderboard_namelock.js":"\"use strict\";\n/// <reference path=\"..\\csgo.d.ts\" />\nvar LeaderboardNameLock;\n(function (LeaderboardNameLock) {\n    let m_timeoutHandler;\n    function Init() {\n        $.GetContextPanel().SetDialogVariable('profile-name', MyPersonaAPI.GetName());\n    }\n    LeaderboardNameLock.Init = Init;\n    function Submit() {\n        let entry = $('#TextEntry').text;\n        LeaderboardsAPI.SetLocalPlayerLeaderboardSafeName(entry);\n        m_timeoutHandler = $.Schedule(15, () => {\n            UiToolkitAPI.ShowGenericPopup('Generic', $.Localize('#leaderboard_namelock_submission_timeout'), '');\n            $.DispatchEvent('UIPopupButtonClicked', '');\n        });\n        $.GetContextPanel().FindChildrenWithClassTraverse('button').forEach(element => element.enabled = false);\n        $.GetContextPanel().AddClass('submitted');\n    }\n    LeaderboardNameLock.Submit = Submit;\n    function Cancel() {\n        $.DispatchEvent('UIPopupButtonClicked', '');\n    }\n    LeaderboardNameLock.Cancel = Cancel;\n    function Success() {\n        if (m_timeoutHandler) {\n            $.CancelScheduled(m_timeoutHandler);\n        }\n        UiToolkitAPI.ShowGenericPopup('Generic', $.Localize('#leaderboard_namelock_submission_success'), '');\n        $.DispatchEvent('UIPopupButtonClicked', '');\n    }\n    function OpenProfile() {\n        SteamOverlayAPI.ShowUserProfilePage(MyPersonaAPI.GetXuid());\n        $.DispatchEvent('ContextMenuEvent', '');\n    }\n    LeaderboardNameLock.OpenProfile = OpenProfile;\n    {\n        $.RegisterForUnhandledEvent('PanoramaComponent_FriendsList_NameChanged', Init);\n        $.RegisterForUnhandledEvent('PanoramaComponent_MyPersona_SetPlayerLeaderboardSafeName', Success);\n    }\n})(LeaderboardNameLock || (LeaderboardNameLock = {}));\n","scripts/popups/popup_license_register.js":"\"use strict\";\n/// <reference path=\"..\\csgo.d.ts\" />\nvar PopupLicenseRegister;\n(function (PopupLicenseRegister) {\n    let m_LicenseRegisterTimer = null;\n    function SetupPopup() {\n        let spinnerVisible = $.GetContextPanel().GetAttributeInt(\"spinner\", 0);\n        $(\"#Spinner\").SetHasClass(\"SpinnerVisible\", !!spinnerVisible);\n        m_LicenseRegisterTimer = $.Schedule(11, PanelTimedOut);\n        $.Schedule(1, () => { MyPersonaAPI.ActionStartAgreementSessionInGame(); });\n        $.RegisterForUnhandledEvent('PanoramaComponent_MyPersona_StartAgreementSessionInGame', StartAgreementSessionInGame);\n    }\n    PopupLicenseRegister.SetupPopup = SetupPopup;\n    function PanelTimedOut() {\n        m_LicenseRegisterTimer = null;\n        $.DispatchEvent('UIPopupButtonClicked', '');\n        UiToolkitAPI.ShowGenericPopupOk($.Localize('#SFUI_SteamConnectionErrorTitle'), $.Localize('#SFUI_Steam_Error_LinkUnexpected'), '', () => { });\n    }\n    function _CancelLicenseRegisterTimer() {\n        if (m_LicenseRegisterTimer) {\n            $.CancelScheduled(m_LicenseRegisterTimer);\n            m_LicenseRegisterTimer = null;\n        }\n    }\n    function StartAgreementSessionInGame(url) {\n        _CancelLicenseRegisterTimer();\n        $.DispatchEvent('UIPopupButtonClicked', '');\n        SteamOverlayAPI.OpenURL('!' + url);\n    }\n})(PopupLicenseRegister || (PopupLicenseRegister = {}));\n","scripts/popups/popup_mainmenu_overwatch_verdict.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\nvar overwatch_verdict;\n(function (overwatch_verdict) {\n    var _verdictTypes = [\n        { type: \"aimbot\", classification: \"#Panorama_Overwatch_Major_Disruption\", title: \"#Panorama_Overwatch_Res_AimHacking\", desc: \"#SFUI_Overwatch_Res_AimHacking_Desc\" },\n    ];\n    var _finalVerdict = \"\";\n    function Init() {\n        var elVerdictTypes = $.GetContextPanel().FindChildInLayoutFile('VerdictTypes');\n        if (elVerdictTypes === undefined || elVerdictTypes === null)\n            return;\n        elVerdictTypes.RemoveAndDeleteChildren();\n        _verdictTypes.forEach(function (verdict, i) {\n            var elVerdict = $.CreatePanel('Panel', elVerdictTypes, 'Verdict' + i);\n            elVerdict.BLoadLayoutSnippet('verdict_type');\n            elVerdict.SetDialogVariable('verdict_classification', $.Localize(verdict.classification));\n            elVerdict.SetDialogVariable('verdict_title', $.Localize(verdict.title));\n            elVerdict.SetDialogVariable('verdict_desc', $.Localize(verdict.desc));\n            _SetupVerdictButtons(elVerdict.FindChildInLayoutFile('verdict_btn_not_guilty'), verdict);\n            _SetupVerdictButtons(elVerdict.FindChildInLayoutFile('verdict_btn_guilty'), verdict);\n        });\n    }\n    overwatch_verdict.Init = Init;\n    function _SetupVerdictButtons(elButton, verdict) {\n        if (elButton === undefined || elButton === null)\n            return;\n        elButton.group = verdict.type;\n        elButton.SetPanelEvent('onselect', _UpdateSubmitButton);\n    }\n    function _UpdateFinalVerdict() {\n        _finalVerdict = \"\";\n        var bHasAllVerdict = true;\n        _verdictTypes.forEach(function (verdict, i) {\n            var elVerdict = $.GetContextPanel().FindChildInLayoutFile('Verdict' + i);\n            if (elVerdict === undefined || elVerdict === null)\n                return false;\n            if (elVerdict.FindChildInLayoutFile('verdict_btn_not_guilty').checked) {\n                _finalVerdict += verdict.type + \":dismiss;\";\n            }\n            else if (elVerdict.FindChildInLayoutFile('verdict_btn_guilty').checked) {\n                _finalVerdict += verdict.type + \":convict;\";\n            }\n            else {\n                bHasAllVerdict = false;\n                return true;\n            }\n        });\n        return bHasAllVerdict;\n    }\n    function _UpdateSubmitButton() {\n        var btnSubmitVerdict = $.GetContextPanel().FindChildInLayoutFile('SubmitVerdictBtn');\n        if (btnSubmitVerdict === undefined || btnSubmitVerdict === null || btnSubmitVerdict.enabled == true)\n            return;\n        btnSubmitVerdict.enabled = _UpdateFinalVerdict();\n    }\n    function SubmitVerdict() {\n        OverwatchAPI.SubmitCaseVerdict(_finalVerdict);\n        $.DispatchEvent('UIPopupButtonClicked', '');\n    }\n    overwatch_verdict.SubmitVerdict = SubmitVerdict;\n    ;\n})(overwatch_verdict || (overwatch_verdict = {}));\n(function () {\n    overwatch_verdict.Init();\n})();\n","scripts/popups/popup_major_hub.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../common/licenseutil.ts\" />\n/// <reference path=\"../common/eventutil.ts\" />\n/// <reference path=\"../common/store_items.ts\" />\n/// <reference path=\"../generated/items_event_current_generated_store.d.ts\" />\n/// <reference path=\"../generated/items_event_current_generated_store.ts\" />\n/// <reference path=\"../common/xpshop_tile_weapon_camera_settings.ts\" />\n/// <reference path=\"../popups/popup_acknowledge_item.ts\" />\n/// <reference path=\"../itemtile_store.ts\" />\n/// <reference path=\"../tournaments/predictions_timer.ts\" />\n/// <reference path=\"../tournaments/predictions_group_stage.ts\" />\n/// <reference path=\"../tournaments/predictions_bracket_stage.ts\" />\nvar PopupMajorHub;\n(function (PopupMajorHub) {\n    const _m_cp = $.GetContextPanel();\n    const _m_elPickemPages = _m_cp.FindChildInLayoutFile('id-pickem-pages');\n    let _m_timeoutHandle;\n    let _m_eventId;\n    let _m_tournamentId;\n    let _m_inventoryUpdatedHandler;\n    let m_selectedPage;\n    let m_setDefaultTab;\n    let m_redeemAvailable = 0;\n    let m_oPageData = {};\n    m_oPageData.hasAlreadyInit = [];\n    function ClosePopup() {\n        if (_m_elPickemPages.IsValid() && _m_elPickemPages) {\n            m_oPageData.hasAlreadyInit.forEach(id => {\n                let elPage = _m_elPickemPages.FindChild(id);\n                if (elPage && elPage.IsValid()) {\n                    let elBtn = elPage.FindChildInLayoutFile('id-predictions-apply-btn').FindChild('id-apply-btn');\n                    if (elBtn.enabled) {\n                        elBtn.AddClass('activated-by-program');\n                        $.DispatchEvent(\"Activated\", elBtn, \"program\");\n                    }\n                }\n            });\n        }\n        PopupMajorHub.DeleteDragItem();\n        $.DispatchEvent('CSGOPlaySoundEffect', 'inventory_inspect_close', 'MOUSE');\n        _m_cp.SetReadyForDisplay(false);\n        $.DispatchEvent('UIPopupButtonClicked', '');\n        $.DispatchEvent('ContextMenuEvent', '');\n        UiToolkitAPI.HideTextTooltip();\n    }\n    PopupMajorHub.ClosePopup = ClosePopup;\n    function LeaderboardPopup() {\n        UiToolkitAPI.ShowCustomLayoutPopupParameters('', 'file://{resources}/layout/popups/popup_leaderboards.xml', 'type=official_leaderboard_pickem_' + g_ActiveTournamentInfo.location + '_team.friends' +\n            '&' + 'titleoverride=#CSGO_PickEm_Leaderboard_Title' +\n            '&' + 'points-title=#tournament_coin_completed_challenges' +\n            '&' + 'popup-style=major-hub-popup-leaderboard' +\n            '&' + 'eventid=' + _m_eventId);\n    }\n    PopupMajorHub.LeaderboardPopup = LeaderboardPopup;\n    function Init() {\n        let eventId = $.GetContextPanel().GetAttributeString('eventid', '') ? parseInt($.GetContextPanel().GetAttributeString('eventid', '')) : -1;\n        if (eventId < 0) {\n            ClosePopup();\n            return;\n        }\n        ReadyForDisplay();\n    }\n    PopupMajorHub.Init = Init;\n    function ReadyForDisplay() {\n        if (!MyPersonaAPI.IsConnectedToGC()) {\n            ClosePopup();\n            return;\n        }\n        let restrictions = LicenseUtil.GetCurrentLicenseRestrictions();\n        if (restrictions) {\n            ClosePopup();\n            return;\n        }\n        if (!_m_inventoryUpdatedHandler) {\n            _m_inventoryUpdatedHandler = $.RegisterForUnhandledEvent('PanoramaComponent_MyPersona_InventoryUpdated', OnInventoryUpdated);\n        }\n        let eventId = $.GetContextPanel().GetAttributeString('eventid', '') ? parseInt($.GetContextPanel().GetAttributeString('eventid', '')) : -1;\n        if (eventId < 0) {\n            return;\n        }\n        _m_eventId = eventId;\n        SavePicksButton._m_eventId = eventId;\n        _m_tournamentId = 'tournament:' + _m_eventId;\n        if (_m_eventId > 22) {\n            _m_cp.SetHasClass('major-' + _m_eventId, true);\n        }\n        SetUpHubBasedOnEventId();\n    }\n    function UnreadyForDisplay() {\n        if (_m_inventoryUpdatedHandler) {\n            $.UnregisterForUnhandledEvent('PanoramaComponent_MyPersona_InventoryUpdated', _m_inventoryUpdatedHandler);\n            _m_inventoryUpdatedHandler = null;\n        }\n    }\n    function SetUpHubBasedOnEventId() {\n        _UpdateTournamentTitle();\n        _UpdateChallenges();\n        _SetUpSpray();\n        _SetBackgroundImages();\n        let bItemsForSale = _ItemsForSale();\n        _m_cp.SetHasClass('no-items-on-sale', !bItemsForSale);\n        if (bItemsForSale) {\n            _UpdateStoreBannar();\n        }\n        LoadPickEmData();\n        SetUpTournamentControlRoom();\n        InitializeEmbeddedLeaderboard();\n    }\n    function SetUpTournamentControlRoom() {\n        var elBtn = _m_cp.FindChildInLayoutFile('JsTournamentOperatorBtn');\n        var bCanControl = false;\n        if (MyPersonaAPI.GetMyOfficialTournamentName() &&\n            g_ActiveTournamentInfo.eventid === _m_eventId) {\n            bCanControl = true;\n            elBtn.SetPanelEvent('onactivate', function () {\n                UiToolkitAPI.ShowCustomLayoutPopupParameters('', 'file://{resources}/layout/popups/popup_tournament_controlroom.xml', 'type=matches' +\n                    '&' + 'eventid=tournament:' + _m_eventId +\n                    '&' + 'titleoverride=#Control');\n            });\n        }\n        elBtn.SetHasClass('hidden', !bCanControl);\n    }\n    function InitializeEmbeddedLeaderboard() {\n        let elLeaderboard = _m_cp.FindChildInLayoutFile('id-leaderboard');\n        if (elLeaderboard && elLeaderboard.BHasClass('hidden')) {\n            elLeaderboard.SetAttributeString(\"type\", 'official_leaderboard_pickem_' + g_ActiveTournamentInfo.location + '_team.friends');\n            elLeaderboard.SetAttributeString(\"titleoverride\", '#CSGO_TournamentHub_FriendsCoinLeaderboards');\n            elLeaderboard.SetAttributeString(\"points-title\", '#tournament_coin_completed_challenges');\n            elLeaderboard.SetAttributeInt(\"limitrows\", 4);\n            elLeaderboard.BLoadLayout('file://{resources}/layout/popups/popup_leaderboards.xml', true, false);\n            elLeaderboard.RemoveClass('hidden');\n            elLeaderboard.AddClass('leaderboard_embedded');\n            elLeaderboard.RemoveClass('Hidden');\n        }\n    }\n    function SetDefaultTab() {\n        let passItemId = InventoryAPI.GetActiveTournamentCoinItemId(_m_eventId * -1);\n        let coinItemId = InventoryAPI.GetActiveTournamentCoinItemId(_m_eventId);\n        if ((!coinItemId || coinItemId === '0') && (passItemId && passItemId !== '0') && !m_setDefaultTab)\n            OpenPassActivate(passItemId);\n        let elLastActiveSection;\n        for (let i = g_ActiveTournamentInfo.num_stages_with_swiss; i >= 0; --i) {\n            let sectionId = PredictionsAPI.GetEventSectionIDByIndex(_m_tournamentId, i);\n            if (PredictionsAPI.GetSectionIsActive(_m_tournamentId, sectionId) === true) {\n                let elNavBtn = _m_cp.FindChildInLayoutFile('id-pickem-nav-stage' + i);\n                if (elNavBtn && elNavBtn.IsValid()) {\n                    elNavBtn.SetHasClass('active', true);\n                    elLastActiveSection = elNavBtn;\n                }\n                else {\n                    elNavBtn.SetHasClass('active', false);\n                }\n            }\n        }\n        if (elLastActiveSection && elLastActiveSection.IsValid()) {\n            $.DispatchEvent(\"Activated\", elLastActiveSection, \"mouse\");\n        }\n        else {\n            let elNavBtn = _m_cp.FindChildInLayoutFile('id-pickem-nav-stage' + g_ActiveTournamentInfo.num_stages_with_swiss);\n            $.DispatchEvent(\"Activated\", elNavBtn, \"mouse\");\n        }\n        m_setDefaultTab = true;\n        return;\n    }\n    function _UpdateTournamentTitle() {\n        _m_cp.SetDialogVariable('tournament_name', $.Localize('#CSGO_Tournament_Event_NameShort_' + _m_eventId));\n        _m_cp.FindChildInLayoutFile('id-major-logo').SetImage('file://{images}/tournaments/events/tournament_logo_' + _m_eventId + '.svg');\n        _m_cp.SetDialogVariable('store-title', $.Localize('#major_hub_store_title_event', _m_cp));\n    }\n    function _SetBackgroundImages() {\n        if (!_m_eventId)\n            return;\n        let bgImage = \"url( 'file://{images}/tournaments/backgrounds/pickem_bg_\" + _m_eventId + \".png')\";\n        if (_m_eventId !== 24) {\n            _m_cp.FindChildInLayoutFile('id-graffiti-block').style.backgroundImage = bgImage;\n            _m_cp.FindChildInLayoutFile('id-graffiti-block').SetHasClass('major-background-size', true);\n            _m_cp.FindChildInLayoutFile('id-major-store-block').style.backgroundImage = bgImage;\n            _m_cp.FindChildInLayoutFile('id-major-store-block').SetHasClass('major-background-size', true);\n        }\n        else {\n            _m_cp.FindChildInLayoutFile('id-major-store').style.backgroundImage = bgImage;\n            _m_cp.FindChildInLayoutFile('id-major-store').SetHasClass('major-background-size', true);\n        }\n        _m_cp.FindChildInLayoutFile('id-challenges-block').style.backgroundImage = bgImage;\n        _m_cp.FindChildInLayoutFile('id-challenges-block').SetHasClass('major-background-size', true);\n    }\n    function _UpdateSouvenirSection(bItemsForSale) {\n        let elDesc = _m_cp.FindChildInLayoutFile('id-major-hub-souvenir-desc');\n        elDesc.visible = true;\n        if (bItemsForSale) {\n            let idForCharges = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(g_ActiveTournamentInfo.itemid_charge, 0);\n            if (StoreAPI.GetStoreItemSalePrice(idForCharges, 1, '')) {\n                _m_cp.SetDialogVariable('souvenir_price', StoreAPI.GetStoreItemSalePrice(idForCharges, 1, ''));\n            }\n            elDesc.SetDialogVariable('souvenir_package_desc', $.Localize('#major_hub_souvenir_package_desc', _m_cp));\n        }\n        else if (m_redeemAvailable && m_redeemAvailable > 0) {\n            elDesc.SetDialogVariable('souvenir_package_desc', $.Localize('#major_hub_souvenir_package_desc_no_price', _m_cp));\n        }\n        else {\n            elDesc.visible = false;\n        }\n        _m_cp.SetDialogVariable('souvenir_package', $.Localize('#CSGO_TournamentPass_' + g_ActiveTournamentInfo.location + '_store_desc'));\n    }\n    const getRandomInt = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min;\n    function _UpdateStoreBannar() {\n        _m_cp.FindChildInLayoutFile('id-major-open-store').SetPanelEvent('onactivate', () => {\n            UiToolkitAPI.ShowCustomLayoutPopup('id-popup-major-store', 'file://{resources}/layout/popups/popup_major_store.xml');\n            $.DispatchEvent(\"CSGOPlaySoundEffect\", \"UIPanorama.tab_mainmenu_shop\", \"MOUSE\");\n        });\n        const elStore = _m_cp.FindChildInLayoutFile('id-major-store-banner');\n        const defidxStickerItem = InventoryAPI.GetItemDefinitionIndexFromDefinitionName('sticker');\n        const numStickers = 10;\n        for (let i = 0; i < numStickers; i++) {\n            const stickerIndex = g_ActiveTournamentTeams[getRandomInt(0, g_ActiveTournamentTeams.length - 1)].players[getRandomInt(0, 4)].rankingids[getRandomInt(0, 2)];\n            const itemId = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(defidxStickerItem, stickerIndex);\n            let elDisplay;\n            if (i == 2 || i == 8) {\n                elDisplay = elStore.FindChildInLayoutFile('id-major-store-banner-item-' + i);\n                elDisplay.SetCamera('camera_weapon_7');\n                elDisplay.SetActiveItem(0);\n                elDisplay.SetItemItemId(itemId, '');\n                let nRenderInterval = 1;\n                elDisplay.SetRenderInterval(nRenderInterval);\n            }\n            else {\n                elDisplay = elStore.FindChildInLayoutFile('id-major-store-banner-item-' + i);\n                elDisplay.itemid = itemId;\n            }\n            elDisplay.AddClass('show');\n        }\n        _SetUpBannerSouvenir(elStore);\n    }\n    function _SetUpBannerSouvenir(elStore) {\n        InventoryAPI.SetInventorySortAndFilters('inv_sort_rarity', false, 'rifle,craft_souvenir,is_rental:false,is_sealed:false', '', '');\n        let itemId = '';\n        const count = InventoryAPI.GetInventoryCount();\n        if (count > 0) {\n            const rarityCutoff = Math.floor(InventoryAPI.GetItemRarity(InventoryAPI.GetInventoryItemIDByIndex(0)) / 3);\n            let maxInclusiveIndex = count - 1;\n            while (maxInclusiveIndex > 0) {\n                const rarityMid = InventoryAPI.GetItemRarity(InventoryAPI.GetInventoryItemIDByIndex(maxInclusiveIndex));\n                if (rarityMid >= rarityCutoff)\n                    break;\n                else\n                    maxInclusiveIndex = Math.floor(maxInclusiveIndex / 2);\n            }\n            itemId = InventoryAPI.GetInventoryItemIDByIndex(getRandomInt(0, maxInclusiveIndex));\n        }\n        if (!itemId) {\n            const randomRifles = [7, 8, 9, 10, 11, 13, 16, 40, 60];\n            itemId = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(randomRifles[getRandomInt(0, randomRifles.length - 1)], 0);\n        }\n        if (itemId) {\n            const halfTeams = Math.floor(g_ActiveTournamentTeams.length / 2);\n            const fauxSouvenirItemId = InventoryAPI.CreateTempCombinedItemWithTool(itemId, 'craft_souvenir:faux_' + g_ActiveTournamentInfo.eventid + '_'\n                + g_ActiveTournamentTeams[getRandomInt(0, halfTeams - 1)].teamid + '_'\n                + g_ActiveTournamentTeams[getRandomInt(halfTeams, g_ActiveTournamentTeams.length - 1)].teamid);\n            if (fauxSouvenirItemId)\n                itemId = fauxSouvenirItemId;\n        }\n        const defName = InventoryAPI.GetItemDefinitionName(itemId);\n        let cameraData = XpShopWeaponCameraSettings.CameraSettings.find(({ type }) => type === defName);\n        let cameraSuffix = cameraData !== undefined ? cameraData.camera : '0';\n        const elModelPanel = elStore.FindChildInLayoutFile('id-major-store-banner-souvenir');\n        elModelPanel.SetCamera('camera_weapon_' + cameraSuffix);\n        elModelPanel.SetActiveItem(0);\n        elModelPanel.SetItemItemId(itemId, '');\n        let nRenderInterval = 1;\n        elModelPanel.SetRenderInterval(nRenderInterval);\n    }\n    function _ItemsForSale() {\n        var tournamentEventId = NewsAPI.GetActiveTournamentEventID();\n        if (tournamentEventId === 0)\n            return false;\n        if (g_ActiveTournamentInfo.eventid !== tournamentEventId)\n            return false;\n        return g_ActiveTournamentInfo.active;\n    }\n    ;\n    function _UpdateChallenges() {\n        let tournamentCoinItemId = InventoryAPI.GetActiveTournamentCoinItemId(_m_eventId);\n        let bHasActiveCoin = true;\n        if (!tournamentCoinItemId || tournamentCoinItemId === '0') {\n            bHasActiveCoin = false;\n            tournamentCoinItemId = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(g_ActiveTournamentInfo.itemid_coins[0], 0);\n        }\n        let nCampaignID = InventoryAPI.GetItemAttributeValue(tournamentCoinItemId, \"campaign id\");\n        let numTotalChallenges = InventoryAPI.GetCampaignNodeCount(nCampaignID);\n        let nPointsEarned = 0;\n        let arrMissions = [];\n        for (let i = 0; i < numTotalChallenges; ++i) {\n            let nMissionNodeID = InventoryAPI.GetCampaignNodeIDbyIndex(nCampaignID, i);\n            let strNodeState = InventoryAPI.GetCampaignNodeState(nCampaignID, nMissionNodeID, tournamentCoinItemId, true);\n            nPointsEarned = strNodeState === \"complete\" ? ++nPointsEarned : nPointsEarned;\n            let nQuestID = InventoryAPI.GetCampaignNodeQuestID(nCampaignID, nMissionNodeID);\n            ;\n            let strFauxQuestItem = InventoryAPI.GetQuestItemIDFromQuestID(nQuestID);\n            let strQuestIcon = InventoryAPI.GetQuestIcon(strFauxQuestItem);\n            let strQuestName = InventoryAPI.GetItemName(strFauxQuestItem);\n            let oChallenge = {\n                idx: i,\n                text: strQuestName,\n                isComplete: strNodeState === \"complete\",\n                isDisqualified: strNodeState === 'disqualified',\n                icon: (!bHasActiveCoin || (strNodeState === 'disqualified')) ? 'locked' :\n                    (strQuestIcon === 'watchem') ? 'watch' :\n                        (strQuestIcon === 'pickem') ? 'trophy' :\n                            strQuestIcon,\n            };\n            arrMissions.push(oChallenge);\n        }\n        let counter = 0;\n        arrMissions.forEach(oChallenge => { if (oChallenge.isDisqualified) {\n            oChallenge.idx = counter++;\n            _CreateUpdateChallenge(oChallenge);\n        } });\n        arrMissions.forEach(oChallenge => { if (!oChallenge.isDisqualified) {\n            oChallenge.idx = counter++;\n            _CreateUpdateChallenge(oChallenge);\n        } });\n        _m_cp.SetHasClass('no-active-coin', !bHasActiveCoin);\n        if (bHasActiveCoin) {\n            _SetPoints(nPointsEarned, tournamentCoinItemId);\n            _SetThresholdText(nPointsEarned, numTotalChallenges, tournamentCoinItemId);\n            _RedemptionChargesRemaining(tournamentCoinItemId);\n            _m_cp.FindChildInLayoutFile('id-major-hub-coin-model').SetActiveItem(0);\n            _m_cp.FindChildInLayoutFile('id-major-hub-coin-model').SetItemItemId(tournamentCoinItemId, '');\n            _m_cp.FindChildInLayoutFile('id-major-hub-coin-model').SetPanelEvent('onactivate', () => {\n                $.DispatchEvent(\"InventoryItemPreview\", tournamentCoinItemId, '');\n            });\n        }\n        else {\n            let passIndex = g_ActiveTournamentInfo.itemid_pass;\n            let passId = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(passIndex, 0);\n            _m_cp.FindChildInLayoutFile('id-pass-upsell-image').itemid = passId;\n            let coinIndex = g_ActiveTournamentInfo.itemid_coins[0];\n            let coinId = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(coinIndex, 0);\n            _m_cp.FindChildInLayoutFile('id-pass-upsell-image-coin').itemid = coinId;\n            _SetPassBtnAction();\n        }\n    }\n    function _CreateUpdateChallenge(oChallenge) {\n        var elList = _m_cp.FindChildInLayoutFile('id-major-challenges');\n        var elChallenge = _m_cp.FindChildInLayoutFile('id-major-challenge-' + oChallenge.idx);\n        if (!elChallenge) {\n            elChallenge = $.CreatePanel(\"Panel\", elList, 'id-major-challenge-' + oChallenge.idx);\n            elChallenge.BLoadLayoutSnippet(\"major-challenge\");\n        }\n        _UpdateChallenge(elChallenge, oChallenge);\n    }\n    function _UpdateChallenge(elChallenge, oChallenge) {\n        let elIcon = elChallenge.FindChildInLayoutFile('id-major-challenge-icon');\n        elChallenge.SetDialogVariable('challenge_desc', oChallenge.text);\n        let iconPath = oChallenge.isComplete ? 'file://{images}/icons/ui/check.svg' :\n            oChallenge.isDisqualified ? 'file://{images}/icons/ui/cancel.svg' :\n                'file://{images}/icons/ui/' + oChallenge.icon + '.svg';\n        elIcon.SetImage(iconPath);\n        elChallenge.SetHasClass('complete', oChallenge.isComplete);\n        elChallenge.SetHasClass('disqualified', !oChallenge.isComplete && oChallenge.isDisqualified);\n    }\n    function _SetPoints(nPointsEarned, tournamentCoinItemId) {\n        _m_cp.SetDialogVariableInt('challenges_complete', nPointsEarned);\n        let coinLevel = InventoryAPI.GetItemAttributeValue(tournamentCoinItemId, \"upgrade level\");\n        let style = coinLevel < 1 ? 'bronze' : coinLevel === 1 ? 'silver' : coinLevel > 1 ? 'gold' : 'bronze';\n        $.GetContextPanel().FindChildInLayoutFile('id-coin-status-image').AddClass(style);\n    }\n    var _SetThresholdText = function (nPointsEarned, nTotalChallenges, tournamentCoinItemId) {\n        let threshold = InventoryAPI.GetItemAttributeValue(tournamentCoinItemId, \"upgrade threshold\");\n        let sText = (nTotalChallenges - nPointsEarned) === 0 ? '#tournament_coin_completed_challenges' :\n            (threshold > nPointsEarned) ? '#tournament_coin_remaining_challenges_curr' : '';\n        let challengesRemain = threshold - nPointsEarned;\n        _m_cp.SetDialogVariableInt('challenges', challengesRemain);\n        _m_cp.SetDialogVariable('challenges_status', $.Localize(sText, $.GetContextPanel()));\n    };\n    var _RedemptionChargesRemaining = function (tournamentCoinItemId) {\n        let coinLevel = parseInt(InventoryAPI.GetItemAttributeValue(tournamentCoinItemId, \"upgrade level\"));\n        let coinRedeemsPurchased = parseInt(InventoryAPI.GetItemAttributeValue(tournamentCoinItemId, \"operation drops awarded 1\"));\n        if (coinRedeemsPurchased)\n            coinLevel += coinRedeemsPurchased;\n        let redeemed = parseInt(InventoryAPI.GetItemAttributeValue(tournamentCoinItemId, \"operation drops awarded 0\"));\n        m_redeemAvailable = coinLevel - redeemed;\n        if (_m_eventId >= 26)\n            m_redeemAvailable = 0;\n        _m_cp.SetDialogVariableInt('redeems', m_redeemAvailable);\n        let elPanel = _m_cp.FindChildInLayoutFile('id-coin-status-charges');\n        elPanel.visible = m_redeemAvailable > 0;\n        let sTooltip = $.Localize('#popup_redeem_souvenir_desc:f', _m_cp);\n        elPanel.SetPanelEvent('onmouseover', () => { UiToolkitAPI.ShowTextTooltip('id-coin-status-charges', sTooltip); });\n        elPanel.SetPanelEvent('onmouseout', () => { UiToolkitAPI.HideTextTooltip(); });\n    };\n    var _SetPassBtnAction = function () {\n        let btn = _m_cp.FindChildInLayoutFile('id-pass-upsell-btn');\n        let passItemId = InventoryAPI.GetActiveTournamentCoinItemId(_m_eventId * -1);\n        if ((!passItemId || passItemId === '0')) {\n            let bCanPurchasePass = (g_ActiveTournamentInfo.eventid === _m_eventId) &&\n                ('' !== StoreAPI.GetStoreItemSalePrice(InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(g_ActiveTournamentStoreLayout[0][0], 0), 1, ''));\n            if (bCanPurchasePass) {\n                btn.text = '#SFUI_ConfirmBtn_GetPassNow';\n                btn.SetPanelEvent('onactivate', () => {\n                    var contextMenuPanel = UiToolkitAPI.ShowCustomLayoutContextMenuParameters('', '', 'file://{resources}/layout/context_menus/context_menu_store_linked_items.xml', 'itemids=' + InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(g_ActiveTournamentInfo.itemid_pass, 0) +\n                        ',' + InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(g_ActiveTournamentInfo.itemid_pack, 0) +\n                        '&' + 'linkedWarning=#tournament_items_notice');\n                    contextMenuPanel.AddClass(\"ContextMenu_NoArrow\");\n                });\n            }\n            else {\n                btn.text = '';\n                btn.visible = false;\n                btn.SetPanelEvent('onactivate', () => {\n                });\n            }\n        }\n        else {\n            btn.text = '#SFUI_ConfirmBtn_ActivatePassNow';\n            btn.SetPanelEvent('onactivate', () => {\n                InventoryAPI.UseTool(passItemId, '');\n            });\n        }\n    };\n    function _SetUpSpray() {\n        let elParent = $.GetContextPanel().FindChildInLayoutFile('id-major-store');\n        if (!_m_eventId) {\n            elParent.SetHasClass('graffiti-panel-visible', false);\n            return;\n        }\n        let tournamentCoinItemId = InventoryAPI.GetActiveTournamentCoinItemId(_m_eventId);\n        if (!tournamentCoinItemId || tournamentCoinItemId === '0' || g_ActiveTournamentInfo.eventid !== _m_eventId || !g_ActiveTournamentInfo.active) {\n            elParent.SetHasClass('graffiti-panel-visible', false);\n            return;\n        }\n        var elImage = $.GetContextPanel().FindChildInLayoutFile('id-tournament-journal-spray');\n        elImage.itemid = ItemInfo.GetFauxReplacementItemID(tournamentCoinItemId, 'graffiti');\n        var elIBtn = $.GetContextPanel().FindChildInLayoutFile('id-tournament-journal-selectspray-btn');\n        elIBtn.SetPanelEvent('onactivate', function () {\n            UiToolkitAPI.ShowCustomLayoutPopupParameters('', 'file://{resources}/layout/popups/popup_tournament_select_spray.xml', 'journalid=' + tournamentCoinItemId +\n                '&' + 'eventid=' + _m_eventId);\n        });\n        elParent.SetHasClass('graffiti-panel-visible', true);\n    }\n    ;\n    function NavigateToTab(sectionIndex) {\n        let elPage = _m_elPickemPages.FindChild('id-pickem-page-stage' + sectionIndex);\n        elPage?.SetHasClass('hidden', m_selectedPage === elPage);\n        m_selectedPage?.SetHasClass('hidden', m_selectedPage !== elPage);\n        let sectionId = PredictionsAPI.GetEventSectionIDByIndex(_m_tournamentId, sectionIndex);\n        let groupId = PredictionsAPI.GetSectionGroupIDByIndex(_m_tournamentId, sectionId, 0);\n        m_selectedPage = elPage;\n        m_oPageData.panel = elPage;\n        m_oPageData.eventId = _m_eventId;\n        m_oPageData.tournamentId = _m_tournamentId;\n        m_oPageData.sectionId = sectionId;\n        m_oPageData.groupId = groupId;\n        m_oPageData.sectionIndex = sectionIndex;\n        PredictionsTimer.UpdateTimer();\n        if ((sectionIndex < g_ActiveTournamentInfo.num_stages_with_swiss) && elPage) {\n            PredictionsGroup.Init();\n        }\n        else {\n            PredictionsBracket.Init();\n        }\n        if (!m_oPageData.hasAlreadyInit.includes(elPage.id)) {\n            m_oPageData.hasAlreadyInit.push(elPage.id);\n        }\n    }\n    PopupMajorHub.NavigateToTab = NavigateToTab;\n    function GetActivePageData() {\n        return m_oPageData;\n    }\n    PopupMajorHub.GetActivePageData = GetActivePageData;\n    function RefreshData() {\n        MatchListAPI.Refresh(_m_tournamentId);\n    }\n    PopupMajorHub.RefreshData = RefreshData;\n    function LoadPickEmData() {\n        let listState = MatchListAPI.GetState(_m_tournamentId);\n        let elLoadingPanel = _m_cp.FindChildInLayoutFile('id-pickem-loading-status');\n        if (listState === 'none') {\n            MatchListAPI.Refresh(_m_tournamentId);\n            _CancelMatchStatsLoadedTimeout();\n            _m_cp.SetHasClass('loading', true);\n            _m_cp.SetHasClass('timeout', false);\n            elLoadingPanel.SetDialogVariable('pickem_loaded_status', $.Localize('#CSGO_Watch_Loading_PickEm'));\n        }\n        if (listState === 'ready') {\n            let isLoaded = PredictionsAPI.GetMyPredictionsLoaded(_m_tournamentId);\n            let sectionsCount = PredictionsAPI.GetEventSectionsCount(_m_tournamentId);\n            if (!isLoaded || !sectionsCount) {\n                _CancelMatchStatsLoadedTimeout();\n                _m_timeoutHandle = $.Schedule(5, () => {\n                    _m_timeoutHandle = null;\n                    elLoadingPanel.SetDialogVariable('pickem_loaded_status', $.Localize('#pickem_apply_timeout'));\n                    _m_cp.SetHasClass('timeout', true);\n                });\n                return;\n            }\n            _CancelMatchStatsLoadedTimeout();\n            _m_cp.SetHasClass('loading', false);\n            if (!m_setDefaultTab) {\n                $.Schedule(.15, SetDefaultTab);\n            }\n            else {\n                NavigateToTab(m_oPageData.sectionIndex);\n            }\n            return;\n        }\n        return;\n    }\n    function _CancelMatchStatsLoadedTimeout() {\n        if (_m_timeoutHandle) {\n            $.CancelScheduled(_m_timeoutHandle);\n            _m_timeoutHandle = null;\n        }\n    }\n    ;\n    function CheckIfPickIsCorrect(sCorrectPicks, userPickTeamID) {\n        let aCorrectPicks = sCorrectPicks.split(',');\n        return aCorrectPicks.includes(userPickTeamID.toString());\n    }\n    PopupMajorHub.CheckIfPickIsCorrect = CheckIfPickIsCorrect;\n    function IsSectionActive() {\n        if (PredictionsAPI.GetSectionIsActive(m_oPageData.tournamentId, m_oPageData.sectionId)) {\n            return true;\n        }\n        return false;\n    }\n    PopupMajorHub.IsSectionActive = IsSectionActive;\n    function IsPreviousSectionActive() {\n        if (PredictionsAPI.GetSectionIsActive(m_oPageData.tournamentId, m_oPageData.sectionId - 1)) {\n            return true;\n        }\n        return false;\n    }\n    PopupMajorHub.IsPreviousSectionActive = IsPreviousSectionActive;\n    function GetTeamIcon(teamId) {\n        let teamTag = PredictionsAPI.GetTeamTag(teamId);\n        return 'file://{images}/tournaments/teams/' + teamTag + '.svg';\n    }\n    PopupMajorHub.GetTeamIcon = GetTeamIcon;\n    function OnInventoryUpdated() {\n        _SetUpSpray();\n        _UpdateChallenges();\n        SavePicksButton.ShowHideNoActivePassWarning(m_oPageData, false);\n    }\n    function RefreshActivePage() {\n        PredictionsTimer.UpdateTimer();\n        if (m_oPageData.sectionIndex < g_ActiveTournamentInfo.num_stages_with_swiss) {\n            PredictionsGroup.UpdateFromPredictionUploadedEvent();\n        }\n        else if (m_oPageData.sectionIndex == g_ActiveTournamentInfo.num_stages_with_swiss) {\n            PredictionsBracket.UpdateFromPredictionUploadedEvent();\n        }\n    }\n    function ItemAcquired(itemId) {\n        let nSouvenir = g_ActiveTournamentInfo;\n        let newItemDefName = InventoryAPI.GetItemDefinitionName(itemId);\n        let passDef = InventoryAPI.GetItemDefinitionName(InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(g_ActiveTournamentInfo.itemid_pass, 0));\n        let passPackDef = InventoryAPI.GetItemDefinitionName(InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(g_ActiveTournamentInfo.itemid_pack, 0));\n        if (InventoryAPI.GetItemDefinitionName(itemId) === passDef || InventoryAPI.GetItemDefinitionName(itemId) === passPackDef) {\n            AcknowledgeItems.GetItemsByType([passDef, passPackDef], true);\n            OpenPassActivate(itemId);\n            return;\n        }\n    }\n    function OpenPassActivate(itemId) {\n        const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('', 'file://{resources}/layout/popups/popup_capability_decodable.xml');\n        let oSettings = {\n            item_id: itemId,\n            work_type: 'decodeable'\n        };\n        elPanel.Data().oSettings = oSettings;\n    }\n    function DeleteDragItem() {\n        if (PopupMajorHub.m_elDragImage && PopupMajorHub.m_elDragImage.IsValid()) {\n            PopupMajorHub.m_elDragImage.DeleteAsync(0.25);\n        }\n    }\n    PopupMajorHub.DeleteDragItem = DeleteDragItem;\n    {\n        ReadyForDisplay();\n        $.RegisterForUnhandledEvent('PanoramaComponent_MyPersona_GcLogonNotificationReceived', ReadyForDisplay);\n        $.RegisterForUnhandledEvent('PanoramaComponent_MyPersona_UpdateConnectionToGC', ReadyForDisplay);\n        $.RegisterForUnhandledEvent('PanoramaComponent_MatchList_StateChange', LoadPickEmData);\n        $.RegisterForUnhandledEvent('PanoramaComponent_MatchList_PredictionUploaded', RefreshActivePage);\n        $.RegisterForUnhandledEvent('PanoramaComponent_Store_PurchaseCompleted', ItemAcquired);\n        $.RegisterForUnhandledEvent('OpenInventory', ClosePopup);\n        $.RegisterEventHandler('ReadyForDisplay', _m_cp, ReadyForDisplay);\n        $.RegisterEventHandler('UnreadyForDisplay', _m_cp, UnreadyForDisplay);\n    }\n})(PopupMajorHub || (PopupMajorHub = {}));\nvar SavePicksButton;\n(function (SavePicksButton) {\n    let _m_timeoutApplyHandle;\n    function UpdateBtn(aLocalPicks = []) {\n        ResetTimeoutHandle();\n        let oPageData = PopupMajorHub.GetActivePageData();\n        let elBtn = oPageData.panel.FindChildInLayoutFile('id-predictions-apply-btn').FindChild('id-apply-btn');\n        let elWarning = oPageData.panel.FindChildInLayoutFile('id-predictions-apply-btn').FindChild('id-apply-warning');\n        elWarning.SetDialogVariable('pass-name', InventoryAPI.GetItemName(InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(g_ActiveTournamentInfo.itemid_pass, 0)));\n        let bThisSectionIsNoLongerActive = !PredictionsAPI.GetSectionIsActive(oPageData.tournamentId, oPageData.sectionId);\n        if (!PredictionsAPI.GetGroupCanPick(oPageData.tournamentId, oPageData.groupId)) {\n            elBtn.enabled = false;\n            elBtn.visible = false;\n            ShowHideNoActivePassWarning(oPageData, true);\n            let elToggleBtn = oPageData.panel.FindChildInLayoutFile('id-predictions-apply-btn').FindChild('id-toggle-correct-btn');\n            elToggleBtn.visible = true;\n            elToggleBtn.SetPanelEvent('onactivate', () => {\n                oPageData.panel.SetHasClass('show-all-correct-picks', !oPageData.panel.BHasClass('show-all-correct-picks'));\n            });\n            elToggleBtn.checked = bThisSectionIsNoLongerActive;\n            oPageData.panel.SetHasClass('show-all-correct-picks', bThisSectionIsNoLongerActive);\n            return;\n        }\n        if (bThisSectionIsNoLongerActive) {\n            elBtn.enabled = false;\n            elBtn.visible = false;\n            ShowHideNoActivePassWarning(oPageData, true);\n            return;\n        }\n        elBtn.visible = true;\n        ShowHideNoActivePassWarning(oPageData, false);\n        let nCount = (oPageData.sectionIndex >= g_ActiveTournamentInfo.num_stages_with_swiss) ? 7 : PredictionsAPI.GetGroupPicksCount(oPageData.tournamentId, oPageData.groupId);\n        if (aLocalPicks.length === nCount) {\n            let bPicksDifferent = false;\n            for (let i = 0; i < nCount; ++i) {\n                if (aLocalPicks[i].teamId !== PredictionsAPI.GetMyPredictionTeamID(oPageData.tournamentId, aLocalPicks[i].group, aLocalPicks[i].groupIndex)) {\n                    bPicksDifferent = true;\n                    break;\n                }\n                ;\n            }\n            elBtn.enabled = bPicksDifferent;\n            elBtn.SetDialogVariable('save-btn-text', bPicksDifferent ?\n                $.Localize('#pickem_save_all') :\n                $.Localize('#pickem_saved'));\n            elBtn.SwitchClass('btn_state', !bPicksDifferent ? 'saved' : '');\n            if (bPicksDifferent) {\n                _SetPicks(elBtn, oPageData, nCount, aLocalPicks);\n            }\n        }\n        else {\n            elBtn.enabled = false;\n            elBtn.SwitchClass('btn_state', '');\n            elBtn.SetDialogVariableInt('user-picks', aLocalPicks.length);\n            elBtn.SetDialogVariableInt('total-picks', nCount);\n            elBtn.SetDialogVariable('save-btn-text', $.Localize('#pickem_make_picks', elBtn));\n        }\n    }\n    SavePicksButton.UpdateBtn = UpdateBtn;\n    function ShowHideNoActivePassWarning(oPageData, bHide = false) {\n        if (!oPageData.panel || oPageData.panel.IsValid() === false) {\n            return;\n        }\n        let elWarning = oPageData.panel.FindChildInLayoutFile('id-predictions-apply-btn').FindChild('id-apply-warning');\n        let tournamentCoinItemId = InventoryAPI.GetActiveTournamentCoinItemId(SavePicksButton._m_eventId);\n        elWarning.visible = (!tournamentCoinItemId || tournamentCoinItemId === '0') && !bHide;\n    }\n    SavePicksButton.ShowHideNoActivePassWarning = ShowHideNoActivePassWarning;\n    function _SetPicks(elBtn, oPageData, nCount, aLocalPicks) {\n        if (elBtn.enabled) {\n            var args = [oPageData.tournamentId];\n            for (var i = 0; i < nCount; ++i) {\n                args.push(aLocalPicks[i].group.toString(), aLocalPicks[i].groupIndex.toString(), PredictionsAPI.GetFakeItemIDToRepresentTeamID(oPageData.tournamentId, aLocalPicks[i].teamId));\n            }\n            elBtn.SetPanelEvent('onactivate', () => {\n                let tournamentCoinItemId = InventoryAPI.GetActiveTournamentCoinItemId(oPageData.eventId);\n                let passItemId = InventoryAPI.GetActiveTournamentCoinItemId(SavePicksButton._m_eventId * -1);\n                let bHasActiveCoin = tournamentCoinItemId && tournamentCoinItemId !== '0';\n                let bIsPrime = (MyPersonaAPI.GetElevatedState() === 'elevated');\n                if (!elBtn.BHasClass('activated-by-program')) {\n                    if (!bIsPrime && !bHasActiveCoin) {\n                        if (!elBtn.BHasClass('activated-by-program')) {\n                            UiToolkitAPI.ShowGenericPopupTwoOptions('#CSGO_official_leaderboard_pickem_' + g_ActiveTournamentInfo.location + '_team', '#CSGO_PickEm_Leaderboards_PassOrPrime_Message', '', '#SFUI_ConfirmBtn_GetPassNow', () => { }, '#SFUI_Elevated_Status_Sale_action', () => { UiToolkitAPI.ShowCustomLayoutPopup('prime_status', 'file://{resources}/layout/popups/popup_prime_status.xml'); });\n                        }\n                        return;\n                    }\n                    if (!bHasActiveCoin && (passItemId && passItemId !== '0')) {\n                        let elPopup = UiToolkitAPI.ShowGenericPopupTwoOptions('#pickem_submit_warning_popup_title', '#pickem_submit_warning_popup_desc', '', '#pickem_submit_warning_popup_action2', () => {\n                            InventoryAPI.UseTool(passItemId, '');\n                            _SubmitPicks(elBtn, args);\n                        }, '#pickem_submit_warning_popup_action', () => { _SubmitPicks(elBtn, args); });\n                        elPopup.SetDialogVariable('pass-name', InventoryAPI.GetItemName(InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(g_ActiveTournamentInfo.itemid_pass, 0)));\n                        return;\n                    }\n                    if (!bHasActiveCoin) {\n                        let elPopup = UiToolkitAPI.ShowGenericPopupTwoOptions('#pickem_submit_warning_popup_title', '#pickem_submit_warning_popup_desc', '', '#SFUI_ConfirmBtn_GetPassNow', () => {\n                            $.DispatchEvent('UIPopupButtonClicked', elPopup, '');\n                            $.DispatchEvent('ContextMenuEvent', '');\n                            UiToolkitAPI.HideTextTooltip();\n                            var contextMenuPanel = UiToolkitAPI.ShowCustomLayoutContextMenuParameters('', '', 'file://{resources}/layout/context_menus/context_menu_store_linked_items.xml', 'itemids=' + InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(g_ActiveTournamentInfo.itemid_pass, 0) +\n                                ',' + InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(g_ActiveTournamentInfo.itemid_pack, 0) +\n                                '&' + 'linkedWarning=#tournament_items_notice');\n                            contextMenuPanel.AddClass(\"ContextMenu_NoArrow\");\n                            contextMenuPanel.SetFocus();\n                        }, '#pickem_submit_warning_popup_action', () => { _SubmitPicks(elBtn, args); });\n                        elPopup.SetDialogVariable('pass-name', InventoryAPI.GetItemName(InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(g_ActiveTournamentInfo.itemid_pass, 0)));\n                        return;\n                    }\n                }\n                _SubmitPicks(elBtn, args);\n            });\n        }\n    }\n    function _SubmitPicks(elBtn, args) {\n        elBtn.enabled = false;\n        elBtn.SwitchClass('btn_state', 'waiting-for-update');\n        $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.tab_mainmenu_shop', 'MOUSE');\n        PredictionsAPI.SetMyPredictionUsingItemID.apply(PredictionsAPI, args);\n        ResetTimeoutHandle();\n        _m_timeoutApplyHandle = $.Schedule(7, () => {\n            _CancelWaitForCallBack(elBtn);\n        });\n    }\n    SavePicksButton._SubmitPicks = _SubmitPicks;\n    function ResetTimeoutHandle() {\n        if (_m_timeoutApplyHandle) {\n            $.CancelScheduled(_m_timeoutApplyHandle);\n            _m_timeoutApplyHandle = null;\n        }\n    }\n    SavePicksButton.ResetTimeoutHandle = ResetTimeoutHandle;\n    function _CancelWaitForCallBack(elBtn) {\n        _m_timeoutApplyHandle = null;\n        PopupMajorHub.ClosePopup();\n        UiToolkitAPI.ShowGenericPopupOk($.Localize('#SFUI_SteamConnectionErrorTitle'), $.Localize('#CSGO_PickEm_Pick_TimeOut'), '', () => { });\n    }\n})(SavePicksButton || (SavePicksButton = {}));\n","scripts/popups/popup_major_store.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../common/licenseutil.ts\" />\n/// <reference path=\"../common/eventutil.ts\" />\n/// <reference path=\"../common/store_items.ts\" />\n/// <reference path=\"../common/shopping_cart.ts\" />\n/// <reference path=\"../common/add_major_tokens_anim.ts\" />\n/// <reference path=\"../common/formattext.ts\" />\n/// <reference path=\"../generated/items_event_current_generated_store.d.ts\" />\n/// <reference path=\"../generated/items_event_current_generated_store.ts\" />\n/// <reference path=\"../popups/popup_acknowledge_item.ts\" />\n/// <reference path=\"../itemtile_store.ts\" />\n/// <reference path=\"../common/unique_random_number.ts\"/>\nvar PopupMajorStore;\n(function (PopupMajorStore) {\n    const defidxStickerItem = InventoryAPI.GetItemDefinitionIndexFromDefinitionName('sticker');\n    const defidxKeyChainItem = InventoryAPI.GetItemDefinitionIndexFromDefinitionName('keychain');\n    function State(cp) {\n        return cp.Data();\n    }\n    function _CompareByPopularity(a, b) {\n        if (a.popularity != b.popularity)\n            return b.popularity - a.popularity;\n        if (a.price != b.price)\n            return b.price - a.price;\n        const aId = a.rawId ?? a.kc_highlight ?? a.itemId;\n        const bId = b.rawId ?? b.kc_highlight ?? b.itemId;\n        return aId < bId ? -1 : (aId > bId ? 1 : 0);\n    }\n    let Bookmarks;\n    (function (Bookmarks) {\n        const SETTING = 'cl_major_store_watch_list';\n        let _cache = null;\n        function ids() {\n            if (_cache === null) {\n                const raw = GameInterfaceAPI.GetSettingString(SETTING);\n                _cache = raw ? raw.split(',') : [];\n            }\n            return _cache;\n        }\n        Bookmarks.ids = ids;\n        function invalidate() {\n            _cache = null;\n        }\n        Bookmarks.invalidate = invalidate;\n        function has(defidx) {\n            return ids().includes(defidx.toString());\n        }\n        Bookmarks.has = has;\n        function toggle(defidx) {\n            const id = defidx.toString();\n            const list = [...ids()];\n            const idx = list.indexOf(id);\n            if (idx === -1)\n                list.push(id);\n            else\n                list.splice(idx, 1);\n            GameInterfaceAPI.SetSettingString(SETTING, list.length > 0 ? list.join(',') : '');\n            _cache = list;\n        }\n        Bookmarks.toggle = toggle;\n    })(Bookmarks || (Bookmarks = {}));\n    const NAV_TAB_NONE = '';\n    const VIEW_HOME = 'id-major-store-banners';\n    const VIEW_CONTENT = 'id-major-store-content';\n    const VIEW_CHARMS = 'id-major-store-keychains';\n    const VIEW_TEAM = 'id-major-store-team-view';\n    const VIEW_SINGLE = 'id-major-store-single-view';\n    const NO_SERIES_FILTER = '';\n    const SORT_OPTIONS = {\n        'price-high-low': { field: 'price', direction: 'desc' },\n        'price-low-high': { field: 'price', direction: 'asc' },\n        'weekly-high-low': { field: 'weeklyPctReductionFromHigh', direction: 'desc' },\n        'popularity-high-low': { field: 'popularity', direction: 'desc' },\n        'popularity-low-high': { field: 'popularity', direction: 'asc' },\n        'name': { field: 'name', direction: 'asc' },\n    };\n    const SORT_OPTION_IDS = Object.keys(SORT_OPTIONS);\n    const VIEW_SORTS = {\n        Event: { key: 'event', default: 'popularity-high-low', hidden: [] },\n        Ranked: { key: 'ranked', default: 'price-high-low', hidden: ['weekly-high-low', 'popularity-high-low', 'popularity-low-high'] },\n        Champions: { key: 'champions', default: 'popularity-high-low', hidden: ['weekly-high-low'] },\n        Favorites: { key: 'favorites', default: 'weekly-high-low', hidden: ['popularity-high-low', 'popularity-low-high'] },\n        AllItems: { key: 'all', default: 'name', hidden: [] },\n        Search: { key: 'search', default: 'weekly-high-low', hidden: [] },\n    };\n    function _CloseSortDropDown(cp) {\n        const elDropDown = _SortDropDown(cp);\n        const elMenu = elDropDown ? elDropDown.AccessDropDownMenu() : null;\n        if (!elMenu || !elMenu.visible) {\n            return;\n        }\n        const elPage = cp.FindChildInLayoutFile('id-major-store-content-page');\n        if (elPage) {\n            elPage.SetFocus();\n        }\n    }\n    function _SortDropDown(cp) {\n        return cp.FindChildInLayoutFile('id-major-store-sort-dropdown');\n    }\n    function _SelectSort(cp, szSortId) {\n        m_bApplyingSort = true;\n        _SortDropDown(cp).SetSelected(szSortId);\n        m_bApplyingSort = false;\n    }\n    function _ApplyViewSort(cp, sort) {\n        State(cp).activeSort = sort;\n        const elDropDown = _SortDropDown(cp);\n        SORT_OPTION_IDS.forEach(id => {\n            const elOption = elDropDown.FindDropDownMenuChild(id);\n            if (elOption) {\n                elOption.visible = !sort.hidden.includes(id);\n            }\n        });\n        const szRemembered = State(cp).mSortByView[sort.key];\n        const szWanted = (szRemembered && !sort.hidden.includes(szRemembered)) ? szRemembered : sort.default;\n        _SelectSort(cp, szWanted);\n    }\n    function _RememberViewSort(cp, szSortId) {\n        State(cp).mSortByView[State(cp).activeSort.key] = szSortId;\n    }\n    const SERIES_FILTERS = [\n        { toggleId: 'id-major-store-filter-major', loc: '#major_store_filter_type_major_only', chipId: 'id-filter-active-major-only' },\n        { toggleId: 'id-major-store-filter-champions', loc: '#major_store_filter_type_champions_only', chipId: 'id-filter-active-champions-only' },\n        { toggleId: 'id-major-store-filter-ranked', loc: '#major_store_filter_type_ranked_only', chipId: 'id-filter-active-ranked-only' },\n    ];\n    const REFINEMENT_FILTERS = [\n        { toggleId: 'id-major-store-filter-team', loc: '#major_store_filter_type_team_only', chipId: 'id-filter-active-t-only' },\n        { toggleId: 'id-major-store-filter-player', loc: '#major_store_filter_type_player_only', chipId: 'id-filter-active-p-only' },\n    ];\n    function _IsMixedContentView(cp) {\n        if (State(cp).useBookMarkList) {\n            return true;\n        }\n        const elParent = cp.FindChildInLayoutFile('id-major-store-nav-tabs-container');\n        if (cp.FindChildInLayoutFile('id-major-store-nav-home').checked) {\n            return false;\n        }\n        return !STORE_NAV_TABS.some(tab => {\n            const elTab = elParent.FindChild(tab.key);\n            return elTab && elTab.checked;\n        });\n    }\n    function _MatchesSeriesFilter(item, settings) {\n        if (!settings.rankedOnly && !settings.championsOnly && !settings.majorOnly) {\n            return true;\n        }\n        return (settings.rankedOnly && item.isRanked)\n            || (settings.championsOnly && item.champion)\n            || (settings.majorOnly && ('rawId' in item) && !item.isRanked && !item.champion);\n    }\n    function _UpdateFilterSections(cp) {\n        const bMixed = _IsMixedContentView(cp);\n        cp.FindChildInLayoutFile('id-filter-section-series').visible = bMixed;\n        cp.FindChildInLayoutFile('id-filter-section-keychains').visible = bMixed;\n        cp.FindChildInLayoutFile('id-filter-section-teams').visible =\n            !cp.FindChildInLayoutFile('id-major-store-filter-champions').checked;\n    }\n    function _SetActiveSeriesFilter(cp, toggleId) {\n        if (toggleId !== NO_SERIES_FILTER && !SERIES_FILTERS.some(s => s.toggleId === toggleId)) {\n        }\n        SERIES_FILTERS.forEach(series => {\n            const elToggle = cp.FindChildInLayoutFile(series.toggleId);\n            if (elToggle) {\n                elToggle.checked = (series.toggleId === toggleId);\n            }\n        });\n    }\n    const SEARCH_DEBOUNCE_HANDLE = 'textDebounceTimeoutHandle';\n    const MAX_SEARCH_RESULTS_SHOWN = 20;\n    let m_activeMain = null;\n    const m_overlayStack = [];\n    let m_bSyncingNavTabs = false;\n    let m_bApplyingSort = false;\n    const StoreNavActions = {\n        Home: (cp) => {\n            _OnActivateClearAll(cp);\n            _SetActiveSeriesFilter(cp, NO_SERIES_FILTER);\n            _ShowMainPanel(cp, VIEW_HOME);\n        },\n        Major: (cp) => _ShowCategoryList(cp, 'id-major-store-filter-major', VIEW_SORTS.Event),\n        Ranked: (cp) => _ShowCategoryList(cp, 'id-major-store-filter-ranked', VIEW_SORTS.Ranked),\n        Champions: (cp) => _ShowCategoryList(cp, 'id-major-store-filter-champions', VIEW_SORTS.Champions),\n        Bookmarks: (cp) => {\n            _OnActivateClearAll(cp);\n            _SetActiveSeriesFilter(cp, NO_SERIES_FILTER);\n            _ApplyViewSort(cp, VIEW_SORTS.Favorites);\n            State(cp).useBookMarkList = true;\n            _ShowMainPanel(cp, VIEW_CONTENT);\n        },\n        Charms: (cp) => {\n            _OnActivateClearAll(cp);\n            _SetActiveSeriesFilter(cp, NO_SERIES_FILTER);\n            _ApplyViewSort(cp, VIEW_SORTS.AllItems);\n            _ShowMainPanel(cp, VIEW_CHARMS);\n        },\n    };\n    const STORE_CAROUSELS = [\n        {\n            key: 'ranked',\n            bannerId: 'id-banner-ranked',\n            seeAllBtnId: 'id-major-store-see-all-ranked-btn',\n            hasItems: (cp) => State(cp).aFlatStickersData.some(s => s.isRanked),\n            refresh: (cp) => _SetUpRankedBanner(cp),\n            onSeeAll: StoreNavActions.Ranked,\n            navTabKey: 'ranked',\n        },\n    ];\n    const STORE_NAV_TABS = [\n        {\n            key: 'major',\n            loc: '#major_store_nav_tab_major',\n            isAvailable: (cp) => State(cp).aFlatStickersData.length > 0,\n            activate: StoreNavActions.Major,\n        },\n        {\n            key: 'champions',\n            loc: '#major_store_nav_tab_champions',\n            isAvailable: (cp) => State(cp).aFlatStickersData.some(s => s.champion),\n            activate: StoreNavActions.Champions,\n        },\n        {\n            key: 'ranked',\n            loc: '#major_store_nav_tab_ranked',\n            isAvailable: (cp) => State(cp).aFlatStickersData.some(s => s.isRanked),\n            activate: StoreNavActions.Ranked,\n        },\n        {\n            key: 'charms',\n            loc: '#major_store_nav_tab_charms',\n            isAvailable: (cp) => State(cp).aFlatKeyChainData.length > 1,\n            activate: StoreNavActions.Charms,\n        },\n        {\n            key: 'bookmarked',\n            loc: '#major_store_nav_tab_bookmarked',\n            isAvailable: () => true,\n            activate: StoreNavActions.Bookmarks,\n            label: (cp, elLabel) => {\n                const nCount = _GetBookmarkedItemsList(cp).length;\n                elLabel.SetDialogVariableInt('count', nCount);\n                return $.Localize(nCount > 0 ? '#major_store_nav_tab_bookmarked_count' : '#major_store_nav_tab_bookmarked', elLabel);\n            },\n        },\n    ];\n    const STORE_VIEWS = [\n        {\n            id: VIEW_HOME,\n            navTabKey: 'home',\n            onShow: (cp) => _RefreshHome(cp),\n            onRefresh: (cp) => _RefreshHome(cp),\n        },\n        {\n            id: VIEW_CONTENT,\n            rebuildIfActive: true,\n            onShow: (cp) => { if (!_UpdateFavoritesEmptyState(cp))\n                _MakeDelayedLoadList(cp); },\n            onRefresh: (cp, bDisableScroll) => _UpdateItemsList({ cp, bDisableScroll }),\n        },\n        {\n            id: VIEW_CHARMS,\n            navTabKey: 'charms',\n            onShow: (cp) => _SetUpKeyChainsPage(cp),\n            onRefresh: (cp) => _SetUpKeyChainsPage(cp),\n        },\n        {\n            id: VIEW_TEAM,\n            onRefresh: (cp) => _RefreshTeamView(cp),\n        },\n        {\n            id: VIEW_SINGLE,\n            onRefresh: (cp) => _RefreshSingleView(cp),\n            backTarget: VIEW_TEAM,\n        },\n    ];\n    PopupMajorStore.UpdateAnimationTimer = 5;\n    function ClosePopup() {\n        const cp = $.GetContextPanel();\n        cp.SetReadyForDisplay(false);\n        CancelRefreshSubscription(cp);\n        CancelRefreshTimerUpdate(cp);\n        const state = State(cp);\n        const loadHandle = state.loadDataTimeoutHandler;\n        if (loadHandle) {\n            $.CancelScheduled(loadHandle);\n            state.loadDataTimeoutHandler = null;\n        }\n        if (jsTooltipDelayHandle) {\n            $.CancelScheduled(jsTooltipDelayHandle);\n            jsTooltipDelayHandle = null;\n        }\n        const searchHandle = cp.Data()[SEARCH_DEBOUNCE_HANDLE];\n        if (searchHandle) {\n            $.CancelScheduled(searchHandle);\n            cp.Data()[SEARCH_DEBOUNCE_HANDLE] = null;\n        }\n        const menuHandle = state.contextMenuCallbackHandle;\n        if (menuHandle) {\n            UiToolkitAPI.UnregisterJSCallback(menuHandle);\n            state.contextMenuCallbackHandle = null;\n        }\n        if (state.jsCallbackHandles) {\n            state.jsCallbackHandles.forEach((h) => UiToolkitAPI.UnregisterJSCallback(h));\n            state.jsCallbackHandles = [];\n        }\n        UiToolkitAPI.HideTextTooltip();\n        UiToolkitAPI.HideTitleTextTooltip();\n        $.DispatchEvent('CSGOPlaySoundEffect', 'inventory_inspect_close', 'MOUSE');\n        $.DispatchEvent('UIPopupButtonClicked', '');\n        $.DispatchEvent('ContextMenuEvent', '');\n    }\n    PopupMajorStore.ClosePopup = ClosePopup;\n    function _TrackJSCallback(cp, handle) {\n        if (!State(cp).jsCallbackHandles)\n            State(cp).jsCallbackHandles = [];\n        State(cp).jsCallbackHandles.push(handle);\n        return handle;\n    }\n    function ReadyForDisplay() {\n        if (!MyPersonaAPI.IsConnectedToGC()) {\n            ClosePopup();\n            return;\n        }\n        let eventId = g_ActiveTournamentInfo.eventid ? g_ActiveTournamentInfo.eventid : -1;\n        if (eventId < 0) {\n            ClosePopup();\n            return;\n        }\n        const cp = $.GetContextPanel();\n        State(cp).aFlatStickersData = [];\n        State(cp).aFlatKeyChainData = [];\n        State(cp).aKeyChainBannerItems = [];\n        State(cp).searchCache = null;\n        State(cp).activeSort = VIEW_SORTS.AllItems;\n        State(cp).mSortByView = {};\n        State(cp).stopTileUpdate = true;\n        _SubscribeForAllTournamentItems();\n    }\n    function Init() {\n        let cp = $.GetContextPanel();\n        if (!MyPersonaAPI.IsConnectedToGC()) {\n            ClosePopup();\n            return;\n        }\n        let eventId = g_ActiveTournamentInfo.eventid ? g_ActiveTournamentInfo.eventid : -1;\n        if (eventId < 0) {\n            ClosePopup();\n            return;\n        }\n        State(cp).arrAwaitingPricesheets = [];\n        if (!MissionsAPI.GetSeasonalOperationFauxCreditsCost(g_ActiveTournamentInfo.credits_id, InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(defidxStickerItem, g_ActiveTournamentInfo.stickerids[0])))\n            State(cp).arrAwaitingPricesheets.push(g_ActiveTournamentInfo.itemid_dynamic_stickers);\n        if (!MissionsAPI.GetSeasonalOperationFauxCreditsCost(g_ActiveTournamentInfo.credits_id, InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(defidxStickerItem, g_ActiveTournamentInfo.rankingids[0])))\n            State(cp).arrAwaitingPricesheets.push(g_ActiveTournamentInfo.itemid_rankings_stickers);\n        let nStickerIdChampion = 0;\n        g_ActiveTournamentTeams.forEach((tt) => {\n            tt.champions.forEach((tcp) => {\n                if (tcp.stickerids.length > 0)\n                    nStickerIdChampion = tcp.stickerids[0];\n            });\n        });\n        if (nStickerIdChampion && !MissionsAPI.GetSeasonalOperationFauxCreditsCost(g_ActiveTournamentInfo.credits_id, InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(defidxStickerItem, nStickerIdChampion)))\n            State(cp).arrAwaitingPricesheets.push(g_ActiveTournamentInfo.itemid_champion_stickers);\n        g_ActiveTournamentHighlights.forEach((thg) => {\n            if (!MissionsAPI.GetSeasonalOperationFauxCreditsCost(g_ActiveTournamentInfo.credits_id, InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(defidxKeyChainItem, thg.highlights[0].kc_highlight)))\n                State(cp).arrAwaitingPricesheets.push(thg.itemid_dynamic_shop);\n        });\n        if (!State(cp).loadDataTimeoutHandler && (State(cp).arrAwaitingPricesheets.length > 0)) {\n            $.GetContextPanel().SetHasClass('data-loading', true);\n            _PushOverlay(cp, 'id-major-store-loading');\n            State(cp).loadDataTimeoutHandler = $.Schedule(5, () => {\n                UiToolkitAPI.ShowGenericPopupOk($.Localize('#SFUI_SteamConnectionErrorTitle'), $.Localize('#SFUI_Steam_Error_LinkUnexpected'), '', () => $.DispatchEvent('HideContentPanel'));\n                ClosePopup();\n            });\n            return;\n        }\n        cp.SetHasClass('major-' + eventId, true);\n        if (!State(cp).contextMenuCallbackHandle)\n            State(cp).contextMenuCallbackHandle = UiToolkitAPI.RegisterJSCallback(OnSearchContextMenuCallBack);\n        cp.FindChildInLayoutFile('id-major-store-container-inner').AddClass('show');\n        PriceRefreshTimerUpdate(cp);\n        _UpdateStickerData(cp);\n        _UpdateKeyChainsData(cp);\n        _SetUpTitleBar(cp, eventId);\n        _SetUpTeamsBanner(cp);\n        _SetUpOrgBanners(cp);\n        _VariousButtonActionsAndEvents(cp);\n        _SetUpCarouselSeeAllButtons(cp);\n        _SetUpStoreNavTabs(cp);\n        _SetUpFilterPanel(cp);\n        _ShowMainPanel(cp, VIEW_HOME);\n        _UpdateBalance(cp);\n        ShoppingCart.cart.subscribeToUpdates(cp, 'cart-counter', () => {\n            const numItems = ShoppingCart.cart.getTotalItems();\n            cp.SetDialogVariableInt('cart-count', numItems);\n            cp.SetDialogVariableInt('cart-value', ShoppingCart.cart.getTotalPrice());\n            cp.FindChildInLayoutFile('id-major-store-cart-info').SetHasClass('show', numItems > 0);\n            cp.FindChildInLayoutFile('id-major-store-cart-info').TriggerClass('update-count');\n        });\n    }\n    PopupMajorStore.Init = Init;\n    function OnVolatileShopSubscribe(nContainerDef, bNewPricesParsed, cp) {\n        const loadHandle = State(cp).loadDataTimeoutHandler;\n        if (loadHandle) {\n            const state = State(cp);\n            state.arrAwaitingPricesheets = state.arrAwaitingPricesheets.filter((xx) => xx != nContainerDef);\n            if (state.arrAwaitingPricesheets.length > 0) {\n                return;\n            }\n            $.CancelScheduled(loadHandle);\n            state.loadDataTimeoutHandler = null;\n            _PopOverlay();\n            Init();\n            return;\n        }\n        RefreshSubscription(cp);\n        PriceRefreshTimerUpdate(cp);\n        if (bNewPricesParsed) {\n            if (nContainerDef == g_ActiveTournamentInfo.itemid_dynamic_stickers ||\n                nContainerDef == g_ActiveTournamentInfo.itemid_champion_stickers ||\n                nContainerDef == g_ActiveTournamentInfo.itemid_rankings_stickers) {\n                _UpdateStickerData(cp);\n            }\n            else if (g_ActiveTournamentDynamicContainers.includes(nContainerDef)) {\n                _UpdateKeyChainsData(cp);\n            }\n            State(cp).stopTileUpdate = false;\n            _UpdateVisiblePanel(cp, true);\n            $.Schedule(1, () => { State(cp).stopTileUpdate = true; });\n            ShoppingCart.cart.syncPrices((itemId) => {\n                const item = State(cp).aFlatStickersData.find(i => i.itemId === itemId);\n                return item ? item.price : undefined;\n            });\n        }\n    }\n    function _UpdateVisiblePanel(cp, bDisableScroll = false) {\n        _ActiveView()?.onRefresh?.(cp, bDisableScroll);\n    }\n    function GetNewMarketPrice(itemId) {\n        const item = State($.GetContextPanel()).aFlatStickersData.find(i => i.itemId === itemId);\n        return item ? item.price : undefined;\n    }\n    PopupMajorStore.GetNewMarketPrice = GetNewMarketPrice;\n    function _SubscribeForAllTournamentItems() {\n        g_ActiveTournamentDynamicContainers.forEach((id) => StoreAPI.VolatileShopSubscribe(id, true));\n    }\n    function GetSecondsUntilPendingPriceUpdateForAllTournamentItems() {\n        let nSeconds = 0;\n        g_ActiveTournamentDynamicContainers.forEach((id) => {\n            const nThisPricesheet = StoreAPI.GetSecondsUntilPendingPriceUpdate(id);\n            if (nThisPricesheet > 0) {\n                if ((nSeconds <= 0) || (nThisPricesheet < nSeconds))\n                    nSeconds = nThisPricesheet;\n            }\n        });\n        return nSeconds;\n    }\n    PopupMajorStore.GetSecondsUntilPendingPriceUpdateForAllTournamentItems = GetSecondsUntilPendingPriceUpdateForAllTournamentItems;\n    function RefreshSubscription(cp) {\n        if (!cp || !cp.IsValid())\n            return;\n        CancelRefreshSubscription(cp);\n        _SubscribeForAllTournamentItems();\n        State(cp).refreshSubscriptionHandle = $.Schedule(150, () => RefreshSubscription(cp));\n    }\n    PopupMajorStore.RefreshSubscription = RefreshSubscription;\n    function CancelRefreshSubscription(cp) {\n        const handle = State(cp).refreshSubscriptionHandle;\n        if (handle) {\n            $.CancelScheduled(handle);\n            State(cp).refreshSubscriptionHandle = null;\n        }\n    }\n    PopupMajorStore.CancelRefreshSubscription = CancelRefreshSubscription;\n    function PriceRefreshTimerUpdate(cp) {\n        if (!cp || !cp.IsValid())\n            return;\n        CancelRefreshTimerUpdate(cp);\n        const nSeconds = GetSecondsUntilPendingPriceUpdateForAllTournamentItems();\n        const elRefresh = cp.FindChildInLayoutFile('id-major-store-refresh');\n        const timer = cp.FindChildInLayoutFile('id-major-store-refresh-time');\n        timer.text = $.Localize(\"#major_store_prices_updated\");\n        if (nSeconds <= 0) {\n            CancelRefreshTimerUpdate(cp);\n            elRefresh.SetPanelEvent('onmouseover', () => {\n                UiToolkitAPI.ShowTextTooltip('id-major-store-refresh', '#major_store_prices_updated_tooltip');\n            });\n            elRefresh.SetPanelEvent('onmouseout', () => {\n                UiToolkitAPI.HideTextTooltip();\n            });\n            elRefresh.SetHasClass('alert', false);\n            return;\n        }\n        elRefresh.SetPanelEvent('onmouseover', () => {\n            UiToolkitAPI.ShowTextTooltip('id-major-store-refresh', '#major_store_refesh_tooltip');\n        });\n        elRefresh.SetPanelEvent('onmouseout', () => {\n            UiToolkitAPI.HideTextTooltip();\n        });\n        elRefresh.SetHasClass('alert', true);\n        timer.SetDialogVariable('timer', FormatText.SecondsToDDHHMMSSWithSymbolSeperator(nSeconds));\n        timer.text = nSeconds > 1 ?\n            $.Localize('#major_store_refresh_timer', timer) :\n            $.Localize('#major_store_refresh_soon');\n        State(cp).priceRefreshHandler = $.Schedule(1, () => PriceRefreshTimerUpdate(cp));\n    }\n    PopupMajorStore.PriceRefreshTimerUpdate = PriceRefreshTimerUpdate;\n    function CancelRefreshTimerUpdate(cp) {\n        const handle = State(cp).priceRefreshHandler;\n        if (handle) {\n            $.CancelScheduled(handle);\n            State(cp).priceRefreshHandler = null;\n        }\n    }\n    PopupMajorStore.CancelRefreshTimerUpdate = CancelRefreshTimerUpdate;\n    function _UpdateStickerData(cp) {\n        _BuildStickerData(State(cp).aFlatStickersData, false);\n        _BuildStickerData(State(cp).aFlatStickersData, true);\n        State(cp).searchCache = null;\n        [...State(cp).aFlatStickersData]\n            .sort(_CompareByPopularity)\n            .forEach((sticker, i) => { sticker.popularityRank = i; });\n    }\n    function _BuildStickerData(target, isRanked) {\n        const map = MapDataById(target);\n        const add = (oData) => _UpdateWithCurrentData(target, map.get(oData.rawId), oData, _GetStickerData);\n        g_ActiveTournamentTeams.forEach(team => {\n            (isRanked ? team.rankingids : team.stickerids).forEach(id => add({ rawId: id, isPlayer: false, isOrg: false, teamId: team.teamid, team: team.team, isChampion: false, isRanked }));\n            team.players.forEach(player => (isRanked ? player.rankingids : player.stickerids).forEach(id => add({ rawId: id, isPlayer: true, isOrg: false, teamId: team.teamid, team: team.team, playerCode: player.code, isChampion: false, isRanked })));\n            team.champions.forEach(player => (isRanked ? player.rankingids : player.stickerids).forEach(id => add({ rawId: id, isPlayer: true, isOrg: false, teamId: team.teamid, team: team.team, playerCode: player.code, isChampion: true, isRanked })));\n        });\n        (isRanked ? g_ActiveTournamentInfo.rankingids : g_ActiveTournamentInfo.stickerids).forEach(id => add({ rawId: id, isPlayer: false, isOrg: true, playerCode: g_ActiveTournamentInfo.location + ' ' + g_ActiveTournamentInfo.organization, isRanked }));\n    }\n    function _UpdateKeyChainsData(cp) {\n        const highlights = g_ActiveTournamentHighlights;\n        const mapKeyChains = MapDataById(State(cp).aFlatKeyChainData);\n        State(cp).searchCache = null;\n        highlights.forEach(group => {\n            group.highlights.forEach(kc => {\n                const oData = {\n                    group_id: group.group_id,\n                    itemid_dynamic_shop: group.itemid_dynamic_shop,\n                    stage: group.stage,\n                    kc_highlight: kc.kc_highlight,\n                    teamid1: kc.teamid1,\n                    teamid2: kc.teamid2,\n                    map_name: kc.map_name,\n                    name: kc.title,\n                    desc: kc.desc,\n                };\n                _UpdateWithCurrentData(State(cp).aFlatKeyChainData, mapKeyChains.get(kc.kc_highlight), oData, _GetKeyChainData);\n            });\n        });\n    }\n    function MapDataById(savedFlatData) {\n        const oldStickersData = new Map();\n        if (savedFlatData && savedFlatData.length > 0) {\n            for (let i = 0; i < savedFlatData.length; i++) {\n                oldStickersData.set(('rawId' in savedFlatData[i]) ? savedFlatData[i].rawId : savedFlatData[i].kc_highlight, savedFlatData[i]);\n            }\n        }\n        return oldStickersData;\n    }\n    function _UpdateWithCurrentData(aFlatStoredData, savedItemData, oData, _funcGetData) {\n        if (savedItemData) {\n            const livePrice = _GetCurrentPriceForItem(savedItemData.itemId);\n            if (livePrice !== undefined && savedItemData.price !== undefined) {\n                if (savedItemData.price !== livePrice) {\n                    savedItemData.oldPrice = savedItemData.price;\n                    savedItemData.priceChangeRevealed = false;\n                }\n                savedItemData.price = livePrice;\n                savedItemData.popularity = _GetCurrentTrendData(savedItemData.itemId, 'trend');\n                const weeklyLow = _GetCurrentTrendData(savedItemData.itemId, 'low');\n                const weeklyHigh = _GetCurrentTrendData(savedItemData.itemId, 'high');\n                savedItemData.weeklyLow = weeklyLow;\n                savedItemData.weeklyHigh = weeklyHigh;\n                savedItemData.weeklyPctReductionFromHigh = (weeklyHigh > livePrice)\n                    ? ((weeklyHigh - livePrice) * 100.0 / weeklyHigh) : 0.0;\n            }\n        }\n        else {\n            aFlatStoredData.push(_funcGetData(oData));\n        }\n    }\n    function _GetStickerData(oData) {\n        const itemId = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(defidxStickerItem, oData.rawId);\n        const numRarity = InventoryAPI.GetItemRarity(itemId);\n        const livePrice = _GetCurrentPriceForItem(itemId);\n        const weeklyLow = _GetCurrentTrendData(itemId, 'low');\n        const weeklyHigh = _GetCurrentTrendData(itemId, 'high');\n        const weeklyPctReductionFromHigh = (weeklyHigh > livePrice)\n            ? ((weeklyHigh - livePrice) * 100.0 / weeklyHigh) : 0.0;\n        return {\n            isPlayer: oData.isPlayer,\n            isOrg: ('isOrg' in oData) ? oData.isOrg : false,\n            rawId: oData.rawId,\n            teamName: $.Localize('#CSGO_TeamID_' + oData.teamId),\n            teamId: oData.teamId,\n            teamTag: oData.team,\n            playerCode: ('playerCode' in oData) ? oData.playerCode : '',\n            realName: oData.isPlayer ? $.Localize('#SFUI_ProPlayer_' + oData.playerCode) : '',\n            itemId: itemId,\n            price: livePrice,\n            rarity: numRarity,\n            rarityLookup: $.Localize('#major_store_filter_type_' + numRarity),\n            name: InventoryAPI.GetItemName(itemId),\n            displayName: ItemInfo.GetFormattedName(itemId),\n            popularity: _GetCurrentTrendData(itemId, 'trend'),\n            weeklyLow: weeklyLow,\n            weeklyHigh: weeklyHigh,\n            weeklyPctReductionFromHigh: weeklyPctReductionFromHigh,\n            champion: oData.isChampion,\n            isRanked: ('isRanked' in oData) ? oData.isRanked : false\n        };\n    }\n    function _GetKeyChainData(oData) {\n        const itemId = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(defidxKeyChainItem, oData.kc_highlight);\n        const livePrice = _GetCurrentPriceForItem(itemId);\n        const weeklyLow = _GetCurrentTrendData(itemId, 'low');\n        const weeklyHigh = _GetCurrentTrendData(itemId, 'high');\n        const weeklyPctReductionFromHigh = (weeklyHigh > livePrice)\n            ? ((weeklyHigh - livePrice) * 100.0 / weeklyHigh) : 0.0;\n        return {\n            group_id: oData.group_id,\n            itemid_dynamic_shop: oData.itemid_dynamic_shop,\n            kc_highlight: oData.kc_highlight,\n            displayName: ItemInfo.GetFormattedName(itemId),\n            stage: oData.stage,\n            teamid1: oData.teamid1,\n            teamid2: oData.teamid2,\n            map_name: oData.map_name,\n            desc: $.Localize(oData.desc),\n            itemId: itemId,\n            price: livePrice,\n            name: $.Localize(oData.name),\n            popularity: _GetCurrentTrendData(itemId, 'trend'),\n            weeklyLow: weeklyLow,\n            weeklyHigh: weeklyHigh,\n            weeklyPctReductionFromHigh: weeklyPctReductionFromHigh\n        };\n    }\n    function _GetCurrentPriceForItem(itemId) {\n        return MissionsAPI.GetSeasonalOperationFauxCreditsCost(g_ActiveTournamentInfo.credits_id, itemId);\n    }\n    function _GetCurrentTrendData(itemId, szField) {\n        return MissionsAPI.GetSeasonalOperationFauxItemTrend(g_ActiveTournamentInfo.credits_id, itemId, szField);\n    }\n    function UnreadyForDisplay() {\n    }\n    function _VariousButtonActionsAndEvents(cp) {\n        cp.FindChildInLayoutFile('id-major-store-container').AddBlurPanel(cp.FindChildInLayoutFile('id-major-store-filters-panel'));\n        cp.FindChildInLayoutFile('id-major-store-container').AddBlurPanel(cp.FindChildInLayoutFile('id-major-store-loading'));\n        cp.FindChildInLayoutFile('id-major-store-container').AddBlurPanel(cp.FindChildInLayoutFile('id-major-store-search-results'));\n        cp.FindChildInLayoutFile('id-list-large-icons').SetPanelEvent('onactivate', () => {\n            _MakeDelayedLoadList(cp);\n        });\n        cp.FindChildInLayoutFile('id-list-small-icons').SetPanelEvent('onactivate', () => {\n            _MakeDelayedLoadList(cp);\n        });\n        cp.FindChildInLayoutFile('id-list-small-icons').checked = true;\n        _SortDropDown(cp).SetPanelEvent('oninputsubmit', () => {\n            if (!m_bApplyingSort) {\n                const selected = _SortDropDown(cp).GetSelected();\n                _RememberViewSort(cp, selected ? selected.id : '');\n            }\n            _UpdateItemsList({ cp });\n        });\n        cp.FindChildInLayoutFile('id-popup-major-store-back-btn').SetPanelEvent('onactivate', () => _GoBack(cp));\n        cp.FindChildInLayoutFile('id-major-store-balance').SetPanelEvent('onmouseover', () => {\n            cp.FindChildInLayoutFile('id-major-store-balance').SetDialogVariable('local-price', StoreAPI.GetStoreItemTokensBundlePrice('' + g_ActiveTournamentInfo.itemid_charge, 100, ''));\n            const tooltip = $.Localize('#major_store_balance_tooltip', cp.FindChildInLayoutFile('id-major-store-balance'));\n            UiToolkitAPI.ShowTitleTextTooltip('id-major-store-balance', '#CSGO_TournamentPass_' + g_ActiveTournamentInfo.location + '_credits', tooltip);\n        });\n        cp.FindChildInLayoutFile('id-major-store-balance').SetPanelEvent('onmouseout', () => {\n            UiToolkitAPI.HideTitleTextTooltip();\n        });\n        cp.FindChildInLayoutFile('id-major-store-receipt').SetPanelEvent('onmouseover', () => {\n            UiToolkitAPI.ShowTextTooltip('id-major-store-receipt', '#major_store_balance_receipt');\n        });\n        cp.FindChildInLayoutFile('id-major-store-receipt').SetPanelEvent('onmouseout', () => {\n            UiToolkitAPI.HideTextTooltip();\n        });\n        cp.FindChildInLayoutFile('id-major-store-receipt').SetPanelEvent('onactivate', () => {\n            SteamOverlayAPI.OpenUrlInOverlayOrExternalBrowser(\"https://\" + SteamOverlayAPI.GetSteamCommunityURL() + \"/my/gcpd/\" + SteamOverlayAPI.GetAppID() + \"/?tab=creditsaudit\");\n        });\n        function _Callback() {\n            _UpdateBalance(cp);\n        }\n        ;\n        const callback = _TrackJSCallback(cp, UiToolkitAPI.RegisterJSCallback(_Callback));\n        cp.FindChildInLayoutFile('id-major-store-cart-btn').SetPanelEvent('onactivate', () => {\n            $.DispatchEvent(\"CSGOPlaySoundEffect\", \"UIPanorama.loadout_sector_select\", \"MOUSE\");\n            const popupPanel = UiToolkitAPI.ShowCustomLayoutPopupParameters('id-popup-shopping-cart-checkout', 'file://{resources}/layout/popups/popup_shopping_cart_checkout.xml', '&callback=' + callback);\n            popupPanel.Data().eventId = g_ActiveTournamentInfo.eventid;\n        });\n        cp.FindChildInLayoutFile('id-major-store-cart-btn').SetPanelEvent('onmouseover', () => {\n            UiToolkitAPI.ShowTextTooltip('id-major-store-cart-btn', '#major_store_checkout_empty_desc');\n        });\n        cp.FindChildInLayoutFile('id-major-store-cart-btn').SetPanelEvent('onmouseout', () => {\n            UiToolkitAPI.HideTextTooltip();\n        });\n        const elSearchBox = cp.FindChildInLayoutFile('id-major-store-search-box');\n        elSearchBox.SetPanelEvent('ontextentrychange', () => {\n            _Debounce(cp, SEARCH_DEBOUNCE_HANDLE, .3, () => { _ShowSearchResults(cp, _GetItemsForSearch(cp, elSearchBox.text)); });\n        });\n        elSearchBox.SetPanelEvent('ontextentrysubmit', () => {\n            _ShowSearchResults(cp, _GetItemsForSearch(cp, elSearchBox.text));\n        });\n        cp.FindChildInLayoutFile('id-major-store-see-all-teams-btn').SetPanelEvent('onactivate', () => {\n            _OnActivateClearAll(cp);\n            _SetActiveSeriesFilter(cp, NO_SERIES_FILTER);\n            _ApplyViewSort(cp, VIEW_SORTS.AllItems);\n            _ShowMainPanel(cp, VIEW_CONTENT);\n            _SetActiveNavTab(cp, NAV_TAB_NONE);\n        });\n        cp.FindChildInLayoutFile('id-major-store-filters-panel').SetPanelEvent('onactivate', () => {\n        });\n        cp.FindChildInLayoutFile('id-major-store-search-results').SetPanelEvent('onactivate', () => {\n        });\n        const elFloatingFilterPanel = cp.FindChildInLayoutFile('id-major-fullscreen-filter');\n        cp.FindChildInLayoutFile('id-major-store-content-page').SetAcceptsFocus(true);\n        cp.FindChildInLayoutFile('id-major-store-container').SetPanelEvent('onactivate', () => _CloseSortDropDown(cp));\n        cp.FindChildInLayoutFile('id-major-store-sort-filter-btn').SetPanelEvent('onactivate', () => {\n            _UpdateFilterSections(cp);\n            elFloatingFilterPanel.visible = true;\n            _PushOverlay(cp, 'id-major-fullscreen-filter');\n        });\n        cp.FindChildInLayoutFile('id-major-fullscreen-filter-btn').SetPanelEvent('onactivate', () => {\n            _PopOverlay();\n        });\n        cp.FindChildInLayoutFile('id-major-fullscreen-text-search-btn').SetPanelEvent('onactivate', () => {\n            _PopOverlay();\n        });\n        cp.FindChildInLayoutFile('id-major-store-filters-close').SetPanelEvent('onactivate', () => {\n            _PopOverlay();\n        });\n        function fnOnPropertyTransitionEndEvent(panel, propertyName) {\n            if (elFloatingFilterPanel === panel && propertyName === 'opacity') {\n                if (elFloatingFilterPanel.visible === true && !panel.BIsTransparent()) {\n                    return true;\n                }\n                if (propertyName === 'opacity') {\n                    if (elFloatingFilterPanel.visible === true && elFloatingFilterPanel.BIsTransparent()) {\n                        elFloatingFilterPanel.visible = false;\n                        return true;\n                    }\n                }\n                return false;\n            }\n        }\n        $.RegisterEventHandler('PropertyTransitionEnd', elFloatingFilterPanel, fnOnPropertyTransitionEndEvent);\n        AddMajorTokensAnim.SetTransitionEndEvent(cp.FindChildInLayoutFile('id-major-store-add-tokens'));\n        const elBookmark = cp.FindChildInLayoutFile('id-major-store-banners-bookmarks');\n        $.RegisterEventHandler('PropertyTransitionEnd', elBookmark, (panel, propertyName) => {\n            if (elBookmark.id === panel.id && propertyName === 'opacity') {\n                if (!elBookmark.BHasClass('hidden') && elBookmark.BIsTransparent()) {\n                    elBookmark.SetHasClass('hidden', true);\n                    return true;\n                }\n            }\n            return false;\n        });\n    }\n    function _MakeDelayedLoadList(cp) {\n        let lister = cp.FindChildInLayoutFile('id-major-store-items-lister');\n        const btn = cp.FindChildInLayoutFile('id-list-large-icons');\n        const selectedBtn = btn.GetSelectedButton();\n        const snippetType = selectedBtn.GetAttributeString('data-type', '');\n        if (lister && lister.IsValid() && snippetType == lister.GetAttributeString('data-type', '')) {\n            _UpdateItemsList({ cp });\n            return;\n        }\n        if (lister)\n            lister.DeleteAsync(0);\n        lister = $.CreatePanel('JSDelayLoadList', cp.FindChildInLayoutFile('id-major-store-content-page'), 'id-major-store-items-lister');\n        lister.BLoadLayoutSnippet(snippetType);\n        $.Schedule(.15, () => _UpdateItemsList({ cp }));\n    }\n    function _SetUpTitleBar(cp, eventId) {\n        cp.SetDialogVariable('tournament_name', $.Localize('#CSGO_Tournament_Event_NameShort_' + eventId));\n        cp.FindChildInLayoutFile('id-major-store-major-logo').SetImage('file://{images}/tournaments/events/tournament_logo_' + eventId + '.svg');\n    }\n    function _SetUpTeamsBanner(cp) {\n        const teams = g_ActiveTournamentTeams;\n        const elParent = cp.FindChildInLayoutFile('id-major-store-banner-teams');\n        teams.forEach(team => {\n            const elPanel = $.CreatePanel('Button', elParent, '');\n            elPanel.BLoadLayoutSnippet('banner-team-box');\n            elPanel.FindChildInLayoutFile('id-team-icon').SetImage('file://{images}/tournaments/teams/' + team.team + '.svg');\n            elPanel.FindChildInLayoutFile('id-team-icon-blur').SetImage('file://{images}/tournaments/teams/' + team.team + '.svg');\n            elPanel.SetDialogVariable('name', $.Localize('#CSGO_TeamID_' + team.teamid));\n            elPanel.style.backgroundPosition = Math.floor(Math.random() * 100) + '% 50%';\n            elPanel.SetPanelEvent('onactivate', () => {\n                _SetUpTeamView(cp, team);\n                _ShowMainPanel(cp, VIEW_TEAM);\n                $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.submenu_leveloptions_select', 'MOUSE');\n            });\n        });\n    }\n    function _GetOrCreatePanel(elParent, id, cls) {\n        return elParent.FindChildInLayoutFile(id)\n            ?? $.CreatePanel('Panel', elParent, id, { class: cls });\n    }\n    function _GetOrCreateTile(elParent, id, snippet, onCreate) {\n        let elTile = elParent.FindChildInLayoutFile(id);\n        if (!elTile) {\n            elTile = $.CreatePanel('Panel', elParent, id);\n            elTile.BLoadLayoutSnippet(snippet);\n            onCreate?.(elTile);\n        }\n        return elTile;\n    }\n    function _PopulateCarousel(elParent, cfg) {\n        for (let i = 0; i < cfg.numToShow; i++) {\n            const nPage = Math.floor(i / cfg.numTilesPerPage);\n            const elPage = _GetOrCreatePanel(elParent, 'id-major-store-carousel-page-' + nPage, cfg.pageClass);\n            cfg.onUpdateTile(_GetOrCreateTile(elPage, cfg.tileIdPrefix + i, cfg.tileSnippet, cfg.onCreateTile), i);\n        }\n    }\n    function _SetUpPopularityBanner(cp) {\n        const aSorted = [...State(cp).aFlatStickersData].sort(_CompareByPopularity);\n        _PopulateCarousel(cp.FindChildInLayoutFile('id-major-store-banner-popular'), {\n            numToShow: 40,\n            numTilesPerPage: 5,\n            pageClass: 'popup-major-store__banner__popular_page elCarouselPage',\n            tileIdPrefix: 'id-carousel-sticker',\n            tileSnippet: 'banner-popular-entry',\n            onUpdateTile: (elPanel, i) => {\n                elPanel.SetDialogVariableInt('position', i + 1);\n                _UpdateTile(cp, elPanel.FindChildInLayoutFile('id-popular-tile'), aSorted, i);\n            },\n        });\n    }\n    function _GetBookmarkedItemsList(cp) {\n        const itemsMap = new Map();\n        for (const sticker of State(cp).aFlatStickersData) {\n            itemsMap.set(sticker.rawId.toString(), sticker);\n        }\n        for (const keyChain of State(cp).aFlatKeyChainData) {\n            itemsMap.set(keyChain.kc_highlight.toString(), keyChain);\n        }\n        return Bookmarks.ids().map(defIndex => itemsMap.get(defIndex)).filter((item) => item !== undefined).reverse();\n    }\n    function _SetUpBookmarkItemsBanner(cp) {\n        const aSorted = _GetBookmarkedItemsList(cp);\n        if (aSorted.length < 1) {\n            cp.FindChildInLayoutFile('id-major-store-banners-bookmarks').SetHasClass('show', false);\n            return;\n        }\n        cp.FindChildInLayoutFile('id-major-store-banners-bookmarks').SetHasClass('show', true);\n        const elParent = cp.FindChildInLayoutFile('id-major-store-banner-bookmarked');\n        const numTilesPerPage = 8;\n        const totalPages = Math.ceil(aSorted.length / numTilesPerPage);\n        for (let i = 0; i < totalPages; i++) {\n            let elCarouselPage = elParent.FindChildInLayoutFile('id-major-store-carousel-page-' + i);\n            if (!elCarouselPage) {\n                elCarouselPage = $.CreatePanel('Panel', elParent, 'id-major-store-carousel-page-' + i, { class: 'popup-major-store__banner__popular_page' });\n                elCarouselPage.SetHasClass('small', true);\n                elCarouselPage.SetHasClass('banner-bookmark', true);\n            }\n            const startIndex = i * numTilesPerPage;\n            for (let j = 0; j < numTilesPerPage; j++) {\n                let stickerIndex = startIndex + j;\n                let elPanel = elCarouselPage.FindChildInLayoutFile('id-carousel-sticker' + stickerIndex);\n                if (!elPanel) {\n                    elPanel = $.CreatePanel('Panel', elCarouselPage, 'id-carousel-sticker' + stickerIndex);\n                    elPanel.BLoadLayoutSnippet('store-tile');\n                }\n                if (aSorted[stickerIndex]) {\n                    const bIsSticker = 'rawId' in aSorted[stickerIndex];\n                    elPanel.SetHasClass('keychain', !bIsSticker);\n                    if (bIsSticker)\n                        _UpdateTile(cp, elPanel, aSorted, stickerIndex);\n                    else\n                        _UpdateKeyChainsTile(cp, elPanel, aSorted, stickerIndex);\n                    elPanel.SetHasClass('hidden', false);\n                    elPanel.enabled = true;\n                    elPanel.hittest = true;\n                }\n                else {\n                    elPanel.SetHasClass('keychain', false);\n                    elPanel.SetHasClass('is-final', false);\n                    elPanel.SetHasClass('hidden', true);\n                    elPanel.enabled = false;\n                    elPanel.hittest = false;\n                }\n            }\n        }\n        if (elParent.Children().length > totalPages) {\n            const numPanelsToDelete = elParent.Children().length - totalPages;\n            const numPagesMade = elParent.Children().length - 1;\n            for (let i = numPagesMade; i > (numPagesMade - numPanelsToDelete); i--) {\n                elParent.Children()[i].DeleteAsync(0);\n            }\n        }\n    }\n    function _UpdateBookmarkSetting(cp, reusePanel, defidx) {\n        Bookmarks.toggle(defidx);\n        _UpdateStoreNavTabs(cp);\n        if (_IsHomeActive() || State(cp).useBookMarkList) {\n            _UpdateVisiblePanel(cp, true);\n        }\n    }\n    function _SetUpOrgBanners(cp) {\n        cp.SetDialogVariable('org-name', g_ActiveTournamentInfo.organization);\n        const elParent = cp.FindChildInLayoutFile('id-major-store-banner-org-stickers');\n        const aFilteredStickers = State(cp).aFlatStickersData\n            .filter(sticker => sticker.isOrg)\n            .sort((a, b) => Number(b.isRanked) - Number(a.isRanked));\n        aFilteredStickers.forEach((sticker, idx) => {\n            let elPanel = elParent.FindChildInLayoutFile('id-org-sticker-' + idx);\n            if (!elPanel) {\n                elPanel = $.CreatePanel('Panel', elParent, 'id-org-sticker-' + idx);\n                elPanel.BLoadLayoutSnippet('store-tile');\n            }\n            _UpdateTile(cp, elPanel, aFilteredStickers, idx);\n        });\n    }\n    function _SetUpKeyChainsBanner(cp) {\n        const aKeyChains = State(cp).aFlatKeyChainData;\n        if (aKeyChains.length <= 1)\n            return;\n        let aKeyChainsForBanner = State(cp).aKeyChainBannerItems;\n        if (!aKeyChainsForBanner || aKeyChainsForBanner.length < 1) {\n            const itemsMap = new Map();\n            for (const item of aKeyChains) {\n                itemsMap.set(item.kc_highlight.toString(), item);\n            }\n            aKeyChainsForBanner = [];\n            const numItemsFromEachStage = 9;\n            g_ActiveTournamentHighlights.forEach(group => {\n                if (group.highlights.length === 0)\n                    return;\n                const randomGen = new UniqueRandomUtils.UniqueRandomGenerator(0, group.highlights.length - 1);\n                const count = Math.min(numItemsFromEachStage, group.highlights.length);\n                for (let i = 0; i < count; i++) {\n                    const nRandom = randomGen.next();\n                    if (nRandom === null)\n                        break;\n                    const mapped = itemsMap.get(group.highlights[nRandom].kc_highlight.toString());\n                    if (mapped)\n                        aKeyChainsForBanner.push(mapped);\n                }\n            });\n            for (let i = aKeyChainsForBanner.length - 1; i > 0; i--) {\n                const j = Math.floor(Math.random() * (i + 1));\n                [aKeyChainsForBanner[i], aKeyChainsForBanner[j]] = [aKeyChainsForBanner[j], aKeyChainsForBanner[i]];\n            }\n            State(cp).aKeyChainBannerItems = aKeyChainsForBanner;\n        }\n        _PopulateCarousel(cp.FindChildInLayoutFile('id-major-store-banner-keychains'), {\n            numToShow: aKeyChainsForBanner.length,\n            numTilesPerPage: 5,\n            pageClass: 'popup-major-store__banner__popular_page',\n            tileIdPrefix: 'id-carousel-keychain',\n            tileSnippet: 'store-tile',\n            onCreateTile: (elPanel) => {\n                elPanel.SetHasClass('keychain', true);\n                elPanel.SetHasClass('keychain-banner', true);\n            },\n            onUpdateTile: (elPanel, i) => _UpdateKeyChainsTile(cp, elPanel, aKeyChainsForBanner, i),\n        });\n    }\n    function _SetUpChampionsBanner(cp) {\n        const aChamps = [...State(cp).aFlatStickersData].sort(_CompareByPopularity).filter(sticker => sticker.champion);\n        if (aChamps.length < 1)\n            return;\n        _PopulateCarousel(cp.FindChildInLayoutFile('id-major-store-banner-champions'), {\n            numToShow: aChamps.length,\n            numTilesPerPage: 8,\n            pageClass: 'popup-major-store__banner__popular_page banner-bookmark small',\n            tileIdPrefix: 'id-carousel-champs',\n            tileSnippet: 'store-tile',\n            onUpdateTile: (elPanel, i) => _UpdateTile(cp, elPanel, aChamps, i),\n        });\n    }\n    const RANKED_ROW_RARITIES = [6, 5, 4];\n    const RANKED_TILES_PER_ROW = 8;\n    const RANKED_MAX_PAGES = 4;\n    function _GetRankedRarityRows(cp) {\n        const aRanked = State(cp).aFlatStickersData.filter(sticker => sticker.isRanked);\n        return RANKED_ROW_RARITIES.map(nRarity => aRanked\n            .filter(sticker => sticker.rarity === nRarity)\n            .sort((a, b) => (b.price - a.price) || _CompareByPopularity(a, b)));\n    }\n    function _GetRankedPageCount(aRows) {\n        const nLongestRow = Math.max(0, ...aRows.map(aRow => aRow.length));\n        return Math.min(RANKED_MAX_PAGES, Math.ceil(nLongestRow / RANKED_TILES_PER_ROW));\n    }\n    function _FillRankedRarityRow(cp, elRow, aRow, nRarity, nPage) {\n        const nStart = nPage * RANKED_TILES_PER_ROW;\n        const aPageStickers = aRow.slice(nStart, nStart + RANKED_TILES_PER_ROW);\n        for (let nSlot = 0; nSlot < RANKED_TILES_PER_ROW; nSlot++) {\n            const elTile = _GetOrCreateTile(elRow, 'id-ranked-tile-' + nRarity + '-' + (nStart + nSlot), 'store-tile');\n            const bHasSticker = nSlot < aPageStickers.length;\n            elTile.visible = bHasSticker;\n            if (bHasSticker)\n                _UpdateTile(cp, elTile, aPageStickers, nSlot);\n        }\n    }\n    function _SetUpRankedBanner(cp) {\n        const aRows = _GetRankedRarityRows(cp);\n        const nPages = _GetRankedPageCount(aRows);\n        if (nPages < 1)\n            return;\n        const elCarousel = cp.FindChildInLayoutFile('id-major-store-banner-ranked');\n        for (let nPage = 0; nPage < nPages; nPage++) {\n            const elPage = _GetOrCreatePanel(elCarousel, 'id-major-store-carousel-page-' + nPage, 'popup-major-store__banner__popular_page banner-bookmark small rarity-rows');\n            aRows.forEach((aRow, nRow) => {\n                const nRarity = RANKED_ROW_RARITIES[nRow];\n                const elRow = _GetOrCreatePanel(elPage, 'id-ranked-row-' + nRarity, 'popup-major-store__banner__rarity-row');\n                elRow.visible = aRow.length > 0;\n                _FillRankedRarityRow(cp, elRow, aRow, nRarity, nPage);\n            });\n        }\n    }\n    function _SetUpTeamView(cp, team) {\n        const elPanel = cp.FindChildInLayoutFile(VIEW_TEAM);\n        elPanel.Data().DisplayedTeam = team;\n        const teamName = $.Localize('#CSGO_TeamID_' + team.teamid);\n        elPanel.SetDialogVariable('team-name', teamName);\n        const elTilesContainer = cp.FindChildInLayoutFile('id-major-store-team-tiles');\n        const numTiles = 6;\n        const randomGen = new UniqueRandomUtils.UniqueRandomGenerator(0, 7);\n        for (let i = 0; i < numTiles; i++) {\n            const elPackTile = elTilesContainer.FindChildInLayoutFile('sticker-pack-' + i);\n            const elPackLabel = elPackTile.FindChildInLayoutFile('team-pack-major');\n            elPackLabel.SetDialogVariableLocString('event-name', '#CSGO_Tournament_Event_Location_' + g_ActiveTournamentInfo.eventid);\n            elPackLabel.text = $.Localize('#major_store_team_stickers-made', elPackLabel);\n            const elBg = elPackTile.FindChildInLayoutFile('team-pack-bg-logo');\n            elBg.SetImage('file://{images}/tournaments/teams/' + team.team + '.svg');\n            elPackTile.SetDialogVariable('title', i === 0 ? teamName : team.players[i - 1].nick);\n            elPackTile.SetHasClass('player', i > 0);\n            const elStickerContainer = elPackTile.FindChildInLayoutFile('team-pack-icons');\n            const getRandomInt = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min;\n            randomGen.reset();\n            let xpos = 0;\n            let prices = [];\n            const stickers = i === 0 ?\n                State(cp).aFlatStickersData.filter(sticker => (!sticker.isPlayer && sticker.teamId === team.teamid)) :\n                State(cp).aFlatStickersData.filter(sticker => (sticker.isPlayer && sticker.playerCode === team.players[i - 1].code));\n            stickers.forEach((id, idx) => {\n                prices.push(stickers[idx].price);\n                let sticker = elStickerContainer.FindChild('pack-sticker' + idx);\n                if (!sticker)\n                    sticker = $.CreatePanel('ItemImage', elStickerContainer, 'pack-sticker' + idx, { scaling: 'stretch-to-fit-preserve-aspect' });\n                sticker.itemid = stickers[idx].itemId;\n                const zIndex = randomGen.next() ?? (idx % 8);\n                const rotationSetting = zIndex == 3 ? getRandomInt(-15, 15) : getRandomInt(-95, 85);\n                if (idx % 4 === 0) {\n                    xpos = 0;\n                }\n                sticker.style.transform = 'rotateZ(' + rotationSetting + 'deg) translateY(-' + getRandomInt(8, 30) + 'px) translateX(' + getRandomInt(xpos, xpos + 35) + 'px)';\n                xpos = xpos + 50;\n                sticker.style.zIndex = ((idx === stickers.length - 1) && (stickers[idx].champion)) ? '9;' : zIndex + ';';\n                sticker.style.brightness = zIndex === 0 ? '.5' : zIndex === 1 ? '.7' : zIndex === 2 ? '.8' : zIndex === 3 ? '1.1' : '1';\n            });\n            elStickerContainer.Children().forEach((sticker, index) => { if (index >= stickers.length) {\n                sticker.DeleteAsync(0);\n            } });\n            elPackTile.SetDialogVariableInt('low-price', Math.min(...prices));\n            elPackTile.SetDialogVariableInt('high-price', Math.max(...prices));\n            elPackTile.SetPanelEvent('onactivate', () => {\n                _ShowMainPanel(cp, VIEW_SINGLE);\n                _SetUpSingleView(cp, stickers);\n                $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.submenu_leveloptions_select', 'MOUSE');\n            });\n        }\n    }\n    function _SetUpSingleView(cp, aStickers) {\n        const elPanel = cp.FindChildInLayoutFile(VIEW_SINGLE);\n        elPanel.SetDialogVariable('team-name', aStickers[0].isPlayer ? aStickers[0].playerCode : $.Localize('#CSGO_TeamID_' + aStickers[0].teamId));\n        const numTiles = aStickers.length;\n        const elParent = elPanel.FindChildInLayoutFile('id-major-store-single-tiles');\n        for (let i = 0; i < numTiles; i++) {\n            let elPackTile = elParent.FindChildInLayoutFile('sticker-single-' + i);\n            if (!elPackTile) {\n                elPackTile = $.CreatePanel('Panel', elParent, 'sticker-single-' + i);\n                elPackTile.BLoadLayoutSnippet('store-tile');\n            }\n            _UpdateTile(cp, elPackTile, aStickers, i);\n        }\n        elParent.Children().forEach((sticker, index) => { if (index >= aStickers.length) {\n            sticker.DeleteAsync(0);\n        } });\n        elPanel.Data().SingleViewDisplayedStickers = aStickers;\n    }\n    function _RefreshTeamView(cp) {\n        const team = cp.FindChildInLayoutFile(VIEW_TEAM).Data().DisplayedTeam;\n        if (team) {\n            _SetUpTeamView(cp, team);\n        }\n    }\n    function _RefreshSingleView(cp) {\n        const aStickers = cp.FindChildInLayoutFile(VIEW_SINGLE).Data().SingleViewDisplayedStickers;\n        if (aStickers) {\n            _SetUpSingleView(cp, aStickers);\n        }\n    }\n    function _UpdateBalance(cp) {\n        const idxLookup = InventoryAPI.GetCacheTypeElementIndexByKey('SeasonalOperations', g_ActiveTournamentInfo.credits_id);\n        let nRedeemableBalance = 0;\n        if (g_ActiveTournamentInfo.credits_id == InventoryAPI.GetCacheTypeElementFieldByIndex('SeasonalOperations', idxLookup, 'season_value')) {\n            nRedeemableBalance = InventoryAPI.GetCacheTypeElementFieldByIndex('SeasonalOperations', idxLookup, 'redeemable_balance');\n            nRedeemableBalance = (nRedeemableBalance === null || nRedeemableBalance === undefined) ? 0 : nRedeemableBalance;\n        }\n        if (State(cp).activatedCredits > 0) {\n            const elNotification = cp.FindChildInLayoutFile('id-major-store-add-tokens');\n            _PushOverlay(cp, 'id-major-store-add-tokens');\n            const tempBalance = nRedeemableBalance - State(cp).activatedCredits;\n            cp.SetDialogVariableInt('balance', tempBalance);\n            function CallAtEndAnimation() {\n                _PopOverlay();\n                cp.FindChildInLayoutFile('id-major-store-balance').TriggerClass('popup-major-store__top-bar__balance-anim');\n                cp.SetDialogVariableInt('balance', nRedeemableBalance);\n            }\n            AddMajorTokensAnim.StartAnim(elNotification, cp.FindChildInLayoutFile('id-major-store-balance'), State(cp).activatedCredits, CallAtEndAnimation);\n            State(cp).activatedCredits = 0;\n        }\n        else {\n            cp.SetDialogVariableInt('balance', nRedeemableBalance);\n        }\n    }\n    function _UpdateItemsList(oSettings) {\n        if (_UpdateFavoritesEmptyState(oSettings.cp))\n            return;\n        const elParent = oSettings.cp.FindChildInLayoutFile('id-major-store-content-page');\n        let elLister = elParent.FindChildInLayoutFile('id-major-store-items-lister');\n        if (!elLister)\n            return;\n        const filteredList = _GetFilteredSortedIds(oSettings);\n        elLister.SetLoadListItemFunction((elLister, nPanelIdx, reusePanel) => {\n            const bIsSticker = 'rawId' in filteredList[nPanelIdx];\n            if (!reusePanel || !reusePanel.IsValid()) {\n                reusePanel = $.CreatePanel('Panel', elLister, '');\n                reusePanel.BLoadLayoutSnippet('store-tile');\n            }\n            if (bIsSticker) {\n                _UpdateTile(oSettings.cp, reusePanel, filteredList, nPanelIdx);\n            }\n            else {\n                _UpdateKeyChainsTile(oSettings.cp, reusePanel, filteredList, nPanelIdx);\n            }\n            reusePanel.SetHasClass('keychain', !bIsSticker);\n            return reusePanel;\n        });\n        elLister.UpdateListItems(filteredList.length);\n        oSettings.cp.SetDialogVariableInt('item-count', filteredList.length);\n        if (!oSettings.bDisableScroll)\n            elLister.ScrollToTop();\n    }\n    function _ReadFilterSettings(cp) {\n        const elDropDown = _SortDropDown(cp);\n        const aTeams = _GetFilteredTeams(cp);\n        const aRarities = _GetFilteredRarities(cp);\n        const btnTeamOnly = cp.FindChildInLayoutFile('id-major-store-filter-team');\n        const btnPlayerOnly = cp.FindChildInLayoutFile('id-major-store-filter-player');\n        const btnRankedOnly = cp.FindChildInLayoutFile('id-major-store-filter-ranked');\n        const btnChampionsOnly = cp.FindChildInLayoutFile('id-major-store-filter-champions');\n        const btnMajorOnly = cp.FindChildInLayoutFile('id-major-store-filter-major');\n        const btnKeyChainsOnly = cp.FindChildInLayoutFile('id-major-store-filter-keychains').FindChildInLayoutFile('id-slider-btn');\n        const elSearchBox = cp.FindChildInLayoutFile('id-major-store-search-box');\n        const selectedSort = elDropDown.GetSelected();\n        const sortOption = SORT_OPTIONS[selectedSort ? selectedSort.id : ''] ?? SORT_OPTIONS['weekly-high-low'];\n        const sortType = sortOption.field;\n        const sortDirection = sortOption.direction;\n        return btnKeyChainsOnly.checked\n            ? {\n                selectedTeamIds: [],\n                sort: sortType,\n                rarity: [],\n                teamsOnly: false,\n                playersOnly: false,\n                keyChainsOnly: true,\n                rankedOnly: false,\n                championsOnly: false,\n                majorOnly: false,\n                sortDirection: sortDirection,\n                searchText: elSearchBox.text\n            }\n            : {\n                selectedTeamIds: aTeams.flatMap(team => team.Data().teamid),\n                sort: sortType,\n                rarity: aRarities.flatMap(panel => panel.Data().rarity),\n                teamsOnly: btnTeamOnly.checked,\n                playersOnly: btnPlayerOnly.checked,\n                keyChainsOnly: false,\n                rankedOnly: btnRankedOnly.checked,\n                championsOnly: btnChampionsOnly.checked,\n                majorOnly: btnMajorOnly.checked,\n                sortDirection: sortDirection,\n                searchText: elSearchBox.text\n            };\n    }\n    function _RenderActiveFilterChips(cp) {\n        let numFiltersSelected = 0;\n        const elNavBarFiltersParent = cp.FindChildInLayoutFile('id-major-store-filters-active');\n        elNavBarFiltersParent.Children().forEach(btn => btn.DeleteAsync(0));\n        const fnAddChip = (elToggle, loc, chipId) => {\n            if (!elToggle || !elToggle.checked || !elToggle.enabled) {\n                return;\n            }\n            numFiltersSelected++;\n            _MakeNavBarFilterButton(cp, elNavBarFiltersParent, elToggle, loc, chipId);\n        };\n        _GetFilteredTeams(cp).forEach(btn => fnAddChip(btn, '#CSGO_TeamID_' + btn.Data().teamid, 'id-filter-active-r-' + btn.Data().teamid));\n        _GetFilteredRarities(cp).forEach(btn => fnAddChip(btn, '#major_store_filter_type_' + btn.Data().rarity, 'id-filter-active-r-' + btn.Data().rarity));\n        REFINEMENT_FILTERS.forEach(f => fnAddChip(cp.FindChildInLayoutFile(f.toggleId), f.loc, f.chipId));\n        if (_IsMixedContentView(cp)) {\n            SERIES_FILTERS.forEach(f => fnAddChip(cp.FindChildInLayoutFile(f.toggleId), f.loc, f.chipId));\n        }\n        fnAddChip(cp.FindChildInLayoutFile('id-major-store-filter-keychains').FindChildInLayoutFile('id-slider-btn'), '#major_store_filter_type_keychains_only', 'id-filter-active-k-only');\n        const elSearchBox = cp.FindChildInLayoutFile('id-major-store-search-box');\n        if (elSearchBox.text) {\n            numFiltersSelected++;\n            const elActiveFilterBtn = $.CreatePanel('Button', elNavBarFiltersParent, 'id-filter-active-search-txt');\n            elActiveFilterBtn.BLoadLayoutSnippet('active-filter-button');\n            elActiveFilterBtn.SetDialogVariable('search-text', elSearchBox.text);\n            elActiveFilterBtn.SetDialogVariable('name', $.Localize('#major_store_filter_type_search_text', elActiveFilterBtn));\n            elNavBarFiltersParent.MoveChildBefore(elActiveFilterBtn, elNavBarFiltersParent.Children()[0]);\n            elActiveFilterBtn.SetPanelEvent('onactivate', () => {\n                _ClearTextSearch(cp);\n                _UpdateItemsList({ cp });\n                elActiveFilterBtn.DeleteAsync(0);\n            });\n        }\n        cp.FindChildInLayoutFile('id-filter-active-clear_all').visible = numFiltersSelected > 1;\n        cp.FindChildInLayoutFile('id-major-store-filters-clear').visible = numFiltersSelected > 1;\n    }\n    function _MakeNavBarFilterButton(cp, elParent, selectedFilterBtn, locString, idForBtn) {\n        const elActiveFilterBtn = $.CreatePanel('Button', elParent, idForBtn);\n        elActiveFilterBtn.BLoadLayoutSnippet('active-filter-button');\n        elActiveFilterBtn.SetDialogVariable('name', $.Localize(locString, selectedFilterBtn));\n        elActiveFilterBtn.SetPanelEvent('onactivate', () => {\n            selectedFilterBtn.checked = false;\n            if (elActiveFilterBtn.id === 'id-filter-active-k-only') {\n                _EnableDisableFilterPanelBtns(cp, false);\n            }\n            _UpdateItemsList({ cp });\n            elActiveFilterBtn.DeleteAsync(0);\n        });\n    }\n    function _OnActivateClearAll(cp, doNotClearSearch = false) {\n        const elFilterPanel = cp.FindChildInLayoutFile('id-major-store-filters-panel');\n        elFilterPanel.FindChildInLayoutFile('id-major-store-filter-keychains').FindChildInLayoutFile('id-slider-btn').checked = false;\n        elFilterPanel.FindChildrenWithAttributeTraverse('filter-button').forEach(btn => { btn.checked = false, btn.enabled = true; });\n        State(cp).useBookMarkList = false;\n        if (!doNotClearSearch) {\n            _ClearTextSearch(cp);\n        }\n    }\n    function _ClearTextSearch(cp) {\n        const elSearchBox = cp.FindChildInLayoutFile('id-major-store-search-box');\n        elSearchBox.ClearSelection();\n        elSearchBox.text = '';\n    }\n    function _SetUpKeyChainsPage(cp) {\n        const elParent = cp.FindChildInLayoutFile(VIEW_CHARMS);\n        const numStages = g_ActiveTournamentHighlights.length;\n        for (let i = numStages - 1; i >= 0; --i) {\n            const stage = g_ActiveTournamentHighlights[i];\n            let elPanel = elParent.FindChildInLayoutFile('id-keychains-stage-' + stage.group_id);\n            if (!elPanel) {\n                elPanel = $.CreatePanel('Panel', elParent, 'id-keychains-stage-' + stage.group_id);\n                elPanel.BLoadLayoutSnippet('keychain-section');\n                elPanel.SetDialogVariable('stage-title', $.Localize('#CSGO_Tournament_Event_Stage_' + stage.stage));\n            }\n            const keyChains = State(cp).aFlatKeyChainData.filter((keychain) => keychain.stage === stage.stage);\n            const elContainer = elPanel.FindChildInLayoutFile('id-keychains-container');\n            keyChains.forEach((keychain, idx) => {\n                let elTile = elParent.FindChildInLayoutFile('id-keychain-' + keychain.kc_highlight);\n                if (!elTile) {\n                    elTile = $.CreatePanel('Panel', elContainer, 'id-keychain-' + keychain.kc_highlight);\n                    elTile.BLoadLayoutSnippet('store-tile');\n                    elTile.SetHasClass('keychain', true);\n                    elTile.SetHasClass('keychain-banner', true);\n                }\n                _UpdateKeyChainsTile(cp, elTile, keyChains, idx);\n            });\n        }\n    }\n    function _UpdateTile(cp, reusePanel, filteredList, nPanelIdx) {\n        const stickerData = filteredList[nPanelIdx];\n        reusePanel.SetDialogVariable('title', stickerData.isPlayer ?\n            stickerData.playerCode :\n            stickerData.isOrg ?\n                g_ActiveTournamentInfo.organization :\n                stickerData.teamName);\n        _UpdatePriceAnimOnTile(stickerData, reusePanel, cp);\n        _SetPriceDataOnTile(stickerData, reusePanel);\n        _ShoppingCartControlsOnTile(stickerData, reusePanel);\n        _UpdateBookmarkOnTile(stickerData.rawId, reusePanel, cp);\n        reusePanel.FindChildInLayoutFile('id-store-item-rarity').SetImage('file://{images}/icons/ui/sticker_rarity_' + stickerData.rarity + '.svg');\n        reusePanel.SwitchClass('rarity', 'rarity-' + stickerData.rarity);\n        reusePanel.SwitchClass('sticker-type', stickerData.champion ? 'champion' : stickerData.isRanked ? 'ranked' : '');\n        reusePanel.FindChildInLayoutFile('id-store-item-rarity-bar').style.washColor = InventoryAPI.GetItemRarityColor(stickerData.itemId);\n        reusePanel.SetHasClass('is-final', false);\n        reusePanel.FindChildInLayoutFile('id-store-item-hot-trend').SetHasClass('show', stickerData.popularityRank < 40);\n        reusePanel.SetHasClass('is-player', stickerData.isPlayer);\n        reusePanel.FindChildInLayoutFile('id-store-item-image').itemid = stickerData.itemId;\n        reusePanel.FindChildInLayoutFile('id-store-item-team-logo').SetImage(stickerData.isOrg ?\n            'file://{images}/tournaments/events/tournament_logo_' + g_ActiveTournamentInfo.eventid + '.svg' :\n            'file://{images}/tournaments/teams/' + stickerData.teamTag + '.svg');\n        reusePanel.SetPanelEvent('onmouseover', () => {\n            _MakeModelPanel(reusePanel, stickerData.itemId);\n            reusePanel.FindChildInLayoutFile('id-store-item-real-price').SetHasClass('show', stickerData.price >= 100);\n            reusePanel.SetDialogVariable('local-price', StoreAPI.GetStoreItemTokensBundlePrice('' + g_ActiveTournamentInfo.itemid_charge, stickerData.price, ''));\n        });\n        reusePanel.SetPanelEvent('onmouseout', () => {\n            reusePanel.FindChildInLayoutFile('id-store-item-real-price').SetHasClass('show', false);\n            _DeleteModelPanel(reusePanel);\n        });\n        _RebindOpenModelPanel(reusePanel, stickerData.itemId);\n        reusePanel.FindChildInLayoutFile('id-inspect-sticker').SetPanelEvent('onactivate', () => {\n            _OpenFullscreenInspect(cp, stickerData);\n        });\n    }\n    function _RebindOpenModelPanel(reusePanel, itemId) {\n        const MapPanel = reusePanel.FindChildInLayoutFile('id-store-item-model');\n        if (MapPanel && MapPanel.IsValid())\n            MapPanel.SetItemItemId(itemId, '');\n    }\n    function _MakeModelPanel(reusePanel, itemId) {\n        let elParent = reusePanel.FindChildInLayoutFile('id-store-item-image_container');\n        let MapPanel = elParent.FindChildInLayoutFile('id-store-item-model');\n        if (!MapPanel) {\n            MapPanel = $.CreatePanel('MapItemPreviewPanel', elParent, 'id-store-item-model', {\n                class: 'major-store__item-tile__model',\n                \"require-composition-layer\": \"true\",\n                'transparent-background': true,\n                'disable-depth-of-field': true,\n                player: \"false\",\n                map: \"ui/xpshop_item\",\n                initial_entity: 'item',\n                active_item_idx: 0,\n                camera: 'camera_weapon_7',\n                mouse_rotate: \"false\",\n                auto_recenter: true,\n                tabindex: \"auto\",\n                selectionpos: \"auto\",\n                hittest: \"true\",\n                hide_while_waiting_for_composite_materials: \"false\"\n            });\n            MapPanel.SetRotationLimits(60, 45);\n            MapPanel.SetAutoRotateAmount(20, -2);\n            MapPanel.SetAutoRotatePeriod(6, 6);\n            let nRenderInterval = 1;\n            MapPanel.SetRenderInterval(nRenderInterval);\n        }\n        MapPanel.SetItemItemId(itemId, '');\n    }\n    function _DeleteModelPanel(reusePanel) {\n        let MapPanel = reusePanel.FindChildInLayoutFile('id-store-item-model');\n        if (MapPanel !== null && MapPanel.IsValid()) {\n            MapPanel.DeleteAsync(0);\n        }\n    }\n    function _UpdateKeyChainsTile(cp, reusePanel, filteredList, nPanelIdx) {\n        const keychainData = filteredList[nPanelIdx];\n        reusePanel.SetDialogVariable('title', keychainData.name);\n        _UpdatePriceAnimOnTile(keychainData, reusePanel, cp);\n        _SetPriceDataOnTile(keychainData, reusePanel);\n        _ShoppingCartControlsOnTile(keychainData, reusePanel);\n        _UpdateBookmarkOnTile(keychainData.kc_highlight, reusePanel, cp);\n        reusePanel.FindChildInLayoutFile('id-store-item-hot-trend').SetHasClass('show', false);\n        reusePanel.SetHasClass('is-player', false);\n        reusePanel.SetHasClass('is-final', keychainData.stage === 97);\n        reusePanel.SetDialogVariable('stage', $.Localize('#CSGO_Tournament_Event_Stage_' + keychainData.stage));\n        reusePanel.FindChildInLayoutFile('id-store-item-image').itemid = keychainData.itemId;\n        reusePanel.FindChildInLayoutFile('id-store-item-team-1').SetImage('file://{images}/tournaments/teams/' + PredictionsAPI.GetTeamTag(keychainData.teamid1) + '.svg');\n        reusePanel.FindChildInLayoutFile('id-store-item-team-2').SetImage('file://{images}/tournaments/teams/' + PredictionsAPI.GetTeamTag(keychainData.teamid2) + '.svg');\n        reusePanel.FindChildInLayoutFile('id-store-item-team-bg-1').SetImage('file://{images}/tournaments/teams/' + PredictionsAPI.GetTeamTag(keychainData.teamid1) + '.svg');\n        reusePanel.FindChildInLayoutFile('id-store-item-team-bg-2').SetImage('file://{images}/tournaments/teams/' + PredictionsAPI.GetTeamTag(keychainData.teamid2) + '.svg');\n        reusePanel.SetPanelEvent('onmouseover', () => {\n            if (jsTooltipDelayHandle) {\n                $.CancelScheduled(jsTooltipDelayHandle);\n                jsTooltipDelayHandle = null;\n            }\n            jsTooltipDelayHandle = $.Schedule(.4, () => {\n                {\n                    _ShowVideoClip(reusePanel, keychainData.itemId);\n                }\n            });\n            reusePanel.FindChildInLayoutFile('id-store-item-real-price').SetHasClass('show', keychainData.price >= 100);\n            reusePanel.SetDialogVariable('local-price', StoreAPI.GetStoreItemTokensBundlePrice('' + g_ActiveTournamentInfo.itemid_charge, keychainData.price, ''));\n        });\n        reusePanel.SetPanelEvent('onmouseout', () => {\n            if (jsTooltipDelayHandle) {\n                $.CancelScheduled(jsTooltipDelayHandle);\n                jsTooltipDelayHandle = null;\n            }\n            reusePanel.FindChildInLayoutFile('id-store-item-real-price').SetHasClass('show', false);\n            _HideVideoClip(reusePanel, keychainData.itemId);\n        });\n        _DeleteModelPanel(reusePanel);\n        if (reusePanel.FindChildTraverse('id-store-item-movie-container')?.BHasClass('play'))\n            _ShowVideoClip(reusePanel, keychainData.itemId);\n        reusePanel.FindChildInLayoutFile('id-inspect-sticker').SetPanelEvent('onactivate', () => {\n            _OpenFullscreenInspect(cp, keychainData);\n        });\n    }\n    let jsTooltipDelayHandle = null;\n    function _ShowVideoClip(elPanel, itemId) {\n        const reelId = InventoryAPI.GetItemAttributeValue(itemId, '{uint32}keychain slot 0 highlight');\n        if (reelId) {\n            const reelJson = InventoryAPI.BuildHighlightReelSchemaJSON(reelId);\n            const reelSchemaDef = JSON.parse(reelJson);\n            const videoPlayerContainer = elPanel.FindChildTraverse('id-store-item-movie-container');\n            const videoPlayer = elPanel.FindChildTraverse('id-store-item-movie');\n            if (videoPlayerContainer && videoPlayer) {\n                videoPlayerContainer.AddClass('play');\n                videoPlayer.AddClass('play');\n                videoPlayer.SetMovie(reelSchemaDef[\"url_480p\"]);\n                videoPlayer.Play();\n            }\n        }\n    }\n    function _HideVideoClip(elPanel, itemId) {\n        if (InventoryAPI.GetItemAttributeValue(itemId, '{uint32}keychain slot 0 highlight')) {\n            const videoPlayerContainer = elPanel.FindChildTraverse('id-store-item-movie-container');\n            const videoPlayer = elPanel.FindChildTraverse('id-store-item-movie');\n            if (videoPlayerContainer && videoPlayer) {\n                videoPlayerContainer.RemoveClass('play');\n                videoPlayer.RemoveClass('play');\n                videoPlayer.Stop();\n            }\n        }\n    }\n    function _UpdatePriceAnimOnTile(stickerData, reusePanel, cp) {\n        const elChange = reusePanel.FindChildInLayoutFile('id-store-item-price-change');\n        const bIsRanked = ('isRanked' in stickerData) && stickerData.isRanked;\n        const bPriceChanged = !bIsRanked\n            && stickerData.oldPrice !== undefined\n            && stickerData.oldPrice !== stickerData.price;\n        if (!bPriceChanged) {\n            reusePanel.SetHasClass('price-reveal', false);\n            elChange.SetHasClass('show-change', false);\n            return;\n        }\n        reusePanel.SetDialogVariableInt('price-change', Math.abs(stickerData.price - stickerData.oldPrice));\n        elChange.SwitchClass('direction', stickerData.price > stickerData.oldPrice ? 'higher' : 'lower');\n        const bFirstReveal = !State(cp).stopTileUpdate && !stickerData.priceChangeRevealed;\n        if (bFirstReveal) {\n            stickerData.priceChangeRevealed = true;\n        }\n        reusePanel.SetHasClass('price-reveal', bFirstReveal);\n        elChange.SetHasClass('show-change', true);\n    }\n    function _SetPriceDataOnTile(stickerData, reusePanel) {\n        reusePanel.SetDialogVariableInt('price', stickerData.price);\n        reusePanel.FindChildInLayoutFile('id-store-item-price').text = ('isRanked' in stickerData && stickerData.isRanked) ? $.Localize('#major_store_price_locked', reusePanel) : $.Localize('#major_store_price', reusePanel);\n        reusePanel.SetDialogVariableInt('weeklyLow', stickerData.weeklyLow);\n        reusePanel.SetDialogVariableInt('weeklyHigh', stickerData.weeklyHigh);\n        let posDot = (stickerData.weeklyHigh > stickerData.weeklyLow)\n            ? ((stickerData.price - stickerData.weeklyLow) / (stickerData.weeklyHigh - stickerData.weeklyLow)) * 100\n            : 100;\n        posDot = Math.floor(Math.max(0, Math.min(96, posDot)));\n        reusePanel.FindChildInLayoutFile('id-store-item-price-pos').style.transform = 'translateX(' + posDot + '%)';\n    }\n    function _ShoppingCartControlsOnTile(stickerData, reusePanel) {\n        const shopItem = { id: stickerData.itemId, name: stickerData.displayName, price: stickerData.price, oldPrice: stickerData.oldPrice };\n        ShoppingCart.cart.subscribeToUpdates(reusePanel, 'tile-counter', () => {\n            const quantityInCart = ShoppingCart.cart.getItemQuantity(stickerData.itemId);\n            reusePanel.SetHasClass('show-quantity', quantityInCart > 0);\n            reusePanel.SetDialogVariableInt('quantity', quantityInCart);\n        });\n        reusePanel.FindChildInLayoutFile('id-store-item-add-to-cart-btn').SetPanelEvent('onactivate', () => {\n            ShoppingCart.cart.addItem(shopItem);\n            if (ShoppingCart.cart.getItemQuantity(stickerData.itemId) >= 10 || ShoppingCart.cart.getTotalItems() >= 100) {\n                $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.buymenu_failure', 'MOUSE');\n                return;\n            }\n            $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.generic_button_press', 'MOUSE');\n        });\n        reusePanel.FindChildInLayoutFile('id-store-item-remove-from-cart-btn').SetPanelEvent('onactivate', () => {\n            ShoppingCart.cart.decrementItem(shopItem.id);\n            $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.generic_button_press', 'MOUSE');\n        });\n    }\n    function _UpdateBookmarkOnTile(defidx, reusePanel, cp) {\n        const elBookmark = reusePanel.FindChildInLayoutFile('id-store-item-bookmark');\n        elBookmark.checked = Bookmarks.has(defidx);\n        elBookmark.SetPanelEvent('onactivate', () => {\n            _UpdateBookmarkSetting(cp, reusePanel, defidx);\n        });\n    }\n    function _OpenFullscreenInspect(cp, itemData) {\n        function _Callback() {\n            Bookmarks.invalidate();\n            _UpdateVisiblePanel(cp, true);\n        }\n        ;\n        const callback = _TrackJSCallback(cp, UiToolkitAPI.RegisterJSCallback(_Callback));\n        const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('', 'file://{resources}/layout/popups/popup_inventory_inspect.xml');\n        let oSettings = {\n            item_id: itemData.itemId,\n            inspect_only: true,\n            hide_all_action_items: true,\n            price_in_tokens: itemData.price,\n            sticker_def_index: 'rawId' in itemData ? itemData.rawId : itemData.kc_highlight,\n            callback_handle: callback\n        };\n        elPanel.Data().oSettings = oSettings;\n    }\n    function _GetFilteredSortedIds(oSettings) {\n        let aFilteredStickers;\n        const cp = oSettings.cp;\n        _RenderActiveFilterChips(cp);\n        const FilterSortSettings = _ReadFilterSettings(cp);\n        const btnKeyChainsToggle = cp.FindChildInLayoutFile('id-major-store-filter-keychains').FindChildInLayoutFile('id-slider-btn');\n        const elSearchBox = cp.FindChildInLayoutFile('id-major-store-search-box');\n        if (elSearchBox.text) {\n            const searchResults = _GetItemsForSearch(cp, elSearchBox.text);\n            aFilteredStickers = btnKeyChainsToggle.checked ? searchResults.keychainResults : searchResults.stickerResults;\n        }\n        else if (State(cp).useBookMarkList) {\n            aFilteredStickers = _GetBookmarkedItemsList(cp);\n        }\n        else {\n            aFilteredStickers = btnKeyChainsToggle.checked ? State(cp).aFlatKeyChainData : State(cp).aFlatStickersData;\n        }\n        aFilteredStickers = aFilteredStickers.filter(s => _MatchesSeriesFilter(s, FilterSortSettings));\n        if (FilterSortSettings.selectedTeamIds.length > 0) {\n            aFilteredStickers = aFilteredStickers.filter(sticker => FilterSortSettings.selectedTeamIds.includes(sticker.teamId));\n        }\n        if (FilterSortSettings.playersOnly || FilterSortSettings.teamsOnly || FilterSortSettings.keyChainsOnly) {\n            aFilteredStickers = aFilteredStickers.filter(sticker => (('kc_highlight' in sticker) && FilterSortSettings.keyChainsOnly) ||\n                (!('kc_highlight' in sticker) && sticker.isPlayer && FilterSortSettings.playersOnly) ||\n                (!('kc_highlight' in sticker) && !sticker.isPlayer && FilterSortSettings.teamsOnly));\n        }\n        if (FilterSortSettings.rarity.length > 0) {\n            aFilteredStickers = aFilteredStickers.filter(sticker => FilterSortSettings.rarity.includes(sticker.rarity));\n        }\n        const nSortDirection = ((FilterSortSettings.sortDirection === 'asc') ? 1 : -1);\n        const filterSetting = FilterSortSettings.sort;\n        return [...aFilteredStickers].sort((a, b) => {\n            let aField = a[filterSetting];\n            let bField = b[filterSetting];\n            if (filterSetting === 'name') {\n                aField = aField.toLowerCase();\n                bField = bField.toLowerCase();\n            }\n            if (aField != bField) {\n                return ((aField < bField) ? -1 : 1) * nSortDirection;\n            }\n            return _CompareByPopularity(a, b);\n        });\n    }\n    function _GetFilteredTeams(cp) {\n        const elFilterPanel = cp.FindChildInLayoutFile('id-major-store-filters-panel');\n        let elTeams = elFilterPanel.FindChildInLayoutFile('id-major-store-filter-section-teams');\n        return [...elTeams.Children().filter(panel => panel.checked && panel.enabled)];\n    }\n    function _GetFilteredRarities(cp) {\n        const elFilterPanel = cp.FindChildInLayoutFile('id-major-store-filters-panel');\n        let elRarities = elFilterPanel.FindChildInLayoutFile('id-major-store-filter-rarities');\n        return elRarities.Children().filter(panel => panel.checked && panel.enabled);\n    }\n    function _SetUpFilterPanel(cp) {\n        const elFilterPanel = cp.FindChildInLayoutFile('id-major-store-filters-panel');\n        g_ActiveTournamentTeams.forEach((team, i) => {\n            const elParent = elFilterPanel.FindChildInLayoutFile('id-major-store-filter-section-teams');\n            let elTeam = elParent.FindChildInLayoutFile(g_ActiveTournamentTeams[i].team);\n            if (!elTeam) {\n                elTeam = $.CreatePanel('ToggleButton', elParent, g_ActiveTournamentTeams[i].team);\n                elTeam.BLoadLayoutSnippet('filter-team-btn');\n                elTeam.Data().team = g_ActiveTournamentTeams[i].team;\n                elTeam.Data().teamid = g_ActiveTournamentTeams[i].teamid;\n                elTeam.SetAttributeString('filter-button', 'true');\n                elTeam.FindChildInLayoutFile('id-filter-icon').SetImage('file://{images}/tournaments/teams/' + g_ActiveTournamentTeams[i].team + '.svg');\n                elTeam.FindChildInLayoutFile('id-filter-icon-blur').SetImage('file://{images}/tournaments/teams/' + g_ActiveTournamentTeams[i].team + '.svg');\n            }\n        });\n        const aRarities = [3, 4, 5, 6];\n        aRarities.forEach((r, index) => {\n            const rarityBtn = elFilterPanel.FindChildInLayoutFile('id-major-store-filter-rarity-' + r);\n            if (rarityBtn) {\n                rarityBtn.SetDialogVariable('rarity', $.Localize('#major_store_filter_type_' + r));\n                rarityBtn.FindChildInLayoutFile('id-filter-icon').SetImage('file://{images}/icons/ui/sticker_rarity_' + r + '.svg');\n                rarityBtn.FindChildInLayoutFile('id-filter-icon-blur').SetImage('file://{images}/icons/ui/sticker_rarity_' + r + '.svg');\n                rarityBtn.Data().rarity = r;\n            }\n        });\n        const fnRefilter = () => _UpdateItemsList({ cp });\n        elFilterPanel.FindChildrenWithAttributeTraverse('filter-button').forEach(btn => btn.SetPanelEvent('onactivate', fnRefilter));\n        SERIES_FILTERS.forEach(series => elFilterPanel.FindChildInLayoutFile(series.toggleId).SetPanelEvent('onactivate', fnRefilter));\n        const btnKeyChainsOnly = elFilterPanel.FindChildInLayoutFile('id-major-store-filter-keychains').FindChildInLayoutFile('id-slider-btn');\n        btnKeyChainsOnly.SetDialogVariable('slide_toggle_text', $.Localize('#major_store_filter_info_keychains'));\n        btnKeyChainsOnly.SetPanelEvent('onactivate', () => {\n            _EnableDisableFilterPanelBtns(cp, btnKeyChainsOnly.checked);\n            _UpdateItemsList({ cp });\n        });\n        const elClearBtn = elFilterPanel.FindChildInLayoutFile('id-major-store-filters-clear');\n        elClearBtn.SetDialogVariable('name', $.Localize('#major_store_filter_type_clear_all'));\n        elClearBtn.SetPanelEvent('onactivate', () => _ClearAllFilters(cp));\n        const elClearAllNavBtn = cp.FindChildInLayoutFile('id-filter-active-clear_all');\n        elClearAllNavBtn.SetDialogVariable('name', $.Localize('#major_store_filter_type_clear_all'));\n        elClearAllNavBtn.AddClass('clear-all');\n        elClearAllNavBtn.visible = false;\n        elClearAllNavBtn.SetPanelEvent('onactivate', () => {\n            _ClearAllFilters(cp);\n            elClearAllNavBtn.visible = false;\n        });\n    }\n    function _ClearAllFilters(cp) {\n        if (_IsMixedContentView(cp)) {\n            _SetActiveSeriesFilter(cp, NO_SERIES_FILTER);\n        }\n        _OnActivateClearAll(cp);\n        _UpdateItemsList({ cp });\n    }\n    function _EnableDisableFilterPanelBtns(cp, btnKeyChainsOnly) {\n        cp.FindChildrenWithClassTraverse('major-filter-panel__toggle').forEach(btn => {\n            btn.enabled = !btnKeyChainsOnly;\n        });\n        _ApplyViewSort(cp, State(cp).activeSort);\n    }\n    function _Debounce(cp, handleName, delay, fnAction) {\n        const data = cp.Data();\n        if (data[handleName]) {\n            $.CancelScheduled(data[handleName]);\n            data[handleName] = null;\n        }\n        data[handleName] = $.Schedule(delay, fnAction);\n    }\n    function _ScoreStickerSearch(stickers, lowerTokens) {\n        const szMajor = $.Localize('#major_store_nav_tab_major').toLowerCase();\n        const szChampions = $.Localize('#major_store_nav_tab_champions').toLowerCase();\n        const szResults = $.Localize('#major_store_nav_tab_ranked').toLowerCase();\n        return stickers.map(sticker => {\n            let totalScore = 0;\n            const nick = sticker.playerCode.toLowerCase();\n            const tag = (sticker.teamTag) ? sticker.teamTag.toLowerCase() : '';\n            const rarity = sticker.rarityLookup.toLowerCase();\n            const team = (sticker.teamName) ? sticker.teamName.toLowerCase() : '';\n            const real = (sticker.realName) ? sticker.realName.toLowerCase() : '';\n            const name = (sticker.name) ? sticker.name.toLowerCase() : '';\n            const category = (sticker.champion ? szChampions + ' ' : '')\n                + (sticker.isRanked ? szResults : '')\n                + (!sticker.champion && !sticker.isRanked ? szMajor : '');\n            const hasMatch = lowerTokens.every(token => {\n                let tokenScore = 0;\n                if (nick === token || nick.startsWith(token))\n                    tokenScore = 100;\n                else if (nick.includes(token))\n                    tokenScore = 80;\n                else if (tag.includes(token))\n                    tokenScore = 60;\n                else if (rarity.includes(token))\n                    tokenScore = 40;\n                else if (category.includes(token))\n                    tokenScore = 35;\n                else if (name.includes(token))\n                    tokenScore = 30;\n                else if (team.includes(token) || real.includes(token))\n                    tokenScore = 20;\n                totalScore += tokenScore;\n                return tokenScore > 0;\n            });\n            return { sticker, score: totalScore, isValid: hasMatch };\n        })\n            .filter(result => result.isValid)\n            .sort((a, b) => b.score - a.score)\n            .map(result => result.sticker);\n    }\n    function _ScoreKeyChainSearch(keychains, lowerTokens) {\n        return keychains.map(item => {\n            let totalScore = 0;\n            const name = item.name ? item.name.toLowerCase() : '';\n            const mapName = item.map_name ? item.map_name.toLowerCase() : '';\n            const stage = item.stage ? $.Localize('#CSGO_Tournament_Event_Stage_' + item.stage).toLowerCase() : '';\n            const team1 = item.teamid1 ? $.Localize('#CSGO_TeamID_' + item.teamid1).toLowerCase() : '';\n            const team2 = item.teamid2 ? $.Localize('#CSGO_TeamID_' + item.teamid2).toLowerCase() : '';\n            const hasMatch = lowerTokens.every(token => {\n                let tokenScore = 0;\n                if (name === token || name.startsWith(token))\n                    tokenScore = 100;\n                else if (name.includes(token))\n                    tokenScore = 80;\n                else if (mapName.includes(token))\n                    tokenScore = 60;\n                else if (stage.includes(token))\n                    tokenScore = 40;\n                else if (team1.includes(token) || team2.includes(token))\n                    tokenScore = 20;\n                totalScore += tokenScore;\n                return tokenScore > 0;\n            });\n            return { item, score: totalScore, isValid: hasMatch };\n        })\n            .filter(result => result.isValid)\n            .sort((a, b) => b.score - a.score)\n            .map(result => result.item);\n    }\n    function _GetItemsForSearch(cp, searchTxt) {\n        const tokens = searchTxt.toLowerCase().trim().split(/\\s+/).filter(t => t.length > 0);\n        if (tokens.length === 0)\n            return { stickerResults: [], keychainResults: [] };\n        const szKey = tokens.join(' ');\n        const cached = State(cp).searchCache;\n        if (cached && cached.key === szKey)\n            return cached.results;\n        const results = {\n            stickerResults: _ScoreStickerSearch(State(cp).aFlatStickersData, tokens),\n            keychainResults: _ScoreKeyChainSearch(State(cp).aFlatKeyChainData, tokens),\n        };\n        State(cp).searchCache = { key: szKey, results };\n        return results;\n    }\n    function _ShowSearchResults(cp, oItems) {\n        const elTextSearchFlyout = cp.FindChildInLayoutFile('id-major-fullscreen-text-search');\n        const elResultsPanel = elTextSearchFlyout.FindChildInLayoutFile('id-search-list');\n        elResultsPanel.Children().forEach(result => result.DeleteAsync(0));\n        const sections = [\n            { id: 'id-results-stickers', items: oItems.stickerResults },\n            { id: 'id-results-keychains', items: oItems.keychainResults },\n        ];\n        if (sections.every(s => s.items.length < 1)) {\n            _PopOverlay();\n            return;\n        }\n        State(cp).useBookMarkList = false;\n        _PushOverlay(cp, 'id-major-fullscreen-text-search');\n        let bNeedSeparator = false;\n        sections.forEach(section => {\n            if (section.items.length < 1)\n                return;\n            if (bNeedSeparator)\n                $.CreatePanel('Panel', elResultsPanel, '', { class: 'major-search-results__section__separator' });\n            bNeedSeparator = true;\n            const elSection = $.CreatePanel('Panel', elResultsPanel, section.id, { class: 'major-search-results__section' });\n            _MakeShowSearchResultsBtn(cp, elSection, section.items.length);\n            const elListParent = $.CreatePanel('Panel', elSection, '', { class: 'major-search-results__list' });\n            section.items.slice(0, MAX_SEARCH_RESULTS_SHOWN).forEach(item => _MakeSearchTile(cp, elListParent, item));\n        });\n    }\n    function _MakeShowSearchResultsBtn(cp, elSection, count) {\n        const elPanel = $.CreatePanel('Button', elSection, '');\n        elPanel.SetDialogVariableInt('results-count', count);\n        elPanel.BLoadLayoutSnippet('search-result-show-all');\n        elPanel.SetDialogVariable('search-text', cp.FindChildInLayoutFile('id-major-store-search-box').text);\n        const bIsKeychains = elSection.id === 'id-results-keychains';\n        elPanel.FindChildInLayoutFile('id-results-btn-label').text = $.Localize(bIsKeychains ? '#major_store_search_see_all_keychains' : '#major_store_search_see_all_stickers', elPanel);\n        elPanel.SetPanelEvent('onactivate', () => {\n            _OnActivateClearAll(cp, true);\n            _PopOverlay();\n            cp.FindChildInLayoutFile('id-major-store-filter-keychains').FindChildInLayoutFile('id-slider-btn').checked = bIsKeychains;\n            _EnableDisableFilterPanelBtns(cp, bIsKeychains);\n            _SetActiveSeriesFilter(cp, NO_SERIES_FILTER);\n            _ApplyViewSort(cp, VIEW_SORTS.Search);\n            _ShowMainPanel(cp, VIEW_CONTENT);\n            _SetActiveNavTab(cp, NAV_TAB_NONE);\n        });\n    }\n    function _MakeSearchTile(cp, elSection, item) {\n        const bIsSticker = ('rawId' in item);\n        const elTile = $.CreatePanel('Button', elSection, '');\n        elTile.BLoadLayoutSnippet('search-result');\n        elTile.FindChildInLayoutFile('id-result-icon').itemid = item.itemId;\n        item.displayName.SetOnLabel(elTile.FindChildInLayoutFile('id-result-name'));\n        elTile.SetDialogVariableInt('price', item.price);\n        elTile.FindChildInLayoutFile('id-result-inspect').SetPanelEvent('onactivate', () => {\n            _OpenFullscreenInspect(cp, item);\n            _PopOverlay();\n        });\n        const elBookmark = elTile.FindChildInLayoutFile('id-store-item-bookmark');\n        elBookmark.checked = Bookmarks.has(bIsSticker ? item.rawId : item.kc_highlight);\n        elBookmark.SetPanelEvent('onactivate', () => {\n            _UpdateBookmarkSetting(cp, elTile, bIsSticker ? item.rawId : item.kc_highlight);\n        });\n    }\n    function OnSearchContextMenuCallBack(msg) {\n    }\n    function _ShowCategoryList(cp, filterToggleId, sort) {\n        _OnActivateClearAll(cp);\n        _SetActiveSeriesFilter(cp, filterToggleId);\n        _ApplyViewSort(cp, sort);\n        _ShowMainPanel(cp, VIEW_CONTENT);\n    }\n    function _IsFavoritesEmpty(cp) {\n        return State(cp).useBookMarkList && _GetBookmarkedItemsList(cp).length < 1;\n    }\n    function _UpdateFavoritesEmptyState(cp) {\n        const bEmpty = _IsFavoritesEmpty(cp);\n        cp.FindChildInLayoutFile('id-major-store-bookmark-hint').SetHasClass('hidden', !bEmpty);\n        cp.FindChildInLayoutFile('id-major-store-content-controls').visible = !bEmpty;\n        const elLister = cp.FindChildInLayoutFile('id-major-store-items-lister');\n        if (elLister)\n            elLister.visible = !bEmpty;\n        return bEmpty;\n    }\n    function _RefreshCarousels(cp) {\n        STORE_CAROUSELS.forEach(carousel => {\n            const elBanner = cp.FindChildInLayoutFile(carousel.bannerId);\n            if (elBanner)\n                elBanner.SetHasClass('hidden', !carousel.hasItems(cp));\n            carousel.refresh(cp);\n        });\n    }\n    function _RefreshHome(cp) {\n        _RefreshCarousels(cp);\n        _UpdateStoreNavTabs(cp);\n    }\n    function _SetUpCarouselSeeAllButtons(cp) {\n        STORE_CAROUSELS.forEach(carousel => {\n            if (carousel.navTabKey && !STORE_NAV_TABS.some(tab => tab.key === carousel.navTabKey)) {\n            }\n            const elSeeAll = cp.FindChildInLayoutFile(carousel.seeAllBtnId);\n            if (!elSeeAll)\n                return;\n            elSeeAll.SetPanelEvent('onactivate', () => {\n                carousel.onSeeAll(cp);\n                if (carousel.navTabKey)\n                    _SetActiveNavTab(cp, carousel.navTabKey);\n            });\n        });\n    }\n    function _SetUpStoreNavTabs(cp) {\n        const elParent = cp.FindChildInLayoutFile('id-major-store-nav-tabs-container');\n        STORE_NAV_TABS.forEach((tab, i) => {\n            if (STORE_NAV_TABS.findIndex(t => t.key === tab.key) !== i) {\n            }\n            let elTab = elParent.FindChild(tab.key);\n            if (!elTab) {\n                elTab = $.CreatePanel('RadioButton', elParent, tab.key, {\n                    group: 'store_nav',\n                    class: 'content-navbar__tabs__btn left-right-flow',\n                });\n                $.CreatePanel('Label', elTab, tab.key + '-label', { text: $.Localize(tab.loc) });\n            }\n            elTab.SetPanelEvent('onactivate', () => {\n                if (m_bSyncingNavTabs)\n                    return;\n                tab.activate(cp);\n                _SetActiveNavTab(cp, tab.key);\n            });\n        });\n        cp.FindChildInLayoutFile('id-major-store-nav-home').SetPanelEvent('onactivate', () => {\n            if (m_bSyncingNavTabs)\n                return;\n            StoreNavActions.Home(cp);\n        });\n        _UpdateStoreNavTabs(cp);\n    }\n    function _UpdateStoreNavTabs(cp) {\n        const elParent = cp.FindChildInLayoutFile('id-major-store-nav-tabs-container');\n        STORE_NAV_TABS.forEach(tab => {\n            const elTab = elParent.FindChild(tab.key);\n            if (!elTab) {\n                return;\n            }\n            elTab.visible = tab.isAvailable(cp);\n            const elLabel = elTab.FindChild(tab.key + '-label');\n            if (elLabel && tab.label) {\n                elLabel.text = tab.label(cp, elLabel);\n            }\n        });\n    }\n    function _SetActiveNavTab(cp, key) {\n        const elParent = cp.FindChildInLayoutFile('id-major-store-nav-tabs-container');\n        const elHome = cp.FindChildInLayoutFile('id-major-store-nav-home');\n        m_bSyncingNavTabs = true;\n        let bMatched = (key === 'home');\n        elHome.checked = bMatched;\n        STORE_NAV_TABS.forEach(tab => {\n            const elTab = elParent.FindChild(tab.key);\n            if (!elTab)\n                return;\n            elTab.checked = (tab.key === key);\n            bMatched = bMatched || elTab.checked;\n        });\n        m_bSyncingNavTabs = false;\n        if (!bMatched && key !== NAV_TAB_NONE) {\n        }\n    }\n    function _FindView(viewId) {\n        return STORE_VIEWS.find(view => view.id === viewId);\n    }\n    function _ActiveView() {\n        return (m_activeMain && m_activeMain.IsValid()) ? _FindView(m_activeMain.id) : undefined;\n    }\n    function _IsHomeActive() {\n        return _ActiveView()?.id === VIEW_HOME;\n    }\n    function _ShowMainPanel(cp, viewId) {\n        _CloseSortDropDown(cp);\n        const view = _FindView(viewId);\n        const elNext = cp.FindChildInLayoutFile(viewId);\n        if (!view || !elNext) {\n            return;\n        }\n        if (elNext === m_activeMain) {\n            if (view.rebuildIfActive) {\n                view.onShow?.(cp);\n                elNext.TriggerClass('panel-reveal');\n            }\n            return;\n        }\n        if (view.navTabKey) {\n            _SetActiveNavTab(cp, view.navTabKey);\n        }\n        view.onShow?.(cp);\n        if (m_activeMain && m_activeMain.IsValid()) {\n            m_activeMain.AddClass('hidden');\n        }\n        elNext.RemoveClass('hidden');\n        elNext.TriggerClass('panel-reveal');\n        m_activeMain = elNext;\n        _UpdateFooterButtons(cp);\n        $.DispatchEvent('CSGOPlaySoundEffect', 'inventory_inspect_close', 'MOUSE');\n    }\n    function _GoBack(cp) {\n        const szBackTarget = _ActiveView()?.backTarget;\n        if (szBackTarget) {\n            _ShowMainPanel(cp, szBackTarget);\n        }\n        else {\n            StoreNavActions.Home(cp);\n        }\n    }\n    function _UpdateFooterButtons(cp) {\n        const bHome = _IsHomeActive();\n        cp.FindChildInLayoutFile('id-popup-major-store-close-btn').visible = bHome;\n        cp.FindChildInLayoutFile('id-popup-major-store-back-btn').visible = !bHome;\n    }\n    function _PushOverlay(cp, panelId) {\n        const overlay = $.GetContextPanel().FindChildTraverse(panelId);\n        if (!overlay || m_overlayStack.includes(overlay))\n            return;\n        m_overlayStack.push(overlay);\n        overlay.RemoveClass('hidden');\n    }\n    function _PopOverlay() {\n        const topOverlay = m_overlayStack.pop();\n        if (topOverlay && topOverlay.IsValid()) {\n            topOverlay.AddClass('hidden');\n            return true;\n        }\n        return false;\n    }\n    function OnCancelPressed() {\n        if (m_overlayStack.includes($.GetContextPanel().FindChildInLayoutFile('id-major-store-loading'))) {\n            return true;\n        }\n        if (m_overlayStack.length > 0) {\n            const topOverlay = m_overlayStack.pop();\n            $.GetContextPanel().FindChildTraverse(topOverlay.id).AddClass('hidden');\n            return true;\n        }\n        if (_ActiveView() && !_IsHomeActive()) {\n            _GoBack($.GetContextPanel());\n            return true;\n        }\n        ClosePopup();\n        return true;\n    }\n    PopupMajorStore.OnCancelPressed = OnCancelPressed;\n    {\n        const cp = $.GetContextPanel();\n        $.RegisterEventHandler('ReadyForDisplay', cp, ReadyForDisplay);\n        $.RegisterEventHandler('UnreadyForDisplay', cp, UnreadyForDisplay);\n        $.RegisterForUnhandledEvent('PanoramaComponent_MyPersona_GcLogonNotificationReceived', ReadyForDisplay);\n        $.RegisterForUnhandledEvent('PanoramaComponent_MyPersona_UpdateConnectionToGC', ReadyForDisplay);\n        $.RegisterForUnhandledEvent('PanoramaComponent_Store_VolatileShopSubscribe', (...args) => { OnVolatileShopSubscribe(...args, cp); });\n        cp.RegisterForReadyEvents(true);\n        if (cp.BReadyForDisplay()) {\n            ReadyForDisplay();\n        }\n    }\n})(PopupMajorStore || (PopupMajorStore = {}));\n","scripts/popups/popup_major_store_balance.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../generated/items_event_current_generated_store.d.ts\" />\n/// <reference path=\"../generated/items_event_current_generated_store.ts\" />\nvar PopupMajorStoreBalance;\n(function (PopupMajorStoreBalance) {\n    const _m_cp = $.GetContextPanel();\n    let _m_callbackHandle = -1;\n    function Init() {\n        const eventId = g_ActiveTournamentInfo.eventid;\n        _m_callbackHandle = _m_cp.GetAttributeInt('callback', -1);\n        _m_cp.SetDialogVariableInt('balance', _m_cp.GetAttributeInt('balance', 0));\n        _m_cp.SetDialogVariable('tournament_name', $.Localize('#CSGO_Tournament_Event_NameShort_' + eventId));\n        _m_cp.FindChildInLayoutFile('id-major-store-balance-logo').SetImage('file://{images}/tournaments/backgrounds/pickem_mainmenu_promo_' + eventId + '.psd');\n        _m_cp.FindChildInLayoutFile('id-major-store-balance-banner').style.backgroundImage = \"url( 'file://{images}/tournaments/backgrounds/pickem_bg_\" + eventId + \".png')\";\n        _m_cp.SetHasClass('major-' + eventId, true);\n    }\n    PopupMajorStoreBalance.Init = Init;\n    function OpenMajorHub() {\n        Close();\n        UiToolkitAPI.ShowCustomLayoutPopupParameters('id-popup-major-hub', 'file://{resources}/layout/popups/popup_major_hub.xml', 'eventid=' + g_ActiveTournamentInfo.eventid);\n    }\n    PopupMajorStoreBalance.OpenMajorHub = OpenMajorHub;\n    function Close() {\n        if (_m_callbackHandle != -1) {\n            UiToolkitAPI.InvokeJSCallback(_m_callbackHandle);\n            _m_callbackHandle = -1;\n        }\n        $.DispatchEvent('UIPopupButtonClicked', '');\n    }\n    PopupMajorStoreBalance.Close = Close;\n})(PopupMajorStoreBalance || (PopupMajorStoreBalance = {}));\n","scripts/popups/popup_news.js":"\"use strict\";\n/// <reference path=\"..\\csgo.d.ts\" />\nvar PopupNews;\n(function (PopupNews) {\n    function Init() {\n        let date = $.GetContextPanel().GetAttributeString(\"date\", '');\n        date = date.split(' ')[0];\n        $.GetContextPanel().SetDialogVariable('news_date', date);\n        let title = $.GetContextPanel().GetAttributeString(\"title\", '');\n        $.GetContextPanel().SetDialogVariable('news_title', title);\n        let link = $.GetContextPanel().GetAttributeString(\"link\", '');\n        let elUrlBtn = $.GetContextPanel().FindChildTraverse('id-news-url-button');\n        if (elUrlBtn) {\n            let strUrl = link;\n            elUrlBtn.SetPanelEvent('onactivate', () => {\n                SteamOverlayAPI.OpenUrlInOverlayOrExternalBrowser(strUrl);\n                $.DispatchEvent('UIPopupButtonClicked', '');\n                $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.mainmenu_press_home', 'MOUSE');\n            });\n        }\n        let elBlogHTML = $.GetContextPanel().FindChildTraverse('BlogHTML');\n        if (elBlogHTML) {\n            if (link.indexOf('?') < 0)\n                link += '?';\n            else\n                link += '&';\n            link += 'is_embedded_in_client=1';\n            elBlogHTML.SetURL(link);\n        }\n    }\n    PopupNews.Init = Init;\n    function Close() {\n        $.DispatchEvent('UIPopupButtonClicked', '');\n    }\n    PopupNews.Close = Close;\n    function _HTMLOpenPopupLink(elPanel, sLinkUrl) {\n        SteamOverlayAPI.OpenUrlInOverlayOrExternalBrowser(sLinkUrl);\n        $.DispatchEvent('UIPopupButtonClicked', '');\n        $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.mainmenu_press_home', 'MOUSE');\n    }\n    function _HTMLFinishRequest() {\n        $.Schedule(0.3, () => {\n            let elHTML = $.GetContextPanel().FindChildTraverse('BlogHTML');\n            if (elHTML) {\n                elHTML.AddClass('visible');\n            }\n        });\n    }\n    $.RegisterEventHandler(\"HTMLFinishRequest\", $.GetContextPanel(), _HTMLFinishRequest);\n    $.RegisterEventHandler(\"HTMLOpenPopupLink\", $.GetContextPanel(), _HTMLOpenPopupLink);\n})(PopupNews || (PopupNews = {}));\n","scripts/popups/popup_offers_laptop.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"popup_capability_header.ts\" />\n/// <reference path=\"popup_acknowledge_item.ts\" />\n/// <reference path=\"../common/iteminfo.ts\" />\n/// <reference path=\"../inspect.ts\" />\n/// <reference path=\"popup_inspect_async-bar.ts\" />\n/// <reference path=\"popup_inspect_header.ts\" />\n/// <reference path=\"popup_acknowledge_item.ts\" />\n/// <reference path=\"popup_offers_laptop_interface.ts\" />\nvar OffersLaptop;\n(function (OffersLaptop) {\n    let m_aItemsInLootlist = [];\n    let m_itemid = '';\n    let m_isOpen = false;\n    let m_InspectPanel = $.GetContextPanel();\n    let m_unusualItemImagePath = '';\n    let m_showInspectScheduleHandle = null;\n    let m_specialItemId = 'id-special-item';\n    let m_elCaseModelImagePanel = null;\n    let m_bReadyForDisplay = false;\n    let m_LoopingSounds = {};\n    function LaptopSoundPlayOnce(s) {\n        if (!m_bReadyForDisplay)\n            return;\n        $.DispatchEvent(\"CSGOPlaySoundEffect\", s, \"MOUSE\");\n    }\n    OffersLaptop.LaptopSoundPlayOnce = LaptopSoundPlayOnce;\n    function LaptopSoundStartLooping(s) {\n        if (!m_bReadyForDisplay)\n            return;\n        if (!s)\n            return;\n        if (m_LoopingSounds[s] !== undefined)\n            return;\n        m_LoopingSounds[s] = UiToolkitAPI.PlaySoundEvent(s);\n    }\n    OffersLaptop.LaptopSoundStartLooping = LaptopSoundStartLooping;\n    function LaptopSoundStopLooping(s) {\n        if (!s)\n            return;\n        if (m_LoopingSounds[s] === undefined)\n            return;\n        UiToolkitAPI.StopSoundEvent(m_LoopingSounds[s], 0);\n        m_LoopingSounds[s] = undefined;\n    }\n    OffersLaptop.LaptopSoundStopLooping = LaptopSoundStopLooping;\n    function _OnHandleReadyForDisplay(b) {\n        m_bReadyForDisplay = b;\n        if (!m_bReadyForDisplay) {\n            for (const s in m_LoopingSounds)\n                LaptopSoundStopLooping(s);\n        }\n    }\n    function Init() {\n        m_itemid = InspectShared.GetPopupSetting('item_id');\n        m_InspectPanel.RegisterForReadyEvents(true);\n        m_bReadyForDisplay = m_InspectPanel.BReadyForDisplay();\n        $.RegisterEventHandler('ReadyForDisplay', m_InspectPanel, _OnHandleReadyForDisplay.bind(undefined, true));\n        $.RegisterEventHandler('UnreadyForDisplay', m_InspectPanel, _OnHandleReadyForDisplay.bind(undefined, false));\n        m_InspectPanel.SetReadyForDisplay(true);\n        if (!m_itemid || !InventoryAPI.IsValidItemID(m_itemid)) {\n            ClosePopUp();\n        }\n        LaptopSoundPlayOnce('UI.Laptop.Inspect');\n        if (m_itemid && ItemInfo.ItemHasCapability(m_itemid, 'decodable') &&\n            !!InventoryAPI.GetItemAttributeValue(m_itemid, '{uint32}volatile container') &&\n            InventoryAPI.IsRental(m_itemid) &&\n            (InventoryAPI.GetItemQuality(m_itemid) === 14)) {\n            _SetUpOpenLaptop(m_itemid);\n        }\n        else {\n            _SetUpClosedLaptop();\n        }\n    }\n    OffersLaptop.Init = Init;\n    function _SetUpClosedLaptop() {\n        InspectShared.SetPopupSetting('is_keyless', true);\n        InspectShared.SetPopupSetting('show_work_type_warning', true);\n        InspectShared.SetPopupSetting('override_async_bar_desc', true);\n        InspectAsyncActionBar.Init();\n        CapabilityHeader.Init();\n        _SetCaseModelImage(m_itemid, 'PopUpInspectModelOrImage');\n        _SetLootListItems(m_itemid);\n    }\n    function _SetCaseModelImage(caseId, PanelId) {\n        let elItemModelImagePanel = $.GetContextPanel().FindChildInLayoutFile(PanelId);\n        elItemModelImagePanel.Data().isLapTopOpening = m_isOpen;\n        InspectModelImage.Init(elItemModelImagePanel, caseId);\n        m_elCaseModelImagePanel = InspectModelImage.GetModelPanel();\n    }\n    function _SetLootListItems(itemId) {\n        let count = InventoryAPI.GetLootListItemsCount(itemId);\n        let elLootList = $.GetContextPanel().FindChildInLayoutFile('DecodableLootlist');\n        if (count === 0) {\n            _ShowHideLootList(false);\n            return;\n        }\n        if (m_elCaseModelImagePanel && m_elCaseModelImagePanel.IsValid() && m_elCaseModelImagePanel.id === 'ImagePreviewPanel') {\n            m_elCaseModelImagePanel.AddClass('y-offset');\n        }\n        _ShowHideLootList(true);\n        _SetLootlistHintText(itemId, count);\n        for (let i = 0; i < count; i++) {\n            let itemid = InventoryAPI.GetLootListItemIdByIndex(itemId, i) === '0' ? m_specialItemId : InventoryAPI.GetLootListItemIdByIndex(itemId, i);\n            let elItem = elLootList.FindChildInLayoutFile(itemid);\n            if (!elItem) {\n                let elItem = $.CreatePanel('Panel', elLootList, itemid);\n                elItem.SetAttributeString('itemid', itemid);\n                elItem.BLoadLayoutSnippet('LootListItem');\n                _UpdateLootListItemInfo(elItem, itemid, itemId);\n                elItem.SetPanelEvent('onactivate', _OnActivateLootlistTile.bind(undefined, itemid, itemId, ''));\n                elItem.SetPanelEvent('oncontextmenu', _OnActivateLootlistTile.bind(undefined, itemid, itemId, ''));\n                if (i === 0) {\n                    $.GetContextPanel().FindChildInLayoutFile('CanDecodableBrowseBtn').SetPanelEvent('onactivate', callBackFunc.bind(undefined, itemid, itemId, ''));\n                }\n                if (itemid !== m_specialItemId) {\n                    m_aItemsInLootlist.push({\n                        id: itemid,\n                        weight: _GetDisplayWeightForScroll(itemid),\n                    });\n                }\n            }\n        }\n    }\n    function _OnActivateLootlistTile(itemid, caseId, keyId) {\n        if (!InventoryAPI.IsValidItemID(itemid))\n            return;\n        let items = [];\n        items.push({ label: '#UI_Inspect', jsCallback: callBackFunc.bind(undefined, itemid, caseId, keyId) });\n        if (MyPersonaAPI.GetLauncherType() !== \"perfectworld\" && !InventoryAPI.CannotTrade(itemid)) {\n            items.push({ label: '#SFUI_Store_Market_Link', jsCallback: _ViewOnMarket.bind(undefined, itemid) });\n        }\n        UiToolkitAPI.ShowSimpleContextMenu('', 'ControlLibSimpleContextMenu', items);\n    }\n    function callBackFunc(itemid, caseId, keyId) {\n        $.DispatchEvent('ContextMenuEvent', '');\n        _HidePanelForLootlistItemPreview();\n        $.DispatchEvent(\"LootlistItemPreview\", itemid, caseId + ',' + caseId);\n    }\n    function _HidePanelForLootlistItemPreview() {\n        if (!m_InspectPanel.IsValid())\n            return;\n    }\n    function _ViewOnMarket(id) {\n        SteamOverlayAPI.OpenURL(ItemInfo.GetMarketLinkForLootlistItem(id));\n    }\n    function _GetDisplayWeightForScroll(itemid) {\n        let rarityVal = InventoryAPI.GetItemRarity(itemid);\n        let displayItemWeight = [150000, 30000, 6000, 1250, 250, 50, 10];\n        return displayItemWeight[rarityVal];\n    }\n    function _UpdateLootListItemInfo(elItem, itemid, caseId) {\n        if (itemid == m_specialItemId) {\n            m_unusualItemImagePath = InventoryAPI.GetLootListUnusualItemImage(caseId) + \".png\";\n            _UpdateUnusualItemInfo(elItem, caseId, m_unusualItemImagePath, true);\n        }\n        else {\n            elItem.FindChildInLayoutFile('ItemImage').itemid = itemid;\n            elItem.FindChildInLayoutFile('JsRarity').style.backgroundColor = InventoryAPI.GetItemRarityColor(itemid);\n            ItemInfo.GetFormattedName(itemid).SetOnLabel(elItem.FindChildInLayoutFile('JsItemName'));\n        }\n    }\n    function _ShowHideLootList(bshow) {\n        let elLootListContainer = $.GetContextPanel().FindChildInLayoutFile('DecodableLootlistContainer');\n        elLootListContainer.SetHasClass('hidden', !bshow);\n    }\n    function _SetLootlistHintText(caseId, count) {\n        let bAllItems = InventoryAPI.GetLootListAllEntriesAreAdditionalDrops(caseId);\n        $.GetContextPanel().FindChildInLayoutFile('CanDecodableDesc').visible = !bAllItems;\n    }\n    function _UpdateUnusualItemInfo(elItem, caseId, unusualItemImagePath, bisDisplayedInLootlist = false) {\n        if (!elItem || !elItem.IsValid()) {\n            return;\n        }\n        elItem.FindChildInLayoutFile('ItemImage').SetImage(\"file://{images}/\" + unusualItemImagePath);\n        if (bisDisplayedInLootlist) {\n            elItem.FindChildInLayoutFile('JsRarity').AddClass('popup-decodable-wash-color-unusual');\n            let elBg = elItem.FindChildInLayoutFile('ItemTileBg');\n            elBg.AddClass('popup-decodable-wash-color-unusual-bg');\n            let elName = elItem.FindChildInLayoutFile('JsItemName');\n            elName.text = InventoryAPI.GetLootListUnusualItemName(caseId);\n        }\n        else {\n            elItem.FindChildInLayoutFile('JsRarity').style.washColor = '#ffd700';\n            elItem.FindChildInLayoutFile('JItemTint').style.washColor = '#ffd700';\n        }\n    }\n    function ClosePopUp(bDestroyLaptop = false, bCloseImmediate = false) {\n        InventoryAPI.StopItemPreviewMusic();\n        if (m_InspectPanel.IsValid()) {\n            if (m_showInspectScheduleHandle) {\n                $.CancelScheduled(m_showInspectScheduleHandle);\n                m_showInspectScheduleHandle = null;\n            }\n            if (bDestroyLaptop) {\n                LaptopSoundPlayOnce('UI.Laptop.Break');\n                m_InspectPanel.FindChildInLayoutFile('id-laptop-screen').SetHasClass('broken-mask', true);\n                $.Schedule(.25, () => {\n                    m_InspectPanel.FindChildInLayoutFile('id-laptop-screen').SetHasClass('cracked', true);\n                });\n                $.Schedule(.5, () => {\n                    m_InspectPanel.FindChildInLayoutFile('id-laptop-screen').SetHasClass('broken-screen', true);\n                    m_InspectPanel.FindChildInLayoutFile('id-laptop-screen').SetHasClass('broken-mask', false);\n                });\n                $.Schedule(2, () => {\n                    InspectAsyncActionBar.OnEventToClose();\n                });\n            }\n            else if (bCloseImmediate) {\n                LaptopSoundPlayOnce('inventory_inspect_close');\n                InspectAsyncActionBar.OnEventToClose();\n            }\n            else {\n                m_elCaseModelImagePanel?.SetAnimgraphBool('close', true);\n                m_InspectPanel.FindChildInLayoutFile('id-laptop-screen').SetHasClass('show', false);\n                LaptopSoundPlayOnce('UI.Laptop.Close');\n                $.Schedule(.25, () => {\n                    if (m_elCaseModelImagePanel && m_elCaseModelImagePanel.IsValid()) {\n                        m_elCaseModelImagePanel.TransitionToCamera('cam_laptop_close', 1);\n                    }\n                });\n                $.Schedule(1.25, () => {\n                    InspectAsyncActionBar.OnEventToClose();\n                });\n            }\n        }\n        _OnHandleReadyForDisplay(false);\n    }\n    OffersLaptop.ClosePopUp = ClosePopUp;\n    function _Refresh() {\n        if (!m_itemid || !InventoryAPI.IsValidItemID(m_itemid)) {\n            ClosePopUp();\n            return;\n        }\n        Init();\n    }\n    function ItemUnlocked(numericType, type, itemId) {\n        if (itemId && InventoryAPI.IsValidItemID(itemId) && type === 'crate_unlock') {\n            InspectShared.SetPopupSetting('item_id', itemId);\n            InventoryAPI.SetItemSessionPropertyValue(itemId, 'recent', '1');\n            InventoryAPI.AcknowledgeNewItembyItemID(itemId);\n            _SetUpOpenLaptop(itemId);\n        }\n        else if (type === 'casket_contents' || numericType === 1012 || type === 'xpgrant') {\n            CollectionOffers.OnItemCustomizationNotification(numericType, type, itemId);\n        }\n        else {\n            ClosePopUp();\n        }\n    }\n    function _SetUpOpenLaptop(itemId) {\n        m_isOpen = true;\n        $.GetContextPanel().FindChildInLayoutFile('PopUpInspectAsyncBar').SetHasClass('hidden', true);\n        $.GetContextPanel().FindChildInLayoutFile('PopUpCapabilityHeader').SetHasClass('hidden', true);\n        _ShowHideLootList(false);\n        _SetCaseModelImage(itemId, 'PopUpInspectModelOrImage');\n        $.Schedule(.5, () => {\n            CollectionOffers.Init(itemId, $.GetContextPanel().FindChildInLayoutFile('id-laptop-screen'));\n            LaptopSoundStartLooping('UI.Laptop.FanLoop');\n        });\n        $.Schedule(.75, () => {\n            m_elCaseModelImagePanel?.SetAnimgraphBool('open', true);\n            LaptopSoundPlayOnce('UI.Laptop.Open');\n            $.GetContextPanel().FindChildInLayoutFile('id-laptop-screen').SetHasClass('show', true);\n        });\n    }\n    function _ItemAcquired(ItemId) {\n        LaptopSoundPlayOnce(\"rename_purchaseSuccess\");\n        if (CollectionOffers.m_currentOfferId === ItemId) {\n            InventoryAPI.SetItemSessionPropertyValue(ItemId, 'recent', '1');\n            InventoryAPI.AcknowledgeNewItembyItemID(ItemId);\n            $.Schedule(1, () => {\n                $.DispatchEvent(\"InventoryItemPreview\", ItemId, '');\n                let rarityVal = InventoryAPI.GetItemRarity(ItemId);\n                let soundEvent = \"ItemRevealRarityCommon\";\n                if (rarityVal == 4) {\n                    soundEvent = \"ItemRevealRarityUncommon\";\n                }\n                else if (rarityVal == 5) {\n                    soundEvent = \"ItemRevealRarityRare\";\n                }\n                else if (rarityVal == 6) {\n                    soundEvent = \"ItemRevealRarityMythical\";\n                }\n                else if (rarityVal == 7) {\n                    soundEvent = \"ItemRevealRarityLegendary\";\n                }\n                else if (rarityVal == 8) {\n                    soundEvent = \"ItemRevealRarityAncient\";\n                }\n                LaptopSoundPlayOnce(soundEvent);\n                ClosePopUp(false, true);\n            });\n        }\n    }\n    function _CheckConnection() {\n        if (!MyPersonaAPI.IsConnectedToGC()) {\n            if (m_InspectPanel.IsValid() && m_InspectPanel) {\n                ClosePopUp(false, true);\n            }\n        }\n    }\n    $.RegisterForUnhandledEvent('PanoramaComponent_Inventory_ItemCustomizationNotification', ItemUnlocked);\n    $.RegisterForUnhandledEvent('PanoramaComponent_Store_PurchaseCompleted', _ItemAcquired);\n    $.RegisterForUnhandledEvent('CSGOShowMainMenu', _Refresh);\n    $.RegisterForUnhandledEvent('PopulateLoadingScreen', ClosePopUp);\n    $.RegisterForUnhandledEvent('OpenInventory', ClosePopUp);\n    $.RegisterForUnhandledEvent('PanoramaComponent_MyPersona_UpdateConnectionToGC', _CheckConnection);\n})(OffersLaptop || (OffersLaptop = {}));\n","scripts/popups/popup_offers_laptop_interface.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../common/async.ts\" />\n/// <reference path=\"../common/xpshop_tile_weapon_camera_settings.ts\" />\n/// <reference path=\"../common/iteminfo.ts\" />\n/// <reference path=\"../common/formattext.ts\" />\n/// <reference path=\"../common/icon.ts\" />\n/// <reference path=\"../common/store_items.ts\" />\n/// <reference path=\"../popups/popup_acknowledge_item.ts\" />\n/// <reference path=\"../popups/popup_offers_laptop.ts\" />\n/// <reference path=\"../itemtile_store.ts\" />\nvar CollectionOffers;\n(function (CollectionOffers) {\n    class UniqueRandom {\n        min;\n        max;\n        available = [];\n        constructor(min, max) {\n            this.min = min;\n            this.max = max;\n            this.reset();\n        }\n        reset() {\n            this.available = [];\n            for (let i = this.min; i <= this.max; i++) {\n                this.available.push(i);\n            }\n        }\n        getNext() {\n            if (this.available.length === 0) {\n                this.reset();\n            }\n            const index = Math.floor(Math.random() * this.available.length);\n            const value = this.available[index];\n            this.available.splice(index, 1);\n            return value;\n        }\n    }\n    function _GetRandomIntInRange(min, max) {\n        if (min > max)\n            [min, max] = [max, min];\n        return Math.floor(Math.random() * (max - min + 1)) + min;\n    }\n    let m_idContainerItem = \"\";\n    let m_defidxContainerItem = 0;\n    let m_numOfferCounter = 0;\n    let m_bWrappingUpThisTransaction = false;\n    let m_tmsExpectingXpGrantNotification = 0;\n    CollectionOffers.m_currentOfferId = '';\n    let m_numVolatileNotifications = 0;\n    let m_initialDotsUpdateFinished = false;\n    function _IsFinalOffer() {\n        return (m_numOfferCounter <= 0);\n    }\n    function _CurrentOfferNumber() {\n        return (m_numOfferCounter < 0) ? -m_numOfferCounter : m_numOfferCounter;\n    }\n    let m_signalBars = _GetRandomIntInRange(0, 1);\n    let m_elScreen;\n    let m_elMessagesParent;\n    let m_elYesBtn;\n    let m_elNoBtn;\n    let m_elEndBtn;\n    ;\n    let m_mapUniqueRandoms = {};\n    class MapLineTracker_t {\n        data = {};\n        getCount(s) { return this.data[s] || 0; }\n        incrementCount(s) { return this.data[s] ? ++this.data[s] : (this.data[s] = 1); }\n        async awaitMessageOnce(m) {\n            if (this.incrementCount(m.line) != 1)\n                return false;\n            await _MakeMessage(m);\n            return true;\n        }\n    }\n    ;\n    let m_mapLineTracker = new MapLineTracker_t;\n    const dealerIntroMessage = {\n        line: '#dealer_message_start_',\n        sender: 'dealer',\n        action: () => {\n            _MakeMessage(dealerFirstOffer);\n        }\n    };\n    const dealerReturningToContractMessage = {\n        line: '#dealer_message_resume_',\n        sender: 'dealer',\n        action: () => {\n            _DealerEstablishExistingOffer();\n        }\n    };\n    const dealerFirstOffer = {\n        line: '#dealer_message_first_offer_',\n        sender: 'dealer',\n        action: () => {\n            _DealerSendOffer();\n        }\n    };\n    const dealerNextOffer = {\n        line: '#dealer_message_next_offer_',\n        sender: 'dealer',\n        action: () => {\n            _DealerSendOffer();\n        }\n    };\n    const dealerLastOffer = {\n        line: '#dealer_message_last_offer_',\n        sender: 'dealer',\n    };\n    const dealerEndOffer = {\n        line: '#dealer_message_end_',\n        sender: 'dealer',\n    };\n    const dealerOpenCheckOutMessage = {\n        line: '#dealer_message_open_check_out_',\n        sender: 'dealer',\n        action: async () => {\n            await Async.Delay(.25);\n            _DealerTransitionToPurchaseState();\n        }\n    };\n    const dealerTxnXldBailout = {\n        line: '#dealer_message_txn_xld_bailout_',\n        sender: 'dealer',\n        action: async () => {\n            await Async.Delay(2);\n            _MakeMessage(systemDealerLeave);\n        }\n    };\n    const dealerStatTrak = {\n        line: '#dealer_message_stattrack_',\n        sender: 'dealer'\n    };\n    const dealerFactoryNew = {\n        line: '#dealer_message_factory_new_',\n        sender: 'dealer'\n    };\n    const dealerMinimalWear = {\n        line: '#dealer_message_minimal_wear_',\n        sender: 'dealer'\n    };\n    const dealerCovert = {\n        line: '#dealer_message_covert_',\n        sender: 'dealer'\n    };\n    const dealerClassified = {\n        line: '#dealer_message_classified_',\n        sender: 'dealer'\n    };\n    const dealerRestricted = {\n        line: '#dealer_message_restricted_',\n        sender: 'dealer'\n    };\n    const dealerBattleScarred = {\n        line: '#dealer_message_battle_scarred_',\n        sender: 'dealer'\n    };\n    const dealerUsps = {\n        line: '#dealer_message_usp-s_',\n        sender: 'dealer'\n    };\n    const dealerItemDesc = {\n        line: '#dealer_message_item_desc_',\n        dialogVar: { dialogName: 'flavor-text', dialogText: '' },\n        sender: 'dealer'\n    };\n    const dealerAdditionStatTrak = {\n        line: '#dealer_message_addition_stattrak_',\n        sender: 'dealer'\n    };\n    const dealerAdditionFactoryNew = {\n        line: '#dealer_message_addition_factory_new_',\n        sender: 'dealer'\n    };\n    const dealerOfferLimitMessage = {\n        line: '#dealer_message_set_offer_limit_',\n        sender: 'dealer',\n        action: async () => {\n            await Async.Delay(.5);\n            _ShowMessageOfferLimit();\n        }\n    };\n    const dealerContainerExpired = {\n        line: '#dealer_message_timerexpired_',\n        sender: 'dealer',\n        action: () => {\n            _MakeMessage(systemDealerLeaveContainerDestroy);\n        }\n    };\n    const systemDealerJoin = {\n        line: '#system_dealer_join_chat_0',\n        sender: 'system',\n        action: () => {\n            _OnSystemDealerJoinBootstrap();\n        }\n    };\n    const systemUserRejectOffer = {\n        line: '#system_user_reject_offer_0',\n        sender: 'system',\n        nomarkup: true\n    };\n    const systemDealerLeave = {\n        line: '#system_dealer_left_chat_0',\n        sender: 'system',\n        action: async () => {\n            m_elScreen.FindChildInLayoutFile('id-laptop-connected-icon').SetHasClass('connected', false);\n            m_elScreen.FindChildInLayoutFile('id-laptop-signal-icon').SetHasClass('connected-' + m_signalBars, false);\n            await Async.Delay(1);\n            Close(false);\n        }\n    };\n    const systemDealerLeaveContainerDestroy = {\n        line: '#system_dealer_left_chat_0',\n        sender: 'system',\n        action: async () => {\n            m_elScreen.FindChildInLayoutFile('id-laptop-connected-icon').SetHasClass('connected', true);\n            m_elScreen.FindChildInLayoutFile('id-laptop-signal-icon').SetHasClass('connected-' + m_signalBars, true);\n            await Async.Delay(1);\n            Close(true);\n        }\n    };\n    const systemOfferLimitSetWithBootstrapAction = {\n        line: '#system_user_updated_offer_limit_0',\n        sender: 'system',\n        action: async () => {\n            await ShowDealerOfferLimitAcknowledge(true);\n            const elWaitMessage = _ShowDealerWaitMessageDotDotDot();\n            await Async.Delay(2);\n            (await elWaitMessage).visible = false;\n            _OnSystemDealerJoinBootstrap();\n        }\n    };\n    const systemOfferLimitSet = {\n        line: '#system_user_updated_offer_limit_0',\n        sender: 'system',\n        action: () => {\n            ShowDealerOfferLimitAcknowledge();\n        }\n    };\n    async function ShowDealerOfferLimitAcknowledge(firstTime = false) {\n        let oLimits = JSON.parse(InventoryAPI.GetVolatileLimits());\n        if (oLimits.limit !== 0) {\n            const strLine = !firstTime ? '#dealer_message_limit_' : '#dealer_message_limit_first_time_';\n            await _MakeMessage({ line: strLine, sender: 'dealer' });\n        }\n        else {\n            const strLine = !firstTime ? '#dealer_message_limit_unlimited_' : '#dealer_message_limit_first_time_unlimited_';\n            await _MakeMessage({ line: strLine, sender: 'dealer' });\n        }\n    }\n    function Init(itemId, elScreen) {\n        m_idContainerItem = itemId;\n        m_defidxContainerItem = InventoryAPI.GetItemDefinitionIndex(m_idContainerItem);\n        m_elMessagesParent = elScreen.FindChildInLayoutFile('id-chat-messages');\n        m_elYesBtn = elScreen.FindChildInLayoutFile('id-user-message-yes');\n        m_elNoBtn = elScreen.FindChildInLayoutFile('id-user-message-no');\n        m_elEndBtn = elScreen.FindChildInLayoutFile('id-user-message-end');\n        m_elScreen = elScreen;\n        elScreen.FindChildInLayoutFile('id-laptop-screen-close').SetPanelEvent('onactivate', () => {\n            OffersLaptop.ClosePopUp();\n        });\n        let setName = ItemInfo.GetSet(m_idContainerItem);\n        if (!setName)\n            setName = ItemInfo.GetSet(InventoryAPI.GetLootListItemIdByIndex(m_idContainerItem, 0));\n        m_elMessagesParent.SetDialogVariable('collection', $.Localize('#CSGO_' + setName));\n        _UpdateOfferTimer();\n        _CollectionInfo();\n        _SetTooltips(elScreen);\n        $.RegisterForUnhandledEvent('PanoramaComponent_MyPersona_InventoryUpdated', OnInventoryUpdated);\n        $.RegisterForUnhandledEvent('PanoramaComponent_Store_PurchaseFinalizing', _OnPurchaseFinalizing);\n        $.RegisterForUnhandledEvent('ShowStoreStatusPanel', _ShowStoreStatusPanel);\n        _MakeMessage(systemDealerJoin);\n        elScreen.SetPanelEvent('onactivate', () => { _MakeFingerPrints(elScreen); });\n    }\n    CollectionOffers.Init = Init;\n    function _SetTooltips(elScreen) {\n        elScreen.FindChildInLayoutFile('id-wear-fn').SetPanelEvent('onmouseover', () => { UiToolkitAPI.ShowTextTooltipStyled('id-wear-fn', '#SFUI_InvTooltip_Wear_Amount_0', 'tooltip-offer-wear'); });\n        elScreen.FindChildInLayoutFile('id-wear-fn').SetPanelEvent('onmouseout', () => { UiToolkitAPI.HideTextTooltip(); });\n        elScreen.FindChildInLayoutFile('id-wear-mw').SetPanelEvent('onmouseover', () => { UiToolkitAPI.ShowTextTooltipStyled('id-wear-mw', '#SFUI_InvTooltip_Wear_Amount_1', 'tooltip-offer-wear'); });\n        elScreen.FindChildInLayoutFile('id-wear-mw').SetPanelEvent('onmouseout', () => { UiToolkitAPI.HideTextTooltip(); });\n        elScreen.FindChildInLayoutFile('id-wear-ft').SetPanelEvent('onmouseover', () => { UiToolkitAPI.ShowTextTooltipStyled('id-wear-ft', '#SFUI_InvTooltip_Wear_Amount_2', 'tooltip-offer-wear'); });\n        elScreen.FindChildInLayoutFile('id-wear-ft').SetPanelEvent('onmouseout', () => { UiToolkitAPI.HideTextTooltip(); });\n        elScreen.FindChildInLayoutFile('id-wear-ww').SetPanelEvent('onmouseover', () => { UiToolkitAPI.ShowTextTooltipStyled('id-wear-ww', '#SFUI_InvTooltip_Wear_Amount_3', 'tooltip-offer-wear'); });\n        elScreen.FindChildInLayoutFile('id-wear-ww').SetPanelEvent('onmouseout', () => { UiToolkitAPI.HideTextTooltip(); });\n        elScreen.FindChildInLayoutFile('id-wear-bs').SetPanelEvent('onmouseover', () => { UiToolkitAPI.ShowTextTooltipStyled('id-wear-bs', '#SFUI_InvTooltip_Wear_Amount_4', 'tooltip-offer-wear'); });\n        elScreen.FindChildInLayoutFile('id-wear-bs').SetPanelEvent('onmouseout', () => { UiToolkitAPI.HideTextTooltip(); });\n        elScreen.FindChildInLayoutFile('id-weapon-wear-name-container').SetPanelEvent('onmouseover', () => { UiToolkitAPI.ShowTextTooltipStyled('id-weapon-wear-name-container', '#SFUI_InvTooltip_WearTag', 'tooltip-offer-wear'); });\n        elScreen.FindChildInLayoutFile('id-weapon-wear-name-container').SetPanelEvent('onmouseout', () => { UiToolkitAPI.HideTextTooltip(); });\n        elScreen.FindChildInLayoutFile('id-weapon-wear-rating-container').SetPanelEvent('onmouseover', () => { UiToolkitAPI.ShowTextTooltipStyled('id-weapon-wear-rating-container', '#SFUI_ItemInfo_WearAmount', 'tooltip-offer-wear'); });\n        elScreen.FindChildInLayoutFile('id-weapon-wear-rating-container').SetPanelEvent('onmouseout', () => { UiToolkitAPI.HideTextTooltip(); });\n        m_elScreen.FindChildInLayoutFile('id-laptop-connected-icon').SetPanelEvent('onmouseover', () => {\n            let tooltipText = m_elScreen.FindChildInLayoutFile('id-laptop-connected-icon').BHasClass('connected') ? '#popup_vpn_status_connected' : '#popup_vpn_status_disconnected';\n            UiToolkitAPI.ShowTextTooltipStyled('id-laptop-connected-icon', tooltipText, 'tooltip-laptop-topbar');\n        });\n        elScreen.FindChildInLayoutFile('id-laptop-connected-icon').SetPanelEvent('onmouseout', () => { UiToolkitAPI.HideTextTooltip(); });\n        m_elScreen.FindChildInLayoutFile('id-offer-lootlist-btn').SetPanelEvent('onmouseover', () => { UiToolkitAPI.ShowTextTooltipStyled('id-offer-lootlist-btn', '#collection_xp_tooltip', 'tooltip-offer-wear'); });\n        m_elScreen.FindChildInLayoutFile('id-offer-lootlist-btn').SetPanelEvent('onmouseout', () => { UiToolkitAPI.HideTextTooltip(); });\n        m_elScreen.FindChildInLayoutFile('id-orignal-owner-image').SetPanelEvent('onmouseover', () => { UiToolkitAPI.ShowTextTooltipStyled('id-orignal-owner-image', '#laptop_original_seal_tooltip', 'tooltip-offer-wear'); });\n        m_elScreen.FindChildInLayoutFile('id-orignal-owner-image').SetPanelEvent('onmouseout', () => { UiToolkitAPI.HideTextTooltip(); });\n        m_elScreen.FindChildInLayoutFile('id-offer-zoom_hint').SetPanelEvent('onmouseover', () => { UiToolkitAPI.ShowTextTooltipStyled('id-offer-zoom_hint', '#laptop_zoom_tooltip', 'tooltip-offer-wear'); });\n        m_elScreen.FindChildInLayoutFile('id-offer-zoom_hint').SetPanelEvent('onmouseout', () => { UiToolkitAPI.HideTextTooltip(); });\n        m_elScreen.FindChildInLayoutFile('id-offer-pan_hint').SetPanelEvent('onmouseover', () => { UiToolkitAPI.ShowTextTooltipStyled('id-offer-pan_hint', '#laptop_pan_tooltip', 'tooltip-offer-actions'); });\n        m_elScreen.FindChildInLayoutFile('id-offer-pan_hint').SetPanelEvent('onmouseout', () => { UiToolkitAPI.HideTextTooltip(); });\n        m_elScreen.FindChildInLayoutFile('id-price-tooltip').SetPanelEvent('onmouseover', () => { UiToolkitAPI.ShowTextTooltipStyled('id-price-tooltip', '#laptop_pricing_tooltip', 'tooltip-offer-actions'); });\n        m_elScreen.FindChildInLayoutFile('id-price-tooltip').SetPanelEvent('onmouseout', () => { UiToolkitAPI.HideTextTooltip(); });\n    }\n    function Close(destoryAnim = false) {\n        _TimerUpdateCancel();\n        m_elScreen.FindChildInLayoutFile('laptop-container').RemoveClass('open');\n        OffersLaptop.ClosePopUp(destoryAnim);\n    }\n    CollectionOffers.Close = Close;\n    function _RandomizeLocString(line) {\n        if (line && line.length > 0 && line[0] === '#' && line[line.length - 1] === '_') {\n            if (!m_mapUniqueRandoms.hasOwnProperty(line)) {\n                const urMax = UiToolkitAPI.EnumerateLocalizationStringVariants(line);\n                let ur = new UniqueRandom(0, urMax);\n                m_mapUniqueRandoms[line] = ur;\n            }\n            const nrnd = m_mapUniqueRandoms[line].getNext();\n            return line + nrnd;\n        }\n        return line;\n    }\n    async function _MakeMessage(oMessage) {\n        m_elMessagesParent.SetDialogVariable('user-name', MyPersonaAPI.GetName());\n        if (oMessage.dialogVar !== undefined) {\n            m_elMessagesParent.SetDialogVariable(oMessage.dialogVar?.dialogName, oMessage.dialogVar.dialogText);\n        }\n        let locString = _RandomizeLocString(oMessage.line);\n        let raw_string = $.Localize(locString, m_elMessagesParent);\n        let allMessages = [];\n        if (oMessage.nomarkup) {\n            let message = {\n                text: raw_string,\n                sleepTime: Number(0),\n                sender: oMessage.sender\n            };\n            allMessages.push(message);\n        }\n        else {\n            let curTextIdx = 0;\n            let sleepTime = Number(0);\n            while (curTextIdx < raw_string.length) {\n                let splitPos = raw_string.indexOf('<!--', curTextIdx);\n                if (splitPos > curTextIdx) {\n                    let message = {\n                        text: raw_string.substring(curTextIdx, splitPos),\n                        sleepTime: sleepTime,\n                        sender: oMessage.sender\n                    };\n                    allMessages.push(message);\n                }\n                if (splitPos == -1) {\n                    let message = {\n                        text: raw_string.substring(curTextIdx),\n                        sleepTime: sleepTime,\n                        sender: oMessage.sender\n                    };\n                    allMessages.push(message);\n                    break;\n                }\n                let indexEndOfSleepTime = raw_string.indexOf('-->', splitPos);\n                if (indexEndOfSleepTime == -1)\n                    break;\n                sleepTime = Number(raw_string.substring(splitPos + 4, indexEndOfSleepTime));\n                sleepTime = (sleepTime > 0) ? sleepTime : 0;\n                curTextIdx = indexEndOfSleepTime + 3;\n            }\n        }\n        for (const message of allMessages) {\n            if (message.sleepTime > 0)\n                await Async.Delay(message.sleepTime);\n            OffersLaptop.LaptopSoundStartLooping('UI.Laptop.MessageLoop');\n            await _DisplayMessage(message);\n            OffersLaptop.LaptopSoundStopLooping('UI.Laptop.MessageLoop');\n        }\n        if (oMessage.hasOwnProperty('action') && oMessage.action !== undefined) {\n            await oMessage.action();\n        }\n    }\n    async function _DisplayMessage(message) {\n        const elMessage = $.CreatePanel('Panel', m_elMessagesParent, '');\n        elMessage.BLoadLayoutSnippet(message.sender + '-message');\n        let aWords = message.text.split(' ');\n        let elMessageLabel = elMessage.FindChildInLayoutFile('id-chat-message-label');\n        elMessage.AddClass('show');\n        _HighlightCurrentMessage();\n        elMessageLabel.html = (message.sender !== 'system');\n        if (message.sender === 'dealer') {\n            elMessage.FindChildInLayoutFile('id-chat-message-label-placeholder');\n            elMessage.FindChildInLayoutFile('id-chat-message-label-placeholder').text = message.text;\n            elMessage.FindChildInLayoutFile('avatar-image').SetDefaultImage(\"file://{images}/avatars/arms_dealer.psd\");\n            await Async.Delay(.1);\n            m_elMessagesParent.ScrollToBottom();\n            let displayString = '';\n            for (const word of aWords) {\n                await Async.Delay(.05);\n                displayString = displayString + word + ' ';\n                elMessageLabel.text = displayString;\n            }\n        }\n        else {\n            elMessageLabel.text = message.text;\n            await Async.Delay(.1);\n            m_elMessagesParent.ScrollToBottom();\n        }\n    }\n    async function _OnSystemDealerJoinBootstrap() {\n        let numOffers = InventoryAPI.GetItemAttributeValue(m_idContainerItem, '{uint32}quest points remaining');\n        let oLimits = JSON.parse(InventoryAPI.GetVolatileLimits());\n        if (numOffers == undefined) {\n            m_numOfferCounter = 0;\n            await _MakeMessage(dealerIntroMessage);\n        }\n        else {\n            m_numOfferCounter = numOffers;\n            await _MakeMessage(dealerReturningToContractMessage);\n        }\n        const setting = oLimits.choices.find(item => item.limit === oLimits.limit);\n        m_elScreen.SetDialogVariable('limit', GetLimitString(setting?.limit, setting?.label));\n        m_elScreen.FindChildInLayoutFile('id-offer-limit-setting').SetPanelEvent('onactivate', () => {\n            ShowOfferLimitPopup();\n        });\n        m_elScreen.FindChildInLayoutFile('id-laptop-connected-icon').SetHasClass('connected', true);\n        m_elScreen.FindChildInLayoutFile('id-laptop-signal-icon').SetHasClass('connected-' + m_signalBars, true);\n    }\n    async function _ShowDealerWaitMessageDotDotDot(bPreserveOfferID) {\n        const elWaitMessage = $.CreatePanel('Panel', m_elMessagesParent, '');\n        elWaitMessage.BLoadLayoutSnippet('wait-message');\n        elWaitMessage.FindChildInLayoutFile('avatar-image').SetDefaultImage(\"file://{images}/avatars/arms_dealer.psd\");\n        elWaitMessage.AddClass('show');\n        await Async.Delay(.1);\n        m_elMessagesParent.ScrollToBottom();\n        if (bPreserveOfferID) {\n            await Async.Delay(.1);\n        }\n        else {\n            CollectionOffers.m_currentOfferId = '';\n            m_numVolatileNotifications = 0;\n        }\n        return elWaitMessage;\n    }\n    async function _AwaitOfferItemID(bJustNotificationIsOk) {\n        for (let i = 5; i-- > 0;) {\n            await Async.Delay(1);\n            if (bJustNotificationIsOk && (m_numVolatileNotifications > 0)) {\n                return CollectionOffers.m_currentOfferId ? CollectionOffers.m_currentOfferId : m_idContainerItem;\n            }\n            if (CollectionOffers.m_currentOfferId) {\n                return CollectionOffers.m_currentOfferId;\n            }\n        }\n        UiToolkitAPI.ShowGenericPopupOk($.Localize('#SFUI_SteamConnectionErrorTitle'), $.Localize('#PlayMenu_unavailable_newuser_2_nogcconnection'), '', () => { });\n        Close(false);\n        return '';\n    }\n    async function _ReplaceMessageDotDotDotWithOffer(elWaitMessage) {\n        UpdateCollectionDots();\n        elWaitMessage.FindChildInLayoutFile('id-waiting').visible = false;\n        const OfferItemData = _GetItemData(CollectionOffers.m_currentOfferId);\n        _HighlightCurrentMessage();\n        await _DisplayOfferDownloadMessage(elWaitMessage, OfferItemData);\n        _UpdateWeaponModel(OfferItemData);\n        await _MessageOfferComment(OfferItemData);\n        await Async.Delay(.1);\n        m_elMessagesParent.ScrollToBottom();\n        m_elScreen.FindChildInLayoutFile('id-chat-messages-bg').SetHasClass('show', true);\n        let elUserButtonContainer = m_elScreen.FindChildInLayoutFile('id-user-messages-container');\n        if (!elUserButtonContainer.BHasClass('show')) {\n            elUserButtonContainer.SetHasClass('show', true);\n        }\n        if (_IsFinalOffer()) {\n            elUserButtonContainer.SetDialogVariable('user-response-title', $.Localize('#user_btn_purchase_final_title'));\n        }\n        else {\n            elUserButtonContainer.SetDialogVariable('offer-count', $.Localize('#dealer_offer_' + _CurrentOfferNumber()));\n            elUserButtonContainer.SetDialogVariable('user-response-title', $.Localize('#user_btn_purchase_title', elUserButtonContainer));\n        }\n        _SetUpUserOfferConfirmDeclineBtns(elWaitMessage.FindChildInLayoutFile('id-offer-' + OfferItemData.itemId), OfferItemData);\n    }\n    async function _DealerEstablishExistingOffer() {\n        const elWaitMessage = await _ShowDealerWaitMessageDotDotDot();\n        InventoryAPI.PerformItemCasketTransaction(0, m_idContainerItem, m_idContainerItem);\n        if (!await _AwaitOfferItemID())\n            return;\n        await _ReplaceMessageDotDotDotWithOffer(elWaitMessage);\n    }\n    async function _DealerSendOffer() {\n        let elWaitMessage = await _ShowDealerWaitMessageDotDotDot();\n        InventoryAPI.UseToolWithIntArg(m_idContainerItem, m_idContainerItem, m_numOfferCounter);\n        if (!await _AwaitOfferItemID())\n            return;\n        if (_IsFinalOffer()) {\n            elWaitMessage.RemoveAndDeleteChildren();\n            await _MakeMessage(dealerLastOffer);\n            elWaitMessage = await _ShowDealerWaitMessageDotDotDot(true);\n        }\n        await _ReplaceMessageDotDotDotWithOffer(elWaitMessage);\n    }\n    async function _DealerEndTransaction() {\n        const elWaitMessage = await _ShowDealerWaitMessageDotDotDot();\n        InventoryAPI.UseToolWithIntArg(m_idContainerItem, m_idContainerItem, m_numOfferCounter);\n        m_bWrappingUpThisTransaction = true;\n        if (!await _AwaitOfferItemID(true))\n            return;\n        elWaitMessage.RemoveAndDeleteChildren();\n        await _MakeMessage(dealerEndOffer);\n        await Async.Delay(2.5);\n        await _MakeMessage(systemDealerLeaveContainerDestroy);\n    }\n    async function _DealerTransitionToPurchaseState() {\n        const strPurchaseString = '' + InventoryAPI.GetItemDefinitionIndex(m_idContainerItem) + '(' + m_idContainerItem + ')';\n        StoreAPI.StoreItemPurchase(strPurchaseString);\n    }\n    function _OnPurchaseFinalizing(strTxnID) {\n        m_bWrappingUpThisTransaction = true;\n        const storeStatusMessage = {\n            line: '#dealer_message_purchase_finalizing_0',\n            sender: 'system'\n        };\n        _MakeMessage(storeStatusMessage);\n    }\n    function _ShowStoreStatusPanel(strText, bAllowClose, bCancel, strOkCmd) {\n        if (strText === '#StoreCheckout_TransactionCanceled') {\n            _MakeMessage(dealerTxnXldBailout);\n            return;\n        }\n        if (bCancel)\n            return;\n        if (strText === '#StoreCheckout_TransactionCompleted') {\n            const storeStatusMessage = {\n                line: strText,\n                sender: 'system-success',\n                action: () => {\n                    _EnableActionButtons(false);\n                }\n            };\n            _MakeMessage(storeStatusMessage);\n            return;\n        }\n        const storeStatusMessage = {\n            line: strText,\n            sender: 'system-steam',\n            action: () => {\n                const bCanRetryPurchase = !m_bWrappingUpThisTransaction &&\n                    (strText !== '#StoreCheckout_PurchaseExpiredItemsUnavailable') &&\n                    (strText !== '#StoreCheckout_CompleteButUnfinalized');\n                _EnableActionButtons(bCanRetryPurchase);\n            }\n        };\n        _MakeMessage(storeStatusMessage);\n    }\n    async function _MessageOfferComment(OfferItemData) {\n        if (OfferItemData.rarity === 6 || OfferItemData.rarity === 5) {\n            if (OfferItemData.rarity === 6) {\n                await _MakeMessage(dealerCovert);\n            }\n            else if (OfferItemData.rarity === 5) {\n                await _MakeMessage(dealerClassified);\n            }\n            if (OfferItemData.statTrack) {\n                await _MakeMessage(dealerAdditionStatTrak);\n            }\n            else if (OfferItemData.numWear === 0) {\n                await _MakeMessage(dealerAdditionFactoryNew);\n            }\n        }\n        else if (OfferItemData.numWear === 0) {\n            await _MakeMessage(dealerFactoryNew);\n        }\n        else if (OfferItemData.statTrack) {\n            await _MakeMessage(dealerStatTrak);\n        }\n        else if (OfferItemData.numWear === 1 && _RollChance(50)\n            && (await m_mapLineTracker.awaitMessageOnce(dealerMinimalWear))) {\n            ;\n        }\n        else if (OfferItemData.rarity === 4 && _RollChance(50)\n            && (await m_mapLineTracker.awaitMessageOnce(dealerRestricted))) {\n            ;\n        }\n        else if (OfferItemData.numWear === 4 && _RollChance(50)\n            && (await m_mapLineTracker.awaitMessageOnce(dealerBattleScarred))) {\n            ;\n        }\n        else if (_RollChance(10) && (0 == m_mapLineTracker.getCount(dealerItemDesc.line))) {\n            if (InventoryAPI.GetItemDescription(OfferItemData.itemId, '')) {\n                if (dealerItemDesc.dialogVar !== undefined) {\n                    const descString = InventoryAPI.GetItemDescription(OfferItemData.itemId, '');\n                    const offFlavor = descString.indexOf(\"<i>\");\n                    const endFlavor = descString.indexOf(\"</i>\", offFlavor);\n                    if (offFlavor != -1 && endFlavor != -1 && endFlavor > offFlavor) {\n                        dealerItemDesc.dialogVar.dialogText = descString.substring(offFlavor, endFlavor + 4);\n                        if (dealerItemDesc.dialogVar.dialogText.indexOf('<!--') == -1) {\n                            m_mapLineTracker.incrementCount(dealerItemDesc.line);\n                            await _MakeMessage(dealerItemDesc);\n                        }\n                    }\n                }\n            }\n        }\n    }\n    function _GetItemData(itemId) {\n        const OfferItemData = {\n            itemId: itemId,\n            defName: InventoryAPI.GetItemDefinitionName(itemId),\n            rarity: InventoryAPI.GetItemRarity(itemId),\n            rarityName: InventoryAPI.GetItemType(itemId),\n            rarityColor: InventoryAPI.GetItemRarityColor(itemId),\n            itemName: InventoryAPI.GetItemName(itemId),\n            statTrack: (InventoryAPI.GetItemAttributeValue(itemId, \"kill eater\")) !== undefined ? true : false,\n            itemType: ItemInfo.IsWeapon(itemId) ? 'weapon' : ItemInfo.IsKeychain(itemId) ? 'keychain' : 'sticker',\n            slot: InventoryAPI.GetLoadoutCategory(itemId),\n            numWear: InventoryAPI.GetWear(itemId),\n            price: StoreAPI.GetStoreItemEmbeddedAttributePrice(itemId, 1, '')\n        };\n        return OfferItemData;\n    }\n    function _HighlightCurrentMessage() {\n        m_elMessagesParent.Children().forEach((element, index) => {\n            element.SetHasClass('current-message', index == (m_elMessagesParent.Children().length - 1));\n        });\n    }\n    function _DisplayOfferDownloadMessage(elWaitMessage, OfferItemData) {\n        const elOffer = $.CreatePanel('Panel', elWaitMessage.FindChildInLayoutFile('id-message'), 'id-offer-' + OfferItemData.itemId);\n        elOffer.BLoadLayoutSnippet('dealer-offer');\n        elOffer.FindChildInLayoutFile('id-offer-message-image').itemid = OfferItemData.itemId;\n        _SetRarityColor(elOffer.FindChildInLayoutFile('id-offer-message-rarity'), OfferItemData.rarityColor);\n        _SetRarityColor(m_elScreen.FindChildInLayoutFile('id-chat-messages-bg'), OfferItemData.rarityColor);\n        elOffer.AddClass('glow-color-rarity-' + OfferItemData.rarity);\n        elOffer.SetDialogVariable('offer-count', $.Localize('#EOM_Position_' + _CurrentOfferNumber()));\n        elOffer.FindChildInLayoutFile('id-offer-desc').text =\n            _IsFinalOffer() ?\n                $.Localize('#dealer_offer_attachment_final', elOffer) :\n                $.Localize('#dealer_offer_received_count', elOffer);\n        elOffer.SetDialogVariable('item-name', OfferItemData.itemName);\n        elOffer.SetDialogVariable('item-rarity', $.Localize('#SFUI_InvTooltip_Wear_Amount_' + OfferItemData.numWear));\n        elOffer.SetDialogVariable('offer-price', OfferItemData.price);\n        elOffer.SetDialogVariable('offer-status', $.Localize('#dealer_offer_attachment_status-price', elOffer));\n        elOffer.AddClass('show');\n    }\n    function _SetRarityColor(elPanel, rarityColor) {\n        if (rarityColor) {\n            elPanel.style.washColor = rarityColor;\n        }\n    }\n    let m_timerHandler = null;\n    function _UpdateOfferTimer() {\n        _TimerUpdateCancel();\n        const elTimer = m_elScreen.FindChildInLayoutFile('id-offer-expiration');\n        if (!m_idContainerItem || m_bWrappingUpThisTransaction) {\n            elTimer.SetDialogVariable('expiration-time', ' ');\n            return;\n        }\n        const expirationDate = InventoryAPI.GetExpirationDate(m_idContainerItem);\n        let oLocData = FormatText.FormatExpirationToDDHHMMSSWithSymbolSeperator(expirationDate);\n        _SetBatteryState(oLocData, expirationDate);\n        if (oLocData.isExpired || !InventoryAPI.IsValidItemID(m_idContainerItem)) {\n            elTimer.SetDialogVariable('expiration-time', $.Localize('#op_pass_status_operation_over'));\n            return;\n        }\n        elTimer.SetDialogVariable('expiration-time', oLocData.time);\n        elTimer.FindChildInLayoutFile('id-offer-expiration-timer').SetPanelEvent('onmouseover', () => {\n            UiToolkitAPI.ShowTextTooltipStyled('id-offer-expiration-timer', '#laptop_expiration_tooltip', 'tooltip-offer-actions');\n        });\n        elTimer.FindChildInLayoutFile('id-offer-expiration-timer').SetPanelEvent('onmouseout', () => {\n            UiToolkitAPI.HideTextTooltip();\n        });\n        m_timerHandler = $.Schedule(1, _UpdateOfferTimer);\n    }\n    function _SetBatteryState(oLocData, expirationDate) {\n        const elBattery = m_elScreen.FindChildInLayoutFile('id-laptop-battery');\n        const barPercentage = oLocData.isExpired ? 18 : Math.floor(Math.max(18, Math.min(oLocData.seconds / 2592, 100)));\n        elBattery.SwitchClass('state', oLocData.isExpired ? 'red' : (barPercentage < 40) ? 'yellow' : 'green');\n        elBattery.style.width = barPercentage.toString() + '%;';\n        elBattery.SetDialogVariableInt('percent', barPercentage);\n        m_elScreen.FindChildInLayoutFile('id-laptop-battery-container').SetPanelEvent('onmouseover', () => {\n            let tooltipText = $.Localize('#laptop_battery_tooltip', elBattery);\n            UiToolkitAPI.ShowTextTooltipStyled('id-laptop-battery-container', tooltipText, 'tooltip-laptop-topbar');\n        });\n        m_elScreen.FindChildInLayoutFile('id-laptop-battery-container').SetPanelEvent('onmouseout', () => { UiToolkitAPI.HideTextTooltip(); });\n    }\n    function _TimerUpdateCancel() {\n        if (m_timerHandler !== null) {\n            $.CancelScheduled(m_timerHandler);\n            m_timerHandler = null;\n        }\n    }\n    function _EnableActionButtons(bEnable = false) {\n        if (m_bWrappingUpThisTransaction)\n            bEnable = false;\n        m_elYesBtn.enabled = bEnable;\n        m_elNoBtn.enabled = bEnable;\n        m_elEndBtn.enabled = bEnable;\n        m_elScreen.FindChildInLayoutFile('id-offer-limit-setting').enabled = bEnable;\n        m_elScreen.FindChildInLayoutFile('id-price-tooltip').SetHasClass('faded', !bEnable);\n    }\n    let _m_savedOffer = null;\n    let _m_savedOfferItemData = null;\n    function _SetUpUserOfferConfirmDeclineBtns(elOffer, OfferItemData) {\n        _m_savedOffer = elOffer;\n        _m_savedOfferItemData = OfferItemData;\n        const numPaidAlready = 0;\n        let payPrice = OfferItemData.price;\n        m_elYesBtn.SetDialogVariable('price', payPrice);\n        m_elYesBtn.visible = true;\n        m_elNoBtn.visible = !_IsFinalOffer() && (numPaidAlready === 0);\n        m_elEndBtn.visible = _IsFinalOffer() && (numPaidAlready === 0);\n        m_elScreen.FindChildInLayoutFile('id-offer-limit-setting').visible = (numPaidAlready === 0);\n        m_elScreen.FindChildInLayoutFile('id-price-tooltip').visible = (numPaidAlready === 0);\n        if (m_elYesBtn.visible) {\n            const btnYesSettings = {\n                btn: m_elYesBtn,\n                tooltip: '#user_btn_purchase_desc_purchase',\n                locString: $.Localize(_RandomizeLocString('#user_btn_accept_'), m_elYesBtn),\n                tooltipStyle: 'tooltip-offer-actions',\n                loopingSound: 'UI.Laptop.ButtonFillLoop',\n                timerCompleteAction: () => {\n                    _EnableActionButtons(false);\n                    _MakeMessage(dealerOpenCheckOutMessage);\n                    OffersLaptop.LaptopSoundPlayOnce('UI.Laptop.Drop.Purchased');\n                }\n            };\n            HoldButton.SetupButton(btnYesSettings);\n        }\n        if (m_elEndBtn.visible) {\n            const btnEndSettings = {\n                btn: m_elEndBtn,\n                tooltip: '#user_btn_purchase_desc_end',\n                locString: $.Localize('#user_btn_end'),\n                tooltipStyle: 'tooltip-offer-actions',\n                loopingSound: 'UI.Laptop.ButtonFillLoop',\n                timerCompleteAction: () => {\n                    _EnableActionButtons(false);\n                    _DealerEndTransaction();\n                }\n            };\n            HoldButton.SetupButton(btnEndSettings);\n        }\n        if (m_elNoBtn.visible) {\n            const btnNoSettings = {\n                btn: m_elNoBtn,\n                tooltip: '#user_btn_purchase_desc_continue',\n                locString: $.Localize(_IsFinalOffer() ? '#user_btn_decline' : _RandomizeLocString('#user_btn_next_'), m_elNoBtn),\n                tooltipStyle: 'tooltip-offer-actions',\n                loopingSound: 'UI.Laptop.ButtonFillLoop',\n                timerCompleteAction: () => {\n                    _EnableActionButtons(false);\n                    elOffer.SetHasClass('rejected', true);\n                    elOffer.SetDialogVariable('offer-status', $.Localize('#dealer_offer_attachment_status-declined-price', elOffer));\n                    elOffer.FindChildInLayoutFile('id-offer-desc').text = $.Localize('#dealer_offer_attachment_status-declined', elOffer);\n                    m_elScreen.FindChildInLayoutFile('id-offer-preview-panel-container').SetHasClass('show', false);\n                    m_elScreen.FindChildInLayoutFile('id-weapon-wear-rating-pointer').style.transform = 'translateX(100%) translateY(3px) scaleY(-1);';\n                    m_elScreen.FindChildInLayoutFile('id-chat-messages-bg').SetHasClass('show', false);\n                    OffersLaptop.LaptopSoundPlayOnce('UI.Laptop.Drop.Discarded');\n                    const elModel = m_elScreen.FindChildInLayoutFile('id-offer-preview-panel');\n                    if (elModel) {\n                        elModel.DeleteAsync(.25);\n                    }\n                    _MakeMessage(systemUserRejectOffer);\n                    _MakeMessage(dealerNextOffer);\n                }\n            };\n            HoldButton.SetupButton(btnNoSettings);\n        }\n        _EnableActionButtons(numPaidAlready === 0);\n    }\n    function OnInventoryUpdated() {\n        if (m_bWrappingUpThisTransaction)\n            return;\n        if (InventoryAPI.IsValidItemID(m_idContainerItem))\n            return;\n        _UpdateOfferTimer();\n        m_bWrappingUpThisTransaction = true;\n        m_idContainerItem = '';\n        _EnableActionButtons(false);\n        m_elEndBtn.enabled = false;\n        _MakeMessage(dealerContainerExpired);\n    }\n    CollectionOffers.OnInventoryUpdated = OnInventoryUpdated;\n    function OnItemCustomizationNotification(numericType, szType, itemid) {\n        if (szType === 'xpgrant' && m_tmsExpectingXpGrantNotification) {\n            m_tmsExpectingXpGrantNotification = 0;\n            _XpCollectionPopup();\n            UiToolkitAPI.ShowCustomLayoutPopupParameters('', 'file://{resources}/layout/popups/popup_acknowledge_xpgrant.xml', 'none');\n            return;\n        }\n        if (numericType !== 1012 || !szType || !szType.startsWith(\"casket_contents\"))\n            return;\n        if (itemid !== m_idContainerItem)\n            return;\n        ++m_numVolatileNotifications;\n        let numOffers = InventoryAPI.GetItemAttributeValue(m_idContainerItem, '{uint32}quest points remaining');\n        if (numOffers === undefined)\n            m_numOfferCounter = 0;\n        else {\n            m_numOfferCounter = numOffers;\n        }\n        InventoryAPI.SetInventorySortAndFilters('inv_sort_age', false, \"casketcontents:\" + m_idContainerItem, '', '');\n        const count = InventoryAPI.GetInventoryCount();\n        const offerItemID = (count && (count > 0)) ? InventoryAPI.GetInventoryItemIDByIndex(0) : \"\";\n        if (!offerItemID)\n            return;\n        if (!InventoryAPI.IsValidItemID(offerItemID))\n            return;\n        CollectionOffers.m_currentOfferId = offerItemID;\n    }\n    CollectionOffers.OnItemCustomizationNotification = OnItemCustomizationNotification;\n    function _UpdateWeaponModel(OfferItemData) {\n        let cameraData = XpShopWeaponCameraSettings.CameraSettings.find(({ type }) => type === OfferItemData.defName);\n        let cameraSuffix = cameraData !== undefined ? cameraData.camera : '0';\n        let camera = 'camera_' + OfferItemData.itemType + '_' + cameraSuffix;\n        let elModel = m_elScreen.FindChildInLayoutFile('id-offer-preview-panel');\n        let slot = InventoryAPI.GetDefaultSlot(OfferItemData.itemId);\n        let rotationDeg = slot === 'clothing_hands' ? 0 : 360;\n        let rotationXAmount = slot === 'clothing_hands' ? 0 : 30;\n        let rotationYAmount = slot === 'clothing_hands' ? 0 : 20;\n        let rotationPeriod = slot === 'clothing_hands' ? 0 : 16;\n        if (!elModel) {\n            elModel = _MakeMapItemPreviewPanel(\"ui/xpshop_item\", !(slot === 'clothing_hands'));\n            m_elScreen.defaultfocus = 'id-offer-preview-panel';\n        }\n        m_elScreen.FindChildInLayoutFile('id-offer-camera-hints').visible = !(slot === 'clothing_hands');\n        elModel.SetRotationLimits(rotationDeg, rotationDeg);\n        elModel.SetAutoRotateAmount(rotationXAmount, rotationYAmount);\n        elModel.SetAutoRotatePeriod(rotationPeriod, rotationPeriod);\n        elModel.SetActiveItem(0);\n        elModel.SetItemItemId(OfferItemData.itemId, '');\n        elModel.SetCamera(camera);\n        if (elModel.PanZoomEnabled()) {\n            elModel.SetAcceptsFocus(true);\n            elModel.ResetPanZoom();\n            elModel.SetFocus();\n        }\n        m_elScreen.FindChildInLayoutFile('id-offer-preview-panel-container').SetHasClass('show', true);\n        elModel.SetCSMSplitPlane0DistanceOverride(85.0);\n        _UpdateModelData(OfferItemData);\n    }\n    function _UpdateModelData(OfferItemData) {\n        let elParent = m_elScreen.FindChildInLayoutFile('id-offer-preview-panel-info');\n        let setName = ItemInfo.GetSet(OfferItemData.itemId);\n        DecodeText.Init(OfferItemData.itemName, elParent.FindChildInLayoutFile('id-offer-item-name-container'), 'window__weapon-info__name-letter');\n        DecodeText.Init(OfferItemData.rarityName, elParent.FindChildInLayoutFile('id-offer-item-rarity-container'), 'window__weapon-info__name-letter');\n        elParent.FindChildInLayoutFile('id-offer-item-rarity-container').style.backgroundColor = OfferItemData.rarityColor;\n        _SetRarityColor(m_elScreen.FindChildInLayoutFile('id-offer-preview-glow'), OfferItemData.rarityColor);\n        _SetRarityColor(m_elScreen.FindChildInLayoutFile('id-offer-preview-gradient'), OfferItemData.rarityColor);\n        const certData = InventoryAPI.GetItemCertificateInfo(OfferItemData.itemId);\n        const aCertData = certData.split(\"\\n\");\n        let elCollectionImage = m_elScreen.FindChildInLayoutFile('id-offer-preview-collection-icon');\n        elCollectionImage.itemid = OfferItemData.itemId;\n        IconUtil.SetupFallbackItemSetIcon(elCollectionImage, setName);\n        IconUtil.SetItemSetSVGImage(elCollectionImage, setName);\n        for (let i = 0; i < aCertData.length - 1; i++) {\n            if (i % 2 == 0) {\n                if (i < 5) {\n                    let elCertContainer = m_elScreen.FindChildInLayoutFile('id-offer-cert-info');\n                    let elCertLine = elCertContainer.FindChildInLayoutFile('item-cert-' + i);\n                    if (!elCertLine) {\n                        elCertLine = $.CreatePanel('Panel', elCertContainer, 'item-cert-' + i);\n                        elCertLine.BLoadLayoutSnippet('cert-row');\n                    }\n                    elCertLine.SetDialogVariable('cert_title', aCertData[i] + ' : ');\n                    elCertLine.SetDialogVariable('cert_desc', aCertData[i + 1]);\n                }\n                if (i === 6) {\n                    DecodeText.Init(aCertData[i + 1], (m_elScreen.FindChildInLayoutFile('id-weapon-wear-rating-container')), '');\n                    const elPointer = m_elScreen.FindChildInLayoutFile('id-weapon-wear-rating-pointer');\n                    const pointerOffset = (elPointer.actuallayoutwidth / 2) / elPointer.actualuiscale_x;\n                    elPointer.style.transform = 'translateX(' + ((400 * (parseFloat(aCertData[i + 1]))) - pointerOffset) + 'px) translateY(2px) scaleY(-1)';\n                }\n                if (i === 8) {\n                    DecodeText.Init(aCertData[i + 1], (m_elScreen.FindChildInLayoutFile('id-weapon-wear-name-container')), '');\n                }\n            }\n        }\n        m_elScreen.FindChildInLayoutFile('id-offer-preview-inspect-btn').SetPanelEvent('onactivate', () => {\n            const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('', 'file://{resources}/layout/popups/popup_inventory_inspect.xml');\n            let oSettings = {\n                item_id: OfferItemData.itemId,\n                inspect_only: true,\n                hide_all_action_items: true\n            };\n            elPanel.Data().oSettings = oSettings;\n        });\n        switch (OfferItemData.rarity) {\n            case 3:\n                OffersLaptop.LaptopSoundPlayOnce('UI.Laptop.Drop.Blue');\n                break;\n            case 4:\n                OffersLaptop.LaptopSoundPlayOnce('UI.Laptop.Drop.Purple');\n                break;\n            case 5:\n                OffersLaptop.LaptopSoundPlayOnce('UI.Laptop.Drop.Pink');\n                break;\n            case 6:\n                OffersLaptop.LaptopSoundPlayOnce('UI.Laptop.Drop.Red');\n                break;\n        }\n    }\n    function _MakeMapItemPreviewPanel(mapName, isGloves) {\n        return $.CreatePanel('MapItemPreviewPanel', m_elScreen.FindChildInLayoutFile('id-offer-preview-panel-container'), 'id-offer-preview-panel', {\n            class: 'window__offer__preview-panel',\n            \"require-composition-layer\": \"true\",\n            'transparent-background': true,\n            'disable-depth-of-field': true,\n            camera: 'default',\n            player: \"false\",\n            map: mapName,\n            initial_entity: 'item',\n            active_item_idx: 0,\n            mouse_rotate: \"true\",\n            rotation_limit_x: \"0\",\n            rotation_limit_y: \"0\",\n            auto_rotate_x: \"0\",\n            auto_rotate_y: \"0\",\n            auto_rotate_period_x: \"0\",\n            auto_rotate_period_y: \"0\",\n            auto_recenter: true,\n            panzoom_enabled: isGloves,\n            tabindex: \"auto\",\n            selectionpos: \"auto\",\n            hittest: \"true\",\n            hide_while_waiting_for_composite_materials: \"false\"\n        });\n    }\n    let m_fingerPrintCount = 0;\n    function _MakeFingerPrints(elPanel) {\n        const mousePosition = $.MousePosition();\n        const panelPosition = m_elScreen.FindChildInLayoutFile('id-laptop-finger-prints').GetPositionWithinWindow();\n        panelPosition.x = panelPosition.x / m_elScreen.actualuiscale_x;\n        panelPosition.y = panelPosition.y / m_elScreen.actualuiscale_y;\n        mousePosition.x = mousePosition.x / m_elScreen.actualuiscale_x;\n        mousePosition.y = mousePosition.y / m_elScreen.actualuiscale_y;\n        const mouseInPanelPosition = { x: mousePosition.x - panelPosition.x, y: mousePosition.y - panelPosition.y };\n        if (m_fingerPrintCount >= 40) {\n            m_fingerPrintCount = 0;\n        }\n        let elImage = m_elScreen.FindChildInLayoutFile('id-laptop-finger-prints').FindChild('finger-' + m_fingerPrintCount);\n        if (!elImage) {\n            elImage = $.CreatePanel('Image', m_elScreen.FindChildInLayoutFile('id-laptop-finger-prints'), 'finger-' + m_fingerPrintCount, { hittest: 'false' });\n            elImage.SetHasClass('finger-print', true);\n            m_fingerPrintCount++;\n            elImage.style.x = mouseInPanelPosition.x + 'px';\n            elImage.style.y = mouseInPanelPosition.y + 'px';\n            const rotate = _GetRandomIntInRange(-30, 25);\n            const opacity = _GetRandomIntInRange(2, 5) / 100;\n            elImage.style.transform = 'translateY(128px) translateX(-64px) rotateZ(' + rotate + 'deg);';\n            elImage.style.opacity = opacity.toString();\n        }\n        else {\n            elImage.style.x = mouseInPanelPosition.x + 'px';\n            elImage.style.y = mouseInPanelPosition.y + 'px';\n            const rotate = _GetRandomIntInRange(-30, 25);\n            elImage.style.transform = 'translateY(128px) translateX(-64px) rotateZ(' + rotate + 'deg);';\n        }\n        m_fingerPrintCount++;\n    }\n    function _RollChance(chancePercent) {\n        if (chancePercent <= 0)\n            return false;\n        if (chancePercent >= 100)\n            return true;\n        const roll = Math.random() * 100;\n        return roll < chancePercent;\n    }\n    function _CollectionInfo() {\n        const elCollectionImage = m_elScreen.FindChildInLayoutFile('id-offer-collection-icon');\n        const collectionName = InventoryAPI.GetSet(InventoryAPI.GetLootListItemIdByIndex(m_idContainerItem, 0));\n        m_elScreen.SetDialogVariable('collection-name', $.Localize('#CSGO_' + collectionName));\n        IconUtil.SetupFallbackItemSetIcon(elCollectionImage, collectionName);\n        IconUtil.SetItemSetSVGImage(elCollectionImage, collectionName);\n    }\n    function UpdateCollectionDots() {\n        m_elScreen.FindChildInLayoutFile('id-offer-collection-progress').SetHasClass('show', true);\n        const oHistoricData = InventoryAPI.GetCacheTypeElementJSOByIndex('VolatileItemOffer', InventoryAPI.GetCacheTypeElementIndexByKey('VolatileItemOffer', m_defidxContainerItem));\n        let count = InventoryAPI.GetLootListItemsCount(m_idContainerItem);\n        const elParent = m_elScreen.FindChildInLayoutFile('id-offer-lootlist-btn');\n        elParent.SetPanelEvent('onactivate', () => {\n            _MakeFingerPrints(m_elScreen);\n            _XpCollectionPopup();\n        });\n        for (let i = 0; i < count; i++) {\n            const itemId = InventoryAPI.GetLootListItemIdByIndex(m_idContainerItem, i);\n            const rarityNum = InventoryAPI.GetItemRarity(itemId);\n            let raritySection = elParent.FindChildInLayoutFile('rarity-btn-' + rarityNum);\n            if (!raritySection) {\n                raritySection = $.CreatePanel('Panel', elParent, 'rarity-btn-' + rarityNum, { class: 'offer-collection__lootlist' });\n            }\n            let elItem = raritySection.FindChildInLayoutFile(itemId);\n            if (!elItem) {\n                elItem = $.CreatePanel(\"Panel\", raritySection, itemId);\n                elItem.BLoadLayoutSnippet('offer-collection-item');\n                _SetRarityColor(elItem, (rarityNum === 0) ? '#ffd700' : InventoryAPI.GetItemRarityColor(itemId));\n            }\n            const iidCheckHistoricData = (rarityNum === 0) ? InventoryAPI.GetFauxItemIDFromDefAndPaintIndexUB1(m_defidxContainerItem, 1, 3) : itemId;\n            const bSeenInHistoricData = (oHistoricData && oHistoricData.faux_itemid.includes(iidCheckHistoricData)) ? true : false;\n            if (m_initialDotsUpdateFinished && !elItem.BHasClass('seen') && bSeenInHistoricData) {\n                elItem.SetHasClass('seen-anim', bSeenInHistoricData);\n            }\n            elItem.SetHasClass('seen', bSeenInHistoricData);\n        }\n        if (!m_initialDotsUpdateFinished) {\n            m_initialDotsUpdateFinished = true;\n        }\n    }\n    function _XpCollectionPopup() {\n        m_elScreen.FindChildInLayoutFile('id-popup-in-screen').SetHasClass('show-lootlist', true);\n        m_elScreen.FindChildInLayoutFile('id-close-popup-in-screen').SetPanelEvent('onactivate', () => CloseInScreenPopup('show-lootlist'));\n        const oHistoricData = InventoryAPI.GetCacheTypeElementJSOByIndex('VolatileItemOffer', InventoryAPI.GetCacheTypeElementIndexByKey('VolatileItemOffer', m_defidxContainerItem));\n        const oClaimedData = InventoryAPI.GetCacheTypeElementJSOByIndex('VolatileItemClaimedRewards', InventoryAPI.GetCacheTypeElementIndexByKey('VolatileItemClaimedRewards', m_defidxContainerItem));\n        const elParent = m_elScreen.FindChildInLayoutFile('id-offer-xp-lootlist');\n        let count = InventoryAPI.GetLootListItemsCount(m_idContainerItem);\n        let iCurrentRarity = -1;\n        let itemsInRarityTier = 0;\n        let itemsSeenInRarityTier = 0;\n        for (let i = 0; i < count; i++) {\n            const itemId = InventoryAPI.GetLootListItemIdByIndex(m_idContainerItem, i);\n            const rarityNum = InventoryAPI.GetItemRarity(itemId);\n            let raritySection = elParent.FindChildInLayoutFile('rarity-' + rarityNum);\n            if (!raritySection) {\n                raritySection = $.CreatePanel('Panel', elParent, 'rarity-' + rarityNum);\n                raritySection.BLoadLayoutSnippet('lootlist-section');\n            }\n            if (iCurrentRarity != rarityNum) {\n                iCurrentRarity = rarityNum;\n                itemsInRarityTier = 0;\n                itemsSeenInRarityTier = 0;\n                raritySection.SetDialogVariableInt('seen', 0);\n            }\n            let raritySectionList = raritySection.FindChild('id-lootlist-items');\n            let elItem = elParent.FindChildInLayoutFile('item-xp-list-' + itemId);\n            if (!elItem) {\n                elItem = $.CreatePanel('Panel', raritySectionList, 'item-xp-list-' + itemId);\n                elItem.BLoadLayoutSnippet('lootlist-xp-item');\n                elItem.SetPanelEvent('onactivate', () => {\n                    $.DispatchEvent(\"LootlistItemPreview\", itemId, InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(m_defidxContainerItem, 0) +\n                        ',' + '');\n                });\n                elItem.enabled = rarityNum !== 0;\n            }\n            const iidCheckHistoricData = (rarityNum === 0) ? InventoryAPI.GetFauxItemIDFromDefAndPaintIndexUB1(m_defidxContainerItem, 1, 3) : itemId;\n            const bSeenInHistoricData = (oHistoricData && oHistoricData.faux_itemid.includes(iidCheckHistoricData)) ? true : false;\n            elItem.SetHasClass('seen', bSeenInHistoricData);\n            if (bSeenInHistoricData) {\n                raritySection.SetDialogVariableInt('seen', ++itemsSeenInRarityTier);\n            }\n            raritySection.SetDialogVariableInt('total', ++itemsInRarityTier);\n            _SetRarityColor(elItem.FindChildInLayoutFile('id-lootlist-xp-rarity'), (rarityNum === 0) ? '#ffd700' : InventoryAPI.GetItemRarityColor(itemId));\n            elItem.SetDialogVariable('loot-name', (rarityNum === 0) ? $.Localize(InventoryAPI.GetLootListUnusualItemName(m_idContainerItem)) : InventoryAPI.GetItemName(itemId));\n            let btn = raritySection.FindChildInLayoutFile('id-lootlist-xp-claim');\n            if (btn) {\n                const iClaimRewardID = (rarityNum === 0) ? 99 : rarityNum;\n                const bClaimed = (oClaimedData && oClaimedData.reward.includes(iClaimRewardID)) ? true : false;\n                const bAllowClaimingXP = !bClaimed && (itemsSeenInRarityTier == itemsInRarityTier);\n                btn.enabled = bAllowClaimingXP && (itemsSeenInRarityTier == itemsInRarityTier);\n                btn.text = $.Localize(bClaimed ? '#popup_lootlist_claim_ok' : '#popup_lootlist_claim_xp', btn);\n                btn.SetPanelEvent('onactivate', () => {\n                    if (!bAllowClaimingXP)\n                        return;\n                    if (!FriendsListAPI.GetFriendPrimeEligible(MyPersonaAPI.GetXuid())) {\n                        UiToolkitAPI.ShowCustomLayoutPopup('prime_status', 'file://{resources}/layout/popups/popup_prime_status.xml');\n                        return;\n                    }\n                    if (FriendsListAPI.GetFriendLevel(MyPersonaAPI.GetXuid()) >= InventoryAPI.GetMaxLevel()) {\n                        const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('', 'file://{resources}/layout/popups/popup_inventory_inspect.xml');\n                        let oSettings = {\n                            item_id: '0',\n                            show_work_type_warning: false,\n                            work_type: 'prestigecheck'\n                        };\n                        elPanel.Data().oSettings = oSettings;\n                        return;\n                    }\n                    if (m_tmsExpectingXpGrantNotification && (Date.now() - m_tmsExpectingXpGrantNotification < 1500))\n                        return;\n                    m_tmsExpectingXpGrantNotification = Date.now();\n                    InventoryAPI.ClaimVolatileReward(m_defidxContainerItem, iClaimRewardID);\n                    btn.enabled = false;\n                    btn.text = $.Localize('#popup_lootlist_claim_ww', btn);\n                });\n            }\n        }\n    }\n    async function _ShowMessageOfferLimit() {\n        const elMessage = $.CreatePanel('Panel', m_elMessagesParent, '');\n        elMessage.BLoadLayoutSnippet('interaction-offer-limit-message');\n        elMessage.AddClass('show');\n        const oSettings = {\n            parentPanel: elMessage.FindChildInLayoutFile('id-interaction-list'),\n            buttonClass: 'message-interaction__text-button',\n            group: 'offer-limit-message',\n            namePrefix: 'id-limit-message',\n            isContextMenu: false\n        };\n        MakeOfferLimitRadioButton(oSettings);\n        await Async.Delay(.1);\n        m_elMessagesParent.ScrollToBottom();\n        return elMessage;\n    }\n    function ShowOfferLimitPopup() {\n        m_elScreen.FindChildInLayoutFile('id-popup-in-screen').SetHasClass('show-settings', true);\n        m_elScreen.FindChildInLayoutFile('id-close-popup-in-screen').SetPanelEvent('onactivate', () => CloseInScreenPopup('show-settings'));\n        const oSettings = {\n            parentPanel: m_elScreen.FindChildInLayoutFile('id-offer-settings'),\n            buttonClass: 'popup-offers-setting__text-button',\n            group: 'offer-limit',\n            namePrefix: 'id-limit-popup',\n            isContextMenu: true\n        };\n        MakeOfferLimitRadioButton(oSettings);\n    }\n    function MakeOfferLimitRadioButton(oSetting) {\n        let oLimits = JSON.parse(InventoryAPI.GetVolatileLimits());\n        for (let i = 0; i < oLimits.choices.length; i++) {\n            let elButton = oSetting.parentPanel.FindChild(oSetting.namePrefix + oLimits.choices[i].limit);\n            if (!elButton) {\n                elButton = $.CreatePanel('RadioButton', oSetting.parentPanel, oSetting.namePrefix + oLimits.choices[i].limit, {\n                    class: oSetting.buttonClass,\n                    group: 'offer-limit',\n                    html: 'true',\n                    text: '{s:setting-label}'\n                });\n                elButton.SetDialogVariable('limit-setting', oLimits.choices[i]?.label);\n                const locString = (oLimits.choices[i].limit !== 0) ?\n                    $.Localize(_RandomizeLocString('#user_message_limit_'), elButton) :\n                    $.Localize(_RandomizeLocString('#user_message_limit_unlimited_'), elButton);\n                elButton.SetDialogVariable('setting-label', locString);\n                elButton.SetPanelEvent('onactivate', () => {\n                    InventoryAPI.SetVolatileLimits(oLimits.choices[i].limit);\n                    m_elScreen.SetDialogVariable('limit', GetLimitString(oLimits.choices[i]?.limit, oLimits.choices[i]?.label));\n                    if (oSetting.isContextMenu) {\n                        $.Schedule(.25, () => CloseInScreenPopup('show-settings'));\n                        oSetting.parentPanel.Children().forEach(element => element.enabled = false);\n                        ShowDealerOfferLimitAcknowledge();\n                        return;\n                    }\n                    else {\n                        oSetting.parentPanel.SetHasClass('hide', true);\n                        _MakeMessage(systemOfferLimitSetWithBootstrapAction);\n                    }\n                });\n            }\n            if (oSetting.isContextMenu) {\n                elButton.checked = ((oLimits.limit === oLimits.choices[i].limit) && oLimits.selected === true);\n                elButton.enabled = !elButton.checked;\n            }\n        }\n    }\n    function CloseInScreenPopup(className) {\n        OffersLaptop.LaptopSoundPlayOnce('UI.Laptop.Click');\n        m_elScreen.FindChildInLayoutFile('id-popup-in-screen').SetHasClass(className, false);\n    }\n    function GetLimitString(nLimit, sLimitLabel) {\n        return nLimit === 0 ? $.Localize(sLimitLabel) : sLimitLabel;\n    }\n})(CollectionOffers || (CollectionOffers = {}));\nvar DecodeText;\n(function (DecodeText) {\n    const charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()-_=+[]{};:,.<>/?';\n    function Init(textString, elContainer, className, bHtml = false) {\n        let aTextString = textString.split('');\n        let aExistingLetter = elContainer.Children();\n        let numExistingLetters = aExistingLetter.length;\n        if (aTextString.length < numExistingLetters) {\n            for (let i = aTextString.length; i < numExistingLetters; i++) {\n                aExistingLetter[i].DeleteAsync(0);\n            }\n        }\n        aTextString.forEach((letter, index) => {\n            let elLetter = elContainer.FindChild('letter-' + index);\n            if (!elLetter) {\n                elLetter = $.CreatePanel('Label', elContainer, 'letter-' + index, {\n                    class: className + ' stratum-regular-mono',\n                    html: bHtml\n                });\n            }\n        });\n        let time = 0;\n        let nDelay = .1;\n        let textStringLength = aTextString.length;\n        aTextString.forEach((letter, index) => {\n            $.Schedule(time, () => {\n                for (let i = index + 1; i < elContainer.Children().length; i++) {\n                    let letterIndex = Math.floor(Math.random() * (0 - textStringLength) + textStringLength);\n                    let randomLetter = charset[letterIndex];\n                    elContainer.Children()[i].text = randomLetter;\n                    elContainer.Children()[i].ToggleClass('show');\n                }\n                elContainer.Children()[index].text = letter;\n                elContainer.Children()[index].SetHasClass('show', true);\n            });\n            time = time + nDelay;\n        });\n    }\n    DecodeText.Init = Init;\n})(DecodeText || (DecodeText = {}));\n","scripts/popups/popup_operation_store.js":"\n'use-strict';\n\nvar CapabilityOperationStore = ( function()\n{\n\tvar _GetStarsCountForOperation = function()\n\t{\n\t\tvar oi = OperationUtil.GetOperationInfo();\n\t\tif ( oi.nRedeemableGoodsCount && oi.nRedeemableGoodsCount > 0 )\n\t\t\treturn oi.nRedeemableBalance;\n\t\telse\n\t\t\treturn oi.nTierUnlocked;\n\t};\n\n\tvar _CanUserDoShopping = function()\n\t{\n\t\tvar oi = OperationUtil.GetOperationInfo();\n\t\treturn oi.bShopIsFreeForAll ? true : oi.bPremiumUser;\n\t};\n\n\tvar _Init = function()\n\t{\n\t\tvar nActiveSeason = GameTypesAPI.GetActiveSeasionIndexValue();\n\n\t\tif( !OperationUtil.ValidateOperationInfo( nActiveSeason ) || !_CanUserDoShopping() )\n\t\t{\n\t\t\t              \n\t\t\t$.DispatchEvent( 'UIPopupButtonClicked', '' );\n\t\t\treturn;\n\t\t}\n\n\t\tStarsShoppingCart.Init();\n\n\t\tvar blurOperationPanel = ( $.GetContextPanel().GetAttributeString( 'bluroperationpanel', 'false' ) === 'true' ) ? true : false;\n\t\tif ( blurOperationPanel )\n\t\t{\n\t\t\t$.DispatchEvent( 'BlurOperationPanel' );\n\t\t}\n\n\t\tvar oldStarItemIdsToActivate = $.GetContextPanel().GetAttributeString( 'oldstarstoactivate', '' );\n\t\tif ( oldStarItemIdsToActivate )\n\t\t{\n\t\t\tvar oldStarsValue = $.GetContextPanel().GetAttributeInt( 'oldstarstoactivatevalue', 0 );\n\t\t\tStarsShoppingCart.SetNewStarsTotalDialogVar( oldStarsValue );\n\t\t\tStarsShoppingCart.SetOldStarItemIdsForApply( oldStarItemIdsToActivate );\n\t\t\t\n\t\t\tSetCurrrentStars();\n\t\t\treturn;\n\t\t}\n\n\t\t               \n\t\t$.GetContextPanel().SetDialogVariableInt( 'after_purchase_stars', OperationUtil.GetOperationInfo().nCoinRank );\n\t\tSetCurrrentStars();\n\n\t\t                                                                                             \n\t\t                          \n\t\t      \n\n\t\tStarsShoppingCart.SelectStoreTab();\n\n\t\t                                                                                             \n\t\t                                            \n\t\t      \n\t};\n\n\tvar SetCurrrentStars = function( )\n\t{\n\t\tvar starsEarned = _GetStarsCountForOperation();\n\t\t\n\t\t$.GetContextPanel().SetDialogVariableInt( 'total_stars', starsEarned );\n\t\t$.GetContextPanel().Data().starsEarned = starsEarned;\n\t};\n\n\tvar _SetStarsLevelsAfterPurchase = function( nStarsInCart )\n\t{\n\t\t$.GetContextPanel().SetHasClass( 'popup-operation-store-cart-empty', nStarsInCart <= 0 );\n\n\t\tif ( !nStarsInCart )\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tvar newStarValue = $.GetContextPanel().Data().starsEarned + nStarsInCart;\n\t\tvar animName = ( $.GetContextPanel().Data().oldStarsTotal &&  $.GetContextPanel().Data().oldStarsTotal <= newStarValue ) ?\n\t\t\t'popup-operation-progress-anim' : \n\t\t\t'popup-operation-progress-remove-anim';\n\n\t\t$.GetContextPanel().Data().oldStarsTotal = newStarValue;\n\t\n\t\t$.GetContextPanel().FindChildInLayoutFile( 'id-operation-store-progress-after').AddClass( animName );\n\t\t$.Schedule( 0.2, function() { $.GetContextPanel().SetDialogVariableInt( 'after_purchase_stars', newStarValue ); } );\n\t\t$.Schedule( 0.5, function() { $.GetContextPanel().FindChildInLayoutFile( 'id-operation-store-progress-after').RemoveClass( animName ); } );\n\t};\n\n\tvar _ClosePopup = function()\n\t{\n\t\t$.DispatchEvent( 'UnblurOperationPanel' );\n\t\t$.DispatchEvent( 'UIPopupButtonClicked', '' );\n\t\t$.DispatchEvent( 'CSGOPlaySoundEffect', 'UIPanorama.mainmenu_press_home', 'MOUSE' );\n\t\tStarsShoppingCart.ResetTimeouthandle();\n\t};\n\n\treturn {\n\t\tInit: _Init,\n\t\tGetStarsCountForOperation: _GetStarsCountForOperation,\n\t\tSetStarsLevelsAfterPurchase: _SetStarsLevelsAfterPurchase,\n\t\tClosePopup: _ClosePopup\n\t};\n} )();\n\nvar StarsShoppingCart = ( function()\n{\n\tvar ARRAY_STORE_ITEMS = [\n\t\t{\n\t\t\trank_restriction: 2,\n\t\t\tstoreids: OperationUtil.GetOperationStarDefIdxArray(),\n\t\t\tcoinid: 4550\n\t\t}\n\t\t           \n\t\t                             \n\t\t    \n\t\t   \t                    \n\t\t   \t                         \n\t\t   \t            \n\t\t     \n\t\t    \n\t\t   \t                    \n\t\t   \t                         \n\t\t   \t            \n\t\t     \n\t\t          \n\t];\n\n\tvar MAX_QUANTITY = StoreAPI.GetStoreCartItemLimit();\n\tvar MAX_QUANTITY_EACH = 9;\n\tvar _nStarsInCart = 0;\n\tvar m_scheduleHandle = null;\n\tvar m_aCartItemIds = [];\n\tvar m_NewItemsList = [];\n\n\tvar elParent = $.GetContextPanel().FindChildInLayoutFile( 'popup-operation-store-rows' );\n\n\tvar _Init = function()\n\t{\n\t\tvar elOK = $.GetContextPanel().FindChildInLayoutFile( 'AsyncItemWorkAcceptConfirm' );\n\t\telOK.SetPanelEvent( 'onactivate', _OnActivate.bind( undefined, elOK, 'purchase') );\n\n\t\tvar elApply = $.GetContextPanel().FindChildInLayoutFile( 'AsyncItemWorkUseItem' );\n\t\telApply.SetPanelEvent( 'onactivate', _OnActivate.bind( undefined, elApply, 'useitem' ) );\n\n\t\t                                                                                     \n\t\t                          \n\t};\n\n\n\t                                                                                     \n\t          \n\t                                     \n\t \n\t\t                                 \n\t\t                                                                                                          \n\t\t                                                             \n\n\t\t                                           \n\t\t \n\t\t\t                                                                                                                            \n\n\t\t\t                                           \n\t\t\t \n\t\t\t\t                                                                               \n\t\t\t\t                                                                                \n\n\t\t\t\t                                   \n\t\t\t\t                                                                                    \n\t\t\t\t                                                \n\t\t\t\t\n\t\t\t\t                                                                           \n\t\t\t\t \n\t\t\t\t\t                                                                        \n\t\t\t\t \n\n\t\t\t\t                                                                                     \n\t\t\t    \n\n\t\t\t                                                                                                                         \n\t\t\t                                                                                                   \n\t\t\t                                                                         \n\t\t\t                                                                              \n\t\t\t                                                                   \n\t\t\t                                                                     \n\t\t\t\n\t\t\t                                          \n\t\t\t \n\t\t\t\t                                                                                  \n\t\t\t\t                                                                                              \n\t\t\t\t                                                                                                                                  \n\t\t\t\t                                                                                                       \n\n\t\t\t\t                                                                 \n\t\t\t \n\t\t\t                                                                                                      \n\t\t\t \n\t\t\t\t                                                                                             \n\t\t\t\t                                                                                            \n\t\t\t\t\t                                             \n\t\t\t \n\t\t\t     \n\t\t\t \n\t\t\t\t                        \n\t\t\t \n\t\t    \n\t  \n\t          \n\n\tvar _SelectStoreTab = function()\n\t{\n\t\t                                                                                                \n\t\tvar nRank = OperationUtil.GetOperationInfo().nCoinRank > 1 ? 2 : 0;\n\t\t\n\t\t                                                                                             \n\t\t                                                                                                     \n\t\t      \n\n\t\t_UpdateStoreBasedOnCoinRank( nRank );\n\t\t_PreFillCart();\n\t};\n\n\t                                                                                     \n\t          \n\t                                      \n\t \n\t\t                                                                                                          \n\t\t\n\t\t                                                                                                                                           \n\t\t\t            \n\t\t\t\t                                                         \n\t\t   \n\t  \n\t          \n\n\tvar _UpdateStoreBasedOnCoinRank = function( nRank, bIsPreview = false )\n\t{\n\t\t                                                         \n\t\tvar oStoreData = ARRAY_STORE_ITEMS[0];                                                                      \n\n\t\t                                  \n\t\toStoreData.storeids.forEach( element => {\n\n\t\t\tvar elRow = $.CreatePanel( 'Panel', elParent, element );\n\t\t\telRow.BLoadLayoutSnippet( 'store-row' );\n\n\t\t\tvar fauxItemId = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex( element, 0 );\n\t\t\tvar starsCount = InventoryAPI.GetItemAttributeValue( fauxItemId, 'upgrade level' );\n\t\t\tvar discount = StoreAPI.GetStoreItemPercentReduction( fauxItemId, 1 );\n\t\t\telRow.Data().itemid = fauxItemId;\n\t\t\telRow.Data().quantity = 0;\n\t\t\telRow.Data().starsCount = starsCount;\n\n\t\t\t                          \n\t\t\tif ( !discount )\n\t\t\t{\n\t\t\t\telRow.AddClass( 'popup-operation-store-row--no-discount' );\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\telRow.SetDialogVariable( 'store-item-discount', discount );\n\t\t\t\telRow.SetDialogVariable( 'store-item-original-price', ItemInfo.GetStoreOriginalPrice( fauxItemId, 1 ) );\n\t\t\t}\n\n\t\t\telRow.SetHasClass( 'quantity-count1', starsCount === 1 );\n\t\t\telRow.SetDialogVariable( 'quantity_name', starsCount );\n\t\t\telRow.SetDialogVariable( 'store-item-name', InventoryAPI.GetItemName( fauxItemId ) );\n\t\t\telRow.SetDialogVariable( 'store-item-sale-price', ItemInfo.GetStoreSalePrice( fauxItemId, 1 ) );\n\t\t\telRow.SetDialogVariableInt( 'store-item-quantity', elRow.Data().quantity );\n\n\t\t\t                              \n\t\t\telRow.FindChildInLayoutFile( 'popup-operation-store-count-increment' ).enabled = !bIsPreview;\n\t\t\telRow.FindChildInLayoutFile( 'popup-operation-store-count-increment' ).SetPanelEvent(\n\t\t\t\t'onactivate',\n\t\t\t\t_AddItem.bind( undefined, elRow ) );\n\t\t\t\n\t\t\telRow.FindChildInLayoutFile( 'popup-operation-store-count-decrement' ).enabled = !bIsPreview;\n\t\t\telRow.FindChildInLayoutFile( 'popup-operation-store-count-decrement' ).SetPanelEvent(\n\t\t\t\t'onactivate',\n\t\t\t\t_RemoveItem.bind( undefined, elRow ) );\n\t\t\t\n\t\t\t_UpdateRowPurchasePriceQuantity( elRow );\n\t\t} );\n\t\t\n\t\telParent.Children()[ elParent.Children().length - 1 ].AddClass( 'popup-operation-store-row-bottom-border' );\n\t};\n\t\n\tvar _AddItem = function( elRow )\n\t{\n\t\tif ( elRow.Data().quantity + 1 > ( MAX_QUANTITY / elRow.Data().starsCount) )\n\t\t\treturn;\n\t\tif ( elRow.Data().quantity + 1 > MAX_QUANTITY_EACH )\n\t\t\treturn;\n\n\t\tif ( elRow.Data().starsCount == MAX_QUANTITY )\n\t\t{\t                                                     \n\t\t\telRow.GetParent().Children().forEach( elOtherRow => {\n\t\t\t\tif ( elOtherRow.Data() && elOtherRow.Data().starsCount ) {\n\t\t\t\t\twhile ( elOtherRow.Data().quantity > 0 )\n\t\t\t\t\t\t_RemoveItem( elOtherRow );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t\t\n\t\telRow.Data().quantity = ++elRow.Data().quantity;\n\t\telRow.SetDialogVariableInt( 'store-item-quantity', elRow.Data().quantity );\n\t\t_UpdateRowPurchasePriceQuantity( elRow );\n\t};\n\n\tvar _RemoveItem = function( elRow )\n\t{\n\t\tif ( elRow.Data().quantity - 1 < 0 )\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\t\n\t\telRow.Data().quantity = --elRow.Data().quantity;\n\t\telRow.SetDialogVariableInt( 'store-item-quantity', elRow.Data().quantity );\n\t\t_UpdateRowPurchasePriceQuantity( elRow );\n\t};\n\n\tvar _UpdateRowPurchasePriceQuantity = function( elRow )\n\t{\n\t\tvar quantity = elRow.Data().quantity * Number( elRow.Data().starsCount );\n\t\tvar price = !quantity ? '-' : ItemInfo.GetStoreSalePrice( elRow.Data().itemid, elRow.Data().quantity );\n\t\tvar dispQuantity = !quantity ? '-' : quantity; \n\t\t\n\t\telRow.SetDialogVariable( 'store-item-purchase-price', price );\n\t\telRow.SetDialogVariable( 'store-item-stars-quantity', dispQuantity );\n\t\t\n\t\t                                 \n\t\tvar totalStarCount = _UpdateTotals();\n\t\telRow.GetParent().Children().forEach( elOtherRow => {\n\t\t\tif ( elOtherRow.Data() && elOtherRow.Data().starsCount ) {\n\t\t\t\t_UpdateRowBtnState( elOtherRow, totalStarCount );\n\t\t\t}\n\t\t} );\n\t};\n\n\tvar _UpdateRowBtnState = function( elRow, totalStarCount )\n\t{\n\t\telRow.FindChildInLayoutFile( 'popup-operation-store-count-decrement' ).enabled = elRow.Data().quantity > 0;\n\t\telRow.FindChildInLayoutFile( 'popup-operation-store-count-increment' ).enabled =\n\t\t\t( elRow.Data().quantity < ( MAX_QUANTITY / elRow.Data().starsCount) ) &&\n\t\t\t( elRow.Data().quantity < MAX_QUANTITY_EACH ) &&\n\t\t\t( totalStarCount < MAX_QUANTITY );\n\t};\n\n\tvar _UpdateTotals = function()\n\t{\n\t\tvar rows = elParent.Children();\n\t\tvar aCartItems = _GetCartItems( rows );\n\t\tm_aCartItemIds = _GetItemsInCartAsList( aCartItems );\n\t\tvar totalStarCount = _GetTotalStarCount( aCartItems );\n\t\tvar dispTotalStarCount = !totalStarCount ? '-' : totalStarCount;\n\t\tvar dispPrice = !totalStarCount  ? '-' : _GetTotalPriceOfItems( m_aCartItemIds );\n\n\t\t$.GetContextPanel().SetDialogVariable( 'store-item-price-total', dispPrice );\n\t\t_SetNewStarsTotalDialogVar( dispTotalStarCount );\n\t\tCapabilityOperationStore.SetStarsLevelsAfterPurchase( totalStarCount );\n\n\t\tvar elOK = $.GetContextPanel().FindChildInLayoutFile( 'AsyncItemWorkAcceptConfirm' );\n\t\telOK.enabled = m_aCartItemIds.length > 0;\n\n\t\treturn totalStarCount;\n\t};\n\n\tvar _SetNewStarsTotalDialogVar = function( count )\n\t{\n\t\t$.GetContextPanel().SetDialogVariable( 'store-item-stars-total', count );\n\t};\n\n\tvar _GetCartItems = function( rows )\n\t{\n\t\tvar aCartItems = [];\n\n\t\trows.forEach( function( row, index )\n\t\t{\n\t\t\taCartItems[ index ] = {};\n\t\t\taCartItems[ index ].id = row.Data().itemid;\n\t\t\taCartItems[ index ].quantity = row.Data().quantity;\n\t\t} );\n\n\t\treturn aCartItems;\n\t};\n\n\tvar _GetItemsInCartAsList = function( aCartItems )\n\t{\n\t\tvar aItemsIdsList = [];\n\t\taCartItems.forEach( function( item )\n\t\t{\n\t\t\tfor ( var i = 0; i < item.quantity; i++ )\n\t\t\t{\n\t\t\t\taItemsIdsList.push( item.id );\n\t\t\t}\n\t\t} );\n\n\t\treturn aItemsIdsList;\n\t};\n\n\tvar _GetTotalPriceOfItems = function( aItemsIdsList )\n\t{\n\t\treturn StoreAPI.GetStoreItemsSalePrice( aItemsIdsList.join( ',' ) );\n\t};\n\n\tvar _GetTotalStarCount = function( aCartItems )\n\t{\n\t\tvar total = 0;\n\t\taCartItems.forEach( function( item )\n\t\t{\n\t\t\ttotal += item.quantity * InventoryAPI.GetItemAttributeValue( item.id, 'upgrade level' );\n\t\t} );\n\n\t\treturn total;\n\t};\n\n\tvar _OnActivate= function( btn, workType )\n\t{\n\t\tif ( workType == 'useitem' )\n\t\t{\n\t\t\tif ( m_scheduleHandle )\n\t\t\t{\n\t\t\t\t$.CancelScheduled( m_scheduleHandle );\n\t\t\t\tm_scheduleHandle = null;\n\t\t\t}\n\n\t\t\tm_scheduleHandle = $.Schedule( 5, _CancelWaitforCallBack );\n\t\t\t                                                                                          \n\n\t\t\t$.GetContextPanel().FindChildInLayoutFile( 'op-Store-spinner' ).RemoveClass( 'hidden' );\n\t\t\tbtn.AddClass( 'hidden' );\n\t\t}\n\n\t\t_PerformAsyncAction( workType );\n\t};\n\n\tvar _PerformAsyncAction = function( workType )\n\t{\n\t\tif ( workType === 'useitem' )\n\t\t{\n\t\t\tm_NewItemsList.forEach( item => InventoryAPI.UseTool( item, '' ) );\n\t\t}\n\t\telse if ( workType == 'purchase' )\n\t\t{\n\t\t\tStoreAPI.StoreItemPurchase( m_aCartItemIds.join( ',' ) );\n\t\t}\n\t};\n\n\tvar _CancelWaitforCallBack = function( )\n\t{\n\t\t                                                                                       \n\t\tif ( !m_scheduleHandle ) return;                                                                                              \n\t\tm_scheduleHandle = null;\n\t\t\n\t\tvar elSpinner = $.GetContextPanel().FindChildInLayoutFile( 'op-Store-spinner' );\n\t\telSpinner.AddClass( 'hidden' );\n\n\t\tCapabilityOperationStore.ClosePopup();\n\n\t\tUiToolkitAPI.ShowGenericPopupOk(\n\t\t\t$.Localize( '#SFUI_SteamConnectionErrorTitle' ),\n\t\t\t$.Localize( '#SFUI_InvError_Item_Not_Given' ),\n\t\t\t'',\n\t\t\t() => {},\n\t\t\t() => {}\n\t\t);\n\t};\n\n\tvar _ResetTimeouthandle = function()\n\t{\n\t\t                                                                                                                                          \n\t\tif ( m_scheduleHandle )\n\t\t{\n\t\t\t$.CancelScheduled( m_scheduleHandle );\n\t\t\tm_scheduleHandle = null;\n\t\t}\n\t};\n\n\tvar _ItemAcquired = function( ItemId )\n\t{\n\t\t$.DispatchEvent( \"CSGOPlaySoundEffect\", \"rename_purchaseSuccess\", \"MOUSE\" );\n\n\t\tfunction onlyUnique ( value, index, arr ) \n\t\t{ \n\t\t\treturn arr.indexOf(value) === index;\n\t\t}\n\t\t\n\t\tvar unique = m_aCartItemIds.filter( onlyUnique );\n\t\tvar aDefNames = [];\n\t\tunique.forEach( function( item, idx )\n\t\t{\n\t\t\taDefNames.push( InventoryAPI.GetItemDefinitionName( item ) );\n\t\t} );\n\t\t\n\t\tif ( aDefNames.includes( InventoryAPI.GetItemDefinitionName( ItemId ) ) )\n\t\t{\n\t\t\t                \n\t\t\t_ResetTimeouthandle();\n\n\t\t\t$.DispatchEvent( 'HideStoreStatusPanel' );\n\t\t\t_AcknowlegeStars( aDefNames );\n\t\t\t_SetApplyStarsStyles();\n\t\t}\n\t};\n\n\tvar _AcknowlegeStars = function( aDefNames )\n\t{\n\t\tvar bShouldAcknowledge = true;\n\t\tm_NewItemsList = AcknowledgeItems.GetItemsByType( aDefNames, bShouldAcknowledge );\n\t\t\n\t\tif ( m_NewItemsList.length < 1 )\n\t\t{\n\t\t\tCapabilityOperationStore.ClosePopup();\n\t\t\treturn;\n\t\t}\n\t};\n\n\tvar _SetOldStarItemIdsForApply = function( ids )\n\t{\n\t\tm_NewItemsList = ids.split( ',' );\n\t\t_SetApplyStarsStyles();\n\t\t_UpdateApplyDialogLabels( true );\n\t};\n\n\tvar _SetApplyStarsStyles = function()\n\t{\n\t\t$.GetContextPanel().AddClass( 'popup-operation-store-apply-stars' );\n\t\t$.GetContextPanel().FindChildInLayoutFile( 'op-Store-spinner' ).AddClass( 'hidden' );\n\t\t$.GetContextPanel().FindChildInLayoutFile( 'AsyncItemWorkUseItem' ).RemoveClass( 'hidden' );\n\t\t$.GetContextPanel().FindChildInLayoutFile( 'AsyncItemWorkAcceptConfirm' ).AddClass( 'hidden' );\n\t\t_UpdateApplyDialogLabels( false );\n\t};\n\n\tvar _UpdateApplyDialogLabels = function( bhasUnused, bNewStars )\n\t{\n\t\tif ( bNewStars )\n\t\t{\n\t\t\t$.GetContextPanel().FindChildInLayoutFile( 'id-operation-store-apply_title' ).text = '#CSGO_PickEm_Trophy_Status_Gold';\n\t\t\t$.GetContextPanel().FindChildInLayoutFile( 'id-operation-store-apply_desc' ).text = '#op_store_stars_applied';\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$.GetContextPanel().FindChildInLayoutFile( 'id-operation-store-apply_title' ).text = bhasUnused ? '#op_store_apply_stars_unused' : '#op_store_apply_stars';\n\t\t\t$.GetContextPanel().FindChildInLayoutFile( 'id-operation-store-apply_desc' ).text = bhasUnused ? '#op_store_apply_stars_desc_unused' : '#op_store_apply_stars_desc';\n\t\t}\n\t\n\t\t$.GetContextPanel().FindChildInLayoutFile( 'id-operation-store-apply_type_desc' ).text = bhasUnused ? '#op_store_new_stars_unused' : '#op_store_new_stars';\n\n\t\t$.GetContextPanel().FindChildInLayoutFile( 'id-operation-store-apply_warning' ).visible = !bNewStars;\n\t};\n\t\n\tvar _PreFillCart = function()\n\t{\n\t\tvar nStarsNeeded = $.GetContextPanel().GetAttributeInt( 'starsneeded', 0 );\n\n\t\t                                      \n\t\tif ( nStarsNeeded < 1 )\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tvar elRows = $.GetContextPanel().FindChildInLayoutFile( 'popup-operation-store-rows' ).Children();\n\t\telRows.sort( function( a, b ) { return b.Data().starsCount - a.Data().starsCount } );\n\t\tvar amount = nStarsNeeded;\n\n\t\telRows.forEach( row =>\n\t\t{\n\t\t\t                                                                          \n\t\t\tamount = amount / row.Data().starsCount;\n\n\t\t\tif ( Math.floor( amount ) > 0 )\n\t\t\t{\n\t\t\t\t                                             \n\t\t\t\tfor ( var i = 0; i < Math.floor( amount ); i++ )\n\t\t\t\t{\n\t\t\t\t\t_AddItem( row );\n\t\t\t\t}\n\n\t\t\t\tamount = nStarsNeeded % row.Data().starsCount;\n\t\t\t}\n\t\t\telse if( amount !== 0 )\n\t\t\t{\n\t\t\t\tamount = nStarsNeeded;\n\t\t\t}\n\t\t} );\n\t};\n\n\tvar _OnInventoryUpdate = function()\n\t{\n\t\tvar prevStars = $.GetContextPanel().Data().starsEarned;\n\n\t\tOperationUtil.ValidateOperationInfo( OperationUtil.GetOperationInfo().nSeasonAccess );\n\t\tvar StarsEarned = CapabilityOperationStore.GetStarsCountForOperation();\n\n\t\tif ( StarsEarned > prevStars )\n\t\t{\n\t\t\t_ResetTimeouthandle();\n\t\t\t$.Schedule( 0.3, function() { $.GetContextPanel().SetDialogVariableInt( 'total_stars', StarsEarned ); } );\n\t\t\t$.DispatchEvent( 'CSGOPlaySoundEffect', 'UIPanorama.popup_newweapon', 'MOUSE' );\n\t\t\t$.GetContextPanel().FindChildInLayoutFile( 'id-operation-store-progress-apply' ).AddClass( 'popup-operation-apply-stars' );\n\t\t\t$.GetContextPanel().AddClass( 'popup-operation-store-reveal-new-stars' );\n\t\t\t$.GetContextPanel().FindChildInLayoutFile( 'op-Store-spinner' ).AddClass( 'hidden' );\n\t\t\t_UpdateApplyDialogLabels( false, true );\n\t\t}\n\t};\n\n\treturn {\n\t\tInit: _Init,\n\t\tnStarsInCart: _nStarsInCart,\n\t\tSelectStoreTab: _SelectStoreTab,\n\t          \n\t\t                                            \n\t          \n\t\tUpdateStoreBasedOnCoinRank: _UpdateStoreBasedOnCoinRank,\n\t\tResetTimeouthandle: _ResetTimeouthandle,\n\t\tItemAcquired: _ItemAcquired,\n\t\tOnInventoryUpdate: _OnInventoryUpdate,\n\t\tSetOldStarItemIdsForApply: _SetOldStarItemIdsForApply,\n\t\tSetNewStarsTotalDialogVar: _SetNewStarsTotalDialogVar\n\t};\n\n} )();\n\n( function()\n{\n\t$.RegisterForUnhandledEvent( 'PanoramaComponent_MyPersona_InventoryUpdated', StarsShoppingCart.OnInventoryUpdate );\n\t$.RegisterForUnhandledEvent( 'PanoramaComponent_Store_PurchaseCompleted', StarsShoppingCart.ItemAcquired );\n} )();","scripts/popups/popup_pet_book.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../popups/pet_book_pages.ts\" />\n/// <reference path=\"../popups/pet_book_turn.ts\" />\nvar PetBook;\n(function (PetBook) {\n    const _m_cp = $.GetContextPanel();\n    let _m_bar;\n    let _m_hint;\n    let _m_prev;\n    let _m_next;\n    let _m_open;\n    let _m_chapters = [];\n    function Init() {\n        GameInterfaceAPI.SetChickenAudioSuppressed('pet_book', true);\n        _m_bar = _m_cp.FindChildInLayoutFile('id-pet-book-bar');\n        _m_hint = _m_cp.FindChildInLayoutFile('id-pet-book-hint');\n        _m_prev = _m_cp.FindChildInLayoutFile('id-pet-book-prev');\n        _m_next = _m_cp.FindChildInLayoutFile('id-pet-book-next');\n        _m_open = _m_cp.FindChildInLayoutFile('id-pet-book-open-btn');\n        PetBookPages.Init(PetBookTurn.RefreshSpread);\n        _m_cp.FindChildInLayoutFile('id-pet-book-booth-btn').visible =\n            _m_cp.GetAttributeInt('from_booth', 0) === 1 && PetBookPages.HasLivePet();\n        PetBookTurn.Init({\n            FillPage: PetBookPages.FillPage,\n            OnBeforeTurn: PetBookPages.CloseFrame,\n            OnSpreadChanged: _UpdateNav,\n        }, PetBookPages.ShownPages(), _m_cp.GetAttributeInt('spread', 0));\n        _MakeChapterButtons();\n        _UpdateNav();\n        if (PetBookTurn.Spread() > 0) {\n            $.DispatchEvent('CSGOPlaySoundEffect', 'UI.BookOpen', 'MOUSE');\n        }\n    }\n    PetBook.Init = Init;\n    function Next() {\n        PetBookTurn.TurnTo(PetBookTurn.Spread() + 1);\n    }\n    PetBook.Next = Next;\n    function Prev() {\n        PetBookTurn.TurnTo(PetBookTurn.Spread() - 1);\n    }\n    PetBook.Prev = Prev;\n    function OpenPhotoBooth() {\n        if (!PetBookPages.HasLivePet()) {\n            return;\n        }\n        UiToolkitAPI.ShowCustomLayoutPopupParameters('', 'file://{resources}/layout/popups/popup_pet_photobooth.xml', 'pet_id=' + PetBookPages.PetItemID()\n            + '&' + 'upgrade_level=' + PetBookPages.PetStage()\n            + '&' + 'book_spread=' + PetBookTurn.Spread()\n            + '&' + 'booth_setup=' + _m_cp.GetAttributeString('booth_setup', '')\n            + '&' + 'from_book=1');\n        Close();\n    }\n    PetBook.OpenPhotoBooth = OpenPhotoBooth;\n    function Close() {\n        PetBookPages.CancelDrag();\n        GameInterfaceAPI.SetChickenAudioSuppressed('pet_book', false);\n        $.DispatchEvent('UIPopupButtonClicked', '');\n        $.DispatchEvent('CSGOPlaySoundEffect', PetBookTurn.Spread() > 0 ? 'UI.BookClose' : 'UIPanorama.mainmenu_press_quit', 'MOUSE');\n    }\n    PetBook.Close = Close;\n    function _ChapterBtnId(strName) {\n        return 'id-pet-book-chapter-' + strName;\n    }\n    function _ChapterOfSpread(spread) {\n        const aStarted = _m_chapters.filter(chapter => PetBookTurn.SpreadOfPage(chapter.page) <= spread);\n        return aStarted[aStarted.length - 1];\n    }\n    function _MakeChapterButtons() {\n        const elParent = _m_cp.FindChildInLayoutFile('id-pet-book-chapters');\n        _m_chapters = PetBookPages.Chapters();\n        _m_chapters.forEach(chapter => {\n            const elBtn = $.CreatePanel('RadioButton', elParent, _ChapterBtnId(chapter.name), {\n                class: 'pet-book-chapter',\n                group: 'chapters'\n            });\n            $.CreatePanel('Image', elBtn, '', {\n                src: \"file://{images}/icons/ui/\" + chapter.icon,\n                textureheight: \"20\",\n                texturewidth: \"-1\",\n            });\n            elBtn.SetPanelEvent('onactivate', () => { PetBookTurn.TurnTo(PetBookTurn.SpreadOfPage(chapter.page)); });\n        });\n    }\n    function _UpdateNav() {\n        const spread = PetBookTurn.Spread();\n        const closed = spread === 0;\n        _m_prev.enabled = spread > 0;\n        _m_next.enabled = spread < PetBookTurn.NumSpreads() - 1;\n        _m_bar.visible = !closed;\n        _m_open.visible = closed;\n        _m_hint.style.opacity = closed ? '1' : '0';\n        const chapter = _ChapterOfSpread(spread);\n        if (chapter) {\n            _m_cp.FindChildTraverse(_ChapterBtnId(chapter.name)).checked = true;\n        }\n        _m_cp.SetDialogVariableInt('page', spread);\n        _m_cp.SetDialogVariableInt('total', PetBookTurn.NumSpreads() - 1);\n        _m_cp.SetDialogVariable('label', $.Localize('#pet_book_page_counter', _m_cp));\n    }\n})(PetBook || (PetBook = {}));\n","scripts/popups/popup_pet_event.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../inspect.ts\" />\n/// <reference path=\"../common/characteranims.ts\" />\nvar PopupPetEvent;\n(function (PopupPetEvent) {\n    const _m_cp = $.GetContextPanel();\n    const _m_elPetFrame = $.GetContextPanel().FindChildInLayoutFile('id-pet-event-frame');\n    const _m_elItemModelImagePanel = _m_cp.FindChildInLayoutFile('id-pet-model');\n    let _m_elCloseBtn = null;\n    let _m_bWaitingOnContinue = false;\n    let _m_event;\n    let _m_elPreviewPanel;\n    const SEQ_FLY_AWAY = 'chick_retirement01';\n    const SEQ_GRUMPY_RETIRE = 'chick_retirement02';\n    const NEGLECT_FADE_SEC = 5;\n    const NEGLECT_LINE_COUNT = 3;\n    const NEGLECT_EGG_LINE_COUNT = 3;\n    const PLAY_EVENT_DELAY_SEC = .1;\n    const DISMISS_DELAY_SEC = 4;\n    function _ParsePetEvent() {\n        const popupPetParams = _m_cp.GetAttributeString('pet_id', '').split(',');\n        const petItemId = popupPetParams.length > 0 ? popupPetParams[0] : '';\n        const strSecond = popupPetParams.length > 1 ? popupPetParams[1] : '';\n        const bExpired = (strSecond === 'maxage' || strSecond === 'nofood');\n        const upgradeLevel = Number(InventoryAPI.GetItemAttributeValue(petItemId, '{uint32}upgrade level'));\n        return {\n            petItemId: petItemId,\n            previousPetItemId: (bExpired || !strSecond) ? petItemId : strSecond,\n            upgradeLevel: upgradeLevel,\n            expiryReason: bExpired ? strSecond : '',\n            bMaxAge: strSecond === 'maxage',\n            bEggNoFood: upgradeLevel === 0 && strSecond === 'nofood',\n        };\n    }\n    function Init() {\n        _m_event = _ParsePetEvent();\n        GameInterfaceAPI.SetChickenAudioExempt('pet_event', true);\n        _m_cp.GetParent().GetParent().SetHasClass('pet-event-blur', true);\n        _SetupCloseBtn('id-pet-event-close-btn');\n        UiToolkitAPI.PlaySoundEvent('Chicken.Popup.Message');\n        _m_elPetFrame.AddClass('show');\n        _m_elPreviewPanel = _CreatePetPreviewPanel();\n        _m_bWaitingOnContinue = true;\n        if (_m_event.expiryReason) {\n            _SetExpiryText();\n        }\n        else {\n            _SetUpgradeText();\n        }\n        _SetupBookBtn();\n        _SetupContinueBtn();\n    }\n    PopupPetEvent.Init = Init;\n    function _SetExpiryText() {\n        const strNeglect = _m_event.bEggNoFood ? 'nofood_egg' : 'nofood';\n        const nNeglectLines = _m_event.bEggNoFood ? NEGLECT_EGG_LINE_COUNT : NEGLECT_LINE_COUNT;\n        const strTitle = _m_event.bMaxAge ? _m_cp.GetAttributeString('title', '') : '#pet_expired_notification_title_' + strNeglect;\n        const strBody = _m_event.bMaxAge ? (_EventPetBookId() !== '' ? '#pet_expired_notification_msg_maxage_book' : '#pet_expired_notification_msg_maxage')\n            : '#pet_expired_notification_msg_' + strNeglect + '_' + Math.floor(Math.random() * nNeglectLines);\n        _m_cp.SetDialogVariable('title', $.Localize(strTitle, _m_cp));\n        _m_cp.SetDialogVariable('body', $.Localize(strBody, _m_cp));\n    }\n    function _PetBookId(strPetId) {\n        if (!strPetId) {\n            return '';\n        }\n        return GameInterfaceAPI.FindFiles('pet/' + strPetId + '/book/pet.bin', 'USRLOCAL').length > 0 ? strPetId : '';\n    }\n    function _EventPetBookId() {\n        return _PetBookId(_m_cp.GetAttributeString('ack_exp_pet_id', '')) || _PetBookId(InventoryAPI.GetPetItemID());\n    }\n    function _SetupBookBtn() {\n        _m_cp.FindChildInLayoutFile('id-pet-event-book-btn').SetPanelEvent('onactivate', () => {\n            UiToolkitAPI.ShowCustomLayoutPopup('', 'file://{resources}/layout/popups/popup_pet_book.xml');\n            Close();\n        });\n    }\n    function _SetupContinueBtn() {\n        const elContinueBtn = _m_cp.FindChildInLayoutFile('id-pet-event-continue-btn');\n        elContinueBtn.SetHasClass('hide-btn', false);\n        _m_elCloseBtn.SetHasClass('hide-btn', true);\n        _SpawnPetEventItems();\n        elContinueBtn.SetPanelEvent('onactivate', () => {\n            elContinueBtn.enabled = false;\n            elContinueBtn.SetHasClass('hide-btn', true);\n            _m_cp.FindChildInLayoutFile('id-pet-event-text').SetHasClass('hide-text', true);\n            $.Schedule(PLAY_EVENT_DELAY_SEC, () => { _PlayPetEvent(); });\n            _RevealPet();\n            $.Schedule(PLAY_EVENT_DELAY_SEC + DISMISS_DELAY_SEC, () => {\n                _m_bWaitingOnContinue = false;\n                if (_m_event.bMaxAge && _EventPetBookId()) {\n                    _m_cp.FindChildInLayoutFile('id-pet-event-book-btn').SetHasClass('hide-btn', false);\n                }\n                _m_elCloseBtn.SetHasClass('hide-btn', false);\n            });\n            $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.resetSettings', 'MOUSE');\n        });\n    }\n    function _RevealPet() {\n        _m_cp.FindChildInLayoutFile('id-pet-white').AddClass('hide-white');\n    }\n    function _SetUpgradeText() {\n        _m_cp.SetDialogVariable('title', $.Localize(_m_cp.GetAttributeString('title', ''), _m_cp));\n        _m_cp.SetDialogVariable('body', $.Localize(_m_cp.GetAttributeString('msg', '') + '_' + _m_event.upgradeLevel, _m_cp));\n    }\n    function _SetupCloseBtn(btnId) {\n        const callbackHandle = _m_cp.GetAttributeInt('callback', -1);\n        const closeButton = _m_cp.FindChildTraverse(btnId);\n        _m_elCloseBtn = closeButton;\n        closeButton.SetPanelEvent('onactivate', () => {\n            if (callbackHandle >= 0) {\n                UiToolkitAPI.InvokeJSCallback(callbackHandle);\n            }\n            GameInterfaceAPI.SetChickenAudioExempt('pet_event', false);\n            _m_cp.GetParent().GetParent().SetHasClass('pet-event-blur', false);\n            _m_elPetFrame.RemoveClass('show');\n            _m_cp.FindChildInLayoutFile('id-pet-white').RemoveClass('hide-white');\n            $.DispatchEvent('UIPopupButtonClicked', '');\n            $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.mainmenu_press_quit', 'MOUSE');\n        });\n    }\n    function Close() {\n        if (_m_bWaitingOnContinue) {\n            return;\n        }\n        if (_m_elCloseBtn && _m_elCloseBtn.IsValid()) {\n            $.DispatchEvent('Activated', _m_elCloseBtn, 'keyboard');\n        }\n    }\n    PopupPetEvent.Close = Close;\n    function _CreatePetPreviewPanel() {\n        let mapName = GameInterfaceAPI.GetSettingString('ui_mainmenu_bkgnd_movie') + '_vanity';\n        let elItemModelPreviewPanel = $.CreatePanel('MapPreviewPanel', _m_elItemModelImagePanel, 'PetUpgradePanel', {\n            'require-composition-layer': 'true',\n            'transparent-background': 'false',\n            class: 'inspect-model-image-panel',\n            camera: 'cam_gloves',\n            map: mapName,\n            panzoom_enabled: true,\n            load_map_char_entities_as_info_targets: 'true',\n            load_map_item_entities_as_info_targets: 'true',\n        });\n        _ResetMapEntities(mapName, elItemModelPreviewPanel);\n        return elItemModelPreviewPanel;\n    }\n    function _SpawnPetEventItems() {\n        if (_m_event.expiryReason) {\n            if (_m_event.bEggNoFood) {\n                _m_elPreviewPanel.SpawnModel('nest', 'models/nest/nest.vmdl', '', 'item11');\n                return;\n            }\n            _m_elPreviewPanel.SpawnItem('adult', _m_event.petItemId, '', 'item13');\n            return;\n        }\n        if (_m_event.upgradeLevel === 1) {\n            _m_elPreviewPanel.SpawnModel('nest', 'models/nest/nest.vmdl', '', 'item9');\n            _m_elPreviewPanel.SpawnModelWithItemID('egg', 'models/chicken/chicknegg.vmdl', _m_event.previousPetItemId, '', 'item9');\n            _m_elPreviewPanel.SpawnItem('chick', _m_event.petItemId, '', 'item9');\n        }\n        else if (_m_event.upgradeLevel === 2) {\n            _m_elPreviewPanel.SpawnItem('chick', _m_event.previousPetItemId, '', 'item11');\n            _m_elPreviewPanel.SpawnItem('teen', _m_event.petItemId, '', 'item12');\n        }\n        else if (_m_event.upgradeLevel === 3) {\n            _m_elPreviewPanel.SpawnItem('teen', _m_event.previousPetItemId, '', 'item12');\n            _m_elPreviewPanel.SpawnItem('adult', _m_event.petItemId, '', 'item13');\n        }\n    }\n    function _PlayPetEvent() {\n        let camera = '';\n        if (_m_event.expiryReason) {\n            camera = _m_event.bMaxAge ? 'expiration' : _m_event.bEggNoFood ? 'pet_growth_teen' : 'retire';\n            _m_elPreviewPanel.TransitionToCamera('cam_' + camera + '_intro', 0);\n            _m_elPreviewPanel.FireEntityInput('adult', 'Alpha', '255');\n            if (_m_event.bMaxAge) {\n                $.Schedule(3, () => {\n                    _m_elPreviewPanel.TransitionToCamera('cam_' + camera, 2);\n                });\n                _m_elPreviewPanel.PlaySequenceOnItem('adult', SEQ_FLY_AWAY);\n            }\n            else {\n                $.Schedule(.25, () => {\n                    _m_elPreviewPanel.TransitionToCamera('cam_' + camera, _m_event.bEggNoFood ? 15 : 5);\n                });\n                $.Schedule(_m_event.bEggNoFood ? 2 : NEGLECT_FADE_SEC, () => { _m_cp.FindChildInLayoutFile('id-pet-model-container').AddClass('fade-black'); });\n                if (_m_event.bEggNoFood) {\n                    return;\n                }\n                _m_elPreviewPanel.PlaySequenceOnItem('adult', SEQ_GRUMPY_RETIRE);\n            }\n            return;\n        }\n        if (_m_event.upgradeLevel === 1) {\n            camera = 'egg_hatch';\n            _m_elPreviewPanel.TransitionToCamera('cam_' + camera + '_intro', 0);\n            _m_elPreviewPanel.TransitionToCamera('cam_' + camera, 4);\n            let hatchNum = 1 + Math.floor(Math.random() * 2);\n            _m_elPreviewPanel.PlaySequenceOnItem('egg', 'chicknegg_hatch0' + hatchNum);\n            _m_elPreviewPanel.PlaySequenceOnItem('chick', 'chicknegg_hatch0' + hatchNum);\n        }\n        else if (_m_event.upgradeLevel === 2) {\n            camera = 'pet_growth_teen';\n            _m_elPreviewPanel.TransitionToCamera('cam_' + camera + '_intro', 0);\n            _m_elPreviewPanel.PlaySequenceOnItem('chick', 'chick_chicken_reveal');\n            _m_elPreviewPanel.FireEntityInput('teen', 'Alpha', '0');\n            _m_elPreviewPanel.PlaySequenceOnItem('teen', 'chick_chicken_reveal');\n            $.Schedule(4, () => {\n                _m_elPreviewPanel.TransitionToCamera('cam_' + camera, 5);\n                _m_elPreviewPanel.FireEntityInput('particle_growth', 'Start');\n                _m_elPreviewPanel.FireEntityInput('chick', 'Alpha', '0');\n                _m_elPreviewPanel.FireEntityInput('teen', 'Alpha', '255');\n            });\n        }\n        else if (_m_event.upgradeLevel === 3) {\n            camera = 'pet_growth_adult';\n            _m_elPreviewPanel.TransitionToCamera('cam_' + camera + '_intro', 0);\n            _m_elPreviewPanel.TransitionToCamera('cam_' + camera, 3);\n            _m_elPreviewPanel.PlaySequenceOnItem('teen', 'chick_chicken_reveal02');\n            _m_elPreviewPanel.FireEntityInput('adult', 'Alpha', '0');\n            _m_elPreviewPanel.PlaySequenceOnItem('adult', 'chick_chicken_reveal02');\n            $.Schedule(3.4, () => {\n                _m_elPreviewPanel.FireEntityInput('particle_growth', 'Start');\n                _m_elPreviewPanel.FireEntityInput('teen', 'Alpha', '0');\n                _m_elPreviewPanel.FireEntityInput('adult', 'Alpha', '255');\n            });\n        }\n    }\n    function _ResetMapEntities(mapName, elItemModelPreviewPanel) {\n        if (mapName === 'de_nuke_vanity') {\n            InspectModelImage.SetSpotlightBrightness(elItemModelPreviewPanel);\n        }\n        else {\n            InspectModelImage.SetSunBrightness(elItemModelPreviewPanel);\n        }\n        InspectModelImage.DisableItemLighting(elItemModelPreviewPanel);\n    }\n})(PopupPetEvent || (PopupPetEvent = {}));\n","scripts/popups/popup_pet_photobooth.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../inspect.ts\" />\n/// <reference path=\"../common/characteranims.ts\" />\n/// <reference path=\"../context_menus/context_menu_color_picker.ts\" />\n/// <reference path=\"../popups/pet_photo_tag.ts\" />\n/// <reference path=\"../popups/pet_photo_library.ts\" />\nvar PopupPetPhotoBooth;\n(function (PopupPetPhotoBooth) {\n    const _m_cp = $.GetContextPanel();\n    const _m_elPhotoFrame = $.GetContextPanel().FindChildInLayoutFile('id-photo-booth-frame');\n    const _m_elItemModelImagePanel = _m_cp.FindChildInLayoutFile('id-pet-model');\n    const _m_elCaptured = _m_cp.FindChildInLayoutFile('id-pet-model-container');\n    let _m_petId = '';\n    let _m_elCloseBtn = null;\n    let _m_currentPose = PetPhotoTag.POSES[0];\n    let _m_photoBoothUpgradeLevel = 0;\n    let _m_petSpawnedForPhotoBooth = false;\n    let _m_elSelectedControls;\n    let _m_photoFilter;\n    let _m_lastSavedPhoto = '';\n    let m_aspectRatio = '';\n    let _m_currentAttachment = '';\n    const STUDIO_STAGE = 'ui/pet_photo_studio';\n    let _m_currentStage = STUDIO_STAGE;\n    const DEFAULT_WALLPAPER = '1';\n    let _m_currentWallpaper = DEFAULT_WALLPAPER;\n    let _m_setupValues = {};\n    function Init() {\n        const popupPetParams = _m_cp.GetAttributeString('pet_id', '').split(',');\n        _m_petId = (popupPetParams && (popupPetParams.length > 0)) ? popupPetParams[0] : '';\n        _m_setupValues = _ReadSetup(_m_cp.GetAttributeString('booth_setup', ''));\n        GameInterfaceAPI.SetChickenAudioSuppressed('pet_photobooth', true);\n        _m_cp.GetParent().GetParent().SetHasClass('pet-event-blur', true);\n        _SetupCloseBtn('id-pet-photo-close-btn');\n        _m_cp.FindChildTraverse('id-pet-photo-book-btn').visible = _m_cp.GetAttributeInt('from_book', 0) === 1;\n        _SetUpPhotoBooth(_m_petId);\n    }\n    PopupPetPhotoBooth.Init = Init;\n    function _SetupCloseBtn(btnId) {\n        const callbackHandle = _m_cp.GetAttributeInt('callback', -1);\n        const closeButton = _m_cp.FindChildTraverse(btnId);\n        _m_elCloseBtn = closeButton;\n        closeButton.SetPanelEvent('onactivate', () => {\n            _CancelPhotoJobs();\n            GameInterfaceAPI.SetChickenAudioSuppressed('pet_photobooth', false);\n            if (callbackHandle >= 0) {\n                UiToolkitAPI.InvokeJSCallback(callbackHandle);\n            }\n            $.DispatchEvent('UIPopupButtonClicked', '');\n            $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.mainmenu_press_quit', 'MOUSE');\n        });\n    }\n    function OpenBook() {\n        UiToolkitAPI.ShowCustomLayoutPopupParameters('', 'file://{resources}/layout/popups/popup_pet_book.xml', 'spread=' + _m_cp.GetAttributeString('book_spread', '0')\n            + '&' + 'booth_setup=' + _SetupString()\n            + '&' + 'from_booth=1');\n        Close();\n    }\n    PopupPetPhotoBooth.OpenBook = OpenBook;\n    function Close() {\n        if (_m_elCloseBtn && _m_elCloseBtn.IsValid()) {\n            $.DispatchEvent('Activated', _m_elCloseBtn, 'keyboard');\n        }\n    }\n    PopupPetPhotoBooth.Close = Close;\n    function _ResetMapEntities(mapName, elItemModelPreviewPanel) {\n        if (mapName === 'de_nuke_vanity') {\n            InspectModelImage.SetSpotlightBrightness(elItemModelPreviewPanel);\n        }\n        else {\n            InspectModelImage.SetSunBrightness(elItemModelPreviewPanel);\n        }\n        InspectModelImage.DisableItemLighting(elItemModelPreviewPanel);\n    }\n    const aAdjust = [\n        { type: 'exposure', kind: 'post-pair', min: -1, max: 1, default: 0, down: 'pet_post_exposure_down', up: 'pet_post_exposure_up' },\n        { type: 'saturation', kind: 'post-pair', min: -1, max: 1, default: 0, down: 'pet_post_saturation_down', up: 'pet_post_saturation_up' },\n        { type: 'vibrance', kind: 'post-pair', min: -1, max: 1, default: 0, down: 'pet_post_vibrance_down', up: 'pet_post_vibrance_up' },\n        { type: 'brightness', kind: 'brightness', min: .8, max: 2, default: 1 },\n        { type: 'bloom', kind: 'post-single', min: 0, max: 1, default: 0, entity: 'pet_post_bloom' },\n        { type: 'contrast', kind: 'post-pair', min: -1, max: 1, default: 0, down: 'pet_post_contrast_down', up: 'pet_post_contrast_up' },\n        { type: 'vignette', kind: 'overlay', min: 0, max: .8, default: .14, panel_id: 'id-pet-photo-overlay' },\n        { type: 'grain', kind: 'overlay', min: 0, max: .7, default: 0, panel_id: 'id-pet-photo-grain' },\n        { type: 'grime', kind: 'overlay', min: 0, max: .5, default: 0, panel_id: 'id-pet-photo-grime' },\n        { type: 'filter-strength', kind: 'filter', min: 0, max: 1, default: 1 },\n    ];\n    const aWallpapers = [\n        { skin: '0', swatch: '' },\n        { skin: '1', swatch: 'blue' },\n        { skin: '2', swatch: 'green' },\n        { skin: '3', swatch: 'purple' },\n        { skin: '4', swatch: 'yellow' },\n        { skin: '5', swatch: 'brown' },\n        { skin: '6', swatch: 'red' },\n        { skin: '7', swatch: 'black' },\n        { skin: '8', swatch: 'sky' },\n        { skin: '10', swatch: 'abstract' },\n    ];\n    const NO_HEADWEAR = 'none';\n    const SETUP_PAIR_SEPARATOR = ';';\n    const SETUP_KEY_VALUE_SEPARATOR = ':';\n    const aSetupFields = [\n        { key: 'stage', Read: () => _StageNameForMap(_m_currentStage) },\n        { key: 'paper', Read: () => _m_currentWallpaper, Apply: _SelectWallpaper },\n        { key: 'pose', Read: () => _m_currentPose.name, Apply: _SelectPose },\n        { key: 'aspect', Read: () => m_aspectRatio, Apply: _SelectAspect },\n        { key: 'filter', Read: () => _m_photoFilter || 'normal', Apply: _SelectFilter },\n        { key: 'headwear', Read: () => _HeadwearNameForModel(_m_currentAttachment), Apply: _SelectHeadwear },\n        ...aAdjust.map(adjust => ({\n            key: adjust.type,\n            Read: () => String(_SliderValue(adjust)),\n            Apply: (strValue) => _SetSliderValue(adjust, strValue),\n        })),\n    ];\n    function _SetupString() {\n        return aSetupFields\n            .map(field => field.key + SETUP_KEY_VALUE_SEPARATOR + field.Read())\n            .join(SETUP_PAIR_SEPARATOR);\n    }\n    function _ReadSetup(strSetup) {\n        const values = {};\n        strSetup.split(SETUP_PAIR_SEPARATOR).forEach(strPair => {\n            const nSplit = strPair.indexOf(SETUP_KEY_VALUE_SEPARATOR);\n            if (nSplit > 0) {\n                values[strPair.substring(0, nSplit)] = strPair.substring(nSplit + 1);\n            }\n        });\n        return values;\n    }\n    function _ApplySetup() {\n        aSetupFields.forEach(field => {\n            const strValue = _m_setupValues[field.key];\n            if (field.Apply && strValue !== undefined) {\n                field.Apply(strValue);\n            }\n        });\n    }\n    function _SetupStageMap() {\n        const row = PetPhotoTag.STAGES.find(entry => entry.name === _m_setupValues['stage']);\n        return row && _BStageUnlocked(row) ? row.map : STUDIO_STAGE;\n    }\n    function _WallpaperBtnId(strSkin) {\n        return 'id-photo-backdrop-' + strSkin;\n    }\n    function _SelectWallpaper(strSkin) {\n        if (!aWallpapers.some(paper => paper.skin === strSkin)) {\n            return;\n        }\n        _m_cp.FindChildTraverse(_WallpaperBtnId(strSkin)).checked = true;\n        UpdateWallpaper(strSkin);\n    }\n    function _StageNameForMap(strMap) {\n        const row = PetPhotoTag.STAGES.find(entry => entry.map === strMap);\n        return row ? row.name : PetPhotoTag.STAGES[0].name;\n    }\n    function _SelectPose(strName) {\n        const pose = PetPhotoTag.POSES.find(row => row.name === strName);\n        if (!pose) {\n            return;\n        }\n        _m_cp.FindChildTraverse(_PoseBtnId(pose.name)).checked = true;\n        UpdatePhotoPoseSettings(pose);\n    }\n    function _SelectAspect(strName) {\n        if (!PetPhotoTag.ASPECTS.some(row => row.name === strName)) {\n            return;\n        }\n        _m_cp.FindChildTraverse(_AspectBtnId(strName)).checked = true;\n        UpdateAspectRatioSettings(strName);\n    }\n    function _SelectFilter(strName) {\n        if (!PetPhotoTag.FILTERS.some(row => row.name === strName)) {\n            return;\n        }\n        _m_cp.FindChildTraverse(_FilterBtnId(strName)).checked = true;\n        OnFilterEffect(strName);\n    }\n    function _SelectHeadwear(strName) {\n        const strModel = _HeadwearModelForName(strName);\n        if (strModel === undefined) {\n            return;\n        }\n        _m_cp.FindChildTraverse(_HeadwearBtnId(strName)).checked = true;\n        AttachModel(strModel);\n    }\n    function _HeadwearModelForName(strName) {\n        if (strName === NO_HEADWEAR) {\n            return '';\n        }\n        return PetPhotoTag.HEADWEAR.find(entry => entry.name === strName)?.model;\n    }\n    function _HeadwearNameForModel(strModel) {\n        const row = PetPhotoTag.HEADWEAR.find(entry => entry.model === strModel);\n        return row ? row.name : NO_HEADWEAR;\n    }\n    function _SliderValue(adjust) {\n        const elSlider = _GetSlider(adjust.type);\n        return elSlider ? elSlider.value : adjust.default;\n    }\n    function _SetSliderValue(adjust, strValue) {\n        const elSlider = _GetSlider(adjust.type);\n        const value = Number(strValue);\n        if (!elSlider || !isFinite(value)) {\n            return;\n        }\n        elSlider.value = Math.max(adjust.min, Math.min(value, adjust.max));\n        _ApplyAdjust(adjust, elSlider.value);\n    }\n    function _SetUpPhotoBooth(petItemId) {\n        _m_photoBoothUpgradeLevel = Number(_m_cp.GetAttributeString('upgrade_level', ''));\n        if (_m_photoBoothUpgradeLevel > 0) {\n            _MakeSettingsButtons();\n            _MakeActivityButtons();\n            _MakeHeadwearButtons();\n            _m_cp.FindChildInLayoutFile('id-pet-sticker-search')\n                .SetPanelEvent('ontextentrychange', UpdateStickerList);\n            $.RegisterEventHandler('CSGOInventoryItemLoaded', _m_cp.FindChildInLayoutFile('id-pet-sticker-item-list'), _RefreshStickerTile);\n            _m_cp.FindChildTraverse('id-photo-team-ct').checked = true;\n            _m_currentStage = _SetupStageMap();\n            _MakePoseButtons();\n            const defaultPose = PetPhotoTag.POSES[0];\n            _m_cp.FindChildTraverse(_PoseBtnId(defaultPose.name)).checked = true;\n            _ApplyAgeGates();\n            UpdatePhotoPoseSettings(defaultPose);\n            _MakeAspectButtons();\n            _m_cp.FindChildTraverse(_AspectBtnId('1x1')).checked = true;\n            UpdateAspectRatioSettings('1x1');\n            _MakeAdjustSliders();\n            SliderDefaults();\n            PhotoGridSliderDefaults();\n            _MakeFilterButtons();\n            $.Schedule(.25, () => {\n                if (_m_currentStage !== STUDIO_STAGE) {\n                    _SettleStage(_m_currentStage);\n                }\n                TurnOffAllFilters();\n                _m_cp.FindChildTraverse(_FilterBtnId('normal')).checked = true;\n                OnFilterEffect('normal');\n                _RefreshAdjustments();\n                _ApplySetup();\n            });\n            _MakeMapButtons();\n            _MakeWallpaperButtons();\n            _m_cp.FindChildTraverse(_WallpaperBtnId(DEFAULT_WALLPAPER)).checked = true;\n            _m_cp.FindChildTraverse(_StageBtnId(_StageNameForMap(_m_currentStage))).checked = true;\n            SetWallpaperOnStageChange(_m_currentStage === STUDIO_STAGE);\n            _m_cp.FindChildTraverse('id-photo-headwear-none').checked = true;\n            AttachModel('');\n            _SetUpPhotoLibrary();\n            LoadPreviousPhotos();\n            _StartZoomReadout();\n            _RefreshCountdown();\n        }\n    }\n    function _MakeSettingsButtons() {\n        const bHasStickers = _StickerCount() > 0;\n        let aSettings = [\n            {\n                setting_id: 'grid',\n                class: 'IconButton',\n                icon: 'photo_grid',\n                make_separator: true,\n            },\n            {\n                setting_id: 'adjust',\n                class: 'IconButton',\n                icon: 'tune',\n            },\n            {\n                setting_id: 'filters',\n                class: 'IconButton',\n                icon: 'filters',\n            },\n            {\n                setting_id: 'format',\n                class: 'IconButton',\n                icon: 'aspect_ratio',\n                make_separator: true,\n            },\n            {\n                setting_id: 'poses',\n                class: 'IconButton',\n                icon: 'cheer',\n            },\n            {\n                setting_id: 'team',\n                class: 'IconButton',\n                icon: 'ct_logo_1c',\n            },\n            {\n                setting_id: 'stage',\n                class: 'IconButton',\n                icon: 'picture',\n            },\n            {\n                setting_id: 'headwear',\n                class: 'IconButton',\n                icon: 'helmet',\n                make_separator: true,\n            },\n            {\n                setting_id: 'stickers',\n                class: 'IconButton',\n                icon: 'sticker',\n                locked_tip: bHasStickers ? '' : '#pet_photo_booth_no_stickers',\n            },\n            {\n                setting_id: 'light',\n                class: 'IconButton',\n                icon: 'colorwheel',\n                on_activate: () => { ShowLightColorPicker(); },\n                studio_only: true,\n            },\n        ];\n        const namePrefix = 'id-pet-setting-btn-';\n        const elParent = _m_cp.FindChildInLayoutFile('id-pet-photo-controls');\n        aSettings.forEach(btn => {\n            let elBtn = btn.on_activate\n                ? $.CreatePanel('Button', elParent, namePrefix + btn.setting_id, {\n                    class: btn.class\n                })\n                : $.CreatePanel('RadioButton', elParent, namePrefix + btn.setting_id, {\n                    class: btn.class,\n                    group: 'control'\n                });\n            elBtn.BLoadLayoutSnippet('setting-btn');\n            elBtn.FindChildInLayoutFile('id-pet-setting-btn-icon').SetImage(\"file://{images}/icons/ui/\" + btn.icon + \".svg\");\n            const bLocked = !!btn.locked_tip;\n            const settingName = $.Localize(bLocked ? btn.locked_tip\n                : '#pet_photo_booth_setting_' + btn.setting_id);\n            elBtn.enabled = !bLocked;\n            elBtn.SetPanelEvent('onmouseover', () => { UiToolkitAPI.ShowTextTooltip(elBtn.id, settingName); });\n            elBtn.SetPanelEvent('onmouseout', () => { UiToolkitAPI.HideTextTooltip(); });\n            const fnActivate = btn.on_activate ? btn.on_activate : () => { ShowSettingsRow(btn.setting_id); };\n            elBtn.SetPanelEvent('onactivate', fnActivate);\n            if (btn.studio_only) {\n                elBtn.SetAttributeString('data-studio-only', 'true');\n            }\n            if (btn.make_separator) {\n                $.CreatePanel('Panel', elParent, namePrefix + btn.setting_id, { class: 'photo-booth-controls__separator' });\n            }\n        });\n    }\n    function _StageBtnId(strStage) {\n        return 'id-photo-stage-' + strStage;\n    }\n    function _MakeWallpaperButtons() {\n        const elParent = _m_cp.FindChildInLayoutFile('id-photo-wallpaper-swatches');\n        aWallpapers.forEach(paper => {\n            if (elParent.FindChildInLayoutFile(_WallpaperBtnId(paper.skin))) {\n                return;\n            }\n            const elBtn = $.CreatePanel('RadioButton', elParent, _WallpaperBtnId(paper.skin), {\n                class: 'photo-booth-settings__btn',\n                group: 'wallpaper'\n            });\n            const elIcon = $.CreatePanel('Panel', elBtn, '', { class: 'photo-booth-background-icon' });\n            if (paper.swatch !== '') {\n                elIcon.AddClass(paper.swatch);\n            }\n            elBtn.SetPanelEvent('onactivate', () => { UpdateWallpaper(paper.skin); });\n        });\n    }\n    function _MakeMapButtons() {\n        const elParent = _m_cp.FindChildInLayoutFile('id-photo-settings-stage');\n        PetPhotoTag.STAGES.forEach(stage => {\n            let elBtn = elParent.FindChildInLayoutFile(_StageBtnId(stage.name));\n            if (!elBtn) {\n                elBtn = $.CreatePanel('RadioButton', elParent, _StageBtnId(stage.name), {\n                    class: 'photo-booth-settings__btn',\n                    group: 'stage'\n                });\n                $.CreatePanel('Label', elBtn, '', {\n                    text: PetPhotoTag.WordFor('s', String(stage.id)),\n                    class: \"stratum-regular\"\n                });\n                elBtn.SetPanelEvent('onactivate', () => { ChangeStage(stage.map); });\n            }\n            const hasRequirement = Boolean(stage.achievement) || Boolean(stage.age_requirement);\n            const bComplete = _BStageUnlocked(stage);\n            if (hasRequirement) {\n                elBtn.enabled = bComplete;\n                if (!bComplete) {\n                    const strTip = stage.age_requirement ? '#pet_photo_booth_map_locked_age'\n                        : _m_photoBoothUpgradeLevel === GROWTH_CHICK ? '#pet_photo_booth_map_locked_chick'\n                            : '#pet_photo_booth_map_locked_teen';\n                    elBtn.SetPanelEvent('onmouseover', () => { UiToolkitAPI.ShowTextTooltip(elBtn.id, strTip); });\n                    elBtn.SetPanelEvent('onmouseout', () => { UiToolkitAPI.HideTextTooltip(); });\n                }\n            }\n        });\n    }\n    function _BStageUnlocked(stage) {\n        if (stage.age_requirement) {\n            return _m_photoBoothUpgradeLevel >= stage.age_requirement;\n        }\n        if (stage.achievement) {\n            return InventoryAPI.PetHasAchievement(_m_petId, stage.achievement);\n        }\n        return true;\n    }\n    function _SettleStage(strMap) {\n        const elPanel = _GetPicturePanel();\n        if (!elPanel) {\n            return;\n        }\n        elPanel.FireEntityInput('post_vanity', 'Disable');\n        _ResetMapEntities(strMap, elPanel);\n        _RefreshAdjustments();\n        _RefreshLightColors();\n    }\n    function _GetPhotoBoothMapPanel() {\n        let elPanel = _m_elItemModelImagePanel.FindChildInLayoutFile('id-pet-picture-panel');\n        if (!elPanel) {\n            elPanel = $.CreatePanel('MapPlayerPreviewPanel', _m_elItemModelImagePanel, 'id-pet-picture-panel', {\n                \"require-composition-layer\": \"true\",\n                \"transparent-background\": \"false\",\n                \"pin-fov\": \"vertical\",\n                class: 'inspect-model-image-panel',\n                camera: 'cam_pet_photo',\n                player: \"true\",\n                map: _m_currentStage,\n                initial_entity: 'item',\n                mouse_rotate: false,\n                playername: \"vanity_character\",\n                workshop_preview: false,\n                panzoom_enabled: true,\n                drag_rotate: true,\n            });\n            if (elPanel.PanZoomEnabled()) {\n                elPanel.hittest = true;\n                elPanel.SetAcceptsInput(true);\n                elPanel.SetAcceptsFocus(true);\n            }\n            elPanel.SetDragRotateYawLimit(30);\n            _m_cp.FindChildInLayoutFile('id-pet-photo-overlay').SetParent(_m_elItemModelImagePanel);\n            return elPanel;\n        }\n        return elPanel;\n    }\n    const GROWTH_CHICK = 1;\n    const GROWTH_ADOLESCENT = 2;\n    const GROWTH_ADULT = 3;\n    const aGrowth = [\n        { level: GROWTH_CHICK, entityName: 'chick', soloCamera: 'cam_pet_pose_solo_1', soloOrbit: 36, headwearScale: 1.0, soundStage: 'Chick' },\n        { level: GROWTH_ADOLESCENT, entityName: 'teen', soloCamera: 'cam_pet_pose_solo_2', soloOrbit: 45, headwearScale: 0.43, soundStage: 'Pullet' },\n        { level: GROWTH_ADULT, entityName: 'adult', soloCamera: 'cam_pet_pose_solo_3', soloOrbit: 55, headwearScale: 0.55, soundStage: 'Hen' },\n    ];\n    function _Growth() {\n        const aFound = aGrowth.filter(growth => growth.level === _m_photoBoothUpgradeLevel);\n        return aFound.length > 0 ? aFound[0] : aGrowth[aGrowth.length - 1];\n    }\n    let _m_aActivityBtns = [];\n    function _ActivityBtnId(strActivity) { return 'id-photo-activity-' + strActivity; }\n    function _MakeActivityButtons() {\n        const elParent = _m_cp.FindChildInLayoutFile('id-pet-photo-activity-bar');\n        _m_aActivityBtns = [];\n        PetPhotoTag.ACTIVITIES.forEach(activity => {\n            const elBtn = $.CreatePanel('Button', elParent, _ActivityBtnId(activity.name), {\n                class: 'IconButton'\n            });\n            const btn = { row: activity, el: elBtn };\n            _m_aActivityBtns.push(btn);\n            $.CreatePanel('Image', elBtn, '', {\n                src: 'file://{images}/icons/ui/' + activity.icon + '.svg',\n                textureheight: '32',\n                texturewidth: '-1'\n            });\n            $.CreatePanel('Panel', elBtn, '', { class: 'Spinner photo-booth-activity__spinner' });\n            elBtn.SetPanelEvent('onactivate', () => { PlayPetActivity(btn); });\n        });\n    }\n    const ACTIVITY_START = .5;\n    const ACTIVITY_MAX = 5.0;\n    const ACTIVITY_POLL = .1;\n    let _m_running = undefined;\n    let _m_activityJob = undefined;\n    function _ClearActivity() {\n        _m_activityJob = _CancelJob(_m_activityJob);\n        _m_running = undefined;\n    }\n    function _TickActivity() {\n        _m_activityJob = undefined;\n        const running = _m_running;\n        if (!running) {\n            return;\n        }\n        running.flElapsed += ACTIVITY_POLL;\n        const bIsRow = _CurrentActivity() === running.row;\n        const bFirstSeen = bIsRow && !running.bSeen;\n        running.bSeen = running.bSeen || bIsRow;\n        if (bFirstSeen) {\n            const strSound = running.row.sound?.[_Growth().soundStage];\n            if (strSound) {\n                UiToolkitAPI.PlaySoundEvent(strSound);\n            }\n        }\n        const bOver = running.bSeen ? !bIsRow : running.flElapsed >= ACTIVITY_START;\n        if (bOver || running.flElapsed >= ACTIVITY_MAX) {\n            _ClearActivity();\n            _RefreshActivityButtons();\n            return;\n        }\n        _m_activityJob = $.Schedule(ACTIVITY_POLL, _TickActivity);\n    }\n    function _RefreshActivityButtons() {\n        const bSolo = _IsSoloPose(_m_currentPose);\n        _m_aActivityBtns.forEach(btn => {\n            const strAgeTip = _m_ageTips[btn.el.id] || '';\n            const bRunning = _m_running !== undefined && _m_running.row === btn.row;\n            btn.el.enabled = strAgeTip === '' && bSolo && (_m_running === undefined || bRunning);\n            btn.el.SetHasClass('photo-booth-activity--busy', bRunning);\n            btn.el.SetHasClass('no-hover', bRunning);\n            const strTip = strAgeTip !== '' ? strAgeTip\n                : (bSolo ? PetPhotoTag.WordFor('v', String(btn.row.id))\n                    : '#pet_photo_booth_setting_restriction_tooltip');\n            btn.el.SetPanelEvent('onmouseover', () => { UiToolkitAPI.ShowTextTooltip(btn.el.id, strTip); });\n            btn.el.SetPanelEvent('onmouseout', () => { UiToolkitAPI.HideTextTooltip(); });\n        });\n    }\n    function PlayPetActivity(btn) {\n        if (_m_ageTips[btn.el.id] || !_IsSoloPose(_m_currentPose) || _m_running !== undefined) {\n            return;\n        }\n        const elPanel = _GetPhotoBoothMapPanel();\n        const activity = btn.row;\n        if (activity.variation === undefined) {\n            elPanel.SetPetActivityOnItem(_Growth().entityName, activity.activity);\n        }\n        else {\n            elPanel.SetPetActivityAndVariationOnItem(_Growth().entityName, activity.activity, activity.variation);\n        }\n        _m_running = { row: activity, bSeen: false, flElapsed: 0 };\n        _m_activityJob = $.Schedule(ACTIVITY_POLL, _TickActivity);\n        _RefreshActivityButtons();\n    }\n    function _PoseBtnId(strPose) {\n        return 'id-photo-pose-' + strPose;\n    }\n    function _MakePoseButtons() {\n        const elParent = _m_cp.FindChildInLayoutFile('id-photo-settings-poses');\n        PetPhotoTag.POSES.forEach(pose => {\n            if (elParent.FindChildInLayoutFile(_PoseBtnId(pose.name))) {\n                return;\n            }\n            const elBtn = $.CreatePanel('RadioButton', elParent, _PoseBtnId(pose.name), {\n                class: 'photo-booth-settings__btn',\n                group: 'poses'\n            });\n            $.CreatePanel('Label', elBtn, '', {\n                text: PetPhotoTag.WordFor('p', pose.name),\n                class: 'stratum-regular'\n            });\n            elBtn.SetPanelEvent('onactivate', () => { UpdatePhotoPoseSettings(pose); });\n        });\n    }\n    const SOLO_SHOT = {\n        introCamera: 'cam_pet_pose_solo_intro',\n        effectPrefix: 'solo_',\n    };\n    const POSED_SHOT = {\n        introCamera: 'cam_pet_pose_intro',\n        effectPrefix: '',\n    };\n    function _IsSoloPose(pose) { return pose.name === '0'; }\n    const aAgeGates = [\n        { ids: ['id-photo-pose-8', 'id-photo-pose-9', 'id-photo-pose-10'],\n            max: GROWTH_CHICK, tip: '#pet_photo_booth_age_outgrown' },\n        { ids: ['id-photo-pose-2', 'id-photo-pose-4', 'id-photo-pose-5', 'id-photo-pose-6'],\n            min: GROWTH_ADOLESCENT, tip: '#pet_photo_booth_age_dangerous' },\n        { ids: ['id-photo-pose-1', 'id-photo-pose-3', 'id-photo-pose-7'],\n            min: GROWTH_ADULT, tip: '#pet_photo_booth_age_maturity' },\n        { ids: ['id-photo-effect-sparks', 'id-photo-effect-laser', 'id-photo-effect-beam'],\n            min: GROWTH_ADOLESCENT, tip: '#pet_photo_booth_age_scary' },\n        { ids: ['id-photo-effect-fire', 'id-photo-effect-lightning', 'id-photo-effect-explosion'],\n            min: GROWTH_ADULT, tip: '#pet_photo_booth_age_scary' },\n        { ids: [_ActivityBtnId('jump'), _ActivityBtnId('wag'), _ActivityBtnId('moonwalk')],\n            min: GROWTH_ADOLESCENT, tip: '#pet_photo_booth_age_tricks' },\n        { ids: [_ActivityBtnId('kick'), _ActivityBtnId('fly')],\n            min: GROWTH_ADULT, tip: '#pet_photo_booth_age_tricks' },\n    ];\n    const ACHIEVEMENT_UNLOCKS = {\n        'id-photo-effect-fire': 'killed-by-burn',\n        'id-photo-effect-lightning': 'killed-by-taser',\n        'id-photo-effect-explosion': 'killed-by-planted-c4',\n    };\n    const ACHIEVEMENT_LOCKED_TIP = '#pet_photo_booth_age_scary_brave';\n    let _m_ageTips = {};\n    function _ApplyAgeGates() {\n        aAgeGates.forEach(gate => {\n            const bAllowed = (gate.min === undefined || _m_photoBoothUpgradeLevel >= gate.min) &&\n                (gate.max === undefined || _m_photoBoothUpgradeLevel <= gate.max);\n            gate.ids.forEach(strId => {\n                const elBtn = _m_cp.FindChildTraverse(strId);\n                if (!elBtn || !elBtn.IsValid()) {\n                    return;\n                }\n                const strAchievement = ACHIEVEMENT_UNLOCKS[strId];\n                if (bAllowed || (strAchievement !== undefined &&\n                    InventoryAPI.PetHasAchievement(_m_petId, strAchievement))) {\n                    return;\n                }\n                const strTip = strAchievement !== undefined ? ACHIEVEMENT_LOCKED_TIP : gate.tip;\n                _m_ageTips[strId] = strTip;\n                elBtn.enabled = false;\n                elBtn.SetPanelEvent('onmouseover', () => { UiToolkitAPI.ShowTextTooltip(strId, strTip); });\n                elBtn.SetPanelEvent('onmouseout', () => { UiToolkitAPI.HideTextTooltip(); });\n            });\n        });\n    }\n    function _PoseShot(pose) { return _IsSoloPose(pose) ? SOLO_SHOT : POSED_SHOT; }\n    function _PoseOrbitRadius(pose) {\n        return pose.orbit === undefined ? _Growth().soloOrbit : pose.orbit;\n    }\n    function _PoseCamera(pose) {\n        return _IsSoloPose(pose) ? _Growth().soloCamera : 'cam_pet_pose_' + pose.name;\n    }\n    function UpdatePhotoPoseSettings(pose) {\n        let elPanel = _GetPhotoBoothMapPanel();\n        const shot = _PoseShot(pose);\n        elPanel.ResetPanZoom();\n        elPanel.ResetDragRotate();\n        elPanel.SetDragRotateRadius(_PoseOrbitRadius(pose));\n        elPanel.SetZoomLimit(25);\n        elPanel.TransitionToCamera(shot.introCamera, 0);\n        elPanel.TransitionToCamera(_PoseCamera(pose), 2);\n        _SetCharacterAndPetPose(elPanel, pose);\n    }\n    function _SetCharacterAndPetPose(elPanel, pose) {\n        if (_IsSoloPose(pose)) {\n            if (!_m_petSpawnedForPhotoBooth) {\n                elPanel.SpawnItem(_Growth().entityName, _m_petId, '', 'pet1');\n                _m_petSpawnedForPhotoBooth = true;\n            }\n            elPanel.FireEntityInput(_Growth().entityName, 'Alpha', '255');\n            elPanel.FireEntityInput('dynamic_player6', 'Alpha', '0');\n        }\n        else {\n            let selectedBtn = _m_cp.FindChildInLayoutFile('id-photo-settings-team').Children()[0].GetSelectedButton();\n            const team = selectedBtn.GetAttributeString('data-type', 'ct');\n            let charId = LoadoutAPI.GetItemID(team, 'customplayer');\n            const settings = ItemInfo.GetOrUpdateVanityCharacterSettings(charId);\n            settings.panel = elPanel;\n            settings.petItemId = _m_petId;\n            elPanel.SetActiveCharacter(6);\n            let model = ItemInfo.GetModelPlayer(charId);\n            elPanel.SetPlayerCharacterItemID(charId);\n            elPanel.SetPlayerModel(model);\n            elPanel.EquipPlayerWithItem(LoadoutAPI.GetItemID(team, 'clothing_hands'));\n            elPanel.SetPetPlacement(!!_m_petId && Number(_m_petId) != 0 ? 'origin' : 'none');\n            elPanel.EquipPlayerWithPet(_m_petId);\n            elPanel.PlayChickSnapshotAnimation(Number(pose.name));\n            elPanel.FireEntityInput(_Growth().entityName, 'Alpha', '0');\n            elPanel.FireEntityInput('dynamic_player6', 'Alpha', '255');\n        }\n        _m_currentPose = pose;\n        _EnableDisablePhotoSettings();\n        _ApplyAttachment();\n    }\n    let _m_captureJob = undefined;\n    let _m_verifyJob = undefined;\n    let _m_bCapturing = false;\n    function _CancelJob(nJob) {\n        if (nJob !== undefined) {\n            $.CancelScheduled(nJob);\n        }\n        return undefined;\n    }\n    const COMPOSITION_LAYER_WARMUP = .1;\n    const CAPTURE_VERIFY_SEC = .2;\n    const CAPTURE_TRIES = 4;\n    const PHOTO_MAX_LONG_EDGE = 1200;\n    const PHOTO_JPEG_QUALITY = 95;\n    const COUNTDOWN_SEC = 3;\n    function _BTimerMode() { return _m_cp.FindChildInLayoutFile('id-pet-take-picture').checked; }\n    function _SetShutterEnabled(bEnabled) {\n        _m_cp.FindChildInLayoutFile('id-pet-take-picture-instant').enabled = bEnabled;\n    }\n    function _RefreshCountdown() {\n        const elCountdown = _m_cp.FindChildInLayoutFile('id-pet-countdown');\n        elCountdown.SetDialogVariableInt('countdown', COUNTDOWN_SEC);\n        elCountdown.SetHasClass('show', _BTimerMode());\n        elCountdown.SetHasClass('running', false);\n    }\n    function ToggleTimerMode() {\n        _CancelCapture();\n        _RefreshCountdown();\n    }\n    PopupPetPhotoBooth.ToggleTimerMode = ToggleTimerMode;\n    function _BeginCapture() {\n        _m_bCapturing = true;\n        _SetShutterEnabled(false);\n        _m_elCaptured.SetCompositionLayerTextureName(m_aspectRatio);\n        _SetCapturing(true);\n    }\n    function _SetCapturing(bCapturing) {\n        _m_elCaptured.SetHasClass('pet-capturing', bCapturing);\n    }\n    function _CancelCapture() {\n        _m_captureJob = _CancelJob(_m_captureJob);\n        _m_verifyJob = _CancelJob(_m_verifyJob);\n        if (_m_bCapturing) {\n            _EndCapture();\n        }\n    }\n    function _EndCapture() {\n        _m_bCapturing = false;\n        _SetShutterEnabled(true);\n        _SetCapturing(false);\n        _RefreshCountdown();\n    }\n    function _CancelPhotoJobs() {\n        _CancelCapture();\n        _m_zoomReadoutJob = _CancelJob(_m_zoomReadoutJob);\n        _ClearActivity();\n    }\n    function _WritePhoto() {\n        _m_captureJob = undefined;\n        const strFileName = 'pet_' + Date.now() + _PhotoMetaTag() + PetPhotoTag.EXT;\n        _m_lastSavedPhoto = strFileName;\n        _WriteLayerJPEG(strFileName);\n        _m_cp.FindChildInLayoutFile('id-pet-white').TriggerClass('photo-flash');\n        UiToolkitAPI.PlaySoundEvent('Chicken.Camera.Shoot');\n        _EndCapture();\n        _m_verifyJob = $.Schedule(CAPTURE_VERIFY_SEC, () => { _VerifyPhoto(strFileName, 1); });\n    }\n    function _WriteLayerJPEG(strFileName) {\n        const strPath = GameInterfaceAPI.PreparePetPhoto(_m_petId, strFileName);\n        if (!strPath) {\n            return;\n        }\n        _m_elCaptured.WriteCompositionLayerJPEG(strPath, 'USRLOCAL', PHOTO_MAX_LONG_EDGE, PHOTO_JPEG_QUALITY);\n    }\n    function _VerifyPhoto(strFileName, nTry) {\n        _m_verifyJob = undefined;\n        if (_PhotoOnDisk(strFileName)) {\n            PetPhotoLibrary.Insert(strFileName);\n            return;\n        }\n        if (nTry < CAPTURE_TRIES) {\n            _WriteLayerJPEG(strFileName);\n            _m_verifyJob = $.Schedule(CAPTURE_VERIFY_SEC, () => { _VerifyPhoto(strFileName, nTry + 1); });\n            return;\n        }\n        const nStickers = _m_elCaptured\n            .FindChildrenWithClassTraverse('placed-sticker-container').length;\n        if (_m_lastSavedPhoto === strFileName) {\n            _m_lastSavedPhoto = '';\n        }\n        _WarnPhotoFailed();\n    }\n    function _PhotoOnDisk(strFileName) {\n        return GameInterfaceAPI.FindFiles(PetPhotoTag.LibraryFolder(_m_petId) + '/' + strFileName, 'USRLOCAL').length > 0;\n    }\n    let _m_bSaveFailureShown = false;\n    function _WarnPhotoFailed() {\n        if (_m_bSaveFailureShown) {\n            return;\n        }\n        _m_bSaveFailureShown = true;\n        UiToolkitAPI.ShowGenericPopupOneOption('#pet_photo_save_failed_title', '#pet_photo_save_failed_desc', '', '#pet_photo_save_failed_leave', () => { Close(); });\n    }\n    function _Countdown(nRemaining) {\n        const elCountdown = _m_cp.FindChildInLayoutFile('id-pet-countdown');\n        if (nRemaining === 0) {\n            _WritePhoto();\n            return;\n        }\n        elCountdown.SetDialogVariableInt('countdown', nRemaining);\n        UiToolkitAPI.PlaySoundEvent('UI.Premier.CounterTimer');\n        _m_captureJob = $.Schedule(1, () => { _Countdown(nRemaining - 1); });\n    }\n    function TakePhoto() {\n        if (_m_bCapturing) {\n            return;\n        }\n        _CancelCapture();\n        _BeginCapture();\n        if (_BTimerMode()) {\n            _m_cp.FindChildInLayoutFile('id-pet-countdown').SetHasClass('running', true);\n            _Countdown(COUNTDOWN_SEC);\n            return;\n        }\n        _m_captureJob = $.Schedule(COMPOSITION_LAYER_WARMUP, _WritePhoto);\n    }\n    PopupPetPhotoBooth.TakePhoto = TakePhoto;\n    function _PhotoMetaTag() {\n        const activity = _CurrentActivity();\n        return PetPhotoTag.Compose({\n            pose: _m_currentPose.name,\n            filter: _m_photoFilter || 'normal',\n            stageMap: _m_currentStage,\n            growth: _m_photoBoothUpgradeLevel,\n            aspect: m_aspectRatio || '1x1',\n            zoom: _CurrentZoom(),\n            activity: activity ? activity.name : '',\n            headwear: _m_currentAttachment,\n        });\n    }\n    function _PetAttr(strAttrName) {\n        const value = Number(InventoryAPI.GetItemAttributeValue(_m_petId, '{uint32}' + strAttrName));\n        return isNaN(value) ? 0 : value;\n    }\n    function _CurrentActivity() {\n        if (!_IsSoloPose(_m_currentPose)) {\n            return undefined;\n        }\n        const elPanel = _GetPhotoBoothMapPanel();\n        if (!elPanel || typeof elPanel.GetPetActivityVariationOnItem !== 'function') {\n            return undefined;\n        }\n        const strEntity = _Growth().entityName;\n        const strActivity = elPanel.GetPetActivityOnItem(strEntity);\n        const nVariation = elPanel.GetPetActivityVariationOnItem(strEntity);\n        return PetPhotoTag.ACTIVITIES.find(activity => activity.activity === strActivity &&\n            (activity.variation === undefined ? nVariation < 0 : activity.variation === nVariation));\n    }\n    const ZOOM_READOUT_SEC = .1;\n    let _m_zoomReadoutJob = undefined;\n    let _m_nZoomShown = -1;\n    function _StartZoomReadout() {\n        _m_nZoomShown = -1;\n        _TickZoomReadout();\n    }\n    function _TickZoomReadout() {\n        const nZoom = _CurrentZoom();\n        if (nZoom !== _m_nZoomShown) {\n            if (_m_nZoomShown >= 0) {\n                UiToolkitAPI.PlaySoundEvent(nZoom > _m_nZoomShown ? 'Chicken.Photo.ZoomIn'\n                    : 'Chicken.Photo.Zoomout');\n            }\n            _m_nZoomShown = nZoom;\n            _m_cp.SetDialogVariableInt('zoom_value', nZoom);\n            _m_cp.SetDialogVariable('zoom_band', PetPhotoTag.WordFor('z', String(nZoom)));\n        }\n        _m_zoomReadoutJob = $.Schedule(ZOOM_READOUT_SEC, _TickZoomReadout);\n    }\n    function _CurrentZoom() {\n        const elPanel = _GetPhotoBoothMapPanel();\n        if (!elPanel || typeof elPanel.GetZoom !== 'function') {\n            return 0;\n        }\n        const nZoom = elPanel.GetZoom();\n        return (typeof nZoom === 'number' && isFinite(nZoom) && nZoom > 0) ? Math.floor(nZoom) : 0;\n    }\n    function PhotoGridSliderDefaults() {\n        const elSlider = _m_cp.FindChildInLayoutFile('id-photo-grid-slider');\n        elSlider.min = 0;\n        elSlider.max = .5;\n        elSlider.value = .1;\n    }\n    function SliderDefaults() {\n        aAdjust.forEach(adjust => { _ApplySliderDefault(adjust); });\n    }\n    PopupPetPhotoBooth.SliderDefaults = SliderDefaults;\n    function ResetAdjustSliders() {\n        aAdjust.forEach(adjust => {\n            if (adjust.kind !== 'filter') {\n                _ApplySliderDefault(adjust);\n            }\n        });\n    }\n    PopupPetPhotoBooth.ResetAdjustSliders = ResetAdjustSliders;\n    function _SliderRowId(type) { return 'id-pet-slider-row-' + type; }\n    function _MakeAdjustSliders() {\n        const elParent = _m_cp.FindChildInLayoutFile('id-photo-settings-adjust');\n        aAdjust.forEach(adjust => {\n            if (adjust.kind === 'filter' || elParent.FindChildInLayoutFile(_SliderRowId(adjust.type))) {\n                return;\n            }\n            const elRow = $.CreatePanel('Panel', elParent, _SliderRowId(adjust.type), { class: 'full-width' });\n            elRow.BLoadLayoutSnippet('adjust-slider');\n            elRow.FindChildInLayoutFile('id-pet-slider-label').text =\n                $.Localize('#pet_photo_booth_adjust_' + adjust.type);\n            elRow.FindChildInLayoutFile('id-pet-slider')\n                .SetPanelEvent('onvaluechanged', () => { OnSliderChanged(adjust.type); });\n        });\n        elParent.FindChildInLayoutFile('id-pet-slider-reset').SetParent(elParent);\n    }\n    function _GetSlider(type) {\n        const elRow = _m_cp.FindChildTraverse(_SliderRowId(type));\n        return (elRow ? elRow.FindChildInLayoutFile('id-pet-slider') : null);\n    }\n    function _ApplySliderDefault(adjust) {\n        const elSlider = _GetSlider(adjust.type);\n        if (!elSlider) {\n            return;\n        }\n        elSlider.min = adjust.min;\n        elSlider.max = adjust.max;\n        elSlider.value = adjust.default;\n        _ApplyAdjust(adjust, elSlider.value);\n    }\n    function OnGridSliderChanged() {\n        const elSlider = _m_cp.FindChildInLayoutFile('id-photo-grid-slider');\n        const elGrid = _m_cp.FindChildInLayoutFile('id-pet-photo-grid');\n        elGrid.style.opacity = elSlider.value + ';';\n    }\n    PopupPetPhotoBooth.OnGridSliderChanged = OnGridSliderChanged;\n    function OnSliderChanged(typeOfSlider) {\n        const adjust = aAdjust.find(a => a.type === typeOfSlider);\n        const elSlider = _GetSlider(typeOfSlider);\n        if (adjust && elSlider) {\n            _ApplyAdjust(adjust, elSlider.value);\n        }\n    }\n    PopupPetPhotoBooth.OnSliderChanged = OnSliderChanged;\n    function _ApplyAdjust(adjust, value) {\n        const elPanel = _GetPicturePanel();\n        switch (adjust.kind) {\n            case 'post-pair':\n                elPanel?.SetPostProcessingWeight(adjust.up, value > 0 ? value : 0);\n                elPanel?.SetPostProcessingWeight(adjust.down, value < 0 ? -value : 0);\n                break;\n            case 'post-single':\n                elPanel?.SetPostProcessingWeight(adjust.entity, value);\n                break;\n            case 'filter':\n                if (_m_photoFilter) {\n                    elPanel?.SetPostProcessingWeight('pet_post_' + _m_photoFilter, value);\n                }\n                break;\n            case 'brightness':\n                _m_cp.FindChildTraverse('id-pet-model').style.brightness = value.toFixed(2);\n                break;\n            case 'overlay':\n                {\n                    const elOverlay = _m_cp.FindChildTraverse(adjust.panel_id);\n                    elOverlay.style.opacity = value.toFixed(2);\n                    elOverlay.visible = value > 0;\n                    break;\n                }\n        }\n    }\n    function _GetPicturePanel() {\n        return _m_elItemModelImagePanel.FindChildInLayoutFile('id-pet-picture-panel');\n    }\n    function _RefreshAdjustments() {\n        const elPanel = _GetPicturePanel();\n        if (!elPanel) {\n            return;\n        }\n        aAdjust.forEach(adjust => {\n            if (adjust.kind === 'post-pair') {\n                elPanel.FireEntityInput(adjust.up, 'Enable');\n                elPanel.FireEntityInput(adjust.down, 'Enable');\n            }\n            else if (adjust.kind === 'post-single') {\n                elPanel.FireEntityInput(adjust.entity, 'Enable');\n            }\n            OnSliderChanged(adjust.type);\n        });\n    }\n    function _EnableDisablePhotoSettings() {\n        let aDisableButtons = _m_cp.FindChildrenWithAttributeTraverse('data-disable-solo');\n        aDisableButtons.forEach(btn => {\n            let bDisableSolo = (btn.GetAttributeString('data-disable-solo', '') === \"true\") && _IsSoloPose(_m_currentPose) ? true : false;\n            btn.enabled = !bDisableSolo;\n            btn.SetPanelEvent('onmouseover', () => {\n                if (bDisableSolo) {\n                    UiToolkitAPI.ShowTextTooltip(btn.id, \"#pet_photo_booth_setting_restriction_tooltip\");\n                }\n            });\n            btn.SetPanelEvent('onmouseout', () => { UiToolkitAPI.HideTextTooltip(); });\n        });\n        const bStudio = _m_currentStage === STUDIO_STAGE;\n        const settingBtnPrefix = 'id-pet-setting-btn-';\n        _m_cp.FindChildrenWithAttributeTraverse('data-studio-only').forEach(btn => {\n            const settingName = '#pet_photo_booth_setting_' + btn.id.substring(settingBtnPrefix.length);\n            btn.enabled = bStudio;\n            btn.SetPanelEvent('onmouseover', () => {\n                UiToolkitAPI.ShowTextTooltip(btn.id, bStudio ? settingName : '#pet_photo_booth_setting_restriction_tooltip');\n            });\n            btn.SetPanelEvent('onmouseout', () => { UiToolkitAPI.HideTextTooltip(); });\n        });\n        _ClearActivity();\n        _RefreshActivityButtons();\n    }\n    function ShowSettingsRow(setting) {\n        let elPanel = _m_cp.FindChildInLayoutFile('id-photo-settings-' + setting);\n        if (_m_elSelectedControls !== elPanel) {\n            if (_m_elSelectedControls) {\n                _m_elSelectedControls.SetHasClass('show', false);\n            }\n            elPanel.SetHasClass('show', true);\n            _m_elSelectedControls = elPanel;\n            if (setting === 'stage') {\n                SetWallpaperOnStageChange(_m_currentStage === STUDIO_STAGE);\n            }\n            if (setting === \"stickers\") {\n                UpdateStickerList();\n            }\n        }\n    }\n    PopupPetPhotoBooth.ShowSettingsRow = ShowSettingsRow;\n    function _AspectBtnId(strAspect) {\n        return 'id-photo-ratio-' + strAspect;\n    }\n    function _OrientationBtnId(strType) {\n        return 'id-photo-orientation-' + strType;\n    }\n    function _MakeAspectButtons() {\n        const elParent = _m_cp.FindChildInLayoutFile('id-photo-settings-format');\n        PetPhotoTag.ASPECTS.forEach(aspect => {\n            if (elParent.FindChildInLayoutFile(_AspectBtnId(aspect.name))) {\n                return;\n            }\n            const elBtn = $.CreatePanel('RadioButton', elParent, _AspectBtnId(aspect.name), {\n                class: 'photo-booth-settings__btn',\n                group: 'ratio'\n            });\n            $.CreatePanel('Label', elBtn, '', {\n                text: PetPhotoTag.WordFor('a', String(aspect.id)),\n                class: 'stratum-regular'\n            });\n            elBtn.visible = PetPhotoTag.Orientation(aspect.name) !== 'vertical';\n            elBtn.SetPanelEvent('onactivate', () => { UpdateAspectRatioSettings(aspect.name); });\n        });\n    }\n    function UpdateAspectRatioSettings(aspectRatio) {\n        _CancelCapture();\n        _m_elCaptured.SetCompositionLayerTextureName('');\n        const strOrientation = PetPhotoTag.Orientation(aspectRatio);\n        ['horizontal', 'vertical'].forEach(strType => {\n            const elBtn = _m_cp.FindChildInLayoutFile(_OrientationBtnId(strType));\n            elBtn.enabled = strOrientation !== '';\n            elBtn.checked = strOrientation === strType;\n        });\n        _m_elPhotoFrame.SwitchClass('aspect-ratio', 'photo-booth-ratio-' + aspectRatio);\n        m_aspectRatio = aspectRatio;\n    }\n    PopupPetPhotoBooth.UpdateAspectRatioSettings = UpdateAspectRatioSettings;\n    function UpdateAgent(team) {\n        _SetCharacterAndPetPose(_m_elItemModelImagePanel.FindChildInLayoutFile('id-pet-picture-panel'), _m_currentPose);\n    }\n    PopupPetPhotoBooth.UpdateAgent = UpdateAgent;\n    function UpdateWallpaper(wallpaper) {\n        _m_currentWallpaper = wallpaper;\n        _m_elItemModelImagePanel.FindChildInLayoutFile('id-pet-picture-panel').FireEntityInput('backdrop', 'Skin', wallpaper);\n    }\n    PopupPetPhotoBooth.UpdateWallpaper = UpdateWallpaper;\n    function ChangeStage(mapName) {\n        _m_currentStage = mapName;\n        _m_elItemModelImagePanel.FindChildInLayoutFile('id-pet-picture-panel').SwitchMap(mapName);\n        $.Schedule(.2, () => { _SettleStage(mapName); });\n        UpdatePhotoPoseSettings(_m_currentPose);\n        SetWallpaperOnStageChange(mapName === STUDIO_STAGE);\n        $.Schedule(1, () => { OnFilterEffect(_m_photoFilter || 'normal'); });\n    }\n    PopupPetPhotoBooth.ChangeStage = ChangeStage;\n    function SetWallpaperOnStageChange(bisStage) {\n        if (bisStage) {\n            UpdateWallpaper(_m_currentWallpaper);\n        }\n        _m_cp.FindChildInLayoutFile('id-photo-wallpapers-section').SetHasClass('show', bisStage);\n    }\n    const EFFECT_SOUNDS = {\n        explosion: 'Photobooth.FX.Explosion',\n        lightning: 'Photobooth.FX.Lightning',\n        fire: 'Photobooth.FX.FireCircle',\n        beam: 'Photobooth.FX.Beam',\n        lasers: 'Photobooth.FX.Laser',\n        sparks: 'Photobooth.FX.FireWorks',\n        confetti: 'Photobooth.FX.Confetti',\n        bubbles: 'Photobooth.FX.Bubbles',\n        feathers: 'Photobooth.FX.Feathers',\n    };\n    const EFFECT_REACTION_DELAY = 0.5;\n    function PlayEffect(effect) {\n        UiToolkitAPI.PlaySoundEvent('Chicken.Camera.FX');\n        const strEffectSound = EFFECT_SOUNDS[effect];\n        if (strEffectSound) {\n            UiToolkitAPI.PlaySoundEvent(strEffectSound);\n        }\n        const strReaction = 'Chicken.Idle.' + _Growth().soundStage + '.PhotoBooth';\n        $.Schedule(EFFECT_REACTION_DELAY, () => { UiToolkitAPI.PlaySoundEvent(strReaction); });\n        effect = _PoseShot(_m_currentPose).effectPrefix + effect;\n        _m_elItemModelImagePanel.FindChildInLayoutFile('id-pet-picture-panel').FireEntityInput(effect, 'Start');\n        $.Schedule(1, () => { _m_elItemModelImagePanel.FindChildInLayoutFile('id-pet-picture-panel').FireEntityInput(effect, 'Stop'); });\n    }\n    PopupPetPhotoBooth.PlayEffect = PlayEffect;\n    const STUDIO_LIGHTS = ['chick_light', 'agent_light'];\n    let _m_lightColor = { r: 255, g: 242, b: 230 };\n    function _ApplyLightColor(oRGB) {\n        _m_lightColor = oRGB;\n        const elPanel = _m_elItemModelImagePanel.FindChildInLayoutFile('id-pet-picture-panel');\n        const sColor = oRGB.r + ' ' + oRGB.g + ' ' + oRGB.b;\n        STUDIO_LIGHTS.forEach(lightName => { elPanel.FireEntityInput(lightName, 'SetColor', sColor); });\n    }\n    function _RefreshLightColors() {\n        _ApplyLightColor(_m_lightColor);\n    }\n    function ShowLightColorPicker() {\n        const elMenu = UiToolkitAPI.ShowCustomLayoutContextMenuParameters('id-pet-setting-btn-light', '', 'file://{resources}/layout/context_menus/context_menu_color_picker.xml', '');\n        elMenu.AddClass('ContextMenu_NoArrow');\n        CloseSettings();\n        elMenu.Data().initRGB = _m_lightColor;\n        elMenu.Data().funcCallback = (oResult) => {\n            if (oResult.rgb) {\n                _ApplyLightColor(oResult.rgb);\n            }\n        };\n    }\n    PopupPetPhotoBooth.ShowLightColorPicker = ShowLightColorPicker;\n    function AttachModel(modelPath) {\n        _m_currentAttachment = modelPath;\n        _ApplyAttachment();\n    }\n    PopupPetPhotoBooth.AttachModel = AttachModel;\n    function _ApplyAttachment() {\n        let elPanel = _m_elItemModelImagePanel.FindChildInLayoutFile('id-pet-picture-panel');\n        if (!elPanel)\n            return;\n        elPanel.DetachModelsFromItem(_m_petId);\n        if (_m_currentAttachment !== '') {\n            const headwearAttachPoint = _m_currentAttachment.includes('glasses') ? 'eyewear_attach' : 'head_attach';\n            elPanel.AttachModelToItemWithScale(_m_currentAttachment, _m_petId, headwearAttachPoint, _Growth().headwearScale);\n        }\n    }\n    function CloseSettings() {\n        if (_m_elSelectedControls && _m_elSelectedControls.IsValid()) {\n            _m_elSelectedControls.SetHasClass('show', false);\n            _m_cp.FindChildInLayoutFile('id-pet-photo-controls').Children().forEach(btn => { btn.checked = false; });\n            _m_elSelectedControls = null;\n        }\n    }\n    PopupPetPhotoBooth.CloseSettings = CloseSettings;\n    function SetAspectRatio(type) {\n        let strFlip = '';\n        PetPhotoTag.ASPECTS.forEach(aspect => {\n            const strOrientation = PetPhotoTag.Orientation(aspect.name);\n            if (strOrientation === '') {\n                return;\n            }\n            const elBtn = _m_cp.FindChildInLayoutFile(_AspectBtnId(aspect.name));\n            if (elBtn.checked && strOrientation !== type) {\n                strFlip = PetPhotoTag.FlipAspect(aspect.name);\n            }\n            elBtn.visible = strOrientation === type;\n        });\n        if (strFlip !== '') {\n            _m_cp.FindChildInLayoutFile(_AspectBtnId(strFlip)).checked = true;\n            UpdateAspectRatioSettings(strFlip);\n        }\n    }\n    PopupPetPhotoBooth.SetAspectRatio = SetAspectRatio;\n    function _FilterBtnId(strFilter) {\n        return 'id-photo-filter-' + strFilter;\n    }\n    function _HeadwearBtnId(strName) { return 'id-photo-headwear-' + strName; }\n    function _MakeHeadwearButtons() {\n        const elParent = _m_cp.FindChildInLayoutFile('id-photo-settings-headwear');\n        PetPhotoTag.HEADWEAR.forEach(row => {\n            if (elParent.FindChildInLayoutFile(_HeadwearBtnId(row.name))) {\n                return;\n            }\n            const elBtn = $.CreatePanel('RadioButton', elParent, _HeadwearBtnId(row.name), {\n                class: 'photo-booth-settings__btn',\n                group: 'headwear'\n            });\n            $.CreatePanel('Label', elBtn, '', {\n                text: PetPhotoTag.WordFor('e', String(row.id)),\n                class: 'stratum-regular'\n            });\n            elBtn.SetPanelEvent('onactivate', () => { AttachModel(row.model); });\n        });\n    }\n    function _MakeFilterButtons() {\n        const elParent = _m_cp.FindChildInLayoutFile('id-photo-settings-filters');\n        PetPhotoTag.FILTERS.forEach(filter => {\n            if (elParent.FindChildInLayoutFile(_FilterBtnId(filter.name))) {\n                return;\n            }\n            const elBtn = $.CreatePanel('RadioButton', elParent, _FilterBtnId(filter.name), {\n                class: 'photo-booth-settings__btn',\n                group: 'filter'\n            });\n            $.CreatePanel('Label', elBtn, '', {\n                text: PetPhotoTag.WordFor('f', String(filter.id)),\n                class: 'stratum-regular'\n            });\n            elBtn.SetPanelEvent('onactivate', () => { OnFilterEffect(filter.name); });\n        });\n        elParent.FindChildInLayoutFile('id-photo-filter-strength-row').SetParent(elParent);\n    }\n    function OnFilterEffect(filterName) {\n        const elPanel = _GetPicturePanel();\n        if (!elPanel) {\n            return;\n        }\n        if (_m_photoFilter) {\n            elPanel.FireEntityInput('pet_post_' + _m_photoFilter, 'Disable');\n        }\n        elPanel.FireEntityInput('pet_post_' + filterName, 'Enable');\n        _m_photoFilter = filterName;\n        _m_cp.FindChildInLayoutFile('id-photo-filter-strength-row').SetHasClass('hide', filterName === 'normal');\n        const strength = aAdjust.find(adjust => adjust.kind === 'filter');\n        if (strength) {\n            _ApplySliderDefault(strength);\n        }\n    }\n    PopupPetPhotoBooth.OnFilterEffect = OnFilterEffect;\n    function TurnOffAllFilters() {\n        const elPanel = _GetPicturePanel();\n        if (!elPanel) {\n            return;\n        }\n        PetPhotoTag.FILTERS.forEach(filter => {\n            elPanel.FireEntityInput('pet_post_' + filter.name, 'Disable');\n        });\n        elPanel.FireEntityInput('post_vanity', 'Disable');\n    }\n    const STICKER_LIST_FILTER = 'item_definition:sticker';\n    const MAX_PLACED_STICKERS = 10;\n    const STICKER_DROP_JITTER = 120;\n    const _m_placedStickerIds = new Set();\n    function UpdateStickerList() {\n        const elList = _m_cp.FindChildInLayoutFile('id-pet-sticker-item-list');\n        const elSearch = _m_cp.FindChildInLayoutFile('id-pet-sticker-search');\n        $.DispatchEvent('SetInventoryFilter', elList, 'inv_graphic_art', 'sticker', 'any', 'inv_sort_age', STICKER_LIST_FILTER, elSearch.text);\n    }\n    function _StickerCount() {\n        const elList = _m_cp.FindChildInLayoutFile('id-pet-sticker-item-list');\n        $.DispatchEvent('SetInventoryFilter', elList, 'inv_graphic_art', 'sticker', 'any', 'inv_sort_age', STICKER_LIST_FILTER, '');\n        return elList.count;\n    }\n    function _RefreshStickerTile(elTile) {\n        const itemId = elTile.GetAttributeString('itemid', '0');\n        elTile.enabled = !_m_placedStickerIds.has(itemId) && _m_placedStickerIds.size < MAX_PLACED_STICKERS;\n    }\n    function _RefreshStickerTiles() {\n        _m_cp.FindChildInLayoutFile('id-pet-sticker-item-list')\n            .FindChildrenWithClassTraverse('item-tile').forEach(_RefreshStickerTile);\n    }\n    let zIndex = 0;\n    function OnItemTileActivated(elPanel, itemId) {\n        if (_m_placedStickerIds.has(itemId) || _m_placedStickerIds.size >= MAX_PLACED_STICKERS) {\n            return;\n        }\n        _m_placedStickerIds.add(itemId);\n        _RefreshStickerTiles();\n        CloseSettings();\n        const elParent = _m_cp.FindChildInLayoutFile('id-pet-sticker-layer');\n        const elDragPanel = $.CreatePanel('DragPanel', elParent, 'id-drag-panel-' + itemId);\n        elDragPanel.style.zIndex = ++zIndex + ';';\n        elDragPanel.SetDragPosition(Math.random() * STICKER_DROP_JITTER, Math.random() * STICKER_DROP_JITTER);\n        const elSticker = $.CreatePanel('Panel', elParent, 'id-sticker-panel-' + itemId, { class: 'placed-sticker-container' });\n        elSticker.BLoadLayoutSnippet('sticker');\n        const elImage = elSticker.FindChildInLayoutFile('sticker');\n        elImage.itemid = itemId;\n        const elRotateSlider = elSticker.FindChildInLayoutFile('id-sticker-rotate');\n        elRotateSlider.min = -180;\n        elRotateSlider.max = 180;\n        elRotateSlider.default = 0;\n        const elScaleSlider = elSticker.FindChildInLayoutFile('id-sticker-scale');\n        elScaleSlider.min = 240;\n        elScaleSlider.max = 360;\n        elScaleSlider.value = 360;\n        elRotateSlider.SetPanelEvent('onvaluechanged', () => {\n            if (elScaleSlider.value < .5) {\n                elScaleSlider.value = 1;\n            }\n            elImage.style.transform = \"rotatez( \" + elRotateSlider.value + \"deg );\";\n        });\n        elScaleSlider.SetPanelEvent('onvaluechanged', () => {\n            elImage.style.width = elScaleSlider.value + 'px;';\n        });\n        elSticker.FindChildInLayoutFile('id-sticker-remove').SetPanelEvent('onactivate', () => {\n            _m_placedStickerIds.delete(itemId);\n            elDragPanel.DeleteAsync(0);\n            _RefreshStickerTiles();\n        });\n        elSticker.SetParent(elDragPanel);\n    }\n    function _SetUpPhotoLibrary() {\n        const elLibrary = _m_cp.FindChildInLayoutFile('id-photo-library');\n        const elBody = _m_cp.FindChildInLayoutFile('id-photo-library-body');\n        elBody.BLoadLayout('file://{resources}/layout/popups/pet_photo_library.xml', false, false);\n        PetPhotoLibrary.Init(elBody, {\n            bDeletable: true,\n            fnEmpty: () => '#pet_photo_library_empty',\n            fnOnDeleted: (strFileName) => {\n                if (_m_lastSavedPhoto === strFileName) {\n                    _m_lastSavedPhoto = '';\n                }\n            },\n        });\n        elLibrary.visible = true;\n    }\n    function LoadPreviousPhotos() {\n        PetPhotoLibrary.LoadFromDisk(_m_petId);\n    }\n    {\n        $.RegisterForUnhandledEvent(\"OnItemTileActivated\", OnItemTileActivated);\n    }\n})(PopupPetPhotoBooth || (PopupPetPhotoBooth = {}));\n","scripts/popups/popup_play_gamemodeflags.js":"\"use strict\";\n\t\nfunction SetupPopup()\n{\n\tconst MAX_OPTIONS = 10;\n\n\tvar strToken = $.GetContextPanel().GetAttributeString( \"textToken\", \"\" );\n\t$.GetContextPanel().SetDialogVariable( \"title\", $.Localize( strToken + '_title' ) );\n\t$.GetContextPanel().SetDialogVariable( \"desc\", $.Localize( strToken + '_desc' ) );\n\n\tvar currentValue = $.GetContextPanel().GetAttributeString( \"currentvalue\", \"\" );\n\t\n\tvar elOptionsContainer = $.GetContextPanel().FindChildTraverse( 'RadioOptionsContainer' );\n\n\tfunction _CreateOption ( value, strToken )\n\t{\n\t\tvar elOption = $.CreatePanel( 'RadioButton', elOptionsContainer, 'id-' + value );\n\t\telOption.BLoadLayoutSnippet( 'option' );\n\t\telOption.SetDialogVariable( 'optiontext', $.Localize( strToken + '_' + value ) );\n\t\telOption.SetDialogVariable( 'optiontextdesc', $.Localize( strToken + '_' + value + '_desc' ) );\n\t\telOption.SetPanelEvent( 'onactivate', _OnRadioButtonPressed.bind( undefined, value ) );\n\n\t\treturn elOption;\n\t}\n\n\tfor ( var i = 0; i < MAX_OPTIONS; i++ )\n\t{\n\t\tvar value = $.GetContextPanel().GetAttributeString( \"option\" + i, '' );\n\n\t\tif ( value )\n\t\t{\n\t\t\tvar elOption = _CreateOption( value, strToken );\n\n\t\t\tif ( value == currentValue )\n\t\t\t{\n\t\t\t\telOption.checked = true;\n\t\t\t\t_OnRadioButtonPressed( value );\n\t\t\t}\n\t\t}\n\t}\n}\n\n\nfunction _OnRadioButtonPressed ( value )\n{\n\t$.GetContextPanel().SetAttributeString( \"selected\", value );\n}\n\n\nfunction _Return ( bProceed )\n{\n\t                                                      \n\n\n\tvar callbackHandle = $.GetContextPanel().GetAttributeInt( \"callback\", -1 );\n\tvar cancelCallbackHandle = $.GetContextPanel().GetAttributeInt( \"cancelcallback\", -1 );\n\n\tvar callback = bProceed ? callbackHandle : cancelCallbackHandle;\n\n\tif ( callbackHandle != -1 )\n\t{\n\t\tvar resumeMatchmakingHandle = $.GetContextPanel().GetAttributeString( \"searchfn\", '' );\n\n\t\tvar value = $.GetContextPanel().GetAttributeString( \"selected\", \"\" );\n\n\t\tUiToolkitAPI.InvokeJSCallback( callback, value, resumeMatchmakingHandle );\n\t}\n\n\t                               \n\tif ( callbackHandle != -1 )\n\t\tUiToolkitAPI.UnregisterJSCallback( callbackHandle );\n\n\tif ( cancelCallbackHandle != -1 )\n\t\tUiToolkitAPI.UnregisterJSCallback( cancelCallbackHandle );\n\n\t                                                                                                                                  \n\n\n\t                                                                      \n\t                                    \n\t$.DispatchEvent( 'UIPopupButtonClicked', '' );\n}\n\nfunction OnOKPressed()\n{\n\t_Return( true );\n}\n\nfunction CancelPopup ()\n{\n\t_Return( false );\n}\n","scripts/popups/popup_premier_pick_ban.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../util_gamemodeflags.ts\" />\n/// <reference path=\"../common/formattext.ts\" />\n/// <reference path=\"../common/sessionutil.ts\" />\n/// <reference path=\"../common/teamcolor.ts\" />\n/// <reference path=\"../common/iteminfo.ts\" />\n/// <reference path=\"../rating_emblem.ts\" />\n/// <reference path=\"../avatar.ts\" />\nvar PremierPickBan;\n(function (PremierPickBan) {\n    let _m_nPhase = 0;\n    let _m_draftUpdateHandler = null;\n    let _m_playerActivityVoiceHandler = null;\n    const k_EMapVetoPickPhase_BeginDraftType1 = 0;\n    const k_EMapVetoPickPhase_DecideWhoGoesFirst = 1;\n    const k_EMapVetoPickPhase_PickFirstOfTwoMaps = 2;\n    const k_EMapVetoPickPhase_PickBothOtherMaps = 3;\n    const k_EMapVetoPickPhase_PickLastOfTwoMaps = 4;\n    const k_EMapVetoPickPhase_SelectingMap = 5;\n    const k_EMapVetoPickPhase_PickStartingSide = 6;\n    const k_EMapVetoPickPhase_EndDraftType1 = 7;\n    const TEAM_TERRORIST = 2;\n    const TEAM_CT = 3;\n    const _m_aTeams = ['3', '2'];\n    const _m_elPickBanPanel = $.GetContextPanel().FindChildInLayoutFile('id-premier-pick-ban');\n    function Init() {\n        if (!_m_draftUpdateHandler) {\n            _m_draftUpdateHandler = $.RegisterForUnhandledEvent('PanoramaComponent_PregameDraft_DraftUpdate', OnDraftUpdate);\n        }\n        if (!_m_playerActivityVoiceHandler) {\n            _m_playerActivityVoiceHandler = $.RegisterForUnhandledEvent(\"PanoramaComponent_PartyList_PlayerActivityVoice\", PlayerActivityVoice);\n        }\n        SetDefaultTimerValue();\n        Show();\n        OnDraftUpdate();\n        UpdateActivePhaseTimerAndBar();\n        const spiderGraph = _m_elPickBanPanel.FindChildInLayoutFile(\"id-team-vote-spider-graph\");\n        if (spiderGraph.BCanvasReady()) {\n            DrawSpiderGraph();\n        }\n        else {\n            $.RegisterEventHandler(\"CanvasReady\", spiderGraph, DrawSpiderGraph);\n        }\n        let reflection = _m_elPickBanPanel.FindChildInLayoutFile('id-team-vote-reflection');\n        $.Schedule(1.1, () => reflection.SetImageFromPanel(_m_elPickBanPanel.FindChildInLayoutFile('id-team-vote-phasebar-container'), false));\n    }\n    PremierPickBan.Init = Init;\n    function Show() {\n        _m_elPickBanPanel.SetHasClass('show', true);\n    }\n    function SetDefaultTimerValue() {\n        let aChildren = _m_elPickBanPanel.FindChildInLayoutFile('id-team-vote-phasebar-container').Children();\n        for (let phase of aChildren) {\n            phase.SetDialogVariable('section-time', '');\n        }\n    }\n    function OnDraftUpdate() {\n        let bNewPhase = _m_nPhase !== MatchDraftAPI.GetPregamePhase();\n        PlayNewPhaseSound(bNewPhase);\n        _m_nPhase = MatchDraftAPI.GetPregamePhase();\n        let mapIdsList = MatchDraftAPI.GetPregameMapIdsList().split(',');\n        let mapName2Id = new Map();\n        mapIdsList.forEach(x => mapName2Id.set(DeepStatsAPI.MapIDToString(parseInt(x)), x));\n        let mapNames = Object.keys(FriendsListAPI.GetFriendCompetitivePremierWindowStatsObject(\"0\"));\n        let mapIds = [];\n        mapNames.forEach(x => mapIds.push(mapName2Id.get(x)));\n        if (mapIds.filter(x => !x).length > 0) {\n            mapIds = mapIdsList;\n        }\n        _m_elPickBanPanel.SwitchClass('pick-ban-phase', 'premier-pickban-phase-' + _m_nPhase);\n        let btnMapSettings = {\n            isTeam: false,\n            list: mapIds,\n            btnId: 'id-map-vote-btn-'\n        };\n        UpdateVoteBtns(btnMapSettings, bNewPhase);\n        let btnSettings = {\n            isTeam: true,\n            list: _m_aTeams,\n            btnId: 'id-team-vote-btn-'\n        };\n        UpdateVoteBtns(btnSettings, bNewPhase);\n        UpdateTeamPanelBackground();\n        UpdatePhaseProgressBar();\n        UpdateTitleText(bNewPhase);\n        SetBackgroundColor();\n        PlayerTeam();\n    }\n    function SetBackgroundColor() {\n        let elPanel = _m_elPickBanPanel.FindChildInLayoutFile('id-team-vote-middle');\n        if (_m_nPhase <= k_EMapVetoPickPhase_DecideWhoGoesFirst) {\n            elPanel.SwitchClass('bg-fade', 'premier-pickban__middle--neutral');\n            return;\n        }\n        if (MatchDraftAPI.GetPregameTeamToActNow() === MatchDraftAPI.GetPregameMyTeam()) {\n            elPanel.SwitchClass('bg-fade', 'premier-pickban__middle--light');\n        }\n        else {\n            elPanel.SwitchClass('bg-fade', 'premier-pickban__middle--dark');\n        }\n    }\n    function PlayNewPhaseSound(bNewPhase) {\n        if (bNewPhase && _m_nPhase > k_EMapVetoPickPhase_BeginDraftType1 && _m_nPhase < k_EMapVetoPickPhase_SelectingMap) {\n            $.DispatchEvent('CSGOPlaySoundEffectMuteBypass', 'UI.Premier.MapsLocked', 'MOUSE', 1.0);\n        }\n        else if (bNewPhase && _m_nPhase >= k_EMapVetoPickPhase_SelectingMap) {\n            $.DispatchEvent('CSGOPlaySoundEffectMuteBypass', 'UI.Premier.SubmenuTransition', 'MOUSE', 1.0);\n        }\n    }\n    function PhaseStringSuffix(nPhaseBarIndex) {\n        return ''\n            + ((nPhaseBarIndex <= k_EMapVetoPickPhase_SelectingMap) ? (nPhaseBarIndex) : (nPhaseBarIndex - 1))\n            + (((nPhaseBarIndex > k_EMapVetoPickPhase_DecideWhoGoesFirst && nPhaseBarIndex <= k_EMapVetoPickPhase_SelectingMap)\n                || (nPhaseBarIndex == k_EMapVetoPickPhase_BeginDraftType1)) ? '_v2' : '');\n    }\n    function UpdatePhaseProgressBar() {\n        let aChildren = _m_elPickBanPanel.FindChildInLayoutFile('id-team-vote-phasebar-container').Children();\n        for (let phase of aChildren) {\n            const nPhaseBarIndex = parseInt(phase.GetAttributeString('data-phase', ''));\n            phase.SetDialogVariable('section-label', $.Localize('#matchdraft_phase_' + PhaseStringSuffix(nPhaseBarIndex)));\n            phase.SetHasClass('premier-pickban__progress--ban', IsBanPhase() && nPhaseBarIndex === _m_nPhase);\n            phase.SetHasClass('premier-pickban__progress--pick', !IsBanPhase() && nPhaseBarIndex === _m_nPhase);\n            phase.SetHasClass('premier-pickban__progress--pre', nPhaseBarIndex > _m_nPhase);\n            phase.SetHasClass('premier-pickban__progress--post', nPhaseBarIndex < _m_nPhase);\n        }\n    }\n    function IsBanPhase() {\n        return false;\n    }\n    function UpdateActivePhaseTimerAndBar() {\n        let nPlaySound = 0;\n        $.Schedule(.5, () => {\n            let elBarContainer = _m_elPickBanPanel.FindChildInLayoutFile('id-team-vote-phasebar-' + _m_nPhase);\n            if (elBarContainer) {\n                let nTimeRemaining = MatchDraftAPI.GetPregamePhaseSecondsRemaining();\n                nTimeRemaining = nTimeRemaining ? nTimeRemaining : 0;\n                elBarContainer.SetDialogVariable('section-time', nTimeRemaining.toString());\n                let percentComplete = 100 - Math.floor((nTimeRemaining / GetMaxTimeForPhase()) * 100);\n                elBarContainer.FindChildInLayoutFile('id-team-phase-bar-inner').style.width = percentComplete + '%';\n                if (nTimeRemaining < 5 && nPlaySound === 0) {\n                    $.DispatchEvent('CSGOPlaySoundEffectMuteBypass', 'UI.Premier.CounterTimer', 'MOUSE', 1.0);\n                    nPlaySound++;\n                }\n                else if (nPlaySound > 0) {\n                    nPlaySound = 0;\n                }\n            }\n            UpdateActivePhaseTimerAndBar();\n        });\n    }\n    ;\n    function GetMaxTimeForPhase() {\n        let timeMax = 0;\n        switch (_m_nPhase) {\n            case k_EMapVetoPickPhase_PickFirstOfTwoMaps:\n                timeMax = 15;\n                break;\n            case k_EMapVetoPickPhase_PickBothOtherMaps:\n                timeMax = 15;\n                break;\n            case k_EMapVetoPickPhase_PickLastOfTwoMaps:\n                timeMax = 10;\n                break;\n            case k_EMapVetoPickPhase_SelectingMap:\n                timeMax = 5;\n                break;\n            case k_EMapVetoPickPhase_PickStartingSide:\n                timeMax = 5;\n                break;\n            case k_EMapVetoPickPhase_EndDraftType1:\n                timeMax = 5;\n                break;\n            default:\n                timeMax = 0;\n                break;\n        }\n        return timeMax;\n    }\n    function UpdateTitleText(bNewPhase) {\n        let isWaiting = MatchDraftAPI.GetPregameTeamToActNow() !== MatchDraftAPI.GetPregameMyTeam() || _m_nPhase <= k_EMapVetoPickPhase_DecideWhoGoesFirst;\n        let elTitle = _m_elPickBanPanel.FindChildInLayoutFile('id-team-vote-title-phase');\n        _m_elPickBanPanel.SetHasClass('your-turn', !isWaiting);\n        _m_elPickBanPanel.FindChildInLayoutFile('id-team-vote-title-spinner').SetHasClass('hide', !isWaiting);\n        elTitle.visible = true;\n        if (bNewPhase) {\n            _m_elPickBanPanel.FindChildInLayoutFile('id-team-vote-title').TriggerClass('premier-pickban__title--change');\n        }\n        if (isWaiting) {\n            elTitle.text = $.Localize('#matchdraft_phase_action_wait_' + PhaseStringSuffix(_m_nPhase));\n            return;\n        }\n        let nPickedMaps = GetCurrentVotes().filter(vote => vote !== -1).length;\n        elTitle.SetDialogVariableInt('maps', nPickedMaps);\n        elTitle.text = $.Localize('#matchdraft_phase_action_' + PhaseStringSuffix(_m_nPhase), elTitle);\n    }\n    function UpdateVoteBtns(btnSettings, bNewPhase) {\n        let aVoteIds = btnSettings.list;\n        let btnId = btnSettings.btnId;\n        if (aVoteIds.length > 1) {\n            const nYourTeam = MatchDraftAPI.GetPregameMyTeam();\n            const sYourTeamPick = 'veto' + nYourTeam;\n            let rndStyles = [1, 2, 3];\n            for (let i = rndStyles.length - 1; i > 0; i--) {\n                const j = Math.floor(Math.random() * (i + 1));\n                [rndStyles[i], rndStyles[j]] = [rndStyles[j], rndStyles[i]];\n            }\n            for (let i = 0; i < aVoteIds.length; i++) {\n                const elMapBtnParent = _m_elPickBanPanel.FindChildInLayoutFile(btnId + i);\n                const elMapBtn = elMapBtnParent.FindChild('id-pickban-btn');\n                if (!elMapBtn.Data().voteId) {\n                    let imageName = '';\n                    let imagePath = '';\n                    let backgroundColor = 'none;';\n                    elMapBtn.SetDialogVariable('btm-line', '');\n                    if (btnSettings.isTeam) {\n                        let team = aVoteIds[i] === '3' ? \"ct\" : \"t\";\n                        let charId = LoadoutAPI.GetItemID(team, 'customplayer');\n                        imageName = InventoryAPI.GetItemInventoryImage(charId);\n                        imagePath = 'url(\"file://{images}' + imageName + '.png\")';\n                        elMapBtn.SetDialogVariable('map-name', $.Localize('#SFUI_InvUse_Equipped_' + team));\n                        elMapBtn.Data().isTeamBtn = true;\n                        let elReflection = _m_elPickBanPanel.FindChildInLayoutFile(btnId + 'ref-' + i);\n                        elReflection.SetImageFromPanel(elMapBtnParent, false);\n                        backgroundColor = team === 'ct' ? 'rgb(150, 200, 250);' : '#eabe54;';\n                    }\n                    else {\n                        imageName = DeepStatsAPI.MapIDToString(parseInt(aVoteIds[i]));\n                        imagePath = 'url(\"file://{images}/map_icons/screenshots/360p/' + imageName + '.png\")';\n                        elMapBtn.SetDialogVariable('map-name', $.Localize('#SFUI_Map_' + imageName));\n                        elMapBtn.Data().isTeamBtn = false;\n                        let elReflection = _m_elPickBanPanel.FindChildInLayoutFile(btnId + 'ref-' + i);\n                        elReflection.SetImageFromPanel(elMapBtnParent, false);\n                        elMapBtn.AddClass('premier-pickban-canblur');\n                    }\n                    let elBtnMapImage = elMapBtn.FindChildInLayoutFile('id-pickban-map-btn-bg');\n                    elBtnMapImage.style.backgroundImage = imagePath;\n                    elBtnMapImage.style.backgroundPosition = '50% 50%';\n                    elBtnMapImage.style.backgroundSize = 'cover';\n                    elBtnMapImage.style.backgroundColor = backgroundColor;\n                    elMapBtn.Data().voteId = aVoteIds[i];\n                    elMapBtn.SetPanelEvent('onactivate', () => onActivateCastVote(elMapBtn));\n                }\n                if (bNewPhase) {\n                    elMapBtn.SetHasClass('is-ban-phase', false);\n                    elMapBtn.SetHasClass('is-vote-phase', false);\n                    elMapBtn.checked = false;\n                    elMapBtn.SetHasClass('premier-pickban-veto', false);\n                    elMapBtn.SetHasClass('premier-pickban-pick', false);\n                }\n                let isMyTurn = MatchDraftAPI.GetPregameTeamToActNow() === MatchDraftAPI.GetPregameMyTeam();\n                if (btnSettings.isTeam) {\n                    elMapBtn.enabled = isMyTurn;\n                    if (_m_nPhase === k_EMapVetoPickPhase_EndDraftType1) {\n                        elMapBtn.SetHasClass('premier-pickban-pick', parseInt(aVoteIds[i]) === GetStartingTeam());\n                    }\n                }\n                else {\n                    let mapState = MatchDraftAPI.GetPregameMapIdState(parseInt(elMapBtn.Data().voteId));\n                    if (_m_nPhase >= k_EMapVetoPickPhase_PickStartingSide) {\n                        if (mapState !== 'pick')\n                            mapState = 'veto';\n                    }\n                    else {\n                        if (mapState.startsWith('veto')) {\n                            elMapBtn.SetDialogVariable('btm-line', $.Localize((mapState === sYourTeamPick) ? '#matchdraft_pick_your' : '#matchdraft_pick_their'));\n                            if ((_m_nPhase >= k_EMapVetoPickPhase_SelectingMap)\n                                && (\"pick\" === MatchDraftAPI.GetPregameMapIdState(-parseInt(elMapBtn.Data().voteId)))) {\n                                elMapBtn.SwitchClass('premier-pickban-pick-seq', 'premier-pickban-pick-seq' + 0);\n                            }\n                            else {\n                                const nAnimSequence = (rndStyles.length > 0) ? rndStyles.pop() : 0;\n                                elMapBtn.SwitchClass('premier-pickban-pick-seq', 'premier-pickban-pick-seq' + nAnimSequence);\n                            }\n                            mapState = 'pick';\n                        }\n                    }\n                    elMapBtn.SetHasClass('premier-pickban-' + mapState, mapState !== '');\n                    elMapBtn.enabled = mapState === '' && isMyTurn;\n                    if (_m_nPhase >= k_EMapVetoPickPhase_PickStartingSide) {\n                        elMapBtnParent.SetHasClass(\"premier-pickban__map-btn--picked\", mapState === \"pick\");\n                        elMapBtnParent.SetHasClass(\"not-picked\", mapState !== \"pick\");\n                        let elReflection = _m_elPickBanPanel.FindChildInLayoutFile(btnId + 'ref-' + i);\n                        elReflection.visible = false;\n                    }\n                }\n                let sXuids = MatchDraftAPI.GetPregameXuidsForVote(parseInt(elMapBtn.Data().voteId));\n                if (sXuids) {\n                    let aVoteIds = MatchDraftAPI.GetPregameWinningVotes().split(',');\n                    elMapBtn.SetHasClass('map-draft-phase-button--winning-vote', aVoteIds.indexOf(elMapBtn.Data().voteId) !== -1);\n                }\n                UpdateWinningVote(elMapBtn, aVoteIds[i], isMyTurn);\n                UpdateBtnAvatars(elMapBtnParent, parseInt(aVoteIds[i]), isMyTurn);\n            }\n        }\n    }\n    function onActivateCastVote(elMapBtn) {\n        let aCurrentVotes = GetCurrentVotes();\n        let matchingVoteSlot = aCurrentVotes.indexOf(parseInt(elMapBtn.Data().voteId));\n        if (matchingVoteSlot !== -1) {\n            MatchDraftAPI.ActionPregameCastMyVote(_m_nPhase, matchingVoteSlot, 0);\n            $.DispatchEvent('CSGOPlaySoundEffect', 'UI.Premier.MapDeselect', 'MOUSE');\n            return;\n        }\n        if (elMapBtn.Data().isTeamBtn) {\n            for (let i = 0; i < 2; i++) {\n                let elBtn = _m_elPickBanPanel.FindChildInLayoutFile('id-team-vote-btn-' + i).FindChild('id-pickban-btn');\n                elBtn.checked = false;\n                elBtn.SetHasClass('is-vote-phase', false);\n            }\n            MatchDraftAPI.ActionPregameCastMyVote(_m_nPhase, 0, parseInt(elMapBtn.Data().voteId));\n            elMapBtn.checked = true;\n            elMapBtn.SetHasClass('is-vote-phase', true);\n            $.DispatchEvent('CSGOPlaySoundEffect', 'UI.Premier.TeamSelect', 'MOUSE');\n            return;\n        }\n        let freeSlot = GetFirstFreeVoteSlot(aCurrentVotes);\n        if (freeSlot !== null) {\n            MatchDraftAPI.ActionPregameCastMyVote(_m_nPhase, freeSlot, parseInt(elMapBtn.Data().voteId));\n            elMapBtn.SetHasClass('is-ban-phase', IsBanPhase());\n            elMapBtn.SetHasClass('is-vote-phase', !IsBanPhase());\n            $.DispatchEvent('CSGOPlaySoundEffect', 'UI.Premier.MapSelect', 'MOUSE');\n        }\n        else {\n            elMapBtn.checked = false;\n            let aBtns = _m_elPickBanPanel.FindChildInLayoutFile('id-team-vote-btns-container').Children();\n            for (let btn of aBtns) {\n                if (btn.id.indexOf('ref') === -1) {\n                    let childBtn = btn.FindChild('id-pickban-btn');\n                    if (childBtn.IsSelected() && childBtn.enabled) {\n                        btn.TriggerClass('map-draft-phase-button--pulse');\n                    }\n                }\n            }\n            $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.buymenu_failure', 'MOUSE');\n        }\n    }\n    function GetCurrentVotes() {\n        let aCurrentVotes = [];\n        for (let i = 0; i < GetNumVoteSlots(); i++) {\n            let voteId = MatchDraftAPI.GetPregameMyVoteInSlot(i);\n            voteId = voteId ? voteId : -1;\n            aCurrentVotes.push(voteId);\n        }\n        return aCurrentVotes;\n    }\n    function GetFirstFreeVoteSlot(aCurrentVotes) {\n        for (let i = 0; i < aCurrentVotes.length; i++) {\n            if (aCurrentVotes[i] === -1) {\n                return i;\n            }\n        }\n        return null;\n    }\n    function GetNumVoteSlots() {\n        if (_m_nPhase === k_EMapVetoPickPhase_PickFirstOfTwoMaps) {\n            return 1;\n        }\n        if (_m_nPhase === k_EMapVetoPickPhase_PickBothOtherMaps) {\n            return 2;\n        }\n        if (_m_nPhase === k_EMapVetoPickPhase_PickLastOfTwoMaps) {\n            return 1;\n        }\n        if (_m_nPhase === k_EMapVetoPickPhase_PickStartingSide) {\n            return 1;\n        }\n        return 0;\n    }\n    function UpdateWinningVote(elButton, voteId, isMyTurn) {\n        let bTileWinningThisVote = false;\n        if (isMyTurn && ((elButton.Data().isTeamBtn && _m_nPhase == k_EMapVetoPickPhase_PickStartingSide)\n            ||\n                (!elButton.Data().isTeamBtn && _m_nPhase < k_EMapVetoPickPhase_SelectingMap))) {\n            bTileWinningThisVote = !!MatchDraftAPI.GetPregameXuidsForVote(parseInt(voteId));\n        }\n        if (bTileWinningThisVote) {\n            let statusText = elButton.Data().isTeamBtn ? $.Localize('#matchdraft_vote_status_pick') : $.Localize('#matchdraft_vote_status_pick');\n            elButton.SetDialogVariable('status', statusText);\n            let aVoteIds = MatchDraftAPI.GetPregameWinningVotes().split(',');\n            elButton.SetHasClass('premier-pickban__map-btn__show-status', aVoteIds.indexOf(voteId) !== -1);\n            elButton.SetHasClass('is-team-pick', elButton.Data().isTeamBtn);\n        }\n        else {\n            elButton.SetHasClass('premier-pickban__map-btn__show-status', false);\n        }\n    }\n    function GetSelectedMap() {\n        let aMapIds = MatchDraftAPI.GetPregameMapIdsList().split(',');\n        let mapPickId = aMapIds.filter(id => MatchDraftAPI.GetPregameMapIdState(parseInt(id)) === 'pick')[0];\n        return DeepStatsAPI.MapIDToString(parseInt(mapPickId));\n    }\n    function GetStartingTeam() {\n        let nYourTeam = MatchDraftAPI.GetPregameMyTeam();\n        let nOtherTeam = nYourTeam === 2 ? 3 : 2;\n        let nStartingTeam = nYourTeam;\n        if (2 === MatchDraftAPI.GetPregameTeamStartingCT())\n            nStartingTeam = nOtherTeam;\n        return nStartingTeam;\n    }\n    function UpdateBtnAvatars(elBtn, voteId, isMyTurn) {\n        let aVotedXuids = MatchDraftAPI.GetPregameXuidsForVote(voteId).split(',');\n        let elAvatarsContainer = elBtn.FindChildInLayoutFile('id-pickban-btn-avatars');\n        elAvatarsContainer.RemoveAndDeleteChildren();\n        if (!isMyTurn) {\n            return;\n        }\n        for (let i = 0; i < aVotedXuids.length; i++) {\n            MakeAvatar(aVotedXuids[i], elAvatarsContainer);\n        }\n    }\n    function MakeAvatar(xuid, elTeammates) {\n        if (xuid === '0' || !xuid)\n            return;\n        if (xuid) {\n            let elAvatar = $.CreatePanel('Panel', elTeammates, xuid);\n            elAvatar.BLoadLayoutSnippet('small-avatar');\n            let avatarImage = elAvatar.FindChildTraverse('JsAvatarImage');\n            avatarImage.PopulateFromSteamID(xuid);\n            elAvatar.FindChildTraverse('FriendContextMenuButton').SetPanelEvent('onactivate', _OpenContextMenu.bind(undefined, xuid));\n            const teamColorIdx = PartyListAPI.GetPartyMemberTeammateColor(xuid);\n            const teamColorRgb = TeamColor.GetTeamColor(Number(teamColorIdx));\n            avatarImage.style.border = '2px solid rgb(' + teamColorRgb + ')';\n            elAvatar.SetDialogVariable('xuid', xuid);\n            return elAvatar;\n        }\n    }\n    function _OpenContextMenu(xuid) {\n        let contextMenuPanel = UiToolkitAPI.ShowCustomLayoutContextMenuParameters('', '', 'file://{resources}/layout/context_menus/context_menu_playercard.xml', 'xuid=' + xuid + '&pregame=true');\n        contextMenuPanel.AddClass(\"ContextMenu_NoArrow\");\n    }\n    function SetPlayerRank(playerIdx, elAvatar) {\n        let playerWindowStats = MatchDraftAPI.GetPregamePlayerWindowStatsObject(playerIdx);\n        if (!elAvatar)\n            return;\n        let options = {\n            local_player: false,\n            root_panel: elAvatar,\n            rating_type: 'Premier',\n            do_fx: true,\n            full_details: false,\n            leaderboard_details: { score: playerWindowStats.rank_id }\n        };\n        RatingEmblem.SetXuid(options);\n    }\n    function MakeOpponentAvatar(elTeammates, indexOpponent) {\n        let imgIndex = (indexOpponent < 9) ? ('0' + (indexOpponent + 1).toString()) : (indexOpponent + 1);\n        let elAvatar = $.CreatePanel('Panel', elTeammates, indexOpponent.toString());\n        elAvatar.BLoadLayoutSnippet('small-avatar-opponent');\n        let elImage = elAvatar.FindChildInLayoutFile('id-avatar-opponent-avatar');\n        elImage.SetImage('file://{images}/avatars/avatar_sub_' + imgIndex.toString() + '.psd');\n        return elAvatar;\n    }\n    function UpdateTeamPanelBackground() {\n        if (_m_nPhase >= k_EMapVetoPickPhase_PickStartingSide) {\n            let selectedMapName = GetSelectedMap();\n            let imagePath = 'url(\"file://{images}/map_icons/screenshots/360p/' + selectedMapName + '.png\")';\n            UpdateCharacterModels('ct', 'rifle0');\n            UpdateCharacterModels('t', 'smg0');\n            $.Schedule(1, () => {\n                let elMapIcon = _m_elPickBanPanel.FindChildInLayoutFile('id-team-vote-map-icon');\n                elMapIcon.SetImage('file://{images}/map_icons/map_icon_' + selectedMapName + '.svg');\n                elMapIcon.AddClass('show');\n                let elMapImage = _m_elPickBanPanel.FindChildInLayoutFile('id-team-vote-map-image');\n                elMapImage.style.backgroundImage = imagePath;\n                elMapImage.style.backgroundPosition = '50% 50%';\n                elMapImage.style.backgroundSize = 'cover';\n                elMapImage.style.brightness = '.1;';\n                elMapImage.style.backgroundImgOpacity = '1';\n                _m_elPickBanPanel.FindChildInLayoutFile('id-pick-vote-team').AddClass('show');\n            });\n            if (_m_nPhase === k_EMapVetoPickPhase_EndDraftType1) {\n                for (let i = 0; i < _m_aTeams.length; i++) {\n                    if (parseInt(_m_aTeams[i]) === GetStartingTeam()) {\n                        let team = _m_aTeams[i] === '3' ? 'ct' : 't';\n                        let elCharPanel = _m_elPickBanPanel.FindChildInLayoutFile('id-team-vote-agent-' + team);\n                        elCharPanel.SetHasClass('premier-pickban__map-btn--picked', true);\n                    }\n                }\n            }\n        }\n    }\n    function UpdateCharacterModels(team, slot) {\n        let elCharPanel = _m_elPickBanPanel.FindChildInLayoutFile('id-team-vote-agent-' + team);\n        let charId = LoadoutAPI.GetItemID(team, 'customplayer');\n        let weaponId = LoadoutAPI.GetItemID(team, slot);\n        const settings = ItemInfo.GetOrUpdateVanityCharacterSettings(charId);\n        settings.panel = elCharPanel;\n        settings.weaponItemId = weaponId;\n        CharacterAnims.PlayAnimsOnPanel(settings);\n    }\n    function _GetMapsList() {\n        return Object.keys(FriendsListAPI.GetFriendCompetitivePremierWindowStatsObject(\"0\"));\n    }\n    function ComputeAverageWindowStatsForTeam(teamID) {\n        let averageWindowStats = {};\n        let nCount = 0.0;\n        let mapList = _GetMapsList();\n        for (let i = 0; i < MatchDraftAPI.GetPregamePlayerCount(); i++) {\n            let playerWindowStats = MatchDraftAPI.GetPregamePlayerWindowStatsObject(i);\n            let thisTeamID = MatchDraftAPI.GetPregamePlayerTeam(i);\n            if (thisTeamID != teamID)\n                continue;\n            nCount++;\n            for (let mapName of mapList) {\n                let myWinCount = Number(Math.floor(playerWindowStats[mapName] || 0));\n                let teamWinCount = Number(Math.floor(averageWindowStats[mapName] || 0));\n                averageWindowStats[mapName] = myWinCount + teamWinCount;\n            }\n        }\n        return averageWindowStats;\n    }\n    function DrawSpiderGraph() {\n        let rankWindowStats_T = ComputeAverageWindowStatsForTeam(TEAM_TERRORIST);\n        let rankWindowShape_T = Object.keys(rankWindowStats_T).map(mapName => Number(rankWindowStats_T[mapName] | 0));\n        let rankWindowStats_CT = ComputeAverageWindowStatsForTeam(TEAM_CT);\n        let rankWindowShape_CT = Object.keys(rankWindowStats_T).map(mapName => Number(rankWindowStats_CT[mapName] | 0));\n        let maxWinsInASingleMap = (Math.max(...rankWindowShape_T, ...rankWindowShape_CT, 3));\n        const spiderGraph = _m_elPickBanPanel.FindChildInLayoutFile('id-team-vote-spider-graph');\n        DrawBackground(spiderGraph, maxWinsInASingleMap);\n        if (MatchDraftAPI.GetPregameMyTeam() === TEAM_CT) {\n            DrawTeamPlot(spiderGraph, rankWindowShape_CT, true, maxWinsInASingleMap);\n            DrawTeamPlot(spiderGraph, rankWindowShape_T, false, maxWinsInASingleMap);\n        }\n        else {\n            DrawTeamPlot(spiderGraph, rankWindowShape_T, true, maxWinsInASingleMap);\n            DrawTeamPlot(spiderGraph, rankWindowShape_CT, false, maxWinsInASingleMap);\n        }\n    }\n    function DrawBackground(spiderGraph, maxWinsInASingleMap) {\n        const numMaps = 7;\n        spiderGraph.ClearJS('rgba(0,0,0,0)');\n        const options = {\n            bkg_color: \"#00000080\",\n            spokes_color: '#ffffff10',\n            spoke_thickness: 2,\n            spoke_softness: 100,\n            spoke_length_scale: 1.2,\n            guideline_color: '#ffffff10',\n            guideline_thickness: 2,\n            guideline_softness: 100,\n            guideline_count: maxWinsInASingleMap + 1,\n            deadzone_percent: 0.1,\n            scale: 0.70\n        };\n        spiderGraph.SetGraphOptions(options);\n        spiderGraph.DrawGraphBackground(numMaps);\n    }\n    function DrawTeamPlot(spiderGraph, rankWindowShape, isMyTeam, max) {\n        const oColorsMyTeam = {\n            line_color: 'rgba( 100, 100, 100, 1.0);',\n            fill_color_inner: 'rgba( 100, 100, 100, 0.5);'\n        };\n        const oColorsOpponent = {\n            line_color: 'rgba( 219, 68, 55, 1.0);',\n            fill_color_inner: 'rgba( 219, 68, 55, 0.5);'\n        };\n        rankWindowShape = rankWindowShape.map(a => a / max);\n        const polyOptions = {\n            line_color: isMyTeam ? oColorsMyTeam.line_color : oColorsOpponent.line_color,\n            line_thickness: 3,\n            line_softness: 10,\n            fill_color_inner: isMyTeam ? oColorsMyTeam.fill_color_inner : oColorsOpponent.fill_color_inner,\n            fill_color_outer: isMyTeam ? oColorsMyTeam.fill_color_inner : oColorsOpponent.fill_color_inner\n        };\n        spiderGraph.DrawGraphPoly(rankWindowShape, polyOptions);\n    }\n    function PlayerTeam() {\n        let DEBUG_AVATARS = false;\n        let aTestids = [\n            '148618791998277666',\n            '148618791998261669',\n            '148618791998203739',\n            '148618792083695883',\n            '148618791998365706',\n            '148618791998209668',\n            '148618791998345670',\n            '148618792154451370',\n            '',\n            '148618792083696093'\n        ];\n        let aTestGroups = [\n            1,\n            2,\n            2,\n            3,\n            3,\n            4,\n            5,\n            5,\n            6,\n            7\n        ];\n        let clientXuid = MyPersonaAPI.GetXuid();\n        let aPlayers = [];\n        let nCount = MatchDraftAPI.GetPregamePlayerCount();\n        if (DEBUG_AVATARS) {\n            nCount = 10;\n        }\n        for (let i = 0; i < nCount; i++) {\n            if (DEBUG_AVATARS) {\n                if (aTestGroups[i] >= 0) {\n                    let player = {\n                        xuid: aTestids[i],\n                        nParty: aTestGroups[i],\n                        idx: i,\n                        isClient: aTestids[i] === clientXuid\n                    };\n                    aPlayers.push(player);\n                }\n            }\n            else {\n                if (MatchDraftAPI.GetPregamePlayerParty(i) >= 0) {\n                    let player = {\n                        xuid: MatchDraftAPI.GetPregamePlayerXuid(i),\n                        nParty: MatchDraftAPI.GetPregamePlayerParty(i),\n                        idx: i,\n                        isClient: MatchDraftAPI.GetPregamePlayerXuid(i) === clientXuid\n                    };\n                    aPlayers.push(player);\n                }\n            }\n        }\n        if (aPlayers.length < 1) {\n            return;\n        }\n        let indexClient = aPlayers.findIndex(object => object.isClient);\n        for (let i = 0; i < aPlayers.length; i++) {\n            AddPlayerToGroup(aPlayers[i], indexClient);\n        }\n        AddPartyBoundryLines(_m_elPickBanPanel.FindChildInLayoutFile('id-team-vote-team-teammates'));\n        AddPartyBoundryLines(_m_elPickBanPanel.FindChildInLayoutFile('id-team-vote-team-opponent'));\n    }\n    function AddPlayerToGroup(player, indexClient) {\n        let isTeammate = (indexClient < 5 && player.idx < 5) || (indexClient >= 5 && player.idx >= 5);\n        let elParent = isTeammate ?\n            _m_elPickBanPanel.FindChildInLayoutFile('id-team-vote-team-teammates') :\n            _m_elPickBanPanel.FindChildInLayoutFile('id-team-vote-team-opponent');\n        let elContainer = elParent.FindChildInLayoutFile('id-player-party-container-' + player.nParty);\n        if (!elContainer) {\n            elContainer = $.CreatePanel('Panel', elParent, 'id-player-party-container-' + player.nParty, { class: 'premier-pickban__teammates-party' });\n        }\n        let elTeammate = isTeammate ? elParent.FindChildInLayoutFile(player.xuid) : elParent.FindChildInLayoutFile(player.idx.toString());\n        if (!elTeammate) {\n            if (isTeammate) {\n                SetPlayerRank(player.idx, MakeAvatar(player.xuid, elContainer));\n            }\n            else {\n                SetPlayerRank(player.idx, MakeOpponentAvatar(elContainer, player.idx));\n            }\n        }\n    }\n    function AddPartyBoundryLines(elParent) {\n        for (let party of elParent.Children()) {\n            let aPartyMembers = party.Children();\n            if (aPartyMembers.length > 1) {\n                aPartyMembers.forEach((element, index) => {\n                    if (index === 0) {\n                        element.FindChild('id-avatar-party-line')?.AddClass('premier-pickban__map-avatars__party-line-top');\n                    }\n                    else if (index === aPartyMembers.length - 1) {\n                        element.FindChild('id-avatar-party-line')?.AddClass('premier-pickban__map-avatars__party-line-bottom');\n                    }\n                    else {\n                        element.FindChild('id-avatar-party-line')?.AddClass('premier-pickban__map-avatars__party-line-middle');\n                    }\n                });\n            }\n            else if (aPartyMembers.length === 1) {\n                aPartyMembers[0].FindChild('id-avatar-party-line')?.AddClass('premier-pickban__map-avatars__party-line-empty');\n            }\n        }\n    }\n    function PlayerActivityVoice(xuid) {\n        const elTeammates = _m_elPickBanPanel.FindChildInLayoutFile('id-team-vote-team-teammates');\n        const elAvatar = elTeammates.FindChildInLayoutFile(xuid);\n        if (elAvatar && elAvatar.IsValid()) {\n            Avatar.UpdateTalkingState(elAvatar, xuid);\n        }\n    }\n})(PremierPickBan || (PremierPickBan = {}));\n","scripts/popups/popup_prime_status.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../common/prime_button_action.ts\" />\nvar PopupPrimeStatus;\n(function (PopupPrimeStatus) {\n    let m_btnPurchase = $('#PurchaseButton');\n    function Init() {\n        _SetStatusPanel(MyPersonaAPI.GetElevatedState());\n    }\n    PopupPrimeStatus.Init = Init;\n    function _SetStatusPanel(strState) {\n        if (strState !== \"elevated\") {\n            m_btnPurchase.visible = true;\n            PrimeButtonAction.SetUpPurchaseBtn(m_btnPurchase);\n            return;\n        }\n        m_btnPurchase.visible = false;\n    }\n    function _UpdateEleveatedStatusPanel() {\n        _SetStatusPanel(MyPersonaAPI.GetElevatedState());\n    }\n    $.RegisterForUnhandledEvent(\"PanoramaComponent_MyPersona_ElevatedStateUpdate\", _UpdateEleveatedStatusPanel);\n})(PopupPrimeStatus || (PopupPrimeStatus = {}));\n","scripts/popups/popup_rankup_redemption_store.js":"\"use strict\";\n/// <reference path=\"..\\csgo.d.ts\" />\nvar PopupRankUpRedemptionStore;\n(function (PopupRankUpRedemptionStore) {\n    function OnClose() {\n        const callbackHandle = $.GetContextPanel().GetAttributeInt(\"callback\", -1);\n        if (callbackHandle != -1) {\n            UiToolkitAPI.InvokeJSCallback(callbackHandle);\n        }\n        let fnPopupRankUpRedemptionStoreOnClose = $.GetContextPanel().Data().fnPopupRankUpRedemptionStoreOnClose;\n        $.DispatchEvent('UIPopupButtonClicked', '');\n        $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.inventory_new_item_accept', 'MOUSE');\n        if (fnPopupRankUpRedemptionStoreOnClose)\n            fnPopupRankUpRedemptionStoreOnClose();\n    }\n    PopupRankUpRedemptionStore.OnClose = OnClose;\n})(PopupRankUpRedemptionStore || (PopupRankUpRedemptionStore = {}));\n","scripts/popups/popup_redeem_souvenir.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../popups/popup_inspect_shared.ts\" />\n/// <reference path=\"../watchtile.ts\" />\nvar PopupRedeemSouvenir;\n(function (PopupRedeemSouvenir) {\n    let m_scheduleHandle = null;\n    let m_tournamentIndex = null;\n    let m_matchId = '';\n    let m_redeemsAvailable = 0;\n    function Init() {\n        $.GetContextPanel().FindChildInLayoutFile('popup-redeem-spinner').visible = false;\n        m_tournamentIndex = $.GetContextPanel().GetAttributeString(\"tournamentindex\", \"\");\n        m_matchId = $.GetContextPanel().GetAttributeString(\"matchid\", \"\");\n        if (!m_tournamentIndex || !m_matchId) {\n            OnClose();\n            return;\n        }\n        _SetMatchTile();\n        _SetDescText();\n    }\n    PopupRedeemSouvenir.Init = Init;\n    ;\n    function _SetMatchTile() {\n        const elMatchtile = $.CreatePanel('Panel', $.GetContextPanel().FindChildInLayoutFile('id-popup-matchtile-redeem'), 'id-match-tile', {\n            class: 'MatchTile--Redeem'\n        });\n        elMatchtile.Data().matchId = m_matchId;\n        elMatchtile.BLoadLayout('file://{resources}/layout/matchtiles/tournament.xml', false, false);\n        elMatchtile.RemoveClass('MatchTile--Collapse');\n        watchTile.Init(elMatchtile);\n    }\n    ;\n    function _SetDescText() {\n        const coinId = InventoryAPI.GetActiveTournamentCoinItemId(parseInt(m_tournamentIndex));\n        const elLabel = $.GetContextPanel().FindChildInLayoutFile('MessageLabel');\n        if (!coinId || coinId === '0') {\n            elLabel.visible = false;\n            return;\n        }\n        let coinLevel = InventoryAPI.GetItemAttributeValue(coinId, \"upgrade level\");\n        let coinRedeemsPurchased = InventoryAPI.GetItemAttributeValue(coinId, \"operation drops awarded 1\");\n        if (coinRedeemsPurchased)\n            coinLevel += coinRedeemsPurchased;\n        const redeemed = InventoryAPI.GetItemAttributeValue(coinId, \"operation drops awarded 0\");\n        var redeemsAvailable = coinLevel - redeemed;\n        m_redeemsAvailable = redeemsAvailable;\n        elLabel.SetDialogVariableInt('redeems', redeemsAvailable);\n        elLabel.text = (redeemsAvailable > 1) ?\n            $.Localize('#popup_redeem_souvenir_desc:f', elLabel) :\n            $.Localize('#popup_redeem_souvenir_desc_single', elLabel);\n        elLabel.visible = true;\n    }\n    ;\n    function OnRedeem() {\n        _ResetTimeouthandle();\n        const coinId = InventoryAPI.GetActiveTournamentCoinItemId(parseInt(m_tournamentIndex));\n        if (!coinId || coinId === '0') {\n            return;\n        }\n        if (m_redeemsAvailable <= 0) {\n            OnClose();\n            UiToolkitAPI.ShowCustomLayoutPopupParameters('', 'file://{resources}/layout/popups/popup_tournament_journal.xml', 'journalid=' + coinId);\n            return;\n        }\n        const contextPanel = $.GetContextPanel();\n        m_scheduleHandle = $.Schedule(5, () => _CancelWaitforCallBack(contextPanel));\n        $.GetContextPanel().FindChildInLayoutFile('popup-redeem-spinner').visible = true;\n        $.GetContextPanel().FindChildInLayoutFile('id-popup-redeem-btn').visible = false;\n        MatchInfoAPI.RequestMatchTournamentSouvenir(m_matchId, coinId);\n    }\n    PopupRedeemSouvenir.OnRedeem = OnRedeem;\n    ;\n    function ItemCustomizationNotification(numericType, type, itemid) {\n        _ResetTimeouthandle();\n        if (type === 'souvenir_generated') {\n            InventoryAPI.AcknowledgeNewItembyItemID(itemid);\n            const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('', 'file://{resources}/layout/popups/popup_inventory_inspect.xml');\n            let oSettings = {\n                item_id: itemid,\n                inspect_only: true,\n                hide_char_select: true,\n                hide_all_action_items: true,\n                show_market_link: false,\n                hide_item_cert: true,\n            };\n            elPanel.Data().oSettings = oSettings;\n            OnClose();\n        }\n    }\n    PopupRedeemSouvenir.ItemCustomizationNotification = ItemCustomizationNotification;\n    ;\n    function _ResetTimeouthandle() {\n        if (m_scheduleHandle) {\n            $.CancelScheduled(m_scheduleHandle);\n            m_scheduleHandle = null;\n        }\n    }\n    ;\n    function _CancelWaitforCallBack(elPanel) {\n        m_scheduleHandle = null;\n        if (!elPanel || !elPanel.IsValid()) {\n            return;\n        }\n        elPanel.FindChildInLayoutFile('popup-redeem-spinner').visible = false;\n        $.DispatchEvent('UIPopupButtonClicked', '');\n        UiToolkitAPI.ShowGenericPopupOk($.Localize('#SFUI_SteamConnectionErrorTitle'), $.Localize('#SFUI_InvError_Item_Not_Given'), '', function () {\n        });\n    }\n    ;\n    function OnClose() {\n        _ResetTimeouthandle();\n        $.DispatchEvent('UIPopupButtonClicked', '');\n    }\n    PopupRedeemSouvenir.OnClose = OnClose;\n    $.RegisterForUnhandledEvent('PanoramaComponent_Inventory_ItemCustomizationNotification', ItemCustomizationNotification);\n})(PopupRedeemSouvenir || (PopupRedeemSouvenir = {}));\n","scripts/popups/popup_redeem_souvenir__vpk_vjs_c.js":"/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"popups/popup_inspect_shared.ts\" />\n\nnamespace PopupRedeemSouvenir\n{\n    var m_scheduleHandle = null;\n    var m_tournamentIndex = null;\n\tvar m_matchId = '';\n\tvar m_redeemsAvailable = 0;\n    \n    var _Init = function()\n\t{\n        $.GetContextPanel().FindChildInLayoutFile( 'popup-redeem-spinner' ).visible = false;\n        m_tournamentIndex = $.GetContextPanel().GetAttributeString( \"tournamentindex\", \"\" );\n        m_matchId = $.GetContextPanel().GetAttributeString( \"matchid\", \"\" );\n\n        if ( !m_tournamentIndex || !m_matchId )\n        {\n            _OnClose();\n            return;\n        }\n\n        _SetMatchTile();\n        _SetDescText();\n    };\n    \n    var _SetMatchTile = function()\n    {\n        var elMatchtile = $.CreatePanel( 'Panel', $.GetContextPanel().FindChildInLayoutFile( 'id-popup-matchtile-redeem' ),\n            'id-match-tile',\n            {\n                class: 'MatchTile--Redeem'\n            }\n        );\n\n        elMatchtile.Data().matchId = m_matchId;\n        \n        elMatchtile.BLoadLayout( 'file://{resources}/layout/matchtiles/tournament.xml', false, false );\n        elMatchtile.RemoveClass( 'MatchTile--Collapse' );\n        watchTile.Init( elMatchtile );\n    };\n\n    var _SetDescText = function()\n    {\n        var coinId = InventoryAPI.GetActiveTournamentCoinItemId( m_tournamentIndex );\n        var elLabel = $.GetContextPanel().FindChildInLayoutFile( 'MessageLabel' );\n        if ( !coinId || coinId === '0' || coinId === 0 )\n        {\n            elLabel.visible = false;\n            return;\n        }\n\n\t\tvar coinLevel = InventoryAPI.GetItemAttributeValue( coinId, \"upgrade level\" );\n\t\t\n\t\tvar coinRedeemsPurchased = InventoryAPI.GetItemAttributeValue( coinId, \"operation drops awarded 1\" );\n\t\tif ( coinRedeemsPurchased )                                                                          \n\t\t\tcoinLevel += coinRedeemsPurchased;\n\n        var redeemed = InventoryAPI.GetItemAttributeValue( coinId, \"operation drops awarded 0\" );\n\t\tvar redeemsAvailable = coinLevel - redeemed;\n\t\tm_redeemsAvailable = redeemsAvailable;\n\n        elLabel.SetDialogVariableInt( 'redeems', redeemsAvailable );\n\n        elLabel.text = ( redeemsAvailable > 1 ) ?\n            $.Localize( '#popup_redeem_souvenir_desc:f', elLabel ) :\n            $.Localize( '#popup_redeem_souvenir_desc_single', elLabel );\n        \n        elLabel.visible = true;\n    };\n\n    var _OnRedeem = function()\n    {\n        _ResetTimeouthandle();\n\n        var coinId = InventoryAPI.GetActiveTournamentCoinItemId( m_tournamentIndex );\n        if ( !coinId || coinId === '0' || coinId === 0)\n        {\n            return;\n\t\t}\n\t\t\n\t\tif ( m_redeemsAvailable <= 0 )\n\t\t{\t                                                                                      \n\t\t\t_OnClose();\n\n\t\t\tUiToolkitAPI.ShowCustomLayoutPopupParameters(\n\t\t\t\t'',\n\t\t\t\t'file://{resources}/layout/popups/popup_tournament_journal.xml',\n\t\t\t\t'journalid=' + coinId\n\t\t\t);\n\n\t\t\treturn;\n\t\t}\n\n        m_scheduleHandle = $.Schedule( 5, _CancelWaitforCallBack.bind( undefined, $.GetContextPanel() ) );\n        $.GetContextPanel().FindChildInLayoutFile( 'popup-redeem-spinner' ).visible = true;\n        $.GetContextPanel().FindChildInLayoutFile( 'id-popup-redeem-btn' ).visible = false;\n\n        MatchInfoAPI.RequestMatchTournamentSouvenir( m_matchId, coinId );\n    };\n\n    var _ItemCustomizationNotification = function( numericType, type, itemid )\n    {\n        _ResetTimeouthandle();\n        \n        if ( type === 'souvenir_generated' )\n        {\n            InventoryAPI.AcknowledgeNewItembyItemID( itemid );\n\n            const elPanel = UiToolkitAPI.ShowCustomLayoutPopup(\n                '',\n                'file://{resources}/layout/popups/popup_inventory_inspect.xml'\n            );\n\n            let oSettings: InspectPopupSettings_t= {\n                item_id: id,\n                inspect_only: true,\n                hide_all_action_items: true,\n                hide_item_cert: true,\n                show_market_link: _m_bPerfectWorld ? false : true,\n                callback_handle: JsInspectCallback,\n                case_id_for_lootlist: caseId,\n                lootlist_name_override: lootlistNameOverride\n            }\n\n            elPanel.Data().oSettings = oSettings;\n\n            _OnClose();\n        }\n    };\n\n    var _ResetTimeouthandle = function()\n\t{\n\t\tif ( m_scheduleHandle )\n\t\t{\n\t\t\t$.CancelScheduled( m_scheduleHandle );\n\t\t\tm_scheduleHandle = null;\n\t\t}\n\t};\n\n    var _CancelWaitforCallBack = function( elPanel )\n\t{\n\t\tm_scheduleHandle = null;\n\t\t\n        var elPanel = $.GetContextPanel();\n        if ( !elPanel || !elPanel.IsValid() )\n        {\n            return;\n        }\n\n        elPanel.FindChildInLayoutFile( 'popup-redeem-spinner' ).visible = false;\n\n        $.DispatchEvent( 'UIPopupButtonClicked', '' );\n\n\t\tUiToolkitAPI.ShowGenericPopupOk(\n\t\t\t$.Localize( '#SFUI_SteamConnectionErrorTitle' ),\n\t\t\t$.Localize( '#SFUI_InvError_Item_Not_Given' ),\n\t\t\t'',\n\t\t\tfunction()\n\t\t\t{\n\t\t\t},\n\t\t\tfunction()\n\t\t\t{\n\t\t\t}\n\t\t);\n    };\n    \n    var _OnClose = function()\n    {\n        _ResetTimeouthandle();\n        $.DispatchEvent( 'UIPopupButtonClicked', '' );\n    }\n\n    \n    $.RegisterForUnhandledEvent( 'PanoramaComponent_Inventory_ItemCustomizationNotification', PopupRedeemSouvenir.ItemCustomizationNotification );\n\n    return {\n        Init: _Init,\n        OnRedeem: _OnRedeem,\n        OnClose: _OnClose,\n        ItemCustomizationNotification: _ItemCustomizationNotification\n\n    };\n}\n","scripts/popups/popup_report_player.js":"\"use strict\";\n/// <reference path=\"..\\csgo.d.ts\" />\nvar PopupReportPlayer;\n(function (PopupReportPlayer) {\n    function Init() {\n        let xuid = $.GetContextPanel().GetAttributeString(\"xuid\", \"\");\n        $.GetContextPanel().SetDialogVariable(\"target_player\", GameStateAPI.GetPlayerName(xuid));\n        $.GetContextPanel().FindChildInLayoutFile(\"id-report\").Children().forEach(el => {\n            let category = el.GetAttributeString(\"data-category\", \"\");\n            el.enabled = GameStateAPI.IsReportCategoryEnabledForSelectedPlayer(xuid, category);\n        });\n    }\n    PopupReportPlayer.Init = Init;\n    function Submit() {\n        let categories = \"\";\n        $.GetContextPanel().FindChildInLayoutFile(\"id-report\").Children().forEach(el => {\n            if (el.checked)\n                categories += el.GetAttributeString(\"data-category\", \"\") + \",\";\n        });\n        let xuid = $.GetContextPanel().GetAttributeString(\"xuid\", \"\");\n        GameStateAPI.SubmitPlayerReport(xuid, categories);\n        $.DispatchEvent('UIPopupButtonClicked', '');\n    }\n    PopupReportPlayer.Submit = Submit;\n})(PopupReportPlayer || (PopupReportPlayer = {}));\n","scripts/popups/popup_report_server.js":"\"use strict\";\n/// <reference path=\"..\\csgo.d.ts\" />\nvar PopupReportServer;\n(function (PopupReportServer) {\n    function Init() {\n        $.GetContextPanel().SetDialogVariable(\"server_name\", GameStateAPI.GetServerName());\n        UpdateSubmitButton();\n    }\n    PopupReportServer.Init = Init;\n    function Submit() {\n        let categories = \"\";\n        $.GetContextPanel().FindChildInLayoutFile(\"id-report\").Children().forEach(el => {\n            if (el.checked)\n                categories += el.GetAttributeString(\"data-category\", \"\") + \",\";\n        });\n        GameStateAPI.SubmitServerReport(categories);\n        $.DispatchEvent('UIPopupButtonClicked', '');\n    }\n    PopupReportServer.Submit = Submit;\n    function UpdateSubmitButton() {\n        let bCanSubmit = $.GetContextPanel().FindChildInLayoutFile(\"id-report\").Children().some(function (el) {\n            return el.checked;\n        });\n        $.GetContextPanel().FindChildInLayoutFile(\"SubmitButton\").enabled = bCanSubmit;\n    }\n    PopupReportServer.UpdateSubmitButton = UpdateSubmitButton;\n})(PopupReportServer || (PopupReportServer = {}));\n","scripts/popups/popup_season_stats.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../common/formattext.ts\" />\n/// <reference path=\"../common/teamcolor.ts\" />\n/// <reference path=\"../rating_emblem.ts\" />\nvar PopupSeasonStats;\n(function (PopupSeasonStats) {\n    const _m_cp = $.GetContextPanel();\n    const _m_spiderGraph = $('#id-wins-spider-graph');\n    let _m_seasonId;\n    let _m_timeoutHandle;\n    let _m_elSelectedMap;\n    let _m_selectedGridStat;\n    function Init() {\n        let seasonid = $.GetContextPanel().GetAttributeString('seasonid', '') ? parseInt($.GetContextPanel().GetAttributeString('seasonid', '')) : -1;\n        if (seasonid < 1) {\n            ClosePopup();\n            return;\n        }\n        _ReadyForDisplay();\n    }\n    PopupSeasonStats.Init = Init;\n    function _ReadyForDisplay() {\n        if (!MyPersonaAPI.IsConnectedToGC()) {\n            ClosePopup();\n            return;\n        }\n        let seasonid = $.GetContextPanel().GetAttributeString('seasonid', '') ? parseInt($.GetContextPanel().GetAttributeString('seasonid', '')) : -1;\n        if (seasonid < 1) {\n            return;\n        }\n        _m_seasonId = seasonid;\n        _m_cp.SetHasClass('season-' + _m_seasonId, true);\n        _UpdateSeasonData(seasonid);\n    }\n    function _UpdateSeasonData(seasonid) {\n        if (seasonid !== _m_seasonId) {\n            ClosePopup();\n            return;\n        }\n        let seasonData = TournamentsAPI.GetPremierSeasonSummaryJSO(seasonid);\n        if (!seasonData) {\n            _CancelWaitForCallBack();\n            _m_timeoutHandle = $.Schedule(5, () => {\n                _TimeoutPopup();\n            });\n        }\n        else {\n            _CancelWaitForCallBack();\n            _SetModelPanel();\n            _SetGlobalStats(seasonData);\n            _SetUpPerMapStats(seasonData);\n            _SetUpStatsPanelTypeButtons();\n            _SetUpSpiderGraph(seasonData);\n            _SetRank(seasonData);\n            $.Schedule(.25, () => { _m_cp.SetHasClass('stats-loaded', true); });\n        }\n    }\n    function _UnreadyForDisplay() {\n    }\n    function ClosePopup() {\n        $.DispatchEvent('CSGOPlaySoundEffect', 'inventory_inspect_close', 'MOUSE');\n        _m_cp.SetReadyForDisplay(false);\n        UiToolkitAPI.HideCustomLayoutTooltip('tooltip-season-rank');\n        $.DispatchEvent('UIPopupButtonClicked', '');\n        $.DispatchEvent('ContextMenuEvent', '');\n        UiToolkitAPI.HideTextTooltip();\n    }\n    PopupSeasonStats.ClosePopup = ClosePopup;\n    function _CancelWaitForCallBack() {\n        if (_m_timeoutHandle) {\n            $.CancelScheduled(_m_timeoutHandle);\n            _m_timeoutHandle = null;\n        }\n    }\n    ;\n    function _TimeoutPopup() {\n        _CancelWaitForCallBack();\n        ClosePopup();\n        UiToolkitAPI.ShowGenericPopupOk($.Localize('#SFUI_SteamConnectionErrorTitle'), $.Localize('#SFUI_InvError_Item_Not_Given'), '', function () {\n        });\n    }\n    ;\n    function _SetModelPanel() {\n        let itemId = $.GetContextPanel().GetAttributeString('itemid', '');\n        if (!itemId || !InventoryAPI.IsValidItemID(itemId)) {\n            return;\n        }\n        _m_cp.FindChildInLayoutFile('id-season-medal-model').SetActiveItem(0);\n        _m_cp.FindChildInLayoutFile('id-season-medal-model').SetItemItemId(itemId, '');\n        _m_cp.FindChildInLayoutFile('id-medal-model-zoom-btn').SetPanelEvent('onactivate', () => {\n            $.DispatchEvent(\"InventoryItemPreview\", itemId, '');\n            ClosePopup();\n        });\n    }\n    function _SetGlobalStats(seasonData) {\n        let oTotals_data_for_display = {\n            wins: 0,\n            ties: 0,\n            losses: 0,\n            rounds: 0,\n            kills: 0,\n            headshots: 0,\n            assists: 0,\n            deaths: 0,\n            mvps: 0,\n            rounds_3k: 0,\n            rounds_4k: 0,\n            rounds_5k: 0,\n            map_id: 0,\n            map_name: ''\n        };\n        Object.entries(oTotals_data_for_display).forEach(([key, value]) => {\n            if (_IsSimpleStat(key, value)) {\n                let total = 0;\n                seasonData.data_per_map.forEach(dataPerMap => {\n                    let stat = dataPerMap[key];\n                    total = stat + total;\n                });\n                oTotals_data_for_display[key] = total;\n                _SetSimpleStat(key, 'id-global-stat-', total);\n            }\n        });\n        _SetKDRatio(_m_cp.FindChildInLayoutFile('id-global-stat-k-d'), oTotals_data_for_display.kills, oTotals_data_for_display.deaths);\n        _SetKillPerRound(_m_cp.FindChildInLayoutFile('id-global-stat-kpr'), oTotals_data_for_display.kills, oTotals_data_for_display.rounds);\n        _SetMatchesPlayed(_m_cp.FindChildInLayoutFile('id-global-stat-matches-played'), oTotals_data_for_display.wins, oTotals_data_for_display.losses, oTotals_data_for_display.ties);\n        _SetWinPercentStat(_m_cp.FindChildInLayoutFile('id-global-stat-win-percent'), oTotals_data_for_display.wins, oTotals_data_for_display.losses, oTotals_data_for_display.ties);\n        _SetHeadshotPercentStat(_m_cp.FindChildInLayoutFile('id-global-stat-hs-percent'), oTotals_data_for_display.headshots, oTotals_data_for_display.kills);\n        let elBar = _m_cp.FindChildInLayoutFile('id-global-bar-container');\n        _SetWinsBar(elBar, {\n            wins: oTotals_data_for_display.wins,\n            ties: oTotals_data_for_display.ties,\n            losses: oTotals_data_for_display.losses\n        });\n        $.Schedule(.5, () => {\n            _PositionTiesLabel(_m_cp.FindChildInLayoutFile('id-global-stat-ties'), elBar.FindChild('id-bar-ties'), oTotals_data_for_display.ties);\n        });\n    }\n    ;\n    function _IsSimpleStat(key, value) {\n        return key !== 'map_name' && key !== 'map_id' && typeof value === 'number';\n    }\n    function _SetSimpleStat(statName, prefix, value, mapStatPanel = null) {\n        let elStat = mapStatPanel && mapStatPanel.IsValid() ?\n            mapStatPanel.FindChildInLayoutFile(prefix + statName) :\n            _m_cp.FindChildInLayoutFile(prefix + statName);\n        if (elStat && elStat.IsValid()) {\n            if (elStat.FindChild('stat-title')) {\n                elStat.SetDialogVariable('stat-title', $.Localize('#season_stat_title_' + statName));\n            }\n            if (elStat.FindChild('stat-icon')) {\n                elStat.FindChild('stat-icon').SetImage('file://{images}/icons/ui/stat_' + statName + '.svg');\n            }\n            var displayValue = FormatText.FormatNumberToNiceString(value, 0);\n            elStat.SetDialogVariable('stat-value', displayValue);\n        }\n    }\n    function _SetKillPerRound(elStat, kills, rounds) {\n        let nStatKPR = ((kills / Math.max(1, rounds)).toFixed(3));\n        elStat.Data().value = nStatKPR;\n        elStat.SetDialogVariable('stat-title', $.Localize('#season_stat_title_kpr'));\n        elStat.SetDialogVariable('stat-value', nStatKPR);\n    }\n    function _SetKDRatio(elStat, kills, deaths) {\n        let nStat = ((kills / Math.max(1, deaths))).toFixed(3);\n        elStat.Data().value = nStat;\n        elStat.SetDialogVariable('stat-title', $.Localize('#season_stat_title_kd'));\n        elStat.SetDialogVariable('kdratio', nStat);\n        elStat.FindChild('stat-value').text = $.Localize('#season_stat_value_kd', elStat);\n    }\n    function _SetMatchesPlayed(elStat, wins, losses, ties) {\n        let nStatMatchesTotal = (wins + losses + ties);\n        elStat.Data().value = nStatMatchesTotal;\n        elStat.SetDialogVariable('stat-title', $.Localize('#season_stat_title_matches_played'));\n        elStat.SetDialogVariable('stat-value', FormatText.FormatNumberToNiceString(nStatMatchesTotal, 0));\n    }\n    function _SetWinPercentStat(elStat, wins, losses, ties) {\n        let nWinPercent = ((wins / Math.max(1, losses + wins + ties)) * 100).toFixed(1);\n        elStat.Data().value = nWinPercent;\n        elStat.SetDialogVariable('stat-title', $.Localize('#season_stat_title_win_percent'));\n        elStat.SetDialogVariable('win-percent', nWinPercent);\n        elStat.FindChild('stat-value').text = $.Localize('#season_stat_value_win_percent', elStat);\n    }\n    function _SetHeadshotPercentStat(elStat, headshots, kills) {\n        let nHsPercent = ((headshots / kills) * 100).toFixed(1);\n        elStat.Data().value = nHsPercent;\n        elStat.SetDialogVariable('stat-title', $.Localize('#season_stat_title_hs_percent'));\n        elStat.SetDialogVariable('hs-percent', nHsPercent);\n        elStat.FindChild('stat-value').text = $.Localize('#season_stat_value_hs_percent', elStat);\n        if (elStat.FindChild('stat-icon')) {\n            elStat.FindChild('stat-icon').SetImage('file://{images}/icons/ui/stat_headshots.svg');\n        }\n    }\n    function _SetWinsBar(elBarContainer, oData) {\n        const totalValue = (oData.wins + oData.ties + oData.losses);\n        elBarContainer.FindChildInLayoutFile('id-bar-wins').style.width = Math.ceil((oData.wins / totalValue) * 100).toString() + '%';\n        elBarContainer.FindChildInLayoutFile('id-bar-losses').style.width = Math.ceil((oData.losses / totalValue) * 100).toString() + '%';\n        elBarContainer.FindChildInLayoutFile('id-bar-ties').style.width = Math.ceil((oData.ties / totalValue) * 100).toString() + '%';\n    }\n    function _PositionTiesLabel(elTies, elTiesBar, nTies) {\n        elTies.visible = nTies > 0;\n        if (nTies > 0) {\n            let nXPos = Math.floor(elTiesBar.actualxoffset / elTiesBar.actualuiscale_x);\n            if (nXPos > 1920 || nXPos <= 0) {\n                elTies.visible = false;\n                return;\n            }\n            elTies.style.x = nXPos + 'px;';\n        }\n    }\n    function _SetRank(seasonData) {\n        let nRank = 0;\n        let weekName = '';\n        seasonData.data_per_week.forEach(data_per_week => {\n            if (data_per_week.rank_id > nRank) {\n                nRank = data_per_week.rank_id;\n                weekName = data_per_week.week_name;\n            }\n        });\n        const options = {\n            root_panel: _m_cp.FindChildInLayoutFile('id-premier-rating'),\n            do_fx: true,\n            full_details: false,\n            rating_type: 'Premier',\n            leaderboard_details: { score: nRank },\n            local_player: false\n        };\n        RatingEmblem.SetXuid(options);\n        let elStat = _m_cp.FindChildInLayoutFile('id-global-stat-week');\n        elStat.SetDialogVariable('stat-title', $.Localize('#season_stat_title_achieved_week'));\n        elStat.SetDialogVariable('stat-value', $.Localize(weekName));\n    }\n    function _SetUpPerMapStats(seasonData) {\n        let elBtns = _m_cp.FindChildInLayoutFile('id-stats-per-map-btns');\n        let elRows = _m_cp.FindChildInLayoutFile('id-stats-mode-grid-rows');\n        let mostPlayedMap = '';\n        let mostPlayedMapCount = 0;\n        let aMapList = TournamentsAPI.GetPremierSeasonMaps(_m_seasonId).split(',');\n        let oEmptyMap = {\n            wins: 0,\n            ties: 0,\n            losses: 0,\n            rounds: 0,\n            kills: 0,\n            headshots: 0,\n            assists: 0,\n            deaths: 0,\n            mvps: 0,\n            rounds_3k: 0,\n            rounds_4k: 0,\n            rounds_5k: 0,\n            map_id: 0,\n            map_name: ''\n        };\n        if (elBtns.Children().length < 1) {\n            let elHeaderRow = $.CreatePanel('Panel', elRows, 'id-stat-map-row-header');\n            elHeaderRow.BLoadLayoutSnippet('grid-row');\n            elHeaderRow.SetHasClass('row-header', true);\n            _FillOutMapRow(elHeaderRow, oEmptyMap);\n            aMapList.forEach((mapName, idx) => {\n                let map = seasonData.data_per_map.find(function (element) {\n                    return element.map_name === mapName;\n                });\n                if (map && map.hasOwnProperty('map_name')) {\n                    let elBtn = _MakeMapRadioButton(elBtns, map.map_name, true);\n                    _MapBtnOnPanelEvents(elBtns, elBtn, map);\n                    _MakeMapStatsRow(elRows, map.map_name, map);\n                    if ((map.wins + map.losses + map.ties) > mostPlayedMapCount) {\n                        mostPlayedMapCount = (map.wins + map.losses + map.ties);\n                        mostPlayedMap = map.map_name;\n                    }\n                }\n                else {\n                    let elBtn = _MakeMapRadioButton(elBtns, mapName, false);\n                    _MapBtnOnPanelEvents(elBtns, elBtn, null);\n                    oEmptyMap.map_name = mapName;\n                    _MakeMapStatsRow(elRows, mapName, oEmptyMap);\n                }\n            });\n        }\n        if (mostPlayedMap) {\n            let defaultBtn = elBtns.FindChild('id-stat-map-btn-' + mostPlayedMap);\n            defaultBtn.checked = true;\n            $.DispatchEvent(\"Activated\", defaultBtn, \"mouse\");\n            let defaultGridStat = elRows.Children()[0].FindChild('id-row-stat-wins');\n            defaultGridStat.checked = true;\n            $.DispatchEvent(\"Activated\", defaultGridStat, \"mouse\");\n        }\n    }\n    function _MakeMapRadioButton(elBtns, mapName, isEnabled) {\n        let elBtn = $.CreatePanel('RadioButton', elBtns, 'id-stat-map-btn-' + mapName, {\n            text: $.Localize('#SFUI_Map_' + mapName),\n            class: 'stats-panel-map-btn',\n            group: 'stat-maps'\n        });\n        let btnImg = $.CreatePanel('Image', elBtn, '', { textureheight: '48px', texturewidth: '-1' });\n        btnImg.SetImage(\"file://{images}/map_icons/map_icon_\" + mapName + \".svg\");\n        elBtn.enabled = isEnabled;\n        return elBtn;\n    }\n    function _MapBtnOnPanelEvents(elBtns, elBtn, map) {\n        if (!map) {\n            elBtn.SetPanelEvent('onmouseover', () => {\n                UiToolkitAPI.ShowTextTooltip(elBtn.id, '#tooltip-no-map-stats');\n            });\n            elBtn.SetPanelEvent('onmouseout', () => { UiToolkitAPI.HideTextTooltip(); });\n            return;\n        }\n        let elStatsPanelsParent = _m_cp.FindChildInLayoutFile('id-stats-panel-all-maps-container');\n        let prefixMapStatPanel = 'id-stat-map-stats-';\n        elBtn.SetPanelEvent('onactivate', () => {\n            let elPanel = elStatsPanelsParent.FindChild(prefixMapStatPanel + map.map_name);\n            if (!elPanel) {\n                elPanel = $.CreatePanel('Panel', elStatsPanelsParent, prefixMapStatPanel + map.map_name);\n                elPanel.BLoadLayoutSnippet('single-map-stats');\n                elPanel.style.backgroundImage = 'url(\"file://{images}/map_icons/screenshots/360p/' + map.map_name + '.png\")';\n                elPanel.style.backgroundPosition = '50% 50%';\n                elPanel.style.backgroundSize = 'clip_then_cover';\n                elPanel.style.backgroundImgOpacity = '.035';\n                _FillOutPerMapStats(elPanel, map);\n            }\n            let aBtns = elBtns.Children();\n            aBtns.forEach(element => { element.hittest = false; });\n            if (_m_elSelectedMap && _m_elSelectedMap.IsValid() && _m_elSelectedMap !== elPanel) {\n                _m_elSelectedMap.SwitchClass('show-page', 'map-hide');\n            }\n            if (_m_elSelectedMap !== elPanel) {\n                elPanel.SwitchClass('show-page', 'map-reset');\n            }\n            $.Schedule(.16, () => {\n                elPanel?.SwitchClass('show-page', 'map-selected');\n                aBtns.forEach(element => { element.hittest = true; });\n            });\n            _m_elSelectedMap = elPanel;\n        });\n    }\n    function _MakeMapStatsRow(elRows, mapName, map) {\n        let elRow = $.CreatePanel('Panel', elRows, 'id-stat-map-row-' + mapName);\n        elRow.BLoadLayoutSnippet('grid-row');\n        _FillOutMapRow(elRow, map);\n    }\n    function _FillOutPerMapStats(elPanel, mapData) {\n        Object.entries(mapData).forEach(([key, value]) => {\n            if (_IsSimpleStat(key, value)) {\n                _SetSimpleStat(key, 'id-map-stat-', value, elPanel);\n            }\n        });\n        _SetMatchesPlayed(elPanel.FindChildInLayoutFile('id-map-stat-matches-played'), mapData.wins, mapData.losses, mapData.ties);\n        _SetWinPercentStat(elPanel.FindChildInLayoutFile('id-map-stat-win-percent'), mapData.wins, mapData.losses, mapData.ties);\n        _SetKDRatio(elPanel.FindChildInLayoutFile('id-map-stat-k-d'), mapData.kills, mapData.deaths);\n        _SetKillPerRound(elPanel.FindChildInLayoutFile('id-map-stat-kpr'), mapData.kills, mapData.rounds);\n        _SetHeadshotPercentStat(elPanel.FindChildInLayoutFile('id-map-stat-hs-percent'), mapData.headshots, mapData.kills);\n        let elBar = elPanel.FindChildInLayoutFile('id-bar-container');\n        _SetWinsBar(elBar, {\n            wins: mapData.wins,\n            ties: mapData.ties,\n            losses: mapData.losses\n        });\n        let elTies = elPanel.FindChildInLayoutFile('id-map-stat-ties');\n        elTies.visible = false;\n        $.Schedule(.8, () => {\n            _PositionTiesLabel(elTies, elBar.FindChild('id-bar-ties'), mapData.ties);\n        });\n    }\n    function _SetUpStatsPanelTypeButtons() {\n        _m_cp.FindChildInLayoutFile('id-stats-mode-row-btn').SetPanelEvent('onactivate', () => {\n            _ShowStatsPanelType('row');\n            _m_cp.FindChildInLayoutFile('id-map-stats-header').visible = true;\n        });\n        _m_cp.FindChildInLayoutFile('id-stats-mode-grid-btn').SetPanelEvent('onactivate', () => {\n            _ShowStatsPanelType('grid');\n            _m_cp.FindChildInLayoutFile('id-map-stats-header').visible = false;\n        });\n        $.DispatchEvent(\"Activated\", _m_cp.FindChildInLayoutFile('id-stats-mode-row-btn'), \"mouse\");\n    }\n    function _ShowStatsPanelType(type) {\n        let elGridPanel = _m_cp.FindChildInLayoutFile('id-stats-mode-grid');\n        let elRowPanel = _m_cp.FindChildInLayoutFile('id-stats-mode-row');\n        elGridPanel.SetHasClass('show', type === 'grid');\n        elRowPanel.SetHasClass('show', type === 'row');\n    }\n    function _FillOutMapRow(elRow, mapData) {\n        let isHeader = mapData.map_id === 0 && mapData.map_name == '';\n        let hasNoData = mapData.map_id === 0 && mapData.map_name !== '';\n        Object.entries(mapData).forEach(([key, value]) => {\n            if (_IsSimpleStat(key, value)) {\n                if (key !== 'headshots') {\n                    if (!isHeader) {\n                        _CreateRowEntry(elRow, 'Panel', 'id-row-stat-', key, value);\n                        if (!hasNoData)\n                            _SetSimpleStat(key, 'id-row-stat-', value, elRow);\n                    }\n                    else {\n                        _CreateRowEntry(elRow, 'RadioButton', 'id-row-stat-', key, value);\n                        elRow.FindChild('id-row-stat-' + key).SetDialogVariable('stat-value', $.Localize('#season_stat_title_' + key));\n                    }\n                }\n            }\n        });\n        let elEntry;\n        let panelType = isHeader ? 'RadioButton' : 'Panel';\n        elEntry = _CreateRowEntry(elRow, panelType, 'id-row-stat-', 'matches-played');\n        elEntry = _CreateRowEntry(elRow, panelType, 'id-row-stat-', 'win-percent');\n        elEntry = _CreateRowEntry(elRow, panelType, 'id-row-stat-', 'k-d');\n        elEntry = _CreateRowEntry(elRow, panelType, 'id-row-stat-', 'kpr');\n        elEntry = _CreateRowEntry(elRow, panelType, 'id-row-stat-', 'hs-percent');\n        _MoveEntryToCorrectPosition(elRow);\n        if (!isHeader) {\n            elRow.FindChildInLayoutFile('map-icon').SetImage(\"file://{images}/map_icons/map_icon_\" + mapData.map_name + \".svg\");\n            let aEntries = elRow?.Children();\n            aEntries?.[1].SetHasClass('has-mask', true);\n            aEntries?.[aEntries.length - 1].SetHasClass('has-mask-reverse', true);\n            if (hasNoData) {\n                elRow.SetDialogVariable('stat-value', '-');\n                elRow.Data().isEmpty = true;\n                return;\n            }\n            _SetMatchesPlayed(elRow.FindChildInLayoutFile('id-row-stat-matches-played'), mapData.wins, mapData.losses, mapData.ties);\n            _SetWinPercentStat(elRow.FindChildInLayoutFile('id-row-stat-win-percent'), mapData.wins, mapData.losses, mapData.ties);\n            _SetKDRatio(elRow.FindChildInLayoutFile('id-row-stat-k-d'), mapData.kills, mapData.deaths);\n            _SetKillPerRound(elRow.FindChildInLayoutFile('id-row-stat-kpr'), mapData.kills, mapData.rounds);\n            _SetHeadshotPercentStat(elRow.FindChildInLayoutFile('id-row-stat-hs-percent'), mapData.headshots, mapData.kills);\n        }\n        else {\n            elRow.FindChild('id-row-stat-matches-played').SetDialogVariable('stat-value', $.Localize('#season_stat_title_matches_played'));\n            elRow.FindChild('id-row-stat-win-percent').SetDialogVariable('stat-value', $.Localize('#season_stat_title_win_percent'));\n            elRow.FindChild('id-row-stat-k-d').SetDialogVariable('stat-value', $.Localize('#season_stat_title_kd'));\n            elRow.FindChild('id-row-stat-kpr').SetDialogVariable('stat-value', $.Localize('#season_stat_title_kpr'));\n            elRow.FindChild('id-row-stat-hs-percent').SetDialogVariable('stat-value', $.Localize('#season_stat_title_hs_percent'));\n        }\n    }\n    function _CreateRowEntry(elRow, type, prefix, key, value = -1) {\n        let elEntry;\n        if (type === 'Panel') {\n            elEntry = $.CreatePanel('Panel', elRow, prefix + key);\n            elEntry.BLoadLayoutSnippet('grid-row-entry');\n            elEntry.Data().value = value > 0 ? value : 0;\n            elEntry.Data().key = key;\n        }\n        else {\n            elEntry = $.CreatePanel('RadioButton', elRow, prefix + key, { group: 'row-sort-btn' });\n            elEntry.BLoadLayoutSnippet('grid-row-entry');\n            elEntry.Data().key = key;\n            elEntry.SetPanelEvent('onactivate', () => {\n                if (!_m_selectedGridStat || _m_selectedGridStat !== elEntry) {\n                    let elParent = elRow.GetParent();\n                    let aRows = elParent.Children();\n                    aRows.slice(1);\n                    let aNewSort = _SortRows(aRows, prefix, key);\n                    aNewSort.forEach((row, idx) => {\n                        elParent.MoveChildAfter(row, elParent.Children()[0]);\n                        row.Children().forEach(entry => {\n                            entry.SetHasClass('highlight-entry', entry.Data().key === key);\n                        });\n                    });\n                    elParent.Children().forEach((row, idx) => {\n                        row.SetHasClass('no-background', (idx % 2) == 1);\n                    });\n                    _m_selectedGridStat = elEntry;\n                }\n            });\n        }\n        return elEntry;\n    }\n    function _SortRows(aRows, prefix, key) {\n        return aRows.sort((a, b) => {\n            if (a.Data().isEmpty) {\n                return -1;\n            }\n            if (key === 'losses' || key === 'deaths') {\n                return a.FindChild(prefix + key)?.Data().value > b.FindChild(prefix + key)?.Data().value ? -1 :\n                    a.FindChild(prefix + key)?.Data().value < b.FindChild(prefix + key)?.Data().value ? 1 : 0;\n            }\n            return a.FindChild(prefix + key)?.Data().value < b.FindChild(prefix + key)?.Data().value ? -1 :\n                a.FindChild(prefix + key)?.Data().value > b.FindChild(prefix + key)?.Data().value ? 1 : 0;\n        });\n    }\n    function _MoveEntryToCorrectPosition(elRow) {\n        const aOrder = [\n            'matches-played',\n            'win-percent',\n            'wins',\n            'losses',\n            'ties',\n            'kills',\n            'deaths',\n            'assists',\n            'rounds',\n            'k-d',\n            'kpr',\n            'hs-percent',\n            'mvps',\n            'rounds_5k',\n            'rounds_4k',\n            'rounds_3k'\n        ];\n        let elChildren = elRow.Children();\n        for (let i = 0; i < aOrder.length; i++) {\n            let elPanel = elRow.FindChild('id-row-stat-' + aOrder[i]);\n            if (elPanel && elPanel.IsValid()) {\n                if (i == 0) {\n                    elRow?.MoveChildAfter(elRow.FindChild('id-row-stat-' + aOrder[i]), elChildren[0]);\n                }\n                else {\n                    elRow?.MoveChildAfter(elRow.FindChild('id-row-stat-' + aOrder[i]), elRow.FindChild('id-row-stat-' + aOrder[i - 1]));\n                }\n            }\n        }\n    }\n    function _SetUpSpiderGraph(seasonData) {\n        if (_m_spiderGraph.BCanvasReady()) {\n            _DrawSpiderGraph(seasonData);\n            _CreateRanksHistoryGraph(seasonData.data_per_week);\n            _CreateMatchesBarGraph(seasonData.data_per_week);\n            _m_cp.SetDialogVariableInt('week_min', 1);\n            _m_cp.SetDialogVariableInt('week_max', seasonData.data_per_week.length);\n        }\n        else {\n            $.Schedule(0.1, () => { _SetUpSpiderGraph(seasonData); });\n        }\n    }\n    function _DrawSpiderGraph(seasonData) {\n        let maxWins = 0;\n        let aMapList = TournamentsAPI.GetPremierSeasonMaps(_m_seasonId).split(',');\n        var playerWins = {};\n        seasonData.data_per_map.forEach(dataPerMap => {\n            maxWins = dataPerMap.wins > maxWins ? dataPerMap.wins : maxWins;\n            playerWins[dataPerMap.map_name] = dataPerMap.wins;\n        });\n        _DrawSpiderGraphGuides(maxWins, aMapList.length);\n        let winsForDisplay = aMapList.map((map_name) => { return map_name.startsWith('de_') ? Number(playerWins[map_name] | 0) : 0; });\n        _DrawSpiderGraphPlayerPlot(winsForDisplay, maxWins);\n        _MakeSpiderGraphMapPanels(aMapList);\n    }\n    function _DrawSpiderGraphGuides(maxWins, numMaps) {\n        _m_spiderGraph.ClearJS('rgba(0,0,0,0)');\n        const options = {\n            bkg_color: \"#00000090\",\n            spokes_color: '#27628581',\n            spoke_thickness: 2,\n            spoke_softness: 100,\n            spoke_length_scale: 1.2,\n            guideline_color: '#1b455e62',\n            guideline_thickness: 2,\n            guideline_softness: 100,\n            guideline_count: maxWins > 20 ? 20 : maxWins + 1,\n            deadzone_percent: 0.03,\n            scale: 0.68\n        };\n        _m_spiderGraph.SetGraphOptions(options);\n        _m_spiderGraph.DrawGraphBackground(numMaps);\n    }\n    function _DrawSpiderGraphPlayerPlot(arrValues, max) {\n        const teamColorIdx = PartyListAPI.GetPartyMemberSetting(MyPersonaAPI.GetXuid(), 'game/teamcolor');\n        const teamColorRgb = TeamColor.GetTeamColor(Number(teamColorIdx));\n        let rgbColorLine = 'rgba(' + teamColorRgb + ',' + '1' + ')';\n        let rgbColorInner = 'rgba(' + teamColorRgb + ',' + '.1' + ')';\n        let rgbColorOuter = 'rgba(' + teamColorRgb + ',' + '.2' + ')';\n        arrValues = arrValues.map(a => a / max);\n        const options = {\n            line_color: rgbColorLine,\n            line_thickness: 3,\n            line_softness: 10,\n            fill_color_inner: rgbColorInner,\n            fill_color_outer: rgbColorOuter,\n        };\n        _m_spiderGraph.DrawGraphPoly(arrValues, options);\n    }\n    function _MakeSpiderGraphMapPanels(arrMaps) {\n        let elMapContainer = _m_spiderGraph;\n        elMapContainer.RemoveAndDeleteChildren();\n        for (let s = 0; s < arrMaps.length; s++) {\n            let elMap = $.CreatePanel('Panel', elMapContainer, String(s));\n            elMap.BLoadLayoutSnippet('snippet-mwr-map');\n            let elMapImage = elMap.FindChildInLayoutFile('mwr-map__image');\n            let imageName = arrMaps[s];\n            elMapImage.SetImage('file://{images}/map_icons/map_icon_' + imageName + \".svg\");\n            elMapImage.style.backgroundPosition = '50% 50%';\n            elMapImage.style.backgroundSize = 'auto 150%';\n            elMap.style.flowChildren = 'up';\n            elMap.SetDialogVariable('map-name', $.Localize('#SFUI_Map_' + imageName));\n            let vPos = _m_spiderGraph.GraphPositionToUIPosition(s, 1.3);\n            elMap.SetPositionInPixels(vPos.x, vPos.y, 0);\n        }\n    }\n    function _CreateRanksHistoryGraph(aDataPerWeek) {\n        const lineGraph = $('#id-rank-history-line-graph');\n        let aRankData = [];\n        let aWeeks = [];\n        let aWeekNames = [];\n        let minRank = 0;\n        let maxRank = 0;\n        aDataPerWeek.forEach((week, idx) => {\n            aRankData.push(week.rank_id);\n            aWeeks.push(idx);\n            aWeekNames.push(week.week_name);\n            if (week.rank_id > 0) {\n                if (minRank <= 0)\n                    minRank = week.rank_id;\n                if (week.rank_id < minRank)\n                    minRank = week.rank_id;\n                if (maxRank <= 0)\n                    maxRank = week.rank_id;\n                if (week.rank_id > maxRank)\n                    maxRank = week.rank_id;\n            }\n        });\n        if (minRank > 0)\n            minRank = Math.floor(minRank / 5000) * 5000;\n        maxRank = Math.ceil(maxRank / 5000) * 5000;\n        if (maxRank <= minRank) {\n            if (minRank > 0)\n                minRank -= 5000;\n            else\n                maxRank += 5000;\n        }\n        const xvals = aWeeks;\n        const yvals = aRankData;\n        const options = {\n            draw_guidelines: true,\n            guideline_color: \"#1b48638a\",\n            guideline_thick: 2,\n            guideline_soft: 1,\n            guideline_count: 5,\n            line_color: \"#68B5DF\",\n            line_thickness: 2,\n            line_softness: 1,\n            draw_points: true,\n            point_size: 3,\n            point_color: \"#68B5DF\",\n            yaxis_min: minRank,\n            yaxis_max: maxRank,\n            yaxis_interp: 0,\n            xaxis_centroidcoords: true,\n            gradient_color: \"#42619133;\",\n        };\n        lineGraph.SetGraphOptions(options);\n        lineGraph.SetData(xvals, yvals);\n        lineGraph.Show();\n        _AddYAxisRanks(lineGraph);\n        _MakeDots(lineGraph, aWeekNames.filter((word, index) => aRankData[index] !== 0), aWeeks.filter((word, index) => aRankData[index] !== 0), aRankData.filter(rank => rank !== 0));\n    }\n    function _AddYAxisRanks(lineGraph) {\n        const guidelineYPositions = lineGraph.GetGuidelinePositions();\n        guidelineYPositions.forEach((posData, index) => {\n            let elParent = _m_cp.FindChildInLayoutFile('id-line-graph-y-axis');\n            let elRating = $.CreatePanel('Panel', elParent, 'id-rating-y-' + posData.x);\n            elRating.BLoadLayout('file://{resources}/layout/rating_emblem.xml', false, false);\n            elRating.SetHasClass('y-axis-premier-rating', true);\n            const options = {\n                root_panel: elRating,\n                do_fx: false,\n                full_details: false,\n                rating_type: 'Premier',\n                leaderboard_details: { score: posData.x },\n                local_player: false\n            };\n            RatingEmblem.SetXuid(options);\n            elRating.style.y = posData.y + 'px;';\n        });\n    }\n    function _MakeDots(lineGraph, aWeekNames, aWeeks, aRanks) {\n        const pointPositions = lineGraph.GetDataPointPositions();\n        let highestRank = Math.max(...aRanks);\n        pointPositions.forEach((posData, index) => {\n            let elPoint = $.CreatePanel('Panel', lineGraph, 'id-point-' + index, { class: 'stats-rank-line-graph-dot' });\n            elPoint.style.x = posData.x + 'px;';\n            elPoint.style.y = posData.y + 'px;';\n            elPoint.SetHasClass('highest-rank', highestRank === aRanks[index]);\n            elPoint.SetPanelEvent('onmouseover', () => {\n                UiToolkitAPI.ShowCustomLayoutParametersTooltip(elPoint.id, 'tooltip-season-rank', 'file://{resources}/layout/tooltips/tooltip_stat_season_rank.xml', 'rank=' + aRanks[index].toString() + '&' +\n                    'week_name=' + aWeekNames[index] + '&' +\n                    'week_idx=' + (aWeeks[index] + 1));\n            });\n            elPoint.SetPanelEvent('onmouseout', () => {\n                UiToolkitAPI.HideCustomLayoutTooltip('tooltip-season-rank');\n            });\n        });\n    }\n    function _CreateMatchesBarGraph(aDataPerWeek) {\n        const barGraph = $('#stats-panel-matches-bar-graph');\n        const textHeight = 15;\n        const graphHeight = (barGraph.actuallayoutheight / barGraph.actualuiscale_y) - textHeight;\n        const graphWidth = (barGraph.actuallayoutwidth / barGraph.actualuiscale_x);\n        let maxMatches = 0;\n        aDataPerWeek.forEach((week) => {\n            maxMatches = week.matches_played > maxMatches ? week.matches_played : maxMatches;\n        });\n        let singleMatchHeight = maxMatches > 10 ? graphHeight / maxMatches : 10;\n        let singleMatchWidth = graphWidth / aDataPerWeek.length;\n        aDataPerWeek.forEach((week, idx) => {\n            let elBar = barGraph.FindChild('id-weekly-bar-' + week.week_id);\n            if (!elBar && week.matches_played > 0) {\n                elBar = $.CreatePanel('Panel', barGraph, 'id-weekly-bar-' + week.week_id);\n                elBar.BLoadLayoutSnippet('graph-bar');\n                elBar.FindChild('id-bar-inner').style.height = (singleMatchHeight * week.matches_played) + 'px';\n                elBar.style.x = (singleMatchWidth * idx) + 'px';\n                elBar.SetDialogVariableInt('num-matches', week.matches_played);\n                elBar.SetHasClass('angle-text', maxMatches > 99);\n                elBar.SetPanelEvent('onmouseover', () => {\n                    UiToolkitAPI.ShowCustomLayoutParametersTooltip(elBar.id, 'tooltip-season-rank', 'file://{resources}/layout/tooltips/tooltip_stat_season_rank.xml', 'rank=' + '&' +\n                        'week_name=' + week.week_name + '&' +\n                        'week_idx=' + (idx + 1));\n                });\n                elBar.SetPanelEvent('onmouseout', () => {\n                    UiToolkitAPI.HideCustomLayoutTooltip('tooltip-season-rank');\n                });\n            }\n        });\n    }\n    {\n        $.RegisterForUnhandledEvent('PanoramaComponent_MyPersona_GcLogonNotificationReceived', _ReadyForDisplay);\n        $.RegisterForUnhandledEvent('PanoramaComponent_MyPersona_UpdateConnectionToGC', _ReadyForDisplay);\n        $.RegisterForUnhandledEvent('PanoramaComponent_Tournaments_PremierSeasonSummaryReceived', _UpdateSeasonData);\n        $.RegisterEventHandler('ReadyForDisplay', _m_cp, _ReadyForDisplay);\n        $.RegisterEventHandler('UnreadyForDisplay', _m_cp, _UnreadyForDisplay);\n    }\n})(PopupSeasonStats || (PopupSeasonStats = {}));\n","scripts/popups/popup_select_inventory_item.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../common/iteminfo.ts\" />\nvar SelectInventoryItem;\n(function (SelectInventoryItem) {\n    const m_ItemList = $('#ItemList');\n    const m_SortDropdown = $(\"#SortDropdown\");\n    const m_SearchText = $(\"#Search\");\n    const m_ItemImage = $(\"#SelectItemImage\");\n    let m_InvFilter = '';\n    let m_AssociatedItemId = '';\n    function Init() {\n        $.DispatchEvent('CSGOPlaySoundEffect', 'tab_mainmenu_inventory', 'MOUSE');\n        m_InvFilter = $.GetContextPanel().GetAttributeString('filter_category', 'all');\n        m_AssociatedItemId = $.GetContextPanel().GetAttributeString('associated_item', '');\n        if (m_AssociatedItemId !== '') {\n            $.GetContextPanel().SetDialogVariable('item_name', InventoryAPI.GetItemNameUncustomized(m_AssociatedItemId));\n            m_ItemImage.itemid = m_AssociatedItemId;\n        }\n        const sortMethods = InventoryAPI.GetSortMethodsCount();\n        for (let i = 0; i < sortMethods; i++) {\n            let sort = InventoryAPI.GetSortMethodByIndex(i);\n            let newEntry = $.CreatePanel('Label', m_SortDropdown.GetParent(), sort, {\n                class: 'DropDownMenu'\n            });\n            newEntry.text = $.Localize('#' + sort);\n            m_SortDropdown.AddOption(newEntry);\n        }\n        m_SortDropdown.SetSelected(\"inv_sort_age\");\n        m_SortDropdown.SetPanelEvent('oninputsubmit', UpdatePopup);\n        m_SearchText.RaiseChangeEvents(true);\n        m_SearchText.SetPanelEvent('ontextentrychange', UpdatePopup);\n        UpdatePopup();\n    }\n    SelectInventoryItem.Init = Init;\n    function UpdatePopup() {\n        $.DispatchEvent('SetInventoryFilter', m_ItemList, \"any\", \"any\", \"any\", m_SortDropdown.GetSelected() ? m_SortDropdown.GetSelected().id : 'inv_sort_age', m_InvFilter, m_SearchText.text);\n    }\n    SelectInventoryItem.UpdatePopup = UpdatePopup;\n    function ClosePopUp() {\n        $.DispatchEvent('CSGOPlaySoundEffect', 'inventory_inspect_close', 'MOUSE');\n        $.DispatchEvent('UIPopupButtonClicked', '');\n    }\n    SelectInventoryItem.ClosePopUp = ClosePopUp;\n    function OnItemTileActivated(panel, itemid) {\n        $.DispatchEvent('UIPopupButtonClicked', 'OnInventoryItemSelected(' + itemid + ')');\n    }\n    SelectInventoryItem.OnItemTileActivated = OnItemTileActivated;\n    {\n        $.RegisterForUnhandledEvent(\"OnItemTileActivated\", OnItemTileActivated);\n    }\n})(SelectInventoryItem || (SelectInventoryItem = {}));\n","scripts/popups/popup_select_item_for_capability.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"popup_capability_header.ts\" />\n/// <reference path=\"popup_inspect_action-bar.ts\" />\n/// <reference path=\"popup_inspect_shared.ts\" />\n/// <reference path=\"../common/iteminfo.ts\" />\n/// <reference path=\"../inspect.ts\" />\nvar SelectItemForCapability;\n(function (SelectItemForCapability) {\n    let _m_cp = $.GetContextPanel();\n    let _m_elItemList = _m_cp.FindChildInLayoutFile('id-popup-select-item-list');\n    SelectItemForCapability.oCapabilityInfo = {\n        capability: '',\n        initialItemId: '',\n        popupVisible: false,\n        bWorkshopItemPreview: false,\n        bIsMultiSelect: false\n    };\n    function Init() {\n        SelectItemForCapability.oCapabilityInfo.initialItemId = _m_cp.GetAttributeString('itemid', '');\n        SelectItemForCapability.oCapabilityInfo.secondaryItemId = _m_cp.GetAttributeString('secondaryItemid', '');\n        SelectItemForCapability.oCapabilityInfo.bWorkshopItemPreview = _m_cp.GetAttributeString(\"bWorkshopItemPreview\", 'false') === 'true' ? true : false;\n        SelectItemForCapability.oCapabilityInfo.capability = _m_cp.GetAttributeString(\"capability\", '');\n        SelectItemForCapability.oCapabilityInfo.bIsMultiSelect = (SelectItemForCapability.oCapabilityInfo.capability === \"casketstore\" || SelectItemForCapability.oCapabilityInfo.capability === \"casketretrieve\");\n        SelectItemForCapability.oCapabilityInfo.popupVisible = true;\n        $.DispatchEvent('CapabilityPopupIsOpen', true);\n        _m_cp.FindChildInLayoutFile('id-initial-item-image').itemid = SelectItemForCapability.oCapabilityInfo.initialItemId;\n        _m_elItemList.SetHasClass('inv-multi-select-allow', SelectItemForCapability.oCapabilityInfo.bIsMultiSelect);\n        _m_cp.SetDialogVariable('item-name', InventoryAPI.GetItemName(SelectItemForCapability.oCapabilityInfo.initialItemId));\n        _SetTitle();\n        let elDropDownParent = _m_cp.FindChildInLayoutFile('id-dropdown-container');\n        _AddSortDropdownToNavBar(elDropDownParent);\n        _UpdateMultiSelectDisplay();\n    }\n    SelectItemForCapability.Init = Init;\n    function _SetTitle() {\n        let szPrefixString = '#inv_select_item_use_capability';\n        if (SelectItemForCapability.oCapabilityInfo.capability === 'can_stattrack_swap') {\n            szPrefixString = InventoryAPI.IsTool(SelectItemForCapability.oCapabilityInfo.initialItemId) ?\n                '#inv_select_item_use_capability' :\n                '#inv_select_item_stattrack_swap_capability';\n        }\n        else if (SelectItemForCapability.oCapabilityInfo.capability === 'can_collect') {\n            let defName = InventoryAPI.GetItemDefinitionName(SelectItemForCapability.oCapabilityInfo.initialItemId);\n            szPrefixString = (defName === 'casket') ?\n                '#inv_select_item_tostoreincasket' :\n                '#inv_select_casketitem_tostorethis';\n        }\n        else if (SelectItemForCapability.oCapabilityInfo.capability === 'casketcontents') {\n            szPrefixString = '#inv_select_casketcontents';\n        }\n        else if (SelectItemForCapability.oCapabilityInfo.capability === 'casketretrieve') {\n            szPrefixString = '#inv_select_casketretrieve';\n        }\n        else if (SelectItemForCapability.oCapabilityInfo.capability === 'casketstore') {\n            szPrefixString = '#inv_select_casketstore';\n        }\n        else if (SelectItemForCapability.oCapabilityInfo.capability === 'craft_souvenir') {\n            szPrefixString = '#inv_select_item_craft_souvenir';\n        }\n        _m_cp.AddClass('PopupSelectItemForCapability_' + SelectItemForCapability.oCapabilityInfo.capability);\n        _m_cp.SetDialogVariable('title', $.Localize(szPrefixString, _m_cp));\n    }\n    function _AddSortDropdownToNavBar(elDropDownParent) {\n        let elDropdown = elDropDownParent.FindChildInLayoutFile('InvSortDropdown');\n        let count = InventoryAPI.GetSortMethodsCount();\n        for (let i = 0; i < count; i++) {\n            let sort = InventoryAPI.GetSortMethodByIndex(i);\n            let newEntry = $.CreatePanel('Label', elDropdown, sort, {\n                class: 'DropDownMenu'\n            });\n            newEntry.text = $.Localize('#' + sort);\n            elDropdown.AddOption(newEntry);\n        }\n        elDropdown.SetPanelEvent('oninputsubmit', () => UpdateSort());\n        elDropdown.SetSelected(GameInterfaceAPI.GetSettingString(\"newest\"));\n    }\n    function UpdateSort() {\n        let elDropdown = _m_cp.FindChildInLayoutFile('InvSortDropdown');\n        const sortString = (!elDropdown || !elDropdown.GetSelected()) ? 'newest' : elDropdown.GetSelected().id;\n        let filterApplicationToPhantomItems = ItemInfo.IsFauxOrRentalOrPreviewTool(SelectItemForCapability.oCapabilityInfo.initialItemId) ? '' : ',is_rental:false,is_sealed:false';\n        let capabilityFilter = SelectItemForCapability.oCapabilityInfo.capability + ':' + SelectItemForCapability.oCapabilityInfo.initialItemId + filterApplicationToPhantomItems;\n        $.DispatchEvent('SetInventoryFilter', _m_elItemList, 'any', 'any', 'any', sortString, capabilityFilter, '');\n        _ShowHideNoItemsMessage();\n    }\n    SelectItemForCapability.UpdateSort = UpdateSort;\n    function _ShowHideNoItemsMessage() {\n        let count = _m_elItemList.count;\n        let elParent = _m_elItemList.GetParent();\n        let elEmpty = elParent.FindChildInLayoutFile('id-select-item-empty-lister');\n        if (count > 0) {\n            elEmpty.visible = false;\n            return;\n        }\n        let emptyText = '';\n        elEmpty.SetDialogVariable('type', InventoryAPI.GetItemName(SelectItemForCapability.oCapabilityInfo.initialItemId));\n        if ((SelectItemForCapability.oCapabilityInfo.capability === 'can_stattrack_swap') && !InventoryAPI.IsTool(SelectItemForCapability.oCapabilityInfo.initialItemId))\n            emptyText = $.Localize('#inv_empty_lister_for_stattrackswap', elEmpty);\n        else if (SelectItemForCapability.oCapabilityInfo.capability === 'can_collect')\n            emptyText = $.Localize('#inv_empty_lister_nocaskets', elEmpty);\n        else if (SelectItemForCapability.oCapabilityInfo.capability === 'craft_souvenir')\n            emptyText = $.Localize('#inv_empty_lister_for_craft_souvenir', elEmpty);\n        else\n            emptyText = $.Localize('#inv_empty_lister_for_use', elEmpty);\n        elEmpty.SetDialogVariable('empty-text', emptyText);\n        elEmpty.visible = true;\n    }\n    function _UpdateMultiSelectDisplay() {\n        const elMultiSelectDisplay = _m_cp.FindChildInLayoutFile('id-popup-select-multi-item-display');\n        if (!SelectItemForCapability.oCapabilityInfo.bIsMultiSelect) {\n            elMultiSelectDisplay.visible = false;\n            return;\n        }\n        let count = _m_elItemList.selectedItemCount;\n        elMultiSelectDisplay.SetDialogVariableInt('count', count);\n        _m_cp.FindChildInLayoutFile('id-popup-select-multi-item-btn').enabled = (count > 0);\n        elMultiSelectDisplay.visible = true;\n    }\n    function ClosePopUp() {\n        if (_m_cp.IsValid()) {\n            const callbackFunc = _m_cp.GetAttributeInt('callback', -1);\n            if (callbackFunc != -1) {\n                UiToolkitAPI.InvokeJSCallback(callbackFunc);\n            }\n        }\n        SelectItemForCapability.oCapabilityInfo.popupVisible = false;\n        $.DispatchEvent('CSGOPlaySoundEffect', 'inventory_inspect_close', 'MOUSE');\n        $.DispatchEvent('CapabilityPopupIsOpen', false);\n        $.DispatchEvent('BlurPopupPanel', 'popup-lootlist-item-inspect-' + SelectItemForCapability.oCapabilityInfo.initialItemId, false);\n        $.DispatchEvent('UIPopupButtonClicked', '');\n    }\n    SelectItemForCapability.ClosePopUp = ClosePopUp;\n    function _OnItemTileActivated(itemTile, itemid) {\n        $.DispatchEvent('CSGOPlaySoundEffect', 'inventory_item_select', 'MOUSE');\n        if (SelectItemForCapability.oCapabilityInfo.capability === 'can_sticker') {\n            _CapabilityCanStickerAction(SortIdsIntoToolAndItemID(itemid, SelectItemForCapability.oCapabilityInfo.initialItemId), SelectItemForCapability.oCapabilityInfo.bWorkshopItemPreview);\n        }\n        else if (SelectItemForCapability.oCapabilityInfo.capability === 'can_wrap_sticker') {\n            _CapabilityWrapStickerAsKeychainAction(SortIdsIntoToolAndItemID(itemid, SelectItemForCapability.oCapabilityInfo.initialItemId, ItemInfo.IsSticker));\n        }\n        else if (SelectItemForCapability.oCapabilityInfo.capability === 'nameable') {\n            _CapabilityNameableAction(SortIdsIntoToolAndItemID(itemid, SelectItemForCapability.oCapabilityInfo.initialItemId));\n        }\n        else if (SelectItemForCapability.oCapabilityInfo.capability === 'can_keychain') {\n            _CapabilityCanKeychainAction(SortIdsIntoToolAndItemID(itemid, SelectItemForCapability.oCapabilityInfo.initialItemId), SelectItemForCapability.oCapabilityInfo.bWorkshopItemPreview);\n        }\n        else if (SelectItemForCapability.oCapabilityInfo.capability === 'remove_keychain') {\n            _CapabilityRemoveKeychainAction(SortIdsIntoToolAndItemID(itemid, SelectItemForCapability.oCapabilityInfo.initialItemId));\n        }\n        else if (SelectItemForCapability.oCapabilityInfo.capability === 'can_patch') {\n            _CapabilityCanPatchAction(SortIdsIntoToolAndItemID(itemid, SelectItemForCapability.oCapabilityInfo.initialItemId));\n        }\n        else if (SelectItemForCapability.oCapabilityInfo.capability === 'decodable') {\n            _CapabilityDecodableAction(SortIdsIntoToolAndItemID(itemid, SelectItemForCapability.oCapabilityInfo.initialItemId));\n        }\n        else if (SelectItemForCapability.oCapabilityInfo.capability === 'can_stattrack_swap') {\n            _CapabilityStatTrakSwapAction(SelectItemForCapability.oCapabilityInfo, itemid);\n        }\n        else if (SelectItemForCapability.oCapabilityInfo.capability === 'can_collect') {\n            _CapabilityPutIntoCasketAction(itemid, SelectItemForCapability.oCapabilityInfo.initialItemId);\n        }\n        if (SelectItemForCapability.oCapabilityInfo.capability === 'casketretrieve') {\n            let listPanel = itemTile.FindAncestor(\"id-popup-select-item-list\");\n            listPanel.OnItemActivated(itemid);\n            _UpdateMultiSelectDisplay();\n            return;\n        }\n        else if (SelectItemForCapability.oCapabilityInfo.capability === 'casketstore') {\n            let listPanel = itemTile.FindAncestor(\"id-popup-select-item-list\");\n            listPanel.OnItemActivated(itemid);\n            _UpdateMultiSelectDisplay();\n            return;\n        }\n        else if (SelectItemForCapability.oCapabilityInfo.capability === 'craft_souvenir') {\n            _CapabilityCraftSouvenirAction(itemid, SelectItemForCapability.oCapabilityInfo.initialItemId);\n        }\n        ClosePopUp();\n    }\n    function SortIdsIntoToolAndItemID(id, initalId, fnWhatIsTool) {\n        let bIdIsTool = fnWhatIsTool ? fnWhatIsTool(id) : InventoryAPI.IsTool(id);\n        let toolId = bIdIsTool ? id : initalId;\n        let itemID = bIdIsTool ? initalId : id;\n        return {\n            tool: toolId,\n            item: itemID\n        };\n    }\n    ;\n    function _CapabilityCanStickerAction(idsToUse, bWorkshopItemPreview) {\n        const workshopPreview = bWorkshopItemPreview ? 'true' : 'false';\n        const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('popup-inspect-' + idsToUse.item, 'file://{resources}/layout/popups/popup_capability_can_sticker.xml');\n        let oSettings = {\n            popup_panel: elPanel,\n            item_id: idsToUse.item,\n            tool_id: idsToUse.tool,\n            work_type: 'can_sticker',\n            is_workshop_preview: bWorkshopItemPreview\n        };\n        elPanel.Data().oSettings = oSettings;\n    }\n    ;\n    function _CapabilityNameableAction(idsToUse) {\n        const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('popup-inspect-' + idsToUse.item, 'file://{resources}/layout/popups/popup_capability_nameable.xml');\n        let oSettings = {\n            item_id: idsToUse.item,\n            tool_id: idsToUse.tool,\n            work_type: 'nameable'\n        };\n        elPanel.Data().oSettings = oSettings;\n    }\n    ;\n    function _CapabilityCanKeychainAction(idsToUse, bWorkshopItemPreview) {\n        const workshopPreview = bWorkshopItemPreview ? 'true' : 'false';\n        const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('popup-inspect-' + idsToUse.item, 'file://{resources}/layout/popups/popup_capability_can_keychain.xml');\n        let oSettings = {\n            popup_panel: elPanel,\n            tool_id: idsToUse.tool,\n            item_id: idsToUse.item,\n            work_type: 'can_keychain',\n            is_workshop_preview: bWorkshopItemPreview\n        };\n        elPanel.Data().oSettings = oSettings;\n    }\n    ;\n    function _CapabilityCraftSouvenirAction(itemid, umid) {\n        if (InventoryAPI.GetItemStickerCount(itemid) > 0) {\n            const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('', 'file://{resources}/layout/popups/popup_capability_can_sticker.xml');\n            let oSettings = {\n                popup_panel: elPanel,\n                item_id: itemid,\n                remove_sticker_all_at_once: true,\n                work_type: 'remove_sticker',\n                umid_souvenir: umid\n            };\n            elPanel.Data().oSettings = oSettings;\n        }\n        else {\n            const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('popup-inspect-' + itemid, 'file://{resources}/layout/popups/popup_capability_can_keychain.xml');\n            let oSettings = {\n                item_id: itemid,\n                tool_id: '',\n                umid_souvenir: umid,\n                work_type: 'craft_souvenir'\n            };\n            elPanel.Data().oSettings = oSettings;\n        }\n    }\n    function _CapabilityWrapStickerAsKeychainAction(idsToUse) {\n        const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('popup-inspect-' + idsToUse.item, 'file://{resources}/layout/popups/popup_capability_can_keychain.xml');\n        let oSettings = {\n            item_id: idsToUse.item,\n            tool_id: idsToUse.tool,\n            work_type: 'can_wrap_sticker'\n        };\n        elPanel.Data().oSettings = oSettings;\n    }\n    ;\n    function _CapabilityRemoveKeychainAction(idsToUse) {\n        const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('popup-inspect-' + idsToUse.item, 'file://{resources}/layout/popups/popup_capability_can_keychain.xml');\n        let oSettings = {\n            item_id: idsToUse.item,\n            work_type: 'remove_keychain'\n        };\n        elPanel.Data().oSettings = oSettings;\n    }\n    ;\n    function _CapabilityCanPatchAction(idsToUse) {\n        const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('popup-inspect-' + idsToUse.item, 'file://{resources}/layout/popups/popup_capability_can_patch.xml');\n        let oSettings = {\n            item_id: idsToUse.item,\n            tool_id: idsToUse.tool,\n            work_type: 'can_patch'\n        };\n        elPanel.Data().oSettings = oSettings;\n    }\n    ;\n    function _CapabilityDecodableAction(idsToUse) {\n        const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('popup-inspect-' + idsToUse.item, 'file://{resources}/layout/popups/popup_capability_decodable.xml');\n        let oSettings = {\n            item_id: idsToUse.item,\n            tool_id: idsToUse.tool,\n            work_type: 'decodeable'\n        };\n        elPanel.Data().oSettings = oSettings;\n    }\n    ;\n    function _CapabilityStatTrakSwapAction(capInfo, id) {\n        if (InventoryAPI.IsTool(capInfo.initialItemId)) {\n            const sWorkshop = false;\n            $.DispatchEvent('CSGOPlaySoundEffect', 'tab_mainmenu_inventory', 'MOUSE');\n            $.DispatchEvent('ShowSelectItemForCapabilityPopup', id, capInfo.initialItemId, capInfo.capability);\n            ClosePopUp();\n        }\n        else {\n            const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('', 'file://{resources}/layout/popups/popup_capability_can_stattrack_swap.xml');\n            let oSettings = {\n                tool_id: capInfo.secondaryItemId,\n                item_id: capInfo.initialItemId,\n                stattrak_swap_second_item_id: id\n            };\n            elPanel.Data().oSettings = oSettings;\n        }\n    }\n    ;\n    function _CapabilityPutIntoCasketAction(idCasket, idItem, cap) {\n        $.DispatchEvent('ContextMenuEvent', '');\n        if (!cap) {\n            $.DispatchEvent('HideSelectItemForCapabilityPopup');\n            $.DispatchEvent('UIPopupButtonClicked', '');\n            $.DispatchEvent('CapabilityPopupIsOpen', false);\n        }\n        if (InventoryAPI.GetItemAttributeValue(idCasket, 'modification date')) {\n            UiToolkitAPI.ShowCustomLayoutPopupParameters('', 'file://{resources}/layout/popups/popup_casket_operation.xml', 'op=add' +\n                (cap ? '&nextcapability=' + cap : '') +\n                '&spinner=1' +\n                '&casket_item_id=' + idCasket +\n                '&subject_item_id=' + idItem);\n        }\n        else {\n            const fauxNameTag = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(1200, 0);\n            const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('', 'file://{resources}/layout/popups/popup_capability_nameable.xml');\n            let oSettings = {\n                item_id: idCasket,\n                tool_id: fauxNameTag,\n                work_type: 'nameable',\n                async_work_type_warning_text: '#popup_newcasket_warning'\n            };\n            elPanel.Data().oSettings = oSettings;\n        }\n    }\n    ;\n    function ProceedForMultiStatusCapabilityPopup() {\n        let capability = SelectItemForCapability.oCapabilityInfo.capability;\n        let count = _m_elItemList.selectedItemCount;\n        let arrItemIDs = [];\n        for (let i = 0; i < count; i++) {\n            arrItemIDs.push(_m_elItemList.GetSelectedItemId(i).toString());\n        }\n        if (arrItemIDs.length <= 0)\n            return;\n        switch (capability) {\n            case 'casketretrieve':\n                {\n                    let strItemIDs = arrItemIDs.join(\",\");\n                    UiToolkitAPI.ShowCustomLayoutPopupParameters('', 'file://{resources}/layout/popups/popup_casket_operation.xml', 'op=remove' +\n                        '&nextcapability=batch' +\n                        '&spinner=1' +\n                        '&casket_item_id=' + SelectItemForCapability.oCapabilityInfo.initialItemId +\n                        '&subject_item_id=' + strItemIDs);\n                    break;\n                }\n            case 'casketstore':\n                {\n                    let strItemIDs = arrItemIDs.join(\",\");\n                    UiToolkitAPI.ShowCustomLayoutPopupParameters('', 'file://{resources}/layout/popups/popup_casket_operation.xml', 'op=add' +\n                        '&nextcapability=batch' +\n                        '&spinner=1' +\n                        '&casket_item_id=' + SelectItemForCapability.oCapabilityInfo.initialItemId +\n                        '&subject_item_id=' + strItemIDs);\n                    break;\n                }\n        }\n        ClosePopUp();\n    }\n    SelectItemForCapability.ProceedForMultiStatusCapabilityPopup = ProceedForMultiStatusCapabilityPopup;\n    function _UpdateSelectItemForCapabilityPopup(capability, itemid, bSelected) {\n        if (SelectItemForCapability.oCapabilityInfo.capability !== capability)\n            return false;\n        if (!itemid)\n            return false;\n        _UpdateMultiSelectDisplay();\n        UpdateSort();\n        return true;\n    }\n    {\n        $.RegisterForUnhandledEvent(\"OnItemTileActivated\", _OnItemTileActivated);\n        $.RegisterForUnhandledEvent('UpdateSelectItemForCapabilityPopup', _UpdateSelectItemForCapabilityPopup);\n    }\n})(SelectItemForCapability || (SelectItemForCapability = {}));\n","scripts/popups/popup_serverbrowser.js":"\"use strict\";\n/// <reference path=\"..\\csgo.d.ts\" />\nvar PopupServerBrowser;\n(function (PopupServerBrowser) {\n    function OnOpen() {\n        UpdateNeverShowAgainSetting();\n        if (MyPersonaAPI.GetLauncherType() === \"perfectworld\") {\n            SteamOverlayAPI.OpenURL('https://csgo.wanmei.com/communityserver');\n        }\n        else {\n            SteamOverlayAPI.OpenUrlInOverlayOrExternalBrowser('steam://open/servers');\n        }\n        $.DispatchEvent('UIPopupButtonClicked', '');\n    }\n    PopupServerBrowser.OnOpen = OnOpen;\n    function Close() {\n        UpdateNeverShowAgainSetting();\n        $.DispatchEvent('UIPopupButtonClicked', '');\n    }\n    PopupServerBrowser.Close = Close;\n    function UpdateNeverShowAgainSetting() {\n        var elToggle = $.GetContextPanel().FindChildInLayoutFile('NeverShowToggle');\n        if (elToggle.checked)\n            GameInterfaceAPI.SetSettingString('player_nevershow_communityservermessage', '1');\n    }\n})(PopupServerBrowser || (PopupServerBrowser = {}));\n","scripts/popups/popup_shopping_cart_checkout.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../common/shopping_cart.ts\" />\n/// <reference path=\"../generated/items_event_current_generated_store.d.ts\" />\n/// <reference path=\"../generated/items_event_current_generated_store.ts\" />\n/// <reference path=\"../common/formattext.ts\" />\n/// <reference path=\"../common/hold_button.ts\" />\n/// <reference path=\"../common/add_major_tokens_anim.ts\" />\n/// <reference path=\"../popups/popup_major_store.ts\" />\n/// <reference path=\"../popups/popup_acknowledge_item.ts\" />\nvar PopUpShoppingCartCheckout;\n(function (PopUpShoppingCartCheckout) {\n    function getCart(cp) {\n        if (!cp)\n            cp = $.GetContextPanel();\n        let cart = ShoppingCart.cart;\n        while (cp) {\n            if (cp.Data().hasOwnProperty('cart') && cp.Data().cart) {\n                cart = cp.Data().cart;\n                break;\n            }\n            cp = cp.GetParent();\n        }\n        return cart;\n    }\n    function OnReadyForDisplay() {\n        if (!MyPersonaAPI.IsConnectedToGC()) {\n            ClosePopup();\n            return;\n        }\n        const cp = $.GetContextPanel();\n        $.RegisterForUnhandledEvent('PanoramaComponent_Inventory_ItemCustomizationNotification', (...args) => { _ItemCustomizationNotification(...args, cp); });\n        $.RegisterForUnhandledEvent('PanoramaComponent_Store_PurchaseCompleted', (...args) => { _OnPurchaseCompletion(...args, cp); });\n        $.RegisterForUnhandledEvent('PanoramaComponent_MyPersona_UpdateConnectionToGC', Init);\n        cp.FindChildInLayoutFile('id-cart-close').SetPanelEvent('onactivate', ClosePopup);\n        cp.FindChildInLayoutFile('id-cart-balance').SetDialogVariable('local-price', StoreAPI.GetStoreItemTokensBundlePrice('' + g_ActiveTournamentInfo.itemid_charge, 100, ''));\n        cp.FindChildInLayoutFile('id-cart-balance').SetPanelEvent('onmouseover', () => {\n            UiToolkitAPI.ShowTitleTextTooltip('id-cart-balance', '#CSGO_TournamentPass_' + g_ActiveTournamentInfo.location + '_credits', '#major_store_balance_tooltip');\n        });\n        cp.FindChildInLayoutFile('id-cart-balance').SetPanelEvent('onmouseout', () => {\n            UiToolkitAPI.HideTitleTextTooltip();\n        });\n        AddMajorTokensAnim.SetTransitionEndEvent(cp.FindChildInLayoutFile('id-cart-add-tokens'));\n    }\n    function OnUnreadyForDisplay() {\n    }\n    let m_numTotalEconItemsInInventory = 0;\n    function Init() {\n        if (!MyPersonaAPI.IsConnectedToGC()) {\n            ClosePopup();\n            return;\n        }\n        InventoryAPI.SetInventorySortAndFilters('inv_sort_age', false, 'only_econ_items', '', '');\n        m_numTotalEconItemsInInventory = InventoryAPI.GetInventoryCount();\n        const cp = $.GetContextPanel();\n        const strOneOffCartId = cp.GetAttributeString('cartid', '');\n        if (strOneOffCartId) {\n            let cart = ShoppingCart.findOrCreateTempCart(strOneOffCartId, false);\n            if (cart) {\n                cp.Data().cart = cart;\n                ShoppingCart.releaseTempCart(strOneOffCartId);\n            }\n        }\n        cp.SetHasClass('shopping-oneoff-cart', getCart(cp) !== ShoppingCart.cart);\n        _SetRedeemableBalance(cp);\n        getCart(cp).subscribeToUpdates(cp, 'purchase-btn', () => {\n            _SetupButtonsAndWarnings(cp);\n        });\n        _SetUpEmptyState(cp);\n        _MakeCartTiles(cp);\n        getCart(cp).subscribeToUpdates(cp, 'total-price', () => {\n            cp.SetDialogVariableInt('total-price', getCart(cp).getTotalPrice());\n        });\n        getCart(cp).subscribeToUpdates(cp, 'total-count', () => {\n            cp.SetDialogVariableInt('total-count', getCart(cp).getTotalItems());\n        });\n        cp.FindChildInLayoutFile('id-checkout-clear-all').SetPanelEvent('onactivate', () => {\n            getCart(cp).clearCart();\n            _SetUpEmptyState(cp);\n            _MakeCartTiles(cp);\n        });\n        if (PopupMajorStore.GetSecondsUntilPendingPriceUpdateForAllTournamentItems() > 0) {\n            PopupMajorStore.PriceRefreshTimerUpdate(cp);\n        }\n    }\n    PopUpShoppingCartCheckout.Init = Init;\n    function _SetRedeemableBalance(cp) {\n        const idxLookup = InventoryAPI.GetCacheTypeElementIndexByKey('SeasonalOperations', g_ActiveTournamentInfo.credits_id);\n        let nRedeemableBalance = 0;\n        if (g_ActiveTournamentInfo.credits_id == InventoryAPI.GetCacheTypeElementFieldByIndex('SeasonalOperations', idxLookup, 'season_value')) {\n            nRedeemableBalance = InventoryAPI.GetCacheTypeElementFieldByIndex('SeasonalOperations', idxLookup, 'redeemable_balance');\n            nRedeemableBalance = (nRedeemableBalance === null || nRedeemableBalance === undefined) ? 0 : nRedeemableBalance;\n        }\n        cp.SetDialogVariableInt('balance', nRedeemableBalance);\n        cp.Data().redeemableBalance = nRedeemableBalance;\n    }\n    function _SetupButtonsAndWarnings(cp) {\n        const isInventoryFull = (m_numTotalEconItemsInInventory + getCart(cp).getTotalItems() > ItemInfo.NUM_BACKPACK_SLOTS);\n        cp.FindChildInLayoutFile('id-cart-warning').visible = isInventoryFull;\n        _AcknowledgeNewTokens(cp);\n        $.Schedule(.4, () => {\n            let itemId = '';\n            let numInactiveTokens = 0;\n            if (!cp || !cp.IsValid()) {\n                return;\n            }\n            InventoryAPI.SetInventorySortAndFilters('inv_sort_age', false, 'tool_type:seasontiers,has_attribute:season access:==:' + g_ActiveTournamentInfo.credits_id, '', '');\n            if (InventoryAPI.GetInventoryCount() > 0) {\n                itemId = InventoryAPI.GetInventoryItemIDByIndex(0);\n                numInactiveTokens = Number(InventoryAPI.GetItemAttributeValue(itemId, '{uint32}upgrade level'));\n            }\n            cp.Data().activatedCredits = numInactiveTokens;\n            let nPurchaseTokens = getCart(cp).getTotalPrice() - (cp.Data().redeemableBalance + numInactiveTokens);\n            const nActualNumberOfPurchaseTokensNeeded = nPurchaseTokens;\n            nPurchaseTokens = nPurchaseTokens > 0 ? Math.max(nPurchaseTokens, 100) : 0;\n            const nTokensNeeded = getCart(cp).getTotalPrice() - cp.Data().redeemableBalance;\n            cp.SetDialogVariableInt('tokens-needed', nTokensNeeded);\n            cp.SetDialogVariableInt('inactive-tokens', numInactiveTokens);\n            cp.SetDialogVariableInt('purchase-tokens', nPurchaseTokens);\n            cp.FindChildInLayoutFile('id-cart-not-enough-tokens').SetHasClass('show', nTokensNeeded >= 0 && !isInventoryFull && getCart(cp).getTotalPrice() > 0);\n            let oSettings = {\n                cp: cp,\n                nInactiveTokens: numInactiveTokens,\n                nPurchaseTokens: nPurchaseTokens,\n                nActualNumberOfPurchaseTokensNeeded: nActualNumberOfPurchaseTokensNeeded,\n                nTokensNeeded: nTokensNeeded,\n                isInventoryFull: isInventoryFull,\n                itemId: itemId\n            };\n            _UpdateActiveTokenProgressSection(oSettings);\n            _UpdatePurchaseTokenProgressSection(oSettings);\n            _UpdateUseTokensProgressSection(oSettings);\n        });\n    }\n    function _UpdateActiveTokenProgressSection(oSettings) {\n        let elActivateSection = oSettings.cp.FindChildInLayoutFile('id-cart-checkout-step-activate');\n        const bEnabled = oSettings.nInactiveTokens > 0 &&\n            (oSettings.cp.Data().redeemableBalance < getCart(oSettings.cp).getTotalPrice());\n        !oSettings.isInventoryFull &&\n            getCart(oSettings.cp).getTotalPrice() > 0;\n        const bHide = (getCart(oSettings.cp).getTotalItems() < 1) || (oSettings.nInactiveTokens < 1 && oSettings.nPurchaseTokens < 1);\n        elActivateSection.SetHasClass('hide', bHide);\n        if (bHide)\n            return;\n        const elPurchaseSection = oSettings.cp.FindChildInLayoutFile('id-cart-checkout-step-purchase');\n        if (oSettings.nInactiveTokens > 0 || oSettings.nPurchaseTokens < 1) {\n            oSettings.cp.FindChildInLayoutFile('id-cart-purchase-steps').MoveChildBefore(elActivateSection, elPurchaseSection);\n            elActivateSection.FindChildInLayoutFile('id-cart-top-line').SetHasClass('hide-top-line', true);\n            elPurchaseSection.FindChildInLayoutFile('id-cart-top-line').SetHasClass('hide-top-line', false);\n        }\n        else {\n            elActivateSection.FindChildInLayoutFile('id-cart-top-line').SetHasClass('hide-top-line', false);\n            elPurchaseSection.FindChildInLayoutFile('id-cart-top-line').SetHasClass('hide-top-line', true);\n            oSettings.cp.FindChildInLayoutFile('id-cart-purchase-steps').MoveChildAfter(elActivateSection, elPurchaseSection);\n        }\n        const elBtn = elActivateSection.FindChildInLayoutFile('id-cart-activate-tokens-btn');\n        const btnSettings = {\n            btn: elBtn,\n            tooltip: '#major_store_checkout_activate_tokens_tooltip',\n            locString: $.Localize('#major_store_checkout_activate_btn'),\n            loopingSound: 'UI.Laptop.ButtonFillLoop',\n            timerCompleteAction: () => {\n                InventoryAPI.UseTool(oSettings.itemId, '');\n                elBtn.enabled = false;\n                _SetCallbackTimeout(oSettings.cp, elActivateSection);\n            }\n        };\n        HoldButton.SetupButton(btnSettings);\n        elBtn.enabled = bEnabled;\n        elActivateSection.SetHasClass('active', bEnabled);\n    }\n    function _UpdatePurchaseTokenProgressSection(oSettings) {\n        const elProgressSection = oSettings.cp.FindChildInLayoutFile('id-cart-checkout-step-purchase');\n        const bEnabled = oSettings.nInactiveTokens <= 0 && oSettings.nPurchaseTokens > 0 &&\n            !oSettings.isInventoryFull &&\n            getCart(oSettings.cp).getTotalPrice() > 0;\n        const bHide = (oSettings.nPurchaseTokens <= 0 || getCart(oSettings.cp).getTotalItems() < 1);\n        elProgressSection.SetHasClass('hide', bHide);\n        if (bHide)\n            return;\n        const elBtn = elProgressSection.FindChildInLayoutFile('id-cart-buy-tokens-btn');\n        elBtn.SetDialogVariable('real-price', StoreAPI.GetStoreItemTokensBundlePrice('' + g_ActiveTournamentInfo.itemid_charge, oSettings.nPurchaseTokens, ''));\n        const btnSettings = {\n            btn: elBtn,\n            tooltip: '#major_store_checkout_purchase_tokens_tooltip' + ((oSettings.nActualNumberOfPurchaseTokensNeeded < 100) ? '100' : ''),\n            locString: $.Localize('#major_store_checkout_purchase_btn', elBtn),\n            loopingSound: 'UI.Laptop.ButtonFillLoop',\n            timerCompleteAction: () => {\n                elBtn.enabled = false;\n                StoreAPI.StoreItemPurchase('' + g_ActiveTournamentInfo.itemid_charge + '(' + oSettings.nPurchaseTokens + ')');\n                $.DispatchEvent(\"CSGOPlaySoundEffect\", \"UIPanorama.buymenu_purchase\", \"MOUSE\");\n            }\n        };\n        elBtn.enabled = bEnabled;\n        HoldButton.SetupButton(btnSettings);\n        elBtn.enabled = bEnabled;\n        elProgressSection.SetHasClass('active', bEnabled);\n    }\n    function _UpdateUseTokensProgressSection(oSettings) {\n        const elProgressSection = oSettings.cp.FindChildInLayoutFile('id-cart-checkout-step-use-tokens');\n        const bHide = (getCart(oSettings.cp).getTotalItems() < 1);\n        elProgressSection.SetHasClass('hide', bHide);\n        if (bHide)\n            return;\n        const bEnabled = !oSettings.isInventoryFull &&\n            getCart(oSettings.cp).getTotalPrice() > 0 &&\n            oSettings.nPurchaseTokens <= 0 &&\n            (oSettings.nInactiveTokens <= 0 || oSettings.cp.Data().redeemableBalance >= getCart(oSettings.cp).getTotalPrice());\n        const elBtn = elProgressSection.FindChildInLayoutFile('id-cart-use-tokens-btn');\n        const strCheckoutSuffix = oSettings.cp.GetAttributeString('checkoutsuffix', '') || '';\n        const strButtonText = $.Localize('#major_store_checkout_use_tokens_btn' + strCheckoutSuffix);\n        elBtn.text = strButtonText;\n        const btnSettings = {\n            btn: elBtn,\n            tooltip: '#major_store_checkout_use_tokens_tooltip' + strCheckoutSuffix,\n            locString: strButtonText,\n            loopingSound: 'UI.Laptop.ButtonFillLoop',\n            timerCompleteAction: () => {\n                InventoryAPI.SetInventorySortAndFilters('inv_sort_age', false, 'only_econ_items', '', '');\n                if (InventoryAPI.GetInventoryCount() + getCart(oSettings.cp).getTotalItems() > ItemInfo.NUM_BACKPACK_SLOTS) {\n                    UiToolkitAPI.ShowGenericPopupOk($.Localize('#popup_casket_title_error_casket_inv_full'), $.Localize('#SFUI_InventoryFull_Error'), '', () => { });\n                    return;\n                }\n                _OnAccept(oSettings.cp.Data().redeemableBalance, getCart(oSettings.cp).getTotalPrice(), oSettings.cp);\n                elBtn.enabled = false;\n                oSettings.cp.FindChildInLayoutFile('id-cart-close').enabled = false;\n                _SetCallbackTimeout(oSettings.cp, elProgressSection);\n            }\n        };\n        HoldButton.SetupButton(btnSettings);\n        elBtn.enabled = bEnabled;\n        elProgressSection.SetHasClass('active', bEnabled);\n    }\n    function _SetUpEmptyState(cp) {\n        const items = getCart(cp).getItems();\n        cp.SetHasClass('empty-cart', items.length <= 0);\n    }\n    function ClosePopup() {\n        $.DispatchEvent('UIPopupButtonClicked', '');\n        $.DispatchEvent('ContextMenuEvent', '');\n        UiToolkitAPI.HideTextTooltip();\n        UiToolkitAPI.HideTitleTextTooltip();\n        PopupMajorStore.CancelRefreshTimerUpdate($.GetContextPanel());\n    }\n    PopUpShoppingCartCheckout.ClosePopup = ClosePopup;\n    function _OnAccept(creditsOwned, totalPrice, cp) {\n        const items = getCart(cp).getItems();\n        let szPurchaseItems = '';\n        if (items.length === 0) {\n            getCart(cp).clearCart();\n            UiToolkitAPI.ShowGenericPopupOk($.Localize('#major_store_checkout_cart_error'), $.Localize('#major_store_checkout_cart_error_desc'), '', () => $.DispatchEvent('HideContentPanel'));\n            ClosePopup();\n        }\n        else {\n            for (const item of items) {\n                for (let j = 0; j < item.quantity; ++j) {\n                    let purchase_id = item.checkout_id || item.id;\n                    szPurchaseItems = purchase_id + (szPurchaseItems ? ',' + szPurchaseItems : '');\n                }\n            }\n        }\n        cp.FindChildInLayoutFile('id-checkout-lister').Children().forEach(entry => {\n            entry.FindChildInLayoutFile('id-cart-quantity-block').hittest = false;\n            entry.FindChildInLayoutFile('id-cart-quantity-block').hittestchildren = false;\n        });\n        MissionsAPI.ActionOperationFauxPurchase(g_ActiveTournamentInfo.credits_id, creditsOwned, totalPrice, szPurchaseItems);\n    }\n    function _MakeCartTiles(cp) {\n        const elParent = cp.FindChildInLayoutFile('id-checkout-lister');\n        const cartIds = new Set(getCart(cp).getItems().map(item => item.id));\n        const aItemsNotInCart = elParent.Children().filter(tile => !cartIds.has(tile.id));\n        aItemsNotInCart.forEach(tile => {\n            tile.AddClass('hide-for-delete');\n        });\n        getCart(cp).getItems().forEach(item => {\n            let elTile = elParent.FindChildInLayoutFile(item.id);\n            if (!elTile) {\n                elTile = $.CreatePanel('Panel', elParent, item.id);\n                elTile.BLoadLayoutSnippet('cart-item');\n                const itemImage = elTile.FindChildInLayoutFile('id-cart-item-image');\n                itemImage.itemid = item.id;\n                itemImage.SetPanelEvent('onactivate', () => {\n                    if (getCart(cp) !== ShoppingCart.cart)\n                        return;\n                    if (cp.Data().isFromInspect) {\n                        return;\n                    }\n                    const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('', 'file://{resources}/layout/popups/popup_inventory_inspect.xml');\n                    let oSettings = {\n                        item_id: item.id,\n                        inspect_only: true,\n                        hide_all_action_items: true,\n                        price_in_tokens: item.price,\n                        back_to_checkout: true\n                    };\n                    elPanel.Data().oSettings = oSettings;\n                });\n                let fmtName = ItemInfo.GetFormattedName(item.id);\n                fmtName.SetOnLabel(elTile.FindChildInLayoutFile('id-cart-item-name'));\n                elTile.FindChildInLayoutFile('id-cart-item-add-to-cart-btn').SetPanelEvent('onactivate', () => {\n                    getCart(cp).addItem(item);\n                    const itemQuantity = getCart(cp).getItemQuantity(item.id);\n                    elTile.SetDialogVariableInt('count', itemQuantity);\n                    const lineItemPrice = getCart(cp).getItemLinePrice(item.id);\n                    elTile.SetDialogVariableInt('price', lineItemPrice);\n                    if (ShoppingCart.cart.getItemQuantity(item.id) >= 10 || ShoppingCart.cart.getTotalItems() >= 100) {\n                        $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.buymenu_failure', 'MOUSE');\n                        return;\n                    }\n                    $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.generic_button_press', 'MOUSE');\n                });\n                elTile.FindChildInLayoutFile('id-cart-item-remove-from-cart-btn').SetPanelEvent('onactivate', () => {\n                    getCart(cp).decrementItem(item.id);\n                    const itemQuantity = getCart(cp).getItemQuantity(item.id);\n                    const lineItemPrice = getCart(cp).getItemLinePrice(item.id);\n                    elTile.SetDialogVariableInt('price', lineItemPrice);\n                    elTile.SetDialogVariableInt('count', itemQuantity);\n                    $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.generic_button_press', 'MOUSE');\n                });\n                elTile.FindChildInLayoutFile('id-cart-item-trash-btn').SetPanelEvent('onactivate', () => {\n                    getCart(cp).removeItem(item.id);\n                    _SetUpEmptyState(cp);\n                    _MakeCartTiles(cp);\n                    $.DispatchEvent('CSGOPlaySoundEffect', 'UI.BookClose', 'MOUSE');\n                });\n                let isInitialSetup = true;\n                let lastSeenPrice;\n                const elChange = elTile.FindChildInLayoutFile('id-cart-item-price-change');\n                getCart(cp).subscribeToUpdates(elTile, 'cart-item', () => {\n                    if (item.oldPrice !== undefined && item.oldPrice !== item.price) {\n                        const nDifference = item.price - item.oldPrice;\n                        elTile.SetDialogVariableInt('price-change', Math.abs(nDifference * getCart(cp).getItemQuantity(item.id)));\n                        elChange.SetHasClass('show-change', false);\n                        elChange.SwitchClass('direction', item.price > item.oldPrice ? 'higher' : 'lower');\n                        if (isInitialSetup || lastSeenPrice == item.price) {\n                            elChange.SetHasClass('show-change', true);\n                        }\n                        else {\n                            elTile.FindChildInLayoutFile('id-cart-item-price-loading').visible = true;\n                            $.Schedule(1, () => {\n                                elTile.FindChildInLayoutFile('id-cart-item-price-loading').visible = false;\n                                elChange.SetHasClass('show-change', true);\n                            });\n                        }\n                    }\n                    else\n                        elChange.SetHasClass('show-change', false);\n                    const lineItemPrice = getCart(cp).getItemLinePrice(item.id);\n                    const itemQuantity = getCart(cp).getItemQuantity(item.id);\n                    elTile.SetDialogVariableInt('price', lineItemPrice);\n                    lastSeenPrice = item.price;\n                    isInitialSetup = false;\n                });\n                $.RegisterEventHandler('PropertyTransitionEnd', elTile, function (panelName, propertyName) {\n                    if (propertyName === \"opacity\") {\n                        if (elTile.visible === true && elTile.BIsTransparent()) {\n                            elTile.DeleteAsync(0);\n                        }\n                    }\n                });\n            }\n            const lineItemPrice = getCart(cp).getItemLinePrice(item.id);\n            const itemQuantity = getCart(cp).getItemQuantity(item.id);\n            elTile.SetDialogVariableInt('count', getCart(cp).getItemQuantity(item.id));\n            elTile.SetDialogVariableInt('price', getCart(cp).getItemLinePrice(item.id));\n        });\n    }\n    function _SetCallbackTimeout(cp, elProgressSection) {\n        _CancelCallbackTimeout(cp);\n        elProgressSection.SetHasClass('show-spinner', true);\n        cp.Data().redeemTimeoutHandle = $.Schedule(5, () => {\n            UiToolkitAPI.ShowGenericPopupOk($.Localize('#SFUI_SteamConnectionErrorTitle'), $.Localize('#SFUI_Steam_Error_LinkUnexpected'), '', () => $.DispatchEvent('HideContentPanel'));\n            ClosePopup();\n        });\n    }\n    function _CancelCallbackTimeout(cp) {\n        if (cp.Data().redeemTimeoutHandle) {\n            $.CancelScheduled(cp.Data().redeemTimeoutHandle);\n            cp.Data().redeemTimeoutHandle = null;\n            cp.FindChildInLayoutFile('id-cart-purchase-steps').FindChildrenWithClassTraverse('show-spinner').forEach(element => {\n                element.SetHasClass('show-spinner', false);\n            });\n        }\n    }\n    function _ItemCustomizationNotification(numericType, type, itemid, cp) {\n        if (type === 'seasontiers') {\n            _CancelCallbackTimeout(cp);\n            function CallAtEndAnimation() {\n                Init();\n                cp.FindChildInLayoutFile('id-cart-add-tokens').SetHasClass('hidden', true);\n                cp.FindChildInLayoutFile('id-cart-balance').TriggerClass('popup-major-store__top-bar__balance-anim');\n            }\n            cp.FindChildInLayoutFile('id-cart-add-tokens').SetHasClass('hidden', false);\n            AddMajorTokensAnim.StartAnim(cp.FindChildInLayoutFile('id-cart-add-tokens'), cp.FindChildInLayoutFile('id-cart-balance'), cp.Data().activatedCredits, CallAtEndAnimation);\n            cp.Data().activatedCredits = 0;\n        }\n        if (type === 'reward_redeemed') {\n            _CancelCallbackTimeout(cp);\n            const aNewItems = AcknowledgeItems.GetItems().filter(item => (item.pickuptype\n                && ['purchased'].includes(item.pickuptype)));\n            if (aNewItems.length > 0) {\n                getCart(cp).clearCart();\n                _InvokeCallback($.GetContextPanel());\n                $.DispatchEvent('ShowAcknowledgePopup', '', '');\n                ClosePopup();\n            }\n            else {\n                ClosePopup();\n            }\n        }\n    }\n    function _OnPurchaseCompletion(itemId, cp) {\n        _CancelCallbackTimeout(cp);\n        _AcknowledgeNewTokens(cp);\n    }\n    function _AcknowledgeNewTokens(cp) {\n        const aNewItems = AcknowledgeItems.GetItems().filter(item => (item.pickuptype\n            && ['purchased'].includes(item.pickuptype)));\n        let bHasNewCredits = false;\n        aNewItems.forEach(item => {\n            if ((ItemInfo.ItemDefinitionNameSubstrMatch(item.id, 'tournament_pass_') && ItemInfo.ItemDefinitionNameSubstrMatch(item.id, '_credits'))) {\n                InventoryAPI.AcknowledgeNewItembyItemID(item.id);\n                bHasNewCredits = true;\n            }\n        });\n        if (bHasNewCredits) {\n            $.DispatchEvent('HideStoreStatusPanel');\n            $.Schedule(.1, Init);\n            if (!cp.Data().isFromInspect)\n                _InvokeCallback($.GetContextPanel());\n        }\n    }\n    function _InvokeCallback(cp) {\n        var callbackHandle = cp.GetAttributeInt(\"callback\", -1);\n        if (callbackHandle != -1) {\n            UiToolkitAPI.InvokeJSCallback(callbackHandle, '');\n        }\n    }\n    {\n        $.RegisterEventHandler('ReadyForDisplay', $.GetContextPanel(), OnReadyForDisplay);\n        $.RegisterEventHandler('UnreadyForDisplay', $.GetContextPanel(), OnUnreadyForDisplay);\n        $.GetContextPanel().RegisterForReadyEvents(true);\n        if ($.GetContextPanel().BReadyForDisplay()) {\n            OnReadyForDisplay();\n        }\n    }\n})(PopUpShoppingCartCheckout || (PopUpShoppingCartCheckout = {}));\n","scripts/popups/popup_store_status.js":"\"use strict\";\n/// <reference path=\"..\\csgo.d.ts\" />\nvar PopupStoreStatus;\n(function (PopupStoreStatus) {\n    let _strStoreStatusOkCmd = null;\n    let _strStoreProceedAfterCheckoutConfirmation = \"StoreProceedAfterCheckoutConfirmation\";\n    function SetupPopup() {\n        let ctx = $.GetContextPanel();\n        let strMsg = ctx.GetAttributeString('text', '');\n        let strClose = ctx.GetAttributeString('close', '0');\n        let strCancel = ctx.GetAttributeString('cancel', '0');\n        _strStoreStatusOkCmd = ctx.GetAttributeString('okcmd', '');\n        ctx.SetDialogVariable(\"message\", $.Localize(strMsg));\n        let bClose = !!parseInt(strClose);\n        let bCancel = !!parseInt(strCancel);\n        if (!bClose && !bCancel) {\n            $('#CancelButton').visible = false;\n        }\n        if (bCancel) {\n            $('#OkButton').visible = false;\n        }\n        let bPurchaseConfirmation = _strStoreStatusOkCmd.startsWith(_strStoreProceedAfterCheckoutConfirmation);\n        let elPurchaseConfirmation = $('#PurchaseConfirmation');\n        elPurchaseConfirmation.visible = bPurchaseConfirmation;\n        let sPurchaseConfirmation = bPurchaseConfirmation ? _strStoreStatusOkCmd.slice(1 + _strStoreProceedAfterCheckoutConfirmation.length) : '';\n        elPurchaseConfirmation.text = sPurchaseConfirmation ? sPurchaseConfirmation : $.Localize('#SFUI_MBox_OKButton');\n        if (bCancel && !bClose && !bPurchaseConfirmation) {\n            $(\"#Spinner\").AddClass(\"SpinnerVisible\");\n        }\n    }\n    PopupStoreStatus.SetupPopup = SetupPopup;\n    function OnOKPressed() {\n        if (_strStoreStatusOkCmd) {\n            if (_strStoreStatusOkCmd.startsWith(_strStoreProceedAfterCheckoutConfirmation))\n                StoreAPI.StoreProceedAfterCheckoutConfirmation();\n            else\n                GameInterfaceAPI.ConsoleCommand(_strStoreStatusOkCmd);\n        }\n        _strStoreStatusOkCmd = null;\n        $.DispatchEvent('UIPopupButtonClicked', '');\n    }\n    PopupStoreStatus.OnOKPressed = OnOKPressed;\n})(PopupStoreStatus || (PopupStoreStatus = {}));\n","scripts/popups/popup_subscription_upsell.js":"\"use strict\";\n\nvar SetupPopup = function()\n{\n\tvar sPrice = StoreAPI.GetStoreItemSalePrice( InventoryAPI.GetFauxItemIDFromDefAndPaintIndex( 4748, 0 ), 1, '' );\n\t$.GetContextPanel().SetDialogVariable( \"price\", sPrice ? sPrice : '$0' );\n};\n\nfunction OnOKPressed()\n{\n    MyPersonaAPI.ActionManageRecurringSubscription();\n    $.DispatchEvent( 'UIPopupButtonClicked', '' );\n\n    SendCallback();\n}\n\nfunction OnCancelPressed()\n{\n    $.DispatchEvent( 'UIPopupButtonClicked', '' );\n    SendCallback();\n}\n\nfunction SendCallback()\n{\n    var callbackHandle = $.GetContextPanel().GetAttributeInt( \"callback\", -1 );\n    if ( callbackHandle != -1 )\n    {\n        UiToolkitAPI.InvokeJSCallback( callbackHandle, 'close' );\n    }\n}\n","scripts/popups/popup_tournament_controlroom.js":"'use strict';\n\nvar PopupTournamentControlRoom = ( function()\n{\n\tvar m_eventid = '';\n\tvar m_type = '';\n\tvar m_status = 'none';\n\tvar m_myXuid = MyPersonaAPI.GetXuid();\n\tvar m_cp = $.GetContextPanel();\n\tvar m_scheduled = null;\n\n\tvar _Init = function()\n\t{\n\t\tm_eventid = $.GetContextPanel().GetAttributeString( 'eventid', '' );\n\n\t\tvar type = $.GetContextPanel().GetAttributeString( 'type', '' );\n\t\tvar aTypes = type.split( ',' );\n\t\tm_type = aTypes[0];\n\n\t\t_SetTitle( aTypes[ 0 ] );\n\t\t_MakeTabs( aTypes );\n\n\t\t$( '#id-popup-tournamentcontrolroom-refresh-button' ).visible = false;\n\n\t\t                                            \n\t\tTournamentsAPI.RequestManagementMatchList( m_eventid );\n\t\t_StartScheduledCountdown();\n\t};\n\n\tfunction _StartScheduledCountdown()\n\t{\n\t\tif ( m_scheduled )\n\t\t{\n\t\t\t$.CancelScheduled( m_scheduled );\n\t\t\tm_scheduled = null;\n\t\t}\n\n\t\tm_scheduled = $.Schedule( 15.0, function() {\n\t\t\tm_scheduled = null;\n\t\t\tif ( !m_cp || !m_cp.IsValid() ) return;\n\t\t\tif ( m_status !== 'none' ) return;\n\t\t\t\n\t\t\tm_status = 'error';\n\t\t\t_Updatetournamentcontrolroom( m_type );\n\t\t} );\n\t}\n\n\tfunction _WaitForReloadedDataEvent()\n\t{\n\t\tm_status = 'none';\n\t\t_Updatetournamentcontrolroom( m_type );\n\t\t_StartScheduledCountdown();\n\t}\n\n\tvar _ManagementMatchListReceived = function( eventid )\n\t{\n\t\tif ( m_eventid !== eventid )\n\t\t\treturn;\n\n\t\tif ( m_scheduled )\n\t\t{\n\t\t\t$.CancelScheduled( m_scheduled );\n\t\t\tm_scheduled = null;\n\t\t}\n\n\t\tm_status = 'ready';\n\t\t_Updatetournamentcontrolroom( m_type );\n\t}\n\n\tvar _SetTitle = function( type )\n\t{\n\t\tvar titleOverride = $.GetContextPanel().GetAttributeString( 'titleoverride', '' );\n\t\tvar title = titleOverride !== '' ? titleOverride : '#CSGO_' + type;\n\t\t$.GetContextPanel().FindChildInLayoutFile( 'id-popup-tournamentcontrolroom-title' ).text = $.Localize( title );\n\t};\n\n\tvar _MakeTabs = function( aTypes )\n\t{\n\t\tif ( aTypes.length <= 1 )\n\t\t{\n\t\t\tm_type = aTypes[ 0 ];\n\t\t\t_Updatetournamentcontrolroom( aTypes[ 0 ] );\n\t\t\treturn;\n\t\t}\n\n\t\tvar elNavBar = $.GetContextPanel().FindChildInLayoutFile( 'id-popup-tournamentcontrolroom-navbar' );\n\t\telNavBar.RemoveClass( 'hidden' );\n\n\t\tvar elTabs = elNavBar.FindChild( 'id-popup-tournamentcontrolroom-tabs' );\n\n\t\tfor ( var i = 0; i < aTypes.length; i++ )\n\t\t{\n\t\t\tvar elTab = $.CreatePanel( \"RadioButton\", elTabs, aTypes[ i ] );\n\t\t\telTab.BLoadLayoutSnippet( \"tournamentcontrolroom-tab\" );\n\t\t\telTab.SetPanelEvent(\n\t\t\t\t'onactivate',\n\t\t\t\t_Updatetournamentcontrolroom.bind( undefined, aTypes[ i ] )\n\t\t\t);\n\n\t\t\telTab.FindChildInLayoutFile( 'tournamentcontrolroom-tab-label' ).text = $.Localize( '#CSGO_' + aTypes[ i ] + '_tab' );\n\t\t}\n\t\t\n\t\t$.DispatchEvent( \"Activated\", elTabs.Children()[ 0 ], \"mouse\" );\n\t};\n\n\tvar _Updatetournamentcontrolroom = function( type )\n\t{\n\t\t                                                               \n\t\tm_type = type;\n\n\t\t                                                     \n\n\t\tvar elStatus = m_cp.FindChildInLayoutFile( 'id-popup-tournamentcontrolroom-loading' );\n\t\tvar elData = m_cp.FindChildInLayoutFile( 'id-popup-tournamentcontrolroom-nodata' );\n\t\tvar eltournamentcontrolroomList = m_cp.FindChildInLayoutFile( 'id-popup-tournamentcontrolroom-list' );\n\n\t\tif ( \"none\" == m_status )\n\t\t{\n\t\t\telStatus.SetHasClass( 'hidden', false );\n\t\t\telData.SetHasClass( 'hidden', true );\n\t\t\teltournamentcontrolroomList.SetHasClass( 'hidden', true );\n\t\t}\n\n\t\tif ( \"error\" === m_status )\n\t\t{\n\t\t\telData.SetHasClass( 'hidden', false );\n\t\t\telStatus.SetHasClass( 'hidden', true );\n\t\t\teltournamentcontrolroomList.SetHasClass( 'hidden', true );\n\t\t}\n\t\n\t\tif ( \"ready\" == m_status )\n\t\t{\n\t\t\tvar count = TournamentsAPI.GetManagementMatchListCount( m_eventid );\n\t\t\t\n\t\t\teltournamentcontrolroomList.SetHasClass( 'hidden', false );\n\t\t\telStatus.SetHasClass( 'hidden', true );\n\t\t\telData.SetHasClass( 'hidden', true );\n\n\t\t\t_FillOutEntries( type, count );\n\t\t}\n\t};\n\n\tfunction _AddDropdownOption( elDropdown, entryID, strText, strData, strSelectedData )\n\t{\n\t\tvar newEntry = $.CreatePanel( 'Label', elDropdown, entryID, { data: strData } );\n\t\tnewEntry.text = strText;\n\t\telDropdown.AddOption( newEntry );\n\n\t\t               \n\t\tif ( strSelectedData === strData )\n\t\t{\n\t\t\telDropdown.SetSelected( entryID );\n\t\t}\n\t}\n\n\tvar _FillOutEntries = function( type, count )\n\t{\n\t\tvar elParent = m_cp.FindChildInLayoutFile( 'id-popup-tournamentcontrolroom-entries' );\n\t\telParent.RemoveAndDeleteChildren();\n\n\t\t  \n\t\t                    \n\t\t  \n\t\t{\n\t\t\tvar strTournament = MyPersonaAPI.GetMyOfficialTournamentName();\n\t\t\tvar strCurrentStage = '';\n\n\t\t\tvar el = $.CreatePanel( 'Panel', elParent, 'new' );\n\t\t\tel.BLoadLayoutSnippet( 'tournamentcontrolroom-entry' );\n\t\t\tel.SetHasClass( 'newentry', true );\n\n\t\t\t  \n\t\t\t                 \n\t\t\t  \n\t\t\tvar elStageDropdown = el.FindChildInLayoutFile( 'popup-tournamentcontrolroom-edit-type' );\n\t\t\telStageDropdown.RemoveAllOptions();\n\t\t\t_AddDropdownOption( elStageDropdown, 'PickStage', $.Localize( '#SFUI_Tournament_Stage' ), '', strCurrentStage );\n\t\t\tvar stageCount = CompetitiveMatchAPI.GetTournamentStageCount( strTournament );\n\t\t\tfor ( var i = 0; i < stageCount; i++ )\n\t\t\t{\n\t\t\t\tvar strStage = CompetitiveMatchAPI.GetTournamentStageNameByIndex( strTournament, i );\n\t\t\t\t_AddDropdownOption( elStageDropdown, 'stage_' + i, strStage, strStage, strCurrentStage );\n\t\t\t}\n\n\t\t\t  \n\t\t\t               \n\t\t\t  \n\t\t\tvar elMapDropdown = el.FindChildInLayoutFile( 'popup-tournamentcontrolroom-edit-map' );\n\t\t\telMapDropdown.RemoveAllOptions();\n\t\t\t_AddDropdownOption( elMapDropdown, 'PickMap', $.Localize( '#SFUI_Tournament_Pick_Map_Title' ), '', '' );\n\t\t\tvar mymaps = TournamentsAPI.GetManagementMapsJSO( strTournament );\n\t\t\tfor ( const mmap in mymaps )\n\t\t\t{\n\t\t\t\t_AddDropdownOption( elMapDropdown, 'map_' + mymaps[ mmap ], $.Localize( '#SFUI_Map_' + mmap ), mmap, '' );\n\t\t\t}\n\n\t\t\t  \n\t\t\t                 \n\t\t\t  \n\t\t\tfor ( var kk = 0; kk < 2; ++ kk )\n\t\t\t{\n\t\t\t\tvar elTeamDropdown = el.FindChildInLayoutFile( 'popup-tournamentcontrolroom-edit-team' + kk );\n\t\t\t\telTeamDropdown.RemoveAllOptions();\n\t\t\t\t_AddDropdownOption( elTeamDropdown, 'PickOpponent', $.Localize( '#SFUI_Tournament_Pick_Opponent' ), '', '' );\n\t\t\t\tvar teamCount = CompetitiveMatchAPI.GetTournamentTeamCount( strTournament );\n\t\t\t\tfor ( var i = 0; i < teamCount; i++ )\n\t\t\t\t{\n\t\t\t\t\tvar strTeam = CompetitiveMatchAPI.GetTournamentTeamNameByIndex( strTournament, i );\n\t\t\t\t\t_AddDropdownOption( elTeamDropdown, 'team_' + i, strTeam, strTeam, '' );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t  \n\t\t\t                       \n\t\t\t  \n\t\t\tfor ( var kk = 0; kk < 2; ++ kk )\n\t\t\t{\n\t\t\t\tvar elScoreDropdown = el.FindChildInLayoutFile( 'popup-tournamentcontrolroom-edit-score' + kk );\n\t\t\t\telScoreDropdown.RemoveAllOptions();\n\t\t\t\t_AddDropdownOption( elScoreDropdown, 'PickScore', $.Localize( '#teams_pip_rounds_won' ), '', '' );\n\t\t\t\tfor ( var i = 0; i < 69; i++ )\n\t\t\t\t{\n\t\t\t\t\t_AddDropdownOption( elScoreDropdown, 'teamscore'+kk+'id' + i, '' + i, '' + i, '' );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tel.FindChildInLayoutFile( 'ButtonAdd' ).SetPanelEvent( 'onactivate', function() {\n\t\t\t\tvar fnGetDropDownData = function( elid ) {\n\t\t\t\t\tvar eldd = $.GetContextPanel().FindChildInLayoutFile( elid );\n\t\t\t\t\tif ( !eldd ) return '';\n\t\t\t\t\tif ( !eldd.GetSelected() ) return '';\n\t\t\t\t\treturn eldd.GetSelected().GetAttributeString( 'data', '' );\n\t\t\t\t};\n\n\t\t\t\tTournamentsAPI.RequestAddManagementMatch( m_eventid, 'add',\n\t\t\t\t\t                                                     \n\t\t\t\t\t'[' + fnGetDropDownData( 'popup-tournamentcontrolroom-edit-score0' )\n\t\t\t\t\t+ ':' + fnGetDropDownData( 'popup-tournamentcontrolroom-edit-score1' )\n\t\t\t\t\t+ ']@' + ( new Date().getTime() ),\n\t\t\t\t\t'1',\n\t\t\t\t\tfnGetDropDownData( 'popup-tournamentcontrolroom-edit-type' ),\n\t\t\t\t\tfnGetDropDownData( 'popup-tournamentcontrolroom-edit-map' ),\n\t\t\t\t\tfnGetDropDownData( 'popup-tournamentcontrolroom-edit-team0' ),\n\t\t\t\t\tfnGetDropDownData( 'popup-tournamentcontrolroom-edit-team1' )\n\t\t\t\t);\n\t\t\t\t\n\t\t\t\tvar btn = $.GetContextPanel().FindChildInLayoutFile( 'ButtonAdd' );\n\t\t\t\tif ( btn ) btn.visible = false;\n\t\t\t\t$.Schedule( 1.0, function() {\n\t\t\t\t\tif ( btn && btn.IsValid() ) btn.visible = true;\n\t\t\t\t} )\n\t\t\t} );\n\t\t}\n\n\t\t  \n\t\t                                                    \n\t\t  \n\t\tfor ( var i = 0; i < count; i++ )\n\t\t{\n\t\t\tvar jso = TournamentsAPI.GetManagementMatchJSO( m_eventid, i );\n\t\t\tif ( !jso ) continue;\n\t\t\tif ( !jso.id ) continue;\n\n\t\t\tvar fnSetFlags = function( matchid, flags ) {\n\t\t\t\tTournamentsAPI.RequestAddManagementMatch( m_eventid, 'edit', matchid, flags );\n\t\t\t\t_WaitForReloadedDataEvent();\n\t\t\t};\n\n\t\t\t  \n\t\t\t                                         \n\t\t\t\t                                           \n\t\t\t\t                                                                                                          \n\t\t\t  \n\t\t\t  \n\n\t\t\tvar el = $.CreatePanel( 'Panel', elParent, jso.id );\n\t\t\tel.BLoadLayoutSnippet( 'tournamentcontrolroom-entry' );\n\n\t\t\t                                                                                      \n\t\t\tel.FindChildInLayoutFile( 'popup-tournamentcontrolroom-entry-team0' ).text = jso.team0;\n\t\t\tel.FindChildInLayoutFile( 'popup-tournamentcontrolroom-entry-team1' ).text = jso.team1;\n\t\t\tel.FindChildInLayoutFile( 'popup-tournamentcontrolroom-entry-score' ).text = jso.info;\n\n\t\t\t                                 \n\t\t\tif ( jso.pwd.length > 6 && jso.pwd[0] == '[' )\n\t\t\t{\n\t\t\t\tlet a = jso.pwd.split( ']' );\n\t\t\t\ta = ( ( a && a.length > 0 ) ? a[0].slice( 1 ) : '0:0' ).split( ':' );\n\t\t\t\tif ( a.length == 2 )\n\t\t\t\t{\n\t\t\t\t\tel.FindChildInLayoutFile( 'popup-tournamentcontrolroom-entry-score0' ).text = '' + parseInt( a[0] );\n\t\t\t\t\tel.FindChildInLayoutFile( 'popup-tournamentcontrolroom-entry-score1' ).text = '' + parseInt( a[1] );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar strStatus = '';\n\t\t\tif ( !jso.updates )\n\t\t\t{\n\t\t\t\tif ( jso.flags & 1 )\n\t\t\t\t\tstrStatus = '#Store_Price_New';\n\t\t\t\telse\n\t\t\t\t\tstrStatus = '#SFUI_Settings_Disabled';\n\t\t\t}\n\t\t\telse if ( jso.updates === 'ongoing' )\n\t\t\t{\n\t\t\t\tif ( jso.flags & 1 )\n\t\t\t\t{\n\t\t\t\t\tstrStatus = '#SFUI_ScoreControl_OngoingMatch';\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tstrStatus = '#SFUI_ScoreControl_PausedScore';\n\n\t\t\t\t\tel.FindChildInLayoutFile( 'popup-tournamentcontrolroom-entry-updates' ).visible = false;\n\t\t\t\t\tel.FindChildInLayoutFile( 'popup-tournamentcontrolroom-entry-score' ).visible = false;\n\n\t\t\t\t\tif ( jso.info )\n\t\t\t\t\t{\n\t\t\t\t\t\tlet parts = jso.info.split( ':' );\n\t\t\t\t\t\tif ( ( parts.length === 2 )\n\t\t\t\t\t\t\t&& ( parseInt( parts[0] ) >= 13 || parseInt( parts[1] ) >= 13 )\n\t\t\t\t\t\t\t&& ( parseInt( parts[0] ) > parseInt( parts[1] ) || parseInt( parts[0] ) < parseInt( parts[1] ) ) )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlet elBtn = el.FindChildInLayoutFile( 'ButtonFinalize');\n\t\t\t\t\t\t\telBtn.SetPanelEvent( 'onactivate',\n\t\t\t\t\t\t\t\tfnSetFlags.bind( null, jso.id, '1073741824' )                                     \n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\telBtn.RemoveClass( 'hidden' );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if ( jso.updates === 'final' )\n\t\t\t{\n\t\t\t\tstrStatus = '#SFUI_Scoreboard_Final';\n\t\t\t}\n\t\t\t\n\t\t\tif ( strStatus )\n\t\t\t\tel.FindChildInLayoutFile( 'popup-tournamentcontrolroom-entry-updates' ).text = $.Localize( strStatus );\n\n\t\t\t                \n\t\t\tvar sValue = jso.stage;\n\t\t\t                                          \n\t\t\t                                        \n\t\t\tel.FindChildInLayoutFile( 'popup-tournamentcontrolroom-entry-type' ).text = sValue;\n\t\t\tel.FindChildInLayoutFile( 'popup-tournamentcontrolroom-entry-map' ).text = jso.map;\n\n\t\t\tfunction fnDelayAction( str )\n\t\t\t{\n\t\t\t\tlet btn = el.FindChildInLayoutFile( str );\n\t\t\t\tbtn.enabled = false;\n\t\t\t\t$.Schedule( 1.0, function() { if ( btn && btn.IsValid() ) btn.enabled = true; } );\n\t\t\t\treturn btn;\n\t\t\t}\n\n\t\t\tif ( i % 2 === 0 )\n\t\t\t\tel.AddClass( 'background' );\n\n\t\t\tif ( jso.updates === 'final' )\n\t\t\t{\n\t\t\t\tel.FindChildInLayoutFile( 'IconButtonsRow').visible = false;\n\t\t\t}\n\t\t\telse if ( jso.flags & 1 )\n\t\t\t{\n\t\t\t\tel.AddClass( 'green' );\n\n\t\t\t\tel.FindChildInLayoutFile( 'popup-tournamentcontrolroom-entry-remove').visible = false;\n\n\t\t\t\tfnDelayAction( 'popup-tournamentcontrolroom-entry-ignore').SetPanelEvent( 'onactivate',\n\t\t\t\t\tfnSetFlags.bind( null, jso.id, '0' )\n\t\t\t\t);\n\n\t\t\t\tel.FindChildInLayoutFile( 'popup-tournamentcontrolroom-entry-recover').visible = false;\n\n\t\t\t\tfnDelayAction( 'popup-tournamentcontrolroom-entry-makelive').SetPanelEvent( 'onactivate',\n\t\t\t\t\tfnSetFlags.bind( null, jso.id, '1073741823' )                                           \n\t\t\t\t);\n\t\t\t}\n\t\t\telse if ( jso.updates === 'ongoing' )\n\t\t\t{\n\t\t\t\tel.FindChildInLayoutFile( 'popup-tournamentcontrolroom-entry-remove').visible = false;\n\t\t\t\tel.FindChildInLayoutFile( 'popup-tournamentcontrolroom-entry-ignore').visible = false;\n\t\t\t\tel.FindChildInLayoutFile( 'popup-tournamentcontrolroom-entry-recover').visible = false;\n\t\t\t\tel.FindChildInLayoutFile( 'popup-tournamentcontrolroom-entry-makelive').visible = false;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tfnDelayAction( 'popup-tournamentcontrolroom-entry-remove').SetPanelEvent( 'onactivate',\n\t\t\t\t\tfnSetFlags.bind( null, jso.id, '1073741822' )                                              \n\t\t\t\t);\n\n\t\t\t\tel.FindChildInLayoutFile( 'popup-tournamentcontrolroom-entry-ignore').visible = false;\n\n\t\t\t\tfnDelayAction( 'popup-tournamentcontrolroom-entry-recover').SetPanelEvent( 'onactivate',\n\t\t\t\t\tfnSetFlags.bind( null, jso.id, '1' )\n\t\t\t\t);\n\n\t\t\t\tel.FindChildInLayoutFile( 'popup-tournamentcontrolroom-entry-makelive').visible = false;\n\t\t\t}\n\t\t}\n\t};\n\n\tvar _Refresh = function( type )\n\t{\n\t\tif ( m_type === type )\n\t\t{\n\t\t\t_Updatetournamentcontrolroom( type );\n\t\t\treturn;\n\t\t}\n\t};\n\n\tvar _Close = function()\n\t{\n\t\t                   \n\t\t$.DispatchEvent( 'UIPopupButtonClicked', '' );\n\t};\n\n\treturn {\n\t\tInit: _Init,\n\t\tManagementMatchListReceived: _ManagementMatchListReceived,\n\t\tRefresh: _Refresh,\n\t\tClose: _Close\n\t};\n\n})();\n\n(function(){\n\n\t$.RegisterForUnhandledEvent( 'PanoramaComponent_Tournaments_ManagementMatchListReceived', PopupTournamentControlRoom.ManagementMatchListReceived );\n\t                                                                \n})();","scripts/popups/popup_tournament_journal.js":"'use strict';\n\nvar TournamentJournal = ( function()\n{\n    var m_test_challenges = [\n                                                                                                                                    \n    ];\n\n                                                                                         \n                                                                                                                            \n                                                         \n                                                                                                                                   \n    var m_activeTournament = 18;\n    var m_tokenItemDefName = null;\n    var m_scheduleHandle = null;\n\n    var m_isInMatch = GameStateAPI.IsDemoOrHltv() || GameStateAPI.IsLocalPlayerPlayingMatch(); \n\n    var _Init = function()\n    {\n        var journalId = $.GetContextPanel().GetAttributeString( \"journalid\", '' );\n        var tournamentId = InventoryAPI.GetItemAttributeValue( journalId, \"tournament event id\" );\n                           \n\t\t                      \n\t\t\n\t\tswitch ( tournamentId ) {                                                               \n\t\t\tcase 18: m_tokenItemDefName = 'tournament_pass_stockh2021_charge'; break;\n\t\t}\n\t\t\n                                     \n        var nCampaignID = parseInt( InventoryAPI.GetItemAttributeValue( journalId, \"campaign id\" ) );\n                                                \n        var numTotalChallenges = InventoryAPI.GetCampaignNodeCount( nCampaignID );\n                                                            \n                                                              \n        for ( var jj = 0; jj < numTotalChallenges; ++jj )\n        {\n            var nMissionNodeID = InventoryAPI.GetCampaignNodeIDbyIndex( nCampaignID, jj );\n                                         \n            var strNodeState = InventoryAPI.GetCampaignNodeState( nCampaignID, nMissionNodeID, journalId, true );\n                                            \n            var nQuestID = InventoryAPI.GetCampaignNodeQuestID( nCampaignID, nMissionNodeID );\n            var strFauxQuestItem = InventoryAPI.GetQuestItemIDFromQuestID( nQuestID );\n            var strQuestIcon = InventoryAPI.GetQuestIcon( strFauxQuestItem );\n            var strQuestName = InventoryAPI.GetItemName( strFauxQuestItem );\n                                                      \n                                                                                                               \n            m_test_challenges.push( {\n                text: strQuestName,\n                context: ( strQuestIcon === 'watchem' ) ? 'watch' : ( strQuestIcon === 'pickem' ) ?'trophy' : strQuestIcon,                                                   \n                value: ( strNodeState === \"complete\" ) ? 1 : 0                                              \n            } );\n        }\n\n        $.GetContextPanel().SetHasClass( 'tournament-over', m_activeTournament !== tournamentId );\n                                               \n        _SetTitle( journalId );\n        _SetSubtitle( journalId );\n        _SetModel( journalId );\n        _SetBannerColor( journalId );\n        _SetFaqBtn(tournamentId);\n        _UpdateStoreItems();\n        _UpdateActivateBtn();\n        \n                         \n        if( !_IsValidJournalId( journalId ) )\n        {\n                       \n            $.GetContextPanel().SetHasClass( 'no-active-pass', true );\n            return;\n        }\n\n        $.GetContextPanel().SetHasClass( 'no-active-pass', false );\n\n        _SetThesholdText( journalId, tournamentId );\n        _UpdateChallengesList( journalId, tournamentId );\n        _SouvenirsEarned( journalId, tournamentId );\n        _SouvenirsImage( tournamentId );\n        _SetEventSticker( tournamentId );\n        _UpdateSetChargesBtn( ( m_activeTournament === tournamentId ) ? InventoryAPI.GetFauxItemIDFromDefAndPaintIndex( g_ActiveTournamentInfo.itemid_charge, 0 ) : null );\n        _UpdateApplyCharges();\n        _SetWinners( tournamentId, journalId );\n        _SetUpSpray( journalId );\n        _WatchStreamBtn( journalId );\n    };\n    \n    var GetPassToActivate = function()\n    {\n        var journalId = $.GetContextPanel().GetAttributeString( \"journalid\", '' );\n        var id = InventoryAPI.GetActiveTournamentCoinItemId( g_ActiveTournamentInfo.eventid * -1 );\n        return (!_IsValidJournalId( journalId ) && ( id && id !== '0' )) ? id : '';\n    }\n\n    var _UpdateActivateBtn = function()\n    {\n        var activateBtn = $.GetContextPanel().FindChildInLayoutFile( 'id-tournament-journal-active' );\n\n        var id = GetPassToActivate();\n        activateBtn.SetPanelEvent(\n            'onactivate',\n            _ActivatePass.bind( undefined, id )\n        );\n        activateBtn.visible = ( id && id !== '') ? true : false;\n    }\n\n    var _ClosePopup = function()\n    {\n        $.DispatchEvent( 'UIPopupButtonClicked', '' );\n    };\n\n    var _SetBackgroundMovie = function( id )\n    {\n        if ( id > 15 )\n        {\n            $.GetContextPanel().FindChildInLayoutFile( 'id-tournament-journal-container' ).style.backgroundImage = \"url( 'file://{images}/tournaments/backgrounds/background_\" + id + \".png' );\";\n        }\n    };\n\n    var _SetTitle = function( journalId )\n    {\n        $.GetContextPanel().FindChildInLayoutFile( 'id-tournament-journal-title' ).text = !_IsValidJournalId( journalId ) ? \n            $.Localize('#CSGO_TournamentPass_stockh2021_store_title') : \n            InventoryAPI.GetItemName( journalId );\n    };\n\n    var _SetSubtitle = function( journalId )\n    {\n        var srtText = !_IsValidJournalId( journalId ) ? '#CSGO_TournamentPass_stockh2021_store_desc' : '#tournament_coin_desc_token';\n        $.GetContextPanel().FindChildInLayoutFile( 'id-tournament-journal-subtitle' ).text = $.Localize( srtText );\n    };\n\n    var _SetModel = function( id )\n    {\n        var fakeId = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex( 4800, 0 );                                            \n        id = !_IsValidJournalId( id ) ? fakeId : id;\n\n        var elModel = $.GetContextPanel().FindChildInLayoutFile( 'id-tournament-journal-model' );\n        var modelPath = ItemInfo.GetModelPathFromJSONOrAPI( id );\n        \n        var manifest = \"resource/ui/econ/ItemModelPanelCharWeaponInspect.res\";\n        elModel.SetScene( manifest, modelPath, false );\n        elModel.SetCameraPreset( 1, false );\n        elModel.SetSceneIntroRotation( -10.0, 20, 1 );\n    };\n\n    var _SetBannerColor = function( journalId )\n    {\n        var coinLevel = InventoryAPI.GetItemAttributeValue( journalId, \"upgrade level\" );\n                                                                                                 \n\n        var style = coinLevel < 1 ? 'bronze' : coinLevel === 1 ? 'silver' : coinLevel > 1 ? 'gold' : 'bronze';\n        $.GetContextPanel().FindChildInLayoutFile( 'id-tournament-journal-container' ).AddClass( style );\n    };\n\n    var _SetThesholdText = function( journalId, tournamentId )\n    {\n        var threshold = InventoryAPI.GetItemAttributeValue( journalId, \"upgrade threshold\" );\n        var completedChallenges = m_test_challenges.filter( function( entry ) { return entry.value === 1; } );\n\n        _SetPoints( completedChallenges );\n        if ( !threshold || ( completedChallenges.length === m_test_challenges.length ) )\n        {\n            $.GetContextPanel().FindChildInLayoutFile( 'id-tournament-journal-remaining' ).visible = false;\n            return;\n        }\n\n        var challengesRemain = threshold - completedChallenges.length;\n    \n        $.GetContextPanel().SetDialogVariableInt( 'challenges', challengesRemain );\n        $.GetContextPanel().FindChildInLayoutFile( 'id-tournament-journal-remaining' ).text = tournamentId < 16 ?\n            $.Localize( '#tournament_coin_remaining_challenges',  $.GetContextPanel() ) :\n            $.Localize( '#tournament_coin_remaining_challenges_token',  $.GetContextPanel() );\n    };\n\n    var _SetPoints = function( completedChallenges )\n    {\n        $.GetContextPanel().SetDialogVariableInt( 'challenges_complete', completedChallenges.length );\n    };\n\n    var _SouvenirsEarned = function( journalId, tournamentId )\n    {\n        if ( !_IsValidJournalId( journalId ) )\n        {\n\n            return;\n        }\n\n        var coinLevel = InventoryAPI.GetItemAttributeValue( journalId, \"upgrade level\" );\n\t\tvar coinRedeemsPurchased = InventoryAPI.GetItemAttributeValue( journalId, \"operation drops awarded 1\" );\n\t\tif ( coinRedeemsPurchased )                                                                          \n\t\t\tcoinLevel += coinRedeemsPurchased;\n\n        var redeemed = InventoryAPI.GetItemAttributeValue( journalId, \"operation drops awarded 0\" );\n        var redeemsAvailable = coinLevel - redeemed;\n        var redeemsEarned = ( coinLevel !== undefined ) ? coinLevel : 0;\n\n        $.GetContextPanel().SetDialogVariableInt( 'redeems_earned', redeemsEarned );\n        $.GetContextPanel().SetDialogVariableInt( 'redeems_remain', ( redeemsAvailable !== undefined ) ? redeemsAvailable : 0 );\n\n                 \n        var elLabel = $.GetContextPanel().FindChildInLayoutFile( 'id-tournament-journal-redeem-btn-label' );\n\n        elLabel.text = redeemsAvailable === 1 ?\n            $.Localize( '#tournament_coin_redeem_action', elLabel ) :\n            $.Localize( '#tournament_coin_redeem_action_multi', elLabel );\n        \n        _RedeemBtn( redeemsAvailable );\n\n                 \n        elLabel = $.GetContextPanel().FindChildInLayoutFile( 'id-tournament-journal-souvenir-earned' );\n        \n        var locStringModifier = tournamentId < 16 ? 'souvenir_v2' : 'token';\n        \n        elLabel.text = redeemsEarned === 1?\n            $.Localize( '#tournament_coin_earned_' + locStringModifier, elLabel ) :\n            $.Localize( '#tournament_coin_earned_' + locStringModifier + '_multi', elLabel );\n        \n        $.GetContextPanel().FindChildInLayoutFile( 'id-tournament-journal-info-block-subtitle' ).text = tournamentId < 16 ?\n            $.Localize( '#tournament_coin_redeem_souvenir' ) :\n            $.Localize( '#tournament_coin_redeem_souvenir_' + tournamentId );\n    };\n\n    var _SouvenirsImage = function( tournamentId )\n    {\n        var elImage = $.GetContextPanel().FindChildInLayoutFile( 'id-tournament-ticket-icon' );\n        if ( tournamentId < 16 )\n        {\n            elImage.SetImage( 'file://{images}/tournaments/souvenir/souvenir_blank_tournament_' + tournamentId + '.png' );\n        }\n        else\n        {\n            elImage.itemid = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex( g_ActiveTournamentInfo.itemid_charge, 0 );\n        }\n    };\n\n    var _RedeemBtn = function( redeemsAvailable )\n    {   \n        var elbtn = $.GetContextPanel().FindChildInLayoutFile( 'id-tournament-journal-redeem-btn' );\n        elbtn.enabled = !m_isInMatch && redeemsAvailable > 0;\n    };\n\n    var _AnimRedeemValue = function()\n    {\n        var elbtn = $.GetContextPanel().FindChildInLayoutFile( 'id-tournament-journal-souvenir-earned-value' );\n        elbtn.AddClass( 'tournament-journal__info-block__title--update-anim' );\n\n        $.Schedule( 1, function(){\n            elbtn.RemoveClass( 'tournament-journal__info-block__title--update-anim' );\n        });\n    };\n\n    var _SetEventSticker = function( tournamentId )\n    {\n        var elTitleBar = $.GetContextPanel().FindChildInLayoutFile( 'id-tournament-journal-title-bar' );\n        \n        $.CreatePanel(\n            \"Image\",\n            elTitleBar,\n            '',\n            {\n                texturewidth: '98',\n                textureheight: '-1',\n                src: 'file://{images}/tournaments/events/tournament_logo_' + tournamentId + '.svg',\n                class: 'tournament-journal__titlebar__logo'\n        });\n    };\n\n    var _UpdateChallengesList = function( journalId, tournamentId )\n    {\n        var elList = $.GetContextPanel().FindChildInLayoutFile( 'id-tournament-journal__challenges-list' );\n        if ( !_IsValidJournalId( journalId ) )\n        {\n            return;\n        }\n\n        m_test_challenges.forEach( function( obj, index )\n        {\n            var elChallenge = $.GetContextPanel().FindChildInLayoutFile( 'id-tournament-journal__challenges' + index );\n            \n            if ( !elChallenge )\n            {\n                elChallenge = _CreateChallenge( obj, elList, index );\n            }\n            _UpdateChallenge( obj, elChallenge, index, tournamentId );\n        } );\n\n        function _CreateChallenge ( objData, elList, index )\n        {\n            var elChallenge = $.CreatePanel( \"Panel\", elList, 'id-tournament-journal__challenges' + index );\n            elChallenge.BLoadLayoutSnippet( \"tournament-challenge\" );\n            elChallenge.SetHasClass( 'dark', true );\n\n\t\t\t                            \n\t\t\t    \n\t\t\t   \t                                                                        \n\t\t\t    \n                                            \n                \n                                                                                \n                \n                    \n                \n                                     \n                    \n                                                                     \n                    \n\n                                                                            \n                    \n                                                \n                                                                     \n                    \n                \n\n            $.GetContextPanel().FindChildInLayoutFile( 'id-tournament-journal-container' ).AddBlurPanel( elChallenge );\n            \n            return elChallenge;\n        }\n\n        function _UpdateChallenge ( objData, elChallenge, index, tournamentId )\n        {\n            var elName = elChallenge.FindChildInLayoutFile( 'id-tournament-journal__challenge__name' );\n            var elIcon = elChallenge.FindChildInLayoutFile( 'id-tournament-journal__challenge__icon' );\n            elName.text = objData.text;\n\n            var iconPath = objData.value === 1 ? 'file://{images}/icons/ui/check.svg' :\n                'file://{images}/icons/ui/' + objData.context + '.svg';\n\n            elIcon.SetImage( iconPath );\n            elChallenge.SetHasClass( 'complete', objData.value === 1 );\n\n                                                                                                          \n            var bForceEnablePlayContext = false;                                                                        \n\n            elChallenge.enabled = objData.value !== 1 && !m_isInMatch && ( m_activeTournament === tournamentId || bForceEnablePlayContext );\n\n            if ( objData.context === \"trophy\" || objData.context === \"calender\" )\n            {\n                _OnActivatePickemChallenge( elChallenge, index, tournamentId );\n            }\n            else if ( objData.context === 'watch' )\n            {\n                _OnWatchStream( elChallenge );\n\t\t\t}\n\t\t\telse if ( objData.context === 'play' )\n            {\n                _OnActivatePlayChallenge( elChallenge, index );\n            }\n        }\n\n        function _OnActivatePickemChallenge ( elPanel, index, tournamentId )\n        {\n\t\t\tvar idforTab = '';\n\t\t\tif ( tournamentId >= 18 )\n\t\t\t{\n\t\t\t\tswitch ( index )\n\t\t\t\t{\n\t\t\t\t\tcase 1:\n\t\t\t\t\tcase 2:\n\t\t\t\t\t\tidforTab = 'id-nav-pick-prelims';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 3:\n\t\t\t\t\tcase 4:\n\t\t\t\t\t\tidforTab = 'id-nav-pick-group';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault: \n\t\t\t\t\t\tidforTab = 'id-nav-pick-playoffs';\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tswitch ( index )\n\t\t\t\t{\n\t\t\t\t\tcase 8: \n\t\t\t\t\t\tidforTab = 'id-nav-pick-prelims';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 10: \n\t\t\t\t\t\tidforTab = 'id-nav-pick-group';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault: \n\t\t\t\t\t\tidforTab = 'id-nav-pick-playoffs';\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n            \n            elPanel.SetPanelEvent( 'onactivate', OnActivate.bind( undefined, idforTab ) );\n            \n            function OnActivate ( idforTab )\n            {\n                $.DispatchEvent( 'OpenWatchMenu' );\n                $.DispatchEvent( 'ShowActiveTournamentPage', idforTab );\n                _ClosePopup();\n            }\n\t\t}\n\t\t\n\t\tfunction _OnActivatePlayChallenge( elPanel, index )\n        {\n\t\t\tvar maps = [\n\t\t\t\t'de_inferno',\n\t\t\t\t'de_mirage', \n\t\t\t\t'de_dust2',\n\t\t\t\t'de_overpass',\n\t\t\t\t'de_train',\n\t\t\t\t'de_nuke',\n\t\t\t\t'de_vertigo'\n\t\t\t];\n\t\t\tvar pickedMap = ( index > 0 && index <= maps.length ) ? maps[ index - 1 ] : '';\n\t\t\tif ( !pickedMap ) return;\n\n            elPanel.SetPanelEvent( 'onactivate', OnActivate.bind( undefined, 'mg_'+pickedMap ) );\n            \n            function OnActivate ( mapGroup )\n            {\n\t\t\t\t                                                          \n\t\t\t\tif ( LobbyAPI.IsSessionActive() && !LobbyAPI.BIsHost() )\n\t\t\t\t{\t                                                                                                                                       \n\t\t\t\t\tLobbyAPI.CloseSession();\n\t\t\t\t}\n\n\t\t\t\t                                            \n\t\t\t\tif ( LobbyAPI.IsSessionActive() )\n\t\t\t\t{\n\t\t\t\t\tvar settingsGame = LobbyAPI.GetSessionSettings().game;\n\t\t\t\t\tif ( settingsGame && settingsGame.mmqueue )\n\t\t\t\t\t{\n\t\t\t\t\t\tLobbyAPI.StopMatchmaking();\n\t\t\t\t\t}\n\n\t\t\t\t\tsettingsGame = LobbyAPI.GetSessionSettings().game;\n\t\t\t\t\tif ( settingsGame && settingsGame.mmqueue )\n\t\t\t\t\t{\t                                          \n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( !LobbyAPI.IsSessionActive() )\n\t\t\t\t{\n\t\t\t\t\tLobbyAPI.CreateSession();\n\t\t\t\t}\n\n\t\t\t\tvar gameType = 'classic';\n\t\t\t\tvar gameMode = 'competitive';\n\n\t\t\t\tif ( !LobbyAPI.IsSessionActive() )\n\t\t\t\t\treturn;\n\n\t\t\t\t  \n\t\t\t\t                            \n\t\t\t\t  \n\t\t\t\t                                                                                              \n\t\t\t\tvar settings = {\n\t\t\t\t\tupdate: {\n\t\t\t\t\t\tOptions: {\n\t\t\t\t\t\t\taction: \"custommatch\",\n\t\t\t\t\t\t\tserver: \"official\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\tGame: {\n\t\t\t\t\t\t\tmode: gameMode,\n\t\t\t\t\t\t\ttype: gameType,\n\t\t\t\t\t\t\tmapgroupname: mapGroup,\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tLobbyAPI.UpdateSessionSettings( settings );\n\n\t\t\t\tvar bStartMatchmaking = true;\n\t\t\t\tif ( bStartMatchmaking )\n\t\t\t\t{\n\t\t\t\t\tLobbyAPI.StartMatchmaking( '', '', '', '' );\n\t\t\t\t}\n\n\t\t\t\t$.DispatchEvent( 'UIPopupButtonClicked', '' );\n\t\t\t\t$.DispatchEvent( 'OpenPlayMenu', '' );\n                \n                _ClosePopup();\n            }\n        }\n    };\n\n    var _OnWatchStream = function( elPanel )\n    {\n        elPanel.SetPanelEvent( 'onactivate', function()\n        {\n            SteamOverlayAPI.OpenURL( 'https://steam.tv/csgo' );\n        } );\n    };\n\n    var _SetUpSpray = function( journalId )\n    {\n        var elPanel = $.GetContextPanel().FindChildInLayoutFile( 'id-graffiti-block' );\n        if ( !_IsValidJournalId( journalId ) )\n        {\n            return;\n        }\n\n        var journalId = $.GetContextPanel().GetAttributeString( \"journalid\", '' );\n        var elImage = $.GetContextPanel().FindChildInLayoutFile( 'id-tournament-journal-spray' );\n        elImage.itemid = ItemInfo.GetFauxReplacementItemID( journalId, 'graffiti' );\n\n                                                \n        \n        var elIBtn = $.GetContextPanel().FindChildInLayoutFile( 'id-tournament-journal-selectspray-btn' );\n        elIBtn.SetPanelEvent( 'onactivate', function(){\n                UiToolkitAPI.ShowCustomLayoutPopupParameters(\n                    '',\n                    'file://{resources}/layout/popups/popup_tournament_select_spray.xml',\n                    'journalid=' + journalId\n                );\n            }\n        );\n    };\n\n    var _OnActivateRedeem = function()\n    {\n        $.DispatchEvent( 'OpenWatchMenu' );\n        $.DispatchEvent( 'ShowActiveTournamentPage', 'id-nav-matches' );\n        _ClosePopup();\n    };\n\n    var _WatchStreamBtn = function( journalId )\n    {   \n        var elPanel = $.GetContextPanel().FindChildInLayoutFile( 'id-tournament-journal-watch-stream' );\n        var isPerfectWorld = MyPersonaAPI.GetLauncherType() === \"perfectworld\" ? true : false;\n        if ( !_IsValidJournalId( journalId ) || isPerfectWorld )\n        {\n            if( elPanel && elPanel.IsValid() )\n            {\n                                           \n                elPanel.enabled = false;\n                elPanel.SetHasClass('opacity-none', true )\n            }\n\n            return;\n        }\n\n        elPanel.enabled = true;\n        elPanel.SetHasClass('opacity-none', false )\n        _OnWatchStream( elPanel );\n    };\n\n    var _SetWinners = function( tournamentId, journalId )\n    {\n        if ( !_IsValidJournalId( journalId ) || m_activeTournament === tournamentId )\n        {\n            return false;\n        }\n\n                                                                      \n        var aData = [\n            { tournamentId: 15, team: 'astr', teamname: '#CSGO_TeamID_60', descString: '#CSGO_CollectibleCoin_Katowice2019_Champion' },\n            { tournamentId: 16, team: 'astr', teamname: '#CSGO_TeamID_60', descString: '#CSGO_CollectibleCoin_berlin2019_Champion' }\n                                      \n        ];\n\n        var ObjWinner = aData.filter( winner => winner.tournamentId == tournamentId )[0];\n\n        $.GetContextPanel().FindChildInLayoutFile( 'tournament-journal-winners-img' ).SetImage( \"file://{images}/tournaments/teams/\" + ObjWinner.team +\".svg\"); \n        $.GetContextPanel().FindChildInLayoutFile( 'tournament-journal-winners-desc' ).text = $.Localize( ObjWinner.descString );\n        $.GetContextPanel().FindChildInLayoutFile( 'tournament-journal-winners-title' ).text = $.Localize( ObjWinner.teamname );\n\n        var elModel = $.GetContextPanel().FindChildInLayoutFile( 'id-tournament-journal-trophy' );\n        elModel.SetCameraPreset( 1, false );\n        elModel.SetSceneIntroRotation( -12.0, 30, 1 );\n        elModel.SetFlashlightColor( 2, 2, 2 );\n    };\n\n    var _UpdateSetChargesBtn = function( id )\n    {\n        var btn = $.GetContextPanel().FindChildInLayoutFile( 'id-get-charges-btn' );\n        btn.visible = false;\n        \n        if ( id && id !== '0' && id !== '-1' && ItemInfo.GetStoreSalePrice( id, 1, '' ) )\n        {\n            btn.visible = true;\n            btn.SetPanelEvent( 'onactivate', function()\n            {\n                UiToolkitAPI.ShowCustomLayoutPopupParameters(\n                '',\n                'file://{resources}/layout/popups/popup_inventory_inspect.xml',\n                'itemid=' + id + '&' +\n                'inspectonly=false' +\n                '&' + 'extrapopupfullscreenstyle=solidbkgnd' +\n                '&' + 'asyncworkitemwarning=no' +\n                '&' + 'storeitemid=' + id,\n                'none'\n\t\t        );\n            } );\n        }\n    };\n\n    var _UpdateApplyCharges = function()\n    {\n        var btn = $.GetContextPanel().FindChildInLayoutFile( 'id-activate-charges-btn' );  \n        $.GetContextPanel().FindChildInLayoutFile( 'id-activate-spinner' ).visible = false;\n\t\tbtn.visible = false;\n\t\t\n\t\tif ( !m_tokenItemDefName )\n\t\t\treturn;\n\n        InventoryAPI.SetInventorySortAndFilters( 'inv_sort_age', false, 'item_definition:' + m_tokenItemDefName, '', '' );\n        var count = InventoryAPI.GetInventoryCount();\n        var aItemIds = [];\n\n        for ( var i = 0; i < count; i++ )\n        {\n            aItemIds.push( InventoryAPI.GetInventoryItemIDByIndex( i ));\n        }\n\n        if ( aItemIds.length > 0 )\n        {\n            btn.SetDialogVariableInt( 'tokens', aItemIds.length );\n            btn.SetPanelEvent( 'onactivate', function()\n            {\n                if ( m_scheduleHandle )\n                {\n                    $.CancelScheduled( m_scheduleHandle );\n                    m_scheduleHandle = null;\n                }\n\n                aItemIds.forEach( item => InventoryAPI.UseTool( item, '' ) );\n\n                $.GetContextPanel().FindChildInLayoutFile( 'id-activate-spinner' ).visible = true;\n                btn.visible = false;\n                m_scheduleHandle = $.Schedule( 5, _CancelWaitforCallBack );\n            } );\n\n            \n            btn.text = aItemIds.length === 1 ?\n                $.Localize( '#tournament_activate_tokens', btn ) :\n                $.Localize( '#tournament_activate_tokens_multi', btn );\n            \n            btn.visible = true;\n        }\n\n    };\n\n    var _CancelWaitforCallBack = function()\n\t{\n\t\tm_scheduleHandle = null;\n\t\t\n        $.GetContextPanel().FindChildInLayoutFile( 'id-activate-spinner' ).visible = false;\n\n        _ClosePopup();\n\n\t\tUiToolkitAPI.ShowGenericPopupOk(\n\t\t\t$.Localize( '#SFUI_SteamConnectionErrorTitle' ),\n\t\t\t$.Localize( '#SFUI_InvError_Item_Not_Given' ),\n\t\t\t'',\n\t\t\tfunction()\n\t\t\t{\n\t\t\t},\n\t\t\tfunction()\n\t\t\t{\n\t\t\t}\n\t\t);\n    };\n    \n    var _ResetTimeouthandle = function()\n\t{\n\t\tif ( m_scheduleHandle )\n\t\t{\n\t\t\t$.CancelScheduled( m_scheduleHandle );\n\t\t\tm_scheduleHandle = null;\n\t\t}\n    };\n    \n    var _OnItemCustomization =  function( numericType, type, itemid )\n    {\n        if ( type === 'ticket_activated' )\n        {\n            _ResetTimeouthandle();\n            _UpdateApplyCharges();\n\n            var journalId = itemid;\n            var tournamentId = InventoryAPI.GetItemAttributeValue( journalId, \"tournament event id\" );\n\n            _AnimRedeemValue();\n            $.Schedule( .25, _SouvenirsEarned.bind( undefined, journalId, tournamentId ));\n        }\n    };\n\n    var _OnInventoryUpdated = function()\n    {\n        _ResetTimeouthandle();\n        _SetUpSpray( $.GetContextPanel().GetAttributeString( \"journalid\", '' ) );\n        _UpdateActivateBtn();\n        _UpdateApplyCharges();\n    };\n\n    var _SetFaqBtn = function( tournamentId )\n    {\n        $.GetContextPanel().FindChildInLayoutFile( 'id-tournament-journal-faq' ).SetPanelEvent( 'onactivate', function(){\n            SteamOverlayAPI.OpenURL( 'https://store.steampowered.com/sale/csgostockholm' );\n        });\n    };\n\n    var _UpdateStoreItems = function()\n    {\n        var elItemsPanel = $.GetContextPanel().FindChildInLayoutFile( 'id-tournament-journal-items' );\n\t\tvar elBlurPanel = $.GetContextPanel().FindChildInLayoutFile( 'id-tournament-journal-container' );\n\t\t\n\t\t                                        \n\t\tvar sRestriction = InventoryAPI.GetDecodeableRestriction( \"capsule\" );\n\t\tvar bCanSellCapsules = ( sRestriction !== \"restricted\" && sRestriction !== \"xray\" );\n\n\t\tvar fnCreateOffering = function ( ids, i ) {\n\n            if ( !elItemsPanel.FindChildInLayoutFile( 'tournament-items' + i ) )\n            {\n                var itemid = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex( g_ActiveTournamentStoreLayout[ i ][ 0 ], 0 );\n                var linkedid = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex( g_ActiveTournamentStoreLayout[ i ][ 1 ], 0 );\n                var bIsPurchaseable = _IsPurchaseable( itemid )\n                \n                var elItem = $.CreatePanel( 'Panel', elItemsPanel, 'tournament-items' + i );\n                elItem.Data().oData = {\n                    itemid: itemid,\n                    linkedid: linkedid,\n\t\t\t\t\tlinkpricing: 'reverse',\n\t\t\t\t\tusetinynames: true,\n                    usegroupname: g_ActiveTournamentStoreLayout[ i ][ 2 ],\n                    warningtext: !bIsPurchaseable ?\n                        '#tournament_items_not_released' : InventoryAPI.GetItemTypeFromEnum( itemid ) === 'type_tool' ?\n                        '#tournament_items_notice' : '',\n                    isdisabled: !bIsPurchaseable,\n                    extrapopupfullscreenstyle: true\n                }\n                elItem.BLoadLayout( \"file://{resources}/layout/mainmenu_store_tile_linked.xml\", false, false );\n                \n\n                elBlurPanel.AddBlurPanel( elItem );\n            }\n\t\t};\n\t\t\n\t\tif ( bCanSellCapsules )\n\t\t\tg_ActiveTournamentStoreLayout.forEach( fnCreateOffering );\n\t\telse\n\t\t\tfnCreateOffering( g_ActiveTournamentStoreLayout[0], 0 );\n    };\n\n    var _IsPurchaseable = function( itemid )\n    {\n        \n                                                                                         \n        var itemSchemaDef = ItemInfo.BuildItemSchemaDef( itemid );\n        return itemSchemaDef[ \"cannot_inspect\" ] === 1 ? false : true;\n    };\n\n    var _ActivatePass = function ( id )\n\t{\n        UiToolkitAPI.ShowCustomLayoutPopupParameters(\n            '',\n            'file://{resources}/layout/popups/popup_capability_decodable.xml',\n            'key-and-case=,' + id +\n            '&' + 'asyncworktype=decodeable'\n        );\n        \n        _ClosePopup();\n\t};\n\n    var _IsValidJournalId = function( id )\n    {\n        return ( !id || id === 0 || id === '0' ) ? false : true;\n    }\n\n\treturn{\n\t\tInit: _Init,\n        ClosePopup: _ClosePopup,\n        SetUpSpray: _SetUpSpray,\n        OnInventoryUpdated: _OnInventoryUpdated,\n        OnItemCustomization: _OnItemCustomization,\n        OnActivateRedeem: _OnActivateRedeem\n\t};\n} )();\n\n( function()\n{\n    $.RegisterForUnhandledEvent( 'PanoramaComponent_MyPersona_InventoryUpdated', TournamentJournal.OnInventoryUpdated );\n    $.RegisterForUnhandledEvent( 'PanoramaComponent_Inventory_ItemCustomizationNotification', TournamentJournal.OnItemCustomization );\n} )();","scripts/popups/popup_tournament_pickban.js":"'use strict';\n\nvar PopupTournamentPickBan = ( function ()\n{\n\tvar _m_thisPanel = null;\n    var m_strTournament = \"\";\n    var m_strTeamID = \"\";\n    var m_pickbanTiles = [];\n    var m_availableMaps = [];\n\n\tvar _Init = function ()\n    {\n\t\t_m_thisPanel = $.GetContextPanel();\n\n        m_strTournament = MyPersonaAPI.GetMyOfficialTournamentName();\n        m_strTeamID = MyPersonaAPI.GetMyOfficialTeamID();\n\n        _DraftUpdate();\n    }\n\n    var _DraftUpdate = function ()\n    {\n        var numStartTeamID = MatchDraftAPI.GetFirstVetoTeamID();\n        \n        if ( numStartTeamID == undefined )\n            return\n        \n                             \n        $.GetContextPanel().SetHasClass( \"pickban__initial-pick\", false );\n        $.GetContextPanel().SetHasClass( \"pickban__initial-wait\", false );\n        $.GetContextPanel().SetHasClass( \"pickban__draft\", false );\n        \n                                                                                                           \n        if ( numStartTeamID == 0 )\n        {\n            numStartTeamID = MatchDraftAPI.GetTeamID( 0 );\n            _SetUpInitalVotePanel( numStartTeamID );\n        }\n        else\n        {\n            _ChooseTypeOfLayout();   \n        }\n    }\n    \n    var _SetUpInitalVotePanel = function ( numStartTeamID )\n    {\n        var isPicker = m_strTeamID == numStartTeamID;\n        if ( isPicker )\n        {\n            var elText = $.GetContextPanel().FindChildInLayoutFile( 'InitialPickText' );\n            var numMapsCount = MatchDraftAPI.GetMapsCount();\n            var strLoc = numMapsCount == 1 ? \"#SFUI_InitalPick_Maps_Picks_One\" : \"#SFUI_InitalPick_Maps_Picks_Three\";\n            elText.SetLocString( strLoc );\n        }\n\n        $.GetContextPanel().SetHasClass( \"pickban__initial-pick\", isPicker );\n        $.GetContextPanel().SetHasClass( \"pickban__initial-wait\", !isPicker );\n    }\n\n    var _ChooseTypeOfLayout = function ()\n    {\n        var numMapsCount = MatchDraftAPI.GetMapsCount();\n        var numEntriesCount = MatchDraftAPI.GetDraftEntriesCount();\n\n        var allCompetitiveMaps = GameTypesAPI.GetMapGroupAttributeSubKeys( \"mg_active\", \"maps\" );\n        m_availableMaps = allCompetitiveMaps.split(\",\");\n            \n                                     \n        var numActiveIndex = MatchDraftAPI.GetDraftEntryActiveIndex();\n        \n        if ( MatchDraftAPI.GetDraft() == \"completed\" )\n        {\n            numActiveIndex = numEntriesCount;\n        }\n\n        function SetTeamLogo( elOption, numTeamID )\n        {\n            if ( numTeamID != undefined && numTeamID != 0 )\n            {\n                var elTeamLogo = elOption.FindChildTraverse( 'TeamLogo' );\n\t\t\t\tvar strTeamTag = CompetitiveMatchAPI.GetTournamentTeamTagByID( m_strTournament, numTeamID );\n\t\t\t\tif ( !strTeamTag )\n\t\t\t\t{\n\t\t\t\t\tstrTeamTag = PredictionsAPI.GetTeamTag( numTeamID );\n\t\t\t\t}\n                elTeamLogo.SetImage( 'file://{images}/tournaments/teams/' + strTeamTag + '.svg' );\n            }\n        }\n\n        var _GetTile = function( i, strTileType, strMapName, numTeamID, numCtTeamID, numTeamPickingSideID )\n        {\n            var strTileName = 'Tile' + i;\n            if ( strTileName in m_pickbanTiles )\n                return m_pickbanTiles[ strTileName ];\n            \n                                              \n            var elDraftContainer = $.GetContextPanel().FindChildInLayoutFile( 'DraftContainer' );\n            var elNewTile = $.CreatePanel( 'Panel', elDraftContainer, 'Tile' + i );\n            elNewTile.AddClass( 'pickban_draft_tile' );\n            if ( strTileType == 'veto' )\n            {\n                var elVetoMap = $.CreatePanel( 'Panel', elNewTile, 'vetomap' )\n                elVetoMap.BLoadLayoutSnippet( \"PickBanOptionSnippet\" );\n                elVetoMap.AddClass( 'pickban__map' );\n                SetTeamLogo( elVetoMap, numTeamID );\n\n                elNewTile.AddClass( 'pickban__veto' );\n            }\n            else\n            {\n                var elPickMap = $.CreatePanel( 'Panel', elNewTile, 'pickmap' )\n                elPickMap.BLoadLayoutSnippet( \"PickBanOptionSnippet\" );\n                elPickMap.AddClass( 'pickban__map' );\n                SetTeamLogo( elPickMap, numTeamID );\n\n                var elPickTeam = $.CreatePanel( 'Panel', elNewTile, 'pickteam' )\n                elPickTeam.BLoadLayoutSnippet( \"PickBanOptionSnippet\" );\n                elPickTeam.AddClass( 'pickban__team' );\n                SetTeamLogo( elPickTeam, numTeamPickingSideID );\n\n                elNewTile.AddClass( 'pickban__pick' );\n            }\n            m_pickbanTiles[ strTileName ] = elNewTile;\n            return elNewTile;\n        }\n\n        function AddDropdownOption( elDropdown, entryID, strText, strData, strSelectedData )\n        {\n            var newEntry = $.CreatePanel( 'Label', elDropdown, entryID, { data: strData } );\n            newEntry.text = strText;\n            elDropdown.AddOption( newEntry );\n\n                           \n            if ( strSelectedData === strData )\n            {\n                elDropdown.SetSelected( entryID );\n            }\n        }\n\n        function GetSelectedDataFromDropdown( elDropdown )\n        {\n            if ( !elDropdown.GetSelected() )\n                return '';\n            \n            var strData = elDropdown.GetSelected().GetAttributeString( 'data', '' );\n            return strData;\n        }\n\n        function SetupMapSelection( elOption, numIndex, strDefaultDropdownLoc, strConfirmBtnLoc )\n        {\n                                                    \n            var elPickDropdown = elOption.FindChildTraverse( 'PickDropdown' );\n            elPickDropdown.RemoveAllOptions();\n            AddDropdownOption( elPickDropdown, \"default\", $.Localize( strDefaultDropdownLoc ), '', '' );\n            for ( var i = 0; i < m_availableMaps.length; i++ )\n            {\n                var strMapName = m_availableMaps[ i ];\n                var NiceMapName = $.Localize( GameTypesAPI.GetMapGroupAttribute( \"mg_\" + strMapName, \"nameID\" ) );\n                AddDropdownOption( elPickDropdown, 'map' + i, $.Localize( NiceMapName ), strMapName, '' );\n            }\n\n            var elConfirmBtn = elOption.FindChildTraverse( 'ConfirmBtn' );\n            elConfirmBtn.enabled = false;                       \n\n            var _OnMapDropdownSelected = function ( elOption, elDropdown, elConfirmBtn )\n            {\n                var strMapName = GetSelectedDataFromDropdown( elDropdown );\n                elConfirmBtn.enabled = strMapName != '';\n                SetMapImage( elOption, strMapName );\n            }\n            elPickDropdown.SetPanelEvent( 'oninputsubmit', _OnMapDropdownSelected.bind( undefined, elOption, elPickDropdown, elConfirmBtn ) );\n\n            var _OnMapConfirmed = function ( numIndex, elDropdown )\n            {\n                var strMapName = GetSelectedDataFromDropdown( elDropdown );\n                MatchDraftAPI.UploadDraftEntryMap( numIndex, strMapName )\n            }\n            elConfirmBtn.SetPanelEvent( 'onactivate', _OnMapConfirmed.bind( undefined, numIndex, elPickDropdown ) );\n\n            var elConfirmBtnLabel = elConfirmBtn.FindChildTraverse( 'ConfirmBtnLabel' );\n            elConfirmBtnLabel.SetLocString( strConfirmBtnLoc );\n        }\n\n        function SetMapImage( elOption, strMapName )\n        {\n            var elMapImage = elOption.FindChildTraverse( 'SelectedImage' );\n            elMapImage.SetImage( 'file://{images}/map_icons/screenshots/360p/' + strMapName + '.png' );\n        }\n\n        function SetupSelectedMap( elOption, strMapName, numTeamID, strSelectedMapLoc, strCustomClass )\n        {\n            var NiceMapName = $.Localize( GameTypesAPI.GetMapGroupAttribute( \"mg_\" + strMapName, \"nameID\" ) );\n            var strTeamName = CompetitiveMatchAPI.GetTournamentTeamNameByID( m_strTournament, numTeamID );\n            \n            var elInfoLabel = elOption.FindChildTraverse( 'InfoLabel' );\n            elInfoLabel.SetLocString( strSelectedMapLoc );\n            elInfoLabel.SetDialogVariable( \"s1\", strTeamName );\n            elInfoLabel.SetDialogVariable( \"s2\", NiceMapName );\n            \n            SetMapImage( elOption, strMapName );\n\n            elOption.AddClass( strCustomClass );\n        }\n\n        function SetupTeamSelection( elOption, numIndex )\n        {\n                                                    \n            var elPickDropdown = elOption.FindChildTraverse( 'PickDropdown' );\n            elPickDropdown.RemoveAllOptions();\n            AddDropdownOption( elPickDropdown, \"default\", $.Localize( \"#SFUI_Tournament_Starting_Side\" ), '', '' );\n            AddDropdownOption( elPickDropdown, \"t-side\", $.Localize( \"#counter-terrorists\" ), \"#counter-terrorists\", '' );\n            AddDropdownOption( elPickDropdown, \"ct-side\", $.Localize( \"#terrorists\" ), \"#terrorists\", '' );\n\n            var elConfirmBtn = elOption.FindChildTraverse( 'ConfirmBtn' );\n            elConfirmBtn.enabled = false;                       \n\n            var _OnTeamDropdownSelected = function ( elOption, elDropdown, elConfirmBtn )\n            {\n                var strSide = GetSelectedDataFromDropdown( elDropdown );\n                elConfirmBtn.enabled = strSide != '';\n                SetSideImage( elOption, strSide );\n            }\n            elPickDropdown.SetPanelEvent( 'oninputsubmit', _OnTeamDropdownSelected.bind( undefined, elOption, elPickDropdown, elConfirmBtn ) );\n\n            var _OnTeamConfirmed = function ( numIndex, elDropdown )\n            {\n                var strTeamName = GetSelectedDataFromDropdown( elDropdown );\n                \n                if( strTeamName == \"#counter-terrorists\" )\n                    MatchDraftAPI.UploadDraftEntryCTTeamID( numIndex, m_strTeamID );\n                else\n                {\n                    var Team0ID = MatchDraftAPI.GetTeamID( 0 );\n                    var Team1ID = MatchDraftAPI.GetTeamID( 1 );\n                    \n                    if ( m_strTeamID != Team0ID )\n                    {\n                        MatchDraftAPI.UploadDraftEntryCTTeamID( numIndex, Team0ID );\n                    }\n                    else\n                    {\n                        MatchDraftAPI.UploadDraftEntryCTTeamID( numIndex, Team1ID );\n                    }\n                }\n            }\n            elConfirmBtn.SetPanelEvent( 'onactivate', _OnTeamConfirmed.bind( undefined, numIndex, elPickDropdown ) );\n\n            var elConfirmBtnLabel = elConfirmBtn.FindChildTraverse( 'ConfirmBtnLabel' );\n            elConfirmBtnLabel.SetLocString( \"#SFUI_Tournament_Pick\" );\n        }\n\n        function SetSideImage( elOption, strSide )\n        {\n            var elSideImage = elOption.FindChildTraverse( 'SelectedImage' );\n            var strIcon = strSide == \"#counter-terrorists\" ? \"ct_logo\" : \"t_logo\";\n            elSideImage.SetImage( 'file://{images}/icons/' + strIcon + '.svg' );\n        }\n\n        function SetupSelectedTeam( elOption, numTeamID, numCtTeamID )\n        {   \n            var strTeamName = CompetitiveMatchAPI.GetTournamentTeamNameByID( m_strTournament, numTeamID );\n            var strSideLoc = numCtTeamID == numTeamID ? \"#counter-terrorists\" : \"#terrorists\";\n            \n            var elInfoLabel = elOption.FindChildTraverse( 'InfoLabel' );\n            elInfoLabel.SetLocString( \"#SFUI_Tournament_PickedTeam_Title\" );\n            elInfoLabel.SetDialogVariable( \"s1\", strTeamName );\n            elInfoLabel.SetDialogVariable( \"s2\", $.Localize( strSideLoc ) );\n            \n            SetSideImage( elOption, strSideLoc );\n\n            elOption.AddClass( 'pickban__draft_picked' );\n        }\n\n        function SetupFutureEntry( elOption, strFutureLoc )\n        {\n            var elInfoLabel = elOption.FindChildTraverse( 'InfoLabel' );\n            elInfoLabel.SetLocString( strFutureLoc );\n        }\n\n        function SetUpVetoTile( elTile, strMapName, numActiveIndex, numTeamID, numIndex )\n        {\n            var isActive = numActiveIndex == numIndex;\n            var isPicking = numTeamID == m_strTeamID;\n\n            var elOption = elTile.FindChildTraverse( 'vetomap' );\n\n            elOption.SetHasClass( 'pickban__picking', isActive && isPicking );\n            elOption.SetHasClass( 'pickban__waiting', isActive && !isPicking );\n            \n            if ( isActive && strMapName == \"\" )\n            {\n                if ( isPicking )\n                {\n                    SetupMapSelection( elOption, numIndex, \"#SFUI_Tournament_ChooseMap\", \"#SFUI_Tournament_Veto\" );\n                }\n            }\n            else if ( numActiveIndex > numIndex && strMapName != \"\" )\n            {\n                SetupSelectedMap( elOption, strMapName, numTeamID, \"#SFUI_Tournament_Vetoed_Title\", 'pickban__draft_vetoed' );\n            }\n            else\n            {\n                SetupFutureEntry( elOption, \"#SFUI_Tournament_Upcoming_Veto\" );\n            }\n        }\n\n        function RemoveFromAvailableMap( strMapName )\n        {\n            for ( var i = 0; i < m_availableMaps.length; i++ )\n            {\n                if ( m_availableMaps[ i ] == strMapName )\n                {\n                    m_availableMaps.splice( i, 1 );\n                    return;\n                }\n            }\n        }\n\n        function SetUpPickTile( elTile, strMapName, numActiveIndex, numTeamID, numTeamPickingSideID, numCtTeamID, numIndex )\n        {\n            var elMapOption = elTile.FindChildTraverse( 'pickmap' );\n            var elTeamOption = elTile.FindChildTraverse( 'pickteam' );\n\n            var isActive = numActiveIndex == numIndex;\n            var isPickingMap = numTeamID == m_strTeamID;\n            var isPickingSide = numTeamPickingSideID == m_strTeamID;\n            var isChoosingMap = strMapName == \"\";\n            var isChoosingTeam = numCtTeamID == 0;\n\n                                                    \n            elMapOption.SetHasClass( 'pickban__picking', isActive && isChoosingMap && isPickingMap );\n            elMapOption.SetHasClass( 'pickban__waiting', isActive && isChoosingMap && !isPickingMap );\n            elTeamOption.SetHasClass( 'pickban__picking', isActive && !isChoosingMap && isChoosingTeam && isPickingSide );\n            elTeamOption.SetHasClass( 'pickban__waiting', isActive && !isChoosingMap && isChoosingTeam && !isPickingSide );\n            \n            if ( numActiveIndex == numIndex )\n            {\n                if ( isChoosingMap )\n                {\n                    if ( isPickingMap )\n                    {\n                        SetupMapSelection( elMapOption, numIndex, \"#SFUI_Tournament_ChooseMapPick\", \"#SFUI_Tournament_Pick\" );\n                    }\n                    SetupFutureEntry( elTeamOption, \"#SFUI_Tournament_Upcoming_Side_Pick\" );\n                }\n                else\n                {\n                    SetupSelectedMap( elMapOption, strMapName, numTeamID, \"#SFUI_Tournament_Picked_Title\", 'pickban__draft_picked' );\n                    \n                    if ( isChoosingTeam && isPickingSide )\n                    {\n                        SetupTeamSelection( elTeamOption, numIndex );\n                    }\n                }\n            }\n            else if ( numActiveIndex > numIndex && strMapName != \"\" )\n            {\n                SetupSelectedMap( elMapOption, strMapName, numTeamID, \"#SFUI_Tournament_Picked_Title\", 'pickban__draft_picked' );\n                SetupSelectedTeam( elTeamOption, numTeamPickingSideID, numCtTeamID );\n            }\n            else\n            {\n                SetupFutureEntry( elMapOption, \"#SFUI_Tournament_Upcoming_Pick\" );\n                SetupFutureEntry( elTeamOption, \"#SFUI_Tournament_Upcoming_Side_Pick\" );\n            }\n        }\n        \n        for ( var i = 0; i < numEntriesCount; i++ )\n        {\n            var strTileType = MatchDraftAPI.GetDraftEntryType(i);\n            var strMapName = MatchDraftAPI.GetDraftEntryMap(i);\n            var numTeamID = MatchDraftAPI.GetDraftEntryMapChoiceTeamID(i);\n            var numCtTeamID = MatchDraftAPI.GetDraftEntryCTTeamID(i);\n            var numTeamPickingSideID = MatchDraftAPI.GetDraftEntryCTChoiceTeamID( i );\n        \n            RemoveFromAvailableMap( strMapName );\n            \n            var elTile = _GetTile( i, strTileType, strMapName, numTeamID, numCtTeamID, numTeamPickingSideID );\n            \n            if( strTileType == \"veto\" )\n            {\n                SetUpVetoTile( elTile, strMapName, numActiveIndex, numTeamID, i );\n            }\n            else\n            {\n                SetUpPickTile( elTile, strMapName, numActiveIndex, numTeamID, numTeamPickingSideID, numCtTeamID, i );\n            }\n        }\n\n        $.GetContextPanel().SetHasClass( \"pickban__draft\", true );\n    }\n\n    var _OnCancel = function ()\n    {\n\t\tLobbyAPI.StopMatchmaking();\n\t\t\n\t\t_CloseThisPopupWindow();\n\t}\n\t\n\tvar _SessionSettingsUpdate = function( sessionState ) \n\t{\n\t\t                                                     \n\t\tif ( !LobbyAPI.GetMatchmakingStatusString() )\n\t\t{\n\t\t\t_CloseThisPopupWindow();\n\t\t}\n\t};\n\n\tvar _CloseThisPopupWindow = function()\n\t{\n\t\tif ( _m_thisPanel && _m_thisPanel.IsValid() )\n\t\t{\n\t\t\t$.DispatchEvent( 'UIPopupButtonClicked', _m_thisPanel, '' );\n\t\t}\n\t}\n\n\treturn {\n\t\tInit\t\t\t\t:\t_Init,\n\t\tDraftUpdate         :   _DraftUpdate,\n\t\tSessionSettingsUpdate\t: _SessionSettingsUpdate,\n        OnCancel            :   _OnCancel,\n\t};\n})();\n\n                                                                                                    \n                                           \n                                                                                                    \n( function()\n{\n\t$.RegisterForUnhandledEvent( \"PanoramaComponent_TournamentMatch_DraftUpdate\", PopupTournamentPickBan.DraftUpdate );\n\t$.RegisterForUnhandledEvent( \"PanoramaComponent_Lobby_MatchmakingSessionUpdate\", PopupTournamentPickBan.SessionSettingsUpdate );\n} )();\n\n","scripts/popups/popup_tournament_select_spray.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../common/iteminfo.ts\" />\n/// <reference path=\"../generated/items_event_current_generated_store.d.ts\" />\n/// <reference path=\"../generated/items_event_current_generated_store.ts\" />\nvar PopupTournamentTeamsList;\n(function (PopupTournamentTeamsList) {\n    function Init() {\n        let journalId = $.GetContextPanel().GetAttributeString(\"journalid\", '');\n        let graffitis = [];\n        g_ActiveTournamentTeams.forEach(team => { graffitis.push(team.stickerid_graffiti); });\n        graffitis.push(g_ActiveTournamentInfo.stickerid_graffiti);\n        let elBackground = $.GetContextPanel().FindChild('id-popup-tournament-teams-bg');\n        elBackground.style.backgroundImage = 'url( \"file://{images}/tournaments/backgrounds/pickem_bg_' + $.GetContextPanel().GetAttributeString('eventid', '') + '.png\");';\n        elBackground.style.backgroundSize = 'cover';\n        elBackground.style.backgroundPosition = ' 50% 50%;';\n        $.GetContextPanel().SetHasClass('major-' + $.GetContextPanel().GetAttributeString('eventid', ''), true);\n        graffitis.forEach(stickerid => {\n            let itemid = ItemInfo.GetFauxItemIdForGraffiti(stickerid);\n            let elTeam = $.CreatePanel(\"ItemImage\", $.GetContextPanel().FindChildInLayoutFile('id-popup-tournament-teams'), 'graffiti_' + stickerid, {\n                itemid: itemid,\n                class: 'popup-tournament-select-spray-team'\n            });\n            elTeam.SetPanelEvent('onactivate', () => {\n                InventoryAPI.SetItemAttributeValueAsync(journalId, \"sticker slot 0 id\", stickerid);\n                LoadoutAPI.EquipItemInSlot('noteam', journalId, 'spray0');\n                $.DispatchEvent('UIPopupButtonClicked', '');\n            });\n        });\n    }\n    PopupTournamentTeamsList.Init = Init;\n    ;\n})(PopupTournamentTeamsList || (PopupTournamentTeamsList = {}));\n","scripts/popups/popup_videoclip.js":"\"use strict\";\n/// <reference path=\"..\\csgo.d.ts\" />\nvar PopupVideoClip;\n(function (PopupVideoClip) {\n    function Init() {\n        const reelId = $.GetContextPanel().GetAttributeString(\"reelid\", '');\n        const reelJson = InventoryAPI.BuildHighlightReelSchemaJSON(parseInt(reelId));\n        const reelSchemaDef = JSON.parse(reelJson);\n        $.GetContextPanel().SetDialogVariable('clip_title', $.Localize(\"#CSGO_Watch_Cat_Tournament_\" + reelSchemaDef[\"tournament event id\"])\n            + \" | \" +\n            $.Localize(\"#HighlightReel_\" + reelSchemaDef[\"id\"]));\n        const videoPlayer = $('#VideoClipMovie');\n        if (videoPlayer) {\n            UiToolkitAPI.PlaySoundEvent('UIPanorama.OnStartPopupVideo');\n            videoPlayer.SetMovie(reelSchemaDef[\"url_1080p\"]);\n            videoPlayer.UseAttachedAudioStream(true);\n            videoPlayer.Play();\n        }\n    }\n    PopupVideoClip.Init = Init;\n    function Close() {\n        UiToolkitAPI.PlaySoundEvent('UIPanorama.OnStopPopupVideo');\n        $.DispatchEvent('UIPopupButtonClicked', '');\n    }\n    PopupVideoClip.Close = Close;\n    $.RegisterForUnhandledEvent(\"ServerReserved\", Close);\n})(PopupVideoClip || (PopupVideoClip = {}));\n","scripts/popups/popup_workshop_mode_select.js":"\"use strict\";\n/// <reference path=\"..//csgo.d.ts\" />\nvar PopupWorkshopModeSelect;\n(function (PopupWorkshopModeSelect) {\n    let m_elPopup = null;\n    let m_elButtonContainer;\n    let m_elButtons = [];\n    function Init() {\n        m_elButtons = [];\n        m_elPopup = $.GetContextPanel();\n        m_elButtonContainer = m_elPopup.FindChildTraverse('popup-workshop-mode-items');\n        m_elPopup.FindChildTraverse('GoButton').SetPanelEvent('onactivate', _Apply);\n        m_elPopup.FindChildTraverse('CancelButton').SetPanelEvent('onactivate', _Cancel);\n        let strModes = m_elPopup.GetAttributeString('workshop-modes', '');\n        if (!strModes)\n            strModes = 'casual';\n        let modes = [];\n        modes = strModes.split(',');\n        if (modes.length <= 1) {\n            _Apply(modes[0]);\n            return;\n        }\n        _InitModes(modes);\n    }\n    PopupWorkshopModeSelect.Init = Init;\n    function _InitModes(modes) {\n        m_elButtons.forEach(elButton => elButton.DeleteAsync(0.0));\n        m_elButtons = [];\n        for (let i = 0; i < modes.length; ++i) {\n            let strMode = modes[i];\n            if (!strMode) {\n                continue;\n            }\n            let elButton = $.CreatePanel('RadioButton', m_elButtonContainer, undefined);\n            elButton.BLoadLayoutSnippet('workshop-mode-item');\n            elButton.SetAttributeString('data-mode', strMode);\n            elButton.SetDialogVariable('workshop-mode-item-name', $.Localize('#CSGO_Workshop_Mode_' + strMode));\n            if (i === 0)\n                elButton.checked = true;\n            m_elButtons.push(elButton);\n        }\n    }\n    function _Apply(singleModeOverride = '') {\n        let strGameMode = 'casual';\n        let nSkirmishId = 0;\n        if (singleModeOverride !== '') {\n            strGameMode = singleModeOverride;\n        }\n        else {\n            let elSelectedButton = m_elButtons.find(elButton => elButton.checked);\n            if (elSelectedButton)\n                strGameMode = elSelectedButton.GetAttributeString('data-mode', strGameMode);\n        }\n        let strGameType = GameTypesAPI.GetGameModeType(strGameMode);\n        if (!strGameType) {\n            nSkirmishId = GameTypesAPI.GetSkirmishIdFromInternalName(strGameMode);\n            if (nSkirmishId !== 0) {\n                strGameMode = 'skirmish';\n                strGameType = 'skirmish';\n            }\n        }\n        if (!strGameType) {\n            strGameType = 'classic';\n            strGameMode = 'casual';\n        }\n        let settings = {\n            update: {\n                Game: {\n                    type: strGameType,\n                    mode: strGameMode,\n                }\n            }\n        };\n        if (nSkirmishId !== 0) {\n            settings.update.Game.skirmishmode = nSkirmishId;\n        }\n        else {\n            settings.delete = {\n                Game: {\n                    skirmishmode: '#empty#'\n                }\n            };\n        }\n        $.DispatchEvent('UIPopupButtonClicked', '');\n        LobbyAPI.UpdateSessionSettings(settings);\n        LobbyAPI.StartMatchmaking(\"\", \"\", \"\", \"\");\n    }\n    ;\n    function _Cancel() {\n        $.DispatchEvent('UIPopupButtonClicked', '');\n    }\n    ;\n})(PopupWorkshopModeSelect || (PopupWorkshopModeSelect = {}));\n","scripts/popups/stats/popup_playerstats_singlematch.js":"'use strict';\n\nvar singlematch = ( function()\n{\n\tvar _m_matchId;\n\tvar _m_sToken;\n\n\tvar _m_EventHandle;\n\n\tfunction _Appear ()\n\t{\n\t\t_m_matchId = $.GetContextPanel().GetAttributeString( 'matchid', '' );\n\n\t\t_m_EventHandle = $.RegisterForUnhandledEvent( 'PanoramaComponent_MatchInfo_StateChange', _OnMatchReadyForDisplay );\n\n\t\t$.GetContextPanel().AddClass( 'reveal' );\n\n\t\t  \n\t\t                                   \n\t\t  \n\t\tlet sState = MatchListAPI.GetState( 'downloaded' );\n\t\tif ( sState !== 'ready' ) \n\t\t{\n\t\t\tMatchListAPI.Refresh( 'downloaded' );\n\t\t}\n\n\t\t_m_sToken = MatchListAPI.FindMatchByID( 'downloaded', _m_matchId );\n\t\tif ( !_m_sToken )\n\t\t{\t                                                                      \n\t\t\t_m_sToken = MatchListAPI.FindMatchByID( 'inmemory', _m_matchId );\n\t\t}\n\n\t\t  \n\t\t                                                              \n\t\t  \n\t\tif ( _m_sToken )\n\t\t{\n\t\t\tvar elMatchInfo = $.GetContextPanel().FindChildTraverse( 'MatchInfo' );\n\t\t\t_PopulateMatchInfo( elMatchInfo );\n\t\t}\n\t\telse\n\t\t{\n\t\t\tMatchInfoAPI.DownloadWithShareToken( 'MATCH-' + _m_matchId );\n\t\t}\n\n\t}\n\n\tfunction _OnMatchReadyForDisplay ( )\n\t{\n\t\t_m_sToken = MatchListAPI.FindMatchByID( 'inmemory', _m_matchId );\n    if ( !_m_sToken )\n    {\n      return;\n    }\n\n\t\tvar elMatchInfo = $.GetContextPanel().FindChildTraverse( 'MatchInfo' );\n\t\t_PopulateMatchInfo( elMatchInfo );\n\n\t}\n\n\tfunction _Dismiss ()\n\t{\n\t\t$.GetContextPanel().RemoveClass( 'reveal' );\n\t\t$.Schedule( 0.1, _ => UiToolkitAPI.CloseAllVisiblePopups() );\n\t\t$.UnregisterForUnhandledEvent( 'PanoramaComponent_MatchInfo_StateChange', _m_EventHandle );\n\n\t}\n\n    function _PopulateMatchInfo( parentPanel )\n    {\n\t\tvar activeMatchInfoPanel = $.GetContextPanel().FindChildTraverse( 'MatchInfo' );\n\n\t\tactiveMatchInfoPanel.matchId = _m_sToken;\n\t\tactiveMatchInfoPanel.matchListDescriptor = _m_matchId;\n\t\tactiveMatchInfoPanel.BLoadLayout( \"file://{resources}/layout/matchinfo.xml\", true, false );\n\n\t\tmatchInfo.Init( activeMatchInfoPanel );\n\n\t\tvar elSpinner = $.GetContextPanel().FindChildTraverse( 'PageSpinner' );\n\t\telSpinner.visible = false;\n\t\t\n    }\n\n\n\t\t                      \n\treturn {\n\n\t\tAppear: \t_Appear,\n\t\tDismiss: \t_Dismiss\n\t};\n\n} )();\n\t\n                                                                                                    \n                                           \n                                                                                                    \n( function()\n{\n\t                              \n} )();\n","scripts/premier_mapwinrecord.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"common/teamcolor.ts\" />\n/// <reference path=\"common/formattext.ts\"/>\nvar PremierMapWinRecord;\n(function (PremierMapWinRecord) {\n    const m_numMaps = 7;\n    const spiderGraph = $('#jsMapWinsSpiderGraph');\n    var m_LobbyPlayerUpdatedEventHandler;\n    var m_LeaderboardHoverPlayerEventHandler;\n    var m_bEventsRegistered = false;\n    function Init() {\n        RegisterEventHandlers();\n        if (spiderGraph.BCanvasReady()) {\n            Draw();\n        }\n        else {\n            $.Schedule(0.1, Init);\n        }\n    }\n    function RegisterEventHandlers() {\n        if (!m_bEventsRegistered) {\n            m_LobbyPlayerUpdatedEventHandler = $.RegisterForUnhandledEvent(\"PanoramaComponent_Lobby_PlayerUpdated\", Draw);\n            m_LeaderboardHoverPlayerEventHandler = $.RegisterForUnhandledEvent(\"LeaderboardHoverPlayer\", _HighlightPlayer);\n            $.RegisterForUnhandledEvent(\"CSGOHideMainMenu\", UnregisterEventHandlers);\n            $.RegisterForUnhandledEvent(\"CSGOShowMainMenu\", RegisterEventHandlers);\n            $.RegisterEventHandler('ReadyForDisplay', $.GetContextPanel(), Draw);\n            m_bEventsRegistered = true;\n        }\n    }\n    function UnregisterEventHandlers() {\n        if (m_bEventsRegistered) {\n            $.UnregisterForUnhandledEvent('PanoramaComponent_Lobby_PlayerUpdated', m_LobbyPlayerUpdatedEventHandler);\n            $.UnregisterForUnhandledEvent('LeaderboardHoverPlayer', m_LeaderboardHoverPlayerEventHandler);\n            m_bEventsRegistered = false;\n        }\n    }\n    function Draw() {\n        _DrawParty();\n        _MakeMapPanels();\n    }\n    PremierMapWinRecord.Draw = Draw;\n    function _HighlightPlayer(xuid) {\n        _DrawParty(xuid);\n    }\n    const oAlpha = {\n        'normal': { 'outer': 0.5, 'inner': 0.1 },\n        'dim': { 'outer': 0.2, 'inner': 0 },\n        'hilit': { 'outer': 1, 'inner': 0.2 },\n    };\n    function _DrawPlayerPlot(arrValues, rgb, max, plotType = 'normal') {\n        let rgbColorOuter = 'rgba(' + rgb + ',' + oAlpha[plotType].outer + ')';\n        let rgbColorInner = 'rgba(' + rgb + ',' + oAlpha[plotType].inner + ')';\n        arrValues = arrValues.map(a => a / max);\n        const options = {\n            line_color: rgbColorOuter,\n            line_thickness: 3,\n            line_softness: 10,\n            fill_color_inner: rgbColorInner,\n            fill_color_outer: rgbColorInner,\n        };\n        spiderGraph.DrawGraphPoly(arrValues, options);\n    }\n    function _GetMapsList() {\n        return Object.keys(FriendsListAPI.GetFriendCompetitivePremierWindowStatsObject(\"0\"));\n    }\n    function _DrawGuides(maxWinsInASingleMap) {\n        spiderGraph.ClearJS('rgba(0,0,0,0)');\n        const options = {\n            bkg_color: \"#00000080\",\n            spokes_color: '#ffffff10',\n            spoke_thickness: 2,\n            spoke_softness: 100,\n            spoke_length_scale: 1.2,\n            guideline_color: '#ffffff10',\n            guideline_thickness: 2,\n            guideline_softness: 100,\n            guideline_count: maxWinsInASingleMap + 1,\n            deadzone_percent: 0.1,\n            scale: 0.70\n        };\n        spiderGraph.SetGraphOptions(options);\n        spiderGraph.DrawGraphBackground(m_numMaps);\n    }\n    function _SetTitle(totalWins) {\n        const pLabel = $('#jsMapWinsLabel');\n        pLabel.text = $.ConstructString(\"#mapwinrecord_graph_title:f\", { wins: totalWins });\n    }\n    function _DrawParty(highlightedPlayerXuid = '') {\n        if (LobbyAPI.IsSessionActive()) {\n            const party = LobbyAPI.GetSessionSettings().members;\n            const nPlayers = party.numPlayers;\n            let totalWins = 0;\n            let maxWinsInASingleMap = 3;\n            let mapList = _GetMapsList();\n            let wso = [];\n            let lbFallbackName = LeaderboardsAPI.GetCurrentSeasonPremierLeaderboard() + '.party';\n            for (let p = 0; p < nPlayers; p++) {\n                let xuid = party['machine' + p].player0.xuid;\n                let playerObj = null;\n                if (PartyListAPI.GetFriendCompetitiveRankType(xuid) === \"Premier\") {\n                    var partyScore = PartyListAPI.GetFriendCompetitiveRank(xuid);\n                    var partyWins = PartyListAPI.GetFriendCompetitiveWins(xuid);\n                    if (partyScore || partyWins)\n                        playerObj = PartyListAPI.GetFriendCompetitivePremierWindowStatsObject(xuid);\n                }\n                if (!playerObj) {\n                    let objLbRow = LeaderboardsAPI.GetEntryDetailsObjectByXuid(lbFallbackName, xuid);\n                    if (objLbRow && objLbRow.XUID && objLbRow.rankWindowStats)\n                        playerObj = objLbRow.rankWindowStats;\n                }\n                if (!playerObj)\n                    playerObj = PartyListAPI.GetFriendCompetitivePremierWindowStatsObject(xuid);\n                wso.push(playerObj);\n            }\n            for (let p = 0; p < nPlayers; p++) {\n                let RankWindowObject = wso[p];\n                let playerWins = mapList.map((mapName) => { return mapName.startsWith('de_') ? Number(RankWindowObject[mapName] | 0) : 0; });\n                totalWins = totalWins + playerWins.reduce((a, b) => a + b, 0);\n                maxWinsInASingleMap = Math.max(maxWinsInASingleMap, Math.max.apply(null, playerWins));\n            }\n            _DrawGuides(maxWinsInASingleMap);\n            _SetTitle(totalWins);\n            for (let p = 0; p < nPlayers; p++) {\n                let xuid = party['machine' + p].player0.xuid;\n                let RankWindowObject = wso[p];\n                let playerWins = mapList.map((mapName) => { return mapName.startsWith('de_') ? Number(RankWindowObject[mapName] | 0) : 0; });\n                const teamColorIdx = PartyListAPI.GetPartyMemberSetting(xuid, 'game/teamcolor');\n                const teamColorRgb = TeamColor.GetTeamColor(Number(teamColorIdx));\n                let hilite = highlightedPlayerXuid === '' ? 'normal' : highlightedPlayerXuid === xuid ? 'hilit' : 'dim';\n                _DrawPlayerPlot(playerWins, teamColorRgb, maxWinsInASingleMap, hilite);\n            }\n        }\n    }\n    function _MakeMapPanels() {\n        let arrMaps = _GetMapsList();\n        let elMapContainer = $.GetContextPanel().FindChildTraverse('jsMapWinsSpiderGraph');\n        elMapContainer.RemoveAndDeleteChildren();\n        for (let s = 0; s < m_numMaps; s++) {\n            let elMap = $.CreatePanel('Panel', elMapContainer, String(s));\n            elMap.BLoadLayoutSnippet('snippet-mwr-map');\n            let elMapImage = elMap.FindChildInLayoutFile('mwr-map__image');\n            let imageName = arrMaps[s];\n            elMapImage.SetImage(\"file://{images}/map_icons/map_icon_\" + imageName + \".svg\");\n            elMapImage.style.backgroundPosition = '50% 50%';\n            elMapImage.style.backgroundSize = 'auto 150%';\n            elMap.style.flowChildren = 'up';\n            elMap.SetDialogVariable('map-name', $.Localize('#SFUI_Map_' + imageName));\n            let vPos = spiderGraph.GraphPositionToUIPosition(s, 1.3);\n            elMap.SetPositionInPixels(vPos.x, vPos.y, 0);\n        }\n    }\n    {\n        Init();\n    }\n})(PremierMapWinRecord || (PremierMapWinRecord = {}));\n","scripts/premier_season_progress.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"rating_emblem.ts\" />\n/// <reference path=\"common/formattext.ts\" />\nvar SeasonProgress;\n(function (SeasonProgress) {\n    const _m_nWinsForMedal = 25;\n    function _Init() {\n        SetRating();\n    }\n    function SetRating() {\n        let elRatingEmblem = $.GetContextPanel().FindChildInLayoutFile('js-highest-rating');\n        let rating = MyPersonaAPI.GetPipRankHighest(\"Premier\");\n        let options;\n        options = {\n            root_panel: elRatingEmblem,\n            rating_type: 'Premier',\n            leaderboard_details: { score: rating },\n            do_fx: true,\n            full_details: false,\n            local_player: true\n        };\n        RatingEmblem.SetXuid(options);\n        _SetProgressBar(rating);\n    }\n    SeasonProgress.SetRating = SetRating;\n    function _SetProgressBar(rating) {\n        let nWins = MyPersonaAPI.GetPipRankWins(\"Premier\");\n        let clampedRating = RatingEmblem.GetClampedRating(rating);\n        let color = clampedRating;\n        let nBars = nWins > 24 && nWins < 50 ? 1 :\n            nWins > 49 && nWins < 75 ? 2 :\n                nWins > 74 && nWins < 100 ? 3 :\n                    nWins > 99 && nWins < 125 ? 4 :\n                        nWins > 124 ? 5 :\n                            0;\n        nBars = nBars < 5 ? nBars + 1 : 5;\n        let elParent = $.GetContextPanel().FindChildInLayoutFile('id-premier-season-bars');\n        for (let i = 1; i <= nBars; i++) {\n            let elBar = elParent.FindChild('bar-' + i);\n            if (!elBar) {\n                elBar = $.CreatePanel('Panel', elParent, 'bar-' + i);\n                elBar.BLoadLayoutSnippet('one-bar');\n            }\n            let rangeOfMatchesInBar = { min: i == 1 ? 1 : ((i - 1) * _m_nWinsForMedal), max: (i * _m_nWinsForMedal) };\n            let widthInnerBar = (nWins >= (rangeOfMatchesInBar.max - 1)) ? 1 : ((nWins - rangeOfMatchesInBar.min) / (_m_nWinsForMedal - 1));\n            elBar.FindChildInLayoutFile('id-inner-bar').style.width = (widthInnerBar * 100) + '%';\n            elBar.FindChildInLayoutFile('id-inner-bar').SwitchClass('tier', 'rank-tier-' + color);\n            elBar.SwitchClass('num-bars', nBars + '-bars');\n            elBar.FindChildInLayoutFile('id-inner-medal').SwitchClass('tier', nWins >= rangeOfMatchesInBar.max ? 'rank-tier-' + color : 'rank-tier-none');\n        }\n        const nSeasonNumberNow = LeaderboardsAPI.GetCurrentSeasonPremierLeaderboard().replace('official_leaderboard_premier_season', '');\n        clampedRating = clampedRating < 1 ? 1 : clampedRating + 1;\n        let itemDef = InventoryAPI.GetItemDefinitionIndexFromDefinitionName('premier season coin s=' + nSeasonNumberNow + ' c=' + clampedRating + ' b=' + nBars);\n        let itemId = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(itemDef, 0);\n        $.GetContextPanel().FindChildInLayoutFile('id-medal-end').itemid = itemId;\n        $.GetContextPanel().SetDialogVariableInt('wins', nWins);\n        $.GetContextPanel().SetDialogVariableInt('threshold', nBars * 25);\n        _ShowHideExpirationWarning();\n        _SetInfoIconTooltip();\n    }\n    function _ShowHideExpirationWarning() {\n        let nTime = MyPersonaAPI.GetPipRankExpiration(\"Premier\");\n        let nWins = MyPersonaAPI.GetPipRankWins(\"Premier\");\n        let elParent = $.GetContextPanel().FindChildInLayoutFile('id-premier-bar-container');\n        if (nWins < _m_nWinsForMedal || nTime >= 0) {\n            elParent.SetHasClass('show-warning', false);\n            let elImages = elParent.FindChildInLayoutFile('id-premier-bar-icons');\n            elImages.SetPanelEvent('onmouseover', () => {\n                return;\n            });\n            elImages.SetPanelEvent('onmouseout', () => {\n                return;\n            });\n            return;\n        }\n        if (nTime < 0) {\n            elParent.SetHasClass('show-warning', true);\n            let elImages = elParent.FindChildInLayoutFile('id-premier-bar-icons');\n            elImages.SetPanelEvent('onmouseover', () => {\n                UiToolkitAPI.ShowTextTooltip('id-premier-bar-icons', '#season_progress_rating_expired');\n            });\n            elImages.SetPanelEvent('onmouseout', () => {\n                UiToolkitAPI.HideTextTooltip();\n            });\n        }\n    }\n    function _SetInfoIconTooltip() {\n        let nTime = MyPersonaAPI.GetPipRankExpiration(\"Premier\");\n        let nWins = MyPersonaAPI.GetPipRankWins(\"Premier\");\n        let elTooltip = $.GetContextPanel().FindChildInLayoutFile('id-season-progress-tooltip');\n        let sTooltip = $.Localize('#season_progress_tooltip-body');\n        if (nWins >= _m_nWinsForMedal && nTime > 0) {\n            elTooltip.SetDialogVariable('time', FormatText.SecondsToSignificantTimeString(nTime));\n            sTooltip = sTooltip + $.Localize('#season_progress_tooltip-expiration_time', elTooltip);\n        }\n        elTooltip.SetPanelEvent('onmouseover', () => {\n            UiToolkitAPI.ShowTitleTextTooltip('id-season-progress-tooltip', '#season_progress_tooltip-title', sTooltip);\n        });\n        elTooltip.SetPanelEvent('onmouseout', () => {\n            UiToolkitAPI.HideTitleTextTooltip();\n        });\n    }\n    function ReadyForDisplay() {\n        SetRating();\n    }\n    SeasonProgress.ReadyForDisplay = ReadyForDisplay;\n    function UnReadyForDisplay() {\n    }\n    SeasonProgress.UnReadyForDisplay = UnReadyForDisplay;\n    function PipRankUpdate() {\n        SetRating();\n    }\n    SeasonProgress.PipRankUpdate = PipRankUpdate;\n    {\n        $.RegisterEventHandler('ReadyForDisplay', $.GetContextPanel(), SeasonProgress.ReadyForDisplay);\n        $.RegisterEventHandler('UnreadyForDisplay', $.GetContextPanel(), SeasonProgress.UnReadyForDisplay);\n        $.RegisterForUnhandledEvent('PanoramaComponent_MyPersona_PipRankUpdate', PipRankUpdate);\n        _Init();\n    }\n})(SeasonProgress || (SeasonProgress = {}));\n","scripts/rankup_redemption_store.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"common/formattext.ts\" />\n/// <reference path=\"common/iteminfo.ts\" />\n/// <reference path=\"common/sessionutil.ts\" />\n/// <reference path=\"itemtile_store.ts\" />\n$.LogChannel('p.rankup', \"LV_OFF\");\nvar RankUpRedemptionStore;\n(function (RankUpRedemptionStore) {\n    let m_redeemableBalance = 0;\n    let m_timeStamp = -1;\n    let m_timeoutScheduleHandle;\n    let m_profileCustomizationHandler;\n    let m_profileUpdateHandler;\n    let m_registered = false;\n    let m_schTimer;\n    function RegisterForInventoryUpdate() {\n        if (m_registered)\n            return;\n        m_registered = true;\n        _UpdateStoreState();\n        CheckForPopulateItems();\n        m_profileUpdateHandler = $.RegisterForUnhandledEvent('PanoramaComponent_MyPersona_InventoryUpdated', OnInventoryUpdated);\n        m_profileCustomizationHandler = $.RegisterForUnhandledEvent('PanoramaComponent_Inventory_ItemCustomizationNotification', OnItemCustomization);\n        $.GetContextPanel().RegisterForReadyEvents(true);\n        $.RegisterEventHandler('ReadyForDisplay', $.GetContextPanel(), () => {\n            _UpdateStoreState();\n            CheckForPopulateItems(true);\n            if (!m_profileUpdateHandler) {\n                m_profileUpdateHandler = $.RegisterForUnhandledEvent('PanoramaComponent_MyPersona_InventoryUpdated', OnInventoryUpdated);\n            }\n            if (!m_profileCustomizationHandler) {\n                m_profileCustomizationHandler = $.RegisterForUnhandledEvent('PanoramaComponent_Inventory_ItemCustomizationNotification', OnItemCustomization);\n            }\n        });\n        $.RegisterEventHandler('UnreadyForDisplay', $.GetContextPanel(), () => {\n            if (m_schTimer) {\n                $.CancelScheduled(m_schTimer);\n                m_schTimer = null;\n            }\n            if (m_profileUpdateHandler) {\n                $.UnregisterForUnhandledEvent('PanoramaComponent_MyPersona_InventoryUpdated', m_profileUpdateHandler);\n                m_profileUpdateHandler = null;\n            }\n            if (m_profileCustomizationHandler) {\n                $.UnregisterForUnhandledEvent('PanoramaComponent_Inventory_ItemCustomizationNotification', m_profileCustomizationHandler);\n                m_profileCustomizationHandler = null;\n            }\n        });\n    }\n    ;\n    function CheckForPopulateItems(bFirstTime = false, claimedItemId = '') {\n        const objStore = GetPersonalStore();\n        const genTime = objStore ? objStore.generation_time : 0;\n        if (genTime != m_timeStamp || claimedItemId) {\n            if (genTime != m_timeStamp) {\n                m_timeStamp = genTime;\n                GameInterfaceAPI.SetSettingString('cl_redemption_reset_timestamp', genTime);\n            }\n            PopulateItems(bFirstTime, claimedItemId);\n        }\n    }\n    const TEST_DOUBLE_CLAIM_COST_SLOT = -1;\n    function _GetClaimCost(itemId, index) {\n        if (itemId !== '-' && InventoryAPI.DoesItemMatchDefinitionByName(itemId, 'chicken_egg'))\n            return 2;\n        if (itemId !== '-' && InventoryAPI.DoesItemMatchDefinitionByName(itemId, 'chicken_feed'))\n            return 2;\n        return (index === TEST_DOUBLE_CLAIM_COST_SLOT) ? 2 : 1;\n    }\n    function _CreateItemPanel(itemId, index, bFirstTime, claimedItemId = '') {\n        const bNoDropsEarned = itemId === '-';\n        if (itemId !== '-' && (!InventoryAPI.IsItemInfoValid(itemId) || !InventoryAPI.IsValidItemID(itemId))) {\n            return;\n        }\n        const elItemContainer = $.GetContextPanel().FindChildTraverse('jsRrsItemContainer');\n        let elGhostItem = elItemContainer.FindChildInLayoutFile('itemdrop-' + itemId);\n        elGhostItem = $.CreatePanel('Panel', elItemContainer, 'itemdrop-' + index + '-' + itemId);\n        elGhostItem.BLoadLayout('file://{resources}/layout/itemtile_store.xml', false, false);\n        _AddTileToBlurPanel(elGhostItem);\n        const oItemData = {\n            id: itemId,\n            isDropItem: true,\n            noDropsEarned: bNoDropsEarned,\n        };\n        ItemTileStore.Init(elGhostItem, oItemData);\n        elGhostItem.Data().itemid = itemId;\n        elGhostItem.Data().cost = _GetClaimCost(itemId, index);\n        elGhostItem.Data().index = index;\n        elGhostItem.SetHasClass('claim-cost-2', elGhostItem.Data().cost === 2);\n        elGhostItem.SetDialogVariableInt('claim-cost', elGhostItem.Data().cost);\n        if (bNoDropsEarned)\n            return;\n        _OnGhostItemActivate(elGhostItem, itemId);\n    }\n    function _AddTileToBlurPanel(elGhostItem) {\n        let parent = elGhostItem.GetParent();\n        let count = 0;\n        while (parent) {\n            if (parent.id === 'id-rewards-background') {\n                let blurTarget = parent.FindChildInLayoutFile('id-rewards-background-blur');\n                blurTarget.AddBlurPanel(elGhostItem);\n                break;\n            }\n            if (count > 5)\n                break;\n            parent = parent.GetParent();\n            count++;\n        }\n    }\n    function _OnGhostItemActivate(elGhostItem, itemId) {\n        if (!InventoryAPI.IsFauxItemID(itemId)) {\n            elGhostItem.SetPanelEvent('onactivate', () => _OnItemSelected(elGhostItem));\n            const elInspect = elGhostItem.FindChildTraverse('id-itemtile-store-inspect-btn');\n            const isVolatile = !!InventoryAPI.GetItemAttributeValue(itemId, '{uint32}volatile container');\n            elInspect.SetPanelEvent('onactivate', () => {\n                if (isVolatile) {\n                    const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('popup-inspect-' + itemId, 'file://{resources}/layout/popups/popup_offers_laptop.xml');\n                    let oSettings = {\n                        item_id: itemId,\n                        inspect_only: true,\n                        work_type: 'decodeable',\n                        only_close_btn: true\n                    };\n                    elPanel.Data().oSettings = oSettings;\n                }\n                else if (ItemInfo.ItemHasCapability(itemId, 'decodable') && !InventoryAPI.IsTool(itemId)) {\n                    const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('popup-inspect-' + itemId, 'file://{resources}/layout/popups/popup_capability_decodable.xml');\n                    let oSettings = {\n                        item_id: itemId,\n                        show_work_type_warning: false,\n                        inspect_only: true,\n                        work_type: 'decodeable',\n                        only_close_btn: true\n                    };\n                    elPanel.Data().oSettings = oSettings;\n                }\n                else {\n                    const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('', 'file://{resources}/layout/popups/popup_inventory_inspect.xml');\n                    let oSettings = {\n                        item_id: itemId,\n                        inspect_only: true,\n                        hide_all_action_items: true\n                    };\n                    elPanel.Data().oSettings = oSettings;\n                }\n            });\n        }\n    }\n    function GetPersonalStore() {\n        let oStore = InventoryAPI.GetCacheTypeElementJSOByIndex(\"PersonalStore\", 0);\n        return oStore;\n    }\n    function PopulateItems(bFirstTime = false, claimedItemId = '') {\n        const objStore = GetPersonalStore();\n        $.GetContextPanel().RemoveClass('waiting');\n        if (bFirstTime) {\n            $.GetContextPanel().TriggerClass('reveal-store');\n        }\n        const elItemContainer = $.GetContextPanel().FindChildTraverse('jsRrsItemContainer');\n        let aSelectedItems = [];\n        elItemContainer.Children().forEach(element => {\n            if (element.BHasClass('selected')) {\n                aSelectedItems.push(element.Data().index);\n            }\n        });\n        elItemContainer.RemoveAndDeleteChildren();\n        const arrItemIds = objStore ? Object.values(objStore.items) : ['-', '-', '-', '-'];\n        for (let i = 0; i < arrItemIds.length; i++) {\n            _CreateItemPanel(arrItemIds[i], i, bFirstTime, claimedItemId);\n        }\n        _UpdateAllItemStyles();\n        elItemContainer.Children().forEach((element, idx) => {\n            if (claimedItemId) {\n                aSelectedItems.forEach(selectedIndex => {\n                    if (idx === selectedIndex) {\n                        element.TriggerClass('reveal-anim');\n                        $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.gift_claim', '');\n                    }\n                });\n            }\n        });\n    }\n    function _UpdateTime() {\n        let secRemaining = StoreAPI.GetSecondsUntilXpRollover();\n        $.GetContextPanel().SetDialogVariable('time-to-week-rollover', (secRemaining > 0) ? FormatText.SecondsToSignificantTimeString(secRemaining) : '');\n        const xpBonuses = MyPersonaAPI.GetActiveXpBonuses();\n        const bEligibleForCarePackage = xpBonuses.split(',').includes('2');\n        if (bEligibleForCarePackage) {\n            $.GetContextPanel().SetDialogVariable('frame-desc-text', $.Localize('#rankup_redemption_store_refresh', $.GetContextPanel()));\n        }\n        else {\n            $.GetContextPanel().SetDialogVariable('frame-desc-text', $.Localize('#rankup_redemption_store_rollover_wait', $.GetContextPanel()));\n        }\n        m_schTimer = $.Schedule(30, _UpdateTime);\n    }\n    function _UpdateStoreState() {\n        const objStore = GetPersonalStore();\n        m_redeemableBalance = objStore ? objStore.redeemable_balance : 0;\n        const elClaimButton = $.GetContextPanel().FindChildTraverse('jsRrsClaimButton');\n        elClaimButton.enabled = m_redeemableBalance !== 0;\n        elClaimButton.SetHasClass('hide', m_redeemableBalance === 0);\n        if (m_redeemableBalance <= 0) {\n            _CloseStore(objStore ? true : false);\n        }\n        else {\n            _EnableStore();\n        }\n        _SetXpProgress();\n        _UpdateTime();\n    }\n    function OnItemCustomization(numericType, type, itemid) {\n        if (type !== 'free_reward_redeemed')\n            return;\n        if (m_timeoutScheduleHandle) {\n            $.CancelScheduled(m_timeoutScheduleHandle);\n            m_timeoutScheduleHandle = null;\n        }\n        const objStore = GetPersonalStore();\n        m_redeemableBalance = objStore ? objStore.redeemable_balance : 0;\n        CheckForPopulateItems(false, itemid);\n        if (ItemInfo.IsPet(itemid)) {\n            let myContextPanel = $.GetContextPanel();\n            function DiscoverPanels() {\n                if (!myContextPanel || !myContextPanel.IsValid())\n                    return [];\n                let elMainMenu = myContextPanel.Data().elMainMenu;\n                let elPopupRoot = myContextPanel;\n                if (!elMainMenu) {\n                    elMainMenu = myContextPanel;\n                    for (;;) {\n                        let elParent = elMainMenu.GetParent();\n                        if (elParent && elParent.IsValid()) {\n                            if (elParent.Data().elMainMenu) {\n                                elMainMenu = elParent.Data().elMainMenu;\n                                elPopupRoot = elParent;\n                                break;\n                            }\n                            elMainMenu = elParent;\n                            if (elMainMenu.id === 'MainMenu')\n                                break;\n                        }\n                        else\n                            break;\n                    }\n                }\n                if (!elMainMenu) {\n                    return [];\n                }\n                let btnHome = elMainMenu.FindChildInLayoutFile('MainMenuNavBarHome');\n                if (!btnHome) {\n                    return [];\n                }\n                let elPetInfoPanel = elMainMenu.FindChildInLayoutFile('id-mainmenu-pet-info');\n                let elZoomInBtn = elPetInfoPanel ? elPetInfoPanel.FindChildInLayoutFile('id-zoom-in-pet') : undefined;\n                let elCloseBtn = (elPopupRoot && (elPopupRoot != myContextPanel))\n                    ? elPopupRoot.FindChildInLayoutFile('PopupRankUpRedemptionStoreClose')\n                    : undefined;\n                return [btnHome, elZoomInBtn, elPopupRoot, elCloseBtn];\n            }\n            function ClickToMainMenuAndZoomIn(arrParamPanels) {\n                if (!SessionUtil.BCanUseMyPetInCurrentLobby())\n                    return;\n                let arrPanels = arrParamPanels ?? DiscoverPanels();\n                if (arrPanels.length == 4 && arrPanels[0] && arrPanels[1]) {\n                    $.DispatchEvent(\"Activated\", arrPanels[0], \"mouse\");\n                    $.DispatchEvent(\"Activated\", arrPanels[1], \"mouse\");\n                    if (myContextPanel.Data().schPendingZoom) {\n                        $.CancelScheduled(myContextPanel.Data().schPendingZoom);\n                        delete myContextPanel.Data().schPendingZoom;\n                    }\n                }\n            }\n            {\n                let arrPanels = DiscoverPanels();\n                if (arrPanels.length == 4 && arrPanels[2] && arrPanels[3]) {\n                    arrPanels[2].Data().fnPopupRankUpRedemptionStoreOnClose = ClickToMainMenuAndZoomIn.bind(null);\n                }\n                if (!SessionUtil.BCanUseMyPetInCurrentLobby()) {\n                    LobbyAPI.CloseSession();\n                }\n            }\n            myContextPanel.Data().schPendingZoom = $.Schedule(2.0, () => {\n                let arrPanels = DiscoverPanels();\n                if (arrPanels.length == 4 && arrPanels[2] && arrPanels[3]) {\n                    $.DispatchEvent(\"Activated\", arrPanels[3], \"mouse\");\n                }\n                else {\n                    ClickToMainMenuAndZoomIn(arrPanels);\n                }\n            });\n        }\n    }\n    function OnInventoryUpdated() {\n        _UpdateStoreState();\n        CheckForPopulateItems();\n    }\n    function _GetSelectedItems() {\n        let arrItems = [];\n        const elItemContainer = $.GetContextPanel().FindChildTraverse('jsRrsItemContainer');\n        for (let panel of elItemContainer.Children()) {\n            if (panel.BHasClass('selected')) {\n                arrItems.push({ item_id: panel.Data().itemid, cost: panel.Data().cost });\n            }\n        }\n        return arrItems;\n    }\n    function _CalcPendingBalance() {\n        return _GetSelectedItems().reduce((sum, item) => sum + item.cost, 0);\n    }\n    function _OnItemSelected(elPanel) {\n        const elItemContainer = $.GetContextPanel().FindChildTraverse('jsRrsItemContainer');\n        let aItemIds = _GetSelectedItems();\n        if ((_CalcPendingBalance() + elPanel.Data().cost) <= m_redeemableBalance) {\n            elPanel.SetHasClass('selected', !elPanel.BHasClass('selected'));\n            if (!elPanel.BHasClass('selected')) {\n                $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.gift_select', 'MOUSE');\n            }\n            else {\n                $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.gift_deselect', 'MOUSE');\n            }\n        }\n        else {\n            if (aItemIds.find(element => element.item_id === elPanel.Data().itemid)) {\n                elPanel.SetHasClass('selected', !elPanel.BHasClass('selected'));\n                if (!elPanel.BHasClass('selected')) {\n                    $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.gift_select', 'MOUSE');\n                }\n                else {\n                    $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.gift_deselect', 'MOUSE');\n                }\n            }\n        }\n        for (let element of elItemContainer.Children()) {\n            const bCantAffordClicked = !elPanel.BHasClass('selected') && _CalcPendingBalance() + elPanel.Data().cost > m_redeemableBalance;\n            if (bCantAffordClicked) {\n                if (element.BHasClass('selected')) {\n                    element.TriggerClass('pulse-me');\n                    $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.buymenu_failure', 'MOUSE');\n                }\n            }\n        }\n        _UpdateAllItemStyles();\n    }\n    function _UpdateAllItemStyles() {\n        const elItemContainer = $.GetContextPanel().FindChildTraverse('jsRrsItemContainer');\n        for (let element of elItemContainer.Children()) {\n            const bCantAfford = !element.BHasClass('selected') && !element.BHasClass('item-claimed') && _CalcPendingBalance() + element.Data().cost > m_redeemableBalance;\n            element.SetHasClass('cant-afford', bCantAfford);\n            element.SetHasClass('disabled', bCantAfford || element.BHasClass('item-claimed'));\n        }\n    }\n    function _CloseStore(bHasStore) {\n        _EnableDisableStorePanels(false);\n        $.GetContextPanel().AddClass('store-closed');\n        if (bHasStore) {\n            $.GetContextPanel().SetDialogVariable('frame-badge-text', $.Localize('#rankup_redemption_store_closed', $.GetContextPanel()));\n        }\n        else {\n            $.GetContextPanel().SetDialogVariable('frame-badge-text', $.Localize('#rankup_redemption_store_earn_xp', $.GetContextPanel()));\n        }\n    }\n    function _EnableStore() {\n        $.GetContextPanel().RemoveClass('waiting');\n        $.GetContextPanel().RemoveClass('store-closed');\n        $.GetContextPanel().SetDialogVariableInt('redeemable_balance', m_redeemableBalance);\n        $.GetContextPanel().SetDialogVariable('frame-badge-text', $.Localize('#rankup_redemption_store_directive', $.GetContextPanel()));\n        _EnableDisableStorePanels(true);\n    }\n    function _EnableDisableStorePanels(enableStore) {\n        $.GetContextPanel().Children().forEach(elPanel => {\n            elPanel.enabled = enableStore;\n        });\n        const elItemContainer = $.GetContextPanel().FindChildTraverse('jsRrsItemContainer');\n        for (let panel of elItemContainer.Children()) {\n            panel.hittest = enableStore;\n            panel.hittestchildren = enableStore;\n        }\n    }\n    function _PulseItems() {\n        const elItemContainer = $.GetContextPanel().FindChildTraverse('jsRrsItemContainer');\n        for (let panel of elItemContainer.Children()) {\n            if (!panel.BHasClass('item-claimed')) {\n                panel.TriggerClass('pulse-me');\n                $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.buymenu_failure', 'MOUSE');\n            }\n        }\n    }\n    function OnRedeem() {\n        const numSelected = _GetSelectedItems().length;\n        if (numSelected === 0) {\n            _PulseItems();\n            return;\n        }\n        InventoryAPI.SetInventorySortAndFilters('inv_sort_age', false, 'only_econ_items', '', '');\n        if (InventoryAPI.GetInventoryCount() + numSelected > ItemInfo.NUM_BACKPACK_SLOTS) {\n            UiToolkitAPI.ShowGenericPopupOk($.Localize('#popup_casket_title_error_casket_inv_full'), $.Localize('#SFUI_InventoryFull_Error'), '', () => { });\n            return;\n        }\n        let szItemList = _GetSelectedItems().map(item => item.item_id).join(',');\n        StoreAPI.StoreRedeemFreeRewards(szItemList);\n        $.GetContextPanel().AddClass('waiting');\n        _EnableDisableStorePanels(true);\n        m_timeoutScheduleHandle = $.Schedule(10, _RedemptionTimedOut);\n    }\n    RankUpRedemptionStore.OnRedeem = OnRedeem;\n    function _RedemptionTimedOut() {\n        m_timeoutScheduleHandle = null;\n        UiToolkitAPI.ShowGenericPopup($.Localize('#rankup_redemption_store_timeout_title'), $.Localize('#rankup_redemption_store_timeout_desc'), '');\n        _EnableStore();\n    }\n    function _SetXpProgress() {\n        const currentPoints = FriendsListAPI.GetFriendXp(MyPersonaAPI.GetXuid());\n        const pointsPerLevel = MyPersonaAPI.GetXpPerLevel();\n        let elXpBarInner = $.GetContextPanel().FindChildInLayoutFile('JsPlayerXpBarInner');\n        let percentComplete = (currentPoints / pointsPerLevel) * 100;\n        elXpBarInner.style.width = percentComplete + '%';\n        elXpBarInner.GetParent().visible = true;\n        const xpBonuses = MyPersonaAPI.GetActiveXpBonuses();\n        const bEligibleForCarePackage = xpBonuses.split(',').includes('2');\n        $.GetContextPanel().SetHasClass('care-package-eligible', bEligibleForCarePackage);\n        const currentLvl = FriendsListAPI.GetFriendLevel(MyPersonaAPI.GetXuid());\n        let elRankIcon = $.GetContextPanel().FindChildInLayoutFile('JsPlayerXpIcon');\n        elRankIcon.SetImage('file://{images}/icons/xp/level' + currentLvl + '.png');\n        if (bEligibleForCarePackage) {\n            $.GetContextPanel().SetDialogVariable('frame-desc-text', $.Localize('#rankup_redemption_store_refresh', $.GetContextPanel()));\n        }\n        else {\n            $.GetContextPanel().SetDialogVariable('frame-desc-text', $.Localize('#rankup_redemption_store_rollover_wait', $.GetContextPanel()));\n        }\n    }\n    {\n        $.GetContextPanel().RegisterForReadyEvents(true);\n        RegisterForInventoryUpdate();\n    }\n})(RankUpRedemptionStore || (RankUpRedemptionStore = {}));\n","scripts/rank_skillgroup_particles.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\nvar RankSkillgroupParticles;\n(function (RankSkillgroupParticles) {\n    function GetRankParticleSettings(nRank) {\n        let sParticlelevel1 = 'particles/ui/status_levels/ui_status_level_1.vpcf';\n        let sParticlelevel2 = 'particles/ui/status_levels/ui_status_level_2.vpcf';\n        let sParticlelevel3 = 'particles/ui/status_levels/ui_status_level_3.vpcf';\n        let sParticlelevel4 = 'particles/ui/status_levels/ui_status_level_4.vpcf';\n        let sParticlelevel5 = 'particles/ui/status_levels/ui_status_level_5.vpcf';\n        let sParticlelevel6 = 'particles/ui/status_levels/ui_status_level_6.vpcf';\n        let sParticlelevel7 = 'particles/ui/status_levels/ui_status_level_7.vpcf';\n        let sParticlelevel8 = 'particles/ui/status_levels/ui_status_level_8.vpcf';\n        let aRank = [\n            { particleName: sParticlelevel1, cpNumber: 3, cpValue: [0, 1, 1], playEndcap: false },\n            { particleName: sParticlelevel1, cpNumber: 3, cpValue: [1, 1, 1], playEndcap: false },\n            { particleName: sParticlelevel1, cpNumber: 3, cpValue: [2, 2, 1], playEndcap: false },\n            { particleName: sParticlelevel1, cpNumber: 3, cpValue: [3, 3, 1], playEndcap: false },\n            { particleName: sParticlelevel1, cpNumber: 3, cpValue: [4, 4, 1], playEndcap: false },\n            { particleName: sParticlelevel2, cpNumber: 3, cpValue: [5, 5, 1], playEndcap: false },\n            { particleName: sParticlelevel2, cpNumber: 3, cpValue: [1, 6, 1], playEndcap: false },\n            { particleName: sParticlelevel2, cpNumber: 3, cpValue: [2, 7, 1], playEndcap: false },\n            { particleName: sParticlelevel2, cpNumber: 3, cpValue: [3, 8, 1], playEndcap: false },\n            { particleName: sParticlelevel2, cpNumber: 3, cpValue: [4, 9, 1], playEndcap: false },\n            { particleName: sParticlelevel2, cpNumber: 3, cpValue: [5, 10, 1], playEndcap: false },\n            { particleName: sParticlelevel3, cpNumber: 3, cpValue: [1, 11, 1], playEndcap: false },\n            { particleName: sParticlelevel3, cpNumber: 3, cpValue: [2, 12, 1], playEndcap: false },\n            { particleName: sParticlelevel3, cpNumber: 3, cpValue: [3, 13, 1], playEndcap: false },\n            { particleName: sParticlelevel3, cpNumber: 3, cpValue: [4, 14, 1], playEndcap: false },\n            { particleName: sParticlelevel3, cpNumber: 3, cpValue: [5, 15, 1], playEndcap: false },\n            { particleName: sParticlelevel4, cpNumber: 3, cpValue: [1, 16, 1], playEndcap: false },\n            { particleName: sParticlelevel4, cpNumber: 3, cpValue: [2, 17, 1], playEndcap: false },\n            { particleName: sParticlelevel4, cpNumber: 3, cpValue: [3, 18, 1], playEndcap: false },\n            { particleName: sParticlelevel4, cpNumber: 3, cpValue: [4, 19, 1], playEndcap: false },\n            { particleName: sParticlelevel4, cpNumber: 3, cpValue: [5, 20, 1], playEndcap: false },\n            { particleName: sParticlelevel5, cpNumber: 3, cpValue: [1, 21, 1], playEndcap: false },\n            { particleName: sParticlelevel5, cpNumber: 3, cpValue: [2, 22, 1], playEndcap: false },\n            { particleName: sParticlelevel5, cpNumber: 3, cpValue: [3, 23, 1], playEndcap: false },\n            { particleName: sParticlelevel5, cpNumber: 3, cpValue: [4, 24, 1], playEndcap: false },\n            { particleName: sParticlelevel5, cpNumber: 3, cpValue: [5, 25, 1], playEndcap: false },\n            { particleName: sParticlelevel6, cpNumber: 3, cpValue: [1, 26, 1], playEndcap: false },\n            { particleName: sParticlelevel6, cpNumber: 3, cpValue: [2, 27, 1], playEndcap: false },\n            { particleName: sParticlelevel6, cpNumber: 3, cpValue: [3, 28, 1], playEndcap: false },\n            { particleName: sParticlelevel6, cpNumber: 3, cpValue: [4, 29, 1], playEndcap: false },\n            { particleName: sParticlelevel6, cpNumber: 3, cpValue: [5, 30, 1], playEndcap: false },\n            { particleName: sParticlelevel7, cpNumber: 3, cpValue: [1, 31, 1], playEndcap: false },\n            { particleName: sParticlelevel7, cpNumber: 3, cpValue: [2, 32, 1], playEndcap: false },\n            { particleName: sParticlelevel7, cpNumber: 3, cpValue: [3, 33, 1], playEndcap: false },\n            { particleName: sParticlelevel7, cpNumber: 3, cpValue: [4, 34, 1], playEndcap: false },\n            { particleName: sParticlelevel8, cpNumber: 3, cpValue: [0, 35, 1], playEndcap: false },\n            { particleName: sParticlelevel8, cpNumber: 3, cpValue: [1, 36, 1], playEndcap: false },\n            { particleName: sParticlelevel8, cpNumber: 3, cpValue: [2, 37, 1], playEndcap: false },\n            { particleName: sParticlelevel8, cpNumber: 3, cpValue: [3, 38, 1], playEndcap: false },\n            { particleName: sParticlelevel8, cpNumber: 3, cpValue: [4, 39, 1], playEndcap: false },\n            { particleName: sParticlelevel8, cpNumber: 3, cpValue: [5, 40, 1], playEndcap: false },\n        ];\n        return aRank[nRank];\n    }\n    RankSkillgroupParticles.GetRankParticleSettings = GetRankParticleSettings;\n    function GetSkillGroupSettings(nSkillGroup, SkillGroupType) {\n        let sParticlelevel0 = 'particles/ui/skillgroups/ui_skillgroup_1.vpcf';\n        let sParticlelevel1 = 'particles/ui/skillgroups/ui_skillgroup_1.vpcf';\n        let sParticlelevel2 = 'particles/ui/skillgroups/ui_skillgroup_2.vpcf';\n        let sParticlelevel3 = 'particles/ui/skillgroups/ui_skillgroup_3.vpcf';\n        let sParticlelevel4 = 'particles/ui/skillgroups/ui_skillgroup_4.vpcf';\n        let sParticlelevel5 = 'particles/ui/skillgroups/ui_skillgroup_5.vpcf';\n        let sParticlelevel6 = 'particles/ui/skillgroups/ui_skillgroup_6.vpcf';\n        let sParticlelevel7 = 'particles/ui/skillgroups/ui_skillgroup_7.vpcf';\n        let sParticlelevel8 = 'particles/ui/skillgroups/ui_skillgroup_8.vpcf';\n        let sParticlelevel9 = 'particles/ui/skillgroups/ui_skillgroup_9.vpcf';\n        let sParticlelevel10 = 'particles/ui/skillgroups/ui_skillgroup_10.vpcf';\n        let sParticlelevel11 = 'particles/ui/skillgroups/ui_skillgroup_11.vpcf';\n        let sParticlelevel12 = 'particles/ui/skillgroups/ui_skillgroup_12.vpcf';\n        let sParticlelevel13 = 'particles/ui/skillgroups/ui_skillgroup_13.vpcf';\n        let sParticlelevel14 = 'particles/ui/skillgroups/ui_skillgroup_14.vpcf';\n        let sParticlelevel15 = 'particles/ui/skillgroups/ui_skillgroup_15.vpcf';\n        let sParticlelevel16 = 'particles/ui/skillgroups/ui_skillgroup_16.vpcf';\n        let sParticlelevel17 = 'particles/ui/skillgroups/ui_skillgroup_17.vpcf';\n        let sParticlelevel18 = 'particles/ui/skillgroups/ui_skillgroup_18.vpcf';\n        if (SkillGroupType === 'Wingman') {\n            sParticlelevel0 = 'particles/ui/skillgroups/ui_skillgroup_wingman_0.vpcf';\n            sParticlelevel1 = 'particles/ui/skillgroups/ui_skillgroup_wingman_1.vpcf';\n            sParticlelevel2 = 'particles/ui/skillgroups/ui_skillgroup_wingman_2.vpcf';\n            sParticlelevel3 = 'particles/ui/skillgroups/ui_skillgroup_wingman_3.vpcf';\n            sParticlelevel4 = 'particles/ui/skillgroups/ui_skillgroup_wingman_4.vpcf';\n            sParticlelevel5 = 'particles/ui/skillgroups/ui_skillgroup_wingman_5.vpcf';\n            sParticlelevel6 = 'particles/ui/skillgroups/ui_skillgroup_wingman_6.vpcf';\n            sParticlelevel7 = 'particles/ui/skillgroups/ui_skillgroup_wingman_7.vpcf';\n            sParticlelevel8 = 'particles/ui/skillgroups/ui_skillgroup_wingman_8.vpcf';\n            sParticlelevel9 = 'particles/ui/skillgroups/ui_skillgroup_wingman_9.vpcf';\n            sParticlelevel10 = 'particles/ui/skillgroups/ui_skillgroup_wingman_10.vpcf';\n            sParticlelevel11 = 'particles/ui/skillgroups/ui_skillgroup_wingman_11.vpcf';\n            sParticlelevel12 = 'particles/ui/skillgroups/ui_skillgroup_wingman_12.vpcf';\n            sParticlelevel13 = 'particles/ui/skillgroups/ui_skillgroup_wingman_13.vpcf';\n            sParticlelevel14 = 'particles/ui/skillgroups/ui_skillgroup_wingman_14.vpcf';\n            sParticlelevel15 = 'particles/ui/skillgroups/ui_skillgroup_wingman_15.vpcf';\n            sParticlelevel16 = 'particles/ui/skillgroups/ui_skillgroup_wingman_16.vpcf';\n            sParticlelevel17 = 'particles/ui/skillgroups/ui_skillgroup_wingman_17.vpcf';\n            sParticlelevel18 = 'particles/ui/skillgroups/ui_skillgroup_wingman_18.vpcf';\n        }\n        else if (SkillGroupType === 'Premier') {\n            sParticlelevel0 = 'particles/dev/empty.vpcf';\n            sParticlelevel1 = 'particles/dev/empty.vpcf';\n            sParticlelevel2 = 'particles/dev/empty.vpcf';\n            sParticlelevel3 = 'particles/dev/empty.vpcf';\n            sParticlelevel4 = 'particles/dev/empty.vpcf';\n            sParticlelevel5 = 'particles/dev/empty.vpcf';\n            sParticlelevel6 = 'particles/dev/empty.vpcf';\n            sParticlelevel7 = 'particles/dev/empty.vpcf';\n            sParticlelevel8 = 'particles/dev/empty.vpcf';\n            sParticlelevel9 = 'particles/dev/empty.vpcf';\n            sParticlelevel10 = 'particles/dev/empty.vpcf';\n            sParticlelevel11 = 'particles/dev/empty.vpcf';\n            sParticlelevel12 = 'particles/dev/empty.vpcf';\n            sParticlelevel13 = 'particles/dev/empty.vpcf';\n            sParticlelevel14 = 'particles/dev/empty.vpcf';\n            sParticlelevel15 = 'particles/dev/empty.vpcf';\n            sParticlelevel16 = 'particles/dev/empty.vpcf';\n            sParticlelevel17 = 'particles/dev/empty.vpcf';\n            sParticlelevel18 = 'particles/dev/empty.vpcf';\n        }\n        let aSkillGroup = [\n            { particleName: sParticlelevel0, cpNumber: 3, cpValue: [1, 0, 1], playEndcap: false },\n            { particleName: sParticlelevel1, cpNumber: 3, cpValue: [1, 1, 1], playEndcap: false },\n            { particleName: sParticlelevel2, cpNumber: 3, cpValue: [2, 2, 1], playEndcap: false },\n            { particleName: sParticlelevel3, cpNumber: 3, cpValue: [3, 3, 1], playEndcap: false },\n            { particleName: sParticlelevel4, cpNumber: 3, cpValue: [4, 4, 1], playEndcap: false },\n            { particleName: sParticlelevel5, cpNumber: 3, cpValue: [5, 5, 1], playEndcap: false },\n            { particleName: sParticlelevel6, cpNumber: 3, cpValue: [6, 6, 1], playEndcap: false },\n            { particleName: sParticlelevel7, cpNumber: 3, cpValue: [7, 7, 1], playEndcap: false },\n            { particleName: sParticlelevel8, cpNumber: 3, cpValue: [1, 8, 1], playEndcap: false },\n            { particleName: sParticlelevel9, cpNumber: 3, cpValue: [2, 9, 1], playEndcap: false },\n            { particleName: sParticlelevel10, cpNumber: 3, cpValue: [3, 10, 1], playEndcap: false },\n            { particleName: sParticlelevel11, cpNumber: 3, cpValue: [4, 11, 1], playEndcap: false },\n            { particleName: sParticlelevel12, cpNumber: 3, cpValue: [6, 12, 1], playEndcap: false },\n            { particleName: sParticlelevel13, cpNumber: 3, cpValue: [6, 13, 1], playEndcap: false },\n            { particleName: sParticlelevel14, cpNumber: 3, cpValue: [6, 14, 1], playEndcap: false },\n            { particleName: sParticlelevel15, cpNumber: 3, cpValue: [6, 15, 1], playEndcap: false },\n            { particleName: sParticlelevel16, cpNumber: 3, cpValue: [6, 16, 1], playEndcap: false },\n            { particleName: sParticlelevel17, cpNumber: 3, cpValue: [6, 17, 1], playEndcap: false },\n            { particleName: sParticlelevel18, cpNumber: 3, cpValue: [6, 18, 1], playEndcap: false },\n            { particleName: sParticlelevel18, cpNumber: 3, cpValue: [6, 19, 1], playEndcap: false },\n        ];\n        return aSkillGroup[Math.min(nSkillGroup, aSkillGroup.length - 1)];\n    }\n    RankSkillgroupParticles.GetSkillGroupSettings = GetSkillGroupSettings;\n    function GetSkillGroupAmbientSettings(nSkillGroup, SkillGroupType) {\n        let sParticlelevel0 = 'particles/ui/skillgroups/ui_skillgroup_rear_1.vpcf';\n        let sParticlelevel1 = 'particles/ui/skillgroups/ui_skillgroup_rear_1.vpcf';\n        let sParticlelevel2 = 'particles/ui/skillgroups/ui_skillgroup_rear_2.vpcf';\n        let sParticlelevel3 = 'particles/ui/skillgroups/ui_skillgroup_rear_3.vpcf';\n        let sParticlelevel4 = 'particles/ui/skillgroups/ui_skillgroup_rear_4.vpcf';\n        let sParticlelevel5 = 'particles/ui/skillgroups/ui_skillgroup_rear_5.vpcf';\n        if (SkillGroupType === 'Wingman') {\n            sParticlelevel0 = 'particles/ui/skillgroups/ui_skillgroup_wingman_rear_1.vpcf';\n            sParticlelevel1 = 'particles/ui/skillgroups/ui_skillgroup_wingman_rear_1.vpcf';\n            sParticlelevel2 = 'particles/ui/skillgroups/ui_skillgroup_wingman_rear_2.vpcf';\n            sParticlelevel3 = 'particles/ui/skillgroups/ui_skillgroup_wingman_rear_3.vpcf';\n            sParticlelevel4 = 'particles/ui/skillgroups/ui_skillgroup_wingman_rear_4.vpcf';\n            sParticlelevel5 = 'particles/ui/skillgroups/ui_skillgroup_wingman_rear_5.vpcf';\n        }\n        else if (SkillGroupType === 'Premier') {\n            sParticlelevel0 = 'particles/dev/empty.vpcf';\n            sParticlelevel1 = 'particles/dev/empty.vpcf';\n            sParticlelevel2 = 'particles/dev/empty.vpcf';\n            sParticlelevel3 = 'particles/dev/empty.vpcf';\n            sParticlelevel4 = 'particles/dev/empty.vpcf';\n            sParticlelevel5 = 'particles/dev/empty.vpcf';\n        }\n        let aSkillGroup = [\n            { particleName: sParticlelevel0, cpNumber: 3, cpValue: [1, 0, 1], playEndcap: false },\n            { particleName: sParticlelevel1, cpNumber: 3, cpValue: [1, 1, 1], playEndcap: false },\n            { particleName: sParticlelevel1, cpNumber: 3, cpValue: [2, 2, 1], playEndcap: false },\n            { particleName: sParticlelevel1, cpNumber: 3, cpValue: [3, 3, 1], playEndcap: false },\n            { particleName: sParticlelevel1, cpNumber: 3, cpValue: [4, 4, 1], playEndcap: false },\n            { particleName: sParticlelevel1, cpNumber: 3, cpValue: [5, 5, 1], playEndcap: false },\n            { particleName: sParticlelevel1, cpNumber: 3, cpValue: [6, 6, 1], playEndcap: false },\n            { particleName: sParticlelevel2, cpNumber: 3, cpValue: [1, 7, 1], playEndcap: false },\n            { particleName: sParticlelevel2, cpNumber: 3, cpValue: [2, 8, 1], playEndcap: false },\n            { particleName: sParticlelevel2, cpNumber: 3, cpValue: [3, 9, 1], playEndcap: false },\n            { particleName: sParticlelevel3, cpNumber: 3, cpValue: [4, 10, 1], playEndcap: false },\n            { particleName: sParticlelevel3, cpNumber: 3, cpValue: [5, 11, 1], playEndcap: false },\n            { particleName: sParticlelevel4, cpNumber: 3, cpValue: [1, 12, 1], playEndcap: false },\n            { particleName: sParticlelevel4, cpNumber: 3, cpValue: [2, 13, 1], playEndcap: false },\n            { particleName: sParticlelevel4, cpNumber: 3, cpValue: [3, 14, 1], playEndcap: false },\n            { particleName: sParticlelevel5, cpNumber: 3, cpValue: [1, 15, 1], playEndcap: false },\n            { particleName: sParticlelevel5, cpNumber: 3, cpValue: [2, 16, 1], playEndcap: false },\n            { particleName: sParticlelevel5, cpNumber: 3, cpValue: [6, 17, 1], playEndcap: false },\n            { particleName: sParticlelevel5, cpNumber: 3, cpValue: [1, 18, 1], playEndcap: false },\n            { particleName: sParticlelevel5, cpNumber: 3, cpValue: [2, 19, 1], playEndcap: false },\n        ];\n        return aSkillGroup[Math.min(nSkillGroup, aSkillGroup.length - 1)];\n    }\n    RankSkillgroupParticles.GetSkillGroupAmbientSettings = GetSkillGroupAmbientSettings;\n})(RankSkillgroupParticles || (RankSkillgroupParticles = {}));\n","scripts/rating_emblem.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"digitpanel.ts\" />\n/// <reference path=\"common/sessionutil.ts\" />\n$.LogChannel('p.rating', \"LV_OFF\");\nvar RatingEmblem;\n(function (RatingEmblem) {\n    function _GetMainPanel(root_panel) {\n        if (root_panel &&\n            root_panel.IsValid() &&\n            root_panel.FindChildTraverse('jsPremierRating') &&\n            root_panel.FindChildTraverse('jsPremierRating').IsValid()) {\n            return root_panel.FindChildTraverse('jsPremierRating').GetParent();\n        }\n        else {\n            return null;\n        }\n    }\n    function GetRatingDesc(root_panel) {\n        let elMain = _GetMainPanel(root_panel);\n        return elMain ? elMain.Data().ratingDesc : '';\n    }\n    RatingEmblem.GetRatingDesc = GetRatingDesc;\n    function GetTooltipText(root_panel) {\n        let elMain = _GetMainPanel(root_panel);\n        return elMain ? elMain.Data().tooltipText : '';\n    }\n    RatingEmblem.GetTooltipText = GetTooltipText;\n    function GetTierColorClass(root_panel) {\n        let elMain = _GetMainPanel(root_panel);\n        return elMain ? elMain.Data().colorClassName : '';\n    }\n    RatingEmblem.GetTierColorClass = GetTierColorClass;\n    function GetEomDescText(root_panel) {\n        let elMain = _GetMainPanel(root_panel);\n        return elMain ? elMain.Data().eomDescText : '';\n    }\n    RatingEmblem.GetEomDescText = GetEomDescText;\n    function GetIntroText(root_panel) {\n        let elMain = _GetMainPanel(root_panel);\n        return elMain ? elMain.Data().introText : '';\n    }\n    RatingEmblem.GetIntroText = GetIntroText;\n    function GetWinCountString(root_panel) {\n        let elMain = _GetMainPanel(root_panel);\n        return elMain ? elMain.Data().winCountText : '';\n    }\n    RatingEmblem.GetWinCountString = GetWinCountString;\n    function GetPromotionState(root_panel) {\n        let elMain = _GetMainPanel(root_panel);\n        return elMain ? elMain.Data().promotionState : '';\n    }\n    RatingEmblem.GetPromotionState = GetPromotionState;\n    function SetXuid(options) {\n        let rating = undefined;\n        let wins = undefined;\n        let rank = undefined;\n        let pct = undefined;\n        let bFullDetails = options.hasOwnProperty('full_details') ? options.full_details : false;\n        let do_fx = options.do_fx;\n        let rating_type = options.rating_type;\n        let root_panel = _GetMainPanel(options.root_panel);\n        if (!root_panel)\n            return false;\n        let debug_wins = false;\n        if (debug_wins) {\n            wins = Math.floor(Math.random() * 20);\n        }\n        rating = options.leaderboard_details.score;\n        wins = options.leaderboard_details.matchesWon;\n        rank = options.leaderboard_details.rank;\n        pct = options.leaderboard_details.pct;\n        root_panel.SwitchClass('type', rating_type);\n        if (bFullDetails) {\n            root_panel.SetDialogVariable('rating_type', rating_type);\n        }\n        let elSkillGroupImage = null;\n        let imagePath = '';\n        let winsNeededForRank = SessionUtil ? SessionUtil.GetNumWinsNeededForRank(rating_type) : 10;\n        let isloading = (rating === undefined || rating < 0);\n        let bRatingExpired = !isloading && rating === 0;\n        let bTooFewWins = wins === undefined || wins < winsNeededForRank;\n        let bHasRating = !bRatingExpired && !bTooFewWins && !isloading;\n        let ratingDesc = '';\n        let tooltipText = '';\n        let eomDescText = '';\n        let tooltipExtraText = '';\n        let colorClassName = '';\n        let introText = '';\n        let promotionState = '';\n        let winCountText = '';\n        if (!wins || wins < 0) {\n            wins = 0;\n        }\n        if (isloading) {\n            ratingDesc = $.Localize('#SFUI_LOADING');\n        }\n        root_panel.SetDialogVariableInt(\"wins\", wins);\n        if (rating_type === 'Wingman' || rating_type === 'Competitive') {\n            elSkillGroupImage = root_panel.FindChildTraverse('jsRating-' + rating_type);\n            let locTypeModifer = rating_type === 'Competitive' ? '' : rating_type.toLowerCase();\n            imagePath = locTypeModifer !== '' ? locTypeModifer : 'skillgroup';\n            const elCompWinsNeeded = root_panel.FindChildTraverse('jsRating-CompetitiveWinsNeeded');\n            elCompWinsNeeded.visible = !isloading && bTooFewWins && options.local_player;\n            if (bTooFewWins || isloading) {\n                elSkillGroupImage.SetImage('file://{images}/icons/skillgroups/' + imagePath + '_none.svg');\n                if (!isloading && options.local_player) {\n                    const winsneeded = Math.max(0, winsNeededForRank - wins);\n                    elSkillGroupImage.SetDialogVariableInt('wins', wins);\n                    elSkillGroupImage.SetDialogVariableInt('wins-needed', winsneeded);\n                    if (bFullDetails) {\n                        ratingDesc = $.Localize('#skillgroup_0' + locTypeModifer);\n                        root_panel.SetDialogVariableInt(\"winsneeded\", winsneeded);\n                        tooltipText = $.Localize('#tooltip_skill_group_none' + imagePath + ':f', root_panel);\n                    }\n                }\n            }\n            else if (bRatingExpired) {\n                elSkillGroupImage.SetImage('file://{images}/icons/skillgroups/' + imagePath + '_expired.svg');\n                if (bFullDetails) {\n                    ratingDesc = $.Localize('#skillgroup_expired' + locTypeModifer);\n                    tooltipText = $.Localize('#tooltip_skill_group_expired' + locTypeModifer);\n                }\n            }\n            else {\n                elSkillGroupImage.SetImage('file://{images}/icons/skillgroups/' + imagePath + rating + '.svg');\n                if (bFullDetails) {\n                    ratingDesc = $.Localize('#skillgroup_' + rating);\n                    tooltipText = $.Localize('#tooltip_skill_group_generic' + locTypeModifer);\n                }\n            }\n        }\n        else if (rating_type === 'Premier') {\n            let elPremierRating = root_panel.FindChildTraverse('jsPremierRating');\n            let presentation = options.presentation ? options.presentation : 'simple';\n            root_panel.FindChildTraverse('JsSimpleNumbers').visible = presentation === 'simple';\n            root_panel.FindChildTraverse('JsDigitPanels').visible = presentation === 'digital';\n            let majorRating = '';\n            let minorRating = '';\n            root_panel.SwitchClass('tier', 'tier-0');\n            _SetPremierBackgroundImage(root_panel, rating);\n            if (rating && rating > 0) {\n                let clampedRating = GetClampedRating(rating);\n                root_panel.SwitchClass('tier', 'tier-' + clampedRating);\n                colorClassName = 'tier-' + clampedRating;\n                let arrRating = SplitRating(rating);\n                majorRating = arrRating[0];\n                minorRating = arrRating[1];\n                if (do_fx && rating) {\n                    RatingParticleControls.UpdateRatingEffects(elPremierRating, majorRating, minorRating.slice(-3), parseInt(arrRating[2]));\n                }\n                if (bFullDetails) {\n                    if (rank && rank <= LeaderboardsAPI.GetPremierLeaderboardTopBestCount()) {\n                        root_panel.SetDialogVariableInt('rank', rank);\n                        ratingDesc = $.Localize('#cs_rating_rank', root_panel);\n                        eomDescText = ratingDesc;\n                    }\n                    else if (pct) {\n                        root_panel.SetDialogVariable('percentile', pct.toFixed(2) + '');\n                        ratingDesc = $.Localize('#cs_rating_percentile', root_panel);\n                        eomDescText = ratingDesc;\n                    }\n                    else {\n                        ratingDesc = $.Localize('#cs_rating_generic');\n                    }\n                    if (arrRating[2] === '2') {\n                        tooltipExtraText = $.Localize('#cs_rating_relegation_nextmatch');\n                        introText = $.Localize('#cs_rating_relegation_match');\n                        eomDescText = $.Localize('#cs_rating_relegation_nextmatch');\n                        ratingDesc = $.Localize('#cs_rating_relegation_nextmatch');\n                        promotionState = 'relegation';\n                    }\n                    else if (arrRating[2] === '1') {\n                        tooltipExtraText = $.Localize('#cs_rating_promotion_nextmatch');\n                        introText = $.Localize('#cs_rating_promotion_match');\n                        eomDescText = $.Localize('#cs_rating_promotion_nextmatch');\n                        ratingDesc = $.Localize('#cs_rating_promotion_nextmatch');\n                        promotionState = 'promotion';\n                    }\n                    tooltipText = $.Localize('#tooltip_cs_rating_generic');\n                }\n            }\n            else {\n                if (bFullDetails) {\n                    if (isloading) {\n                        ratingDesc = $.Localize('#skillgroup_loading');\n                    }\n                    else if (bTooFewWins) {\n                        let winsneeded = (winsNeededForRank - wins);\n                        root_panel.SetDialogVariableInt(\"winsneeded\", winsneeded);\n                        tooltipText = $.Localize('#tooltip_cs_rating_none:f', root_panel);\n                        eomDescText = $.Localize('#cs_rating_wins_needed_verbose:f', root_panel);\n                        introText = $.Localize('#cs_rating_wins_needed_verbose_intro:f', root_panel);\n                        if (options.local_player) {\n                            ratingDesc = $.Localize('#cs_rating_wins_needed:f', root_panel);\n                        }\n                        else {\n                            ratingDesc = $.Localize('#cs_rating_none');\n                        }\n                    }\n                    else if (bRatingExpired) {\n                        ratingDesc = $.Localize('#cs_rating_expired');\n                        tooltipText = $.Localize('#tooltip_cs_rating_expired');\n                        eomDescText = $.Localize('#eom-skillgroup-expired-premier', root_panel);\n                        introText = $.Localize('#eom-skillgroup-expired-premier', root_panel);\n                    }\n                }\n            }\n            _SetEomStyleOverrides(options, root_panel);\n            _SetPremierRatingValue(root_panel, majorRating, minorRating, presentation);\n        }\n        if (bFullDetails) {\n            if (tooltipExtraText !== '') {\n                tooltipText = tooltipText + '<br><br>' + tooltipExtraText;\n            }\n            if (wins) {\n                root_panel.SetDialogVariableInt('wins', wins);\n                let winText = $.Localize('#tooltip_skill_group_wins:f', root_panel);\n                tooltipText = (tooltipText !== '') ? tooltipText + '<br><br>' + winText : winText;\n                winCountText = $.Localize('#wins_count:f', root_panel);\n            }\n            root_panel.Data().ratingDesc = ratingDesc;\n            root_panel.Data().tooltipText = tooltipText;\n            root_panel.Data().colorClassName = colorClassName;\n            root_panel.Data().eomDescText = eomDescText;\n            root_panel.Data().introText = introText;\n            root_panel.Data().promotionState = promotionState;\n            root_panel.Data().winCountText = winCountText;\n        }\n        root_panel.SwitchClass('rating_type', rating_type);\n        return bHasRating;\n    }\n    RatingEmblem.SetXuid = SetXuid;\n    function GetClampedRating(rating) {\n        let remappedRating = Math.floor(rating / 1000.00 / 5);\n        return Math.max(0, Math.min(remappedRating, 6));\n    }\n    RatingEmblem.GetClampedRating = GetClampedRating;\n    function _SetPremierBackgroundImage(root_panel, rating) {\n        let bgImage = (rating && rating > 0) ? 'premier_rating_bg_large.svg' : 'premier_rating_bg_large_none.svg';\n        let elImage = root_panel.FindChildInLayoutFile('jsPremierRatingBg');\n        elImage.SetImage('file://{images}/icons/ui/' + bgImage);\n    }\n    function _SetEomStyleOverrides(options, root_panel) {\n        root_panel.FindChildInLayoutFile('JsDigitPanels').SwitchClass('emblemstyle', options.eom_digipanel_class_override ? options.eom_digipanel_class_override : '');\n    }\n    function _SetPremierRatingValue(root_panel, major, minor, premierPresentation) {\n        root_panel.SetDialogVariable('rating-major', major);\n        root_panel.SetDialogVariable('rating-minor', minor);\n        if (premierPresentation === 'digital') {\n            const elMajor = $.GetContextPanel().FindChildTraverse('jsPremierRatingMajor');\n            const elMinor = $.GetContextPanel().FindChildTraverse('jsPremierRatingMinor');\n            let bFastSet = false;\n            if (!$.GetContextPanel().FindChildTraverse('DigitPanel')) {\n                DigitPanelFactory.MakeDigitPanel(elMajor, 2, '', 1, \"#digitpanel_digits_premier\");\n                DigitPanelFactory.MakeDigitPanel(elMinor, 4, '', 1, \"#digitpanel_digits_premier\");\n                bFastSet = true;\n            }\n            DigitPanelFactory.SetDigitPanelString(elMajor, major, bFastSet);\n            DigitPanelFactory.SetDigitPanelString(elMinor, minor, bFastSet);\n        }\n    }\n    function SplitRating(rating) {\n        let matchType = '0';\n        if (rating === 5000 || rating === 10000 || rating === 15000 ||\n            rating === 20000 || rating === 25000 || rating === 30000)\n            matchType = '2';\n        else if (rating === 5000 - 1 || rating === 10000 - 1 || rating === 15000 - 1 ||\n            rating === 20000 - 1 || rating === 25000 - 1 || rating === 30000 - 1)\n            matchType = '1';\n        rating = rating / 1000.00;\n        let strRating = (String((rating).toFixed(3))).padStart(6, '0');\n        let major = strRating.slice(0, 2);\n        let minor = strRating.slice(-3);\n        major = major.replace(/^00/g, '  ');\n        major = major.replace(/^0/g, ' ');\n        if (major === '  ') {\n            minor = minor.replace(/^00/g, '  ');\n            minor = minor.replace(/^0/g, ' ');\n        }\n        else {\n            minor = ',' + minor;\n        }\n        return [major, minor, matchType];\n    }\n    RatingEmblem.SplitRating = SplitRating;\n})(RatingEmblem || (RatingEmblem = {}));\nvar RatingParticleControls;\n(function (RatingParticleControls) {\n    function GetAllChildren(panel) {\n        const children = panel.Children();\n        return [...children, ...children.flatMap(GetAllChildren)];\n    }\n    function IsParticleScenePanel(panel) {\n        return panel.type === \"ParticleScenePanel\";\n    }\n    function ColorConvert(tier) {\n        let rarityColors = [\n            [\"common\", 176, 195, 217],\n            [\"uncommon\", 94, 152, 217],\n            [\"rare\", 75, 105, 255],\n            [\"mythical\", 136, 71, 255],\n            [\"legendary\", 211, 44, 230],\n            [\"ancient\", 235, 75, 75],\n            [\"unusual\", 255, 215, 0],\n        ];\n        if (tier < 0 || tier >= rarityColors.length)\n            return { R: 0, G: 0, B: 0 };\n        let R = rarityColors[tier][1];\n        let G = rarityColors[tier][2];\n        let B = rarityColors[tier][3];\n        return { R, G, B };\n    }\n    RatingParticleControls.ColorConvert = ColorConvert;\n    function UpdateRatingEffects(panelId, MajorRating, MinorRating, matchType) {\n        const AllPanels = GetAllChildren(panelId);\n        let ratingEffect = [\n            \"particles/ui/premier_ratings_bg.vpcf\",\n            \"particles/ui/premier_ratings_promomatch.vpcf\",\n            \"particles/ui/premier_ratings_relegation.vpcf\"\n        ];\n        let tier = Math.floor(+MajorRating / 5.0);\n        let tierColor = ColorConvert(tier);\n        for (const panel of AllPanels) {\n            if (IsParticleScenePanel(panel)) {\n                if (+MajorRating > 0) {\n                    panel.StartParticles();\n                    panel.SetParticleNameAndRefresh(ratingEffect[matchType]);\n                    panel.SetControlPoint(16, tierColor.R, tierColor.G, tierColor.B);\n                }\n                else {\n                    panel.StopParticlesImmediately(true);\n                }\n            }\n        }\n    }\n    RatingParticleControls.UpdateRatingEffects = UpdateRatingEffects;\n})(RatingParticleControls || (RatingParticleControls = {}));\n","scripts/scoreboard.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"mock_adapter.ts\" />\n/// <reference path=\"common/gamerules_constants.ts\" />\n/// <reference path=\"common/formattext.ts\" />\n/// <reference path=\"rating_emblem.ts\" />\n/// <reference path=\"match_stakes.ts\" />\n/// <reference path=\"context_menus/context_menu_playercard.ts\" />\nvar Scoreboard;\n(function (Scoreboard) {\n    const _m_cP = $.GetContextPanel();\n    class PanelCache_t {\n        m_elTimelineRoundLabel = null;\n        m_elTimelineScoreOt = null;\n        m_elMusicKitUnborrow = null;\n        m_elMetaLabelsModeMap = null;\n        m_elPlayersTableAny = null;\n        m_elMouseBinding = null;\n        m_elFooterWebsite = null;\n        m_elTimelineSegments = null;\n        m_elRoundLossBonus = null;\n        m_elMuteImage = null;\n        m_elBlockUgcImage = null;\n        m_elRounds = [];\n        m_metaModeImage = null;\n        m_metaLabelsMap = null;\n        m_coopStats = null;\n        m_elMusicKit = null;\n        m_namedPanels = {};\n        ClearAll() {\n            this.m_elTimelineRoundLabel = null;\n            this.m_elTimelineScoreOt = null;\n            this.m_elMusicKitUnborrow = null;\n            this.m_elMetaLabelsModeMap = null;\n            this.m_elPlayersTableAny = null;\n            this.m_elMouseBinding = null;\n            this.m_elFooterWebsite = null;\n            this.m_elTimelineSegments = null;\n            this.m_elRoundLossBonus = null;\n            this.m_elMuteImage = null;\n            this.m_elBlockUgcImage = null;\n            this.m_elRounds = [];\n            this.m_metaModeImage = null;\n            this.m_metaLabelsMap = null;\n            this.m_coopStats = null;\n            this.m_elMusicKit = null;\n            this.m_namedPanels = {};\n        }\n        CacheScoreboard(scoreBoard) {\n            this.ClearAll();\n            if (scoreBoard && scoreBoard.IsValid()) {\n                this.m_elTimelineRoundLabel = this.GetAndCacheChildPanel(scoreBoard, 'id-sb-timeline__round-label');\n                this.m_elTimelineScoreOt = this.GetAndCacheChildPanel(scoreBoard, 'id-sb-timeline__score_ot');\n                this.m_elMusicKitUnborrow = this.GetAndCacheChildPanel(scoreBoard, 'id-sb-meta__musickit-unborrow');\n                this.m_elMetaLabelsModeMap = this.GetAndCacheChildPanel(scoreBoard, 'id-sb-meta__labels__mode-map');\n                this.m_elPlayersTableAny = this.GetAndCacheLayoutPanel(scoreBoard, 'players-table-ANY');\n                this.m_elMouseBinding = this.GetAndCacheLayoutPanel(scoreBoard, 'id-sb-mouse-instructions');\n                this.m_elFooterWebsite = this.GetAndCacheLayoutPanel(scoreBoard, 'id-sb-footer-server-website');\n                this.m_elTimelineSegments = this.GetAndCacheLayoutPanel(scoreBoard, 'id-sb-timeline__segments');\n                this.m_elRoundLossBonus = this.GetAndCacheLayoutPanel(scoreBoard, 'id-sb-timeline__round-loss-bonus-money');\n                this.m_elMuteImage = this.GetAndCacheLayoutPanel(scoreBoard, 'id-sb-meta__mutevoice__image');\n                this.m_elBlockUgcImage = this.GetAndCacheLayoutPanel(scoreBoard, 'id-sb-meta__blockugc__image');\n                this.m_elRounds = [];\n                this.m_metaModeImage = this.GetAndCacheContextPanel('#id-sb-meta__mode__image');\n                this.m_metaLabelsMap = this.GetAndCacheContextPanel('#sb-meta__labels__map');\n                this.m_coopStats = this.GetAndCacheContextPanel('#CoopStats');\n                this.m_elMusicKit = this.GetAndCacheContextPanel('#id-sb-meta__musickit');\n            }\n        }\n        GetPanel(name) {\n            let result = null;\n            if (name in this.m_namedPanels) {\n                result = this.m_namedPanels[name];\n            }\n            return result;\n        }\n        static GetChildPanelOrNull(scoreBoard, name) {\n            let elPanel = null;\n            if (name) {\n                let elFound = scoreBoard.FindChildTraverse(name);\n                elPanel = ((elFound && elFound.IsValid()) ? elFound : null);\n            }\n            return elPanel;\n        }\n        static GetLayoutPanelOrNull(scoreBoard, name) {\n            let elPanel = null;\n            if (name) {\n                let elFound = scoreBoard.FindChildInLayoutFile(name);\n                elPanel = ((elFound && elFound.IsValid()) ? elFound : null);\n            }\n            return elPanel;\n        }\n        static GetContextPanelOrNull(name) {\n            let elPanel = null;\n            if (name) {\n                let elFound = $(name);\n                elPanel = ((elFound && elFound.IsValid()) ? elFound : null);\n            }\n            return elPanel;\n        }\n        GetAndCacheChildPanel(scoreBoard, name) {\n            let elPanel = PanelCache_t.GetChildPanelOrNull(scoreBoard, name);\n            if (name) {\n                this.m_namedPanels[name] = elPanel;\n            }\n            return elPanel;\n        }\n        GetAndCacheLayoutPanel(scoreBoard, name) {\n            let elPanel = PanelCache_t.GetLayoutPanelOrNull(scoreBoard, name);\n            if (name) {\n                this.m_namedPanels[name] = elPanel;\n            }\n            return elPanel;\n        }\n        GetAndCacheContextPanel(name) {\n            let elPanel = PanelCache_t.GetContextPanelOrNull(name);\n            if (name) {\n                this.m_namedPanels[name] = elPanel;\n            }\n            return elPanel;\n        }\n    }\n    let _m_panelCache = new PanelCache_t();\n    let _m_LocalPlayerID = '';\n    function GetLocalPlayerId() {\n        if (_m_LocalPlayerID === '')\n            _m_LocalPlayerID = GameStateAPI.GetLocalPlayerXuid();\n        return _m_LocalPlayerID;\n    }\n    const _commendNames = ['leader', 'teacher', 'friendly'];\n    const _statNames = ['teamname', 'dc', 'score', 'risc', 'mvps', 'kills', 'assists', 'deaths', 'rank', 'idx', 'damage', 'avgrisc', 'money', 'hsp', 'kdr', 'adr', 'utilitydamage', 'enemiesflashed', 'musickit', 'skillgroup', 'ping', '3k', '4k', '5k', 'status', 'name', 'flair', 'avatar', 'gglevel', 'knifekills', 'taserkills', 'honoricon', ..._commendNames];\n    class Team_t {\n        static GetOrCreateTeam(scoreBoard, teamName) {\n            if (!_m_oTeams[teamName]) {\n                _m_oTeams[teamName] = new Team_t(teamName, scoreBoard);\n            }\n            return _m_oTeams[teamName];\n        }\n        static GetTeam(teamName) {\n            return _m_oTeams[teamName];\n        }\n        m_CommendLeaderboards = {\n            'leader': [],\n            'teacher': [],\n            'friendly': [],\n        };\n        m_teamName;\n        m_teamLogoImagePath;\n        m_elPlayersTable;\n        m_elLogoChildren;\n        constructor(teamName, scoreBoard) {\n            this.m_teamName = teamName;\n            this.m_teamLogoImagePath = '';\n            let elPlayersTable = scoreBoard.FindChildInLayoutFile('players-table-' + teamName);\n            this.m_elPlayersTable = (elPlayersTable && elPlayersTable.IsValid()) ? elPlayersTable : undefined;\n            let elTeamLogoChildren = [];\n            if (scoreBoard && scoreBoard.IsValid()) {\n                const children_ = scoreBoard.FindChildrenWithClassTraverse('sb-team-logo-background--' + teamName);\n                for (let child of children_) {\n                    if (child && child.IsValid()) {\n                        elTeamLogoChildren.push(child);\n                    }\n                }\n            }\n            this.m_elLogoChildren = elTeamLogoChildren;\n        }\n        CalculateAllCommends() {\n            let leader = this.m_CommendLeaderboards[\"leader\"];\n            let teacher = this.m_CommendLeaderboards[\"teacher\"];\n            let friendly = this.m_CommendLeaderboards[\"friendly\"];\n            leader.sort((a, b) => b.m_value - a.m_value);\n            teacher.sort((a, b) => b.m_value - a.m_value);\n            friendly.sort((a, b) => b.m_value - a.m_value);\n            let bestLeaderXuid = '';\n            {\n                bestLeaderXuid = leader[0] ? leader[0].m_xuid : \"0\";\n            }\n            let bestTeacherXuid = '';\n            {\n                let teacher0 = teacher[0] ? teacher[0].m_xuid : \"0\";\n                let teacher1 = teacher[1] ? teacher[1].m_xuid : \"0\";\n                if (teacher0 != bestLeaderXuid) {\n                    bestTeacherXuid = teacher0;\n                }\n                else {\n                    bestTeacherXuid = teacher1;\n                }\n            }\n            let bestFriendlyXuid = '';\n            {\n                let friendly0 = friendly[0] ? friendly[0].m_xuid : \"0\";\n                let friendly1 = friendly[1] ? friendly[1].m_xuid : \"0\";\n                let friendly2 = friendly[2] ? friendly[2].m_xuid : \"0\";\n                if (friendly0 != bestLeaderXuid && friendly0 != bestTeacherXuid) {\n                    bestFriendlyXuid = friendly0;\n                }\n                else if (friendly1 != bestLeaderXuid && friendly1 != bestTeacherXuid) {\n                    bestFriendlyXuid = friendly1;\n                }\n                else {\n                    bestFriendlyXuid = friendly2;\n                }\n            }\n            {\n                let oldTop = _m_TopCommends2.leader;\n                let newTop = bestLeaderXuid;\n                _m_TopCommends2.leader = newTop;\n                if (newTop != oldTop) {\n                    let stat = \"leader\";\n                    this._ChangeCommendDisplay(oldTop, stat, false);\n                    this._ChangeCommendDisplay(newTop, stat, true);\n                }\n            }\n            {\n                let oldTop = _m_TopCommends2.teacher;\n                let newTop = bestTeacherXuid;\n                _m_TopCommends2.teacher = newTop;\n                if (newTop != oldTop) {\n                    let stat = \"teacher\";\n                    this._ChangeCommendDisplay(oldTop, stat, false);\n                    this._ChangeCommendDisplay(newTop, stat, true);\n                }\n            }\n            {\n                let oldTop = _m_TopCommends2.friendly;\n                let newTop = bestFriendlyXuid;\n                _m_TopCommends2.friendly = newTop;\n                if (newTop != oldTop) {\n                    let stat = \"friendly\";\n                    this._ChangeCommendDisplay(oldTop, stat, false);\n                    this._ChangeCommendDisplay(newTop, stat, true);\n                }\n            }\n        }\n        UpdateCommendForPlayer(xuid, stat, value) {\n            if (value == 0)\n                return;\n            let playerCommend = this.m_CommendLeaderboards[stat].find(p => p.m_xuid === xuid);\n            if (!playerCommend) {\n                this.m_CommendLeaderboards[stat].push({ m_xuid: xuid, m_value: value });\n            }\n            else {\n                playerCommend.m_value = value;\n            }\n        }\n        DeletePlayerFromCommendsLeaderboards(xuid) {\n            for (let stat of ['leader', 'teacher', 'friendly']) {\n                let index = this.m_CommendLeaderboards[stat].findIndex(p => p.m_xuid === xuid);\n                if (index != -1) {\n                    this.m_CommendLeaderboards[stat].splice(index, 1);\n                }\n            }\n        }\n        _ChangeCommendDisplay(xuid, stat, turnon) {\n            let oPlayer = _m_oPlayers.GetPlayerByXuid(xuid);\n            if (!oPlayer)\n                return;\n            let elPlayer = oPlayer.m_elPlayer;\n            if (!elPlayer || !elPlayer.IsValid())\n                return;\n            let elCommendationImage = elPlayer.FindChildTraverse('id-sb-name__commendations__' + stat);\n            if (!elCommendationImage || !elCommendationImage.IsValid())\n                return;\n            elCommendationImage.SetHasClass('hidden', !turnon);\n        }\n    }\n    class Player_t {\n        static m_defaulPlayerGameStats = {\n            is_fake_player: false,\n            is_valid_xuid: false,\n            is_muted: false,\n            is_enemy: false,\n            has_abuse_mute: false,\n            team_name: \"\",\n            team_number: 0,\n            slot: 0,\n            color: \"\",\n            status: 0,\n            comp_ranking: -1,\n            comp_type: \"\",\n            comp_wins: -1,\n            ping: -1,\n            kills: -1,\n            round_kills: -1,\n            assists: -1,\n            deaths: -1,\n            mvps: -1,\n            money: 0,\n            score: -1,\n            xp_trail_level: 0,\n            commend_leader: 0,\n            commend_teacher: 0,\n            commend_friendly: 0,\n        };\n        m_xuid;\n        m_elPlayer = undefined;\n        m_elTeam = undefined;\n        m_oStats = {};\n        m_oElStats = {};\n        m_isMuted = false;\n        m_oMatchStats = undefined;\n        m_oGameStats = undefined;\n        m_xp_trail_level;\n        m_team = undefined;\n        constructor(xuid) {\n            this.m_xuid = xuid;\n        }\n        GetStatNum(stat, dflt = 0) {\n            const val = this.m_oStats[stat];\n            return typeof val === \"number\" && isFinite(val) ? val : dflt;\n        }\n        GetStatText(stat, dflt = \"\") {\n            const val = this.m_oStats[stat];\n            return typeof val === \"string\" ? val : val != null ? val.toString() : dflt;\n        }\n        RetrieveGameStats() {\n            this.m_oMatchStats = MatchStatsAPI.GetPlayerStatsJSO(this.m_xuid);\n            this.m_oGameStats = GameStateAPI.GetPlayerStatsJSO(this.m_xuid);\n        }\n        GetGameStat(member) {\n            const gameStats = (this.m_oGameStats ? this.m_oGameStats : Player_t.m_defaulPlayerGameStats);\n            return gameStats[member];\n        }\n        UpdateAndSort(updateStatNames, bSilent) {\n            this.RetrieveGameStats();\n            _UpdateAllStatsForPlayer(this, updateStatNames, bSilent);\n            _SortPlayer(this);\n        }\n    }\n    class AllPlayers_t {\n        m_arrPlayers = [];\n        AddPlayer(xuid) {\n            let newPlayer = new Player_t(xuid);\n            let teamName = (xuid ? GameStateAPI.GetPlayerTeamName(xuid) : '');\n            if (IsTeamASpecTeam(teamName))\n                teamName = 'Spectator';\n            let team = Team_t.GetTeam(teamName);\n            let elTeam = team ? team.m_elPlayersTable : undefined;\n            if (!elTeam || !elTeam.IsValid()) {\n                elTeam = (_m_panelCache.m_elPlayersTableAny ? _m_panelCache.m_elPlayersTableAny : undefined);\n            }\n            newPlayer.m_elTeam = elTeam;\n            newPlayer.m_team = _m_oTeams[teamName];\n            this.m_arrPlayers.push(newPlayer);\n            return newPlayer;\n        }\n        GetPlayerByIndex(i) {\n            return this.m_arrPlayers[i];\n        }\n        GetPlayerByXuid(xuid) {\n            return this.m_arrPlayers.find(p => p.m_xuid === xuid);\n        }\n        GetPlayerIndexByPlayerSlot(slot) {\n            let xuid = GameStateAPI.GetPlayerXuidStringFromPlayerSlot(slot);\n            return this.GetPlayerIndexByXuid(xuid);\n        }\n        GetPlayerIndexByXuid(xuid) {\n            return this.m_arrPlayers.findIndex(p => p.m_xuid === xuid);\n        }\n        GetCount() {\n            return this.m_arrPlayers.length;\n        }\n        DeletePlayerByXuid(xuid) {\n            let oPlayer = this.GetPlayerByXuid(xuid);\n            const teamName = oPlayer?.m_oStats?.teamname;\n            if (teamName && _m_oTeams[teamName]) {\n                _m_oTeams[teamName].DeletePlayerFromCommendsLeaderboards(xuid);\n            }\n            let i = this.GetPlayerIndexByXuid(xuid);\n            if (this.m_arrPlayers[i].m_elPlayer && this.m_arrPlayers[i].m_elPlayer.IsValid()) {\n                this.m_arrPlayers[i].m_elPlayer.m_elSkillGroup = undefined;\n                this.m_arrPlayers[i].m_elPlayer.DeleteAsync(.0);\n            }\n            this.m_arrPlayers.splice(i, 1);\n        }\n        DeleteMissingPlayers(oPlayerData) {\n            const xuids = oPlayerData.players.map(p => p.xuid);\n            for (const player of this.m_arrPlayers) {\n                if (!xuids.includes(player.m_xuid)) {\n                    this.DeletePlayerByXuid(player.m_xuid);\n                }\n            }\n        }\n    }\n    let _m_bInit = false;\n    let _m_bRowLabelsCreated = false;\n    let _m_oAllUpdateStatNames = [];\n    let _m_oUpdateStatNames = [];\n    let _m_updatePlayerIndex = 0;\n    let _m_oTeams = {};\n    let _m_arrSortingPausedRefGetCounter = 0;\n    let _m_hDenyInputToGame = null;\n    let _m_dataSetCurrent = 0;\n    let _m_dataSetGetCount = 0;\n    let _m_areTeamsSwapped = false;\n    let _m_maxRounds = 0;\n    let _m_oPlayers;\n    let _m_RoundUpdated = {};\n    let _m_TopCommends = {\n        'leader': \"0\",\n        'teacher': \"0\",\n        'friendly': \"0\",\n    };\n    ;\n    let _m_TopCommends2 = {\n        leader: \"0\",\n        teacher: \"0\",\n        friendly: \"0\",\n    };\n    let _m_overtime = 0;\n    let _m_updatePlayerHandler = null;\n    let _m_haveViewers = false;\n    let FAKEMODE = '';\n    const sortOrder_default = {\n        'dc': 0,\n        'score': 0,\n        'risc': 0,\n        'mvps': 0,\n        'kills': 0,\n        'assists': 0,\n        'deaths': -1,\n        'leader': 0,\n        'teacher': 0,\n        'friendly': 0,\n        'rank': 0,\n        'idx': -1,\n        'damage': 0,\n        'avgrisc': 0,\n        'money': 0,\n        'hsp': 0,\n        'kdr': 0,\n        'adr': 0,\n        'utilitydamage': 0,\n        'enemiesflashed': 0,\n    };\n    const sortOrder_reverse = {\n        'dc': 0,\n        'score': -1,\n        'risc': -1,\n        'mvps': -1,\n        'kills': -1,\n        'assists': -1,\n        'deaths': 0,\n        'leader': -1,\n        'teacher': -1,\n        'friendly': -1,\n        'rank': -1,\n        'idx': 0,\n        'damage': 0,\n        'avgrisc': 0,\n        'money': 0,\n        'hsp': 0,\n        'kdr': 0,\n        'adr': 0,\n        'utilitydamage': 0,\n        'enemiesflashed': 0,\n    };\n    const sortOrder_dm = {\n        'dc': 0,\n        'score': 0,\n        'kills': 0,\n        'kdr': 0,\n        'damage': 0,\n        'hsp': 0,\n        'idx': -1,\n        'assists': 0,\n        'deaths': -1,\n    };\n    const sortOrder_gg = {\n        'dc': 0,\n        'gglevel': 0,\n        'knifekills': 0,\n        'taserkills': 0,\n        'kills': 0,\n        'kdr': 0,\n        'hsp': 0,\n        'idx': -1,\n        'assists': 0,\n        'deaths': -1,\n    };\n    const sortOrder_tmm = {\n        'dc': 0,\n        'damage': 0,\n        'kills': 0,\n        'risc': 0,\n        'mvps': 0,\n        'assists': 0,\n        'deaths': -1,\n        'leader': 0,\n        'teacher': 0,\n        'friendly': 0,\n        'rank': 0,\n        'idx': -1,\n        'score': 0,\n        'avgrisc': 0,\n        'money': 0,\n        'hsp': 0,\n        'kdr': 0,\n        'adr': 0,\n        'utilitydamage': 0,\n        'enemiesflashed': 0,\n    };\n    let _m_sortOrder = sortOrder_default;\n    _Reset();\n    function _Reset() {\n        _m_bInit = false;\n        _m_bRowLabelsCreated = false;\n        _m_oPlayers = new AllPlayers_t();\n        _m_oUpdateStatNames = [];\n        _m_updatePlayerIndex = 0;\n        _m_oTeams = {};\n        _m_arrSortingPausedRefGetCounter = 0;\n        _m_hDenyInputToGame = null;\n        _m_dataSetCurrent = 0;\n        _m_dataSetGetCount = 0;\n        _m_areTeamsSwapped = false;\n        _m_maxRounds = 0;\n        _m_sortOrder = sortOrder_default;\n        _m_overtime = 0;\n        _m_RoundUpdated = {};\n        _m_TopCommends = {\n            'leader': \"0\",\n            'teacher': \"0\",\n            'friendly': \"0\",\n        };\n        _m_TopCommends2 = {\n            leader: \"0\",\n            teacher: \"0\",\n            friendly: \"0\",\n        };\n        _m_panelCache.ClearAll();\n        _m_cP.RemoveAndDeleteChildren();\n        _m_cP.m_matchInfo = undefined;\n        _m_cP.m_bSnippetLoaded = false;\n    }\n    function _Helper_LoadSnippet(element, snippet) {\n        if (element && !element.m_bSnippetLoaded) {\n            element.BLoadLayoutSnippet(snippet);\n            element.m_bSnippetLoaded = true;\n        }\n    }\n    function _PopulatePlayerList(oPlayerData) {\n        if (oPlayerData.teams.length === 0)\n            return;\n        for (const team of oPlayerData.teams) {\n            if (team.player_count > 0) {\n                Team_t.GetOrCreateTeam(_m_cP, team.name);\n            }\n        }\n        Team_t.GetOrCreateTeam(_m_cP, 'CT');\n        Team_t.GetOrCreateTeam(_m_cP, 'TERRORIST');\n        let highlightSortStatLabel = false;\n        for (let p of oPlayerData.players) {\n            const xuid = p.xuid;\n            if (xuid == null || xuid == '' || xuid === \"0\")\n                continue;\n            const teamName = oPlayerData.teams[p.team].name;\n            const oPlayer = _m_oPlayers.GetPlayerByXuid(xuid);\n            if (!oPlayer) {\n                let oNewPlayer = _m_oPlayers.AddPlayer(xuid);\n                _NewPlayerPanel(oNewPlayer);\n                oNewPlayer.UpdateAndSort(_m_oUpdateStatNames, true);\n                highlightSortStatLabel = true;\n            }\n            else if (oPlayer.m_oStats['teamname'] != teamName) {\n                _ChangeTeams(oPlayer, teamName);\n            }\n        }\n        if (highlightSortStatLabel) {\n            let sortOrder = Object.keys(_m_sortOrder)[1];\n            _HighlightSortStatLabel(sortOrder);\n        }\n    }\n    function _ChangeTeams(oPlayer, newTeamName) {\n        if (oPlayer.m_oStats['teamname'] == newTeamName)\n            return false;\n        let xuid = oPlayer.m_xuid;\n        let oldTeam = oPlayer.m_oStats['teamname'];\n        let elPlayer = oPlayer.m_elPlayer;\n        oPlayer.m_oStats['teamname'] = newTeamName;\n        if (oldTeam in _m_oTeams) {\n            _m_oTeams[oldTeam].DeletePlayerFromCommendsLeaderboards(xuid);\n        }\n        if (newTeamName in _m_oTeams) {\n            oPlayer.m_team = _m_oTeams[newTeamName];\n        }\n        else {\n            oPlayer.m_team = undefined;\n        }\n        oPlayer.m_oStats['leader'] = -1;\n        oPlayer.m_oStats['teacher'] = -1;\n        oPlayer.m_oStats['friendly'] = -1;\n        if (!elPlayer || !elPlayer.IsValid())\n            return true;\n        if (oldTeam)\n            elPlayer.RemoveClass('sb-team--' + oldTeam);\n        elPlayer.AddClass('sb-team--' + newTeamName);\n        if (IsTeamASpecTeam(newTeamName) && MatchStatsAPI.IsTournamentMatch()) {\n            elPlayer.AddClass('hidden');\n            return true;\n        }\n        let team = oPlayer.m_team;\n        let elTeam = team ? team.m_elPlayersTable : null;\n        if (!elTeam && !IsTeamASpecTeam(newTeamName)) {\n            elTeam = _m_panelCache.m_elPlayersTableAny;\n        }\n        if (elTeam && elTeam.IsValid()) {\n            oPlayer.m_elTeam = elTeam;\n            elPlayer.SetParent(elTeam);\n            elPlayer.RemoveClass('hidden');\n        }\n        else {\n            elPlayer.AddClass('hidden');\n        }\n        return true;\n    }\n    function _UpdateNextPlayer() {\n        const oPlayerData = GameStateAPI.GetPlayerDataJSO();\n        _m_oPlayers.DeleteMissingPlayers(oPlayerData);\n        if (_m_updatePlayerIndex >= _m_oPlayers.GetCount()) {\n            _PopulatePlayerList(oPlayerData);\n            _m_updatePlayerIndex = 0;\n        }\n        _UpdatePlayer(_m_updatePlayerIndex);\n        _m_updatePlayerIndex++;\n    }\n    function _UpdateAllPlayers_delayed() {\n        $.Schedule(0.01, _UpdateAllPlayers);\n    }\n    function _UpdateAllPlayers(bInitialCreate = false) {\n        if (!_m_bInit)\n            return;\n        const bSilent = true;\n        const oPlayerData = GameStateAPI.GetPlayerDataJSO();\n        _m_oPlayers.DeleteMissingPlayers(oPlayerData);\n        _PopulatePlayerList(oPlayerData);\n        _m_updatePlayerIndex = 0;\n        if (!bInitialCreate) {\n            for (let i = 0; i < _m_oPlayers.GetCount(); i++) {\n                let elPlayer = _m_oPlayers.GetPlayerByIndex(i).m_elPlayer;\n                if (elPlayer && elPlayer.IsValid())\n                    elPlayer.RemoveClass('sb-row--transition');\n            }\n            for (let i = 0; i < _m_oPlayers.GetCount(); i++) {\n                _UpdatePlayer(i, bSilent);\n            }\n            for (let i = 0; i < _m_oPlayers.GetCount(); i++) {\n                let elPlayer = _m_oPlayers.GetPlayerByIndex(i).m_elPlayer;\n                if (elPlayer && elPlayer.IsValid())\n                    elPlayer.AddClass('sb-row--transition');\n            }\n        }\n    }\n    function _Pulse(el) {\n        el.RemoveClass('sb-pulse-highlight');\n        el.AddClass('sb-pulse-highlight');\n    }\n    function _UpdatePlayerByPlayerSlot(slot) {\n        let index = _m_oPlayers.GetPlayerIndexByPlayerSlot(slot);\n        _UpdatePlayer(index, true);\n    }\n    function _UpdatePlayerByPlayerSlot_delayed(slot) {\n        $.Schedule(0.01, () => _UpdatePlayerByPlayerSlot(slot));\n    }\n    function _UpdatePlayer(idx, bSilent = false) {\n        let oPlayer = _m_oPlayers.GetPlayerByIndex(idx);\n        if (!oPlayer)\n            return;\n        bSilent = bSilent && _m_cP.visible;\n        oPlayer.UpdateAndSort(_m_oUpdateStatNames, bSilent);\n    }\n    function _UpdateSpectatorButtons() {\n        let elButtonPanel = $('#spec-button-group');\n        if (!elButtonPanel || !elButtonPanel.IsValid())\n            return;\n        let nCameraMan = parseInt(GameInterfaceAPI.GetSettingString('spec_autodirector_cameraman'));\n        let bQ = (GameStateAPI.IsLocalPlayerHLTV() && nCameraMan > -1);\n        if (bQ) {\n            elButtonPanel.visible = true;\n            UpdateCasterButtons();\n        }\n        else {\n            elButtonPanel.visible = false;\n        }\n    }\n    function _lessthan(x, y) {\n        x = Number(x);\n        y = Number(y);\n        if (isNaN(x))\n            return (!isNaN(y));\n        if (isNaN(y))\n            return false;\n        return (x < y);\n    }\n    function _SortPlayer(oPlayer) {\n        if (_m_arrSortingPausedRefGetCounter != 0)\n            return;\n        let elTeam = oPlayer.m_elTeam;\n        if (!elTeam || !elTeam.IsValid())\n            return;\n        let elPlayer = oPlayer.m_elPlayer;\n        if (!elPlayer || !elPlayer.IsValid())\n            return;\n        let children = elTeam.Children();\n        for (let i = 0; i < children.length; i++) {\n            if (oPlayer.m_xuid === children[i].m_xuid)\n                continue;\n            let oCompareTargetPlayer = _m_oPlayers.GetPlayerByXuid(children[i].m_xuid);\n            if (!oCompareTargetPlayer)\n                continue;\n            for (let stat in _m_sortOrder) {\n                let p1stat = oPlayer.m_oStats[stat];\n                let p2stat = oCompareTargetPlayer.m_oStats[stat];\n                if (_m_sortOrder[stat] === -1) {\n                    let tmp = p1stat;\n                    p1stat = p2stat;\n                    p2stat = tmp;\n                }\n                if (_lessthan(p2stat, p1stat)) {\n                    if (children[i - 1] != elPlayer) {\n                        elTeam.MoveChildBefore(elPlayer, children[i]);\n                    }\n                    return;\n                }\n                else if (_lessthan(p1stat, p2stat)) {\n                    break;\n                }\n            }\n        }\n    }\n    function IsTeamASpecTeam(teamname) {\n        return (teamname === 'Spectator' ||\n            teamname === 'Unassigned' ||\n            teamname === 'Unknown' ||\n            teamname === 'UNKNOWN TEAM' ||\n            teamname === '');\n    }\n    function _UpdateAllStatsForPlayer(oPlayer, oUpdateStatNames, bSilent = false) {\n        const bIsUpdatingAllStats = true;\n        for (let stat of oUpdateStatNames) {\n            _UpdatePlayerStat(oPlayer, stat, bIsUpdatingAllStats, bSilent);\n        }\n    }\n    function _GenericUpdateStat(oPlayer, stat, fnGetStat, bSilent = false) {\n        let elPanel = oPlayer.m_oElStats[stat];\n        if (!elPanel || !elPanel.IsValid())\n            return;\n        let newStatValue = fnGetStat(oPlayer.m_xuid);\n        if (newStatValue !== oPlayer.m_oStats[stat]) {\n            let elLabel = elPanel.m_elLabel;\n            const validLabel = (elLabel && elLabel.IsValid()) ? true : false;\n            if (!bSilent) {\n                if (validLabel) {\n                    _Pulse(elLabel);\n                }\n            }\n            oPlayer.m_oStats[stat] = newStatValue;\n            if (validLabel) {\n                elLabel.text = newStatValue.toString();\n            }\n        }\n    }\n    function _GenericUpdateStatDirect(oPlayer, stat, val, bSilent = false) {\n        let elPanel = oPlayer.m_oElStats[stat];\n        if (!elPanel || !elPanel.IsValid())\n            return;\n        let newStatValue = val;\n        if (newStatValue !== oPlayer.m_oStats[stat]) {\n            let elLabel = elPanel.m_elLabel;\n            const validLabel = (elLabel && elLabel.IsValid()) ? true : false;\n            if (!bSilent) {\n                if (validLabel) {\n                    _Pulse(elLabel);\n                }\n            }\n            oPlayer.m_oStats[stat] = newStatValue;\n            if (validLabel) {\n                elLabel.text = newStatValue.toString();\n            }\n        }\n    }\n    function _GetMatchStatFn(stat) {\n        function _fn(xuid) {\n            let oPlayer = _m_oPlayers.GetPlayerByXuid(xuid);\n            if (oPlayer) {\n                let allstats = oPlayer.m_oMatchStats;\n                if (allstats)\n                    return (allstats[stat] == -1) ? '-' : allstats[stat];\n            }\n            return '-';\n        }\n        return _fn;\n    }\n    function _UpdatePlayerStat(oPlayer, stat, bIsUpdatingAllStats, bSilent = false) {\n        switch (stat) {\n            case 'musickit':\n                {\n                    if (oPlayer.GetGameStat('is_fake_player')) {\n                        return;\n                    }\n                    let ownerXuid = oPlayer.m_xuid;\n                    let isLocalPlayer = oPlayer.m_xuid == GetLocalPlayerId();\n                    let isBorrowed = false;\n                    let borrowedXuid = \"0\";\n                    let borrowedPlayerSlot = parseInt(GameInterfaceAPI.GetSettingString('cl_borrow_music_from_player_slot'));\n                    if (borrowedPlayerSlot >= 0 && isLocalPlayer) {\n                        borrowedXuid = GameStateAPI.GetPlayerXuidStringFromPlayerSlot(borrowedPlayerSlot);\n                        if (MockAdapter.IsPlayerConnected(borrowedXuid)) {\n                            ownerXuid = borrowedXuid;\n                            isBorrowed = true;\n                        }\n                    }\n                    let newStatValue = InventoryAPI.GetMusicIDForPlayer(ownerXuid);\n                    if (newStatValue !== oPlayer.m_oStats[stat]) {\n                        oPlayer.m_oStats[stat] = newStatValue;\n                        if (isLocalPlayer) {\n                            let elMusicKit = _m_panelCache.m_elMusicKit;\n                            if (!elMusicKit || !elMusicKit.IsValid())\n                                return;\n                            let isValidMusicKit = newStatValue > 0;\n                            elMusicKit.SetHasClass('hidden', !isValidMusicKit);\n                            if (isValidMusicKit) {\n                                if (_m_panelCache.m_elMusicKitUnborrow) {\n                                    _m_panelCache.m_elMusicKitUnborrow.SetHasClass('hidden', !isBorrowed);\n                                }\n                                let imagepath = 'file://{images}/' + InventoryAPI.GetItemInventoryImageFromMusicID(newStatValue) + '.png';\n                                let elMusicKitImage = $('#id-sb-meta__musickit-image');\n                                if (elMusicKitImage) {\n                                    elMusicKitImage.SetImage(imagepath);\n                                }\n                                let elMusicKitName = $('#id-sb-meta__musickit-name');\n                                if (elMusicKitName) {\n                                    elMusicKitName.text = $.Localize(InventoryAPI.GetMusicNameFromMusicID(newStatValue));\n                                }\n                            }\n                        }\n                    }\n                    let elPlayer = oPlayer.m_elPlayer;\n                    if (elPlayer && elPlayer.IsValid()) {\n                        let elMusicKitIcon = elPlayer.FindChildTraverse('id-sb-name__musickit');\n                        if (elMusicKitIcon && elMusicKitIcon.IsValid()) {\n                            elMusicKitIcon.SetHasClass('hidden', newStatValue <= 1);\n                        }\n                    }\n                }\n                break;\n            case 'teamname':\n                {\n                    const newTeam = (oPlayer.GetGameStat('team_name'));\n                    const bChangedTeams = _ChangeTeams(oPlayer, newTeam);\n                    if (bChangedTeams && !bIsUpdatingAllStats) {\n                        _UpdateAllStatsForPlayer(oPlayer, _m_oUpdateStatNames, true);\n                        _SortPlayer(oPlayer);\n                    }\n                }\n                break;\n            case 'ping':\n                {\n                    let elPlayer = oPlayer.m_elPlayer;\n                    if (!elPlayer || !elPlayer.IsValid())\n                        return;\n                    let elPanel = oPlayer.m_oElStats[stat];\n                    if (!elPanel || !elPanel.IsValid())\n                        return;\n                    let elLabel = elPanel.m_elLabel;\n                    if (!elLabel)\n                        return;\n                    oPlayer.m_elPlayer?.SetHasClass('bot', oPlayer.GetGameStat('is_fake_player'));\n                    let szCustomLabel = _GetCustomStatTextValue('ping', oPlayer);\n                    elLabel.SetHasClass('sb-row__cell--ping__label--bot', !!szCustomLabel);\n                    if (szCustomLabel) {\n                        elLabel.text = $.Localize(szCustomLabel);\n                        oPlayer.m_oStats[stat] = szCustomLabel;\n                    }\n                    else {\n                        _GenericUpdateStatDirect(oPlayer, stat, oPlayer.GetGameStat('ping'), true);\n                    }\n                }\n                break;\n            case 'kills':\n                {\n                    _GenericUpdateStatDirect(oPlayer, stat, oPlayer.GetGameStat('kills'), bSilent);\n                }\n                break;\n            case 'assists':\n                {\n                    _GenericUpdateStatDirect(oPlayer, stat, oPlayer.GetGameStat('assists'), bSilent);\n                }\n                break;\n            case 'deaths':\n                {\n                    _GenericUpdateStatDirect(oPlayer, stat, oPlayer.GetGameStat('deaths'), bSilent);\n                }\n                break;\n            case '3k':\n            case '4k':\n            case '5k':\n            case 'adr':\n            case 'hsp':\n            case 'utilitydamage':\n            case 'enemiesflashed':\n            case 'damage':\n            case 'knifekills':\n            case 'taserkills':\n                {\n                    _GenericUpdateStat(oPlayer, stat, _GetMatchStatFn(stat), bSilent);\n                }\n                break;\n            case 'kdr':\n                {\n                    let kdr;\n                    if (_m_overtime == 0) {\n                        let kdrFn = _GetMatchStatFn('kdr');\n                        kdr = kdrFn(oPlayer.m_xuid);\n                        if (typeof kdr == 'number' && kdr > 0) {\n                            kdr = kdr / 100.0;\n                        }\n                    }\n                    else {\n                        let denom = oPlayer.GetStatNum('deaths') || 1;\n                        kdr = oPlayer.GetStatNum('kills') / denom;\n                    }\n                    if (typeof kdr == 'number') {\n                        kdr = kdr.toFixed(2);\n                    }\n                    _GenericUpdateStat(oPlayer, stat, () => { return kdr; }, bSilent);\n                }\n                break;\n            case 'mvps':\n                {\n                    let newStatValue = oPlayer.GetGameStat('mvps');\n                    if (newStatValue !== oPlayer.m_oStats[stat]) {\n                        let elMVPPanel = oPlayer.m_oElStats[stat];\n                        if (!elMVPPanel || !elMVPPanel.IsValid())\n                            return;\n                        let elMVPStarImage = elMVPPanel.FindChildTraverse('star-image');\n                        if (!elMVPStarImage || !elMVPStarImage.IsValid())\n                            return;\n                        let elMVPStarNumberLabel = elMVPPanel.FindChildTraverse('star-count');\n                        if (!elMVPStarNumberLabel || !elMVPStarNumberLabel.IsValid())\n                            return;\n                        oPlayer.m_oStats[stat] = newStatValue;\n                        elMVPStarImage.SetHasClass('hidden', newStatValue == 0);\n                        elMVPStarNumberLabel.SetHasClass('hidden', newStatValue == 0);\n                        elMVPStarNumberLabel.text = newStatValue.toString();\n                        if (!bSilent) {\n                            _Pulse(elMVPStarImage);\n                            _Pulse(elMVPStarNumberLabel);\n                        }\n                    }\n                }\n                break;\n            case 'status':\n                {\n                    let newStatValue = oPlayer.GetGameStat('status');\n                    if (newStatValue !== oPlayer.m_oStats[stat]) {\n                        oPlayer.m_oStats[stat] = newStatValue;\n                        let elPlayer = oPlayer.m_elPlayer;\n                        if (!elPlayer || !elPlayer.IsValid())\n                            return;\n                        elPlayer.SetHasClass('sb-player-status-dead', newStatValue === 1);\n                        elPlayer.SetHasClass('sb-player-status-disconnected', newStatValue === 15);\n                        oPlayer.m_oStats['dc'] = newStatValue === 15 ? 0 : 1;\n                        let elPanel = oPlayer.m_oElStats[stat];\n                        if (!elPanel || !elPanel.IsValid())\n                            return;\n                        let elStatusImage = elPanel.m_elImage;\n                        if (!elStatusImage || !elStatusImage.IsValid())\n                            return;\n                        elStatusImage.SetImage(dictPlayerStatusImage[newStatValue]);\n                    }\n                }\n                break;\n            case 'score':\n                {\n                    _GenericUpdateStatDirect(oPlayer, stat, oPlayer.GetGameStat('score'));\n                }\n                break;\n            case 'gglevel':\n                {\n                    _GenericUpdateStat(oPlayer, stat, () => Math.floor(oPlayer.GetGameStat('score') / 2));\n                }\n                break;\n            case 'money':\n                {\n                    let elPanel = oPlayer.m_oElStats[stat];\n                    if (!elPanel || !elPanel.IsValid())\n                        return;\n                    let elLabel = elPanel.m_elLabel;\n                    if (!elLabel || !elLabel.IsValid())\n                        return;\n                    let newStatValue = oPlayer.GetGameStat('money');\n                    if (newStatValue !== oPlayer.m_oStats[stat]) {\n                        if (newStatValue >= 0) {\n                            elLabel.SetHasClass('hidden', false);\n                            elLabel.SetDialogVariableInt('stat_d_money', newStatValue);\n                        }\n                        else {\n                            elLabel.SetHasClass('hidden', true);\n                        }\n                        oPlayer.m_oStats[stat] = newStatValue;\n                    }\n                }\n                break;\n            case 'name':\n                {\n                    if (!oPlayer.m_elPlayer || !oPlayer.m_elPlayer.IsValid())\n                        return;\n                    oPlayer.m_elPlayer.SetHasClass('sb-row--localplayer', oPlayer.m_xuid === GetLocalPlayerId());\n                    let elPanel = oPlayer.m_oElStats[stat];\n                    if (!elPanel || !elPanel.IsValid())\n                        return;\n                    oPlayer.m_elPlayer.SetDialogVariableInt('player_slot', oPlayer.GetGameStat('slot'));\n                }\n                break;\n            case 'honoricon':\n                {\n                    if (!oPlayer.m_elPlayer || !oPlayer.m_elPlayer.IsValid())\n                        return;\n                    const xp_trail_level = oPlayer.GetGameStat('xp_trail_level');\n                    if (oPlayer.m_xp_trail_level != xp_trail_level) {\n                        const elHonorIcon = oPlayer.m_elPlayer.FindChildTraverse('jsHonorIcon');\n                        if (elHonorIcon)\n                            elHonorIcon.Set(xp_trail_level, false);\n                        oPlayer.m_xp_trail_level = xp_trail_level;\n                    }\n                }\n                break;\n            case 'leader':\n            case 'teacher':\n            case 'friendly':\n                {\n                    let localPlayer = _m_oPlayers.GetPlayerByXuid(GetLocalPlayerId());\n                    let teamName = localPlayer?.m_team?.m_teamName || '';\n                    if (GameStateAPI.IsDemoOrHltv() || IsTeamASpecTeam(teamName))\n                        return;\n                    let newStatValue;\n                    if (!oPlayer.GetGameStat('is_valid_xuid')) {\n                        return;\n                    }\n                    else {\n                        switch (stat) {\n                            case 'leader':\n                                newStatValue = oPlayer.GetGameStat('commend_leader');\n                                break;\n                            case 'teacher':\n                                newStatValue = oPlayer.GetGameStat('commend_teacher');\n                                break;\n                            case 'friendly':\n                                newStatValue = oPlayer.GetGameStat('commend_friendly');\n                                break;\n                        }\n                    }\n                    if (oPlayer.m_oStats[stat] != newStatValue) {\n                        oPlayer.m_oStats[stat] = newStatValue;\n                        if (oPlayer.m_team)\n                            oPlayer.m_team.UpdateCommendForPlayer(oPlayer.m_xuid, stat, newStatValue);\n                    }\n                }\n                break;\n            case 'flair':\n                {\n                    if (GameStateAPI.IsLatched()) {\n                        return;\n                    }\n                    let newStatValue = InventoryAPI.GetFlairItemId(oPlayer.m_xuid);\n                    if (oPlayer.m_oStats[stat] !== newStatValue) {\n                        oPlayer.m_oStats[stat] = newStatValue;\n                        let elPanel = oPlayer.m_oElStats[stat];\n                        if (!elPanel || !elPanel.IsValid())\n                            return;\n                        let elFlairImage = elPanel.m_elImage;\n                        if (!elFlairImage || !elFlairImage.IsValid())\n                            return;\n                        let imagepath = InventoryAPI.GetFlairItemImage(oPlayer.m_xuid);\n                        if (imagepath !== '') {\n                            elFlairImage.SetImage('file://{images}' + imagepath + '_small.png');\n                        }\n                    }\n                }\n                break;\n            case 'avatar':\n                {\n                    let elPanel = oPlayer.m_oElStats[stat];\n                    if (!elPanel || !elPanel.IsValid())\n                        return;\n                    let elAvatarImage = elPanel.m_elImage;\n                    if (!elAvatarImage || !elAvatarImage.IsValid())\n                        return;\n                    const slot = oPlayer.GetGameStat('slot');\n                    if (slot >= 0) {\n                        elAvatarImage.PopulateFromPlayerSlot(slot);\n                    }\n                    const team = oPlayer.m_team?.m_teamName || '';\n                    elAvatarImage.SwitchClass('teamstyle', 'team--' + team);\n                    if (elAvatarImage.m_elPlayerColor == undefined) {\n                        elAvatarImage.m_elPlayerColor = elAvatarImage.FindChildTraverse('player-color');\n                    }\n                    let elPlayerColor = elAvatarImage.m_elPlayerColor;\n                    if (elPlayerColor && elPlayerColor.IsValid()) {\n                        let teamColor = oPlayer.GetGameStat('color');\n                        if ((elAvatarImage.m_playerCol == undefined) || (teamColor !== elAvatarImage.m_playerCol)) {\n                            elAvatarImage.m_playerCol = teamColor;\n                            if (teamColor !== '') {\n                                elPlayerColor.style.washColor = teamColor;\n                                elPlayerColor.RemoveClass('hidden');\n                            }\n                            else {\n                                elPlayerColor.AddClass('hidden');\n                            }\n                        }\n                    }\n                    let isMuted = oPlayer.GetGameStat('is_muted');\n                    oPlayer.m_isMuted = isMuted;\n                    let isEnemyTeamMuted = GameInterfaceAPI.GetSettingString(\"cl_mute_enemy_team\") == \"1\";\n                    let isEnemy = oPlayer.GetGameStat('is_enemy');\n                    let hasComAbusePenalty = oPlayer.GetGameStat('has_abuse_mute');\n                    let isLocalPlayer = oPlayer.m_xuid == GetLocalPlayerId();\n                    oPlayer.m_elPlayer.SetHasClass('muted', isMuted || (isEnemy && isEnemyTeamMuted) || (isLocalPlayer && hasComAbusePenalty));\n                }\n                break;\n            case 'skillgroup':\n                {\n                    const elPlayer = oPlayer.m_elPlayer;\n                    if (!elPlayer || !elPlayer.IsValid())\n                        return;\n                    let elSkillgroup = elPlayer.m_elSkillGroup;\n                    if (elSkillgroup && elSkillgroup.IsValid()) {\n                        let newStatValue = oPlayer.GetGameStat('comp_ranking');\n                        if (newStatValue > 0) {\n                            elSkillgroup.visible = true;\n                            if (oPlayer.m_oStats[stat] !== newStatValue) {\n                                oPlayer.m_oStats[stat] = newStatValue;\n                                const rating_type = oPlayer.GetGameStat('comp_type');\n                                const score = oPlayer.GetGameStat('comp_ranking');\n                                const wins = oPlayer.GetGameStat('comp_wins');\n                                let options = {\n                                    root_panel: elSkillgroup,\n                                    full_details: false,\n                                    rating_type: rating_type,\n                                    leaderboard_details: { score: score, matchesWon: wins },\n                                    local_player: oPlayer.m_xuid === MyPersonaAPI.GetXuid()\n                                };\n                                RatingEmblem.SetXuid(options);\n                            }\n                        }\n                        else {\n                            elSkillgroup.visible = false;\n                        }\n                    }\n                }\n                break;\n            case 'rank':\n                {\n                    let newStatValue = MockAdapter.GetPlayerXpLevel(oPlayer.m_xuid);\n                    if (oPlayer.m_oStats[stat] !== newStatValue) {\n                        oPlayer.m_oStats[stat] = newStatValue;\n                        let elPanel = oPlayer.m_oElStats[stat];\n                        if (!elPanel || !elPanel.IsValid())\n                            return;\n                        let elRankImage = elPanel.m_elImage;\n                        if (!elRankImage || !elRankImage.IsValid())\n                            return;\n                        let imagepath = '';\n                        if (newStatValue > 0) {\n                            imagepath = 'file://{images}/icons/xp/level' + newStatValue + '.png';\n                        }\n                        else {\n                            imagepath = '';\n                        }\n                        elRankImage.SetImage(imagepath);\n                    }\n                }\n                break;\n            default:\n                {\n                }\n                break;\n        }\n    }\n    function _InitializeStatUpdateFuncs() {\n        try {\n            for (let stat of _statNames) {\n                _m_oAllUpdateStatNames.push(stat);\n            }\n            _UpdateJob();\n        }\n        catch {\n        }\n    }\n    function _RegisterStatUpdate(stat) {\n        if (_m_oAllUpdateStatNames.includes(stat) && !_m_oUpdateStatNames.includes(stat)) {\n            _m_oUpdateStatNames.push(stat);\n        }\n    }\n    function _GetPlayerRowForGameMode() {\n        let mode = MockAdapter.GetGameModeInternalName(false);\n        let skirmish = MockAdapter.GetGameModeInternalName(true);\n        if (GameStateAPI.IsQueuedMatchmakingMode_Team()) {\n            return 'snippet_scoreboard-classic__row--premier';\n        }\n        switch (mode) {\n            case 'scrimcomp2v2':\n                return 'snippet_scoreboard-classic__row--wingman';\n            case 'competitive':\n            case 'premier':\n            case 'rush':\n                return 'snippet_scoreboard-classic__row--comp';\n            case 'training':\n                return 'snippet_scoreboard__row--training';\n            case 'deathmatch':\n                return 'snippet_scoreboard__row--deathmatch';\n            case 'gungameprogressive':\n                return 'snippet_scoreboard__row--armsrace';\n            case 'coopmission':\n            case 'cooperative':\n                return 'snippet_scoreboard__row--cooperative';\n            case 'casual':\n                if (skirmish == 'flyingscoutsman')\n                    return 'snippet_scoreboard__row--flyingscoutsman';\n                else\n                    return 'snippet_scoreboard-classic__row--casual';\n            default:\n                return 'snippet_scoreboard-classic__row--casual';\n        }\n    }\n    function _HighlightSortStatLabel(stat) {\n        for (let el of _m_cP.FindChildrenWithClassTraverse('sb-row__cell')) {\n            if (el && el.IsValid()) {\n                if (el.BHasClass('sb-row__cell--' + stat)) {\n                    el.AddClass('sortstat');\n                }\n                else {\n                    el.RemoveClass('sortstat');\n                }\n            }\n        }\n    }\n    function _CreateLabelForStat(stat, set, isHidden) {\n        let elLabelRow = $('#id-sb-players-table__labels-row__inner');\n        if (!elLabelRow || !elLabelRow.IsValid())\n            return;\n        let elLabelRowOrSet = elLabelRow;\n        if (set !== '') {\n            let labelSetContainerId = 'id-sb-row__set-container';\n            let elLabelSetContainer = $('#' + labelSetContainerId);\n            if (!elLabelSetContainer || !elLabelSetContainer.IsValid()) {\n                elLabelSetContainer = $.CreatePanel('Panel', elLabelRow, labelSetContainerId);\n                elLabelSetContainer.BLoadLayoutSnippet('snippet_sb-label-set-container');\n                if ($('#id-sb-row__set-container')) {\n                    $('#id-sb-meta__cycle').RemoveClass('hidden');\n                }\n            }\n            let elSetLabels = elLabelSetContainer.FindChildTraverse('id-sb-row__sets');\n            let LabelSetId = 'id-sb-labels-set-' + set;\n            let elLabelSet = elSetLabels.FindChildTraverse(LabelSetId);\n            let elLabelSetClasses = [];\n            if (!elLabelSet || !elLabelSet.IsValid()) {\n                _m_dataSetGetCount++;\n                elLabelSet = $.CreatePanel('Panel', elSetLabels, LabelSetId);\n                elLabelSetClasses.push('sb-row__set', 'no-hover');\n            }\n            elLabelRowOrSet = elLabelSet;\n            if (set != _m_dataSetCurrent.toString()) {\n                elLabelSetClasses.push('hidden');\n            }\n            if (elLabelSetClasses.length > 0) {\n                elLabelSet.AddClasses(elLabelSetClasses);\n            }\n        }\n        let elStatPanel = elLabelRowOrSet.FindChildInLayoutFile('id-sb-' + stat);\n        if (!elStatPanel || !elStatPanel.IsValid()) {\n            let statPanelClasses = ['sb-row__cell', 'sb-row__cell--' + stat, 'sb-row__cell--label'].join(\" \");\n            elStatPanel = $.CreatePanel('Button', elLabelRowOrSet, 'id-sb-' + stat, { class: statPanelClasses });\n            let elStatLabel;\n            if (stat === 'ping') {\n                elStatLabel = $.CreatePanel('Image', elStatPanel, 'label-' + elStatPanel.id);\n                elStatLabel.SetImage('file://{images}/icons/ui/ping_4.svg');\n            }\n            else {\n                elStatLabel = $.CreatePanel('Label', elStatPanel, 'label-' + elStatPanel.id);\n                if (isHidden == '1') {\n                    elStatLabel.text = '';\n                }\n                else {\n                    elStatLabel.text = $.Localize('#Scoreboard_' + stat);\n                }\n            }\n            let toolTipString = $.Localize('#Scoreboard_' + stat + '_tooltip');\n            if (toolTipString !== '') {\n                elStatLabel.SetPanelEvent('onmouseover', () => UiToolkitAPI.ShowTextTooltip(elStatLabel.id, toolTipString));\n                elStatLabel.SetPanelEvent('onmouseout', () => UiToolkitAPI.HideTextTooltip());\n            }\n            elStatPanel.SetPanelEvent('onactivate', () => {\n                let newSortOrder = { 'dc': 0 };\n                let modeDefaultSortOrder = _GetSortOrderForMode(MockAdapter.GetGameModeInternalName(false));\n                if (stat in modeDefaultSortOrder)\n                    newSortOrder[stat] = modeDefaultSortOrder[stat];\n                else\n                    return;\n                _HighlightSortStatLabel(stat);\n                for (let s in modeDefaultSortOrder) {\n                    if (s == stat)\n                        continue;\n                    if (s == 'dc')\n                        continue;\n                    newSortOrder[s] = modeDefaultSortOrder[s];\n                }\n                _m_sortOrder = newSortOrder;\n                for (let i = 0; i < _m_oPlayers.GetCount(); i++) {\n                    let oPlayer = _m_oPlayers.GetPlayerByIndex(i);\n                    _SortPlayer(oPlayer);\n                }\n            });\n        }\n    }\n    function _GetCustomStatTextValue(stat, oPlayer) {\n        let szCustomLabel = null;\n        if (stat === 'ping') {\n            if (oPlayer.GetGameStat('status') == 15) {\n                szCustomLabel = '#SFUI_scoreboard_lbl_dc';\n            }\n            else if (IsTeamASpecTeam(oPlayer.m_team?.m_teamName || '')) {\n                szCustomLabel = '#SFUI_scoreboard_lbl_spec';\n            }\n        }\n        return szCustomLabel;\n    }\n    function _CreatePlayerButtons(oPlayer) {\n        if ((oPlayer.m_xuid == '') || MockAdapter.IsFakePlayer(oPlayer.m_xuid))\n            return;\n        const xuid = oPlayer.m_elPlayer ? oPlayer.m_elPlayer.m_xuid : '';\n        for (let entry of ContextmenuPlayerCard.ContextMenus) {\n            if (entry.AvailableForItem(xuid)) {\n                if (!oPlayer.m_oElStats.hasOwnProperty(entry.name))\n                    continue;\n                const elContextMenuBtns = oPlayer.m_oElStats[entry.name];\n                if ('xml' in entry) {\n                    let elEntryBtn = $.CreatePanel('Panel', elContextMenuBtns, entry.name, {\n                        class: 'cell__button',\n                        style: 'tooltip-position: bottom;'\n                    });\n                    elEntryBtn.BLoadLayout(entry.xml, false, false);\n                }\n                else {\n                    let elEntryBtn = $.CreatePanel('Button', elContextMenuBtns, entry.name + '_' + xuid, {\n                        class: 'cell__button',\n                        style: 'tooltip-position: bottom;'\n                    });\n                    $.CreatePanel('Image', elEntryBtn, entry.name, { src: 'file://{images}/icons/ui/' + entry.icon + '.svg' });\n                    let tooltip = '#tooltip_' + entry.name;\n                    if ('IsDisabled' in entry) {\n                        if (entry.IsDisabled()) {\n                            elEntryBtn.enabled = false;\n                            tooltip = '#tooltip_disabled_' + entry.name;\n                        }\n                        else {\n                            elEntryBtn.enabled = true;\n                        }\n                    }\n                    let onSelected = entry.OnSelected;\n                    elEntryBtn.SetPanelEvent('onactivate', () => onSelected(xuid, ''));\n                    {\n                        elEntryBtn.SetPanelEvent('onmouseover', () => UiToolkitAPI.ShowTextTooltip(elEntryBtn.id, tooltip));\n                        elEntryBtn.SetPanelEvent('onmouseout', () => UiToolkitAPI.HideTextTooltip());\n                    }\n                }\n            }\n        }\n    }\n    function _NewPlayerPanel(oPlayer) {\n        if (!oPlayer.m_elTeam || !oPlayer.m_elTeam.IsValid())\n            return;\n        oPlayer.m_elPlayer = $.CreatePanel('Panel', oPlayer.m_elTeam, 'player-' + oPlayer.m_xuid);\n        oPlayer.m_elPlayer.m_xuid = oPlayer.m_xuid;\n        _Helper_LoadSnippet(oPlayer.m_elPlayer, _GetPlayerRowForGameMode());\n        _CreateLabelsForRow(oPlayer.m_elPlayer);\n        oPlayer.m_elPlayer.m_elSkillGroup = oPlayer.m_elPlayer.FindChildTraverse('jsRatingEmblem');\n        {\n            _RegisterStatUpdate('teamname');\n            _RegisterStatUpdate('musickit');\n            _RegisterStatUpdate('status');\n            _RegisterStatUpdate('skillgroup');\n            _RegisterStatUpdate('leader');\n            _RegisterStatUpdate('teacher');\n            _RegisterStatUpdate('friendly');\n            _RegisterStatUpdate('honoricon');\n        }\n        let idx = 0;\n        function _InitStatCell(elStatCell, oPlayer) {\n            if (!elStatCell || !elStatCell.IsValid())\n                return;\n            const stat = elStatCell.GetAttributeString('data-stat', '');\n            let children = elStatCell.Children();\n            for (let i = 0; i < children.length; i++) {\n                _InitStatCell(children[i], oPlayer);\n            }\n            if (stat === '') {\n                return;\n            }\n            oPlayer.m_oElStats[stat] = elStatCell;\n            if (oPlayer.m_oElStats[stat]) {\n                let elLabel = oPlayer.m_oElStats[stat].FindChildTraverse('label');\n                oPlayer.m_oElStats[stat].m_elLabel = elLabel;\n                let elImg = oPlayer.m_oElStats[stat].FindChildTraverse('image');\n                oPlayer.m_oElStats[stat].m_elImage = elImg;\n            }\n            let elStatCellClasses = ['sb-row__cell', 'sb-row__cell--' + stat];\n            const set = elStatCell.GetAttributeString('data-set', '');\n            if (set !== '') {\n                let SetContainerId = 'id-sb-row__set-container';\n                let elParent = elStatCell.GetParent();\n                let elSetContainer = oPlayer.m_elPlayer.FindChildTraverse(SetContainerId);\n                if (!elSetContainer || !elSetContainer.IsValid()) {\n                    elSetContainer = $.CreatePanel('Panel', elParent, SetContainerId);\n                    elParent.MoveChildAfter(elSetContainer, elStatCell);\n                }\n                let setId = 'id-sb-set-' + set;\n                let elSetClasses = [];\n                let elSet = elSetContainer.FindChildTraverse(setId);\n                if (!elSet || !elSet.IsValid) {\n                    elSet = $.CreatePanel('Panel', elSetContainer, setId);\n                    elSetClasses.push('sb-row__set', 'no-hover');\n                    idx = 0;\n                }\n                elStatCell.SetParent(elSet);\n                if (set != _m_dataSetCurrent.toString()) {\n                    elSetClasses.push('hidden');\n                }\n                if (elSetClasses.length > 0) {\n                    elSet.AddClasses(elSetClasses);\n                }\n            }\n            if (idx++ % 2)\n                elStatCellClasses.push('sb-row__cell--dark');\n            elStatCell.AddClasses(elStatCellClasses);\n            const isHidden = elStatCell.GetAttributeString('data-hidden', '');\n            if (!isHidden) {\n                _RegisterStatUpdate(stat);\n            }\n        }\n        const elStatCells = oPlayer.m_elPlayer.Children();\n        for (let i = 0; i < elStatCells.length; i++) {\n            _InitStatCell(elStatCells[i], oPlayer);\n        }\n        _CreatePlayerButtons(oPlayer);\n        oPlayer.m_oStats = {};\n        oPlayer.m_oStats['idx'] = GameStateAPI.GetPlayerSlot(oPlayer.m_xuid);\n        oPlayer.m_elPlayer.SetPanelEvent('onmouseover', () => { _m_arrSortingPausedRefGetCounter++; });\n        oPlayer.m_elPlayer.SetPanelEvent('onmouseout', () => { _m_arrSortingPausedRefGetCounter--; });\n        if (MockAdapter.IsXuidValid(oPlayer.m_xuid)) {\n            oPlayer.m_elPlayer.SetPanelEvent('onactivate', () => {\n                _m_arrSortingPausedRefGetCounter++;\n                let elPlayerCardContextMenu = UiToolkitAPI.ShowCustomLayoutContextMenuParametersDismissEventSetFocus('', '', 'file://{resources}/layout/context_menus/context_menu_playercard.xml', 'xuid=' + oPlayer.m_xuid, _OnPlayerCardDismiss, false);\n                if (elPlayerCardContextMenu) {\n                    elPlayerCardContextMenu.AddClass('ContextMenu_NoArrow');\n                }\n                if (!_m_hDenyInputToGame) {\n                    _m_hDenyInputToGame = UiToolkitAPI.AddDenyInputFlagsToGame(elPlayerCardContextMenu, 'ScoreboardPlayercard', 'CaptureMouse');\n                }\n            });\n        }\n        return oPlayer.m_elPlayer;\n    }\n    function _OnPlayerCardDismiss() {\n        _m_arrSortingPausedRefGetCounter--;\n        if (_m_hDenyInputToGame) {\n            UiToolkitAPI.ReleaseDenyInputFlagsToGame(_m_hDenyInputToGame);\n            _m_hDenyInputToGame = null;\n        }\n    }\n    function _UpdateMatchInfo() {\n        if (!_m_bInit)\n            return;\n        let updateMapLabel = false;\n        let queueChanged = false;\n        let imagePathChanged = false;\n        const mi = GameStateAPI.GetMatchInfoJSO();\n        const server_name = _m_haveViewers ? '' : mi.server_name;\n        const map_name = mi.map_name;\n        const map_bsp_name = mi.map_bsp_name;\n        const gamemode_name = mi.gamemode_name;\n        const gamemode_internal_name = mi.gamemode_internal_name;\n        const gamemode_image_path = mi.gamemode_image_path;\n        const tournament_stage = mi.tournament_stage;\n        const is_queued_mm_team = mi.is_queued_mm_team;\n        const is_demo_or_hltv = mi.is_demo_or_hltv;\n        if (_m_cP.m_matchInfo == undefined) {\n            updateMapLabel = true;\n            queueChanged = true;\n            imagePathChanged = true;\n            _m_cP.m_matchInfo = { ...mi };\n        }\n        else {\n            if ((_m_cP.m_matchInfo.server_name !== server_name)\n                || (_m_cP.m_matchInfo.map_name !== map_name)\n                || (_m_cP.m_matchInfo.gamemode_name !== gamemode_name)\n                || (_m_cP.m_matchInfo.tournament_stage !== tournament_stage)\n                || (_m_cP.m_matchInfo.map_bsp_name !== map_bsp_name)\n                || (_m_cP.m_matchInfo.gamemode_internal_name !== gamemode_internal_name)) {\n                updateMapLabel = true;\n            }\n            if (_m_cP.m_matchInfo.gamemode_image_path !== gamemode_image_path) {\n                imagePathChanged = true;\n            }\n            if (_m_cP.m_matchInfo.is_queued_mm_team !== is_queued_mm_team) {\n                updateMapLabel = true;\n                queueChanged = true;\n            }\n            if (updateMapLabel || imagePathChanged || queueChanged || (_m_cP.m_matchInfo.is_demo_or_hltv !== is_demo_or_hltv)) {\n                _m_cP.m_matchInfo = { ...mi };\n            }\n        }\n        if (updateMapLabel) {\n            _m_cP.SetDialogVariable('server_name', server_name);\n            _m_cP.SetDialogVariable('map_name', map_name);\n            _m_cP.SetDialogVariable('gamemode_name', gamemode_name);\n            _m_cP.SetDialogVariable('tournament_stage', tournament_stage);\n            const elMapLabel = _m_panelCache.m_elMetaLabelsModeMap;\n            if (elMapLabel) {\n                if (MatchStatsAPI.IsTournamentMatch()) {\n                    const labelText = $.Localize('{s:tournament_stage} | {s:map_name}', _m_cP);\n                    elMapLabel.text = labelText;\n                }\n                else {\n                    let strLocalizeScoreboardTitle = '{s:gamemode_name} | {s:map_name}';\n                    const mode = gamemode_internal_name;\n                    if ((mode === 'competitive' || mode === 'premier') &&\n                        (GameTypesAPI.GetMapGroupAttribute('mg_' + map_bsp_name, 'competitivemod') === 'unranked')) {\n                        strLocalizeScoreboardTitle = $.Localize('#SFUI_RankType_Modifier_Unranked', _m_cP) + ' | {s:map_name}';\n                    }\n                    else if (is_queued_mm_team) {\n                        let sMapName = '{s:map_name}';\n                        if (map_bsp_name === 'lobby_mapveto')\n                            sMapName = $.Localize('#matchdraft_arena_name', _m_cP);\n                        strLocalizeScoreboardTitle = $.Localize('#SFUI_GameModeCompetitiveTeams', _m_cP) + ' | ' + sMapName;\n                    }\n                    const labelText = $.Localize(strLocalizeScoreboardTitle, _m_cP);\n                    elMapLabel.text = labelText;\n                }\n            }\n        }\n        const elMetaModeImage = _m_panelCache.m_metaModeImage;\n        const updateModeImage = (queueChanged || (!is_queued_mm_team && imagePathChanged));\n        if (elMetaModeImage && updateModeImage) {\n            if (is_queued_mm_team)\n                elMetaModeImage.SetImage('file://{images}/icons/ui/competitive_teams.svg');\n            else\n                elMetaModeImage.SetImage(gamemode_image_path);\n        }\n        const elMetaLabelsMap = _m_panelCache.m_metaLabelsMap;\n        if (elMetaLabelsMap) {\n            elMetaLabelsMap.SetImage('file://{images}/map_icons/map_icon_' + map_bsp_name + '.svg');\n        }\n        const elCoopStats = _m_panelCache.m_coopStats;\n        if (elCoopStats) {\n            let questID = GameStateAPI.GetActiveQuestID();\n            if (questID > 0) {\n                elCoopStats.AddClass('show-mission-desc');\n                let elLabel = elCoopStats.FindChildInLayoutFile('MissionDescriptionLabel');\n                if (elLabel) {\n                    let strMissionDescriptionToken = MissionsAPI.GetQuestDefinitionField(questID, 'loc_description');\n                    elLabel.text = $.Localize(strMissionDescriptionToken, elCoopStats);\n                }\n            }\n        }\n        if (!is_demo_or_hltv) {\n            let oPlayer = _m_oPlayers.GetPlayerByXuid(GetLocalPlayerId());\n            if (oPlayer && oPlayer.m_team) {\n                oPlayer.m_team.CalculateAllCommends();\n            }\n        }\n        const elMouseBinding = _m_panelCache.m_elMouseBinding;\n        if (elMouseBinding && elMouseBinding.IsValid()) {\n            let bind = GameInterfaceAPI.GetSettingString('cl_scoreboard_mouse_enable_binding');\n            if (bind.charAt(0) == '+' || bind.charAt(0) == '-')\n                bind = bind.substring(1);\n            if ((elMouseBinding.m_bindStr == undefined) || (bind != elMouseBinding.m_bindStr)) {\n                elMouseBinding.m_bindStr = bind;\n                elMouseBinding.SetDialogVariable('scoreboard_mouse_enable_bind', $.Localize(`{s:bind_${bind}}`, elMouseBinding));\n                let strinstruction = $.Localize('#Scoreboard_Mouse_Enable_Instruction', elMouseBinding);\n                elMouseBinding.text = $.Localize('#Scoreboard_Mouse_Enable_Instruction', elMouseBinding);\n            }\n        }\n        const elFooterWebsite = _m_panelCache.m_elFooterWebsite;\n        if (elFooterWebsite && elFooterWebsite.IsValid()) {\n            const strWebsiteURL = MatchStatsAPI.GetServerWebsiteURL(false);\n            if (strWebsiteURL) {\n                elFooterWebsite.SetHasClass('hidden', false);\n                elFooterWebsite.SetPanelEvent('onmouseover', () => UiToolkitAPI.ShowTextTooltip('id-sb-footer-server-website', strWebsiteURL));\n                elFooterWebsite.SetPanelEvent('onmouseout', () => UiToolkitAPI.HideTextTooltip());\n            }\n            else {\n                elFooterWebsite.SetHasClass('hidden', true);\n            }\n        }\n    }\n    function _UpdateHLTVViewerNumber(nViewers) {\n        _m_cP.SetDialogVariableInt('viewers', nViewers);\n        _m_haveViewers = nViewers > 0;\n        _m_cP.SetDialogVariable('hltv_viewers', _m_haveViewers ? $.Localize('#Scoreboard_Viewers', _m_cP) : '');\n    }\n    function _UpdateRound(rnd, oScoreData, jsoTime) {\n        if (!_SupportsTimeline(jsoTime))\n            return;\n        if (!oScoreData)\n            return;\n        if (!jsoTime)\n            return;\n        if (!('teamdata' in oScoreData))\n            return;\n        let elTimeline = _m_panelCache.m_elTimelineSegments;\n        if (!elTimeline || !elTimeline.IsValid())\n            return;\n        let elRnd = ((rnd >= 0) && (rnd < _m_panelCache.m_elRounds.length)) ? _m_panelCache.m_elRounds[rnd] : undefined;\n        if (!elRnd || !elRnd.IsValid())\n            return;\n        let elRndTop = elRnd.m_elRndTop;\n        let elRndBot = elRnd.m_elRndBot;\n        let elRndTick = elRnd.m_elRndTick;\n        let elRndTickLabel = elRnd.m_elRndTickLabel;\n        let elTick = elRndTick;\n        elRndTop.m_elResult.SetImage('');\n        elRndBot.m_elResult.SetImage('');\n        elRndTop.SetDialogVariable('sb_clinch', '');\n        elRndBot.SetDialogVariable('sb_clinch', '');\n        if (elTick && elTick.IsValid()) {\n            elTick.SetHasClass('hilite', rnd <= jsoTime.rounds_played + 1);\n        }\n        if (rnd > jsoTime.rounds_played) {\n            let bCanClinch = jsoTime.can_clinch;\n            if (bCanClinch) {\n                let numToClinch = jsoTime.num_wins_to_clinch;\n                let topClinchRound = jsoTime.rounds_played + numToClinch - m_topScore;\n                let bThisRoundIsClinchTop = rnd == topClinchRound;\n                let botClinchRound = jsoTime.rounds_played + numToClinch - m_botScore;\n                let bThisRoundIsClinchBot = rnd == botClinchRound;\n                let bShowClinchTop = (bThisRoundIsClinchTop && topClinchRound <= botClinchRound);\n                let bShowClinchBot = (bThisRoundIsClinchBot && botClinchRound <= topClinchRound);\n                let thisRoundIsClinchAndShowIt = false;\n                if (bShowClinchTop) {\n                    elRndTop.m_elResult.SetImage(dictRoundResultImage['win']);\n                    thisRoundIsClinchAndShowIt = true;\n                }\n                if (bShowClinchBot) {\n                    elRndBot.m_elResult.SetImage(dictRoundResultImage['win']);\n                    thisRoundIsClinchAndShowIt = true;\n                }\n                let roundIsPastClinch = (rnd > topClinchRound || rnd > botClinchRound);\n                elRnd.SetHasClass('past-clinch', roundIsPastClinch);\n                elRnd.SetHasClass('clinch-round', thisRoundIsClinchAndShowIt);\n            }\n            elRndTick.RemoveClasses(['sb-team--CT', 'sb-team--TERRORIST']);\n            elRndTickLabel.RemoveClasses(['sb-team--CT', 'sb-team--TERRORIST']);\n            function _ClearCasualties(elRnd) {\n                for (let i = 1; i <= 5; i++) {\n                    let img = elRnd.m_elCasualties[i];\n                    if (!img)\n                        break;\n                    img.AddClass('hidden');\n                }\n            }\n            ;\n            _ClearCasualties(elRndTop);\n            _ClearCasualties(elRndBot);\n            return;\n        }\n        let bFlippedSides = false;\n        if (MockAdapter.AreTeamsPlayingSwitchedSides() !== MockAdapter.AreTeamsPlayingSwitchedSidesInRound(rnd)) {\n            bFlippedSides = true;\n            let elTemp = elRndTop;\n            elRndTop = elRndBot;\n            elRndBot = elTemp;\n        }\n        elRndTop.AddClass('sb-team--CT');\n        elRndBot.AddClass('sb-team--TERRORIST');\n        const roundData = oScoreData.rounddata[rnd];\n        if (typeof roundData !== 'object') {\n            return;\n        }\n        let result = roundData.result;\n        if (result.charAt(0) === 'c') {\n            if (bFlippedSides)\n                m_botScore++;\n            else\n                m_topScore++;\n            if ((result.charAt(1) === 't') && (result.charAt(2) === '_')) {\n                result = result.substring(3);\n            }\n            if ((MockAdapter.GetGameModeInternalName(false) == 'rush')) {\n                result = \"win_rush\";\n            }\n            elRndTop.m_elResult.SetImage(dictRoundResultImage[result]);\n            elRndTop.m_elResult.AddClass('sb-timeline__segment__round--active');\n            elRndBot.m_elResult.SetImage('');\n            elRndBot.m_elResult.RemoveClass('sb-timeline__segment__round--active');\n            elRndTick.AddClass('sb-team--CT');\n            elRndTickLabel.AddClass('sb-team--CT');\n            elRndTick.RemoveClass('sb-team--TERRORIST');\n            elRndTickLabel.RemoveClass('sb-team--TERRORIST');\n        }\n        else if (result.charAt(0) === 't') {\n            if (bFlippedSides)\n                m_topScore++;\n            else\n                m_botScore++;\n            if (result.charAt(1) === '_') {\n                result = result.substring(2);\n            }\n            if ((MockAdapter.GetGameModeInternalName(false) == 'rush')) {\n                result = \"win_rush\";\n            }\n            elRndBot.m_elResult.SetImage(dictRoundResultImage[result]);\n            elRndBot.m_elResult.AddClass('sb-timeline__segment__round--active');\n            elRndTop.m_elResult.SetImage('');\n            elRndTop.m_elResult.RemoveClass('sb-timeline__segment__round--active');\n            elRndTick.AddClass('sb-team--TERRORIST');\n            elRndTickLabel.AddClass('sb-team--TERRORIST');\n            elRndTick.RemoveClass('sb-team--CT');\n            elRndTickLabel.RemoveClass('sb-team--CT');\n        }\n        let _UpdateCasualties = (teamName, elRnd, nPlayers) => {\n            if (_m_oTeams[teamName]) {\n                let livingCount = teamName === 'CT' ? roundData.players_alive_CT : roundData.players_alive_TERRORIST;\n                for (let i = 1; i <= nPlayers; i++) {\n                    let img = elRnd.m_elCasualties[i];\n                    if (!img)\n                        break;\n                    img.RemoveClass('hidden');\n                    if (i > livingCount) {\n                        img.AddClass('dead-casualty');\n                    }\n                    else {\n                        img.RemoveClass('dead-casualty');\n                    }\n                }\n            }\n        };\n        let nPlayers = 5;\n        if (MockAdapter.GetGameModeInternalName(false) == 'scrimcomp2v2') {\n            nPlayers = 2;\n        }\n        _UpdateCasualties('CT', elRndTop, nPlayers);\n        _UpdateCasualties('TERRORIST', elRndBot, nPlayers);\n    }\n    function _ShowSurvivors(hide = false) {\n        let elTimeline = _m_panelCache.m_elTimelineSegments;\n        if (!elTimeline || !elTimeline.IsValid())\n            return;\n        let arrPanelsToToggleTransparency = elTimeline.FindChildrenWithAttributeTraverse('data-casualty-mouse-over-toggle-transparency');\n        arrPanelsToToggleTransparency.forEach(el => el.SetHasClass('transparent', hide));\n    }\n    function _Casualties_OnMouseOver() {\n        if (GameInterfaceAPI.GetSettingString('cl_scoreboard_survivors_always_on') == '0') {\n            _ShowSurvivors();\n        }\n    }\n    function _Casualties_OnMouseOut() {\n        if (GameInterfaceAPI.GetSettingString('cl_scoreboard_survivors_always_on') == '0') {\n            _ShowSurvivors(true);\n        }\n        UiToolkitAPI.HideCustomLayoutTooltip('id-tooltip-sb-casualties');\n    }\n    function _RoundLossBonusMoneyForTeam(teamname) {\n        let nLossAmount = MockAdapter.GetTeamNextRoundLossBonus(teamname);\n        let nMaxLoss = parseInt(GameInterfaceAPI.GetSettingString('mp_consecutive_loss_max'));\n        if (nLossAmount > nMaxLoss) {\n            nLossAmount = nMaxLoss;\n        }\n        if (nLossAmount < 0) {\n            nLossAmount = 0;\n        }\n        let nBaseAmount = parseInt(GameInterfaceAPI.GetSettingString('cash_team_loser_bonus'));\n        let nConsecutiveBonus = parseInt(GameInterfaceAPI.GetSettingString('cash_team_loser_bonus_consecutive_rounds'));\n        let nTotalAmount = nBaseAmount + (nLossAmount * nConsecutiveBonus);\n        return nTotalAmount;\n    }\n    function _RoundLossBonusMoney_OnMouseOver_CT() {\n        _m_cP.SetDialogVariable('round_loss_income_team', $.Localize('#counter-terrorists'));\n        _m_cP.SetDialogVariableInt('round_loss_income_amount', _RoundLossBonusMoneyForTeam('CT'));\n        let sTooltipText = $.Localize('#Scoreboard_lossmoneybonus_tooltip', _m_cP);\n        UiToolkitAPI.ShowTextTooltip('id-sb-timeline__round-loss-bonus-money', sTooltipText);\n    }\n    function _RoundLossBonusMoney_OnMouseOut_CT() {\n        UiToolkitAPI.HideTextTooltip();\n    }\n    function _RoundLossBonusMoney_OnMouseOver_TERRORIST() {\n        _m_cP.SetDialogVariable('round_loss_income_team', $.Localize('#terrorists'));\n        _m_cP.SetDialogVariableInt('round_loss_income_amount', _RoundLossBonusMoneyForTeam('TERRORIST'));\n        let sTooltipText = $.Localize('#Scoreboard_lossmoneybonus_tooltip', _m_cP);\n        UiToolkitAPI.ShowTextTooltip('id-sb-timeline__round-loss-bonus-money', sTooltipText);\n    }\n    function _RoundLossBonusMoney_OnMouseOut_TERRORIST() {\n        UiToolkitAPI.HideTextTooltip();\n    }\n    const defaultScoreTeamData = {\n        team_name: '',\n        team_number: 0,\n        team_logo_image_path: '',\n        clan_id: 0,\n        clan_name: '',\n        flag: '',\n        logo: '',\n        map_victories: 0,\n        player_count: 0,\n        alive_count: -1,\n        score: 0,\n        score_1h: undefined,\n        score_2h: undefined,\n        score_ot: undefined,\n        surrendered: undefined,\n        next_round_loss_bonus: 0,\n    };\n    function _UpdateTeamInfo(teamName, teamInfo) {\n        let team = Team_t.GetOrCreateTeam(_m_cP, teamName);\n        let clanName = teamInfo.clan_name;\n        let teamLogoImagePath = teamInfo.team_logo_image_path;\n        let total = teamInfo.player_count;\n        let living = teamInfo.alive_count;\n        let updateLogo = (teamLogoImagePath != team.m_teamLogoImagePath) && (teamLogoImagePath != '');\n        team.m_teamLogoImagePath = teamLogoImagePath;\n        _m_cP.SetDialogVariable('sb_team_name--' + teamName, clanName);\n        _m_cP.SetDialogVariableInt(teamName + '_alive', living);\n        _m_cP.SetDialogVariableInt(teamName + '_total', total);\n        if (updateLogo) {\n            const elLogoChildren = team.m_elLogoChildren;\n            for (const elTeamLogoBackground of elLogoChildren) {\n                elTeamLogoBackground.style.backgroundImage = `url(\"file://{images}${teamLogoImagePath}\")`;\n                elTeamLogoBackground.AddClass('sb-team-logo-bg');\n            }\n        }\n    }\n    function _UpdateTeams(oScoreData) {\n        function TeamInfoForName(name, teamdata) {\n            let info = defaultScoreTeamData;\n            for (let td of teamdata) {\n                if (td.team_name == name) {\n                    info = td;\n                    break;\n                }\n            }\n            return info;\n        }\n        const teamdata = (oScoreData ? oScoreData.teamdata : []);\n        for (const teamName in _m_oTeams) {\n            const teamData = TeamInfoForName(teamName, teamdata);\n            _UpdateTeamInfo(teamName, teamData);\n            if (teamData) {\n                _m_cP.SetDialogVariableInt('sb_team_score--' + teamName, teamData.score);\n                if (teamData.score_1h !== undefined) {\n                    _m_cP.SetDialogVariableInt('sb_team_score_2--' + teamName, teamData.score_1h);\n                }\n                if (teamData.score_2h !== undefined) {\n                    _m_cP.SetDialogVariableInt('sb_team_score_3--' + teamName, teamData.score_2h);\n                }\n                let hideOt = true;\n                if (teamData.score_ot !== undefined) {\n                    hideOt = false;\n                    _m_cP.SetDialogVariableInt('sb_team_score_ot--' + teamName, teamData.score_ot);\n                }\n                let elOTScore = _m_panelCache.m_elTimelineScoreOt;\n                if (elOTScore) {\n                    elOTScore.SetHasClass('hidden', hideOt);\n                    elOTScore.SetHasClass('fade', hideOt);\n                }\n            }\n        }\n    }\n    function _InitClassicTeams() {\n        _UpdateTeamInfo('TERRORIST', defaultScoreTeamData);\n        _UpdateTeamInfo('CT', defaultScoreTeamData);\n    }\n    let m_topScore = 0;\n    let m_botScore = 0;\n    function _UpdateAllRounds(oScoreData, jsoTime) {\n        if (!jsoTime)\n            return;\n        if (!oScoreData)\n            return;\n        if (!_SupportsTimeline(jsoTime))\n            return;\n        let firstRound = jsoTime.first_round_this_period;\n        let lastRound = jsoTime.last_round_this_period;\n        m_topScore = 0;\n        m_botScore = 0;\n        if (jsoTime.overtime > 0) {\n            m_topScore = (jsoTime.maxrounds + (jsoTime.overtime - 1) * jsoTime.maxrounds_overtime) / 2;\n            m_botScore = (jsoTime.maxrounds + (jsoTime.overtime - 1) * jsoTime.maxrounds_overtime) / 2;\n        }\n        for (let rnd = firstRound; rnd <= lastRound; rnd++) {\n            _UpdateRound(rnd, oScoreData, jsoTime);\n        }\n    }\n    function _UpdateScore_Classic() {\n        if (Object.keys(_m_oTeams).length === 0) {\n            _InitClassicTeams();\n        }\n        let oScoreData = MockAdapter.GetScoreDataJSO();\n        let jsoTime = MockAdapter.GetTimeDataJSO();\n        _UpdateTeams(oScoreData);\n        if (!jsoTime)\n            return;\n        let currentRound = jsoTime.rounds_played + 1;\n        _m_cP.SetDialogVariable('match_phase', $.Localize('#gamephase_' + jsoTime.gamephase));\n        _m_cP.SetDialogVariableInt('rounds_remaining', jsoTime.rounds_remaining);\n        _m_cP.SetDialogVariableInt('scoreboard_ot', jsoTime.overtime);\n        _m_cP.SetHasClass('sb-tournament-match', MatchStatsAPI.IsTournamentMatch());\n        let bResetTimeline = false;\n        if (_m_maxRounds != jsoTime.maxrounds_this_period) {\n            bResetTimeline = true;\n            _m_maxRounds = jsoTime.maxrounds_this_period;\n        }\n        if (_m_areTeamsSwapped !== MockAdapter.AreTeamsPlayingSwitchedSides()) {\n            bResetTimeline = true;\n            _m_areTeamsSwapped = MockAdapter.AreTeamsPlayingSwitchedSides();\n        }\n        if (!_SupportsTimeline(jsoTime)) {\n            bResetTimeline = true;\n        }\n        if (_m_overtime != jsoTime.overtime) {\n            _m_overtime = jsoTime.overtime;\n            bResetTimeline = true;\n        }\n        if (bResetTimeline || !(currentRound in _m_RoundUpdated)) {\n            if (bResetTimeline) {\n                let shouldUpdateRounds = false;\n                _ResetTimeline(oScoreData, jsoTime, shouldUpdateRounds);\n            }\n            _UpdateAllRounds(oScoreData, jsoTime);\n            _m_RoundUpdated[currentRound] = true;\n        }\n        else {\n            if (oScoreData) {\n                _UpdateRound(currentRound - 1, oScoreData, jsoTime);\n            }\n        }\n        _UpdateRoundLossBonus(oScoreData.teamdata);\n    }\n    function _InsertTimelineDivider() {\n        let elTimeline = _m_panelCache.m_elTimelineSegments;\n        if (!elTimeline || !elTimeline.IsValid())\n            return;\n        let elDivider = $.CreatePanel('Panel', elTimeline, 'id-sb-timeline__divider');\n        elDivider.AddClass('sb-timeline__divider');\n    }\n    function _InitTimelineSegment(startRound, endRound, phase) {\n        let elTimeline = _m_panelCache.m_elTimelineSegments;\n        if (!elTimeline || !elTimeline.IsValid())\n            return;\n        elTimeline.AddClass('sb-team-tint');\n        let id = 'id-sb-timeline__segment--' + phase;\n        let elSegment = elTimeline.FindChildTraverse(id);\n        if (!elSegment || !elSegment.IsValid()) {\n            elSegment = $.CreatePanel('Panel', elTimeline, id);\n            elSegment.BLoadLayoutSnippet('snippet_scoreboard-classic__timeline__segment');\n        }\n        let elRoundContainer = elSegment.FindChildTraverse('id-sb-timeline__round-container');\n        if (elRoundContainer && elRoundContainer.IsValid()) {\n            for (let rnd = startRound; rnd <= endRound; rnd++) {\n                const rndStr = rnd.toString();\n                let elRnd = elSegment.FindChildTraverse(rndStr);\n                if (!elRnd || !elRnd.IsValid()) {\n                    elRnd = $.CreatePanel('Panel', elRoundContainer, rndStr);\n                    elRnd.BLoadLayoutSnippet('snippet_scoreboard-classic__timeline__segment__round');\n                    let elTop = elRnd.FindChildTraverse('id-sb-timeline__segment__round--top');\n                    elTop.BLoadLayoutSnippet('snippet_scoreboard-classic__timeline__segment__round__data');\n                    let elBot = elRnd.FindChildTraverse('id-sb-timeline__segment__round--bot');\n                    elBot.BLoadLayoutSnippet('snippet_scoreboard-classic__timeline__segment__round__data');\n                    let elRndTickLabel = elRnd.FindChildTraverse('id-sb-timeline__segment__round__tick__label');\n                    if (rnd % 5 == 0) {\n                        elRndTickLabel.text = rndStr;\n                    }\n                    elTop.SetDialogVariable('sb_clinch', '');\n                    elBot.SetDialogVariable('sb_clinch', '');\n                    let elRndCache = elRnd;\n                    elRndCache.m_elRndTop = elTop;\n                    elRndCache.m_elRndBot = elBot;\n                    elRndCache.m_elRndTop.m_elResult = elRndCache.m_elRndTop.FindChildTraverse('result');\n                    elRndCache.m_elRndBot.m_elResult = elRndCache.m_elRndBot.FindChildTraverse('result');\n                    _InitCasualties(elRndCache.m_elRndTop);\n                    _InitCasualties(elRndCache.m_elRndBot);\n                    function _InitCasualties(elRndSeg) {\n                        elRndSeg.m_elCasualties = [];\n                        elRndSeg.m_elCasualties.push(null);\n                        for (let i = 1; i <= 5; i++) {\n                            elRndSeg.m_elCasualties.push(elRndSeg.FindChildTraverse('casualty-' + i));\n                        }\n                    }\n                    elRndCache.m_elRndTick = elRnd.FindChildTraverse('id-sb-timeline__segment__round__tick');\n                    elRndCache.m_elRndTickLabel = elRndTickLabel;\n                    _m_panelCache.m_elRounds[rnd] = elRndCache;\n                }\n            }\n        }\n        if (MockAdapter.AreTeamsPlayingSwitchedSides() !== MockAdapter.AreTeamsPlayingSwitchedSidesInRound(endRound)) {\n            let elCTScore = elSegment.FindChildTraverse('id-sb-timeline__segment__score__ct');\n            let elTScore = elSegment.FindChildTraverse('id-sb-timeline__segment__score__t');\n            if (elCTScore && elCTScore.IsValid()) {\n                elCTScore.RemoveClass('sb-color--CT');\n                elCTScore.AddClass('sb-color--TERRORIST');\n            }\n            if (elTScore && elTScore.IsValid()) {\n                elTScore.RemoveClass('sb-color--TERRORIST');\n                elTScore.AddClass('sb-color--CT');\n            }\n        }\n    }\n    function _SupportsTimeline(jsoTime) {\n        if (jsoTime == undefined)\n            jsoTime = MockAdapter.GetTimeDataJSO();\n        let roundCountToEvaluate = jsoTime.maxrounds_this_period;\n        return (roundCountToEvaluate <= 30);\n    }\n    function _UpdateRoundLossBonus(teamdata) {\n        let elRoundLossBonusMoney = _m_panelCache.m_elRoundLossBonus;\n        if (elRoundLossBonusMoney && elRoundLossBonusMoney.IsValid()) {\n            let hideRoundLossPanel = true;\n            if (parseInt(GameInterfaceAPI.GetSettingString('mp_consecutive_loss_max')) > 0 &&\n                parseInt(GameInterfaceAPI.GetSettingString('cash_team_loser_bonus_consecutive_rounds')) > 0) {\n                let nLossT = -1;\n                let nLossCT = -1;\n                if (teamdata) {\n                    for (const td of teamdata) {\n                        if (td.team_name == 'TERRORIST') {\n                            nLossT = td.next_round_loss_bonus;\n                        }\n                        else if (td.team_name == 'CT') {\n                            nLossCT = td.next_round_loss_bonus;\n                        }\n                    }\n                }\n                else {\n                    nLossT = MockAdapter.GetTeamNextRoundLossBonus('TERRORIST');\n                    nLossCT = MockAdapter.GetTeamNextRoundLossBonus('CT');\n                }\n                if (nLossT >= 0 && nLossCT >= 0) {\n                    hideRoundLossPanel = false;\n                    for (let nClassIdx = 1; nClassIdx <= 4; ++nClassIdx) {\n                        elRoundLossBonusMoney.SetHasClass('sb-timeline__round-loss-bonus-money__TERRORIST' + nClassIdx, nLossT >= nClassIdx);\n                    }\n                    for (let nClassIdx = 1; nClassIdx <= 4; ++nClassIdx) {\n                        elRoundLossBonusMoney.SetHasClass('sb-timeline__round-loss-bonus-money__CT' + nClassIdx, nLossCT >= nClassIdx);\n                    }\n                }\n            }\n            if (hideRoundLossPanel) {\n                elRoundLossBonusMoney.AddClass('hidden');\n            }\n            else {\n                elRoundLossBonusMoney.RemoveClass('hidden');\n            }\n        }\n    }\n    function _ResetTimeline(oScoreData, jsoTime, updateRounds = true) {\n        _UpdateRoundLossBonus();\n        let elTimeline = _m_panelCache.m_elTimelineSegments;\n        if (!elTimeline || !elTimeline.IsValid())\n            return;\n        elTimeline.RemoveAndDeleteChildren();\n        if (!jsoTime)\n            return;\n        if (!_SupportsTimeline(jsoTime))\n            return;\n        let firstRound;\n        let lastRound;\n        let midRound;\n        firstRound = jsoTime.first_round_this_period;\n        lastRound = jsoTime.last_round_this_period;\n        let elLabel = _m_panelCache.m_elTimelineRoundLabel;\n        if (elLabel && elLabel.IsValid()) {\n            elLabel.SetHasClass('hidden', jsoTime.overtime == 0);\n        }\n        midRound = firstRound + Math.ceil((lastRound - firstRound) / 2) - 1;\n        _m_panelCache.m_elRounds = new Array(lastRound + 1).fill(null);\n        if (MockAdapter.HasHalfTime()) {\n            _InitTimelineSegment(firstRound, midRound, 'first-half');\n            _InsertTimelineDivider();\n            _InitTimelineSegment(midRound + 1, lastRound, 'second-half');\n        }\n        else {\n            _InitTimelineSegment(firstRound, lastRound, 'no-halves');\n        }\n        if (updateRounds) {\n            _UpdateAllRounds(oScoreData, jsoTime);\n        }\n        if (GameInterfaceAPI.GetSettingString('cl_scoreboard_survivors_always_on') == '1')\n            _ShowSurvivors();\n    }\n    function _UnborrowMusicKit() {\n        GameInterfaceAPI.SetSettingString('cl_borrow_music_from_player_slot', '-1');\n        let oLocalPlayer = _m_oPlayers.GetPlayerByXuid(GetLocalPlayerId());\n        _UpdatePlayerStat(oLocalPlayer, 'musickit', false, true);\n    }\n    function UpdateCasterButtons() {\n        for (let i = 0; i < 4; i++) {\n            let buttonName = '#spec-button' + (i + 1);\n            let bActive = true;\n            switch (i) {\n                default:\n                case 0:\n                    bActive = !!GetCasterIsCameraman();\n                    break;\n                case 1:\n                    bActive = !!GetCasterIsHeard();\n                    break;\n                case 2:\n                    bActive = !!GetCasterControlsXray();\n                    break;\n                case 3:\n                    bActive = !!GetCasterControlsUI();\n                    break;\n            }\n            ToggleCasterButtonActive(buttonName, bActive);\n        }\n    }\n    function ToggleCasterButtonActive(buttonName, bActive) {\n        let button = $(buttonName);\n        if (button == null)\n            return;\n        if (bActive == false && button.BHasClass('sb-spectator-control-button-notactive') == false) {\n            button.AddClass('sb-spectator-control-button-notactive');\n        }\n        else if (bActive == true && button.BHasClass('sb-spectator-control-button-notactive') == true) {\n            button.RemoveClass('sb-spectator-control-button-notactive');\n        }\n    }\n    function _ToggleSetCasterIsCameraman() {\n        $.DispatchEvent('CSGOPlaySoundEffect', 'generic_button_press', 'MOUSE');\n        let nCameraMan = parseInt(GameInterfaceAPI.GetSettingString('spec_autodirector_cameraman'));\n        if (GetCasterIsCameraman()) {\n            GameStateAPI.SetCasterIsCameraman(0);\n        }\n        else {\n            GameStateAPI.SetCasterIsCameraman(nCameraMan);\n        }\n        UpdateCasterButtons();\n    }\n    function _ToggleSetCasterIsHeard() {\n        $.DispatchEvent('CSGOPlaySoundEffect', 'generic_button_press', 'MOUSE');\n        let nCameraMan = parseInt(GameInterfaceAPI.GetSettingString('spec_autodirector_cameraman'));\n        if (GetCasterIsHeard()) {\n            GameStateAPI.SetCasterIsHeard(0);\n        }\n        else {\n            GameStateAPI.SetCasterIsHeard(nCameraMan);\n        }\n        UpdateCasterButtons();\n    }\n    function _ToggleSetCasterControlsXray() {\n        $.DispatchEvent('CSGOPlaySoundEffect', 'generic_button_press', 'MOUSE');\n        let nCameraMan = parseInt(GameInterfaceAPI.GetSettingString('spec_autodirector_cameraman'));\n        if (GetCasterControlsXray()) {\n            GameStateAPI.SetCasterControlsXray(0);\n            ToggleCasterButtonActive('#spec-button3', false);\n        }\n        else {\n            GameStateAPI.SetCasterControlsXray(nCameraMan);\n            ToggleCasterButtonActive('#spec-button3', true);\n        }\n    }\n    function _ToggleSetCasterControlsUI() {\n        $.DispatchEvent('CSGOPlaySoundEffect', 'generic_button_press', 'MOUSE');\n        let nCameraMan = parseInt(GameInterfaceAPI.GetSettingString('spec_autodirector_cameraman'));\n        if (GetCasterControlsUI()) {\n            GameStateAPI.SetCasterControlsUI(0);\n        }\n        else {\n            GameStateAPI.SetCasterControlsUI(nCameraMan);\n        }\n        UpdateCasterButtons();\n    }\n    function _CycleStats() {\n        if (_m_dataSetGetCount === 0)\n            return;\n        {\n            _m_dataSetCurrent++;\n            if (_m_dataSetCurrent >= _m_dataSetGetCount)\n                _m_dataSetCurrent = 0;\n        }\n        let elLabelSets = $('#id-sb-row__sets');\n        let labelSetsChildren = elLabelSets.Children();\n        for (let i = 0; i < labelSetsChildren.length; i++) {\n            let elChild = labelSetsChildren[i];\n            if (elChild.id == 'id-sb-labels-set-' + _m_dataSetCurrent) {\n                elChild.RemoveClass('hidden');\n            }\n            else {\n                elChild.AddClass('hidden');\n            }\n        }\n        for (let i = 0; i < _m_oPlayers.GetCount(); i++) {\n            let elPlayer = _m_oPlayers.GetPlayerByIndex(i).m_elPlayer;\n            if (elPlayer && elPlayer.IsValid()) {\n                let elSetContainer = elPlayer.FindChildTraverse('id-sb-row__set-container');\n                if (elSetContainer && elSetContainer.IsValid()) {\n                    let containerChildren = elSetContainer.Children();\n                    for (let j = 0; j < containerChildren.length; j++) {\n                        let elChild = containerChildren[j];\n                        if (elChild.id == 'id-sb-set-' + _m_dataSetCurrent) {\n                            elChild.RemoveClass('hidden');\n                        }\n                        else {\n                            elChild.AddClass('hidden');\n                        }\n                    }\n                }\n            }\n        }\n    }\n    function _MuteVoice() {\n        GameInterfaceAPI.ConsoleCommand('voice_modenable_toggle');\n        $.Schedule(0.1, _UpdateMuteVoiceState);\n    }\n    function _UpdateMuteVoiceState() {\n        let muteState = GameInterfaceAPI.GetSettingString('voice_modenable') === '1';\n        let elMuteImage = _m_panelCache.m_elMuteImage;\n        if (!elMuteImage)\n            return;\n        if (muteState) {\n            elMuteImage.SetImage('file://{images}/icons/ui/unmuted.svg');\n        }\n        else {\n            elMuteImage.SetImage('file://{images}/icons/ui/muted.svg');\n        }\n    }\n    function _BlockUgc() {\n        let ugcBlockState = GameInterfaceAPI.GetSettingString('cl_hide_avatar_images') !== '0' ||\n            GameInterfaceAPI.GetSettingString('cl_sanitize_player_names') !== '0';\n        if (ugcBlockState) {\n            GameInterfaceAPI.SetSettingString('cl_sanitize_player_names', '0');\n            GameInterfaceAPI.SetSettingString('cl_hide_avatar_images', '0');\n        }\n        else {\n            GameInterfaceAPI.SetSettingString('cl_sanitize_player_names', '1');\n            GameInterfaceAPI.SetSettingString('cl_hide_avatar_images', '2');\n        }\n        $.Schedule(0.1, _UpdateUgcState);\n    }\n    function _UpdateUgcState() {\n        let ugcBlockState = GameInterfaceAPI.GetSettingString('cl_hide_avatar_images') !== '0' ||\n            GameInterfaceAPI.GetSettingString('cl_sanitize_player_names') !== '0';\n        let elBlockUgcImage = _m_panelCache.m_elBlockUgcImage;\n        if (!elBlockUgcImage)\n            return;\n        if (ugcBlockState) {\n            elBlockUgcImage.SetImage('file://{images}/icons/ui/votekick.svg');\n        }\n        else {\n            elBlockUgcImage.SetImage('file://{images}/icons/ui/player.svg');\n        }\n    }\n    function _CreateLabelsForRow(panel) {\n        if (!panel || !panel.IsValid()) {\n            return;\n        }\n        if (_m_bRowLabelsCreated) {\n            return;\n        }\n        let dataStatChildren = panel.FindChildrenWithAttributeTraverse('data-stat');\n        for (let i = 0; i < dataStatChildren.length; i++) {\n            let el = dataStatChildren[i];\n            if (el && el.IsValid()) {\n                let stat = el.GetAttributeString('data-stat', '');\n                let set = el.GetAttributeString('data-set', '');\n                let isHidden = el.GetAttributeString('data-hidden', '');\n                const noLabel = el.GetAttributeString('no-label', 'false');\n                if (stat != '' && !(noLabel === 'true')) {\n                    _CreateLabelForStat(stat, set, isHidden);\n                }\n            }\n        }\n        _m_bRowLabelsCreated = true;\n    }\n    function _GetSortOrderForMode(mode) {\n        if (GameStateAPI.IsQueuedMatchmakingMode_Team())\n            return sortOrder_tmm;\n        switch (mode) {\n            case 'deathmatch':\n                if (GameInterfaceAPI.GetSettingString('mp_dm_teammode') !== '0') {\n                    return sortOrder_default;\n                }\n                return sortOrder_dm;\n            case 'competitive':\n            case 'premier':\n            case 'rush':\n                return sortOrder_tmm;\n            case 'gungameprogressive':\n                return sortOrder_gg;\n            default:\n                return sortOrder_default;\n        }\n    }\n    function _Initialize() {\n        _Reset();\n        let jsoTime = MockAdapter.GetTimeDataJSO();\n        if (!jsoTime) {\n            return;\n        }\n        _LoadScoreboardTemplate();\n        _m_bRowLabelsCreated = false;\n        let temp = $.CreatePanel('Panel', _m_cP, 'temp');\n        _Helper_LoadSnippet(temp, _GetPlayerRowForGameMode());\n        temp.visible = false;\n        _CreateLabelsForRow(temp);\n        temp.DeleteAsync(.0);\n        let oScoreData = MockAdapter.GetScoreDataJSO();\n        _ResetTimeline(oScoreData, jsoTime);\n        _m_bInit = true;\n        _m_cP.SetDialogVariable('server_name', '');\n        _UpdateHLTVViewerNumber(0);\n        _UpdateMatchInfo();\n    }\n    function _RankRevealAll() {\n        for (let i = 0; i < _m_oPlayers.GetCount(); i++) {\n            let oPlayer = _m_oPlayers.GetPlayerByIndex(i);\n            _UpdatePlayerStat(oPlayer, 'skillgroup', false, true);\n        }\n    }\n    function _UpdateScore() {\n        switch (MockAdapter.GetGameModeInternalName(false)) {\n            case 'competitive':\n            case 'premier':\n                _UpdateScore_Classic();\n                break;\n            case 'deathmatch':\n                if (GameInterfaceAPI.GetSettingString('mp_dm_teammode') !== '0') {\n                    _UpdateScore_Classic();\n                }\n                break;\n            default:\n            case 'casual':\n                _UpdateScore_Classic();\n                break;\n        }\n    }\n    function _UpdateJob() {\n        if (_m_bInit) {\n            _UpdateMatchInfo();\n            _UpdateScore();\n            _UpdateNextPlayer();\n        }\n    }\n    function _UpdateEverything(bInitialCreate = false) {\n        if (!_m_bInit) {\n            _Initialize();\n        }\n        _UpdateMuteVoiceState();\n        _UpdateUgcState();\n        if (bInitialCreate) {\n            _UpdateAllPlayers(bInitialCreate);\n        }\n        else {\n            _UpdateAllPlayers_delayed();\n        }\n        _UpdateMatchInfo();\n        _UpdateScore();\n        _UpdateSpectatorButtons();\n    }\n    function _CloseScoreboard() {\n        if (_m_updatePlayerHandler) {\n            $.UnregisterForUnhandledEvent('Scoreboard_UpdatePlayerByPlayerSlot', _m_updatePlayerHandler);\n            _m_updatePlayerHandler = null;\n        }\n        $.DispatchEvent('DismissAllContextMenus');\n        UiToolkitAPI.HideTextTooltip();\n        _UnregisterEvents();\n    }\n    function _OpenScoreboard() {\n        _UpdateEverything();\n        _ShowSurvivors((GameInterfaceAPI.GetSettingString('cl_scoreboard_survivors_always_on') == '0'));\n        if (!_m_updatePlayerHandler) {\n            _m_updatePlayerHandler = $.RegisterForUnhandledEvent('Scoreboard_UpdatePlayerByPlayerSlot', _UpdatePlayerByPlayerSlot_delayed);\n        }\n        _RegisterEvents();\n    }\n    function GetFreeForAllTopThreePlayers() {\n        _UpdateEverything();\n        if (!_m_cP)\n            return [undefined, undefined, undefined];\n        let elTeam = _m_cP.FindChildInLayoutFile('players-table-ANY');\n        if (elTeam && elTeam.IsValid()) {\n            const players = elTeam.Children();\n            return [players[0]?.m_xuid || '0', players[1]?.m_xuid || '0', players[2]?.m_xuid || '0'];\n        }\n        return [undefined, undefined, undefined];\n    }\n    Scoreboard.GetFreeForAllTopThreePlayers = GetFreeForAllTopThreePlayers;\n    function GetCasterIsCameraman() {\n        let nCameraMan = parseInt(GameInterfaceAPI.GetSettingString('spec_autodirector_cameraman'));\n        let bQ = (MockAdapter.IsDemoOrHltv() && nCameraMan != 0 && MockAdapter.IsHLTVAutodirectorOn());\n        return bQ;\n    }\n    function GetCasterIsHeard() {\n        if (MockAdapter.IsDemoOrHltv()) {\n            return !!parseInt(GameInterfaceAPI.GetSettingString('voice_caster_enable'));\n        }\n        return false;\n    }\n    function GetCasterControlsXray() {\n        let bXRay = MockAdapter.IsDemoOrHltv() && parseInt(GameInterfaceAPI.GetSettingString('spec_cameraman_xray'));\n        return bXRay;\n    }\n    function GetCasterControlsUI() {\n        let bSpecCameraMan = parseInt(GameInterfaceAPI.GetSettingString('spec_cameraman_ui'));\n        let bQ = (MockAdapter.IsDemoOrHltv() && bSpecCameraMan);\n        return bQ;\n    }\n    function _ApplyPlayerCrosshairCode(panel, xuid) {\n        UiToolkitAPI.ShowGenericPopupYesNo($.Localize('#tooltip_copycrosshair'), $.Localize('#GameUI_Xhair_Copy_Code_Confirm'), '', () => { let code = GameStateAPI.GetCrosshairCode(xuid); MyPersonaAPI.BApplyCrosshairCode(code); }, () => { });\n    }\n    const events = [\n        ['Scoreboard_UnborrowMusicKit', _UnborrowMusicKit],\n        ['Scoreboard_Casualties_OnMouseOver', _Casualties_OnMouseOver],\n        ['Scoreboard_Casualties_OnMouseOut', _Casualties_OnMouseOut],\n        ['Scoreboard_RoundLossBonusMoney_OnMouseOver_CT', _RoundLossBonusMoney_OnMouseOver_CT],\n        ['Scoreboard_RoundLossBonusMoney_OnMouseOut_CT', _RoundLossBonusMoney_OnMouseOut_CT],\n        ['Scoreboard_RoundLossBonusMoney_OnMouseOver_TERRORIST', _RoundLossBonusMoney_OnMouseOver_TERRORIST],\n        ['Scoreboard_RoundLossBonusMoney_OnMouseOut_TERRORIST', _RoundLossBonusMoney_OnMouseOut_TERRORIST],\n        ['Scoreboard_MuteVoice', _MuteVoice],\n        ['Scoreboard_BlockUgc', _BlockUgc],\n        ['Scoreboard_ApplyPlayerCrosshairCode', _ApplyPlayerCrosshairCode]\n    ];\n    let eventHandles = [];\n    function _RegisterEvents() {\n        const msg = $.GetContextPanel().id + ' registering ';\n        events.forEach(function (arrEvent, idx) {\n            eventHandles[idx] = $.RegisterForUnhandledEvent(arrEvent[0], arrEvent[1]);\n        });\n    }\n    function _UnregisterEvents() {\n        const msg = $.GetContextPanel().id + ' unregistering ';\n        events.forEach(function (arrEvent, idx) {\n            $.UnregisterForUnhandledEvent(arrEvent[0], eventHandles[idx]);\n        });\n    }\n    function _LoadScoreboardTemplate() {\n        let scoreboardTemplate;\n        let mode = MockAdapter.GetGameModeInternalName(false);\n        let skirmish = MockAdapter.GetGameModeInternalName(true);\n        if (mode == 'deathmatch') {\n            if (GameInterfaceAPI.GetSettingString('mp_teammates_are_enemies') !== '0') {\n                skirmish = 'ffadm';\n            }\n            else if (GameInterfaceAPI.GetSettingString('mp_dm_teammode') !== '0') {\n                skirmish = 'teamdm';\n            }\n        }\n        switch (mode.toLowerCase()) {\n            case 'premier':\n            case 'competitive':\n            case 'scrimcomp2v2':\n                scoreboardTemplate = 'snippet_scoreboard-classic--with-timeline--half-times';\n                break;\n            case 'deathmatch':\n                if (skirmish == 'teamdm') {\n                    scoreboardTemplate = 'snippet_scoreboard-classic--no-timeline';\n                }\n                else {\n                    scoreboardTemplate = 'snippet_scoreboard--no-teams';\n                }\n                break;\n            case 'gungameprogressive':\n            case 'training':\n                scoreboardTemplate = 'snippet_scoreboard--no-teams';\n                break;\n            case 'cooperative':\n                scoreboardTemplate = 'snippet_scoreboard--cooperative';\n                break;\n            case 'coopmission':\n                scoreboardTemplate = 'snippet_scoreboard--coopmission';\n                break;\n            case 'casual':\n                scoreboardTemplate = 'snippet_scoreboard-classic--no-timeline';\n                break;\n            case 'rush':\n                scoreboardTemplate = 'snippet_scoreboard-classic--with-timeline--no-half-times';\n                break;\n            default:\n                scoreboardTemplate = 'snippet_scoreboard-classic--no-timeline';\n                break;\n        }\n        _m_panelCache.ClearAll();\n        _Helper_LoadSnippet(_m_cP, scoreboardTemplate);\n        _m_panelCache.CacheScoreboard(_m_cP);\n        if (MockAdapter.IsDemoOrHltv())\n            _m_cP.AddClass('IsDemoOrHltv');\n        if (MatchStatsAPI.IsTournamentMatch())\n            _m_cP.AddClass('IsTournamentMatch');\n        _m_sortOrder = _GetSortOrderForMode(mode);\n    }\n    function _CreateAndInitializeFunc() {\n        _Reset();\n        let jsoTime = MockAdapter.GetTimeDataJSO();\n        if (!jsoTime) {\n            return;\n        }\n        let loadedScoreboardTemplate = _LoadScoreboardTemplate();\n        _m_bRowLabelsCreated = false;\n        _m_bInit = true;\n        const bInitialCreate = true;\n        _UpdateEverything(bInitialCreate);\n        if (!_m_bRowLabelsCreated) {\n            let temp = $.CreatePanel('Panel', _m_cP, 'temp');\n            _Helper_LoadSnippet(temp, _GetPlayerRowForGameMode());\n            temp.visible = false;\n            _CreateLabelsForRow(temp);\n            temp.DeleteAsync(.0);\n        }\n        _m_cP.SetDialogVariable('server_name', '');\n        _UpdateHLTVViewerNumber(0);\n        $.DispatchEvent('DismissAllContextMenus');\n        UiToolkitAPI.HideTextTooltip();\n    }\n    function _CreateAndInitialize(bImmediately = false) {\n        if (bImmediately) {\n            _CreateAndInitializeFunc();\n        }\n        else {\n            $.Schedule(0.01, _CreateAndInitializeFunc);\n        }\n    }\n    {\n        _m_oAllUpdateStatNames = [];\n        _InitializeStatUpdateFuncs();\n        $.RegisterEventHandler('OnOpenScoreboard', $.GetContextPanel(), _OpenScoreboard);\n        $.RegisterEventHandler('OnCloseScoreboard', $.GetContextPanel(), _CloseScoreboard);\n        $.RegisterEventHandler('Scoreboard_UpdateJob', $.GetContextPanel(), _UpdateJob);\n        $.RegisterEventHandler('Scoreboard_ResetAndInit', $.GetContextPanel(), _Initialize);\n        $.RegisterEventHandler('Scoreboard_CreateAndInit', $.GetContextPanel(), _CreateAndInitialize);\n        $.RegisterForUnhandledEvent('GameState_OnLevelLoad', _Initialize);\n        $.RegisterForUnhandledEvent('Scoreboard_CycleStats', _CycleStats);\n        $.RegisterForUnhandledEvent('Scoreboard_ToggleSetCasterIsCameraman', _ToggleSetCasterIsCameraman);\n        $.RegisterForUnhandledEvent('Scoreboard_ToggleSetCasterIsHeard', _ToggleSetCasterIsHeard);\n        $.RegisterForUnhandledEvent('Scoreboard_ToggleSetCasterControlsXray', _ToggleSetCasterControlsXray);\n        $.RegisterForUnhandledEvent('Scoreboard_ToggleSetCasterControlsUI', _ToggleSetCasterControlsUI);\n        $.RegisterForUnhandledEvent('GameState_RankRevealAll', _RankRevealAll);\n        $.RegisterForUnhandledEvent('Scoreboard_UpdateHLTVViewers', _UpdateHLTVViewerNumber);\n    }\n})(Scoreboard || (Scoreboard = {}));\n","scripts/segmented_progress_bar.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"mission_tile.ts\" />\n$.LogChannel('p.progressbar', \"LV_OFF\");\nvar SegmentedProgressBar;\n(function (SegmentedProgressBar) {\n    const WHOLE_BAR_WIDTH = 180;\n    const PROGRESS_PIP_WIDTH = 24;\n    const SEGMENT_MARGIN_LEFT = 1;\n    const SEGMENT_MARGIN_RIGHT = 1;\n    class CSegment {\n        min;\n        max;\n        totalMax;\n        elRoot;\n        elProg;\n        elPip;\n        constructor(parent, name, min, max, totalMax, addPip, numSegments) {\n            this.totalMax = totalMax;\n            this.min = min;\n            this.max = max;\n            this.elRoot = $.CreatePanel('Panel', parent, name);\n            this.elRoot.BLoadLayoutSnippet(\"snippet__progress-bar-segment\");\n            this.elProg = this.elRoot.FindChildTraverse('pbs-progressbar');\n            this.elProg.max = this.max;\n            this.elProg.min = this.min;\n            this.elProg.value = 0;\n            const totalWidth = WHOLE_BAR_WIDTH - (numSegments * PROGRESS_PIP_WIDTH);\n            const fractionOfTotalProgress = (this.max - this.min) / totalMax;\n            const segmentBarWidth = fractionOfTotalProgress * totalWidth;\n            const segmentBarWidthWithPip = segmentBarWidth + PROGRESS_PIP_WIDTH;\n            this.elRoot.style.width = segmentBarWidthWithPip + 'px';\n            this.elProg.style.marginLeft = SEGMENT_MARGIN_LEFT + 'px';\n            this.elProg.style.marginRight = SEGMENT_MARGIN_RIGHT + 'px';\n            const elPip = this.elRoot.FindChildTraverse('pbs-progresspip');\n            const goalLabel = this.elRoot.FindChildTraverse('pbs-progress-goal-label');\n            elPip.style.visibility = addPip ? 'visible' : 'collapse';\n            elPip.style.width = PROGRESS_PIP_WIDTH + 'px';\n            elPip.style.height = PROGRESS_PIP_WIDTH + 'px';\n            this.elPip = elPip;\n            goalLabel.SetDialogVariableInt('goal-checkpoint', this.max);\n        }\n        setValue(value) {\n            this.elProg.value = value;\n            if (value >= this.max) {\n                this.elRoot.SwitchClass('state', 'complete');\n            }\n            else if (value < this.min) {\n                this.elRoot.SwitchClass('state', 'future');\n            }\n            else {\n                this.elRoot.SwitchClass('state', 'current');\n            }\n        }\n    }\n    class CWholeBar {\n        segments;\n        constructor(elParent, barType, missionData) {\n            this.segments = [];\n            const arrGoals = missionData.goal_points;\n            const arrXpRewards = missionData.xp_reward;\n            for (let i = 0; i < arrGoals.length; i++) {\n                let min = 0;\n                let max = arrGoals[i];\n                if (i > 0) {\n                    min = arrGoals[i - 1];\n                    max = arrGoals[i];\n                }\n                const totalGoal = arrGoals.slice(-1)[0];\n                const addPip = arrGoals.length > 1;\n                const seg = new CSegment(elParent, barType + i, min, max, totalGoal, addPip, arrGoals.length);\n                this.segments.push(seg);\n                if (barType == \"Base\") {\n                    seg.elRoot.SetDialogVariableInt('mission-points', max - min);\n                    seg.elRoot.SetDialogVariableInt('xp-reward', arrXpRewards[i]);\n                    seg.elRoot.SetPanelEvent('onmouseover', () => {\n                        const strTooltip = $.Localize(\"#mission_segment_tooltip\", seg.elRoot);\n                        UiToolkitAPI.ShowTextTooltipOnPanelStyled(seg.elRoot, strTooltip, 'mission-segment-tooltip');\n                    });\n                    seg.elRoot.SetPanelEvent('onmouseout', () => {\n                        UiToolkitAPI.HideTextTooltip();\n                    });\n                }\n            }\n        }\n        setBarValue(val) {\n            for (let i = 0; i < this.segments.length; i++) {\n                let seg = this.segments[i];\n                seg.setValue(val);\n            }\n        }\n    }\n    function CreateSegmentedProgressBar(elPanel, missionData) {\n        elPanel.BLoadLayout('file://{resources}/layout/segmented_progress_bar.xml', true, false);\n        elPanel.Data().m_backgroundProgBar = new CWholeBar(elPanel.FindChildTraverse('spbBackground'), 'Background', missionData);\n        elPanel.Data().m_liveProgBar = new CWholeBar(elPanel.FindChildTraverse('spbLive'), 'Live', missionData);\n        elPanel.Data().m_baseProgBar = new CWholeBar(elPanel.FindChildTraverse('spbBase'), 'Base', missionData);\n        MissionTile.ExtractStringTokens(elPanel.FindChildTraverse('spbBase'), missionData.string_tokens);\n        elPanel.style.width = WHOLE_BAR_WIDTH + 'px';\n    }\n    SegmentedProgressBar.CreateSegmentedProgressBar = CreateSegmentedProgressBar;\n    function Init(elPanel, missionData) {\n        elPanel.RemoveAndDeleteChildren();\n        CreateSegmentedProgressBar(elPanel, missionData);\n    }\n    SegmentedProgressBar.Init = Init;\n    function SetValue(elPanel, val, bar) {\n        if (elPanel && elPanel.IsValid() && elPanel.Data().m_liveProgBar) {\n            switch (bar) {\n                case 'Live':\n                    elPanel.Data().m_liveProgBar.setBarValue(val);\n                    break;\n                case 'Base':\n                    elPanel.Data().m_baseProgBar.setBarValue(val);\n                    break;\n            }\n            elPanel.Data().m_backgroundProgBar.setBarValue(val);\n        }\n    }\n    SegmentedProgressBar.SetValue = SetValue;\n})(SegmentedProgressBar || (SegmentedProgressBar = {}));\n","scripts/settingsmenu.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"common/promoted_settings.ts\" />\n/// <reference path=\"settingsmenu_shared.ts\" />\nvar SettingsMenu;\n(function (SettingsMenu) {\n    const TabInfo = {\n        Promoted: {\n            xml: \"settings_promoted\",\n            radioid: \"PromotedSettingsRadio\"\n        },\n        KeybdMouseSettings: {\n            xml: 'settings_kbmouse',\n            radioid: \"KBMouseRadio\"\n        },\n        GameSettings: {\n            xml: \"settings_game\",\n            radioid: \"GameRadio\"\n        },\n        AudioSettings: {\n            xml: \"settings_audio\",\n            radioid: \"AudioRadio\"\n        },\n        VideoSettings: {\n            xml: \"settings_video\",\n            radioid: \"VideoRadio\"\n        },\n        Search: {\n            xml: \"settings_search\",\n            radioid: \"SearchRadio\"\n        },\n        CrosshairSettings: {\n            xml: 'settings_crosshair',\n            radioid: 'CrosshairRadio'\n        }\n    };\n    let activeTab;\n    function IsTabId(tabname) {\n        return TabInfo[tabname] != null;\n    }\n    SettingsMenu.IsTabId = IsTabId;\n    function NavigateToTab(tabID) {\n        let bDisplaySteamInputSettings = false;\n        let parentPanel = $('#SettingsMenuContent');\n        if (!parentPanel.FindChildInLayoutFile(tabID)) {\n            let newPanel = $.CreatePanel('Panel', parentPanel, tabID);\n            let XmlName = TabInfo[tabID].xml;\n            if (bDisplaySteamInputSettings) {\n                XmlName = \"settings_steaminput\";\n            }\n            newPanel.BLoadLayout('file://{resources}/layout/settings/' + XmlName + '.xml', false, false);\n            newPanel.OnPropertyTransitionEndEvent = (panel, propertyName) => {\n                if (newPanel === panel && propertyName === 'opacity') {\n                    if (newPanel.visible === true && newPanel.BIsTransparent()) {\n                        newPanel.visible = false;\n                        newPanel.SetReadyForDisplay(false);\n                        return true;\n                    }\n                }\n                return false;\n            };\n            $.RegisterEventHandler('PropertyTransitionEnd', newPanel, newPanel.OnPropertyTransitionEndEvent);\n            newPanel.visible = false;\n            let contentPanel = newPanel.FindChildInLayoutFile('SettingsMenuTabContent');\n            let jumpButtons = newPanel.FindChildInLayoutFile('SettingsMenuJumpButtons');\n            if (contentPanel && jumpButtons) {\n                contentPanel.SetSendScrollPositionChangedEvents(true);\n                $.RegisterEventHandler('ScrollPositionChanged', contentPanel, () => {\n                    if (newPanel.Data().bScrollingToId)\n                        newPanel.Data().bScrollingToId = false;\n                    else\n                        jumpButtons.Children().forEach(jumpButton => jumpButton.checked = false);\n                });\n                jumpButtons.Children()[0].checked = true;\n            }\n            const newSettings = PromotedSettingsUtil.GetUnacknowledgedPromotedSettings();\n            for (let setting of newSettings) {\n                const el = newPanel.FindChildTraverse(setting.id);\n                if (el) {\n                    el.AddClass(\"setting-is-new\");\n                }\n            }\n        }\n        if (tabID == \"Search\") {\n            let settings = parentPanel.FindChildInLayoutFile(tabID);\n            let searchTextEntry = settings.FindChildInLayoutFile('SettingsSearchTextEntry');\n            searchTextEntry.SetFocus();\n        }\n        if (activeTab !== tabID) {\n            if (activeTab) {\n                let panelToHide = $.GetContextPanel().FindChildInLayoutFile(activeTab);\n                panelToHide.RemoveClass('Active');\n            }\n            $(\"#\" + TabInfo[tabID].radioid).checked = true;\n            activeTab = tabID;\n            let activePanel = $.GetContextPanel().FindChildInLayoutFile(tabID);\n            activePanel.AddClass('Active');\n            {\n                activePanel.visible = true;\n                activePanel.SetReadyForDisplay(true);\n            }\n            SettingsMenuShared.NewTabOpened(activeTab);\n        }\n    }\n    SettingsMenu.NavigateToTab = NavigateToTab;\n    function _AccountPrivacySettingsChanged() {\n        let gameSettingPanel = $.GetContextPanel().FindChildInLayoutFile(\"GameSettings\");\n        if (gameSettingPanel != null) {\n            let twitchTvSetting = gameSettingPanel.FindChildInLayoutFile(\"accountprivacydropdown\");\n            if (twitchTvSetting != null) {\n                twitchTvSetting.OnShow();\n            }\n        }\n    }\n    function _OnSettingsMenuShown() {\n        SettingsMenuShared.NewTabOpened(activeTab);\n    }\n    function _OnSettingsMenuHidden() {\n        GameInterfaceAPI.ConsoleCommand(\"host_writeconfig\");\n        InventoryAPI.StopItemPreviewMusic();\n    }\n    function _NavigateToSetting(tab, submenuRadioId, id) {\n        if (!IsTabId(tab))\n            return;\n        $.DispatchEvent(\"Activated\", $(\"#\" + TabInfo[tab].radioid), \"mouse\");\n        if (submenuRadioId != '') {\n            let elSubMenuRadio = $.GetContextPanel().GetParent().FindChildTraverse(submenuRadioId);\n            if (elSubMenuRadio) {\n                $.DispatchEvent(\"Activated\", elSubMenuRadio, \"mouse\");\n            }\n        }\n        SettingsMenuShared.ScrollToId(id);\n    }\n    function _NavigateToSettingPanel(tab, submenuRadioId, p) {\n        if (!IsTabId(tab))\n            return;\n        $.DispatchEvent(\"Activated\", $(\"#\" + TabInfo[tab].radioid), \"mouse\");\n        if (submenuRadioId != '') {\n            let elSubMenuRadio = $.GetContextPanel().GetParent().FindChildTraverse(submenuRadioId);\n            if (elSubMenuRadio) {\n                $.DispatchEvent(\"Activated\", elSubMenuRadio, \"mouse\");\n            }\n        }\n        p.ScrollParentToMakePanelFit(3, false);\n        p.AddClass('Highlight');\n    }\n    function _UpdateTabNewBadges() {\n        const arrNewSettings = PromotedSettingsUtil.GetUnacknowledgedPromotedSettings();\n        for (const tab in TabInfo) {\n            const elAlert = $('#' + TabInfo[tab].radioid)?.FindChild('TabNewAlert');\n            if (!elAlert)\n                continue;\n            elAlert.SetDialogVariable('alert_value', $.Localize('#Store_Price_New'));\n            elAlert.SetHasClass('hidden', !arrNewSettings.some(setting => setting.section === tab));\n        }\n    }\n    function _Init() {\n        for (let tab in TabInfo) {\n            if (tab !== \"Promoted\" && tab !== \"Search\")\n                NavigateToTab(tab);\n        }\n    }\n    {\n        _Init();\n        _UpdateTabNewBadges();\n        if ($.GetContextPanel().GetAttributeString('set-active-section', '') !== '') {\n            let tab = $.GetContextPanel().GetAttributeString('set-active-section', '');\n            if (SettingsMenu.IsTabId(tab)) {\n                NavigateToTab(tab);\n                $.GetContextPanel().SetAttributeString('set-active-section', '');\n            }\n        }\n        else if (PromotedSettingsUtil.GetUnacknowledgedPromotedSettings().length > 0) {\n            NavigateToTab('Promoted');\n        }\n        else {\n            const now = new Date();\n            if (g_PromotedSettings.filter(setting => setting.start_date <= now && setting.end_date > now).length == 0)\n                $('#PromotedSettingsRadio').visible = false;\n            NavigateToTab('VideoSettings');\n        }\n        MyPersonaAPI.RequestAccountPrivacySettings();\n        $.RegisterForUnhandledEvent(\"PanoramaComponent_MyPersona_AccountPrivacySettingsChanged\", _AccountPrivacySettingsChanged);\n        $.RegisterEventHandler('ReadyForDisplay', $('#JsSettings'), _OnSettingsMenuShown);\n        $.RegisterEventHandler('UnreadyForDisplay', $('#JsSettings'), _OnSettingsMenuHidden);\n        $.RegisterForUnhandledEvent('SettingsMenu_NavigateToSetting', _NavigateToSetting);\n        $.RegisterForUnhandledEvent('SettingsMenu_NavigateToSettingPanel', _NavigateToSettingPanel);\n    }\n})(SettingsMenu || (SettingsMenu = {}));\n","scripts/settingsmenu_audiosettings.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\nvar SettingsMenuAudioSettings;\n(function (SettingsMenuAudioSettings) {\n    const k_MusicModePanelIds = [\n        'SettingsMusicModeCompetitive',\n        'SettingsMusicModeCasual',\n        'SettingsMusicModeArmsRace',\n        'SettingsMusicModeDeathmatch',\n        'SettingsMusicModeRush',\n    ];\n    function OnMusicModeChange() {\n        let nMode = parseInt(GameInterfaceAPI.GetSettingString('snd_music_settings_mode'));\n        if (!isFinite(nMode) || nMode < 0 || nMode >= k_MusicModePanelIds.length) {\n            nMode = 0;\n        }\n        for (let i = 0; i < k_MusicModePanelIds.length; i++) {\n            const elPanel = $('#' + k_MusicModePanelIds[i]);\n            if (elPanel) {\n                elPanel.visible = (i === nMode);\n            }\n        }\n    }\n    SettingsMenuAudioSettings.OnMusicModeChange = OnMusicModeChange;\n    function ApplyCompetitiveVolumesToAllModes() {\n        $.DispatchEvent('CSGOMusicApplyCompetitiveVolumesToAllModes');\n    }\n    SettingsMenuAudioSettings.ApplyCompetitiveVolumesToAllModes = ApplyCompetitiveVolumesToAllModes;\n    {\n        OnMusicModeChange();\n    }\n})(SettingsMenuAudioSettings || (SettingsMenuAudioSettings = {}));\n","scripts/settingsmenu_chatwheel.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\nvar SettingsMenuChatwheel;\n(function (SettingsMenuChatwheel) {\n    let m_options = [\n        { text: \"#Chatwheel_section_prepare\", title: 1 },\n        { text: \"#Chatwheel_requestecoround\", radio: \"CW.EcoRound\", icon: \"icons/ui/chatwheel_requestecoround.svg\" },\n        { text: \"#Chatwheel_requestspend\", radio: \"CW.SpendRound\", icon: \"icons/ui/chatwheel_requestspend.svg\" },\n        { text: \"#Chatwheel_requestweapon\", radio: \"CW.NeedDrop\", icon: \"icons/ui/chatwheel_requestweapon.svg\" },\n        { text: \"#Chatwheel_requestplan\", radio: \"CW.NeedPlan\", icon: \"icons/ui/chatwheel_requestplan.svg\" },\n        { text: \"#Chatwheel_requestleader\", radio: \"CW.NeedLeader\", icon: \"icons/ui/chatwheel_requestplan.svg\" },\n        { text: \"#Chatwheel_section_move\", title: 1 },\n        { text: \"#Chatwheel_gogogo\", radio: \"CW.GoGoGo\", icon: \"icons/ui/chatwheel_gogogo.svg\" },\n        { text: \"#Chatwheel_onmyway\", radio: \"CW.OMW\", icon: \"icons/ui/chatwheel_onmyway.svg\" },\n        { text: \"#Chatwheel_followme\", radio: \"CW.FollowMe\", icon: \"icons/ui/chatwheel_followme.svg\" },\n        { text: \"#Chatwheel_followingyou\", radio: \"CW.FollowingYou\", icon: \"icons/ui/chatwheel_followyou.svg\" },\n        { text: \"#Chatwheel_aplan\", radio: \"CW.GoA\", icon: \"icons/ui/map_bombzone_a.svg\" },\n        { text: \"#Chatwheel_bplan\", radio: \"CW.GoB\", icon: \"icons/ui/map_bombzone_b.svg\" },\n        { text: \"#Chatwheel_midplan\", radio: \"CW.GoToLocMid\", icon: \"icons/ui/chatwheel_midplan.svg\" },\n        { text: \"#Chatwheel_section_command\", title: 1 },\n        { text: \"#Chatwheel_rotatetome\", radio: \"CW.Regroup\", icon: \"icons/ui/chatwheel_rotatetome.svg\" },\n        { text: \"#Chatwheel_sticktogether\", radio: \"CW.StickTogether\", icon: \"icons/ui/chatwheel_sticktogether.svg\" },\n        { text: \"#Chatwheel_spreadout\", radio: \"CW.SpreadOut\", icon: \"icons/ui/chatwheel_spreadout.svg\" },\n        { text: \"#Chatwheel_fallback\", radio: \"CW.TeamFallBack\", icon: \"icons/ui/chatwheel_fallback.svg\" },\n        { text: \"#Chatwheel_holdposition\", radio: \"CW.HoldPosition\", icon: \"icons/ui/chatwheel_holdposition.svg\" },\n        { text: \"#Chatwheel_gethostage\", radio: \"CW.CheckHostage\", icon: \"icons/ui/chatwheel_gethostage.svg\" },\n        { text: \"#Chatwheel_quiet\", radio: \"CW.NeedQuiet\", icon: \"icons/ui/chatwheel_heardnoise.svg\" },\n        { text: \"#Chatwheel_attacking\", radio: \"CW.ImAttacking\", icon: \"icons/ui/chatwheel_gogogo.svg\" },\n        { text: \"#Chatwheel_requestgethostages\", radio: \"CW.RequestGetHostages\", icon: \"icons/ui/chatwheel_gethostage.svg\" },\n        { text: \"#Chatwheel_section_report\", title: 1 },\n        { text: \"#Chatwheel_heardnoise\", radio: \"CW.HeardNoise\", icon: \"icons/ui/chatwheel_heardnoise.svg\" },\n        { text: \"#Chatwheel_enemyspotted\", radio: \"CW.SeesEnemy\", icon: \"icons/ui/chatwheel_enemyspotted.svg\" },\n        { text: \"#Chatwheel_oneenemyhere\", radio: \"CW.SeesSingleEnemy\", icon: \"icons/ui/chatwheel_oneenemyhere.svg\" },\n        { text: \"#Chatwheel_multipleenemieshere\", radio: \"CW.SeesEnemiesMultiple\", icon: \"icons/ui/chatwheel_multipleenemieshere.svg\" },\n        { text: \"#Chatwheel_needbackup\", radio: \"CW.NeedBackup\", icon: \"icons/ui/chatwheel_needbackup.svg\" },\n        { text: \"#Chatwheel_sniperspotted\", radio: \"CW.SniperWarning\", icon: \"icons/ui/chatwheel_sniperspotted.svg\" },\n        { text: \"#Chatwheel_bombcarrierspotted\", radio: \"CW.BombCarrierHere\", icon: \"icons/ui/chatwheel_bombcarrierspotted.svg\" },\n        { text: \"#Chatwheel_inposition\", radio: \"CW.InPosition\", icon: \"icons/ui/chatwheel_inposition.svg\" },\n        { text: \"#Chatwheel_coveringyou\", radio: \"CW.CoveringYou\", icon: \"icons/ui/chatwheel_covering.svg\" },\n        { text: \"#Chatwheel_sectorclear\", radio: \"CW.SectorClear\", icon: \"icons/ui/chatwheel_sectorclear.svg\" },\n        { text: \"#Chatwheel_bombcarrierspotted\", radio: \"CW.ISeeBomb\", icon: \"icons/ui/bomb_c4.svg\" },\n        { text: \"#Chatwheel_planted\", radio: \"CW.wePlanted\", icon: \"icons/ui/bomb_c4.svg\" },\n        { text: \"#Chatwheel_bombpickedup\", radio: \"CW.PickedUpC4\", icon: \"icons/ui/bomb_icon.svg\" },\n        { text: \"#Chatwheel_seehostagestaken\", radio: \"CW.SeesHostagesBeingTaken\", icon: \"icons/ui/chatwheel_gethostage.svg\" },\n        { text: \"#Chatwheel_bombsiteclear\", radio: \"CW.BombsiteClear\", icon: \"icons/ui/chatwheel_spreadout.svg\" },\n        { text: \"#Chatwheel_guardinga\", radio: \"CW.GuardingA\", icon: \"icons/ui/map_bombzone_a.svg\" },\n        { text: \"#Chatwheel_guardingb\", radio: \"CW.GuardingB\", icon: \"icons/ui/map_bombzone_b.svg\" },\n        { text: \"#Chatwheel_section_bomb\", title: 1 },\n        { text: \"#Chatwheel_ifixbomb\", radio: \"CW.IFixBomb\", icon: \"icons/ui/chatwheel_ifixbomb.svg\" },\n        { text: \"#Chatwheel_youfixbomb\", radio: \"CW.YouFixBomb\", icon: \"icons/ui/chatwheel_youfixbomb.svg\" },\n        { text: \"#Chatwheel_droppedbomb\", radio: \"CW.DroppedBomb\", icon: \"icons/ui/chatwheel_droppedbomb.svg\" },\n        { text: \"#Chatwheel_guardingbomb\", radio: \"CW.GuardingDroppedBomb\", icon: \"icons/ui/chatwheel_guardingbomb.svg\" },\n        { text: \"#Chatwheel_bombat\", radio: \"CW.BombAt\", icon: \"icons/ui/chatwheel_bombat.svg\" },\n        { text: \"#Chatwheel_ihavethebomb\", radio: \"CW.WeHaveTheBomb\", icon: \"icons/ui/chatwheel_ihavethebomb.svg\" },\n        { text: \"#Chatwheel_plantingata\", radio: \"CW.PlantingAtA\", icon: \"icons/ui/map_bombzone_a.svg\" },\n        { text: \"#Chatwheel_plantingatb\", radio: \"CW.PlantingAtB\", icon: \"icons/ui/map_bombzone_b.svg\" },\n        { text: \"#Chatwheel_plantedata\", radio: \"CW.PlantedAtA\", icon: \"icons/ui/map_bombzone_a.svg\" },\n        { text: \"#Chatwheel_plantedatb\", radio: \"CW.PlantedAtB\", icon: \"icons/ui/map_bombzone_b.svg\" },\n        { text: \"#Chatwheel_section_responses\", title: 1 },\n        { text: \"#Chatwheel_affirmative\", radio: \"CW.Agree\", icon: \"icons/ui/chatwheel_affirmative.svg\" },\n        { text: \"#Chatwheel_negative\", radio: \"CW.Disagree\", icon: \"icons/ui/chatwheel_negative.svg\" },\n        { text: \"#Chatwheel_compliment\", radio: \"CW.Compliment\", icon: \"icons/ui/chatwheel_compliment.svg\" },\n        { text: \"#Chatwheel_thanks\", radio: \"CW.Thanks\", icon: \"icons/ui/chatwheel_thanks.svg\" },\n        { text: \"#Chatwheel_cheer\", radio: \"CW.Cheer\", icon: \"icons/ui/chatwheel_cheer.svg\" },\n        { text: \"#Chatwheel_peptalk\", radio: \"CW.PepTalk\", icon: \"icons/ui/chatwheel_peptalk.svg\" },\n        { text: \"#Chatwheel_sorry\", radio: \"CW.Sorry\", icon: \"icons/ui/chatwheel_sorry.svg\" },\n        { text: \"#Chatwheel_lostround\", radio: \"CW.RoundLost\", icon: \"icons/ui/chatwheel_sorry.svg\" },\n        { text: \"#Chatwheel_ikilledsniper\", radio: \"CW.IKilledSniper\", icon: \"Icons/ui/chatwheel_sniperspotted.svg\" },\n        { text: \"#Chatwheel_gotheadshot\", radio: \"CW.MyHeadshot\", icon: \"icons/ui/chatwheel_cheer.svg\" },\n        { text: \"#Chatwheel_sawheadshot\", radio: \"CW.SawHeadshot\", icon: \"icons/ui/chatwheel_compliment.svg\" },\n        { text: \"#Chatwheel_section_grenades\", title: 1 },\n        { text: \"#Chatwheel_decoy\", radio: \"CW.NeedDecoy\", icon: \"icons/ui/chatwheel_decoy.svg\" },\n        { text: \"#Chatwheel_smoke\", radio: \"CW.NeedSmoke\", icon: \"icons/ui/chatwheel_smoke.svg\" },\n        { text: \"#Chatwheel_grenade\", radio: \"CW.NeedGrenade\", icon: \"icons/ui/chatwheel_grenade.svg\" },\n        { text: \"#Chatwheel_fire\", radio: \"CW.NeedFire\", icon: \"icons/ui/chatwheel_fire.svg\" },\n        { text: \"#Chatwheel_flashbang\", radio: \"CW.NeedFlash\", icon: \"icons/ui/chatwheel_flashbang.svg\" },\n    ];\n    let m_panelList = [];\n    let m_chatwheelName = \"0\";\n    function ClickChatwheelPanel() {\n        _ClearHighlights();\n    }\n    SettingsMenuChatwheel.ClickChatwheelPanel = ClickChatwheelPanel;\n    function ActivateChatwheel(chatwheelNumber) {\n        _ClearHighlights();\n        m_chatwheelName = String(chatwheelNumber);\n        _PopulateSegments();\n    }\n    SettingsMenuChatwheel.ActivateChatwheel = ActivateChatwheel;\n    let m_activeSegment = -1;\n    function ActivateSegment(segmentNumber) {\n        m_activeSegment = segmentNumber;\n        for (let i = 0; i < 8; ++i) {\n            if (i != segmentNumber) {\n                $(\"#radio-segment-\" + i).RemoveClass('RadialRadioSettingsSegment--selected');\n            }\n        }\n        $(\"#radio-segment-\" + segmentNumber).AddClass('RadialRadioSettingsSegment--selected');\n        $('#chatwheel-settings-list').FindChildrenWithClassTraverse('RadialRadioSettingsSingleOptionPanel').forEach(el => el.AddClass('RadialRadioSettingsSingleOptionPanel--highlight'));\n    }\n    SettingsMenuChatwheel.ActivateSegment = ActivateSegment;\n    function _ClearHighlights() {\n        $('#chatwheel-settings-list').FindChildrenWithClassTraverse('RadialRadioSettingsSingleOptionPanel').forEach(el => el.RemoveClass('RadialRadioSettingsSingleOptionPanel--highlight'));\n        m_activeSegment = -1;\n        for (let i = 0; i < 8; ++i) {\n            $(\"#radio-segment-\" + i).RemoveClass('RadialRadioSettingsSegment--selected');\n        }\n    }\n    function _PopulateSegments() {\n        for (let i = 0; i < 8; ++i) {\n            let elPanel = $('#radio-segment-' + i);\n            let elLabel = elPanel.FindChildTraverse('segment-label');\n            let strText = GameInterfaceAPI.GetSettingString('cl_radial_radio_tab_' + m_chatwheelName + '_text_' + (i + 1));\n            elLabel.text = $.Localize(strText);\n            let elIcon = elPanel.FindChildTraverse('segment-icon');\n            for (let j = 0; j < m_options.length; ++j) {\n                if (m_options[j].text == strText) {\n                    if (m_options[j].icon) {\n                        elIcon.SetImage(\"file://{images}/\" + m_options[j].icon);\n                    }\n                    else {\n                        elIcon.SetImage(\"\");\n                    }\n                }\n            }\n        }\n    }\n    function _PopulateSettingsList() {\n        let elOptionsList = $('#chatwheel-settings-list');\n        for (let i = 0; i < m_options.length; ++i) {\n            let strOption = m_options[i].text;\n            let strIcon = m_options[i].icon;\n            let elPanel;\n            if (m_options[i].title) {\n                elPanel = $.CreatePanel(\"Panel\", elOptionsList, \"chatwheel-option-\" + i);\n                elPanel.BLoadLayoutSnippet(\"ChatWheelHeadingPanel\");\n            }\n            else {\n                elPanel = $.CreatePanel(\"Button\", elOptionsList, \"chatwheel-option-\" + i);\n                elPanel.BLoadLayoutSnippet(\"ChatWheelOptionPanel\");\n                elPanel.SetPanelEvent('onactivate', () => {\n                    if (m_activeSegment != -1) {\n                        let elSegment = $(\"#radio-segment-\" + m_activeSegment);\n                        elSegment.RemoveClass('RadialRadioSettingsSegment--selected');\n                        elSegment.FindChildTraverse('segment-label').text = $.Localize(strOption);\n                        let elIcon = elSegment.FindChildTraverse('segment-icon');\n                        for (let j = 0; j < m_options.length; ++j) {\n                            if (m_options[j].text == strOption) {\n                                if (m_options[j].icon) {\n                                    elIcon.SetImage(\"file://{images}/\" + m_options[j].icon);\n                                }\n                                else {\n                                    elIcon.SetImage(\"\");\n                                }\n                            }\n                        }\n                        GameInterfaceAPI.SetSettingString('cl_radial_radio_tab_' + m_chatwheelName + '_text_' + (m_activeSegment + 1), strOption);\n                        GameInterfaceAPI.ConsoleCommand('host_writeconfig');\n                    }\n                    m_activeSegment = -1;\n                    _ClearHighlights();\n                });\n            }\n            let elLabel = elPanel.FindChildTraverse('chat-wheel-option-label');\n            elLabel.text = $.Localize(strOption);\n            if (strIcon) {\n                let elImage = elPanel.FindChildTraverse('chat-wheel-option-icon');\n                elImage.SetImage(\"file://{images}/\" + strIcon);\n            }\n            let searchEntry = {\n                panel: elPanel,\n                text: $.Localize(strOption).toLowerCase(),\n            };\n            m_panelList.push(searchEntry);\n        }\n    }\n    function SearchChanged() {\n        let text = $('#RadialRadioSettingsSearchText').text.toLowerCase();\n        for (let i = 0; i < m_panelList.length; ++i) {\n            let found = (m_panelList[i].text.indexOf(text) != -1);\n            m_panelList[i].panel.visible = found;\n        }\n    }\n    SettingsMenuChatwheel.SearchChanged = SearchChanged;\n    _PopulateSegments();\n    _PopulateSettingsList();\n})(SettingsMenuChatwheel || (SettingsMenuChatwheel = {}));\n","scripts/settingsmenu_crosshair.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"settingsmenu_shared.ts\" />\n/// <reference path=\"common/promoted_settings.ts\" />\n/// <reference path=\"context_menus/context_menu_color_picker.ts\" />\nvar SettingsMenuCrosshairSettings;\n(function (SettingsMenuCrosshairSettings) {\n    function OnCrosshairStyleChange() {\n        let nStyle = parseInt(GameInterfaceAPI.GetSettingString('cl_crosshairstyle'));\n        const cp = $.GetContextPanel();\n        $(\"#XhairCenterDot\").visible = false;\n        $(\"#XhairCenterDotSeparator\").visible = false;\n        $(\"#XhairGap\").visible = false;\n        $(\"#XhairGapSeparator\").visible = false;\n        $(\"#XhairClassicGap\").visible = false;\n        $(\"#XhairClassicGapSeparator\").visible = false;\n        $(\"#XhairLength\").visible = false;\n        $(\"#XhairLengthSeparator\").visible = false;\n        $(\"#XhairTStyle\").visible = false;\n        $(\"#XhairTStyleSeparator\").visible = false;\n        $(\"#XhairDynamicSpreadDist\").visible = false;\n        $(\"#XhairDynamicSpreadDistSeparator\").visible = false;\n        $(\"#XhairClassicSplitDist\").visible = false;\n        $(\"#XhairClassicSplitDistSeparator\").visible = false;\n        $(\"#XhairClassicSplitInnerAlpha\").visible = false;\n        $(\"#XhairClassicSplitInnerAlphaSeparator\").visible = false;\n        $(\"#XhairClassicSplitOuterAlpha\").visible = false;\n        $(\"#XhairClassicSplitOuterAlphaSeparator\").visible = false;\n        $(\"#XhairClassicSplitRatio\").visible = false;\n        $(\"#XhairClassicSplitRatioSeparator\").visible = false;\n        $(\"#XhairOutlineColorPicker\").visible = false;\n        $(\"#XhairOutlineColorPickerSeparator\").visible = false;\n        $(\"#XhairStaticQuadSplitRatio\").visible = false;\n        $(\"#XhairStaticQuadSplitRatioSeparator\").visible = false;\n        let nDrawOutline = parseInt(GameInterfaceAPI.GetSettingString('cl_crosshair_drawoutline'));\n        if (nDrawOutline != 0) {\n            $(\"#XhairOutlineColorPicker\").visible = true;\n            $(\"#XhairOutlineColorPickerSeparator\").visible = true;\n        }\n        if (nStyle == 0) {\n            $(\"#XhairCenterDot\").visible = true;\n            $(\"#XhairCenterDotSeparator\").visible = true;\n            $(\"#XhairGap\").visible = true;\n            $(\"#XhairGapSeparator\").visible = true;\n            $(\"#XhairLength\").visible = true;\n            $(\"#XhairLengthSeparator\").visible = true;\n            $(\"#XhairTStyle\").visible = true;\n            $(\"#XhairTStyleSeparator\").visible = true;\n            $(\"#XhairDynamicSpreadDist\").visible = true;\n            $(\"#XhairDynamicSpreadDistSeparator\").visible = true;\n        }\n        else if (nStyle == 1) {\n            $(\"#XhairCenterDot\").visible = true;\n            $(\"#XhairCenterDotSeparator\").visible = true;\n            $(\"#XhairDynamicSpreadDist\").visible = true;\n            $(\"#XhairDynamicSpreadDistSeparator\").visible = true;\n        }\n        else if (nStyle == 2) {\n            $(\"#XhairCenterDot\").visible = true;\n            $(\"#XhairCenterDotSeparator\").visible = true;\n            $(\"#XhairClassicGap\").visible = true;\n            $(\"#XhairClassicGapSeparator\").visible = true;\n            $(\"#XhairLength\").visible = true;\n            $(\"#XhairLengthSeparator\").visible = true;\n            $(\"#XhairTStyle\").visible = true;\n            $(\"#XhairTStyleSeparator\").visible = true;\n            $(\"#XhairClassicSplitRatio\").visible = true;\n            $(\"#XhairClassicSplitRatioSeparator\").visible = true;\n            $(\"#XhairClassicSplitDist\").visible = true;\n            $(\"#XhairClassicSplitDistSeparator\").visible = true;\n            $(\"#XhairClassicSplitInnerAlpha\").visible = true;\n            $(\"#XhairClassicSplitInnerAlphaSeparator\").visible = true;\n            $(\"#XhairClassicSplitOuterAlpha\").visible = true;\n            $(\"#XhairClassicSplitOuterAlphaSeparator\").visible = true;\n        }\n        else if (nStyle == 3) {\n            $(\"#XhairCenterDot\").visible = true;\n            $(\"#XhairCenterDotSeparator\").visible = true;\n            $(\"#XhairGap\").visible = true;\n            $(\"#XhairGapSeparator\").visible = true;\n        }\n        else if (nStyle == 4) {\n            $(\"#XhairCenterDot\").visible = true;\n            $(\"#XhairCenterDotSeparator\").visible = true;\n            $(\"#XhairGap\").visible = true;\n            $(\"#XhairGapSeparator\").visible = true;\n            $(\"#XhairLength\").visible = true;\n            $(\"#XhairLengthSeparator\").visible = true;\n            $(\"#XhairTStyle\").visible = true;\n            $(\"#XhairTStyleSeparator\").visible = true;\n        }\n        else if (nStyle == 5) {\n            $(\"#XhairCenterDot\").visible = true;\n            $(\"#XhairCenterDotSeparator\").visible = true;\n            $(\"#XhairGap\").visible = true;\n            $(\"#XhairGapSeparator\").visible = true;\n            $(\"#XhairLength\").visible = true;\n            $(\"#XhairLengthSeparator\").visible = true;\n            $(\"#XhairTStyle\").visible = true;\n            $(\"#XhairTStyleSeparator\").visible = true;\n        }\n        else if (nStyle == 6) {\n        }\n        else if (nStyle == 7) {\n            $(\"#XhairCenterDot\").visible = true;\n            $(\"#XhairCenterDotSeparator\").visible = true;\n            $(\"#XhairGap\").visible = true;\n            $(\"#XhairGapSeparator\").visible = true;\n            $(\"#XhairLength\").visible = true;\n            $(\"#XhairLengthSeparator\").visible = true;\n            $(\"#XhairTStyle\").visible = true;\n            $(\"#XhairTStyleSeparator\").visible = true;\n            $(\"#XhairDynamicSpreadDist\").visible = true;\n            $(\"#XhairDynamicSpreadDistSeparator\").visible = true;\n        }\n        else if (nStyle == 8) {\n            $(\"#XhairCenterDot\").visible = true;\n            $(\"#XhairCenterDotSeparator\").visible = true;\n            $(\"#XhairGap\").visible = true;\n            $(\"#XhairGapSeparator\").visible = true;\n        }\n        else if (nStyle == 9) {\n            $(\"#XhairCenterDot\").visible = true;\n            $(\"#XhairCenterDotSeparator\").visible = true;\n            $(\"#XhairGap\").visible = true;\n            $(\"#XhairGapSeparator\").visible = true;\n            $(\"#XhairStaticQuadSplitRatio\").visible = true;\n            $(\"#XhairStaticQuadSplitRatioSeparator\").visible = true;\n        }\n        $(\"#CrosshairEditorPreview\").SetHasClass(\"dynamic-crosshair\", nStyle === 0 || nStyle === 1 || nStyle === 2 || nStyle === 6);\n        let obsCrosshairs = parseInt(GameInterfaceAPI.GetSettingString('cl_show_observer_crosshair'));\n        let showObserverBotSetting = (obsCrosshairs === 2);\n        $(\"#XhairObservedBotCrosshair\").visible = showObserverBotSetting;\n        $(\"#XhairObservedBotCrosshairSeparator\").visible = showObserverBotSetting;\n        _RefreshColorDisplay(cp);\n        const elColorBox = $(\"#XhairColorDisplayBox\");\n        $(\"#XhairColorDisplay\")?.SetPanelEvent('onactivate', () => {\n            let contextMenuPanel = UiToolkitAPI.ShowCustomLayoutContextMenuParameters('', '', 'file://{resources}/layout/context_menus/context_menu_color_picker.xml', '');\n            contextMenuPanel.AddClass(\"ContextMenu_NoArrow\");\n            contextMenuPanel.Data().initRGB = {\n                r: parseInt(GameInterfaceAPI.GetSettingString('cl_crosshaircolor_r')),\n                g: parseInt(GameInterfaceAPI.GetSettingString('cl_crosshaircolor_g')),\n                b: parseInt(GameInterfaceAPI.GetSettingString('cl_crosshaircolor_b'))\n            };\n            contextMenuPanel.Data().nInitAlpha = parseInt(GameInterfaceAPI.GetSettingString('cl_crosshaircolor_a'));\n            contextMenuPanel.Data().funcCallback = (oResult) => {\n                if ('rgb' in oResult) {\n                    const safeRgb = oResult.rgb;\n                    GameInterfaceAPI.SetSettingString('cl_crosshaircolor_r', safeRgb.r.toString());\n                    GameInterfaceAPI.SetSettingString('cl_crosshaircolor_g', safeRgb.g.toString());\n                    GameInterfaceAPI.SetSettingString('cl_crosshaircolor_b', safeRgb.b.toString());\n                    _RefreshColorDisplay(cp);\n                }\n                if ('alpha' in oResult) {\n                    const alphaVal = oResult.alpha;\n                    GameInterfaceAPI.SetSettingString('cl_crosshaircolor_a', alphaVal.toString());\n                }\n            };\n        });\n        const elOutlineColorBox = $(\"#XhairOutlineColorDisplayBox\");\n        $(\"#XhairOutlineColorDisplay\")?.SetPanelEvent('onactivate', () => {\n            let contextMenuPanel = UiToolkitAPI.ShowCustomLayoutContextMenuParameters('', '', 'file://{resources}/layout/context_menus/context_menu_color_picker.xml', '');\n            contextMenuPanel.AddClass(\"ContextMenu_NoArrow\");\n            contextMenuPanel.Data().initRGB = {\n                r: parseInt(GameInterfaceAPI.GetSettingString('cl_crosshairoutline_r')),\n                g: parseInt(GameInterfaceAPI.GetSettingString('cl_crosshairoutline_g')),\n                b: parseInt(GameInterfaceAPI.GetSettingString('cl_crosshairoutline_b'))\n            };\n            contextMenuPanel.Data().nInitAlpha = parseInt(GameInterfaceAPI.GetSettingString('cl_crosshairoutline_a'));\n            contextMenuPanel.Data().funcCallback = (oResult) => {\n                if ('rgb' in oResult) {\n                    const safeRgb = oResult.rgb;\n                    GameInterfaceAPI.SetSettingString('cl_crosshairoutline_r', safeRgb.r.toString());\n                    GameInterfaceAPI.SetSettingString('cl_crosshairoutline_g', safeRgb.g.toString());\n                    GameInterfaceAPI.SetSettingString('cl_crosshairoutline_b', safeRgb.b.toString());\n                    _RefreshColorDisplay(cp);\n                }\n                if ('alpha' in oResult) {\n                    const alphaVal = oResult.alpha;\n                    GameInterfaceAPI.SetSettingString('cl_crosshairoutline_a', alphaVal.toString());\n                }\n            };\n        });\n    }\n    SettingsMenuCrosshairSettings.OnCrosshairStyleChange = OnCrosshairStyleChange;\n    function _RefreshColorDisplay(cp) {\n        let ColorR = GameInterfaceAPI.GetSettingString('cl_crosshaircolor_r');\n        let ColorG = GameInterfaceAPI.GetSettingString('cl_crosshaircolor_g');\n        let ColorB = GameInterfaceAPI.GetSettingString('cl_crosshaircolor_b');\n        cp.FindChildInLayoutFile('XhairColorDisplayBox').style.backgroundColor = 'rgb(' + ColorR + ',' + ColorG + ',' + ColorB + ');';\n        let OutlineR = GameInterfaceAPI.GetSettingString('cl_crosshairoutline_r');\n        let OutlineG = GameInterfaceAPI.GetSettingString('cl_crosshairoutline_g');\n        let OutlineB = GameInterfaceAPI.GetSettingString('cl_crosshairoutline_b');\n        cp.FindChildInLayoutFile('XhairOutlineColorDisplayBox').style.backgroundColor = 'rgb(' + OutlineR + ',' + OutlineG + ',' + OutlineB + ');';\n    }\n    function _RefreshControlsRecursive(panel) {\n        if (panel == null) {\n            return;\n        }\n        if ('OnShow' in panel) {\n            panel.OnShow();\n        }\n        if (panel.GetChildCount == undefined) {\n            return;\n        }\n        else {\n            let nCount = panel.GetChildCount();\n            for (let i = 0; i < nCount; i++) {\n                let child = panel.GetChild(i);\n                _RefreshControlsRecursive(child);\n            }\n        }\n    }\n    const k_arrNewCrosshairStyles = [3, 6, 0, 1, 7, 8, 9];\n    const k_arrTaggedCrosshairSettings = [\n        { id: 'XhairStyle', loc_name: '#GameUI_CrosshairStyle', tag: 'new', loc_tooltip: '#GameUI_CrosshairUpdated_Style' },\n        { id: 'XhairColorPicker', loc_name: '#GameUI_CrosshairColor', tag: 'updated', loc_tooltip: '#GameUI_CrosshairUpdated_Info' },\n        { id: 'XhairThickness', loc_name: '#GameUI_CrosshairThickness', tag: 'updated', loc_tooltip: '#GameUI_CrosshairUpdated_Info' },\n        { id: 'XhairLength', loc_name: '#GameUI_CrosshairLength', tag: 'updated', loc_tooltip: '#GameUI_CrosshairUpdated_Info' },\n        { id: 'XhairGap', loc_name: '#GameUI_CrosshairGap', tag: 'updated', loc_tooltip: '#GameUI_CrosshairUpdated_Info' }\n    ];\n    function _MakeTagSpan(strLocToken, strModifier) {\n        return '<span class=\"settings-tag ' + strModifier + '\"> ' + $.Localize(strLocToken) + ' </span>';\n    }\n    function _SetHtmlText(el, strText) {\n        if (!el)\n            return;\n        el.html = true;\n        el.text = strText;\n    }\n    function _TagCrosshairSettings() {\n        if (!PromotedSettingsUtil.GetUnacknowledgedPromotedSettings().some(setting => setting.id === 'XhairStyle'))\n            return;\n        const elDropdown = $('#XhairStyleDropdown');\n        if (elDropdown) {\n            for (const nStyle of k_arrNewCrosshairStyles) {\n                const id = 'crosshairstyle' + nStyle;\n                const strText = _MakeTagSpan('#settings_new', 'settings-tag--new') + ' ' + $.Localize('#GameUI_CrosshairStyle' + nStyle);\n                _SetHtmlText(elDropdown.FindDropDownMenuChild(id), strText);\n                _SetHtmlText(elDropdown.FindChild(id), strText);\n            }\n        }\n        for (const setting of k_arrTaggedCrosshairSettings) {\n            const elRow = $('#' + setting.id);\n            if (!elRow)\n                continue;\n            const elTitle = elRow.FindChildTraverse('Title');\n            _SetHtmlText(elTitle, $.Localize(setting.loc_name) + ' ' + _MakeTagSpan('#settings_' + setting.tag, 'settings-tag--' + setting.tag));\n            elRow.SetPanelEvent('onmouseover', () => UiToolkitAPI.ShowTextTooltipOnPanel(elRow, setting.loc_tooltip));\n            elRow.SetPanelEvent('onmouseout', () => UiToolkitAPI.HideTextTooltip());\n        }\n    }\n    {\n        OnCrosshairStyleChange();\n        _TagCrosshairSettings();\n        SettingsMenuShared.ChangeBackground(0);\n    }\n})(SettingsMenuCrosshairSettings || (SettingsMenuCrosshairSettings = {}));\n","scripts/settingsmenu_gamesettings.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"settingsmenu_shared.ts\" />\nvar SettingsMenuGameSettings;\n(function (SettingsMenuGameSettings) {\n    function _InitGameSettings() {\n        if (GameInterfaceAPI.IsConsoleEnabledByCommandLine()) {\n            $(\"#enableconsoledropdown-container\").visible = false;\n        }\n        else {\n            $(\"#enableconsoledropdowncmdline-container\").visible = false;\n        }\n        if (!GameInterfaceAPI.ShowThreadPoolOptions()) {\n            $(\"#ThreadPoolOptions\").visible = false;\n            $(\"#ThreadPoolOptionsQuit\").visible = false;\n            GameInterfaceAPI.SetSettingString('thread_pool_option', '3');\n        }\n        else {\n            let option = parseInt(GameInterfaceAPI.GetSettingString('thread_pool_option'));\n            if (option !== 0 && option !== 2 && option !== 3) {\n                GameInterfaceAPI.SetSettingString('thread_pool_option', '3');\n            }\n        }\n        _RefreshDatacentersList();\n    }\n    function _RefreshDatacentersList() {\n        let elContainer = $('#DatacenterListContainer');\n        elContainer.RemoveAndDeleteChildren();\n        const dcs = LobbyAPI.GetReachableDatacenters();\n        const samples = dcs.samples;\n        let numSamplesAdded = 0;\n        for (let k = 0; k < 10; ++k) {\n            if (!samples || !samples.hasOwnProperty('sample' + k))\n                break;\n            const ss = samples['sample' + k];\n            let elPanel = $.CreatePanel(\"Panel\", elContainer, String(ss.ping));\n            elPanel.BLoadLayoutSnippet(\"snippet_datacenter_entry\");\n            elPanel.SetDialogVariable('name', ss.name);\n            elPanel.SetDialogVariableInt('ping', ss.ping);\n            ++numSamplesAdded;\n        }\n        if (numSamplesAdded == 0) {\n            let elPanel = $.CreatePanel(\"Panel\", elContainer, '0');\n            elPanel.BLoadLayoutSnippet(\"snippet_datacenter_entry\");\n            elPanel.SetDialogVariable('name', $.Localize(\"#SFUI_UserAlert_Unreachable\"));\n            elPanel.SetDialogVariableInt('ping', 0);\n        }\n        elContainer.SetHasClass('no-data-centers', numSamplesAdded == 0);\n    }\n    {\n        _InitGameSettings();\n        SettingsMenuShared.ChangeBackground(0);\n        $.RegisterForUnhandledEvent('PanoramaComponent_Lobby_ReachableDatacentersUpdated', _RefreshDatacentersList);\n    }\n})(SettingsMenuGameSettings || (SettingsMenuGameSettings = {}));\n","scripts/settingsmenu_promoted.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"common/promoted_settings.ts\" />\nvar SettingsMenuPromoted;\n(function (SettingsMenuPromoted) {\n    class CreatePromotedSettingEntry {\n        id;\n        loc_name;\n        loc_desc;\n        setting;\n        elRoot;\n        elemID;\n        constructor(setting) {\n            this.id = setting.id;\n            this.loc_name = setting.loc_name;\n            this.loc_desc = setting.loc_desc;\n            this.setting = setting;\n            this.elRoot = $('#SettingContainer');\n            this.elemID = \"PromotedSetting__\" + setting.id;\n        }\n        view() {\n            $.DispatchEvent(\"SettingsMenu_NavigateToSetting\", this.setting.section, this.setting.subsection ?? '', this.setting.id);\n        }\n        createPanel() {\n            let elNewSetting = $.CreatePanel(\"Panel\", this.elRoot, this.elemID);\n            if (elNewSetting.BLoadLayoutSnippet(\"PromotedSetting\")) {\n                elNewSetting.FindChild(\"SettingName\").text = $.Localize(this.loc_name);\n                elNewSetting.FindChild(\"SettingDesc\").text = $.Localize(this.loc_desc);\n                elNewSetting.FindChildTraverse(\"ViewSetting\").SetPanelEvent('onactivate', () => this.view());\n                if (this.setting.highlight) {\n                    elNewSetting.AddClass(\"Highlight\");\n                }\n            }\n        }\n    }\n    function _Init() {\n        let arrUnacknowledgedSettings = PromotedSettingsUtil.GetUnacknowledgedPromotedSettings();\n        arrUnacknowledgedSettings.forEach(setting => setting.highlight = true);\n        for (const setting of g_PromotedSettings) {\n            const now = new Date();\n            if (setting.end_date > now && setting.start_date <= now) {\n                let elGoToSettingPanel = new CreatePromotedSettingEntry(setting);\n                elGoToSettingPanel.createPanel();\n            }\n        }\n        if (arrUnacknowledgedSettings.length > 0) {\n            $.DispatchEvent(\"MainMenu_PromotedSettingsViewed\");\n        }\n    }\n    {\n        _Init();\n    }\n})(SettingsMenuPromoted || (SettingsMenuPromoted = {}));\n","scripts/settingsmenu_search.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"common/promoted_settings.ts\" />\nvar SettingsMenuSearch;\n(function (SettingsMenuSearch) {\n    let m_SettingsSearchTextEntry = $(\"#SettingsSearchTextEntry\");\n    let m_ResultsContainer = $(\"#SearchResultsContainer\");\n    function _Init() {\n        $.RegisterEventHandler('ReadyForDisplay', m_SettingsSearchTextEntry, _OnReadyForDisplay);\n        $.RegisterEventHandler('UnreadyForDisplay', m_SettingsSearchTextEntry, _OnUnreadyForDisplay);\n        m_SettingsSearchTextEntry.RegisterForReadyEvents(true);\n        m_SettingsSearchTextEntry.SetReadyForDisplay(true);\n        m_SettingsSearchTextEntry.SetPanelEvent('ontextentrychange', OnTextEntryChanged);\n        OnTextEntryChanged();\n    }\n    function _OnReadyForDisplay() {\n        m_SettingsSearchTextEntry.SetFocus();\n        m_SettingsSearchTextEntry.RaiseChangeEvents(true);\n    }\n    function _OnUnreadyForDisplay() {\n        m_SettingsSearchTextEntry.GetParent().SetFocus();\n        m_SettingsSearchTextEntry.RaiseChangeEvents(false);\n    }\n    function OnTextEntryChanged() {\n        m_ResultsContainer.RemoveAndDeleteChildren();\n        let hasText = /.*\\S.*/;\n        if (!hasText.test(m_SettingsSearchTextEntry.text)) {\n            PopulateWithPromotedSettings();\n            return;\n        }\n        let arrStrings = m_SettingsSearchTextEntry.text.split(/\\s/).filter(s => /^\\w+$/.test(s));\n        let searchableMenus = [\n            'GameSettings',\n            'AudioSettings',\n            'video_settings',\n            'advanced_video',\n            'KeybdMouseSettings',\n            'CrosshairSettings',\n            'ControllerSettings'\n        ];\n        let arrMatches = [];\n        let elSettingsMenu = $.GetContextPanel().GetParent();\n        let curMenuTab = null;\n        searchableMenus.forEach(id => {\n            curMenuTab = id;\n            let elRootPanel = elSettingsMenu.FindChildTraverse(id);\n            if (!elRootPanel || !elRootPanel.IsValid())\n                return;\n            TraverseChildren(elRootPanel, SearchSettingText);\n            function TraverseChildren(elRoot, fnSearch) {\n                if (typeof elRoot.Children !== 'function')\n                    return;\n                elRoot.Children().forEach(c => { TraverseChildren(c, fnSearch); fnSearch(c); });\n            }\n            function SearchSettingText(setting) {\n                if (ShouldSearchPanelText(setting)) {\n                    let bPass = arrStrings.every(s => {\n                        let search = new RegExp(s, \"giu\");\n                        return search.test(setting.text);\n                    });\n                    if (bPass) {\n                        let curSubMenu = '';\n                        if (curMenuTab.includes('video')) {\n                            curSubMenu = curMenuTab.includes('advanced') ? 'AdvancedVideoSettingsRadio' : 'SimpleVideoSettingsRadio';\n                            curMenuTab = 'VideoSettings';\n                        }\n                        arrMatches.push({\n                            panel: setting.GetParent(),\n                            text: setting.text,\n                            menu: curMenuTab,\n                            submenu: curSubMenu\n                        });\n                    }\n                }\n                function ShouldSearchPanelText(setting) {\n                    if (!setting.hasOwnProperty('text'))\n                        return false;\n                    if (setting.paneltype === 'TextEntry')\n                        return false;\n                    if (setting.BHasClass('DropDownChild'))\n                        return false;\n                    if (setting.BHasClass('BindingRowButton'))\n                        return false;\n                    if (setting.GetParent().paneltype === ('RadioButton'))\n                        return false;\n                    return true;\n                }\n            }\n        });\n        for (let searchResult of arrMatches) {\n            CreateSearchResultPanel(searchResult.text, searchResult.menu, searchResult.submenu, searchResult.panel);\n        }\n    }\n    function CreateSearchResultPanel(text, menuid, submenu, panel) {\n        let elSearchResult = $.CreatePanel(\"Panel\", m_ResultsContainer, \"setting_result_link\");\n        if (elSearchResult.BLoadLayoutSnippet(\"SearchResult\")) {\n            elSearchResult.FindChild(\"ResultString\").SetAlreadyLocalizedText(text);\n            elSearchResult.SetPanelEvent('onactivate', () => {\n                $.DispatchEvent(\"SettingsMenu_NavigateToSettingPanel\", menuid, submenu, panel);\n            });\n        }\n    }\n    function PopulateWithPromotedSettings() {\n        let elTitle = $.CreatePanel(\"Label\", m_ResultsContainer, \"promoted_settings_title\");\n        elTitle.text = $.Localize(\"#GameUI_Settings_Promoted\");\n        elTitle.AddClass(\"SettingsSectionTitleLabel\");\n        elTitle.AddClass(\"setting-search-recently-added-header\");\n        g_PromotedSettings.forEach(s => {\n            let elSettingsMenu = $.GetContextPanel().GetParent();\n            let elPanel = elSettingsMenu.FindChildTraverse(s.id);\n            if (elPanel) {\n                CreateSearchResultPanel($.Localize(s.loc_name), s.section, s.subsection || \"\", elPanel);\n            }\n        });\n    }\n    {\n        _Init();\n    }\n})(SettingsMenuSearch || (SettingsMenuSearch = {}));\n","scripts/settingsmenu_shared.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\nvar SettingsMenuShared;\n(function (SettingsMenuShared) {\n    function _ResetControlsRecursive(panel) {\n        if (panel == null) {\n            return;\n        }\n        if (panel.GetChildCount == undefined) {\n            return;\n        }\n        if (panel.paneltype == 'CSGOSettingsSlider' || panel.paneltype == 'CSGOSettingsEnumDropDown') {\n            panel.RestoreCVarDefault();\n        }\n        else if (panel.paneltype == 'CSGOSettingsKeyBinder') {\n            panel.OnShow();\n        }\n        else {\n            let nCount = panel.GetChildCount();\n            for (let i = 0; i < nCount; i++) {\n                let child = panel.GetChild(i);\n                _ResetControlsRecursive(child);\n            }\n        }\n    }\n    function ResetControls() {\n        GameInterfaceAPI.ResetThreadPoolOptions();\n        _ResetControlsRecursive($.GetContextPanel());\n        InventoryAPI.StopItemPreviewMusic();\n    }\n    SettingsMenuShared.ResetControls = ResetControls;\n    function ResetKeybdMouseDefaults() {\n        OptionsMenuAPI.RestoreKeybdMouseBindingDefaults();\n        ResetControls();\n    }\n    SettingsMenuShared.ResetKeybdMouseDefaults = ResetKeybdMouseDefaults;\n    function ResetAudioSettings() {\n        $.DispatchEvent(\"CSGOAudioSettingsResetDefault\");\n        ResetControls();\n    }\n    SettingsMenuShared.ResetAudioSettings = ResetAudioSettings;\n    function ResetVideoSettings() {\n        $.DispatchEvent(\"CSGOVideoSettingsResetDefault\");\n        ResetControls();\n        VideoSettingsOnUserInputSubmit();\n    }\n    SettingsMenuShared.ResetVideoSettings = ResetVideoSettings;\n    function ResetVideoSettingsAdvanced() {\n        $.DispatchEvent(\"CSGOVideoSettingsResetDefaultAdvanced\");\n        VideoSettingsEnableDiscard();\n    }\n    SettingsMenuShared.ResetVideoSettingsAdvanced = ResetVideoSettingsAdvanced;\n    function _RefreshControls() {\n        _RefreshControlsRecursive($.GetContextPanel());\n    }\n    function _RefreshControlsRecursive(panel) {\n        if (panel == null) {\n            return;\n        }\n        if ('OnShow' in panel) {\n            panel.OnShow();\n        }\n        if (panel.GetChildCount == undefined) {\n            return;\n        }\n        else {\n            let nCount = panel.GetChildCount();\n            for (let i = 0; i < nCount; i++) {\n                let child = panel.GetChild(i);\n                _RefreshControlsRecursive(child);\n            }\n        }\n    }\n    function ShowConfirmReset(resetCall, locText) {\n        UiToolkitAPI.ShowGenericPopupOneOptionCustomCancelBgStyle('#settings_reset_confirm_title', locText, '', '#settings_reset', resetCall, '#settings_return', () => { }, 'dim');\n    }\n    SettingsMenuShared.ShowConfirmReset = ShowConfirmReset;\n    function ShowConfirmDiscard(discardCall) {\n        UiToolkitAPI.ShowGenericPopupOneOptionCustomCancelBgStyle('#settings_discard_confirm_title', '#settings_discard_confirm_video_desc', '', '#settings_discard', discardCall, '#settings_return', () => { }, 'dim');\n    }\n    SettingsMenuShared.ShowConfirmDiscard = ShowConfirmDiscard;\n    function ScrollToId(locationId) {\n        let elLocationPanel = $.GetContextPanel().FindChildTraverse(locationId);\n        if (elLocationPanel != null) {\n            $.GetContextPanel().Data().bScrollingToId = true;\n            elLocationPanel.ScrollParentToMakePanelFit(3, false);\n            elLocationPanel.TriggerClass('Highlight');\n        }\n    }\n    SettingsMenuShared.ScrollToId = ScrollToId;\n    function SetVis(locationId, vis) {\n        let panel = $.GetContextPanel().FindChildTraverse(locationId);\n        if (panel != null) {\n            panel.visible = vis;\n        }\n    }\n    SettingsMenuShared.SetVis = SetVis;\n    let gBtnApplyVideoSettingsButton = null;\n    let gBtnDiscardVideoSettingChanges = null;\n    let gBtnDiscardVideoSettingChanges2 = null;\n    function VideoSettingsOnUserInputSubmit() {\n        if (gBtnApplyVideoSettingsButton != null) {\n            gBtnApplyVideoSettingsButton.enabled = true;\n        }\n        if (gBtnDiscardVideoSettingChanges != null) {\n            gBtnDiscardVideoSettingChanges.enabled = true;\n        }\n    }\n    SettingsMenuShared.VideoSettingsOnUserInputSubmit = VideoSettingsOnUserInputSubmit;\n    function VideoSettingsEnableDiscard() {\n        if (gBtnDiscardVideoSettingChanges2 != null) {\n            gBtnDiscardVideoSettingChanges2.enabled = true;\n        }\n    }\n    SettingsMenuShared.VideoSettingsEnableDiscard = VideoSettingsEnableDiscard;\n    function _VideoSettingsResetUserInput() {\n        if (gBtnApplyVideoSettingsButton != null) {\n            gBtnApplyVideoSettingsButton.enabled = false;\n        }\n        if (gBtnDiscardVideoSettingChanges != null) {\n            gBtnDiscardVideoSettingChanges.enabled = false;\n        }\n        if (gBtnDiscardVideoSettingChanges2 != null) {\n            gBtnDiscardVideoSettingChanges2.enabled = false;\n        }\n    }\n    function VideoSettingsDiscardChanges() {\n        $.DispatchEvent(\"CSGOVideoSettingsInit\");\n        _VideoSettingsResetUserInput();\n    }\n    SettingsMenuShared.VideoSettingsDiscardChanges = VideoSettingsDiscardChanges;\n    function VideoSettingsDiscardAdvanced() {\n        $.DispatchEvent(\"CSGOVideoSettingsDiscardAdvanced\");\n        _VideoSettingsResetUserInput();\n    }\n    SettingsMenuShared.VideoSettingsDiscardAdvanced = VideoSettingsDiscardAdvanced;\n    function VideoSettingsApplyChanges() {\n        $.DispatchEvent(\"CSGOApplyVideoSettings\");\n        _VideoSettingsResetUserInput();\n    }\n    SettingsMenuShared.VideoSettingsApplyChanges = VideoSettingsApplyChanges;\n    function NewTabOpened(newTab) {\n        let videoSettingsStr = 'VideoSettings';\n        if (newTab == videoSettingsStr) {\n            let videoSettingsPanel = $.GetContextPanel().FindChildInLayoutFile(videoSettingsStr);\n            gBtnApplyVideoSettingsButton = videoSettingsPanel.FindChildInLayoutFile(\"BtnApplyVideoSettings\");\n            gBtnDiscardVideoSettingChanges = videoSettingsPanel.FindChildInLayoutFile(\"BtnDiscardVideoSettingChanges\");\n            gBtnDiscardVideoSettingChanges2 = videoSettingsPanel.FindChildInLayoutFile(\"BtnDiscardVideoSettingChanges2\");\n            gBtnApplyVideoSettingsButton.enabled = false;\n            gBtnDiscardVideoSettingChanges.enabled = false;\n            gBtnDiscardVideoSettingChanges2.enabled = false;\n            $.DispatchEvent(\"CSGOVideoSettingsInit\");\n        }\n        let newTabPanel = $.GetContextPanel().FindChildInLayoutFile(newTab);\n        _RefreshControlsRecursive(newTabPanel);\n        GameInterfaceAPI.ConsoleCommand(\"host_writeconfig\");\n        InventoryAPI.StopItemPreviewMusic();\n    }\n    SettingsMenuShared.NewTabOpened = NewTabOpened;\n    function ChangeBackground(delta) {\n        let elBkg = $(\"#XhairBkg\");\n        if (elBkg) {\n            let nBkgIdx = elBkg.GetAttributeInt(\"bkg-id\", 0);\n            let arrBkgs = [\"bkg-dust2\", \"bkg-nuke\", \"bkg-mirage\", \"bkg-ancient\", \"bkg-anubis\", \"bkg-cache\", \"bkg-inferno\"];\n            nBkgIdx = (arrBkgs.length + nBkgIdx + delta) % arrBkgs.length;\n            elBkg.SwitchClass(\"bkg-style\", arrBkgs[nBkgIdx]);\n            elBkg.SetAttributeInt(\"bkg-id\", nBkgIdx);\n        }\n    }\n    SettingsMenuShared.ChangeBackground = ChangeBackground;\n    {\n    }\n})(SettingsMenuShared || (SettingsMenuShared = {}));\n","scripts/settingsmenu_video.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"settingsmenu_shared.ts\" />\nvar SettingsMenuVideo;\n(function (SettingsMenuVideo) {\n    function SelectSimpleVideoSettings() {\n        SettingsMenuShared.VideoSettingsDiscardChanges();\n        SettingsMenuShared.SetVis('video_settings', true);\n        SettingsMenuShared.SetVis('advanced_video', false);\n        $('#SimpleVideoSettingsRadio').checked = true;\n        $('#AdvancedVideoSettingsRadio').checked = false;\n    }\n    SettingsMenuVideo.SelectSimpleVideoSettings = SelectSimpleVideoSettings;\n    function SelectAdvancedVideoSettings() {\n        SettingsMenuShared.VideoSettingsDiscardChanges();\n        SettingsMenuShared.SetVis('video_settings', false);\n        SettingsMenuShared.SetVis('advanced_video', true);\n        $('#SimpleVideoSettingsRadio').checked = false;\n        $('#AdvancedVideoSettingsRadio').checked = true;\n    }\n    SettingsMenuVideo.SelectAdvancedVideoSettings = SelectAdvancedVideoSettings;\n    function ShowHudEdgePositions() {\n        UiToolkitAPI.ShowCustomLayoutPopupWithCancelCallback('', 'file://{resources}/layout/popups/popup_hud_edge_positions.xml', () => { });\n    }\n    SettingsMenuVideo.ShowHudEdgePositions = ShowHudEdgePositions;\n    {\n        SelectSimpleVideoSettings();\n    }\n})(SettingsMenuVideo || (SettingsMenuVideo = {}));\n","scripts/stats/fakestats.js":"'use strict';\n\nvar fakeStats = ( function()\n{\n\n\tfunction _randomG(v){ \n\t\tvar r = 0;\n\t\tfor(var i = v; i > 0; i --){\n\t\t\tr += Math.random();\n\t\t}\n\t\treturn r / v;\n\t}\n\t\n\tfunction _RandomMap ()\n\t{\n\t\tswitch ( Math.floor( Math.random() * 7 ) )\n\t\t{\n\t\t\tcase 0: return 'dust ii';\n\t\t\tcase 1: return 'nuke';\n\t\t\tcase 2: return 'inferno';\n\t\t\tcase 3: return 'aztec';\n\t\t\tcase 4: return 'mirage';\n\t\t\tcase 5: return 'overpass';\n\t\t\tcase 6: return 'vertigo';\n\t\t}\n\t}\n\n\tfunction _RandomScore ()\n\t{\n\t\treturn ( Math.floor( Math.random() * 15 ) )\n\t}\n\n\n\tfunction _RandomMatch ()\n\t{\n\t\tvar win = Math.floor( Math.random() * 3 ) - 1;\n\n\t\treturn {\n\t\t\tmap: _RandomMap(),\n\t\t\tmyScore: win == 1 ? 16 : win == 0 ? 15 : _RandomScore(),\n\t\t\tenemyScore: win == -1 ? 16 : win == 0 ? 15 : _RandomScore(),\n\t\t\twin: win\n\t\t}\n\t}\n\n\tfunction _RandomMatchSeries ()\n\t{\n\t\tvar n = Math.ceil( 40 * ( _randomG( 50 ) - 0.5 ) );                                                \n\n\t\tvar day = {};\n\n\t\tfor ( var m = 0; m < n; m++ )\n\t\t{\n\t\t\tday[ m ] = _RandomMatch();\n\t\t}\n\n\t\treturn day;\n\t}\n\n\treturn {\n\n\t\tRandomMatch \t: _RandomMatch,\n\t\tRandomMatchSeries: _RandomMatchSeries,\n\t}\n\n\n} )();\n","scripts/stats/matchstats.js":"\"use strict\"; \n\nvar MatchStats = ( function()\n{\n\n\t                               \n\t                       \n\t                          \n\t                                                                                                                        \n\t   \t\t\t\t                                             \t\t\t    \n\t   \t\t\t\t                                               \t\t\t    \n\t   \t\t\t\t                                               \t\t\t    \n\t   \t\t\t\t                                                  \t\t    \n\t   \t\t\t\t                                                       \t                               \n\t   \t\t\t\t                                                \t\t    \n\t   \t\t\t\t                                                 \t\t                              \n\t   \t\t\t\t                                                 \t\t                              \n\t   \t\t\t\t                                             \t\t\t                              \n\t   \t\t\t\t                                             \t\t\t                            \n\t                                \n\t                                                        \n\t                                                                                 \n\t                                   \n\t                                      \n\t                                        \n\t                      \t                                                        \n\t                  \t\t                                                  \n\t                          \n\t                                                                                                                                   \n\t                      \n\t                      \n\t                      \n\t                             \n\t                                                             \n\t                                                          \n\t                                                   \n\t                                                \n\t                                                   \n\t                                                \n\t                                                \n\t                                                                     \n\t                                                                   \n\t                                        \n\t                                                                        \n\t                                                               \n\t                                 \n\n\n\tfunction _GetMatchId ( oMatch ) {return oMatch.match_id};\n\n\tfunction _GetTotalRounds ( oMatch ) {return parseInt( oMatch.rounds_won + oMatch.rounds_lost )};\n\tfunction _GetTotalDeaths ( oMatch ) {return parseInt(oMatch.stat_deaths )};\n\tfunction _GetTotalHEThrown ( oMatch ) {return parseInt(oMatch.utility_count)  };\n\tfunction _GetTotalFBThrown ( oMatch ) {return parseInt(oMatch.flash_count) };\n\tfunction _GetTotal1v1Engagements( oMatch ) {return parseInt(oMatch.engagements_1v1_count) };\n\tfunction _GetTotal1v2Engagements( oMatch ) {return parseInt(oMatch.engagements_1v2_count) };\n\tfunction _GetTotalEntries ( oMatch ) {return parseInt(oMatch.engagements_entry_count) };\n\tfunction _GetTotalEntryDeaths ( oMatch ) {return parseInt(_GetTotalEntries( oMatch ) - _GetTotalEntryKills( oMatch ))};\n\t\n\tfunction _GetTotalScore ( oMatch ) {return parseInt(oMatch.stat_score )};\t\t\t\n\tfunction _GetScorePerRound ( oMatch ) { return (_GetTotalRounds( oMatch ) == 0 ? _GetTotalScore( oMatch ) : _GetTotalScore( oMatch ) / _GetTotalRounds( oMatch )).toPrecision(3)};\n\t\n\tfunction _GetTotalKills ( oMatch ) {return parseInt(oMatch.enemy_kills )};\n\tfunction _GetKillsPerRound ( oMatch ) {return (_GetTotalRounds( oMatch ) == 0 ? _GetTotalKills( oMatch ) : _GetTotalKills( oMatch ) / _GetTotalRounds( oMatch )).toPrecision(3)};\t\t\n\t\n\tfunction _GetTotalDamage ( oMatch ) {return parseInt(oMatch.total_damage ) };\t\n\tfunction _GetDamagePerRound ( oMatch ) {return _GetTotalRounds( oMatch ) == 0 ? _GetTotalDamage( oMatch ) : (_GetTotalDamage( oMatch ) / _GetTotalRounds( oMatch )).toPrecision(3)};\n\t\n\tfunction _GetKillsPerDeath ( oMatch ) { return (_GetTotalDeaths( oMatch ) == 0 ? _GetTotalKills( oMatch ) : _GetTotalKills( oMatch ) / _GetTotalDeaths( oMatch )).toPrecision(3)};\n\t\n\tfunction _GetTotalMVPs ( oMatch ) {return parseInt(oMatch.stat_mvps )};\t\n\tfunction _GetMVPsPerRound ( oMatch ) {return (_GetTotalRounds( oMatch ) == 0 ? _GetTotalMVPs( oMatch ) : _GetTotalMVPs( oMatch ) / _GetTotalRounds( oMatch )).toPrecision(3)};\n\t\n\tfunction _GetTotalHeadShotKills ( oMatch ) {return parseInt(oMatch.enemy_headshots )};\t\t\n\tfunction _GetHeadShotKillRate ( oMatch ) {return (_GetTotalKills( oMatch ) == 0 ? 0 : (_GetTotalHeadShotKills( oMatch ) / _GetTotalKills( oMatch ) * 100)).toPrecision(3)};\t\n\t\n\tfunction _GetTotalHESuccesses ( oMatch ) {return parseInt(oMatch.utility_success )};\t\t\n\tfunction _GetHESuccessRate ( oMatch ) { return ((_GetTotalHEThrown(oMatch) == 0 ? 0 : _GetTotalHESuccesses( oMatch ) / _GetTotalHEThrown(oMatch) * 100).toPrecision(3))};\t\t\n\t\n\tfunction _GetTotalFBSuccesses ( oMatch ) {return parseInt(oMatch.flash_success )};\t\n\tfunction _GetFBSuccessRate ( oMatch ) { return ((_GetTotalFBThrown(oMatch) == 0 ? 0 : _GetTotalFBSuccesses( oMatch ) / _GetTotalFBThrown(oMatch) * 100).toPrecision(3))};\t\t\n\t\n\tfunction _GetTotal2Ks ( oMatch ) {return parseInt(oMatch.enemy_2ks )};\n\tfunction _GetTotal3ks ( oMatch ) {return parseInt(oMatch.enemy_3ks )};\n\tfunction _GetTotal4Ks ( oMatch ) {return parseInt( oMatch.enemy_4ks )};\n\t\n\tfunction _GetTotalMultiKills( oMatch ) {return _GetTotal2Ks( oMatch ) + _GetTotal3ks( oMatch ) + _GetTotal4Ks( oMatch ) };\n\t\n\tfunction _GetTotal1v1Successes ( oMatch ) {return parseInt(oMatch.engagements_1v1_wins )};\n\tfunction _Get1v1SuccessRate ( oMatch ) { return (_GetTotal1v1Engagements(oMatch) == 0 ? 0 : ( _GetTotal1v1Successes( oMatch ) / _GetTotal1v1Engagements(oMatch) * 100)).toPrecision(3)};\n\t\n\tfunction _GetTotal1v2Successes ( oMatch ) {return parseInt(oMatch.engagements_1v2_wins )};\t\t\n\tfunction _Get1v2SuccessRate ( oMatch ) { return (_GetTotal1v2Engagements(oMatch) == 0 ? 0 : (_GetTotal1v2Successes( oMatch ) / _GetTotal1v2Engagements(oMatch) * 100)).toPrecision(3)};\t\t\n\t\n\tfunction _GetTotalEntryKills ( oMatch ) {return parseInt( oMatch.engagements_entry_wins  )};\t\n\tfunction _GetEntryKillsPerDeath( oMatch ){ return ((_GetTotalEntryDeaths(oMatch) == 0 ? _GetTotalEntryKills( oMatch ) : _GetTotalEntryKills( oMatch ) / _GetTotalEntryDeaths( oMatch )).toPrecision(3))};\t\n\n\treturn {\n\t\tGetMatchId:\t\t\t\t\t_GetMatchId,\n\n\t\tGetTotalScore:\t\t\t\t_GetTotalScore,\t\t\t\t\t\t\n\t\tGetScorePerRound:\t\t\t_GetScorePerRound,\t\n\t\t\t\n\t\tGetTotalKills: \t\t\t\t_GetTotalKills,\t\t\t\t\n\t\tGetKillsPerRound: \t\t\t_GetKillsPerRound, \t\t\n\t\t\t\n\t\tGetTotalDamage:\t\t\t\t_GetTotalDamage,\n\t\tGetDamagePerRound:\t\t\t_GetDamagePerRound,\n\t\t\n\t\tGetKillsPerDeath:\t\t\t_GetKillsPerDeath,\t\n\t\t\n\t\tGetTotalMVPs:\t\t\t\t_GetTotalMVPs,\t\n\t\tGetMVPsPerRound:\t\t\t_GetMVPsPerRound,\n\t\t\n\t\tGetTotalHeadShotKills:\t\t_GetTotalHeadShotKills,\t\t\n\t\tGetHeadShotKillRate:\t\t_GetHeadShotKillRate,\t\t\n\t\t\n\t\tGetTotalHESuccesses:\t\t_GetTotalHESuccesses,\t\t\n\t\tGetHESuccessRate: \t\t\t_GetHESuccessRate,\t\n\t\tGetTotalHEThrown:\t\t\t_GetTotalHEThrown,\n\t\t\n\t\tGetTotalFBSuccesses:\t\t_GetTotalFBSuccesses,\t\t\n\t\tGetFBSuccessRate:\t\t\t_GetFBSuccessRate,\t\n\t\tGetTotalFBThrown:\t\t\t_GetTotalFBThrown,\n\n\t\tGetTotal2Ks:\t\t\t\t_GetTotal2Ks,\n\t\tGetTotal3ks:\t\t\t\t_GetTotal3ks,\n\t\tGetTotal4Ks:\t\t\t\t_GetTotal4Ks,\t\n\t\tGetTotalMultiKills:\t\t\t_GetTotalMultiKills,\t\t\n\t\t\n\t\tGetTotal1v1Successes:\t\t_GetTotal1v1Successes,\t\n\t\tGet1v1SuccessRate: \t\t\t_Get1v1SuccessRate,\n\t\tGetTotal1v1Engagements:\t\t_GetTotal1v1Engagements,\n\t\t\n\t\tGetTotal1v2Successes:\t\t_GetTotal1v2Successes,\t\t\n\t\tGet1v2SuccessRate:\t\t\t_Get1v2SuccessRate,\t\t\n\t\tGetTotal1v2Engagements:\t\t_GetTotal1v2Engagements,\n\n\t\tGetTotalEntryKills:\t\t\t_GetTotalEntryKills,\t\t\n\t\tGetEntryKillsPerDeath: \t\t_GetEntryKillsPerDeath,\t\t\t\n\t\tGetTotalEntryDeaths:\t\t_GetTotalEntryDeaths,\n };\n})();\n\n                                                                                                    \n                                           \n                                                                                                    \n(function()\n{\n\n})();\n","scripts/stats/playerstats.js":"'use strict';\n\n\n\n\nvar playerstats = ( function()\n{\n\tconst GRAPH_JOBS = 'graph_jobs';\n\n\tvar _m_visible;\n\tvar _m_timedOutWhileAway;\n\n\tvar _m_elSingleMatch;                           \n\n\tvar _m_LineGraph = $.GetContextPanel().FindChildTraverse( 'id-playerstats__linegraph' );\n\tvar _m_MapGraph = $.GetContextPanel().FindChildTraverse( 'id-playerstats__web-maps' );\n\tvar _m_WeaponGraph = $.GetContextPanel().FindChildTraverse( 'id-playerstats__web-weapons' );\n\tvar _m_Heatmap = $.GetContextPanel().FindChildTraverse( 'id-playerstats__heatmap' );\n\n\tvar _m_elMatchHistory = $.GetContextPanel().FindChildTraverse( 'PlayerStatsMatchHistory' );\n\n\tvar _m_arrLinegraphStats = [\n\t\t\"score\",\n\t\t\"kills\",\n\t\t\"health_removed\",\n\t\t\"kd\",\n\t\t\"hsp\",\n\t\t\"2k\",\n\t\t\"3k\",\n\t\t\"4k\",\n\t\t\"grenade_success\",\n\t\t\"flash_success\",\n\t\t\"1v1\",\n\t\t\"1v2\",\n\t\t\"entrykd\",\n\t\t\"rounds_played\",\n\t\t\"deaths\",\n\t\t\"1v1_attempts\",\n\t\t\"1v2_attempts\",\n\t\t\"entry_attempts\",\n\t\t\"flash_attempts\",\n\t\t\"grenade_attempts\",\n\t];\n\n\tvar oStatAvgSuffix = {\n\t\t\"score\":\t\t\t\t\"\",\n\t\t\"kills\":\t\t\t\t\"\",\n\t\t\"health_removed\":\t\t\"\",\n\t\t\"kd\":\t\t\t\t\t\"\",\n\t\t\"hsp\":\t\t\t\t\t\"#playerstats_suffix_per_cent\",\n\t\t\"2k\":\t\t\t\t\t\"\",\n\t\t\"3k\":\t\t\t\t\t\"\",\n\t\t\"4k\":\t\t\t\t\t\"\",\n\t\t\"grenade_success\":\t\t\"#playerstats_suffix_per_cent\",\n\t\t\"flash_success\":\t\t\"#playerstats_suffix_per_cent\",\n\t\t\"1v1\":\t\t\t\t\t\"#playerstats_suffix_per_cent\",\n\t\t\"1v2\":\t\t\t\t\t\"#playerstats_suffix_per_cent\",\n\t\t\"entrykd\":\t\t\t\t\"\",\n\t\t\"wins\":\t\t\t\t\t\"\",\n\t\t\"losses\":\t\t\t\t\"\",\n\t\t\"ties\":\t\t\t\t\t\"\",\n\t\t\"rounds_played\":\t\t\"\",\n\t\t\"deaths\":\t\t\t\t\"\",\n\t\t\"1v1_attempts\":\t\t\t\"\",\n\t\t\"1v2_attempts\":\t\t\t\"\",\n\t\t\"entry_attempts\":\t\t\"\",\n\t\t\"flash_attempts\":\t\t\"\",\n\t\t\"grenade_attempts\":\t\t\"\",\n\t}\n\n\tvar strStatTotalPrefix = \"stat_total_\";\n\tvar strStatAveragePrefix = \"stat_average_\";\n\tvar _m_InventoryUpdatedHandler = null;\n\tvar _m_SubscriptionStatusChangeUpdatedHandler = null;\n\t\n\tvar _m_mode = _InitializeModeFilterFromSettings();                                                        \n\tvar _m_days = _InitializeTimeRangeFilter();                                                \n\n\t                                        \n\t    \n\t   \t                                                                                               \n\t   \t                                                                                                   \n\t       \n\n\tfunction _InitializeTimeRangeFilter()\n\t{\n\t\tvar ival = parseInt( $.GetContextPanel().FindChildTraverse( 'id-playerstats__range' ).GetSelected().GetAttributeString( \"value\", \"\" ));\n\t\t                                                    \n\n\t\tvar nDays = parseInt( ival );\n\t\t_m_MapGraph.timerangeindays = nDays;\n\t\t_m_LineGraph.timerangeindays = nDays;\n\t\t_m_WeaponGraph.timerangeindays = nDays;\n\t\t_m_Heatmap.timerangeindays = nDays;\n\n\t\treturn ival;\n\t}\n\n\tfunction _InitializeModeFilterFromSettings()\n\t{\n\t\tvar elDropdown = $.GetContextPanel().FindChildTraverse('id-playerstats__mode');\n\t\tvar val = GameInterfaceAPI.GetSettingString( 'ui_deepstats_toplevel_mode' );\n\t\tvar valID = null;\n\n\t\t                                                       \n\t\tvar lastMatch = DeepStatsAPI.GetLastCachedMatchJS();\n\t\tif ( lastMatch && lastMatch.matches.length > 0 )\n\t\t{\n\t\t\tvar oMatch = lastMatch.matches[ 0 ].player;\n\t\t\tvar mode = DeepStatsAPI.GetMatchTypeString( oMatch.mm_game_mode );\n\t\t\tswitch ( mode )\n\t\t\t{\n\t\t\t\tdefault:\n\t\t\t\t\t                                                                        \n\n\t\t\t\tcase \"Competitive\":\n\t\t\t\tcase \"CompetitiveCaptains\":\n\t\t\t\tcase \"CompetitiveScrimmage\":\n\t\t\t\t\t                                                                         \n\t\t\t\t\tval = 240;\n\t\t\t\t\tvalID = \"mode_id_11\";\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase \"Wingman\":\n\t\t\t\t\t                                                                     \n\t\t\t\t\tval = 12288;\n\t\t\t\t\tvalID = \"mode_id_16\";\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t                                                                     \n\t\t\tvar timestamp = DeepStatsAPI.MatchIDToLocalTime( oMatch.match_id );\n\t\t\t                                                                                \n\t\t\t                                                                          \n\t\t\ttimestamp += 1606723200 - DeepStatsAPI.MatchIDToLocalTime( \"3450411799665595200\" );\n\t\t\t                               \n\t\t\tvar ndaysago = NewsAPI.GetNumSecondsTillGcTimestamp( timestamp );\n\t\t\tif ( ndaysago && ( ndaysago < 0 ) )\n\t\t\t{\n\t\t\t\tndaysago = Math.floor( ( -ndaysago ) / ( 24*3600 ) );\n\t\t\t\tvar nSelectID;\n\t\t\t\tif ( ndaysago < 14 ) {}\n\t\t\t\telse if ( ndaysago < 30 ) { nSelectID = \"30d\"; }\n\t\t\t\telse if ( ndaysago < 90 ) { nSelectID = \"90d\"; }\n\t\t\t\telse { nSelectID = \"alltime\"; }\n\t\t\t\tif ( nSelectID )\n\t\t\t\t{\n\t\t\t\t\t                                                                                          \n\t\t\t\t\t$.GetContextPanel().FindChildTraverse( 'id-playerstats__range' ).SetSelected( nSelectID );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\telDropdown.AccessDropDownMenu().Children().forEach( function( ch )\n\t\t{\n\t\t\tif ( val === ch.GetAttributeString( \"value\", \"\" ) )\n\t\t\t{\n\t\t\t\tvalID = ch.id;\n\t\t\t}\n\t\t} );\n\t\tif ( valID )\n\t\t{\n\t\t\t                                                                                                   \n\t\t\telDropdown.SetSelected( valID );\n\t\t}\n\t\telse\n\t\t{\n\t\t\telDropdown.SetSelectedIndex( 0 );\n\t\t\tval = elDropdown.GetSelected().GetAttributeString( \"value\", \"\" );\n\t\t\t                                                                                             \n\t\t\tGameInterfaceAPI.SetSettingString( 'ui_deepstats_toplevel_mode', val );\n\t\t}\n\t\t\n\t\t_m_mode = val;\n\t\t$.GetContextPanel().AddClass( 'mode' + _m_mode );\n\t\t_SetModeToEmbeddedControls();\n\t\telDropdown.SetPanelEvent( 'oninputsubmit', _OnModeChanged.bind( undefined ) );\n\t\treturn val;\n\t}\n\n\tfunction _SetModeToEmbeddedControls()\n\t{\n\t\tvar nMode = parseInt( _m_mode );\n\t\t_m_LineGraph.gamemode = nMode;\n\t\t_m_MapGraph.gamemode = nMode;\n\t\t_m_WeaponGraph.gamemode = nMode;\n\t\t_m_Heatmap.gamemode = nMode;\n\t}\n\n\tfunction _GetModeFilter ()\n\t{\n\t\treturn $.GetContextPanel().FindChildTraverse('id-playerstats__mode').GetSelected().GetAttributeString( \"value\", \"\" );\n\t}\n\n\tfunction _GetDataForRange ( nDays, nMode )\n\t{\n\t\treturn DeepStatsAPI.GetDataForRangeJS( nDays, nMode );\n\t}\n\n\tfunction _OnStatsReceived () \n\t{\n\t\t                            \n\t\t  \n\t\t\t                        \n\t\t\t                                 \n\t\t\t                                 \n\t\t\t                                                    \n\t\t\t               \n\t\t\t                                              \n\t\t\t                             \n\t\t\t                                                                                               \n\n\t\t\t                      \n\t\t\t                                               \n\t\t\t                                               \n\n\t\t\t                            \n\t\t\t                    \n\t\t\t                       \n\t\t\t                                                                                                                     \n\t\t\t\t\t\t\t                                             \t\t\t    \n\t\t\t\t\t\t\t                                               \t\t\t    \n\t\t\t\t\t\t\t                                               \t\t\t    \n\t\t\t\t\t\t\t                                                  \t\t    \n\t\t\t\t\t\t\t                                                       \t                               \n\t\t\t\t\t\t\t                                                \t\t    \n\t\t\t\t\t\t\t                                                 \t\t                              \n\t\t\t\t\t\t\t                                                 \t\t                              \n\t\t\t\t\t\t\t                                             \t\t\t                              \n\t\t\t\t\t\t\t                                             \t\t\t                            \n\t\t\t                             \n\t\t\t                                                     \n\t\t\t               \n\t\t\t\t\t                                                                                 \n\t\t\t\t\t                                                                    \n\t\t\t                                \n\t\t\t                                   \n\t\t\t                                     \n\t\t\t                   \t                                                        \n\t\t\t               \t\t                                                  \n\t\t\t                       \n\t\t\t                                                                                                                                \n\t\t\t                   \n\t\t\t                   \n\t\t\t                   \n\t\t\t                          \n\t\t\t                                                          \n\t\t\t                                                       \n\t\t\t                                                \n\t\t\t                                             \n\t\t\t                                                \n\t\t\t                                             \n\t\t\t                                             \n\t\t\t                                                                  \n\t\t\t                                                                \n\t\t\t                                     \n\t\t\t                                                                     \n\t\t\t                                                            \n\t\t\t                              \n\n\t\t\t                            \n\t\t\t                                                                          \n\t\t  \n\t}\n\n\tfunction _InitMatchDetailsPanel ()\n\t{\n\t\t                                                \n\t\tif ( !_m_elSingleMatch )\n\t\t{\n\t\t\t_m_elSingleMatch = $.GetContextPanel().FindChildTraverse( 'PlayerStats_SingleMatch' );\n\t\t\tif ( _m_elSingleMatch )\n\t\t\t{\n\t\t\t\t                                                                    \n\t\t\t\tvar elMainMenuInput = $.GetContextPanel();\n\t\t\t\twhile ( elMainMenuInput ) \n\t\t\t\t{\n\t\t\t\t\telMainMenuInput = elMainMenuInput.GetParent();\n\t\t\t\t\tif ( elMainMenuInput.id === 'MainMenuInput' )\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif ( elMainMenuInput )\n\t\t\t\t{\n\t\t\t\t\t                                                                                                 \n\t\t\t\t\t   \t                                                                            \n\n\t\t\t\t\t_m_elSingleMatch.SetParent( elMainMenuInput );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction _InitMatchLister ( panel )\n\t{\n\t\t                            \n\t\tMatchLister.Init( panel );\n\t}\n\n\tfunction _InitAnims()\n\t{\n\t\t                                       \n\t\tvar arrPanelsToAnimateIn = $.GetContextPanel().FindChildrenWithClassTraverse('rotatein');\n\t\tarrPanelsToAnimateIn.sort(function (a, b) {\n\n\t\t\tvar score_a = parseInt(a.GetAttributeString('introorder', 0));\n\t\t\tvar score_b = parseInt(b.GetAttributeString('introorder', 0));\n\n\t\t\treturn score_a - score_b;\n\t\t})\n\n\t\tconst delay = 0.1;\n\t\tconst init = 0.2;\n\n\t\tarrPanelsToAnimateIn.forEach(function (panel, idx) {\n\t\t\tScheduler.Schedule(init + (delay * idx), () =>\n\t\t\t{\n\t\t\t\tif ( panel && panel.IsValid() )\n\t\t\t\t\tpanel.RemoveClass('rotatein');\n\t\t\t});\n\t\t});\n    }\n\n\tfunction _Init ()\n\t{\n\t\t_InitMatchDetailsPanel();\n\n\t\t                        \n\t\t                         \n\n\t\t_ResetYourRecord();\n\t\t  \t\t                    \n\n\t\t_ResetLinegraph();\n\t\t  \t\t                          \n\n\t\t_InitMatchLister( _m_elMatchHistory );\n\t\tMatchLister.Populate( _m_elMatchHistory, _m_days, _m_mode, '' );\n\n\t\tif ( !_m_InventoryUpdatedHandler )\n\t\t{\n\t\t\t_m_InventoryUpdatedHandler = $.RegisterForUnhandledEvent( 'PanoramaComponent_MyPersona_InventoryUpdated', _UpdateSubscriptionStatus );\n\t\t}\n\t\tif ( !_m_SubscriptionStatusChangeUpdatedHandler )\n\t\t{\n\t\t\t_m_SubscriptionStatusChangeUpdatedHandler = $.RegisterForUnhandledEvent( 'PanoramaComponent_MyPersona_RecurringSubscriptionStatusChange', _UpdateSubscriptionStatus );\n\t\t}\n\n\t\t$.RegisterForUnhandledEvent( 'DeepStatsReceived', _OnStatsReceived );\n\t\t$.RegisterForUnhandledEvent( 'StatsProgressGraph_OnGraphUpdated', _UpdateLineGraph );\n\t\t$.RegisterEventHandler( 'ReadyForDisplay', $.GetContextPanel(), _OnReadyForDisplay );\n\t\t$.RegisterEventHandler( 'UnreadyForDisplay', $.GetContextPanel(), _OnUnreadyForDisplay );\n\t\t$.RegisterForUnhandledEvent( 'DeepStatsTimeoutGiveUp', _OnDeepStatsTimeOut );\n\n\t\t                                                                                                              \n\t\t$.RegisterEventHandler( 'DeepStatsPanel_OnStatDownloadProgress', _m_LineGraph, function() {$.Schedule( 0.01, _OnStatDownloadProgress_LineGraph )} );\n\t\t$.RegisterEventHandler( 'DeepStatsPanel_OnStatDownloadProgress', _m_MapGraph, function() {$.Schedule( 0.01, _OnStatDownloadProgress_MapGraph )} );\n\t\t$.RegisterEventHandler( 'DeepStatsPanel_OnStatDownloadProgress', _m_WeaponGraph, function() {$.Schedule( 0.01, _OnStatDownloadProgress_WeaponGraph )} );\n\n\t\t$.GetContextPanel().RegisterForReadyEvents( true );\n\t\t$.GetContextPanel().SetReadyForDisplay( false );\n\t\t$.GetContextPanel().SetReadyForDisplay( true );\n\n\t\tvar elRoot = $.GetContextPanel().FindChildTraverse( 'id-playerstats__record' );\n\t\telRoot.RemoveClass( 'prereveal' );\n\n\t\t_UpdateSubscriptionStatus();\n\t\t_InitAnims();\n\t}\n\n\tfunction _OnReadyForDisplay()\n\t{\n\t\t_m_visible = true;\n\n\t\tif ( _m_timedOutWhileAway )\n\t\t{\n\t\t\tDeepStatsAPI.ForceRefresh();\n\t\t\t_m_timedOutWhileAway = false;\n\t\t}\n\n\t\tif ( !_m_InventoryUpdatedHandler )\n\t\t{\n\t\t\t_m_InventoryUpdatedHandler = $.RegisterForUnhandledEvent( 'PanoramaComponent_MyPersona_InventoryUpdated', _UpdateSubscriptionStatus );\n\t\t}\n\t\tif ( !_m_SubscriptionStatusChangeUpdatedHandler )\n\t\t{\n\t\t\t_m_SubscriptionStatusChangeUpdatedHandler = $.RegisterForUnhandledEvent( 'PanoramaComponent_MyPersona_RecurringSubscriptionStatusChange', _UpdateSubscriptionStatus );\n\t\t}\n\n\t\t_OnModeChanged();\n\t\t_UpdateSubscriptionStatus();\n\t\t_InitAnims();\n\t}\n\n\tfunction _OnUnreadyForDisplay()\n\t{\n\t\t_m_visible = false;\n\t\tScheduler.Cancel( 'RECORD' );\n\t\tScheduler.Cancel( 'MATCHES' );\n\t\tScheduler.Cancel();\n\n\t\tif ( _m_InventoryUpdatedHandler )\n\t\t{\n\t\t\t$.UnregisterForUnhandledEvent( 'PanoramaComponent_MyPersona_InventoryUpdated', _m_InventoryUpdatedHandler );\n\t\t\t_m_InventoryUpdatedHandler = null;\n\t\t}\n\t\tif ( _m_SubscriptionStatusChangeUpdatedHandler )\n\t\t{\n\t\t\t$.UnregisterForUnhandledEvent( 'PanoramaComponent_MyPersona_RecurringSubscriptionStatusChange', _m_SubscriptionStatusChangeUpdatedHandler );\n\t\t\t_m_SubscriptionStatusChangeUpdatedHandler= null;\n\t\t}\n\t}\n\n\tfunction _OnDeepStatsTimeOut ()\n\t{\n\t\tif ( _m_visible )\n\t\t{\n\t\t\tUiToolkitAPI.ShowGenericPopupOk(\n\t\t\t\t$.Localize( '#SFUI_SteamConnectionErrorTitle' ),\n\t\t\t\t$.Localize( '#playerstats_forceretry' ),\n\t\t\t\t'',\n\t\t\t\tfunction() { DeepStatsAPI.ForceRefresh(); _OnModeChanged(); },\n\t\t\t\tfunction() {}\n\t\t\t);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t_m_timedOutWhileAway = true;\n\t\t}\n\t}\n\n\tfunction _GetBestMateForPeriod ( arrMatches )\n\t{\n\t\tvar oMatesData = {};\n\t\tvar oMates = {\n\t\t\tw3: [],                  \n\t\t\tw2: [],                  \n\t\t\tw1: [],                  \n\t\t\tall: [],            \n\t\t}\n\n\t\tarrMatches.forEach( function( oMatch, index ) \n\t\t{\n\t\t\toMatch.mates.forEach( function(mate,index)\n\t\t\t{\n\t\t\t\t                                                                      \n\t\t\t\t   \t       \n\n\t\t\t\tif( !oMatesData.hasOwnProperty(mate) )\n\t\t\t\t{\n\t\t\t\t\toMatesData[mate] = { \n\t\t\t\t\t\tsharedWins: 0,\n\t\t\t\t\t\trounds_won: 0,\n\t\t\t\t\t\trounds_lost: 0\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\toMatesData[ mate ].rounds_won += oMatch.rounds_won;\n\t\t\t\toMatesData[ mate ].rounds_lost += oMatch.rounds_lost;\n\n\t\t\t\t                                                                                                                           \n\t\t\t\tif ( ( oMatch.match_outcome & 0x3 ) == 1 )\n\t\t\t\t{\n\t\t\t\t\toMatesData[ mate ].sharedWins++;\n\t\t\t\t}\n\n\t\t\t\tif( oMatesData[mate].sharedWins >= 3 && !oMates.w3.includes( mate ) )\n\t\t\t\t{\n\t\t\t\t\toMates.w3.push(mate);\n\t\t\t\t}\n\t\t\t\telse if ( oMatesData[ mate ].sharedWins == 2 )\n\t\t\t\t{\n\t\t\t\t\toMates.w2.push(mate);\n\t\t\t\t}\n\t\t\t\telse if ( oMatesData[ mate ].sharedWins == 1 )\n\t\t\t\t{\n\t\t\t\t\toMates.w1.push(mate);\n\t\t\t\t}\n\n\t\t\t\t                        \n\t\t\t\toMates.all.push( mate );\n\t\t\t\t\n\t\t\t});\n\n\t\t});\t\t\n\n\t  \t                                                                                   \n\t\tvar arrFilteredMates = Object.values( oMates.w3 ).length > 0 ? oMates.w3 :\n\t\t\tObject.keys( oMates.w2 ).length > 0 ? oMates.w2 :\n\t\t\t\tObject.keys( oMates.w1 ).length > 0 ? oMates.w1 :\n\t\t\t\t\toMates.all;\n\t\t\n\t\tvar bestMate = -1;\n\t\tvar bestRatio = -1;                                                                  \n\n\t\tif ( arrFilteredMates.length == 0 )\n\t\t\treturn [0,0];\n\n\t\tarrFilteredMates.forEach( function( mate, index ) \n\t\t{\n\t\t\tvar ratio = oMatesData[mate].rounds_lost == 0 ? oMatesData[mate].rounds_won : ( oMatesData[mate].rounds_won / oMatesData[mate].rounds_lost );\n\t\t\tif( ratio >= bestRatio )\n\t\t\t{\n\t\t\t\tbestRatio = ratio;\n\t\t\t\tbestMate = parseInt( mate );\n\t\t\t}\n\t\t});\n\n\t\treturn [ DeepStatsAPI.GetXUIDByAccountID(bestMate), bestRatio ] ;\n\t}\n\n\tfunction _UpdateSubscriptionStatus()\n\t{\n\t\tvar strGetSubscriptionGreenButton = '';                                              \n\n\t\tvar labelDesc = $.GetContextPanel().FindChildInLayoutFile( 'id-subscription-status-desc' );\n\t\tvar rtRecurringSubscriptionNextBillingCycle = InventoryAPI.GetCacheTypeElementFieldByIndex( 'RecurringSubscription', 0, 'time_next_cycle' );\n\t\tif ( rtRecurringSubscriptionNextBillingCycle )\n\t\t{\n\t\t\t                                                          \n\t\t\t                                                                                     \n\t\t\tvar numSecondsTillNextBillingCycle = NewsAPI.GetNumSecondsTillGcTimestamp( rtRecurringSubscriptionNextBillingCycle );\n\t\t\tif ( numSecondsTillNextBillingCycle < 60 )\n\t\t\t{\n\t\t\t\t                                                                                                \n\t\t\t\t          \n\t\t\t\tlabelDesc.text = $.Localize( '#playerstats_subscription_expired', labelDesc );\n\t\t\t\tlabelDesc.SetHasClass( 'subscription-status__label--yellow', true );\n\t\t\t\tlabelDesc.SetHasClass( 'subscription-status__label--green', false );\n\t\t\t\tstrGetSubscriptionGreenButton = \"#playerstats_link_reactivate\";\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tvar status = MyPersonaAPI.GetMyRecurringSubscriptionStatus();\n\t\t\t\t                                                  \n\n\t\t\t\t                         \n\t\t\t\tvar decString = status ? '#playerstats_subscription_' + status\n\t\t\t\t\t: '#playerstats_subscription_renew_unknown';\n\t\t\t\t\t\n\t\t\t\tlabelDesc.SetHasClass( 'subscription-status__label--yellow', status === 'renew_manually' );\n\t\t\t\tlabelDesc.SetHasClass( 'subscription-status__label--green', status === 'renew_automatically' );\n\t\t\t\t\n\t\t\t\tif ( numSecondsTillNextBillingCycle <= 24*3600 && status === 'renew_manually' )\n\t\t\t\t{\n\t\t\t\t\t                          \n\t\t\t\t\t                                                                      \n\t\t\t\t\tlabelDesc.text = $.Localize( '#playerstats_subscription_expire_warning' );\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t                                       \n\t\t\t\t\tvar daysLeft = Math.floor( numSecondsTillNextBillingCycle / (( 24*3600 ) + 1 ));\n\t\n\t\t\t\t\t                                                                                                                                   \n\t\t\t\t\tlabelDesc.SetDialogVariableInt( \"days\", daysLeft );\n\t\t\t\t\tvar daysString = $.ConstructString( '#SFUI_Store_Timer_Day:f', { value: daysLeft } );\n\t\t\t\t\tlabelDesc.SetDialogVariable( \"daystext\", daysString );\n\t\t\t\t\tlabelDesc.text = $.Localize( decString, labelDesc );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t                                                                               \n\t\t\t                                                                   \n\t\t\tlabelDesc.text = $.Localize( '#playerstats_subscription_not_enrolled', labelDesc );\n\t\t\tlabelDesc.SetHasClass( 'subscription-status__label--yellow', false );\n\t\t\tlabelDesc.SetHasClass( 'subscription-status__label--green', false );\n\t\t\tstrGetSubscriptionGreenButton = \"#playerstats_link_get\";\n\t\t}\n\n\t\t                                                                                                        \n\t\tvar btnGetSubscription = $.GetContextPanel().FindChildInLayoutFile( 'id-get-subscription' );\n\t\tvar btnManageSubscription = $.GetContextPanel().FindChildInLayoutFile( 'id-manage-subscription' );\n\t\tif ( strGetSubscriptionGreenButton )\n\t\t{\n\t\t\tbtnGetSubscription.text = $.Localize( \"#playerstats_link_get\" );\n\t\t\tbtnGetSubscription.SetHasClass( 'hide', false );\n\t\t\tbtnManageSubscription.SetHasClass( 'hide', true );\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbtnGetSubscription.SetHasClass( 'hide', true );\n\t\t\tbtnManageSubscription.SetHasClass( 'hide', false );\n\t\t}\n\t}\n\n\tfunction _CreateTooltip ( elPanel, text, title = '', additionalClass = null,fnon = null, fnoff = null )\n\t{\n\t\tvar xmlsrc = 'file://{resources}/layout/tooltips/stats/tooltip_playerstats_generic.xml';\n\t\tvar ttid = 'tt_' + elPanel.id;\n\t\tvar parms = \"title=\" + title + \"&text=\" + text + '&class=' + additionalClass;\n\t\tvar onStatHoverOn_f = _OnMouseOverCustomLayoutTooltip.bind( undefined, elPanel.id, ttid, xmlsrc, parms );\n\t\tvar onStatHoverOff_f = _OnMouseOutCustomLayoutTooltip.bind( undefined, ttid );\n\n\t\telPanel.SetPanelEvent( 'onmouseover', function() {onStatHoverOn_f(); if (typeof fnon === 'function') fnon() } );\n\t\telPanel.SetPanelEvent( 'onmouseout', function() {onStatHoverOff_f(); if (typeof fnoff === 'function') fnoff()} );\n\t}\n\n\tfunction _ResetYourRecord ()\n\t{\n\t\t                            \n\n\t\tvar elRecordFrame = $.GetContextPanel().FindChildTraverse( 'PlayerStatsRecordFrame' );\n\n\t\telRecordFrame.AddClass( 'no-data' );\n\t\telRecordFrame.enabled = false;\n\t}\n\n\n\n\tfunction _UpdateYourRecordAsycDeepstats ()\n\t{\n\t\t                                          \n\t\tScheduler.Cancel( 'RECORD' );\t\t\t\n\n\t\tvar elRecordFrame = $.GetContextPanel().FindChildTraverse( 'PlayerStatsRecordFrame' );\n\n\t\tvar oDeepStats = _GetDataForRange( _m_days, _m_mode );\n\t\tvar arrMatches = oDeepStats.matches;\n\n\t\tvar elPageSpinner = $.GetContextPanel().FindChildTraverse( 'PageSpinner' );\n\t\telPageSpinner.SetHasClass( 'stats-loading', oDeepStats.status != 'complete' );\n\t\telRecordFrame.SetHasClass( 'stats-loading', oDeepStats.status != 'complete' );\n\n\t\telRecordFrame.SetHasClass( 'no-data',  arrMatches.length == 0 );\n\t\telRecordFrame.enabled = arrMatches.length != 0;\n\n\t\tvar elBlocker = $.GetContextPanel().FindChildTraverse( 'NoDataBlocker' );\n\t\tif ( elBlocker )\n\t\t\telBlocker.visible = arrMatches.length == 0;\n\t\t\n\t\tvar elNoDataNotice = $.GetContextPanel().FindChildTraverse( 'NoDataNotice' );\n\t\tif ( elNoDataNotice )\n\t\t\telNoDataNotice.style.opacity = ( arrMatches.length == 0 && oDeepStats.status == 'complete') ? 1 : 0;\n\n\t\tif ( ( !arrMatches || arrMatches.length == 0 ) && oDeepStats.status != 'complete' )\n\t\t{\n\t\t\tScheduler.Schedule( 1.0, _UpdateYourRecordAsycDeepstats, 'RECORD' );\n\t\t\treturn;\n\t\t}\n\n\t\t                    \n\n\t\tvar bValid = false;\n\n\t\tvar elBestMate = elRecordFrame.FindChildTraverse( 'BestMate' );\n\t\tif ( elBestMate )\n\t\t{\n\t\t\tvar xuid = _GetBestMateForPeriod( arrMatches )[0];\n\n\t\t\tbValid = xuid != '';\n\t\t  \t                       \n\n\t\t\telBestMate.SetHasClass( 'no-data', !bValid );\n\n\t\t\tif ( bValid )\n\t\t\t{\n\t\t\t\telBestMate.SetDialogVariable( 'value', FriendsListAPI.GetFriendName( xuid ));\n\n\t\t\t\tvar elAvatar = elBestMate.FindChildTraverse( 'JsAvatarImage' );\n\t\t\t\telAvatar.PopulateFromSteamID(xuid);\n\n\t\t\t\telBestMate.SetPanelEvent( 'onactivate', function( xuid )\n\t\t\t\t{\n\t\t\t\t\tvar playerCard = UiToolkitAPI.ShowCustomLayoutContextMenuParametersDismissEvent(\n\t\t\t\t\t\t'',\n\t\t\t\t\t\t'',\n\t\t\t\t\t\t'file://{resources}/layout/context_menus/context_menu_playercard.xml',\n\t\t\t\t\t\t'xuid=' + xuid,\n\t\t\t\t\t\tfunction() {}\n\t\t\t\t\t)\n\n\t\t\t\t\tplayerCard.AddClass( \"ContextMenu_NoArrow\" );\n\n\t\t\t\t}.bind( this, xuid ) );\n\t\t\t}\n\t\t}\n\n\t\tif ( oDeepStats.status != 'complete' )\n\t\t{\n\t\t\tScheduler.Schedule( 2.0, _UpdateYourRecordAsycDeepstats, 'RECORD' );\n\t\t\treturn;\n\t\t}\n\t}\n\n\n\tfunction _OnStatDownloadProgress_LineGraph()\n\t{\n\t\t                                             \n\n\t\tvar elRecordFrame = $.GetContextPanel().FindChildTraverse( 'PlayerStatsRecordFrame' );\n\n\t\t_m_arrLinegraphStats.forEach( function( stat, idx )\n\t\t{\n\t\t\tvar total = _m_LineGraph.GetAttributeInt( strStatTotalPrefix + stat, 0 );\n\t\t\tvar avg = _m_LineGraph.GetAttributeInt( strStatAveragePrefix + stat, 0 );\n\n\t\t\t                                                                                    \n\t\t\tvar prettyTotal = total < 100000 ? total.toString().replace( /\\B(?=(\\d{3})+(?!\\d))/g, ',' ) :\n\t\t\t\tFormatText.AbbreviateNumber( total );\n\n\t\t\t$.GetContextPanel().SetDialogVariable( strStatTotalPrefix + stat, prettyTotal );\n\n\t\t\tvar denom = oStatAvgSuffix[ stat ] == \"#playerstats_suffix_per_cent\" ? 10 : 1000;\n\t\t\t$.GetContextPanel().SetDialogVariable( strStatAveragePrefix + stat, ( avg / denom ).toPrecision( 3 ) + $.Localize( oStatAvgSuffix[ stat ] ) );\n\t\t} )\n\n\t\t$.GetContextPanel().SetDialogVariable( 'stat_total_wins', _m_LineGraph.GetAttributeInt( 'wins', 0 ) );\n\t\t$.GetContextPanel().SetDialogVariable( 'stat_total_losses', _m_LineGraph.GetAttributeInt( 'losses', 0 ) );\n\t\t$.GetContextPanel().SetDialogVariable( 'stat_total_ties', _m_LineGraph.GetAttributeInt( 'ties', 0 ) );\n\n\t\t                \n\t\tvar elMatches = elRecordFrame.FindChildTraverse( 'matches' );\n\t\tif ( elMatches )\n\t\t{\n\t\t\tvar value = _m_LineGraph.GetAttributeInt( 'matches', 0 );\n\t\t\tvar arrValue = FormatText.SplitAbbreviateNumber( value );\n\t\t\tif ( elMatches && !elMatches.FindChildTraverse( 'DigitPanel' ) )\n\t\t\t\tDigitPanelFactory.MakeDigitPanel( elMatches, 5 );\n\t\t\t\n\t\t\tDigitPanelFactory.SetDigitPanelString( elMatches, arrValue[ 0 ], arrValue[ 1 ] );\n\t\t}\t\n\n\t\tvar elADR = elRecordFrame.FindChildTraverse( 'stat_average_health_removed' );\n\t\tif ( elADR )\n\t\t{\n\t\t\tvar value = _m_LineGraph.GetAttributeInt( 'stat_average_health_removed', 0 );\n\t\t\tvalue = ( value / 1000 ).toPrecision( 3 );\n\t\t\tif ( elADR && !elADR.FindChildTraverse( 'DigitPanel' ) )\n\t\t\t\tDigitPanelFactory.MakeDigitPanel( elADR, 5 );\n\t\t\t\n\t\t\tDigitPanelFactory.SetDigitPanelString( elADR, value );\n\t\t}\n\n\t\tvar elKDR = elRecordFrame.FindChildTraverse( 'stat_average_kd' );\n\t\tif ( elKDR )\n\t\t{\n\t\t\tvar value = _m_LineGraph.GetAttributeInt( 'stat_average_kd', 0 );\n\t\t\tvalue = ( value / 1000 ).toPrecision( 3 );\n\t\t\tif ( elKDR && !elKDR.FindChildTraverse( 'DigitPanel' ) )\n\t\t\t\tDigitPanelFactory.MakeDigitPanel( elKDR, 5 );\n\t\t\t\n\t\t\tDigitPanelFactory.SetDigitPanelString( elKDR, value );\n\t\t}\n\n\t\tvar elKills = elRecordFrame.FindChildTraverse( 'stat_total_kills' );\n\t\tif ( elKills )\n\t\t{\n\t\t\tvar value = _m_LineGraph.GetAttributeInt( 'stat_total_kills', 0 );\n\n\t\t\tvar abbr = FormatText.SplitAbbreviateNumber( value, 1 );\n\t\t\tvar string = abbr[ 0 ];\n\t\t\tvar suffix = abbr[ 1 ];\n\t\t\t\n\t\t\tvar bAbbreviate = value >= 10000;\n\t\t\tvar string = bAbbreviate ? abbr[ 0 ] : value.toString().replace( /\\B(?=(\\d{3})+(?!\\d))/g, ',' ) ;\n\t\t\t\n\t\t\tif ( elKills && !elKills.FindChildTraverse( 'DigitPanel' ) )\n\t\t\t\tDigitPanelFactory.MakeDigitPanel( elKills, 5 );\n\t\t\t\n\t\t\tDigitPanelFactory.SetDigitPanelString( elKills, string, bAbbreviate ? suffix : '' );\n\t\t}\n\t}\n\n\tfunction _OnStatDownloadProgress_MapGraph()\n\t{\n\t\t                                            \n\n\t\tvar elRecordFrame = $.GetContextPanel().FindChildTraverse( 'PlayerStatsRecordFrame' );\n\n\t\tvar elBestMap = elRecordFrame.FindChildTraverse( 'BestMap' );\n\t\tif ( elBestMap )\n\t\t{\n\t\t\tvar mapString = DeepStatsAPI.MapIDToString( _m_MapGraph.best_map );\n\t\t\t                                                                                                  \n\n\t\t\tvar bValid = mapString != '';\n\t\t\t                        \n\n\t\t\tif ( bValid )\n\t\t\t{\n\t\t\t\telBestMap.SetDialogVariable( 'value', $.Localize( '#SFUI_Map_' + mapString ));\n\t\t\t\t\t\t\t\n\t\t\t\tvar elMapIcon = elBestMap.FindChildTraverse( 'MapIcon' );\n\t\t\t\tvar strMap = DeepStatsAPI.MapIDToString( _m_MapGraph.best_map );\n\t\t\t\telMapIcon.SetImage( \"file://{images}/map_icons/map_icon_\" + strMap + \".svg\" );\n\t\t\t\tIconUtil.SetupFallbackMapIcon( elMapIcon, 'file://{images}/map_icons/map_icon_NONE.png' );\n\t\t\t}\n\t\t}\n\t\t\n\t\t_UpdateYourRecordAsycDeepstats();\n\t}\n\n\tfunction _OnStatDownloadProgress_WeaponGraph()\n\t{\n\t\t                                               \n\n\t\tvar elRecordFrame = $.GetContextPanel().FindChildTraverse( 'PlayerStatsRecordFrame' );\n\n\t\tvar arrWeapons = _m_WeaponGraph.GetWeaponScores();\t\n\t\tvar elBestWeaponContainer = elRecordFrame.FindChildTraverse( \"BestWeapons\" );\n\t\tif ( elBestWeaponContainer )\n\t\t{\n\t\t\tarrWeapons.sort( (a,b) => b.score - a.score );\n\t\t\tvar weaponIdx = 0;\n\t\t\telBestWeaponContainer.FindChildrenWithClassTraverse( \"weapons__row\" ).forEach( function( elWeaponPanel ) {\n\t\t\t\tvar elImage = elWeaponPanel.FindChild( \"WeaponImage\" );\n\t\t\t\tvar weaponScore = arrWeapons[weaponIdx++];\n\t\t\t\tif ( elImage ) \n\t\t\t\t{\n\t\t\t\t\telImage.SetImage( \"file://{images}/icons/equipment/\"+ InventoryAPI.GetHudIconFileName( weaponScore.weapon_id ) +\".svg\" );\n\t\t\t\t}\n\t\t\t\telWeaponPanel.SetDialogVariable( \"score\", weaponScore.score.toPrecision(3) );\n\t\t\t\telWeaponPanel.SetDialogVariable( \"total\", weaponScore.total );\n\t\t\t\tvar itemid = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex( weaponScore.weapon_id, 0 )\n\t\t\t\t_CreateTooltip( elWeaponPanel, InventoryAPI.GetItemName( itemid ));\n\t\t\t});\n      \t}\n\t}\n\n\n                                         \n              \n                                        \n\t\n\n\tfunction _ResetLinegraph ()\n\t{\n\t\t\n\t\t                                          \n\t\tvar elToday = $.GetContextPanel().FindChildTraverse( 'LinegraphTodayLabel' );\n\t\tif ( elToday )\n\t\t{\n\t\t\t\t  \n\t\t}\n\t\t\n\t\tvar elStart = $.GetContextPanel().FindChildTraverse( 'LinegraphStartLabel' );\n\t\tif ( elStart )\n\t\t{\n\t\t\tvar startDate = new Date();\n\n\t\t\tif ( _m_days == -1 )\n\t\t\t{\n\t\t\t\tstartDate.setTime( DeepStatsAPI.GetDeepStatsStartTime() * 1000 );\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tstartDate.setDate( startDate.getDate() - _m_days + 1 );\n\t\t\t}\n\n\t\t\tDateUtil.PopulateDateFormatStrings( elStart, startDate );\n\t\t}\n\t}\n\n\n\tfunction _UpdateLineGraph ()\n\t{\n\n\t\t                            \n\n\t\t_UpdateGraphStatButtons();\n\n\t\tvar arrGraphPoints = $.GetContextPanel().FindChildrenWithClassTraverse( 'graph-point-avg' );\n\n\t\tarrGraphPoints.forEach( function( elPoint, index )\n\t\t{\n\t\t\tvar timeslice = 0.02;\n\n\t\t\tvar timestamp = elPoint.GetAttributeInt( 'timestamp', 0 );\n\n\t\t\t                                                   \n\t\t\tvar onActivate_f = function( strDateKey )\n\t\t\t{\n\t\t\t\tMatchLister.Highlight( _m_elMatchHistory, strDateKey );\n\t\t\t}\n\n\t\t\telPoint.SetPanelEvent( 'onactivate', onActivate_f.bind( this, _GetDateKeyFromTimestamp( timestamp ) ) );\n\t\t\t\n\n\t\t\tScheduler.Schedule( index * timeslice, function( elPoint )\n\t\t\t{\n\t\t\t\tif ( elPoint && elPoint.IsValid() )\n\t\t\t\t\telPoint.TriggerClass( 'graph-point--reveal' );\n\t\t\n\t\t\t}.bind( this, elPoint), GRAPH_JOBS );\n\t\t} );\n\n\t\t                  \n\t\t                                                                                                               \n\t\t                                                                                                          \n\t\t                                                                                             \n\n\t\t\n\t\t                                          \n\t      \t                                                               \n    \t  \t                                     \n     \t\t                                   \n      \t\t                                                 \n    \t \n\t\t\n\t\t                                                                                  \n\t\t                                                                                                  \n\t\t                                         \n\t\t\t                                                              \n\t\t\t                                  \n\t\t   \n\t\t\n\t\t                                                                  \n\t\t                                                                      \n\t\t                                                                  \n\t\t                                                                      \n\t\t                                                                    \n\t\t                                                                        \n\t\t                                                                          \n\t\t                                                                              \n\t\t  \n\n\t}\n\t\n\tfunction _IsPerRound ( index )\n\t{\n\t\treturn index == 0 ||\n\t\t\tindex == 1 ||\n\t\t\tindex == 2;\n\t}\n\n\tfunction _isPercentage ( index )\n\t{\n\t\treturn index == 4 ||\n\t\t\tindex == 8 ||\n\t\t\tindex == 9 ||\n\t\t\tindex == 10 ||\n\t\t\tindex == 11;\n\t}\n\n\tfunction _HasHistogram ( index )\n\t{\n\t\treturn index == 0 ||\n\t\t\tindex == 1 ||\n\t\t\tindex == 2 ||\n\t\t\tindex == 3 ||\n\t\t\tindex == 4;\n\t\t\n\t}\n\n\tfunction _AddAUniqueTooltipTarget ( elPanel, id, classname )\n\t{\n\t\t                        \n\t\tvar strTooltipTargetId = 'JSTTTarget-' + id;\n\t\tvar elTooltipTarget = elPanel.FindChildTraverse( strTooltipTargetId );\n\t\tif ( !elTooltipTarget )\n\t\t{\n\t\t\telTooltipTarget = $.CreatePanel( 'Panel', elPanel, strTooltipTargetId );\n\t\t\telTooltipTarget.AddClass( classname );\n\t\t}\n\t\t\n\t\treturn elTooltipTarget;\n\t}\n\n\tfunction _GetUnitSuffix ( index )\n\t{\n\t\t                              \n\t\t   \t                                                    \n\t\t                                      \n\t\t   \t                                                  \n\t\tif ( _isPercentage( index ) )\n\t\t\treturn $.Localize( '#playerstats_suffix_per_cent' );\n\t\telse\n\t\t\treturn '';\n\t}\n\n\t                  \n\tfunction _UpdateGraphStatButtons ()\n\t{\n\n\t\t                                     \n\t\t                                          \n\t\t_m_LineGraph.FindChildrenWithClassTraverse( 'stats-panel--graphbtn' ).forEach( function( elBtn, index )\n\t\t{\n\n\t\t\t                \n\t\t\t                                                                                \n\t\t\tvar valueNormal = parseInt( elBtn.GetAttributeInt( \"stat_average\", 0 ) );\n\t\t\tvar valueNormal = valueNormal == 0 ? 0 : ( valueNormal / ( _isPercentage( index ) ? 10.0 : 1000.0 )).toPrecision( 3 );\n\n\t\t\tvar elStatStatNormalLabel = elBtn.FindChildTraverse( 'StatNormalValue' );\n\t\t\tif ( elStatStatNormalLabel )\n\t\t\t{\n\t\t\t\telStatStatNormalLabel.SetDialogVariable( 'value', valueNormal );\n\t\t\t\tif ( _isPercentage( index ) )\n\t\t\t\t{\n\t\t\t\t\telStatStatNormalLabel.text = $.Localize( '#playerstats_per_cent', elStatStatNormalLabel );\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\telStatStatNormalLabel.text = $.Localize( '#playerstats_no_units', elStatStatNormalLabel );\n\t\t\t\t}\n\t\t\t}\n\t\t\t             \n\t\t\t                                                                                \n\t\t\tvar rank = elBtn.GetAttributeInt( \"stat_ranking\", 0 );\n\t\t\trank = _HasHistogram( index ) ? rank : -1;\n\n\t\t\tvar elStatRankLabel = elBtn.FindChildTraverse( 'StatRankLabel' );\n\t\t\tif ( elStatRankLabel )\n\t\t\t{\n\t\t\t\tvar title = $.Localize( \"#playerstat_name_\" + index + '_long' );\n\t\t\t\tvar tt_text;\n\t\t\t\tif ( _HasHistogram( index ) )\n\t\t\t\t{\n\t\t\t\t\telStatRankLabel.SetDialogVariable( 'tt_value', valueNormal + _GetUnitSuffix( index ) );\n\t\t\t\t\telStatRankLabel.SetDialogVariable( 'tt_rank', rank );\n\n\t\t\t\t\ttt_text = $.Localize( '#playerstats_percentile_subscribers', elStatRankLabel );\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\ttt_text = $.Localize( '#playerstats_no_percentile', elStatRankLabel );\n\t\t\t\t}\n\t\t\t\t_CreateTooltip( elBtn, tt_text, title, 'limit-width' );\n\n\t\t\t\telStatRankLabel.SetDialogVariable( 'value', rank != -1 ? rank.toPrecision( 2 ) : '' );\n\n\t\t\t\tif ( _HasHistogram( index ))\n\t\t\t\t\telStatRankLabel.text = $.Localize( '#playerstats_per_cent', elStatRankLabel );\n\t\t\t}\n\t\t})\n\t}\n\n\tfunction _OnModeChanged ()\n\t{\n\t\t$.GetContextPanel().RemoveClass( 'mode' + _m_mode );\n\t\t_m_mode = _GetModeFilter();\n\t\t$.GetContextPanel().AddClass( 'mode' + _m_mode );\n\n\t\tif ( GameInterfaceAPI.GetSettingString( 'ui_deepstats_toplevel_mode' ) !== _m_mode )\n\t\t{\n\t\t\t                                                                \n\t\t\tGameInterfaceAPI.SetSettingString( 'ui_deepstats_toplevel_mode', _m_mode );\n\t\t}\n\n\t\t_SetModeToEmbeddedControls();\n\n\t\tScheduler.Cancel();\n\n\t  \t                   \n\n\t\t_ResetLinegraph();\n\n\t\tMatchLister.Populate( _m_elMatchHistory, _m_days, _m_mode, '' );\n\t}\n\n\n\tfunction _OnTimeRangeChanged ()\n\t{\n\n\t\t                     \n\t\t_m_days = _InitializeTimeRangeFilter();\n\n\t\tScheduler.Cancel();`\t`\n  \t\t                               \n\n  \t\t                   \n\t\t_ResetLinegraph();\n\n\t\tMatchLister.Populate( _m_elMatchHistory, _m_days, _m_mode, '' );\n\n\t  \t             \t\n\t}\n\n\n\tfunction _OnMouseOverCustomLayoutTooltip ( _panel, _tooltipId, _xmlsrc, _parms )\n\t{\n\t\tUiToolkitAPI.ShowCustomLayoutParametersTooltip(\n\t\t\t_panel,\n\t\t\t_tooltipId,\n\t\t\t_xmlsrc,\n\t\t\t_parms );\n\t}\n\n\tfunction _OnMouseOutCustomLayoutTooltip ( _tooltipId )\n\t{\n\t\tUiToolkitAPI.HideCustomLayoutTooltip( _tooltipId );\n\t}\n\n\tfunction _GetDateKeyFromTimestamp ( timestamp )\n\t{\n\t\tvar time = new Date(timestamp*1000 );\n\n\t\tvar d = FormatText.PadNumber( time.getDate(), 2 );\n\t\tvar m = FormatText.PadNumber( time.getMonth(), 2 );\n\t\tvar y = FormatText.PadNumber( time.getFullYear(), 4 );\n\n\t\treturn ( String(y) +String(m) + String(d) );\n\t}\n\t\n\t                      \n\treturn {\n\t\tInit:\t\t\t\t\t\t\t_Init,\n\t\tOnModeChanged: \t\t\t\t\t_OnModeChanged,\n\t\tOnTimeRangeChanged:\t\t\t\t_OnTimeRangeChanged\n\t};\n\n} )();\n\n                                                                                                    \n                                           \n                                                                                                    \n( function()\n{\n\tplayerstats.Init();\n} )();\n","scripts/stats/playerstats_mapsgraph.js":"                           \n   \n   \n\n\"use strict\"; \n\nvar MapSpiderGraph = ( function ()\n{\n\tfunction _Init() \n\t{\n\t}\n\n\treturn {\n\t\tInit \t\t\t\t\t: _Init\n\t };\n})();\n\n                                                                                                    \n                                           \n                                                                                                    \n(function()\n{\n\tMapSpiderGraph.Init();\n\t                                                                   \n\t                                                                         \n\n})();\n","scripts/stats/playerstats_matchlister.js":"\n\"use strict\"; \n\nvar MatchLister = ( function ()\n{\n\tfunction _Init( elPanel ) \n\t{\n\t\t$.RegisterEventHandler( 'ScrolledIntoView', elPanel.FindChildTraverse( 'MatchContainer' ), _OnScrollIntoView );\n\t\t$.RegisterEventHandler( 'ScrolledOutOfView', elPanel.FindChildTraverse( 'MatchContainer' ), _OnScrollOutOfView );\n\n\t\t                                         \n\n\t\telPanel.AddClass( 'no-data' );\n\t\telPanel.AddClass( 'stats-loading' );\n\t\t_PopulateDummy( elPanel );\n\t}\n\n\tfunction _GetDateKeyFromTimestamp ( timestamp )\n\t{\n\t\tvar time = new Date(timestamp*1000 );\n\n\t\tvar d = FormatText.PadNumber( time.getDate(), 2 );\n\t\tvar m = FormatText.PadNumber( time.getMonth(), 2 );\n\t\tvar y = FormatText.PadNumber( time.getFullYear(), 4 );\n\n\t\treturn ( String(y) +String(m) + String(d) );\n\t}\n\n\tfunction _OnMouseOverCustomLayoutTooltip ( _panel, _tooltipId, _xmlsrc, _parms )\n\t{\n\t\tUiToolkitAPI.ShowCustomLayoutParametersTooltip(\n\t\t\t_panel,\n\t\t\t_tooltipId,\n\t\t\t_xmlsrc,\n\t\t\t_parms );\n\t}\n\n\tfunction _OnMouseOutCustomLayoutTooltip ( _tooltipId )\n\t{\n\t\tUiToolkitAPI.HideCustomLayoutTooltip( _tooltipId );\n\t}\n\n\tfunction _OnScrollIntoView ( elPanelId )\n\t{\n\t\t                                            \n\t\t   \t                                     \n\t}\n\n\tfunction _OnScrollOutOfView ( elPanelId )\n\t{\n\t\t                                            \n\t\t   \t                                    \n\t}\n\n\tfunction _SortTimeDescending_f ( a, b )\n\t{\n\t\treturn ( a.match_id - b.match_id );\n\t}\n\n\t\n\tfunction _Highlight ( elPanel, strDateKey )\n\t{\n\t\tif ( !elPanel )\n\t\treturn;\n\t\n\t\tvar elLister = elPanel.FindChildTraverse( 'MatchContainer' );\n\n\t\t\t\t                             \n\t\tvar elDay = elLister.FindChildTraverse( strDateKey );\n\t\tif ( elDay )\n\t\t{\n\t\t\telDay.ScrollParentToMakePanelFit( 1, false );\n\t\t\telDay.TriggerClass( 'highlight' );\n\t\t}\n\t}\n\n\tfunction _PopulateDummy ( elPanel )\n\t{\n\t\tif ( !elPanel )\n\t\t\treturn;\n\t\t\n\t\tvar elLister = elPanel.FindChildTraverse( 'MatchContainer' );\n\t\t\n\t\tconst NUM_DUMMY = 12;\n\n\t\tfor ( var i = 0; i < NUM_DUMMY; i++ )\n\t\t{\n\t\t\t_CreateDummyMatchPanel( elLister );\n\t\t}\n\n\t\telPanel.m_hasDummyMatches = true;\n\n\t}\n\n\n\tfunction _CreateDummyMatchPanel ( elParent )\n\t{\n\t\tvar elMatch = $.CreatePanel( \"Button\", elParent, '' );\n\t\telMatch.BLoadLayoutSnippet( 'snippet-match' );\n\n\t\telMatch.SetDialogVariable( 'map', '' );\n\t\telMatch.SetDialogVariable( 'myscore', '' );\n\t\telMatch.SetDialogVariable( 'enemyscore', '' );\n\n\t\tvar elMapLogo = elMatch.FindChildTraverse( 'MapLogo' );\n\t\tif ( elMapLogo )\n\t\t\telMapLogo.SetImage( \"file://{images}/map_icons/map_icon_NONE.png\" );\n\t\t\n\t\telMatch.enabled = false;\n\t}\n\n\n\tfunction _Populate ( elPanel, nDays, nMode, sortStat )\n\t{\n\t\tif ( !elPanel || !elPanel.IsValid() )\n\t\t\treturn;\n\t\t\n\t\t                                                           \n\n\t\tScheduler.Cancel( 'MATCHES' );\t\n\n\t\tvar elLister = elPanel.FindChildTraverse( 'MatchContainer' );\n\n\t\t                                           \n\t\tif ( !elPanel.m_nDays || ( nDays < elPanel.m_nDays && nDays != -1 ) || elPanel.m_nDays == -1 || ( nMode != elPanel.m_nMode ))\n\t\t{\n\t\t\t                                                                                  \n\t\t\tif ( !elPanel.m_hasDummyMatches )\n\t\t\t\telLister.RemoveAndDeleteChildren();\n\t\t\t\n\t\t\telPanel.SetHasClass( 'no-data', true );\n\n\t\t}\n\n\t\telPanel.m_nMode = nMode;\n\t\telPanel.m_nDays = nDays;\n\n\t\tvar oDeepStats = DeepStatsAPI.GetDataForRangeJS( nDays , nMode);\n\t\tvar arrMatches = oDeepStats.matches;\n\n\t\telPanel.SetHasClass( 'stats-loading', oDeepStats.status != 'complete' );\n\n\t\t                                                               \n\t\tif ( ( !arrMatches || arrMatches.length == 0 ) && oDeepStats.status != 'complete' )\n\t\t{\n\t\t\tScheduler.Schedule( 1.0, _Populate.bind( this, elPanel, nDays, nMode, sortStat ), 'MATCHES' );\n\t\t\treturn;\n\t\t}\n\n\t\t                                                                   \n\t\tif ( !arrMatches || arrMatches.length == 0 && oDeepStats.status == 'complete' )\n\t\t{\n\t\t\tif ( !elPanel.m_hasDummyMatches )\n\t\t\t{\n\t\t\t\t_PopulateDummy( elPanel );\n\t\t\t}\n\t\t\t\n\t\t\treturn;\n\t\t}\n\n\t\t                                                 \n\t\tif ( elPanel.m_hasDummyMatches )\n\t\t{\n\t\t\telLister.RemoveAndDeleteChildren();\n\t\t\telPanel.m_hasDummyMatches = false;\n\t\t}\n\n\t\tarrMatches = arrMatches.sort( _SortTimeDescending_f );\n\n\t\telPanel.SetHasClass( 'no-data', false );\n\n\t\t                          \n\n\t\t                                                                                       \n\n\t\tarrMatches.forEach( function( oMatch, index )\n\t\t{\n\t\t\tvar timestamp = DeepStatsAPI.MatchIDToLocalTime( oMatch.match_id );\n\n\t\t\t                               \n\t\t\tif ( elLister.FindChildTraverse( oMatch.match_id ))\n\t\t\t\treturn;\n\n\t\t\tvar matchDate = new Date( timestamp * 1000 );\n\n\t\t\tvar dateKey = _GetDateKeyFromTimestamp( timestamp );\n\n\t\t\t                                                      \n\t\t\t                                                                        \n\t\t\tvar elDayContainer = elLister.FindChildTraverse( dateKey );\n\t\t\tif ( !elDayContainer )\n\t\t\t{\n\t\t\t\telDayContainer = $.CreatePanel( \"Panel\", elLister, dateKey );\n\t\t\t\telDayContainer.AddClass( 'matchlister__day-container' );\n\n\t\t\t\tvar elDayTitle = $.CreatePanel( \"Panel\", elDayContainer, 'title-' + dateKey );\n\t\t\t\telDayTitle.BLoadLayoutSnippet( 'snippet-separator' );\n\n\t\t\t\tDateUtil.PopulateDateFormatStrings( elDayTitle, matchDate );\n\n\t\t\t\t                          \n\t\t\t\tvar arrChildren = elLister.Children();\n\t\t\t\tvar numChildren = arrChildren.length;\n\t\t\t\tvar idx = 0;\n\n\t\t\t\tif ( elDayContainer.id > arrChildren[ numChildren - 1 ].id)\n\t\t\t\t{\n\t\t\t\t\telLister.MoveChildAfter( elDayContainer, arrChildren[ numChildren - 1 ] );\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\twhile ( idx < numChildren && arrChildren[ idx ] && elDayContainer.id < arrChildren[ idx ].id )\n\t\t\t\t\t\tidx++;\n\n\t\t\t\t\telLister.MoveChildBefore( elDayContainer, arrChildren[ idx ] );\n\t\t\t\t}\n\t\t\t}\n\n\t  \t\t                                                                \n\n\t\t\t                         \n\t\t\tvar elMatch = $.CreatePanel( \"Button\", elDayContainer, oMatch.match_id );\n\t\t\telMatch.BLoadLayoutSnippet( 'snippet-match' );\n\n\t\t\t                                                \n\t\t\t{\n\t\t\t\tvar arrChildren = elDayContainer.Children();\n\t\t\t\tvar numChildren = arrChildren.length;\n\n\t\t\t\t                      \n\t\t\t\t                                    \n\t\t\t\t                \n\t\t\t\t               \n\t\t\t\t                   \n\t\t\t\t           \n\t\t\t\t               \n\n\t\t\t\tvar idx = 1;                      \n\t\t\t\twhile ( idx < numChildren && arrChildren[ idx ] && elMatch.id < arrChildren[ idx ].id )\n\t\t\t\t\tidx++;\n\n\t\t\t\telDayContainer.MoveChildBefore( elMatch, arrChildren[ idx ] );\n\t\t\t}\n\n\t\t\tvar mapid = oMatch[ 'mapid' ];\n\n\t\t\tvar myScore = Number( oMatch[ 'rounds_won' ] ? oMatch[ 'rounds_won' ] : 0 );\n\t\t\tvar enemyScore = Number( oMatch[ 'rounds_lost' ] ? oMatch[ 'rounds_lost' ] : 0 );\n\n\t\t\tvar mapName = $.Localize( '#SFUI_Map_' + DeepStatsAPI.MapIDToString( mapid ) );\n\t\t\telMatch.SetDialogVariable( 'map', mapName );\n\t\t\telMatch.SetDialogVariable( 'myscore', myScore );\n\t\t\telMatch.SetDialogVariable( 'enemyscore', enemyScore );\n\n\t\t\tvar elMapLogo = elMatch.FindChildTraverse( 'MapLogo' );\n\t\t\tif ( elMapLogo )\n\t\t\t{\n\t\t\t\tvar strMap = DeepStatsAPI.MapIDToString( mapid );\n\t\t\t\telMapLogo.SetImage( \"file://{images}/map_icons/map_icon_\" + strMap + \".svg\" );\n\t\t\t\tIconUtil.SetupFallbackMapIcon( elMapLogo, 'file://{images}/map_icons/map_icon_NONE.png' );\n\t\t\t}\n\n\t\t\tvar elMatchDot = elMatch.FindChildTraverse( 'MatchDot' );\n\n\t\t\telMatchDot.SetHasClass( 'match--win', ( oMatch.match_outcome & 0x3 ) == 1 );\n\t\t\telMatchDot.SetHasClass( 'match--loss', ( oMatch.match_outcome & 0x3 ) == 2 );\n\t\t\telMatchDot.SetHasClass( 'match--tie', ( oMatch.match_outcome & 0x3 ) == 0 );\n\n\t\t\telMatch.SetHasClass( 'match--dnf', ( oMatch.match_outcome & 0x4 ) );\n\n\t\t\t_AddTeammates( elMatch, oMatch );\n\n\t\t\tvar onActivate_f = function( matchid )\n\t\t\t{\n\t\t\t\tUiToolkitAPI.ShowCustomLayoutPopupParametersWithStyle(\n\t\t\t\t\t'PlayerStats_SingleMatch',\n\t\t\t\t\t'file://{resources}/layout/popups/stats/popup_playerstats_singlematch.xml',\n\t\t\t\t\t'matchid=' + matchid,\n\t\t\t\t\t'blur_dismiss' );\n\t\t\t}\n\n\t\t\t                     \n\t\t\tvar elMatchDetails = elMatch.FindChildTraverse( 'Details' );\n\t\t\telMatchDetails.SetPanelEvent( 'onactivate', onActivate_f.bind( this, oMatch.match_id ) );\n\n\t\t\t                                    \n\t\t\t                                      \n\t\t\tvar parms = \"class=\" + 'mode' + nMode + \"&matchdata=\" + JSON.stringify( oMatch );\n\t\t\tvar xmlsrc = 'file://{resources}/layout/tooltips/stats/tooltip_playerstats_matchlister_matchstats.xml';\n\n\t\t\t                     \n\t\t\t                                                                                           \n\t\t\t                         \n\t\t\t                                                                             \n\t\t\t                               \n\n\t\t\t\n\t\t\tvar ttid = 'tt_' + elMatch.id;\n\t\t\tvar onDayHoverOn_f = _OnMouseOverCustomLayoutTooltip.bind( undefined, elMatch.id, ttid, xmlsrc, parms );\n\t\t\tvar onDayHoverOff_f = _OnMouseOutCustomLayoutTooltip.bind( undefined, ttid );\n\n\t\t\telMatch.SetPanelEvent( 'onmouseover', onDayHoverOn_f );\n\t\t\telMatch.SetPanelEvent( 'onmouseout', onDayHoverOff_f );\n\t\t\t                                            \n\n\t\t} );\n\n\t\t                                \n\t\t                                             \n\t\t               \n\t\t    \n\t\t   \t                                             \n\t\t   \t                 \n\t\t   \t\t                                  \n\t\t    \n\n\t\tif ( oDeepStats.status != 'complete' )\n\t\t{\n\t\t\tScheduler.Schedule( 1.0, _Populate.bind( this, elPanel, nDays, nMode, sortStat ), 'MATCHES' );\n\t\t\treturn;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t                                                                                                 \n\n\t\t\t}\n\t}\n\n\tfunction _AddTeammates ( elMatch, oMatch )\n\t{\n\t\tvar elMates = elMatch.FindChildTraverse( 'Mates' );\n\n\t\tObject.values( oMatch.mates ).forEach( function( accountId, index )\n\t\t{\n\t\t\tvar xuid = DeepStatsAPI.GetXUIDByAccountID( accountId );\n\n\t\t\tvar elAvatar = $.CreatePanel( 'CSGOAvatarImage', elMates, index );\n\t\t\telAvatar.PopulateFromSteamID(xuid);\n\t\t\telAvatar.AddClass( 'avatar-image__icon' );\n\t\t\t\n\t\t\telAvatar.SetPanelEvent( 'onactivate', function( xuid )\n\t\t\t{\n\n\t\t\t\tUiToolkitAPI.ShowCustomLayoutContextMenuParametersDismissEvent(\n\t\t\t\t\t'',\n\t\t\t\t\t'',\n\t\t\t\t\t'file://{resources}/layout/context_menus/context_menu_playercard.xml',\n\t\t\t\t\t'xuid=' + xuid,\n\t\t\t\t\tfunction() {}\n\t\t\t\t)\n\n\t\t\t}.bind( this, xuid ) );\n\t\t} );\n\n\t}\n\n\n\tfunction _OnDismissSingleMatch ()\n\t{\n\t}\n\n\treturn {\n\t\tInit: \t\t\t\t\t_Init,\n\t\tPopulate: \t\t\t\t_Populate,\n\t\tHighlight:\t\t\t\t_Highlight\n\t };\n})();\n\n                                                                                                    \n                                           \n                                                                                                    \n(function()\n{\n})();\n","scripts/teamintromenu.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"common/async.ts\" />\n/// <reference path=\"mock_adapter.ts\" />\n/// <reference path=\"match_stakes.ts\" />\n$.LogChannel('p.teamintro', \"LV_OFF\");\nvar TeamIntroMenu;\n(function (TeamIntroMenu) {\n    async function _StartTeamIntro() {\n        const type = MockAdapter.GetPlayerCompetitiveRankType(GameStateAPI.GetLocalPlayerXuid());\n        const elMenu = $.GetContextPanel();\n        elMenu.SetHasClass('premier', type === 'Premier');\n        const sLocalXuid = GameStateAPI.GetLocalPlayerXuid();\n        const nLocalTeam = GameStateAPI.GetPlayerTeamNumber(sLocalXuid);\n        const endPromise = Async.UnhandledEvent(\"EndTeamIntro\");\n        elMenu.SetHasClass(\"active\", true);\n        _SetFaded(true, 0);\n        elMenu.StartCamera();\n        const modelRefs = _SetupModels(nLocalTeam);\n        _SetTeam(nLocalTeam);\n        _SetupHeader(nLocalTeam);\n        const teamInfoAbort = new Async.AbortController();\n        _SetupTeamInfos(nLocalTeam, modelRefs, teamInfoAbort.signal);\n        await Async.Delay(0.5);\n        _SetFaded(false, 0.5);\n        MatchStakes.StartTeamIntro();\n        $.DispatchEvent('CSGOPlaySoundEffect', 'TeamIntro', 'MOUSE');\n        if (nLocalTeam == 2) {\n            $.DispatchEvent('CSGOPlaySoundEffect', 'TeamIntro_TSuits', 'MOUSE');\n        }\n        else {\n            $.DispatchEvent('CSGOPlaySoundEffect', 'TeamIntro_CTSuits', 'MOUSE');\n        }\n        await endPromise;\n        _SetFaded(true, 0.5);\n        await Async.Delay(0.5);\n        teamInfoAbort.abort();\n        $(\"#TeamIntroHeader\").AddClass(\"hidden\");\n        $(\"#TeamIntroTeammateInfos\").RemoveAndDeleteChildren();\n        MatchStakes.EndTeamIntro();\n        _ClearBackground();\n        elMenu.StopCamera();\n        elMenu.ClearModels();\n        _SetFaded(false, 0.5);\n        await Async.Delay(0.5);\n        elMenu.SetHasClass(\"active\", false);\n    }\n    function _SetTeam(nTeamNumber) {\n        switch (nTeamNumber) {\n            case 2:\n                $.GetContextPanel().SwitchClass('team', \"TERRORIST\");\n                break;\n            case 3:\n                $.GetContextPanel().SwitchClass('team', \"CT\");\n                break;\n        }\n    }\n    function _ClearBackground() {\n        $.GetContextPanel().SwitchClass('team', \"no-background\");\n    }\n    function _SetupTeamInfos(nTeamNumber, modelRefs, abortSignal) {\n        const elMenu = $.GetContextPanel();\n        $(\"#TeamIntroTeammateInfos\").RemoveAndDeleteChildren();\n        const teammateInfos = new Map();\n        Async.RunSequence(function* () {\n            for (const ref of modelRefs.values()) {\n                yield Async.Delay(1.0);\n                const elInfo = _CreateTeammateInfo(ref);\n                teammateInfos.set(ref.nOrdinal, elInfo);\n                elInfo.RemoveClass(\"hidden\");\n            }\n        }, abortSignal);\n        Async.RunSequence(function* () {\n            while (true) {\n                for (const [nOrdinal, elInfo] of teammateInfos) {\n                    let { x, y } = elMenu.GetModelBonePosition(nTeamNumber, nOrdinal, \"neck_0\");\n                    if (isFinite(x) && isFinite(y) && elInfo) {\n                        y -= 10.0;\n                        x -= elInfo.actuallayoutwidth / elInfo.actualuiscale_x * 0.5;\n                        y -= elInfo.actuallayoutheight / elInfo.actualuiscale_y;\n                        elInfo.style.transform = \"translate3d( \" + x + \"px, \" + y + \"px, 0px )\";\n                    }\n                }\n                yield Async.NextFrame();\n            }\n        }, abortSignal);\n    }\n    function _SetHonorIcon(elPanel, xuid, teamColor) {\n        const elHonorIconFrame = elPanel.FindChildTraverse('jsHonorIcon');\n        if (elHonorIconFrame) {\n            elHonorIconFrame.Set(GameStateAPI.GetPlayerXpTrailLevel(xuid), false);\n            if (teamColor) {\n                const elImage = elHonorIconFrame.FindChildTraverse('JsHonorIconImage');\n                if (elImage) {\n                    elImage.style.washColor = teamColor;\n                }\n            }\n        }\n    }\n    function _CreateTeammateInfo(ref) {\n        const sXuid = ref.sXuid;\n        const nOrdinal = ref.nOrdinal;\n        const elInfos = $(\"#TeamIntroTeammateInfos\");\n        const elInfo = $.CreatePanel(\"Panel\", elInfos, nOrdinal.toString());\n        elInfo.BLoadLayoutSnippet(\"TeamIntroTeammateInfo\");\n        const elAvatarImage = elInfo.FindChildInLayoutFile(\"AvatarImage\");\n        elAvatarImage.PopulateFromPlayerSlot(GameStateAPI.GetPlayerSlot(sXuid));\n        const elName = elInfo.FindChildInLayoutFile(\"Name\");\n        elName.SetDialogVariableInt(\"intro_player_slot\", GameStateAPI.GetPlayerSlot(sXuid));\n        const teamColor = GameStateAPI.GetPlayerColor(sXuid);\n        if (teamColor)\n            elName.style.washColor = teamColor;\n        _SetHonorIcon(elInfo, sXuid, teamColor);\n        return elInfo;\n    }\n    function _SetupModels(nLocalTeam) {\n        const elMenu = $.GetContextPanel();\n        elMenu.ClearModels();\n        const modelRefs = [];\n        for (let nOrdinal = 1;; ++nOrdinal) {\n            const jso = elMenu.AddModel(nLocalTeam, nOrdinal);\n            const sXuid = jso.sXuid;\n            if (!sXuid)\n                break;\n            const ref = { sXuid, nOrdinal };\n            modelRefs.push(ref);\n        }\n        return modelRefs;\n    }\n    function _SetFaded(bVisible, transitionDuration) {\n        const elFade = $(\"#TeamIntroFade\");\n        elFade.style.transitionDuration = `${transitionDuration}s`;\n        elFade.SetHasClass(\"hidden\", !bVisible);\n    }\n    function _SetupHeader(nTeamNumber) {\n        const timeData = GameStateAPI.GetTimeDataJSO();\n        const nOvertime = timeData.overtime;\n        const bFirstHalf = timeData.gamephase === 2;\n        $(\"#TeamIntroHeader\").RemoveClass(\"hidden\");\n        const elIcon = $(\"#TeamIntroIcon\");\n        const elHalfLabel = $(\"#TeamIntroHalfLabel\");\n        const elTeamLabel = $(\"#TeamIntroTeamLabel\");\n        if (timeData.has_halftime) {\n            elHalfLabel.RemoveClass('collapse');\n            if (nOvertime > 0) {\n                elHalfLabel.SetDialogVariableInt(\"overtime_num\", nOvertime);\n                elHalfLabel.SetLocString(bFirstHalf ? \"#team-intro-overtime-1st-half:f\" : \"#team-intro-overtime-2nd-half:f\");\n            }\n            else {\n                elHalfLabel.SetLocString(bFirstHalf ? \"#team-intro-1st-half\" : \"#team-intro-2nd-half\");\n            }\n        }\n        else {\n            elHalfLabel.AddClass('collapse');\n        }\n        switch (nTeamNumber) {\n            case 2:\n                if (elIcon) {\n                    elIcon.SetImage(\"file://{images}/icons/t_logo.svg\");\n                }\n                elTeamLabel.SetLocString(nOvertime == 0 && bFirstHalf ? \"#team-intro-starting-as-t\" : \"#team-intro-playing-as-t\");\n                break;\n            case 3:\n                if (elIcon) {\n                    elIcon.SetImage(\"file://{images}/icons/ct_logo.svg\");\n                }\n                elTeamLabel.SetLocString(nOvertime == 0 && bFirstHalf ? \"#team-intro-starting-as-ct\" : \"#team-intro-playing-as-ct\");\n                break;\n        }\n    }\n    {\n        $.RegisterForUnhandledEvent(\"StartTeamIntro\", _StartTeamIntro);\n    }\n})(TeamIntroMenu || (TeamIntroMenu = {}));\n","scripts/teamselectmenu.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"avatar.ts\" />\n/// <reference path=\"mock_adapter.ts\" />\nvar TeamSelectMenu;\n(function (TeamSelectMenu) {\n    let m_nHighlightedTeamNum = 0;\n    let m_errorTimerHandle = false;\n    let m_playerCounts = [0, 0];\n    let m_botCounts = [0, 0];\n    let _m_UiSceneFrameBoundaryEventHandler = null;\n    let m_scheduledHideWash = null;\n    function _Init() {\n        let elBtnTeamT = $(\"#BtnSelectTeam-TERRORIST\");\n        elBtnTeamT.SetPanelEvent(\"onmouseover\", _HighlightTTeam);\n        elBtnTeamT.SetPanelEvent(\"onmouseout\", _UnhighlightTTeam);\n        elBtnTeamT.SetPanelEvent(\"onactivate\", () => _SelectTeam(2));\n        let elBtnTeamCT = $(\"#BtnSelectTeam-CT\");\n        elBtnTeamCT.SetPanelEvent(\"onmouseover\", _HighlightCTTeam);\n        elBtnTeamCT.SetPanelEvent(\"onmouseout\", _UnhighlightCTTeam);\n        elBtnTeamCT.SetPanelEvent(\"onactivate\", () => _SelectTeam(3));\n        let elBtnSpectate = $(\"#TeamSelectSpectate\");\n        elBtnSpectate.SetPanelEvent(\"onactivate\", () => _SelectTeam(1));\n        let elBtnAuto = $(\"#TeamSelectAuto\");\n        elBtnAuto.SetPanelEvent(\"onactivate\", () => _SelectTeam(0));\n        _UnhighlightTTeam();\n        _UnhighlightCTTeam();\n    }\n    function _ShowPanelTest(mockdata) {\n        MockAdapter.SetMockData(mockdata);\n        _ShowPanel();\n    }\n    function _ShowPanel() {\n        if (GameStateAPI.IsDemoOrHltv())\n            return;\n        if (m_scheduledHideWash != null) {\n            $.CancelScheduled(m_scheduledHideWash);\n            m_scheduledHideWash = null;\n        }\n        const elFade = $(\"#TeamSelectFade\");\n        elFade.style.transitionDuration = \"0.0s\";\n        elFade.RemoveClass(\"hidden\");\n        m_scheduledHideWash = $.Schedule(0.5, () => {\n            if (elFade.IsValid()) {\n                elFade.style.transitionDuration = \"0.5s\";\n                elFade.AddClass(\"hidden\");\n            }\n            m_scheduledHideWash = null;\n        });\n        let elBackgroundImage = $.GetContextPanel().FindChildInLayoutFile('BackgroundMapImage');\n        let mapName = MockAdapter.GetMapBSPName();\n        elBackgroundImage.SetImage('file://{images}/map_icons/screenshots/1080p/' + mapName + '.png');\n        _OnServerForcingTeamJoin(0);\n        m_nHighlightedTeamNum = 0;\n        $(\"#TeamJoinError\").AddClass(\"hidden\");\n        if (m_errorTimerHandle !== false) {\n            $.CancelScheduled(m_errorTimerHandle);\n            m_errorTimerHandle = false;\n        }\n    }\n    function _OnReadyForDisplay() {\n        if (!_m_UiSceneFrameBoundaryEventHandler) {\n            _m_UiSceneFrameBoundaryEventHandler = $.RegisterForUnhandledEvent(\"UISceneFrameBoundary\", _OnUISceneFrameBoundary);\n        }\n    }\n    function _OnUnreadyForDisplay() {\n        if (_m_UiSceneFrameBoundaryEventHandler) {\n            $.UnregisterForUnhandledEvent(\"UISceneFrameBoundary\", _m_UiSceneFrameBoundaryEventHandler);\n            _m_UiSceneFrameBoundaryEventHandler = null;\n        }\n    }\n    function _OnUISceneFrameBoundary() {\n        let bInFallbackMode = $.GetContextPanel().IsInFallbackMode();\n        for (let el of $(\"#TeamSelectMenu\").FindChildrenWithClassTraverse(\"team-select-fallback\")) {\n            if (bInFallbackMode)\n                el.RemoveClass(\"team-select-fallback-hidden\");\n            else\n                el.AddClass(\"team-select-fallback-hidden\");\n        }\n    }\n    function _UpdateBotPlayerCount(countBots, countPlayers, team) {\n        let elLabel = $(\"#BtnSelectTeam-\" + team).FindChildInLayoutFile(\"PlayerBotCount\");\n        if (countBots === 1)\n            elLabel.SetDialogVariable(\"botlabel\", $.Localize(\"#team_select_bot\"));\n        else\n            elLabel.SetDialogVariable(\"botlabel\", $.Localize(\"#team_select_bots\"));\n        if (countPlayers === 1)\n            elLabel.SetDialogVariable(\"playerlabel\", $.Localize(\"#team_select_player\"));\n        else\n            elLabel.SetDialogVariable(\"playerlabel\", $.Localize(\"#team_select_players\"));\n        elLabel.SetDialogVariableInt(\"bots\", countBots);\n        elLabel.SetDialogVariableInt(\"players\", countPlayers);\n        elLabel.text = $.Localize(\"#team_select_bot_player_count\", elLabel);\n    }\n    function _OnServerForcingTeamJoin(nTimeout) {\n        let bUnassigned = $.GetContextPanel().GetTeamNumber() == 0;\n        $(\"#TeamSelectCancel\").visible = !bUnassigned;\n        if (bUnassigned && isFinite(nTimeout) && nTimeout > 0) {\n            let elTimer = $(\"#AutojoinTimer\");\n            let elTimerBar = elTimer.FindChildInLayoutFile(\"AutojoinTimerBar\");\n            if (elTimerBar) {\n                elTimerBar.DeleteAsync(0);\n            }\n            elTimerBar = $.CreatePanel(\"Panel\", elTimer, \"AutojoinTimerBar\");\n            elTimerBar.style.animationDuration = nTimeout + \"s\";\n            elTimerBar.AddClass(\"team-select__timer__bar\");\n            elTimer.endTime = Date.now() * 0.001 + nTimeout;\n            elTimer.visible = true;\n        }\n        else {\n            $(\"#AutojoinTimer\").visible = false;\n        }\n    }\n    function _SelectTeam(nTeamNum) {\n        if (nTeamNum != 0 && nTeamNum == MockAdapter.GetPlayerTeamNumber(MyPersonaAPI.GetXuid())) {\n            HidePanel();\n            return;\n        }\n        _SetTeam(nTeamNum);\n    }\n    function _HighlightTTeam() {\n        _UnhighlightTeam(m_nHighlightedTeamNum);\n        m_nHighlightedTeamNum = 2;\n        $.GetContextPanel().HighlightTeam(2, true);\n    }\n    function _HighlightCTTeam() {\n        _UnhighlightTeam(m_nHighlightedTeamNum);\n        m_nHighlightedTeamNum = 3;\n        $.GetContextPanel().HighlightTeam(3, true);\n    }\n    function _UnhighlightTTeam() {\n        _UnhighlightTeam(2);\n    }\n    function _UnhighlightCTTeam() {\n        _UnhighlightTeam(3);\n    }\n    function _UnhighlightTeam(nTeamNum) {\n        if (m_nHighlightedTeamNum == nTeamNum) {\n            m_nHighlightedTeamNum = 0;\n            $.GetContextPanel().HighlightTeam(nTeamNum, false);\n        }\n    }\n    function _SetTeam(team) {\n        GameInterfaceAPI.ConsoleCommand(\"jointeam \" + team + \" 1\");\n    }\n    function _SetTeamT() {\n        _SetTeam(2);\n    }\n    function _SetTeamCT() {\n        _SetTeam(3);\n    }\n    function _ShowError(locString) {\n        let elLabel = $(\"#TeamJoinErrorLabel\");\n        let elWarningPanel = $(\"#TeamJoinError\");\n        elLabel.text = $.Localize(locString);\n        elWarningPanel.RemoveClass(\"hidden\");\n        m_errorTimerHandle = $.Schedule(5.0, function () {\n            if (elWarningPanel.IsValid())\n                elWarningPanel.AddClass(\"hidden\");\n            m_errorTimerHandle = false;\n        });\n    }\n    function _Escape() {\n        if ($.GetContextPanel().GetTeamNumber() == 0)\n            GameInterfaceAPI.ConsoleCommand(\"gameui_activate\");\n        else\n            HidePanel();\n    }\n    function HidePanel() {\n        $.DispatchEvent(\"CSGOShowTeamSelectMenu\", false, true);\n    }\n    TeamSelectMenu.HidePanel = HidePanel;\n    function _ClearPlayerLists() {\n        $(\"#List-0\").RemoveAndDeleteChildren();\n        $(\"#List-1\").RemoveAndDeleteChildren();\n        m_playerCounts[0] = 0;\n        m_playerCounts[1] = 0;\n        m_botCounts[0] = 0;\n        m_botCounts[1] = 0;\n        _UpdateBotPlayerCount(0, 0, \"TERRORIST\");\n        _UpdateBotPlayerCount(0, 0, \"CT\");\n    }\n    function _AddToPlayerList(nTeamIdx, xuid) {\n        let elList = $(\"#List-\" + nTeamIdx);\n        let elTeammate = $.CreatePanel(\"Panel\", elList, \"Teammate\");\n        elTeammate.BLoadLayoutSnippet(\"Teammate\");\n        let elAvatar = $.CreatePanel(\"Panel\", elTeammate, \"Avatar\");\n        elAvatar.BLoadLayout(\"file://{resources}/layout/avatar.xml\", false, false);\n        elAvatar.BLoadLayoutSnippet(\"AvatarParty\");\n        Avatar.Init(elAvatar, xuid.toString(), \"playercard\");\n        if (MockAdapter.IsFakePlayer(xuid)) {\n            let elAvatarImage = elAvatar.FindChildInLayoutFile(\"JsAvatarImage\");\n            elAvatarImage.PopulateFromPlayerSlot(MockAdapter.GetPlayerSlot(xuid));\n            m_botCounts[nTeamIdx]++;\n        }\n        else {\n            m_playerCounts[nTeamIdx]++;\n        }\n        elTeammate.SetHasClass('bot', MockAdapter.IsFakePlayer(xuid));\n        let elName = elTeammate.FindChildInLayoutFile(\"TeamSelectTeammateName\");\n        elName.SetDialogVariableInt('player_slot', GameStateAPI.GetPlayerSlot(xuid));\n        elTeammate.MoveChildAfter(elName, elAvatar);\n        _UpdateBotPlayerCount(m_botCounts[nTeamIdx], m_playerCounts[nTeamIdx], nTeamIdx == 0 ? \"TERRORIST\" : \"CT\");\n    }\n    {\n        _Init();\n        $.RegisterForUnhandledEvent(\"CSGOShowTeamSelectMenu\", _ShowPanel);\n        $.RegisterForUnhandledEvent(\"CSGOShowTeamSelectMenu_Test\", _ShowPanelTest);\n        $.RegisterForUnhandledEvent(\"ServerForcingTeamJoin\", _OnServerForcingTeamJoin);\n        $.RegisterForUnhandledEvent(\"TeamJoinFailed\", _ShowError);\n        $.RegisterForUnhandledEvent(\"ClearTeamSelectPlayerLists\", _ClearPlayerLists);\n        $.RegisterForUnhandledEvent(\"AddToTeamSelectPlayerList\", _AddToPlayerList);\n        $.GetContextPanel().RegisterForReadyEvents(true);\n        $.RegisterEventHandler(\"ReadyForDisplay\", $.GetContextPanel(), _OnReadyForDisplay);\n        $.RegisterEventHandler(\"UnreadyForDisplay\", $.GetContextPanel(), _OnUnreadyForDisplay);\n        let _m_cP = $(\"#TeamSelectMenu\");\n        if (!_m_cP)\n            _m_cP = $(\"#PanelToTest\");\n        $.RegisterKeyBind(_m_cP, \"key_escape\", _Escape);\n        $.RegisterKeyBind(_m_cP, \"key_1\", _SetTeamT);\n        $.RegisterKeyBind(_m_cP, \"key_2\", _SetTeamCT);\n    }\n})(TeamSelectMenu || (TeamSelectMenu = {}));\n","scripts/tooltips/stats/tooltip_playerstats_generic.js":"'use strict';\n\nvar PlayerStatsGenericTooltip = ( function()\n{\n\n\tfunction _Init ()\n\t{\n\t\tvar title = $.GetContextPanel().GetAttributeString( \"title\", \"\" );\n\t\tvar text = $.GetContextPanel().GetAttributeString( \"text\", \"\" );\n\t\tvar loc = $.GetContextPanel().GetAttributeString( \"loc\", \"\" );\n\t\tvar addClass = $.GetContextPanel().GetAttributeString( \"class\", \"\" );\n\n\t\tvar elTitle = $.GetContextPanel().FindChildTraverse( 'title' );\n\t\t$.GetContextPanel().SetDialogVariable( 'title', title );\n\t\telTitle.visible = title != undefined && title != '';\n\n\t\tvar elText = $.GetContextPanel().FindChildTraverse( 'text' );\n\t\tif ( loc != \"\" )\n\t\t\ttext = $.Localize( '#' + loc );\n\t\t\n\t\t$.GetContextPanel().SetDialogVariable( 'text', text );\n\t\telText.visible = text != undefined && text != '';\n\n\t\tif (addClass != \"\" )\n\t\t\t$.GetContextPanel().AddClass(addClass);\n\t}\n\n\treturn {\n\t\tInit: _Init,\n\t}\n\n\n})();\n\n(function()\n{\n})();","scripts/tooltips/stats/tooltip_playerstats_linegraph_avg.js":"'use strict';\n\n\nvar PlayerStatsLineGraphAvgTooltip = ( function()\n{\n\n\tfunction _IsPerRound ( index )\n\t{\n\t\treturn index == 0 ||\n\t\t\tindex == 1 ||\n\t\t\tindex == 2;\n\t}\n\n\tfunction _isPerDeath ( index )\n\t{\n\t\treturn index == 3; \n\t}\n\n\tfunction _isPercentage ( index )\n\t{\n\t\treturn index == 4;\n\t}\n\t\n\tfunction _GetUnitSuffix ( index )\n\t{\n\t\tif ( _IsPerRound( index ) )\n\t\t\treturn $.Localize('#playerstats_suffix_per_round');\n\t\telse if ( _isPerDeath( index ) )\n\t\t\treturn \"\";                                             \n\t\telse if ( _isPercentage( index ) )\n\t\t\treturn $.Localize('#playerstats_suffix_per_cent');\n\t\t\n\t\treturn '';\n\t}\n\n\tfunction _Init ()\n\t{\n\t\tvar unixtime = Number( $.GetContextPanel().GetAttributeString( \"timestamp\", \"\" ) ) * 1000;\n\t\tvar statvalue = $.GetContextPanel().GetAttributeString( \"stat_value\", \"\" );\n\t\tvar stat_index= $.GetContextPanel().GetAttributeString( \"stat_index\", \"\" );\n\n\t\tvar date = new Date( unixtime );\n\n\t\tDateUtil.PopulateDateFormatStrings( $.GetContextPanel(), date );\n\n\t\tvar statname = $.Localize( \"#playerstat_name_\" + stat_index );\n\t\t$.GetContextPanel().SetDialogVariable( 'statname', statname );\n\t\t$.GetContextPanel().SetDialogVariable( 'statvalue', statvalue + _GetUnitSuffix(stat_index) );\n\n\t}\n\n\n\treturn {\n\t\tInit: _Init,\n\t}\n\n\n})();\n\n(function()\n{\n})();","scripts/tooltips/stats/tooltip_playerstats_mapgraph.js":"function setupTooltip()\n{\n\tvar wins = $.GetContextPanel().GetAttributeString( \"wins\", \"\" );\n\tvar losses = $.GetContextPanel().GetAttributeString( \"losses\", \"\" );\n\tvar ties = $.GetContextPanel().GetAttributeString( \"ties\", \"\" );\n\tvar rndwin = $.GetContextPanel().GetAttributeString( \"rndwin\", \"\" );\n\tvar rndlost = $.GetContextPanel().GetAttributeString( \"rndlost\", \"\" );\n\tvar score = $.GetContextPanel().GetAttributeString( \"score\", \"\" );\n\tvar mapid = parseInt( $.GetContextPanel().GetAttributeString( \"mapid\", \"\" ) );\n\n\t$.GetContextPanel().SetDialogVariableInt( \"wins\", parseInt( wins ) );\n\t$.GetContextPanel().SetDialogVariableInt( \"losses\", parseInt( losses ) );\n\t$.GetContextPanel().SetDialogVariableInt( \"ties\", parseInt( ties ) );\n\t$.GetContextPanel().SetDialogVariableInt( \"rndwin\", parseInt( rndwin ) );\n\t$.GetContextPanel().SetDialogVariableInt( \"rndlost\", parseInt( rndlost ) );\n\t$.GetContextPanel().SetDialogVariable( \"score\", parseInt( score*100 ) );\n\tif ( $.GetContextPanel().GetAttributeString( \"scoretype\", \"rounds\" ) === \"rounds\" )\n\t{\n\t\t$('#ScoreLabel').SetLocString('#playerstats_map_tooltip_round_winrate');\n\t\t$('#RecordLabel').SetLocString('#playerstats_map_tooltip_rndwin_rndloss');\n\t\t$('#RecordResults').SetAlreadyLocalizedText( \"{d:rndwin}:{d:rndlost}\", true );\n\t}\n\telse\n\t{\n\t\t$('#ScoreLabel').SetLocString('#playerstats_map_tooltip_match_winrate');\n\t\t$('#RecordLabel').SetLocString('#playerstats_map_tooltip_win_loss_tie');\n\t\t$('#RecordResults').SetAlreadyLocalizedText( \"{d:wins}/{d:losses}/{d:ties}\", true );\n\t}\n\n\tvar mapNameShort = DeepStatsAPI.MapIDToString( mapid );\n\t                                                                                          \n\t$.GetContextPanel().SetDialogVariable( \"map_name\", $.Localize(\"#SFUI_Map_\" + mapNameShort) );\n}","scripts/tooltips/stats/tooltip_playerstats_matchlister_matchstats.js":"'use strict';\n\nvar PlayerStatsMatchlisterMatchStats = ( function()\n{\n\n\n\tfunction _Init ()\n\t{\n\t\tvar oMatch = JSON.parse( $.GetContextPanel().GetAttributeString( \"matchdata\", \"{}\" ) );\n\t\tvar additionalClass = $.GetContextPanel().GetAttributeString( \"class\", \"\" );\n\t\t$.GetContextPanel().AddClass( additionalClass );\n\n\t\t$.GetContextPanel().SetDialogVariable( 'matchid', MatchStats.GetMatchId( oMatch ) );\n\t\t\n\n\t\t$.GetContextPanel().SetDialogVariable('playerstat_value-a_0' ,MatchStats.GetTotalScore( oMatch));\n\t\t$.GetContextPanel().SetDialogVariable('playerstat_value-a_1' ,MatchStats.GetTotalKills( oMatch));\n\t\t$.GetContextPanel().SetDialogVariable('playerstat_value-a_2' ,MatchStats.GetTotalDamage( oMatch));\n\t\t$.GetContextPanel().SetDialogVariable('playerstat_value-a_3' , MatchStats.GetKillsPerDeath( oMatch));\n\t\t$.GetContextPanel().SetDialogVariable('playerstat_value-a_4' ,MatchStats.GetTotalHeadShotKills( oMatch) == 0 ? '' : MatchStats.GetTotalHeadShotKills( oMatch));\n\t\t$.GetContextPanel().SetDialogVariable('playerstat_value-a_5' ,MatchStats.GetTotal2Ks( oMatch ));\n\t\t$.GetContextPanel().SetDialogVariable('playerstat_value-a_6' ,MatchStats.GetTotal3ks( oMatch));\n\t\t$.GetContextPanel().SetDialogVariable( 'playerstat_value-a_7', MatchStats.GetTotal4Ks( oMatch ) );\n\t\t\n\t\t$.GetContextPanel().SetDialogVariable( 'playerstat_value-a_8', MatchStats.GetTotalHESuccesses( oMatch ) + '/' + MatchStats.GetTotalHEThrown( oMatch ) );\n\t\t$.GetContextPanel().SetDialogVariable( 'playerstat_value-a_9', MatchStats.GetTotalFBSuccesses( oMatch ) + '/' + MatchStats.GetTotalFBThrown( oMatch ) );\n\t\t$.GetContextPanel().SetDialogVariable( 'playerstat_value-a_10', MatchStats.GetTotal1v1Successes( oMatch ) + '/' + MatchStats.GetTotal1v1Engagements( oMatch ) );\n\t\t$.GetContextPanel().SetDialogVariable( 'playerstat_value-a_11', MatchStats.GetTotal1v2Successes( oMatch ) + '/' + MatchStats.GetTotal1v2Engagements( oMatch ) );\n\t\t$.GetContextPanel().SetDialogVariable('playerstat_value-a_12',MatchStats.GetTotalEntryKills( oMatch) + ':' + (MatchStats.GetTotalEntryDeaths( oMatch )));\n\n\t\t$.GetContextPanel().SetDialogVariable('playerstat_value-b_0' ,MatchStats.GetScorePerRound( oMatch) == \"0.00\" ? \"\" : MatchStats.GetScorePerRound( oMatch) + $.Localize( '#playerstats_suffix_per_round'));\n\t\t$.GetContextPanel().SetDialogVariable('playerstat_value-b_1' ,MatchStats.GetKillsPerRound( oMatch) == \"0.00\" ? \"\" : MatchStats.GetKillsPerRound( oMatch) + $.Localize( '#playerstats_suffix_per_round'));\n\t\t$.GetContextPanel().SetDialogVariable('playerstat_value-b_2' ,MatchStats.GetDamagePerRound( oMatch));\n\t\t$.GetContextPanel().SetDialogVariable('playerstat_value-b_3' ,'' );\n\t\t$.GetContextPanel().SetDialogVariable('playerstat_value-b_4' , MatchStats.GetHeadShotKillRate( oMatch) + $.Localize( '#playerstats_suffix_per_cent'));\n\t\t$.GetContextPanel().SetDialogVariable( 'playerstat_value-b_5', '' );\n\t\t$.GetContextPanel().SetDialogVariable( 'playerstat_value-b_6', '' );\n\t\t$.GetContextPanel().SetDialogVariable('playerstat_value-b_7' ,'');\n\t\t$.GetContextPanel().SetDialogVariable('playerstat_value-b_8' ,MatchStats.GetTotalHEThrown( oMatch) == 0 ? \"\" : MatchStats.GetHESuccessRate( oMatch) + $.Localize( '#playerstats_suffix_per_cent'));\n\t\t$.GetContextPanel().SetDialogVariable('playerstat_value-b_9',MatchStats.GetTotalFBThrown( oMatch) == 0 ? \"\"  : MatchStats.GetFBSuccessRate( oMatch) + $.Localize( '#playerstats_suffix_per_cent'));\n\t\t$.GetContextPanel().SetDialogVariable('playerstat_value-b_10',MatchStats.GetTotal1v1Engagements( oMatch) == 0 ? \"\" : MatchStats.Get1v1SuccessRate( oMatch) + $.Localize( '#playerstats_suffix_per_cent'));\n\t\t$.GetContextPanel().SetDialogVariable('playerstat_value-b_11',MatchStats.GetTotal1v2Engagements( oMatch) == 0 ? \"\" : MatchStats.Get1v2SuccessRate( oMatch) + $.Localize( '#playerstats_suffix_per_cent'));\n\t\t$.GetContextPanel().SetDialogVariable('playerstat_value-b_12',MatchStats.GetEntryKillsPerDeath( oMatch) == \"0.00\" ? \"\" : MatchStats.GetEntryKillsPerDeath( oMatch));\t\t\t\n\t\t\n\t\t$.GetContextPanel().SetDialogVariable( 'abandoned', ( oMatch.match_outcome & 0x4 ) ? $.Localize( '#matchstat_abandoned' ) : '' );\t\n\t\t$.GetContextPanel().FindChildTraverse( 'Abandoned' ).visible = oMatch.match_outcome & 0x4;\n\t}\n\n\treturn {\n\t\tInit: _Init,\n\t}\n\n\n})();\n\n(function()\n{\n} )();\n\n\n","scripts/tooltips/tooltip_custom_test.js":"function setupTooltip()\n{\n\tvar strTest = $.GetContextPanel().GetAttributeString( \"test\", \"not-found\" );\n\t$( '#DynamicLabel' ).text = \"Parameter 'test' had value '\" + strTest + \"'\";\n}","scripts/tooltips/tooltip_eventsched_team.js":"'use strict';\n\nvar EventschedTeamTooltip = ( function()\n{\n\n\tvar team_id;\n\tvar team_name;\n\tvar team_logo_url;\n\tvar player_photo_url = [];\n\tvar player_name = [];\n\n\tfunction _Init ()\n\t{\n\t\tteam_id = $.GetContextPanel().GetAttributeString( \"team_id\", \"\" );\n\t\tteam_name = $.GetContextPanel().GetAttributeString( \"team_name\", \"\" );\n\t\tteam_logo_url = $.GetContextPanel().GetAttributeString( \"team_logo_url\", \"\" );\n\t\t\n\t\tplayer_photo_url[ 0 ] = $.GetContextPanel().GetAttributeString( \"player_photo0\", \"\" );\n\t\tplayer_photo_url[ 1 ] = $.GetContextPanel().GetAttributeString( \"player_photo1\", \"\" );\n\t\tplayer_photo_url[ 2 ] = $.GetContextPanel().GetAttributeString( \"player_photo2\", \"\" );\n\t\tplayer_photo_url[ 3 ] = $.GetContextPanel().GetAttributeString( \"player_photo3\", \"\" );\n\t\tplayer_photo_url[ 4 ] = $.GetContextPanel().GetAttributeString( \"player_photo4\", \"\" );\n\n\t\tplayer_name[ 0 ] = $.GetContextPanel().GetAttributeString( \"player_name0\", \"\" );\n\t\tplayer_name[ 1 ] = $.GetContextPanel().GetAttributeString( \"player_name1\", \"\" );\n\t\tplayer_name[ 2 ] = $.GetContextPanel().GetAttributeString( \"player_name2\", \"\" );\n\t\tplayer_name[ 3 ] = $.GetContextPanel().GetAttributeString( \"player_name3\", \"\" );\n\t\tplayer_name[ 4 ] = $.GetContextPanel().GetAttributeString( \"player_name4\", \"\" );\n\n\n\n\t\t            \n\t\t$.GetContextPanel().SetDialogVariable( 'eventsched-tt-teamname', team_name );\n\t\t\n\t\t            \n\t\tvar elTeamLogo = $.GetContextPanel().FindChildTraverse( 'id-estt-header__team-logo' );\n\t\tif ( elTeamLogo )\n\t\t{\n\t\t\telTeamLogo.SetImage( team_logo_url );\n\t\t}\n\n\t\tvar elTeamLogoBlurBG = $.GetContextPanel().FindChildTraverse( 'id-estt-blur' );\n\t\tif ( elTeamLogoBlurBG )\n\t\t{\n\t\t\telTeamLogoBlurBG.SetImage( team_logo_url );\n\t\t}\n\t\t\n\t\t\n\t\t                                                                            \n\t\t\n\n\t\t_Populate();\n\t}\n\n\t                                          \n\t    \n\t   \t                                                      \n\t   \t \n\t   \t\t                                      \n\n\t   \t\t            \n\t   \t \n\t    \n\n\tfunction _Populate ()\n\t{\n\t\t          \n\n\t\tvar elPlayerContainer = $.GetContextPanel().FindChildTraverse( 'id-estt-lineup-container' );\n\n\t\telPlayerContainer.RemoveAndDeleteChildren();\n\n\t\tfor ( var idx = 0; idx < 5; idx++ )\n\t\t{\n\t\t\tvar elPlayer = $.CreatePanel( 'Panel', elPlayerContainer, player_photo_url[ idx ] );\n\t\t\telPlayer.BLoadLayoutSnippet( 'snippet-estt-player' );\n\n\t\t\tvar playerName = player_name[ idx ] !== \"\" ? player_name[ idx ] : \"?\"; \n\t\t\t              \n\t\t\telPlayer.SetDialogVariable( 'esttplayer-name', playerName );\n\n\t\t\t              \n\t\t\tvar elPlayerImage = elPlayer.FindChildTraverse( 'id-estt-player__photo' );\n\t\t\tif ( elPlayerImage )\n\t\t\t{\n\t\t\t\telPlayerImage.SetImage( player_photo_url[ idx ] );\n\t\t\t}\n\t\t}\n\t}\n\n\n\n\treturn {\n\t\tInit: _Init,\n\t}\n\n\n})();\n\n(function()\n{\n\n})();","scripts/tooltips/tooltip_inventory_item.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../common/icon.ts\" />\nvar TooltipInventoryItem;\n(function (TooltipInventoryItem) {\n    function SetupTooltip() {\n        let ctx = $.GetContextPanel();\n        let id = ctx.GetAttributeString(\"itemid\", \"0\");\n        let bThisIsFauxItemID = InventoryAPI.IsFauxItemID(id);\n        ctx.SetDialogVariable('name', InventoryAPI.GetItemNameUncustomized(id));\n        const elCustomName = ctx.FindChildInLayoutFile('jsCustomName');\n        if (elCustomName) {\n            elCustomName.visible = InventoryAPI.HasCustomName(id);\n            ctx.SetDialogVariable('custom-name', '\"' + InventoryAPI.GetItemNameCustomized(id) + '\"');\n        }\n        let strDesc = InventoryAPI.GetItemDescription(id, '');\n        if (strDesc.endsWith('<br>')) {\n            strDesc = strDesc.slice(0, -4);\n        }\n        if (bThisIsFauxItemID && InventoryAPI.DoesItemMatchDefinitionByName(id, \"Remove Keychain Tool\")) {\n            let numKeychainRemoveToolChargesRemaining = InventoryAPI.GetCacheTypeElementFieldByIndex('KeychainRemoveToolCharges', 0, 'charges');\n            if (numKeychainRemoveToolChargesRemaining > 0) {\n                ctx.SetDialogVariableInt('item_count', numKeychainRemoveToolChargesRemaining);\n                strDesc = strDesc + '<br/><font color=\"#99ccff\">' + $.Localize('#Attrib_KeychainRemoveTool_Charges', ctx) + '</font>';\n            }\n        }\n        ctx.SetDialogVariable('description', strDesc);\n        let isOriginalOwner = (InventoryAPI.GetItemAttributeValue(id, '{uint32}purchaser account id') != undefined);\n        let elOrignalOwner = $('#JsOriginalOwnerTooltip');\n        elOrignalOwner.visible = isOriginalOwner;\n        $('#JsOriginalOwnerTooltipSeperator').visible = isOriginalOwner;\n        let strSetName = InventoryAPI.GetTag(id, 'ItemSet');\n        let elCollectionLogo = $('#CollectionLogo');\n        if (elCollectionLogo)\n            elCollectionLogo.DeleteAsync(0.0);\n        elCollectionLogo = $.CreatePanel('Image', $.GetContextPanel().FindChildInLayoutFile('jsTopItemTooltipRow'), 'CollectionLogo', { class: \"collection-logo\", texturewidth: \"56\", scaling: \"stretch-to-fit-preserve-aspect\" });\n        if (strSetName && strSetName != '0') {\n            ctx.AddClass('tooltip-inventory-item__has-set');\n            IconUtil.SetupFallbackItemSetIcon(elCollectionLogo, strSetName);\n            IconUtil.SetItemSetSVGImage(elCollectionLogo, strSetName);\n            ctx.SetDialogVariable('collection', InventoryAPI.GetTagString(strSetName));\n        }\n        else {\n            ctx.RemoveClass('tooltip-inventory-item__has-set');\n            elCollectionLogo.SetImage('');\n            ctx.SetDialogVariable('collection', '');\n        }\n        let rarity = InventoryAPI.GetItemRarity(id);\n        let rarityName = InventoryAPI.GetItemType(id);\n        if (rarityName) {\n            ctx.AddClass('tooltip-inventory-item__has-rarity');\n            ctx.SwitchClass('tooltip-rarity', 'tooltip-inventory-item__rarity-' + rarity);\n            ctx.SetDialogVariable('rarity', rarityName);\n        }\n        else {\n            ctx.RemoveClass('tooltip-inventory-item__has-rarity');\n            ctx.SetDialogVariable('rarity', '');\n        }\n        let numWear = bThisIsFauxItemID ? undefined : InventoryAPI.GetWear(id);\n        if (numWear != undefined && numWear >= 0) {\n            ctx.AddClass('tooltip-inventory-item__has-grade');\n            ctx.SetDialogVariable('grade', $.Localize('#SFUI_InvTooltip_Wear_Amount_' + numWear));\n        }\n        else {\n            ctx.RemoveClass('tooltip-inventory-item__has-grade');\n            ctx.SetDialogVariable('grade', '');\n        }\n        let strTeam = InventoryAPI.GetItemTeam(id);\n        let strCategory = InventoryAPI.GetLoadoutCategory(id);\n        if (!strCategory || strCategory === 'flair0' || strCategory === 'musickit' || strCategory === 'spray0') {\n            strTeam = undefined;\n        }\n        if (strTeam) {\n            ctx.AddClass('tooltip-inventory-item__has-team');\n            ctx.SetDialogVariable('team', $.Localize(strTeam));\n            let bAny = (strTeam == '#CSGO_Inventory_Team_Any');\n            let bCT = bAny || (strTeam == '#CSGO_Inventory_Team_CT');\n            let bT = bAny || (strTeam == '#CSGO_Inventory_Team_T');\n            ctx.SetHasClass('tooltip-inventory-item__team-ct', bCT);\n            ctx.SetHasClass('tooltip-inventory-item__team-t', bT);\n        }\n        else {\n            ctx.RemoveClass('tooltip-inventory-item__has-team');\n            ctx.RemoveClass('tooltip-inventory-item__team-ct');\n            ctx.RemoveClass('tooltip-inventory-item__team-t');\n        }\n        if (GameInterfaceAPI.GetSettingString(\"cl_inventory_debug_tooltip\") == \"1\") {\n            let debugOutput = \"<br />\";\n            function Print(string) {\n                debugOutput += string + \"<br />\";\n            }\n            Print(\"--------------------------------------\");\n            Print(\"itemID: \" + id);\n            Print(\"--------------------------------------\");\n            let oTags = InventoryAPI.BuildItemTagsObject(id);\n            for (let key of Object.keys(oTags)) {\n                let tag = oTags[key];\n                let cat = Object.keys(tag)[0];\n                let val = tag[Object.keys(tag)[0]];\n                Print(cat + \": \" + val);\n            }\n            ctx.SetDialogVariable('description', debugOutput);\n        }\n    }\n    TooltipInventoryItem.SetupTooltip = SetupTooltip;\n})(TooltipInventoryItem || (TooltipInventoryItem = {}));\n","scripts/tooltips/tooltip_loadout_item.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../common/iteminfo.ts\" />\nvar TooltipLoadoutItem;\n(function (TooltipLoadoutItem) {\n    function SetupTooltip() {\n        let ctx = $.GetContextPanel();\n        let id = ctx.GetAttributeString(\"itemid\", \"\");\n        let nameOnly = ctx.GetAttributeString(\"nameonly\", \"\");\n        let slot = ctx.GetAttributeString(\"slot\", \"\");\n        let idForItemName = id;\n        if (slot === 'spray0') {\n            idForItemName = ItemInfo.GetFauxReplacementItemID(id, 'graffiti');\n        }\n        ctx.SetDialogVariable('name', InventoryAPI.GetItemName(idForItemName));\n        let color = InventoryAPI.GetItemRarityColor(id);\n        if (color) {\n            $.GetContextPanel().FindChildInLayoutFile('id-tooltip-layout-name').style.color = color;\n        }\n        else {\n            $.GetContextPanel().FindChildInLayoutFile('id-tooltip-layout-name').style.color = 'white';\n        }\n        $.GetContextPanel().FindChildInLayoutFile('id-tooltip-layout-desc').visible = nameOnly === 'true';\n        $.GetContextPanel().FindChildInLayoutFile('id-tooltip-layout-seperator').visible = nameOnly === 'true';\n        if (nameOnly === 'true') {\n            let defName = InventoryAPI.GetItemDefinitionName(id);\n            defName = defName ? defName?.replace('weapon_', '') : '';\n            ctx.SetDialogVariable('desc', $.Localize('#csgo_item_usage_desc_' + defName));\n        }\n    }\n    TooltipLoadoutItem.SetupTooltip = SetupTooltip;\n})(TooltipLoadoutItem || (TooltipLoadoutItem = {}));\n","scripts/tooltips/tooltip_lobby_settings.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../common/formattext.ts\" />\n/// <reference path=\"../common/sessionutil.ts\" />\n/// <reference path=\"../util_gamemodeflags.ts\" />\nvar TooltipLobby;\n(function (TooltipLobby) {\n    let m_GameSettings = {};\n    let m_GameOptions = {};\n    let m_RefreshStatsScheduleHandle = false;\n    function Init() {\n        if (LobbyAPI.IsSessionActive()) {\n            _CancelStatsRefresh();\n            _GetLobbySettings();\n            _Permissions();\n            _SetPrimeStatus();\n            _SetMode();\n            _SetMaps();\n            _GetLobbyStatistics();\n            _SetGameModeFlags();\n            _SetDirectChallengeSettings();\n        }\n        else {\n            UiToolkitAPI.HideCustomLayoutTooltip('LobbySettingsTooltip');\n        }\n    }\n    TooltipLobby.Init = Init;\n    function _CancelStatsRefresh() {\n        if (m_RefreshStatsScheduleHandle !== false) {\n            $.CancelScheduled(m_RefreshStatsScheduleHandle);\n            m_RefreshStatsScheduleHandle = false;\n        }\n    }\n    function _GetLobbyStatistics() {\n        m_RefreshStatsScheduleHandle = $.Schedule(2, _GetLobbyStatistics);\n        let searchingStatus = LobbyAPI.GetMatchmakingStatusString();\n        let elMatchStats = $.GetContextPanel().FindChildInLayoutFile('LobbyTooltipStats');\n        let isSearching = searchingStatus !== '' && searchingStatus !== undefined ? true : false;\n        elMatchStats.SetHasClass('hidden', !isSearching);\n        if (!isSearching)\n            return;\n        let elMatchStatsLabel = elMatchStats.FindChildInLayoutFile('LobbyTooltipStatsTitle');\n        elMatchStatsLabel.text = $.Localize(searchingStatus);\n        let matchmakeingStats = LobbyAPI.GetMatchmakingStatistics();\n        let elStats = elMatchStats.FindChildInLayoutFile('LobbyTooltipStatsList');\n        elStats.RemoveAndDeleteChildren();\n        function MakeStatsRow(statType, iconName) {\n            let p = $.CreatePanel('Panel', elStats, '');\n            p.BLoadLayoutSnippet(\"SettingsEntry\");\n            if (statType === 'avgSearchTimeSeconds') {\n                let time = FormatText.SecondsToDDHHMMSSWithSymbolSeperator(matchmakeingStats[statType]);\n                p.SetDialogVariable('stat', time);\n            }\n            else {\n                p.SetDialogVariableInt('stat', matchmakeingStats[statType]);\n            }\n            if (statType === 'playersLockedIn') {\n                let totalPlayers = SessionUtil.GetMaxLobbySlotsForGameMode(m_GameSettings.mode);\n                totalPlayers *= 2;\n                p.SetDialogVariableInt('total_stat', totalPlayers);\n            }\n            p.FindChildInLayoutFile('SettingText').text = $.Localize('#matchmaking_stat_' + statType + ':f', p);\n            p.FindChildInLayoutFile('SettingImage').SetImage('file://{images}/icons/ui/' + iconName + '.svg');\n            p.FindChildInLayoutFile('SettingImage').AddClass('tint');\n        }\n        MakeStatsRow('avgSearchTimeSeconds', 'clock');\n        MakeStatsRow('playersOnline', 'lobby');\n        if (matchmakeingStats.hasOwnProperty('playersLockedIn') && matchmakeingStats.playersLockedIn\n            && ![\"cooperative\", \"coopmission\"].includes(m_GameSettings.mode)) {\n            MakeStatsRow('playersLockedIn', 'find');\n        }\n        else {\n            MakeStatsRow('playersSearching', 'find');\n        }\n        MakeStatsRow('serversOnline', 'servers');\n    }\n    function _GetLobbySettings() {\n        let gss = LobbyAPI.GetSessionSettings();\n        m_GameSettings = gss.game;\n        m_GameOptions = gss.options;\n    }\n    function _SetPrimeStatus() {\n        let isLocalPlayerPrime = MyPersonaAPI.GetElevatedState() === \"elevated\";\n        let displayText = !isLocalPlayerPrime\n            ? '#prime_not_enrolled_label'\n            : (m_GameSettings.prime === 1 && SessionUtil.AreLobbyPlayersPrime())\n                ? '#prime_only_label'\n                : '#prime_priority_label';\n        let elPrimeText = $.GetContextPanel().FindChildInLayoutFile('LobbyTooltipPrime');\n        elPrimeText.text = $.Localize(displayText);\n        _SetRankedStatus(isLocalPlayerPrime);\n    }\n    function _SetDirectChallengeSettings() {\n        let elDirectChallengeText = $.GetContextPanel().FindChildInLayoutFile('LobbyDirectChallenge');\n        let gss = LobbyAPI.GetSessionSettings();\n        let bPrivate = gss.options.hasOwnProperty('challengekey') && gss.options.challengekey != '';\n        elDirectChallengeText.text = bPrivate ? $.Localize('#DirectChallenge_lobbysettings_on2') : $.Localize('#DirectChallenge_lobbysettings_off');\n        let elContainer = $.GetContextPanel().FindChildInLayoutFile('LobbyTooltipDirectChallengeContainer');\n        elContainer.visible = bPrivate;\n    }\n    function _SetGameModeFlags() {\n        let elContainer = $.GetContextPanel().FindChildInLayoutFile('LobbyTooltipGameModeFlagsContainer');\n        let flags = parseInt(m_GameSettings.gamemodeflags);\n        if (!flags || !GameModeFlags.DoesModeUseFlags(m_GameSettings.mode) ||\n            !GameModeFlags.DoesModeShowUserVisibleFlags(m_GameSettings.mode)) {\n            elContainer.visible = false;\n            return;\n        }\n        elContainer.visible = true;\n        let displayTextToken = '#play_setting_gamemodeflags_' + m_GameSettings.mode + '_' + m_GameSettings.gamemodeflags;\n        elContainer.SetDialogVariable('gamemodeflags', $.Localize(displayTextToken));\n        let elIcon = $.GetContextPanel().FindChildTraverse('LobbyTooltipGamdeModeFlagsImage');\n        let icon = GameModeFlags.GetIcon(m_GameSettings.mode, flags);\n        elIcon.SetImage(icon);\n    }\n    function _SetRankedStatus(isLocalPlayerPrime) {\n        let elRankedText = $.GetContextPanel().FindChildInLayoutFile('LobbyTooltipRanked');\n        if (!isLocalPlayerPrime || !SessionUtil.DoesGameModeHavePrimeQueue(m_GameSettings.mode)) {\n            elRankedText.GetParent().visible = false;\n            return;\n        }\n        elRankedText.GetParent().visible = true;\n        let isRanked = m_GameSettings.prime === 1 && SessionUtil.AreLobbyPlayersPrime();\n        elRankedText.text = isRanked ? $.Localize(\"#prime_ranked\") : $.Localize(\"#prime_unranked\");\n    }\n    function _Permissions() {\n        let systemSettings = LobbyAPI.GetSessionSettings().system;\n        if (!systemSettings)\n            return;\n        let systemAccess = systemSettings.access;\n        let displayText = '';\n        if (systemAccess === 'public') {\n            displayText = '#permissions_' + systemAccess;\n        }\n        else {\n            displayText = '#permissions_' + systemAccess;\n        }\n        $.GetContextPanel().FindChildInLayoutFile('LobbyTooltipPermissions').text = $.Localize(displayText);\n    }\n    function _SetMode() {\n        let elGameModeTitle = $.GetContextPanel().FindChildInLayoutFile('LobbyTooltipGameMode');\n        elGameModeTitle.FindChild('SettingText').text = $.Localize('#SFUI_GameMode' + m_GameSettings.mode_ui);\n        elGameModeTitle.FindChild('SettingImage').SetImage('file://{images}/icons/ui/' + m_GameSettings.mode + '.svg');\n        elGameModeTitle.FindChild('SettingImage').SetHasClass('tint', m_GameSettings.mode !== \"competitive\");\n    }\n    function _SetMaps() {\n        if (!m_GameSettings.mapgroupname)\n            return;\n        let mapsList;\n        mapsList = m_GameSettings.mapgroupname.split(',');\n        let elMapsSection = $.GetContextPanel().FindChildInLayoutFile('LobbyTooltipMapsList');\n        elMapsSection.RemoveAndDeleteChildren();\n        $.CreatePanel('Label', elMapsSection, 'LobbyMapsListTitle', {\n            class: 'tooltip-player-xp__title--small',\n            text: '#party_tooltip_maps'\n        });\n        for (let element of mapsList) {\n            let p = $.CreatePanel('Panel', elMapsSection, element);\n            p.BLoadLayoutSnippet(\"SettingsEntry\");\n            let strMapText = '';\n            if (element === 'mg_lobby_mapveto' && m_GameOptions && m_GameOptions.challengekey) {\n                strMapText = $.Localize(\"#SFUI_Lobby_LeaderMatchmaking_Type_PremierPrivateQueue\");\n            }\n            else if (m_GameSettings.mode === \"skirmish\") {\n                strMapText = $.Localize(GameTypesAPI.GetMapGroupAttribute('mg_' + m_GameSettings.map, 'nameID'));\n            }\n            else {\n                strMapText = $.Localize(GameTypesAPI.GetMapGroupAttribute(element, 'nameID'));\n            }\n            p.FindChildInLayoutFile('SettingText').text = strMapText;\n            let iconName;\n            if (m_GameSettings.mode === \"skirmish\") {\n                iconName = m_GameSettings.map;\n            }\n            else {\n                iconName = GameTypesAPI.GetMapGroupAttributeSubKeys(element, 'maps').split(',')[0];\n            }\n            p.FindChildInLayoutFile('SettingImage').SetImage('file://{images}/map_icons/map_icon_' + iconName + '.svg');\n        }\n    }\n    $.RegisterForUnhandledEvent(\"PanoramaComponent_Lobby_MatchmakingSessionUpdate\", Init);\n    $.RegisterForUnhandledEvent(\"CSGOHideMainMenu\", _CancelStatsRefresh);\n    $.RegisterForUnhandledEvent(\"CSGOHidePauseMenu\", _CancelStatsRefresh);\n})(TooltipLobby || (TooltipLobby = {}));\n","scripts/tooltips/tooltip_player_xp.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../common/formattext.ts\" />\nvar TooltipPlayerXp;\n(function (TooltipPlayerXp) {\n    function Init() {\n        let xuid = $.GetContextPanel().GetAttributeString(\"xuid\", \"not-found\");\n        let rawBonuses = MyPersonaAPI.GetActiveXpBonuses();\n        let bonusesArray = rawBonuses.split(\",\");\n        let maxLevel = InventoryAPI.GetMaxLevel();\n        let currentPoints = FriendsListAPI.GetFriendXp(xuid);\n        let pointsPerLevel = MyPersonaAPI.GetXpPerLevel();\n        let currentLvl = FriendsListAPI.GetFriendLevel(xuid);\n        let isDueServiceMedal = currentLvl >= maxLevel;\n        $.GetContextPanel().SetDialogVariable(\"xpcurrent\", String(currentPoints));\n        $.GetContextPanel().SetDialogVariable(\"xptonext\", String(pointsPerLevel - currentPoints));\n        $(\"#JsTooltip_Xp_Current\").text = isDueServiceMedal ? \"#tooltip_xp_have_max_current\" : \"#tooltip_xp_current\";\n        $(\"#JsTooltip_Xp_Needed\").text = isDueServiceMedal ? \"#tooltip_xp_have_max_rank\" : \"#tooltip_xp_for_next_rank\";\n        if (bonusesArray.length > 0) {\n            if (isDueServiceMedal) {\n                for (let i = 0; i < bonusesArray.length; i++) {\n                    if (bonusesArray[i] === '2')\n                        bonusesArray.splice(i, 1);\n                }\n            }\n        }\n        let numBonusesAdded = 0;\n        if (bonusesArray.length > 0) {\n            $('#JsTooltipXpSection').RemoveClass('hidden');\n            $(\"#JsTooltipXpBonuses\").RemoveAndDeleteChildren();\n            for (let i = 0; i < bonusesArray.length; i++) {\n                if (!bonusesArray[i])\n                    continue;\n                ++numBonusesAdded;\n                let newTile = $.CreatePanel(\"Label\", $(\"#JsTooltipXpBonuses\"), 'JsTooltipBonus' + i, { html: true });\n                let secRemaining = StoreAPI.GetSecondsUntilXpRollover();\n                newTile.SetDialogVariable('time-to-week-rollover', (secRemaining > 0) ? FormatText.SecondsToSignificantTimeString(secRemaining) : '');\n                newTile.AddClass('tooltip-player-xp__subtitle');\n                newTile.text = $.Localize(\"#tooltip_xp_bonus_\" + bonusesArray[i], newTile);\n                if (bonusesArray[i] == '2') {\n                    const petId = InventoryAPI.GetPetItemID();\n                    const nStage = petId ? Number(InventoryAPI.GetItemAttributeValue(petId, '{uint32}upgrade level')) : 0;\n                    if (nStage > 0 && !!petId) {\n                        const rtFoodExp = Number(InventoryAPI.GetItemAttributeValue(petId, '{uint32}pet food expiration date'));\n                        const rtPetUpgr = Number(InventoryAPI.GetItemAttributeValue(petId, '{uint32}pet next upgrade date'));\n                        if (rtFoodExp && rtPetUpgr && (rtFoodExp < rtPetUpgr)) {\n                            let newTile = $.CreatePanel(\"Label\", $(\"#JsTooltipXpBonuses\"), 'JsTooltipBonus' + i, { html: true });\n                            newTile.AddClass('tooltip-player-xp__subtitle');\n                            newTile.text = $.Localize(\"#tooltip_xp_bonus_pet_feed\", newTile);\n                        }\n                    }\n                }\n            }\n            let xpTrailTimeRemaining = MyPersonaAPI.GetXpTrailTimeRemaining();\n            if (xpTrailTimeRemaining > 0) {\n                ++numBonusesAdded;\n                let newTile = $.CreatePanel(\"Label\", $(\"#JsTooltipXpBonuses\"), 'JsTooltipBonus_xptrail', { html: true });\n                newTile.SetDialogVariable('xptrail-time-remaining', FormatText.SecondsToSignificantTimeString(xpTrailTimeRemaining));\n                newTile.AddClass('tooltip-player-xp__subtitle');\n                newTile.text = $.Localize(\"#tooltip_xp_bonus_xptrail\", newTile);\n            }\n        }\n        if (!numBonusesAdded) {\n            $('#JsTooltipXpSection').AddClass('hidden');\n        }\n    }\n    TooltipPlayerXp.Init = Init;\n})(TooltipPlayerXp || (TooltipPlayerXp = {}));\n","scripts/tooltips/tooltip_souvenir_receipt.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../common/formattext.ts\" />\n/// <reference path=\"../common/iteminfo.ts\" />\n/// <reference path=\"../generated/items_event_current_generated_store.ts\" />\nvar TooltipSouvenirReceipt;\n(function (TooltipSouvenirReceipt) {\n    function Init() {\n        let itemId = $.GetContextPanel().GetAttributeString(\"itemid\", \"\");\n        if (!itemId) {\n            UiToolkitAPI.HideCustomLayoutTooltip('tooltip-souvenir-receipt');\n            return;\n        }\n        const elParent = $.GetContextPanel().FindChildInLayoutFile('id-sticker-list');\n        const defidxStickerItem = InventoryAPI.GetItemDefinitionIndexFromDefinitionName('sticker');\n        let slots = [];\n        const slotCount = InventoryAPI.GetItemStickerSlotCount(itemId);\n        elParent.Children().forEach((sticker, idx) => { if (idx > slotCount) {\n            sticker.DeleteAsync(0);\n        } });\n        for (let i = 0; i < slotCount; i++) {\n            const imagePath = InventoryAPI.GetItemStickerImageBySlot(itemId, i);\n            if (imagePath) {\n                let unCostInCredits = 0;\n                const idStickerKit = InventoryAPI.GetItemAttributeValue(itemId, '{uint32}sticker slot ' + i + ' id');\n                const idFauxSticker = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(defidxStickerItem, idStickerKit);\n                unCostInCredits = MissionsAPI.GetSeasonalOperationFauxCreditsCost(g_ActiveTournamentInfo.credits_id, idFauxSticker);\n                if (!unCostInCredits)\n                    unCostInCredits = g_ActiveTournamentInfo.souvenir_cost;\n                let fmtName = ItemInfo.GetFormattedName(idFauxSticker);\n                const name = fmtName.vars.paintkit_name;\n                slots.push({ index: i, imagePath: imagePath, name: name, cost: unCostInCredits });\n            }\n        }\n        slots.sort((a, b) => (b.cost - a.cost) * 100 + (a.index - b.index));\n        for (let j = 0; j < slots.length; j++) {\n            let elPanel = elParent.FindChildInLayoutFile('id-sticker' + j);\n            if (!elPanel) {\n                elPanel = $.CreatePanel('Panel', elParent, 'id-sticker' + j);\n                elPanel.BLoadLayoutSnippet('sticker-entry');\n            }\n            elPanel.SetDialogVariableInt('price', slots[j].cost);\n            elPanel.SetDialogVariable('sticker-name', slots[j].name ?? slots[j].name);\n        }\n        const totalSum = slots.reduce((acc, curr) => { return acc + (curr.cost ?? 0); }, 0);\n        const discountAmount = InventoryAPI.GetItemSouvenirDiscountPercent(itemId);\n        const discountCredits = Math.trunc(totalSum * discountAmount / 100);\n        let discountPrice = totalSum;\n        if (discountCredits < totalSum)\n            discountPrice -= discountCredits;\n        $.GetContextPanel().FindChildInLayoutFile('id-sticker-total-row').SetDialogVariableInt('price', totalSum);\n        $.GetContextPanel().FindChildInLayoutFile('id-sticker-discount-price-row').SetDialogVariableInt('price', discountPrice);\n        $.GetContextPanel().FindChildInLayoutFile('id-sticker-discount-price-row').SetDialogVariable('currency', StoreAPI.GetStoreItemTokensBundlePrice('' + g_ActiveTournamentInfo.itemid_charge, discountPrice, ''));\n        $.GetContextPanel().FindChildInLayoutFile('id-sticker-discount-row').SetDialogVariableInt('discount', InventoryAPI.GetItemSouvenirDiscountPercent(itemId));\n    }\n    TooltipSouvenirReceipt.Init = Init;\n})(TooltipSouvenirReceipt || (TooltipSouvenirReceipt = {}));\n","scripts/tooltips/tooltip_stat_season_rank.js":"\"use strict\";\n/// <reference path=\"../rating_emblem.ts\" />\nfunction setupTooltip() {\n    var rank = $.GetContextPanel().GetAttributeString(\"rank\", \"not-found\");\n    var week_name = $.GetContextPanel().GetAttributeString(\"week_name\", \"not-found\");\n    var week_idx = $.GetContextPanel().GetAttributeString(\"week_idx\", \"not-found\");\n    if (week_name) {\n        $.GetContextPanel().SetDialogVariable('week-name', week_name);\n        $.GetContextPanel().SetDialogVariable('week-id', week_idx);\n    }\n    if (!rank || rank === \"not-found\") {\n        $.GetContextPanel().FindChildInLayoutFile('id-tooltip-premier-rating').SetHasClass('show', false);\n        return;\n    }\n    const options = {\n        root_panel: $.GetContextPanel().FindChildInLayoutFile('id-tooltip-premier-rating'),\n        do_fx: false,\n        full_details: false,\n        rating_type: 'Premier',\n        leaderboard_details: { score: parseInt(rank) },\n        local_player: false\n    };\n    $.GetContextPanel().FindChildInLayoutFile('id-tooltip-premier-rating').SetHasClass('show', true);\n    RatingEmblem.SetXuid(options);\n}\n","scripts/tooltips/tooltip_stat_season_rank__vpk_vjs_c.js":"function setupTooltip()\n{\n\tvar score = $.GetContextPanel().GetAttributeString( \"score\", \"not-found\" );\n\n\tif( score === \"not-found\" )\n\t{\n\t\treturn;\n\t}\n\t\n}","scripts/tooltips/tooltip_title_progressbar.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\nvar TooltipProgress;\n(function (TooltipProgress) {\n    function Init() {\n        let titleText = $.GetContextPanel().GetAttributeString(\"titletext\", \"not-found\");\n        let bodyText = $.GetContextPanel().GetAttributeString(\"bodytext\", \"not-found\");\n        let useXp = $.GetContextPanel().GetAttributeString(\"usexp\", \"false\") === 'true';\n        let targetLevel = $.GetContextPanel().GetAttributeString(\"targetlevel\", \"2\");\n        let showBar = $.GetContextPanel().GetAttributeString(\"showbar\", \"true\") === 'true';\n        let value = 0;\n        if (useXp) {\n            const currentPoints = FriendsListAPI.GetFriendXp(MyPersonaAPI.GetXuid());\n            const pointsPerLevel = MyPersonaAPI.GetXpPerLevel();\n            const levelsAttained = FriendsListAPI.GetFriendLevel(MyPersonaAPI.GetXuid());\n            const totalPointsAttained = (levelsAttained ? (levelsAttained - 1) : 0) * pointsPerLevel + currentPoints;\n            const totalPointsRequired = (Number(targetLevel) - 1) * pointsPerLevel;\n            value = totalPointsAttained / totalPointsRequired * 100.0;\n        }\n        else {\n            value = Number($.GetContextPanel().GetAttributeString(\"barvalue\", \"0\"));\n        }\n        $('#TitleLabel').text = $.Localize(titleText);\n        $('#TextLabel').text = $.Localize(bodyText);\n        $('#TextPercentage').text = Math.floor(value) + '%';\n        $('#js-tooltip-progress-bar-inner').style.width = value + '%';\n        $('#ProgressBarContainer').visible = showBar;\n    }\n    TooltipProgress.Init = Init;\n})(TooltipProgress || (TooltipProgress = {}));\n","scripts/tournaments/pickem_bracket.js":"\n'use strict';\n\nvar PickEmBracket = ( function()\n{\n\tvar _Init = function ( elPickemPanel )\n\t{\n\t\t_UpdateAllSections( elPickemPanel );\n\t\t_UpdatePicksWorth( elPickemPanel );\n\t};\n\n\tvar _UpdateAllSections = function ( elPickemPanel, showIdPickIsSaved )\n\t{\n\t\tif ( !elPickemPanel._oPickemData.oTournamentData || !elPickemPanel._oPickemData.oInitData )\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tvar sectionCount = elPickemPanel._oPickemData.oTournamentData.sections.length;\n\t\tvar startIndex = elPickemPanel._oPickemData.oInitData.sectionindex;\n\n\t\tfor( var i = startIndex; i < sectionCount; i++ )\n\t\t{\n\t\t\t_UpdateSection( elPickemPanel, i, showIdPickIsSaved );\n\t\t}\n\t};\n\n\tvar _UpdateSection = function ( elPickemPanel, sectionIndex, showIdPickIsSaved )\n\t{\n\t\tvar groupsCount = elPickemPanel._oPickemData.oTournamentData.sections[ sectionIndex ].groups.length;\n\n\t\tfor( var i = 0; i < groupsCount; i++ )\n\t\t{\n\t\t\t                                                                                                \n\t\t\t                                     \n\t\t\tif( sectionIndex === elPickemPanel._oPickemData.oInitData.sectionindex )\n\t\t\t{\n\t\t\t\t_SetUpFirstDayTeams( elPickemPanel, sectionIndex, i );\n\t\t\t}\n\n\t\t\t_UpdatePicksInGroup( elPickemPanel, sectionIndex, i, showIdPickIsSaved );\n\t\t}\n\t};\n\n\tvar _SetUpFirstDayTeams = function ( elPickemPanel, sectionIndex, groupIndex )\n\t{\n\t\tvar oGroupInfoForUpdate = _GetDataNeededToUpdateTeams( elPickemPanel, sectionIndex, groupIndex );\n\n\t\tfor( var i = 0; i < oGroupInfoForUpdate.oGroupData.teamscount; i++ )\n\t\t{\n\t\t\tvar elTeam = elPickemPanel.FindChildInLayoutFile(\n\t\t\t\t'id-bracket-section' +\n\t\t\t\t( sectionIndex - oGroupInfoForUpdate.startIndex ) +\n\t\t\t\t'-group' +\n\t\t\t\tgroupIndex +\n\t\t\t\t'-pick' +\n\t\t\t\ti\n\t\t\t);\n\n\t\t\telTeam.AddClass( 'pickem-pick-placed' );\n\n\t\t\tvar teamId = PredictionsAPI.GetGroupTeamIDByIndex( oGroupInfoForUpdate.tournamentId, oGroupInfoForUpdate.oGroupData.id, i );\n\t\t\tvar elName = elTeam.FindChildInLayoutFile( 'id-team-name' );\n\t\t\tvar elLogoImage = elTeam.FindChildInLayoutFile( 'id-team-logo' );\n\n\t\t\tif ( typeof elTeam._oteamData !== 'object' )\n\t\t\t{\n\t\t\t\telTeam._oteamData = {};\n\t\t\t}\n\t\t\t\n\t\t\telTeam._oteamData.sectionindex = sectionIndex;\n\t\t\telTeam._oteamData.groupindex = groupIndex;\n\n\t\t\tif( !teamId )\n\t\t\t{\n\t\t\t\telName.text = $.Localize( '#CSGO_PickEm_Team_TBD' );\n\t\t\t\telLogoImage.AddClass( 'hidden' );\n\t\t\t\telName.AddClass( 'pickem-bracket-team__name--long' );\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\telTeam._oteamData.teamid = teamId;\n\t\t\t\telLogoImage.RemoveClass( 'hidden' );\n\t\t\t\telName.RemoveClass( 'pickem-bracket-team__name--long' );\n\t\t\t\tPickemCommon.SetTeamImage( oGroupInfoForUpdate.tournamentId, elLogoImage, elTeam );\n\n\t\t\t\telName.text = PredictionsAPI.GetTeamName( teamId );\n\t\t\t\t_SetUpIsDraggable( elPickemPanel, elTeam, oGroupInfoForUpdate.oGroupData );\n\t\t\t\t_SetUpMouseOverEvents( elTeam );\n\t\t\t}\n\n\t\t\telTeam.AddClass( 'pickem-bracket-team-outline' );\n\t\t}\n\t};\n\n\tvar _UpdatePicksInGroup = function ( elPickemPanel, sectionIndex, groupIndex, showIdPickIsSaved )\n\t{\n\t\tvar oGroupInfoForUpdate = _GetDataNeededToUpdateTeams( elPickemPanel, sectionIndex, groupIndex );\n\n\t\tvar elGroup = elPickemPanel.FindChildInLayoutFile(\n\t\t\t'id-bracket-section' +\n\t\t\t( sectionIndex - oGroupInfoForUpdate.startIndex ) +\n\t\t\t'-group' +\n\t\t\tgroupIndex\n\t\t);\n\n\t\tvar targetsList = _GetTargetsList( elGroup );\n\t\tvar elPick = elPickemPanel.FindChildInLayoutFile( targetsList[0] );\n\t\tvar localTeamId = oGroupInfoForUpdate.oGroupData.picks[0].localid;\n\n\t\tvar oItemIdData = PickemCommon.GetYourPicksItemIdData( \n\t\t\telPickemPanel._oPickemData.oTournamentData.tournamentid, \n\t\t\tlocalTeamId\n\t\t\t);\n\n\t\tPickemCommon.UpdateCorrectPickState(\n\t\t\telPickemPanel._oPickemData.oTournamentData.tournamentid,\n\t\t\toGroupInfoForUpdate.oGroupData,\n\t\t\tPredictionsAPI.GetGroupCorrectPicksByIndex( elPickemPanel._oPickemData.oTournamentData.tournamentid, oGroupInfoForUpdate.oGroupData.id, 0 ),\n\t\t\tlocalTeamId,\n\t\t\telPick.FindChildInLayoutFile( 'id-pickem-points-for-pick' ),\n\t\t\ttrue\n\t\t);\n\n\t\tvar isBracketActive = _SetIsLocked( elPickemPanel );\n\n\t\t                                                                                       \n\t\t                                 \n\t\t                                                           \n\t\t   \t                                                                           \n\t\t   \t           \n\t\t   \t            \n\t\t   \t                                                      \n\t\t   \t                            \n\t\t     \n\t\t     \n\t\tvar notOwned = false;\n\n\t\toGroupInfoForUpdate.oGroupData.picks[0].storedefindex = notOwned ? \n\t\t\tPickemCommon.GetTeamItemDefIndex( oGroupInfoForUpdate.oGroupData.picks[0].localid ):\n\t\t\tundefined;\n\n\t\tvar elRemoveBtn = elPick.FindChildInLayoutFile( 'id-pick-cancelbtn' );\n\t\tvar showRemoveBtn = PickemCommon.ShowHideRemoveBtn(\n\t\t\tisBracketActive,\n\t\t\toGroupInfoForUpdate.oGroupData.canpick,\n\t\t\tlocalTeamId,\n\t\t\telRemoveBtn\n\t\t);\n\n\t\tif ( showRemoveBtn )\n\t\t{\n\t\t\telRemoveBtn.SetPanelEvent(\n\t\t\t\t'onactivate',\n\t\t\t\t_RemoveBracketsPicks.bind(\n\t\t\t\t\tundefined,\n\t\t\t\t\telPickemPanel,\n\t\t\t\t\telPick\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\n\t\t_UpdatePick( elPickemPanel, elPick, oGroupInfoForUpdate, oItemIdData, sectionIndex, groupIndex );\n\n\t\tif( !elPick._oteamData.hasDragTargetEvents )\n\t\t{\n\t\t\t_SetUpDragTargets( elPickemPanel, elPick );\n\t\t\telPick._oteamData.hasDragTargetEvents = true;\n\t\t}\n\n\t\tif ( showIdPickIsSaved && oGroupInfoForUpdate.oGroupData.canpick )\n\t\t{\n\t\t\t_ShowIfPickIsSaved( oGroupInfoForUpdate.oGroupData, elPick );\n\t\t}\n\n\t\t                                                                                                    \n\t\tPickemCommon.UpdateActionBarBtns( elPickemPanel, _GetListOfPicksWithNoOwnedItems, _MakePicksParams, _EnableApply );\n\t};\n\n\tvar _UpdatePick = function( elPickemPanel, elPick, oGroupInfoForUpdate, oItemIdData, sectionIndex, groupIndex )\n\t{\n\t\tvar elName = elPick.FindChildInLayoutFile( 'id-team-name' );\n\t\tvar elLogoImage = elPick.FindChildInLayoutFile( 'id-team-logo' );\n\t\tvar localTeamId = oGroupInfoForUpdate.oGroupData.picks[0].localid;\n\t\t\n\t\tif ( typeof elPick._oteamData !== 'object' )\n\t\t{\n\t\t\telPick._oteamData = {};\n\t\t}\n\t\t\n\t\tif ( localTeamId )\n\t\t{\n\t\t\telPick._oteamData.teamid = localTeamId;\n\t\t\telLogoImage.RemoveClass( 'hidden' );\n\t\n\t\t\tPickemCommon.SetTeamImage(\n\t\t\t\telPickemPanel._oPickemData.oTournamentData.tournamentid,\n\t\t\t\telLogoImage,\n\t\t\t\telPick,\n\t\t\t\toItemIdData.type === 'fakeitem' ? oItemIdData.itemid : ''\n\t\t\t);\n\n\t\t\telName.RemoveClass( 'hidden' );\n\t\t\telName.text = PredictionsAPI.GetTeamName( localTeamId );\n\n\t\t\tif ( sectionIndex !== elPickemPanel._oPickemData.oTournamentData.sections.length - 1 )\n\t\t\t{\n\t\t\t\t_SetUpIsDraggable( elPickemPanel, elPick, oGroupInfoForUpdate.oGroupData );\n\t\t\t\t_SetUpMouseOverEvents( elPick );\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\telLogoImage.AddClass( 'hidden' );\n\t\t\telName.AddClass( 'hidden' );\n\t\t}\n\n\t\telPick._oteamData.picksectionindex = sectionIndex;\n\t\telPick._oteamData.pickgroupindex = groupIndex;\n\n\t\tvar isBracketActive = _SetIsLocked( elPickemPanel );\n\t\t\n\t\telPick.SetHasClass( 'pickem-pick-placed', localTeamId ? true : false );\n\t\telPick.SetHasClass( 'is-saved-pick', ( PickemCommon.IsPickSaved( oGroupInfoForUpdate.oGroupData.picks[0] ) && oGroupInfoForUpdate.oGroupData.canpick ));\n\t\telPick.GetParent().SetHasClass( 'pickem-pick-locked', !isBracketActive );\n\t};\n\n\tvar _SetIsLocked = function( elPickemPanel )\n\t{\n\t\tvar startIndex = elPickemPanel._oPickemData.oInitData.sectionindex;\n\t\treturn elPickemPanel._oPickemData.oTournamentData.sections[ startIndex ].isactive;\n\t};\n\n\tvar _ShowIfPickIsSaved = function( oGroupData, elPick )\n\t{\n\t\tif ( PickemCommon.IsPickSaved( oGroupData.picks[ 0 ] ) )\n\t\t{\n\t\t\telPick.RemoveClass( 'dragdrop' );\n\t\t\telPick.TriggerClass( 'pickem-group-pick-update' );\n\t\t}\n\t};\n\n\tvar _GetListOfPicksWithNoOwnedItems = function( elPickemPanel )\n\t{\n\t\t                                                                                                      \n\t\t                            \n\t\tvar startIndex = elPickemPanel._oPickemData.oInitData.sectionindex;\n\t\tvar oSectionData = elPickemPanel._oPickemData.oTournamentData.sections[ startIndex ];\n\t\tvar groupsCount = oSectionData.groups.length;\n\t\tvar aNotOwnedItems = [];\n\n\t\tfor ( var i = 0; i < groupsCount; i++ )\n\t\t{\n\t\t\tvar storeIndex = oSectionData.groups[ i ].picks[ 0 ].storedefindex;\n\t\t\t\n\t\t\tif ( storeIndex )\n\t\t\t{\n\t\t\t\taNotOwnedItems.push( oSectionData.groups[ i ].picks[ 0 ] );\n\t\t\t}\n\t\t}\n\n\t\treturn aNotOwnedItems;\n\t};\n\n\tvar _MakePicksParams = function( elPickemPanel, useFakeItems = false )\n\t{\n\t\tvar sectionCount = elPickemPanel._oPickemData.oTournamentData.sections.length;\n\t\tvar startIndex = elPickemPanel._oPickemData.oInitData.sectionindex;\n\t\tvar tournamentId = elPickemPanel._oPickemData.oTournamentData.tournamentid;\n\t\tvar args = [ tournamentId ];\n\t\tvar idsForDisplayInConfimPopup = [];\n\n\t\tfor ( var i = startIndex; i < sectionCount; i++ )\n\t\t{\n\t\t\tvar groupsList= elPickemPanel._oPickemData.oTournamentData.sections[ i ].groups;\n\t\t\tvar groupsCount = groupsList.length;\n\n\t\t\tfor ( var j = 0; j < groupsCount; j++ )\n\t\t\t{\n\t\t\t\tvar strStickerItemId = '';\n\t\t\t\tvar groupId = groupsList[ j ].id;\n\n\t\t\t\tif ( groupsList[ j ].picks[ 0 ].localid )\n\t\t\t\t{\t\n\t\t\t\t\t                                                    \n\t\t\t\t\tvar oItemIdData = PickemCommon.GetYourPicksItemIdData( \n\t\t\t\t\t\ttournamentId, \n\t\t\t\t\t\tgroupsList[j].picks[0].localid\n\t\t\t\t\t);\n\n\t\t\t\t\tstrStickerItemId = oItemIdData.type === 'fakeitem' && !useFakeItems ? '' : oItemIdData.itemid;\n\n\t\t\t\t\tif ( strStickerItemId && ( idsForDisplayInConfimPopup.indexOf( strStickerItemId ) === -1 ))\n\t\t\t\t\t{\n\t\t\t\t\t\tidsForDisplayInConfimPopup.push( strStickerItemId );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\targs.push( groupId, 0, strStickerItemId );                              \n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\targs: args,\n\t\t\tidsForDisplayInConfimPopup: idsForDisplayInConfimPopup\n\t\t};\n\t};\n\n\tvar _EnableApply = function( elPickemPanel )\n\t{\n\t\tvar tournamentNum = PickemCommon.GetTournamentIdNumFromString( elPickemPanel._oPickemData.oInitData.tournamentid );\n\n\t\tif ( tournamentNum >= 15 )\n\t\t{\n\t\t\tvar id = InventoryAPI.GetActiveTournamentCoinItemId( tournamentNum );\n\t\t\tif ( !id || id === '0' )\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tvar bFoundDifferenceToApply = false;\n\t\tvar strErrorString = null;\n\t\t\n\t\tvar sectionCount = elPickemPanel._oPickemData.oTournamentData.sections.length;\n\t\tvar startIndex = elPickemPanel._oPickemData.oInitData.sectionindex;\n\n\t\tfor ( var i = startIndex; i < sectionCount; i++ )\n\t\t{\n\t\t\tvar groupsList= elPickemPanel._oPickemData.oTournamentData.sections[ i ].groups;\n\t\t\tvar groupsCount = groupsList.length;\n\n\t\t\tfor ( var j = 0; j < groupsCount; j++ )\n\t\t\t{\n\t\t\t\tif ( !groupsList[j].picks[0].storedefindex )\n\t\t\t\t{\t                                                                  \n\t\t\t\t\tvar idLocal = groupsList[j].picks[0].localid;\n\t\t\t\t\tvar idSaved = groupsList[j].picks[0].savedid;\n\t\t\t\t\tif ( !idLocal ) idLocal = 0;\n\t\t\t\t\tif ( !idSaved ) idSaved = 0;\n\t\t\t\t\tif ( !idLocal && !strErrorString )\n\t\t\t\t\t{\n\t\t\t\t\t\t                                                                                                     \n\t\t\t\t\t\tstrErrorString = '#pickem_apply_emptyslots';\n\t\t\t\t\t}\n\t\t\t\t\tif( !bFoundDifferenceToApply && idLocal !== idSaved )\n\t\t\t\t\t{\n\t\t\t\t\t\t                                                                                                                                                                \n\t\t\t\t\t\tbFoundDifferenceToApply = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn bFoundDifferenceToApply ? ( strErrorString ? strErrorString : '#ok' ) : false;\n\t};\n\n\tvar _RemoveBracketsPicks = function ( elPickemPanel, elPick )\n\t{\n\t\t$.DispatchEvent( 'CSGOPlaySoundEffect', 'sticker_applySticker', 'MOUSE' );\n\n\t\tfunction ResetLocalId ( oGroupData, elPick )\n\t\t{\n\t\t\tif ( oGroupData.picks[ 0 ].localid === elPick._oteamData.teamid )\n\t\t\t{\n\t\t\t\toGroupData.picks[ 0 ].localid = 0;\n\t\t\t}\n\t\t}\n\n\t\tvar sectionIndex = elPick._oteamData.picksectionindex;\n\t\tvar groupIndex = elPick._oteamData.pickgroupindex;\n\t\tvar oGroupData = elPickemPanel._oPickemData.oTournamentData.sections[ sectionIndex ].groups[ groupIndex ];\n\t\tResetLocalId( oGroupData, elPick );\n\t\t\n\t\tvar validTargets = _GetTargetsList( elPick.GetParent() );\n\t\tvar targetCount = validTargets.length;\n\n\t\tfor ( var i = 0; i < targetCount; i++ )\n\t\t{\n\t\t\tvar elValidTarget = elPickemPanel.FindChildInLayoutFile( validTargets[ i ] );\n\t\t\tsectionIndex = elValidTarget._oteamData.picksectionindex;\n\t\t\tgroupIndex = elValidTarget._oteamData.pickgroupindex;\n\t\t\toGroupData = elPickemPanel._oPickemData.oTournamentData.sections[ sectionIndex ].groups[ groupIndex ];\n\n\t\t\tResetLocalId( oGroupData, elPick );\n\t\t}\n\n\t\t_UpdateAllSections( elPickemPanel );\n\t};\n\n\tvar _GetDataNeededToUpdateTeams = function ( elPickemPanel, sectionIndex, groupIndex )\n\t{\n\t\treturn {\n\t\t\toGroupData: elPickemPanel._oPickemData.oTournamentData.sections[ sectionIndex ].groups[ groupIndex ],\n\t\t\ttournamentId: elPickemPanel._oPickemData.oTournamentData.tournamentid,\n\t\t\tstartIndex: elPickemPanel._oPickemData.oInitData.sectionindex\n\t\t};\n\t};\n\n\tvar _SetUpIsDraggable = function( elPickemPanel, elTeam, oGroupData )\n\t{\t\n\t\tif ( !oGroupData.canpick )\n\t\t{\n\t\t\telTeam.IsDraggable = false;\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif ( elTeam._oteamData.dragStartHandle )\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\telTeam.IsDraggable = true;\n\n\t\telTeam._oteamData.dragStartHandle = $.RegisterEventHandler( 'DragStart', elTeam, function ( targetId, obj ) {\n\t\t\t\n\t\t\tvar elDraggable = $.CreatePanel( \"Panel\", elTeam, 'draggable' + elTeam._oteamData.teamid, {\n\t\t\t\tclass: 'pickem-bracket-draggable'\n\t\t\t} );\n\t\t\t\n\t\t\t$.CreatePanel( \"Image\", elDraggable, 'draggable' + elTeam._oteamData.teamid, {\n\t\t\t\tsrc: PickemCommon.GetTeamImage( elTeam ),\n\t\t\t\tclass: 'vertical-center',\n\t\t\t\ttextureheight: '48',\n\t\t\t\ttexturewidth: '48'\n\t\t\t} );\n\n\t\t\t$.CreatePanel( \"Label\", elDraggable, 'draggable' + elTeam._oteamData.teamid, {\n\t\t\t\ttext: PredictionsAPI.GetTeamName( elTeam._oteamData.teamid ),\n\t\t\t\tclass: 'pickem-bracket-team__name'\n\t\t\t} );\n\n\t\t\tif ( typeof elDraggable._oteamData !== 'object' )\n\t\t\t{\n\t\t\t\telDraggable._oteamData = {};\n\t\t\t}\n\t\t\t\n\t\t\telDraggable._oteamData = elTeam._oteamData;\n\t\t\telDraggable._oteamData.validtargets = _GetTargetsList( elTeam.GetParent() );\n\n\t\t\tobj.displayPanel = elDraggable;\n\t\t\tobj.removePositionBeforeDrop = false;\n\t\t\telDraggable.AddClass( 'dragstart' );\n\n\t\t\t_HighlightValidTargets( elPickemPanel, elTeam, true );\n\t\t} );\n\n\t\telTeam._oteamData.dragEndHandle = $.RegisterEventHandler( 'DragEnd', elTeam, function ( targetId, obj ) {\n\t\t\tobj.AddClass( 'dragend' );\n\t\t\t_HighlightValidTargets( elPickemPanel, elTeam, false );\n\t\t\tobj.DeleteAsync( 0.25 );\n\t\t} );\n\t};\n\n\tvar _SetUpMouseOverEvents = function( elTeam )\n\t{\n\t\tvar elImage = elTeam.FindChildInLayoutFile( 'id-team-logo' );\n\t\tvar elLabel = elTeam.FindChildInLayoutFile( 'id-team-name' );\n\t\t\n\t\tvar OnMouseOver = function( elTeam )\n\t\t{\n\t\t\tif( elTeam.IsDraggable )\n\t\t\t{\n\t\t\t\telImage.AddClass( 'pickem-group-pick--wiggle' );\n\t\t\t\telLabel.AddClass( 'pickem-group-pick--wiggle' );\n\t\t\t}\n\t\t};\n\n\t\tvar OnMouseOut = function ( elTeam ) \n\t\t{\n\t\t\telImage.RemoveClass( 'pickem-group-pick--wiggle' );\n\t\t\telLabel.RemoveClass( 'pickem-group-pick--wiggle' );\n\t\t};\n\n\t\telTeam.SetPanelEvent( 'onmouseover', OnMouseOver.bind( undefined, elTeam ) );\n\t\telTeam.SetPanelEvent( 'onmouseout', OnMouseOut.bind( undefined, elTeam ) );\n\t};\n\n\tvar _HighlightValidTargets = function( elPickemPanel, elTeam, showTargets )\n\t{\n\t\tvar targetsList = _GetTargetsList ( elTeam.GetParent() );\n\t\tif ( targetsList )\n\t\t{\n\t\t\tfor ( var i = 0; i < targetsList.length; i++ )\n\t\t\t{\n\t\t\t\telPickemPanel.FindChildInLayoutFile( targetsList[ i ] ).SetHasClass( 'drag-valid-target', showTargets );\n\t\t\t}\n\t\t}\n\t};\n\n\tvar _GetTargetsList = function ( elGroup )\n\t{\n\t\tvar targets = elGroup.GetAttributeString( 'data-valid-targets', '' );\n\t\tif ( !targets )\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\treturn targets.split( ',' );\n\t};\n\n\tvar _SetUpDragTargets = function( elPickemPanel, elPick )\n\t{\t\t\n\t\tif ( typeof elPickemPanel._odraggableData !== 'object' )\n\t\t{\n\t\t\telPickemPanel._odraggableData = {};\n\t\t}\n\n\t\tvar _DragEnter = function( elDragTarget )\n\t\t{\n\t\t\telDragTarget.AddClass( 'dragenter' );\n\n\t\t\t                                                                                           \n\t\t\telPickemPanel._odraggableData.dragtarget = elDragTarget;\n\t\t};\n\n\t\tvar _DragLeave = function( elDragTarget )\n\t\t{\n\t\t\telDragTarget.RemoveClass( 'dragenter' );\n\t\t\telPickemPanel._odraggableData.dragtarget = null;\n\t\t};\n\n\t\t\t$.RegisterEventHandler(\n\t\t\t\t'DragEnter',\n\t\t\t\telPick,\n\t\t\t\t_DragEnter.bind( undefined, elPick )\n\t\t\t);\n\t\t\t\n\t\t\t$.RegisterEventHandler(\n\t\t\t\t'DragLeave',\n\t\t\t\telPick,\n\t\t\t\t_DragLeave.bind( undefined, elPick )\n\t\t\t);\n\t\t\n\t\t\t$.RegisterEventHandler(\n\t\t\t\t'DragDrop',\n\t\t\t\telPick,\n\t\t\t\tfunction( dispayId, elDisplay )\n\t\t\t\t{\n\t\t\t\t\t                                  \n\t\t\t\t\t                                      \n\t\t\n\t\t\t\t\t_PlaceTempPick( elPickemPanel, elDisplay );\n\t\t\t\n\t\t\t\t}\n\t\t\t);\n\t};\n\n\tvar _PlaceTempPick = function( elPickemPanel, elDisplay )\n\t{\n\t\tvar validTargets = elDisplay._oteamData.validtargets;\n\t\tvar tournamentId = elPickemPanel._oPickemData.oTournamentData.tournamentid;\n\t\tfor( var i = 0; i < validTargets.length; i++ )\n\t\t{\n\t\t\tif ( elPickemPanel._odraggableData.dragtarget && elPickemPanel._odraggableData.dragtarget.IsValid() )\n\t\t\t{\n\t\t\t\tif ( validTargets[ i ] === elPickemPanel._odraggableData.dragtarget.id )\n\t\t\t\t{\n\t\t\t\t\t$.DispatchEvent( 'CSGOPlaySoundEffect', 'sticker_applySticker', 'MOUSE' );\n\t\t\t\t\tvar teamsInGroup = '';\n\n\t\t\t\t\tvar foundPick = false;\n\t\t\t\t\tfor ( var j = 0; j < validTargets.length; j++ )\n\t\t\t\t\t{\n\t\t\t\t\t\tvar elValidTarget = elPickemPanel.FindChildInLayoutFile( validTargets[ j ] );\n\t\t\t\t\t\tvar sectionIndex = elValidTarget._oteamData.picksectionindex;\n\t\t\t\t\t\tvar groupIndex = elValidTarget._oteamData.pickgroupindex;\n\t\t\t\t\t\tvar oGroupData = elPickemPanel._oPickemData.oTournamentData.sections[ sectionIndex ].groups[ groupIndex ];\n\n\t\t\t\t\t\tif ( ( oGroupData.picks[ 0 ].localid !== elDisplay._oteamData.teamid ) && !foundPick )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\toGroupData.picks[ 0 ].localid = elDisplay._oteamData.teamid;\n\n\t\t\t\t\t\t\tteamsInGroup = elValidTarget.GetAttributeString( 'data-teams-in-group', '' );\n\t\t\t\t\t\t\telValidTarget.TriggerClass( 'dragdrop' );\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if ( _IsTeamIsFromSameGroup( elPickemPanel, teamsInGroup, oGroupData.picks[ 0 ].localid ) )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\toGroupData.picks[ 0 ].localid = 0;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( validTargets[ j ] === elPickemPanel._odraggableData.dragtarget.id )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfoundPick = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\n\t\t\t\t\t_UpdateAllSections( elPickemPanel );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tvar _IsTeamIsFromSameGroup = function ( elPickemPanel, teamsInGroup, localId )\n\t{\n\t\tif( !teamsInGroup )\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\tvar teamsList = teamsInGroup.split(',');\n\t\tvar count = teamsList.length;\n\n\t\tfor( var i = 0; i < count; i++ )\n\t\t{\n\t\t\tvar elTeam = elPickemPanel.FindChildInLayoutFile( teamsList[i] );\n\t\t\t\n\t\t\tif( elTeam && ( elTeam._oteamData.teamid === localId ) )\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tvar _UpdatePicksWorth = function( elPickemPanel )\n\t{\n\t\tvar fistDayOfBracketIndex = elPickemPanel._oPickemData.oInitData.sectionindex;\n\t\tvar sectionCount = elPickemPanel._oPickemData.oTournamentData.sections.length - fistDayOfBracketIndex;\n\n\t\tfor( var i = 0; i < sectionCount; i++ )\n\t\t{\n\t\t\tvar elLabel = elPickemPanel.FindChildInLayoutFile( 'id-pickem-group-worth' + i );\n\t\t\tvar points = elPickemPanel._oPickemData.oTournamentData.sections[ i + fistDayOfBracketIndex ].groups[ 0 ].pickworth;\n\n\t\t\tPickemCommon.SetPointsWorth( elLabel, points, elPickemPanel._oPickemData.oInitData.tournamentid, i + fistDayOfBracketIndex );\n\t\t}\n\t};\n\n\tvar _UpdatePrediction = function( elPickemPanel )\n\t{\n\t\t                                      \n\n\t\tif( !elPickemPanel._oPickemData.oTournamentData )\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tvar sectionCount = elPickemPanel._oPickemData.oTournamentData.sections.length;\n\n\t\tfor ( var i = 0; i < sectionCount; i++ )\n\t\t{\n\t\t\tvar groupsList= elPickemPanel._oPickemData.oTournamentData.sections[ i ].groups;\n\t\t\tvar groupsCount = groupsList.length;\n\n\t\t\tfor ( var j = 0; j < groupsCount; j++ )\n\t\t\t{\n\t\t\t\tvar userPickTeamID = PredictionsAPI.GetMyPredictionTeamID(\n\t\t\t\t\telPickemPanel._oPickemData.oInitData.tournamentid,\n\t\t\t\t\tgroupsList[ j ].id,\n\t\t\t\t\t0\n\t\t\t\t);\n\n\t\t\t\tgroupsList[ j ].picks[ 0 ].savedid = userPickTeamID;\n\t\t\t}\n\t\t}\n\n\t\t_UpdateAllSections( elPickemPanel, true );\n\t};\n\n\tvar _PurchaseComplete = function( elPickemPanel )\n\t{\n\t\t_UpdateAllSections( elPickemPanel );\n\t};\n\n\treturn {\n\t\tInit: _Init,\n\t\tUpdatePrediction : _UpdatePrediction,\n\t\tPurchaseComplete : _PurchaseComplete\n\t};\n\n} )();\n","scripts/tournaments/pickem_common.js":"\n                                       \n'use strict';\n\nvar PickemCommon = ( function()\n{\n\tvar _Init = function( elPanel )\n\t{\n\t\telPanel._oPickemData.timerhandle = null;\n\t\t_IsDataLoaded( elPanel );\n\t};\n\n\tvar _RefreshData = function( elPanel )\n\t{\n\t\t_IsDataLoaded( elPanel );\n\t};\n\n\tvar _IsDataLoaded = function( elPanel )\n\t{\n\t\tvar listState = MatchListAPI.GetState( elPanel._oPickemData.oInitData.tournamentid  );\n\t\tvar elLoadingStatus = elPanel.FindChildInLayoutFile( 'id-pickem-loading-status' );\n\t\tvar elPickemContent = elPanel.FindChildInLayoutFile( 'id-pickem-content' );\n\t\t_DefaultActionBarBtnsState(elPanel);\n\n\t\telLoadingStatus.visible = true;\n\t\telPickemContent.visible = false;\n\n\t\t                                             \n\n\t\tif ( listState === 'none' )\n        {\n\t\t\tMatchListAPI.Refresh( elPanel._oPickemData.oInitData.tournamentid  );\n\t\t\t\n\t\t\t_CancelMatchStatsLoadedTimeout( elPanel );\n\t\t\telPanel._oPickemData.timerhandle = $.Schedule( 5, _MatchStatsLoadedTimeout.bind( undefined, elPanel ) );\n\n\t\t\t_UpdateLoadingStatusMessage( elPanel, $.Localize( '#CSGO_Watch_Loading_PickEm' ), true );\n\t\t\treturn false;\n\t\t}\n\t\telse if ( listState === 'ready' )\n\t\t{\n\t\t\tvar isLoaded = PredictionsAPI.GetMyPredictionsLoaded( elPanel._oPickemData.oInitData.tournamentid );\n\t\t\tvar sectionsCount = PredictionsAPI.GetEventSectionsCount( elPanel._oPickemData.oInitData.tournamentid );\n\n\t\t\t                                              \n\t\t\t                                                  \n\t\t\n\t\t\tif ( !isLoaded || !sectionsCount || elPanel._oPickemData.oInitData.sectionindex === -1 )\n\t\t\t{\n\t\t\t\t_CancelMatchStatsLoadedTimeout( elPanel );\n\t\t\t\telPanel._oPickemData.timerhandle = $.Schedule( 5, _MatchStatsLoadedTimeout.bind( undefined, elPanel ) );\n\t\t\t\t\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t_CancelMatchStatsLoadedTimeout( elPanel );\n\n\t\t\telPanel._oPickemData.oTournamentData = _MakeTournamentDataObject( elPanel._oPickemData.oInitData.tournamentid );\n\n\t\t\t                                                                   \n\t\t\t                                                                        \n\t\t\telPanel._oPickemData.oInitData.oPickemType.Init( elPanel );\n\t\t\tPickEmInfoBar.Init( elPanel );\n\t\t\telLoadingStatus.visible = false;\n\t\t\telPickemContent.visible = true;\n\t\t\treturn true;\n\t\t}\n\t};\n\n\tvar _MakeTournamentDataObject = function( tournamentid )\n    {\n        var tournamentId = tournamentid;\n\n        var aSections = [];\n        var sectionsCount = PredictionsAPI.GetEventSectionsCount( tournamentId );\n        for ( var i = 0; i < sectionsCount; i++ )\n        {\n            aSections.push( _GetSectionData( tournamentId, i ) );\n        }\n\n        return {\n            tournamentid: tournamentId,\n            sections: aSections\n        };\n    }\n\n    var _GetSectionData = function( tournamentId, dayIndex )\n    {\n        var sectionId = PredictionsAPI.GetEventSectionIDByIndex( tournamentId, dayIndex );\n\n        var aGroups = [];\n        var groupsCount = PredictionsAPI.GetSectionGroupsCount( tournamentId, sectionId );\n        for ( var i = 0; i < groupsCount; i++ )\n        {\n            aGroups.push( _GetGroupData( tournamentId, sectionId, i ) );\n        }\n\n        return {\n            dayindex: dayIndex,\n            sectionid: sectionId,\n            isactive: PredictionsAPI.GetSectionIsActive( tournamentId, sectionId ),\n            name: PredictionsAPI.GetSectionName( tournamentId, sectionId ),\n            desc: PredictionsAPI.GetSectionDesc( tournamentId, sectionId ),\n            groups: aGroups\n        };\n    };\n\n    var _GetGroupData = function( tournamentId, sectionId, idx )\n    {\n        var groupId = PredictionsAPI.GetSectionGroupIDByIndex( tournamentId, sectionId, idx );\n\n        var aPicks = [];\n        var picksCount = PredictionsAPI.GetGroupPicksCount( tournamentId, groupId );\n        for ( var i = 0; i < picksCount; i++ )\n        {\n            var userPickTeamID = PredictionsAPI.GetMyPredictionTeamID( tournamentId, groupId, i );\n\n                                                                                                 \n                                                        \n            userPickTeamID = userPickTeamID === undefined ? 0 : userPickTeamID;\n            aPicks.push( {\n                savedid: userPickTeamID,\n                localid: userPickTeamID,\n                storedefindex: undefined,\n            } );\n\t\t}\n\n        return {\n\t\t\tid: groupId,\n\t\t\tpickscount: picksCount,\n\t\t\tteamscount:  PredictionsAPI.GetGroupTeamsCount( tournamentId, groupId),\n            canpick: PredictionsAPI.GetGroupCanPick( tournamentId, groupId ),\n            pickworth: PredictionsAPI.GetGroupPickWorth( tournamentId, groupId ),\n            name: PredictionsAPI.GetGroupName( tournamentId, groupId ),\n            desc: PredictionsAPI.GetGroupDesc( tournamentId, groupId ),\n            picks: aPicks\n        };\n    };\n\n\tvar _MatchStatsLoadedTimeout = function( elPanel )\n\t{\n\t\telPanel._oPickemData.timerhandle = null;\n\t\t_UpdateLoadingStatusMessage( elPanel, $.Localize( '#pickem_apply_timeout' ), false );\n\t};\n\n\tvar _CancelMatchStatsLoadedTimeout = function( elPanel )\n\t{\n\t\tif ( elPanel._oPickemData.timerhandle )\n\t\t{\n\t\t\t$.CancelScheduled( elPanel._oPickemData.timerhandle );\n\t\t\telPanel._oPickemData.timerhandle = null;\n\t\t}\n\t};\n\n\tvar _UpdateLoadingStatusMessage = function( elPanel, messageText, showSpinner )\n\t{\n\t\tvar elLoadingStatus = elPanel.FindChildInLayoutFile( 'id-pickem-loading-status' );\n\t\telLoadingStatus.FindChildInLayoutFile( 'Message' ).text = messageText;\n\n\t\tvar elLoadingStatus = elPanel.FindChildInLayoutFile( 'id-pickem-loading-status' );\n\t\telLoadingStatus.FindChildInLayoutFile( 'Spinner' ).visible = showSpinner;\n\t};\n\n\tvar _ReadyForDisplay = function( elPanel )\n\t{\n\t\telPanel._oPickemData.eventhandle = $.RegisterForUnhandledEvent(\n\t\t\t'PanoramaComponent_MatchList_StateChange',\n\t\t\t_RefreshData.bind( undefined, elPanel )\n\t\t);\n\t\t\n\t\t                                                                   \n\t\t                                                                        \n\t\telPanel._oPickemData.eventhandleprediction = $.RegisterForUnhandledEvent( \n\t\t\t'PanoramaComponent_MatchList_PredictionUploaded', \n\t\t\telPanel._oPickemData.oInitData.oPickemType.UpdatePrediction.bind( undefined, elPanel )\n\t\t);\n\n\t\telPanel._oPickemData.eventhandlepurchaseUpdate = $.RegisterForUnhandledEvent( \n\t\t\t'PanoramaComponent_Store_PurchaseCompleted', \n\t\t\telPanel._oPickemData.oInitData.oPickemType.PurchaseComplete.bind( undefined, elPanel )\n\t\t);\n\n\t\telPanel._oPickemData.eventhandleinventoryUpdate = $.RegisterForUnhandledEvent(\n\t\t\t'PanoramaComponent_MyPersona_InventoryUpdated', \n\t\t\telPanel._oPickemData.oInitData.oPickemType.PurchaseComplete.bind( undefined, elPanel )\n\t\t);\n\n\t\tif( PredictionsAPI.GetMyPredictionsLoaded( elPanel._oPickemData.oInitData.tournamentid ) )\n\t\t{\n\t\t\telPanel._oPickemData.oInitData.oPickemType.UpdatePrediction( elPanel );\n\t\t}\n\t};\n\n\tvar _UnreadyForDisplay = function( elPanel )\n\t{\n\t\t                                                                                \n\t\t                                                                                                         \n\t\t                                                                                                             \n\t\t                                                             \n\t};\n\n\tvar _UnregisterEvents = function( elPanel )\n\t{\n\t\t                                                                                                                                 \n\t\t$.UnregisterForUnhandledEvent( 'PanoramaComponent_MatchList_StateChange', elPanel._oPickemData.eventhandle );\n\t\t$.UnregisterForUnhandledEvent('PanoramaComponent_MatchList_PredictionUploaded', elPanel._oPickemData.eventhandleprediction );\n\t\t$.UnregisterForUnhandledEvent('PanoramaComponent_Store_PurchaseCompleted', elPanel._oPickemData.eventhandlepurchaseUpdate );\n\t\t$.UnregisterForUnhandledEvent('PanoramaComponent_MyPersona_InventoryUpdated', elPanel._oPickemData.eventhandleinventoryUpdate );\n\t};\n\n\t                         \n\n\tvar _UpdateImageForPick = function( oItemIdData, elItemImage, localTeamId, useSvg = false )\n\t{\n\t\tvar bValidTeamID = localTeamId ? ( oItemIdData.itemid ? true : false ) : false;\n\n\t\tif ( bValidTeamID )\n\t\t{\n\t\t\tif ( useSvg )\n\t\t\t{\n\t\t\t\tvar teamTag = PredictionsAPI.GetTeamTag( localTeamId );\n\t\t\t\telItemImage.SetImage( 'file://{images}/tournaments/teams/' + teamTag + '.svg' );\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\telItemImage.itemid = oItemIdData.itemid;\n\t\t\t}\n\n\t\t}\n\n\t\telItemImage.SetHasClass( 'hidden', !bValidTeamID );\n\t\telItemImage.SetHasClass( 'teamlogo', useSvg )\n\t};\n\n\tvar _UpdateCorrectPickState = function ( tournamentId, oGroupData, correctPicks, localTeamId, elPointsEarned, showOnlyNumbers )\n\t{\n\t\tif ( correctPicks )\n\t\t{\n\t\t\tvar isCorrect = _CheckIfPickIsCorrect( correctPicks, localTeamId );\n\t\t\telPointsEarned.SetHasClass( 'hidden', !isCorrect );\n\n\t\t\tif ( isCorrect )\n\t\t\t{\n\t\t\t\tvar tournamentNum = PickemCommon.GetTournamentIdNumFromString( tournamentId );\n\t\t\t\tif ( tournamentNum >= 15 )\n\t\t\t\t{\n\t\t\t\t\telPointsEarned.text = $.Localize( '#pickem_correct_pick' );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif ( showOnlyNumbers )\n\t\t\t\t{\n\t\t\t\t\telPointsEarned.text = '+ ' + oGroupData.pickworth;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tvar pluralString = oGroupData.pickworth === 1 ? $.Localize( '#pickem_point' ) : $.Localize( '#pickem_points' );\n\t\t\t\telPointsEarned.SetDialogVariableInt( 'points', oGroupData.pickworth );\n\t\t\t\telPointsEarned.SetDialogVariable( 'plural', pluralString );\n\t\t\t}\n\t\t}\n\t};\n\n\tvar _ShowPickItemNotOwnedWarning = function( isSectionActive, oGroupData, oItemIdData, elItemNotOwned, localTeamId )\n\t{\n\t\t\n\t\tif ( isSectionActive && oGroupData.canpick && localTeamId )\n\t\t{\n\t\t\tif( oItemIdData.type === 'fakeitem' )\n\t\t\t{\n\t\t\t\telItemNotOwned.RemoveClass( 'hidden' );\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\telItemNotOwned.AddClass( 'hidden' );\n\t\treturn false;\n\t};\n\n\tvar _SetPointsWorth = function( elLabel, points, tournamentid, sectionindex )\n\t{\n\t\tvar tournamentNum = PickemCommon.GetTournamentIdNumFromString( tournamentid );\n\t\tif ( tournamentNum >= 15 )\n\t\t{\n\t\t\t_SetTournamentSpecificRules( elLabel, sectionindex );\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tvar pluralString = points === 1 ? $.Localize( '#pickem_point' ) : $.Localize( '#pickem_points' );\n\t\telLabel.SetDialogVariableInt( 'points', points );\n\t\telLabel.SetDialogVariable( 'plural', pluralString );\n\t};\n\n\tvar _SetTournamentSpecificRules = function( elLabel, sectionindex )\n\t{\n\t\tif ( sectionindex === 0 )\n\t\t{\n\t\t\telLabel.text = '#CSGO_TournamentChallenge_katowice2019_challengers_pickem';\n\t\t}\n\n\t\tif ( sectionindex === 1 )\n\t\t{\n\t\t\telLabel.text = '#CSGO_TournamentChallenge_katowice2019_legends_pickem';\n\t\t}\n\n\t\tif ( sectionindex === 2 )\n\t\t{\n\t\t\telLabel.text = '#CSGO_TournamentChallenge_katowice2019_quarterfinals_pickem';\n\t\t}\n\n\t\tif ( sectionindex === 3 )\n\t\t{\n\t\t\telLabel.text = '#CSGO_TournamentChallenge_katowice2019_semifinals_pickem';\n\t\t}\n\n\t\tif ( sectionindex === 4 )\n\t\t{\n\t\t\telLabel.text = '#CSGO_TournamentChallenge_katowice2019_grandfinal_pickem';\n\t\t}\n\t};\n\n\tvar _SetTeamImage = function ( tournamentId, elLogoImage, elTeam, useFakeItemId = '' )\n\t{\n\t\tvar szImageToUse = null;\n\t\tvar yourItemId = PredictionsAPI.GetMyPredictionItemIDForTeamID( tournamentId, elTeam._oteamData.teamid, null );\n\t\tvar tournamentNum = PickemCommon.GetTournamentIdNumFromString( tournamentId );\n\n\t\tif ((( !yourItemId || yourItemId === '0' || yourItemId === 0 ) && !useFakeItemId ) || tournamentNum >= 15 )\n\t\t{\n\t\t\tszImageToUse = _GetTeamImage( elTeam );\n\t\t\telLogoImage.AddClass( 'barelogo' );\n\t\t}\n\t\telse\n\t\t{\n\t\t\tyourItemId = ( useFakeItemId !== '' ) ? useFakeItemId : yourItemId;\n\n\t\t\tszImageToUse = 'file://{images}/'+InventoryAPI.GetItemInventoryImage( yourItemId )+'.png';\n\t\t\telLogoImage.RemoveClass( 'barelogo' );\n\t\t}\n\t\telLogoImage.SetImage( szImageToUse );\n\t};\n\n\tvar _GetTeamImage = function( elTeam )\n\t{\n\t\tvar teamTag = PredictionsAPI.GetTeamTag( elTeam._oteamData.teamid );\n\t\treturn 'file://{images}/tournaments/teams/' + teamTag + '.svg';\n\t};\n\t\n\n\tvar _GetTeamItemDefIndex = function( teamId )\n\t{\n\t\tvar team = g_ActiveTournamentTeams.filter( team => team.teamid === teamId );\n\t\treturn team[0].itemid_sticker;\n\t};\n\n\tvar _ShowHideRemoveBtn = function ( isSectionActive, canPick, localTeamId, elRemoveButton )\n\t{\n\t\tvar showRemoveBtn = ( isSectionActive && canPick && localTeamId ) ? true : false;\n\t\telRemoveButton.SetHasClass( 'hidden', !showRemoveBtn );\n\n\t\treturn showRemoveBtn;\n\t};\n\n\tvar _UpdateRemoveBtn = function ( elPanel, oGroupData, localTeamId, elRemoveButton, funcCallback )\n\t{\n\t\telRemoveButton.SetPanelEvent( 'onactivate', _RemovePick.bind( undefined, elPanel, oGroupData, localTeamId, funcCallback ) );\n\t};\n\n\tvar _RemovePick = function ( elPanel, oGroupData, localTeamId, funcCallback )\n\t{\n\t\t$.DispatchEvent( 'CSGOPlaySoundEffect', 'sticker_applySticker', 'MOUSE' );\n\n\t\t                                   \n\t\t                                           \n\n\t\tfor ( var i = 0; i < oGroupData.picks.length; i++ )\n\t\t{\n\t\t\tif ( oGroupData.picks[i].localid === localTeamId )\n\t\t\t{\n\t\t\t\toGroupData.picks[i].localid = 0;\n\t\t\t}\n\t\t}\n\n\t\tfuncCallback( elPanel );\n\t};\n\n\tvar _CheckIfPickIsCorrect = function( correctPicks, userPickTeamID )\n\t{\n\t\tvar aCorrectPicks = correctPicks.split( ',' );\n\t\tvar correctPicksCount = aCorrectPicks.length;\n\n\t\tfor ( var i = 0; i < correctPicksCount; i++ )\n\t\t{\n\t\t\tif ( aCorrectPicks[ i ] === userPickTeamID.toString() )\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t};\n\n\tvar _IsPickSaved = function( oPick )\n\t{\t\n\t\tif( ( oPick.localid === oPick.savedid ) && oPick.localid !== 0 && oPick.localid !== undefined )\n\t\t{\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t};\n\n\tvar _GetYourPicksItemIdData = function( tournamentId, userPickTeamID )\n\t{\n\t\tvar yourItemId = PredictionsAPI.GetMyPredictionItemIDForTeamID( tournamentId, userPickTeamID, null );\n\n\t\t                                                                                             \n\t\tif ( !yourItemId || yourItemId === '0' || yourItemId === 0 ||\n\t\t\tPickemCommon.GetTournamentIdNumFromString( tournamentId ) >= 15 )\n\t\t{\n\t\t\tyourItemId = PredictionsAPI.GetFakeItemIDToRepresentTeamID( tournamentId, userPickTeamID );\n\t\t\treturn { type:'fakeitem', itemid:yourItemId };\n\t\t}\n\t\t\n\t\treturn { type:'owneditem', itemid:yourItemId };\n\t};\n\n\tvar _GetTournamentIdNumFromString = function( tournament_id )\n\t{\n\t\treturn Number( tournament_id.split( ':' )[ 1 ] );\n\t};\n\n\tvar _CheckIfTeamIsAlreadyPicked = function ( oGroupData, teamIdToCompare )\n\t{\t\t\n\t\tfor ( var i = 0; i < oGroupData.pickscount; i++)\n\t\t{\t\n\t\t\tif ( oGroupData.picks[i].localid === teamIdToCompare )\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\n\t\treturn false;\n\t};\n\t\n\tvar _DefaultActionBarBtnsState = function(elPanel)\n\t{\n\t\tvar elPurchase = elPanel.FindChildInLayoutFile( 'id-pickem-getitems' );\n\t\tvar elApply = elPanel.FindChildInLayoutFile( 'id-pickem-apply' );\n\t\telPurchase.visible = false;\n\t\telApply.visible = false;\n\t};\n\n\tvar _UpdateActionBarBtns = function( elPanel, _funcListOfPicksWithNoOwnedItems, _funcMakePicksParams, _funcEnableApply )\n\t{\n\t\tvar tournamentNum = PickemCommon.GetTournamentIdNumFromString( elPanel._oPickemData.oInitData.tournamentid );\n\t\tvar elPurchase = elPanel.FindChildInLayoutFile( 'id-pickem-getitems' );\n\t\tvar elApplyPicks = elPanel.FindChildInLayoutFile( 'id-pickem-apply' );\n\n\t\tif ( tournamentNum >= 15 )\n\t\t{\n\t\t\t_UpdatePurchaseBtnForPass( elPurchase, tournamentNum );\n\t\t\t_UpdateApplyBtnForPass( elPanel, elApplyPicks, tournamentNum, _funcMakePicksParams );\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar listStoreIndex = _funcListOfPicksWithNoOwnedItems( elPanel );\n\t\t\tvar bShow = listStoreIndex.length > 0;\n\n\t\t\tif ( elPurchase.visible !== bShow )\n\t\t\t\telPurchase.TriggerClass( 'popup-capability-update-anim' );\n\n\t\t\telPurchase.visible = bShow;\n\t\t\t_MouseOverEventsWithStickersToPurchase( elPurchase, 'id-pickem-getitems', listStoreIndex );\n\t\t\t_EventsForPurchaseBtn( elPurchase, listStoreIndex );\n\n\t\t\t_EventsForApplyBtn( elPanel, elApplyPicks, _funcListOfPicksWithNoOwnedItems, _funcMakePicksParams );\n\t\t\t_MouseOverEventsWithStickersToPurchase( elApplyPicks, 'id-pickem-apply', listStoreIndex );\n\t\t}\n\n\t\t  \n\t\t                                                           \n\t\t                                           \n\t\t                                 \n\t\t                                                                                          \n\t\t  \n\t\tvar strEnable = _funcEnableApply( elPanel );\n\t\tvar bEnable = ( strEnable ? true : false );\n\t\telApplyPicks.visible = true;\n\t\telApplyPicks.SetHasClass( 'loop', bEnable );\n\t\t\n\t\tif( elApplyPicks.enabled !== bEnable )\n\t\t\telApplyPicks.TriggerClass( 'popup-capability-update-anim' );\n\n\t\t                                                                                               \n\t\t                                    \n\n\t\telApplyPicks.enabled = bEnable;\n\n\t\tvar bErrorButHasDifferencesToApply = ( bEnable && strEnable !== '#ok' );\n\t\telApplyPicks.SetHasClass( 'errorenabled', bErrorButHasDifferencesToApply );\n\t\tif ( bErrorButHasDifferencesToApply )\n\t\t{\n\t\t\telApplyPicks.SetPanelEvent( 'onactivate', function() {\n\t\t\t\tUiToolkitAPI.ShowGenericPopupOk(\n\t\t\t\t\t$.Localize( '#CSGO_PickEm_Title' ),\n\t\t\t\t\t$.Localize( strEnable ),\n\t\t\t\t\t'',\n\t\t\t\t\tfunction() {},\n\t\t\t\t\tfunction() {}\n\t\t\t\t);\n\t\t\t} );\n\t\t}\n\t};\n\n\tvar _UpdatePurchaseBtnForPass = function( elPurchase, tournamentNum )\n\t{\n\t\tvar _ShowInpsectPopup = function( id )\n\t\t{\n\t\t\t                                                \n\t\t\t   \t   \n\t\t\t   \t                                                               \n\t\t\t   \t              \n\t\t\t   \t       \n\t\t\t   \t                   \n\t\t\t   \t       \n\t\t\t   \t                         \n\t\t\t   \t       \n\t\t\t   \t                    \n\t\t\t   \t      \n\t\t\t     \n\n\t\t\t$.DispatchEvent( 'ShowTournamentStore' );\n\t\t\t$.DispatchEvent( 'ShowTournamentStorePassPopup' );\n\t\t};\n\t\n\t\tvar _ActivatePass = function ( id )\n\t\t{\n\t\t\tUiToolkitAPI.ShowCustomLayoutPopupParameters(\n\t\t\t\t'',\n\t\t\t\t'file://{resources}/layout/popups/popup_capability_decodable.xml',\n\t\t\t\t'key-and-case=,' + id +\n\t\t\t\t'&' + 'asyncworktype=decodeable'\n\t\t\t);\n\t\t};\n\n\t\t                                                                                  \n\t\tvar _OpenContextMenu = function()\n\t\t{\n\t\t\tvar usetinynames = true;\n\t\t\tvar itemId = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex( g_ActiveTournamentInfo.itemid_pass, 0 );\n\t\t\tvar itemIdLinked = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex( g_ActiveTournamentInfo.itemid_pack, 0 );\n\t\t\tvar contextMenuPanel = UiToolkitAPI.ShowCustomLayoutContextMenuParameters(\n\t\t\t\t'',\n\t\t\t\t'',\n\t\t\t\t'file://{resources}/layout/context_menus/context_menu_store_linked_items.xml',\n\t\t\t\t'itemids=' + itemId + ',' + itemIdLinked +\n\t\t\t\t( usetinynames ? '&usetinynames=' + usetinynames : '' ) +\n\t\t\t\t'&warningtext=#tournament_items_notice'\n\t\t\t);\n\t\t\tcontextMenuPanel.AddClass( \"ContextMenu_NoArrow\" );\n\t\t};\n\n\t\telPurchase.visible = false;\n\n\t\t                                                                                                \n\t\tvar id = InventoryAPI.GetActiveTournamentCoinItemId( tournamentNum );\n\t\tif (( !id || id === '0' ) && tournamentNum === g_ActiveTournamentInfo.eventid )\n\t\t{\t\n\t\t\t                                                              \n\t\t\tid = InventoryAPI.GetActiveTournamentCoinItemId( tournamentNum * -1 );\n\t\t\tif ( !id || id === '0' )\n\t\t\t{\n\t\t\t\t                                                               \n\t\t\t\tid = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex( g_ActiveTournamentInfo.itemid_pass, 0 );\n\t\t\t\tif ( !StoreAPI.GetStoreItemSalePrice( id, 1, '' ) )\n\t\t\t\t{\n\t\t\t\t\telPurchase.visible = false;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\telPurchase.visible = true;\n\t\t\t\t                                                \n\t\t\t\telPurchase.FindChildInLayoutFile( 'id-pickem-getitems-label' ).text = '#SFUI_ConfirmBtn_GetPassNow';\n\t\t\t\telPurchase.SetPanelEvent( 'onactivate', _OpenContextMenu );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\telPurchase.visible = true;\n\t\t\telPurchase.FindChildInLayoutFile( 'id-pickem-getitems-label' ).text = '#SFUI_ConfirmBtn_ActivatePassNow';\n\t\t\telPurchase.SetPanelEvent( 'onactivate', _ActivatePass.bind( undefined, id ) );\n\n\t\t\treturn;\n\t\t}\n\t};\n\n\tvar _UpdateApplyBtnForPass = function( elPanel, elApplyPicks, tournamentNum, _funcMakePicksParams )\n\t{\n\t\t_EventsForApplyBtn( elPanel, elApplyPicks, function() { return []; }, _funcMakePicksParams, true );\n\t};\n\n\tvar _MouseOverEventsWithStickersToPurchase = function( elButton, btnid, listStoreIndex )\n\t{\n\t\tvar _OnMouseOver = function( listStoreIndex )\n\t\t{\n\t\t\tvar num = 0;\n\t\t\tvar names = $.Localize( '#pickem_get_items_tooltip' );\n\t\t\tlistStoreIndex.forEach( element =>\n\t\t\t{\n\t\t\t\tvar itemId = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex( element.storedefindex, 0 );\n\t\t\t\tnames = names + InventoryAPI.GetItemName( itemId ) + '<br>';\n\t\t\t\t++num;\n\t\t\t} );\n\n\t\t\tif ( num > 0 )\n\t\t\t{\n\t\t\t\tUiToolkitAPI.ShowTextTooltip( btnid, names );\n\t\t\t}\n\t\t};\n\t\n\t\telButton.SetPanelEvent( 'onmouseover', _OnMouseOver.bind( undefined, listStoreIndex ) );\n\t\telButton.SetPanelEvent( 'onmouseout', function() { UiToolkitAPI.HideTextTooltip(); } );\n\t};\n\n\tvar _EventsForPurchaseBtn = function( elPurchase, listStoreIndex )\n\t{\n\t\tvar _OnActivatePurchase = function( listStoreIndex )\n\t\t{\n\t\t\tvar aList = [];\n\t\t\tlistStoreIndex.forEach( element =>\n\t\t\t{\n\t\t\t\taList.push( element.storedefindex );\n\t\t\t} );\n\n\t\t\tvar purchaseString = aList.join( ',' );\n\t\t\tStoreAPI.StoreItemPurchase( purchaseString );\n\t\t};\n\n\t\telPurchase.SetPanelEvent( 'onactivate', _OnActivatePurchase.bind( undefined, listStoreIndex ) );\n\t};\n\n\tvar _EventsForApplyBtn = function( elPanel, elApplyBtn, _funcListOfPicksWithNoOwnedItems, _funcMakePicksParams, useFakeItems = false )\n\t{\n\t\tvar _OnApplyPicks = function( elPanel, elApplyBtn, applyImmediate = false )\n\t\t{\t\n\t\t\tvar popup = UiToolkitAPI.ShowCustomLayoutPopupParameters( \n\t\t\t\t'', \n\t\t\t\t'file://{resources}/layout/popups/popup_confirm_picks.xml',\n\t\t\t\t'none'\n\t\t\t);\n\n\t\t\tvar list = _funcListOfPicksWithNoOwnedItems( elPanel );\n\t\t\tvar alistTeams = [];\n\t\t\tlist.forEach(element => {\n\t\t\t\talistTeams.push( element.localid );\n\t\t\t});\n\n\t\t\t                                       \n\t\t\tvar oData = _funcMakePicksParams( elPanel, useFakeItems );\n\n\t\t\tif ( typeof popup._oPicksData !== 'object' )\n\t\t\t{\n\t\t\t\tpopup._oPicksData = {};\n\t\t\t}\n\n\t\t\tpopup._oPicksData.args = oData.args;\n\t\t\tpopup._oPicksData.picksforconfirm = oData.idsForDisplayInConfimPopup;\n\t\t\tpopup._oPicksData.picksnoitems = alistTeams;\n\t\t\tpopup._oPicksData.applyImmediate = applyImmediate;\n\t\t};\n\n\t\telApplyBtn.SetPanelEvent( 'onactivate', _OnApplyPicks.bind( undefined,elPanel, elApplyBtn, useFakeItems ) );\n\t};\n\t\n\treturn {\n\t\tInit: _Init,\n\t\tReadyForDisplay: _ReadyForDisplay,\n\t\tRefreshData: _RefreshData,\n\t\tUnreadyForDisplay: _UnreadyForDisplay,\n\t\tUnregisterEvents: _UnregisterEvents,\n\t\tGetTournamentIdNumFromString: _GetTournamentIdNumFromString,\n\t\tCheckIfTeamIsAlreadyPicked: _CheckIfTeamIsAlreadyPicked,\n\t\tUpdateImageForPick: _UpdateImageForPick,\n\t\tUpdateCorrectPickState : _UpdateCorrectPickState,\n\t\tShowPickItemNotOwnedWarning: _ShowPickItemNotOwnedWarning,\n\t\tSetTeamImage: _SetTeamImage,\n\t\tGetTeamImage: _GetTeamImage,\n\t\tSetPointsWorth: _SetPointsWorth,\n\t\tIsPickSaved: _IsPickSaved,\n\t\tShowHideRemoveBtn: _ShowHideRemoveBtn,\n\t\tUpdateRemoveBtn: _UpdateRemoveBtn,\n\t\tUpdateActionBarBtns: _UpdateActionBarBtns,\n\t\tGetTeamItemDefIndex : _GetTeamItemDefIndex,\n\t\tGetYourPicksItemIdData : _GetYourPicksItemIdData\n\t};\n} )();\n\n( function()\n{\n\t                                                                                                   \n} )(); ","scripts/tournaments/pickem_group.js":"'use strict';\n\nvar PickEmGroup = ( function()\n{\n\t                                                    \n\t                                                                                          \n\t                                                                                   \n\t                                                                                                     \n\t                                                                    \n\n\tvar _Init = function ( elPanel )\n\t{\n\t\t_SetPointsWorth( elPanel );\n\t\t_SetUpDragTargets( elPanel );\n\t\t_UpdateGroupPicks( elPanel );\n\t};\n\n\tvar _UpdateGroupPicks = function( elPanel )\n\t{\n\t\t                                                                                               \n\n\t\tif ( !elPanel._oPickemData.oTournamentData || !elPanel._oPickemData.oInitData )\n\t\t{\n\t\t\t                                                \n\t\t\t                                                                                                 \n\t\t\t                                                                                              \n\t\t\treturn;\n\t\t}\n\t\t\n\t\tvar activeSectionIdx = elPanel._oPickemData.oInitData.sectionindex;\n\t\tvar oGroupData = elPanel._oPickemData.oTournamentData.sections[ activeSectionIdx ].groups[ 0 ];\n\t\tvar pickCount = oGroupData.pickscount;\n\n\t\tfor ( var i = 0; i < pickCount; i++ )\n\t\t{\n\t\t\tvar elPick = elPanel.FindChildInLayoutFile( 'id-pickem-pick' + i );\n\t\t\tvar elItemImage = elPick.FindChildInLayoutFile( 'id-pick-itemimage' );\n\n\t\t\tvar oItemIdData = PickemCommon.GetYourPicksItemIdData( \n\t\t\t\telPanel._oPickemData.oTournamentData.tournamentid, \n\t\t\t\toGroupData.picks[i].localid\n\t\t\t);\n\t\t\t\n\t\t\tPickemCommon.UpdateImageForPick( \n\t\t\t\toItemIdData,\n\t\t\t\telItemImage, \n\t\t\t\toGroupData.picks[ i ].localid,\n\t\t\t\tPickemCommon.GetTournamentIdNumFromString( elPanel._oPickemData.oTournamentData.tournamentid ) >= 15                \n\t\t\t);\n\n\t\t\tPickemCommon.UpdateCorrectPickState(\n\t\t\t\telPanel._oPickemData.oTournamentData.tournamentid,\n\t\t\t\toGroupData,\n\t\t\t\tPredictionsAPI.GetGroupCorrectPicksByIndex( elPanel._oPickemData.oTournamentData.tournamentid, oGroupData.id, i ),\n\t\t\t\toGroupData.picks[i].localid,\n\t\t\t\telPick.FindChildInLayoutFile( 'id-pickem-points-for-pick' )\n\t\t\t);\n\n\t\t\t                                                                                       \n\t\t\t                                 \n\t\t\t                                                           \n\t\t\t   \t                                                                           \n\t\t\t   \t           \n\t\t\t   \t            \n\t\t\t   \t                                                      \n\t\t\t   \t                            \n\t\t\t     \n\t\t\t     \n\t\t\tvar notOwned = false;\n\t\t\t\n\t\t\toGroupData.picks[i].storedefindex = notOwned ? \n\t\t\t\tPickemCommon.GetTeamItemDefIndex( oGroupData.picks[i].localid ):\n\t\t\t\tundefined;\n\n\t\t\t                                                              \n\t\t\tvar elRemoveBtn = elPick.FindChildInLayoutFile( 'id-pick-cancelbtn' );\n\t\t\tvar showRemoveBtn = PickemCommon.ShowHideRemoveBtn(\n\t\t\t\telPanel._oPickemData.oTournamentData.sections[ activeSectionIdx ].isactive,\n\t\t\t\toGroupData.canpick,\n\t\t\t\toGroupData.picks[i].localid,\n\t\t\t\telRemoveBtn\n\t\t\t);\n\n\t\t\tif ( showRemoveBtn )\n\t\t\t{\n\t\t\t\tPickemCommon.UpdateRemoveBtn(\n\t\t\t\t\telPanel,\n\t\t\t\t\toGroupData,\n\t\t\t\t\toGroupData.picks[i].localid,\n\t\t\t\t\telPick.FindChildInLayoutFile( 'id-pick-cancelbtn' ),\n\t\t\t\t\t_UpdateGroupPicks\n\t\t\t\t);\n\t\t\t}\n\n\t\t\telPick.SetHasClass( 'pickem-pick-placed', oGroupData.picks[ i ].localid ? true : false );\n\t\t\telPick.SetHasClass( 'is-saved-pick', ( PickemCommon.IsPickSaved( oGroupData.picks[ i ] ) && oGroupData.canpick ));\n\t\t\telPick.SetHasClass( 'pickem-pick-locked', !oGroupData.canpick );\n\n\t\t\t_UpdateTeams( elPanel );\n\t\t}\n\n\t\t                                                                                                    \n\t\tPickemCommon.UpdateActionBarBtns( elPanel, _GetListOfPicksWithNoOwnedItems, _MakePicksParams, _EnableApply );\n\t};\n\n\tvar _GetListOfPicksWithNoOwnedItems = function( elPanel )\n\t{\n\t\tvar activeSectionIdx = elPanel._oPickemData.oInitData.sectionindex;\n\t\tvar oGroupData = elPanel._oPickemData.oTournamentData.sections[ activeSectionIdx ].groups[ 0 ];\n\t\t\n\t\treturn oGroupData.picks.filter( index => index.storedefindex !== undefined );\n\t};\n\n\tvar _MakePicksParams = function( elPanel, useFakeId = false )\n\t{\n\t\tvar activeSectionIdx = elPanel._oPickemData.oInitData.sectionindex;\n\t\tvar tournamentId = elPanel._oPickemData.oTournamentData.tournamentid;\n\t\tvar oGroupData = elPanel._oPickemData.oTournamentData.sections[ activeSectionIdx ].groups[ 0 ];\n\t\tvar count = oGroupData.pickscount;\n\t\tvar args = [ tournamentId ];\n\t\tvar groupId = oGroupData.id;\n\t\tvar listPicks = oGroupData.picks;\n\t\tvar idsForDisplayInConfimPopup = [];\n\n\t\tfor ( var i = 0; i < count; ++i )\n\t\t{                                                                             \n\t\t\tvar pickInGroupIndex = i;           \n\t\t\tvar strStickerItemId = '';\n\n\t\t\tif ( listPicks[ i ].localid )\n\t\t\t{\n\t\t\t\t                                                    \n\t\t\t\tvar oItemIdData = PickemCommon.GetYourPicksItemIdData( \n\t\t\t\t\ttournamentId, \n\t\t\t\t\toGroupData.picks[i].localid\n\t\t\t\t);\n\n\t\t\t\tstrStickerItemId = oItemIdData.type === 'fakeitem' && !useFakeId ? '' : oItemIdData.itemid;\n\n\t\t\t\tif ( strStickerItemId )\n\t\t\t\t{\n\t\t\t\t\tidsForDisplayInConfimPopup.push( strStickerItemId );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\targs.push( groupId, pickInGroupIndex, strStickerItemId );                              \n\t\t}\n\n\t\treturn {\n\t\t\targs: args,\n\t\t\tidsForDisplayInConfimPopup: idsForDisplayInConfimPopup\n\t\t};\n\t};\n\n\tvar _EnableApply = function( elPanel)\n\t{\n\t\tvar tournamentNum = PickemCommon.GetTournamentIdNumFromString( elPanel._oPickemData.oInitData.tournamentid );\n\n\t\tif ( tournamentNum >= 15 )\n\t\t{\n\t\t\tvar id = InventoryAPI.GetActiveTournamentCoinItemId( tournamentNum );\n\t\t\tif ( !id || id === '0' )\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\t\n\t\tvar activeSectionIdx = elPanel._oPickemData.oInitData.sectionindex;\n\t\tvar oGroupData = elPanel._oPickemData.oTournamentData.sections[ activeSectionIdx ].groups[ 0 ];\n\t\t\n\t\tvar picks = oGroupData.picks;\n\n\t\tvar bFoundDifferenceToApply = false;\n\t\tvar strErrorString = null;\n\t\n\t\tfor ( var i = 0; i < oGroupData.pickscount; i++ )\n\t\t{\n\t\t\tif ( !picks[i].storedefindex )\n\t\t\t{\t                                                                  \n\t\t\t\tvar idLocal = picks[i].localid;\n\t\t\t\tvar idSaved = picks[i].savedid;\n\t\t\t\tif ( !idLocal ) idLocal = 0;\n\t\t\t\tif ( !idSaved ) idSaved = 0;\n\t\t\t\tif ( !idLocal && !strErrorString )\n\t\t\t\t{\n\t\t\t\t\t                                                                                                              \n\t\t\t\t\tstrErrorString = '#pickem_apply_emptyslots';\n\t\t\t\t}\n\t\t\t\tif( !bFoundDifferenceToApply && idLocal !== idSaved )\n\t\t\t\t{\n\t\t\t\t\t                                                                                                                          \n\t\t\t\t\tbFoundDifferenceToApply = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn bFoundDifferenceToApply ? ( strErrorString ? strErrorString : '#ok' ) : false;\n\t};\n\n\n\tvar _SetPointsWorth = function( elPanel )\n\t{\n\t\tvar activeSectionIdx = elPanel._oPickemData.oInitData.sectionindex;\n\t\tvar points = elPanel._oPickemData.oTournamentData.sections[ activeSectionIdx ].groups[ 0 ].pickworth;\n\t\tvar elLabel = elPanel.FindChildInLayoutFile( 'id-pickem-group-worth' );\n\n\t\tPickemCommon.SetPointsWorth( elLabel, points, elPanel._oPickemData.oInitData.tournamentid, activeSectionIdx );\n\t};\n\n\tvar _UpdateTeams = function( elPanel )\n\t{\n\t\tvar activeSectionIdx = elPanel._oPickemData.oInitData.sectionindex;\n\t\tvar oGroupData = elPanel._oPickemData.oTournamentData.sections[ activeSectionIdx ].groups[ 0 ];\n\t\tvar groupId = oGroupData.id;\n\t\tvar tournamentId = elPanel._oPickemData.oInitData.tournamentid;\n\n\t\tvar teamCount = PredictionsAPI.GetGroupTeamsPickableCount( tournamentId, groupId );\n\t\tvar elTeams = elPanel.FindChildInLayoutFile( 'id-pickem-groum-teams' );\n\t\tvar isSectionActive = elPanel._oPickemData.oTournamentData.sections[ activeSectionIdx ].isactive;\n\t\tvar groupCanPick = oGroupData.canpick;\n\n\t\tfor ( var i = 0; i < teamCount; i++ )\n\t\t{\n\t\t\tvar teamId = PredictionsAPI.GetGroupTeamIDByIndex( tournamentId, groupId, i );\n\t\t\tvar uniqueId = tournamentId + elPanel._oPickemData.oInitData.xmltype + teamId;\n\t\t\tvar elTeam = elTeams.FindChildInLayoutFile( uniqueId );\n\n\t\t\tif ( !teamId )\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tif ( !elTeam )\n\t\t\t{\n\t\t\t\telTeam = _CreateTeam( elTeams, uniqueId, teamId );\n\t\t\t}\n\n\t\t\tvar elLogoImage = elTeam.FindChildInLayoutFile( 'id-team-logo' );\n\t\t\tPickemCommon.SetTeamImage( tournamentId, elLogoImage, elTeam );\n\n\t\t\tvar isAlreadyPicked = _SetIsAlreadyPicked( elPanel, elTeam );\n\n\t\t\t                                                                                                                     \n\n\t\t\tif( isSectionActive && groupCanPick && !isAlreadyPicked )\n\t\t\t{\n\t\t\t\t_EnableDraggableEvents( elTeam );\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t_DisableDraggable( elTeam );\n\t\t\t}\n\n\t\t\t_TeamTooltips( elTeam );\n\t\t}\n\t};\n\n\tvar _CreateTeam = function( elTeams, uniqueId, teamId )\n\t{\n\t\tvar elTeam = $.CreatePanel( \"Panel\", elTeams, uniqueId );\n\t\telTeam.BLoadLayoutSnippet( \"team\" );\n\n\t\tif ( typeof elTeam._oteamData !== 'object' )\n\t\t{\n\t\t\telTeam._oteamData = {};\n\t\t}\n\n\t\telTeam._oteamData.teamid = teamId;\n\n\t\treturn elTeam;\n\t};\n\n\tvar _SetIsAlreadyPicked = function ( elPanel, elTeam )\n\t{\n\t\tvar activeSectionIdx = elPanel._oPickemData.oInitData.sectionindex;\n\t\tvar oGroupData = elPanel._oPickemData.oTournamentData.sections[ activeSectionIdx ].groups[ 0 ];\n\t\t\n\t\tvar isAlreadyPick = PickemCommon.CheckIfTeamIsAlreadyPicked( oGroupData, elTeam._oteamData.teamid );\n\t\tvar elUsed = elTeam.FindChildInLayoutFile( 'id-team-used' );\n\t\telUsed.SetHasClass( 'hidden', !isAlreadyPick );\n\n\t\treturn isAlreadyPick;\n\t};\n\n\tvar _EnableDraggableEvents = function ( elTeam )\n\t{\n\t\telTeam.IsDraggable = true;\n\t\telTeam.enabled = true;\n\n\t\tif ( elTeam._oteamData.dragStartHandle ) \n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\telTeam._oteamData.dragStartHandle = $.RegisterEventHandler( 'DragStart', elTeam, function ( targetId, obj ) {\n\t\t\tvar elDraggable = $.CreatePanel( \"Image\", elTeam, 'draggable' + elTeam._oteamData.teamid, {\n\t\t\t\tsrc: PickemCommon.GetTeamImage( elTeam ),\n\t\t\t\tclass: 'pickem-team-draggable',\n\t\t\t\ttextureheight: '128',\n\t\t\t\ttexturewidth: '128'\n\t\t\t} );\n\n\t\t\tif ( typeof elDraggable._oteamData !== 'object' )\n\t\t\t{\n\t\t\t\telDraggable._oteamData = {};\n\t\t\t}\n\t\t\t\n\t\t\telDraggable._oteamData = elTeam._oteamData;\n\n\t\t\tobj.displayPanel = elDraggable;\n\t\t\tobj.removePositionBeforeDrop = false;\n\t\t\telDraggable.AddClass( 'dragstart' );\n\t\t} );\n\n\t\t$.RegisterEventHandler( 'DragEnd', elTeam, function ( targetId, obj ) {\n\t\t\tobj.AddClass( 'dragend' );\n\t\t\tobj.DeleteAsync( 0.25 );\n\t\t} );\n\t};\n\t\n\tvar _DisableDraggable = function ( elTeam )\n\t{\n\t\telTeam.IsDraggable = false;\n\t\telTeam.enabled = false;\n\t};\n\n\tvar _TeamTooltips = function( elTeam )\n\t{\n\t\tvar OnMouseOver = function ( elTeam )\n\t\t{\n\t\t\tUiToolkitAPI.ShowTextTooltip( elTeam.id, PredictionsAPI.GetTeamName( elTeam._oteamData.teamid ) );\n\n\t\t\tif( elTeam.IsDraggable )\n\t\t\t{\n\t\t\t\telTeam.AddClass('pickem-group-pick--wiggle');\n\t\t\t}\n\t\t};\n\n\t\tvar OnMouseOut = function ( elTeam ) \n\t\t{\n\t\t\tUiToolkitAPI.HideTextTooltip();\n\t\t\telTeam.RemoveClass('pickem-group-pick--wiggle');\n\t\t};\n\n\t\telTeam.SetPanelEvent( 'onmouseover', OnMouseOver.bind( undefined, elTeam ) );\n\t\telTeam.SetPanelEvent( 'onmouseout', OnMouseOut.bind( undefined, elTeam ) );\n\t};\n\n\tvar _SetUpDragTargets = function( elPanel )\n\t{\n\t\tvar activeSectionIdx = elPanel._oPickemData.oInitData.sectionindex;\n\t\tvar picksCount = elPanel._oPickemData.oTournamentData.sections[ activeSectionIdx ].groups[ 0 ].pickscount;\n\t\t\n\t\tif ( typeof elPanel._odraggableData !== 'object' )\n\t\t{\n\t\t\telPanel._odraggableData = {};\n\t\t}\n\n\t\tvar _DragEnter = function( elDragTarget )\n\t\t{\n\t\t\telDragTarget.AddClass( 'dragenter' );\n\n\t\t\t                                                                                           \n\t\t\telPanel._odraggableData.dragtarget = elDragTarget.GetParent();\n\t\t};\n\n\t\tvar _DragLeave = function( elDragTarget )\n\t\t{\n\t\t\telDragTarget.RemoveClass( 'dragenter' );\n\t\t\telPanel._odraggableData.dragtarget = null;\n\t\t};\n\n\t\tfor ( var i = 0; i < picksCount; i++ )\n\t\t{\n\t\t\tvar elPick = elPanel.FindChildInLayoutFile( 'id-pickem-pick' + i );\n\t\t\tvar elDragTarget= elPick.FindChildInLayoutFile( 'id-pick-boundingbox' );\n\n\t\t\t$.RegisterEventHandler(\n\t\t\t\t'DragEnter',\n\t\t\t\telDragTarget,\n\t\t\t\t_DragEnter.bind( undefined, elDragTarget )\n\t\t\t);\n\t\t\t\n\t\t\t$.RegisterEventHandler(\n\t\t\t\t'DragLeave',\n\t\t\t\telDragTarget,\n\t\t\t\t_DragLeave.bind( undefined, elDragTarget )\n\t\t\t);\n\t\t\n\t\t\t$.RegisterEventHandler(\n\t\t\t\t'DragDrop',\n\t\t\t\telDragTarget,\n\t\t\t\tfunction( dispayId, elDisplay )\n\t\t\t\t{\n\t\t\t\t\t                                  \n\t\t\t\t\t                                      \n\t\t\t\t\t_PlaceTempPick( elPanel, elDisplay._oteamData.teamid );\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t};\n\n\tvar _PlaceTempPick = function( elPanel, teamid )\n\t{\n\t\t$.DispatchEvent( 'CSGOPlaySoundEffect', 'sticker_applySticker', 'MOUSE' );\n\t\tvar activeSectionIdx = elPanel._oPickemData.oInitData.sectionindex;\n\t\tvar oGroupData = elPanel._oPickemData.oTournamentData.sections[ activeSectionIdx ].groups[ 0 ];\n\t\t\n\t\t                                        \n\t\tif ( elPanel._odraggableData.dragtarget && elPanel._odraggableData.dragtarget.IsValid() )\n\t\t{\n\t\t\tvar pickIndex = elPanel._odraggableData.dragtarget.GetAttributeString( 'data-pick-index', '' );\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tif( pickIndex )\n\t\t{\n\t\t\toGroupData.picks[ Number( pickIndex ) ].localid = teamid;\n\t\t}\n\n\t\t_UpdateGroupPicks( elPanel );\n\t};\n\n\tvar _UpdatePrediction = function( elPanel )\n\t{\n\t\t                                     \n\n\t\tvar activeSectionIdx = elPanel._oPickemData.oInitData.sectionindex;\n\n\t\tif( !elPanel._oPickemData.oTournamentData )\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tvar oGroupData = elPanel._oPickemData.oTournamentData.sections[ activeSectionIdx ].groups[ 0 ];\n\n\t\tif ( !oGroupData )\n\t\t{\n\t\t\t                                                                      \n\t\t\t                                               \n\t\t\treturn;\n\t\t}\n\n\t\tif ( !oGroupData || !oGroupData.pickscount )\n\t\t\treturn;\n\n\t\t                                                               \n\t\tfor ( var i = 0; i < oGroupData.pickscount; i++ )\n\t\t{\n\t\t\tvar elPick = elPanel.FindChildInLayoutFile( 'id-pickem-pick' + i );\n\t\t\tvar userPickTeamID = PredictionsAPI.GetMyPredictionTeamID( elPanel._oPickemData.oInitData.tournamentid, oGroupData.id, i );\n\t\t\toGroupData.picks[i].savedid = userPickTeamID;\n\t\t\t\t\n\t\t\tif( PickemCommon.IsPickSaved( oGroupData.picks[i] ) && oGroupData.canpick )\n\t\t\t{\n\t\t\t\telPick.FindChildInLayoutFile('id-pick-boundingbox').TriggerClass( 'pickem-group-pick-update' );\n\t\t\t}\n\t\t}\n\n\t\t_UpdateGroupPicks( elPanel );\n\n\t};\n\t\n\tvar _PurchaseComplete = function( elPanel )\n\t{\n\t\t_UpdateGroupPicks( elPanel );\n\t}\n\n\treturn{\n\t\tInit : _Init,\n\t\tUpdatePrediction : _UpdatePrediction,\n\t\tPurchaseComplete : _PurchaseComplete\n\t};\n})();\t\n\n                                     \n    \n\t                                                         \n\t                                                 \n\n\t                                                         \n\n\t                                                                          \n\t    \n\t                                                                   \n\t                                            \n\t       \n\n\t                                                                        \n\t    \n\t                                                                     \n\t                                              \n\t       \n\n\n\t                                                                     \n\t                                                                                                                            \n\t                                                                                                                            \n\t                                                                                                                                                      \n     ","scripts/tournaments/pickem_info_bar.js":"'use strict';\n\nvar PickEmInfoBar = ( function()\n{\n\tvar _Init = function ( elPanel )\n\t{\n\t\t_SetUpHowToPlayLink( elPanel );\n\t\t_SetUpLeaderboardButton( elPanel );\n\t\t_UpdateTimer( elPanel );\n\t\t_UpdateScore( elPanel );\n\t\t_SetUpLiveButton( elPanel );\n\t};\n\n\tvar _SetUpHowToPlayLink = function( elPanel )\n\t{\n\t\tvar elParent = elPanel.FindChildTraverse( 'id-pickem-info' );\n\t\tvar elLink = elParent.FindChildTraverse( 'id-pickem-how-to-play' );\n\t\tvar olinks = {\n\t\t\t16: \"http://www.counter-strike.net/pickem/berlin2019#team_instructions\",\n\t\t\t15: \"http://www.counter-strike.net/pickem/katowice2019#team_instructions\",\n\t\t\t14: \"http://www.counter-strike.net/pickem/london2018#team_instructions\",\n\t\t\t13: \"http://www.counter-strike.net/pickem/boston2018#team_instructions\",\n\t\t\t12: \"http://www.counter-strike.net/pickem/krakow2017#team_instructions\"\n\t\t};\n\n\t\tvar tournamentNum = PickemCommon.GetTournamentIdNumFromString( elPanel._oPickemData.oInitData.tournamentid );\n\n\t\tif ( olinks.hasOwnProperty( tournamentNum ) )\n\t\t{\n\t\t\tvar link = olinks[ tournamentNum ];\n\t\t\telLink.SetPanelEvent( 'onactivate', function() { SteamOverlayAPI.OpenURL( link ); } );\n\t\t\treturn;\n\t\t}\n\n\t\telLink.visible = false;\n\t};\n\n\tvar _SetUpLeaderboardButton = function( elPanel )\n\t{\n\t\tvar elParent = elPanel.FindChildTraverse( 'id-pickem-info' );\n\t\tvar elLink = elParent.FindChildTraverse( 'id-pickem-leaderboards' );\n\t\tvar olinks = {\n\t\t\t14: \"official_leaderboard_pickem_london2018_team\",\n\t\t\t13: \"official_leaderboard_pickem_boston2018_team\",\n\t\t\t12: \"official_leaderboard_pickem_krakow2017_team\"\n\t\t};\n\n\t\tvar tournamentNum = PickemCommon.GetTournamentIdNumFromString( elPanel._oPickemData.oInitData.tournamentid );\n\n\t\tvar _OnActivate = function()\n\t\t{\n\t\t\tUiToolkitAPI.ShowCustomLayoutPopupParameters( \n\t\t\t\t'', \n\t\t\t\t'file://{resources}/layout/popups/popup_leaderboards.xml',\n\t\t\t\t'type=' + olinks[ tournamentNum  ],\n\t\t\t\t'none'\n\t\t\t);\n\t\t};\n\n\t\tif ( olinks.hasOwnProperty( tournamentNum ) )\n\t\t{\n\t\t\tvar link = olinks[ tournamentNum ];\n\t\t\telLink.enabled = true;\n\n\t\t\telLink.SetPanelEvent( 'onactivate', _OnActivate );\n\t\t\treturn;\n\t\t}\n\n\t\telLink.enabled = false;\n\t};\n\n\tvar _UpdateTimer = function( elPanel, optbFromScheduledEvent )\n\t{\n\t\tif ( optbFromScheduledEvent && elPanel._oPickemData.oInitData.schPickEmInfoBarUpdateTimer )\n\t\t{\t                                                                                      \n\t\t\telPanel._oPickemData.oInitData.schPickEmInfoBarUpdateTimer = null;\n\t\t\t                                                                             \n\t\t}\n\n\t\tvar activeSectionIdx = elPanel._oPickemData.oInitData.sectionindex;\n\t\tvar oGroupData = elPanel._oPickemData.oTournamentData.sections[ activeSectionIdx ].groups[ 0 ];\n\t\t\n\t\tvar elStatus = elPanel.FindChildTraverse( 'id-pickem-lock-status' );\n\t\tvar elIcon = elPanel.FindChildTraverse( 'id-pickem-lock-status-icon' );\n\t\tvar secRemaining = PredictionsAPI.GetGroupRemainingPredictionSeconds( elPanel._oPickemData.oInitData.tournamentid, oGroupData.id );\n\n\t\tvar sectionId = PredictionsAPI.GetEventSectionIDByIndex( elPanel._oPickemData.oInitData.tournamentid, elPanel._oPickemData.oInitData.sectionindex );\n\t\tvar isActive = PredictionsAPI.GetSectionIsActive( elPanel._oPickemData.oInitData.tournamentid, sectionId );\n\t\tvar canPick = PredictionsAPI.GetGroupCanPick( elPanel._oPickemData.oInitData.tournamentid, oGroupData.id );\n\n\t\tvar elStatusBar = elPanel.FindChildTraverse( 'id-pickem-status' );\n\t\telStatusBar.SetHasClass( 'pickem-header-status--active', ( isActive && canPick && secRemaining > 0 ) );\n\n\t\tif ( !isActive && canPick )\n\t\t{\n\t\t\t                                                                                \n\t\t\telIcon.SetImage( 'file://{images}/icons/ui/locked.svg' );\n\t\t\telStatus.text = $.Localize( '#pickem_timer_inactive' );\n\t\t   \n\t\t}\n\t\telse if ( canPick && secRemaining > 0 )\n\t\t{\n\t\t\t                                                                               \n\t\t\telIcon.SetImage( 'file://{images}/icons/ui/clock.svg' );\n\t\t\telStatus.SetDialogVariable( 'time', FormatText.SecondsToSignificantTimeString( secRemaining ) );\n\t\t\telStatus.text = $.Localize( '#pickem_timer', elStatus );\n\n\t\t\tif ( !elPanel._oPickemData.oInitData.schPickEmInfoBarUpdateTimer )\n\t\t\t{\n\t\t\t\telPanel._oPickemData.oInitData.schPickEmInfoBarUpdateTimer = $.Schedule( 1, _UpdateTimer.bind( undefined, elPanel, true ));\n\t\t\t}\n\t\t\treturn;\n\n\t\t}\n\t\telse if ( !canPick )\n\t\t{\n\t\t\t                                                         \n\t\t\telIcon.SetImage( 'file://{images}/icons/ui/locked.svg' );\n\t\t\telStatus.text = $.Localize( '#pickem_timer_locked' );\n\t\t}\n\t\telse\n\t\t{\n\t\t\t                                            \n\t\t\telIcon.SetImage( 'file://{images}/icons/ui/clock.svg' );\n\t\t\telStatus.SetDialogVariable( 'time', FormatText.SecondsToSignificantTimeString( 60 ) );\n\t\t\telStatus.text = $.Localize( '#pickem_timer', elStatus );\n\t\t}\n\t};\n\n\n\tvar _UpdateScore = function( elPanel )\n\t{\n\t\t                                                                                            \n\t\tif ( PickemCommon.GetTournamentIdNumFromString( elPanel._oPickemData.oInitData.tournamentid ) >= 15 )\n\t\t\treturn;\n\t\t\n\t\tvar pointsEarned = PredictionsAPI.GetMyPredictionsTotalPoints( elPanel._oPickemData.oInitData.tournamentid );\n\t\tvar bronzePoints = PredictionsAPI.GetRequiredPredictionsPointsBronze( elPanel._oPickemData.oInitData.tournamentid );\n\t\tvar silverPoints = PredictionsAPI.GetRequiredPredictionsPointsSilver( elPanel._oPickemData.oInitData.tournamentid );\n\t\tvar goldPoints = PredictionsAPI.GetRequiredPredictionsPointsGold( elPanel._oPickemData.oInitData.tournamentid );\n\t\tvar doesTournamentHaveAWinner = DoesTournamentHaveAWinner( elPanel._oPickemData.oInitData.tournamentid );\n\n\t\tvar elYourPoints = elPanel.FindChildTraverse( 'id-pickem-your-points' );\n\t\telYourPoints.text = ( pointsEarned && pointsEarned > 0 ) ? pointsEarned : '-';\n\n\t\tvar nextLevel = '';\n\t\tvar resultLevel = '';\n\t\tvar pointsNeeded = null;\n\t\tvar elbar = elPanel.FindChildTraverse( 'id-pickem-info' );\n\t\tvar elPointsNeeded = elPanel.FindChildTraverse( 'id-pickem-points-needed' );\n\t\tvar elPointsNeededLabel = elPointsNeeded.FindChildTraverse( 'id-pickem-points-needed-Label' );\n\t\tvar elPointsResultLabel = elPointsNeeded.FindChildTraverse( 'id-pickem-points-result-Label' );\n\n\t\tif ( pointsEarned < bronzePoints )\n\t\t{\n\t\t\tnextLevel = 'bronze';\n\t\t\telPointsResultLabel.visible = false;\n\t\t\tresultLevel = '';\n\t\t\tpointsNeeded = bronzePoints - pointsEarned;\n\t\t}\n\t\telse if ( pointsEarned >= bronzePoints && pointsEarned < silverPoints )\n\t\t{\n\t\t\tnextLevel = 'silver';\n\t\t\tresultLevel = 'bronze';\n\t\t\tpointsNeeded = silverPoints - pointsEarned;\n\t\t}\n\t\telse if ( pointsEarned < goldPoints )\n\t\t{\n\t\t\tnextLevel = 'gold';\n\t\t\tresultLevel = 'silver';\n\t\t\tpointsNeeded = goldPoints - pointsEarned;\n\t\t}\n\t\telse if ( pointsEarned >= goldPoints )\n\t\t{\n\t\t\tnextLevel = 'gold';\n\t\t\tresultLevel = 'gold';\n\t\t\tpointsNeeded = 0;\n\t\t}\n\n\t\tif ( doesTournamentHaveAWinner )\n\t\t{\n\t\t\telPointsNeededLabel.visible = false;\n\t\t\telPointsResultLabel.visible = ( resultLevel !== '' ) ? true : false;\n\n\t\t\telbar.AddClass( 'pickem-info-bar--'+ resultLevel );\n\n\t\t\tif( resultLevel )\n\t\t\t{\n                elPointsResultLabel.text = '#pickem_points_result_' + resultLevel;\n\t\t\t\tSetTrophyImage( elPanel, resultLevel );\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\telPointsNeededLabel.visible = true;\n\t\t\telPointsResultLabel.visible = false;\n\n\t\t\telPointsNeeded.SetDialogVariable( 'level', $.Localize( '#pickem_level_' + nextLevel ));\n\t\t\telPointsNeeded.SetDialogVariableInt( 'points', pointsNeeded );\n\t\t\t\n\t\t\tvar pluralString = pointsNeeded === 1 ? $.Localize( '#pickem_point' ) : $.Localize( '#pickem_points' );\n\t\t\telPointsNeeded.SetDialogVariable( 'plural', pluralString );\n\n\t\t\telPointsNeededLabel.text = $.Localize( '#pickem_points_needed_next_level', elPointsNeeded );\n\t\t}\n\t};\n\n\tvar _SetUpLiveButton = function ( elPanel )\n\t{\n\t\tvar elParent = elPanel.FindChildTraverse( 'id-pickem-info' );\n\t\tvar elBtn = elParent.FindChildInLayoutFile( 'JsTournamentLiveMatch' );\n\t\tvar matchId = GetLiveMatchId( elPanel._oPickemData.oInitData.tournamentid );\n\n\t\t                                                 \n\t\tvar bIsMinimalMatchInfo = MatchInfoAPI.IsServerLogTournamentMatch( matchId ); \n\t\tif ( bIsMinimalMatchInfo )\n\t\t\tmatchId = '';\n\t\t\n\t\tif( matchId )\n\t\t{\n\n\t\t\tfor( var i = 0; i < 2; i ++ )\n\t\t\t{\n\t\t\t\tvar teamId = MatchInfoAPI.GetMatchTournamentTeamID( matchId, i );\n\t\t\t\tvar teamTag = PredictionsAPI.GetTeamTag( teamId );\n\t\t\t\tvar iconFilename = 'file://{images}/tournaments/teams/' + teamTag + '.svg';\n\t\t\t\t\n\t\t\t\telBtn.FindChildInLayoutFile( 'JsTournamentLiveMatchTeam' + i ).SetImage(  iconFilename );\n\t\t\t}\n\n\t\t\telBtn.SetPanelEvent( 'onactivate', function (){\n\t\t\t\tMatchInfoAPI.Watch( matchId, 0 );\n\t\t\t});\n\t\t}\n\n\t\telBtn.SetHasClass( 'hidden', matchId === '' );\n\t};\n\n\tfunction GetLiveMatchId( listerType )\n\t{\n\t\tvar liveMatchesCount = 0;\n\t\t\n\t\tif ( MatchListAPI.GetCount( listerType ) != undefined )\n\t\t{\n\t\t\tliveMatchesCount = MatchListAPI.GetCount( listerType );\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn '';\n\t\t}\n\t\t\n\t\tif ( liveMatchesCount > 0 )\n\t\t{\n\t\t\tfor ( var i = 0; i < liveMatchesCount; i++ )\n\t\t\t{\n\t\t\t\tvar MatchId = MatchListAPI.GetMatchByIndex( listerType , i )\n\t\t\t\tvar TName = MatchInfoAPI.GetMatchTournamentName ( MatchId );\n\t\t\t\tvar Status = MatchInfoAPI.GetMatchState( MatchId );\n\t\t\t\t\n\t\t\t\tif (( TName != \"\" && TName != null && TName != undefined ) && Status == \"live\" )\n\t\t\t\t{\n\t\t\t\t\treturn MatchId;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn '';\n\t}\n\n\tvar SetTrophyImage = function( elPanel, resultLevel )\n\t{\n\t\tvar tournamentId = elPanel._oPickemData.oInitData.tournamentid;\n\t\t\n\t\tfunction GetTrophyIconPath( tournamentId )\n\t\t{\n\t\t\tif ( tournamentId == \"tournament:4\" )\n\t\t\t\treturn \"econ/status_icons/cologne_prediction_\";\n\t\t\telse if ( tournamentId == \"tournament:5\" )\n\t\t\t\treturn \"econ/status_icons/dhw14_prediction_\";\n\t\t\telse if ( tournamentId == \"tournament:6\" )\n\t\t\t\treturn \"econ/status_icons/kat_2015_prediction_\";\n\t\t\telse if ( tournamentId == \"tournament:7\" )\n\t\t\t\treturn \"econ/status_icons/col_2015_prediction_\";\n\t\t\telse if ( tournamentId == \"tournament:8\" )\n\t\t\t\treturn \"econ/status_icons/cluj_2015_prediction_\";\n\t\t\telse if ( tournamentId == \"tournament:9\" )\n\t\t\t\treturn \"econ/status_icons/mlg_2016_pickem_\";\n\t\t\telse if ( tournamentId == \"tournament:10\" )\n\t\t\t\treturn \"econ/status_icons/cologne_pickem_2016_\";\n\t\t\telse if ( tournamentId == \"tournament:11\" )\n\t\t\t\treturn \"econ/status_icons/atlanta_pickem_2017_\";\n\t\t\telse if ( tournamentId == \"tournament:12\" )\n\t\t\t\treturn \"econ/status_icons/krakow_pickem_2017_\";\n\t\t\telse if ( tournamentId == \"tournament:13\" )\n\t\t\t\treturn \"econ/status_icons/boston_pickem_2018_\";\n\t\t\telse if ( tournamentId == \"tournament:14\" )\n\t\t\t\treturn \"econ/status_icons/london_pickem_2018_\";\n\t\t\telse\n\t\t\t\treturn '';\n\t\t}\n\n\t\tif ( GetTrophyIconPath( tournamentId ) !== '' )\n\t\t{\n\t\t\tvar elTrophyImage = elPanel.FindChildTraverse( 'id-pickem-trophy-image' );\n\t\t\telTrophyImage.RemoveClass( 'hidden' );\n\t\t\telTrophyImage.SetImage( 'file://{images}/' + GetTrophyIconPath( tournamentId ) + resultLevel + '.png' );\n\t\t}\n\t};\n\n\tvar DoesTournamentHaveAWinner = function ( tournamentId )\n\t{\n\t\tvar numSections = PredictionsAPI.GetEventSectionsCount( tournamentId );\n\t\tvar numDayID = PredictionsAPI.GetEventSectionIDByIndex( tournamentId, numSections - 1 );\n\t\tvar numGroups = PredictionsAPI.GetSectionGroupsCount( tournamentId, numDayID );\n\t\tvar numGroupId = PredictionsAPI.GetSectionGroupIDByIndex( tournamentId, numDayID, numGroups - 1 );\n\t\tvar WinnerTeamId = PredictionsAPI.GetGroupCorrectPicksByIndex( tournamentId, numGroupId, 0 );\n\t\tvar srtTeamTag = PredictionsAPI.GetTeamTag( Number( WinnerTeamId ));\n\t\t\n\t\tif( srtTeamTag != undefined && srtTeamTag != \"\" && srtTeamTag != null )\n\t\t\treturn true;\n\t\telse\n\t\t\treturn false;\n\t};\n\n\treturn{\n\t\tInit : _Init\n\t};\n\n\n} )();\n","scripts/tournaments/predictions_bracket_stage.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../popups/popup_major_hub.ts\" />\nvar PredictionsBracket;\n(function (PredictionsBracket) {\n    let _m_foundTarget = false;\n    let _m_aBracketSectionIndexes = [g_ActiveTournamentInfo.num_stages_with_swiss, g_ActiveTournamentInfo.num_stages_with_swiss + 1, g_ActiveTournamentInfo.num_stages_with_swiss + 2];\n    let _m_aPickPanels;\n    function Init() {\n        let oPageData = PopupMajorHub.GetActivePageData();\n        if (!oPageData.hasAlreadyInit.includes(oPageData.panel.id)) {\n            SetPicksDataOnPanels(oPageData.panel, oPageData.tournamentId);\n        }\n        _UpdateAllPickSections();\n        InitializeMatchLister(oPageData);\n    }\n    PredictionsBracket.Init = Init;\n    function SetPicksDataOnPanels(elPanel, tournamentId) {\n        _m_aPickPanels = [];\n        let sectionId = PredictionsAPI.GetEventSectionIDByIndex(tournamentId, _m_aBracketSectionIndexes[0]);\n        let groupId = PredictionsAPI.GetSectionGroupIDByIndex(tournamentId, sectionId, 0);\n        let elGroup = elPanel.FindChildInLayoutFile('bracket-section-3-group-0');\n        let elTeam = elGroup.FindChildInLayoutFile('team-pick-0');\n        elTeam.Data().pickSection = _m_aBracketSectionIndexes[0];\n        elTeam.Data().pickGroup = 0;\n        elTeam.Data().groupId = groupId;\n        elTeam.Data().pickId = '0';\n        elTeam.Data().validSlotIds = \"4,6\";\n        _m_aPickPanels.push(elTeam);\n        groupId = PredictionsAPI.GetSectionGroupIDByIndex(tournamentId, sectionId, 1);\n        elTeam = elGroup.FindChildInLayoutFile('team-pick-1');\n        elTeam.Data().pickSection = _m_aBracketSectionIndexes[0];\n        elTeam.Data().pickGroup = 1;\n        elTeam.Data().groupId = groupId;\n        elTeam.Data().pickId = \"1\";\n        elTeam.Data().validSlotIds = \"4,6\";\n        _m_aPickPanels.push(elTeam);\n        groupId = PredictionsAPI.GetSectionGroupIDByIndex(tournamentId, sectionId, 2);\n        elGroup = elPanel.FindChildInLayoutFile('bracket-section-3-group-1');\n        elTeam = elGroup.FindChildInLayoutFile('team-pick-0');\n        elTeam.Data().pickSection = _m_aBracketSectionIndexes[0];\n        elTeam.Data().pickGroup = 2;\n        elTeam.Data().groupId = groupId;\n        elTeam.Data().pickId = '2';\n        elTeam.Data().validSlotIds = \"5,6\";\n        _m_aPickPanels.push(elTeam);\n        groupId = PredictionsAPI.GetSectionGroupIDByIndex(tournamentId, sectionId, 3);\n        elTeam = elGroup.FindChildInLayoutFile('team-pick-1');\n        elTeam.Data().pickSection = _m_aBracketSectionIndexes[0];\n        elTeam.Data().pickGroup = 3;\n        elTeam.Data().pickId = \"3\";\n        elTeam.Data().groupId = groupId;\n        elTeam.Data().validSlotIds = \"5,6\";\n        _m_aPickPanels.push(elTeam);\n        sectionId = PredictionsAPI.GetEventSectionIDByIndex(tournamentId, _m_aBracketSectionIndexes[1]);\n        groupId = PredictionsAPI.GetSectionGroupIDByIndex(tournamentId, sectionId, 0);\n        elGroup = elPanel.FindChildInLayoutFile('bracket-section-4-group-0');\n        elTeam = elGroup.FindChildInLayoutFile('team-pick-0');\n        elTeam.Data().pickSection = _m_aBracketSectionIndexes[1];\n        elTeam.Data().pickGroup = 0;\n        elTeam.Data().groupId = groupId;\n        elTeam.Data().pickId = \"4\";\n        elTeam.Data().validSlotIds = \"6\";\n        _m_aPickPanels.push(elTeam);\n        groupId = PredictionsAPI.GetSectionGroupIDByIndex(tournamentId, sectionId, 1);\n        elTeam = elGroup.FindChildInLayoutFile('team-pick-1');\n        elTeam.Data().pickSection = _m_aBracketSectionIndexes[1];\n        elTeam.Data().pickGroup = 1;\n        elTeam.Data().groupId = groupId;\n        elTeam.Data().pickId = \"5\";\n        elTeam.Data().validSlotIds = \"6\";\n        _m_aPickPanels.push(elTeam);\n        sectionId = PredictionsAPI.GetEventSectionIDByIndex(tournamentId, _m_aBracketSectionIndexes[2]);\n        groupId = PredictionsAPI.GetSectionGroupIDByIndex(tournamentId, sectionId, 0);\n        elGroup = elPanel.FindChildInLayoutFile('bracket-section-5');\n        elTeam = elGroup.FindChildInLayoutFile('team-pick-0');\n        elTeam.Data().pickSection = _m_aBracketSectionIndexes[2];\n        elTeam.Data().pickGroup = 0;\n        elTeam.Data().groupId = groupId;\n        elTeam.Data().pickId = \"6\";\n        _m_aPickPanels.push(elTeam);\n        _m_aPickPanels.forEach(element => {\n            _AddDragSourceEvents(element);\n            _ItemDragDropEvents(element);\n        });\n    }\n    function _AddDragSourceEvents(elTeam) {\n        $.RegisterEventHandler('DragStart', elTeam, (elPanel, drag) => {\n            OnDragStart(elTeam, drag);\n            _GetValidDropTargets(elTeam.Data().validSlotIds).forEach(panel => panel.SetHasClass('is-dragging', true));\n            elTeam.AddClass('dragged-away');\n        });\n        $.RegisterEventHandler('DragEnd', elTeam, (elRadial, elDragImage) => {\n            OnDragEnd(elDragImage);\n            _GetValidDropTargets(elTeam.Data().validSlotIds).forEach(panel => panel.SetHasClass('is-dragging', false));\n            elTeam.RemoveClass('dragged-away');\n        });\n    }\n    function _ItemDragDropEvents(elTarget) {\n        $.RegisterEventHandler('DragEnter', elTarget, () => {\n            elTarget.AddClass('bracket-stage-drag-enter');\n        });\n        $.RegisterEventHandler('DragLeave', elTarget, () => {\n            elTarget.RemoveClass('bracket-stage-drag-enter');\n        });\n        $.RegisterEventHandler('DragDrop', elTarget, (dispayId, elDragImage) => {\n            _OnDragDrop(elTarget, elDragImage);\n        });\n    }\n    function OnDragStart(elDragSource, drag) {\n        let elDragImage = $.CreatePanel('ItemImage', $.GetContextPanel(), '', {\n            class: 'group-stage-drag-icon',\n            textureheight: '48',\n            texturewidth: '48'\n        });\n        elDragImage.SetImage(PopupMajorHub.GetTeamIcon(elDragSource.Data().teamId));\n        elDragImage.AddClass('start-drag');\n        elDragImage.Data().teamId = elDragSource.Data().teamId;\n        elDragImage.Data().pickId = elDragSource.Data().pickId;\n        elDragImage.Data().validSlotIds = elDragSource.Data().validSlotIds;\n        PopupMajorHub.m_elDragImage = elDragImage;\n        drag.displayPanel = elDragImage;\n        drag.offsetX = 32;\n        drag.offsetY = 32;\n        drag.removePositionBeforeDrop = false;\n        $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.inventory_item_pickup', 'MOUSE');\n    }\n    function OnDragEnd(elDragImage) {\n        if (!_m_foundTarget) {\n            let aValidTargets = _GetValidDropTargets(elDragImage.Data().validSlotIds + ',' + elDragImage.Data().pickId);\n            aValidTargets.forEach(target => {\n                if (parseInt(target.Data().pickId) >= parseInt(elDragImage.Data().pickId)) {\n                    _UpdateDropTarget(target, null);\n                    $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.inventory_item_notequipped', 'MOUSE');\n                }\n            });\n        }\n        elDragImage.AddClass('drag-end');\n        PopupMajorHub.DeleteDragItem();\n        _m_foundTarget = false;\n    }\n    function _OnDragDrop(elTarget, elDragImage) {\n        _m_foundTarget = true;\n        let teamIdRemoved = elTarget.Data().teamId;\n        let aValidTargets = _GetValidDropTargets(elDragImage.Data().validSlotIds);\n        aValidTargets.forEach(target => {\n            if (parseInt(target.Data().pickId) <= parseInt(elTarget.Data().pickId)) {\n                _UpdateDropTarget(target, elDragImage.Data().teamId);\n                $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.inventory_item_putdown', 'MOUSE');\n            }\n            else {\n                if (target.Data().teamId === teamIdRemoved &&\n                    elTarget.Data().teamId !== target.Data().teamId) {\n                    teamIdRemoved = target.Data().teamId;\n                    _UpdateDropTarget(target, null);\n                }\n            }\n        });\n    }\n    function _UpdateDropTarget(elTarget, teamId) {\n        if (elTarget && elTarget.IsValid()) {\n            let oPageData = PopupMajorHub.GetActivePageData();\n            let isActiveSection = PredictionsAPI.GetSectionIsActive(oPageData.tournamentId, oPageData.sectionId);\n            let canPick = PredictionsAPI.GetGroupCanPick(oPageData.tournamentId, oPageData.groupId);\n            elTarget.SetDraggable((isActiveSection && canPick));\n            elTarget.Data().teamId = teamId;\n            if (teamId === null || !isActiveSection || !canPick) {\n                elTarget.SwitchClass('team-state', 'team-locked');\n            }\n            else {\n                elTarget.SwitchClass('team-state', '');\n            }\n            UpdatePick(oPageData, elTarget, teamId === null ? 0 : teamId);\n        }\n    }\n    function _GetValidDropTargets(validSlotIds) {\n        let aValidSlots;\n        aValidSlots = [];\n        if (validSlotIds) {\n            validSlotIds.split(',').forEach(id => _m_aPickPanels.forEach(panel => {\n                if (panel.Data().pickId === id) {\n                    aValidSlots.push(panel);\n                }\n            }));\n        }\n        return aValidSlots;\n    }\n    function _UpdateAllPickSections() {\n        let oPageData = PopupMajorHub.GetActivePageData();\n        for (var i = 0; i < _m_aBracketSectionIndexes.length; i++) {\n            if (i == 0) {\n                _SetUpStartTeams(oPageData);\n            }\n            _UpdateAllPicksForSection(oPageData, _m_aBracketSectionIndexes[i]);\n        }\n    }\n    ;\n    function UpdateFromPredictionUploadedEvent() {\n        _UpdateAllPickSections();\n    }\n    PredictionsBracket.UpdateFromPredictionUploadedEvent = UpdateFromPredictionUploadedEvent;\n    function _SetUpStartTeams(oPageData) {\n        let sectionId = PredictionsAPI.GetEventSectionIDByIndex(oPageData.tournamentId, _m_aBracketSectionIndexes[0]);\n        let nGroupCount = PredictionsAPI.GetSectionGroupsCount(oPageData.tournamentId, sectionId);\n        let isActiveSection = PredictionsAPI.GetSectionIsActive(oPageData.tournamentId, sectionId);\n        for (let i = 0; i < nGroupCount; ++i) {\n            let groupId = PredictionsAPI.GetSectionGroupIDByIndex(oPageData.tournamentId, sectionId, i);\n            let canPick = PredictionsAPI.GetGroupCanPick(oPageData.tournamentId, groupId);\n            let elGroup = oPageData.panel.FindChildInLayoutFile('bracket-section-' + 2 + '-group-' + i);\n            let sValidSlotIds = elGroup.GetAttributeString('data-valid-slots', '');\n            let nTeamCount = PredictionsAPI.GetGroupTeamsCount(oPageData.tournamentId, groupId);\n            for (var j = 0; j < nTeamCount; j++) {\n                let teamId = PredictionsAPI.GetGroupTeamIDByIndex(oPageData.tournamentId, groupId, j);\n                let elTeam = elGroup.FindChildInLayoutFile('team-pick-' + j);\n                elTeam.Data().validSlotIds = sValidSlotIds;\n                elTeam.Data().teamId = teamId;\n                SetTeamName(elTeam, teamId, true);\n                elTeam.FindChild('id-team-logo').SetImage(!elTeam || teamId === 0 ?\n                    '' :\n                    PopupMajorHub.GetTeamIcon(teamId));\n                if (!oPageData.hasAlreadyInit.includes(oPageData.panel.id)) {\n                    _AddDragSourceEvents(elTeam);\n                }\n                elTeam.SwitchClass('team-state', 'not-active');\n                elTeam.SetDraggable((isActiveSection && canPick));\n                elTeam.hittest = (isActiveSection && canPick);\n                elTeam.hittestchildren = (isActiveSection && canPick);\n            }\n        }\n    }\n    function _UpdateAllPicksForSection(oPageData, sectionIndex) {\n        let aPicksInSection = _m_aPickPanels.filter(element => element.Data().pickSection === sectionIndex);\n        aPicksInSection.forEach(element => {\n            UpdatePick(oPageData, element, 0, true);\n        });\n    }\n    function UpdatePick(oPageData, elTeam, teamId = 0, bUsePrediction = false) {\n        let secId = PredictionsAPI.GetEventSectionIDByIndex(oPageData.tournamentId, elTeam.Data().pickSection);\n        let groupId = PredictionsAPI.GetSectionGroupIDByIndex(oPageData.tournamentId, secId, elTeam.Data().pickGroup);\n        let isActiveSection = PredictionsAPI.GetSectionIsActive(oPageData.tournamentId, oPageData.sectionId);\n        let canPick = PredictionsAPI.GetGroupCanPick(oPageData.tournamentId, groupId);\n        teamId = (teamId === 0 && bUsePrediction) ? PredictionsAPI.GetMyPredictionTeamID(oPageData.tournamentId, groupId, 0) : teamId;\n        elTeam.Data().teamId = teamId;\n        SetTeamName(elTeam, teamId);\n        elTeam.FindChild('id-team-logo').SetImage(!elTeam || teamId === 0 ?\n            '' :\n            PopupMajorHub.GetTeamIcon(teamId));\n        let sCorrectPicks = PredictionsAPI.GetGroupCorrectPicksByIndex(oPageData.tournamentId, groupId, 0);\n        if (PopupMajorHub.CheckIfPickIsCorrect(sCorrectPicks, teamId) && teamId) {\n            elTeam.SwitchClass('team-state', 'is-correct');\n        }\n        else if (teamId && !isActiveSection) {\n            elTeam.SwitchClass('team-state', 'is-incorrect');\n        }\n        else {\n            elTeam.SwitchClass('team-state', '');\n        }\n        elTeam.SetDraggable((isActiveSection && canPick));\n        elTeam.hittest = (isActiveSection && canPick);\n        elTeam.hittestchildren = (isActiveSection && canPick);\n        SavePicksButton.UpdateBtn(_GetLocalSetPicks());\n    }\n    function SetTeamName(elTeam, teamId, bisStartTeam = false) {\n        elTeam.SetDialogVariable('team-name', teamId === 0 && elTeam.BHasClass('bracket-team-pick') && !bisStartTeam ?\n            $.Localize('#CSGO_Fantasy_Team_Action') :\n            teamId === 0 ?\n                $.Localize('#CSGO_PickEm_Team_TBD') :\n                PredictionsAPI.GetTeamName(teamId));\n    }\n    function _GetLocalSetPicks() {\n        let aPicks = [];\n        _m_aPickPanels.forEach(pick => {\n            if (pick.Data().teamId && pick.Data().teamId !== 0) {\n                aPicks.push({ teamId: pick.Data().teamId, group: pick.Data().groupId, groupIndex: 0 });\n            }\n        });\n        return aPicks;\n    }\n    ;\n    let _m_elSections = {};\n    function _GetMatchlisterMatchupsIdForWinCount(numWs) {\n        return 'bracket-section-' + (2 + numWs);\n    }\n    function _SetTeamDataIntoPanel(elPanel, idx, teamtag, teamname, score, bIsCorrectPickemPick, extraClass = '') {\n        if (!elPanel)\n            return;\n        elPanel = elPanel.FindChildInLayoutFile('team-result-' + idx);\n        if (!elPanel)\n            return;\n        elPanel.SetDialogVariable('team-name', teamname);\n        elPanel.SetDialogVariable('team-score', (score < 0) ? '' : ('' + score));\n        if (extraClass)\n            elPanel.AddClass(extraClass);\n        elPanel.FindChildInLayoutFile('id-team-logo').SetImage(\"file://{images}/tournaments/teams/\" + teamtag + \".svg\");\n        if (bIsCorrectPickemPick)\n            elPanel.AddClass('is-correct');\n    }\n    function InitializeMatchLister(oPageData) {\n        if (MatchListAPI.GetState(oPageData.tournamentId) !== 'ready')\n            return;\n        for (let numWs = 0; numWs <= 3; ++numWs) {\n            let strMatchups = _GetMatchlisterMatchupsIdForWinCount(numWs);\n            let elMatchups = oPageData.panel.FindChildInLayoutFile(strMatchups);\n            if (!elMatchups)\n                continue;\n            let arrTeamPairs = [];\n            for (let iMatch = 0;; ++iMatch) {\n                let elTeamPair = elMatchups.FindChildInLayoutFile(strMatchups + '-group-' + iMatch);\n                if (!elTeamPair)\n                    break;\n                arrTeamPairs.push({ panel: elTeamPair, keyteamwl: 0, keyteam_wins: 0, keyteam_loss: 0 });\n                elTeamPair.SetHasClass('has_valid_matchup', false);\n                elTeamPair.SetHasClass('has_match_in_progress', false);\n                elTeamPair.SetHasClass('is_winner', false);\n                elTeamPair.SetHasClass('is_loser', false);\n                [elTeamPair.FindChildInLayoutFile('team-result-0'),\n                    elTeamPair.FindChildInLayoutFile('team-result-1')].forEach(elTeam => {\n                    if (elTeam) {\n                        elTeam.SetDialogVariable('team-name', $.Localize('#CSGO_PickEm_Team_TBD'));\n                        elTeam.SetDialogVariable('team-score', '');\n                        elTeam.FindChildInLayoutFile('id-team-logo').SetImage(oPageData.tournamentId == \"tournament:24\" ? \"file://{images}/tournaments/unknown_team_dark.svg\" : \"file://{images}/tournaments/unknown_team.svg\");\n                        elTeam.RemoveClass('is-correct');\n                    }\n                });\n                elTeamPair.Data().umids = [];\n                if (numWs < 3)\n                    elTeamPair.SetPanelEvent('onactivate', () => {\n                        let sUmids = (elTeamPair.Data().umids.length > 0) ? elTeamPair.Data().umids.join(',') : '';\n                        if (!sUmids)\n                            return;\n                        var contextMenuPanel = UiToolkitAPI.ShowCustomLayoutContextMenuParameters('', '', 'file://{resources}/layout/context_menus/context_menu_get_souvenir.xml', 'umids=' + sUmids +\n                            '&' + 'tournamentId=' + PopupMajorHub.GetActivePageData().eventId);\n                        contextMenuPanel.AddClass(\"ContextMenu_NoArrow\");\n                    });\n            }\n            _m_elSections[strMatchups] = { matches: arrTeamPairs };\n        }\n        let teamStates = {};\n        function GetTeamState(teamid) {\n            if (!teamStates.hasOwnProperty(teamid)) {\n                teamStates[teamid] = {\n                    wins: 0,\n                    loss: 0,\n                    boXw: 0,\n                    boXl: 0\n                };\n            }\n            return teamStates[teamid];\n        }\n        function AddWin(state, winsNeeded) {\n            ++state.boXw;\n            if (state.boXw >= winsNeeded) {\n                state.boXw = state.boXl = 0;\n                ++state.wins;\n            }\n        }\n        function AddLoss(state, winsNeeded) {\n            ++state.boXl;\n            if (state.boXl >= winsNeeded) {\n                state.boXl = state.boXw = 0;\n                ++state.loss;\n            }\n        }\n        for (let idxGroup = 0; idxGroup < 4; ++idxGroup) {\n            let nTeams = PredictionsAPI.GetGroupTeamsCount(oPageData.tournamentId, oPageData.groupId + idxGroup);\n            for (let i = 0; i < nTeams; ++i) {\n                let teamId = PredictionsAPI.GetGroupTeamIDByIndex(oPageData.tournamentId, oPageData.groupId + idxGroup, i);\n                if (teamId !== 0 && teamId && !PredictionsAPI.GetFakeItemIDToRepresentTeamID(oPageData.tournamentId, teamId))\n                    teamId = 0;\n                if (!teamId)\n                    continue;\n                let teamtag = PredictionsAPI.GetTeamTag(teamId);\n                let idxMatchup = idxGroup;\n                let idxSlotInMatch = i;\n                _SetTeamDataIntoPanel(_m_elSections[_GetMatchlisterMatchupsIdForWinCount(0)].matches[idxGroup].panel, idxSlotInMatch, teamtag, PredictionsAPI.GetTeamName(teamId), -1, false);\n                for (let numWs = 0; numWs <= 3; ++numWs) {\n                    let matchup = _GetMatchlisterMatchupsIdForWinCount(numWs);\n                    _m_elSections[matchup][teamtag] = idxMatchup;\n                    _m_elSections[matchup]['slot:' + teamtag] = idxSlotInMatch;\n                    idxSlotInMatch = idxMatchup % 2;\n                    idxMatchup = (idxMatchup - (idxMatchup % 2)) / 2;\n                }\n            }\n        }\n        for (let idxSection = 0; idxSection <= 2; ++idxSection) {\n            let nCount = PredictionsAPI.GetSectionMatchesCount(oPageData.tournamentId, oPageData.sectionId + idxSection);\n            for (let idxMatch = nCount; idxMatch-- > 0;) {\n                let umid = PredictionsAPI.GetSectionMatchByIndex(oPageData.tournamentId, oPageData.sectionId + idxSection, idxMatch);\n                let team0 = MatchInfoAPI.GetMatchTournamentTeamTag(umid, 0);\n                let team1 = MatchInfoAPI.GetMatchTournamentTeamTag(umid, 1);\n                let team0name = MatchInfoAPI.GetMatchTournamentTeamName(umid, 0);\n                let team1name = MatchInfoAPI.GetMatchTournamentTeamName(umid, 1);\n                let res = MatchInfoAPI.GetMatchOutcome(umid);\n                let bMatchStillInProgress = (!res || res <= 0);\n                let matchup = _GetMatchlisterMatchupsIdForWinCount(GetTeamState(team0).wins);\n                if (!_m_elSections[matchup].hasOwnProperty(team0) || !_m_elSections[matchup].hasOwnProperty(team1))\n                    continue;\n                let winteam = ((res == 2) ? team1 : team0);\n                let keyteam = (_m_elSections[matchup]['slot:' + team0] === 0) ? team0 : team1;\n                let steam = GetTeamState(keyteam);\n                const nStageID = MatchInfoAPI.GetMatchTournamentStageID(umid);\n                const numWinsNeeded = MatchInfoAPI.GetMatchTournamentStageIDWinsNeeded(nStageID);\n                if (_m_elSections[matchup][keyteam] < _m_elSections[matchup].matches.length) {\n                    let omatch = _m_elSections[matchup].matches[_m_elSections[matchup][keyteam]];\n                    let elTeamPair = omatch.panel;\n                    let nCountThisMatchForBO3 = bMatchStillInProgress ? 0 : 1;\n                    omatch.keyteamwl += ((winteam == keyteam) ? 1 : -1) * nCountThisMatchForBO3;\n                    omatch.keyteam_wins += ((winteam == keyteam) ? 1 : 0) * nCountThisMatchForBO3;\n                    omatch.keyteam_loss += ((winteam != keyteam) ? 1 : 0) * nCountThisMatchForBO3;\n                    let bSwap01 = ((team0 == keyteam) ? false : true);\n                    let nLeftScore = omatch.keyteam_wins;\n                    let nRightScore = omatch.keyteam_loss;\n                    elTeamPair.SetHasClass('has_valid_matchup', true);\n                    elTeamPair.SetHasClass('has_match_in_progress', bMatchStillInProgress);\n                    _SetTeamDataIntoPanel(elTeamPair, 0, (bSwap01 ? team1 : team0), (bSwap01 ? team1name : team0name), nLeftScore, false, (nLeftScore == numWinsNeeded || nRightScore == numWinsNeeded) ? (nLeftScore == numWinsNeeded ? 'is_winner' : 'is_loser') : '');\n                    _SetTeamDataIntoPanel(elTeamPair, 1, (bSwap01 ? team0 : team1), (bSwap01 ? team0name : team1name), nRightScore, false, (nLeftScore == numWinsNeeded || nRightScore == numWinsNeeded) ? (nRightScore == numWinsNeeded ? 'is_winner' : 'is_loser') : '');\n                    elTeamPair.Data().umids.push(umid);\n                    if (bMatchStillInProgress)\n                        elTeamPair.Data().umids = [];\n                    if (nLeftScore == numWinsNeeded || nRightScore == numWinsNeeded) {\n                        let matchOffset = _m_elSections[matchup][keyteam];\n                        let groupOffset = ((idxSection == 2) ? 6 : (idxSection * 4)) + matchOffset;\n                        let teamidPicked = PredictionsAPI.GetMyPredictionTeamID(oPageData.tournamentId, oPageData.groupId + groupOffset, 0);\n                        let teamTagPicked = PredictionsAPI.GetTeamTag(teamidPicked);\n                        let nextmatchup = _GetMatchlisterMatchupsIdForWinCount(steam.wins + 1);\n                        let elMatch = _m_elSections[nextmatchup].matches[(matchOffset - (matchOffset % 2)) / 2];\n                        _SetTeamDataIntoPanel(elMatch.panel, matchOffset % 2, winteam, (winteam === team0) ? team0name : team1name, -1, teamTagPicked === winteam);\n                    }\n                }\n                if (!bMatchStillInProgress) {\n                    AddWin(GetTeamState(winteam), numWinsNeeded);\n                    AddLoss(GetTeamState((team0 == winteam) ? team1 : team0), numWinsNeeded);\n                }\n            }\n        }\n    }\n})(PredictionsBracket || (PredictionsBracket = {}));\n","scripts/tournaments/predictions_group_stage.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../popups/popup_major_hub.ts\" />\nvar PredictionsGroup;\n(function (PredictionsGroup) {\n    let _m_foundTarget = false;\n    const _m_targetNamePrefix = \"id-pickem-pick-\";\n    function Init() {\n        let oPageData = PopupMajorHub.GetActivePageData();\n        if (!oPageData.hasAlreadyInit.includes(oPageData.panel.id)) {\n            _UpdateDragTargets(oPageData);\n            _UpdateDragSourceTeams(oPageData);\n            _SetUpExtraPickBtns(oPageData);\n        }\n        InitializeMatchLister(oPageData);\n    }\n    PredictionsGroup.Init = Init;\n    function UpdateFromPredictionUploadedEvent() {\n        let oPageData = PopupMajorHub.GetActivePageData();\n        _UpdateDragTargets(oPageData);\n        _UpdateDragSourceTeams(oPageData);\n        _SetUpExtraPickBtns(oPageData);\n    }\n    PredictionsGroup.UpdateFromPredictionUploadedEvent = UpdateFromPredictionUploadedEvent;\n    function _SetUpExtraPickBtns(oPageData) {\n        let isActiveSection = PredictionsAPI.GetSectionIsActive(oPageData.tournamentId, oPageData.sectionId);\n        let canPick = PredictionsAPI.GetGroupCanPick(oPageData.tournamentId, oPageData.groupId);\n        let elRandomBtn = oPageData.panel.FindChildInLayoutFile('id-fill-random');\n        let elClearBtn = oPageData.panel.FindChildInLayoutFile('id-clear-all-picks');\n        elRandomBtn.visible = isActiveSection && canPick;\n        elClearBtn.visible = isActiveSection && canPick;\n        if (isActiveSection && !oPageData.hasAlreadyInit.includes(oPageData.panel.id)) {\n            elRandomBtn.SetPanelEvent('onactivate', () => {\n                _UpdateDragSourceTeams(oPageData);\n                _FillOutPicksRandom();\n                elRandomBtn.enabled = false;\n            });\n            elRandomBtn.SetPanelEvent('onmouseover', () => {\n                UiToolkitAPI.ShowTextTooltip('id-fill-random', '#pickem_teams_fill_tooltip');\n            });\n            elRandomBtn.SetPanelEvent('onmouseout', () => {\n                UiToolkitAPI.HideTextTooltip();\n            });\n            elClearBtn.SetPanelEvent('onactivate', () => {\n                _UpdateDragTargets(oPageData, true);\n                _UpdateDragSourceTeams(oPageData);\n            });\n            elClearBtn.SetPanelEvent('onmouseover', () => {\n                UiToolkitAPI.ShowTextTooltip('id-fill-random', '#pickem_teams_remove_all_tooltip');\n            });\n            elClearBtn.SetPanelEvent('onmouseout', () => {\n                UiToolkitAPI.HideTextTooltip();\n            });\n        }\n    }\n    function _UpdateDragSourceTeams(oPageData) {\n        let nTeams = PredictionsAPI.GetGroupTeamsCount(oPageData.tournamentId, oPageData.groupId);\n        let nActualTeams = 0;\n        let aLocalPicks = _GetLocalSetPicks(oPageData);\n        let isActiveSection = PredictionsAPI.GetSectionIsActive(oPageData.tournamentId, oPageData.sectionId);\n        let canPick = PredictionsAPI.GetGroupCanPick(oPageData.tournamentId, oPageData.groupId);\n        let elParent = oPageData.panel.FindChildInLayoutFile('id-predictions-draggable-teams');\n        const sourceNamePrefix = 'id-group' + oPageData.groupId + '-team-';\n        elParent.GetParent().FindChildInLayoutFile('id-no-teams').visible = (!(nTeams > 0) || !isActiveSection) && canPick;\n        elParent.GetParent().FindChildInLayoutFile('id-drag-teams').visible = (nTeams > 0 && isActiveSection);\n        for (let i = 0; i < nTeams; ++i) {\n            let teamId = PredictionsAPI.GetGroupTeamIDByIndex(oPageData.tournamentId, oPageData.groupId, i);\n            if (teamId !== 0 && teamId && !PredictionsAPI.GetFakeItemIDToRepresentTeamID(oPageData.tournamentId, teamId))\n                teamId = 0;\n            let elTeam = oPageData.panel.FindChildInLayoutFile(sourceNamePrefix + teamId);\n            if (teamId !== 0 && teamId) {\n                if (!elTeam) {\n                    elTeam = $.CreatePanel(\"Panel\", elParent, sourceNamePrefix + teamId);\n                    elTeam.BLoadLayoutSnippet(\"team-draggable\");\n                    elTeam.Data().teamId = teamId;\n                    elTeam.Data().isSource = true;\n                    if (isActiveSection && !oPageData.hasAlreadyInit.includes(oPageData.panel.id)) {\n                        _AddDragSourceEvents(elTeam);\n                        _ShowHideTeamTooltip(elTeam);\n                    }\n                }\n                _SetSourceDragTeamImage(elTeam, teamId);\n                let isLocalPick = aLocalPicks.find(p => p.teamId == teamId);\n                if (isLocalPick) {\n                    elTeam.SwitchClass('team-state', 'already-picked');\n                }\n                else if (!isActiveSection || !canPick) {\n                    elTeam.SwitchClass('team-state', 'team-locked');\n                }\n                else {\n                    elTeam.SwitchClass('team-state', '');\n                }\n                elTeam.hittest = !isLocalPick;\n                elTeam.hittestchildren = !isLocalPick;\n                elTeam.SetDraggable((isActiveSection && canPick) && !isLocalPick);\n                ++nActualTeams;\n            }\n        }\n        SavePicksButton.UpdateBtn(aLocalPicks);\n        if (isActiveSection) {\n            let groupPickCount = PredictionsAPI.GetGroupPicksCount(oPageData.tournamentId, oPageData.groupId);\n            oPageData.panel.FindChildInLayoutFile('id-fill-random').enabled =\n                nActualTeams > 0 &&\n                    (aLocalPicks.length < groupPickCount) &&\n                    (nActualTeams >= groupPickCount);\n            oPageData.panel.FindChildInLayoutFile('id-clear-all-picks').enabled =\n                aLocalPicks.length > 0;\n        }\n        _FillWithEmptyTeams(elParent, nActualTeams);\n    }\n    function _ShowHideTeamTooltip(elPanel, tooltipLocIdOverride = '') {\n        elPanel.SetPanelEvent('onmouseover', () => {\n            if (!elPanel.Data().teamId)\n                return;\n            let oPageData = PopupMajorHub.GetActivePageData();\n            if (oPageData && oPageData.panel) {\n                if (oPageData.panel.BHasClass('show-all-correct-picks'))\n                    return;\n            }\n            UiToolkitAPI.ShowTextTooltip(tooltipLocIdOverride ?\n                tooltipLocIdOverride :\n                elPanel.id, PredictionsAPI.GetTeamName(elPanel.Data().teamId));\n        });\n        elPanel.SetPanelEvent('onmouseout', () => {\n            UiToolkitAPI.HideTextTooltip();\n        });\n    }\n    function _FillWithEmptyTeams(elParent, nTeams) {\n        let nTeamsPossible = 16;\n        let nEmptyteams = nTeamsPossible - nTeams;\n        for (let i = 0; i < elParent.Children().length; ++i) {\n            if (elParent.Children()[i] && elParent.Children()[i].id === 'empty-team') {\n                elParent.Children()[i].DeleteAsync(0);\n            }\n        }\n        if (nEmptyteams > 0) {\n            for (let i = 0; i < nEmptyteams; ++i) {\n                let elTeam = $.CreatePanel(\"Panel\", elParent, 'empty-team');\n                elTeam.BLoadLayoutSnippet(\"team-draggable\");\n                elTeam.SwitchClass('team-state', 'empty-team');\n                elTeam.hittest = false;\n                elTeam.hittestchildren = false;\n            }\n        }\n    }\n    function _AddDragSourceEvents(elTeam) {\n        $.RegisterEventHandler('DragStart', elTeam, (elPanel, drag) => {\n            OnDragStart(elTeam, drag);\n            PopupMajorHub.GetActivePageData().panel.SetHasClass('is-dragging', true);\n            elTeam.AddClass('dragged-away');\n        });\n        $.RegisterEventHandler('DragEnd', elTeam, (elRadial, elDragImage) => {\n            OnDragEnd(elDragImage);\n            PopupMajorHub.GetActivePageData().panel.SetHasClass('is-dragging', false);\n            elTeam.RemoveClass('dragged-away');\n        });\n    }\n    function _SetSourceDragTeamImage(elTeam, teamId) {\n        let elLogoImage = elTeam.FindChildInLayoutFile('id-team-logo');\n        if (!teamId) {\n            elLogoImage.SetImage('');\n            return;\n        }\n        elLogoImage.SetImage(PopupMajorHub.GetTeamIcon(teamId));\n    }\n    function _GetLocalSetPicks(oPageData, bAllowEmptySlots = false) {\n        let nCount = PredictionsAPI.GetGroupPicksCount(oPageData.tournamentId, oPageData.groupId);\n        let aPicks = [];\n        for (let i = 0; i < nCount; ++i) {\n            let elTarget = oPageData.panel.FindChildInLayoutFile(_m_targetNamePrefix + i);\n            if (bAllowEmptySlots) {\n                aPicks.push({ teamId: elTarget.Data().teamId, group: oPageData.groupId, groupIndex: i });\n            }\n            else if (elTarget.Data().teamId) {\n                aPicks.push({ teamId: elTarget.Data().teamId, group: oPageData.groupId, groupIndex: i });\n            }\n        }\n        return aPicks;\n    }\n    function _GetLocalPickPanel(teamId) {\n        let oPageData = PopupMajorHub.GetActivePageData();\n        let nCount = PredictionsAPI.GetGroupPicksCount(oPageData.tournamentId, oPageData.groupId);\n        for (let i = 0; i < nCount; ++i) {\n            let elTarget = oPageData.panel.FindChildInLayoutFile(_m_targetNamePrefix + i);\n            if (elTarget.Data().teamId === teamId) {\n                return elTarget;\n            }\n        }\n        return null;\n    }\n    function OnDragStart(elDragSource, drag) {\n        PopupMajorHub.DeleteDragItem();\n        let elDragImage = $.CreatePanel('ItemImage', $.GetContextPanel(), '', {\n            class: 'group-stage-drag-icon',\n            textureheight: '48',\n            texturewidth: '48'\n        });\n        elDragImage.SetImage(PopupMajorHub.GetTeamIcon(elDragSource.Data().teamId));\n        elDragImage.AddClass('start-drag');\n        elDragImage.Data().teamId = elDragSource.Data().teamId;\n        elDragImage.Data().isSource = elDragSource.Data().isSource ? elDragSource.Data().isSource : false;\n        PopupMajorHub.m_elDragImage = elDragImage;\n        drag.displayPanel = elDragImage;\n        drag.offsetX = 32;\n        drag.offsetY = 32;\n        drag.removePositionBeforeDrop = false;\n        $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.inventory_item_pickup', 'MOUSE');\n        UiToolkitAPI.HideTextTooltip();\n        elDragImage.SetPanelEvent('onmouseout', () => { PopupMajorHub.DeleteDragItem(); });\n    }\n    function OnDragEnd(elDragImage) {\n        elDragImage.AddClass('drag-end');\n        PopupMajorHub.DeleteDragItem();\n        if (!_m_foundTarget && !elDragImage.Data().isSource) {\n            let elOldTarget = _GetLocalPickPanel(elDragImage.Data().teamId);\n            _UpdateDropTarget(elOldTarget, null);\n            _UpdateDragSourceTeams(PopupMajorHub.GetActivePageData());\n        }\n        _m_foundTarget = false;\n    }\n    function _UpdateDragTargets(oPageData, bForceClear = false) {\n        let nCount = PredictionsAPI.GetGroupPicksCount(oPageData.tournamentId, oPageData.groupId);\n        let isActiveSection = PredictionsAPI.GetSectionIsActive(oPageData.tournamentId, oPageData.sectionId);\n        for (let i = 0; i < nCount; ++i) {\n            let elTarget = oPageData.panel.FindChildInLayoutFile(_m_targetNamePrefix + i);\n            _MakeUniqueTooltipLocator(elTarget, oPageData.groupId, i);\n            if (bForceClear) {\n                _UpdateDropTarget(elTarget, null);\n                elTarget.SwitchClass('correct-state', 'not-active');\n            }\n            else {\n                let savedTeamId = PredictionsAPI.GetMyPredictionTeamID(oPageData.tournamentId, oPageData.groupId, i);\n                let LocalTeamId = elTarget.Data().teamId;\n                _UpdateDropTarget(elTarget, (savedTeamId ? savedTeamId : LocalTeamId ? LocalTeamId : null));\n                if (isActiveSection && !oPageData.hasAlreadyInit.includes(oPageData.panel.id)) {\n                    _ItemDragTargetEvents(elTarget);\n                    _AddDragSourceEvents(elTarget.FindChildInLayoutFile('id-team-panel'));\n                }\n                else {\n                    let sCorrectPicks = PredictionsAPI.GetGroupCorrectPicksByIndex(oPageData.tournamentId, oPageData.groupId, i);\n                    if (PopupMajorHub.CheckIfPickIsCorrect(sCorrectPicks, savedTeamId) && savedTeamId) {\n                        elTarget.SwitchClass('correct-state', 'is-correct');\n                    }\n                    else if (savedTeamId && !isActiveSection) {\n                        elTarget.SwitchClass('correct-state', 'is-incorrect');\n                    }\n                    else {\n                        elTarget.SwitchClass('correct-state', 'not-active');\n                    }\n                }\n            }\n        }\n        if (bForceClear) {\n            $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.inventory_item_notequipped', 'MOUSE');\n        }\n    }\n    function _MakeUniqueTooltipLocator(elTarget, groupId, index) {\n        let tooltipLocId = 'id-target-tooltip-loc-' + groupId + '-' + index;\n        let tooltipLoc = elTarget.FindChild(tooltipLocId);\n        let tooltipLocClass = (index === 5 || index === 6 || index === 7) ? 'group-stage-drop-target__tooltip-loc bottom' : 'group-stage-drop-target__tooltip-loc';\n        if (!tooltipLoc) {\n            tooltipLoc = $.CreatePanel('Panel', elTarget, tooltipLocId, { class: tooltipLocClass });\n            elTarget.Data().tooltipLocId = tooltipLocId;\n        }\n    }\n    function _ItemDragTargetEvents(elTarget) {\n        $.RegisterEventHandler('DragEnter', elTarget, () => {\n            elTarget.AddClass('group-stage-drag-enter');\n        });\n        $.RegisterEventHandler('DragLeave', elTarget, () => {\n            elTarget.RemoveClass('group-stage-drag-enter');\n        });\n        $.RegisterEventHandler('DragDrop', elTarget, (dispayId, elDragImage) => {\n            _OnDragDrop(elTarget, elDragImage);\n        });\n    }\n    function _OnDragDrop(elTarget, elDragImage) {\n        if (elDragImage.Data().teamId !== elTarget.Data().teamId) {\n            let elOldTarget = _GetLocalPickPanel(elDragImage.Data().teamId);\n            if (elTarget.Data().teamId) {\n                _UpdateDropTarget(elOldTarget, elTarget.Data().teamId);\n            }\n            else {\n                _UpdateDropTarget(elOldTarget, null);\n            }\n        }\n        _UpdateDropTarget(elTarget, elDragImage.Data().teamId);\n        _UpdateDragSourceTeams(PopupMajorHub.GetActivePageData());\n        $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.inventory_item_putdown', 'MOUSE');\n        _m_foundTarget = true;\n    }\n    function _UpdateDropTarget(elTarget, teamId) {\n        if (elTarget && elTarget.IsValid()) {\n            let oPageData = PopupMajorHub.GetActivePageData();\n            let isActiveSection = PredictionsAPI.GetSectionIsActive(oPageData.tournamentId, oPageData.sectionId);\n            let canPick = PredictionsAPI.GetGroupCanPick(oPageData.tournamentId, oPageData.groupId);\n            elTarget.SetDraggable((isActiveSection && canPick));\n            elTarget.Data().teamId = teamId;\n            elTarget.SetHasClass('has-pick', teamId !== null ? true : false);\n            elTarget.SetHasClass('not-active', teamId !== null);\n            if (teamId === null || !isActiveSection || !canPick) {\n                elTarget.FindChildInLayoutFile('id-team-panel').SwitchClass('team-state', 'team-locked');\n            }\n            else {\n                elTarget.FindChildInLayoutFile('id-team-panel').SwitchClass('team-state', '');\n            }\n            elTarget.FindChildInLayoutFile('id-team-panel').Data().teamId = teamId;\n            elTarget.FindChildInLayoutFile('id-team-panel').SetDraggable((isActiveSection && canPick) && teamId !== null);\n            _SetSourceDragTeamImage(elTarget, teamId);\n            _ShowHideTeamTooltip(elTarget, elTarget.Data().tooltipLocId);\n        }\n    }\n    function _FillOutPicksRandom() {\n        let oPageData = PopupMajorHub.GetActivePageData();\n        let aLocalPicks = _GetLocalSetPicks(oPageData, true);\n        let aTeams = [];\n        let nTeams = PredictionsAPI.GetGroupTeamsCount(oPageData.tournamentId, oPageData.groupId);\n        for (let i = 0; i < nTeams; ++i) {\n            aTeams.push(PredictionsAPI.GetGroupTeamIDByIndex(oPageData.tournamentId, oPageData.groupId, i));\n            aTeams = aTeams.filter(value => value !== 0);\n        }\n        if (aTeams.length === 0) {\n            return;\n        }\n        let aUnpickedTeams = aTeams.filter((value, index) => !aLocalPicks.find(p => p.teamId == value));\n        let top = aUnpickedTeams.length;\n        while (--top) {\n            var current = Math.floor(Math.random() * (top + 1));\n            var tmp = aUnpickedTeams[current];\n            aUnpickedTeams[current] = aUnpickedTeams[top];\n            aUnpickedTeams[top] = tmp;\n        }\n        let aEmptySlotsToFill = [];\n        aLocalPicks.forEach((pick, index) => {\n            if (!pick.teamId && index < aTeams.length) {\n                aEmptySlotsToFill.push(index);\n            }\n        });\n        let nDelay = 0;\n        aEmptySlotsToFill.forEach((value, index) => {\n            let elTarget = oPageData.panel.FindChildInLayoutFile(_m_targetNamePrefix + value);\n            $.Schedule(nDelay, () => {\n                _UpdateDropTarget(elTarget, aUnpickedTeams[index]);\n                $.DispatchEvent('CSGOPlaySoundEffect', 'UIPanorama.inventory_item_putdown', 'MOUSE');\n            });\n            nDelay = nDelay + .04;\n        });\n        $.Schedule(nDelay, () => { _UpdateDragSourceTeams(oPageData); });\n    }\n    let _m_elSections = {};\n    let _m_elPlacements = {};\n    function InitializeMatchLister(oPageData) {\n        if (MatchListAPI.GetState(oPageData.tournamentId) !== 'ready')\n            return;\n        for (let numWs = 0; numWs <= 2; ++numWs) {\n            for (let numLs = 0; numLs <= 2; ++numLs) {\n                let strMatchups = 'matchups-' + numWs + '-' + numLs;\n                let elMatchups = oPageData.panel.FindChildInLayoutFile(strMatchups);\n                if (!elMatchups)\n                    continue;\n                elMatchups.FindChildInLayoutFile('matchup-score').text = $.Localize('#pickem_swiss_group_' + numWs + numLs);\n                let arrTeamPairs = [];\n                for (let iMatch = 0;; ++iMatch) {\n                    let elTeamPair = elMatchups.FindChildInLayoutFile('match-idx-' + iMatch);\n                    if (!elTeamPair)\n                        break;\n                    arrTeamPairs.push({ panel: elTeamPair, keyteamwl: 0, keyteam_wins: 0, keyteam_loss: 0 });\n                    elTeamPair.SetHasClass('has_valid_matchup', false);\n                    elTeamPair.SetHasClass('has_match_in_progress', false);\n                    elTeamPair.FindChildInLayoutFile('id-team-matchup-logo-0').SetImage(oPageData.tournamentId == \"tournament:24\" ? \"file://{images}/tournaments/unknown_team_dark.svg\" : \"file://{images}/tournaments/unknown_team.svg\");\n                    elTeamPair.FindChildInLayoutFile('id-team-matchup-logo-1').SetImage(oPageData.tournamentId == \"tournament:24\" ? \"file://{images}/tournaments/unknown_team_dark.svg\" : \"file://{images}/tournaments/unknown_team.svg\");\n                    elTeamPair.Data().umids = [];\n                    elTeamPair.SetPanelEvent('onactivate', () => {\n                        let sUmids = (elTeamPair.Data().umids.length > 0) ? elTeamPair.Data().umids.join(',') : '';\n                        var contextMenuPanel = UiToolkitAPI.ShowCustomLayoutContextMenuParameters('', '', 'file://{resources}/layout/context_menus/context_menu_get_souvenir.xml', 'umids=' + sUmids +\n                            '&' + 'tournamentId=' + PopupMajorHub.GetActivePageData().eventId);\n                        contextMenuPanel.AddClass(\"ContextMenu_NoArrow\");\n                    });\n                }\n                _m_elSections[strMatchups] = { matches: arrTeamPairs, results: 0 };\n            }\n        }\n        for (let numWs = 0; numWs <= 3; ++numWs) {\n            for (let numLs = 0; numLs <= 3; ++numLs) {\n                if (numWs != 3 && numLs != 3)\n                    continue;\n                let strID = 'placement-' + numWs + '-' + numLs;\n                let elContainer = oPageData.panel.FindChildInLayoutFile(strID);\n                if (!elContainer)\n                    continue;\n                let arrSlots = [];\n                elContainer.Children().forEach(el => {\n                    if (el.BHasClass('placeholder-team-icon'))\n                        return;\n                    if (el.GetChildCount() == 0) {\n                        arrSlots.push(el);\n                    }\n                    else {\n                        el.RemoveClass('actual-result-green-check');\n                        arrSlots.push(el.FindChildInLayoutFile('placement-team-icon'));\n                    }\n                });\n                arrSlots.forEach(el => {\n                    el.SetImage(oPageData.tournamentId == \"tournament:24\" ? \"file://{images}/tournaments/unknown_team_dark.svg\" : \"file://{images}/tournaments/unknown_team.svg\");\n                });\n                _m_elPlacements[strID] = { slots: arrSlots, results: 0 };\n            }\n        }\n        let numBestOf1Rounds = ((g_ActiveTournamentInfo.eventid >= 26)\n            && (oPageData.sectionIndex >= g_ActiveTournamentInfo.num_stages_with_swiss - 1))\n            ? 0 : 2;\n        let teamStates = {};\n        function GetTeamState(teamid) {\n            if (!teamStates.hasOwnProperty(teamid)) {\n                teamStates[teamid] = {\n                    wins: 0,\n                    loss: 0,\n                    bo3w: 0,\n                    bo3l: 0\n                };\n            }\n            return teamStates[teamid];\n        }\n        function AddWin(state) {\n            if (state.wins >= numBestOf1Rounds || state.loss >= numBestOf1Rounds) {\n                ++state.bo3w;\n                if (state.bo3w >= 2) {\n                    state.bo3w = state.bo3l = 0;\n                    ++state.wins;\n                }\n            }\n            else {\n                ++state.wins;\n            }\n        }\n        function AddLoss(state) {\n            if (state.wins >= numBestOf1Rounds || state.loss >= numBestOf1Rounds) {\n                ++state.bo3l;\n                if (state.bo3l >= 2) {\n                    state.bo3l = state.bo3w = 0;\n                    ++state.loss;\n                }\n            }\n            else {\n                ++state.loss;\n            }\n        }\n        let nCount = PredictionsAPI.GetSectionMatchesCount(oPageData.tournamentId, oPageData.sectionId);\n        for (let idxMatch = nCount; idxMatch-- > 0;) {\n            let umid = PredictionsAPI.GetSectionMatchByIndex(oPageData.tournamentId, oPageData.sectionId, idxMatch);\n            let team0 = MatchInfoAPI.GetMatchTournamentTeamTag(umid, 0);\n            let team1 = MatchInfoAPI.GetMatchTournamentTeamTag(umid, 1);\n            let res = MatchInfoAPI.GetMatchOutcome(umid);\n            let bMatchStillInProgress = (!res || res <= 0);\n            let winteam = ((res == 2) ? team1 : team0);\n            let keyteam = (team0 < team1) ? team0 : team1;\n            let steam = GetTeamState(keyteam);\n            let matchup = 'matchups-' + steam.wins + '-' + steam.loss;\n            if (!_m_elSections[matchup].hasOwnProperty(keyteam)) {\n                _m_elSections[matchup][keyteam] = _m_elSections[matchup].results;\n                ++_m_elSections[matchup].results;\n            }\n            if (_m_elSections[matchup][keyteam] < _m_elSections[matchup].matches.length) {\n                let omatch = _m_elSections[matchup].matches[_m_elSections[matchup][keyteam]];\n                let elTeamPair = omatch.panel;\n                let nCountThisMatchForBO3 = bMatchStillInProgress ? 0 : 1;\n                omatch.keyteamwl += ((winteam == keyteam) ? 1 : -1) * nCountThisMatchForBO3;\n                omatch.keyteam_wins += ((winteam == keyteam) ? 1 : 0) * nCountThisMatchForBO3;\n                omatch.keyteam_loss += ((winteam != keyteam) ? 1 : 0) * nCountThisMatchForBO3;\n                let bSwap01 = (omatch.keyteamwl >= 0) ? ((team0 == keyteam) ? false : true)\n                    : ((team0 == keyteam) ? true : false);\n                let nLeftScore = 0;\n                let nRightScore = 0;\n                if (steam.wins >= numBestOf1Rounds || steam.loss >= numBestOf1Rounds) {\n                    nLeftScore = (omatch.keyteam_wins >= omatch.keyteam_loss) ? omatch.keyteam_wins : omatch.keyteam_loss;\n                    nRightScore = (omatch.keyteam_wins < omatch.keyteam_loss) ? omatch.keyteam_wins : omatch.keyteam_loss;\n                }\n                else {\n                    nLeftScore = MatchInfoAPI.GetMatchRoundScoreForTeam(umid, bSwap01 ? 1 : 0);\n                    nRightScore = MatchInfoAPI.GetMatchRoundScoreForTeam(umid, bSwap01 ? 0 : 1);\n                }\n                elTeamPair.SetHasClass('has_valid_matchup', true);\n                elTeamPair.SetHasClass('has_match_in_progress', bMatchStillInProgress);\n                elTeamPair.FindChildInLayoutFile('id-team-matchup-logo-0').SetImage(\"file://{images}/tournaments/teams/\" +\n                    (bSwap01 ? team1 : team0) + \".svg\");\n                elTeamPair.FindChildInLayoutFile('id-team-matchup-logo-1').SetImage(\"file://{images}/tournaments/teams/\" +\n                    (bSwap01 ? team0 : team1) + \".svg\");\n                elTeamPair.SetDialogVariableInt('match-score-0', nLeftScore);\n                elTeamPair.SetDialogVariableInt('match-score-1', nRightScore);\n                elTeamPair.Data().umids.push(umid);\n                if (bMatchStillInProgress)\n                    elTeamPair.Data().umids = [];\n            }\n            if (!bMatchStillInProgress) {\n                AddWin(GetTeamState(winteam));\n                AddLoss(GetTeamState((team0 == winteam) ? team1 : team0));\n            }\n        }\n        for (let teamtag in teamStates) {\n            if (teamStates[teamtag].wins < 3 && teamStates[teamtag].loss < 3)\n                continue;\n            let strID = 'placement-' + teamStates[teamtag].wins + '-' + teamStates[teamtag].loss;\n            let idx = _m_elPlacements[strID].results++;\n            if (idx >= _m_elPlacements[strID].slots.length)\n                continue;\n            _m_elPlacements[strID].slots[idx].SetImage(\"file://{images}/tournaments/teams/\" + teamtag + \".svg\");\n            let elParent = _m_elPlacements[strID].slots[idx].GetParent();\n            if (elParent && elParent.id.startsWith('id-pickem-pick-')) {\n                let pickSlotIdx = parseInt(elParent.id.substring('id-pickem-pick-'.length));\n                let pickSlotRange = (pickSlotIdx >= 0 && pickSlotIdx <= 1) ? { begin: 0, end: 1 } :\n                    (pickSlotIdx >= 2 && pickSlotIdx <= 7) ? { begin: 2, end: 7 } :\n                        (pickSlotIdx >= 8 && pickSlotIdx <= 9) ? { begin: 8, end: 9 } :\n                            { begin: pickSlotIdx, end: pickSlotIdx };\n                let bCorrectActualPick = false;\n                for (let jj = pickSlotRange.begin; jj <= pickSlotRange.end; ++jj) {\n                    let teamidPicked = PredictionsAPI.GetMyPredictionTeamID(oPageData.tournamentId, oPageData.groupId, jj);\n                    let teamTagPicked = PredictionsAPI.GetTeamTag(teamidPicked);\n                    if (teamTagPicked === teamtag) {\n                        bCorrectActualPick = true;\n                        break;\n                    }\n                }\n                elParent.SetHasClass('actual-result-green-check', bCorrectActualPick);\n            }\n        }\n    }\n})(PredictionsGroup || (PredictionsGroup = {}));\n","scripts/tournaments/predictions_timer.js":"\"use strict\";\n/// <reference path=\"../csgo.d.ts\" />\n/// <reference path=\"../common/formattext.ts\" />\n/// <reference path=\"../popups/popup_major_hub.ts\" />\nvar PredictionsTimer;\n(function (PredictionsTimer) {\n    function UpdateTimer() {\n        let oPageData = PopupMajorHub.GetActivePageData();\n        if (!oPageData || !oPageData.tournamentId)\n            return;\n        if (oPageData.panel.Data().handlerLockPicksTimerSch) {\n            oPageData.panel.Data().handlerLockPicksTimerSch = null;\n        }\n        let elIcon = oPageData.panel.FindChildTraverse('id-predictions-timer-icon');\n        let elParent = oPageData.panel.FindChildTraverse('id-predictions-timer');\n        elParent.SwitchClass('state', '');\n        let canPick = PredictionsAPI.GetGroupCanPick(oPageData.tournamentId, oPageData.groupId);\n        let secRemaining = PredictionsAPI.GetGroupRemainingPredictionSeconds(oPageData.tournamentId, oPageData.groupId);\n        let isActive = PredictionsAPI.GetSectionIsActive(oPageData.tournamentId, oPageData.sectionId);\n        if (!canPick) {\n            elIcon.SetImage('file://{images}/icons/ui/locked.svg');\n            oPageData.panel.SetDialogVariable('lock_state', $.Localize('#pickem_timer_locked'));\n        }\n        else if (!isActive && canPick) {\n            elParent.SwitchClass('state', 'not-active');\n            elIcon.SetImage('file://{images}/icons/ui/locked.svg');\n            oPageData.panel.SetDialogVariable('lock_state', $.Localize('#pickem_timer_inactive'));\n        }\n        else if (canPick && secRemaining > 0) {\n            elIcon.SetImage('file://{images}/icons/ui/clock.svg');\n            oPageData.panel.SetDialogVariable('time', FormatText.SecondsToSignificantTimeString(secRemaining));\n            oPageData.panel.SetDialogVariable('lock_state', $.Localize('#pickem_timer', oPageData.panel));\n            if (!oPageData.panel.Data().handlerLockPicksTimerSch) {\n                oPageData.panel.Data().handlerLockPicksTimerSch = $.Schedule(1, () => { UpdateTimer(); });\n            }\n        }\n        else {\n            elIcon.SetImage('file://{images}/icons/ui/clock.svg');\n            oPageData.panel.SetDialogVariable('time', FormatText.SecondsToSignificantTimeString(60));\n            oPageData.panel.SetDialogVariable('lock_state', $.Localize('#pickem_timer', oPageData.panel));\n        }\n    }\n    PredictionsTimer.UpdateTimer = UpdateTimer;\n})(PredictionsTimer || (PredictionsTimer = {}));\n","scripts/util_gamemodeflags.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\nvar GameModeFlags;\n(function (GameModeFlags) {\n    const k_gamemodeflags = {\n        competitive: {\n            name: 'competitive',\n            flags: [\n                16\n            ],\n            icons: [\n                'file://{images}/icons/ui/timer_long.svg'\n            ],\n            user_visible_flags: false\n        },\n        deathmatch: {\n            name: 'deathmatch',\n            flags: [\n                32\n            ],\n            icons: [\n                'file://{images}/icons/ui/free_for_all.svg'\n            ],\n            user_visible_flags: true\n        }\n    };\n    function GetIcon(mode, flags) {\n        const iconIndex = k_gamemodeflags[mode].flags.indexOf(flags);\n        return k_gamemodeflags[mode].icons[iconIndex];\n    }\n    GameModeFlags.GetIcon = GetIcon;\n    function GetOptionsString(mode) {\n        let s = '';\n        const arr = k_gamemodeflags[mode].flags;\n        for (let i = 0; i < arr.length; ++i) {\n            s += '&option' + i + '=' + arr[i];\n        }\n        return s;\n    }\n    GameModeFlags.GetOptionsString = GetOptionsString;\n    function AreFlagsValid(mode, flags) {\n        const arrPossibleFlags = k_gamemodeflags[mode].flags;\n        return (arrPossibleFlags.indexOf(flags) != -1);\n    }\n    GameModeFlags.AreFlagsValid = AreFlagsValid;\n    function DoesModeUseFlags(mode) {\n        return k_gamemodeflags.hasOwnProperty(mode);\n    }\n    GameModeFlags.DoesModeUseFlags = DoesModeUseFlags;\n    function DoesModeShowUserVisibleFlags(mode) {\n        return (k_gamemodeflags.hasOwnProperty(mode)) ? k_gamemodeflags[mode].user_visible_flags : false;\n    }\n    GameModeFlags.DoesModeShowUserVisibleFlags = DoesModeShowUserVisibleFlags;\n    function GetFlags() {\n        return k_gamemodeflags;\n    }\n    GameModeFlags.GetFlags = GetFlags;\n})(GameModeFlags || (GameModeFlags = {}));\n","scripts/vanity_pet_info.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"avatar.ts\" />\n/// <reference path=\"common/sessionutil.ts\" />\n/// <reference path=\"mock_adapter.ts\" />\n/// <reference path=\"rating_emblem.ts\" />\nvar VanityPetInfo;\n(function (VanityPetInfo) {\n    let _m_zoomedPetId = null;\n    VanityPetInfo._m_idPrefix = \"id-mainmenu-pet-info\";\n    let _m_infoPanel;\n    let _m_textEntry;\n    let _m_petId;\n    let _m_scheduleEggTimerHandle;\n    let _m_focusEventHandler;\n    let _m_oldName = '';\n    _m_scheduleEggTimerHandle = null;\n    function CreateOrUpdatePetInfoPanel(elParent, petItemId) {\n        let newPanel = elParent.FindChildInLayoutFile(VanityPetInfo._m_idPrefix);\n        if (!petItemId || Number(petItemId) === 0) {\n            RemovePanel(elParent);\n            return null;\n        }\n        if (!newPanel) {\n            newPanel = $.CreatePanel('Panel', elParent, VanityPetInfo._m_idPrefix);\n            newPanel.BLoadLayout('file://{resources}/layout/vanity_pet_info.xml', false, false);\n        }\n        _m_petId = petItemId;\n        let nPetUpgradeLevel = Number(InventoryAPI.GetItemAttributeValue(petItemId, '{uint32}upgrade level'));\n        newPanel.SetHasClass('is-grown', nPetUpgradeLevel > 1);\n        newPanel.SetHasClass('show', true);\n        _m_infoPanel = newPanel;\n        _m_textEntry = newPanel.FindChildInLayoutFile('id-name-input-text');\n        _m_textEntry.SetMaxChars(20);\n        if (!_m_focusEventHandler) {\n            _m_focusEventHandler = true;\n            $.RegisterEventHandler('InputFocusLost', _m_textEntry, () => {\n                if (newPanel.BHasClass('text-entry-active')) {\n                    _CloseTextEntry();\n                    newPanel.SetHasClass('hover-show', false);\n                }\n            });\n        }\n        const bCanRenameThisLifeStage = (nPetUpgradeLevel >= 1) && !InventoryAPI.GetItemAttributeValue(petItemId, '{bytestring}custom name attr'\n            + ((nPetUpgradeLevel >= 2) ? ' ' + nPetUpgradeLevel : ''));\n        _SetButtonEvents(newPanel, petItemId, nPetUpgradeLevel, bCanRenameThisLifeStage);\n        _HoverEvents(newPanel, nPetUpgradeLevel);\n        _ShowFoodHint(newPanel, petItemId);\n        let petName = InventoryAPI.GetItemName(petItemId);\n        let elPetName = newPanel.FindChildInLayoutFile('id-pet-name');\n        if (petItemId !== '' && petItemId !== undefined) {\n            newPanel.SetDialogVariable('pet_name', InventoryAPI.HasCustomName(petItemId) ? petName : \"\");\n            elPetName.SetHasClass('has-name', InventoryAPI.HasCustomName(petItemId));\n            if (_m_oldName !== petName) {\n                _m_oldName = petName;\n                elPetName.TriggerClass('name-update');\n                _CloseTextEntry();\n            }\n        }\n        return newPanel;\n    }\n    VanityPetInfo.CreateOrUpdatePetInfoPanel = CreateOrUpdatePetInfoPanel;\n    function RemovePanel(elParent) {\n        let elPanel = elParent.FindChildInLayoutFile(VanityPetInfo._m_idPrefix);\n        if (elPanel && elPanel.IsValid()) {\n            CancelEggTimer();\n            elPanel.RemoveClass('show');\n        }\n    }\n    VanityPetInfo.RemovePanel = RemovePanel;\n    function _RoundToPixel(context, value, axis) {\n        const scale = axis === \"x\" ? context.actualuiscale_x : context.actualuiscale_y;\n        return Math.round(value * scale) / scale;\n    }\n    function SetVanityPetInfoPos(elParent, oPos) {\n        let elPanel = elParent.FindChildInLayoutFile(\"id-mainmenu-pet-info\");\n        if (!elPanel || !elPanel.IsValid()) {\n            return;\n        }\n        elPanel.style.transform = 'translate3d( ' + _RoundToPixel(elParent, oPos.x, \"x\") + 'px, ' + _RoundToPixel(elParent, oPos.y, \"y\") + 'px, 0px );';\n    }\n    VanityPetInfo.SetVanityPetInfoPos = SetVanityPetInfoPos;\n    function _HoverEvents(elPanel, nPetUpgradeLevel) {\n        let elHoverTarget = elPanel.FindChild('id-vanity-pet-hitbox');\n        elHoverTarget.SetPanelEvent('onmouseover', () => {\n            if (!SessionUtil.BCanUseMyPetInCurrentLobby()) {\n                return;\n            }\n            if (!InventoryAPI.GetPetItemID()) {\n                return;\n            }\n            _UpdateProgressBars(nPetUpgradeLevel);\n            _ShowFoodHint(elPanel, InventoryAPI.GetPetItemID());\n            elPanel.SetHasClass('hover-show', true);\n        });\n        elPanel.SetPanelEvent('onmouseout', () => {\n            elPanel.SetHasClass('hover-show', elPanel.BHasClass('text-entry-active'));\n        });\n    }\n    function _SetButtonEvents(elPanel, petId, nPetUpgradeLevel, bCanRenameThisLifeStage) {\n        elPanel.FindChildInLayoutFile('id-inspect-pet').SetPanelEvent('onactivate', () => {\n            $.DispatchEvent(\"InventoryItemPreview\", petId, '');\n        });\n        let elNameTag = elPanel.FindChildInLayoutFile('id-name-pet');\n        if (bCanRenameThisLifeStage) {\n            elNameTag.SetPanelEvent('onactivate', () => {\n                _m_textEntry.text = _nameWithQuotes(petId);\n                _m_textEntry.SetFocus();\n                elPanel.SetHasClass('text-entry-active', true);\n                $.DispatchEvent('CSGOPlaySoundEffect', 'sidemenu_slidein', 'MOUSE');\n            });\n        }\n        elNameTag.SetHasClass('hide', !bCanRenameThisLifeStage);\n        elNameTag.SetPanelEvent('onmouseover', () => {\n            UiToolkitAPI.ShowTextTooltip('id-name-pet', InventoryAPI.HasCustomName(petId) ? '#pet_tooltip_rename' : '#pet_tooltip_name');\n        });\n        let elPhotoBooth = elPanel.FindChildInLayoutFile('id-photo-booth');\n        elPhotoBooth.SetPanelEvent('onactivate', () => { _OpenPhotoBooth(nPetUpgradeLevel); });\n        elPhotoBooth.SetHasClass('hide', nPetUpgradeLevel < 1);\n        let elPetBook = elPanel.FindChildInLayoutFile('id-pet-book');\n        elPetBook.SetPanelEvent('onactivate', _OpenPetBook);\n        elPetBook.SetHasClass('hide', nPetUpgradeLevel < 1);\n        elPanel.FindChildInLayoutFile('id-name-input-text-cancel').SetPanelEvent('onactivate', CancelTextEntry);\n        elPanel.FindChildInLayoutFile('id-name-input-text-submit').SetPanelEvent('onactivate', () => { _SubmitText(petId); });\n        elPanel.FindChildInLayoutFile('id-name-input-text-back').SetPanelEvent('onactivate', _CloseTextEntry);\n        _EnableDisableSubmitButton(false);\n    }\n    function CancelTextEntry() {\n        if (_m_infoPanel !== null && _m_infoPanel.IsValid())\n            _m_textEntry.text = '';\n    }\n    VanityPetInfo.CancelTextEntry = CancelTextEntry;\n    function _SubmitText(petId) {\n        const fauxNameTag = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(1200, 0);\n        InventoryAPI.UseTool(fauxNameTag, petId);\n    }\n    function _EnableDisableSubmitButton(bEnable) {\n        if (_m_infoPanel !== null && _m_infoPanel.IsValid()) {\n            _m_infoPanel.FindChildInLayoutFile('id-name-input-text-submit').enabled = (bEnable && _m_textEntry.text != _nameWithQuotes(_m_petId));\n        }\n    }\n    function _CloseTextEntry() {\n        $.DispatchEvent('CSGOPlaySoundEffect', 'sidemenu_slideout', 'MOUSE');\n        _m_infoPanel.SetHasClass('text-entry-active', false);\n    }\n    function OnEntryChanged() {\n        let isValid = InventoryAPI.SetNameToolString(_m_textEntry.text, '');\n        _EnableDisableSubmitButton(isValid);\n        $.DispatchEvent(\"CSGOPlaySoundEffect\", \"rename_teletype\", \"MOUSE\");\n    }\n    VanityPetInfo.OnEntryChanged = OnEntryChanged;\n    ;\n    function _nameWithQuotes(petId) {\n        let nameWithQuotes = InventoryAPI.GetItemName(petId);\n        if (nameWithQuotes && nameWithQuotes.length > 4\n            && nameWithQuotes[0] == \"'\" && nameWithQuotes[1] == \"'\"\n            && nameWithQuotes[nameWithQuotes.length - 1] == \"'\" && nameWithQuotes[nameWithQuotes.length - 2] == \"'\") {\n            return nameWithQuotes.substring(2, nameWithQuotes.length - 2);\n        }\n        else {\n            return nameWithQuotes;\n        }\n    }\n    function _BPetNeedsFood(petItemId) {\n        const nPetUpgradeLevel = Number(InventoryAPI.GetItemAttributeValue(petItemId, '{uint32}upgrade level'));\n        if (nPetUpgradeLevel < 1)\n            return false;\n        const rtFoodExp = Number(InventoryAPI.GetItemAttributeValue(petItemId, '{uint32}pet food expiration date'));\n        const rtPetUpgr = Number(InventoryAPI.GetItemAttributeValue(petItemId, '{uint32}pet next upgrade date'));\n        return !!(rtFoodExp && rtPetUpgr && (rtFoodExp < rtPetUpgr));\n    }\n    function _ShowFoodHint(elPanel, petItemId) {\n        const bLowFood = InventoryAPI.IsPetLowOnFood(petItemId);\n        const bNeedsFood = _BPetNeedsFood(petItemId);\n        elPanel.SetHasClass('low-food', bLowFood);\n        elPanel.SetHasClass('needs-food', bNeedsFood);\n        if (!bLowFood && !bNeedsFood)\n            return;\n        const elWarning = elPanel.FindChildInLayoutFile('id-pet-food-warning');\n        const elIcon = elPanel.FindChildInLayoutFile('id-pet-food-warning-icon');\n        const elLabel = elPanel.FindChildInLayoutFile('id-pet-food-warning-label');\n        elIcon.SetImage(bLowFood ? 'file://{images}/icons/ui/warning.svg' : 'file://{images}/icons/ui/pet_feed.svg');\n        const szHint = bLowFood ? '#pet_low_food_hint' : '#pet_needs_food_hint';\n        if (InventoryAPI.HasCustomName(petItemId)) {\n            elWarning.SetDialogVariable('name', _nameWithQuotes(petItemId));\n            elLabel.text = $.Localize(szHint + '_name', elWarning);\n            return;\n        }\n        elLabel.text = $.Localize(szHint);\n    }\n    function BShouldKeepZoom(petItemIdOnScreen) {\n        return SessionUtil.BCanUseMyPetInCurrentLobby() && _m_zoomedPetId === petItemIdOnScreen;\n    }\n    VanityPetInfo.BShouldKeepZoom = BShouldKeepZoom;\n    function SetZoomBtns(elMapPanel, elPanel, petItemId) {\n        let elZoomInBtn = elPanel.FindChildInLayoutFile('id-zoom-in-pet');\n        elZoomInBtn.SetPanelEvent('onactivate', () => {\n            elMapPanel.TransitionToCamera('cam_pet', 1);\n            $.DispatchEvent('CSGOPlaySoundEffect', 'Chicken.Vanity.ZoomIn', 'MOUSE');\n            elMapPanel.SetParallaxOffset(elMapPanel.Data().parallax_zoomed);\n            _m_zoomedPetId = petItemId;\n            elPanel.TriggerClass('hide-during-zoom');\n            elPanel.SetHasClass('is-zoomed', true);\n        });\n        let elZoomOutBtn = elPanel.FindChildInLayoutFile('id-zoom-out-pet');\n        elZoomOutBtn.SetPanelEvent('onactivate', () => {\n            elMapPanel.TransitionToCamera('cam_default', 1);\n            $.DispatchEvent('CSGOPlaySoundEffect', 'Chicken.Vanity.ZoomOut', 'MOUSE');\n            elMapPanel.SetParallaxOffset(elMapPanel.Data().parallax_unzoomed);\n            _m_zoomedPetId = null;\n            elPanel.SetHasClass('is-zoomed', false);\n            elPanel.TriggerClass('hide-during-zoom');\n        });\n        elPanel.SetHasClass('is-zoomed', _m_zoomedPetId === petItemId);\n    }\n    VanityPetInfo.SetZoomBtns = SetZoomBtns;\n    function ResetPetZoom(elMapPanel) {\n        if (_m_zoomedPetId === null) {\n            return;\n        }\n        elMapPanel.TransitionToCamera('cam_default', 0);\n        elMapPanel.SetParallaxOffset(elMapPanel.Data().parallax_unzoomed);\n        _m_zoomedPetId = null;\n        if (_m_infoPanel && _m_infoPanel.IsValid()) {\n            _m_infoPanel.SetHasClass('is-zoomed', false);\n        }\n    }\n    VanityPetInfo.ResetPetZoom = ResetPetZoom;\n    function CancelEggTimer() {\n        if (_m_scheduleEggTimerHandle) {\n            $.CancelScheduled(_m_scheduleEggTimerHandle);\n            _m_scheduleEggTimerHandle = null;\n        }\n    }\n    VanityPetInfo.CancelEggTimer = CancelEggTimer;\n    function _UpdateProgressBars(nPetUpgradeLevel) {\n        function _UpdateProgressMeter(idMeter, nLevelValue, flFillRatio) {\n            const elProgress = _m_infoPanel.FindChildInLayoutFile(idMeter);\n            const nGrowth = (nPetUpgradeLevel < nLevelValue) ? 0\n                : (nPetUpgradeLevel < nLevelValue + 1) ? flFillRatio\n                    : 1;\n            UpdateRadialProgressBar(elProgress, nGrowth, nPetUpgradeLevel === nLevelValue, nPetUpgradeLevel > nLevelValue);\n        }\n        _UpdateProgressMeter('id-pet-milestone-egg', 0, InventoryAPI.GetPetGrowthPercent(_m_petId));\n        const flLifeStageMeter = 1 - InventoryAPI.GetPetLifetimeRemaining(_m_petId);\n        _UpdateProgressMeter('id-pet-milestone-chick', 1, flLifeStageMeter);\n        _UpdateProgressMeter('id-pet-milestone-pullet', 2, flLifeStageMeter);\n        _UpdateProgressMeter('id-pet-milestone-hen', 3, flLifeStageMeter);\n    }\n    function UpdateRadialProgressBar(elProgress, nGrowth, IsActive, isComplete) {\n        const elRadial = elProgress.FindChild('id-pet-progress-timer');\n        if (!nGrowth && nGrowth !== 0) {\n            elRadial.style.clip = 'radial(50% 50%, 0deg, 0deg, deg)';\n            return;\n        }\n        const nDegrees = isComplete ? 360 : Math.floor(nGrowth * 360);\n        elRadial.style.clip = 'radial(50% 50%, 0deg, ' + nDegrees + 'deg)';\n        elProgress.SetHasClass('active', IsActive);\n        elProgress.SetHasClass('complete', isComplete);\n    }\n    function UpdateProgressBar(elProgress, nFeedEarned, IsActive, isComplete) {\n        if ((!nFeedEarned && nFeedEarned !== 0))\n            return;\n        const aPips = elProgress.FindChild('id-pet-progress-bar')?.Children();\n        aPips?.forEach((pip, idx) => {\n            pip.SetHasClass('filled', ((nFeedEarned >= idx + 1 && IsActive) || isComplete));\n        });\n        elProgress.SetHasClass('active', IsActive);\n        elProgress.SetHasClass('complete', isComplete);\n    }\n    function _OpenPetBook() {\n        UiToolkitAPI.ShowCustomLayoutPopup('', 'file://{resources}/layout/popups/popup_pet_book.xml');\n    }\n    function _OpenPhotoBooth(nPetUpgradeLevel) {\n        const OnClosePetEventNotification = UiToolkitAPI.RegisterJSCallback(() => { });\n        UiToolkitAPI.ShowCustomLayoutPopupParameters('', 'file://{resources}/layout/popups/popup_pet_photobooth.xml', 'action-type=expire'\n            + '&' + 'title=' + ''\n            + '&' + 'msg=' + ''\n            + '&' + 'pet_id=' + _m_petId\n            + '&' + 'photo_booth=' + 'true'\n            + '&' + 'upgrade_level=' + nPetUpgradeLevel\n            + '&' + 'callback=' + OnClosePetEventNotification);\n    }\n    {\n        if ($.DbgIsReloadingScript()) {\n        }\n    }\n})(VanityPetInfo || (VanityPetInfo = {}));\n","scripts/vanity_player_info.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"avatar.ts\" />\n/// <reference path=\"common/sessionutil.ts\" />\n/// <reference path=\"mock_adapter.ts\" />\n/// <reference path=\"rating_emblem.ts\" />\nvar VanityPlayerInfo;\n(function (VanityPlayerInfo) {\n    function CreateOrUpdateVanityInfoPanel(elParent = null, oSettings = null) {\n        if (!elParent) {\n            elParent = $.GetContextPanel();\n        }\n        const idPrefix = \"id-player-vanity-info-\" + oSettings.playeridx;\n        let newPanel = elParent.FindChildInLayoutFile(idPrefix);\n        if (!newPanel) {\n            newPanel = $.CreatePanel('Button', elParent, idPrefix);\n            newPanel.BLoadLayout('file://{resources}/layout/vanity_player_info.xml', false, false);\n            newPanel.AddClass('vanity-info-loc-' + oSettings.playeridx);\n            newPanel.AddClass('show');\n        }\n        _SetName(newPanel, oSettings.xuid);\n        _SetAvatar(newPanel, oSettings.xuid);\n        _SetRank(newPanel, oSettings.xuid, oSettings.isLocalPlayer);\n        _SetSkillGroup(newPanel, oSettings.xuid, oSettings.isLocalPlayer);\n        _SetHonorIcon(newPanel, oSettings.xuid);\n        _AddOpenPlayerCardAction(newPanel.FindChildInLayoutFile('vanity-info-container'), oSettings.xuid);\n        _SetLobbyLeader(newPanel, oSettings.xuid);\n        _ShowSettingsBtn(newPanel, oSettings.xuid);\n        return newPanel;\n    }\n    VanityPlayerInfo.CreateOrUpdateVanityInfoPanel = CreateOrUpdateVanityInfoPanel;\n    function DeleteVanityInfoPanel(elParent, index) {\n        const idPrefix = \"id-player-vanity-info-\" + index;\n        const elPanel = elParent.FindChildInLayoutFile(idPrefix);\n        if (elPanel && elPanel.IsValid()) {\n            elPanel.DeleteAsync(0);\n        }\n    }\n    VanityPlayerInfo.DeleteVanityInfoPanel = DeleteVanityInfoPanel;\n    function _RoundToPixel(context, value, axis) {\n        const scale = axis === \"x\" ? context.actualuiscale_x : context.actualuiscale_y;\n        return Math.round(value * scale) / scale;\n    }\n    function SetVanityInfoPanelPos(elParent, index, oPos, idPrefix, OnlyXOrY) {\n        const elPanel = elParent.FindChildInLayoutFile(idPrefix);\n        if (elPanel && elPanel.IsValid()) {\n            switch (OnlyXOrY) {\n                case 'x':\n                    elPanel.style.transform = 'translateX( ' + oPos.x + 'px );';\n                    break;\n                case 'y':\n                    elPanel.style.transform = 'translateY( ' + oPos.x + 'px );';\n                    break;\n                default:\n                    elPanel.style.transform = 'translate3d( ' + _RoundToPixel(elParent, oPos.x, \"x\") + 'px, ' + _RoundToPixel(elParent, oPos.y, \"y\") + 'px, 0px );';\n                    break;\n            }\n        }\n    }\n    VanityPlayerInfo.SetVanityInfoPanelPos = SetVanityInfoPanelPos;\n    function _SetName(newPanel, xuid) {\n        newPanel.SetDialogVariable('partyxuid', xuid);\n    }\n    function _SetAvatar(newPanel, xuid) {\n        const elParent = newPanel.FindChildInLayoutFile('vanity-avatar-container');\n        let elAvatar = elParent.FindChildInLayoutFile('JsPlayerVanityAvatar-' + xuid);\n        if (!elAvatar) {\n            elAvatar = $.CreatePanel(\"Panel\", elParent, 'JsPlayerVanityAvatar-' + xuid);\n            elAvatar.SetAttributeString('xuid', xuid);\n            elAvatar.BLoadLayout('file://{resources}/layout/avatar.xml', false, false);\n            elAvatar.BLoadLayoutSnippet(\"AvatarPlayerCard\");\n            elAvatar.AddClass('avatar--vanity');\n        }\n        Avatar.Init(elAvatar, xuid, 'partymember');\n        if (MockAdapter.IsFakePlayer(xuid)) {\n            const elAvatarImage = elAvatar.FindChildInLayoutFile(\"JsAvatarImage\");\n            elAvatarImage.PopulateFromPlayerSlot(MockAdapter.GetPlayerSlot(xuid));\n        }\n    }\n    function _SetRank(newPanel, xuid, isLocalPlayer) {\n        const elRankIcon = newPanel.FindChildInLayoutFile('vanity-xp-icon');\n        const elXpBarInner = newPanel.FindChildInLayoutFile('vanity-xp-bar-inner');\n        if (!isLocalPlayer || !MyPersonaAPI.IsInventoryValid()) {\n            newPanel.FindChildInLayoutFile('vanity-xp-container').visible = false;\n            return;\n        }\n        newPanel.FindChildInLayoutFile('vanity-xp-container').visible = true;\n        const currentLvl = FriendsListAPI.GetFriendLevel(xuid);\n        if (!MyPersonaAPI.IsInventoryValid() ||\n            !currentLvl ||\n            (!_HasXpProgressToFreeze() && !_IsPlayerPrime(xuid))) {\n            newPanel.AddClass('no-valid-xp');\n            return;\n        }\n        const bHasRankToFreezeButNoPrestige = (!_IsPlayerPrime(xuid) && _HasXpProgressToFreeze()) ? true : false;\n        const currentPoints = FriendsListAPI.GetFriendXp(xuid);\n        const pointsPerLevel = MyPersonaAPI.GetXpPerLevel();\n        if (bHasRankToFreezeButNoPrestige) {\n            elXpBarInner.GetParent().visible = false;\n        }\n        else {\n            const percentComplete = (currentPoints / pointsPerLevel) * 100;\n            elXpBarInner.style.width = percentComplete + '%';\n            elXpBarInner.GetParent().visible = true;\n            _ShowPrestigeUpgrade(newPanel, xuid, isLocalPlayer);\n        }\n        elRankIcon.SetImage('file://{images}/icons/xp/level' + currentLvl + '.png');\n        newPanel.RemoveClass('no-valid-xp');\n    }\n    function _SetSkillGroup(newPanel, xuid, isLocalPlayer) {\n        let rating_type;\n        let score;\n        let wins;\n        if (isLocalPlayer && !PartyListAPI.IsPartySessionActive()) {\n            rating_type = 'Premier';\n            score = MyPersonaAPI.GetPipRankCount(rating_type);\n            wins = MyPersonaAPI.GetPipRankWins(rating_type);\n        }\n        else {\n            rating_type = PartyListAPI.GetFriendCompetitiveRankType(xuid);\n            score = PartyListAPI.GetFriendCompetitiveRank(xuid);\n            wins = PartyListAPI.GetFriendCompetitiveWins(xuid);\n        }\n        let options = {\n            root_panel: newPanel,\n            do_fx: true,\n            full_details: false,\n            rating_type: rating_type,\n            leaderboard_details: { score: score, matchesWon: wins },\n            local_player: xuid === MyPersonaAPI.GetXuid()\n        };\n        RatingEmblem.SetXuid(options);\n        newPanel.SetDialogVariable('rating-text', RatingEmblem.GetRatingDesc(newPanel));\n    }\n    function _SetHonorIcon(elPanel, xuid) {\n        const elHonorIcon = elPanel.FindChildTraverse('jsHonorIcon');\n        if (elHonorIcon) {\n            elHonorIcon.Set(PartyListAPI.GetFriendXpTrailLevel(xuid), PartyListAPI.GetFriendPrimeEligible(xuid));\n        }\n    }\n    function _ShowPrestigeUpgrade(elPanel, xuid, isLocalPlayer) {\n        let bPrestigeAvailable = isLocalPlayer && (FriendsListAPI.GetFriendLevel(xuid) >= InventoryAPI.GetMaxLevel());\n        elPanel.FindChildInLayoutFile('vanity-xp-prestige').SetHasClass('hidden', !bPrestigeAvailable);\n        if (bPrestigeAvailable) {\n            elPanel.FindChildInLayoutFile('vanity-xp-prestige').SetPanelEvent('onactivate', _OnActivateGetPrestigeButtonClickable);\n        }\n    }\n    function _OnActivateGetPrestigeButtonClickable() {\n        const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('', 'file://{resources}/layout/popups/popup_inventory_inspect.xml');\n        let oSettings = {\n            item_id: '0',\n            show_work_type_warning: false,\n            work_type: 'prestigecheck'\n        };\n        elPanel.Data().oSettings = oSettings;\n    }\n    function UpdateVoiceIcon(elAvatar, xuid) {\n        Avatar.UpdateTalkingState(elAvatar, xuid);\n    }\n    VanityPlayerInfo.UpdateVoiceIcon = UpdateVoiceIcon;\n    function _HasXpProgressToFreeze() {\n        return MyPersonaAPI.HasPrestige() || (MyPersonaAPI.GetCurrentLevel() > 2);\n    }\n    function _IsPlayerPrime(xuid) {\n        return FriendsListAPI.GetFriendPrimeEligible(xuid);\n    }\n    function _SetLobbyLeader(elPanel, xuid) {\n        elPanel.SetHasClass('is-not-leader', LobbyAPI.GetHostSteamID() !== xuid);\n    }\n    function _ShowSettingsBtn(elPanel, xuid) {\n        elPanel.SetHasClass(\"show-controls\", MyPersonaAPI.GetXuid() === xuid);\n    }\n    function _AddOpenPlayerCardAction(elPanel, xuid) {\n        elPanel.SetPanelEvent(\"onactivate\", () => {\n            if (xuid !== \"0\") {\n                const contextMenuPanel = UiToolkitAPI.ShowCustomLayoutContextMenuParametersDismissEvent('', '', 'file://{resources}/layout/context_menus/context_menu_playercard.xml', 'xuid=' + xuid, () => { });\n                contextMenuPanel.AddClass(\"ContextMenu_NoArrow\");\n            }\n        });\n    }\n    {\n        if ($.DbgIsReloadingScript()) {\n        }\n    }\n})(VanityPlayerInfo || (VanityPlayerInfo = {}));\n","scripts/video_setting_recommendations.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\nvar VideoSettingRecommendations;\n(function (VideoSettingRecommendations) {\n    function MaybeShowPopup() {\n        let driverInfo = GameInterfaceAPI.GetGraphicsDriverInfo();\n        if (MaybeShowGraphicsDriverPopup(driverInfo))\n            return true;\n        let vrrStatus = GameInterfaceAPI.GetVariableRefreshRateStatus();\n        if (MaybeShowVariableRefreshRatePopup(driverInfo, vrrStatus))\n            return true;\n        let currDisplayMode = GameInterfaceAPI.GetCurrentDisplayMode();\n        let allDisplayModes = GameInterfaceAPI.GetAllDisplayModes();\n        if (MaybeShowRefreshRatePopup(currDisplayMode, allDisplayModes))\n            return true;\n        let lowLatencyType = GameInterfaceAPI.GetRenderLowLatencyType();\n        let config = GameInterfaceAPI.GetVideoConfig();\n        if (MaybeShowLowLatencyVSyncPopup(vrrStatus, lowLatencyType, config))\n            return true;\n        return false;\n    }\n    VideoSettingRecommendations.MaybeShowPopup = MaybeShowPopup;\n    function MaybeShowGraphicsDriverPopup(driverInfo) {\n        if (!driverInfo.driver_out_of_date)\n            return false;\n        if (GameInterfaceAPI.GetSettingString('cl_graphics_driver_warning_dont_show_again') !== '0')\n            return false;\n        switch (driverInfo.vendor_id) {\n            case 0x1002:\n                {\n                    ShowGraphicsDriverPopup(\"AMD\", 'https://amd.com/support');\n                    return true;\n                }\n            case 0x10DE:\n                {\n                    ShowGraphicsDriverPopup(\"Nvidia\", 'https://nvidia.com/drivers');\n                    return true;\n                }\n            default:\n                {\n                    return false;\n                }\n        }\n    }\n    function ShowGraphicsDriverPopup(vendor, link) {\n        UiToolkitAPI.ShowGenericPopupThreeOptions('#PlayMenu_GraphicsDriverWarning_Title', '#PlayMenu_GraphicsDriverWarning_' + vendor, '', '#PlayMenu_GraphicsDriverLink_' + vendor, () => {\n            SteamOverlayAPI.OpenExternalBrowserURL(link);\n        }, '#PlayMenu_GraphicsDriverWarning_DontShowAgain', () => {\n            GameInterfaceAPI.SetSettingString('cl_graphics_driver_warning_dont_show_again', '1');\n        }, '#OK', () => { });\n    }\n    function MaybeShowVariableRefreshRatePopup(driverInfo, vrrStatus) {\n        if (vrrStatus !== 'inactive')\n            return false;\n        if (GameInterfaceAPI.GetSettingString('cl_vrr_recommendation_dont_show_again') !== '0')\n            return false;\n        switch (driverInfo.vendor_id) {\n            case 0x10DE:\n                {\n                    if (GameInterfaceAPI.HasCommandLineParm(\"-tools\"))\n                        return false;\n                    ShowVariableRefreshRatePopup(\"Nvidia\", $.Localize('#GSyncHelpLinkURL'));\n                    return true;\n                }\n            default:\n                {\n                    return false;\n                }\n        }\n    }\n    function ShowVariableRefreshRatePopup(vendor, link) {\n        UiToolkitAPI.ShowGenericPopupThreeOptions('#SettingsRecommendation', '#VariableRefreshRateRecommendation_' + vendor, '', '#PlayMenu_GraphicsDriverLink_' + vendor, () => {\n            SteamOverlayAPI.OpenExternalBrowserURL(link);\n        }, '#PlayMenu_GraphicsDriverWarning_DontShowAgain', () => {\n            GameInterfaceAPI.SetSettingString('cl_vrr_recommendation_dont_show_again', '1');\n        }, '#OK', () => { });\n    }\n    function MaybeShowRefreshRatePopup(currDisplayMode, allDisplayModes) {\n        if (!currDisplayMode)\n            return false;\n        if (GameInterfaceAPI.GetSettingString('cl_refresh_rate_recommendation_dont_show_again') !== '0')\n            return false;\n        let maxRefreshRate = 0;\n        for (let mode of allDisplayModes) {\n            if (mode.width == currDisplayMode.width &&\n                mode.height == currDisplayMode.height &&\n                mode.refresh_rate > maxRefreshRate) {\n                maxRefreshRate = mode.refresh_rate;\n            }\n        }\n        if (currDisplayMode.refresh_rate > maxRefreshRate * 0.9)\n            return false;\n        let elPanel = $.GetContextPanel();\n        elPanel.SetDialogVariableInt('curr_refresh_rate', Math.round(currDisplayMode.refresh_rate));\n        elPanel.SetDialogVariableInt('max_refresh_rate', Math.round(maxRefreshRate));\n        UiToolkitAPI.ShowGenericPopupTwoOptions('#SettingsRecommendation', $.Localize('#RefreshRateRecommendation', elPanel), '', '#PlayMenu_GraphicsDriverWarning_DontShowAgain', () => {\n            GameInterfaceAPI.SetSettingString('cl_refresh_rate_recommendation_dont_show_again', '1');\n        }, '#OK', () => { });\n        return true;\n    }\n    function MaybeShowLowLatencyVSyncPopup(vrrStatus, lowLatencyType, config) {\n        if ((vrrStatus !== 'active') ||\n            (lowLatencyType !== 'nvidia_reflex') ||\n            (config.vsync === true && config.low_latency !== 0)) {\n            return false;\n        }\n        if (GameInterfaceAPI.GetSettingString('cl_low_latency_vsync_recommendation_dont_show_again') !== '0')\n            return false;\n        UiToolkitAPI.ShowGenericPopupThreeOptions('#SettingsRecommendation', '#LowLatencyVSyncRecommendation_Nvidia', '', '#settings_apply_video', () => {\n            $.DispatchEvent('OpenSettingsMenu');\n            $.DispatchEvent('SettingsMenu_NavigateToSetting', 'VideoSettings', 'AdvancedVideoSettingsRadio', 'VSyncPanel');\n            $.DispatchEvent('CSGOApplyLowLatencyVSyncRecommendation');\n        }, '#PlayMenu_GraphicsDriverWarning_DontShowAgain', () => {\n            GameInterfaceAPI.SetSettingString('cl_low_latency_vsync_recommendation_dont_show_again', '1');\n        }, '#OK', () => { });\n        return true;\n    }\n})(VideoSettingRecommendations || (VideoSettingRecommendations = {}));\n","scripts/watchmatchtile.js":"'use strict';\n\nvar watchMatchTile = ( function (){\n\n\tvar _m_isPerfectWorld = MyPersonaAPI.GetLauncherType() === \"perfectworld\" ? true : false;\n\n\tfunction _Init ( elTile, oMatch, oTeam1, oTeam2 )\n\t{\n\t\telTile.SetDialogVariable( 'match_versus_tooltip', $.Localize( '#eventsched_match_tooltip', elTile ) );\n\n\t\tfunction _CreateTeamPanelsInContainerPanel ( elTeamContainer, teamNum, oTeam )\n\t\t{\n\t\t\tvar teamName = oMatch[ 'team' + teamNum + '_name' ];\n\t\t\tvar teamLogo = oMatch[ 'team' + teamNum +  '_logo_url' ]\n\n\t\t\tvar elTeamLogo = $.CreatePanel( \"Image\", elTeamContainer, 'id-wmt-logo-' + teamName, { \n\t\t\t\tclass: 'wmt__datum wmt__datum--teamlogo img-shadow',\n\t\t\t\tclampfractionalpixelpositions: 'false',\n\t\t\t\tsrc: teamLogo\n\t\t\t} );\n\n\t\t\tvar elLabel = $.CreatePanel( \"Label\", elTeamContainer, 'id-wmt-label-' + oMatch[ 'team' + teamNum + '_name' ], { \n\t\t\t\tclass: 'wmt__datum wmt__datum--teamname stratum-font',\n\t\t\t\ttext: '{s:watchmatchtile_teamname}'\n\t\t\t} );\n\n\t\t\telLabel.SetDialogVariable( 'watchmatchtile_teamname', teamName );\n\n\t\t\t_CreateTeamTooltip( elTeamLogo, oTeam );\n\t\t}\n\n\t\tvar elTeam1Container = elTile.FindChildTraverse( 'id-wmt-team1-container' );\n\t\t_CreateTeamPanelsInContainerPanel( elTeam1Container, 1, oTeam1 );\n\n\t\tvar elTeam2Container = elTile.FindChildTraverse( 'id-wmt-team2-container' );\n\t\t_CreateTeamPanelsInContainerPanel( elTeam2Container, 2, oTeam2 );\n\n\t\t                                                                                                               \n\t\tvar elVersusContainer = elTile.FindChildTraverse( 'id-wmt-vs-container' );\n\t\t$.CreatePanel( \"Label\", elVersusContainer, 'id-wmt-label-vs', { \n\t\t\tclass: 'wmt__datum wmt__datum--vs stratum-font',\n\t\t\ttext: $.Localize( '#eventsched_versus' )\n\t\t} );\n\n\t\t\n\t\t          \n\t\tvar elWatchButton = elTile.FindChildTraverse( \"id-wmt\" );\n\t\tif ( elWatchButton )\n\t\t{\n\t\t\t          \n\t\t\tif ( 'streams' in oMatch && oMatch[ 'streams' ].length > 0 )\n\t\t\t{\n\t\t\t\tvar elStatus = elTile.FindChildTraverse( \"id-wmt__status\" );\n\t\t\t\telStatus.AddClass( 'streams_available' );\n\t\t\t}\n\t\t\t{\n\t\t\t\tfunction OnActivate ( matchId )\n\t\t\t\t{\n\t\t\t\t\tvar elContextMenuPanel = UiToolkitAPI.ShowCustomLayoutContextMenuParametersDismissEvent(\n\t\t\t\t\t\t'id - watchmatchtile - match__watch',\n\t\t\t\t\t\t'',\n\t\t\t\t\t\t'file://{resources}/layout/context_menus/context_menu_watchnotice_match_streams.xml',\n\t\t\t\t\t\t'match_id=' + matchId +\n\t\t\t\t\t\t'&' + 'is_official=' + elTile.Data().isofficial,\n\t\t\t\t\t\tfunction() {$.DispatchEvent( 'ContextMenuEvent', '' );}\n\t\t\t\t\t)\n\t\t\t\t\telContextMenuPanel.AddClass( \"ContextMenu_NoArrow\" );\n\t\t\t\t\telContextMenuPanel.AddClass( \"ContextMenu_Centered\" );\n\n\t\t\t\t\t$.DispatchEvent( 'CSGOPlaySoundEffect', 'UIPanorama.sidemenu_select', 'MOUSE' );\n\t\t\t\t}\n\n\t\t\t\tfunction OnSimplePerfectWorldContextMenu( )\n\t\t\t\t{\n\t\t\t\t\tvar items = [];\n\n\t\t\t\t\t                  \n\t\t\t\t\tif ( EmbeddedStreamAPI.GetStreamExternalLinkTypes().indexOf( 'B' ) >= 0 )\n\t\t\t\t\t{\n\t\t\t\t\t\titems.push( { label: $.Localize( '#CSGO_Watch_Info_live' ), jsCallback: function() {\n\t\t\t\t\t\t\tEmbeddedStreamAPI.OpenStreamInExternalBrowser( 'XB' );\n\t\t\t\t\t\t\t$.DispatchEvent( 'CSGOPlaySoundEffect', 'UIPanorama.sidemenu_select', 'MOUSE' );\n\t\t\t\t\t\t} } );\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t       \n\t\t\t\t\tif ( EmbeddedStreamAPI.GetStreamExternalLinkTypes().indexOf( 'G' ) >= 0 )\n\t\t\t\t\t{\n\t\t\t\t\t\titems.push( { label: $.Localize( '#CSGO_Watch_Watch_GOTV' ), jsCallback: function() {\n\t\t\t\t\t\t\tEmbeddedStreamAPI.OpenStreamInExternalBrowser( 'XG' );\n\t\t\t\t\t\t\t$.DispatchEvent( 'CSGOPlaySoundEffect', 'UIPanorama.sidemenu_select', 'MOUSE' );\n\t\t\t\t\t\t} } );\n\t\t\t\t\t}\n\n\t\t\t\t\t                                                                    \n\t\t\t\t\tif ( items.length <= 0 )\n\t\t\t\t\t{\n\t\t\t\t\t\titems.push( { label: $.Localize( '#CSGO_Watch_Info_live' ), jsCallback: function() {\n\t\t\t\t\t\t\t                        \n\t\t\t\t\t\t\t$.DispatchEvent( 'CSGOPlaySoundEffect', 'UIPanorama.sidemenu_select', 'MOUSE' );\n\t\t\t\t\t\t} } );\n\t\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\tUiToolkitAPI.ShowSimpleContextMenu( '', 'externallink', items );\n\t\t\t\t}\n\n\t\t\t\tif ( _m_isPerfectWorld )\n\t\t\t\t{\n\t\t\t\t\telWatchButton.SetPanelEvent( 'onactivate', OnSimplePerfectWorldContextMenu );\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\telWatchButton.SetPanelEvent( 'onactivate', OnActivate.bind( undefined, oMatch[ 'match_id' ] ) );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction _CreateTeamTooltip ( panel, oTeam )\n\t{\n\t\t\n\t\t               \n\t\t  \n\t\t  \n\t\t\t\n\t\tvar xmlsrc = 'file://{resources}/layout/tooltips/tooltip_eventsched_team_simple.xml';\n\t\t\n\t\tvar parms = \"team_id=\" + oTeam[ 'name' ] +\n\t\t\t\"&team_name=\" + oTeam[ 'name' ] +\n\t\t\t\"&team_logo_url=\" + oTeam[ 'logo_url_large' ];\n\n\t\tif ( \"lineup\" in oTeam )\n\t\t{\n\t\t\tvar bHaveAnyPhoto = false;\n\n\t\t\tfor ( var pIdx in oTeam[ 'lineup' ] )\n\t\t\t{\n\t\t\t\tvar oPlayer = oTeam[ 'lineup' ][ pIdx ];\n\n\t\t\t\tif ( 'profile_photo_url' in oPlayer && oPlayer[ 'profile_photo_url' ] !== \"\" )\n\t\t\t\t{\n\t\t\t\t\tparms += \"&player_photo\" + pIdx + \"=\" + oPlayer[ 'profile_photo_url' ];\n\t\t\t\t\tbHaveAnyPhoto = true;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tparms += \"&player_photo\" + pIdx + \"=\" + \"file://{images}/icons/ui/pro_player.svg\";\n\t\t\t\t}\n\n\t\t\t\tparms += \"&player_name\" + pIdx + \"=\" + oPlayer[ 'nickname' ];\n\t\t\t\tparms += \"&player_url\" + pIdx + \"=\" + oPlayer[ 'profile_url' ];\n\t\t\t}\n\n\t\t\tif ( bHaveAnyPhoto ) \n\t\t\t{\n\t\t\t\txmlsrc = 'file://{resources}/layout/context_menus/context_menu_eventsched_team.xml';\n\t\t\t\tpanel.AddClass( 'eventsched__teams__teamlogo--plus' );\n\n\t\t\t\tfunction _OnTeamContextMenu ( xmlsrc, parms )\n\t\t\t\t{\n\t\t\t\t\tvar elTeamContextPanel = UiToolkitAPI.ShowCustomLayoutContextMenuParameters( '', '', xmlsrc, parms );\n\t\t\t\t\telTeamContextPanel.AddClass( \"ContextMenu_NoArrow\" );\n\t\t\t\t}\n\n\t\t\t\tpanel.SetPanelEvent( 'onactivate', _OnTeamContextMenu.bind( undefined, xmlsrc, parms ) );\n\n\t\t\t\tpanel.AddClass( 'has_data' );\n\t\t\t}\n\t\t}\n\n\t}\n\n\t\t                               \n\t  \n\tfunction _OnMouseOverCustomLayoutTooltip ( _panel, _tooltipId, _xmlsrc, _parms )\n\t{\n\t\tUiToolkitAPI.ShowCustomLayoutParametersTooltip(\n\t\t\t_panel,\n\t\t\t_tooltipId,\n\t\t\t_xmlsrc,\n\t\t\t_parms );\n\t}\n\n\tfunction _OnMouseOutCustomLayoutTooltip ( _tooltipId )\n\t{\n\t\tUiToolkitAPI.HideCustomLayoutTooltip( _tooltipId );\n\t}\n\n\n\treturn {\n\t\tInit\t\t\t: \t_Init,\t\t                                              \n\t};\n})();\n\n( function (){\n\n})();\n\n\n","scripts/watchtile.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\nvar watchTile;\n(function (watchTile) {\n    let TEAMS = ['CT', 'TERRORIST'];\n    function SetParentActive(elTile, value = false) {\n        if (!elTile.Data().markForDelete) {\n            let elLogo = elTile.FindChildTraverse('gotvicon');\n            if (elLogo) {\n                if (value) {\n                    elLogo.AddClass('GOTV-Icon--ParentActive');\n                }\n                else {\n                    elLogo.RemoveClass('GOTV-Icon--ParentActive');\n                }\n            }\n        }\n    }\n    watchTile.SetParentActive = SetParentActive;\n    function Delete(elTile) {\n        $.DispatchEvent('DeletePanel', elTile);\n    }\n    watchTile.Delete = Delete;\n    function _CheckPlayerParticipatedInMatch(elTile) {\n        let bPlayerParticipated = false;\n        let myTeam = 0;\n        for (let t = 0; t < 2; t++) {\n            for (let n = 0; n < 5; n++) {\n                let playerXuid = MatchInfoAPI.GetMatchPlayerXuidByIndexForTeam(elTile.Data().matchId, t, n);\n                if (playerXuid === elTile.Data().myXuid) {\n                    bPlayerParticipated = true;\n                    myTeam = t;\n                }\n            }\n        }\n        return { bPlayerParticipated: bPlayerParticipated, myTeam: myTeam };\n    }\n    function Init(elTile) {\n        let bPlayerParticipated = false;\n        let matchState = MatchInfoAPI.GetMatchState(elTile.Data().matchId);\n        let matchTileDescriptor = 'player';\n        let myTeam = 0;\n        if (elTile.id == 'live_gotv')\n            matchTileDescriptor = 'gotv';\n        let isLive = Boolean(MatchInfoAPI.IsLive(elTile.Data().matchId));\n        let tournamentName = MatchInfoAPI.GetMatchTournamentName(elTile.Data().matchId);\n        if ((tournamentName != undefined) && (tournamentName != \"\")) {\n            matchTileDescriptor = 'tournament';\n        }\n        else if (matchState == 'live') {\n            matchTileDescriptor = 'live';\n        }\n        let _multiresult = _CheckPlayerParticipatedInMatch(elTile);\n        bPlayerParticipated = _multiresult.bPlayerParticipated;\n        myTeam = _multiresult.myTeam;\n        let rawModeName = MatchInfoAPI.GetMatchMode(elTile.Data().matchId);\n        let mapName = MatchInfoAPI.GetMatchMap(elTile.Data().matchId);\n        elTile.BLoadLayout(\"file://{resources}/layout/matchtiles/\" + matchTileDescriptor + \".xml\", true, false);\n        let elTileMenu = elTile.FindChildTraverse('MatchTileMenu');\n        let elDownloadingButton = undefined;\n        let elDownloadButton = undefined;\n        let elShareButton = undefined;\n        let elMoreButton = undefined;\n        let elDownloadFailedButton = undefined;\n        let elWatchButton = undefined;\n        if (elTileMenu) {\n            if (elTile.Data().matchListDescriptor === 'live') {\n            }\n            else {\n            }\n        }\n        let elMatchMapLabel = elTile.FindChildInLayoutFile('mapname');\n        let elMatchMapIcon = elTile.FindChildInLayoutFile('mapicon');\n        let elMatchModeIcon = elTile.FindChildInLayoutFile('modeicon');\n        let elSkillGroupImg = elTile.FindChildInLayoutFile('skillgroup');\n        let elScore0Label = elTile.FindChildInLayoutFile('score_team0');\n        let elVsLabel = elTile.FindChildInLayoutFile('vs');\n        let elScore1Label = elTile.FindChildInLayoutFile('score_team1');\n        let elViewersLabel = elTile.FindChildInLayoutFile('viewers');\n        let elOutcomeLabel = elTile.FindChildInLayoutFile('outcome');\n        let elTimestampLabel = elTile.FindChildInLayoutFile('timestamp');\n        if (elMatchMapLabel) {\n            let mapLabelText = \"#SFUI_Map_\" + mapName;\n            let mapLabelLocalizedText = $.Localize(\"#SFUI_Map_\" + mapName);\n            if (mapLabelText === mapLabelLocalizedText) {\n                elMatchMapLabel.text = mapName;\n            }\n            else {\n                elMatchMapLabel.text = mapLabelLocalizedText;\n            }\n        }\n        let team0 = 0;\n        let team1 = 1;\n        if (bPlayerParticipated && (myTeam != 0)) {\n            team0 = 1;\n            team1 = 0;\n        }\n        let vsText = '-';\n        if (matchTileDescriptor === 'tournament') {\n            let elTournamentNameLabel = elTile.FindChildInLayoutFile('tournamentname');\n            let elTournamentTeam0Icon = elTile.FindChildInLayoutFile('team0');\n            let elTournamentTeam1Icon = elTile.FindChildInLayoutFile('team1');\n            vsText = '-' + $.Localize(\"#WatchMenu_Tournament_Versus\") + '-';\n            elTournamentNameLabel.text = $.Localize(MatchInfoAPI.GetMatchTournamentStageName(elTile.Data().matchId));\n            let setDefaultTeamImage = function (teamIcon) {\n                teamIcon.SetImage(\"file://{images}/tournaments/teams/nologo.svg\");\n            };\n            $.RegisterEventHandler('ImageFailedLoad', elTournamentTeam0Icon, setDefaultTeamImage.bind(undefined, elTournamentTeam0Icon));\n            $.RegisterEventHandler('ImageFailedLoad', elTournamentTeam1Icon, setDefaultTeamImage.bind(undefined, elTournamentTeam1Icon));\n            let icon0Filename = 'file://{images}/tournaments/teams/' + MatchInfoAPI.GetMatchTournamentTeamTag(elTile.Data().matchId, team0).toLowerCase() + '.svg';\n            let icon1Filename = 'file://{images}/tournaments/teams/' + MatchInfoAPI.GetMatchTournamentTeamTag(elTile.Data().matchId, team1).toLowerCase() + '.svg';\n            if (elTournamentTeam0Icon)\n                elTournamentTeam0Icon.SetImage(icon0Filename);\n            if (elTournamentTeam1Icon)\n                elTournamentTeam1Icon.SetImage(icon1Filename);\n        }\n        if (elScore0Label) {\n            elScore0Label.text = MatchInfoAPI.GetMatchRoundScoreForTeam(elTile.Data().matchId, team0).toString();\n            if (matchTileDescriptor != 'tournament') {\n                elScore0Label.AddClass('tint--' + TEAMS[team0]);\n            }\n        }\n        if (elVsLabel) {\n            elVsLabel.text = vsText;\n        }\n        if (elScore1Label) {\n            elScore1Label.text = MatchInfoAPI.GetMatchRoundScoreForTeam(elTile.Data().matchId, team1).toString();\n            if (matchTileDescriptor != 'tournament') {\n                elScore1Label.AddClass('tint--' + TEAMS[team1]);\n            }\n        }\n        if (elViewersLabel) {\n            let spectatorCount = MatchInfoAPI.GetMatchSpectators(elTile.Data().matchId);\n            if (!spectatorCount) {\n                spectatorCount = 0;\n            }\n            elTile.SetDialogVariableInt('spectatorCount', spectatorCount);\n            elViewersLabel.SetHasClass('hide', spectatorCount === 0);\n        }\n        if (bPlayerParticipated) {\n            if (elOutcomeLabel) {\n                let outcomeCode = MatchInfoAPI.GetMatchOutcome(elTile.Data().matchId);\n                if (outcomeCode == undefined) {\n                    elOutcomeLabel.AddClass('MatchInfo--Hide');\n                }\n                else {\n                    if (myTeam != 0) {\n                        if (outcomeCode == 1)\n                            outcomeCode = 2;\n                        else if (outcomeCode == 2)\n                            outcomeCode = 1;\n                    }\n                    switch (outcomeCode) {\n                        case 0:\n                            elTile.AddClass('MatchTied');\n                            elOutcomeLabel.text = $.Localize(\"#WatchMenu_Outcome_Tied\", elOutcomeLabel);\n                            break;\n                        case 1:\n                            elTile.AddClass('MatchVictory');\n                            elOutcomeLabel.text = $.Localize(\"#WatchMenu_Outcome_Won\", elOutcomeLabel);\n                            break;\n                        case 2:\n                            elTile.AddClass('MatchLoss');\n                            elOutcomeLabel.text = $.Localize(\"#WatchMenu_Outcome_Lost\", elOutcomeLabel);\n                            break;\n                        case 3:\n                            elOutcomeLabel.text = $.Localize(\"#WatchMenu_Outcome_Abandon\");\n                            break;\n                    }\n                }\n            }\n        }\n        if (elTimestampLabel) {\n            if (isLive)\n                elTimestampLabel.text = $.Localize(\"#CSGO_Watch_Cat_LiveMatches\");\n            else\n                elTimestampLabel.text = MatchInfoAPI.GetMatchTimestamp(elTile.Data().matchId);\n        }\n        let setDefaultMapImage = function (mapIcon) {\n            mapIcon.SetImage(\"file://{images}/map_icons/map_icon_NONE.png\");\n        };\n        if (elMatchMapIcon) {\n            $.RegisterEventHandler('ImageFailedLoad', elMatchMapIcon, setDefaultMapImage.bind(undefined, elMatchMapIcon));\n            elMatchMapIcon.SetImage(\"file://{images}/map_icons/map_icon_\" + mapName + \".svg\");\n        }\n        let setDefaultModeImage = function (mapIcon) {\n            mapIcon.SetImage(\"file://{images}/icons/ui/competitive.vsvg\");\n        };\n        if (elMatchModeIcon) {\n            $.RegisterEventHandler('ImageFailedLoad', elMatchModeIcon, setDefaultModeImage.bind(undefined, elMatchModeIcon));\n            elMatchModeIcon.SetImage(\"file://{images}/icons/ui/\" + rawModeName + \".svg\");\n        }\n        if (elSkillGroupImg) {\n            let skillgroup = MatchInfoAPI.GetMatchSkillGroup(elTile.Data().matchId);\n            if (skillgroup)\n                elSkillGroupImg.SetImage(\"file://{images}/icons/skillgroups/skillgroup\" + skillgroup + \".svg\");\n        }\n    }\n    watchTile.Init = Init;\n    function Refresh(elTile) {\n        Init(elTile);\n    }\n    watchTile.Refresh = Refresh;\n    function SetDownloadHandler(elTile, handle = null) {\n        elTile.Data().downloadStateHandler = handle;\n    }\n    watchTile.SetDownloadHandler = SetDownloadHandler;\n    function GetDownloadHandler(elTile, handle = null) {\n        return elTile.Data().downloadStateHandler;\n    }\n    watchTile.GetDownloadHandler = GetDownloadHandler;\n})(watchTile || (watchTile = {}));\n","scripts/watchtile__vpk_vjs_c.js":"'use strict';\n\nvar watchTile = ( function() {\n\n    var TEAMS =[ 'CT', 'TERRORIST' ];\n\n    function _SetParentActive( elTile, value )\n    {\n        if ( !elTile.Data().markForDelete )\n        {\n            var elLogo = elTile.FindChildTraverse( 'gotvicon' );\n            if ( elLogo )\n            {\n                if ( value )\n                {\n                    elLogo.AddClass( 'GOTV-Icon--ParentActive' );\n                }\n                else\n                {\n                    elLogo.RemoveClass( 'GOTV-Icon--ParentActive' );\n                }\n            }\n        }\n    }\n    \n    function _Delete( elTile )\n    {\n        $.DispatchEvent( 'DeletePanel', elTile );\n\t}\n\n\tfunction _CheckPlayerParticipatedInMatch( elTile )\n\t{\n\t\tvar bPlayerParticipated = false;\n\t\tvar myTeam = 0;\n\n\t\tfor ( var t = 0; t < 2; t++ )\n\t\t{\n            for ( var n = 0; n < 5; n++ )\n            {\n                var playerXuid = MatchInfoAPI.GetMatchPlayerXuidByIndexForTeam( elTile.matchId, t, n );\n                if ( playerXuid === elTile.myXuid ) \n                {\n                    bPlayerParticipated = true;\n                    myTeam = t;\n                }\n\t\t\t}\n\t\t}\n\n\t\treturn { bPlayerParticipated: bPlayerParticipated, myTeam: myTeam };\n\t}\n\n    function _Init( elTile )\n    {\n        var bPlayerParticipated = false;\n\n        var matchState = MatchInfoAPI.GetMatchState( elTile.Data().matchId );\n\n        var matchTileDescriptor = 'player';\n\n        var myTeam = 0;\n\n        if ( elTile.id == 'live_gotv' ) matchTileDescriptor = 'gotv';\n\n        var isLive = Boolean(MatchInfoAPI.IsLive(elTile.matchId));\n        var tournamentName = MatchInfoAPI.GetMatchTournamentName( elTile.Data().matchId );\n        if ( ( tournamentName != undefined ) && ( tournamentName != \"\" ) )\n        {\n            matchTileDescriptor = 'tournament';\n        }\n        else if ( matchState == 'live' ) \n        {\n            matchTileDescriptor = 'live';\n        }\n\n\t\tvar _multiresult = _CheckPlayerParticipatedInMatch( elTile );\n\t\tbPlayerParticipated = _multiresult.bPlayerParticipated;\n\t\tmyTeam = _multiresult.myTeam;\n\n        var rawModeName = MatchInfoAPI.GetMatchMode( elTile.Data().matchId );\n        var mapName = MatchInfoAPI.GetMatchMap( elTile.Data().matchId );\n\n\t\t                                                                                                                                                           \n        elTile.BLoadLayout( \"file://{resources}/layout/matchtiles/\"+matchTileDescriptor+\".xml\", true, false );\n        var elTileMenu = elTile.FindChildTraverse( 'MatchTileMenu' );\n\n        var elDownloadingButton = undefined;\n        var elDownloadButton = undefined;\n        var elShareButton = undefined;\n        var elMoreButton = undefined;\n        var elDownloadFailedButton = undefined;\n        var elWatchButton = undefined;\n\n        if ( elTileMenu )\n        {\n            if ( elTile.Data().matchListDescriptor === 'live' )\n            {\n                elWatchButton = _AddButton( elTileMenu, elTile.Data().matchListDescriptor + \"_\" + elTile.matchId, \"watch\", $.Localize( \"#CSGO_Watch_Info_live\"), _Watch.bind( \"\", elTile), false );\n            }\n            else\n            {\n                elShareButton =  _AddButton( elTileMenu, elTile.Data().matchListDescriptor + \"_\" + elTile.matchId, \"link\", $.Localize( \"#CSGO_Watch_Copy_Url\" ), _ShareMatch.bind( \"\", elTile ), false );\n                elDownloadButton = _AddButton( elTileMenu, elTile.Data().matchListDescriptor + \"_\" + elTile.matchId, \"downloaded\", $.Localize( \"#CSGO_Watch_Download\" ), _DownloadMatch.bind( \"\", elTile ), false );\n                elDownloadingButton = _AddButton( elTileMenu, elTile.Data().matchListDescriptor + \"_\" + elTile.matchId, \"downloading\", $.Localize( \"#SFUI_GameUI_MatchDlDownloading\"), undefined, true );\n                elDownloadFailedButton = _AddButton( elTileMenu, elTile.Data().matchListDescriptor + \"_\" + elTile.matchId, \"warning\", $.Localize( \"#WatchMenu_Info_Download_Failed\" ), _UpdateFailedNotify.bind( \"\", elTile ), false );\n                elMoreButton = _AddButton( elTileMenu, elTile.Data().matchListDescriptor + \"_\" + elTile.matchId, \"expand\", $.Localize( \"#WatchMenu_Expand_Match_Menu\" ), _OpenContextMenu.bind( \"\", elTile ), false );\n                                              \n            }\n        }\n\n        var elMatchMapLabel = elTile.FindChildInLayoutFile('mapname');\n        var elMatchMapIcon = elTile.FindChildInLayoutFile( 'mapicon' );\n        var elMatchModeIcon = elTile.FindChildInLayoutFile( 'modeicon' );\n\t\tvar elSkillGroupImg = elTile.FindChildInLayoutFile( 'skillgroup' );\n        var elScore0Label = elTile.FindChildInLayoutFile('score_team0');\n        var elVsLabel = elTile.FindChildInLayoutFile( 'vs' );\n        var elScore1Label = elTile.FindChildInLayoutFile('score_team1');\n        var elViewersLabel = elTile.FindChildInLayoutFile('viewers');\n        var elOutcomeLabel = elTile.FindChildInLayoutFile('outcome');\n        var elTimestampLabel = elTile.FindChildInLayoutFile('timestamp');\n\n        if ( elMatchMapLabel )\n        {\n            var mapLabelText = \"#SFUI_Map_\"+mapName;\n            var mapLabelLocalizedText = $.Localize( \"#SFUI_Map_\"+mapName );\n            if ( mapLabelText === mapLabelLocalizedText )\n            {\n                elMatchMapLabel.text = mapName;\n            }\n            else\n            {\n                elMatchMapLabel.text = mapLabelLocalizedText;\n            }\n        }\n\n                                                                                                                    \n        var team0 = 0;\n        var team1 = 1;\n        if ( bPlayerParticipated && ( myTeam != 0 ) )\n        {\n            team0 = 1;\n            team1 = 0;\n        }\n\n        var vsText = '-';\n        if ( matchTileDescriptor === 'tournament' )\n        {\n            var elTournamentNameLabel = elTile.FindChildInLayoutFile('tournamentname');\n            var elTournamentTeam0Icon = elTile.FindChildInLayoutFile('team0');\n            var elTournamentTeam1Icon = elTile.FindChildInLayoutFile('team1');\n            vsText = '-' + $.Localize( \"#WatchMenu_Tournament_Versus\" ) + '-';\n            elTournamentNameLabel.text = $.Localize( MatchInfoAPI.GetMatchTournamentStageName( elTile.Data().matchId ) );\n\n            var setDefaultTeamImage = function ( teamIcon )\n            {\n                teamIcon.SetImage( \"file://{images}/tournaments/teams/nologo.svg\" );\n            }\n\n            $.RegisterEventHandler( 'ImageFailedLoad', elTournamentTeam0Icon, setDefaultTeamImage.bind( undefined, elTournamentTeam0Icon ) );\n            $.RegisterEventHandler( 'ImageFailedLoad', elTournamentTeam1Icon, setDefaultTeamImage.bind( undefined, elTournamentTeam1Icon ) );\n\n            var icon0Filename = 'file://{images}/tournaments/teams/'+MatchInfoAPI.GetMatchTournamentTeamTag( elTile.matchId, team0 ).toLowerCase()+'.svg';\n            var icon1Filename = 'file://{images}/tournaments/teams/'+MatchInfoAPI.GetMatchTournamentTeamTag( elTile.matchId, team1 ).toLowerCase()+'.svg';\n\n            \n            if ( elTournamentTeam0Icon ) elTournamentTeam0Icon.SetImage( icon0Filename );\n            if (elTournamentTeam1Icon) elTournamentTeam1Icon.SetImage(icon1Filename);\n\n        }\n\n        if ( elScore0Label )\n        {\n            elScore0Label.text = MatchInfoAPI.GetMatchRoundScoreForTeam( elTile.matchId, team0 );\n            if ( matchTileDescriptor != 'tournament' )\n            {\n                elScore0Label.AddClass( 'tint--' + TEAMS[ team0 ] );\n            }\n        }\n\n        if ( elVsLabel )\n        {\n            elVsLabel.text = vsText;\n        }\n\n        if ( elScore1Label )\n        {\n            elScore1Label.text =  MatchInfoAPI.GetMatchRoundScoreForTeam( elTile.matchId, team1 );\n            if ( matchTileDescriptor != 'tournament' )\n            {\n                elScore1Label.AddClass( 'tint--' + TEAMS[ team1 ] );\n            }\n        }\n\n        if ( elViewersLabel )\n        {\n            var spectatorCount = parseInt( MatchInfoAPI.GetMatchSpectators( elTile.Data().matchId ) );\n            if ( !spectatorCount )\n            {\n                spectatorCount = 0;\n            }\n            elTile.SetDialogVariableInt( 'spectatorCount', spectatorCount );\n            elViewersLabel.SetHasClass( 'hide', spectatorCount === 0 );\n        }\n\n        \n        if ( bPlayerParticipated )\n        {\n            if ( elOutcomeLabel )\n            {\n                var outcomeCode = MatchInfoAPI.GetMatchOutcome( elTile.Data().matchId );\n                \n                if ( outcomeCode == undefined )\n                {\n                    elOutcomeLabel.AddClass( 'MatchInfo--Hide' );\n                }\n                else\n                {\n                    if ( myTeam != 0 )\n                    {\n                        if ( outcomeCode == 1 ) \n                            outcomeCode = 2;\n                        else if ( outcomeCode == 2 )\n                            outcomeCode = 1;\n                    }\n                    switch ( outcomeCode )\n                    {\n                        case 0:\n\t\t\t\t\t\t\telTile.AddClass( 'MatchTied' );\n\t\t\t\t\t\t\telOutcomeLabel.text = $.Localize( \"#WatchMenu_Outcome_Tied\", elOutcomeLabel );\n                            break;\n\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\telTile.AddClass( 'MatchVictory' );\n                            elOutcomeLabel.text = $.Localize( \"#WatchMenu_Outcome_Won\", elOutcomeLabel );\n                            break;\n\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\telTile.AddClass( 'MatchLoss' );\n                            elOutcomeLabel.text = $.Localize( \"#WatchMenu_Outcome_Lost\", elOutcomeLabel );\n                            break;\n                        case 3:\n                            elOutcomeLabel.text = $.Localize( \"#WatchMenu_Outcome_Abandon\" );\n                            break;\n                    }\n                }\n            }\n        }\n\n        if ( elTimestampLabel )\n        {\n            if (isLive)\n                elTimestampLabel.text = $.Localize( \"#CSGO_Watch_Cat_LiveMatches\" );\n            else\n                elTimestampLabel.text = MatchInfoAPI.GetMatchTimestamp( elTile.Data().matchId );\n        }\n        \n        var setDefaultMapImage = function ( mapIcon )\n        {\n            mapIcon.SetImage( \"file://{images}/map_icons/map_icon_NONE.png\" );\n        }\n\n        if ( elMatchMapIcon )\n        {\n            $.RegisterEventHandler( 'ImageFailedLoad', elMatchMapIcon, setDefaultMapImage.bind( undefined, elMatchMapIcon ) );\n            elMatchMapIcon.SetImage( \"file://{images}/map_icons/map_icon_\"+mapName+\".svg\" );\n\t\t}\n\t\t\n        var setDefaultModeImage = function ( mapIcon )\n        {\n            mapIcon.SetImage( \"file://{images}/icons/ui/competitive.vsvg\" );\n        }\n\n        if ( elMatchModeIcon )\n        {\n            $.RegisterEventHandler( 'ImageFailedLoad', elMatchModeIcon, setDefaultModeImage.bind( undefined, elMatchModeIcon ) );\n            elMatchModeIcon.SetImage( \"file://{images}/icons/ui/\" + rawModeName + \".svg\" );\n        }\n\n\t\tif ( elSkillGroupImg )\n\t\t{\n\t\t\tvar skillgroup = MatchInfoAPI.GetMatchSkillGroup( elTile.Data().matchId );\n\t\t\tif ( skillgroup )\n\t\t\t\telSkillGroupImg.SetImage( \"file://{images}/icons/skillgroups/skillgroup\"+skillgroup+\".svg\" );\n\t\t}\n    }\n\n    function _Refresh( elTile )\n    {\n        _Init( elTile );\n    }\n\n    function _SetDownloadHandler( elTile, handle = null )\n    {\n        elTile.Data().downloadStateHandler = handle;\n    }\n\n    function _GetDownloadHandler( elTile, handle = null )\n    {\n        return elTile.Data().downloadStateHandler;\n    }\n\n                      \n\treturn {\n        Init\t\t\t: _Init,\n\t\tSetParentActive : _SetParentActive,\n        Refresh         : _Refresh,\n        Delete          : _Delete,\n        SetDownloadHandler      : _SetDownloadHandler,\n        GetDownloadHandler : _GetDownloadHandler\n\t};\n\n})();\n\n        \n                             \n                            \n                     \n                                      ","scripts/watch_events_debug.js":"\"use strict\";\n\nvar watchEventLiveExample_01 = \"\";\nvar watchEventLiveExample_02 = \"\";\nvar watchEventLiveExample_03 = \"\";\nvar teamExample = \"\";\n\nvar ADD_DEBUG_EVENT = \"0\";\n\n          \n                                                    \n                                  \n  \n\n                             \n                              \n                   \n                     \n             \n                                                                                                                \n             \n                                                                                                                \n                                                       \n                                                     \n                  \n                             \n                   \n                                                                    \n                   \n       \n                            \n                             \n                          \n                       \n                                                                                                                    \n                       \n                                                                                                                    \n                  \n           \n                              \n                           \n                                                                                                          \n                      \n            \n          \n                       \n                                                                                                                        \n        \n      \n            \n       \n                        \n                 \n                                                                                                                    \n        \n       \n                         \n                 \n                                                                                                                    \n        \n       \n                       \n                 \n                                                                                                                    \n        \n       \n                       \n                 \n                                                                                                                    \n        \n       \n                    \n                 \n                                                                                                                    \n        \n       \n                              \n                 \n                                                                                                                    \n        \n       \n                     \n                 \n                                                                                                                    \n        \n       \n                       \n                 \n                                                                                                                    \n        \n       \n                          \n                 \n                                                                                                                    \n        \n       \n                            \n                 \n                                                                                                                    \n        \n       \n                         \n                 \n                                                                                                                    \n        \n       \n                       \n                 \n                                                                                                                    \n        \n       \n                                \n                 \n                                                                                                                    \n        \n       \n                      \n                 \n                                                                                                                    \n        \n       \n                         \n                 \n                                                                                                                    \n        \n       \n                         \n                 \n                                                                                                                    \n        \n      \n                      \n                              \n    \n                              \n                   \n                     \n                      \n             \n                                                                                                                \n             \n                                                                                                                \n                                                       \n                                                     \n                  \n                             \n                   \n                                                                    \n                   \n       \n                            \n                                    \n                                  \n                       \n                                                                                                                    \n                       \n                                                                                                                    \n                    \n                       \n                                                                                                                                       \n        \n       \n                            \n                             \n                          \n                       \n                                                                                                                    \n                       \n                                                                                                                    \n                  \n           \n                              \n                           \n                                                                                                         \n                      \n            \n          \n                       \n                                                                                                                        \n        \n      \n            \n       \n                        \n                 \n                                                                                                                    \n        \n       \n                         \n                 \n                                                                                                                    \n        \n       \n                       \n                 \n                                                                                                                    \n        \n       \n                       \n                 \n                                                                                                                    \n        \n       \n                    \n                 \n                                                                                                                    \n        \n       \n                              \n                 \n                                                                                                                    \n        \n       \n                     \n                 \n                                                                                                                    \n        \n       \n                       \n                 \n                                                                                                                    \n        \n       \n                          \n                 \n                                                                                                                    \n        \n       \n                            \n                 \n                                                                                                                    \n        \n       \n                         \n                 \n                                                                                                                    \n        \n       \n                       \n                 \n                                                                                                                    \n        \n       \n                                \n                 \n                                                                                                                    \n        \n       \n                      \n                 \n                                                                                                                    \n        \n       \n                         \n                 \n                                                                                                                    \n        \n       \n                         \n                 \n                                                                                                                    \n        \n      \n                      \n                              \n    \n                              \n                   \n                     \n                      \n             \n                                                                                                                \n             \n                                                                                                                \n                                                       \n                                                     \n                  \n                             \n                   \n                                                                    \n                   \n       \n                            \n                             \n                                      \n                       \n                                                                                                                    \n                       \n                                                                                                                    \n                  \n           \n                            \n                           \n                                                                                                         \n                      \n            \n           \n                             \n                           \n                                                                                                      \n                      \n            \n           \n                             \n                           \n                                                                                                     \n                      \n            \n           \n                              \n                           \n                           \n                                                                                                \n                      \n            \n           \n                              \n                           \n                           \n                                                                                                \n                      \n                          \n            \n           \n                              \n                                \n                           \n                                                                     \n                      \n            \n           \n                              \n                           \n                                                                                                         \n                      \n            \n           \n                              \n                           \n                                                                                                   \n                      \n            \n           \n                              \n                            \n                           \n                                                                     \n                      \n            \n           \n                              \n                           \n                                                                                                     \n                      \n            \n           \n                              \n                           \n                                                                                                          \n                      \n            \n           \n                              \n                           \n                                                                                                     \n                      \n                          \n            \n           \n                              \n                           \n                                                                                                          \n                      \n            \n           \n                              \n                           \n                                                                                                    \n                      \n                          \n            \n           \n                              \n                           \n                                                                                                          \n                      \n            \n           \n                              \n                           \n                           \n                                                                                                   \n                      \n                           \n            \n           \n                              \n                           \n                                                                                                     \n                      \n                          \n            \n           \n                              \n                           \n                                                                                                          \n                      \n                          \n            \n           \n                              \n                            \n                           \n                                                                     \n                      \n            \n           \n                              \n                           \n                                                                                                         \n                         \n            \n           \n                              \n                           \n                                                                                                      \n                      \n            \n           \n                              \n                           \n                                                                                                        \n                      \n            \n           \n                              \n                           \n                                                                                                     \n                      \n                          \n            \n           \n                              \n                         \n                                                                         \n                      \n                          \n            \n           \n                              \n                           \n                                                                                                     \n                      \n            \n          \n                       \n                                                                                                                                    \n        \n       \n                            \n                               \n                                \n                       \n                                                                                                                    \n                       \n                                                                                                                    \n                  \n           \n                              \n                           \n                                                                                                      \n                      \n            \n          \n                       \n                                                                                                                                \n        \n       \n                            \n                                    \n                                  \n                       \n                                                                                                                    \n                       \n                                                                                                                    \n                    \n                       \n                                                                                                         \n        \n       \n                            \n                             \n                          \n                       \n                                                                                                                    \n                       \n                                                                                                                    \n                  \n           \n                              \n                           \n                                                                                                         \n                      \n            \n          \n                       \n                                                                                                                        \n        \n      \n            \n       \n                        \n                 \n                                                                                                                    \n        \n       \n                         \n                 \n                                                                                                                    \n        \n       \n                       \n                 \n                                                                                                                    \n        \n       \n                       \n                 \n                                                                                                                    \n        \n       \n                    \n                 \n                                                                                                                    \n        \n       \n                              \n                 \n                                                                                                                    \n        \n       \n                     \n                 \n                                                                                                                    \n        \n       \n                       \n                 \n                                                                                                                    \n        \n       \n                          \n                 \n                                                                                                                    \n        \n       \n                            \n                 \n                                                                                                                    \n        \n       \n                         \n                 \n                                                                                                                    \n        \n       \n                       \n                 \n                                                                                                                    \n        \n       \n                                \n                 \n                                                                                                                    \n        \n       \n                      \n                 \n                                                                                                                    \n        \n       \n                         \n                 \n                                                                                                                    \n        \n       \n                         \n                 \n                                                                                                                    \n        \n      \n                      \n                              \n    \n\n                 \n                     \n                                                              \n                                                    \n             \n       \n                          \n                                      \n                     \n                                                                                      \n                            \n                   \n                                                                                        \n                                                             \n          \n                \n                                                              \n        \n       \n                            \n                                    \n                     \n                                                                                      \n                            \n                   \n                                                                                        \n                                                             \n          \n                \n                                                                \n        \n       \n                           \n                                    \n                     \n                                                                                      \n                            \n                   \n                                                                                        \n                                                            \n          \n                \n                                                               \n        \n       \n                           \n                                   \n                     \n                                                                                      \n                            \n                   \n                                                                                        \n                                                           \n          \n                \n                                                               \n        \n       \n                           \n                              \n                     \n                                                                                      \n                            \n                   \n                                                                                         \n                                                      \n          \n                \n                                                               \n        \n      \n    \n \n          \n","scripts/xpshop.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"inspect.ts\" />\n/// <reference path=\"mainmenu_store_fullscreen.ts\" />\n/// <reference path=\"common/prime_button_action.ts\" />\n/// <reference path=\"common/xpshop_tile_weapon_camera_settings.ts\" />\n/// <reference path=\"popups/popup_acknowledge_item.ts\" />\n/// <reference path=\"common/icon.ts\" />\n/// <reference path=\"xpshop_track.ts\" />\n/// <reference path=\"particle_controls.ts\" />\n$.LogChannel('p.armory', \"LV_OFF\");\nvar XpShop;\n(function (XpShop) {\n    const m_tileWidth = 260;\n    const m_tileHeight = 120;\n    const m_stickerTileWidth = 160;\n    const m_keychainTileHeight = m_stickerTileWidth - 10;\n    const m_elContentPanel = $.GetContextPanel().FindChildInLayoutFile('id-xpshop-content');\n    let m_nTrack;\n    let m_nPass;\n    let m_activeTracks = 0;\n    let m_showTimeoutScheduleHandle;\n    const m_passDefName = 'XpShopTicket1';\n    const m_passId = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(InventoryAPI.GetItemDefinitionIndexFromDefinitionName(m_passDefName), 0);\n    function Init() {\n        m_nTrack = MissionsAPI.GetSeasonalOperationXpShopIndex();\n        if (!m_nTrack || m_nTrack === 0) {\n            return;\n        }\n        _MakeShowMainTilesNavBtn();\n        _SetUpTracks();\n        _UpdateShopGoods(m_nTrack);\n        let elBtn = $.GetContextPanel().FindChildInLayoutFile('id-nav-show-main-tiles-btn');\n        $.DispatchEvent(\"Activated\", elBtn, \"mouse\");\n    }\n    XpShop.Init = Init;\n    function InventoryUpdate() {\n        if (!m_elContentPanel || !$.GetContextPanel().IsValid()) {\n            return;\n        }\n        _CancelTimeoutForRewardItem();\n        _SetUpTracks();\n        let elBtn = $.GetContextPanel().FindChildInLayoutFile('id-xpshop-top-nav').Children().filter(entry => entry.checked === true)[0];\n        if (elBtn && elBtn.IsValid()) {\n            $.DispatchEvent(\"Activated\", elBtn, \"mouse\");\n        }\n        else {\n            _MakeShowMainTilesNavBtn();\n            $.DispatchEvent(\"Activated\", $.GetContextPanel().FindChildInLayoutFile('id-nav-show-main-tiles-btn'), \"mouse\");\n        }\n    }\n    XpShop.InventoryUpdate = InventoryUpdate;\n    function _SetUpTracks() {\n        let bHasPrime = FriendsListAPI.GetFriendPrimeEligible(MyPersonaAPI.GetXuid());\n        let oXpShopTrackProgress = InventoryAPI.GetCacheTypeElementJSOByIndex('XpShop', 0);\n        let elTracks = $.GetContextPanel().FindChildInLayoutFile('id-xpshop-tracks');\n        let elUpsell = $.GetContextPanel().FindChildInLayoutFile('id-xpshop-upsell');\n        let btnUpsell = $.GetContextPanel().FindChildInLayoutFile('id-xpshop-upsell-btn');\n        let elUpsellInfo = $.GetContextPanel().FindChildInLayoutFile('id-xpshop-info');\n        let elBalance = $.GetContextPanel().FindChildInLayoutFile('id-xpshop-balance');\n        let elMorePassesBtn = $.GetContextPanel().FindChildInLayoutFile('id-xpshop-more-passes-btn');\n        elTracks.SetDialogVariable('pass', InventoryAPI.GetItemName(m_passId));\n        elTracks.SetDialogVariableInt('max-stars', StoreAPI.GetXpShopMaxTrackLevel());\n        const bHasStarPointsBalance = (bHasPrime && oXpShopTrackProgress && oXpShopTrackProgress.redeemable_balance >= 0);\n        const numStarPointsBalance = bHasStarPointsBalance ? oXpShopTrackProgress.redeemable_balance : 0;\n        elBalance.SetDialogVariableInt('redeemable-points', numStarPointsBalance);\n        elBalance.Data().balance = numStarPointsBalance;\n        if (!bHasPrime) {\n            elTracks.SetDialogVariable('upsell-text', $.Localize('#elevated_status_ad_xpshop', elTracks));\n            elTracks.SetDialogVariable('upsell-btn-text', $.Localize('#elevated_status_btn_no_price', elTracks));\n            elUpsellInfo.visible = false;\n            btnUpsell.SetPanelEvent('onactivate', () => {\n                $.DispatchEvent(\"CSGOPlaySoundEffect\", \"UIPanorama.loadout_sector_select\", \"MOUSE\");\n                let elNavBtn = $.GetContextPanel().GetParent().GetParent().FindChildInLayoutFile('id-store-nav-home');\n                $.DispatchEvent(\"Activated\", elNavBtn, \"mouse\");\n                elNavBtn.checked = true;\n            });\n            elUpsell.SetHasClass('hide', false);\n            elMorePassesBtn.SetHasClass('hide', true);\n            elBalance.SetHasClass('hide', true);\n        }\n        else {\n            AcknowledgeItems.GetItemsByType([m_passDefName], true);\n            InventoryAPI.SetInventorySortAndFilters('inv_sort_age', false, 'item_definition:' + m_passDefName, '', '');\n            m_nPass = InventoryAPI.GetInventoryCount();\n            let elActiveTracks = $.GetContextPanel().FindChildInLayoutFile('id-xpshop-active-tracks');\n            const bHasXpShopTracksOrBalance = oXpShopTrackProgress && (oXpShopTrackProgress.xp_tracks.length > 0 || oXpShopTrackProgress.redeemable_balance > 0);\n            if (m_nPass > 0 || bHasXpShopTracksOrBalance) {\n                let passIndex = 0;\n                m_activeTracks = 0;\n                let numPassesStillPossibleToBuy = 0;\n                const numXpShopMaxTracks = StoreAPI.GetXpShopMaxTracks();\n                let numPassesFullyCompleted = 0;\n                for (let i = 0; i < numXpShopMaxTracks; i++) {\n                    if (oXpShopTrackProgress && oXpShopTrackProgress.xp_tracks[i]) {\n                        const bIsMax = oXpShopTrackProgress.xp_tracks[i] / StoreAPI.GetXpShopStarXp() >= StoreAPI.GetXpShopMaxTrackLevel();\n                        if (bIsMax)\n                            ++numPassesFullyCompleted;\n                    }\n                }\n                elActiveTracks.SetHasClass('hide', false);\n                for (let i = 0; i < numXpShopMaxTracks; i++) {\n                    let elTrack = CreateTrack(elActiveTracks, i);\n                    elTrack.visible = false;\n                    let elActivateBtn = elTrack.FindChildInLayoutFile('id-xpshop-pass-activate-btn');\n                    elActivateBtn.SetHasClass('hidden', true);\n                    let oSettings;\n                    if (oXpShopTrackProgress && oXpShopTrackProgress.xp_tracks[i]) {\n                        let bIsMax = oXpShopTrackProgress.xp_tracks[i] / StoreAPI.GetXpShopStarXp() >= StoreAPI.GetXpShopMaxTrackLevel();\n                        let trackValue = parseInt(oXpShopTrackProgress.xp_tracks[i]);\n                        let nStarsEarned = trackValue > 0 ? Math.floor(trackValue / StoreAPI.GetXpShopStarXp()) : 0;\n                        let elTrackProgress = elTrack.FindChildInLayoutFile('id-xpshop-active-tracks-progress-icons');\n                        elTrackProgress.Children().forEach((element, idx) => {\n                            element.SetHasClass('complete', idx < nStarsEarned);\n                        });\n                        oSettings = {\n                            xpshop_track_frame_panel: elTrack,\n                            xpshop_track_value: trackValue,\n                        };\n                        elTrack.visible = true;\n                        XpShopTrack.XpShopInit(oSettings);\n                        m_activeTracks++;\n                        elTrack.SetPanelEvent('onmouseover', () => {\n                            if (!bIsMax) {\n                                UiToolkitAPI.ShowTextTooltip(elTrack.id, '#xpshop_track_tooltip');\n                            }\n                        });\n                        elTrack.SetPanelEvent('onmouseout', () => {\n                            UiToolkitAPI.HideTextTooltip();\n                        });\n                        if (bIsMax) {\n                            elActivateBtn.SetHasClass('hidden', false);\n                            elActivateBtn.SwitchClass('type', 'clear-pass-btn');\n                            elActivateBtn.SetDialogVariable('action-text', $.Localize('#xpshop_popup_clear_track_title', elActivateBtn));\n                            elActivateBtn.SetDialogVariableInt('completed_tracks_count', numPassesFullyCompleted);\n                            const strMessageTitle = $.Localize('#xpshop_popup_clear_n_tracks:f', elActivateBtn);\n                            const strMessageText = $.Localize('#xpshop_popup_clear_n_tracks_text:f', elActivateBtn);\n                            elActivateBtn.SetPanelEvent('onactivate', () => {\n                                UiToolkitAPI.ShowGenericPopupOkCancel(strMessageTitle, strMessageText, '', () => {\n                                    StoreAPI.AckXpShopCompletedTracks();\n                                }, () => { });\n                            });\n                        }\n                    }\n                    else if (m_nPass > 0 && passIndex < m_nPass) {\n                        let passToActivate = InventoryAPI.GetInventoryItemIDByIndex(passIndex);\n                        passIndex++;\n                        oSettings = {\n                            xpshop_track_frame_panel: elTrack,\n                            xpshop_track_value: 0,\n                        };\n                        XpShopTrack.XpShopInit(oSettings);\n                        let elTrackProgress = elTrack.FindChildInLayoutFile('id-xpshop-active-tracks-progress-icons');\n                        elTrackProgress.Children().forEach((element) => {\n                            element.SetHasClass('complete', false);\n                        });\n                        elTrack.visible = true;\n                        elActivateBtn.SetHasClass('hidden', false);\n                        elActivateBtn.SwitchClass('type', 'activate-pass-btn');\n                        elActivateBtn.SetDialogVariable('action-text', $.Localize('#xpshop_pass_activate', elActivateBtn));\n                        elActivateBtn.SetPanelEvent('onactivate', () => {\n                            XpShopTrack.PlayActivateParticles(oSettings);\n                            elActivateBtn.SetHasClass('hidden', true);\n                            elTrack.TriggerClass('xpshop-activate-pass-anim');\n                            $.DispatchEvent(\"CSGOPlaySoundEffect\", \"UI.XP.Star.Full\", \"MOUSE\");\n                            $.Schedule(.75, () => {\n                                InventoryAPI.UseTool(passToActivate, '');\n                                elTrack.FindChildInLayoutFile('id-xpshop-pass-how-to').TriggerClass('xpshop-active-pass__how-to-anim');\n                            });\n                        });\n                    }\n                    else {\n                        ++numPassesStillPossibleToBuy;\n                    }\n                }\n                elUpsell.SetHasClass('hide', true);\n                elBalance.SetHasClass('hide', false);\n                elMorePassesBtn.SetHasClass('hide', numPassesStillPossibleToBuy <= 0);\n                elMorePassesBtn.text = $.Localize('#xpshop_pass_extra_pass', elActiveTracks);\n                elMorePassesBtn.SetPanelEvent('onactivate', () => {\n                    _OpenPurchasePassPopup();\n                    $.DispatchEvent(\"CSGOPlaySoundEffect\", \"UIPanorama.loadout_sector_select\", \"MOUSE\");\n                });\n                $.GetContextPanel().FindChildInLayoutFile('id-xpshop-active-tracks-container').SetHasClass('five-tracks', numPassesStillPossibleToBuy === 0);\n            }\n            else {\n                elTracks.SetDialogVariable('upsell-text', $.Localize('#xpshop_upsell_desc', elTracks));\n                elTracks.SetDialogVariable('upsell-btn-text', $.Localize('#xpshop_upsell_btn', elTracks));\n                elUpsellInfo.FindChild('id-xpshop-info-btn')?.SetPanelEvent('onactivate', () => SteamOverlayAPI.OpenUrlInOverlayOrExternalBrowser('https://store.steampowered.com/sale/armory'));\n                elUpsell.FindChildInLayoutFile('id-xpshop-upsell-image').itemid = m_passId;\n                btnUpsell.SetPanelEvent('onactivate', () => {\n                    $.DispatchEvent(\"CSGOPlaySoundEffect\", \"UIPanorama.loadout_sector_select\", \"MOUSE\");\n                    _OpenPurchasePassPopup();\n                });\n                elActiveTracks.SetHasClass('hide', true);\n                elUpsell.SetHasClass('hide', false);\n                elMorePassesBtn.SetHasClass('hide', true);\n                elBalance.SetHasClass('hide', true);\n            }\n        }\n    }\n    function _OpenPurchasePassPopup() {\n        const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('', 'file://{resources}/layout/popups/popup_inventory_inspect.xml');\n        let oSettings = {\n            item_id: m_passId,\n            inspect_only: false,\n            show_work_type_warning: false,\n            store_item_id: m_passId\n        };\n        elPanel.Data().oSettings = oSettings;\n    }\n    function CreateTrack(elTracks, index) {\n        const sNamePrefix = 'active-track-';\n        let elTrack = elTracks.FindChildInLayoutFile(sNamePrefix + index);\n        if (!elTrack) {\n            elTrack = $.CreatePanel('Panel', elTracks, sNamePrefix + index);\n            elTrack.BLoadLayoutSnippet('shop-ticket');\n            elTrack.style.tooltipPosition = \"bottom\";\n            elTrack.style.tooltipBodyPosition = \"50% 0%\";\n            let elProgress = elTrack.FindChildInLayoutFile('id-xpshop-active-tracks-progress');\n            elProgress.BLoadLayout('file://{resources}/layout/xpshop_track.xml', true, false);\n            elProgress.hittest = false;\n            elProgress.hittestchildren = false;\n            let elParent = elTrack.FindChildInLayoutFile('id-xpshop-active-tracks-progress-icons');\n            for (let i = 0; i < StoreAPI.GetXpShopMaxTrackLevel(); i++) {\n                let elIcon = $.CreatePanel('Panel', elParent, '');\n                elIcon.BLoadLayoutSnippet('shop-pass-star');\n            }\n        }\n        return elTrack;\n    }\n    function _UpdateShopGoods(m_nTrack) {\n        let nCount = MissionsAPI.GetSeasonalOperationRedeemableGoodsCount(m_nTrack);\n        let aShopItemsData = [];\n        let itemsInRows = {};\n        for (let i = 0; i < nCount; i++) {\n            let ShopEntry = {\n                ui_order: 0,\n                items_in_row: 0,\n                nav_order: 0,\n                flags: 0,\n                ui_image: \"\",\n                ui_set_image: \"\",\n                ui_image_thumbnail: \"\",\n                item_name: \"\",\n                callout: \"\",\n                item_name_groups: \"\",\n                points: '',\n                limited_until: '',\n                ui_show_new_tag: '',\n                bidding_cycle: '',\n                bidding_close: '',\n                bidding_pause: '',\n                bidding_batch: ''\n            };\n            for (let key in ShopEntry) {\n                let field_value = MissionsAPI.GetSeasonalOperationRedeemableGoodsSchema(m_nTrack, i, key);\n                //@ts-expect-error this is hacky\n                ShopEntry[key] = field_value;\n            }\n            ShopEntry.shop_index = i;\n            itemsInRows[ShopEntry.ui_order] = !itemsInRows[ShopEntry.ui_order] ? 1 : ++itemsInRows[ShopEntry.ui_order];\n            if (ShopEntry.item_name.startsWith('lootlist:')) {\n                ShopEntry.entry_type = 'lootlist';\n                ShopEntry.lootlist = _GetLootListForReward(ShopEntry.item_name);\n                ShopEntry.lootlist_item_type = ItemInfo.IsWeapon(ShopEntry.lootlist[0]) ? 'weapon' : ItemInfo.IsKeychain(ShopEntry.lootlist[0]) ? 'keychain' : 'sticker';\n                ShopEntry.tile_width = ShopEntry.lootlist_item_type === 'keychain' || ShopEntry.lootlist_item_type === 'sticker' ? m_stickerTileWidth : m_tileWidth;\n                ShopEntry.tile_height = ShopEntry.lootlist_item_type === 'weapon' ? m_tileHeight : ShopEntry.lootlist_item_type === 'keychain' ? m_keychainTileHeight : ShopEntry.tile_width;\n                ShopEntry.on_item_activate = _OpenFullScreenInspectItem;\n                let strSetName = InventoryAPI.GetTag(ShopEntry.lootlist[0], 'ItemSet');\n                ShopEntry.ui_set_image = strSetName ? strSetName : ShopEntry.ui_set_image;\n                if (ShopEntry.limited_until)\n                    ShopEntry.suffix_loc_string = '_limitedtime';\n            }\n            else {\n                let eType = (ShopEntry.item_name.startsWith('crate_')) ? 'crate' : ShopEntry.item_name;\n                ShopEntry.entry_type = eType;\n                ShopEntry.suffix_loc_string = '_' + (ShopEntry.bidding_cycle ? 'bid' : eType);\n                let nDefinitionIndex = InventoryAPI.GetItemDefinitionIndexFromDefinitionName(ShopEntry.item_name);\n                let idCrate = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(nDefinitionIndex, 0);\n                ShopEntry.lootlist = [idCrate];\n                ShopEntry.lootlist_item_type = eType;\n                ShopEntry.on_item_activate = _OpenFullScreenInspectItem;\n                if (eType === 'crate') {\n                    let strSetName = InventoryAPI.GetTag(InventoryAPI.GetLootListItemIdByIndex(idCrate, 0), 'ItemSet');\n                    ShopEntry.ui_set_image = strSetName ? strSetName : '';\n                    ShopEntry.on_item_activate = OpenFullscreenInspect;\n                }\n            }\n            if (ShopEntry.flags && ((ShopEntry.flags & 4) === 4)) {\n                const petItemId = InventoryAPI.GetPetItemID();\n                if (petItemId)\n                    continue;\n            }\n            if (ShopEntry.bidding_cycle) {\n                ShopEntry.points = '';\n                const numSecondsRemaining = StoreAPI.GetSecondsUntilTimestamp(parseInt(ShopEntry.bidding_close));\n                if (numSecondsRemaining <= 0)\n                    continue;\n            }\n            aShopItemsData.push(ShopEntry);\n        }\n        aShopItemsData.forEach((element) => {\n            element.items_in_row = itemsInRows[element.ui_order];\n            _MakeShopTile(element);\n            _MakeNavButton(element);\n        });\n        let elParent = $.GetContextPanel().FindChildInLayoutFile('id-xpshop-top-nav');\n        let aNavButtons = elParent.Children();\n        aNavButtons.forEach((element, idx) => {\n            if (element.Data().ui_order) {\n                if (element.Data().ui_order === '1') {\n                    elParent.MoveChildBefore(element, aNavButtons[1]);\n                }\n            }\n        });\n    }\n    function _GetLootListForReward(rewardId) {\n        var count = InventoryAPI.GetLootListItemsCount(rewardId);\n        var itemsList = [];\n        if (!count) {\n            itemsList.push(rewardId);\n        }\n        else {\n            for (var i = 0; i < count; i++) {\n                var itemId = InventoryAPI.GetLootListItemIdByIndex(rewardId, i);\n                itemsList.push(itemId);\n            }\n        }\n        return itemsList;\n    }\n    ;\n    function _MakeShopTile(ShopEntry) {\n        let elTile = m_elContentPanel.FindChildInLayoutFile(ShopEntry.item_name);\n        if (!elTile) {\n            let elRow = m_elContentPanel.FindChildInLayoutFile('id-xpshop-row-' + ShopEntry.ui_order);\n            elTile = $.CreatePanel('Button', elRow, ShopEntry.item_name);\n            elTile.BLoadLayoutSnippet('shop-tile');\n            elTile.SetPanelEvent('onactivate', () => {\n                let elBtn = $.GetContextPanel().FindChildInLayoutFile('id-xpshop-top-nav').Children().filter(entry => ShopEntry.item_name + '-nav' === entry.id)[0];\n                if (elBtn && elBtn.IsValid()) {\n                    $.DispatchEvent(\"Activated\", elBtn, \"mouse\");\n                }\n            });\n            if (ShopEntry.ui_set_image) {\n                const elImage = elTile.FindChildInLayoutFile('id-xpshop-tile-icon');\n                IconUtil.SetupFallbackItemSetIcon(elImage, ShopEntry.ui_set_image);\n                IconUtil.SetItemSetSVGImage(elImage, ShopEntry.ui_set_image);\n            }\n            if (ShopEntry.limited_until) {\n                let elPanelLimitedTimer = elTile.FindChildInLayoutFile('id-xpshop-tile-limitedtimer');\n                elPanelLimitedTimer.RemoveClass('hidden');\n                let numDaysRemaining = StoreAPI.GetSecondsUntilTimestamp(parseInt(ShopEntry.limited_until));\n                numDaysRemaining = Math.floor(numDaysRemaining / (24 * 3600));\n                elPanelLimitedTimer.SetDialogVariableInt('daysremaining', numDaysRemaining);\n                let strTimer = '#SFUI_Store_Offer_Days_Remaining' +\n                    ((numDaysRemaining > 0) ? '' : '_last') +\n                    (ShopEntry.bidding_cycle ? '_bid:f' : '_claim:f');\n                strTimer = $.Localize(strTimer, elPanelLimitedTimer);\n                elPanelLimitedTimer.SetDialogVariable('limitedtimeleft', strTimer);\n            }\n            elTile.style.backgroundImage = 'url(\"file://{images}/' + ShopEntry.ui_image_thumbnail + '.png\")';\n            elTile.style.backgroundPosition = '50% 50%';\n            elTile.style.backgroundSize = 'cover';\n            if (ShopEntry.lootlist?.length === 1) {\n                if (ShopEntry.limited_until && ShopEntry.item_name && ShopEntry.item_name.startsWith('lootlist:')) {\n                    let elLimitedCarousel = $.CreatePanel('Carousel', elTile, '');\n                    elLimitedCarousel.BLoadLayoutSnippet('limited-item-carousel');\n                    elLimitedCarousel.hittest = false;\n                    elLimitedCarousel.hittestchildren = false;\n                }\n                else {\n                    elTile.FindChildInLayoutFile('id-xpshop-tile-single-image').itemid = ShopEntry.lootlist[0];\n                }\n            }\n            else if (ShopEntry.lootlist && ShopEntry.lootlist.length > 1) {\n                let elCarousel = elTile.FindChildInLayoutFile('id-xpshop-tile-carousel');\n                let elPanel;\n                const numItemsPerTile = ((ShopEntry.lootlist_item_type === \"keychain\" || ShopEntry.lootlist_item_type === \"sticker\") && ShopEntry.items_in_row < 5) ? 4 : 1;\n                let numScrollingTilesToAdd = ((ShopEntry.lootlist_item_type === \"keychain\" || ShopEntry.lootlist_item_type === \"sticker\") && numItemsPerTile > 1) ? Math.floor((ShopEntry.lootlist.length + numItemsPerTile - 1) / numItemsPerTile) : 6;\n                let shuffledArray = [...ShopEntry.lootlist];\n                shuffledArray.sort((a, b) => 0.5 - Math.random());\n                for (let iScrollingTile = 0; iScrollingTile < numScrollingTilesToAdd; ++iScrollingTile) {\n                    for (let iTileItem = 0; iTileItem < numItemsPerTile; ++iTileItem) {\n                        if ((ShopEntry.lootlist_item_type === \"keychain\" || ShopEntry.lootlist_item_type === \"sticker\") && ShopEntry.items_in_row < 5) {\n                            let entry = shuffledArray[((iScrollingTile * numScrollingTilesToAdd) + iTileItem) % shuffledArray.length];\n                            if (iTileItem === 0) {\n                                elPanel = $.CreatePanel('Panel', elCarousel, '', { class: 'xpshop__item-tile__carousel-multi-image' });\n                            }\n                            let elImage = $.CreatePanel('ItemImage', elPanel, '', { itemid: entry, class: 'carousel-image-' + iTileItem });\n                            elImage.SetHasClass('sticker', ShopEntry.lootlist_item_type === \"sticker\" ? true : false);\n                        }\n                        else {\n                            let entry = shuffledArray[iScrollingTile];\n                            $.CreatePanel('ItemImage', elCarousel, '', { itemid: entry });\n                        }\n                    }\n                }\n            }\n        }\n        elTile.FindChildInLayoutFile('id-new-item-tag').SetHasClass('hidden', !XpShop.ShouldShowNewTagForShopEntry(ShopEntry));\n        elTile.SetDialogVariable('name', ShopEntry.callout ? $.Localize(ShopEntry.callout) : ShopEntry.item_name);\n        elTile.SetDialogVariable('points', ShopEntry.points);\n        return elTile;\n    }\n    let jsTooltipDelayHandle = null;\n    function _UpdateInspectGrid(ShopEntry) {\n        m_elContentPanel.SetHasClass('xpshop-grids-visible', true);\n        let elInspectContainer = m_elContentPanel.FindChildInLayoutFile('id-xpshop-inspect-container');\n        let elGrid = elInspectContainer.FindChildInLayoutFile(ShopEntry.item_name + '-grid');\n        if (!elGrid) {\n            elGrid = $.CreatePanel('Panel', elInspectContainer, ShopEntry.item_name + '-grid');\n            elGrid.BLoadLayoutSnippet('shop-grid');\n            elGrid.SetDialogVariable('name', ShopEntry.callout ? $.Localize(ShopEntry.callout) : ShopEntry.item_name);\n            elGrid.SetDialogVariable('cost_stars', ShopEntry.points);\n            elGrid.SetDialogVariable('desc-text', $.Localize('#xpshop_redeem_item_desc' + (ShopEntry.suffix_loc_string ? ShopEntry.suffix_loc_string : ''), elGrid));\n            elGrid.SetDialogVariable('use-text', $.Localize(ShopEntry.bidding_cycle ? '#xpshop_redeem_bid_stars' : '#xpshop_redeem_use_stars', elGrid));\n            elGrid.SetDialogVariable('confirm-text', $.Localize('#xpshop_redeem_use_confirm_item' + (ShopEntry.suffix_loc_string ? ShopEntry.suffix_loc_string : ''), elGrid));\n            let elRedeemBar = elGrid.FindChildInLayoutFile('id-xpshop-item-redeem-bar');\n            let elConfirmBar = elGrid.FindChildInLayoutFile('id-xpshop-item-confirm-bar');\n            _SetUpRedeemBar(elRedeemBar, elConfirmBar, ShopEntry);\n            _SetUpConfirmBar(elRedeemBar, elConfirmBar, ShopEntry);\n            _SetWarningText(elGrid, ShopEntry);\n            let elTilesContainer = elGrid.FindChildInLayoutFile('id-xpshop-grid-tiles');\n            ShopEntry.lootlist?.forEach((itemId, idx) => {\n                let elShopTile = CreateShopTile(elTilesContainer, itemId, ShopEntry);\n                let elModel = elShopTile.FindChild('id-grid-item-model');\n                if (ShopEntry.entry_type === 'crate') {\n                    elShopTile.AddClass('crate-item');\n                    let elLootlistItems = elShopTile.FindChildInLayoutFile('id-xpshop-crate-lootlist');\n                    elModel = elShopTile.FindChildInLayoutFile('ItemPreviewPanel');\n                    ;\n                    $.Schedule(.25, () => elModel.TransitionToCamera('cam_case_open', 1));\n                    if (!elLootlistItems) {\n                        elLootlistItems = $.CreatePanel('Panel', elShopTile, 'id-xpshop-crate-lootlist-' + itemId, { class: 'xpshop__crate-lootlist' });\n                        elLootlistItems.style.backgroundImage = 'url(\"file://{images}/' + ShopEntry.ui_image_thumbnail + '.png\")';\n                        elLootlistItems.style.backgroundPosition = '50% 50%';\n                        elLootlistItems.style.backgroundSize = 'clip_then_cover';\n                        elLootlistItems.style.backgroundImgOpacity = '.6';\n                        $.CreatePanel('Panel', elLootlistItems, '', { class: 'xpshop__crate-lootlist__bg' });\n                        let textString = $.Localize('#xpshop_lootlist_info', elGrid);\n                        $.CreatePanel('Label', elLootlistItems, '', { class: 'xpshop__crate-lootlist__label', html: 'true', text: textString });\n                        let elLootlistItemTiles = $.CreatePanel('Panel', elLootlistItems, '', { class: 'xpshop__crate-lootlist__tiles' });\n                        let aCrateLootlist = _GetLootListForReward(itemId);\n                        aCrateLootlist.forEach((id, idx) => {\n                            let elItem = $.CreatePanel('Button', elLootlistItemTiles, id, { class: 'xpshop__crate-lootlist__item-tile' });\n                            elItem.BLoadLayoutSnippet('crate-lootlist-item');\n                            let elImage = elItem.FindChildInLayoutFile('id-crate-lootlits-item-image');\n                            let elRarity = elItem.FindChildInLayoutFile('id-crate-lootlits-item-rarity');\n                            if (id !== '0') {\n                                elImage.itemid = id;\n                                let color = InventoryAPI.GetItemRarityColor(id);\n                                if (color) {\n                                    elRarity.style.backgroundColor = color;\n                                }\n                                elItem.SetPanelEvent('onactivate', () => {\n                                    $.DispatchEvent(\"LootlistItemPreview\", id, itemId);\n                                });\n                            }\n                            else {\n                                let unusualItemImagePath = InventoryAPI.GetLootListUnusualItemImage(itemId) + \".png\";\n                                elImage.SetImage(\"file://{images}/\" + unusualItemImagePath);\n                                elRarity.visible = false;\n                                elItem.enabled = false;\n                            }\n                        });\n                    }\n                    return;\n                }\n                if (ShopEntry.lootlist?.length === 1) {\n                    elModel = elShopTile.FindChildInLayoutFile('ItemPreviewPanel');\n                    if (elModel.PanZoomEnabled()) {\n                        elGrid.defaultfocus = 'ItemPreviewPanel';\n                        elGrid.SetAcceptsFocus(true);\n                    }\n                    return;\n                }\n                elModel.SetActiveItem(0);\n                elModel.SetItemItemId(itemId, '');\n                elModel.hittest = false;\n                let nRenderInterval = 10;\n                elModel.SetRenderInterval(nRenderInterval);\n                let bUseNarrowZoom = false;\n                if (ShopEntry.item_name === 'lootlist:keychain_pack_kc_missinglink_lootlist' ||\n                    (InventoryAPI.GetLoadoutCategory(itemId) == 'secondary' && elShopTile.Data().defName !== 'weapon_usp_silencer') ||\n                    elShopTile.Data().defName === 'weapon_taser' ||\n                    elShopTile.Data().defName === 'weapon_mp7' ||\n                    elShopTile.Data().defName === 'weapon_mp9' ||\n                    elShopTile.Data().defName === 'weapon_mac10' ||\n                    (ShopEntry.item_name === 'lootlist:keychain_pack_kc_weapon_01_lootlist' &&\n                        (idx === 5 || idx === 13 || idx === 14 || idx === 15))) {\n                    bUseNarrowZoom = true;\n                }\n                elShopTile.SetPanelEvent('onmouseover', () => {\n                    jsTooltipDelayHandle = $.Schedule(.2, () => {\n                        jsTooltipDelayHandle = null;\n                        _EnableRotateOnModel(elModel, ShopEntry.lootlist_item_type);\n                        elModel.SetRenderInterval(0);\n                        $.Schedule(.2, () => { elModel.hittest = true; });\n                        _DarkenTiles(elTilesContainer, elShopTile);\n                        _SetZoomInSizeAndPosition(ShopEntry, elShopTile, bUseNarrowZoom);\n                    });\n                });\n                elShopTile.SetPanelEvent('onmouseout', () => {\n                    _DisableRotateOnModel(elModel);\n                    _DarkenTiles(elTilesContainer);\n                    elModel.hittest = false;\n                    elModel.SetRenderInterval(nRenderInterval);\n                    ResetSizeAndPosition(ShopEntry, elShopTile);\n                    if (jsTooltipDelayHandle) {\n                        $.CancelScheduled(jsTooltipDelayHandle);\n                        jsTooltipDelayHandle = null;\n                    }\n                });\n            });\n            $.Schedule(.15, () => PlaceTiles(elTilesContainer, ShopEntry));\n        }\n        else {\n            $.Schedule(.1, () => PlaceTiles(elGrid.FindChildInLayoutFile('id-xpshop-grid-tiles'), ShopEntry));\n            _SetUpRedeemBar(elGrid.FindChildInLayoutFile('id-xpshop-item-redeem-bar'), elGrid.FindChildInLayoutFile('id-xpshop-item-confirm-bar'), ShopEntry);\n            if (ShopEntry.lootlist && ShopEntry.lootlist_item_type === 'weapon' && ShopEntry.lootlist.length == 1) {\n                let elLimitedItem = elGrid.FindChildInLayoutFile(ShopEntry.lootlist[0]);\n                if (elLimitedItem && elLimitedItem.IsValid()) {\n                    InspectModelImage.Init(elLimitedItem, ShopEntry.lootlist[0]);\n                }\n            }\n            if (ShopEntry.lootlist?.length === 1) {\n                let elModel = elGrid.FindChildInLayoutFile('ItemPreviewPanel');\n                if (elModel.PanZoomEnabled()) {\n                    elGrid.defaultfocus = 'ItemPreviewPanel';\n                    elGrid.SetAcceptsFocus(true);\n                    elModel.ResetPanZoom();\n                }\n            }\n        }\n        _UpdateVisibleInspectGrid(elInspectContainer, ShopEntry.item_name + '-grid');\n    }\n    function _DeleteInspectGrid() {\n        if (!m_nTrack || m_nTrack === 0) {\n            return;\n        }\n        let nCount = MissionsAPI.GetSeasonalOperationRedeemableGoodsCount(m_nTrack);\n        for (let i = 0; i < nCount; i++) {\n            let item_name = MissionsAPI.GetSeasonalOperationRedeemableGoodsSchema(m_nTrack, i, 'item_name');\n            let elInspectContainer = m_elContentPanel.FindChildInLayoutFile('id-xpshop-inspect-container');\n            let elGrid = elInspectContainer.FindChildInLayoutFile(item_name + '-grid');\n            if (elGrid) {\n                elGrid.DeleteAsync(1.0);\n            }\n        }\n    }\n    function _SetUpRedeemBar(elRedeemBar, elConfirmBar, ShopEntry) {\n        let RedeemBtn = elRedeemBar.FindChildInLayoutFile('id-xpshop-item-redeem-btn-' + ShopEntry.shop_index);\n        if (!RedeemBtn) {\n            RedeemBtn = $.CreatePanel('Button', elRedeemBar, 'id-xpshop-item-redeem-btn-' + ShopEntry.shop_index);\n            RedeemBtn.BLoadLayoutSnippet('redeem-button');\n        }\n        let elBalance = $.GetContextPanel().FindChildInLayoutFile('id-xpshop-balance');\n        RedeemBtn.SetDialogVariable('pass', InventoryAPI.GetItemName(m_passId));\n        RedeemBtn.SetDialogVariableInt('max-stars', StoreAPI.GetXpShopMaxTrackLevel());\n        RedeemBtn.enabled = (ShopEntry.points !== undefined &&\n            ShopEntry.points !== '' &&\n            elBalance.Data().balance &&\n            (elBalance.Data().balance >= parseInt(ShopEntry.points))) ? true : false;\n        RedeemBtn.SetPanelEvent('onactivate', () => {\n            elRedeemBar.SetHasClass('hidden', true);\n            elConfirmBar.SetHasClass('hidden', false);\n            elConfirmBar.FindChildInLayoutFile('id-xpshop-item-redeem-confirm').enabled = true;\n            elConfirmBar.FindChildInLayoutFile('id-xpshop-item-redeem-cancel').enabled = true;\n            elConfirmBar.GetParent().FindChildInLayoutFile(\"id-xpshop-item-bidamt-bar\").SetHasClass('hidden', true);\n        });\n        RedeemBtn.SetPanelEvent('onmouseover', () => {\n            let nStarsNeeded = m_activeTracks > 0 ? ((ShopEntry.bidding_cycle ? 1 : parseInt(ShopEntry.points)) - elBalance.Data().balance) : 0;\n            RedeemBtn.SetDialogVariableInt('stars_needed', nStarsNeeded);\n            let strToolTip = (m_activeTracks < 1) ? '#xpshop_redeem_need_pass_tooltip' :\n                nStarsNeeded > 0 ? $.Localize('#xpshop_redeem_not_enough_stars:f', RedeemBtn) : '';\n            if (strToolTip === '') {\n                return;\n            }\n            UiToolkitAPI.ShowTextTooltip(RedeemBtn.id, strToolTip);\n        });\n        RedeemBtn.SetPanelEvent('onmouseout', () => {\n            UiToolkitAPI.HideTextTooltip();\n        });\n        if (ShopEntry.ui_set_image) {\n            const elImage = elRedeemBar.FindChildInLayoutFile('id-xpshop-item-redeem-icon');\n            IconUtil.SetupFallbackItemSetIcon(elImage, ShopEntry.ui_set_image);\n            IconUtil.SetItemSetSVGImage(elImage, ShopEntry.ui_set_image);\n        }\n        _ResetToRewardsBar(elRedeemBar, elConfirmBar);\n        if (ShopEntry.bidding_cycle && elBalance.Data().balance && elBalance.Data().balance > 0) {\n            RedeemBtn.enabled = true;\n            RedeemBtn.SetPanelEvent('onactivate', () => {\n                const rtBiddingClose = parseInt(ShopEntry.bidding_close);\n                const rtBiddingCycle = parseInt(ShopEntry.bidding_cycle);\n                const rtBiddingPause = parseInt(ShopEntry.bidding_pause);\n                const numSecondsRemaining = StoreAPI.GetSecondsUntilTimestamp(rtBiddingClose);\n                if (numSecondsRemaining <= 0) {\n                    UiToolkitAPI.ShowGenericPopupOneOptionBgStyle(ShopEntry.callout, \"#xpshop_redeem_bid_allover\", \"\", \"#UI_OK\", () => { }, \"dim\");\n                    return;\n                }\n                const numPeriodsRemaining = Math.floor(numSecondsRemaining / rtBiddingCycle);\n                const rtPreviousClose = rtBiddingClose - (numPeriodsRemaining + 1) * rtBiddingCycle;\n                const numSecondsSincePrevious = (rtBiddingClose - numSecondsRemaining) - rtPreviousClose;\n                if ((numSecondsSincePrevious >= rtBiddingCycle)\n                    || (numSecondsSincePrevious <= rtBiddingPause)) {\n                    const numSecondsUntilNextBidOpens = rtBiddingPause - ((numSecondsSincePrevious >= rtBiddingCycle)\n                        ? 0 : numSecondsSincePrevious);\n                    const numHours = Math.floor(numSecondsUntilNextBidOpens / 3600) + 1;\n                    RedeemBtn.SetDialogVariableInt('hours_until_bid_batch', numHours);\n                    UiToolkitAPI.ShowGenericPopupOneOptionBgStyle(ShopEntry.callout, $.Localize(\"#xpshop_redeem_bid_batchover:f\", RedeemBtn), \"\", \"#UI_OK\", () => { }, \"dim\");\n                    return;\n                }\n                if (ShopEntry.flags && ((ShopEntry.flags & 4) === 4)) {\n                    const petItemId = InventoryAPI.GetPetItemID();\n                    if (petItemId) {\n                        UiToolkitAPI.ShowGenericPopupOneOptionBgStyle(ShopEntry.callout, \"#chicken_egg_cannot_bid_own\", \"\", \"#UI_OK\", () => { }, \"dim\");\n                        return;\n                    }\n                }\n                elRedeemBar.SetHasClass('hidden', true);\n                elConfirmBar.SetHasClass('hidden', false);\n                elConfirmBar.FindChildInLayoutFile('id-xpshop-item-redeem-confirm').enabled = true;\n                elConfirmBar.FindChildInLayoutFile('id-xpshop-item-redeem-cancel').enabled = true;\n                ShopEntry.bidding_points_amount = 1;\n                let bMakingNewBid = true;\n                const numBids = InventoryAPI.GetCacheTypeElementsCount('XpShopBids');\n                for (let iBid = 0; iBid < numBids; ++iBid) {\n                    const jsoBid = InventoryAPI.GetCacheTypeElementJSOByIndex('XpShopBids', iBid);\n                    if (jsoBid.campaign_id == m_nTrack) {\n                        ShopEntry.bidding_points_amount = jsoBid.expected_cost;\n                        bMakingNewBid = false;\n                        break;\n                    }\n                }\n                let fnLocalizeConfirmBar = () => {\n                    elConfirmBar.SetDialogVariable('cost_stars', '' + ShopEntry.bidding_points_amount);\n                    elConfirmBar.SetDialogVariable('confirm-text', $.Localize((bMakingNewBid ? '#xpshop_redeem_use_confirm_item' : '#xpshop_redeem_use_cancel_item')\n                        + (ShopEntry.suffix_loc_string ? ShopEntry.suffix_loc_string : ''), elConfirmBar));\n                    elConfirmBar.FindChildInLayoutFile('id-xpshop-item-redeem-confirm').Children()[0].text\n                        = $.Localize((bMakingNewBid ? '#xpshop_redeem_use_confirm_item_bid_btn' : '#xpshop_redeem_use_cancel_item_bid_btn'), elConfirmBar);\n                };\n                let elBidAmount = elConfirmBar.GetParent().FindChildInLayoutFile(\"id-xpshop-item-bidamt-bar\");\n                if (bMakingNewBid && elBalance.Data().balance > 1) {\n                    elBidAmount.SetDialogVariable('cost_stars', \"\");\n                    elBidAmount.SetDialogVariableInt('bid-amount', 1);\n                    elBidAmount.SetHasClass('hidden', false);\n                    let elBidSlider = elBidAmount.FindChildInLayoutFile(\"id-xpshop-bid-amount\");\n                    elBidSlider.min = 1;\n                    elBidSlider.max = elBalance.Data().balance;\n                    elBidSlider.increment = 1;\n                    elBidSlider.default = 1;\n                    elBidSlider.value = 1;\n                    elBidSlider.SetPanelEvent('onvaluechanged', () => {\n                        const n = Math.round(elBidSlider.value);\n                        ShopEntry.bidding_points_amount = n;\n                        elBidAmount.SetDialogVariableInt('bid-amount', n);\n                        fnLocalizeConfirmBar();\n                    });\n                    elBidAmount.FindChildInLayoutFile(\"id-xpshop-bid-amount-less\").SetPanelEvent('onactivate', () => {\n                        const n = Math.round(elBidSlider.value);\n                        if (n > 1)\n                            elBidSlider.value = (n - 1);\n                    });\n                    elBidAmount.FindChildInLayoutFile(\"id-xpshop-bid-amount-more\").SetPanelEvent('onactivate', () => {\n                        const n = Math.round(elBidSlider.value);\n                        if (n < elBalance.Data().balance)\n                            elBidSlider.value = (n + 1);\n                    });\n                }\n                else {\n                    elBidAmount.SetHasClass('hidden', true);\n                }\n                fnLocalizeConfirmBar();\n                if (!bMakingNewBid)\n                    ShopEntry.bidding_points_amount = -ShopEntry.bidding_points_amount;\n            });\n        }\n    }\n    function _SetUpConfirmBar(elRedeemBar, elConfirmBar, ShopEntry) {\n        elConfirmBar.FindChildInLayoutFile('id-xpshop-item-redeem-cancel').SetPanelEvent('onactivate', () => {\n            _ResetToRewardsBar(elRedeemBar, elConfirmBar);\n        });\n        if (ShopEntry.ui_set_image) {\n            const elImage = elConfirmBar.FindChildInLayoutFile('id-xpshop-item-confirm-icon');\n            IconUtil.SetupFallbackItemSetIcon(elImage, ShopEntry.ui_set_image);\n            IconUtil.SetItemSetSVGImage(elImage, ShopEntry.ui_set_image);\n        }\n        elConfirmBar.FindChildInLayoutFile('id-xpshop-item-redeem-confirm').SetPanelEvent('onactivate', () => {\n            InventoryAPI.SetInventorySortAndFilters('inv_sort_age', false, 'only_econ_items', '', '');\n            if (InventoryAPI.GetInventoryCount() >= ItemInfo.NUM_BACKPACK_SLOTS) {\n                UiToolkitAPI.ShowGenericPopupOk($.Localize('#popup_casket_title_error_casket_inv_full'), $.Localize('#SFUI_InventoryFull_Error'), '', () => { });\n                return;\n            }\n            MissionsAPI.ActionRedeemOperationGoods(m_nTrack, ShopEntry.shop_index, ShopEntry.bidding_cycle ? ShopEntry.bidding_points_amount : parseInt(ShopEntry.points));\n            elConfirmBar.FindChildInLayoutFile('id-xpshop-item-redeem-confirm').enabled = false;\n            elConfirmBar.FindChildInLayoutFile('id-xpshop-item-redeem-cancel').enabled = false;\n            $.GetContextPanel().SetHasClass('waiting-for-redeem', true);\n            _StartRedeemParticles();\n            $.DispatchEvent(\"CSGOPlaySoundEffect\", \"UI.XP.Star.Spend\", \"MOUSE\");\n            m_showTimeoutScheduleHandle = $.Schedule(5, () => {\n                $.DispatchEvent(\"Activated\", elConfirmBar.FindChildInLayoutFile('id-xpshop-item-redeem-cancel'), \"mouse\");\n                $.GetContextPanel().SetHasClass('waiting-for-redeem', false);\n                _StopRedeemParticles();\n                let elBtn = $.GetContextPanel().FindChildInLayoutFile('id-nav-show-main-tiles-btn');\n                $.DispatchEvent(\"Activated\", elBtn, \"mouse\");\n                UiToolkitAPI.ShowGenericPopupOk($.Localize('#SFUI_SteamConnectionErrorTitle'), $.Localize('#SFUI_InvError_Item_Not_Given'), '', () => { });\n            });\n        });\n    }\n    function _ResetToRewardsBar(elRedeemBar, elConfirmBar) {\n        elRedeemBar.SetHasClass('hidden', false);\n        elConfirmBar.SetHasClass('hidden', true);\n        elConfirmBar.GetParent().FindChildInLayoutFile(\"id-xpshop-item-bidamt-bar\").SetHasClass('hidden', true);\n    }\n    function _SetWarningText(elGrid, ShopEntry) {\n        let warningText = '';\n        let elWarning = elGrid.FindChildInLayoutFile('id-xpshop-item-warning');\n        elWarning.SetHasClass('hidden', true);\n        if (ShopEntry.entry_type !== 'crate') {\n            return;\n        }\n        if (ShopEntry.lootlist) {\n            let keyId = InventoryAPI.GetAssociatedItemIdByIndex(ShopEntry.lootlist[0], 0);\n            elGrid.SetDialogVariable('keyname', InventoryAPI.GetItemName(keyId));\n            elGrid.SetDialogVariable('casename', InventoryAPI.GetItemName(ShopEntry.lootlist[0]));\n        }\n        warningText = $.Localize('#xpshop_key_warning', elGrid);\n        elWarning.SetHasClass('hidden', false);\n        elGrid.SetDialogVariable('warning', warningText);\n    }\n    function _StartRedeemParticles() {\n        const elRedeemFx = $.GetContextPanel().FindChildInLayoutFile('id-redeem-wait-particle');\n        const HColor = [0, 255, 212];\n        elRedeemFx.StartParticles();\n        elRedeemFx.SetControlPoint(16, HColor[0], HColor[1], HColor[2]);\n    }\n    function _StopRedeemParticles() {\n        const elRedeemFx = $.GetContextPanel().FindChildInLayoutFile('id-redeem-wait-particle');\n        if (elRedeemFx !== null) {\n            elRedeemFx.StopParticlesWithEndcaps();\n        }\n    }\n    function _EnableRotateOnModel(elModel, lootlist_item_type = '') {\n        if (lootlist_item_type === \"sticker\") {\n            elModel.SetRotationLimits(50, 50);\n        }\n        else {\n            elModel.SetRotationLimits(360, 360);\n        }\n        elModel.SetAutoRotateAmount(30, 20);\n        elModel.SetAutoRotatePeriod(8, 8);\n    }\n    function _DisableRotateOnModel(elModel) {\n        elModel.SetRotationLimits(0, 0);\n        elModel.SetAutoRotateAmount(0, 0);\n        elModel.SetAutoRotatePeriod(0, 0);\n        elModel.SetRotation(0, 0, 0);\n    }\n    function _SetZoomInSizeAndPosition(ShopEntry, elShopTile, bUseNarrowZoom) {\n        let baseWidth = ShopEntry.tile_width;\n        let baseHeight = ShopEntry.tile_height;\n        let zoomWidth = bUseNarrowZoom ? baseWidth : baseWidth * 2.0;\n        let zoomHeight = baseHeight * 2.0;\n        elShopTile.style.height = zoomHeight + 'px';\n        elShopTile.style.width = zoomWidth + 'px';\n        let tilePosX = Math.floor(elShopTile.actualxoffset / elShopTile.actualuiscale_x);\n        let initialXTranslate = zoomWidth === baseWidth ? 0 : (baseWidth / 2);\n        let sideOffset = 20;\n        let contentPanelWidth = Math.floor(m_elContentPanel.actuallayoutwidth / m_elContentPanel.actualuiscale_x);\n        let finalXTranslate = 0;\n        if (tilePosX - initialXTranslate < m_elContentPanel.actualxoffset / m_elContentPanel.actualuiscale_x) {\n            finalXTranslate = ((tilePosX) - sideOffset) * -1;\n        }\n        else if (((tilePosX - initialXTranslate) + zoomWidth) > contentPanelWidth) {\n            finalXTranslate = (tilePosX - (contentPanelWidth - (zoomWidth + sideOffset))) * -1;\n        }\n        else {\n            finalXTranslate = initialXTranslate * -1;\n        }\n        let tilePosY = Math.floor(elShopTile.actualyoffset / elShopTile.actualuiscale_y);\n        let initialYTranslate = (baseHeight / 2);\n        let finalYTranslate = 0;\n        let contentPanelHeight = Math.floor(m_elContentPanel.actuallayoutheight / m_elContentPanel.actualuiscale_y);\n        let bottomOffset = 32 + 48;\n        let topOffset = 92;\n        if ((tilePosY + zoomHeight) > (contentPanelHeight - bottomOffset)) {\n            finalYTranslate = (tilePosY - (contentPanelHeight - zoomHeight)) + bottomOffset;\n        }\n        else if ((tilePosY - baseHeight / 2) < topOffset) {\n            finalYTranslate = 0;\n        }\n        else {\n            finalYTranslate = initialYTranslate;\n        }\n        elShopTile.style.transform = 'translateX(' + finalXTranslate + 'px) translateY(' + (finalYTranslate * -1) + 'px)';\n    }\n    function ResetSizeAndPosition(ShopEntry, elShopTile) {\n        elShopTile.style.width = (ShopEntry.tile_width) + 'px';\n        elShopTile.style.height = (ShopEntry.tile_height) + 'px';\n        elShopTile.style.transform = 'translateX(0px) translateY(0px)';\n    }\n    function PlaceTiles(elTilesContainer, ShopEntry) {\n        if (ShopEntry.lootlist?.length === 1) {\n            return;\n        }\n        let nRows = 0;\n        let nTileY = 0;\n        const aChildren = elTilesContainer.Children();\n        const nPanelsCount = aChildren.length;\n        const nMaxColumns = ShopEntry.lootlist_item_type === 'weapon' ? 4 : ShopEntry.lootlist_item_type === 'sticker' ? 8 : 7;\n        const oRowsAndColumns = StickerItemsPerRow(nPanelsCount, nMaxColumns);\n        const nTotalRows = oRowsAndColumns.rows;\n        const nColumns = oRowsAndColumns.cols;\n        const contentPanelWidth = Math.floor(elTilesContainer.actuallayoutwidth / elTilesContainer.actualuiscale_x);\n        const contentPanelHeight = Math.floor(elTilesContainer.actuallayoutheight / elTilesContainer.actualuiscale_y);\n        const tileWidth = ShopEntry.tile_width;\n        const tileHeight = ShopEntry.tile_height;\n        const xOffset = (contentPanelWidth - (tileWidth * nColumns)) / 2;\n        const yOffset = (contentPanelHeight - (tileHeight * nTotalRows)) / 2;\n        aChildren.forEach((element, idx) => {\n            if (idx % nColumns === 0) {\n                nTileY = tileHeight * nRows;\n                nRows++;\n            }\n            element.style.x = (idx % nColumns * tileWidth) + xOffset + 'px';\n            element.style.y = (nTileY + yOffset) + 'px';\n        });\n    }\n    function StickerItemsPerRow(nPanelsCount, maxColumn) {\n        const maxRows = 4;\n        if (nPanelsCount >= 32) {\n            return { rows: maxRows, cols: maxColumn };\n        }\n        let cols = Math.min(maxColumn, Math.ceil(Math.sqrt(nPanelsCount)));\n        let rows = Math.ceil(nPanelsCount / cols);\n        if (rows > maxRows) {\n            rows = maxRows;\n            cols = Math.ceil(nPanelsCount / rows);\n        }\n        return { rows: rows, cols: cols };\n    }\n    function CreateShopTile(elTilesContainer, itemId, ShopEntry) {\n        let sStyle = 'xpshop__inspect-grid__tile';\n        let mapName = ShopEntry.lootlist?.length === 1 ? GameInterfaceAPI.GetSettingString('ui_inspect_bkgnd_map') + '_vanity' : \"ui/xpshop_item\";\n        let elPanel = $.CreatePanel('CSGOBlurTarget', elTilesContainer, itemId, { class: sStyle });\n        if (ShopEntry.lootlist?.length === 1) {\n            elPanel.SetHasClass('single-item', true);\n        }\n        else {\n            elPanel.style.width = (ShopEntry.tile_width) + 'px';\n            elPanel.style.height = (ShopEntry.tile_height) + 'px';\n        }\n        if (ShopEntry.lootlist?.length === 1) {\n            InspectModelImage.Init(elPanel, itemId);\n        }\n        else {\n            const defName = InventoryAPI.GetItemDefinitionName(itemId);\n            elPanel.Data().defName = defName;\n            let cameraData = XpShopWeaponCameraSettings.CameraSettings.find(({ type }) => type === defName);\n            let cameraSuffix = cameraData !== undefined ? cameraData.camera : '0';\n            let camera = 'camera_' + ShopEntry.lootlist_item_type + '_' + cameraSuffix;\n            MakeMapItemPreviewPanel(elPanel, camera, mapName, ShopEntry);\n        }\n        MakeShopTileInfoElements(elPanel, itemId, ShopEntry);\n        return elPanel;\n    }\n    function MakeMapItemPreviewPanel(elPanel, camera, mapName, ShopEntry) {\n        return $.CreatePanel('MapItemPreviewPanel', elPanel, 'id-grid-item-model', {\n            class: 'xpshop__inspect-grid__tile__model',\n            \"require-composition-layer\": \"true\",\n            'transparent-background': true,\n            'disable-depth-of-field': true,\n            camera: camera,\n            player: \"false\",\n            map: mapName,\n            initial_entity: 'item',\n            active_item_idx: 0,\n            mouse_rotate: \"true\",\n            rotation_limit_x: \"0\",\n            rotation_limit_y: \"0\",\n            auto_rotate_x: \"0\",\n            auto_rotate_y: \"0\",\n            auto_rotate_period_x: \"0\",\n            auto_rotate_period_y: \"0\",\n            auto_recenter: true,\n            hittest: \"true\",\n            hide_while_waiting_for_composite_materials: \"false\"\n        });\n    }\n    function MakeShopTileInfoElements(elPanel, itemId, ShopEntry) {\n        let sTitleStyle = 'xpshop__inspect-grid__tile__label';\n        $.CreatePanel('Label', elPanel, '', { text: InventoryAPI.GetItemName(itemId), class: sTitleStyle });\n        let elRarity = $.CreatePanel('Panel', elPanel, '', { class: 'xpshop__inspect-grid__tile__rarity' });\n        let color = InventoryAPI.GetItemRarityColor(itemId);\n        if (!color)\n            elRarity.visible = false;\n        else\n            elRarity.style.backgroundColor = color;\n        let Btn = $.CreatePanel('Button', elPanel, '', { class: 'xpshop__inspect-grid__tile__inspect-btn' });\n        $.CreatePanel('Image', Btn, '').SetImage('file://{images}/icons/ui/zoom_in.svg');\n        Btn.SetPanelEvent('onactivate', () => {\n            if (ShopEntry.on_item_activate) {\n                ShopEntry.on_item_activate(ShopEntry, itemId);\n            }\n        });\n        if (ShopEntry.lootlist?.length === 1 && ShopEntry.limited_until && !ShopEntry.bidding_cycle) {\n            let elHint = $.CreatePanel('Panel', elPanel, 'id-xpshop-limited-item-tooltip-loc');\n            elHint.BLoadLayoutSnippet('limited-item-variety');\n            elHint.SetPanelEvent('onmouseover', () => {\n                UiToolkitAPI.ShowCustomLayoutTooltip('id-xpshop-limited-item-tooltip-loc', 'id-xpshop-limited-item-tooltip', 'file://{resources}/layout/tooltips/tooltip_limited_item_variation.xml');\n            });\n            elHint.SetPanelEvent('onmouseout', () => {\n                UiToolkitAPI.HideCustomLayoutTooltip('id-xpshop-limited-item-tooltip');\n            });\n            elHint.AddClass('xpshop-preview-variety');\n        }\n    }\n    function OpenFullscreenInspect(ShopEntry) {\n        let nDefinitionIndex = InventoryAPI.GetItemDefinitionIndexFromDefinitionName(ShopEntry.item_name);\n        let id = InventoryAPI.GetFauxItemIDFromDefAndPaintIndex(nDefinitionIndex, 0);\n        const elPanel = UiToolkitAPI.ShowCustomLayoutPopup('popup-inspect-' + id, 'file://{resources}/layout/popups/popup_capability_decodable.xml');\n        let oSettings = {\n            item_id: id,\n            show_work_type_warning: false,\n            force_hide_async_bar: true,\n            inspect_only: true,\n            work_type: 'decodeable',\n            only_close_btn: true\n        };\n        elPanel.Data().oSettings = oSettings;\n    }\n    function _OpenFullScreenInspectItem(ShopEntry, itemId) {\n        let nameOverride = ShopEntry.callout ? ShopEntry.callout : ShopEntry.item_name;\n        $.DispatchEvent(\"LootlistItemPreview\", itemId, ShopEntry.item_name + ',,,' + nameOverride);\n    }\n    function _DarkenTiles(elItemsContainer, SelectedPanel = null) {\n        elItemsContainer.Children().forEach(element => {\n            if (element && element.IsValid()) {\n                element.SetHasClass('darken', element.id !== SelectedPanel?.id && SelectedPanel !== null);\n            }\n        });\n    }\n    function _UpdateVisibleInspectGrid(elParent, id) {\n        elParent.Children().forEach(element => {\n            element.SetHasClass('show', (element.id === id));\n        });\n    }\n    function _MakeShowMainTilesNavBtn() {\n        let elParent = $.GetContextPanel().FindChildInLayoutFile('id-xpshop-top-nav');\n        let elBtn = elParent.FindChildInLayoutFile('id-nav-show-main-tiles-btn');\n        if (!elBtn) {\n            elBtn = $.CreatePanel('RadioButton', elParent, 'id-nav-show-main-tiles-btn', { group: 'xpshop-nav' });\n            elBtn.BLoadLayoutSnippet('shop-nav');\n            elBtn.FindChild('id-xpshop-nav-btn-img').SetImage('file://{images}/icons/ui/xpshop_tiles.svg');\n            elBtn.SetPanelEvent('onactivate', () => {\n                let elParent = $.GetContextPanel().FindChildInLayoutFile('id-xpshop-content');\n                elParent.SetHasClass('xpshop-grids-visible', false);\n            });\n        }\n    }\n    function ShouldShowNewTagForShopEntry(ShopEntry) {\n        if (ShopEntry.ui_show_new_tag) {\n            let numSecondsRemaining = StoreAPI.GetSecondsUntilTimestamp(parseInt(ShopEntry.ui_show_new_tag));\n            return (numSecondsRemaining > 0);\n        }\n        return false;\n    }\n    XpShop.ShouldShowNewTagForShopEntry = ShouldShowNewTagForShopEntry;\n    function _MakeNavButton(ShopEntry) {\n        let elParent = $.GetContextPanel().FindChildInLayoutFile('id-xpshop-top-nav');\n        let elBtn = elParent.FindChildInLayoutFile(ShopEntry.item_name + '-nav');\n        if (!elBtn) {\n            elBtn = $.CreatePanel('RadioButton', elParent, ShopEntry.item_name + '-nav', { group: 'xpshop-nav' });\n            elBtn.BLoadLayoutSnippet('shop-nav');\n            elBtn.SetPanelEvent('onactivate', () => _UpdateInspectGrid(ShopEntry));\n            elBtn.Data().ui_order = ShopEntry.ui_order;\n            if (ShopEntry.ui_set_image) {\n                const elImage = elBtn.FindChild('id-xpshop-nav-btn-img');\n                IconUtil.SetupFallbackItemSetIcon(elImage, ShopEntry.ui_set_image);\n                IconUtil.SetItemSetSVGImage(elImage, ShopEntry.ui_set_image);\n            }\n        }\n    }\n    function _CancelTimeoutForRewardItem() {\n        _StopRedeemParticles();\n        $.GetContextPanel().SetHasClass('waiting-for-redeem', false);\n        if (m_showTimeoutScheduleHandle) {\n            $.CancelScheduled(m_showTimeoutScheduleHandle);\n            m_showTimeoutScheduleHandle = null;\n        }\n    }\n    function _OnHideMainMenu() {\n        _CancelTimeoutForRewardItem();\n        _DeleteInspectGrid();\n    }\n    function _OnHidePauseMenu() {\n        _CancelTimeoutForRewardItem();\n        _DeleteInspectGrid();\n    }\n    $.RegisterForUnhandledEvent('UpdateXpShop', InventoryUpdate);\n    $.RegisterForUnhandledEvent('CSGOHideMainMenu', _OnHideMainMenu);\n    $.RegisterForUnhandledEvent('CSGOHidePauseMenu', _OnHidePauseMenu);\n})(XpShop || (XpShop = {}));\n","scripts/xpshop_track.js":"\"use strict\";\n/// <reference path=\"csgo.d.ts\" />\n/// <reference path=\"common/async.ts\" />\n/// <reference path=\"particle_controls.ts\" />\nvar XpShopTrack;\n(function (XpShopTrack) {\n    let pieAnimDuration = 1;\n    const nXPperStar = StoreAPI.GetXpShopStarXp();\n    function XpShopInit(settings) {\n        const elRootPanel = settings.xpshop_track_frame_panel;\n        if (!elRootPanel || !elRootPanel.IsValid())\n            return;\n        const elTrack = elRootPanel.FindChildTraverse('jsRadialTrack');\n        if (!elTrack)\n            return;\n        const elTrackFx = elRootPanel.FindChildTraverse('jsRadialTrackInsideFx');\n        const elTrackBGFx = elRootPanel.FindChildTraverse('jsRadialTrackBgFx');\n        if (elTrackFx && elTrackBGFx) {\n            elTrackBGFx.StopParticlesWithEndcaps();\n            elTrackFx.StopParticlesWithEndcaps();\n        }\n        const nStarsEarned = settings.xpshop_track_value > 0 ? Math.floor(settings.xpshop_track_value / nXPperStar) : 0;\n        const nXpProgressTowardsNextStar = settings.xpshop_track_value % nXPperStar;\n        const nPercentProgressTowardsNextStar = nXpProgressTowardsNextStar / nXPperStar * 100;\n        elRootPanel.SetDialogVariableInt('progress-to-next-star', nPercentProgressTowardsNextStar);\n        elRootPanel.SetDialogVariableInt('stars-earned', nStarsEarned);\n        elRootPanel.SetDialogVariableInt('max-stars', StoreAPI.GetXpShopMaxTrackLevel());\n        elTrack.style.clip = 'radial(50% 50%, 0deg, ' + Math.floor(nPercentProgressTowardsNextStar / 100 * 360) + 'deg)';\n        elTrack.style.transitionDuration = '0s';\n        elRootPanel.Data().prev_xpshop_track_value = settings.xpshop_track_value;\n        SetComplete(elRootPanel, nStarsEarned >= StoreAPI.GetXpShopMaxTrackLevel());\n    }\n    XpShopTrack.XpShopInit = XpShopInit;\n    function PlayActivateParticles(settings) {\n        const elRootPanel = settings.xpshop_track_frame_panel;\n        if (!elRootPanel || !elRootPanel.IsValid())\n            return;\n        const elTrackFx = elRootPanel.FindChildTraverse('jsRadialTrackInsideFx');\n        const elTrackBGFx = elRootPanel.FindChildTraverse('jsRadialTrackBgFx');\n        elTrackBGFx.StartParticles();\n        elTrackFx.StartParticles();\n        elTrackBGFx.SetControlPoint(6, 1, 1, 1);\n        elTrackFx.SetControlPoint(6, 30, 1, 1);\n        elTrackFx.SetControlPoint(5, 0, 1, 1);\n        elTrackFx.SetControlPoint(5, 1, 1, 1);\n    }\n    XpShopTrack.PlayActivateParticles = PlayActivateParticles;\n    function SetComplete(elRoot, bSet = true) {\n        elRoot.SetHasClass('complete', bSet);\n        elRoot.SetDialogVariable('xpshop-track-tooltip', bSet ?\n            $.Localize('#xpshop_track_complete_tooltip') :\n            $.Localize('#xpshop_track_tooltip'));\n    }\n    async function XpShopUpdate(settings) {\n        const elRootPanel = settings.xpshop_track_frame_panel;\n        if (!elRootPanel || !elRootPanel.IsValid())\n            return;\n        const elTrack = elRootPanel.FindChildTraverse('jsRadialTrack');\n        const elTrackFx = elRootPanel.FindChildTraverse('jsRadialTrackInsideFx');\n        const elTrackBGFx = elRootPanel.FindChildTraverse('jsRadialTrackBgFx');\n        let haveFx = false;\n        if (elTrackFx && elTrackBGFx)\n            haveFx = true;\n        if (!elTrack)\n            return;\n        const prevTrackXp = elRootPanel.Data().prev_xpshop_track_value;\n        if (prevTrackXp === undefined) {\n            return;\n        }\n        const oldStars = Math.floor(prevTrackXp / nXPperStar);\n        const newStars = Math.floor(settings.xpshop_track_value / nXPperStar);\n        const starsEarned = newStars - oldStars;\n        elRootPanel.SetDialogVariableInt('stars-earned', oldStars);\n        if (oldStars >= StoreAPI.GetXpShopMaxTrackLevel()) {\n            SetComplete(elRootPanel);\n            return;\n        }\n        elTrack.style.transitionDuration = pieAnimDuration + 's';\n        if (haveFx) {\n            elTrackBGFx.StartParticles();\n            elTrackFx.StartParticles();\n            elTrackFx.SetControlPoint(6, 0, 1, 1);\n            elTrackFx.SetControlPoint(5, 0, 1, 1);\n            elTrackFx.SetControlPoint(5, 1, 1, 1);\n        }\n        for (let i = 0; i < starsEarned; i++) {\n            if (haveFx) {\n                elTrackFx.SetControlPoint(6, 0, 1, 1);\n                elTrackBGFx.SetControlPoint(6, 0, 1, 1);\n            }\n            elRootPanel.AddClass(\"in-motion\");\n            elTrack.style.transitionDuration = pieAnimDuration + 's';\n            elTrack.style.clip = 'radial(50% 50%, 0deg, 360deg)';\n            elRootPanel.SetDialogVariableInt('progress-to-next-star', 100);\n            UiToolkitAPI.PlaySoundEvent(\"UI.XP.Star.Filling\");\n            await Async.Delay(pieAnimDuration);\n            elRootPanel.SetDialogVariableInt('stars-earned', oldStars + i + 1);\n            elRootPanel.AddClass(\"earned-star\");\n            elTrack.style.transitionDuration = '0s';\n            elRootPanel.style.transitionProperty = 'brightness';\n            elRootPanel.style.transitionDuration = '.1s';\n            UiToolkitAPI.PlaySoundEvent(\"UI.XP.Star.Full\");\n            if (haveFx) {\n                elTrackBGFx.SetControlPoint(6, 1, 1, 1);\n                elTrackFx.SetControlPoint(6, 30, 1, 1);\n                elTrackFx.SetControlPoint(5, 0, 1, 1);\n                elTrackFx.SetControlPoint(5, 1, 1, 1);\n            }\n            elRootPanel.style.brightness = '2';\n            await Async.Delay(0.2);\n            elRootPanel.style.brightness = '1';\n            await Async.Delay(0.2);\n            elTrack.style.clip = 'radial(50% 50%, 0deg, 0deg)';\n            elRootPanel.SetDialogVariableInt('progress-to-next-star', 0);\n            elTrack.style.transitionDuration = pieAnimDuration + 's';\n        }\n        const deltaXp = settings.xpshop_track_value % nXPperStar;\n        if (newStars >= StoreAPI.GetXpShopMaxTrackLevel()) {\n            SetComplete(elRootPanel);\n            return;\n        }\n        if (deltaXp > 0) {\n            elRootPanel.AddClass(\"in-motion\");\n            const nPercentProgressTowardsNextStar = deltaXp / nXPperStar * 100;\n            const nDegrees = Math.floor(nPercentProgressTowardsNextStar / 100 * 360);\n            elRootPanel.SetDialogVariableInt('progress-to-next-star', nPercentProgressTowardsNextStar);\n            elRootPanel.SetDialogVariableInt('stars-earned', newStars);\n            elTrack.style.clip = 'radial(50% 50%, 0deg, ' + nDegrees + 'deg)';\n            UiToolkitAPI.PlaySoundEvent(\"UI.XP.Star.Filling\");\n            elRootPanel.Data().prev_xpshop_track_value = settings.xpshop_track_value;\n        }\n        if (haveFx) {\n            elTrackFx.SetControlPoint(6, 0, 1, 1);\n        }\n        await Async.Delay(0.5);\n        elRootPanel.RemoveClass(\"in-motion\");\n    }\n    XpShopTrack.XpShopUpdate = XpShopUpdate;\n})(XpShopTrack || (XpShopTrack = {}));\n"}