Add automated test at the opensim 'api' level to check that a given item goes to the correct directory
Also removes some mono compiler warningsprebuild-update
							parent
							
								
									c72d298202
								
							
						
					
					
						commit
						289c21099c
					
				| 
						 | 
				
			
			@ -37,11 +37,6 @@ using log4net;
 | 
			
		|||
using System.Reflection;
 | 
			
		||||
using System.Data.Common;
 | 
			
		||||
 | 
			
		||||
#if !NUNIT25
 | 
			
		||||
using NUnit.Framework.SyntaxHelpers;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// DBMS-specific:
 | 
			
		||||
using MySql.Data.MySqlClient;
 | 
			
		||||
using OpenSim.Data.MySQL;
 | 
			
		||||
| 
						 | 
				
			
			@ -52,7 +47,6 @@ using OpenSim.Data.MSSQL;
 | 
			
		|||
using Mono.Data.Sqlite;
 | 
			
		||||
using OpenSim.Data.SQLite;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
namespace OpenSim.Data.Tests
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -37,10 +37,6 @@ using log4net;
 | 
			
		|||
using System.Reflection;
 | 
			
		||||
using System.Data.Common;
 | 
			
		||||
 | 
			
		||||
#if !NUNIT25
 | 
			
		||||
using NUnit.Framework.SyntaxHelpers;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// DBMS-specific:
 | 
			
		||||
using MySql.Data.MySqlClient;
 | 
			
		||||
using OpenSim.Data.MySQL;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -40,10 +40,6 @@ using log4net;
 | 
			
		|||
using System.Reflection;
 | 
			
		||||
using System.Data.Common;
 | 
			
		||||
 | 
			
		||||
#if !NUNIT25
 | 
			
		||||
using NUnit.Framework.SyntaxHelpers;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// DBMS-specific:
 | 
			
		||||
using MySql.Data.MySqlClient;
 | 
			
		||||
