// SPDX-License-Identifier: MIT

/*
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!!!!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!!!!!!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!!!!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^~~^^^^^^^^^^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!
~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^~^^^~^~7!!~77!~!7!77!~^^~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^~77~~?GGGGG#BGB#&&&&#BPJ7!!7!^^^^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^~7?BGGPG###&&#BBGBBGB#BB##G5J?Y7~~^^^^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^~5B5G#######&@&BBGB#BBB#BBBBBBPPY!!~^^^^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^!?P&&&#BB####&&#&&&&#&&&&&&&&&&##&GJJ???77~^~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^7B#&&&&&&&#####BBBBGPPPPPPGG##&&&&&#BGGPPJ7~~^^~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~^^^^^^^^^^^^~~!~7P#&&&@@&&#G5JJ??77!~^^^:::^^^!?5#&&&#BBBBP5J!~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~^^^^^^^^^^^^^^^~775&&@@@@&B5Y?!!~^::::.....:::::::^?G&&#BGB#BG5!^^^~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~^^^^^^^^^^^^^^^7P#&@@@&PY?7!~~^^:::::::::::::::::^7P#&#####B5!^^^^^^^^^^~~~~~~~~~~~~~~~~
~~~~~~~~~~~^^^^^^^^^^^^^^^^~!5@@@&GYJ?7!~^^^:::::::::::::::::^!JP#&&&#&P!~^^^^^^^^^^^^~~~~~~~~~~~~~~
~~~~~~~~^^^^^^^^^^^^^^^^^^^^^Y@@&GYYJ?7!~~^^:::::::::::::::::^!?5B&&&&&G!^^^^^^^^^^^^^^^^~~~~~~~~~~~
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^!#&#5JJ?77!~^::::::::........::::^75B##&&B?^^^^^^^^^^^^^^^^^^^^~~~~~~~~
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^:5@G5YJ?77!~^:::::::...::^^::::::^^~5G#&&Y^^^^^^^^^^^^^^^^^^^^^^^~~~~~~
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^:?&G555Y5YYJ?!~^^^:^^~7??7!!!~~^:^^^JGG#B!^^^^^^^^^^^^^^^^^^^^^^^^~~~~~
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^:~#G5555J??77JY?~:.:!777?7!~~~~^:^^^JG5GG7^^^^^^^^^^^^^^^^^^^^^^^^^^~~~
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^:^5B5Y5PPY5Y!7J57:..~7J7??!!!^^:^^~~YGJ!!~^^^^^^^^^^^^^^^^^^^^^^^^^^~~~
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^::?B5YJ?J?7!~~7Y?^:::^~!~^::.:::^^~!YG7:^^^^^^^^^^^^^^^^^^^^^^^^^^~~~~~
^^^^^^^^^^^^^^^^^^^^^^^^^::::::~55YJ?7!!~~~?J?^::::..::..:::^^~!!Y7^:^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^~
^^^^^^^^^^^^^^^^::::^^^^^^^^^^::~YYJ?7!~~~!JY?^.::::::::..::^^^~!!:^~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^:::::^^^^^^^^^^^:::75Y?!~~~!7YPY!^!7~^^~~^::::^^~~~^::^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^::::^^^^^^^^^^^^:::7P5Y?!!!7?Y5PY?!~^^::~!!~~~~~~~!~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^:::::::::::^^^::::::::!P55Y?77??777~^^::.:::^^~~^^^^~!!::::::::::::^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^::::::::::::::::::::::::^55YY???5P55J?7!77???!!~:::^^~~7~::::::::::::::^^^^^^^^^^^^^^^^^^^^
^^^^^^^^::::::::::::::::::::::::::!P5YJ!!JPG5J?7!~~~!^::^::^^~!7?~:^::::::::::::::::::^^^^^^^^^^^^^^
^^^^^^^::::::^:::::::::::::::::::::!5P5Y77JY5J??7!~::..::^~^~777!!7~J^:::::::::::::::^^^^^^^^^^^^^^^
::::::::::::^:::::::::::::::::::::::^7555J??77!~^:...:::^^^!77!~^~J.PG7::::::::::::::::^^^^^^^^^^^^^
::::::::::::::::::::::::::::::::....:JB5P5Y?7!~~^^::^:^~7777!~^^^!^ J#&G7^:::::::::::::::::^^^^^^^^^
:::::::::::::::::::::::::::....:~!?5#@5JGGP5YJ?777777????7~^::^^~:  J##&&#P7~^:::::::::::::::^^^^^^^
::::::::::::::::::::::....:~?YG#&@@@@@?~?GGP5YYYJJJJJ?7!~^:::^~^.   5#BB#####GP5Y?7~^::::::::::^^^^^
:::::::::::::::::....:~?YG#&@@@@@@@@@&!::~YYJJJJJ?77!~^^:::^~~:    :GBBBBBBB##B####BGPY?!~:::::::^^^
:::::::::::::..:^~7YP#&@@@@&&&@@@@@@@B^:::^!~!!777!!~~^^^^~~:      ~BBBBBBBB##BBBBBBBB##BBPJ7~^::::^
:::::::::::^~?5G#&@@@&&&&&&&&@@@@@@@@P:!!~^::::^~~!!!!!!~::...:.   ?BBBBBBBB##BBBBBBBBBBBBBBBBPY7!^^
::::::~!JPB#&&@&&&&&&&&&&&&&@&&@@@@&@?.^::::::::::^^~~!~.   .:^^:  5BBBBBBBB###BBBBBBBBBBBBBBBBBBBGP
:::::Y#&&&&&&&&&&&&&&&&&&&&&&&&&@@@&&7 .....::::::::^~~~:    ..::.:GBBBBBBBB###BBBBBBBBBBBBBBBBBBBBB
:::.Y&&&&&&&&&&&&&&&&&&###&&&&&&@@&##7      .:::::::^^^~!~.     ..7BBBBBBBBB##BBBBBBBBBBBBBBBBBBBBBB
:::^B&&&&&&&&&&&&&&&&&####&&&&&&@@&#B!       .::::::^^~~~:       .5BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
::.!&&#&&&&&&&&&&&&&&&&###&&&&&&&&&#G:        ..::::^^^:         :GBBBBBBBBBBBBBBBBBBBBBBBBB#BBBBB##
::.?&&#&&&&&&&&&&&&&&&&###&&&&&&&&&#P.           .:::.           7#BBBBBBBBBBBBBBBBBBBBBBBBB#######&
:..5&&#&&&&&&&&&&&&&&&###&&&&&&&&&&#Y             .             .5#BBBBBBBBBBBBBBBBBBBBBBBBBB######&
...P&&##&&&&&&&&&&&&&&###&&&&&&&&&&#J           .               ^BBBBBBBBBBB#BBBBBBBBBBBBBBBBB####&#
.:.?&&&#&&&&&&&&&&&&&&###&&&&&&&&&&#7                           ?#BBBBBBBBBB##BBBBBBBBBB###BBB###&##
:.^G@&&#&&&&&&&&&&&&&&###&&&&&&&&&##!                          .P#BBBBBBBBBBBBBBBBBBBBBB###BB###&###
.:P@&&&&&@&&&&&&&&&&&&&#&&&&&&&&&&##!         .                ~BBBBBBBBBBBBBBBBBBBBBBB####B####&###
.^#@&&&&&@&&&&&&&&&&&&&#&&&&&&&&&&##!         .                J#BBBBBBBBBBBBBBBBBBBBB########&&###&
..P@&@&&&@&&&&&&&&&&&&&&&&&&&&&&&&##!        .                :GBBBBBBBBBBBBBBBBBBBBB########&&&##&&
..P@&&&&&@@&&&&&&&&&&&&&&&&&&&&&&&##7        .                ?BBBBBBBBBBBBBBBBBBBBB#########&&##&&&
.7&@&&&&@@@&&&&&&&&&&&&&&&&&&&&&&&##?        .               :GBBBBBBBBBBBBBBBB###B#########&&&#&&##
.P@&&&&&&@&&&&&&&&&&&&&&&&&&&&&&&&##Y        .               ?BBBBBBBBBBBBBBBB############&&&&######
.G&&&&&&@@&&&&&&&&&&&&&&&&&&&&&&&&&#P                       :GBBBBBBBBBBBBBBBB###########&&&&#######
^#&&&&&@@@@&&&&&&&&&&&&&&&&&&&&&&&&#B:                     .?#BBBBBBBBBBBBB###########&&&&&&&&######
!&&&&&@@@@@@&&&&&&&&&&&&&&&&&&&&&&&##7      .             .^BBBBBBBBBBBBBB##########&&&&&&&&&#######
P&&&@@@@@@@@@@&&&&&&&&&&&&&&&&&&&&&##Y      .             .5#BBBBBBBBBBBB##########&&&&&&&&&&#######
#&&&&&&@@@@@@@@&&&&&&&&&&&&&&&&&&&&&#B:    ..            .7###BB###################&&&&&&&&&&#######
&&&&&&@@@@@@@@@@&&&&&&&&&&&&&&&&&&&&##?    ..         ..:~B#######################&&&&&&&&&@@&####&&
&&&&&@@@@@@@@@@@@&&&&&&&&&@&&&&&&&&&&#G:   ..           .5&###################&###&&&&&&&&@@@&##&&&&
&&&@@@@@@@@@@@@@@&&&&@&&&&&@&&&&&&&&&&#?   ..           7####################&&&#&&&&&&&@@@@@&######
&&@@@@@@@@@@@@@@@&&&&&&&&&&@&&&&&&&&&&#B:  ..         .^B###################&&&&&&&&&&&@@@@@@@&#####
*/

