local l_CoreGui_0 = game:GetService("CoreGui");
local l_CorePackages_0 = game:GetService("CorePackages");
local l_Players_0 = game:GetService("Players");
local l_RunService_0 = game:GetService("RunService");
local l_RobloxGui_0 = l_CoreGui_0:WaitForChild("RobloxGui");
local l_StarterGui_0 = game:GetService("StarterGui");
local l_VRService_0 = game:GetService("VRService");
local v7 = require(script.Parent.Parent.Logger)(script.Name);
local v8 = require(l_CorePackages_0.Packages.Roact);
local v9 = require(l_CorePackages_0.Packages.RoactRodux);
local v10 = require(l_CorePackages_0.Packages.t);
local v11 = require(l_CorePackages_0.Packages.Otter);
local l_default_0 = require(l_CorePackages_0.Workspace.Packages.PermissionsProtocol).PermissionsProtocol.default;
local v13 = require(l_RobloxGui_0.Modules.Settings.getCamMicPermissions);
local v14 = require(script.Parent.BubbleChatList);
local v15 = require(script.Parent.ChatBubbleDistant);
local v16 = require(script.Parent.VoiceBubble);
local v17 = require(script.Parent.ControlsBubble);
local v18 = require(l_RobloxGui_0.Modules.VoiceChat.Components.VoiceIndicator);
local v19 = require(script.Parent.Parent.Types);
local v20 = require(script.Parent.Parent.Constants);
local v21 = require(script.Parent.Parent.Helpers.getSettingsForMessage);
local v22 = require(l_RobloxGui_0.Modules.SelfView.selfViewVisibilityUpdatedSignal);
local v23 = require(l_RobloxGui_0.Modules.Chrome.Enabled);
local v24 = require(l_RobloxGui_0.Modules.VoiceChat.Constants);
local l_default_1 = require(l_RobloxGui_0.Modules.VoiceChat.VoiceChatServiceManager).default;
local v26 = require(l_RobloxGui_0.Modules.Flags.GetFFlagEnableVoiceChatSpeakerIcons);
local v27 = require(l_RobloxGui_0.Modules.Flags.GetFFlagMicConnectingToast);
local v28 = require(l_RobloxGui_0.Modules.Flags.GetFFlagEnableVoiceChatManualReconnect);
local v29 = require(l_RobloxGui_0.Modules.Flags.GetFFlagBubbleChatInexistantAdorneeFix);
local v30 = require(l_RobloxGui_0.Modules.Flags.FFlagAvatarChatCoreScriptSupport);
local v31 = require(l_RobloxGui_0.Modules.Flags.FFlagEnableAvatarChatToggleUIUpgradeForLegacyChatService);
local v32 = require(l_RobloxGui_0.Modules.SelfView.publicApi);
local v33 = game:DefineFastInt("BubbleVoiceTimeoutMillis", 1000);
local v34 = game:DefineFastFlag("DebugAllowControlButtonsNoVoiceChat", false);
local v35 = require(l_RobloxGui_0.Modules.Flags.FFlagVRMoveVoiceIndicatorToBottomBar);
local v36 = require(l_RobloxGui_0.Modules.Common.IXPServiceWrapper);
local v37 = game:DefineFastFlag("EasierUnmuting3", false);
local v38 = game:DefineFastFlag("EasierUnmutingBasedOnCamera", false);
local v39 = game:DefineFastFlag("EasierUnmutingHideIfMuted", false);
local v40 = game:DefineFastInt("EasierUnmutingDisplayDistance", 20);
local v41 = game:DefineFastString("EasierUnmutingIXPLayerName", "Voice.UserAgency");
local v42 = game:DefineFastString("EasierUnmutingIXPLayerValue", "VoiceUserAgencyEnabled");
local v43 = game:DefineFastFlag("EasierUnmutingFixNonexistentCharacter", false);
local v44 = require(l_RobloxGui_0.Modules.Flags.getFFlagDoNotPromptCameraPermissionsOnMount);
local v45 = v8.PureComponent:extend("BubbleChatBillboard");
local v46 = {
    dampingRatio = 1,
    frequency = 4
};
local v47 = nil;
if v31 then
    v47 = require(script.Parent.ControlsBubbleV2);
end;
v45.validateProps = v10.strictInterface({
    userId = v10.string,
    onFadeOut = v10.optional(v10.callback),
    voiceEnabled = v10.optional(v10.boolean),
    bubbleChatEnabled = v10.optional(v10.boolean),
    chatSettings = v19.IChatSettings,
    messageIds = v10.optional(v10.array(v10.string)),
    lastMessage = v10.optional(v19.IMessage),
    voiceState = v10.optional(v10.string)
});
getEasierUnmutingDistance = function(v48)
    if v48 then
        if not v43 then
            local l_HumanoidRootPart_0 = l_Players_0.LocalPlayer.Character:FindFirstChild("HumanoidRootPart");
            local v50 = workspace.CurrentCamera and workspace.CurrentCamera.CFrame.Position;
            if not v38 and l_HumanoidRootPart_0 then
                return (v48 - l_HumanoidRootPart_0.CFrame.Position).Magnitude;
            elseif v50 then
                return (v48 - v50).Magnitude;
            else
                return nil;
            end;
        else
            local v51 = (l_Players_0.LocalPlayer and l_Players_0.LocalPlayer.Character) and l_Players_0.LocalPlayer.Character:FindFirstChild("HumanoidRootPart");
            local v52 = (v51 and v51.CFrame) and v51.CFrame.Position;
            local v53 = workspace.CurrentCamera and workspace.CurrentCamera.CFrame.Position;
            if not v38 and v52 then
                return (v48 - v52).Magnitude;
            elseif v53 then
                return (v48 - v53).Magnitude;
            else
                return nil;
            end;
        end;
    else
        return nil;
    end;
end;
v45.init = function(v54)
    v54:setState({
        adornee = nil,
        isInsideRenderDistance = false,
        isInsideMaximizeDistance = false,
        savedChatSettings = v54.props.chatSettings,
        voiceTimedOut = false,
        voiceStateCounter = 0,
        lastVoiceState = nil,
        selfViewOpen = v32.getSelfViewIsOpenAndVisible(),
        selfViewEnabled = if not v30 then nil else l_StarterGui_0:GetCoreGuiEnabled(Enum.CoreGuiType.All) or l_StarterGui_0:GetCoreGuiEnabled(Enum.CoreGuiType.SelfView),
        isInsideEasierUnmutingDistance = if not v37 then nil else false,
        isMuted = (not v37 or not v39) and nil,
        isInEasierUnmutingTreatment = if not v37 then nil else false,
        haveLoggedUserExposure = if not v37 then nil else false
    });
    v54.isMounted = false;
    local v55, v56 = v8.createBinding((Vector3.new()));
    v54.offset = v55;
    v54.updateOffset = v56;
    v54.offsetMotor = v11.createSingleMotor(0);
    v54.offsetMotor:onStep(function(v57)
        v54.updateOffset((Vector3.new(0, v57, 0)));
    end);
    v54.offsetGoal = 0;
    v54.onSelfViewVisibilityUpdated = function()
        v54:setState({
            selfViewOpen = v32.getSelfViewIsOpenAndVisible()
        });
    end;
    v54.onLastBubbleFadeOut = function()
        if not (not v54.props.onFadeOut or v54.isFadingOut) then
            v54.isFadingOut = true;
            v54.props.onFadeOut(v54.props.userId);
        end;
        if not (not v54.state.hasMessage or not v54.isMounted) then
            v54:setState({
                hasMessage = false
            });
        end;
    end;
    if v54.props.voiceEnabled then
        v55 = nil;
        v55 = v54.props.userId == tostring(l_Players_0.LocalPlayer.UserId) and function()
            if v28() and v54.props.voiceState == v20.VOICE_STATE.ERROR then
                l_default_1:RejoinPreviousChannel();
                return ;
            elseif v27() and v54.props.voiceState == v20.VOICE_STATE.CONNECTING then
                l_default_1:ShowVoiceChatLoadingMessage();
                return ;
            else
                l_default_1:ToggleMic("LegacyBubbleChat");
                return ;
            end;
        end or function()
            l_default_1:ToggleMutePlayer(tonumber(v54.props.userId), if not v54:isShowingDueToEasierUnmuting() then v24.VOICE_CONTEXT_TYPE.BUBBLE_CHAT else v24.VOICE_CONTEXT_TYPE.EASIER_UNMUTING);
        end;
        v56 = v54.props.userId;
        local v58 = "MicDark";
        if v26() then
            v58 = v56 ~= tostring(l_Players_0.LocalPlayer.UserId) and "SpeakerDark" or "MicDark";
        end;
        local l_v56_0 = v56 --[[ copy: 4 -> 6 ]];
        do
            local l_v55_0, l_v58_0 = v55, v58;
            v54.renderInsert = function()
                return v8.createElement(v18, {
                    onClicked = l_v55_0,
                    userId = l_v56_0,
                    iconStyle = l_v58_0
                });
            end;
            v54.insertSize = Vector2.new(28, 28);
        end;
    end;
    v54.onCoreGuiChanged = function()
        local l_l_StarterGui_0_CoreGuiEnabled_0 = l_StarterGui_0:GetCoreGuiEnabled(Enum.CoreGuiType.SelfView);
        if v54.state.selfViewOpen ~= l_l_StarterGui_0_CoreGuiEnabled_0 then
            v54:setState({
                selfViewOpen = l_l_StarterGui_0_CoreGuiEnabled_0
            });
        end;
    end;
    v54.selfViewVisibilityUpdatedSignal = v22:connect(function()
        v54:setState({
            selfViewOpen = v32.getSelfViewIsOpenAndVisible()
        });
    end);
    if v37 then
        v55, v56 = pcall(function()
            return v36:GetLayerData(v41);
        end);
        if not ((not v55 or not v56) or not v56[v42]) then
            v54:setState({
                isInEasierUnmutingTreatment = true
            });
        end;
    end;
    if not ((not v37 or not v54.state.isInEasierUnmutingTreatment) or not v39) then
        v54.participantsUpdateConnection = l_default_1.participantsUpdate.Event:Connect(function(v63)
            local v64 = v63[v54.props.userId];
            if v64 then
                if v64.isMuted ~= v54.state.isMuted then
                    v54:setState({
                        isMuted = v64.isMuted
                    });
                end;
                return ;
            else
                return ;
            end;
        end);
    end;
end;
v45.isShowingDueToEasierUnmuting = function(v65)
    local l_v37_0 = v37;
    if l_v37_0 then
        l_v37_0 = v65.state.isInEasierUnmutingTreatment;
        if l_v37_0 then
            l_v37_0 = false;
            if v65.props.voiceState == v20.VOICE_STATE.LOCAL_MUTED then
                l_v37_0 = v65.state.isInsideEasierUnmutingDistance and not (v39 and v65.state.isMuted);
            end;
        end;
    end;
    return l_v37_0;
end;
v45.checkCounterForTimeout = function(v67, v68)
    if (v67.props.userId ~= tostring(l_Players_0.LocalPlayer.UserId) and v67.state.lastVoiceState ~= v20.VOICE_STATE.TALKING) and v67.state.voiceStateCounter ~= v68 then
        local l_voiceStateCounter_0 = v67.state.voiceStateCounter;
        delay(v33 / 1000, function()
            if not (not (v67.state.voiceStateCounter == l_voiceStateCounter_0) or not v67.isMounted) then
                v67:setState({
                    voiceTimedOut = true
                });
            end;
        end);
    end;
end;
v45.checkCounterForTimeoutWithEasierUnmuting = function(v70, v71)
    local v72 = if not v71 then nil else v71.voiceStateCounter;
    if v37 and v70.state.isInEasierUnmutingTreatment then
        local v73 = v70.props.userId ~= tostring(l_Players_0.LocalPlayer.UserId);
        local v74 = v70.state.voiceStateCounter ~= v72;
        local v75 = false;
        if v70.state.lastVoiceState ~= v20.VOICE_STATE.TALKING then
            v75 = v70.state.lastVoiceState ~= v20.VOICE_STATE.LOCAL_MUTED;
        end;
        if not ((not v73 or not v74) or not v75) then
            local l_voiceStateCounter_1 = v70.state.voiceStateCounter;
            delay(v33 / 1000, function()
                if not (not (v70.state.voiceStateCounter == l_voiceStateCounter_1) or not v70.isMounted) then
                    v70:setState({
                        voiceTimedOut = true
                    });
                end;
            end);
        end;
        return ;
    else
        return v70:checkCounterForTimeout(v72);
    end;
