< Summary

Class:HUDController
Assembly:HUD
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/HUD/HUDController.cs
Covered lines:165
Uncovered lines:69
Coverable lines:234
Total lines:525
Line coverage:70.5% (165 of 234)
Covered branches:0
Total branches:0
Covered methods:25
Total methods:46
Method coverage:54.3% (25 of 46)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
HUDController(...)0%110100%
Initialize()0%220100%
ShowSettings()0%6200%
ShowControls()0%6200%
ToggleUIVisibility_OnTriggered(...)0%20400%
ToggleAllUIHiddenNotification(...)0%20400%
ConfigureHUDElement()0%346.1106072.25%
OpenChannelSearchWindow()0%6200%
HandleChannelBacked()0%6200%
HandlePublicChatChannelBacked()0%6200%
OpenPublicChatWindow(...)0%6200%
OpenChannelChatWindow(...)0%6200%
OpenPrivateChatWindow(...)0%6200%
PrivateChatWindowHud_OnPressBack()0%12300%
TaskbarHud_onAnyTaskbarButtonClicked()0%2100%
CreateHudElement()0%8.437069.23%
UpdateHudElement(...)0%12300%
Cleanup()0%880100%
HandlePublicChatChannelClosed()0%2100%
GetHUDElement(...)0%220100%
IsHUDElementDeprecated(...)0%110100%
TriggerFakePlayerInfoCard()0%2100%
Dispose()0%110100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/HUD/HUDController.cs