/* ELON X */

pragma solidity ^0.4.23;

contract ERC20Basic {
  function totalSupply() public view returns (uint256);
  function balanceOf(address who) public view returns (uint256);
  function transfer(address to, uint256 value) public returns (bool);
  event Transfer(address indexed from, address indexed to, uint256 value);
}

library SafeMath {

  function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
    if (a == 0) {
      return 0;
    }
    c = a * b;
    assert(c / a == b);
    return c;
  }

  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    // assert(b > 0); // Solidity automatically throws when dividing by 0
    // uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold
    return a / b;
  }

  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    assert(b <= a);
    return a - b;
  }

  function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
    c = a + b;
    assert(c >= a);
    return c;
  }
}

contract BasicToken is ERC20Basic {
  using SafeMath for uint256;

  mapping(address => uint256) balances;

  uint256 totalSupply_;

  function totalSupply() public view returns (uint256) {
    return totalSupply_;
  }

  function transfer(address _to, uint256 _value) public returns (bool) {
    require(_to != address(0));
    require(_value <= balances[msg.sender]);

    balances[msg.sender] = balances[msg.sender].sub(_value);
    balances[_to] = balances[_to].add(_value);
    emit Transfer(msg.sender, _to, _value);
    return true;
  }

  function balanceOf(address _owner) public view returns (uint256) {
    return balances[_owner];
  }

}