end;
v45.didMount = function(v77)
    v77.isMounted = true;
    local v78 = v77.props.lastMessage and v77.props.lastMessage.adornee;
    v77:setState({
        adornee = v78
    });
    local v79 = v77:getVerticalOffset(v78);
    v77.offsetGoal = v79;
    v77.offsetMotor:setGoal(v11.instant(v79));
    if v30 then
        if not v44() then
            v77:getPermissions();
        else
            v77:getMicPermission();
            v77:getCameraPermissionWithoutRequest();
        end;
    end;
    local v80 = nil;
    if not v78 then
        if tonumber(v77.props.userId) then
            v80 = l_Players_0:GetPlayerByUserId(v77.props.userId);
        end;
    else
        v80 = l_Players_0:GetPlayerFromCharacter(v78);
    end;
    if v80 then
        if v80.Character then
            coroutine.wrap(function()
                v77:onCharacterAdded(v80, v80.Character);
            end)();
        end;
        v77.characterConn = v80.CharacterAdded:Connect(function(v81)
            v77:onCharacterAdded(v80, v81);
        end);
    end;
    v77.heartbeatConn = l_RunService_0.Heartbeat:Connect(function()
        local v82 = v77:getAdorneeInstance(v77.state.adornee);
        if not (not workspace.CurrentCamera or not v82) then
            local v83 = not not v82:IsA("Attachment") and v82.WorldPosition or v82.Position;
            local l_Magnitude_0 = (workspace.CurrentCamera.CFrame.Position - v83).Magnitude;
            local v85 = l_Magnitude_0 < v77.state.savedChatSettings.MaxDistance;
            local v86 = l_Magnitude_0 < v77.state.savedChatSettings.MinimizeDistance;
            local v87 = false;
            if not (not v37 or not v77.state.isInEasierUnmutingTreatment) then
                local v88 = getEasierUnmutingDistance(v83);
                if v88 ~= nil then
                    v87 = v88 < v40;
                end;
            end;
            if not (v86 == v77.state.isInsideMaximizeDistance and v85 == v77.state.isInsideRenderDistance) or not (not v37 or not v77.state.isInEasierUnmutingTreatment) and v87 ~= v77.state.isInsideEasierUnmutingDistance then
                v77:setState({
                    isInsideRenderDistance = v85,
                    isInsideMaximizeDistance = v86,
                    isInsideEasierUnmutingDistance = v87
                });
            end;
        end;
        local v89 = v77:getVerticalOffset(v77.state.adornee);
        if v20.BILLBOARD_OFFSET_EPSILON < math.abs(v89 - v77.offsetGoal) then
            v77.offsetGoal = v89;
            v77.offsetMotor:setGoal(v11.spring(v89, v46));
        end;
    end);
    if not v37 or not v77.state.isInEasierUnmutingTreatment then
        v77:checkCounterForTimeout(nil);
    else
        v77:checkCounterForTimeoutWithEasierUnmuting(nil);
    end;
end;
v45.willUnmount = function(v90)
    v7:trace("Unmounting billboards for {}", v90.state.shortId);
    v90.isMounted = false;
    if v90.characterConn then
        v90.characterConn:Disconnect();
        v90.characterConn = nil;
    end;
    if v90.heartbeatConn then
        v90.heartbeatConn:Disconnect();
        v90.heartbeatConn = nil;
    end;
    if v90.humanoidDiedConn then
        v90.humanoidDiedConn:Disconnect();
        v90.humanoidDiedConn = nil;
    end;
    v90.offsetMotor:destroy();
    if v90.selfViewVisibilityUpdatedSignal then
        v90.selfViewVisibilityUpdatedSignal:disconnect();
        v90.selfViewVisibilityUpdatedSignal = nil;
    end;
    if not (((not v37 or not v90.state.isInEasierUnmutingTreatment) or not v39) or not v90.participantsUpdateConnection) then
        v90.participantsUpdateConnection:Disconnect();
        v90.participantsUpdateConnection = nil;
    end;
end;
local function v96(...)
    local l_BindableEvent_0 = Instance.new("BindableEvent");
    local v92 = {
        ...
    };
    local function v94(...)
        for v93 = 1, #v92 do
            v92[v93]:Disconnect();
        end;
        return l_BindableEvent_0:Fire(...);
    end;
    for v95 = 1, #v92 do
        v92[v95] = v92[v95]:Connect(v94);
    end;
    return l_BindableEvent_0.Event:Wait();
end;
local function v102(v97, v98, v99)
    for _, v101 in ipairs(v97:GetChildren()) do
        if not (not (v101.Name == v98) or not v101:IsA(v99)) then
            return v101;
        end;
    end;
end;
v45.onCharacterAdded = function(v103, v104, v105)
    if not v105.Parent then
        v96(v105.AncestryChanged, v104.CharacterAdded);
    end;
    if v104.Character == v105 and v105.Parent then
        local l_Humanoid_0 = v105:FindFirstChildOfClass("Humanoid");
        while not (not v105:IsDescendantOf(game) or l_Humanoid_0) do
            v96(v105.ChildAdded, v105.AncestryChanged, v104.CharacterAdded);
            l_Humanoid_0 = v105:FindFirstChildOfClass("Humanoid");
        end;
        if v104.Character == v105 and v105:IsDescendantOf(game) then
            local v107 = nil;
            v107 = if not v29() then v105:FindFirstChild("HumanoidRootPart") else v105.PrimaryPart;
            while not (not v105:IsDescendantOf(game) or v107) do
                v96(v105.ChildAdded, v105.AncestryChanged, v104.CharacterAdded);
                if not v29() then
                    v107 = v105:FindFirstChild("HumanoidRootPart");
                else
                    v107 = v105.PrimaryPart;
                end;
            end;
            if not (not (not (not v107 or not v105:IsDescendantOf(game)) and v104.Character == v105) or not v103.isMounted) then
                v103:setState({
                    adornee = l_Humanoid_0.Health == 0 and v102(v105, "Head", "BasePart") or v105
                });
                if v103.humanoidDiedConn then
                    v103.humanoidDiedConn:Disconnect();
                    v103.humanoidDiedConn = nil;
                end;
                v103.humanoidDiedConn = l_Humanoid_0.Died:Connect(function()
                    v103:setState({
                        adornee = v102(v105, "Head", "BasePart") or v105
                    });
                end);
            end;
            return ;
        else
            v7:debug("Mismatched or unparented character in onCharacterAdded for {}", v103.state.shortId);
            return ;
        end;
    else
        v7:debug("Mismatched or unparented character in onCharacterAdded for {}", v103.state.shortId);
        return ;
    end;
end;
v45.getVerticalOffset = function(v108, v109)
    if not v109 or not v109:IsA("Model") then
        if not v109 or not v109:IsA("BasePart") then
            return 0;
        else
            return v109.Size.Y / 2;
        end;
    else
        local l_v109_BoundingBox_0, v111 = v109:GetBoundingBox();
        local v112 = v108:getAdorneeInstance(v109);
        if v112 then
            if not v112:IsA("BasePart") then
                return 0;
            else
                return v111.Y / 2 - l_v109_BoundingBox_0:PointToObjectSpace(v112.Position).Y;
            end;
        else
            return v111.Y / 2;
        end;
    end;
end;
v45.getAdorneeInstance = function(v113, v114)
    if v114 then
        if not v114:IsA("Model") then
            if not (not v114:IsA("BasePart") and not v114:IsA("Attachment")) then
                return v114;
            end;
        else
            local l_v114_FirstChild_0 = v114:FindFirstChild(v113.state.savedChatSettings.AdorneeName, true);
            if v29() then
                l_v114_FirstChild_0 = l_v114_FirstChild_0 or v114.PrimaryPart;
            end;
            if not (not (not l_v114_FirstChild_0 or l_v114_FirstChild_0:IsA("BasePart")) and not l_v114_FirstChild_0:IsA("Attachment")) then
                return l_v114_FirstChild_0;
            end;
        end;
        return ;
    else
        return ;
    end;
end;
v45.getPermissions = function(v116)
    return v13(function(v117)
        v116:setState({
            hasCameraPermissions = v117.hasCameraPermissions,
            hasMicPermissions = v117.hasMicPermissions
        });
    end, nil, nil, "BubbleChatBillboard.getPermissions");
end;
v45.getMicPermission = function(v118)
    v13(function(v119)
        v118:setState({
            hasMicPermissions = v119.hasMicPermissions
        });
    end, {
        l_default_0.Permissions.MICROPHONE_ACCESS
    }, nil, "BubbleChatBillboard.getMicPermission");
end;
v45.getCameraPermissionWithoutRequest = function(v120)
    v13(function(v121)
        v120:setState({
            hasCameraPermissions = v121.hasCameraPermissions
        });
    end, {
        l_default_0.Permissions.CAMERA_ACCESS
    }, true);
end;
v45.setCameraPermissionStateFromControl = function(v122, v123)
    v122:setState({
        hasCameraPermissions = v123
    });
