contract CoblicAccessControl {
	/**
	 *		- The Admin: The admin can reassign other roles and change the addresses of Coblic's smart contracts.
	 *			It is also the only role that can unpause the smart contract, and is initially set to the address
	 *			that created the smart contract in the CoblicToken constructor.
	 *
	 *		- The System: The System can call burn function
	 *
	 */

	// The addresses of the accounts (or contracts) that can execute actions within each roles.
	address public adminAddress;
	address public systemAddress;
	address public ceoAddress;

	/// @dev Access modifier for Admin-only functionality
	modifier onlyAdmin() {
		require(msg.sender == adminAddress);
		_;
	}

	// @dev Access modifier for CEO-only functionality
	modifier onlyCEO() {
		require(msg.sender == ceoAddress || msg.sender == adminAddress);
		_;
	}

	/// @dev Access modifier for System-only functionality
	modifier onlySystem() {
		require(msg.sender == systemAddress || msg.sender == adminAddress);
		_;
	}

	/// @dev Assigns a new address to act as the Admin. Only available to the current Admin.
	/// @param _newAdminAddress The address of the new Admin
	function setAdmin(address _newAdminAddress) public onlyAdmin {
		require(_newAdminAddress != address(0));

		adminAddress = _newAdminAddress;
	}

	/// @dev Assigns a new address to act as the System. Only available to the current Admin.
	/// @param _newSystemAddress The address of the new System
	function setSystem(address _newSystemAddress) public onlySystem {
		require(_newSystemAddress != address(0));

		systemAddress = _newSystemAddress;
	}

	/// @dev Assigns a new address to act as the CEO. Only available to the current CEO.
	/// @param _newCEOAddress The address of the new CEO
	function setCEO(address _newCEOAddress) public onlyCEO {
		require(_newCEOAddress != address(0));

		ceoAddress = _newCEOAddress;
	}
}
function setSystem(address _newSystemAddress) public onlySystem {
	require(_newSystemAddress != address(0));

	systemAddress = _newSystemAddress;
}

/// @dev Assigns a new address to act as the System. Only available to the current Admin.
/// @param _newSystemAddress The address of the new System