using OpenSim.Data.MySQL;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -218,24 +218,35 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
 | 
			
		|||
 | 
			
		||||
        public bool AddItem(InventoryItemBase item)
 | 
			
		||||
        {
 | 
			
		||||
            m_log.DebugFormat(
 | 
			
		||||
                "[LOCAL INVENTORY SERVICES CONNECTOR]: Adding inventory item {0} to user {1} folder {2}", 
 | 
			
		||||
                item.Name, item.Owner, item.Folder);            
 | 
			
		||||
//            m_log.DebugFormat(
 | 
			
		||||
//                "[LOCAL INVENTORY SERVICES CONNECTOR]: Adding inventory item {0} to user {1} folder {2}", 
 | 
			
		||||
//                item.Name, item.Owner, item.Folder);            
 | 
			
		||||
 | 
			
		||||
            if (UUID.Zero == item.Folder)
 | 
			
		||||
            {
 | 
			
		||||
                InventoryFolderBase f = m_InventoryService.GetFolderForType(item.Owner, (AssetType)item.AssetType);
 | 
			
		||||
                if (f != null)
 | 
			
		||||
                {
 | 
			
		||||
//                    m_log.DebugFormat(
 | 
			
		||||
//                        "[LOCAL INVENTORY SERVICES CONNECTOR]: Found folder {0} type {1} for item {2}", 
 | 
			
		||||
//                        f.Name, (AssetType)f.Type, item.Name);
 | 
			
		||||
                    
 | 
			
		||||
                    item.Folder = f.ID;
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    f = m_InventoryService.GetRootFolder(item.Owner);
 | 
			
		||||
                    if (f != null)
 | 
			
		||||
                    {
 | 
			
		||||
                        item.Folder = f.ID;
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
//                        m_log.WarnFormat(
 | 
			
		||||
//                            "[LOCAL INVENTORY SERVICES CONNECTOR]: Could not find root folder for {0} when trying to add item {1} with no parent folder specified",
 | 
			
		||||
//                            item.Owner, item.Name);
 | 
			
		||||
                        return false;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -240,9 +240,16 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
 | 
			
		|||
                {
 | 
			
		||||
                    f = m_RemoteConnector.GetRootFolder(item.Owner);
 | 
			
		||||
                    if (f != null)
 | 
			
		||||
                    {
 | 
			
		||||
                        item.Folder = f.ID;
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
                        m_log.WarnFormat(
 | 
			
		||||
                            "[LOCAL INVENTORY SERVICES CONNECTOR]: Could not find root folder for {0} when trying to add item {1} with no parent folder specified",
 | 
			
		||||
                            item.Owner, item.Name);                        
 | 
			
		||||
                        return false;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }            
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -106,7 +106,7 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
            else
 | 
			
		||||
            {
 | 
			
		||||
                m_log.WarnFormat(
 | 
			
		||||
                    "[AGENT INVENTORY]: Agent {1} could not add item {2} {3}",
 | 
			
		||||
                    "[AGENT INVENTORY]: Agent {0} could not add item {1} {2}",
 | 
			
		||||
                    AgentID, item.Name, item.ID);
 | 
			
		||||
 | 
			
		||||
                return;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,104 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright (c) Contributors, http://opensimulator.org/
 | 
			
		||||
 * See CONTRIBUTORS.TXT for a full list of copyright holders.
 | 
			
		||||
 *
 | 
			
		||||
 * Redistribution and use in source and binary forms, with or without
 | 
			
		||||
 * modification, are permitted provided that the following conditions are met:
 | 
			
		||||
 *     * Redistributions of source code must retain the above copyright
 | 
			
		||||
 *       notice, this list of conditions and the following disclaimer.
 | 
			
		||||
 *     * Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
 *       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
 *       documentation and/or other materials provided with the distribution.
 | 
			
		||||
 *     * Neither the name of the OpenSimulator Project nor the
 | 
			
		||||
 *       names of its contributors may be used to endorse or promote products
 | 
			
		||||
 *       derived from this software without specific prior written permission.
 | 
			
		||||
 *
 | 
			
		||||
 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
 | 
			
		||||
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
 | 
			
		||||
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 | 
			
		||||
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Reflection;
 | 
			
		||||
using System.Text;
 | 
			
		||||
using System.Threading;
 | 
			
		||||
using System.Timers;
 | 
			
		||||
using Timer=System.Timers.Timer;
 | 
			
		||||
using Nini.Config;
 | 
			
		||||
using NUnit.Framework;
 | 
			
		||||
using NUnit.Framework.SyntaxHelpers;
 | 
			
		||||
using OpenMetaverse;
 | 
			
		||||
using OpenMetaverse.Assets;
 | 
			
		||||
using OpenSim.Framework;
 | 
			
		||||
using OpenSim.Framework.Communications;
 | 
			
		||||
using OpenSim.Region.Framework.Scenes;
 | 
			
		||||
using OpenSim.Region.Framework.Interfaces;
 | 
			
		||||
using OpenSim.Region.CoreModules.Avatar.Inventory.Archiver;
 | 
			
		||||
using OpenSim.Region.CoreModules.World.Serialiser;
 | 
			
		||||
using OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation;
 | 
			
		||||
using OpenSim.Tests.Common;
 | 
			
		||||
using OpenSim.Tests.Common.Mock;
 | 
			
		||||
using OpenSim.Tests.Common.Setup;
 | 
			
		||||
 | 
			
		||||
namespace OpenSim.Region.Framework.Tests
 | 
			
		||||
{
 | 
			
		||||
    [TestFixture]
 | 
			
		||||
    public class TaskInventoryTests
 | 
			
		||||
    {
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Test MoveTaskInventoryItem where the item has no parent folder assigned.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// This should place it in the most suitable user folder.
 | 
			
		||||
        [Test]
 | 
			
		||||
        public void TestMoveTaskInventoryItemNoParent()
 | 
			
		||||
        {
 | 
			
		||||
            TestHelper.InMethod();
 | 
			
		||||
//            log4net.Config.XmlConfigurator.Configure();
 | 
			
		||||
            
 | 
			
		||||
            Scene scene = SceneSetupHelpers.SetupScene("inventory");
 | 
			
		||||
            
 | 
			
		||||
            // Create user
 | 
			
		||||
            string userFirstName = "Jock";
 | 
			
		||||
            string userLastName = "Stirrup";
 | 
			
		||||
            string userPassword = "troll";
 | 
			
		||||
            UUID userId = UUID.Parse("00000000-0000-0000-0000-000000000020");            
 | 
			
		||||
            UserProfileTestUtils.CreateUserWithInventory(scene, userFirstName, userLastName, userId, userPassword);            
 | 
			
		||||
            
 | 
			
		||||
            // Create scene object
 | 
			
		||||
            string part1Name = "part1";  
 | 
			
		||||
            UUID part1Id = UUID.Parse("10000000-0000-0000-0000-000000000000");
 | 
			
		||||
            SceneObjectPart part1
 | 
			
		||||
                = new SceneObjectPart(userId, PrimitiveBaseShape.Default, Vector3.Zero, Quaternion.Identity, Vector3.Zero) 
 | 
			
		||||
                    { Name = part1Name, UUID = part1Id };
 | 
			
		||||
            SceneObjectGroup so = new SceneObjectGroup(part1);
 | 
			
		||||
            
 | 
			
		||||
            // Create scene object inventory item
 | 
			
		||||
            AssetNotecard nc = new AssetNotecard("Hello World!");
 | 
			
		||||
            UUID ncAssetUuid = new UUID("00000000-0000-0000-1000-000000000000");
 | 
			
		||||
            UUID ncItemUuid = new UUID("00000000-0000-0000-1100-000000000000");            
 | 
			
		||||
            AssetBase ncAsset 
 | 
			
		||||
                = AssetHelpers.CreateAsset(ncAssetUuid, AssetType.Notecard, nc.AssetData, UUID.Zero);
 | 
			
		||||
            scene.AssetService.Store(ncAsset);
 | 
			
		||||
            TaskInventoryItem ncItem 
 | 
			
		||||
                = new TaskInventoryItem 
 | 
			
		||||
                    { Name = "ncItem", AssetID = ncAssetUuid, ItemID = ncItemUuid, 
 | 
			
		||||
                      Type = (int)AssetType.Notecard, InvType = (int)InventoryType.Notecard };
 | 
			
		||||
            part1.Inventory.AddInventoryItem(ncItem, true);           
 | 
			
		||||
            
 | 
			
		||||
            // Perform test
 | 
			
		||||
            scene.MoveTaskInventoryItem(userId, UUID.Zero, part1, ncItemUuid);
 | 
			
		||||
            
 | 
			
		||||
            InventoryItemBase ncUserItem
 | 
			
		||||
                = InventoryArchiveUtils.FindItemByPath(scene.InventoryService, userId, "Notecards/ncItem");            
 | 
			
		||||
            Assert.That(ncUserItem, Is.Not.Null, "Notecards/ncItem was not found");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -268,15 +268,22 @@ namespace OpenSim.Services.InventoryService
 | 
			
		|||
 | 
			
		||||
        public InventoryFolderBase GetFolderForType(UUID userID, AssetType type)
 | 
			
		||||
        {
 | 
			
		||||
//            m_log.DebugFormat("[INVENTORY SERVICE]: Looking for folder type {0} for user {1}", type, userID);
 | 
			
		||||
            
 | 
			
		||||
            InventoryFolderBase root = m_Database.getUserRootFolder(userID);
 | 
			
		||||
            if (root != null)
 | 
			
		||||
            {
 | 
			
		||||
                List<InventoryFolderBase> folders = RequestSubFolders(root.ID);
 | 
			
		||||
 | 
			
		||||
                foreach (InventoryFolderBase folder in folders)
 | 
			
		||||
                {
 | 
			
		||||
                {                   
 | 
			
		||||
                    if (folder.Type == (short)type)
 | 
			
		||||
                    {
 | 
			
		||||
//                        m_log.DebugFormat(
 | 
			
		||||
//                            "[INVENTORY SERVICE]: Found folder {0} type {1}", folder.Name, (AssetType)folder.Type);                        
 | 
			
		||||
                        
 | 
			
		||||
                        return folder;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -37,13 +37,9 @@ namespace OpenSim.Tests.Common.Mock
 | 
			
		|||
{
 | 
			
		||||
    public class MockInventoryService : IInventoryService
 | 
			
		||||
    {
 | 
			
		||||
        public MockInventoryService()
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
        public MockInventoryService() {}
 | 
			
		||||
        
 | 
			
		||||
        public MockInventoryService(IConfigSource config)
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
        public MockInventoryService(IConfigSource config) {}
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// <see cref="OpenSim.Framework.Communications.IInterServiceInventoryServices"/>
 | 
			
		||||
| 
						 | 
				
			
			@ -140,7 +136,7 @@ namespace OpenSim.Tests.Common.Mock
 | 
			
		|||
 | 
			
		||||
        public bool AddItem(InventoryItemBase item)
 | 
			
		||||
        {
 | 
			
		||||
            return false;
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public bool UpdateItem(InventoryItemBase item)
 | 
			
		||||
| 
						 | 
				
			
			@ -187,4 +183,4 @@ namespace OpenSim.Tests.Common.Mock
 | 
			
		|||
            return 1;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -42,7 +42,7 @@ namespace OpenSim.Tests.Common.Mock
 | 
			
		|||
    /// </summary>
 | 
			
		||||
    public class TestInventoryDataPlugin : IInventoryDataPlugin
 | 
			
		||||
    {
 | 
			
		||||
//        private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
 | 
			
		||||
        private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
 | 
			
		||||
        
 | 
			
		||||
        /// <value>
 | 
			
		||||
        /// Inventory folders
 | 
			
		||||
| 
						 | 
				
			
			@ -84,14 +84,19 @@ namespace OpenSim.Tests.Common.Mock
 | 
			
		|||
 | 
			
		||||
        public List<InventoryItemBase> getInventoryInFolder(UUID folderID)
 | 
			
		||||
        {
 | 
			
		||||
//            m_log.DebugFormat("[MOCK INV DB]: Getting items in folder {0}", folderID);
 | 
			
		||||
            InventoryFolderBase folder = m_folders[folderID];
 | 
			
		||||
            
 | 
			
		||||
            m_log.DebugFormat("[MOCK INV DB]: Getting items in folder {0} {1}", folder.Name, folder.ID);
 | 
			
		||||
            
 | 
			
		||||
            List<InventoryItemBase> items = new List<InventoryItemBase>();
 | 
			
		||||
 | 
			
		||||
            foreach (InventoryItemBase item in m_items.Values)
 | 
			
		||||
            {
 | 
			
		||||
                if (item.Folder == folderID)
 | 
			
		||||
                {
 | 
			
		||||
                    m_log.DebugFormat("[MOCK INV DB]: getInventoryInFolder() adding item {0}", item.Name);
 | 
			
		||||
                    items.Add(item);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            
 | 
			
		||||
            return items;
 | 
			
		||||
| 
						 | 
				
			
			@ -101,7 +106,7 @@ namespace OpenSim.Tests.Common.Mock
 | 
			
		|||
 | 
			
		||||
        public InventoryFolderBase getUserRootFolder(UUID user)
 | 
			
		||||
        {
 | 
			
		||||
//            m_log.DebugFormat("[MOCK INV DB]: Looking for root folder for {0}", user);
 | 
			
		||||
            m_log.DebugFormat("[MOCK INV DB]: Looking for root folder for {0}", user);
 | 
			
		||||
            
 | 
			
		||||
            InventoryFolderBase folder = null;
 | 
			
		||||
            m_rootFolders.TryGetValue(user, out folder);
 | 
			
		||||
| 
						 | 
				
			
			@ -111,12 +116,22 @@ namespace OpenSim.Tests.Common.Mock
 | 
			
		|||
 | 
			
		||||
        public List<InventoryFolderBase> getInventoryFolders(UUID parentID)
 | 
			
		||||
        {
 | 
			
		||||
            InventoryFolderBase parentFolder = m_folders[parentID];
 | 
			
		||||
            
 | 
			
		||||
            m_log.DebugFormat("[MOCK INV DB]: Getting folders in folder {0} {1}", parentFolder.Name, parentFolder.ID);
 | 
			
		||||
            
 | 
			
		||||
            List<InventoryFolderBase> folders = new List<InventoryFolderBase>();
 | 
			
		||||
 | 
			
		||||
            foreach (InventoryFolderBase folder in m_folders.Values)
 | 
			
		||||
            {
 | 
			
		||||
                if (folder.ParentID == parentID)
 | 
			
		||||
                {
 | 
			
		||||
                    m_log.DebugFormat(
 | 
			
		||||
                        "[MOCK INV DB]: Found folder {0} {1} in {2} {3}", 
 | 
			
		||||
                        folder.Name, folder.ID, parentFolder.Name, parentFolder.ID);
 | 
			
		||||
                    
 | 
			
		||||
                    folders.Add(folder);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return folders;
 | 
			
		||||
| 
						 | 
				
			
			@ -137,6 +152,10 @@ namespace OpenSim.Tests.Common.Mock
 | 
			
		|||
 | 
			
		||||
        public void addInventoryFolder(InventoryFolderBase folder)
 | 
			
		||||
        {
 | 
			
		||||
            m_log.DebugFormat(
 | 
			
		||||
                "[MOCK INV DB]: Adding inventory folder {0} {1} type {2}", 
 | 
			
		||||
                folder.Name, folder.ID, (AssetType)folder.Type);
 | 
			
		||||
            
 | 
			
		||||
            m_folders[folder.ID] = folder;
 | 
			
		||||
 | 
			
		||||
            if (folder.ParentID == UUID.Zero)
 | 
			
		||||
| 
						 | 
				
			
			@ -166,8 +185,10 @@ namespace OpenSim.Tests.Common.Mock
 | 
			
		|||
 | 
			
		||||
        public void addInventoryItem(InventoryItemBase item) 
 | 
			
		||||
        {
 | 
			
		||||
//            m_log.DebugFormat(
 | 
			
		||||
//                "[MOCK INV DB]: Adding inventory item {0} {1} in {2}", item.Name, item.ID, item.Folder);
 | 
			
		||||
            InventoryFolderBase folder = m_folders[item.Folder];
 | 
			
		||||
            
 | 
			
		||||
            m_log.DebugFormat(
 | 
			
		||||
                "[MOCK INV DB]: Adding inventory item {0} {1} in {2} {3}", item.Name, item.ID, folder.Name, folder.ID);
 | 
			
		||||
            
 | 
			
		||||
            m_items[item.ID] = item;
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -285,10 +285,16 @@ namespace OpenSim.Tests.Common.Setup
 | 
			
		|||
            config.AddConfig("Modules");
 | 
			
		||||
            config.AddConfig("InventoryService");
 | 
			
		||||
            config.Configs["Modules"].Set("InventoryServices", "LocalInventoryServicesConnector");
 | 
			
		||||
            
 | 
			
		||||
            if (real)
 | 
			
		||||
            {
 | 
			
		||||
                config.Configs["InventoryService"].Set("LocalServiceModule", "OpenSim.Services.InventoryService.dll:InventoryService");
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                config.Configs["InventoryService"].Set("LocalServiceModule", "OpenSim.Tests.Common.dll:MockInventoryService");
 | 
			
		||||
            }
 | 
			
		||||
            
 | 
			
		||||
            config.Configs["InventoryService"].Set("StorageProvider", "OpenSim.Tests.Common.dll");
 | 
			
		||||
            inventoryService.Initialise(config);
 | 
			
		||||
            inventoryService.AddRegion(testScene);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue