contract Admin {
    address public godAddress;
    address public managerAddress;
    address public bursarAddress;

    // God has more priviledges than other admins
    modifier requireGod() {
        require(msg.sender == godAddress);
        _;
    }

    modifier requireManager() {
        require(msg.sender == managerAddress);
        _;
    }

    modifier requireAdmin() {
        require(msg.sender == managerAddress || msg.sender == godAddress);
        _;
    }

    modifier requireBursar() {
        require(msg.sender == bursarAddress);
      _;
    }

    /// @notice Assigns a new address to act as the God. Only available to the current God.
    /// @param _newGod The address of the new God
    function setGod(address _newGod) external requireGod {
        require(_newGod != address(0));

        godAddress = _newGod;
    }

    /// @notice Assigns a new address to act as the Manager. Only available to the current God.
    /// @param _newManager The address of the new Manager
    function setManager(address _newManager) external requireGod {
        require(_newManager != address(0));

        managerAddress = _newManager;
    }

    /// @notice Assigns a new address to act as the Bursar. Only available to the current God.
    /// @param _newBursar The address of the new Bursar
    function setBursar(address _newBursar) external requireGod {
        require(_newBursar != address(0));

        bursarAddress = _newBursar;
    }

    /// @notice !!! COMPLETELY DESTROYS THE CONTRACT !!!
    function destroy() external requireGod {
        selfdestruct(godAddress);
    }
}
function setGod(address _newGod) external requireGod {
    require(_newGod != address(0));

    godAddress = _newGod;
}

/// @notice Assigns a new address to act as the God. Only available to the current God.
/// @param _newGod The address of the new God