#LineLine coverage
 1using Cysharp.Threading.Tasks;
 2using DCL;
 3using DCL.Chat;
 4using DCL.Social.Chat;
 5using DCL.HelpAndSupportHUD;
 6using DCL.NotificationModel;
 7using DCL.SettingsPanelHUD;
 8using DCL.Social.Chat;
 9using DCL.Social.Friends;
 10using System;
 11using System.Collections.Generic;
 12using System.Threading;
 13using UnityEngine;
 14using Environment = DCL.Environment;
 15using Object = UnityEngine.Object;
 16using Type = DCL.NotificationModel.Type;
 17
 18public class HUDController : IHUDController
 19{
 20    private const string TOGGLE_UI_VISIBILITY_ASSET_NAME = "ToggleUIVisibility";
 21    private const string OPEN_PASSPORT_SOURCE = "ProfileHUD";
 22
 23    static bool VERBOSE = false;
 42724    public static HUDController i { get; private set; }
 25
 26    public IHUDFactory hudFactory = null;
 27
 28    private InputAction_Trigger toggleUIVisibilityTrigger;
 29    private DataStore dataStore;
 30
 42731    private readonly Model hiddenUINotification = new Model()
 32    {
 33        timer = 3,
 34        type = Type.UI_HIDDEN,
 35        groupID = "UIHiddenNotification"
 36    };
 37
 42738    public HUDController(DataStore dataStore, IHUDFactory hudFactory = null)
 39    {
 42740        this.hudFactory = hudFactory;
 42741        this.dataStore = dataStore;
 42742    }
 43
 44    public void Initialize()
 45    {
 42746        i = this;
 47
 42748        if (this.hudFactory == null)
 42549            this.hudFactory = Environment.i.hud.factory;
 50
 42751        toggleUIVisibilityTrigger = Resources.Load<InputAction_Trigger>(TOGGLE_UI_VISIBILITY_ASSET_NAME);
 42752        toggleUIVisibilityTrigger.OnTriggered += ToggleUIVisibility_OnTriggered;
 53
 42754        CommonScriptableObjects.allUIHidden.OnChange += ToggleAllUIHiddenNotification;
 42755        UserContextMenu.OnOpenPrivateChatRequest += OpenPrivateChatWindow;
 42756    }
 57
 58
 59    public event Action OnTaskbarCreation;
 60
 061    public ProfileHUDController profileHud => GetHUDElement(HUDElementID.PROFILE_HUD) as ProfileHUDController;
 62
 63    public NotificationHUDController notificationHud =>
 064        GetHUDElement(HUDElementID.NOTIFICATION) as NotificationHUDController;
 65
 266    public MinimapHUDController minimapHud => GetHUDElement(HUDElementID.MINIMAP) as MinimapHUDController;
 67
 68    public SettingsPanelHUDController settingsPanelHud =>
 269        GetHUDElement(HUDElementID.SETTINGS_PANEL) as SettingsPanelHUDController;
 70
 71
 72    public TermsOfServiceHUDController termsOfServiceHud =>
 073        GetHUDElement(HUDElementID.TERMS_OF_SERVICE) as TermsOfServiceHUDController;
 74
 44375    public TaskbarHUDController taskbarHud => GetHUDElement(HUDElementID.TASKBAR) as TaskbarHUDController;
 76
 77    public WorldChatWindowController worldChatWindowHud =>
 44378        GetHUDElement(HUDElementID.WORLD_CHAT_WINDOW) as WorldChatWindowController;
 79
 80    public PrivateChatWindowController PrivateChatWindow =>
 43581        GetHUDElement(HUDElementID.PRIVATE_CHAT_WINDOW) as PrivateChatWindowController;
 82
 83    public PublicChatWindowController PublicChatWindowHud =>
 43984        GetHUDElement(HUDElementID.PUBLIC_CHAT) as PublicChatWindowController;
 85
 86    private ChatChannelHUDController chatChannelHud =>
 687        GetHUDElement(HUDElementID.CHANNELS_CHAT) as ChatChannelHUDController;
 88
 89    private SearchChannelsWindowController channelSearchHud =>
 490        GetHUDElement(HUDElementID.CHANNELS_SEARCH) as SearchChannelsWindowController;
 91
 92    private CreateChannelWindowController channelCreateHud =>
 493        GetHUDElement(HUDElementID.CHANNELS_CREATE) as CreateChannelWindowController;
 94
 95    private LeaveChannelConfirmationWindowController channelLeaveHud =>
 496        GetHUDElement(HUDElementID.CHANNELS_LEAVE_CONFIRMATION) as LeaveChannelConfirmationWindowController;
 97
 43598    public FriendsHUDController friendsHud => GetHUDElement(HUDElementID.FRIENDS) as FriendsHUDController;
 99
 0100    public ControlsHUDController controlsHud => GetHUDElement(HUDElementID.CONTROLS_HUD) as ControlsHUDController;
 101
 102    public HelpAndSupportHUDController helpAndSupportHud =>
 1103        GetHUDElement(HUDElementID.HELP_AND_SUPPORT_HUD) as HelpAndSupportHUDController;
 104
 0105    public MinimapHUDController minimapHUD => GetHUDElement(HUDElementID.MINIMAP) as MinimapHUDController;
 106
 107    public VoiceChatWindowController voiceChatHud =>
 2108        GetHUDElement(HUDElementID.USERS_AROUND_LIST_HUD) as VoiceChatWindowController;
 109
 3722110    public Dictionary<HUDElementID, IHUD> hudElements { get; private set; } = new Dictionary<HUDElementID, IHUD>();
 111
 0112    private UserProfile ownUserProfile => UserProfile.GetOwnUserProfile();
 113
 114    private void ShowSettings()
 115    {
 0116        settingsPanelHud?.SetVisibility(true);
 0117    }
 118
 119    private void ShowControls()
 120    {
 0121        controlsHud?.SetVisibility(true);
 0122    }
 123
 124    private void ToggleUIVisibility_OnTriggered(DCLAction_Trigger action)
 125    {
 0126        bool anyInputFieldIsSelected = InputProcessor.FocusIsInInputField();
 127
 0128        if (anyInputFieldIsSelected ||
 129            dataStore.exploreV2.isOpen.Get() ||
 130            CommonScriptableObjects.tutorialActive)
 0131            return;
 132
 0133        CommonScriptableObjects.allUIHidden.Set(!CommonScriptableObjects.allUIHidden.Get());
 0134    }
 135
 136    public void ToggleAllUIHiddenNotification(bool isHidden, bool _)
 137    {
 0138        if (isHidden)
 0139            NotificationsController.i?.ShowNotification(hiddenUINotification);
 140        else
 0141            NotificationsController.i?.DismissAllNotifications(hiddenUINotification.groupID);
 0142    }
 143
 144    public async UniTask ConfigureHUDElement(HUDElementID hudElementId, HUDConfiguration configuration, CancellationToke
 145        string extraPayload = null)
 146    {
 147        switch (hudElementId)
 148        {
 149            case HUDElementID.NONE:
 150                break;
 151            case HUDElementID.MINIMAP:
 1152                if (minimapHud == null)
 153                {
 154                    // dependencies should be initialized
 3155                    await Environment.WaitUntilInitialized();
 1156                    await CreateHudElement(configuration, hudElementId, cancellationToken);
 1157                    minimapHud?.Initialize();
 158                }
 159
 1160                break;
 161            case HUDElementID.PROFILE_HUD:
 1162                await CreateHudElement(configuration, hudElementId, cancellationToken);
 1163                break;
 164            case HUDElementID.NOTIFICATION:
 3165                await CreateHudElement(configuration, hudElementId, cancellationToken);
 1166                if (NotificationsController.i != null)
 0167                    NotificationsController.i.Initialize(notificationHud, dataStore.notifications);
 0168                break;
 169            case HUDElementID.SETTINGS_PANEL:
 1170                await CreateHudElement(configuration, hudElementId, cancellationToken);
 1171                settingsPanelHud?.Initialize();
 1172                break;
 173            case HUDElementID.TERMS_OF_SERVICE:
 1174                await CreateHudElement(configuration, hudElementId, cancellationToken);
 1175                break;
 176            case HUDElementID.WORLD_CHAT_WINDOW:
 1177                if (worldChatWindowHud == null)
 178                {
 1179                    await CreateHudElement(configuration, hudElementId, cancellationToken);
 180
 1181                    if (worldChatWindowHud != null)
 182                    {
 3183                        worldChatWindowHud.Initialize(
 184                            await hudFactory.CreateHUDView<WorldChatWindowComponentView>("ConversationListHUD", cancella
 185
 1186                        worldChatWindowHud.SetVisibility(false);
 1187                        worldChatWindowHud.OnOpenPrivateChat -= OpenPrivateChatWindow;
 1188                        worldChatWindowHud.OnOpenPrivateChat += OpenPrivateChatWindow;
 1189                        worldChatWindowHud.OnOpenPublicChat -= OpenPublicChatWindow;
 1190                        worldChatWindowHud.OnOpenPublicChat += OpenPublicChatWindow;
 1191                        worldChatWindowHud.OnOpenChannel -= OpenChannelChatWindow;
 1192                        worldChatWindowHud.OnOpenChannel += OpenChannelChatWindow;
 1193                        worldChatWindowHud.OnOpenChannelSearch -= OpenChannelSearchWindow;
 1194                        worldChatWindowHud.OnOpenChannelSearch += OpenChannelSearchWindow;
 195
 1196                        taskbarHud?.AddWorldChatWindow(worldChatWindowHud);
 197                    }
 198                }
 199                else
 0200                    UpdateHudElement(configuration, hudElementId);
 201
 1202                if (PublicChatWindowHud == null)
 203                {
 1204                    await CreateHudElement(configuration, HUDElementID.PUBLIC_CHAT, cancellationToken);
 205
 1206                    if (PublicChatWindowHud != null)
 207                    {
 3208                        PublicChatWindowHud.Initialize(
 209                                await hudFactory.CreateHUDView<PublicChatWindowComponentView>("NearbyChatChannelHUD", ca
 210
 1211                        PublicChatWindowHud.Setup(ChatUtils.NEARBY_CHANNEL_ID);
 1212                        PublicChatWindowHud.SetVisibility(false);
 1213                        PublicChatWindowHud.OnBack -= HandlePublicChatChannelBacked;
 1214                        PublicChatWindowHud.OnBack += HandlePublicChatChannelBacked;
 1215                        PublicChatWindowHud.OnClosed -= HandlePublicChatChannelClosed;
 1216                        PublicChatWindowHud.OnClosed += HandlePublicChatChannelClosed;
 1217                        taskbarHud?.AddPublicChatChannel(PublicChatWindowHud);
 218                    }
 219                }
 220                else
 0221                    UpdateHudElement(configuration, HUDElementID.PUBLIC_CHAT);
 222
 1223                if (PrivateChatWindow == null)
 224                {
 1225                    await CreateHudElement(configuration, HUDElementID.PRIVATE_CHAT_WINDOW, cancellationToken);
 226
 1227                    if (PrivateChatWindow != null)
 228                    {
 3229                        PrivateChatWindow.Initialize(
 230                            await hudFactory.CreateHUDView<PrivateChatWindowComponentView>("PrivateChatHUD", cancellatio
 231
 1232                        PrivateChatWindow.SetVisibility(false);
 1233                        PrivateChatWindow.OnBack -= PrivateChatWindowHud_OnPressBack;
 1234                        PrivateChatWindow.OnBack += PrivateChatWindowHud_OnPressBack;
 1235                        taskbarHud?.AddPrivateChatWindow(PrivateChatWindow);
 236                    }
 237                }
 238                else
 0239                    UpdateHudElement(configuration, HUDElementID.PRIVATE_CHAT_WINDOW);
 240
 1241                if (chatChannelHud == null)
 242                {
 1243                    await CreateHudElement(configuration, HUDElementID.CHANNELS_CHAT, cancellationToken);
 244
 1245                    if (chatChannelHud != null)
 246                    {
 3247                        chatChannelHud.Initialize(
 248                            await hudFactory.CreateHUDView<ChatChannelComponentView>("ChatChannelHUD", cancellationToken
 249
 1250                        chatChannelHud.SetVisibility(false);
 1251                        chatChannelHud.OnPressBack -= HandleChannelBacked;
 1252                        chatChannelHud.OnPressBack += HandleChannelBacked;
 253
 1254                        taskbarHud?.AddChatChannel(chatChannelHud);
 255                    }
 256                }
 257
 1258                if (channelSearchHud == null)
 259                {
 1260                    await CreateHudElement(configuration, HUDElementID.CHANNELS_SEARCH, cancellationToken);
 261
 1262                    if (channelSearchHud != null)
 263                    {
 3264                        channelSearchHud.Initialize(
 265                            await hudFactory.CreateHUDView<SearchChannelsWindowComponentView>("ChannelSearchHUD", cancel
 1266                        channelSearchHud.SetVisibility(false);
 1267                        taskbarHud?.AddChannelSearch(channelSearchHud);
 268                    }
 269                }
 270
 1271                if (channelCreateHud == null)
 272                {
 1273                    await CreateHudElement(configuration, HUDElementID.CHANNELS_CREATE, cancellationToken);
 274
 1275                    if (channelCreateHud != null)
 276                    {
 3277                        channelCreateHud.Initialize(
 278                            await hudFactory.CreateHUDView<CreateChannelWindowComponentView>("ChannelCreationHUD", cance
 1279                        channelCreateHud.SetVisibility(false);
 1280                        taskbarHud?.AddChannelCreation(channelCreateHud);
 281                    }
 282                }
 283
 1284                if (channelLeaveHud == null)
 285                {
 1286                    await CreateHudElement(configuration, HUDElementID.CHANNELS_LEAVE_CONFIRMATION, cancellationToken);
 287
 1288                    if (channelLeaveHud != null)
 289                    {
 3290                        channelLeaveHud.Initialize(
 291                            await hudFactory.CreateHUDView<LeaveChannelConfirmationWindowComponentView>("LeaveChannelCon
 1292                        channelLeaveHud.SetVisibility(false);
 1293                        taskbarHud?.AddChannelLeaveConfirmation(channelLeaveHud);
 294                    }
 295                }
 296
 0297                break;
 298            case HUDElementID.FRIENDS:
 1299                if (friendsHud == null)
 300                {
 1301                    await CreateHudElement(configuration, hudElementId, cancellationToken);
 302
 1303                    if (friendsHud != null)
 304                    {
 3305                        friendsHud.Initialize(
 306                            await hudFactory.CreateHUDView<FriendsHUDComponentView>("FriendsHUD", cancellationToken));
 1307                        friendsHud.OnPressWhisper -= OpenPrivateChatWindow;
 1308                        friendsHud.OnPressWhisper += OpenPrivateChatWindow;
 309
 1310                        taskbarHud?.AddFriendsWindow(friendsHud);
 311                    }
 312                }
 313                else
 314                {
 0315                    UpdateHudElement(configuration, hudElementId);
 316
 0317                    if (!configuration.active)
 0318                        taskbarHud?.DisableFriendsWindow();
 319                }
 320
 0321                break;
 322            case HUDElementID.TASKBAR:
 1323                if (taskbarHud == null)
 324                {
 1325                    await CreateHudElement(configuration, hudElementId, cancellationToken);
 326
 1327                    if (taskbarHud != null)
 328                    {
 1329                        taskbarHud.Initialize(SceneReferences.i.mouseCatcher);
 1330                        taskbarHud.OnAnyTaskbarButtonClicked -= TaskbarHud_onAnyTaskbarButtonClicked;
 1331                        taskbarHud.OnAnyTaskbarButtonClicked += TaskbarHud_onAnyTaskbarButtonClicked;
 332
 1333                        OnTaskbarCreation?.Invoke();
 334                    }
 335                }
 336                else
 337                {
 0338                    UpdateHudElement(configuration, hudElementId);
 339                }
 340
 0341                break;
 342            case HUDElementID.OPEN_EXTERNAL_URL_PROMPT:
 1343                await CreateHudElement(configuration, hudElementId, cancellationToken);
 1344                break;
 345            case HUDElementID.NFT_INFO_DIALOG:
 1346                await CreateHudElement(configuration, hudElementId, cancellationToken);
 1347                break;
 348            case HUDElementID.CONTROLS_HUD:
 1349                await CreateHudElement(configuration, hudElementId, cancellationToken);
 1350                break;
 351            case HUDElementID.HELP_AND_SUPPORT_HUD:
 3352                await CreateHudElement(configuration, hudElementId, cancellationToken);
 1353                settingsPanelHud?.AddHelpAndSupportWindow(helpAndSupportHud);
 1354                break;
 355            case HUDElementID.USERS_AROUND_LIST_HUD:
 1356                await CreateHudElement(configuration, hudElementId, cancellationToken);
 1357                if (voiceChatHud != null)
 1358                    taskbarHud?.AddVoiceChatWindow(voiceChatHud);
 359
 1360                break;
 361            case HUDElementID.GRAPHIC_CARD_WARNING:
 1362                await CreateHudElement(configuration, hudElementId, cancellationToken);
 363                break;
 364            case HUDElementID.AVATAR_NAMES:
 365                // TODO Remove the HUDElementId once kernel stops sending the Configure HUD message
 366                break;
 367        }
 368
 20369        GetHUDElement(hudElementId)?
 370           .SetVisibility(configuration.active && configuration.visible);
 20371    }
 372
 373    private void OpenChannelSearchWindow()
 374    {
 0375        taskbarHud?.OpenChannelSearch();
 0376    }
 377
 378    private void HandleChannelBacked()
 379    {
 0380        chatChannelHud.SetVisibility(false);
 0381        taskbarHud?.GoBackFromChat();
 0382    }
 383
 384    private void HandlePublicChatChannelBacked()
 385    {
 0386        PublicChatWindowHud.SetVisibility(false);
 0387        taskbarHud?.GoBackFromChat();
 0388    }
 389
 390    private void OpenPublicChatWindow(string channelId)
 391    {
 0392        taskbarHud?.OpenPublicChat(channelId, true);
 0393    }
 394
 395    private void OpenChannelChatWindow(string channelId)
 396    {
 0397        taskbarHud?.OpenChannelChat(channelId);
 0398    }
 399
 400    private void OpenPrivateChatWindow(string targetUserId)
 401    {
 0402        taskbarHud?.OpenPrivateChat(targetUserId);
 0403    }
 404
 405    private void PrivateChatWindowHud_OnPressBack()
 406    {
 0407        PrivateChatWindow?.SetVisibility(false);
 0408        taskbarHud?.GoBackFromChat();
 0409    }
 410
 411    private void TaskbarHud_onAnyTaskbarButtonClicked()
 412    {
 0413    }
 414
 415    private async UniTask CreateHudElement(HUDConfiguration config, HUDElementID id, CancellationToken cancellationToken
 416    {
 20417        bool controllerCreated = hudElements.ContainsKey(id);
 418
 20419        if (config.active && !controllerCreated)
 420        {
 421            try
 422            {
 24423                IHUD hudElement = await hudFactory.CreateHUD(id, cancellationToken);
 20424                hudElements.Add(id, hudElement);
 425
 20426                if (VERBOSE)
 0427                    Debug.Log($"Adding {id} .. type {hudElements[id].GetType().Name}");
 20428            }
 0429            catch (Exception e)
 430            {
 0431                Debug.LogWarning($"Failed to load HUD element resource {id}. Exception message: {e.Message}");
 0432            }
 433        }
 20434    }
 435
 436    private void UpdateHudElement(HUDConfiguration config, HUDElementID id)
 437    {
 0438        if (!hudElements.ContainsKey(id))
 0439            return;
 440
 0441        if (VERBOSE)
 0442            Debug.Log($"Updating {id}, type {hudElements[id].GetType().Name}, active: {config.active} visible: {config.v
 443
 0444        hudElements[id].SetVisibility(config.visible);
 0445    }
 446
 447    public void Cleanup()
 448    {
 428449        toggleUIVisibilityTrigger.OnTriggered -= ToggleUIVisibility_OnTriggered;
 428450        CommonScriptableObjects.allUIHidden.OnChange -= ToggleAllUIHiddenNotification;
 451
 428452        if (worldChatWindowHud != null)
 453        {
 1454            worldChatWindowHud.OnOpenPrivateChat -= OpenPrivateChatWindow;
 1455            worldChatWindowHud.OnOpenPublicChat -= OpenPublicChatWindow;
 1456            worldChatWindowHud.OnOpenChannel -= OpenChannelChatWindow;
 457        }
 458
 428459        if (PrivateChatWindow != null)
 1460            PrivateChatWindow.OnBack -= PrivateChatWindowHud_OnPressBack;
 461
 428462        if (PublicChatWindowHud != null)
 463        {
 1464            PublicChatWindowHud.OnClosed -= HandlePublicChatChannelClosed;
 1465            PublicChatWindowHud.OnBack -= HandlePublicChatChannelBacked;
 466        }
 467
 468
 428469        if (friendsHud != null)
 1470            friendsHud.OnPressWhisper -= OpenPrivateChatWindow;
 471
 428472        if (taskbarHud != null)
 1473            taskbarHud.OnAnyTaskbarButtonClicked -= TaskbarHud_onAnyTaskbarButtonClicked;
 474
 428475        UserContextMenu.OnOpenPrivateChatRequest -= OpenPrivateChatWindow;
 476
 896477        foreach (var kvp in hudElements)
 478        {
 20479            kvp.Value?.Dispose();
 480        }
 481
 428482        hudElements.Clear();
 428483    }
 484
 485    private void HandlePublicChatChannelClosed()
 486    {
 0487        PublicChatWindowHud.SetVisibility(false);
 0488    }
 489
 490    public IHUD GetHUDElement(HUDElementID id) =>
 2291491        hudElements.ContainsKey(id) ? hudElements[id] : null;
 492
 493    public static bool IsHUDElementDeprecated(HUDElementID element)
 494    {
 31495        System.Type enumType = typeof(HUDElementID);
 31496        var enumName = enumType.GetEnumName(element);
 31497        var fieldInfo = enumType.GetField(enumName);
 31498        return Attribute.IsDefined(fieldInfo, typeof(ObsoleteAttribute));
 499    }
 500
 501#if UNITY_EDITOR
 502    [ContextMenu("Trigger fake PlayerInfoCard")]
 503    public void TriggerFakePlayerInfoCard()
 504    {
 0505        var newModel = ownUserProfile.CloneModel();
 0506        newModel.name = "FakePassport";
 0507        newModel.description = "Fake Description for Testing";
 0508        newModel.userId = "test-id";
 509
 0510        UserProfileController.i.AddUserProfileToCatalog(newModel);
 0511        UserProfileController.GetProfileByUserId(newModel.userId).SetInventory(new[]
 512        {
 513            "dcl://halloween_2019/machete_headband_top_head",
 514            "dcl://halloween_2019/bee_suit_upper_body",
 515            "dcl://halloween_2019/bride_of_frankie_upper_body",
 516            "dcl://halloween_2019/creepy_nurse_upper_body",
 517        });
 0518        dataStore.HUDs.currentPlayerId.Set((newModel.userId, OPEN_PASSPORT_SOURCE));
 0519    }
 520#endif
 521    public void Dispose()
 522    {
 427523        Cleanup();
 427524    }
 525}