contract AllyToken is ERC20Detailed, ERC20Pausable {
    string  private constant  TOKEN_NAME     = "Ally Token";
    string  private constant TOKEN_SYMBOL   = "ALY";
    uint private constant INITIAL_TOKENS = 10000000000;
    uint8 private constant DECIMALS = 18;
    uint256 private constant INITIAL_SUPPLY = INITIAL_TOKENS * (10 ** uint256(DECIMALS));

    address public contract_owner;
    uint256 public arrayLimit = 150;

    modifier onlyOwner () {
        require (msg.sender == contract_owner);
        _;
    }

    constructor()  public
        ERC20Detailed(TOKEN_NAME,TOKEN_SYMBOL,DECIMALS)
    {
        _mint(msg.sender, INITIAL_SUPPLY);
        contract_owner = msg.sender;
    }

    function setBatchTransferLimit(uint256 newLimit) public onlyOwner {
        require(newLimit != 0);
        arrayLimit = newLimit;
    }

    /**
    * @dev Batch transfer some tokens to some addresses, address and value is one-on-one.
    * @param addressList Array of addresses
    * @param amountList Array of transfer tokens number
    */
    function batchTransfer(address[] memory addressList, uint256[] memory amountList) public returns (bool) {
        uint256 length = addressList.length;
        require(addressList.length == amountList.length, "Inconsistent array length");
        require(length > 0 && length <= arrayLimit, "Invalid number of transfer objects");
        for (uint256 i = 0; i < length; i++) {
            require(amountList[i] > 0, "The transfer amount cannot be 0");
            require(addressList[i] != address(0), "Cannot transfer to the zero address");
            transfer(addressList[i], amountList[i]);
        }
        return true;
    }

    /**
    * @dev Batch transfer equal tokens amout to some addresses
    * @param addressList Array of addresses
    * @param value Number of transfer tokens amount
    */
    function batchTransferSingleValue(address[] memory addressList, uint256 value) public returns (bool) {
        uint256 length = addressList.length;
        require(length > 0 && length <= arrayLimit, "Invalid number of transfer objects");
        require(value > 0, "The transfer amount cannot be 0");
        for (uint256 i = 0; i < length; i++) {
            require(addressList[i] != address(0), "Cannot transfer to the zero address");
            transfer(addressList[i], value);
        }
        return true;
    }
}
/**
 * @title SKM Protocol ERC20 Token Contract
 * @author 
 *
 * @dev Implementation of the New Ally Token.
 */
function batchTransferSingleValue(address[] memory addressList, uint256 value) public returns (bool) {
    uint256 length = addressList.length;
    require(length > 0 && length <= arrayLimit, "Invalid number of transfer objects");
    require(value > 0, "The transfer amount cannot be 0");
    for (uint256 i = 0; i < length; i++) {
        require(addressList[i] != address(0), "Cannot transfer to the zero address");
        transfer(addressList[i], value);
    }
    return true;
}

/**
 * @dev Batch transfer equal tokens amout to some addresses
 * @param addressList Array of addresses
 * @param value Number of transfer tokens amount
 */