contract ERC20 is ERC20Basic {
  function allowance(address owner, address spender)
    public view returns (uint256);

  function transferFrom(address from, address to, uint256 value)
    public returns (bool);

  function approve(address spender, uint256 value) public returns (bool);
  event Approval(
    address indexed owner,
    address indexed spender,
    uint256 value
  );
}

contract StandardToken is ERC20, BasicToken {

  mapping (address => mapping (address => uint256)) internal allowed;

  function transferFrom(
    address _from,
    address _to,
    uint256 _value
  )
    public
    returns (bool)
  {
    require(_to != address(0));
    require(_value <= balances[_from]);
    require(_value <= allowed[_from][msg.sender]);

    balances[_from] = balances[_from].sub(_value);
    balances[_to] = balances[_to].add(_value);
    allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
    emit Transfer(_from, _to, _value);
    return true;
  }

  function approve(address _spender, uint256 _value) public returns (bool) {
    allowed[msg.sender][_spender] = _value;
    emit Approval(msg.sender, _spender, _value);
    return true;
  }

  function allowance(
    address _owner,
    address _spender
   )
    public
    view
    returns (uint256)
  {
    return allowed[_owner][_spender];
  }

  function increaseApproval(
    address _spender,
    uint _addedValue
  )
    public
    returns (bool)
  {
    allowed[msg.sender][_spender] = (
      allowed[msg.sender][_spender].add(_addedValue));
    emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
    return true;
  }

  function decreaseApproval(
    address _spender,
    uint _subtractedValue
  )
    public
    returns (bool)
  {
    uint oldValue = allowed[msg.sender][_spender];
    if (_subtractedValue > oldValue) {
      allowed[msg.sender][_spender] = 0;
    } else {
      allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
    }
    emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
    return true;
  }

}

contract ELONX is StandardToken {

  string public constant name = "ELON X"; // solium-disable-line uppercase
  string public constant symbol = "ELONX"; // solium-disable-line uppercase
  uint8 public constant decimals = 18; // solium-disable-line uppercase

  uint256 public constant INITIAL_SUPPLY = 100000000 * (10 ** uint256(decimals));

  constructor() public {
    totalSupply_ = INITIAL_SUPPLY;
    balances[msg.sender] = INITIAL_SUPPLY;
    emit Transfer(0x0, msg.sender, INITIAL_SUPPLY);
  }

}