Bancor contract vulnerability: A critical bug in three recently deployed versions of the Bancor Network smart contract has led to a loss of user funds.
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 380 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Safe Transfer Fr... | 14535831 | 1110 days ago | IN | 0 ETH | 0.01044733 | ||||
Safe Transfer Fr... | 11491837 | 1583 days ago | IN | 0 ETH | 0.0113443 | ||||
Approve | 10509500 | 1734 days ago | IN | 0 ETH | 0.00156905 | ||||
Safe Transfer Fr... | 10324224 | 1762 days ago | IN | 0 ETH | 0.00156516 | ||||
Safe Transfer Fr... | 10322490 | 1763 days ago | IN | 0 ETH | 0.00156516 | ||||
Safe Transfer Fr... | 10319802 | 1763 days ago | IN | 0 ETH | 0.00280464 | ||||
Safe Transfer Fr... | 10315349 | 1764 days ago | IN | 0 ETH | 0.00172535 | ||||
Safe Transfer Fr... | 10311926 | 1764 days ago | IN | 0 ETH | 0.0013043 | ||||
Safe Transfer Fr... | 10311910 | 1764 days ago | IN | 0 ETH | 0.0013043 | ||||
Safe Transfer Fr... | 10311677 | 1764 days ago | IN | 0 ETH | 0.0013043 | ||||
Safe Transfer Fr... | 10311580 | 1764 days ago | IN | 0 ETH | 0.0013043 | ||||
Safe Transfer Fr... | 10311141 | 1764 days ago | IN | 0 ETH | 0.0013043 | ||||
Safe Transfer Fr... | 10311018 | 1764 days ago | IN | 0 ETH | 0.0016329 | ||||
Safe Transfer Fr... | 10310827 | 1765 days ago | IN | 0 ETH | 0.0016329 | ||||
Safe Transfer Fr... | 10310651 | 1765 days ago | IN | 0 ETH | 0.0013043 | ||||
Safe Transfer Fr... | 10310636 | 1765 days ago | IN | 0 ETH | 0.0013043 | ||||
Safe Transfer Fr... | 10307564 | 1765 days ago | IN | 0 ETH | 0.0027618 | ||||
Safe Transfer Fr... | 10302878 | 1766 days ago | IN | 0 ETH | 0.001579 | ||||
Safe Transfer Fr... | 10301753 | 1766 days ago | IN | 0 ETH | 0.00152685 | ||||
Safe Transfer Fr... | 10301011 | 1766 days ago | IN | 0 ETH | 0.0015881 | ||||
Safe Transfer Fr... | 10297043 | 1767 days ago | IN | 0 ETH | 0.00153832 | ||||
Safe Transfer Fr... | 10297041 | 1767 days ago | IN | 0 ETH | 0.00153832 | ||||
Safe Transfer Fr... | 10296647 | 1767 days ago | IN | 0 ETH | 0.0015881 | ||||
Safe Transfer Fr... | 10294205 | 1767 days ago | IN | 0 ETH | 0.0013043 | ||||
Safe Transfer Fr... | 10294043 | 1767 days ago | IN | 0 ETH | 0.0015881 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Method | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|---|
- | 10286668 | 1768 days ago | 0.0429 ETH | ||||
- | 10282757 | 1769 days ago | 1.997 ETH | ||||
- | 10282757 | 1769 days ago | 1.997 ETH | ||||
- | 10282631 | 1769 days ago | 0.15 ETH | ||||
- | 10282589 | 1769 days ago | 1 ETH | ||||
- | 10282538 | 1769 days ago | 0.5 ETH | ||||
- | 10282534 | 1769 days ago | 1 ETH | ||||
- | 10282530 | 1769 days ago | 1.62630325 ETH | ||||
- | 10282530 | 1769 days ago | 1.62630325 ETH | ||||
- | 10282523 | 1769 days ago | 1.76148727 ETH | ||||
- | 10282523 | 1769 days ago | 1.76148727 ETH | ||||
- | 10282521 | 1769 days ago | 2.42682198 ETH | ||||
- | 10282521 | 1769 days ago | 2.42682198 ETH | ||||
- | 10282520 | 1769 days ago | 2.17485372 ETH | ||||
- | 10282520 | 1769 days ago | 2.17485372 ETH | ||||
- | 10282481 | 1769 days ago | 2 ETH | ||||
- | 10282471 | 1769 days ago | 2 ETH | ||||
- | 10282467 | 1769 days ago | 0.1 ETH | ||||
- | 10282360 | 1769 days ago | 0.3 ETH | ||||
- | 10282283 | 1769 days ago | 0.3 ETH | ||||
- | 10282283 | 1769 days ago | 0.3 ETH | ||||
- | 10282270 | 1769 days ago | 1 ETH | ||||
- | 10282263 | 1769 days ago | 0.01 ETH | ||||
- | 10282255 | 1769 days ago | 0.5 ETH | ||||
- | 10282253 | 1769 days ago | 1.06974383 ETH |
Loading...
Loading
Contract Name:
BancorNetwork
Compiler Version
v0.4.26+commit.4563c3fc
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-06-16 */ // File: contracts/token/interfaces/IERC20Token.sol pragma solidity 0.4.26; /* ERC20 Standard Token interface */ contract IERC20Token { // these functions aren't abstract since the compiler emits automatically generated getter functions as external function name() public view returns (string) {this;} function symbol() public view returns (string) {this;} function decimals() public view returns (uint8) {this;} function totalSupply() public view returns (uint256) {this;} function balanceOf(address _owner) public view returns (uint256) {_owner; this;} function allowance(address _owner, address _spender) public view returns (uint256) {_owner; _spender; this;} function transfer(address _to, uint256 _value) public returns (bool success); function transferFrom(address _from, address _to, uint256 _value) public returns (bool success); function approve(address _spender, uint256 _value) public returns (bool success); } // File: contracts/IBancorNetwork.sol pragma solidity 0.4.26; /* Bancor Network interface */ contract IBancorNetwork { function convert2( IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _affiliateAccount, uint256 _affiliateFee ) public payable returns (uint256); function claimAndConvert2( IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _affiliateAccount, uint256 _affiliateFee ) public returns (uint256); function convertFor2( IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _for, address _affiliateAccount, uint256 _affiliateFee ) public payable returns (uint256); function claimAndConvertFor2( IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _for, address _affiliateAccount, uint256 _affiliateFee ) public returns (uint256); // deprecated, backward compatibility function convert( IERC20Token[] _path, uint256 _amount, uint256 _minReturn ) public payable returns (uint256); // deprecated, backward compatibility function claimAndConvert( IERC20Token[] _path, uint256 _amount, uint256 _minReturn ) public returns (uint256); // deprecated, backward compatibility function convertFor( IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _for ) public payable returns (uint256); // deprecated, backward compatibility function claimAndConvertFor( IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _for ) public returns (uint256); } // File: contracts/IConversionPathFinder.sol pragma solidity 0.4.26; /* Conversion Path Finder interface */ contract IConversionPathFinder { function findPath(address _sourceToken, address _targetToken) public view returns (address[] memory); } // File: contracts/utility/interfaces/IOwned.sol pragma solidity 0.4.26; /* Owned contract interface */ contract IOwned { // this function isn't abstract since the compiler emits automatically generated getter functions as external function owner() public view returns (address) {this;} function transferOwnership(address _newOwner) public; function acceptOwnership() public; } // File: contracts/utility/interfaces/ITokenHolder.sol pragma solidity 0.4.26; /* Token Holder interface */ contract ITokenHolder is IOwned { function withdrawTokens(IERC20Token _token, address _to, uint256 _amount) public; } // File: contracts/converter/interfaces/IConverterAnchor.sol pragma solidity 0.4.26; /* Converter Anchor interface */ contract IConverterAnchor is IOwned, ITokenHolder { } // File: contracts/utility/interfaces/IWhitelist.sol pragma solidity 0.4.26; /* Whitelist interface */ contract IWhitelist { function isWhitelisted(address _address) public view returns (bool); } // File: contracts/converter/interfaces/IConverter.sol pragma solidity 0.4.26; /* Converter interface */ contract IConverter is IOwned { function converterType() public pure returns (uint16); function anchor() public view returns (IConverterAnchor) {this;} function isActive() public view returns (bool); function rateAndFee(IERC20Token _sourceToken, IERC20Token _targetToken, uint256 _amount) public view returns (uint256, uint256); function convert(IERC20Token _sourceToken, IERC20Token _targetToken, uint256 _amount, address _trader, address _beneficiary) public payable returns (uint256); function conversionWhitelist() public view returns (IWhitelist) {this;} function conversionFee() public view returns (uint32) {this;} function maxConversionFee() public view returns (uint32) {this;} function reserveBalance(IERC20Token _reserveToken) public view returns (uint256); function() external payable; function transferAnchorOwnership(address _newOwner) public; function acceptAnchorOwnership() public; function setConversionFee(uint32 _conversionFee) public; function setConversionWhitelist(IWhitelist _whitelist) public; function withdrawTokens(IERC20Token _token, address _to, uint256 _amount) public; function withdrawETH(address _to) public; function addReserve(IERC20Token _token, uint32 _ratio) public; // deprecated, backward compatibility function token() public view returns (IConverterAnchor); function transferTokenOwnership(address _newOwner) public; function acceptTokenOwnership() public; function connectors(address _address) public view returns (uint256, uint32, bool, bool, bool); function getConnectorBalance(IERC20Token _connectorToken) public view returns (uint256); function connectorTokens(uint256 _index) public view returns (IERC20Token); function connectorTokenCount() public view returns (uint16); } // File: contracts/converter/interfaces/IBancorFormula.sol pragma solidity 0.4.26; /* Bancor Formula interface */ contract IBancorFormula { function purchaseRate(uint256 _supply, uint256 _reserveBalance, uint32 _reserveWeight, uint256 _amount) public view returns (uint256); function saleRate(uint256 _supply, uint256 _reserveBalance, uint32 _reserveWeight, uint256 _amount) public view returns (uint256); function crossReserveRate(uint256 _sourceReserveBalance, uint32 _sourceReserveWeight, uint256 _targetReserveBalance, uint32 _targetReserveWeight, uint256 _amount) public view returns (uint256); function fundCost(uint256 _supply, uint256 _reserveBalance, uint32 _reserveRatio, uint256 _amount) public view returns (uint256); function liquidateRate(uint256 _supply, uint256 _reserveBalance, uint32 _reserveRatio, uint256 _amount) public view returns (uint256); } // File: contracts/utility/Owned.sol pragma solidity 0.4.26; /** * @dev Provides support and utilities for contract ownership */ contract Owned is IOwned { address public owner; address public newOwner; /** * @dev triggered when the owner is updated * * @param _prevOwner previous owner * @param _newOwner new owner */ event OwnerUpdate(address indexed _prevOwner, address indexed _newOwner); /** * @dev initializes a new Owned instance */ constructor() public { owner = msg.sender; } // allows execution by the owner only modifier ownerOnly { _ownerOnly(); _; } // error message binary size optimization function _ownerOnly() internal view { require(msg.sender == owner, "ERR_ACCESS_DENIED"); } /** * @dev allows transferring the contract ownership * the new owner still needs to accept the transfer * can only be called by the contract owner * * @param _newOwner new contract owner */ function transferOwnership(address _newOwner) public ownerOnly { require(_newOwner != owner, "ERR_SAME_OWNER"); newOwner = _newOwner; } /** * @dev used by a new owner to accept an ownership transfer */ function acceptOwnership() public { require(msg.sender == newOwner, "ERR_ACCESS_DENIED"); emit OwnerUpdate(owner, newOwner); owner = newOwner; newOwner = address(0); } } // File: contracts/utility/Utils.sol pragma solidity 0.4.26; /** * @dev Utilities & Common Modifiers */ contract Utils { // verifies that a value is greater than zero modifier greaterThanZero(uint256 _value) { _greaterThanZero(_value); _; } // error message binary size optimization function _greaterThanZero(uint256 _value) internal pure { require(_value > 0, "ERR_ZERO_VALUE"); } // validates an address - currently only checks that it isn't null modifier validAddress(address _address) { _validAddress(_address); _; } // error message binary size optimization function _validAddress(address _address) internal pure { require(_address != address(0), "ERR_INVALID_ADDRESS"); } // verifies that the address is different than this contract address modifier notThis(address _address) { _notThis(_address); _; } // error message binary size optimization function _notThis(address _address) internal view { require(_address != address(this), "ERR_ADDRESS_IS_SELF"); } } // File: contracts/utility/interfaces/IContractRegistry.sol pragma solidity 0.4.26; /* Contract Registry interface */ contract IContractRegistry { function addressOf(bytes32 _contractName) public view returns (address); // deprecated, backward compatibility function getAddress(bytes32 _contractName) public view returns (address); } // File: contracts/utility/ContractRegistryClient.sol pragma solidity 0.4.26; /** * @dev Base contract for ContractRegistry clients */ contract ContractRegistryClient is Owned, Utils { bytes32 internal constant CONTRACT_REGISTRY = "ContractRegistry"; bytes32 internal constant BANCOR_NETWORK = "BancorNetwork"; bytes32 internal constant BANCOR_FORMULA = "BancorFormula"; bytes32 internal constant CONVERTER_FACTORY = "ConverterFactory"; bytes32 internal constant CONVERSION_PATH_FINDER = "ConversionPathFinder"; bytes32 internal constant CONVERTER_UPGRADER = "BancorConverterUpgrader"; bytes32 internal constant CONVERTER_REGISTRY = "BancorConverterRegistry"; bytes32 internal constant CONVERTER_REGISTRY_DATA = "BancorConverterRegistryData"; bytes32 internal constant BNT_TOKEN = "BNTToken"; bytes32 internal constant BANCOR_X = "BancorX"; bytes32 internal constant BANCOR_X_UPGRADER = "BancorXUpgrader"; IContractRegistry public registry; // address of the current contract-registry IContractRegistry public prevRegistry; // address of the previous contract-registry bool public onlyOwnerCanUpdateRegistry; // only an owner can update the contract-registry /** * @dev verifies that the caller is mapped to the given contract name * * @param _contractName contract name */ modifier only(bytes32 _contractName) { _only(_contractName); _; } // error message binary size optimization function _only(bytes32 _contractName) internal view { require(msg.sender == addressOf(_contractName), "ERR_ACCESS_DENIED"); } /** * @dev initializes a new ContractRegistryClient instance * * @param _registry address of a contract-registry contract */ constructor(IContractRegistry _registry) internal validAddress(_registry) { registry = IContractRegistry(_registry); prevRegistry = IContractRegistry(_registry); } /** * @dev updates to the new contract-registry */ function updateRegistry() public { // verify that this function is permitted require(msg.sender == owner || !onlyOwnerCanUpdateRegistry, "ERR_ACCESS_DENIED"); // get the new contract-registry IContractRegistry newRegistry = IContractRegistry(addressOf(CONTRACT_REGISTRY)); // verify that the new contract-registry is different and not zero require(newRegistry != address(registry) && newRegistry != address(0), "ERR_INVALID_REGISTRY"); // verify that the new contract-registry is pointing to a non-zero contract-registry require(newRegistry.addressOf(CONTRACT_REGISTRY) != address(0), "ERR_INVALID_REGISTRY"); // save a backup of the current contract-registry before replacing it prevRegistry = registry; // replace the current contract-registry with the new contract-registry registry = newRegistry; } /** * @dev restores the previous contract-registry */ function restoreRegistry() public ownerOnly { // restore the previous contract-registry registry = prevRegistry; } /** * @dev restricts the permission to update the contract-registry * * @param _onlyOwnerCanUpdateRegistry indicates whether or not permission is restricted to owner only */ function restrictRegistryUpdate(bool _onlyOwnerCanUpdateRegistry) public ownerOnly { // change the permission to update the contract-registry onlyOwnerCanUpdateRegistry = _onlyOwnerCanUpdateRegistry; } /** * @dev returns the address associated with the given contract name * * @param _contractName contract name * * @return contract address */ function addressOf(bytes32 _contractName) internal view returns (address) { return registry.addressOf(_contractName); } } // File: contracts/utility/ReentrancyGuard.sol pragma solidity 0.4.26; /** * @dev ReentrancyGuard * * The contract provides protection against re-entrancy - calling a function (directly or * indirectly) from within itself. */ contract ReentrancyGuard { // true while protected code is being executed, false otherwise bool private locked = false; /** * @dev ensures instantiation only by sub-contracts */ constructor() internal {} // protects a function against reentrancy attacks modifier protected() { _protected(); locked = true; _; locked = false; } // error message binary size optimization function _protected() internal view { require(!locked, "ERR_REENTRANCY"); } } // File: contracts/utility/TokenHandler.sol pragma solidity 0.4.26; contract TokenHandler { bytes4 private constant APPROVE_FUNC_SELECTOR = bytes4(keccak256("approve(address,uint256)")); bytes4 private constant TRANSFER_FUNC_SELECTOR = bytes4(keccak256("transfer(address,uint256)")); bytes4 private constant TRANSFER_FROM_FUNC_SELECTOR = bytes4(keccak256("transferFrom(address,address,uint256)")); /** * @dev executes the ERC20 token's `approve` function and reverts upon failure * the main purpose of this function is to prevent a non standard ERC20 token * from failing silently * * @param _token ERC20 token address * @param _spender approved address * @param _value allowance amount */ function safeApprove(IERC20Token _token, address _spender, uint256 _value) public { execute(_token, abi.encodeWithSelector(APPROVE_FUNC_SELECTOR, _spender, _value)); } /** * @dev executes the ERC20 token's `transfer` function and reverts upon failure * the main purpose of this function is to prevent a non standard ERC20 token * from failing silently * * @param _token ERC20 token address * @param _to target address * @param _value transfer amount */ function safeTransfer(IERC20Token _token, address _to, uint256 _value) public { execute(_token, abi.encodeWithSelector(TRANSFER_FUNC_SELECTOR, _to, _value)); } /** * @dev executes the ERC20 token's `transferFrom` function and reverts upon failure * the main purpose of this function is to prevent a non standard ERC20 token * from failing silently * * @param _token ERC20 token address * @param _from source address * @param _to target address * @param _value transfer amount */ function safeTransferFrom(IERC20Token _token, address _from, address _to, uint256 _value) public { execute(_token, abi.encodeWithSelector(TRANSFER_FROM_FUNC_SELECTOR, _from, _to, _value)); } /** * @dev executes a function on the ERC20 token and reverts upon failure * the main purpose of this function is to prevent a non standard ERC20 token * from failing silently * * @param _token ERC20 token address * @param _data data to pass in to the token's contract for execution */ function execute(IERC20Token _token, bytes memory _data) private { uint256[1] memory ret = [uint256(1)]; assembly { let success := call( gas, // gas remaining _token, // destination address 0, // no ether add(_data, 32), // input buffer (starts after the first 32 bytes in the `data` array) mload(_data), // input length (loaded from the first 32 bytes in the `data` array) ret, // output buffer 32 // output length ) if iszero(success) { revert(0, 0) } } require(ret[0] != 0, "ERR_TRANSFER_FAILED"); } } // File: contracts/utility/TokenHolder.sol pragma solidity 0.4.26; /** * @dev We consider every contract to be a 'token holder' since it's currently not possible * for a contract to deny receiving tokens. * * The TokenHolder's contract sole purpose is to provide a safety mechanism that allows * the owner to send tokens that were sent to the contract by mistake back to their sender. * * Note that we use the non standard ERC-20 interface which has no return value for transfer * in order to support both non standard as well as standard token contracts. * see https://github.com/ethereum/solidity/issues/4116 */ contract TokenHolder is ITokenHolder, TokenHandler, Owned, Utils { /** * @dev withdraws tokens held by the contract and sends them to an account * can only be called by the owner * * @param _token ERC20 token contract address * @param _to account to receive the new amount * @param _amount amount to withdraw */ function withdrawTokens(IERC20Token _token, address _to, uint256 _amount) public ownerOnly validAddress(_token) validAddress(_to) notThis(_to) { safeTransfer(_token, _to, _amount); } } // File: contracts/utility/SafeMath.sol pragma solidity 0.4.26; /** * @dev Library for basic math operations with overflow/underflow protection */ library SafeMath { /** * @dev returns the sum of _x and _y, reverts if the calculation overflows * * @param _x value 1 * @param _y value 2 * * @return sum */ function add(uint256 _x, uint256 _y) internal pure returns (uint256) { uint256 z = _x + _y; require(z >= _x, "ERR_OVERFLOW"); return z; } /** * @dev returns the difference of _x minus _y, reverts if the calculation underflows * * @param _x minuend * @param _y subtrahend * * @return difference */ function sub(uint256 _x, uint256 _y) internal pure returns (uint256) { require(_x >= _y, "ERR_UNDERFLOW"); return _x - _y; } /** * @dev returns the product of multiplying _x by _y, reverts if the calculation overflows * * @param _x factor 1 * @param _y factor 2 * * @return product */ function mul(uint256 _x, uint256 _y) internal pure returns (uint256) { // gas optimization if (_x == 0) return 0; uint256 z = _x * _y; require(z / _x == _y, "ERR_OVERFLOW"); return z; } /** * @dev Integer division of two numbers truncating the quotient, reverts on division by zero. * * @param _x dividend * @param _y divisor * * @return quotient */ function div(uint256 _x, uint256 _y) internal pure returns (uint256) { require(_y > 0, "ERR_DIVIDE_BY_ZERO"); uint256 c = _x / _y; return c; } } // File: contracts/token/interfaces/IEtherToken.sol pragma solidity 0.4.26; /* Ether Token interface */ contract IEtherToken is IERC20Token { function deposit() public payable; function withdraw(uint256 _amount) public; function depositTo(address _to) public payable; function withdrawTo(address _to, uint256 _amount) public; } // File: contracts/token/interfaces/ISmartToken.sol pragma solidity 0.4.26; /* Smart Token interface */ contract ISmartToken is IConverterAnchor, IERC20Token { function disableTransfers(bool _disable) public; function issue(address _to, uint256 _amount) public; function destroy(address _from, uint256 _amount) public; } // File: contracts/bancorx/interfaces/IBancorX.sol pragma solidity 0.4.26; contract IBancorX { function token() public view returns (IERC20Token) {this;} function xTransfer(bytes32 _toBlockchain, bytes32 _to, uint256 _amount, uint256 _id) public; function getXTransferAmount(uint256 _xTransferId, address _for) public view returns (uint256); } // File: contracts/BancorNetwork.sol pragma solidity 0.4.26; // interface of older converters for backward compatibility contract ILegacyConverter { function change(IERC20Token _sourceToken, IERC20Token _targetToken, uint256 _amount, uint256 _minReturn) public returns (uint256); } /** * @dev The BancorNetwork contract is the main entry point for Bancor token conversions. * It also allows for the conversion of any token in the Bancor Network to any other token in a single * transaction by providing a conversion path. * * A note on Conversion Path: Conversion path is a data structure that is used when converting a token * to another token in the Bancor Network, when the conversion cannot necessarily be done by a single * converter and might require multiple 'hops'. * The path defines which converters should be used and what kind of conversion should be done in each step. * * The path format doesn't include complex structure; instead, it is represented by a single array * in which each 'hop' is represented by a 2-tuple - converter anchor & target token. * In addition, the first element is always the source token. * The converter anchor is only used as a pointer to a converter (since converter addresses are more * likely to change as opposed to anchor addresses). * * Format: * [source token, converter anchor, target token, converter anchor, target token...] */ contract BancorNetwork is IBancorNetwork, TokenHolder, ContractRegistryClient, ReentrancyGuard { using SafeMath for uint256; uint256 private constant CONVERSION_FEE_RESOLUTION = 1000000; uint256 private constant AFFILIATE_FEE_RESOLUTION = 1000000; address private constant ETH_RESERVE_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; struct ConversionStep { IConverter converter; IConverterAnchor anchor; IERC20Token sourceToken; IERC20Token targetToken; address beneficiary; bool isV28OrHigherConverter; bool processAffiliateFee; } uint256 public maxAffiliateFee = 30000; // maximum affiliate-fee mapping (address => bool) public etherTokens; // list of all supported ether tokens /** * @dev triggered when a conversion between two tokens occurs * * @param _smartToken anchor governed by the converter * @param _fromToken source ERC20 token * @param _toToken target ERC20 token * @param _fromAmount amount converted, in the source token * @param _toAmount amount returned, minus conversion fee * @param _trader wallet that initiated the trade */ event Conversion( address indexed _smartToken, address indexed _fromToken, address indexed _toToken, uint256 _fromAmount, uint256 _toAmount, address _trader ); /** * @dev initializes a new BancorNetwork instance * * @param _registry address of a contract registry contract */ constructor(IContractRegistry _registry) ContractRegistryClient(_registry) public { etherTokens[ETH_RESERVE_ADDRESS] = true; } /** * @dev allows the owner to update the maximum affiliate-fee * * @param _maxAffiliateFee maximum affiliate-fee */ function setMaxAffiliateFee(uint256 _maxAffiliateFee) public ownerOnly { require(_maxAffiliateFee <= AFFILIATE_FEE_RESOLUTION, "ERR_INVALID_AFFILIATE_FEE"); maxAffiliateFee = _maxAffiliateFee; } /** * @dev allows the owner to register/unregister ether tokens * * @param _token ether token contract address * @param _register true to register, false to unregister */ function registerEtherToken(IEtherToken _token, bool _register) public ownerOnly validAddress(_token) notThis(_token) { etherTokens[_token] = _register; } /** * @dev returns the conversion path between two tokens in the network * note that this method is quite expensive in terms of gas and should generally be called off-chain * * @param _sourceToken source token address * @param _targetToken target token address * * @return conversion path between the two tokens */ function conversionPath(IERC20Token _sourceToken, IERC20Token _targetToken) public view returns (address[]) { IConversionPathFinder pathFinder = IConversionPathFinder(addressOf(CONVERSION_PATH_FINDER)); return pathFinder.findPath(_sourceToken, _targetToken); } /** * @dev returns the expected rate of converting a given amount on a given path * note that there is no support for circular paths * * @param _path conversion path (see conversion path format above) * @param _amount amount of _path[0] tokens received from the sender * * @return expected rate */ function rateByPath(IERC20Token[] _path, uint256 _amount) public view returns (uint256) { uint256 amount; uint256 fee; uint256 supply; uint256 balance; uint32 weight; IConverter converter; IBancorFormula formula = IBancorFormula(addressOf(BANCOR_FORMULA)); amount = _amount; // verify that the number of elements is larger than 2 and odd require(_path.length > 2 && _path.length % 2 == 1, "ERR_INVALID_PATH"); // iterate over the conversion path for (uint256 i = 2; i < _path.length; i += 2) { IERC20Token sourceToken = _path[i - 2]; IERC20Token anchor = _path[i - 1]; IERC20Token targetToken = _path[i]; // backward compatibility if (etherTokens[sourceToken]) sourceToken = IERC20Token(ETH_RESERVE_ADDRESS); if (etherTokens[targetToken]) targetToken = IERC20Token(ETH_RESERVE_ADDRESS); if (targetToken == anchor) { // buy the smart token // check if the current smart token has changed if (i < 3 || anchor != _path[i - 3]) { supply = ISmartToken(anchor).totalSupply(); converter = IConverter(IConverterAnchor(anchor).owner()); } // get the amount & the conversion fee balance = converter.getConnectorBalance(sourceToken); (, weight, , , ) = converter.connectors(sourceToken); amount = formula.purchaseRate(supply, balance, weight, amount); fee = amount.mul(converter.conversionFee()).div(CONVERSION_FEE_RESOLUTION); amount -= fee; // update the smart token supply for the next iteration supply = supply.add(amount); } else if (sourceToken == anchor) { // sell the smart token // check if the current smart token has changed if (i < 3 || anchor != _path[i - 3]) { supply = ISmartToken(anchor).totalSupply(); converter = IConverter(IConverterAnchor(anchor).owner()); } // get the amount & the conversion fee balance = converter.getConnectorBalance(targetToken); (, weight, , , ) = converter.connectors(targetToken); amount = formula.saleRate(supply, balance, weight, amount); fee = amount.mul(converter.conversionFee()).div(CONVERSION_FEE_RESOLUTION); amount -= fee; // update the smart token supply for the next iteration supply = supply.sub(amount); } else { // cross reserve conversion // check if the current smart token has changed if (i < 3 || anchor != _path[i - 3]) { converter = IConverter(IConverterAnchor(anchor).owner()); } (amount, fee) = getReturn(converter, sourceToken, targetToken, amount); } } return amount; } /** * @dev converts the token to any other token in the bancor network by following * a predefined conversion path and transfers the result tokens to a target account * affiliate account/fee can also be passed in to receive a conversion fee (on top of the liquidity provider fees) * note that the network should already have been given allowance of the source token (if not ETH) * * @param _path conversion path, see conversion path format above * @param _amount amount to convert from, in the source token * @param _minReturn if the conversion results in an amount smaller than the minimum return - it is cancelled, must be greater than zero * @param _beneficiary account that will receive the conversion result or 0x0 to send the result to the sender account * @param _affiliateAccount wallet address to receive the affiliate fee or 0x0 to disable affiliate fee * @param _affiliateFee affiliate fee in PPM or 0 to disable affiliate fee * * @return amount of tokens received from the conversion */ function convertByPath(IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _beneficiary, address _affiliateAccount, uint256 _affiliateFee) public payable protected greaterThanZero(_minReturn) returns (uint256) { // verify that the path contrains at least a single 'hop' and that the number of elements is odd require(_path.length > 2 && _path.length % 2 == 1, "ERR_INVALID_PATH"); // validate msg.value and prepare the source token for the conversion handleSourceToken(_path[0], IConverterAnchor(_path[1]), _amount); // check if affiliate fee is enabled bool affiliateFeeEnabled = false; if (address(_affiliateAccount) == 0) { require(_affiliateFee == 0, "ERR_INVALID_AFFILIATE_FEE"); } else { require(0 < _affiliateFee && _affiliateFee <= maxAffiliateFee, "ERR_INVALID_AFFILIATE_FEE"); affiliateFeeEnabled = true; } // check if beneficiary is set address beneficiary = msg.sender; if (_beneficiary != address(0)) beneficiary = _beneficiary; // convert and get the resulting amount ConversionStep[] memory data = createConversionData(_path, beneficiary, affiliateFeeEnabled); uint256 amount = doConversion(data, _amount, _minReturn, _affiliateAccount, _affiliateFee); // handle the conversion target tokens handleTargetToken(data, amount, beneficiary); return amount; } /** * @dev converts any other token to BNT in the bancor network by following a predefined conversion path and transfers the result to an account on a different blockchain * note that the network should already have been given allowance of the source token (if not ETH) * * @param _path conversion path, see conversion path format above * @param _amount amount to convert from, in the source token * @param _minReturn if the conversion results in an amount smaller than the minimum return - it is cancelled, must be greater than zero * @param _targetBlockchain blockchain BNT will be issued on * @param _targetAccount address/account on the target blockchain to send the BNT to * @param _conversionId pre-determined unique (if non zero) id which refers to this transaction * * @return the amount of BNT received from this conversion */ function xConvert( IERC20Token[] _path, uint256 _amount, uint256 _minReturn, bytes32 _targetBlockchain, bytes32 _targetAccount, uint256 _conversionId ) public payable returns (uint256) { return xConvert2(_path, _amount, _minReturn, _targetBlockchain, _targetAccount, _conversionId, address(0), 0); } /** * @dev converts any other token to BNT in the bancor network by following a predefined conversion path and transfers the result to an account on a different blockchain * note that the network should already have been given allowance of the source token (if not ETH) * * @param _path conversion path, see conversion path format above * @param _amount amount to convert from, in the source token * @param _minReturn if the conversion results in an amount smaller than the minimum return - it is cancelled, must be greater than zero * @param _targetBlockchain blockchain BNT will be issued on * @param _targetAccount address/account on the target blockchain to send the BNT to * @param _conversionId pre-determined unique (if non zero) id which refers to this transaction * @param _affiliateAccount affiliate account * @param _affiliateFee affiliate fee in PPM * * @return the amount of BNT received from this conversion */ function xConvert2( IERC20Token[] _path, uint256 _amount, uint256 _minReturn, bytes32 _targetBlockchain, bytes32 _targetAccount, uint256 _conversionId, address _affiliateAccount, uint256 _affiliateFee ) public payable greaterThanZero(_minReturn) returns (uint256) { IERC20Token targetToken = _path[_path.length - 1]; IBancorX bancorX = IBancorX(addressOf(BANCOR_X)); // verify that the destination token is BNT require(targetToken == addressOf(BNT_TOKEN), "ERR_INVALID_TARGET_TOKEN"); // convert and get the resulting amount uint256 amount = convertByPath(_path, _amount, _minReturn, this, _affiliateAccount, _affiliateFee); // grant BancorX allowance ensureAllowance(targetToken, bancorX, amount); // transfer the resulting amount to BancorX bancorX.xTransfer(_targetBlockchain, _targetAccount, amount, _conversionId); return amount; } /** * @dev allows a user to convert a token that was sent from another blockchain into any other * token on the BancorNetwork * ideally this transaction is created before the previous conversion is even complete, so * so the input amount isn't known at that point - the amount is actually take from the * BancorX contract directly by specifying the conversion id * * @param _path conversion path * @param _bancorX address of the BancorX contract for the source token * @param _conversionId pre-determined unique (if non zero) id which refers to this conversion * @param _minReturn if the conversion results in an amount smaller than the minimum return - it is cancelled, must be nonzero * @param _beneficiary wallet to receive the conversion result * * @return amount of tokens received from the conversion */ function completeXConversion(IERC20Token[] _path, IBancorX _bancorX, uint256 _conversionId, uint256 _minReturn, address _beneficiary) public returns (uint256) { // verify that the source token is the BancorX token require(_path[0] == _bancorX.token(), "ERR_INVALID_SOURCE_TOKEN"); // get conversion amount from BancorX contract uint256 amount = _bancorX.getXTransferAmount(_conversionId, msg.sender); // perform the conversion return convertByPath(_path, amount, _minReturn, _beneficiary, address(0), 0); } /** * @dev executes the actual conversion by following the conversion path * * @param _data conversion data, see ConversionStep struct above * @param _amount amount to convert from, in the source token * @param _minReturn if the conversion results in an amount smaller than the minimum return - it is cancelled, must be greater than zero * @param _affiliateAccount affiliate account * @param _affiliateFee affiliate fee in PPM * * @return amount of tokens received from the conversion */ function doConversion( ConversionStep[] _data, uint256 _amount, uint256 _minReturn, address _affiliateAccount, uint256 _affiliateFee ) private returns (uint256) { uint256 toAmount; uint256 fromAmount = _amount; // iterate over the conversion data for (uint256 i = 0; i < _data.length; i++) { ConversionStep memory stepData = _data[i]; // newer converter if (stepData.isV28OrHigherConverter) { // transfer the tokens to the converter only if the network contract currently holds the tokens // not needed with ETH or if it's the first conversion step if (i != 0 && _data[i - 1].beneficiary == address(this) && !etherTokens[stepData.sourceToken]) safeTransfer(stepData.sourceToken, stepData.converter, fromAmount); } // older converter // if the source token is the smart token, no need to do any transfers as the converter controls it else if (stepData.sourceToken != ISmartToken(stepData.anchor)) { // grant allowance for it to transfer the tokens from the network contract ensureAllowance(stepData.sourceToken, stepData.converter, fromAmount); } // do the conversion if (!stepData.isV28OrHigherConverter) toAmount = ILegacyConverter(stepData.converter).change(stepData.sourceToken, stepData.targetToken, fromAmount, 1); else if (etherTokens[stepData.sourceToken]) toAmount = stepData.converter.convert.value(msg.value)(stepData.sourceToken, stepData.targetToken, fromAmount, msg.sender, stepData.beneficiary); else toAmount = stepData.converter.convert(stepData.sourceToken, stepData.targetToken, fromAmount, msg.sender, stepData.beneficiary); // pay affiliate-fee if needed if (stepData.processAffiliateFee) { uint256 affiliateAmount = toAmount.mul(_affiliateFee).div(AFFILIATE_FEE_RESOLUTION); require(stepData.targetToken.transfer(_affiliateAccount, affiliateAmount), "ERR_FEE_TRANSFER_FAILED"); toAmount -= affiliateAmount; } emit Conversion(stepData.anchor, stepData.sourceToken, stepData.targetToken, fromAmount, toAmount, msg.sender); fromAmount = toAmount; } // ensure the trade meets the minimum requested amount require(toAmount >= _minReturn, "ERR_RETURN_TOO_LOW"); return toAmount; } /** * @dev validates msg.value and prepares the conversion source token for the conversion * * @param _sourceToken source token of the first conversion step * @param _anchor converter anchor of the first conversion step * @param _amount amount to convert from, in the source token */ function handleSourceToken(IERC20Token _sourceToken, IConverterAnchor _anchor, uint256 _amount) private { IConverter firstConverter = IConverter(_anchor.owner()); bool isNewerConverter = isV28OrHigherConverter(firstConverter); // ETH if (msg.value > 0) { // validate msg.value require(msg.value == _amount, "ERR_ETH_AMOUNT_MISMATCH"); // EtherToken converter - deposit the ETH into the EtherToken // note that it can still be a non ETH converter if the path is wrong // but such conversion will simply revert if (!isNewerConverter) IEtherToken(getConverterEtherTokenAddress(firstConverter)).deposit.value(msg.value)(); } // EtherToken else if (etherTokens[_sourceToken]) { // claim the tokens - if the source token is ETH reserve, this call will fail // since in that case the transaction must be sent with msg.value safeTransferFrom(_sourceToken, msg.sender, this, _amount); // ETH converter - withdraw the ETH if (isNewerConverter) IEtherToken(_sourceToken).withdraw(_amount); } // other ERC20 token else { // newer converter - transfer the tokens from the sender directly to the converter // otherwise claim the tokens if (isNewerConverter) safeTransferFrom(_sourceToken, msg.sender, firstConverter, _amount); else safeTransferFrom(_sourceToken, msg.sender, this, _amount); } } /** * @dev handles the conversion target token if the network still holds it at the end of the conversion * * @param _data conversion data, see ConversionStep struct above * @param _amount conversion return amount, in the target token * @param _beneficiary wallet to receive the conversion result */ function handleTargetToken(ConversionStep[] _data, uint256 _amount, address _beneficiary) private { ConversionStep memory stepData = _data[_data.length - 1]; // network contract doesn't hold the tokens, do nothing if (stepData.beneficiary != address(this)) return; IERC20Token targetToken = stepData.targetToken; // ETH / EtherToken if (etherTokens[targetToken]) { // newer converter should send ETH directly to the beneficiary assert(!stepData.isV28OrHigherConverter); // EtherToken converter - withdraw the ETH and transfer to the beneficiary IEtherToken(targetToken).withdrawTo(_beneficiary, _amount); } // other ERC20 token else { safeTransfer(targetToken, _beneficiary, _amount); } } /** * @dev creates a memory cache of all conversion steps data to minimize logic and external calls during conversions * * @param _conversionPath conversion path, see conversion path format above * @param _beneficiary wallet to receive the conversion result * @param _affiliateFeeEnabled true if affiliate fee was requested by the sender, false if not * * @return cached conversion data to be ingested later on by the conversion flow */ function createConversionData(IERC20Token[] _conversionPath, address _beneficiary, bool _affiliateFeeEnabled) private view returns (ConversionStep[]) { ConversionStep[] memory data = new ConversionStep[](_conversionPath.length / 2); bool affiliateFeeProcessed = false; address bntToken = addressOf(BNT_TOKEN); // iterate the conversion path and create the conversion data for each step uint256 i; for (i = 0; i < _conversionPath.length - 1; i += 2) { IConverterAnchor anchor = IConverterAnchor(_conversionPath[i + 1]); IConverter converter = IConverter(anchor.owner()); IERC20Token targetToken = _conversionPath[i + 2]; // check if the affiliate fee should be processed in this step bool processAffiliateFee = _affiliateFeeEnabled && !affiliateFeeProcessed && targetToken == bntToken; if (processAffiliateFee) affiliateFeeProcessed = true; data[i / 2] = ConversionStep({ // set the converter anchor anchor: anchor, // set the converter converter: converter, // set the source/target tokens sourceToken: _conversionPath[i], targetToken: targetToken, // requires knowledge about the next step, so initialize in the next phase beneficiary: address(0), // set flags isV28OrHigherConverter: isV28OrHigherConverter(converter), processAffiliateFee: processAffiliateFee }); } // ETH support // source is ETH ConversionStep memory stepData = data[0]; if (etherTokens[stepData.sourceToken]) { // newer converter - replace the source token address with ETH reserve address if (stepData.isV28OrHigherConverter) stepData.sourceToken = IERC20Token(ETH_RESERVE_ADDRESS); // older converter - replace the source token with the EtherToken address used by the converter else stepData.sourceToken = IERC20Token(getConverterEtherTokenAddress(stepData.converter)); } // target is ETH stepData = data[data.length - 1]; if (etherTokens[stepData.targetToken]) { // newer converter - replace the target token address with ETH reserve address if (stepData.isV28OrHigherConverter) stepData.targetToken = IERC20Token(ETH_RESERVE_ADDRESS); // older converter - replace the target token with the EtherToken address used by the converter else stepData.targetToken = IERC20Token(getConverterEtherTokenAddress(stepData.converter)); } // set the beneficiary for each step for (i = 0; i < data.length; i++) { stepData = data[i]; // first check if the converter in this step is newer as older converters don't even support the beneficiary argument if (stepData.isV28OrHigherConverter) { // if affiliate fee is processed in this step, beneficiary is the network contract if (stepData.processAffiliateFee) stepData.beneficiary = this; // if it's the last step, beneficiary is the final beneficiary else if (i == data.length - 1) stepData.beneficiary = _beneficiary; // if the converter in the next step is newer, beneficiary is the next converter else if (data[i + 1].isV28OrHigherConverter) stepData.beneficiary = data[i + 1].converter; // the converter in the next step is older, beneficiary is the network contract else stepData.beneficiary = this; } else { // converter in this step is older, beneficiary is the network contract stepData.beneficiary = this; } } return data; } /** * @dev utility, checks whether allowance for the given spender exists and approves one if it doesn't. * Note that we use the non standard erc-20 interface in which `approve` has no return value so that * this function will work for both standard and non standard tokens * * @param _token token to check the allowance in * @param _spender approved address * @param _value allowance amount */ function ensureAllowance(IERC20Token _token, address _spender, uint256 _value) private { uint256 allowance = _token.allowance(this, _spender); if (allowance < _value) { if (allowance > 0) safeApprove(_token, _spender, 0); safeApprove(_token, _spender, _value); } } // legacy - returns the address of an EtherToken used by the converter function getConverterEtherTokenAddress(IConverter _converter) private view returns (address) { uint256 reserveCount = _converter.connectorTokenCount(); for (uint256 i = 0; i < reserveCount; i++) { address reserveTokenAddress = _converter.connectorTokens(i); if (etherTokens[reserveTokenAddress]) return reserveTokenAddress; } return ETH_RESERVE_ADDRESS; } bytes4 private constant GET_RETURN_FUNC_SELECTOR = bytes4(keccak256("getReturn(address,address,uint256)")); // using assembly code since older converter versions have different return values function getReturn(address _dest, address _sourceToken, address _targetToken, uint256 _amount) internal view returns (uint256, uint256) { uint256[2] memory ret; bytes memory data = abi.encodeWithSelector(GET_RETURN_FUNC_SELECTOR, _sourceToken, _targetToken, _amount); assembly { let success := staticcall( gas, // gas remaining _dest, // destination address add(data, 32), // input buffer (starts after the first 32 bytes in the `data` array) mload(data), // input length (loaded from the first 32 bytes in the `data` array) ret, // output buffer 64 // output length ) if iszero(success) { revert(0, 0) } } return (ret[0], ret[1]); } bytes4 private constant IS_V28_OR_HIGHER_FUNC_SELECTOR = bytes4(keccak256("isV28OrHigher()")); // using assembly code to identify converter version // can't rely on the version number since the function had a different signature in older converters function isV28OrHigherConverter(IConverter _converter) internal view returns (bool) { bool success; uint256[1] memory ret; bytes memory data = abi.encodeWithSelector(IS_V28_OR_HIGHER_FUNC_SELECTOR); assembly { success := staticcall( gas, // gas remaining _converter, // destination address add(data, 32), // input buffer (starts after the first 32 bytes in the `data` array) mload(data), // input length (loaded from the first 32 bytes in the `data` array) ret, // output buffer 32 // output length ) } return success; } /** * @dev deprecated, backward compatibility */ function getReturnByPath(IERC20Token[] _path, uint256 _amount) public view returns (uint256, uint256) { return (rateByPath(_path, _amount), 0); } /** * @dev deprecated, backward compatibility */ function convert(IERC20Token[] _path, uint256 _amount, uint256 _minReturn) public payable returns (uint256) { return convertByPath(_path, _amount, _minReturn, address(0), address(0), 0); } /** * @dev deprecated, backward compatibility */ function convert2( IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _affiliateAccount, uint256 _affiliateFee ) public payable returns (uint256) { return convertByPath(_path, _amount, _minReturn, address(0), _affiliateAccount, _affiliateFee); } /** * @dev deprecated, backward compatibility */ function convertFor(IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _beneficiary) public payable returns (uint256) { return convertByPath(_path, _amount, _minReturn, _beneficiary, address(0), 0); } /** * @dev deprecated, backward compatibility */ function convertFor2( IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _beneficiary, address _affiliateAccount, uint256 _affiliateFee ) public payable greaterThanZero(_minReturn) returns (uint256) { return convertByPath(_path, _amount, _minReturn, _beneficiary, _affiliateAccount, _affiliateFee); } /** * @dev deprecated, backward compatibility */ function claimAndConvert(IERC20Token[] _path, uint256 _amount, uint256 _minReturn) public returns (uint256) { return convertByPath(_path, _amount, _minReturn, address(0), address(0), 0); } /** * @dev deprecated, backward compatibility */ function claimAndConvert2( IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _affiliateAccount, uint256 _affiliateFee ) public returns (uint256) { return convertByPath(_path, _amount, _minReturn, address(0), _affiliateAccount, _affiliateFee); } /** * @dev deprecated, backward compatibility */ function claimAndConvertFor(IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _beneficiary) public returns (uint256) { return convertByPath(_path, _amount, _minReturn, _beneficiary, address(0), 0); } /** * @dev deprecated, backward compatibility */ function claimAndConvertFor2( IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _beneficiary, address _affiliateAccount, uint256 _affiliateFee ) public returns (uint256) { return convertByPath(_path, _amount, _minReturn, _beneficiary, _affiliateAccount, _affiliateFee); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"constant":false,"inputs":[{"name":"_onlyOwnerCanUpdateRegistry","type":"bool"}],"name":"restrictRegistryUpdate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_register","type":"bool"}],"name":"registerEtherToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"}],"name":"getReturnByPath","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_beneficiary","type":"address"},{"name":"_affiliateAccount","type":"address"},{"name":"_affiliateFee","type":"uint256"}],"name":"claimAndConvertFor2","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"onlyOwnerCanUpdateRegistry","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"updateRegistry","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_affiliateAccount","type":"address"},{"name":"_affiliateFee","type":"uint256"}],"name":"convert2","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"maxAffiliateFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"withdrawTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"prevRegistry","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"acceptOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"registry","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"}],"name":"rateByPath","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"etherTokens","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_bancorX","type":"address"},{"name":"_conversionId","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_beneficiary","type":"address"}],"name":"completeXConversion","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_beneficiary","type":"address"},{"name":"_affiliateAccount","type":"address"},{"name":"_affiliateFee","type":"uint256"}],"name":"convertFor2","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_beneficiary","type":"address"}],"name":"claimAndConvertFor","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"restoreRegistry","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_beneficiary","type":"address"},{"name":"_affiliateAccount","type":"address"},{"name":"_affiliateFee","type":"uint256"}],"name":"convertByPath","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_targetBlockchain","type":"bytes32"},{"name":"_targetAccount","type":"bytes32"},{"name":"_conversionId","type":"uint256"}],"name":"xConvert","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"}],"name":"claimAndConvert","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_beneficiary","type":"address"}],"name":"convertFor","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_targetBlockchain","type":"bytes32"},{"name":"_targetAccount","type":"bytes32"},{"name":"_conversionId","type":"uint256"},{"name":"_affiliateAccount","type":"address"},{"name":"_affiliateFee","type":"uint256"}],"name":"xConvert2","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"safeTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"newOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_sourceToken","type":"address"},{"name":"_targetToken","type":"address"}],"name":"conversionPath","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_affiliateAccount","type":"address"},{"name":"_affiliateFee","type":"uint256"}],"name":"claimAndConvert2","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"safeApprove","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"}],"name":"convert","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_maxAffiliateFee","type":"uint256"}],"name":"setMaxAffiliateFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_registry","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_smartToken","type":"address"},{"indexed":true,"name":"_fromToken","type":"address"},{"indexed":true,"name":"_toToken","type":"address"},{"indexed":false,"name":"_fromAmount","type":"uint256"},{"indexed":false,"name":"_toAmount","type":"uint256"},{"indexed":false,"name":"_trader","type":"address"}],"name":"Conversion","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_prevOwner","type":"address"},{"indexed":true,"name":"_newOwner","type":"address"}],"name":"OwnerUpdate","type":"event"}]
Contract Creation Code
60806040526003805460a860020a60ff02191690556175306004553480156200002757600080fd5b5060405160208062003977833981016040525160008054600160a060020a0319163317905580806200006281640100000000620000dd810204565b5060028054600160a060020a03909216600160a060020a03199283168117909155600380549092161790555073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60005260056020527fa1829a9003092132f585b6ccdd167c19fe9774dbdea4260287e8a8e8ca8185d7805460ff1916600117905562000158565b600160a060020a03811615156200015557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4552525f494e56414c49445f4144445245535300000000000000000000000000604482015290519081900360640190fd5b50565b61380f80620001686000396000f3006080604052600436106101875763ffffffff60e060020a600035041663024c7ec7811461018c57806302ef521e146101a85780630c8496cc146101ce5780632978c10e1461023e5780632fe8a6ad146102c757806349d10b64146102f0578063569706eb146103055780635d732ff2146103685780635e35359e1461037d57806361cd756e146103a757806379ba5097146103d85780637b103999146103ed5780637f9c0ecd146104025780638077ccf71461045957806389f9cc611461047a5780638da5cb5b146104ed578063ab6214ce14610502578063b1e9932b1461056c578063b4a176d3146105d7578063b77d239b146105ec578063c52173de14610656578063c7ba24bc146106b5578063c98fefed14610713578063cb32564e14610771578063d1660f99146107e5578063d4ee1d901461080f578063d734fa1914610824578063d9fc4b611461089b578063e57738e5146108cb578063eb5625d91461093b578063f2fde38b14610965578063f3898a9714610986578063f3bc7d2a146109d7575b600080fd5b34801561019857600080fd5b506101a660043515156109ef565b005b3480156101b457600080fd5b506101a6600160a060020a03600435166024351515610a37565b3480156101da57600080fd5b5060408051602060048035808201358381028086018501909652808552610225953695939460249493850192918291850190849080828437509497505093359450610a809350505050565b6040805192835260208301919091528051918290030190f35b34801561024a57600080fd5b50604080516020600480358082013583810280860185019096528085526102b59536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a03604082013581169350606082013516915060800135610a98565b60408051918252519081900360200190f35b3480156102d357600080fd5b506102dc610ab3565b604080519115158252519081900360200190f35b3480156102fc57600080fd5b506101a6610ad4565b604080516020600480358082013583810280860185019096528085526102b59536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a036040820135169250606001359050610d53565b34801561037457600080fd5b506102b5610d6e565b34801561038957600080fd5b506101a6600160a060020a0360043581169060243516604435610d74565b3480156103b357600080fd5b506103bc610dad565b60408051600160a060020a039092168252519081900360200190f35b3480156103e457600080fd5b506101a6610dbc565b3480156103f957600080fd5b506103bc610e8f565b34801561040e57600080fd5b50604080516020600480358082013583810280860185019096528085526102b5953695939460249493850192918291850190849080828437509497505093359450610e9e9350505050565b34801561046557600080fd5b506102dc600160a060020a0360043516611880565b34801561048657600080fd5b50604080516020600480358082013583810280860185019096528085526102b59536959394602494938501929182918501908490808284375094975050600160a060020a038535811696506020860135956040810135955060600135169250611895915050565b3480156104f957600080fd5b506103bc611a2a565b604080516020600480358082013583810280860185019096528085526102b59536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a03604082013581169350606082013516915060800135611a39565b34801561057857600080fd5b50604080516020600480358082013583810280860185019096528085526102b5953695939460249493850192918291850190849080828437509497505084359550505060208301359260400135600160a060020a03169150611a5f9050565b3480156105e357600080fd5b506101a6611a79565b604080516020600480358082013583810280860185019096528085526102b59536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a03604082013581169350606082013516915060800135611ab2565b604080516020600480358082013583810280860185019096528085526102b59536959394602494938501929182918501908490808284375094975050843595505050602083013592604081013592506060810135915060800135611cf2565b3480156106c157600080fd5b50604080516020600480358082013583810280860185019096528085526102b595369593946024949385019291829185019084908082843750949750508435955050506020909201359150611d059050565b604080516020600480358082013583810280860185019096528085526102b5953695939460249493850192918291850190849080828437509497505084359550505060208301359260400135600160a060020a03169150611a5f9050565b604080516020600480358082013583810280860185019096528085526102b595369593946024949385019291829185019084908082843750949750508435955050506020830135926040810135925060608101359150608081013590600160a060020a0360a0820135169060c00135611d1f565b3480156107f157600080fd5b506101a6600160a060020a0360043581169060243516604435611ebd565b34801561081b57600080fd5b506103bc611f4a565b34801561083057600080fd5b5061084b600160a060020a0360043581169060243516611f59565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561088757818101518382015260200161086f565b505050509050019250505060405180910390f35b3480156108a757600080fd5b506101a6600160a060020a036004358116906024358116906044351660643561208a565b3480156108d757600080fd5b50604080516020600480358082013583810280860185019096528085526102b59536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a036040820135169250606001359050610d53565b34801561094757600080fd5b506101a6600160a060020a0360043581169060243516604435612148565b34801561097157600080fd5b506101a6600160a060020a03600435166121d0565b604080516020600480358082013583810280860185019096528085526102b595369593946024949385019291829185019084908082843750949750508435955050506020909201359150611d059050565b3480156109e357600080fd5b506101a660043561226d565b6109f76122d5565b60038054911515740100000000000000000000000000000000000000000274ff000000000000000000000000000000000000000019909216919091179055565b610a3f6122d5565b81610a4981612339565b82610a538161239c565b5050600160a060020a03919091166000908152600560205260409020805460ff1916911515919091179055565b600080610a8d8484610e9e565b946000945092505050565b6000610aa8878787878787611ab2565b979650505050505050565b60035474010000000000000000000000000000000000000000900460ff1681565b60008054600160a060020a0316331480610b09575060035474010000000000000000000000000000000000000000900460ff16155b1515610b5f576040805160e560020a62461bcd02815260206004820152601160248201527f4552525f4143434553535f44454e494544000000000000000000000000000000604482015290519081900360640190fd5b610b887f436f6e74726163745265676973747279000000000000000000000000000000006123fd565b600254909150600160a060020a03808316911614801590610bb15750600160a060020a03811615155b1515610c07576040805160e560020a62461bcd02815260206004820152601460248201527f4552525f494e56414c49445f5245474953545259000000000000000000000000604482015290519081900360640190fd5b604080517fbb34534c0000000000000000000000000000000000000000000000000000000081527f436f6e747261637452656769737472790000000000000000000000000000000060048201529051600091600160a060020a0384169163bb34534c9160248082019260209290919082900301818787803b158015610c8b57600080fd5b505af1158015610c9f573d6000803e3d6000fd5b505050506040513d6020811015610cb557600080fd5b5051600160a060020a03161415610d16576040805160e560020a62461bcd02815260206004820152601460248201527f4552525f494e56414c49445f5245474953545259000000000000000000000000604482015290519081900360640190fd5b6002805460038054600160a060020a0380841673ffffffffffffffffffffffffffffffffffffffff19928316179092559091169216919091179055565b6000610d6486868660008787611ab2565b9695505050505050565b60045481565b610d7c6122d5565b82610d8681612339565b82610d9081612339565b83610d9a8161239c565b610da5868686611ebd565b505050505050565b600354600160a060020a031681565b600154600160a060020a03163314610e1e576040805160e560020a62461bcd02815260206004820152601160248201527f4552525f4143434553535f44454e494544000000000000000000000000000000604482015290519081900360640190fd5b60015460008054604051600160a060020a0393841693909116917f343765429aea5a34b3ff6a3785a98a5abb2597aca87bfbb58632c173d585373a91a3600180546000805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a03841617909155169055565b600254600160a060020a031681565b600080600080600080600080600080600080610ed97f42616e636f72466f726d756c61000000000000000000000000000000000000006123fd565b94508c9a5060028e51118015610ef457508d51600290066001145b1515610f4a576040805160e560020a62461bcd02815260206004820152601060248201527f4552525f494e56414c49445f5041544800000000000000000000000000000000604482015290519081900360640190fd5b600293505b8d5184101561186e578d60028503815181101515610f6957fe5b9060200190602002015192508d60018503815181101515610f8657fe5b9060200190602002015191508d84815181101515610fa057fe5b6020908102909101810151600160a060020a0385166000908152600590925260409091205490915060ff1615610fe85773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee92505b600160a060020a03811660009081526005602052604090205460ff1615611020575073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b81600160a060020a031681600160a060020a0316141561140a57600384108061107557508d6003850381518110151561105557fe5b90602001906020020151600160a060020a031682600160a060020a031614155b156111725781600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156110b857600080fd5b505af11580156110cc573d6000803e3d6000fd5b505050506040513d60208110156110e257600080fd5b5051604080517f8da5cb5b0000000000000000000000000000000000000000000000000000000081529051919a50600160a060020a03841691638da5cb5b916004808201926020929091908290030181600087803b15801561114357600080fd5b505af1158015611157573d6000803e3d6000fd5b505050506040513d602081101561116d57600080fd5b505195505b85600160a060020a031663d8959512846040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b1580156111cd57600080fd5b505af11580156111e1573d6000803e3d6000fd5b505050506040513d60208110156111f757600080fd5b5051604080517f0e53aae9000000000000000000000000000000000000000000000000000000008152600160a060020a0386811660048301529151929a5090881691630e53aae99160248082019260a0929091908290030181600087803b15801561126157600080fd5b505af1158015611275573d6000803e3d6000fd5b505050506040513d60a081101561128b57600080fd5b50602090810151604080517f48d73fed000000000000000000000000000000000000000000000000000000008152600481018d9052602481018c905263ffffffff83166044820152606481018f90529051919950600160a060020a038816926348d73fed926084808401938290030181600087803b15801561130c57600080fd5b505af1158015611320573d6000803e3d6000fd5b505050506040513d602081101561133657600080fd5b5051604080517f579cd3ca0000000000000000000000000000000000000000000000000000000081529051919c506113ec91620f4240916113e091600160a060020a038b169163579cd3ca9160048083019260209291908290030181600087803b1580156113a357600080fd5b505af11580156113b7573d6000803e3d6000fd5b505050506040513d60208110156113cd57600080fd5b50518e9063ffffffff9081169061249516565b9063ffffffff61251516565b9a8b90039a9950611403898c63ffffffff61258316565b9850611863565b81600160a060020a031683600160a060020a031614156117a457600384108061145f57508d6003850381518110151561143f57fe5b90602001906020020151600160a060020a031682600160a060020a031614155b1561155c5781600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156114a257600080fd5b505af11580156114b6573d6000803e3d6000fd5b505050506040513d60208110156114cc57600080fd5b5051604080517f8da5cb5b0000000000000000000000000000000000000000000000000000000081529051919a50600160a060020a03841691638da5cb5b916004808201926020929091908290030181600087803b15801561152d57600080fd5b505af1158015611541573d6000803e3d6000fd5b505050506040513d602081101561155757600080fd5b505195505b85600160a060020a031663d8959512826040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b1580156115b757600080fd5b505af11580156115cb573d6000803e3d6000fd5b505050506040513d60208110156115e157600080fd5b5051604080517f0e53aae9000000000000000000000000000000000000000000000000000000008152600160a060020a0384811660048301529151929a5090881691630e53aae99160248082019260a0929091908290030181600087803b15801561164b57600080fd5b505af115801561165f573d6000803e3d6000fd5b505050506040513d60a081101561167557600080fd5b50602090810151604080517ff732f1c9000000000000000000000000000000000000000000000000000000008152600481018d9052602481018c905263ffffffff83166044820152606481018f90529051919950600160a060020a0388169263f732f1c9926084808401938290030181600087803b1580156116f657600080fd5b505af115801561170a573d6000803e3d6000fd5b505050506040513d602081101561172057600080fd5b5051604080517f579cd3ca0000000000000000000000000000000000000000000000000000000081529051919c5061178d91620f4240916113e091600160a060020a038b169163579cd3ca9160048083019260209291908290030181600087803b1580156113a357600080fd5b9a8b90039a9950611403898c63ffffffff6125e016565b60038410806117df57508d600385038151811015156117bf57fe5b90602001906020020151600160a060020a031682600160a060020a031614155b156118515781600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561182257600080fd5b505af1158015611836573d6000803e3d6000fd5b505050506040513d602081101561184c57600080fd5b505195505b61185d8684838e612640565b909b5099505b600284019350610f4f565b50989c9b505050505050505050505050565b60056020526000908152604090205460ff1681565b60008085600160a060020a031663fc0c546a6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156118d657600080fd5b505af11580156118ea573d6000803e3d6000fd5b505050506040513d602081101561190057600080fd5b50518751600160a060020a03909116908890600090811061191d57fe5b60209081029091010151600160a060020a031614611985576040805160e560020a62461bcd02815260206004820152601860248201527f4552525f494e56414c49445f534f555243455f544f4b454e0000000000000000604482015290519081900360640190fd5b604080517faafd6b76000000000000000000000000000000000000000000000000000000008152600481018790523360248201529051600160a060020a0388169163aafd6b769160448083019260209291908290030181600087803b1580156119ed57600080fd5b505af1158015611a01573d6000803e3d6000fd5b505050506040513d6020811015611a1757600080fd5b50519050610aa887828686600080611ab2565b600054600160a060020a031681565b600084611a4581612724565b611a53888888888888611ab2565b98975050505050505050565b6000611a7085858585600080611ab2565b95945050505050565b611a816122d5565b6003546002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03909216919091179055565b600080600060606000611ac361277c565b6003805475ff0000000000000000000000000000000000000000001916750100000000000000000000000000000000000000000017905588611b0481612724565b60028c51118015611b1a57508b51600290066001145b1515611b70576040805160e560020a62461bcd02815260206004820152601060248201527f4552525f494e56414c49445f5041544800000000000000000000000000000000604482015290519081900360640190fd5b611bab8c6000815181101515611b8257fe5b906020019060200201518d6001815181101515611b9b57fe5b906020019060200201518d6127f0565b60009450600160a060020a0388161515611c1a578615611c15576040805160e560020a62461bcd02815260206004820152601960248201527f4552525f494e56414c49445f414646494c494154455f46454500000000000000604482015290519081900360640190fd5b611c87565b866000108015611c2c57506004548711155b1515611c82576040805160e560020a62461bcd02815260206004820152601960248201527f4552525f494e56414c49445f414646494c494154455f46454500000000000000604482015290519081900360640190fd5b600194505b339350600160a060020a03891615611c9d578893505b611ca88c85876129f4565b9250611cb7838c8c8b8b612e0b565b9150611cc483838661336b565b506003805475ff000000000000000000000000000000000000000000191690559a9950505050505050505050565b6000610aa8878787878787600080611d1f565b6000611d178484846000806000611ab2565b949350505050565b60008060008089611d2f81612724565b8c518d906000198101908110611d4157fe5b906020019060200201519350611d767f42616e636f7258000000000000000000000000000000000000000000000000006123fd565b9250611da17f424e54546f6b656e0000000000000000000000000000000000000000000000006123fd565b600160a060020a03858116911614611e03576040805160e560020a62461bcd02815260206004820152601860248201527f4552525f494e56414c49445f5441524745545f544f4b454e0000000000000000604482015290519081900360640190fd5b611e118d8d8d308b8b611ab2565b9150611e1e84848461344e565b604080517f427c0374000000000000000000000000000000000000000000000000000000008152600481018c9052602481018b905260448101849052606481018a90529051600160a060020a0385169163427c037491608480830192600092919082900301818387803b158015611e9457600080fd5b505af1158015611ea8573d6000803e3d6000fd5b50939f9e505050505050505050505050505050565b604080517f7472616e7366657228616464726573732c75696e74323536290000000000000081528151908190036019018120600160a060020a03851660248301526044808301859052835180840390910181526064909201909252602081018051600160e060020a0316600160e060020a031990931692909217909152611f4590849061350f565b505050565b600154600160a060020a031681565b60606000611f867f436f6e76657273696f6e5061746846696e6465720000000000000000000000006123fd565b604080517fa1c421cd000000000000000000000000000000000000000000000000000000008152600160a060020a038781166004830152868116602483015291519293509083169163a1c421cd9160448082019260009290919082900301818387803b158015611ff557600080fd5b505af1158015612009573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561203257600080fd5b81019080805164010000000081111561204a57600080fd5b8201602081018481111561205d57600080fd5b815185602082028301116401000000008211171561207a57600080fd5b50909550505050505b5092915050565b604080517f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81527f74323536290000000000000000000000000000000000000000000000000000006020808301919091528251918290036025018220600160a060020a03808816602485015286166044840152606480840186905284518085039091018152608490930190935281018051600160e060020a0316600160e060020a03199093169290921790915261214290859061350f565b50505050565b604080517f617070726f766528616464726573732c75696e7432353629000000000000000081528151908190036018018120600160a060020a03851660248301526044808301859052835180840390910181526064909201909252602081018051600160e060020a0316600160e060020a031990931692909217909152611f4590849061350f565b6121d86122d5565b600054600160a060020a038281169116141561223e576040805160e560020a62461bcd02815260206004820152600e60248201527f4552525f53414d455f4f574e4552000000000000000000000000000000000000604482015290519081900360640190fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6122756122d5565b620f42408111156122d0576040805160e560020a62461bcd02815260206004820152601960248201527f4552525f494e56414c49445f414646494c494154455f46454500000000000000604482015290519081900360640190fd5b600455565b600054600160a060020a03163314612337576040805160e560020a62461bcd02815260206004820152601160248201527f4552525f4143434553535f44454e494544000000000000000000000000000000604482015290519081900360640190fd5b565b600160a060020a0381161515612399576040805160e560020a62461bcd02815260206004820152601360248201527f4552525f494e56414c49445f4144445245535300000000000000000000000000604482015290519081900360640190fd5b50565b600160a060020a038116301415612399576040805160e560020a62461bcd02815260206004820152601360248201527f4552525f414444524553535f49535f53454c4600000000000000000000000000604482015290519081900360640190fd5b600254604080517fbb34534c000000000000000000000000000000000000000000000000000000008152600481018490529051600092600160a060020a03169163bb34534c91602480830192602092919082900301818787803b15801561246357600080fd5b505af1158015612477573d6000803e3d6000fd5b505050506040513d602081101561248d57600080fd5b505192915050565b6000808315156124a85760009150612083565b508282028284828115156124b857fe5b041461250e576040805160e560020a62461bcd02815260206004820152600c60248201527f4552525f4f564552464c4f570000000000000000000000000000000000000000604482015290519081900360640190fd5b9392505050565b60008080831161256f576040805160e560020a62461bcd02815260206004820152601260248201527f4552525f4449564944455f42595f5a45524f0000000000000000000000000000604482015290519081900360640190fd5b828481151561257a57fe5b04949350505050565b60008282018381101561250e576040805160e560020a62461bcd02815260206004820152600c60248201527f4552525f4f564552464c4f570000000000000000000000000000000000000000604482015290519081900360640190fd5b60008183101561263a576040805160e560020a62461bcd02815260206004820152600d60248201527f4552525f554e444552464c4f5700000000000000000000000000000000000000604482015290519081900360640190fd5b50900390565b60008061264b61376d565b604080517f67657452657475726e28616464726573732c616464726573732c75696e74323581527f36290000000000000000000000000000000000000000000000000000000000006020808301919091528251918290036022018220600160a060020a03808b16602485015289166044840152606480840189905284518085039091018152608490930184529082018051600160e060020a0316600160e060020a0319909216919091178152815191929184918b5afa80151561270d57600080fd5b505080516020909101519097909650945050505050565b60008111612399576040805160e560020a62461bcd02815260206004820152600e60248201527f4552525f5a45524f5f56414c5545000000000000000000000000000000000000604482015290519081900360640190fd5b6003547501000000000000000000000000000000000000000000900460ff1615612337576040805160e560020a62461bcd02815260206004820152600e60248201527f4552525f5245454e5452414e4359000000000000000000000000000000000000604482015290519081900360640190fd5b60008083600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561283157600080fd5b505af1158015612845573d6000803e3d6000fd5b505050506040513d602081101561285b57600080fd5b505191506128688261359d565b90506000341115612936573483146128ca576040805160e560020a62461bcd02815260206004820152601760248201527f4552525f4554485f414d4f554e545f4d49534d41544348000000000000000000604482015290519081900360640190fd5b801515612931576128da82613620565b600160a060020a031663d0e30db0346040518263ffffffff1660e060020a0281526004016000604051808303818588803b15801561291757600080fd5b505af115801561292b573d6000803e3d6000fd5b50505050505b6129ed565b600160a060020a03851660009081526005602052604090205460ff16156129cf576129638533308661208a565b80156129315784600160a060020a0316632e1a7d4d846040518263ffffffff1660e060020a02815260040180828152602001915050600060405180830381600087803b1580156129b257600080fd5b505af11580156129c6573d6000803e3d6000fd5b505050506129ed565b80156129e1576129318533848661208a565b6129ed8533308661208a565b5050505050565b6060806000806000806000806000612a0a613788565b8c5160029004604051908082528060200260200182016040528015612a4957816020015b612a36613788565b815260200190600190039081612a2e5790505b50985060009750612a797f424e54546f6b656e0000000000000000000000000000000000000000000000006123fd565b9650600095505b60018d5103861015612c14578c86600101815181101515612a9d57fe5b90602001906020020151945084600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015612ae757600080fd5b505af1158015612afb573d6000803e3d6000fd5b505050506040513d6020811015612b1157600080fd5b50518d519094508d9060028801908110612b2757fe5b9060200190602002015192508a8015612b3e575087155b8015612b5b575086600160a060020a031683600160a060020a0316145b91508115612b6857600197505b60e06040519081016040528085600160a060020a0316815260200186600160a060020a031681526020018e88815181101515612ba057fe5b90602001906020020151600160a060020a0316815260200184600160a060020a031681526020016000600160a060020a03168152602001612be08661359d565b151581528315156020909101528960028804815181101515612bfe57fe5b6020908102909101015260029590950194612a80565b886000815181101515612c2357fe5b6020908102909101810151604080820151600160a060020a0316600090815260059093529091205490915060ff1615612c99578060a0015115612c7f5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6040820152612c99565b8051612c8a90613620565b600160a060020a031660408201525b885189906000198101908110612cab57fe5b60209081029091018101516060810151600160a060020a03166000908152600590925260409091205490915060ff1615612d22578060a0015115612d085773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6060820152612d22565b8051612d1390613620565b600160a060020a031660608201525b600095505b8851861015612dfa578886815181101515612d3e57fe5b9060200190602002015190508060a0015115612de8578060c0015115612d6957306080820152612de3565b6001895103861415612d8957600160a060020a038c166080820152612de3565b8886600101815181101515612d9a57fe5b9060200190602002015160a0015115612ddc578886600101815181101515612dbe57fe5b6020908102909101015151600160a060020a03166080820152612de3565b3060808201525b612def565b3060808201525b600190950194612d27565b50969b9a5050505050505050505050565b600080600080612e19613788565b6000899350600092505b8a51831015613304578a83815181101515612e3a57fe5b9060200190602002015191508160a0015115612ecb578215801590612e8757508a5130908c906000198601908110612e6e57fe5b9060200190602002015160800151600160a060020a0316145b8015612eae5750604080830151600160a060020a031660009081526005602052205460ff16155b15612ec657612ec68260400151836000015186611ebd565b612f01565b8160200151600160a060020a03168260400151600160a060020a0316141515612f0157612f01826040015183600001518661344e565b8160a001511515612fc4578151604080840151606085015182517f5e5144eb000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152908216602482015260448101889052600160648201529151921691635e5144eb916084808201926020929091908290030181600087803b158015612f9157600080fd5b505af1158015612fa5573d6000803e3d6000fd5b505050506040513d6020811015612fbb57600080fd5b50519450613161565b604080830151600160a060020a031660009081526005602052205460ff16156130a25781516040808401516060850151608086015183517fe8dc12ff000000000000000000000000000000000000000000000000000000008152600160a060020a03938416600482015291831660248301526044820189905233606483015282166084820152915192169163e8dc12ff91349160a480830192602092919082900301818588803b15801561307757600080fd5b505af115801561308b573d6000803e3d6000fd5b50505050506040513d6020811015612fbb57600080fd5b81516040808401516060850151608086015183517fe8dc12ff000000000000000000000000000000000000000000000000000000008152600160a060020a03938416600482015291831660248301526044820189905233606483015282166084820152915192169163e8dc12ff9160a4808201926020929091908290030181600087803b15801561313257600080fd5b505af1158015613146573d6000803e3d6000fd5b505050506040513d602081101561315c57600080fd5b505194505b8160c001511561327357613182620f42406113e0878a63ffffffff61249516565b90508160600151600160a060020a031663a9059cbb89836040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b1580156131eb57600080fd5b505af11580156131ff573d6000803e3d6000fd5b505050506040513d602081101561321557600080fd5b5051151561326d576040805160e560020a62461bcd02815260206004820152601760248201527f4552525f4645455f5452414e534645525f4641494c4544000000000000000000604482015290519081900360640190fd5b80850394505b8160600151600160a060020a03168260400151600160a060020a03168360200151600160a060020a03167f7154b38b5dd31bb3122436a96d4e09aba5b323ae1fd580025fab55074334c0958789336040518084815260200183815260200182600160a060020a0316600160a060020a03168152602001935050505060405180910390a4849350600190920191612e23565b8885101561335c576040805160e560020a62461bcd02815260206004820152601260248201527f4552525f52455455524e5f544f4f5f4c4f570000000000000000000000000000604482015290519081900360640190fd5b50929998505050505050505050565b613373613788565b600084600186510381518110151561338757fe5b602090810290910101516080810151909250600160a060020a031630146133ad576129ed565b506060810151600160a060020a03811660009081526005602052604090205460ff16156134435760a0820151156133e057fe5b80600160a060020a031663205c287884866040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050600060405180830381600087803b1580156129b257600080fd5b6129ed818486611ebd565b604080517fdd62ed3e000000000000000000000000000000000000000000000000000000008152306004820152600160a060020a038481166024830152915160009286169163dd62ed3e91604480830192602092919082900301818787803b1580156134b957600080fd5b505af11580156134cd573d6000803e3d6000fd5b505050506040513d60208110156134e357600080fd5b50519050818110156121425760008111156135045761350484846000612148565b612142848484612148565b6135176137c4565b602060405190810160405280600181525090506020818351602085016000875af180151561354457600080fd5b5080511515611f45576040805160e560020a62461bcd02815260206004820152601360248201527f4552525f5452414e534645525f4641494c454400000000000000000000000000604482015290519081900360640190fd5b6000806135a86137c4565b604080517f69735632384f72486967686572282900000000000000000000000000000000008152815190819003600f018120600482526024820190925260208082018051600160e060020a0316600160e060020a03199094169390931783528151919290918491885afa92508293505b505050919050565b60008060008084600160a060020a03166371f52bf36040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561366457600080fd5b505af1158015613678573d6000803e3d6000fd5b505050506040513d602081101561368e57600080fd5b505161ffff169250600091505b8282101561374f5784600160a060020a03166319b64015836040518263ffffffff1660e060020a02815260040180828152602001915050602060405180830381600087803b1580156136ec57600080fd5b505af1158015613700573d6000803e3d6000fd5b505050506040513d602081101561371657600080fd5b5051600160a060020a03811660009081526005602052604090205490915060ff161561374457809350613618565b60019091019061369b565b5073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee949350505050565b60408051808201825290600290829080388339509192915050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b60206040519081016040528060019060208202803883395091929150505600a165627a7a723058208faa148590c5cf11bb22b275ad74029da127dc0d3675cfd5154f32fdb38bec20002900000000000000000000000052ae12abe5d8bd778bd5397f99ca900624cfadd4
Deployed Bytecode
0x6080604052600436106101875763ffffffff60e060020a600035041663024c7ec7811461018c57806302ef521e146101a85780630c8496cc146101ce5780632978c10e1461023e5780632fe8a6ad146102c757806349d10b64146102f0578063569706eb146103055780635d732ff2146103685780635e35359e1461037d57806361cd756e146103a757806379ba5097146103d85780637b103999146103ed5780637f9c0ecd146104025780638077ccf71461045957806389f9cc611461047a5780638da5cb5b146104ed578063ab6214ce14610502578063b1e9932b1461056c578063b4a176d3146105d7578063b77d239b146105ec578063c52173de14610656578063c7ba24bc146106b5578063c98fefed14610713578063cb32564e14610771578063d1660f99146107e5578063d4ee1d901461080f578063d734fa1914610824578063d9fc4b611461089b578063e57738e5146108cb578063eb5625d91461093b578063f2fde38b14610965578063f3898a9714610986578063f3bc7d2a146109d7575b600080fd5b34801561019857600080fd5b506101a660043515156109ef565b005b3480156101b457600080fd5b506101a6600160a060020a03600435166024351515610a37565b3480156101da57600080fd5b5060408051602060048035808201358381028086018501909652808552610225953695939460249493850192918291850190849080828437509497505093359450610a809350505050565b6040805192835260208301919091528051918290030190f35b34801561024a57600080fd5b50604080516020600480358082013583810280860185019096528085526102b59536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a03604082013581169350606082013516915060800135610a98565b60408051918252519081900360200190f35b3480156102d357600080fd5b506102dc610ab3565b604080519115158252519081900360200190f35b3480156102fc57600080fd5b506101a6610ad4565b604080516020600480358082013583810280860185019096528085526102b59536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a036040820135169250606001359050610d53565b34801561037457600080fd5b506102b5610d6e565b34801561038957600080fd5b506101a6600160a060020a0360043581169060243516604435610d74565b3480156103b357600080fd5b506103bc610dad565b60408051600160a060020a039092168252519081900360200190f35b3480156103e457600080fd5b506101a6610dbc565b3480156103f957600080fd5b506103bc610e8f565b34801561040e57600080fd5b50604080516020600480358082013583810280860185019096528085526102b5953695939460249493850192918291850190849080828437509497505093359450610e9e9350505050565b34801561046557600080fd5b506102dc600160a060020a0360043516611880565b34801561048657600080fd5b50604080516020600480358082013583810280860185019096528085526102b59536959394602494938501929182918501908490808284375094975050600160a060020a038535811696506020860135956040810135955060600135169250611895915050565b3480156104f957600080fd5b506103bc611a2a565b604080516020600480358082013583810280860185019096528085526102b59536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a03604082013581169350606082013516915060800135611a39565b34801561057857600080fd5b50604080516020600480358082013583810280860185019096528085526102b5953695939460249493850192918291850190849080828437509497505084359550505060208301359260400135600160a060020a03169150611a5f9050565b3480156105e357600080fd5b506101a6611a79565b604080516020600480358082013583810280860185019096528085526102b59536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a03604082013581169350606082013516915060800135611ab2565b604080516020600480358082013583810280860185019096528085526102b59536959394602494938501929182918501908490808284375094975050843595505050602083013592604081013592506060810135915060800135611cf2565b3480156106c157600080fd5b50604080516020600480358082013583810280860185019096528085526102b595369593946024949385019291829185019084908082843750949750508435955050506020909201359150611d059050565b604080516020600480358082013583810280860185019096528085526102b5953695939460249493850192918291850190849080828437509497505084359550505060208301359260400135600160a060020a03169150611a5f9050565b604080516020600480358082013583810280860185019096528085526102b595369593946024949385019291829185019084908082843750949750508435955050506020830135926040810135925060608101359150608081013590600160a060020a0360a0820135169060c00135611d1f565b3480156107f157600080fd5b506101a6600160a060020a0360043581169060243516604435611ebd565b34801561081b57600080fd5b506103bc611f4a565b34801561083057600080fd5b5061084b600160a060020a0360043581169060243516611f59565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561088757818101518382015260200161086f565b505050509050019250505060405180910390f35b3480156108a757600080fd5b506101a6600160a060020a036004358116906024358116906044351660643561208a565b3480156108d757600080fd5b50604080516020600480358082013583810280860185019096528085526102b59536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a036040820135169250606001359050610d53565b34801561094757600080fd5b506101a6600160a060020a0360043581169060243516604435612148565b34801561097157600080fd5b506101a6600160a060020a03600435166121d0565b604080516020600480358082013583810280860185019096528085526102b595369593946024949385019291829185019084908082843750949750508435955050506020909201359150611d059050565b3480156109e357600080fd5b506101a660043561226d565b6109f76122d5565b60038054911515740100000000000000000000000000000000000000000274ff000000000000000000000000000000000000000019909216919091179055565b610a3f6122d5565b81610a4981612339565b82610a538161239c565b5050600160a060020a03919091166000908152600560205260409020805460ff1916911515919091179055565b600080610a8d8484610e9e565b946000945092505050565b6000610aa8878787878787611ab2565b979650505050505050565b60035474010000000000000000000000000000000000000000900460ff1681565b60008054600160a060020a0316331480610b09575060035474010000000000000000000000000000000000000000900460ff16155b1515610b5f576040805160e560020a62461bcd02815260206004820152601160248201527f4552525f4143434553535f44454e494544000000000000000000000000000000604482015290519081900360640190fd5b610b887f436f6e74726163745265676973747279000000000000000000000000000000006123fd565b600254909150600160a060020a03808316911614801590610bb15750600160a060020a03811615155b1515610c07576040805160e560020a62461bcd02815260206004820152601460248201527f4552525f494e56414c49445f5245474953545259000000000000000000000000604482015290519081900360640190fd5b604080517fbb34534c0000000000000000000000000000000000000000000000000000000081527f436f6e747261637452656769737472790000000000000000000000000000000060048201529051600091600160a060020a0384169163bb34534c9160248082019260209290919082900301818787803b158015610c8b57600080fd5b505af1158015610c9f573d6000803e3d6000fd5b505050506040513d6020811015610cb557600080fd5b5051600160a060020a03161415610d16576040805160e560020a62461bcd02815260206004820152601460248201527f4552525f494e56414c49445f5245474953545259000000000000000000000000604482015290519081900360640190fd5b6002805460038054600160a060020a0380841673ffffffffffffffffffffffffffffffffffffffff19928316179092559091169216919091179055565b6000610d6486868660008787611ab2565b9695505050505050565b60045481565b610d7c6122d5565b82610d8681612339565b82610d9081612339565b83610d9a8161239c565b610da5868686611ebd565b505050505050565b600354600160a060020a031681565b600154600160a060020a03163314610e1e576040805160e560020a62461bcd02815260206004820152601160248201527f4552525f4143434553535f44454e494544000000000000000000000000000000604482015290519081900360640190fd5b60015460008054604051600160a060020a0393841693909116917f343765429aea5a34b3ff6a3785a98a5abb2597aca87bfbb58632c173d585373a91a3600180546000805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a03841617909155169055565b600254600160a060020a031681565b600080600080600080600080600080600080610ed97f42616e636f72466f726d756c61000000000000000000000000000000000000006123fd565b94508c9a5060028e51118015610ef457508d51600290066001145b1515610f4a576040805160e560020a62461bcd02815260206004820152601060248201527f4552525f494e56414c49445f5041544800000000000000000000000000000000604482015290519081900360640190fd5b600293505b8d5184101561186e578d60028503815181101515610f6957fe5b9060200190602002015192508d60018503815181101515610f8657fe5b9060200190602002015191508d84815181101515610fa057fe5b6020908102909101810151600160a060020a0385166000908152600590925260409091205490915060ff1615610fe85773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee92505b600160a060020a03811660009081526005602052604090205460ff1615611020575073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b81600160a060020a031681600160a060020a0316141561140a57600384108061107557508d6003850381518110151561105557fe5b90602001906020020151600160a060020a031682600160a060020a031614155b156111725781600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156110b857600080fd5b505af11580156110cc573d6000803e3d6000fd5b505050506040513d60208110156110e257600080fd5b5051604080517f8da5cb5b0000000000000000000000000000000000000000000000000000000081529051919a50600160a060020a03841691638da5cb5b916004808201926020929091908290030181600087803b15801561114357600080fd5b505af1158015611157573d6000803e3d6000fd5b505050506040513d602081101561116d57600080fd5b505195505b85600160a060020a031663d8959512846040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b1580156111cd57600080fd5b505af11580156111e1573d6000803e3d6000fd5b505050506040513d60208110156111f757600080fd5b5051604080517f0e53aae9000000000000000000000000000000000000000000000000000000008152600160a060020a0386811660048301529151929a5090881691630e53aae99160248082019260a0929091908290030181600087803b15801561126157600080fd5b505af1158015611275573d6000803e3d6000fd5b505050506040513d60a081101561128b57600080fd5b50602090810151604080517f48d73fed000000000000000000000000000000000000000000000000000000008152600481018d9052602481018c905263ffffffff83166044820152606481018f90529051919950600160a060020a038816926348d73fed926084808401938290030181600087803b15801561130c57600080fd5b505af1158015611320573d6000803e3d6000fd5b505050506040513d602081101561133657600080fd5b5051604080517f579cd3ca0000000000000000000000000000000000000000000000000000000081529051919c506113ec91620f4240916113e091600160a060020a038b169163579cd3ca9160048083019260209291908290030181600087803b1580156113a357600080fd5b505af11580156113b7573d6000803e3d6000fd5b505050506040513d60208110156113cd57600080fd5b50518e9063ffffffff9081169061249516565b9063ffffffff61251516565b9a8b90039a9950611403898c63ffffffff61258316565b9850611863565b81600160a060020a031683600160a060020a031614156117a457600384108061145f57508d6003850381518110151561143f57fe5b90602001906020020151600160a060020a031682600160a060020a031614155b1561155c5781600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156114a257600080fd5b505af11580156114b6573d6000803e3d6000fd5b505050506040513d60208110156114cc57600080fd5b5051604080517f8da5cb5b0000000000000000000000000000000000000000000000000000000081529051919a50600160a060020a03841691638da5cb5b916004808201926020929091908290030181600087803b15801561152d57600080fd5b505af1158015611541573d6000803e3d6000fd5b505050506040513d602081101561155757600080fd5b505195505b85600160a060020a031663d8959512826040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b1580156115b757600080fd5b505af11580156115cb573d6000803e3d6000fd5b505050506040513d60208110156115e157600080fd5b5051604080517f0e53aae9000000000000000000000000000000000000000000000000000000008152600160a060020a0384811660048301529151929a5090881691630e53aae99160248082019260a0929091908290030181600087803b15801561164b57600080fd5b505af115801561165f573d6000803e3d6000fd5b505050506040513d60a081101561167557600080fd5b50602090810151604080517ff732f1c9000000000000000000000000000000000000000000000000000000008152600481018d9052602481018c905263ffffffff83166044820152606481018f90529051919950600160a060020a0388169263f732f1c9926084808401938290030181600087803b1580156116f657600080fd5b505af115801561170a573d6000803e3d6000fd5b505050506040513d602081101561172057600080fd5b5051604080517f579cd3ca0000000000000000000000000000000000000000000000000000000081529051919c5061178d91620f4240916113e091600160a060020a038b169163579cd3ca9160048083019260209291908290030181600087803b1580156113a357600080fd5b9a8b90039a9950611403898c63ffffffff6125e016565b60038410806117df57508d600385038151811015156117bf57fe5b90602001906020020151600160a060020a031682600160a060020a031614155b156118515781600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561182257600080fd5b505af1158015611836573d6000803e3d6000fd5b505050506040513d602081101561184c57600080fd5b505195505b61185d8684838e612640565b909b5099505b600284019350610f4f565b50989c9b505050505050505050505050565b60056020526000908152604090205460ff1681565b60008085600160a060020a031663fc0c546a6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156118d657600080fd5b505af11580156118ea573d6000803e3d6000fd5b505050506040513d602081101561190057600080fd5b50518751600160a060020a03909116908890600090811061191d57fe5b60209081029091010151600160a060020a031614611985576040805160e560020a62461bcd02815260206004820152601860248201527f4552525f494e56414c49445f534f555243455f544f4b454e0000000000000000604482015290519081900360640190fd5b604080517faafd6b76000000000000000000000000000000000000000000000000000000008152600481018790523360248201529051600160a060020a0388169163aafd6b769160448083019260209291908290030181600087803b1580156119ed57600080fd5b505af1158015611a01573d6000803e3d6000fd5b505050506040513d6020811015611a1757600080fd5b50519050610aa887828686600080611ab2565b600054600160a060020a031681565b600084611a4581612724565b611a53888888888888611ab2565b98975050505050505050565b6000611a7085858585600080611ab2565b95945050505050565b611a816122d5565b6003546002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03909216919091179055565b600080600060606000611ac361277c565b6003805475ff0000000000000000000000000000000000000000001916750100000000000000000000000000000000000000000017905588611b0481612724565b60028c51118015611b1a57508b51600290066001145b1515611b70576040805160e560020a62461bcd02815260206004820152601060248201527f4552525f494e56414c49445f5041544800000000000000000000000000000000604482015290519081900360640190fd5b611bab8c6000815181101515611b8257fe5b906020019060200201518d6001815181101515611b9b57fe5b906020019060200201518d6127f0565b60009450600160a060020a0388161515611c1a578615611c15576040805160e560020a62461bcd02815260206004820152601960248201527f4552525f494e56414c49445f414646494c494154455f46454500000000000000604482015290519081900360640190fd5b611c87565b866000108015611c2c57506004548711155b1515611c82576040805160e560020a62461bcd02815260206004820152601960248201527f4552525f494e56414c49445f414646494c494154455f46454500000000000000604482015290519081900360640190fd5b600194505b339350600160a060020a03891615611c9d578893505b611ca88c85876129f4565b9250611cb7838c8c8b8b612e0b565b9150611cc483838661336b565b506003805475ff000000000000000000000000000000000000000000191690559a9950505050505050505050565b6000610aa8878787878787600080611d1f565b6000611d178484846000806000611ab2565b949350505050565b60008060008089611d2f81612724565b8c518d906000198101908110611d4157fe5b906020019060200201519350611d767f42616e636f7258000000000000000000000000000000000000000000000000006123fd565b9250611da17f424e54546f6b656e0000000000000000000000000000000000000000000000006123fd565b600160a060020a03858116911614611e03576040805160e560020a62461bcd02815260206004820152601860248201527f4552525f494e56414c49445f5441524745545f544f4b454e0000000000000000604482015290519081900360640190fd5b611e118d8d8d308b8b611ab2565b9150611e1e84848461344e565b604080517f427c0374000000000000000000000000000000000000000000000000000000008152600481018c9052602481018b905260448101849052606481018a90529051600160a060020a0385169163427c037491608480830192600092919082900301818387803b158015611e9457600080fd5b505af1158015611ea8573d6000803e3d6000fd5b50939f9e505050505050505050505050505050565b604080517f7472616e7366657228616464726573732c75696e74323536290000000000000081528151908190036019018120600160a060020a03851660248301526044808301859052835180840390910181526064909201909252602081018051600160e060020a0316600160e060020a031990931692909217909152611f4590849061350f565b505050565b600154600160a060020a031681565b60606000611f867f436f6e76657273696f6e5061746846696e6465720000000000000000000000006123fd565b604080517fa1c421cd000000000000000000000000000000000000000000000000000000008152600160a060020a038781166004830152868116602483015291519293509083169163a1c421cd9160448082019260009290919082900301818387803b158015611ff557600080fd5b505af1158015612009573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561203257600080fd5b81019080805164010000000081111561204a57600080fd5b8201602081018481111561205d57600080fd5b815185602082028301116401000000008211171561207a57600080fd5b50909550505050505b5092915050565b604080517f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81527f74323536290000000000000000000000000000000000000000000000000000006020808301919091528251918290036025018220600160a060020a03808816602485015286166044840152606480840186905284518085039091018152608490930190935281018051600160e060020a0316600160e060020a03199093169290921790915261214290859061350f565b50505050565b604080517f617070726f766528616464726573732c75696e7432353629000000000000000081528151908190036018018120600160a060020a03851660248301526044808301859052835180840390910181526064909201909252602081018051600160e060020a0316600160e060020a031990931692909217909152611f4590849061350f565b6121d86122d5565b600054600160a060020a038281169116141561223e576040805160e560020a62461bcd02815260206004820152600e60248201527f4552525f53414d455f4f574e4552000000000000000000000000000000000000604482015290519081900360640190fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6122756122d5565b620f42408111156122d0576040805160e560020a62461bcd02815260206004820152601960248201527f4552525f494e56414c49445f414646494c494154455f46454500000000000000604482015290519081900360640190fd5b600455565b600054600160a060020a03163314612337576040805160e560020a62461bcd02815260206004820152601160248201527f4552525f4143434553535f44454e494544000000000000000000000000000000604482015290519081900360640190fd5b565b600160a060020a0381161515612399576040805160e560020a62461bcd02815260206004820152601360248201527f4552525f494e56414c49445f4144445245535300000000000000000000000000604482015290519081900360640190fd5b50565b600160a060020a038116301415612399576040805160e560020a62461bcd02815260206004820152601360248201527f4552525f414444524553535f49535f53454c4600000000000000000000000000604482015290519081900360640190fd5b600254604080517fbb34534c000000000000000000000000000000000000000000000000000000008152600481018490529051600092600160a060020a03169163bb34534c91602480830192602092919082900301818787803b15801561246357600080fd5b505af1158015612477573d6000803e3d6000fd5b505050506040513d602081101561248d57600080fd5b505192915050565b6000808315156124a85760009150612083565b508282028284828115156124b857fe5b041461250e576040805160e560020a62461bcd02815260206004820152600c60248201527f4552525f4f564552464c4f570000000000000000000000000000000000000000604482015290519081900360640190fd5b9392505050565b60008080831161256f576040805160e560020a62461bcd02815260206004820152601260248201527f4552525f4449564944455f42595f5a45524f0000000000000000000000000000604482015290519081900360640190fd5b828481151561257a57fe5b04949350505050565b60008282018381101561250e576040805160e560020a62461bcd02815260206004820152600c60248201527f4552525f4f564552464c4f570000000000000000000000000000000000000000604482015290519081900360640190fd5b60008183101561263a576040805160e560020a62461bcd02815260206004820152600d60248201527f4552525f554e444552464c4f5700000000000000000000000000000000000000604482015290519081900360640190fd5b50900390565b60008061264b61376d565b604080517f67657452657475726e28616464726573732c616464726573732c75696e74323581527f36290000000000000000000000000000000000000000000000000000000000006020808301919091528251918290036022018220600160a060020a03808b16602485015289166044840152606480840189905284518085039091018152608490930184529082018051600160e060020a0316600160e060020a0319909216919091178152815191929184918b5afa80151561270d57600080fd5b505080516020909101519097909650945050505050565b60008111612399576040805160e560020a62461bcd02815260206004820152600e60248201527f4552525f5a45524f5f56414c5545000000000000000000000000000000000000604482015290519081900360640190fd5b6003547501000000000000000000000000000000000000000000900460ff1615612337576040805160e560020a62461bcd02815260206004820152600e60248201527f4552525f5245454e5452414e4359000000000000000000000000000000000000604482015290519081900360640190fd5b60008083600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561283157600080fd5b505af1158015612845573d6000803e3d6000fd5b505050506040513d602081101561285b57600080fd5b505191506128688261359d565b90506000341115612936573483146128ca576040805160e560020a62461bcd02815260206004820152601760248201527f4552525f4554485f414d4f554e545f4d49534d41544348000000000000000000604482015290519081900360640190fd5b801515612931576128da82613620565b600160a060020a031663d0e30db0346040518263ffffffff1660e060020a0281526004016000604051808303818588803b15801561291757600080fd5b505af115801561292b573d6000803e3d6000fd5b50505050505b6129ed565b600160a060020a03851660009081526005602052604090205460ff16156129cf576129638533308661208a565b80156129315784600160a060020a0316632e1a7d4d846040518263ffffffff1660e060020a02815260040180828152602001915050600060405180830381600087803b1580156129b257600080fd5b505af11580156129c6573d6000803e3d6000fd5b505050506129ed565b80156129e1576129318533848661208a565b6129ed8533308661208a565b5050505050565b6060806000806000806000806000612a0a613788565b8c5160029004604051908082528060200260200182016040528015612a4957816020015b612a36613788565b815260200190600190039081612a2e5790505b50985060009750612a797f424e54546f6b656e0000000000000000000000000000000000000000000000006123fd565b9650600095505b60018d5103861015612c14578c86600101815181101515612a9d57fe5b90602001906020020151945084600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015612ae757600080fd5b505af1158015612afb573d6000803e3d6000fd5b505050506040513d6020811015612b1157600080fd5b50518d519094508d9060028801908110612b2757fe5b9060200190602002015192508a8015612b3e575087155b8015612b5b575086600160a060020a031683600160a060020a0316145b91508115612b6857600197505b60e06040519081016040528085600160a060020a0316815260200186600160a060020a031681526020018e88815181101515612ba057fe5b90602001906020020151600160a060020a0316815260200184600160a060020a031681526020016000600160a060020a03168152602001612be08661359d565b151581528315156020909101528960028804815181101515612bfe57fe5b6020908102909101015260029590950194612a80565b886000815181101515612c2357fe5b6020908102909101810151604080820151600160a060020a0316600090815260059093529091205490915060ff1615612c99578060a0015115612c7f5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6040820152612c99565b8051612c8a90613620565b600160a060020a031660408201525b885189906000198101908110612cab57fe5b60209081029091018101516060810151600160a060020a03166000908152600590925260409091205490915060ff1615612d22578060a0015115612d085773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6060820152612d22565b8051612d1390613620565b600160a060020a031660608201525b600095505b8851861015612dfa578886815181101515612d3e57fe5b9060200190602002015190508060a0015115612de8578060c0015115612d6957306080820152612de3565b6001895103861415612d8957600160a060020a038c166080820152612de3565b8886600101815181101515612d9a57fe5b9060200190602002015160a0015115612ddc578886600101815181101515612dbe57fe5b6020908102909101015151600160a060020a03166080820152612de3565b3060808201525b612def565b3060808201525b600190950194612d27565b50969b9a5050505050505050505050565b600080600080612e19613788565b6000899350600092505b8a51831015613304578a83815181101515612e3a57fe5b9060200190602002015191508160a0015115612ecb578215801590612e8757508a5130908c906000198601908110612e6e57fe5b9060200190602002015160800151600160a060020a0316145b8015612eae5750604080830151600160a060020a031660009081526005602052205460ff16155b15612ec657612ec68260400151836000015186611ebd565b612f01565b8160200151600160a060020a03168260400151600160a060020a0316141515612f0157612f01826040015183600001518661344e565b8160a001511515612fc4578151604080840151606085015182517f5e5144eb000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152908216602482015260448101889052600160648201529151921691635e5144eb916084808201926020929091908290030181600087803b158015612f9157600080fd5b505af1158015612fa5573d6000803e3d6000fd5b505050506040513d6020811015612fbb57600080fd5b50519450613161565b604080830151600160a060020a031660009081526005602052205460ff16156130a25781516040808401516060850151608086015183517fe8dc12ff000000000000000000000000000000000000000000000000000000008152600160a060020a03938416600482015291831660248301526044820189905233606483015282166084820152915192169163e8dc12ff91349160a480830192602092919082900301818588803b15801561307757600080fd5b505af115801561308b573d6000803e3d6000fd5b50505050506040513d6020811015612fbb57600080fd5b81516040808401516060850151608086015183517fe8dc12ff000000000000000000000000000000000000000000000000000000008152600160a060020a03938416600482015291831660248301526044820189905233606483015282166084820152915192169163e8dc12ff9160a4808201926020929091908290030181600087803b15801561313257600080fd5b505af1158015613146573d6000803e3d6000fd5b505050506040513d602081101561315c57600080fd5b505194505b8160c001511561327357613182620f42406113e0878a63ffffffff61249516565b90508160600151600160a060020a031663a9059cbb89836040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b1580156131eb57600080fd5b505af11580156131ff573d6000803e3d6000fd5b505050506040513d602081101561321557600080fd5b5051151561326d576040805160e560020a62461bcd02815260206004820152601760248201527f4552525f4645455f5452414e534645525f4641494c4544000000000000000000604482015290519081900360640190fd5b80850394505b8160600151600160a060020a03168260400151600160a060020a03168360200151600160a060020a03167f7154b38b5dd31bb3122436a96d4e09aba5b323ae1fd580025fab55074334c0958789336040518084815260200183815260200182600160a060020a0316600160a060020a03168152602001935050505060405180910390a4849350600190920191612e23565b8885101561335c576040805160e560020a62461bcd02815260206004820152601260248201527f4552525f52455455524e5f544f4f5f4c4f570000000000000000000000000000604482015290519081900360640190fd5b50929998505050505050505050565b613373613788565b600084600186510381518110151561338757fe5b602090810290910101516080810151909250600160a060020a031630146133ad576129ed565b506060810151600160a060020a03811660009081526005602052604090205460ff16156134435760a0820151156133e057fe5b80600160a060020a031663205c287884866040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050600060405180830381600087803b1580156129b257600080fd5b6129ed818486611ebd565b604080517fdd62ed3e000000000000000000000000000000000000000000000000000000008152306004820152600160a060020a038481166024830152915160009286169163dd62ed3e91604480830192602092919082900301818787803b1580156134b957600080fd5b505af11580156134cd573d6000803e3d6000fd5b505050506040513d60208110156134e357600080fd5b50519050818110156121425760008111156135045761350484846000612148565b612142848484612148565b6135176137c4565b602060405190810160405280600181525090506020818351602085016000875af180151561354457600080fd5b5080511515611f45576040805160e560020a62461bcd02815260206004820152601360248201527f4552525f5452414e534645525f4641494c454400000000000000000000000000604482015290519081900360640190fd5b6000806135a86137c4565b604080517f69735632384f72486967686572282900000000000000000000000000000000008152815190819003600f018120600482526024820190925260208082018051600160e060020a0316600160e060020a03199094169390931783528151919290918491885afa92508293505b505050919050565b60008060008084600160a060020a03166371f52bf36040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561366457600080fd5b505af1158015613678573d6000803e3d6000fd5b505050506040513d602081101561368e57600080fd5b505161ffff169250600091505b8282101561374f5784600160a060020a03166319b64015836040518263ffffffff1660e060020a02815260040180828152602001915050602060405180830381600087803b1580156136ec57600080fd5b505af1158015613700573d6000803e3d6000fd5b505050506040513d602081101561371657600080fd5b5051600160a060020a03811660009081526005602052604090205490915060ff161561374457809350613618565b60019091019061369b565b5073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee949350505050565b60408051808201825290600290829080388339509192915050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b60206040519081016040528060019060208202803883395091929150505600a165627a7a723058208faa148590c5cf11bb22b275ad74029da127dc0d3675cfd5154f32fdb38bec200029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000052ae12abe5d8bd778bd5397f99ca900624cfadd4
-----Decoded View---------------
Arg [0] : _registry (address): 0x52Ae12ABe5D8BD778BD5397F99cA900624CfADD4
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000052ae12abe5d8bd778bd5397f99ca900624cfadd4
Deployed Bytecode Sourcemap
24646:32591:0:-;;;;;;;;;-1:-1:-1;;;24646:32591:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14362:224;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;14362:224:0;;;;;;;;;27048:209;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;27048:209:0;-1:-1:-1;;;;;27048:209:0;;;;;;;;;54106:159;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;54106:159:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54106:159:0;;-1:-1:-1;;54106:159:0;;;-1:-1:-1;54106:159:0;;-1:-1:-1;;;;54106:159:0;;;;;;;;;;;;;;;;;;;;;;;;56851:383;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;56851:383:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56851:383:0;;-1:-1:-1;;56851:383:0;;;-1:-1:-1;;;56851:383:0;;;;;-1:-1:-1;;;;;56851:383:0;;;;;;;-1:-1:-1;56851:383:0;;;;;;-1:-1:-1;56851:383:0;;;;;;;;;;;;;;;;;;;;;12049:38;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12049:38:0;;;;;;;;;;;;;;;;;;;;;;13007:925;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13007:925:0;;;;54615:356;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54615:356:0;;-1:-1:-1;;54615:356:0;;;-1:-1:-1;;;54615:356:0;;;;;-1:-1:-1;;;;;54615:356:0;;;;;;-1:-1:-1;54615:356:0;;;;-1:-1:-1;54615:356:0;;25288:38;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25288:38:0;;;;20025:246;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;20025:246:0;-1:-1:-1;;;;;20025:246:0;;;;;;;;;;;;11959:37;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11959:37:0;;;;;;;;-1:-1:-1;;;;;11959:37:0;;;;;;;;;;;;;;9140:208;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9140:208:0;;;;11870:33;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11870:33:0;;;;28299:3217;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;28299:3217:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28299:3217:0;;-1:-1:-1;;28299:3217:0;;;-1:-1:-1;28299:3217:0;;-1:-1:-1;;;;28299:3217:0;25364:44;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;25364:44:0;-1:-1:-1;;;;;25364:44:0;;;;;38773:583;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;38773:583:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38773:583:0;;-1:-1:-1;;;;;;;38773:583:0;;;;;-1:-1:-1;38773:583:0;;;;;;;;;;-1:-1:-1;38773:583:0;;;;;-1:-1:-1;38773:583:0;;-1:-1:-1;;38773:583:0;7955:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7955:20:0;;;;55348:429;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55348:429:0;;-1:-1:-1;;55348:429:0;;;-1:-1:-1;;;55348:429:0;;;;;-1:-1:-1;;;;;55348:429:0;;;;;;;-1:-1:-1;55348:429:0;;;;;;-1:-1:-1;55348:429:0;;;;;56548:229;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;56548:229:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56548:229:0;;-1:-1:-1;;56548:229:0;;;-1:-1:-1;;;56548:229:0;;;;;;;;-1:-1:-1;;;;;56548:229:0;;-1:-1:-1;56548:229:0;;-1:-1:-1;56548:229:0;14011:137;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14011:137:0;;;;32680:1573;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32680:1573:0;;-1:-1:-1;;32680:1573:0;;;-1:-1:-1;;;32680:1573:0;;;;;-1:-1:-1;;;;;32680:1573:0;;;;;;;-1:-1:-1;32680:1573:0;;;;;;-1:-1:-1;32680:1573:0;;;;;35245:404;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35245:404:0;;-1:-1:-1;;35245:404:0;;;-1:-1:-1;;;35245:404:0;;;;;;;;;;-1:-1:-1;35245:404:0;;;;;-1:-1:-1;35245:404:0;;;;;55851:202;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;55851:202:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55851:202:0;;-1:-1:-1;;55851:202:0;;;-1:-1:-1;;;55851:202:0;;;;;;-1:-1:-1;55851:202:0;;-1:-1:-1;55851:202:0;55045:229;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55045:229:0;;-1:-1:-1;;55045:229:0;;;-1:-1:-1;;;55045:229:0;;;;;;;;-1:-1:-1;;;;;55045:229:0;;-1:-1:-1;55045:229:0;;-1:-1:-1;55045:229:0;36754:1068;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36754:1068:0;;-1:-1:-1;;36754:1068:0;;;-1:-1:-1;;;36754:1068:0;;;;;;;;;;-1:-1:-1;36754:1068:0;;;;;-1:-1:-1;36754:1068:0;;;;;-1:-1:-1;;;;;36754:1068:0;;;;;;;;;;;17058:172;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;17058:172:0;-1:-1:-1;;;;;17058:172:0;;;;;;;;;;;;7982:23;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7982:23:0;;;;27639:283;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;27639:283:0;-1:-1:-1;;;;;27639:283:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;27639:283:0;;;;;;;;;;;;;;;;;17635:203;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;17635:203:0;-1:-1:-1;;;;;17635:203:0;;;;;;;;;;;;;;;;;56127:347;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;56127:347:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56127:347:0;;-1:-1:-1;;56127:347:0;;;-1:-1:-1;;;56127:347:0;;;;;-1:-1:-1;;;;;56127:347:0;;;;;;-1:-1:-1;56127:347:0;;;;-1:-1:-1;56127:347:0;;16517:180;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;16517:180:0;-1:-1:-1;;;;;16517:180:0;;;;;;;;;;;;8891:158;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;8891:158:0;-1:-1:-1;;;;;8891:158:0;;;;;54339:202;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54339:202:0;;-1:-1:-1;;54339:202:0;;;-1:-1:-1;;;54339:202:0;;;;;;-1:-1:-1;54339:202:0;;-1:-1:-1;54339:202:0;26582:240;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;26582:240:0;;;;;14362:224;8453:12;:10;:12::i;:::-;14522:26;:56;;;;;;;-1:-1:-1;;14522:56:0;;;;;;;;;14362:224::o;27048:209::-;8453:12;:10;:12::i;:::-;27169:6;9937:23;9951:8;9937:13;:23::i;:::-;27194:6;10291:18;10300:8;10291;:18::i;:::-;-1:-1:-1;;;;;;;27218:19:0;;;;;;;;:11;:19;;;;;:31;;-1:-1:-1;;27218:31:0;;;;;;;;;;27048:209::o;54106:159::-;54190:7;54199;54227:26;54238:5;54245:7;54227:10;:26::i;:::-;54219:38;54255:1;;-1:-1:-1;54106:159:0;-1:-1:-1;;;54106:159:0:o;56851:383::-;57105:7;57137:89;57151:5;57158:7;57167:10;57179:12;57193:17;57212:13;57137;:89::i;:::-;57130:96;56851:383;-1:-1:-1;;;;;;;56851:383:0:o;12049:38::-;;;;;;;;;:::o;13007:925::-;13237:29;13124:5;;-1:-1:-1;;;;;13124:5:0;13110:10;:19;;:50;;-1:-1:-1;13134:26:0;;;;;;;13133:27;13110:50;13102:80;;;;;;;-1:-1:-1;;;;;13102:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13287:28;13297:17;13287:9;:28::i;:::-;13436:8;;13237:79;;-1:-1:-1;;;;;;13413:32:0;;;13436:8;;13413:32;;;;:61;;-1:-1:-1;;;;;;13449:25:0;;;;13413:61;13405:94;;;;;;;-1:-1:-1;;;;;13405:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13614:40;;;;;;13636:17;13614:40;;;;;;13666:1;;-1:-1:-1;;;;;13614:21:0;;;;;:40;;;;;;;;;;;;;;;13666:1;13614:21;:40;;;5:2:-1;;;;30:1;27;20:12;5:2;13614:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13614:40:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13614:40:0;-1:-1:-1;;;;;13614:54:0;;;13606:87;;;;;-1:-1:-1;;;;;13606:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13800:8;;;13785:12;:23;;-1:-1:-1;;;;;13800:8:0;;;-1:-1:-1;;13785:23:0;;;;;;;13902:22;;;;;;;;;;;13007:925::o;54615:356::-;54844:7;54876:87;54890:5;54897:7;54906:10;54926:1;54930:17;54949:13;54876;:87::i;:::-;54869:94;54615:356;-1:-1:-1;;;;;;54615:356:0:o;25288:38::-;;;;:::o;20025:246::-;8453:12;:10;:12::i;:::-;20156:6;9937:23;9951:8;9937:13;:23::i;:::-;20186:3;9937:23;9951:8;9937:13;:23::i;:::-;20208:3;10291:18;10300:8;10291;:18::i;:::-;20229:34;20242:6;20250:3;20255:7;20229:12;:34::i;:::-;9971:1;;8476;20025:246;;;:::o;11959:37::-;;;-1:-1:-1;;;;;11959:37:0;;:::o;9140:208::-;9207:8;;-1:-1:-1;;;;;9207:8:0;9193:10;:22;9185:52;;;;;-1:-1:-1;;;;;9185:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9272:8;;;9265:5;;9253:28;;-1:-1:-1;;;;;9272:8:0;;;;9265:5;;;;9253:28;;;9300:8;;;;9292:16;;-1:-1:-1;;9292:16:0;;;-1:-1:-1;;;;;9300:8:0;;9292:16;;;;9319:21;;;9140:208::o;11870:33::-;;;-1:-1:-1;;;;;11870:33:0;;:::o;28299:3217::-;28378:7;28398:14;28423:11;28445:14;28470:15;28496:13;28520:20;28551:22;28864:9;28920:23;28973:18;29021:23;28591:25;28601:14;28591:9;:25::i;:::-;28551:66;;28639:7;28630:16;;28754:1;28739:5;:12;:16;:41;;;;-1:-1:-1;28759:12:0;;28774:1;;28759:16;28779:1;28759:21;28739:41;28731:70;;;;;;;-1:-1:-1;;;;;28731:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;28876:1;28864:13;;28859:2624;28883:5;:12;28879:1;:16;28859:2624;;;28946:5;28956:1;28952;:5;28946:12;;;;;;;;;;;;;;;;;;28920:38;;28994:5;29004:1;29000;:5;28994:12;;;;;;;;;;;;;;;;;;28973:33;;29047:5;29053:1;29047:8;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29115:24:0;;;;;;:11;:24;;;;;;;;29047:8;;-1:-1:-1;29115:24:0;;29111:93;;;24963:42;29158:46;;29111:93;-1:-1:-1;;;;;29223:24:0;;;;;;:11;:24;;;;;;;;29219:93;;;-1:-1:-1;24963:42:0;29219:93;29348:6;-1:-1:-1;;;;;29333:21:0;:11;-1:-1:-1;;;;;29333:21:0;;29329:2143;;;29471:1;29467;:5;:31;;;;29486:5;29496:1;29492;:5;29486:12;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29476:22:0;:6;-1:-1:-1;;;;;29476:22:0;;;29467:31;29463:201;;;29544:6;-1:-1:-1;;;;;29532:31:0;;:33;;;;;-1:-1:-1;;;29532:33:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29532:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29532:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29532:33:0;29611:32;;;;;;;;29532:33;;-1:-1:-1;;;;;;29611:30:0;;;;;:32;;;;;29532:33;;29611:32;;;;;;;;;:30;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;29611:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29611:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29611:32:0;;-1:-1:-1;29463:201:0;29750:9;-1:-1:-1;;;;;29750:29:0;;29780:11;29750:42;;;;;-1:-1:-1;;;29750:42:0;;;;;;;-1:-1:-1;;;;;29750:42:0;-1:-1:-1;;;;;29750:42:0;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29750:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29750:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29750:42:0;29830:33;;;;;;-1:-1:-1;;;;;29830:33:0;;;;;;;;;29750:42;;-1:-1:-1;29830:20:0;;;;;;:33;;;;;;;;;;;;;;;-1:-1:-1;29830:20:0;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;29830:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29830:33:0;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;29830:33:0;;;;;;29891:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29830:33;;-1:-1:-1;;;;;;29891:20:0;;;;;:53;;;;;;;;;;-1:-1:-1;29891:20:0;:53;;;5:2:-1;;;;30:1;27;20:12;5:2;29891:53:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29891:53:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29891:53:0;29980:25;;;;;;;;29891:53;;-1:-1:-1;29969:68:0;;24836:7;;29969:37;;-1:-1:-1;;;;;29980:23:0;;;;;:25;;;;;29891:53;;29980:25;;;;;;;;:23;:25;;;5:2:-1;;;;30:1;27;20:12;5:2;29980:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29980:25:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29980:25:0;29969:6;;:37;;;;;:10;:37;:::i;:::-;:41;:68;:41;:68;:::i;:::-;30056:13;;;;;29963:74;-1:-1:-1;30172:18:0;:6;30056:13;30172:18;:10;:18;:::i;:::-;30163:27;;29329:2143;;;30244:6;-1:-1:-1;;;;;30229:21:0;:11;-1:-1:-1;;;;;30229:21:0;;30225:1247;;;30368:1;30364;:5;:31;;;;30383:5;30393:1;30389;:5;30383:12;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30373:22:0;:6;-1:-1:-1;;;;;30373:22:0;;;30364:31;30360:201;;;30441:6;-1:-1:-1;;;;;30429:31:0;;:33;;;;;-1:-1:-1;;;30429:33:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30429:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30429:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30429:33:0;30508:32;;;;;;;;30429:33;;-1:-1:-1;;;;;;30508:30:0;;;;;:32;;;;;30429:33;;30508:32;;;;;;;;;:30;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;30508:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30508:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30508:32:0;;-1:-1:-1;30360:201:0;30647:9;-1:-1:-1;;;;;30647:29:0;;30677:11;30647:42;;;;;-1:-1:-1;;;30647:42:0;;;;;;;-1:-1:-1;;;;;30647:42:0;-1:-1:-1;;;;;30647:42:0;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30647:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30647:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30647:42:0;30727:33;;;;;;-1:-1:-1;;;;;30727:33:0;;;;;;;;;30647:42;;-1:-1:-1;30727:20:0;;;;;;:33;;;;;;;;;;;;;;;-1:-1:-1;30727:20:0;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;30727:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30727:33:0;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;30727:33:0;;;;;;30788:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30727:33;;-1:-1:-1;;;;;;30788:16:0;;;;;:49;;;;;;;;;;-1:-1:-1;30788:16:0;:49;;;5:2:-1;;;;30:1;27;20:12;5:2;30788:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30788:49:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30788:49:0;30873:25;;;;;;;;30788:49;;-1:-1:-1;30862:68:0;;24836:7;;30862:37;;-1:-1:-1;;;;;30873:23:0;;;;;:25;;;;;30788:49;;30873:25;;;;;;;;:23;:25;;;5:2:-1;;;;30:1;27;20:12;30862:68:0;30949:13;;;;;30856:74;-1:-1:-1;31065:18:0;:6;30949:13;31065:18;:10;:18;:::i;30225:1247::-;31238:1;31234;:5;:31;;;;31253:5;31263:1;31259;:5;31253:12;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31243:22:0;:6;-1:-1:-1;;;;;31243:22:0;;;31234:31;31230:136;;;31330:6;-1:-1:-1;;;;;31313:30:0;;:32;;;;;-1:-1:-1;;;31313:32:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31313:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31313:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31313:32:0;;-1:-1:-1;31230:136:0;31402:54;31412:9;31423:11;31436;31449:6;31402:9;:54::i;:::-;31386:70;;-1:-1:-1;31386:70:0;-1:-1:-1;30225:1247:0;28902:1;28897:6;;;;28859:2624;;;-1:-1:-1;31502:6:0;;28299:3217;-1:-1:-1;;;;;;;;;;;;28299:3217:0:o;25364:44::-;;;;;;;;;;;;;;;:::o;38773:583::-;38932:7;39153:14;39039:8;-1:-1:-1;;;;;39039:14:0;;:16;;;;;-1:-1:-1;;;39039:16:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39039:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39039:16:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39039:16:0;39027:8;;-1:-1:-1;;;;;39027:28:0;;;;:5;;39033:1;;39027:8;;;;;;;;;;;;;;;-1:-1:-1;;;;;39027:28:0;;39019:65;;;;;-1:-1:-1;;;;;39019:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;39170:54;;;;;;;;;;;;39213:10;39170:54;;;;;;-1:-1:-1;;;;;39170:27:0;;;;;:54;;;;;;;;;;;;;;-1:-1:-1;39170:27:0;:54;;;5:2:-1;;;;30:1;27;20:12;5:2;39170:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39170:54:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39170:54:0;;-1:-1:-1;39279:69:0;39293:5;39170:54;39308:10;39320:12;39342:1;;39279:13;:69::i;7955:20::-;;;-1:-1:-1;;;;;7955:20:0;;:::o;55348:429::-;55648:7;55618:10;9595:24;9612:6;9595:16;:24::i;:::-;55680:89;55694:5;55701:7;55710:10;55722:12;55736:17;55755:13;55680;:89::i;:::-;55673:96;55348:429;-1:-1:-1;;;;;;;;55348:429:0:o;56548:229::-;56672:7;56699:70;56713:5;56720:7;56729:10;56741:12;56763:1;56767;56699:13;:70::i;:::-;56692:77;56548:229;-1:-1:-1;;;;;56548:229:0:o;14011:137::-;8453:12;:10;:12::i;:::-;14128;;14117:8;:23;;-1:-1:-1;;14117:23:0;-1:-1:-1;;;;;14128:12:0;;;14117:23;;;;;;14011:137::o;32680:1573::-;32940:7;33356:24;33745:19;33921:28;34024:14;15502:12;:10;:12::i;:::-;15525:6;:13;;-1:-1:-1;;15525:13:0;;;;;32910:10;9595:24;32910:10;9595:16;:24::i;:::-;33094:1;33079:5;:12;:16;:41;;;;-1:-1:-1;33099:12:0;;33114:1;;33099:16;33119:1;33099:21;33079:41;33071:70;;;;;;;-1:-1:-1;;;;;33071:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;33233:64;33251:5;33257:1;33251:8;;;;;;;;;;;;;;;;;;33278:5;33284:1;33278:8;;;;;;;;;;;;;;;;;;33289:7;33233:17;:64::i;:::-;33383:5;;-1:-1:-1;;;;;;33403:31:0;;;33399:294;;;33459:18;;33451:56;;;;;-1:-1:-1;;;;;33451:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;33399:294;;;33561:13;33557:1;:17;:53;;;;;33595:15;;33578:13;:32;;33557:53;33549:91;;;;;;;-1:-1:-1;;;;;33549:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;33677:4;33655:26;;33399:294;33767:10;;-1:-1:-1;;;;;;33792:26:0;;;33788:71;;33847:12;33833:26;;33788:71;33952:61;33973:5;33980:11;33993:19;33952:20;:61::i;:::-;33921:92;;34041:73;34054:4;34060:7;34069:10;34081:17;34100:13;34041:12;:73::i;:::-;34024:90;;34175:44;34193:4;34199:6;34207:11;34175:17;:44::i;:::-;-1:-1:-1;15561:6:0;:14;;-1:-1:-1;;15561:14:0;;;34239:6;32680:1573;-1:-1:-1;;;;;;;;;;32680:1573:0:o;35245:404::-;35507:7;35539:102;35549:5;35556:7;35565:10;35577:17;35596:14;35612:13;35635:1;35639;35539:9;:102::i;55851:202::-;55950:7;55977:68;55991:5;55998:7;56007:10;56027:1;56039;56043;55977:13;:68::i;:::-;55970:75;55851:202;-1:-1:-1;;;;55851:202:0:o;36754:1068::-;37122:7;37147:23;37207:16;37455:14;37092:10;9595:24;9612:6;9595:16;:24::i;:::-;37179:12;;37173:5;;-1:-1:-1;;37179:16:0;;;37173:23;;;;;;;;;;;;;;37147:49;;37235:19;37245:8;37235:9;:19::i;:::-;37207:48;;37344:20;37354:9;37344;:20::i;:::-;-1:-1:-1;;;;;37329:35:0;;;;;;37321:72;;;;;-1:-1:-1;;;;;37321:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;37472:81;37486:5;37493:7;37502:10;37514:4;37520:17;37539:13;37472;:81::i;:::-;37455:98;;37602:45;37618:11;37631:7;37640:6;37602:15;:45::i;:::-;37713:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37713:17:0;;;;;:75;;;;;;;;;;;;;;;:17;:75;;;5:2:-1;;;;30:1;27;20:12;5:2;37713:75:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;37808:6:0;;36754:1068;-1:-1:-1;;;;;;;;;;;;;;;36754:1068:0:o;17058:172::-;15995:38;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17162:59:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;17162:59:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;17162:59:0;;;179:29:-1;;;;160:49;;;17146:76:0;;17154:6;;17146:7;:76::i;:::-;17058:172;;;:::o;7982:23::-;;;-1:-1:-1;;;;;7982:23:0;;:::o;27639:283::-;27736:9;27758:32;27815:33;27825:22;27815:9;:33::i;:::-;27867:47;;;;;;-1:-1:-1;;;;;27867:47:0;;;;;;;;;;;;;;;;27758:91;;-1:-1:-1;27867:19:0;;;;;;:47;;;;;-1:-1:-1;;27867:47:0;;;;;;;;-1:-1:-1;27867:19:0;:47;;;5:2:-1;;;;30:1;27;20:12;5:2;27867:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27867:47:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;27867:47:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;27867:47:0;;;;;;20:11:-1;15:3;12:20;9:2;;;45:1;42;35:12;9:2;64:21;;126:4;117:14;;142:31;;;139:2;;;186:1;183;176:12;139:2;224:3;218:10;339:9;333:2;319:12;315:21;297:16;293:44;290:59;268:11;254:12;251:29;239:119;236:2;;;371:1;368;361:12;236:2;-1:-1;27867:47:0;;-1:-1:-1;;;;;27639:283:0;;;;;;:::o;17635:203::-;16102:50;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17758:71:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;17758:71:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;17758:71:0;;;179:29:-1;;;;160:49;;;17742:88:0;;17750:6;;17742:7;:88::i;:::-;17635:203;;;;:::o;16517:180::-;15894:37;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16625:63:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;16625:63:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;16625:63:0;;;179:29:-1;;;;160:49;;;16609:80:0;;16617:6;;16609:7;:80::i;8891:158::-;8453:12;:10;:12::i;:::-;8986:5;;-1:-1:-1;;;;;8973:18:0;;;8986:5;;8973:18;;8965:45;;;;;-1:-1:-1;;;;;8965:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9021:8;:20;;-1:-1:-1;;9021:20:0;-1:-1:-1;;;;;9021:20:0;;;;;;;;;;8891:158::o;26582:240::-;8453:12;:10;:12::i;:::-;24902:7;26695:44;;;26687:82;;;;;-1:-1:-1;;;;;26687:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;26780:15;:34;26582:240::o;8540:104::-;8609:5;;-1:-1:-1;;;;;8609:5:0;8595:10;:19;8587:49;;;;;-1:-1:-1;;;;;8587:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;8540:104::o;10035:128::-;-1:-1:-1;;;;;10109:22:0;;;;10101:54;;;;;-1:-1:-1;;;;;10101:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10035:128;:::o;10384:126::-;-1:-1:-1;;;;;10453:25:0;;10473:4;10453:25;;10445:57;;;;;-1:-1:-1;;;;;10445:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;14784:133;14876:8;;:33;;;;;;;;;;;;;;14849:7;;-1:-1:-1;;;;;14876:8:0;;:18;;:33;;;;;;;;;;;;;;14849:7;14876:8;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;14876:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14876:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14876:33:0;;14784:133;-1:-1:-1;;14784:133:0:o;21418:250::-;21478:7;;21531;;21527:34;;;21560:1;21553:8;;;;21527:34;-1:-1:-1;21586:7:0;;;21591:2;21586;:7;21612:6;;;;;;;;:12;21604:37;;;;;-1:-1:-1;;;;;21604:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;21659:1;21418:250;-1:-1:-1;;;21418:250:0:o;21896:174::-;21956:7;;21984:6;;;21976:37;;;;;-1:-1:-1;;;;;21976:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;22041:2;22036;:7;;;;;;;;;21896:174;-1:-1:-1;;;;21896:174:0:o;20655:169::-;20715:7;20747;;;20773;;;;20765:32;;;;;-1:-1:-1;;;;;20765:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;21047:147;21107:7;21135:8;;;;21127:34;;;;;-1:-1:-1;;;;;21127:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21179:7:0;;;21047:147::o;52110:900::-;52228:7;52237;52257:21;;:::i;:::-;51965:47;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52309:85:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;52309:85:0;;;;;;25:18:-1;;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;52309:85:0;;;179:29:-1;;;;160:49;;52681:11:0;;52309:85;;51965:47;52782:3;;52524:5;52475:3;52446:431;52901:7;52894:15;52891:2;;;52939:1;52936;52929:12;52891:2;-1:-1:-1;;52987:6:0;;;52995;;;;52987;;52995;;-1:-1:-1;52110:900:0;-1:-1:-1;;;;;52110:900:0:o;9694:112::-;9778:1;9769:10;;9761:37;;;;;-1:-1:-1;;;;;9761:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;15638:89;15694:6;;;;;;;15693:7;15685:34;;;;;-1:-1:-1;;;;;15685:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;42985:1653;43100:25;43166:21;43139:7;-1:-1:-1;;;;;43139:13:0;;:15;;;;;-1:-1:-1;;;43139:15:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43139:15:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43139:15:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43139:15:0;;-1:-1:-1;43190:38:0;43139:15;43190:22;:38::i;:::-;43166:62;;43273:1;43261:9;:13;43257:1374;;;43334:9;:20;;43326:56;;;;;-1:-1:-1;;;;;43326:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;43617:16;43616:17;43612:125;;;43664:45;43694:14;43664:29;:45::i;:::-;-1:-1:-1;;;;;43652:66:0;;43725:9;43652:85;;;;;-1:-1:-1;;;43652:85:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43652:85:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43652:85:0;;;;;43612:125;43257:1374;;;-1:-1:-1;;;;;43791:25:0;;;;;;:11;:25;;;;;;;;43787:844;;;44003:57;44020:12;44034:10;44046:4;44052:7;44003:16;:57::i;:::-;44130:16;44126:82;;;44177:12;-1:-1:-1;;;;;44165:34:0;;44200:7;44165:43;;;;;-1:-1:-1;;;44165:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44165:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44165:43:0;;;;43787:844;;;44423:16;44419:200;;;44458:67;44475:12;44489:10;44501:14;44517:7;44458:16;:67::i;44419:200::-;44562:57;44579:12;44593:10;44605:4;44611:7;44562:16;:57::i;:::-;42985:1653;;;;;:::o;46389:4180::-;46521:16;46550:28;46642:26;46687:16;46822:9;46909:23;46990:20;47054:23;47195:24;48120:30;;:::i;:::-;46602:22;;46627:1;;46602:26;46581:48;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;46550:79;;46671:5;46642:34;;46706:20;46716:9;46706;:20::i;:::-;46687:39;;46851:1;46847:5;;46842:1216;46883:1;46858:15;:22;:26;46854:1;:30;46842:1216;;;46952:15;46968:1;46972;46968:5;46952:22;;;;;;;;;;;;;;;;;;46909:66;;47024:6;-1:-1:-1;;;;;47024:12:0;;:14;;;;;-1:-1:-1;;;47024:14:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47024:14:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47024:14:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47024:14:0;47080:22;;47024:14;;-1:-1:-1;47080:15:0;;47100:1;47096:5;;;47080:22;;;;;;;;;;;;;;47054:48;;47222:20;:46;;;;;47247:21;47246:22;47222:46;:73;;;;;47287:8;-1:-1:-1;;;;;47272:23:0;:11;-1:-1:-1;;;;;47272:23:0;;47222:73;47195:100;;47314:19;47310:70;;;47376:4;47352:28;;47310:70;47411:635;;;;;;;;;47574:9;-1:-1:-1;;;;;47411:635:0;;;;;47498:6;-1:-1:-1;;;;;47411:635:0;;;;;47666:15;47682:1;47666:18;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47411:635:0;;;;;47716:11;-1:-1:-1;;;;;47411:635:0;;;;;47861:1;-1:-1:-1;;;;;47411:635:0;;;;;47938:33;47961:9;47938:22;:33::i;:::-;47411:635;;;;;;;;;;;;47397:4;47406:1;47402;:5;47397:11;;;;;;;;;;;;;;;;;;:649;46891:1;46886:6;;;;;46842:1216;;;48153:4;48158:1;48153:7;;;;;;;;;;;;;;;;;;;;48187:20;;;;;-1:-1:-1;;;;;48175:33:0;;;;;:11;:33;;;;;;;48153:7;;-1:-1:-1;48175:33:0;;48171:498;;;48321:8;:31;;;48317:340;;;24963:42;48371:20;;;:55;48317:340;;;48637:18;;48607:49;;:29;:49::i;:::-;-1:-1:-1;;;;;48572:85:0;:20;;;:85;48317:340;48723:11;;48718:4;;-1:-1:-1;;48723:15:0;;;48718:21;;;;;;;;;;;;;;;;48766:20;;;;-1:-1:-1;;;;;48754:33:0;;;;;:11;:33;;;;;;;;48718:21;;-1:-1:-1;48754:33:0;;48750:498;;;48900:8;:31;;;48896:340;;;24963:42;48950:20;;;:55;48896:340;;;49216:18;;49186:49;;:29;:49::i;:::-;-1:-1:-1;;;;;49151:85:0;:20;;;:85;48896:340;49315:1;49311:5;;49306:1232;49322:4;:11;49318:1;:15;49306:1232;;;49366:4;49371:1;49366:7;;;;;;;;;;;;;;;;;;49355:18;;49525:8;:31;;;49521:1006;;;49681:8;:28;;;49677:664;;;49755:4;49732:20;;;:27;49677:664;;;49886:1;49872:4;:11;:15;49867:1;:20;49863:478;;;-1:-1:-1;;;;;49910:35:0;;:20;;;:35;49863:478;;;50071:4;50076:1;50080;50076:5;50071:11;;;;;;;;;;;;;;;;;;:34;;;50067:274;;;50151:4;50156:1;50160;50156:5;50151:11;;;;;;;;;;;;;;;;;;;:21;-1:-1:-1;;;;;50128:44:0;:20;;;:44;50067:274;;;50337:4;50314:20;;;:27;50067:274;49521:1006;;;50507:4;50484:20;;;:27;49521:1006;49335:3;;;;;49306:1232;;;-1:-1:-1;50557:4:0;;46389:4180;-1:-1:-1;;;;;;;;;;;46389:4180:0:o;39973:2665::-;40175:7;40195:16;40222:18;40313:9;40366:30;;:::i;:::-;42034:23;40243:7;40222:28;;40325:1;40313:13;;40308:2165;40332:5;:12;40328:1;:16;40308:2165;;;40399:5;40405:1;40399:8;;;;;;;;;;;;;;;;;;40366:41;;40460:8;:31;;;40456:862;;;40706:6;;;;;:51;;-1:-1:-1;40716:12:0;;40752:4;;40716:5;;-1:-1:-1;;40722:5:0;;;40716:12;;;;;;;;;;;;;;:24;;;-1:-1:-1;;;;;40716:41:0;;40706:51;:89;;;;-1:-1:-1;40774:20:0;;;;;-1:-1:-1;;;;;40762:33:0;;;;;:11;:33;;;;;;40761:34;40706:89;40702:182;;;40818:66;40831:8;:20;;;40853:8;:18;;;40873:10;40818:12;:66::i;:::-;40456:862;;;41104:8;:15;;;-1:-1:-1;;;;;41068:52:0;:8;:20;;;-1:-1:-1;;;;;41068:52:0;;;41064:254;;;41233:69;41249:8;:20;;;41271:8;:18;;;41291:10;41233:15;:69::i;:::-;41373:8;:31;;;41372:32;41368:552;;;41451:18;;41478:20;;;;;41500;;;;41434:102;;;;;-1:-1:-1;;;;;41434:102:0;;;;;;;;;;;;;;;;;;;;41534:1;41434:102;;;;;;:43;;;;;:102;;;;;;;;;;;;;;;41451:18;41434:43;:102;;;5:2:-1;;;;30:1;27;20:12;5:2;41434:102:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41434:102:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41434:102:0;;-1:-1:-1;41368:552:0;;;41572:20;;;;;-1:-1:-1;;;;;41560:33:0;;;;;:11;:33;;;;;;41556:364;;;41623:18;;41667:20;;;;;41689;;;;41735;;;;41623:133;;;;;-1:-1:-1;;;;;41623:133:0;;;;;;;;;;;;;;;;;;;;41723:10;41623:133;;;;;;;;;;;;:26;;;;;41656:9;;41623:133;;;;;;;;;;;;;;41656:9;41623:26;:133;;;5:2:-1;;;;30:1;27;20:12;5:2;41623:133:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41623:133:0;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;41556:364:0;41804:18;;41831:20;;;;;41853;;;;41899;;;;41804:116;;;;;-1:-1:-1;;;;;41804:116:0;;;;;;;;;;;;;;;;;;;;41887:10;41804:116;;;;;;;;;;;;:26;;;;;:116;;;;;;;;;;;;;;;:18;:26;:116;;;5:2:-1;;;;30:1;27;20:12;5:2;41804:116:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41804:116:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41804:116:0;;-1:-1:-1;41556:364:0;41985:8;:28;;;41981:318;;;42060:57;24902:7;42060:27;:8;42073:13;42060:27;:12;:27;:::i;:57::-;42034:83;;42144:8;:20;;;-1:-1:-1;;;;;42144:29:0;;42174:17;42193:15;42144:65;;;;;-1:-1:-1;;;42144:65:0;;;;;;;-1:-1:-1;;;;;42144:65:0;-1:-1:-1;;;;;42144:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42144:65:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42144:65:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42144:65:0;42136:101;;;;;;;-1:-1:-1;;;;;42136:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;42268:15;42256:27;;;;41981:318;42370:8;:20;;;-1:-1:-1;;;;;42320:105:0;42348:8;:20;;;-1:-1:-1;;;;;42320:105:0;42331:8;:15;;;-1:-1:-1;;;;;42320:105:0;;42392:10;42404:8;42414:10;42320:105;;;;;;;;;;;;;;-1:-1:-1;;;;;42320:105:0;-1:-1:-1;;;;;42320:105:0;;;;;;;;;;;;;;;;;42453:8;;-1:-1:-1;40346:3:0;;;;;40308:2165;;;42557:22;;;;42549:53;;;;;-1:-1:-1;;;;;42549:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42622:8:0;;39973:2665;-1:-1:-1;;;;;;;;;39973:2665:0:o;45003:869::-;45112:30;;:::i;:::-;45321:23;45145:5;45166:1;45151:5;:12;:16;45145:23;;;;;;;;;;;;;;;;;;;45250:20;;;;45145:23;;-1:-1:-1;;;;;;45250:37:0;45282:4;45250:37;45246:63;;45302:7;;45246:63;-1:-1:-1;45347:20:0;;;;-1:-1:-1;;;;;45413:24:0;;;;;;:11;:24;;;;;;;;45409:456;;;45538:31;;;;45537:32;45530:40;;;;45687:11;-1:-1:-1;;;;;45675:35:0;;45711:12;45725:7;45675:58;;;;;-1:-1:-1;;;45675:58:0;;;;;;;-1:-1:-1;;;;;45675:58:0;-1:-1:-1;;;;;45675:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;45409:456:0;45805:48;45818:11;45831:12;45845:7;45805:12;:48::i;51035:339::-;51153:32;;;;;;51170:4;51153:32;;;;-1:-1:-1;;;;;51153:32:0;;;;;;;;;51133:17;;51153:16;;;;;:32;;;;;;;;;;;;;;51133:17;51153:16;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;51153:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51153:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;51153:32:0;;-1:-1:-1;51200:18:0;;;51196:171;;;51251:1;51239:9;:13;51235:68;;;51271:32;51283:6;51291:8;51301:1;51271:11;:32::i;:::-;51318:37;51330:6;51338:8;51348:6;51318:11;:37::i;18189:793::-;18265:21;;:::i;:::-;:36;;;;;;;;;18298:1;18265:36;;;;;18782:2;18732:3;18636:5;18630:12;18538:2;18531:5;18527:14;18482:1;18426:6;18376:3;18353:476;18853:7;18846:15;18843:2;;;18891:1;18888;18881:12;18843:2;-1:-1:-1;18939:6:0;;:11;;18931:43;;;;;-1:-1:-1;;;;;18931:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;53284:748;53362:4;53379:12;53402:21;;:::i;:::-;53082:28;;;;;;;;;;;;;;;;22:32:-1;6:49;;53454:54:0;;;;;;49:4:-1;25:18;;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;53454:54:0;;;179:29:-1;;;;160:49;;53791:11:0;;53082:28;;49:4:-1;;53892:3:0;;53634:10;53585:3;53556:431;53545:442;;54017:7;54010:14;;53284:748;;;;;;;:::o;51458:441::-;51542:7;51562:20;51633:9;51686:27;51585:10;-1:-1:-1;;;;;51585:30:0;;:32;;;;;-1:-1:-1;;;51585:32:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51585:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51585:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;51585:32:0;51562:55;;;-1:-1:-1;51645:1:0;;-1:-1:-1;51628:225:0;51652:12;51648:1;:16;51628:225;;;51716:10;-1:-1:-1;;;;;51716:26:0;;51743:1;51716:29;;;;;-1:-1:-1;;;51716:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51716:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51716:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;51716:29:0;-1:-1:-1;;;;;51764:32:0;;;;;;:11;51716:29;51764:32;;;;;51716:29;;-1:-1:-1;51764:32:0;;51760:81;;;51822:19;51815:26;;;;51760:81;51666:3;;;;;51628:225;;;-1:-1:-1;24963:42:0;;51458:441;-1:-1:-1;;;;51458:441:0:o;24646:32591::-;;;;;;;;;;;;;;;105:10:-1;24646:32591:0;88:34:-1;-1:-1;24646:32591:0;;;-1:-1:-1;;24646:32591:0:o;:::-;;;;;;;;;-1:-1:-1;24646:32591:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;24646:32591:0;;;-1:-1:-1;;24646:32591:0:o
Swarm Source
bzzr://8faa148590c5cf11bb22b275ad74029da127dc0d3675cfd5154f32fdb38bec20
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.