2022-03-01 11:52:52 +00:00
|
|
|
|
using Module = ASC.Api.Core.Module;
|
2022-02-28 19:23:39 +00:00
|
|
|
|
|
|
|
|
|
namespace ASC.People.Api;
|
|
|
|
|
|
2022-03-01 11:52:52 +00:00
|
|
|
|
public class UserController : ApiControllerBase
|
2022-02-28 19:23:39 +00:00
|
|
|
|
{
|
2022-03-01 11:52:52 +00:00
|
|
|
|
private readonly UserControllerEngine _userControllerEngine;
|
2022-02-28 19:23:39 +00:00
|
|
|
|
|
2022-03-01 11:52:52 +00:00
|
|
|
|
public UserController(UserControllerEngine userControllerEngine)
|
2022-02-28 19:23:39 +00:00
|
|
|
|
{
|
2022-03-01 11:52:52 +00:00
|
|
|
|
_userControllerEngine = userControllerEngine;
|
2022-02-28 19:23:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Create("active")]
|
2022-03-01 12:27:07 +00:00
|
|
|
|
public EmployeeDto AddMemberAsActivatedFromBody([FromBody] MemberRequestDto memberModel)
|
2022-02-28 19:23:39 +00:00
|
|
|
|
{
|
2022-03-01 11:52:52 +00:00
|
|
|
|
return _userControllerEngine.AddMemberAsActivated(memberModel);
|
2022-02-28 19:23:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Create("active")]
|
|
|
|
|
[Consumes("application/x-www-form-urlencoded")]
|
2022-03-01 12:27:07 +00:00
|
|
|
|
public EmployeeDto AddMemberAsActivatedFromForm([FromForm] MemberRequestDto memberModel)
|
2022-02-28 19:23:39 +00:00
|
|
|
|
{
|
2022-03-01 11:52:52 +00:00
|
|
|
|
return _userControllerEngine.AddMemberAsActivated(memberModel);
|
2022-02-28 19:23:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Create]
|
|
|
|
|
[Authorize(AuthenticationSchemes = "confirm", Roles = "LinkInvite,Everyone")]
|
2022-03-01 12:27:07 +00:00
|
|
|
|
public EmployeeDto AddMemberFromBody([FromBody] MemberRequestDto memberModel)
|
2022-02-28 19:23:39 +00:00
|
|
|
|
{
|
2022-03-01 11:52:52 +00:00
|
|
|
|
return _userControllerEngine.AddMember(memberModel);
|
2022-02-28 19:23:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Create]
|
|
|
|
|
[Authorize(AuthenticationSchemes = "confirm", Roles = "LinkInvite,Everyone")]
|
|
|
|
|
[Consumes("application/x-www-form-urlencoded")]
|
2022-03-01 12:27:07 +00:00
|
|
|
|
public EmployeeDto AddMemberFromForm([FromForm] MemberRequestDto memberModel)
|
2022-02-28 19:23:39 +00:00
|
|
|
|
{
|
2022-03-01 11:52:52 +00:00
|
|
|
|
return _userControllerEngine.AddMember(memberModel);
|
2022-02-28 19:23:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Update("{userid}/password")]
|
|
|
|
|
[Authorize(AuthenticationSchemes = "confirm", Roles = "PasswordChange,EmailChange,Activation,EmailActivation,Everyone")]
|
2022-03-01 12:27:07 +00:00
|
|
|
|
public EmployeeDto ChangeUserPasswordFromBody(Guid userid, [FromBody] MemberRequestDto memberModel)
|
2022-02-28 19:23:39 +00:00
|
|
|
|
{
|
2022-03-01 11:52:52 +00:00
|
|
|
|
return _userControllerEngine.ChangeUserPassword(userid, memberModel);
|
2022-02-28 19:23:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Update("{userid}/password")]
|
|
|
|
|
[Authorize(AuthenticationSchemes = "confirm", Roles = "PasswordChange,EmailChange,Activation,EmailActivation,Everyone")]
|
|
|
|
|
[Consumes("application/x-www-form-urlencoded")]
|
2022-03-01 12:27:07 +00:00
|
|
|
|
public EmployeeDto ChangeUserPasswordFromForm(Guid userid, [FromForm] MemberRequestDto memberModel)
|
2022-02-28 19:23:39 +00:00
|
|
|
|
{
|
2022-03-01 11:52:52 +00:00
|
|
|
|
return _userControllerEngine.ChangeUserPassword(userid, memberModel);
|
2022-02-28 19:23:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Delete("{userid}")]
|
2022-03-01 12:27:07 +00:00
|
|
|
|
public EmployeeDto DeleteMember(string userid)
|
2022-02-28 19:23:39 +00:00
|
|
|
|
{
|
2022-03-01 11:52:52 +00:00
|
|
|
|
return _userControllerEngine.DeleteMember(userid);
|
2022-02-28 19:23:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Delete("@self")]
|
|
|
|
|
[Authorize(AuthenticationSchemes = "confirm", Roles = "ProfileRemove")]
|
2022-03-01 12:27:07 +00:00
|
|
|
|
public EmployeeDto DeleteProfile()
|
2022-02-28 19:23:39 +00:00
|
|
|
|
{
|
2022-03-01 11:52:52 +00:00
|
|
|
|
return _userControllerEngine.DeleteProfile();
|
2022-02-28 19:23:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Read("status/{status}/search")]
|
2022-03-01 12:27:07 +00:00
|
|
|
|
public IEnumerable<EmployeeDto> GetAdvanced(EmployeeStatus status, [FromQuery] string query)
|
2022-02-28 19:23:39 +00:00
|
|
|
|
{
|
2022-03-01 11:52:52 +00:00
|
|
|
|
return _userControllerEngine.GetAdvanced(status, query);
|
2022-02-28 19:23:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Read]
|
|
|
|
|
public IEnumerable<EmployeeDto> GetAll()
|
|
|
|
|
{
|
|
|
|
|
return GetByStatus(EmployeeStatus.Active);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Read("email")]
|
2022-03-01 12:27:07 +00:00
|
|
|
|
public EmployeeDto GetByEmail([FromQuery] string email)
|
2022-02-28 19:23:39 +00:00
|
|
|
|
{
|
2022-03-01 11:52:52 +00:00
|
|
|
|
return _userControllerEngine.GetByEmail(email);
|
2022-02-28 19:23:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Read("{username}", order: int.MaxValue)]
|
2022-03-01 12:27:07 +00:00
|
|
|
|
public EmployeeDto GetById(string username)
|
2022-02-28 19:23:39 +00:00
|
|
|
|
{
|
2022-03-01 11:52:52 +00:00
|
|
|
|
return _userControllerEngine.GetById(username);
|
2022-02-28 19:23:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Read("status/{status}")]
|
|
|
|
|
public IEnumerable<EmployeeDto> GetByStatus(EmployeeStatus status)
|
|
|
|
|
{
|
2022-03-01 11:52:52 +00:00
|
|
|
|
return _userControllerEngine.GetByStatus(status);
|
2022-02-28 19:23:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Read("filter")]
|
2022-03-01 12:27:07 +00:00
|
|
|
|
public IEnumerable<EmployeeDto> GetFullByFilter(EmployeeStatus? employeeStatus, Guid? groupId, EmployeeActivationStatus? activationStatus, EmployeeType? employeeType, bool? isAdministrator)
|
2022-02-28 19:23:39 +00:00
|
|
|
|
{
|
2022-03-01 11:52:52 +00:00
|
|
|
|
return _userControllerEngine.GetFullByFilter(employeeStatus, groupId, activationStatus, employeeType, isAdministrator);
|
2022-02-28 19:23:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Read("info")]
|
|
|
|
|
public Module GetModule()
|
|
|
|
|
{
|
2022-03-01 11:52:52 +00:00
|
|
|
|
return _userControllerEngine.GetModule();
|
2022-02-28 19:23:39 +00:00
|
|
|
|
}
|
2022-03-01 11:52:52 +00:00
|
|
|
|
|
2022-02-28 19:23:39 +00:00
|
|
|
|
[Read("search")]
|
2022-03-01 12:27:07 +00:00
|
|
|
|
public IEnumerable<EmployeeDto> GetPeopleSearch([FromQuery] string query)
|
2022-02-28 19:23:39 +00:00
|
|
|
|
{
|
|
|
|
|
return GetSearch(query);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Read("@search/{query}")]
|
2022-03-01 12:27:07 +00:00
|
|
|
|
public IEnumerable<EmployeeDto> GetSearch(string query)
|
2022-02-28 19:23:39 +00:00
|
|
|
|
{
|
2022-03-01 11:52:52 +00:00
|
|
|
|
return _userControllerEngine.GetSearch(query);
|
2022-02-28 19:23:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Read("simple/filter")]
|
|
|
|
|
public IEnumerable<EmployeeDto> GetSimpleByFilter(EmployeeStatus? employeeStatus, Guid? groupId, EmployeeActivationStatus? activationStatus, EmployeeType? employeeType, bool? isAdministrator)
|
|
|
|
|
{
|
2022-03-01 11:52:52 +00:00
|
|
|
|
return _userControllerEngine.GetSimpleByFilter(employeeStatus, groupId, activationStatus, employeeType, isAdministrator);
|
2022-02-28 19:23:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[AllowAnonymous]
|
|
|
|
|
[Create(@"register")]
|
|
|
|
|
public Task<string> RegisterUserOnPersonalAsync(RegisterPersonalUserRequestDto model)
|
|
|
|
|
{
|
2022-03-01 11:52:52 +00:00
|
|
|
|
return _userControllerEngine.RegisterUserOnPersonalAsync(model, Request);
|
2022-02-28 19:23:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Update("delete", Order = -1)]
|
2022-03-01 12:27:07 +00:00
|
|
|
|
public IEnumerable<EmployeeDto> RemoveUsersFromBody([FromBody] UpdateMembersRequestDto model)
|
2022-02-28 19:23:39 +00:00
|
|
|
|
{
|
2022-03-01 11:52:52 +00:00
|
|
|
|
return _userControllerEngine.RemoveUsers(model);
|
2022-02-28 19:23:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Update("delete", Order = -1)]
|
|
|
|
|
[Consumes("application/x-www-form-urlencoded")]
|
2022-03-01 12:27:07 +00:00
|
|
|
|
public IEnumerable<EmployeeDto> RemoveUsersFromForm([FromForm] UpdateMembersRequestDto model)
|
2022-02-28 19:23:39 +00:00
|
|
|
|
{
|
2022-03-01 11:52:52 +00:00
|
|
|
|
return _userControllerEngine.RemoveUsers(model);
|
2022-02-28 19:23:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Update("invite")]
|
2022-03-01 12:27:07 +00:00
|
|
|
|
public IEnumerable<EmployeeDto> ResendUserInvitesFromBody([FromBody] UpdateMembersRequestDto model)
|
2022-02-28 19:23:39 +00:00
|
|
|
|
{
|
2022-03-01 11:52:52 +00:00
|
|
|
|
return _userControllerEngine.ResendUserInvites(model);
|
2022-02-28 19:23:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Update("invite")]
|
|
|
|
|
[Consumes("application/x-www-form-urlencoded")]
|
2022-03-01 12:27:07 +00:00
|
|
|
|
public IEnumerable<EmployeeDto> ResendUserInvitesFromForm([FromForm] UpdateMembersRequestDto model)
|
2022-02-28 19:23:39 +00:00
|
|
|
|
{
|
2022-03-01 11:52:52 +00:00
|
|
|
|
return _userControllerEngine.ResendUserInvites(model);
|
2022-02-28 19:23:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Read("@self")]
|
|
|
|
|
public EmployeeDto Self()
|
|
|
|
|
{
|
2022-03-01 11:52:52 +00:00
|
|
|
|
return _userControllerEngine.Self();
|
2022-02-28 19:23:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Create("email", false)]
|
|
|
|
|
public object SendEmailChangeInstructionsFromBody([FromBody] UpdateMemberRequestDto model)
|
|
|
|
|
{
|
2022-03-01 11:52:52 +00:00
|
|
|
|
return _userControllerEngine.SendEmailChangeInstructions(model);
|
2022-02-28 19:23:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Create("email", false)]
|
|
|
|
|
[Consumes("application/x-www-form-urlencoded")]
|
|
|
|
|
public object SendEmailChangeInstructionsFromForm([FromForm] UpdateMemberRequestDto model)
|
|
|
|
|
{
|
2022-03-01 11:52:52 +00:00
|
|
|
|
return _userControllerEngine.SendEmailChangeInstructions(model);
|
2022-02-28 19:23:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[AllowAnonymous]
|
|
|
|
|
[Create("password", false)]
|
|
|
|
|
public object SendUserPasswordFromBody([FromBody] MemberRequestDto memberModel)
|
|
|
|
|
{
|
2022-03-01 11:52:52 +00:00
|
|
|
|
return _userControllerEngine.SendUserPassword(memberModel);
|
2022-02-28 19:23:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[AllowAnonymous]
|
|
|
|
|
[Create("password", false)]
|
|
|
|
|
[Consumes("application/x-www-form-urlencoded")]
|
|
|
|
|
public object SendUserPasswordFromForm([FromForm] MemberRequestDto memberModel)
|
|
|
|
|
{
|
2022-03-01 11:52:52 +00:00
|
|
|
|
return _userControllerEngine.SendUserPassword(memberModel);
|
2022-02-28 19:23:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Update("activationstatus/{activationstatus}")]
|
|
|
|
|
[Authorize(AuthenticationSchemes = "confirm", Roles = "Activation,Everyone")]
|
2022-03-01 12:27:07 +00:00
|
|
|
|
public IEnumerable<EmployeeDto> UpdateEmployeeActivationStatusFromBody(EmployeeActivationStatus activationstatus, [FromBody] UpdateMembersRequestDto model)
|
2022-02-28 19:23:39 +00:00
|
|
|
|
{
|
2022-03-01 11:52:52 +00:00
|
|
|
|
return _userControllerEngine.UpdateEmployeeActivationStatus(activationstatus, model);
|
2022-02-28 19:23:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Update("activationstatus/{activationstatus}")]
|
|
|
|
|
[Authorize(AuthenticationSchemes = "confirm", Roles = "Activation,Everyone")]
|
|
|
|
|
[Consumes("application/x-www-form-urlencoded")]
|
2022-03-01 12:27:07 +00:00
|
|
|
|
public IEnumerable<EmployeeDto> UpdateEmployeeActivationStatusFromForm(EmployeeActivationStatus activationstatus, [FromForm] UpdateMembersRequestDto model)
|
2022-02-28 19:23:39 +00:00
|
|
|
|
{
|
2022-03-01 11:52:52 +00:00
|
|
|
|
return _userControllerEngine.UpdateEmployeeActivationStatus(activationstatus, model);
|
2022-02-28 19:23:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Update("{userid}/culture")]
|
2022-03-01 12:27:07 +00:00
|
|
|
|
public EmployeeDto UpdateMemberCultureFromBody(string userid, [FromBody] UpdateMemberRequestDto memberModel)
|
2022-02-28 19:23:39 +00:00
|
|
|
|
{
|
2022-03-01 11:52:52 +00:00
|
|
|
|
return _userControllerEngine.UpdateMemberCulture(userid, memberModel);
|
2022-02-28 19:23:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Update("{userid}/culture")]
|
|
|
|
|
[Consumes("application/x-www-form-urlencoded")]
|
2022-03-01 12:27:07 +00:00
|
|
|
|
public EmployeeDto UpdateMemberCultureFromForm(string userid, [FromForm] UpdateMemberRequestDto memberModel)
|
2022-02-28 19:23:39 +00:00
|
|
|
|
{
|
2022-03-01 11:52:52 +00:00
|
|
|
|
return _userControllerEngine.UpdateMemberCulture(userid, memberModel);
|
2022-02-28 19:23:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Update("{userid}")]
|
2022-03-01 12:27:07 +00:00
|
|
|
|
public EmployeeDto UpdateMemberFromBody(string userid, [FromBody] UpdateMemberRequestDto memberModel)
|
2022-02-28 19:23:39 +00:00
|
|
|
|
{
|
2022-03-01 11:52:52 +00:00
|
|
|
|
return _userControllerEngine.UpdateMember(userid, memberModel);
|
2022-02-28 19:23:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Update("{userid}")]
|
|
|
|
|
[Consumes("application/x-www-form-urlencoded")]
|
2022-03-01 12:27:07 +00:00
|
|
|
|
public EmployeeDto UpdateMemberFromForm(string userid, [FromForm] UpdateMemberRequestDto memberModel)
|
2022-02-28 19:23:39 +00:00
|
|
|
|
{
|
2022-03-01 11:52:52 +00:00
|
|
|
|
return _userControllerEngine.UpdateMember(userid, memberModel);
|
2022-02-28 19:23:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Update("status/{status}")]
|
2022-03-01 12:27:07 +00:00
|
|
|
|
public IEnumerable<EmployeeDto> UpdateUserStatusFromBody(EmployeeStatus status, [FromBody] UpdateMembersRequestDto model)
|
2022-02-28 19:23:39 +00:00
|
|
|
|
{
|
2022-03-01 11:52:52 +00:00
|
|
|
|
return _userControllerEngine.UpdateUserStatus(status, model);
|
2022-02-28 19:23:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Update("status/{status}")]
|
|
|
|
|
[Consumes("application/x-www-form-urlencoded")]
|
2022-03-01 12:27:07 +00:00
|
|
|
|
public IEnumerable<EmployeeDto> UpdateUserStatusFromForm(EmployeeStatus status, [FromForm] UpdateMembersRequestDto model)
|
2022-02-28 19:23:39 +00:00
|
|
|
|
{
|
2022-03-01 11:52:52 +00:00
|
|
|
|
return _userControllerEngine.UpdateUserStatus(status, model);
|
2022-02-28 19:23:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Update("type/{type}")]
|
2022-03-01 12:27:07 +00:00
|
|
|
|
public IEnumerable<EmployeeDto> UpdateUserTypeFromBody(EmployeeType type, [FromBody] UpdateMembersRequestDto model)
|
2022-02-28 19:23:39 +00:00
|
|
|
|
{
|
2022-03-01 11:52:52 +00:00
|
|
|
|
return _userControllerEngine.UpdateUserType(type, model);
|
2022-02-28 19:23:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Update("type/{type}")]
|
|
|
|
|
[Consumes("application/x-www-form-urlencoded")]
|
2022-03-01 12:27:07 +00:00
|
|
|
|
public IEnumerable<EmployeeDto> UpdateUserTypeFromForm(EmployeeType type, [FromForm] UpdateMembersRequestDto model)
|
2022-02-28 19:23:39 +00:00
|
|
|
|
{
|
2022-03-01 11:52:52 +00:00
|
|
|
|
return _userControllerEngine.UpdateUserType(type, model);
|
|
|
|
|
}
|
2022-02-28 19:23:39 +00:00
|
|
|
|
|
|
|
|
|
///// <summary>
|
|
|
|
|
///// Adds a new portal user from import with the first and last name, email address
|
|
|
|
|
///// </summary>
|
|
|
|
|
///// <short>
|
|
|
|
|
///// Add new import user
|
|
|
|
|
///// </short>
|
|
|
|
|
///// <param name="userList">The list of users to add</param>
|
|
|
|
|
///// <param name="importUsersAsCollaborators" optional="true">Add users as guests (bool type: false|true)</param>
|
|
|
|
|
///// <returns>Newly created users</returns>
|
|
|
|
|
//[Create("import/save")]
|
|
|
|
|
//public void SaveUsers(string userList, bool importUsersAsCollaborators)
|
|
|
|
|
//{
|
|
|
|
|
// lock (progressQueue.SynchRoot)
|
|
|
|
|
// {
|
|
|
|
|
// var task = progressQueue.GetItems().OfType<ImportUsersTask>().FirstOrDefault(t => (int)t.Id == TenantProvider.CurrentTenantID);
|
|
|
|
|
// if (task != null && task.IsCompleted)
|
|
|
|
|
// {
|
|
|
|
|
// progressQueue.Remove(task);
|
|
|
|
|
// task = null;
|
|
|
|
|
// }
|
|
|
|
|
// if (task == null)
|
|
|
|
|
// {
|
|
|
|
|
// progressQueue.Add(new ImportUsersTask(userList, importUsersAsCollaborators, GetHttpHeaders(HttpContext.Current.Request))
|
|
|
|
|
// {
|
|
|
|
|
// Id = TenantProvider.CurrentTenantID,
|
|
|
|
|
// UserId = SecurityContext.CurrentAccount.ID,
|
|
|
|
|
// Percentage = 0
|
|
|
|
|
// });
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
//[Read("import/status")]
|
|
|
|
|
//public object GetStatus()
|
|
|
|
|
//{
|
|
|
|
|
// lock (progressQueue.SynchRoot)
|
|
|
|
|
// {
|
|
|
|
|
// var task = progressQueue.GetItems().OfType<ImportUsersTask>().FirstOrDefault(t => (int)t.Id == TenantProvider.CurrentTenantID);
|
|
|
|
|
// if (task == null) return null;
|
|
|
|
|
|
|
|
|
|
// return new
|
|
|
|
|
// {
|
|
|
|
|
// Completed = task.IsCompleted,
|
|
|
|
|
// Percents = (int)task.Percentage,
|
|
|
|
|
// UserCounter = task.GetUserCounter,
|
|
|
|
|
// Status = (int)task.Status,
|
|
|
|
|
// Error = (string)task.Error,
|
|
|
|
|
// task.Data
|
|
|
|
|
// };
|
|
|
|
|
// }
|
|
|
|
|
//}
|
|
|
|
|
}
|