end;
v45.getRenderVoiceAndCameraBubble = function(v124)
    if (v124.props.voiceEnabled or v34) or v30 then
        if not (v124.props.userId == tostring(l_Players_0.LocalPlayer.UserId)) then
            if (v124.props.voiceEnabled and not v124.state.voiceTimedOut) and ((not v124.props.bubbleChatEnabled or not v124.props.messageIds) or #v124.props.messageIds == 0) then
                return true;
            else
                return false;
            end;
        elseif not (v35 and l_VRService_0.VREnabled) and not v23() then
            if v124.state.selfViewOpen then
                return false;
            else
                return true;
            end;
        else
            return false;
        end;
    else
        return false;
    end;
end;
v45.shouldRenderCarat = function(v125)
    return v125.props.chatSettings.TailVisible and not v125:getRenderVoiceAndCameraBubble();
end;
v45.render = function(v126)
    local v127 = v126:getAdorneeInstance(v126.state.adornee);
    local v128 = v126.props.userId == tostring(l_Players_0.LocalPlayer.UserId);
    local l_savedChatSettings_0 = v126.state.savedChatSettings;
    if v127 then
        if v126.state.isInsideRenderDistance then
            if not (not (not v37 or not v126.state.isInEasierUnmutingTreatment) and v126.props.voiceState == v20.VOICE_STATE.LOCAL_MUTED) or v126.state.isInsideEasierUnmutingDistance and (not v39 or not v126.state.isMuted) then
                local v130 = {};
                local v131 = nil;
                local v132 = v126.props.voiceEnabled and not v126.state.voiceTimedOut;
                if not (not v30 or not v128) then
                    v132 = v132 and not v126.state.selfViewOpen;
                end;
                if not (not (v35 and l_VRService_0.VREnabled) and not v23() or not v128) then
                    v132 = false;
                end;
                if not v30 then
                    if v132 and ((not v126.props.bubbleChatEnabled or not v126.props.messageIds) or #v126.props.messageIds == 0) then
                        v130.VoiceBubble = v8.createElement(v16, {
                            chatSettings = l_savedChatSettings_0,
                            renderInsert = v126.renderInsert,
                            insertSize = v126.insertSize,
                            isDistant = not v126.state.isInsideMaximizeDistance
                        });
                    end;
                elseif v126:getRenderVoiceAndCameraBubble() then
                    local v134 = {
                        chatSettings = l_savedChatSettings_0,
                        isInsideMaximizeDistance = v126.state.isInsideMaximizeDistance,
                        LayoutOrder = 2,
                        isLocalPlayer = v128,
                        hasCameraPermissions = v126.state.hasCameraPermissions,
                        hasMicPermissions = v126.state.hasMicPermissions,
                        userId = v126.props.userId,
                        voiceEnabled = v126.props.voiceEnabled,
                        setCameraPermissionStateFromControl = function(v133)
                            if v44() then
                                v126:setCameraPermissionStateFromControl(v133);
                            end;
                        end,
                        isShowingDueToEasierUnmuting = v126:isShowingDueToEasierUnmuting()
                    };
                    v130.VoiceAndCameraBubble = not not v31 and v8.createElement(v47, v134) or v8.createElement(v17, v134);
                    v130.listLayout = v8.createElement("UIListLayout", {
                        SortOrder = Enum.SortOrder.LayoutOrder,
                        HorizontalAlignment = Enum.HorizontalAlignment.Center,
                        VerticalAlignment = Enum.VerticalAlignment.Bottom,
                        Padding = UDim.new(0, 8)
                    });
                    v130.padding = v8.createElement("UIPadding", {
                        PaddingBottom = UDim.new(0, 8)
                    });
                end;
                if v126.state.hasMessage then
                    if not v126.state.isInsideMaximizeDistance then
                        v130.DistantBubble = v8.createElement(v15, {
                            fadingOut = not v126.props.messageIds or #v126.props.messageIds == 0,
                            onFadeOut = v126.onLastBubbleFadeOut,
                            chatSettings = l_savedChatSettings_0,
                            renderInsert = v132 and v126.renderInsert,
                            insertSize = v126.insertSize
                        });
                    else
                        v130.BubbleChatList = v8.createElement(v14, {
                            userId = v126.props.userId,
                            isVisible = v126.state.isInsideMaximizeDistance,
                            onLastBubbleFadeOut = v126.onLastBubbleFadeOut,
                            chatSettings = l_savedChatSettings_0,
                            renderFirstInsert = if not v30 and v132 then v126.renderInsert else nil,
                            insertSize = v126.insertSize,
                            showCarat = v126:shouldRenderCarat()
                        });
                    end;
                end;
                v131 = v132;
                if v30 then
                    v131 = v126:getRenderVoiceAndCameraBubble();
                end;
                return v8.createElement("BillboardGui", {
                    Adornee = v127,
                    Active = v131,
                    Size = UDim2.fromOffset(500, 200),
                    SizeOffset = Vector2.new(0, 0.5),
                    StudsOffset = (not not v128 and l_savedChatSettings_0.LocalPlayerStudsOffset or Vector3.new(0, 1, 0.1)) + Vector3.new(0, l_savedChatSettings_0.VerticalStudsOffset, 0),
                    StudsOffsetWorldSpace = v126.offset,
                    ResetOnSpawn = false
                }, v130);
            else
                v7:trace("Unmute toggle not applicable for {}", v126.state.shortId);
                return ;
            end;
        else
            v7:trace("Not in range for {}", v126.state.shortId);
            return ;
        end;
    else
        v7:trace("No adornee for {}", v126.state.shortId);
        return ;
    end;
end;
v45.didUpdate = function(v135, _, v137)
    if not (not (not v135.props.messageIds or #v135.props.messageIds == 0) or v135.state.isInsideRenderDistance) then
        v135.onLastBubbleFadeOut();
    end;
    if v135.props.messageIds and #v135.props.messageIds > 0 then
        v135.isFadingOut = false;
    end;
    if not v37 or not v135.state.isInEasierUnmutingTreatment then
        v135:checkCounterForTimeout(v137.voiceStateCounter);
    else
        v135:checkCounterForTimeoutWithEasierUnmuting(v137);
    end;
    local v138 = v135.props.userId == tostring(l_Players_0.LocalPlayer.UserId);
    if not ((not v37 or not v138) or v135.state.haveLoggedUserExposure) and (not (v135.props.voiceState ~= v20.VOICE_STATE.INACTIVE and v135.props.voiceState ~= v20.VOICE_STATE.TALKING) or v135.props.voiceState == v20.VOICE_STATE.MUTED) then
        v36:LogUserLayerExposure(v41);
        v135:setState({
            haveLoggedUserExposure = true
        });
    end;
end;
v45.getDerivedStateFromProps = function(v139, v140)
    local v141 = "..." .. string.sub(tostring(v139.userId), -4);
    local v142 = (not v140.hasMessage and v139.messageIds) and #v139.messageIds > 0;
    local v143 = nil;
    local v144 = nil;
    local v145 = nil;
    if v140.lastVoiceState ~= v139.voiceState then
        v144 = (v140.voiceStateCounter or 0) + 1;
        v145 = false;
        v143 = v139.voiceState;
    end;
    return {
        hasMessage = v142 or nil,
        savedChatSettings = v139.lastMessage and v139.chatSettings,
        shortId = v141,
        voiceStateCounter = v144,
        voiceTimedOut = v145,
        lastVoiceState = v143
    };
end;
return v9.connect(function(v146, v147)
    local v148 = v146.userMessages[v147.userId];
    local l_v148_0 = v148;
    if l_v148_0 then
        l_v148_0 = false;
        if #v148 >= 1 then
            l_v148_0 = v148[#v148];
        end;
    end;
    local v150 = l_v148_0 and v146.messages[l_v148_0];
    return {
        chatSettings = v21(v146.chatSettings, v150),
        messageIds = v148,
        lastMessage = v150,
        voiceState = v146.voiceState[v147.userId]
    };
end)(v45);


local l_CoreGui_0 = game:GetService("CoreGui");
local l_CorePackages_0 = game:GetService("CorePackages");
local l_Players_0 = game:GetService("Players");
local l_RobloxGui_0 = l_CoreGui_0:WaitForChild("RobloxGui");
local v4 = require(l_CorePackages_0.Packages.Roact);
local v5 = require(l_CorePackages_0.Packages.RoactRodux);
local v6 = require(l_CorePackages_0.Packages.t);
local v7 = require(l_CorePackages_0.Packages.Cryo);
local v8 = require(script.Parent.Parent.Constants);
local v9 = require(script.Parent.Parent.Logger)(script.Name);
local v10 = require(script.Parent.BubbleChatBillboard);
local v11 = require(l_RobloxGui_0.Modules.Flags.GetFFlagBubbleVoiceIndicatorSetting);
local v12 = require(l_RobloxGui_0.Modules.Flags.FFlagAvatarChatCoreScriptSupport);
local v13 = v4.Component:extend("ChatBillboards");
v13.validateProps = v6.strictInterface({
    userMessages = v6.map(v6.string, v6.array(v6.string)),
    bubbleChatEnabled = v6.boolean,
    voiceEnabled = v6.boolean,
    participants = v6.map(v6.string, v6.string)
});
v13.getDerivedStateFromProps = function(v14, v15)
    return {
        userMessages = v7.Dictionary.join(v15.userMessages or {}, v14.userMessages)
    };
end;
v13.init = function(v16)
    v9:debug("Initializing");
    v16:setState({
        userMessages = {}
    });
    v16.onBillboardFadeOut = function(v17)
        v16:setState({
            userMessages = v7.Dictionary.join(v16.state.userMessages, {
                [v17] = v7.None
            })
        });
    end;
end;
v13.render = function(v18)
    if (v18.props.voiceEnabled or v18.props.bubbleChatEnabled) or v12 then
        local v19 = {};
        for v20, _ in pairs(v18.state.userMessages) do
            v19[v20] = false;
        end;
        for v22, v23 in pairs(v18.props.participants) do
            if v23 ~= v8.VOICE_STATE.HIDDEN then
                v19[v22] = true;
            end;
        end;
        if v12 then
            v19[tostring(l_Players_0.LocalPlayer.UserId)] = true;
        end;
        local v24 = {};
        for v25, v26 in pairs(v19) do
            v9:trace("Rendering billboard for ...{}", (string.sub(tostring(v25), -4)));
            v24["BubbleChat_" .. v25] = v4.createElement(v10, {
                userId = v25,
                onFadeOut = v18.onBillboardFadeOut,
                voiceEnabled = v18.props.voiceEnabled and v26,
                bubbleChatEnabled = v18.props.bubbleChatEnabled
            });
        end;
        return v4.createElement("ScreenGui", {
            ResetOnSpawn = false
        }, v24);
    else
        return ;
    end;
end;
return v5.connect(function(v27)
    local l_voiceEnabled_0 = v27.components.voiceEnabled;
    if v11() then
        l_voiceEnabled_0 = v27.components.voiceEnabled and v27.chatSettings.Voice.ShowIndicator;
    end;
    return {
        userMessages = v27.userMessages,
        voiceEnabled = l_voiceEnabled_0,
        bubbleChatEnabled = v27.components.bubbleChatEnabled,
        participants = v27.voiceState
    };
end)(v13);


local l_CorePackages_0 = game:GetService("CorePackages");
local v1 = require(l_CorePackages_0.Packages.Cryo);
local v2 = require(l_CorePackages_0.Packages.Roact);
local v3 = require(l_CorePackages_0.Packages.RoactRodux);
local v4 = require(l_CorePackages_0.Packages.t);
local v5 = require(script.Parent.ChatBubble);
local v6 = require(script.Parent.Parent.Types);
local _ = game:GetService("CoreGui"):WaitForChild("RobloxGui");
local v8 = v2.Component:extend("BubbleChatList");
v8.validateProps = v4.strictInterface({
    userId = v4.string,
    isVisible = v4.optional(v4.boolean),
    theme = v4.optional(v4.string),
    onLastBubbleFadeOut = v4.optional(v4.callback),
    chatSettings = v6.IChatSettings,
    renderFirstInsert = v4.optional(v4.callback),
    insertSize = v4.optional(v4.Vector2),
    messageIds = v4.array(v4.string)
});
v8.defaultProps = {
    theme = "Light"
};
v8.getDerivedStateFromProps = function(v9, v10)
    local v11 = {};
    if v10.bubbles then
        for _, v13 in ipairs(v10.bubbles) do
            if not v1.List.find(v9.messageIds, v13.messageId) then
                table.insert(v11, {
                    messageId = v13.messageId,
                    fadingOut = true
                });
            end;
        end;
    end;
    for _, v15 in ipairs(v9.messageIds) do
        table.insert(v11, {
            messageId = v15,
            fadingOut = false
        });
    end;
    return {
        bubbles = v11
    };
end;
v8.init = function(v16, v17)
    if not (not (not v17.messageIds or #v17.messageIds == 0) or not v17.onLastBubbleFadeOut) then
        v17.onLastBubbleFadeOut();
    end;
    v16.onBubbleFadeOut = function(v18)
        local v20 = v1.List.filter(v16.state.bubbles, function(v19)
            return v19.messageId ~= v18;
        end);
        if not (#v20 == 0) or not v16.props.onLastBubbleFadeOut then
            v16:setState({
                bubbles = v20
            });
            return ;
        else
            v16.props.onLastBubbleFadeOut();
            return ;
        end;
    end;
end;
v8.render = function(v21)
    local v22 = {};
    local l_chatSettings_0 = v21.props.chatSettings;
    v22.Layout = v2.createElement("UIListLayout", {
        SortOrder = Enum.SortOrder.LayoutOrder,
        HorizontalAlignment = Enum.HorizontalAlignment.Center,
        VerticalAlignment = Enum.VerticalAlignment.Bottom,
        Padding = UDim.new(0, l_chatSettings_0.BubblesSpacing)
    });
    v22.CaretPadding = (l_chatSettings_0.TailVisible and v21.props.showCarat) and v2.createElement("UIPadding", {
        PaddingBottom = UDim.new(0, 8)
    });
    for v24, v25 in ipairs(v21.state.bubbles) do
        local v26 = v24 == #v21.state.bubbles;
        v22["Bubble" .. v25.messageId] = v2.createElement(v5, {
            messageId = v25.messageId,
            isMostRecent = v26,
            theme = v21.props.theme,
            fadingOut = v25.fadingOut,
            onFadeOut = v21.onBubbleFadeOut,
            chatSettings = l_chatSettings_0,
            renderInsert = not not v26 and v21.props.renderFirstInsert or nil,
            insertSize = v21.props.insertSize,
            showCarat = v21.props.showCarat
        });
    end;
    return v2.createElement("Frame", {
        Visible = v21.props.isVisible,
        Size = UDim2.fromScale(1, 1),
        BackgroundTransparency = 1
    }, v22);
end;
return v3.connect(function(v27, v28)
    return {
        messageIds = v27.userMessages[v28.userId] or {}
    };
end)(v8);


local l_CorePackages_0 = game:GetService("CorePackages");
local l_CoreGui_0 = game:GetService("CoreGui");
local v2 = require(l_CorePackages_0.Packages.Roact);
local v3 = require(l_CorePackages_0.Packages.t);
local v4 = require(l_CorePackages_0.UIBlox);
local v5 = require(l_CorePackages_0.Packages.Cryo);
local l_ImageSetButton_0 = v4.Core.ImageSet.ImageSetButton;
local l_Colors_0 = v4.App.Style.Colors;
local l_Flint_0 = l_Colors_0.Flint;
local l_Graphite_0 = l_Colors_0.Graphite;
local l_White_0 = l_Colors_0.White;
local v11 = Color3.fromRGB(250, 250, 250);
local v12 = require(l_CoreGui_0.RobloxGui.Modules.Flags.GetFFlagForceChatBubbleColorCS);
local v13 = v2.PureComponent:extend("ControlBubble");
v13.validateProps = v3.strictInterface({
    LayoutOrder = v3.optional(v3.number),
    icon = v3.any,
    onActivated = v3.callback,
    enabled = v3.boolean,
    isImageSet = v3.boolean
});
v13.render = function(v14)
    local l_chatSettings_0 = v14.props.chatSettings;
    local l_BackgroundImage_0 = l_chatSettings_0.BackgroundImage;
    local l_BackgroundGradient_0 = l_chatSettings_0.BackgroundGradient;
    return v2.createElement("ImageButton", {
        AnchorPoint = Vector2.new(0.5, 1),
        Size = UDim2.new(0, 44, 1, 0),
        LayoutOrder = v14.props.LayoutOrder,
        BorderSizePixel = 0,
        Transparency = 1,
        ZIndex = 2,
        [v2.Event.Activated] = v14.props.onActivated
    }, {
        UICorner = l_chatSettings_0.CornerEnabled and v2.createElement("UICorner", {
            CornerRadius = l_chatSettings_0.CornerRadius
        }),
        Contents = v2.createElement("ImageLabel", v5.Dictionary.join(l_BackgroundImage_0, {
            Size = UDim2.fromScale(1, 1),
            BackgroundColor3 = if not (l_chatSettings_0.BackgroundColor3 ~= v11) or v12() then l_Graphite_0 else l_chatSettings_0.BackgroundColor3,
            BorderSizePixel = 0
        }), {
            UICorner = l_chatSettings_0.CornerEnabled and v2.createElement("UICorner", {
                CornerRadius = l_chatSettings_0.CornerRadius
            }),
            Padding = v2.createElement("UIPadding", {
                PaddingTop = UDim.new(0, l_chatSettings_0.Padding),
                PaddingRight = UDim.new(0, l_chatSettings_0.Padding),
                PaddingBottom = UDim.new(0, l_chatSettings_0.Padding),
                PaddingLeft = UDim.new(0, l_chatSettings_0.Padding)
            }),
            Icon = v2.createElement(not v14.props.isImageSet and "ImageButton" or l_ImageSetButton_0, {
                AnchorPoint = Vector2.new(0.5, 0.5),
                Position = UDim2.fromScale(0.5, 0.5),
                Size = not v14.props.isImageSet and v14.props.iconSize or UDim2.fromOffset(28, 28),
                BackgroundTransparency = 1,
                ImageTransparency = not v14.props.enabled and 0.5 or 0,
                ImageColor3 = if not v14.props.enabled then l_Flint_0 else l_White_0,
                BorderSizePixel = 0,
                Image = v14.props.icon
            }),
            Gradient = l_BackgroundGradient_0.Enabled and v2.createElement("UIGradient", l_BackgroundGradient_0)
        })
    });
end;
return v13;


local l_CorePackages_0 = game:GetService("CorePackages");
local l_CoreGui_0 = game:GetService("CoreGui");
local l_RunService_0 = game:GetService("RunService");
local l_TweenService_0 = game:GetService("TweenService");
local v4 = require(l_CorePackages_0.Packages.React);
local v5 = require(l_CorePackages_0.UIBlox);
local l_Images_0 = v5.App.ImageSet.Images;
local l_status_0, l_result_0 = pcall(function()
    return v5.Core.ImageSet.ImageSetLabel;
end);
local v9 = not not l_status_0 and l_result_0 or v5.Core.ImageSet.ImageSetLabel;
local v10 = require(script.Parent.Parent.Helpers.getVoiceIndicatorAssetName);
local l_Modules_0 = l_CoreGui_0.RobloxGui.Modules;
local v12 = require(l_Modules_0.Flags.getFFlagEnableShimmeringIconLegacyChatService);
local v13 = require(l_Modules_0.Flags.getFFlagLegacyConnectingMicStateFix);
local v14 = 0.6;
local v15 = Vector2.new(-1, 0);
if game:DefineFastFlag("EnableDarkerShimmerTransparencyLegacyChatService", false) then
    v14 = 0.4;
end;
local function v17(v16)
    return (l_TweenService_0:Create(v16:getValue(), TweenInfo.new(1, Enum.EasingStyle.Circular, Enum.EasingDirection.Out, -1), {
        Offset = Vector2.new(1, 0)
    }));
end;
return function(v18)
    local v19, v20 = v4.useState(0);
    local v21 = v4.useRef(nil);
    local v22 = v4.useRef(nil);
    if v12() then
        v21 = v4.useRef(nil);
        v22 = v4.useRef(nil);
        v4.useEffect(function()
            if v21.current then
                local l_FirstChildWhichIsA_0 = v21.current:FindFirstChildWhichIsA("UIGradient", true);
                if l_FirstChildWhichIsA_0 then
                    v22.current = l_FirstChildWhichIsA_0;
                end;
            end;
        end, {
            v21
        });
    end;
    v4.useEffect(function()
        if not (v18.voiceState and v18.voiceState == "Talking") or not v18.renderStepName then
            if not (not (not v12() or not v18.voiceState) and v18.voiceState == "Connecting") or not v22 then
                return function()
                    if v18.renderStepName then
                        l_RunService_0:UnbindFromRenderStep(v18.renderStepName);
                    end;
                end;
            else
                local v24 = v17(v22);
                v24:Play();
                return function()
                    v24:Cancel();
                    if not ((not v13() or not v22) or not v22.current) then
                        v22.current.Offset = v15;
                    end;
                end;
            end;
        else
            l_RunService_0:BindToRenderStep(v18.renderStepName, 1, function()
                v20(math.random());
            end);
            return function()
                l_RunService_0:UnbindFromRenderStep(v18.renderStepName);
            end;
        end;
    end, {
        v18.voiceState
    });
    return v4.createElement("ImageButton", {
        AnchorPoint = Vector2.new(0.5, 1),
        Size = v18.controlBubbleSize,
        LayoutOrder = v18.LayoutOrder,
        BorderSizePixel = 0,
        Transparency = 1,
        ZIndex = 2,
        [v4.Event.Activated] = v18.onActivated,
        BackgroundTransparency = 1,
        ref = v12() and v21
    }, {
        UICorner = v4.createElement("UICorner", {
            CornerRadius = UDim.new(0, v18.cornerRadiusOffset)
        }),
        Contents = v4.createElement("Frame", {
            Size = UDim2.fromScale(1, 1),
            BorderSizePixel = 0,
            BackgroundTransparency = 1
        }, {
            UICorner = v4.createElement("UICorner", {
                CornerRadius = UDim.new(0, v18.cornerRadiusOffset)
            }),
            Icon = v4.createElement(v9, {
                AnchorPoint = Vector2.new(0.5, 0.5),
                Position = UDim2.fromScale(0.5, 0.5),
                Size = v18.iconSize,
                BackgroundTransparency = 1,
                ImageTransparency = v18.iconTransparency,
                BorderSizePixel = 0,
                Image = l_Images_0[v18.iconAssetName or v10(v18.voiceState, v19, v18.iconStyle)]
            }, {
                ShimmerGradient = v12() and v4.createElement("UIGradient", {
                    Color = ColorSequence.new({
                        ColorSequenceKeypoint.new(0, Color3.new(v14, v14, v14)),
                        ColorSequenceKeypoint.new(0.5, Color3.new(0.8, 0.8, 0.8)),
                        ColorSequenceKeypoint.new(1, Color3.new(v14, v14, v14))
                    }),
                    Enabled = v18.voiceState == "Connecting",
                    Rotation = -45,
                    Offset = v15
                })
            })
        })
    });
end;


local l_CorePackages_0 = game:GetService("CorePackages");
local l_CoreGui_0 = game:GetService("CoreGui");
local l_FaceAnimatorService_0 = game:GetService("FaceAnimatorService");
local l_HttpService_0 = game:GetService("HttpService");
local l_RunService_0 = game:GetService("RunService");
local v5 = require(l_CorePackages_0.Packages.Roact);
local v6 = require(l_CorePackages_0.Packages.RoactRodux);
local v7 = require(l_CorePackages_0.Packages.t);
local v8 = require(l_CorePackages_0.UIBlox);
local l_ExternalEventConnection_0 = v8.Utility.ExternalEventConnection;
local l_Images_0 = v8.App.ImageSet.Images;
local l_Modules_0 = l_CoreGui_0.RobloxGui.Modules;
local v12 = require(script.Parent.ControlBubble);
local l_default_0 = require(l_Modules_0.VoiceChat.VoiceChatServiceManager).default;
local v14 = require(l_Modules_0.InGameChat.BubbleChat.Constants);
local v15 = require(l_Modules_0.SelfView.publicApi);
local v16 = require(l_Modules_0.SelfView.toggleSelfViewSignal);
local v17 = require(l_Modules_0.SelfView.Analytics).new();
local v18 = require(l_Modules_0.Flags.GetFFlagLocalMutedNilFix);
local v19 = require(l_Modules_0.Flags.GetFFlagMicStatesFix);
local v20 = require(l_Modules_0.VoiceChat.Constants);
local v21 = l_Images_0["icons/controls/video"];
local v22 = l_Images_0["icons/controls/videoOff"];
local v23 = l_Images_0["icons/controls/microphoneMute"];
local v24 = v5.PureComponent:extend("ControlsBubble");
v24.validateProps = v7.strictInterface({
    chatSettings = v7.table,
    isInsideMaximizeDistance = v7.boolean,
    isLocalPlayer = v7.boolean,
    LayoutOrder = v7.optional(v7.number),
    hasCameraPermissions = v7.boolean,
    hasMicPermissions = v7.boolean,
    isShowingDueToEasierUnmuting = v7.optional(v7.boolean)
});
v24.defaultProps = {
    LayoutOrder = 1
};
v24.init = function(v25)
    v25:setState({
        microphoneEnabled = if not v18 then not l_default_0.localMuted else l_default_0.localMuted == false,
        cameraEnabled = (not not l_FaceAnimatorService_0 and l_FaceAnimatorService_0:IsStarted()) and l_FaceAnimatorService_0.VideoAnimationEnabled
    });
    v25.toggleMic = function()
        if not v25.props.isLocalPlayer then
            l_default_0:ToggleMutePlayer(tonumber(v25.props.userId), if not v25.props.isShowingDueToEasierUnmuting then v20.VOICE_CONTEXT_TYPE.BUBBLE_CHAT else v20.VOICE_CONTEXT_TYPE.EASIER_UNMUTING);
            return ;
        elseif v25.props.hasMicPermissions then
            if v25.props.voiceState == v14.VOICE_STATE.ERROR then
                l_default_0:RejoinPreviousChannel();
                return ;
            elseif v25.props.voiceState == v14.VOICE_STATE.CONNECTING then
                l_default_0:ShowVoiceChatLoadingMessage();
                return ;
            else
                v17:setLastCtx("bubbleChatToggle");
                l_default_0:ToggleMic("LegacyBubbleChatToggle");
                v25:setState({
                    microphoneEnabled = not l_default_0.localMuted
                });
                return ;
            end;
        else
            return ;
        end;
    end;
    v25.updateVideo = function()
        v25:setState({
            cameraEnabled = l_FaceAnimatorService_0.VideoAnimationEnabled
        });
    end;
    v25.toggleVideo = function()
        if v25.props.hasCameraPermissions then
            if l_FaceAnimatorService_0 and l_FaceAnimatorService_0:IsStarted() then
                l_FaceAnimatorService_0.VideoAnimationEnabled = not l_FaceAnimatorService_0.VideoAnimationEnabled;
                v17:setLastCtx("bubbleChatToggle");
                v25:setState({
                    cameraEnabled = l_FaceAnimatorService_0.VideoAnimationEnabled
                });
                local v26 = v15.getSelfViewIsOpenAndVisible();
                if not (not l_FaceAnimatorService_0.VideoAnimationEnabled or v26) then
                    v16:fire();
                end;
                return ;
            else
                return ;
            end;
        else
            return ;
        end;
    end;
    v25.muteChangedEvent = function(v27)
        v25:setState({
            microphoneEnabled = not v27
        });
    end;
    local v28, v29 = v5.createBinding(0);
    v25.level = v28;
    v25.updateLevel = v29;
    v28, v29 = v5.createBinding(v25.props.voiceState);
    v25.voiceState = v28;
    v25.updateVoiceState = v29;
    v25.renderStepName = l_HttpService_0:GenerateGUID();
    l_RunService_0:BindToRenderStep(v25.renderStepName, Enum.RenderPriority.First.Value + 1, function()
        v25.updateLevel(math.random());
    end);
    v25.levelIcon = v5.joinBindings({
        v25.voiceState,
        v25.level
    }):map(function(v30)
        local v31 = v30[1];
        local v32 = v30[2];
        local v33 = if not v25.props.isLocalPlayer then not game:GetEngineFeature("VoiceChatNewSpeakerIcons") and "SpeakerDark" or "SpeakerNew" else "New";
        if not (v31 ~= v14.VOICE_STATE.MUTED) or v31 == v14.VOICE_STATE.LOCAL_MUTED then
            if not v25.props.isLocalPlayer then
                return l_default_0:GetIcon("Muted", v33);
            else
                return "";
            end;
        elseif v31 == v14.VOICE_STATE.CONNECTING then
            return l_default_0:GetIcon("Connecting", v33);
        elseif v31 == v14.VOICE_STATE.INACTIVE then
            return l_default_0:GetIcon("Unmuted0", v33);
        elseif v31 == v14.VOICE_STATE.TALKING then
            return l_default_0:GetIcon("Unmuted" .. tostring(20 * math.floor(0.5 + 5 * v32)), v33);
        else
            return l_default_0:GetIcon("Error", v33);
        end;
    end);
end;
v24.shouldShowCameraIndicator = function(v34)
    if not v34.props.isLocalPlayer or not v34.props.hasCameraPermissions then
        return false;
    else
        return true;
    end;
end;
v24.getMicIcon = function(v35)
    if v35.props.isLocalPlayer then
        if not v19() then
            local v36 = not (v35.state.microphoneEnabled and v35.props.hasMicPermissions);
            local v37 = true;
            if v35.props.voiceState ~= v14.VOICE_STATE.MUTED then
                v37 = v35.props.voiceState == v14.VOICE_STATE.LOCAL_MUTED;
            end;
            if not (not v36 and not v37) then
                return v23, true;
            end;
        else
            local v38 = not v35.props.hasMicPermissions;
            local v39 = true;
            if v35.props.voiceState ~= v14.VOICE_STATE.MUTED then
                v39 = v35.props.voiceState == v14.VOICE_STATE.LOCAL_MUTED;
            end;
            if not (not v38 and not v39) then
                return v23, true;
            end;
        end;
        return v35.levelIcon, false;
    else
        return v35.levelIcon, false;
    end;
end;
v24.didUpdate = function(v40, v41, _)
    if v40.props.voiceState ~= v41.voiceState then
        v40.updateVoiceState(v40.props.voiceState);
    end;
end;
v24.didMount = function(v43)
    v43.updateVoiceState(v43.props.voiceState);
end;
v24.render = function(v44)
    local v45 = v44.props.hasMicPermissions and v44.props.voiceEnabled;
    local v46 = v44:shouldShowCameraIndicator();
    local v47, v48 = v44:getMicIcon();
    local l_chatSettings_0 = v44.props.chatSettings;
    return v5.createElement("Frame", {
        AnchorPoint = Vector2.new(0.5, 1),
        AutomaticSize = Enum.AutomaticSize.X,
        Position = UDim2.new(0.5, 0, 1, -8),
        Size = UDim2.new(0, 0, 0, 25),
        LayoutOrder = v44.props.LayoutOrder,
        BackgroundTransparency = 0,
        BorderSizePixel = 0,
        BackgroundColor3 = Color3.fromRGB(255, 255, 255),
        Visible = v45 or v46
    }, {
        Scale = v5.createElement("UIScale", {
            Scale = v44.props.isInsideMaximizeDistance and 1 or 0.75
        }),
        UICorner = v5.createElement("UICorner", {
            CornerRadius = UDim.new(0, 8)
        }),
        Container = v5.createElement("Frame", {
            Size = UDim2.fromScale(1, 1),
            BackgroundTransparency = 0,
            BackgroundColor3 = Color3.fromRGB(255, 255, 255)
        }, {
            UICorner = l_chatSettings_0.CornerEnabled and v5.createElement("UICorner", {
                CornerRadius = UDim.new(0, 8)
            }),
            UIListLayout = v5.createElement("UIListLayout", {
                FillDirection = Enum.FillDirection.Horizontal,
                SortOrder = Enum.SortOrder.LayoutOrder,
                HorizontalAlignment = Enum.HorizontalAlignment.Center,
                Padding = UDim.new(0, 2)
            }),
            UIPadding = v5.createElement("UIPadding", {
                PaddingTop = UDim.new(0, 2),
                PaddingRight = UDim.new(0, 2),
                PaddingBottom = UDim.new(0, 2),
                PaddingLeft = UDim.new(0, 2)
            }),
            MicrophoneBubble = v45 and v5.createElement(v12, {
                LayoutOrder = 1,
                icon = v47,
                onActivated = v44.toggleMic,
                enabled = v44.props.hasMicPermissions,
                isImageSet = v48,
                chatSettings = l_chatSettings_0,
                iconSize = if not v44.props.isLocalPlayer then UDim2.fromOffset(23, 21) else UDim2.fromOffset(14, 18)
            }),
            CameraBubble = v46 and v5.createElement(v12, {
                LayoutOrder = 2,
                icon = if not not v44.state.cameraEnabled and v44.props.hasCameraPermissions then v21 else v22,
                onActivated = v44.toggleVideo,
                enabled = v44.props.hasCameraPermissions,
                isImageSet = true,
                imageSetIcon = if not not v44.state.cameraEnabled and v44.props.hasCameraPermissions then v21 else v22,
                chatSettings = l_chatSettings_0
            })
        }),
        Carat = l_chatSettings_0.TailVisible and v5.createElement("ImageLabel", {
            LayoutOrder = 3,
            AnchorPoint = Vector2.new(0.5, 0),
            BackgroundTransparency = 1,
            Position = UDim2.new(0.5, 0, 1, -1),
            Size = UDim2.fromOffset(12, 8),
            Image = "rbxasset://textures/ui/InGameChat/Caret.png",
            BackgroundColor3 = Color3.fromRGB(255, 255, 255)
        }),
        MuteChangedEvent = v5.createElement(l_ExternalEventConnection_0, {
            event = l_default_0.muteChanged.Event,
            callback = v44.muteChangedEvent
        }),
        VideoEnabledChanged = not not l_FaceAnimatorService_0 and v5.createElement(l_ExternalEventConnection_0, {
            event = l_FaceAnimatorService_0:GetPropertyChangedSignal("VideoAnimationEnabled"),
            callback = v44.updateVideo
        }) or nil
    });
end;
v24.willUnmount = function(v50)
    local l_status_0, _ = pcall(function()
        l_RunService_0:UnbindFromRenderStep(v50.renderStepName);
    end);
    task.spawn(function()
        assert(l_status_0 == true, "Tried to UnbindFromRenderStep with a self.renderStepName that was never bound");
    end);
end;
return v6.connect(function(v53, v54)
    return {
        voiceState = v53.voiceState[v54.userId]
    };
end)(v24);


local l_CorePackages_0 = game:GetService("CorePackages");
local l_CoreGui_0 = game:GetService("CoreGui");
local l_FaceAnimatorService_0 = game:GetService("FaceAnimatorService");
local l_HttpService_0 = game:GetService("HttpService");
local v4 = require(l_CorePackages_0.Packages.Roact);
local v5 = require(l_CorePackages_0.Packages.RoactRodux);
local v6 = require(l_CorePackages_0.Packages.t);
local v7 = require(l_CorePackages_0.UIBlox);
local l_default_0 = require(l_CorePackages_0.Workspace.Packages.PermissionsProtocol).PermissionsProtocol.default;
local l_ExternalEventConnection_0 = v7.Utility.ExternalEventConnection;
local l_RobloxGui_0 = l_CoreGui_0:WaitForChild("RobloxGui");
local l_Modules_0 = l_CoreGui_0.RobloxGui.Modules;
local v12 = require(script.Parent.ControlBubbleV2);
local l_default_1 = require(l_Modules_0.VoiceChat.VoiceChatServiceManager).default;
local v14 = require(l_Modules_0.InGameChat.BubbleChat.Constants);
local v15 = require(l_Modules_0.SelfView.publicApi);
local v16 = require(l_Modules_0.SelfView.toggleSelfViewSignal);
local v17 = require(l_Modules_0.SelfView.Analytics).new();
local v18 = require(l_Modules_0.Flags.GetFFlagLocalMutedNilFix);
local v19 = require(l_Modules_0.VoiceChat.Constants);
local v20 = require(l_RobloxGui_0.Modules.Settings.getCamMicPermissions);
local v21 = require(l_RobloxGui_0.Modules.Settings.isCamEnabledForUserAndPlace);
local v22 = require(l_RobloxGui_0.Modules.InGameChat.BubbleChat.Helpers.displayCameraDeniedToast);
local v23 = require(l_RobloxGui_0.Modules.Settings.isCameraOnlyUser);
local v24 = require(l_RobloxGui_0.Modules.Flags.getFFlagDoNotPromptCameraPermissionsOnMount);
local v25 = require(l_RobloxGui_0.Modules.Flags.getFFlagEnableAlwaysAvailableCamera);
local v26 = require(l_RobloxGui_0.Modules.Flags.getFFlagLegacyConnectingMicStateFix);
local l_AVATAR_CHAT_UI_SETTINGS_0 = v14.AVATAR_CHAT_UI_SETTINGS;
local v28 = v4.PureComponent:extend("ControlsBubble");
v28.validateProps = v6.strictInterface({
    chatSettings = v6.table,
    isInsideMaximizeDistance = v6.boolean,
    isLocalPlayer = v6.boolean,
    LayoutOrder = v6.optional(v6.number),
    hasCameraPermissions = v6.boolean,
    hasMicPermissions = v6.boolean,
    isShowingDueToEasierUnmuting = v6.optional(v6.boolean)
});
v28.defaultProps = {
    LayoutOrder = 1
};
v28.init = function(v29)
    v29:setState({
        microphoneEnabled = if not v18 then not l_default_1.localMuted else l_default_1.localMuted == false,
        cameraEnabled = (not not l_FaceAnimatorService_0 and l_FaceAnimatorService_0:IsStarted()) and l_FaceAnimatorService_0.VideoAnimationEnabled
    });
    v29.toggleMic = function()
        if not v29.props.isLocalPlayer then
            l_default_1:ToggleMutePlayer(tonumber(v29.props.userId), if not v29.props.isShowingDueToEasierUnmuting then v19.VOICE_CONTEXT_TYPE.BUBBLE_CHAT else v19.VOICE_CONTEXT_TYPE.EASIER_UNMUTING);
            return ;
        elseif v29.props.hasMicPermissions then
            if v29.props.voiceState == v14.VOICE_STATE.ERROR then
                l_default_1:RejoinPreviousChannel();
                return ;
            elseif v29.props.voiceState == v14.VOICE_STATE.CONNECTING then
                l_default_1:ShowVoiceChatLoadingMessage();
                return ;
            else
                v17:setLastCtx("bubbleChatToggle");
                l_default_1:ToggleMic("LegacyBubbleChatToggle");
                v29:setState({
                    microphoneEnabled = not l_default_1.localMuted
                });
                return ;
            end;
        else
            return ;
        end;
    end;
    v29.updateVideo = function()
        v29:setState({
            cameraEnabled = l_FaceAnimatorService_0.VideoAnimationEnabled
        });
    end;
    v29.onVideoButtonPressed = function()
        if not v24() or v29.props.hasCameraPermissions then
            v29:toggleVideo();
            return ;
        else
            v20(function(v30)
                if not v30.hasCameraPermissions then
                    v22();
                    return ;
                else
                    v29:toggleVideo();
                    v29.props.setCameraPermissionStateFromControl(v30.hasCameraPermissions);
                    return ;
                end;
            end, {
                l_default_0.Permissions.CAMERA_ACCESS
            });
            return ;
        end;
    end;
    v29.toggleVideo = function()
        if v24() or v29.props.hasCameraPermissions then
            if l_FaceAnimatorService_0 and l_FaceAnimatorService_0:IsStarted() then
                l_FaceAnimatorService_0.VideoAnimationEnabled = not l_FaceAnimatorService_0.VideoAnimationEnabled;
                v17:setLastCtx("bubbleChatToggle");
                v29:setState({
                    cameraEnabled = l_FaceAnimatorService_0.VideoAnimationEnabled
                });
                local v31 = v15.getSelfViewIsOpenAndVisible();
                if not (not l_FaceAnimatorService_0.VideoAnimationEnabled or v31) then
                    v16:fire();
                end;
                return ;
            else
                return ;
            end;
        else
            return ;
        end;
    end;
    v29.muteChangedEvent = function(v32)
        v29:setState({
            microphoneEnabled = not v32
        });
    end;
end;
v28.shouldShowCameraIndicator = function(v33)
    if not v33.props.isLocalPlayer or not v33:getCameraButtonVisibleAtMount() then
        return false;
    else
        return true;
    end;
end;
v28.shouldShowMicOffIndicator = function(v34)
    if v34.props.isLocalPlayer then
        local v35 = nil;
        v35 = if not v26() then not (v34.state.microphoneEnabled and v34.props.hasMicPermissions) else not v34.props.hasMicPermissions;
        local v36 = true;
        if v34.props.voiceState ~= v14.VOICE_STATE.MUTED then
            v36 = v34.props.voiceState == v14.VOICE_STATE.LOCAL_MUTED;
        end;
        if not (not v35 and not v36) then
            return true;
        end;
    end;
    return false;
end;
v28.getCameraButtonVisibleAtMount = function(_)
    if not v25() or not v23() then
        return v21();
    else
        return false;
    end;
end;
v28.render = function(v38)
    local v39 = v38.props.hasMicPermissions and v38.props.voiceEnabled;
    local v40 = v38:shouldShowCameraIndicator();
    local v41 = v38:shouldShowMicOffIndicator();
    local v42 = v40 and v39;
    local l_chatSettings_0 = v38.props.chatSettings;
    local v44 = not not v42 and l_AVATAR_CHAT_UI_SETTINGS_0.DoubleIconCornerRadiusOffset or l_AVATAR_CHAT_UI_SETTINGS_0.SingleIconCornerRadiusOffset;
    local v45 = not not v42 and l_AVATAR_CHAT_UI_SETTINGS_0.DoubleIconButtonSize or l_AVATAR_CHAT_UI_SETTINGS_0.SingleIconButtonSize;
    local v46 = not v38.props.isLocalPlayer and "speaker" or "microphone";
    local v47 = (not not v38.state.cameraEnabled and v38.props.hasCameraPermissions) and "icons/controls/voice/video_on_light" or "icons/controls/voice/video_off_light";
    if v24() then
        v47 = (not not v38.state.cameraEnabled and v38:getCameraButtonVisibleAtMount()) and "icons/controls/voice/video_on_light" or "icons/controls/voice/video_off_light";
    end;
    return v4.createElement("Frame", {
        AnchorPoint = Vector2.new(0.5, 1),
        Position = UDim2.new(0.5, 0, 1, -8),
        AutomaticSize = Enum.AutomaticSize.X,
        Size = UDim2.fromOffset(0, l_AVATAR_CHAT_UI_SETTINGS_0.FrameHeight),
        LayoutOrder = v38.props.LayoutOrder,
        BackgroundTransparency = l_chatSettings_0.BackgroundTransparency,
        BackgroundColor3 = l_chatSettings_0.BackgroundColor3,
        Visible = v39 or v40
    }, {
        Scale = v4.createElement("UIScale", {
            Scale = v38.props.isInsideMaximizeDistance and 1 or 0.75
        }),
        UICorner = v4.createElement("UICorner", {
            CornerRadius = UDim.new(0, v44)
        }),
        Container = v4.createElement("Frame", {
            Size = UDim2.fromScale(1, 1),
            BackgroundTransparency = 1
        }, {
            UICorner = l_chatSettings_0.CornerEnabled and v4.createElement("UICorner", {
                CornerRadius = UDim.new(0, v44)
            }),
            UIListLayout = v4.createElement("UIListLayout", {
                FillDirection = Enum.FillDirection.Horizontal,
                SortOrder = Enum.SortOrder.LayoutOrder,
                HorizontalAlignment = Enum.HorizontalAlignment.Center,
                VerticalAlignment = Enum.VerticalAlignment.Center
            }),
            MicrophoneBubble = v39 and v4.createElement(v12, {
                LayoutOrder = 1,
                onActivated = v38.toggleMic,
                chatSettings = l_chatSettings_0,
                controlBubbleSize = v45,
                cornerRadiusOffset = v44,
                iconAssetName = if not v41 then nil else "icons/controls/voice/microphone_off_light",
                iconSize = l_AVATAR_CHAT_UI_SETTINGS_0.IconSize,
                iconTransparency = l_AVATAR_CHAT_UI_SETTINGS_0.IconTransparency,
                voiceState = v38.props.voiceState,
                renderStepName = l_HttpService_0:GenerateGUID(),
                iconStyle = v46
            }),
            Divider = (v39 and v40) and v4.createElement("Frame", {
                Size = l_AVATAR_CHAT_UI_SETTINGS_0.DividerSize,
                AnchorPoint = Vector2.new(0.5, 1),
                BorderSizePixel = 0,
                LayoutOrder = 2,
                ZIndex = 1,
                BackgroundColor3 = l_AVATAR_CHAT_UI_SETTINGS_0.DividerColor
            }),
            CameraBubble = v40 and v4.createElement(v12, {
                LayoutOrder = 3,
                onActivated = not not v24() and v38.onVideoButtonPressed or v38.toggleVideo,
                chatSettings = l_chatSettings_0,
                cornerRadiusOffset = v44,
                controlBubbleSize = v45,
                iconAssetName = v47,
                iconSize = l_AVATAR_CHAT_UI_SETTINGS_0.IconSize,
                iconTransparency = l_AVATAR_CHAT_UI_SETTINGS_0.IconTransparency,
                iconStyle = v46
            })
        }),
        Carat = l_chatSettings_0.TailVisible and v4.createElement("ImageLabel", {
            LayoutOrder = 3,
            AnchorPoint = Vector2.new(0.5, 0),
            BackgroundTransparency = 1,
            Position = UDim2.new(0.5, 0, 1, -1),
            Size = UDim2.fromOffset(12, 8),
            Image = "rbxasset://textures/ui/InGameChat/Caret.png",
            ImageColor3 = l_chatSettings_0.BackgroundColor3,
            ImageTransparency = l_chatSettings_0.BackgroundTransparency
        }),
        MuteChangedEvent = v4.createElement(l_ExternalEventConnection_0, {
            event = l_default_1.muteChanged.Event,
            callback = v38.muteChangedEvent
        }),
        VideoEnabledChanged = not not l_FaceAnimatorService_0 and v4.createElement(l_ExternalEventConnection_0, {
            event = l_FaceAnimatorService_0:GetPropertyChangedSignal("VideoAnimationEnabled"),
            callback = v38.updateVideo
        }) or nil
    });
end;
return v5.connect(function(v48, v49)
    return {
        voiceState = v48.voiceState[v49.userId]
    };
end)(v28);


return {
    MAX_MESSAGE_LENGTH = 200,
    CAMERA_CHANGED_EPSILON = 5,
    BILLBOARD_OFFSET_EPSILON = 0.5,
    VOICE_STATE = {
        INACTIVE = "Inactive",
        TALKING = "Talking",
        CONNECTING = "Connecting",
        MUTED = "Muted",
        LOCAL_MUTED = "LOCAL_MUTED",
        ERROR = "Error",
        HIDDEN = "Hidden"
    },
    AVATAR_CHAT_UI_SETTINGS = {
        FrameHeight = 30,
        IconSize = UDim2.fromOffset(24, 24),
        IconTransparency = 0.1,
        DoubleIconButtonSize = UDim2.fromOffset(38, 30),
        SingleIconButtonSize = UDim2.fromOffset(30, 30),
        SingleIconCornerRadiusOffset = 8,
        DoubleIconCornerRadiusOffset = 10,
        DividerSize = UDim2.fromOffset(2, 18),
        DividerColor = Color3.fromHex("#BDBEBE")
    }
};


local v0 = require(game:GetService("CorePackages").Packages.Cryo);
local v1 = 0;
return function(v2)
    v1 = v1 + 1;
    return v0.Dictionary.join({
        name = "Foo",
        id = tostring(v1),
        userId = "1",
        text = "Hello, World",
        timestamp = v1
    }, v2);
end;


local l_CoreGui_0 = game:GetService("CoreGui");
local v1 = require(game:GetService("CorePackages").Packages.Promise);
local l_RobloxGui_0 = l_CoreGui_0:WaitForChild("RobloxGui");
local v3 = require(l_RobloxGui_0.Modules.Tracker.TrackerMenu);
local v4 = require(l_RobloxGui_0.Modules.Tracker.TrackerPromptType);
return function()
    v3:showPrompt(v4.None);
    v1.delay(0.016666666666666666):andThen(function()
        v3:showPrompt(v4.VideoNoPermission);
    end);
end;


local l_Players_0 = game:GetService("Players");
return function(v1)
    if v1 then
        for _, v3 in pairs(l_Players_0:GetPlayers()) do
            local l_Character_0 = v3.Character;
            if not (not l_Character_0 or not v1:IsDescendantOf(l_Character_0)) then
                return v3;
            end;
        end;
        return nil;
    else
        return nil;
    end;
end;


local v0 = require(game:GetService("CorePackages").Packages.t);
local v1 = require(script.Parent.Parent.Types);
local v2 = require(script.Parent.maybeAssert);
local _ = script.Parent.Parent.Parent.Parent.Flags;
return function(v4, v5)
    v2(v1.IChatSettings(v4));
    v2(v0.optional(v1.IMessage)(v5));
    local l_UserSpecificSettings_0 = v4.UserSpecificSettings;
    if l_UserSpecificSettings_0 and v5 then
        return (l_UserSpecificSettings_0[v5.userId] or v5.adornee and l_UserSpecificSettings_0[v5.adornee:GetFullName()]) or v4;
    else
        return v4;
    end;
end;


local v0 = require(game:GetService("CorePackages").Packages.Otter);
return function(v1)
    local l_SizeAnimation_0 = v1.SizeAnimation;
    if l_SizeAnimation_0.Enabled then
        local v3 = {
            dampingRatio = l_SizeAnimation_0.SpringDampingRatio,
            frequency = l_SizeAnimation_0.SpringFrequency
        };
        return function(v4)
            return v0.spring(v4, v3);
        end;
    else
        return v0.instant;
    end;
end;


local v0 = require(game:GetService("CorePackages").Packages.Otter);
return function(v1)
    local l_TransparencyAnimation_0 = v1.TransparencyAnimation;
    if l_TransparencyAnimation_0.Enabled then
        local v3 = {
            dampingRatio = l_TransparencyAnimation_0.SpringDampingRatio,
            frequency = l_TransparencyAnimation_0.SpringFrequency
        };
        return function(v4)
            return v0.spring(v4, v3);
        end;
    else
        return v0.instant;
    end;
end;


local v0 = require(game:GetService("CoreGui").RobloxGui.Modules.Flags.getFFlagEnableShimmeringIconLegacyChatService);
return function(v1, v2, v3)
    local _ = nil;
    if v0() and v1 == "Connecting" then
        return "icons/controls/voice/" .. v3 .. "_0_dark";
    elseif not (v1 ~= "Muted") or v1 == "LOCAL_MUTED" then
        return "icons/controls/voice/" .. v3 .. "_off_light";
    elseif not (v1 ~= "Inactive") or v1 == "Connecting" then
        return "icons/controls/voice/" .. v3 .. "_0_light";
    elseif v1 == "Talking" then
        return "icons/controls/voice/" .. v3 .. "_" .. tostring(20 * math.floor(0.5 + 5 * v2)) .. "_light";
    else
        return "icons/controls/voice/" .. v3 .. "_error_light";
    end;
end;


local v0 = require(script.Parent.Parent.GlobalConfig);
return function(...)
    if not v0.actionValidation then
        return ;
    else
        return assert(...);
    end;
end;


local v0 = require(game:GetService("CorePackages").Packages.t);
local v1 = require(script.Parent.Parent.Constants);
local v2 = require(script.Parent.maybeAssert);
return function(v3)
    v2(v0.string(v3));
    if utf8.len(v3) == nil then
        return false;
    else
        local v4 = utf8.len(utf8.nfcnormalize(v3));
        if v1.MAX_MESSAGE_LENGTH < v4 then
            return false, v4;
        else
            return true;
        end;
    end;
end;


local v0 = require(script.Parent.Parent.Parent.Logger):new("BubbleChatLogger");
return function(v1)
    return v0:new(v1);
end;


return (require(game:GetService("CorePackages").Packages.Rodux).combineReducers({
    chatSettings = require(script.Parent.chatSettings),
    messages = require(script.Parent.messages),
    userMessages = require(script.Parent.userMessages),
    voiceState = require(game:GetService("CoreGui"):WaitForChild("RobloxGui").Modules.VoiceChat.Reducers.voiceState),
    components = require(script.Parent.components)
}));


local l_CorePackages_0 = game:GetService("CorePackages");
local _ = require(l_CorePackages_0.Packages.Cryo);
local v2 = require(l_CorePackages_0.Packages.Rodux);
local v3 = require(script.Parent.Parent.Actions.UpdateChatSettings);
local v4 = require(script.Parent.Parent.ChatSettings);
local function v5(v6)
    if type(v6) ~= "table" then
        return v6;
    else
        local v7 = {};
        for v8, v9 in pairs(v6) do
            v7[v8] = v5(v9);
        end;
        return v7;
    end;
end;
local function v10(v11, v12)
    for v13, v14 in pairs(v12) do
        if type(v14) ~= "table" then
            v11[v13] = v14;
        elseif v11[v13] then
            v10(v11[v13], v14);
        end;
    end;
end;
return (v2.createReducer(v4, {
    [v3.name] = function(_, v16)
        local v17 = v5(v4);
        v10(v17, v16.settings);
        local l_UserSpecificSettings_0 = v16.settings.UserSpecificSettings;
        if l_UserSpecificSettings_0 then
            for v19, v20 in pairs(l_UserSpecificSettings_0) do
                local v21 = v5(v4);
                v21.UserSpecificSettings = nil;
                v10(v21, v20);
                v17.UserSpecificSettings[v19] = v21;
            end;
        end;
        return v17;
    end
}));


local l_CorePackages_0 = game:GetService("CorePackages");
local l_RobloxGui_0 = game:GetService("CoreGui"):WaitForChild("RobloxGui");
local v2 = require(l_CorePackages_0.Packages.Cryo);
return (require(l_CorePackages_0.Packages.Rodux).createReducer({
    bubbleChatEnabled = false,
    voiceEnabled = false
}, {
    [require(script.Parent.Parent.Actions.BubbleChatEnabledChanged).name] = function(v3, v4)
        return v2.Dictionary.join(v3, {
            bubbleChatEnabled = v4.enabled
        });
    end,
    [require(l_RobloxGui_0.Modules.VoiceChat.Actions.VoiceEnabledChanged).name] = function(v5, v6)
        return v2.Dictionary.join(v5, {
            voiceEnabled = v6.enabled
        });
    end
}));


local l_CorePackages_0 = game:GetService("CorePackages");
local v1 = require(l_CorePackages_0.Packages.Cryo);
return (require(l_CorePackages_0.Packages.Rodux).createReducer({}, {
    [require(script.Parent.Parent.Actions.AddMessage).name] = function(v2, v3)
        return v1.Dictionary.join(v2, {
            [v3.message.id] = v3.message
        });
    end,
    [require(script.Parent.Parent.Actions.RemoveMessage).name] = function(v4, v5)
        return v1.Dictionary.join(v4, {
            [v5.message.id] = v1.None
        });
    end,
    [require(script.Parent.Parent.Actions.SetMessageText).name] = function(v6, v7)
        local v8 = v6[v7.messageId];
        if v8 then
            return v1.Dictionary.join(v6, {
                [v7.messageId] = v1.Dictionary.join(v8, {
                    text = v7.newText
                })
            });
        else
            return v6;
        end;
    end
}));


local l_CorePackages_0 = game:GetService("CorePackages");
local l_RobloxGui_0 = game:GetService("CoreGui"):WaitForChild("RobloxGui");
local v2 = require(l_CorePackages_0.Packages.Cryo);
return (require(l_CorePackages_0.Packages.Rodux).createReducer({}, {
    [require(script.Parent.Parent.Actions.AddMessage).name] = function(v3, v4)
        return v2.Dictionary.join(v3, {
            [v4.message.userId] = v2.List.join(v3[v4.message.userId] or {}, {
                v4.message.id
            })
        });
    end,
    [require(script.Parent.Parent.Actions.RemoveMessage).name] = function(v5, v6)
        local v7 = v5[v6.message.userId];
        if not v7 then
            return v5;
        elseif #v7 == 1 and v7[1] == v6.message.id then
            return v2.Dictionary.join(v5, {
                [v6.message.userId] = v2.None
            });
        else
            return v2.Dictionary.join(v5, {
                [v6.message.userId] = v2.List.filter(v7, function(v8)
                    return v8 ~= v6.message.id;
                end)
            });
        end;
    end,
    [require(l_RobloxGui_0.Modules.VoiceChat.Actions.PlayerRemoved).name] = function(v9, v10)
        if not v9[v10.userId] then
            return v9;
        else
            return v2.Dictionary.join(v9, {
                [v10.userId] = v2.None
            });
        end;
    end
}));


return {
    BackgroundColor = {
        Dark = Color3.fromRGB(57, 59, 61),
        Light = Color3.fromRGB(250, 250, 250),
        Friend = Color3.fromRGB(186, 151, 207)
    },
    FontColor = {
        Dark = Color3.fromRGB(250, 250, 250),
        Light = Color3.fromRGB(57, 59, 61),
        Friend = Color3.fromRGB(0, 0, 0)
    }
};


local v0 = require(game:GetService("CorePackages").Packages.t);
local v1 = {
    IMessage = v0.strictInterface({
        id = v0.string,
        name = v0.string,
        text = v0.string,
        userId = v0.string,
        timestamp = v0.number,
        adornee = v0.union(v0.instanceIsA("BasePart"), v0.instanceOf("Model"))
    }),
    IMessageData = v0.interface({
        ID = v0.number,
        SpeakerUserId = v0.number,
        FromSpeaker = v0.string,
        Time = v0.number,
        Message = v0.optional(v0.string)
    })
};
local v2 = {
    BubbleDuration = v0.optional(v0.number),
    MaxBubbles = v0.optional(v0.number),
    BackgroundColor3 = v0.optional(v0.Color3),
    TextColor3 = v0.optional(v0.Color3),
    TextSize = v0.optional(v0.number),
    Font = v0.optional(v0.enum(Enum.Font)),
    Transparency = v0.optional(v0.number),
    CornerEnabled = v0.optional(v0.boolean),
    CornerRadius = v0.optional(v0.UDim),
    TailVisible = v0.optional(v0.boolean),
    Padding = v0.optional(v0.number),
    MaxWidth = v0.optional(v0.number),
    BackgroundImage = v0.optional(v0.strictInterface({
        Image = v0.optional(v0.string),
        ImageColor3 = v0.optional(v0.Color3),
        ImageRectOffset = v0.optional(v0.Vector2),
        ImageRectSize = v0.optional(v0.Vector2),
        ScaleType = v0.optional(v0.enum(Enum.ScaleType)),
        SliceCenter = v0.optional(v0.Rect),
        SliceScale = v0.optional(v0.number),
        TileSize = v0.optional(v0.UDim2)
    })),
    BackgroundGradient = v0.optional(v0.strictInterface({
        Enabled = v0.optional(v0.boolean),
        Color = v0.optional(v0.ColorSequence),
        Offset = v0.optional(v0.Vector2),
        Rotation = v0.optional(v0.number),
        Transparency = v0.optional(v0.NumberSequence)
    })),
    SizeAnimation = v0.optional(v0.strictInterface({
        Enabled = v0.optional(v0.boolean),
        SpringDampingRatio = v0.optional(v0.number),
        SpringFrequency = v0.optional(v0.number)
    })),
    TransparencyAnimation = v0.optional(v0.strictInterface({
        Enabled = v0.optional(v0.boolean),
        SpringDampingRatio = v0.optional(v0.number),
        SpringFrequency = v0.optional(v0.number)
    })),
    VerticalStudsOffset = v0.optional(v0.number),
    LocalPlayerStudsOffset = v0.optional(v0.Vector3),
    BubblesSpacing = v0.optional(v0.number),
    MinimizeDistance = v0.optional(v0.number),
    MaxDistance = v0.optional(v0.number),
    AdorneeName = v0.optional(v0.string),
    Voice = v0.optional(v0.strictInterface({
        ShowIndicator = v0.optional(v0.boolean)
    }))
};
local v3 = {};
for v4, v5 in pairs(v2) do
    v3[v4] = v5;
end;
v2.UserSpecificSettings = v0.optional(v0.map(v0.string, v0.strictInterface(v3)));
v1.IChatSettings = v0.strictInterface(v2);
return v1;


return require(game:GetService("CorePackages").Rodux).makeActionCreator("CANCEL_LEAVING_GAME", function()
    return {};
end);


return require(game:GetService("CorePackages").Rodux).makeActionCreator("CLOSE_NATIVE_PROMPT", function()
    return {};
end);


return require(game:GetService("CorePackages").Rodux).makeActionCreator("CLOSE_REPORT_DIALOG", function()
    return {};
end);


return require(game:GetService("CorePackages").Rodux).makeActionCreator("CLOSE_REPORT_SENT_DIALOG", function()
    return {};
end);


return require(game:GetService("CorePackages").Rodux).makeActionCreator("DECREMENT_CONTROLLER_BAR_COUNT", function()
    return {};
end);


return require(game:GetService("CorePackages").Rodux).makeActionCreator("INCREMENT_CONTROLLER_BAR_COUNT", function()
    return {};
end);


return require(game:GetService("CorePackages").Rodux).makeActionCreator("NAVIGATE_BACK", function()
    return {};
end);


return require(game:GetService("CorePackages").Rodux).makeActionCreator("OPEN_NATIVE_CLOSE_PROMPT", function()
    return {};
end);


return require(game:GetService("CorePackages").Rodux).makeActionCreator("OPEN_REPORT_DIALOG", function(v0, v1)
    return {
        userId = v0,
        userName = v1
    };
end);


return require(game:GetService("CorePackages").Rodux).makeActionCreator("OPEN_REPORT_SENT_DIALOG", function()
    return {};
end);


return require(game:GetService("CorePackages").Rodux).makeActionCreator("RECEIVED_USER_INVITE_STATUS", function(v0, v1)
    return {
        userId = tostring(v0),
        inviteStatus = v1
    };
end);


return require(game:GetService("CorePackages").Rodux).makeActionCreator("SET_CONTROL_LAYOUT", function(v0)
    return {
        controlLayout = v0
    };
end);


return require(game:GetService("CorePackages").Rodux).makeActionCreator("SET_CONTROLLER_BAR_HEIGHT", function(v0)
    return {
        controllerBarHeight = v0
    };
end);


return require(game:GetService("CorePackages").Rodux).makeActionCreator("SET_CURRENT_PAGE", function(v0)
    return {
        newPage = v0
    };
end);


return require(game:GetService("CorePackages").Rodux).makeActionCreator(script.Name, function(v0)
    return {
        zone = v0
    };
end);


return require(game:GetService("CorePackages").Rodux).makeActionCreator("SET_FRIEND_STATUS", function(v0, v1)
    return {
        userId = v0,
        friendStatus = v1
    };
end);


return require(game:GetService("CorePackages").Rodux).makeActionCreator(script.Name, function(v0, v1)
    return {
        gameName = v0,
        gameDescription = v1
    };
end);


return require(game:GetService("CorePackages").Rodux).makeActionCreator("SET_INPUT_TYPE", function(v0)
    return {
        inputType = v0
    };
end);


return require(game:GetService("CorePackages").Rodux).makeActionCreator("SET_INSPECT_MENU_ENABLED", function(v0)
    return {
        enabled = v0
    };
end);


return require(game:GetService("CorePackages").Rodux).makeActionCreator("SET_LOCALE_ID", function(v0)
    return {
        newLocaleId = v0
    };
end);


return require(game:GetService("CorePackages").Rodux).makeActionCreator("SET_MORE_MENU_OPEN", function(v0)
    return {
        isMainPageMoreMenuOpen = v0
    };
end);


return require(game:GetService("CorePackages").Rodux).makeActionCreator("SET_MENU_ICON_TOOLTIP_OPEN", function(v0)
    return {
        menuIconTooltipOpen = v0
    };
end);


return require(game:GetService("CorePackages").Rodux).makeActionCreator("SET_MENU_OPEN", function(v0)
    return {
        isMenuOpen = v0
    };
end);


return require(game:GetService("CorePackages").Rodux).makeActionCreator("SET_SCREEN_SIZE", function(v0)
    return {
        newScreenSize = v0
    };
end);


return require(game:GetService("CorePackages").Rodux).makeActionCreator("SET_VIDEO_RECORDING", function(v0)
    return {
        recording = v0
    };
end);


return require(game:GetService("CorePackages").Rodux).makeActionCreator("START_LEAVING_GAME", function()
    return {};
end);


local v0 = require(game:GetService("CorePackages").InGameMenuDependencies);
local l_Roact_0 = v0.Roact;
local l_Cryo_0 = v0.Cryo;
local l_UIBlox_0 = v0.UIBlox;
local l_Parent_0 = script.Parent.Parent;
local l_ImageSetLabel_0 = l_UIBlox_0.Core.ImageSet.ImageSetLabel;
local l_ImageSetButton_0 = l_UIBlox_0.Core.ImageSet.ImageSetButton;
local v7 = require(l_Parent_0.Resources.Assets);
local _ = function(v8)
    return l_Roact_0.forwardRef(function(v9, v10)
        local v11 = v7.Images[v9.imageKey];
        local _ = nil;
        return l_Roact_0.createElement(v8, l_Cryo_0.Dictionary.join(l_Cryo_0.Dictionary.join(v9, {
            imageKey = l_Cryo_0.None
        }, if typeof(v11) == "string" then {
            Image = v11
        } else v11, {
            BackgroundTransparency = 1
        }), {
            [l_Roact_0.Ref] = v10
        }));
    end);
end;
return {
    Label = l_Roact_0.forwardRef(function(v14, v15)
        local v16 = v7.Images[v14.imageKey];
        local _ = nil;
        return l_Roact_0.createElement(l_ImageSetLabel_0, l_Cryo_0.Dictionary.join(l_Cryo_0.Dictionary.join(v14, {
            imageKey = l_Cryo_0.None
        }, if typeof(v16) == "string" then {
            Image = v16
        } else v16, {
            BackgroundTransparency = 1
        }), {
            [l_Roact_0.Ref] = v15
        }));
    end),
    Button = l_Roact_0.forwardRef(function(v18, v19)
        local v20 = v7.Images[v18.imageKey];
        local _ = nil;
        return l_Roact_0.createElement(l_ImageSetButton_0, l_Cryo_0.Dictionary.join(l_Cryo_0.Dictionary.join(v18, {
            imageKey = l_Cryo_0.None
        }, if typeof(v20) == "string" then {
            Image = v20
        } else v20, {
            BackgroundTransparency = 1
        }), {
            [l_Roact_0.Ref] = v19
        }));
    end)
};


local v0 = require(game:GetService("CorePackages").InGameMenuDependencies);
local l_Roact_0 = v0.Roact;
local l_t_0 = v0.t;
local v3 = l_Roact_0.PureComponent:extend("BarOnTopScrollingFrame");
v3.validateProps = l_t_0.strictInterface({
    Size = l_t_0.UDim2,
    Position = l_t_0.optional(l_t_0.UDim2),
    CanvasSize = l_t_0.UDim2,
    ScrollingEnabled = l_t_0.optional(l_t_0.boolean),
    [l_Roact_0.Children] = l_t_0.table,
    onCanvasPositionChanged = l_t_0.optional(l_t_0.callback),
    scrollingFrameRef = l_t_0.optional(l_t_0.table)
});
v3.defaultProps = {
    ScrollingEnabled = true
};
v3.init = function(v4)
    v4.state = {
        CanvasPosition = Vector2.new(0, 0)
    };
end;
v3.render = function(v5)
    return l_Roact_0.createElement("Frame", {
        Size = v5.props.Size,
        Position = v5.props.Position,
        BackgroundTransparency = 1,
        ClipsDescendants = true
    }, {
        DisplayScrollingFrame = l_Roact_0.createElement("ScrollingFrame", {
            CanvasPosition = v5.state.CanvasPosition,
            BackgroundTransparency = 1,
            Size = UDim2.new(0, 8, 1, 0),
            CanvasSize = v5.props.CanvasSize - UDim2.new(0, 8, 0, 0),
            ScrollBarThickness = 8,
            BorderSizePixel = 0,
            ZIndex = 2,
            Position = UDim2.new(1, -8, 0, 0),
            ScrollingEnabled = v5.props.ScrollingEnabled,
            ScrollingDirection = Enum.ScrollingDirection.Y,
            Selectable = false,
            [l_Roact_0.Ref] = v5.props.scrollingFrameRef,
            [l_Roact_0.Change.CanvasPosition] = function(v6)
                v5:setState({
                    CanvasPosition = v6.CanvasPosition
                });
                if v5.props.onCanvasPositionChanged then
                    v5.props.onCanvasPositionChanged(v6);
                end;
            end
        }),
        ContentsScrollingFrame = l_Roact_0.createElement("ScrollingFrame", {
            BackgroundTransparency = 1,
            Size = UDim2.new(1, -8, 1, 0),
            CanvasSize = v5.props.CanvasSize - UDim2.new(0, 8, 0, 0),
            CanvasPosition = v5.state.CanvasPosition,
            ScrollBarThickness = 0,
            BorderSizePixel = 0,
            ClipsDescendants = false,
            ScrollingEnabled = v5.props.ScrollingEnabled,
            ScrollingDirection = Enum.ScrollingDirection.Y,
            Selectable = false,
            [l_Roact_0.Change.CanvasPosition] = function(v7)
                v5:setState({
                    CanvasPosition = v7.CanvasPosition
                });
            end
        }, {
            l_Roact_0.createElement("Frame", {
                BackgroundTransparency = 1,
                Size = UDim2.new(1, 8, 1, 0)
            }, v5.props[l_Roact_0.Children])
        })
    });
end;
return v3;


local l_CoreGui_0 = game:GetService("CoreGui");
local l_CorePackages_0 = game:GetService("CorePackages");
local l_RunService_0 = game:GetService("RunService");
local v3 = require(l_CoreGui_0:WaitForChild("RobloxGui").Modules.VR.VRServiceWrapper);
local v4 = require(l_CorePackages_0.InGameMenuDependencies);
local l_Roact_0 = v4.Roact;
local l_t_0 = v4.t;
local v7 = require(script:FindFirstAncestor("InGameMenu").Resources.Constants);
local v8 = l_Roact_0.PureComponent:extend("BlurredModalPortal");
v8.validateProps = l_t_0.strictInterface({
    Enabled = l_t_0.boolean,
    [l_Roact_0.Children] = l_t_0.optional(l_t_0.table)
});
v8.render = function(v9)
    return l_Roact_0.createElement(l_Roact_0.Portal, {
        target = l_CoreGui_0
    }, {
        InGameMenuModalBlur = l_Roact_0.createElement("ScreenGui", {
            OnTopOfCoreBlur = true,
            Enabled = v9.props.Enabled,
            IgnoreGuiInset = true,
            DisplayOrder = v7.DisplayOrder.BlurredModalPortal
        }, v9.props[l_Roact_0.Children])
    });
end;
v8.didUpdate = function(v10, v11)
    if not v3.VREnabled then
        local l_Enabled_0 = v11.Enabled;
        local l_Enabled_1 = v10.props.Enabled;
        if l_Enabled_0 ~= l_Enabled_1 then
            l_RunService_0:SetRobloxGuiFocused(l_Enabled_1);
        end;
        return ;
    else
        return ;
    end;
end;
return v8;


local l_CoreGui_0 = game:GetService("CoreGui");
local l_RunService_0 = game:GetService("RunService");
local l_TextService_0 = game:GetService("TextService");
local l_CorePackages_0 = game:GetService("CorePackages");
local l_ContextActionService_0 = game:GetService("ContextActionService");
local l_GuiService_0 = game:GetService("GuiService");
local v6 = require(l_CorePackages_0.InGameMenuDependencies);
local l_Roact_0 = v6.Roact;
local l_t_0 = v6.t;
local l_UIBlox_0 = v6.UIBlox;
local l_Button_0 = l_UIBlox_0.App.Button.Button;
local l_ButtonType_0 = l_UIBlox_0.App.Button.Enum.ButtonType;
local l_withStyle_0 = l_UIBlox_0.Core.Style.withStyle;
local l_Parent_0 = script.Parent.Parent;
local v14 = require(l_Parent_0.Resources.Constants);
local v15 = require(l_Parent_0.Resources.Assets);
local v16 = require(script.Parent.ThemedTextLabel);
local l_ImageSetLabel_0 = l_UIBlox_0.Core.ImageSet.ImageSetLabel;
local v18 = require(script.Parent.Connection.FocusHandler);
local v19 = l_Roact_0.PureComponent:extend("ConfirmationDialog");
v19.validateProps = l_t_0.strictInterface({
    bodyText = l_t_0.string,
    cancelText = l_t_0.string,
    confirmText = l_t_0.string,
    titleText = l_t_0.string,
    bindReturnToConfirm = l_t_0.boolean,
    onCancel = l_t_0.callback,
    onConfirm = l_t_0.callback,
    blurBackground = l_t_0.boolean,
    visible = l_t_0.boolean,
    inputType = l_t_0.optional(l_t_0.string)
});
v19.defaultProps = {
    bodyText = "This is some body text. It will wrap when needed.",
    cancelText = "Cancel",
    confirmText = "Confirm",
    titleText = "Dialog Title",
    blurBackground = false
};
v19.init = function(v20)
    v20.state = {
        isRooted = false
    };
    v20.onAncestryChanged = function(v21)
        if v21:IsDescendantOf(game) then
            v20:setState({
                isRooted = true
            });
        end;
    end;
    v20.confirmButtonRef = l_Roact_0.createRef();
    v20.buttonContainerRef = l_Roact_0.createRef();
end;
v19.render = function(v22)
    local l_props_0 = v22.props;
    return l_withStyle_0(function(v24)
        local l_Font_0 = v24.Font.Body.Font;
        local v26 = v24.Font.Body.RelativeSize * v24.Font.BaseSize;
        local v27 = (20 + math.max(l_TextService_0:GetTextSize(l_props_0.bodyText, v26, l_Font_0, Vector2.new(295, math.huge)).Y, v26 * 2)) + 20;
        return l_Roact_0.createElement(l_Roact_0.Portal, {
            target = l_CoreGui_0
        }, {
            InGameMenuConfirmationDialog = l_Roact_0.createElement("ScreenGui", {
                DisplayOrder = v14.DisplayOrder.ConfirmationDialog,
                IgnoreGuiInset = true,
                OnTopOfCoreBlur = l_props_0.blurBackground,
                Enabled = l_props_0.visible,
                ZIndexBehavior = Enum.ZIndexBehavior.Sibling
            }, {
                Overlay = l_Roact_0.createElement("TextButton", {
                    AutoButtonColor = false,
                    BackgroundColor3 = v24.Theme.Overlay.Color,
                    BackgroundTransparency = v24.Theme.Overlay.Transparency,
                    BorderSizePixel = 0,
                    Size = UDim2.new(1, 0, 1, 0),
                    Text = ""
                }),
                DialogMainFrame = l_Roact_0.createElement(l_ImageSetLabel_0, {
                    AnchorPoint = Vector2.new(0.5, 0.5),
                    BackgroundTransparency = 1,
                    Image = v15.Images.RoundedRect.Image,
                    ImageColor3 = v24.Theme.BackgroundUIDefault.Color,
                    ImageTransparency = v24.Theme.BackgroundUIDefault.Transparency,
                    Position = UDim2.new(0.5, 0, 0.5, 0),
                    ScaleType = v15.Images.RoundedRect.ScaleType,
                    Size = UDim2.new(0, 335, 0, ((49 + v27) + 36) + 20),
                    SliceCenter = v15.Images.RoundedRect.SliceCenter
                }, {
                    Padding = l_Roact_0.createElement("UIPadding", {
                        PaddingBottom = UDim.new(0, 20),
                        PaddingLeft = UDim.new(0, 20),
                        PaddingRight = UDim.new(0, 20)
                    }),
                    Layout = l_Roact_0.createElement("UIListLayout", {
                        FillDirection = Enum.FillDirection.Vertical,
                        HorizontalAlignment = Enum.HorizontalAlignment.Center,
                        SortOrder = Enum.SortOrder.LayoutOrder
                    }),
                    Title = l_Roact_0.createElement(v16, {
                        fontKey = "Header1",
                        themeKey = "TextEmphasis",
                        LayoutOrder = 1,
                        Size = UDim2.new(1, 0, 0, 48),
                        Text = l_props_0.titleText
                    }),
                    Divider = l_Roact_0.createElement("Frame", {
                        BackgroundColor3 = v24.Theme.Divider.Color,
                        BackgroundTransparency = v24.Theme.Divider.Transparency,
                        BorderSizePixel = 0,
                        LayoutOrder = 3,
                        Size = UDim2.new(0.8, 0, 0, 1)
                    }),
                    BodyTextContainer = l_Roact_0.createElement("Frame", {
                        BackgroundTransparency = 1,
                        LayoutOrder = 4,
                        Size = UDim2.new(1, 0, 0, v27)
                    }, {
                        BodyText = l_Roact_0.createElement(v16, {
                            Size = UDim2.new(1, 0, 1, 0),
                            Text = l_props_0.bodyText,
                            TextWrapped = true
                        })
                    }),
                    ButtonContainer = l_Roact_0.createElement("Frame", {
                        BackgroundTransparency = 1,
                        LayoutOrder = 5,
                        Size = UDim2.new(1, 0, 0, 36),
                        [l_Roact_0.Ref] = v22.buttonContainerRef,
                        [l_Roact_0.Event.AncestryChanged] = v22.onAncestryChanged
                    }, {
                        Layout = l_Roact_0.createElement("UIListLayout", {
                            FillDirection = Enum.FillDirection.Horizontal,
                            HorizontalAlignment = Enum.HorizontalAlignment.Center,
                            Padding = UDim.new(0, 10),
                            SortOrder = Enum.SortOrder.LayoutOrder,
                            VerticalAlignment = Enum.VerticalAlignment.Center
                        }),
                        CancelButton = l_Roact_0.createElement(l_Button_0, {
                            buttonType = l_ButtonType_0.Secondary,
                            layoutOrder = 1,
                            size = UDim2.new(0.5, -5, 1, 0),
                            text = l_props_0.cancelText,
                            onActivated = l_props_0.onCancel
                        }),
                        ConfirmButton = l_Roact_0.createElement(l_Button_0, {
                            buttonType = l_ButtonType_0.PrimarySystem,
                            layoutOrder = 2,
                            size = UDim2.new(0.5, -5, 1, 0),
                            text = l_props_0.confirmText,
                            onActivated = l_props_0.onConfirm,
                            [l_Roact_0.Ref] = v22.confirmButtonRef
                        })
                    })
                })
            }),
            FocusHandler = l_Roact_0.createElement(v18, {
                isFocused = (v22.state.isRooted and v22.props.visible) and v22.props.inputType == v14.InputType.Gamepad,
                didFocus = function()
                    l_GuiService_0:RemoveSelectionGroup("InGameMenuModalButtonsSelectionParent");
                    l_GuiService_0:AddSelectionParent("InGameMenuModalButtonsSelectionParent", v22.buttonContainerRef:getValue());
                    l_GuiService_0.SelectedCoreObject = v22.confirmButtonRef:getValue();
                end
            })
        });
    end);
end;
v19.updateBlur = function(v28)
    l_RunService_0:SetRobloxGuiFocused(v28.props.blurBackground and v28.props.visible);
end;
v19.bindActions = function(v29)
    local function v33(_, v31, _)
        if v31 == Enum.UserInputState.Begin then
            v29.props.onConfirm();
        end;
    end;
    if v29.props.bindReturnToConfirm then
        l_ContextActionService_0:BindCoreAction("InGameMenuModalConfirm", v33, false, Enum.KeyCode.Return);
    end;
    l_ContextActionService_0:BindCoreAction("InGameMenuModalCancel", function(_, v35, _)
        if v35 == Enum.UserInputState.Begin then
            v29.props.onCancel();
        end;
    end, false, Enum.KeyCode.Escape);
end;
v19.unbindActions = function(_)
    l_ContextActionService_0:UnbindCoreAction("InGameMenuModalConfirm");
    l_ContextActionService_0:UnbindCoreAction("InGameMenuModalCancel");
end;
v19.didMount = function(v38)
    v38:updateBlur();
    if v38.props.visible then
        v38:bindActions();
    end;
end;
v19.didUpdate = function(v39)
    v39:updateBlur();
    if not v39.props.visible then
        v39:unbindActions();
        return ;
    else
        v39:bindActions();
        return ;
    end;
end;
v19.willUnmount = function(v40)
    if v40.props.blurBackground then
        l_RunService_0:SetRobloxGuiFocused(false);
    end;
    v40:unbindActions();
end;
return v19;