//  Replace road sign prop x with road sign prop y:
        public static void ReplaceRoadsignProp(NetLaneProps affectedProps, CustomizableRoadsignItem affectedSign, int selectedValue)
        {
            //  Init:
            PropInfo oldProp = (selectedValue == 0) ? PrefabCollection <PropInfo> .FindLoaded(affectedSign._originalSign.name) : PrefabCollection <PropInfo> .FindLoaded(affectedSign._customSign.name);

            PropInfo newProp = (selectedValue == 0) ? PrefabCollection <PropInfo> .FindLoaded(affectedSign._customSign.name) : PrefabCollection <PropInfo> .FindLoaded(affectedSign._originalSign.name);

            //  Null check:
            if (!newProp)
            {
                return;
            }
            foreach (var prop in affectedProps.m_props)
            {
                if (prop.m_prop != null)
                {
                    var propInstance = prop.m_finalProp;
                    if (propInstance == null)
                    {
                        continue;
                    }
                    if (propInstance.name == oldProp.name || propInstance.name == newProp.name)
                    {
                        //  Make visible:
                        prop.m_prop.m_maxRenderDistance = 1000;
                        prop.m_prop.m_maxScale          = 1;
                        prop.m_prop.m_minScale          = 1;
                        prop.m_finalProp = newProp;
                        prop.m_prop      = newProp;
                    }
                }
            }
        }
        //  OnLoad:
        public static void ReplacePropsOnLoad()
        {
            CustomizableRoadsignItem affectedGantrySign = CustomizableRoadsignsList.Where(x => x._originalSign.name.ToLower() == "motorway overroad signs").FirstOrDefault();

            ChangeRoadsignPropWithoutCustomAsset(affectedGantrySign, config.rendermode_highwaygantry);

            List <CustomizableRoadsignItem> affectedHighwaySign = new List <CustomizableRoadsignItem>();

            affectedHighwaySign.Add(CustomizableRoadsignsList.Where(x => x._originalSign.name.ToLower() == "motorway sign").FirstOrDefault());
            ChangeRoadsignPropWithCustomAsset(affectedHighwaySign, config.rendermode_highwaysign, false);

            List <CustomizableRoadsignItem> affectedNoparkingSign = new List <CustomizableRoadsignItem>();

            affectedNoparkingSign.Add(CustomizableRoadsignsList.Where(x => x._originalSign.name.ToLower() == "no parking sign").FirstOrDefault());
            ChangeRoadsignPropWithCustomAsset(affectedNoparkingSign, config.rendermode_noparking, false);

            List <CustomizableRoadsignItem> affectedNoturningSigns = new List <CustomizableRoadsignItem>();

            affectedNoturningSigns.Add(CustomizableRoadsignsList.Where(x => x._originalSign.name.ToLower() == "no left turn sign").FirstOrDefault());
            affectedNoturningSigns.Add(CustomizableRoadsignsList.Where(x => x._originalSign.name.ToLower() == "no right turn sign").FirstOrDefault());
            ChangeRoadsignPropWithCustomAsset(affectedNoturningSigns, config.rendermode_noturnings, false);

            List <CustomizableRoadsignItem> affectedSpeedlimitSigns = new List <CustomizableRoadsignItem>();

            affectedSpeedlimitSigns.Add(CustomizableRoadsignsList.Where(x => x._originalSign.name.ToLower() == "30 speed limit").FirstOrDefault());
            affectedSpeedlimitSigns.Add(CustomizableRoadsignsList.Where(x => x._originalSign.name.ToLower() == "40 speed limit").FirstOrDefault());
            affectedSpeedlimitSigns.Add(CustomizableRoadsignsList.Where(x => x._originalSign.name.ToLower() == "50 speed limit").FirstOrDefault());
            affectedSpeedlimitSigns.Add(CustomizableRoadsignsList.Where(x => x._originalSign.name.ToLower() == "60 speed limit").FirstOrDefault());
            affectedSpeedlimitSigns.Add(CustomizableRoadsignsList.Where(x => x._originalSign.name.ToLower() == "100 speed limit").FirstOrDefault());
            ChangeRoadsignPropWithCustomAsset(affectedSpeedlimitSigns, config.rendermode_speedlimits, false);

            CustomizableRoadsignItem affectedStreetnameSign = CustomizableRoadsignsList.Where(x => x._originalSign.name.ToLower() == "street name sign").FirstOrDefault();

            ChangeRoadsignPropWithoutCustomAsset(affectedStreetnameSign, config.rendermode_streetname);
        }
        //  Handler for road sign props without custom model (retexture/hide):
        public static void ChangeRoadsignPropWithoutCustomAsset(CustomizableRoadsignItem affectedSign, int selectedValue)
        {
            DebugUtils.Log($"[DEBUG] - original prop {affectedSign._originalSign.name} to be retextured.");

            PropInfo affectedSignProp = affectedSign._originalSign;
            //
            string    message           = string.Empty;
            Stopwatch ReplacePropsTimer = new Stopwatch();

            ReplacePropsTimer.Start();
            //  Do the magic:
            if (selectedValue < 2)
            {   //  Show
                RetextureRoadsignProp(affectedSignProp, selectedValue);
                message = $"Road sign '{affectedSignProp.name}' retextured to {((selectedValue == 0) ? "custom" : "vanilla")} succesfully.";
            }
            else
            {   //  Hide
                affectedSignProp.m_maxRenderDistance = 0;
                affectedSignProp.m_maxScale          = 0;
                affectedSignProp.m_minScale          = 0;
                message = $"Road sign '{affectedSignProp.name}' hidden successfully.";
            }
            //
            ReplacePropsTimer.Stop();
            message += $" Operation took {ReplacePropsTimer.ElapsedMilliseconds} ms.";
            if (config.enable_debug)
            {
                DebugUtils.Log(message);
            }
        }
        public static void InitProps()
        {
            string propNameTest = string.Empty;

            for (int i = 0; i < PrefabCollection <PropInfo> .LoadedCount(); i++)
            {
                PropInfo prop = PrefabCollection <PropInfo> .GetLoaded((uint)i);

                //  Check to avoid 'incompatible' props causing errors on European maps (like bus stop props):
                try
                {
                    propNameTest = prop.name;
                }
                catch
                {
                    continue;
                }
                //  Custom props:
                if (prop.m_isCustomContent)
                {
                    CustomizableRoadsignItem roadsignItem = new CustomizableRoadsignItem();
                    roadsignItem._originalSign = new PropInfo();
                    roadsignItem._customSign   = new PropInfo();
                    if (prop.name.ToLower().Contains("speed limit 65"))
                    {
                        roadsignItem._customSign   = prop;
                        roadsignItem._originalSign = PrefabCollection <PropInfo> .FindLoaded("100 Speed Limit");

                        CustomizableRoadsignsList.Add(roadsignItem);
                        workshopAssets.Add(prop);
                    }
                    else if (prop.name.ToLower().Contains("speed limit 45"))
                    {
                        roadsignItem._customSign   = prop;
                        roadsignItem._originalSign = PrefabCollection <PropInfo> .FindLoaded("60 Speed Limit");

                        CustomizableRoadsignsList.Add(roadsignItem);
                        workshopAssets.Add(prop);
                    }
                    else if (prop.name.ToLower().Contains("speed limit 30"))
                    {
                        roadsignItem._customSign   = prop;
                        roadsignItem._originalSign = PrefabCollection <PropInfo> .FindLoaded("50 Speed Limit");

                        CustomizableRoadsignsList.Add(roadsignItem);
                        workshopAssets.Add(prop);
                    }
                    else if (prop.name.ToLower().Contains("speed limit 25"))
                    {
                        roadsignItem._customSign   = prop;
                        roadsignItem._originalSign = PrefabCollection <PropInfo> .FindLoaded("40 Speed Limit");

                        CustomizableRoadsignsList.Add(roadsignItem);
                        workshopAssets.Add(prop);
                    }
                    else if (prop.name.ToLower().Contains("speed limit 15"))
                    {
                        roadsignItem._customSign   = prop;
                        roadsignItem._originalSign = PrefabCollection <PropInfo> .FindLoaded("30 Speed Limit");

                        CustomizableRoadsignsList.Add(roadsignItem);
                        workshopAssets.Add(prop);
                    }
                    else if (prop.name.ToLower().Contains("us interstate sign"))
                    {
                        roadsignItem._customSign   = prop;
                        roadsignItem._originalSign = PrefabCollection <PropInfo> .FindLoaded("Motorway Sign");

                        CustomizableRoadsignsList.Add(roadsignItem);
                        workshopAssets.Add(prop);
                    }
                    else if (prop.name.ToLower().Contains("us no left turn"))
                    {
                        roadsignItem._customSign   = prop;
                        roadsignItem._originalSign = PrefabCollection <PropInfo> .FindLoaded("No Left Turn Sign");

                        CustomizableRoadsignsList.Add(roadsignItem);
                        workshopAssets.Add(prop);
                    }
                    else if (prop.name.ToLower().Contains("us no right turn"))
                    {
                        roadsignItem._customSign   = prop;
                        roadsignItem._originalSign = PrefabCollection <PropInfo> .FindLoaded("No Right Turn Sign");

                        CustomizableRoadsignsList.Add(roadsignItem);
                        workshopAssets.Add(prop);
                    }
                    else if (prop.name.ToLower().Contains("us no parking"))
                    {
                        roadsignItem._customSign   = prop;
                        roadsignItem._originalSign = PrefabCollection <PropInfo> .FindLoaded("No Parking Sign");

                        CustomizableRoadsignsList.Add(roadsignItem);
                        workshopAssets.Add(prop);
                    }
                }
                //  Vanilla props:
                else
                {
                    // Highway Gantry/Street Name sign:
                    if (prop.name.ToLower().Equals("motorway overroad signs") || prop.name.ToLower().Equals("street name sign"))
                    {
                        CustomizableRoadsignItem roadsignItem = new CustomizableRoadsignItem();
                        roadsignItem._originalSign = new PropInfo();
                        roadsignItem._originalSign = prop;
                        roadsignItem._customSign   = null;
                        CustomizableRoadsignsList.Add(roadsignItem);
                        vanillaAssets.Add(prop);

                        if (prop.name.ToLower().Equals("motorway overroad signs"))
                        {
                            gantryMainTexture = prop.m_material.GetTexture("_MainTex");
                            gantryACITexture  = prop.m_material.GetTexture("_ACIMap");
                            gantryXYSTexture  = prop.m_material.GetTexture("_XYSMap");
                        }
                        else
                        {
                            streetnameMainTexture = prop.m_material.GetTexture("_MainTex");
                        }
                    }
                    else if (// Road signs:
                        prop.name.ToLower().Equals("motorway sign") ||
                        prop.name.ToLower().Equals("30 speed limit") ||
                        prop.name.ToLower().Equals("40 speed limit") ||
                        prop.name.ToLower().Equals("50 speed limit") ||
                        prop.name.ToLower().Equals("60 speed limit") ||
                        prop.name.ToLower().Equals("100 speed limit") ||
                        prop.name.ToLower().Equals("no left turn sign") ||
                        prop.name.ToLower().Equals("no right turn sign") ||
                        prop.name.ToLower().Equals("no parking sign") ||
                        //  Road props:
                        prop.name.ToLower().Equals("manhole") ||
                        //  Roadside props:
                        prop.name.ToLower().Equals("electricity box") ||
                        prop.name.ToLower().Equals("fire hydrant") ||
                        prop.name.ToLower().Equals("info terminal") ||
                        prop.name.ToLower().Equals("parking meter") ||
                        prop.name.ToLower().Equals("random street prop"))
                    {
                        vanillaAssets.Add(prop);
                    }
                }
            }
            if (config.enable_debug)
            {
                DebugUtils.Log($"[DEBUG] - Number of vanilla props added to list: {vanillaAssets.Count()} (expect 17).");
                DebugUtils.Log($"[DEBUG] - Number of workshop props added to list: {workshopAssets.Count()} (expect 9).");
                DebugUtils.Log($"[DEBUG] - Number of replaceable road sign props: {CustomizableRoadsignsList.Count()} (expect 11).");
            }
        }