ETH Price: $2,094.33 (-0.78%)

Contract

0x7557f4199aa99e5396330BaC3b7bDAa262CB1913
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Execute108266292020-09-09 9:05:222011 days ago1599642322IN
0x7557f419...262CB1913
0 ETH0.01319241105
Execute105808152020-08-02 13:56:062049 days ago1596376566IN
0x7557f419...262CB1913
0 ETH0.0109951687.5
Execute105804502020-08-02 12:34:502049 days ago1596371690IN
0x7557f419...262CB1913
0 ETH0.0128351391.25
Execute103585732020-06-29 4:20:452084 days ago1593404445IN
0x7557f419...262CB1913
0 ETH0.0080891241.25
Execute103305592020-06-24 20:09:362088 days ago1593029376IN
0x7557f419...262CB1913
0 ETH0.0089003245
Execute103305522020-06-24 20:08:032088 days ago1593029283IN
0x7557f419...262CB1913
0 ETH0.0095740245
Execute102431952020-06-11 7:57:322101 days ago1591862252IN
0x7557f419...262CB1913
0 ETH0.0078327639.6
Execute102415102020-06-11 1:44:442102 days ago1591839884IN
0x7557f419...262CB1913
0 ETH0.0079687630.8
Execute102175822020-06-07 8:23:222105 days ago1591518202IN
0x7557f419...262CB1913
0 ETH0.0099549245.1
Execute102130072020-06-06 15:40:022106 days ago1591458002IN
0x7557f419...262CB1913
0 ETH0.0197173984.7
Execute101754022020-05-31 19:09:302112 days ago1590952170IN
0x7557f419...262CB1913
0 ETH0.0043617219.8
Execute101688782020-05-30 18:54:272113 days ago1590864867IN
0x7557f419...262CB1913
0 ETH0.0060480130.8
Execute101670252020-05-30 12:01:152113 days ago1590840075IN
0x7557f419...262CB1913
0 ETH0.0089421638.5
Execute101660742020-05-30 8:33:562113 days ago1590827636IN
0x7557f419...262CB1913
0 ETH0.0117610538.5
Execute101655552020-05-30 6:35:112113 days ago1590820511IN
0x7557f419...262CB1913
0 ETH0.0023664935.2
Execute101655552020-05-30 6:35:112113 days ago1590820511IN
0x7557f419...262CB1913
0 ETH0.0077684635.2
Execute101648642020-05-30 4:03:072114 days ago1590811387IN
0x7557f419...262CB1913
0 ETH0.0061385826.4
Execute101355452020-05-25 14:45:202118 days ago1590417920IN
0x7557f419...262CB1913
0 ETH0.0088788845.1
Execute101146322020-05-22 8:31:462121 days ago1590136306IN
0x7557f419...262CB1913
0 ETH0.0089731138.5
Execute101026612020-05-20 11:52:432123 days ago1589975563IN
0x7557f419...262CB1913
0 ETH0.010405136.3
Execute101015502020-05-20 7:46:512123 days ago1589960811IN
0x7557f419...262CB1913
0 ETH0.0078151737.4
Execute101015472020-05-20 7:46:222123 days ago1589960782IN
0x7557f419...262CB1913
0 ETH0.0097732537.4
Execute101010152020-05-20 5:45:092123 days ago1589953509IN
0x7557f419...262CB1913
0 ETH0.0095913833
Execute101001342020-05-20 2:23:432124 days ago1589941423IN
0x7557f419...262CB1913
0 ETH0.0069113629.7
Execute100984202020-05-19 20:00:382124 days ago1589918438IN
0x7557f419...262CB1913
0 ETH0.0040464917
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MakerV2Manager

Compiler Version
v0.5.4+commit.9549d8ff

Optimization Enabled:
Yes with 999 runs

Other Settings:
default evmVersion, GNU GPLv3 license
/**
 *Submitted for verification at Etherscan.io on 2019-12-02
*/

pragma solidity ^0.5.4;

/**
 * ERC20 contract interface.
 */
contract ERC20 {
    function totalSupply() public view returns (uint);
    function decimals() public view returns (uint);
    function balanceOf(address tokenOwner) public view returns (uint balance);
    function allowance(address tokenOwner, address spender) public view returns (uint remaining);
    function transfer(address to, uint tokens) public returns (bool success);
    function approve(address spender, uint tokens) public returns (bool success);
    function transferFrom(address from, address to, uint tokens) public returns (bool success);
}

/**
 * @title Module
 * @dev Interface for a module. 
 * A module MUST implement the addModule() method to ensure that a wallet with at least one module
 * can never end up in a "frozen" state.
 * @author Julien Niset - <[email protected]>
 */
interface Module {
    function init(BaseWallet _wallet) external;
    function addModule(BaseWallet _wallet, Module _module) external;
    function recoverToken(address _token) external;
}

/**
 * @title BaseWallet
 * @dev Simple modular wallet that authorises modules to call its invoke() method.
 * Based on https://gist.github.com/Arachnid/a619d31f6d32757a4328a428286da186 by 
 * @author Julien Niset - <[email protected]>
 */
contract BaseWallet {
    address public implementation;
    address public owner;
    mapping (address => bool) public authorised;
    mapping (bytes4 => address) public enabled;
    uint public modules;
    function init(address _owner, address[] calldata _modules) external;
    function authoriseModule(address _module, bool _value) external;
    function enableStaticCall(address _module, bytes4 _method) external;
    function setOwner(address _newOwner) external;
    function invoke(address _target, uint _value, bytes calldata _data) external returns (bytes memory _result);
}

/**
 * @title ModuleRegistry
 * @dev Registry of authorised modules. 
 * Modules must be registered before they can be authorised on a wallet.
 * @author Julien Niset - <[email protected]>
 */
contract ModuleRegistry {
    function registerModule(address _module, bytes32 _name) external;
    function deregisterModule(address _module) external;
    function registerUpgrader(address _upgrader, bytes32 _name) external;
    function deregisterUpgrader(address _upgrader) external;
    function recoverToken(address _token) external;
    function moduleInfo(address _module) external view returns (bytes32);
    function upgraderInfo(address _upgrader) external view returns (bytes32);
    function isRegisteredModule(address _module) external view returns (bool);
    function isRegisteredModule(address[] calldata _modules) external view returns (bool);
    function isRegisteredUpgrader(address _upgrader) external view returns (bool);
}

contract TokenPriceProvider {
    mapping(address => uint256) public cachedPrices;
    function setPrice(ERC20 _token, uint256 _price) public;
    function setPriceForTokenList(ERC20[] calldata _tokens, uint256[] calldata _prices) external;
    function getEtherValue(uint256 _amount, address _token) external view returns (uint256);
}

/**
 * @title GuardianStorage
 * @dev Contract storing the state of wallets related to guardians and lock.
 * The contract only defines basic setters and getters with no logic. Only modules authorised
 * for a wallet can modify its state.
 * @author Julien Niset - <[email protected]>
 * @author Olivier Van Den Biggelaar - <[email protected]>
 */
contract GuardianStorage {
    function addGuardian(BaseWallet _wallet, address _guardian) external;
    function revokeGuardian(BaseWallet _wallet, address _guardian) external;
    function guardianCount(BaseWallet _wallet) external view returns (uint256);
    function getGuardians(BaseWallet _wallet) external view returns (address[] memory);
    function isGuardian(BaseWallet _wallet, address _guardian) external view returns (bool);
    function setLock(BaseWallet _wallet, uint256 _releaseAfter) external;
    function isLocked(BaseWallet _wallet) external view returns (bool);
    function getLock(BaseWallet _wallet) external view returns (uint256);
    function getLocker(BaseWallet _wallet) external view returns (address);
}

/**
 * @title TransferStorage
 * @dev Contract storing the state of wallets related to transfers (limit and whitelist).
 * The contract only defines basic setters and getters with no logic. Only modules authorised
 * for a wallet can modify its state.
 * @author Julien Niset - <[email protected]>
 */
contract TransferStorage {
    function setWhitelist(BaseWallet _wallet, address _target, uint256 _value) external;
    function getWhitelist(BaseWallet _wallet, address _target) external view returns (uint256);
}

/**
 * @title Interface for a contract that can invest tokens in order to earn an interest.
 * @author Julien Niset - <[email protected]>
 */
interface Invest {

    event InvestmentAdded(address indexed _wallet, address _token, uint256 _invested, uint256 _period);
    event InvestmentRemoved(address indexed _wallet, address _token, uint256 _fraction);

    function addInvestment(
        BaseWallet _wallet, 
        address _token, 
        uint256 _amount, 
        uint256 _period
    ) 
        external
        returns (uint256 _invested);

    function removeInvestment(
        BaseWallet _wallet, 
        address _token, 
        uint256 _fraction
    ) 
        external;

    function getInvestment(
        BaseWallet _wallet,
        address _token
    )
        external
        view
        returns (uint256 _tokenValue, uint256 _periodEnd);
}

contract VatLike {
    function can(address, address) public view returns (uint);
    function dai(address) public view returns (uint);
    function hope(address) public;
}

contract JoinLike {
    function gem() public returns (GemLike);
    function dai() public returns (GemLike);
    function join(address, uint) public;
    function exit(address, uint) public;
    VatLike public vat;
}

contract PotLike {
    function chi() public view returns (uint);
    function pie(address) public view returns (uint);
    function drip() public;
}

contract ScdMcdMigration {
    function swapSaiToDai(uint wad) external;
    function swapDaiToSai(uint wad) external;
    JoinLike public saiJoin;
    JoinLike public wethJoin;
    JoinLike public daiJoin;
}

contract GemLike {
    function balanceOf(address) public view returns (uint);
    function transferFrom(address, address, uint) public returns (bool);
}

/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
library SafeMath {

    /**
    * @dev Multiplies two numbers, reverts on overflow.
    */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b);

        return c;
    }

    /**
    * @dev Integer division of two numbers truncating the quotient, reverts on division by zero.
    */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0); // Solidity only automatically asserts when dividing by 0
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
    * @dev Subtracts two numbers, reverts on overflow (i.e. if subtrahend is greater than minuend).
    */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a);
        uint256 c = a - b;

        return c;
    }

    /**
    * @dev Adds two numbers, reverts on overflow.
    */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a);

        return c;
    }

    /**
    * @dev Divides two numbers and returns the remainder (unsigned integer modulo),
    * reverts when dividing by zero.
    */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0);
        return a % b;
    }

    /**
    * @dev Returns ceil(a / b).
    */
    function ceil(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a / b;
        if(a % b == 0) {
            return c;
        }
        else {
            return c + 1;
        }
    }
}

/**
 * @title BaseModule
 * @dev Basic module that contains some methods common to all modules.
 * @author Julien Niset - <[email protected]>
 */
contract BaseModule is Module {

    // Empty calldata
    bytes constant internal EMPTY_BYTES = "";

    // The adddress of the module registry.
    ModuleRegistry internal registry;
    // The address of the Guardian storage
    GuardianStorage internal guardianStorage;

    /**
     * @dev Throws if the wallet is locked.
     */
    modifier onlyWhenUnlocked(BaseWallet _wallet) {
        // solium-disable-next-line security/no-block-members
        require(!guardianStorage.isLocked(_wallet), "BM: wallet must be unlocked");
        _;
    }

    event ModuleCreated(bytes32 name);
    event ModuleInitialised(address wallet);

    constructor(ModuleRegistry _registry, GuardianStorage _guardianStorage, bytes32 _name) public {
        registry = _registry;
        guardianStorage = _guardianStorage;
        emit ModuleCreated(_name);
    }

    /**
     * @dev Throws if the sender is not the target wallet of the call.
     */
    modifier onlyWallet(BaseWallet _wallet) {
        require(msg.sender == address(_wallet), "BM: caller must be wallet");
        _;
    }

    /**
     * @dev Throws if the sender is not the owner of the target wallet or the module itself.
     */
    modifier onlyWalletOwner(BaseWallet _wallet) {
        require(msg.sender == address(this) || isOwner(_wallet, msg.sender), "BM: must be an owner for the wallet");
        _;
    }

    /**
     * @dev Throws if the sender is not the owner of the target wallet.
     */
    modifier strictOnlyWalletOwner(BaseWallet _wallet) {
        require(isOwner(_wallet, msg.sender), "BM: msg.sender must be an owner for the wallet");
        _;
    }

    /**
     * @dev Inits the module for a wallet by logging an event.
     * The method can only be called by the wallet itself.
     * @param _wallet The wallet.
     */
    function init(BaseWallet _wallet) public onlyWallet(_wallet) {
        emit ModuleInitialised(address(_wallet));
    }

    /**
     * @dev Adds a module to a wallet. First checks that the module is registered.
     * @param _wallet The target wallet.
     * @param _module The modules to authorise.
     */
    function addModule(BaseWallet _wallet, Module _module) external strictOnlyWalletOwner(_wallet) {
        require(registry.isRegisteredModule(address(_module)), "BM: module is not registered");
        _wallet.authoriseModule(address(_module), true);
    }

    /**
    * @dev Utility method enbaling anyone to recover ERC20 token sent to the
    * module by mistake and transfer them to the Module Registry. 
    * @param _token The token to recover.
    */
    function recoverToken(address _token) external {
        uint total = ERC20(_token).balanceOf(address(this));
        ERC20(_token).transfer(address(registry), total);
    }

    /**
     * @dev Helper method to check if an address is the owner of a target wallet.
     * @param _wallet The target wallet.
     * @param _addr The address.
     */
    function isOwner(BaseWallet _wallet, address _addr) internal view returns (bool) {
        return _wallet.owner() == _addr;
    }

    /**
     * @dev Helper method to invoke a wallet.
     * @param _wallet The target wallet.
     * @param _to The target address for the transaction.
     * @param _value The value of the transaction.
     * @param _data The data of the transaction.
     */
    function invokeWallet(address _wallet, address _to, uint256 _value, bytes memory _data) internal returns (bytes memory _res) {
        bool success;
        // solium-disable-next-line security/no-call-value
        (success, _res) = _wallet.call(abi.encodeWithSignature("invoke(address,uint256,bytes)", _to, _value, _data));
        if(success && _res.length > 0) { //_res is empty if _wallet is an "old" BaseWallet that can't return output values
            (_res) = abi.decode(_res, (bytes));
        } else if (_res.length > 0) {
            // solium-disable-next-line security/no-inline-assembly
            assembly {
                returndatacopy(0, 0, returndatasize)
                revert(0, returndatasize)
            }
        } else if(!success) {
            revert("BM: wallet invoke reverted");
        }
    }
}

/**
 * @title RelayerModule
 * @dev Base module containing logic to execute transactions signed by eth-less accounts and sent by a relayer.
 * @author Julien Niset - <[email protected]>
 */
contract RelayerModule is BaseModule {

    uint256 constant internal BLOCKBOUND = 10000;

    mapping (address => RelayerConfig) public relayer;

    struct RelayerConfig {
        uint256 nonce;
        mapping (bytes32 => bool) executedTx;
    }

    event TransactionExecuted(address indexed wallet, bool indexed success, bytes32 signedHash);

    /**
     * @dev Throws if the call did not go through the execute() method.
     */
    modifier onlyExecute {
        require(msg.sender == address(this), "RM: must be called via execute()");
        _;
    }

    /* ***************** Abstract method ************************* */

    /**
    * @dev Gets the number of valid signatures that must be provided to execute a
    * specific relayed transaction.
    * @param _wallet The target wallet.
    * @param _data The data of the relayed transaction.
    * @return The number of required signatures.
    */
    function getRequiredSignatures(BaseWallet _wallet, bytes memory _data) internal view returns (uint256);

    /**
    * @dev Validates the signatures provided with a relayed transaction.
    * The method MUST throw if one or more signatures are not valid.
    * @param _wallet The target wallet.
    * @param _data The data of the relayed transaction.
    * @param _signHash The signed hash representing the relayed transaction.
    * @param _signatures The signatures as a concatenated byte array.
    */
    function validateSignatures(BaseWallet _wallet, bytes memory _data, bytes32 _signHash, bytes memory _signatures) internal view returns (bool);

    /* ************************************************************ */

    /**
    * @dev Executes a relayed transaction.
    * @param _wallet The target wallet.
    * @param _data The data for the relayed transaction
    * @param _nonce The nonce used to prevent replay attacks.
    * @param _signatures The signatures as a concatenated byte array.
    * @param _gasPrice The gas price to use for the gas refund.
    * @param _gasLimit The gas limit to use for the gas refund.
    */
    function execute(
        BaseWallet _wallet,
        bytes calldata _data,
        uint256 _nonce,
        bytes calldata _signatures,
        uint256 _gasPrice,
        uint256 _gasLimit
    )
        external
        returns (bool success)
    {
        uint startGas = gasleft();
        bytes32 signHash = getSignHash(address(this), address(_wallet), 0, _data, _nonce, _gasPrice, _gasLimit);
        require(checkAndUpdateUniqueness(_wallet, _nonce, signHash), "RM: Duplicate request");
        require(verifyData(address(_wallet), _data), "RM: the wallet authorized is different then the target of the relayed data");
        uint256 requiredSignatures = getRequiredSignatures(_wallet, _data);
        if((requiredSignatures * 65) == _signatures.length) {
            if(verifyRefund(_wallet, _gasLimit, _gasPrice, requiredSignatures)) {
                if(requiredSignatures == 0 || validateSignatures(_wallet, _data, signHash, _signatures)) {
                    // solium-disable-next-line security/no-call-value
                    (success,) = address(this).call(_data);
                    refund(_wallet, startGas - gasleft(), _gasPrice, _gasLimit, requiredSignatures, msg.sender);
                }
            }
        }
        emit TransactionExecuted(address(_wallet), success, signHash);
    }

    /**
    * @dev Gets the current nonce for a wallet.
    * @param _wallet The target wallet.
    */
    function getNonce(BaseWallet _wallet) external view returns (uint256 nonce) {
        return relayer[address(_wallet)].nonce;
    }

    /**
    * @dev Generates the signed hash of a relayed transaction according to ERC 1077.
    * @param _from The starting address for the relayed transaction (should be the module)
    * @param _to The destination address for the relayed transaction (should be the wallet)
    * @param _value The value for the relayed transaction
    * @param _data The data for the relayed transaction
    * @param _nonce The nonce used to prevent replay attacks.
    * @param _gasPrice The gas price to use for the gas refund.
    * @param _gasLimit The gas limit to use for the gas refund.
    */
    function getSignHash(
        address _from,
        address _to,
        uint256 _value,
        bytes memory _data,
        uint256 _nonce,
        uint256 _gasPrice,
        uint256 _gasLimit
    )
        internal
        pure
        returns (bytes32)
    {
        return keccak256(
            abi.encodePacked(
                "\x19Ethereum Signed Message:\n32",
                keccak256(abi.encodePacked(byte(0x19), byte(0), _from, _to, _value, _data, _nonce, _gasPrice, _gasLimit))
        ));
    }

    /**
    * @dev Checks if the relayed transaction is unique.
    * @param _wallet The target wallet.
    * @param _nonce The nonce
    * @param _signHash The signed hash of the transaction
    */
    function checkAndUpdateUniqueness(BaseWallet _wallet, uint256 _nonce, bytes32 _signHash) internal returns (bool) {
        if(relayer[address(_wallet)].executedTx[_signHash] == true) {
            return false;
        }
        relayer[address(_wallet)].executedTx[_signHash] = true;
        return true;
    }

    /**
    * @dev Checks that a nonce has the correct format and is valid.
    * It must be constructed as nonce = {block number}{timestamp} where each component is 16 bytes.
    * @param _wallet The target wallet.
    * @param _nonce The nonce
    */
    function checkAndUpdateNonce(BaseWallet _wallet, uint256 _nonce) internal returns (bool) {
        if(_nonce <= relayer[address(_wallet)].nonce) {
            return false;
        }
        uint256 nonceBlock = (_nonce & 0xffffffffffffffffffffffffffffffff00000000000000000000000000000000) >> 128;
        if(nonceBlock > block.number + BLOCKBOUND) {
            return false;
        }
        relayer[address(_wallet)].nonce = _nonce;
        return true;
    }

    /**
    * @dev Recovers the signer at a given position from a list of concatenated signatures.
    * @param _signedHash The signed hash
    * @param _signatures The concatenated signatures.
    * @param _index The index of the signature to recover.
    */
    function recoverSigner(bytes32 _signedHash, bytes memory _signatures, uint _index) internal pure returns (address) {
        uint8 v;
        bytes32 r;
        bytes32 s;
        // we jump 32 (0x20) as the first slot of bytes contains the length
        // we jump 65 (0x41) per signature
        // for v we load 32 bytes ending with v (the first 31 come from s) then apply a mask
        // solium-disable-next-line security/no-inline-assembly
        assembly {
            r := mload(add(_signatures, add(0x20,mul(0x41,_index))))
            s := mload(add(_signatures, add(0x40,mul(0x41,_index))))
            v := and(mload(add(_signatures, add(0x41,mul(0x41,_index)))), 0xff)
        }
        require(v == 27 || v == 28);
        return ecrecover(_signedHash, v, r, s);
    }

    /**
    * @dev Refunds the gas used to the Relayer. 
    * For security reasons the default behavior is to not refund calls with 0 or 1 signatures. 
    * @param _wallet The target wallet.
    * @param _gasUsed The gas used.
    * @param _gasPrice The gas price for the refund.
    * @param _gasLimit The gas limit for the refund.
    * @param _signatures The number of signatures used in the call.
    * @param _relayer The address of the Relayer.
    */
    function refund(BaseWallet _wallet, uint _gasUsed, uint _gasPrice, uint _gasLimit, uint _signatures, address _relayer) internal {
        uint256 amount = 29292 + _gasUsed; // 21000 (transaction) + 7620 (execution of refund) + 672 to log the event + _gasUsed
        // only refund if gas price not null, more than 1 signatures, gas less than gasLimit
        if(_gasPrice > 0 && _signatures > 1 && amount <= _gasLimit) {
            if(_gasPrice > tx.gasprice) {
                amount = amount * tx.gasprice;
            }
            else {
                amount = amount * _gasPrice;
            }
            invokeWallet(address(_wallet), _relayer, amount, EMPTY_BYTES);
        }
    }

    /**
    * @dev Returns false if the refund is expected to fail.
    * @param _wallet The target wallet.
    * @param _gasUsed The expected gas used.
    * @param _gasPrice The expected gas price for the refund.
    */
    function verifyRefund(BaseWallet _wallet, uint _gasUsed, uint _gasPrice, uint _signatures) internal view returns (bool) {
        if(_gasPrice > 0
            && _signatures > 1
            && (address(_wallet).balance < _gasUsed * _gasPrice || _wallet.authorised(address(this)) == false)) {
            return false;
        }
        return true;
    }

    /**
    * @dev Checks that the wallet address provided as the first parameter of the relayed data is the same
    * as the wallet passed as the input of the execute() method. 
    @return false if the addresses are different.
    */
    function verifyData(address _wallet, bytes memory _data) private pure returns (bool) {
        require(_data.length >= 36, "RM: Invalid dataWallet");
        address dataWallet;
        // solium-disable-next-line security/no-inline-assembly
        assembly {
            //_data = {length:32}{sig:4}{_wallet:32}{...}
            dataWallet := mload(add(_data, 0x24))
        }
        return dataWallet == _wallet;
    }

    /**
    * @dev Parses the data to extract the method signature.
    */
    function functionPrefix(bytes memory _data) internal pure returns (bytes4 prefix) {
        require(_data.length >= 4, "RM: Invalid functionPrefix");
        // solium-disable-next-line security/no-inline-assembly
        assembly {
            prefix := mload(add(_data, 0x20))
        }
    }
}

/**
 * @title OnlyOwnerModule
 * @dev Module that extends BaseModule and RelayerModule for modules where the execute() method
 * must be called with one signature frm the owner.
 * @author Julien Niset - <[email protected]>
 */
contract OnlyOwnerModule is BaseModule, RelayerModule {

    // bytes4 private constant IS_ONLY_OWNER_MODULE = bytes4(keccak256("isOnlyOwnerModule()"));

   /**
    * @dev Returns a constant that indicates that the module is an OnlyOwnerModule.
    * @return The constant bytes4(keccak256("isOnlyOwnerModule()"))
    */
    function isOnlyOwnerModule() external pure returns (bytes4) {
        // return IS_ONLY_OWNER_MODULE;
        return this.isOnlyOwnerModule.selector;
    }

    /**
     * @dev Adds a module to a wallet. First checks that the module is registered.
     * Unlike its overrided parent, this method can be called via the RelayerModule's execute()
     * @param _wallet The target wallet.
     * @param _module The modules to authorise.
     */
    function addModule(BaseWallet _wallet, Module _module) external onlyWalletOwner(_wallet) {
        require(registry.isRegisteredModule(address(_module)), "BM: module is not registered");
        _wallet.authoriseModule(address(_module), true);
    }

    // *************** Implementation of RelayerModule methods ********************* //

    // Overrides to use the incremental nonce and save some gas
    function checkAndUpdateUniqueness(BaseWallet _wallet, uint256 _nonce, bytes32 /* _signHash */) internal returns (bool) {
        return checkAndUpdateNonce(_wallet, _nonce);
    }

    function validateSignatures(
        BaseWallet _wallet,
        bytes memory /* _data */,
        bytes32 _signHash,
        bytes memory _signatures
    )
        internal
        view
        returns (bool)
    {
        address signer = recoverSigner(_signHash, _signatures, 0);
        return isOwner(_wallet, signer); // "OOM: signer must be owner"
    }

    function getRequiredSignatures(BaseWallet /* _wallet */, bytes memory /* _data */) internal view returns (uint256) {
        return 1;
    }
}

/**
 * @title LimitManager
 * @dev Module to manage a daily spending limit
 * @author Julien Niset - <[email protected]>
 */
contract LimitManager is BaseModule {

    // large limit when the limit can be considered disabled
    uint128 constant private LIMIT_DISABLED = uint128(-1); // 3.40282366920938463463374607431768211455e+38

    using SafeMath for uint256;

    struct LimitManagerConfig {
        // The daily limit
        Limit limit;
        // The current usage
        DailySpent dailySpent;
    }

    struct Limit {
        // the current limit
        uint128 current;
        // the pending limit if any
        uint128 pending;
        // when the pending limit becomes the current limit
        uint64 changeAfter;
    }

    struct DailySpent {
        // The amount already spent during the current period
        uint128 alreadySpent;
        // The end of the current period
        uint64 periodEnd;
    }

    // wallet specific storage
    mapping (address => LimitManagerConfig) internal limits;
    // The default limit
    uint256 public defaultLimit;

    // *************** Events *************************** //

    event LimitChanged(address indexed wallet, uint indexed newLimit, uint64 indexed startAfter);

    // *************** Constructor ********************** //

    constructor(uint256 _defaultLimit) public {
        defaultLimit = _defaultLimit;
    }

    // *************** External/Public Functions ********************* //

    /**
     * @dev Inits the module for a wallet by setting the limit to the default value.
     * @param _wallet The target wallet.
     */
    function init(BaseWallet _wallet) public onlyWallet(_wallet) {
        Limit storage limit = limits[address(_wallet)].limit;
        if(limit.current == 0 && limit.changeAfter == 0) {
            limit.current = uint128(defaultLimit);
        }
    }

    // *************** Internal Functions ********************* //

    /**
     * @dev Changes the daily limit.
     * The limit is expressed in ETH and the change is pending for the security period.
     * @param _wallet The target wallet.
     * @param _newLimit The new limit.
     * @param _securityPeriod The security period.
     */
    function changeLimit(BaseWallet _wallet, uint256 _newLimit, uint256 _securityPeriod) internal {
        Limit storage limit = limits[address(_wallet)].limit;
        // solium-disable-next-line security/no-block-members
        uint128 current = (limit.changeAfter > 0 && limit.changeAfter < now) ? limit.pending : limit.current;
        limit.current = current;
        limit.pending = uint128(_newLimit);
        // solium-disable-next-line security/no-block-members
        limit.changeAfter = uint64(now.add(_securityPeriod));
        // solium-disable-next-line security/no-block-members
        emit LimitChanged(address(_wallet), _newLimit, uint64(now.add(_securityPeriod)));
    }

     /**
     * @dev Disable the daily limit.
     * The change is pending for the security period.
     * @param _wallet The target wallet.
     * @param _securityPeriod The security period.
     */
    function disableLimit(BaseWallet _wallet, uint256 _securityPeriod) internal {
        changeLimit(_wallet, LIMIT_DISABLED, _securityPeriod);
    }

    /**
    * @dev Gets the current daily limit for a wallet.
    * @param _wallet The target wallet.
    * @return the current limit expressed in ETH.
    */
    function getCurrentLimit(BaseWallet _wallet) public view returns (uint256 _currentLimit) {
        Limit storage limit = limits[address(_wallet)].limit;
        _currentLimit = uint256(currentLimit(limit.current, limit.pending, limit.changeAfter));
    }

    /**
    * @dev Returns whether the daily limit is disabled for a wallet.
    * @param _wallet The target wallet.
    * @return true if the daily limit is disabled, false otherwise.
    */
    function isLimitDisabled(BaseWallet _wallet) public view returns (bool _limitDisabled) {
        uint256 currentLimit = getCurrentLimit(_wallet);
        _limitDisabled = currentLimit == LIMIT_DISABLED;
    }

    /**
    * @dev Gets a pending limit for a wallet if any.
    * @param _wallet The target wallet.
    * @return the pending limit (in ETH) and the time at chich it will become effective.
    */
    function getPendingLimit(BaseWallet _wallet) external view returns (uint256 _pendingLimit, uint64 _changeAfter) {
        Limit storage limit = limits[address(_wallet)].limit;
        // solium-disable-next-line security/no-block-members
        return ((now < limit.changeAfter)? (uint256(limit.pending), limit.changeAfter) : (0,0));
    }

    /**
    * @dev Gets the amount of tokens that has not yet been spent during the current period.
    * @param _wallet The target wallet.
    * @return the amount of tokens (in ETH) that has not been spent yet and the end of the period.
    */
    function getDailyUnspent(BaseWallet _wallet) external view returns (uint256 _unspent, uint64 _periodEnd) {
        uint256 limit = getCurrentLimit(_wallet);
        DailySpent storage expense = limits[address(_wallet)].dailySpent;
        // solium-disable-next-line security/no-block-members
        if(now > expense.periodEnd) {
            _unspent = limit;
            // solium-disable-next-line security/no-block-members
            _periodEnd = uint64(now + 24 hours);
        }
        else {
            _periodEnd = expense.periodEnd;
            if(expense.alreadySpent < limit) {
                _unspent = limit - expense.alreadySpent;
            }
        }
    }

    /**
    * @dev Helper method to check if a transfer is within the limit.
    * If yes the daily unspent for the current period is updated.
    * @param _wallet The target wallet.
    * @param _amount The amount for the transfer
    */
    function checkAndUpdateDailySpent(BaseWallet _wallet, uint _amount) internal returns (bool) {
        if(_amount == 0) return true;
        Limit storage limit = limits[address(_wallet)].limit;
        uint128 current = currentLimit(limit.current, limit.pending, limit.changeAfter);
        if(isWithinDailyLimit(_wallet, current, _amount)) {
            updateDailySpent(_wallet, current, _amount);
            return true;
        }
        return false;
    }

    /**
    * @dev Helper method to update the daily spent for the current period.
    * @param _wallet The target wallet.
    * @param _limit The current limit for the wallet.
    * @param _amount The amount to add to the daily spent.
    */
    function updateDailySpent(BaseWallet _wallet, uint128 _limit, uint _amount) internal {
        if(_limit != LIMIT_DISABLED) {
            DailySpent storage expense = limits[address(_wallet)].dailySpent;
            // solium-disable-next-line security/no-block-members
            if (expense.periodEnd < now) {
                // solium-disable-next-line security/no-block-members
                expense.periodEnd = uint64(now + 24 hours);
                expense.alreadySpent = uint128(_amount);
            }
            else {
                expense.alreadySpent += uint128(_amount);
            }
        }
    }

    /**
    * @dev Checks if a transfer amount is withing the daily limit for a wallet.
    * @param _wallet The target wallet.
    * @param _limit The current limit for the wallet.
    * @param _amount The transfer amount.
    * @return true if the transfer amount is withing the daily limit.
    */
    function isWithinDailyLimit(BaseWallet _wallet, uint _limit, uint _amount) internal view returns (bool)  {
        if(_limit == LIMIT_DISABLED) {
            return true;
        }
        DailySpent storage expense = limits[address(_wallet)].dailySpent;
        // solium-disable-next-line security/no-block-members
        if (expense.periodEnd < now) {
            return (_amount <= _limit);
        } else {
            return (expense.alreadySpent + _amount <= _limit && expense.alreadySpent + _amount >= expense.alreadySpent);
        }
    }

    /**
    * @dev Helper method to get the current limit from a Limit struct.
    * @param _current The value of the current parameter
    * @param _pending The value of the pending parameter
    * @param _changeAfter The value of the changeAfter parameter
    */
    function currentLimit(uint128 _current, uint128 _pending, uint64 _changeAfter) internal view returns (uint128) {
        // solium-disable-next-line security/no-block-members
        if(_changeAfter > 0 && _changeAfter < now) {
            return _pending;
        }
        return _current;
    }

}

/**
 * @title BaseTransfer
 * @dev Module containing internal methods to execute or approve transfers
 * @author Olivier VDB - <[email protected]>
 */
contract BaseTransfer is BaseModule {

    // Mock token address for ETH
    address constant internal ETH_TOKEN = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;

    // *************** Events *************************** //

    event Transfer(address indexed wallet, address indexed token, uint256 indexed amount, address to, bytes data);
    event Approved(address indexed wallet, address indexed token, uint256 amount, address spender);
    event CalledContract(address indexed wallet, address indexed to, uint256 amount, bytes data);

    // *************** Internal Functions ********************* //

    /**
    * @dev Helper method to transfer ETH or ERC20 for a wallet.
    * @param _wallet The target wallet.
    * @param _token The ERC20 address.
    * @param _to The recipient.
    * @param _value The amount of ETH to transfer
    * @param _data The data to *log* with the transfer.
    */
    function doTransfer(BaseWallet _wallet, address _token, address _to, uint256 _value, bytes memory _data) internal {
        if(_token == ETH_TOKEN) {
            invokeWallet(address(_wallet), _to, _value, EMPTY_BYTES);
        }
        else {
            bytes memory methodData = abi.encodeWithSignature("transfer(address,uint256)", _to, _value);
            invokeWallet(address(_wallet), _token, 0, methodData);
        }
        emit Transfer(address(_wallet), _token, _value, _to, _data);
    }

    /**
    * @dev Helper method to approve spending the ERC20 of a wallet.
    * @param _wallet The target wallet.
    * @param _token The ERC20 address.
    * @param _spender The spender address.
    * @param _value The amount of token to transfer.
    */
    function doApproveToken(BaseWallet _wallet, address _token, address _spender, uint256 _value) internal {
        bytes memory methodData = abi.encodeWithSignature("approve(address,uint256)", _spender, _value);
        invokeWallet(address(_wallet), _token, 0, methodData);
        emit Approved(address(_wallet), _token, _value, _spender);
    }

    /**
    * @dev Helper method to call an external contract.
    * @param _wallet The target wallet.
    * @param _contract The contract address.
    * @param _value The ETH value to transfer.
    * @param _data The method data.
    */
    function doCallContract(BaseWallet _wallet, address _contract, uint256 _value, bytes memory _data) internal {
        invokeWallet(address(_wallet), _contract, _value, _data);
        emit CalledContract(address(_wallet), _contract, _value, _data);
    }
}

/**
 * @title MakerV2Manager
 * @dev Module to convert SAI <-> DAI and lock/unlock MCD DAI into/from Maker's Pot,
 * @author Olivier VDB - <[email protected]>
 */
contract MakerV2Manager is Invest, BaseModule, RelayerModule, OnlyOwnerModule {

    bytes32 constant NAME = "MakerV2Manager";

    // The address of the SAI token
    GemLike public saiToken;
    // The address of the (MCD) DAI token
    GemLike public daiToken;
    // The address of the SAI <-> DAI migration contract
    address public scdMcdMigration;
    // The address of the Pot
    PotLike public pot;
    // The address of the Dai Adapter
    JoinLike public daiJoin;
    // The address of the Vat
    VatLike public vat;

    // Method signatures to reduce gas cost at depoyment
    bytes4 constant internal ERC20_APPROVE = bytes4(keccak256("approve(address,uint256)"));
    bytes4 constant internal SWAP_SAI_DAI = bytes4(keccak256("swapSaiToDai(uint256)"));
    bytes4 constant internal SWAP_DAI_SAI = bytes4(keccak256("swapDaiToSai(uint256)"));
    bytes4 constant internal ADAPTER_JOIN = bytes4(keccak256("join(address,uint256)"));
    bytes4 constant internal ADAPTER_EXIT = bytes4(keccak256("exit(address,uint256)"));
    bytes4 constant internal VAT_HOPE = bytes4(keccak256("hope(address)"));
    bytes4 constant internal POT_JOIN = bytes4(keccak256("join(uint256)"));
    bytes4 constant internal POT_EXIT = bytes4(keccak256("exit(uint256)"));

    uint256 constant internal RAY = 10 ** 27;

    using SafeMath for uint256;

    // ****************** Events *************************** //

    event TokenConverted(address indexed _wallet, address _srcToken, uint _srcAmount, address _destToken, uint _destAmount);

    // *************** Constructor ********************** //

    constructor(
        ModuleRegistry _registry,
        GuardianStorage _guardianStorage,
        ScdMcdMigration _scdMcdMigration,
        PotLike _pot
    )
        BaseModule(_registry, _guardianStorage, NAME)
        public
    {
        scdMcdMigration = address(_scdMcdMigration);
        saiToken = _scdMcdMigration.saiJoin().gem();
        daiJoin = _scdMcdMigration.daiJoin();
        vat = daiJoin.vat();
        daiToken = daiJoin.dai();
        pot = _pot;
    }

    // *************** External/Public Functions ********************* //

    /* ********************************** Implementation of Invest ************************************* */

    /**
     * @dev Invest tokens for a given period.
     * @param _wallet The target wallet.
     * @param _token The token address.
     * @param _amount The amount of tokens to invest.
     * @param _period The period over which the tokens may be locked in the investment (optional).
     * @return The exact amount of tokens that have been invested.
     */
    function addInvestment(
        BaseWallet _wallet,
        address _token,
        uint256 _amount,
        uint256 _period
    )
        external
        returns (uint256 _invested)
    {
        require(_token == address(daiToken), "DM: token should be DAI");
        joinDsr(_wallet, _amount);
        _invested = _amount;
        emit InvestmentAdded(address(_wallet), address(daiToken), _amount, _period);
    }

    /**
     * @dev Exit invested postions.
     * @param _wallet The target wallet.
     * @param _token The token address.
     * @param _fraction The fraction of invested tokens to exit in per 10000.
     */
    function removeInvestment(
        BaseWallet _wallet,
        address _token,
        uint256 _fraction
    )
        external
    {
        require(_token == address(daiToken), "DM: token should be DAI");
        require(_fraction <= 10000, "DM: invalid fraction value");
        exitDsr(_wallet, dsrBalance(_wallet).mul(_fraction) / 10000);
        emit InvestmentRemoved(address(_wallet), _token, _fraction);
    }

    /**
     * @dev Get the amount of investment in a given token.
     * @param _wallet The target wallet.
     * @param _token The token address.
     * @return The value in tokens of the investment (including interests) and the time at which the investment can be removed.
     */
    function getInvestment(
        BaseWallet _wallet,
        address _token
    )
        external
        view
        returns (uint256 _tokenValue, uint256 _periodEnd)
    {
        _tokenValue = _token == address(daiToken) ? dsrBalance(_wallet) : 0;
        _periodEnd = 0;
    }

    /* ****************************************** DSR wrappers ******************************************* */

    function dsrBalance(BaseWallet _wallet) public view returns (uint256) {
        return pot.chi().mul(pot.pie(address(_wallet))) / RAY;
    }

    /**
    * @dev lets the owner deposit MCD DAI into the DSR Pot.
    * @param _wallet The target wallet.
    * @param _amount The amount of DAI to deposit
    */
    function joinDsr(
        BaseWallet _wallet,
        uint256 _amount
    )
        public
        onlyWalletOwner(_wallet)
        onlyWhenUnlocked(_wallet)
    {
        if (daiToken.balanceOf(address(_wallet)) < _amount) {
            swapSaiToDai(_wallet, _amount - daiToken.balanceOf(address(_wallet)));
        }

        // Execute drip to get the chi rate updated to rho == now, otherwise join will fail
        pot.drip();
        // Approve DAI adapter to take the DAI amount
        invokeWallet(address(_wallet), address(daiToken), 0, abi.encodeWithSelector(ERC20_APPROVE, address(daiJoin), _amount));
        // Join DAI into the vat (_amount of external DAI is burned and the vat transfers _amount of internal DAI from the adapter to the _wallet)
        invokeWallet(address(_wallet), address(daiJoin), 0, abi.encodeWithSelector(ADAPTER_JOIN, address(_wallet), _amount));
        // Approve the pot to take out (internal) DAI from the wallet's balance in the vat
        if (vat.can(address(_wallet), address(pot)) == 0) {
            invokeWallet(address(_wallet), address(vat), 0, abi.encodeWithSelector(VAT_HOPE, address(pot)));
        }
        // Compute the pie value in the pot
        uint256 pie = _amount.mul(RAY) / pot.chi();
        // Join the pie value to the pot
        invokeWallet(address(_wallet), address(pot), 0, abi.encodeWithSelector(POT_JOIN, pie));
    }

    /**
    * @dev lets the owner withdraw MCD DAI from the DSR Pot.
    * @param _wallet The target wallet.
    * @param _amount The amount of DAI to withdraw
    */
    function exitDsr(
        BaseWallet _wallet,
        uint256 _amount
    )
        public
        onlyWalletOwner(_wallet)
        onlyWhenUnlocked(_wallet)
    {
        // Execute drip to count the savings accumulated until this moment
        pot.drip();
        // Calculates the pie value in the pot equivalent to the DAI wad amount
        uint256 pie = _amount.mul(RAY) / pot.chi();
        // Exit DAI from the pot
        invokeWallet(address(_wallet), address(pot), 0, abi.encodeWithSelector(POT_EXIT, pie));
        // Allow adapter to access the _wallet's DAI balance in the vat
        if (vat.can(address(_wallet), address(daiJoin)) == 0) {
            invokeWallet(address(_wallet), address(vat), 0, abi.encodeWithSelector(VAT_HOPE, address(daiJoin)));
        }
        // Check the actual balance of DAI in the vat after the pot exit
        uint bal = vat.dai(address(_wallet));
        // It is necessary to check if due to rounding the exact _amount can be exited by the adapter.
        // Otherwise it will do the maximum DAI balance in the vat
        uint256 withdrawn = bal >= _amount.mul(RAY) ? _amount : bal / RAY;
        invokeWallet(address(_wallet), address(daiJoin), 0, abi.encodeWithSelector(ADAPTER_EXIT, address(_wallet), withdrawn));
    }

    function exitAllDsr(
        BaseWallet _wallet
    )
        external
        onlyWalletOwner(_wallet)
        onlyWhenUnlocked(_wallet)
    {
        // Execute drip to count the savings accumulated until this moment
        pot.drip();
        // Gets the total pie belonging to the _wallet
        uint256 pie = pot.pie(address(_wallet));
        // Exit DAI from the pot
        invokeWallet(address(_wallet), address(pot), 0, abi.encodeWithSelector(POT_EXIT, pie));
        // Allow adapter to access the _wallet's DAI balance in the vat
        if (vat.can(address(_wallet), address(daiJoin)) == 0) {
            invokeWallet(address(_wallet), address(vat), 0, abi.encodeWithSelector(VAT_HOPE, address(daiJoin)));
        }
        // Exits the DAI amount corresponding to the value of pie
        uint256 withdrawn = pot.chi().mul(pie) / RAY;
        invokeWallet(address(_wallet), address(daiJoin), 0, abi.encodeWithSelector(ADAPTER_EXIT, address(_wallet), withdrawn));
    }

    /**
    * @dev lets the owner convert SCD SAI into MCD DAI.
    * @param _wallet The target wallet.
    * @param _amount The amount of SAI to convert
    */
    function swapSaiToDai(
        BaseWallet _wallet,
        uint256 _amount
    )
        public
        onlyWalletOwner(_wallet)
        onlyWhenUnlocked(_wallet)
    {
        require(saiToken.balanceOf(address(_wallet)) >= _amount, "DM: insufficient SAI");
        invokeWallet(address(_wallet), address(saiToken), 0, abi.encodeWithSelector(ERC20_APPROVE, scdMcdMigration, _amount));
        invokeWallet(address(_wallet), scdMcdMigration, 0, abi.encodeWithSelector(SWAP_SAI_DAI, _amount));
        emit TokenConverted(address(_wallet), address(saiToken), _amount, address(daiToken), _amount);
    }

    /**
    * @dev lets the owner convert MCD DAI into SCD SAI.
    * @param _wallet The target wallet.
    * @param _amount The amount of DAI to convert
    */
    function swapDaiToSai(
        BaseWallet _wallet,
        uint256 _amount
    )
        external
        onlyWalletOwner(_wallet)
        onlyWhenUnlocked(_wallet)
    {
        require(daiToken.balanceOf(address(_wallet)) >= _amount, "DM: insufficient DAI");
        invokeWallet(address(_wallet), address(daiToken), 0, abi.encodeWithSelector(ERC20_APPROVE, scdMcdMigration, _amount));
        invokeWallet(address(_wallet), scdMcdMigration, 0, abi.encodeWithSelector(SWAP_DAI_SAI, _amount));
        emit TokenConverted(address(_wallet), address(daiToken), _amount, address(saiToken), _amount);
    }
}

Contract Security Audit

Contract ABI

API
[{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_amount","type":"uint256"}],"name":"exitDsr","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"}],"name":"init","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_amount","type":"uint256"}],"name":"swapDaiToSai","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"}],"name":"exitAllDsr","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_wallet","type":"address"}],"name":"getNonce","outputs":[{"name":"nonce","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"vat","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pot","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_module","type":"address"}],"name":"addModule","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_amount","type":"uint256"}],"name":"swapSaiToDai","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_amount","type":"uint256"}],"name":"joinDsr","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_token","type":"address"},{"name":"_fraction","type":"uint256"}],"name":"removeInvestment","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"}],"name":"recoverToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"saiToken","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_data","type":"bytes"},{"name":"_nonce","type":"uint256"},{"name":"_signatures","type":"bytes"},{"name":"_gasPrice","type":"uint256"},{"name":"_gasLimit","type":"uint256"}],"name":"execute","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_wallet","type":"address"}],"name":"dsrBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"daiToken","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"daiJoin","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"relayer","outputs":[{"name":"nonce","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_wallet","type":"address"},{"name":"_token","type":"address"}],"name":"getInvestment","outputs":[{"name":"_tokenValue","type":"uint256"},{"name":"_periodEnd","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOnlyOwnerModule","outputs":[{"name":"","type":"bytes4"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"scdMcdMigration","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_token","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_period","type":"uint256"}],"name":"addInvestment","outputs":[{"name":"_invested","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_registry","type":"address"},{"name":"_guardianStorage","type":"address"},{"name":"_scdMcdMigration","type":"address"},{"name":"_pot","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_wallet","type":"address"},{"indexed":false,"name":"_srcToken","type":"address"},{"indexed":false,"name":"_srcAmount","type":"uint256"},{"indexed":false,"name":"_destToken","type":"address"},{"indexed":false,"name":"_destAmount","type":"uint256"}],"name":"TokenConverted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"wallet","type":"address"},{"indexed":true,"name":"success","type":"bool"},{"indexed":false,"name":"signedHash","type":"bytes32"}],"name":"TransactionExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"name","type":"bytes32"}],"name":"ModuleCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"wallet","type":"address"}],"name":"ModuleInitialised","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_wallet","type":"address"},{"indexed":false,"name":"_token","type":"address"},{"indexed":false,"name":"_invested","type":"uint256"},{"indexed":false,"name":"_period","type":"uint256"}],"name":"InvestmentAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_wallet","type":"address"},{"indexed":false,"name":"_token","type":"address"},{"indexed":false,"name":"_fraction","type":"uint256"}],"name":"InvestmentRemoved","type":"event"}]

60806040523480156200001157600080fd5b5060405160808062003704833981018060405260808110156200003357600080fd5b50805160208083015160408085015160609095015160008054600160a060020a03808816600160a060020a031992831617909255600180549286169290911691909117905581517f4d616b657256324d616e61676572000000000000000000000000000000000000808252925195969395939491938793879390927f3019c8fc80239e3dff8f781212ae2004839c2cb61d6c70acd279ac65392145df929081900390910190a1505060058054600160a060020a031916600160a060020a038516908117909155604080517f0b14408f0000000000000000000000000000000000000000000000000000000081529051919250630b14408f916004808301926020929190829003018186803b1580156200014b57600080fd5b505afa15801562000160573d6000803e3d6000fd5b505050506040513d60208110156200017757600080fd5b5051604080517f7bd2bea70000000000000000000000000000000000000000000000000000000081529051600160a060020a0390921691637bd2bea7916004808201926020929091908290030181600087803b158015620001d757600080fd5b505af1158015620001ec573d6000803e3d6000fd5b505050506040513d60208110156200020357600080fd5b505160038054600160a060020a031916600160a060020a03928316179055604080517fc11645bc00000000000000000000000000000000000000000000000000000000815290519184169163c11645bc91600480820192602092909190829003018186803b1580156200027557600080fd5b505afa1580156200028a573d6000803e3d6000fd5b505050506040513d6020811015620002a157600080fd5b505160078054600160a060020a031916600160a060020a039283161790819055604080517f36569e77000000000000000000000000000000000000000000000000000000008152905191909216916336569e77916004808301926020929190829003018186803b1580156200031557600080fd5b505afa1580156200032a573d6000803e3d6000fd5b505050506040513d60208110156200034157600080fd5b505160088054600160a060020a031916600160a060020a03928316179055600754604080517ff4b9fa750000000000000000000000000000000000000000000000000000000081529051919092169163f4b9fa759160048083019260209291908290030181600087803b158015620003b857600080fd5b505af1158015620003cd573d6000803e3d6000fd5b505050506040513d6020811015620003e457600080fd5b505160048054600160a060020a03928316600160a060020a031991821617909155600680549390921692169190911790555050506132dc80620004286000396000f3fe608060405234801561001057600080fd5b506004361061019f576000357c0100000000000000000000000000000000000000000000000000000000900480639be65a60116100f5578063c11645bc116100a9578063d490da4d11610083578063d490da4d1461052b578063d9b6ccbf14610556578063ec9e13aa1461055e5761019f565b8063c11645bc146104b6578063c9b5ef8e146104be578063cac7495c146104e45761019f565b8063aacaaf88116100da578063aacaaf8814610398578063ae8d246814610488578063be22f546146104ae5761019f565b80639be65a601461036a578063a30184de146103905761019f565b806336569e77116101575780638c544246116101315780638c544246146102dc5780638d3e0a691461030857806398d53428146103345761019f565b806336569e77146102825780634ba2363a146102a65780635a1db8c4146102ae5761019f565b8063288596a611610188578063288596a6146101f85780632c5ba768146102245780632d0335ab1461024a5761019f565b80630227efa2146101a457806319ab453c146101d2575b600080fd5b6101d0600480360360408110156101ba57600080fd5b50600160a060020a03813516906020013561059a565b005b6101d0600480360360208110156101e857600080fd5b5035600160a060020a0316610b84565b6101d06004803603604081101561020e57600080fd5b50600160a060020a038135169060200135610c2a565b6101d06004803603602081101561023a57600080fd5b5035600160a060020a0316610fff565b6102706004803603602081101561026057600080fd5b5035600160a060020a03166115a7565b60408051918252519081900360200190f35b61028a6115c2565b60408051600160a060020a039092168252519081900360200190f35b61028a6115d1565b6101d0600480360360408110156102c457600080fd5b50600160a060020a03813581169160200135166115e0565b6101d0600480360360408110156102f257600080fd5b50600160a060020a0381351690602001356117ae565b6101d06004803603604081101561031e57600080fd5b50600160a060020a038135169060200135611b81565b6101d06004803603606081101561034a57600080fd5b50600160a060020a03813581169160208101359091169060400135612258565b6101d06004803603602081101561038057600080fd5b5035600160a060020a031661239b565b61028a6124ce565b610474600480360360c08110156103ae57600080fd5b600160a060020a0382351691908101906040810160208201356401000000008111156103d957600080fd5b8201836020820111156103eb57600080fd5b8035906020019184600183028401116401000000008311171561040d57600080fd5b9193909282359260408101906020013564010000000081111561042f57600080fd5b82018360208201111561044157600080fd5b8035906020019184600183028401116401000000008311171561046357600080fd5b9193509150803590602001356124dd565b604080519115158252519081900360200190f35b6102706004803603602081101561049e57600080fd5b5035600160a060020a03166127c5565b61028a6128d9565b61028a6128e8565b610270600480360360208110156104d457600080fd5b5035600160a060020a03166128f7565b610512600480360360408110156104fa57600080fd5b50600160a060020a0381358116916020013516612909565b6040805192835260208301919091528051918290030190f35b61053361293e565b6040805160008051602061322e8339815191529092168252519081900360200190f35b61028a612962565b6102706004803603608081101561057457600080fd5b50600160a060020a03813581169160208101359091169060408101359060600135612971565b81333014806105ae57506105ae8133612a44565b15156105f35760405160008051602061324e833981519152815260040180806020018281038252602381526020018061326e6023913960400191505060405180910390fd5b600154604080517f4a4fbeec000000000000000000000000000000000000000000000000000000008152600160a060020a038087166004830152915186939290921691634a4fbeec91602480820192602092909190829003018186803b15801561065c57600080fd5b505afa158015610670573d6000803e3d6000fd5b505050506040513d602081101561068657600080fd5b5051156106e2576040805160008051602061324e833981519152815260206004820152601b60248201527f424d3a2077616c6c6574206d75737420626520756e6c6f636b65640000000000604482015290519081900360640190fd5b600660009054906101000a9004600160a060020a0316600160a060020a0316639f678cca6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b15801561074e57600080fd5b505af1158015610762573d6000803e3d6000fd5b505050506000600660009054906101000a9004600160a060020a0316600160a060020a031663c92aecc46040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b1580156107d257600080fd5b505afa1580156107e6573d6000803e3d6000fd5b505050506040513d60208110156107fc57600080fd5b505161081a856b033b2e3c9fd0803ce800000063ffffffff612ae416565b81151561082357fe5b600654604080517f657869742875696e7432353629000000000000000000000000000000000000008152815190819003600d0181209490930460248085018290528251808603909101815260449094019091526020830180516000805160206132918339815191521660008051602061322e833981519152909516949094179093529192506108c2918791600160a060020a0390911690600090612b16565b50600854600754604080517f4538c4eb000000000000000000000000000000000000000000000000000000008152600160a060020a038981166004830152928316602482015290519190921691634538c4eb916044808301926020929190829003018186803b15801561093457600080fd5b505afa158015610948573d6000803e3d6000fd5b505050506040513d602081101561095e57600080fd5b50511515610a0457600854604080517f686f7065286164647265737329000000000000000000000000000000000000008152815190819003600d018120600754600160a060020a039081166024808501919091528451808503909101815260449093019093526020820180516000805160206132918339815191521660008051602061322e833981519152909216919091179052610a029288921690600090612b16565b505b600854604080517f6c25b346000000000000000000000000000000000000000000000000000000008152600160a060020a03888116600483015291516000939290921691636c25b34691602480820192602092909190829003018186803b158015610a6e57600080fd5b505afa158015610a82573d6000803e3d6000fd5b505050506040513d6020811015610a9857600080fd5b505190506000610aba866b033b2e3c9fd0803ce800000063ffffffff612ae416565b821015610ad5576b033b2e3c9fd0803ce80000008204610ad7565b855b600754604080517f6578697428616464726573732c75696e7432353629000000000000000000000081528151908190036015018120600160a060020a03808d16602484015260448084018790528451808503909101815260649093019093526020820180516000805160206132918339815191521660008051602061322e833981519152909216919091179052929350610b7a928a929190911690600090612b16565b5050505050505050565b8033600160a060020a03821614610bea576040805160008051602061324e833981519152815260206004820152601960248201527f424d3a2063616c6c6572206d7573742062652077616c6c657400000000000000604482015290519081900360640190fd5b60408051600160a060020a038416815290517f9fcca3f73f85397e2bf03647abf243c20b753bd54463ff3cae74de2971c112fa9181900360200190a15050565b8133301480610c3e5750610c3e8133612a44565b1515610c835760405160008051602061324e833981519152815260040180806020018281038252602381526020018061326e6023913960400191505060405180910390fd5b600154604080517f4a4fbeec000000000000000000000000000000000000000000000000000000008152600160a060020a038087166004830152915186939290921691634a4fbeec91602480820192602092909190829003018186803b158015610cec57600080fd5b505afa158015610d00573d6000803e3d6000fd5b505050506040513d6020811015610d1657600080fd5b505115610d72576040805160008051602061324e833981519152815260206004820152601b60248201527f424d3a2077616c6c6574206d75737420626520756e6c6f636b65640000000000604482015290519081900360640190fd5b60048054604080517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a038881169482019490945290518693909216916370a0823191602480820192602092909190829003018186803b158015610ddd57600080fd5b505afa158015610df1573d6000803e3d6000fd5b505050506040513d6020811015610e0757600080fd5b50511015610e64576040805160008051602061324e833981519152815260206004820152601460248201527f444d3a20696e73756666696369656e7420444149000000000000000000000000604482015290519081900360640190fd5b600454604080517f617070726f766528616464726573732c75696e7432353629000000000000000081528151908190036018018120600554600160a060020a03908116602484015260448084018990528451808503909101815260649093019093526020820180516000805160206132918339815191521660008051602061322e833981519152909216919091179052610f049287921690600090612b16565b50600554604080517f73776170446169546f5361692875696e743235362900000000000000000000008152815190819003601501812060248083018890528351808403909101815260449092019092526020810180516000805160206132918339815191521660008051602061322e83398151915290931692909217909152610f9d918691600160a060020a0390911690600090612b16565b5060045460035460408051600160a060020a03938416815260208101879052918316828201526060820186905251918616917fe0aebc0b49a57880fff1a14cdb8f71331347f88fedf9f4a251ff97b31061d8289181900360800190a250505050565b803330148061101357506110138133612a44565b15156110585760405160008051602061324e833981519152815260040180806020018281038252602381526020018061326e6023913960400191505060405180910390fd5b600154604080517f4a4fbeec000000000000000000000000000000000000000000000000000000008152600160a060020a038086166004830152915185939290921691634a4fbeec91602480820192602092909190829003018186803b1580156110c157600080fd5b505afa1580156110d5573d6000803e3d6000fd5b505050506040513d60208110156110eb57600080fd5b505115611147576040805160008051602061324e833981519152815260206004820152601b60248201527f424d3a2077616c6c6574206d75737420626520756e6c6f636b65640000000000604482015290519081900360640190fd5b600660009054906101000a9004600160a060020a0316600160a060020a0316639f678cca6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b1580156111b357600080fd5b505af11580156111c7573d6000803e3d6000fd5b5050600654604080517f0bebac86000000000000000000000000000000000000000000000000000000008152600160a060020a038881166004830152915160009550919092169250630bebac8691602480820192602092909190829003018186803b15801561123557600080fd5b505afa158015611249573d6000803e3d6000fd5b505050506040513d602081101561125f57600080fd5b5051600654604080517f657869742875696e7432353629000000000000000000000000000000000000008152815190819003600d01812060248083018690528351808403909101815260449092019092526020810180516000805160206132918339815191521660008051602061322e833981519152909316929092179091529192506112fa918691600160a060020a031690600090612b16565b50600854600754604080517f4538c4eb000000000000000000000000000000000000000000000000000000008152600160a060020a038881166004830152928316602482015290519190921691634538c4eb916044808301926020929190829003018186803b15801561136c57600080fd5b505afa158015611380573d6000803e3d6000fd5b505050506040513d602081101561139657600080fd5b5051151561143c57600854604080517f686f7065286164647265737329000000000000000000000000000000000000008152815190819003600d018120600754600160a060020a039081166024808501919091528451808503909101815260449093019093526020820180516000805160206132918339815191521660008051602061322e83398151915290921691909117905261143a9287921690600090612b16565b505b60006b033b2e3c9fd0803ce80000006114f183600660009054906101000a9004600160a060020a0316600160a060020a031663c92aecc46040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b1580156114b957600080fd5b505afa1580156114cd573d6000803e3d6000fd5b505050506040513d60208110156114e357600080fd5b50519063ffffffff612ae416565b8115156114fa57fe5b600754604080517f6578697428616464726573732c75696e7432353629000000000000000000000081528151908190036015018120600160a060020a03808c1660248401529590940460448083018290528351808403909101815260649092019092526020810180516000805160206132918339815191521660008051602061322e83398151915290951694909417909352935061159f928892911690600090612b16565b505050505050565b600160a060020a031660009081526002602052604090205490565b600854600160a060020a031681565b600654600160a060020a031681565b81333014806115f457506115f48133612a44565b15156116395760405160008051602061324e833981519152815260040180806020018281038252602381526020018061326e6023913960400191505060405180910390fd5b600054604080517f0bcd4ebb000000000000000000000000000000000000000000000000000000008152600160a060020a03858116600483015291519190921691630bcd4ebb916024808301926020929190829003018186803b15801561169f57600080fd5b505afa1580156116b3573d6000803e3d6000fd5b505050506040513d60208110156116c957600080fd5b50511515611726576040805160008051602061324e833981519152815260206004820152601c60248201527f424d3a206d6f64756c65206973206e6f74207265676973746572656400000000604482015290519081900360640190fd5b604080517f1f17732d000000000000000000000000000000000000000000000000000000008152600160a060020a03848116600483015260016024830152915191851691631f17732d9160448082019260009290919082900301818387803b15801561179157600080fd5b505af11580156117a5573d6000803e3d6000fd5b50505050505050565b81333014806117c257506117c28133612a44565b15156118075760405160008051602061324e833981519152815260040180806020018281038252602381526020018061326e6023913960400191505060405180910390fd5b600154604080517f4a4fbeec000000000000000000000000000000000000000000000000000000008152600160a060020a038087166004830152915186939290921691634a4fbeec91602480820192602092909190829003018186803b15801561187057600080fd5b505afa158015611884573d6000803e3d6000fd5b505050506040513d602081101561189a57600080fd5b5051156118f6576040805160008051602061324e833981519152815260206004820152601b60248201527f424d3a2077616c6c6574206d75737420626520756e6c6f636b65640000000000604482015290519081900360640190fd5b600354604080517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a0387811660048301529151869392909216916370a0823191602480820192602092909190829003018186803b15801561195f57600080fd5b505afa158015611973573d6000803e3d6000fd5b505050506040513d602081101561198957600080fd5b505110156119e6576040805160008051602061324e833981519152815260206004820152601460248201527f444d3a20696e73756666696369656e7420534149000000000000000000000000604482015290519081900360640190fd5b600354604080517f617070726f766528616464726573732c75696e7432353629000000000000000081528151908190036018018120600554600160a060020a03908116602484015260448084018990528451808503909101815260649093019093526020820180516000805160206132918339815191521660008051602061322e833981519152909216919091179052611a869287921690600090612b16565b50600554604080517f73776170536169546f4461692875696e743235362900000000000000000000008152815190819003601501812060248083018890528351808403909101815260449092019092526020810180516000805160206132918339815191521660008051602061322e83398151915290931692909217909152611b1f918691600160a060020a0390911690600090612b16565b5060035460045460408051600160a060020a03938416815260208101879052918316828201526060820186905251918616917fe0aebc0b49a57880fff1a14cdb8f71331347f88fedf9f4a251ff97b31061d8289181900360800190a250505050565b8133301480611b955750611b958133612a44565b1515611bda5760405160008051602061324e833981519152815260040180806020018281038252602381526020018061326e6023913960400191505060405180910390fd5b600154604080517f4a4fbeec000000000000000000000000000000000000000000000000000000008152600160a060020a038087166004830152915186939290921691634a4fbeec91602480820192602092909190829003018186803b158015611c4357600080fd5b505afa158015611c57573d6000803e3d6000fd5b505050506040513d6020811015611c6d57600080fd5b505115611cc9576040805160008051602061324e833981519152815260206004820152601b60248201527f424d3a2077616c6c6574206d75737420626520756e6c6f636b65640000000000604482015290519081900360640190fd5b60048054604080517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a038881169482019490945290518693909216916370a0823191602480820192602092909190829003018186803b158015611d3457600080fd5b505afa158015611d48573d6000803e3d6000fd5b505050506040513d6020811015611d5e57600080fd5b50511015611e055760048054604080517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a03808916948201949094529051611e0593889316916370a08231916024808301926020929190829003018186803b158015611dd257600080fd5b505afa158015611de6573d6000803e3d6000fd5b505050506040513d6020811015611dfc57600080fd5b505185036117ae565b600660009054906101000a9004600160a060020a0316600160a060020a0316639f678cca6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b158015611e7157600080fd5b505af1158015611e85573d6000803e3d6000fd5b5050600454604080517f617070726f766528616464726573732c75696e7432353629000000000000000081528151908190036018018120600754600160a060020a03908116602484015260448084018b90528451808503909101815260649093019093526020820180516000805160206132918339815191521660008051602061322e833981519152909216919091179052611f2a9450889350911690600090612b16565b50600754604080517f6a6f696e28616464726573732c75696e7432353629000000000000000000000081528151908190036015018120600160a060020a03808916602484015260448084018990528451808503909101815260649093019093526020820180516000805160206132918339815191521660008051602061322e833981519152909216919091179052611fc89287921690600090612b16565b50600854600654604080517f4538c4eb000000000000000000000000000000000000000000000000000000008152600160a060020a038881166004830152928316602482015290519190921691634538c4eb916044808301926020929190829003018186803b15801561203a57600080fd5b505afa15801561204e573d6000803e3d6000fd5b505050506040513d602081101561206457600080fd5b5051151561210a57600854604080517f686f7065286164647265737329000000000000000000000000000000000000008152815190819003600d018120600654600160a060020a039081166024808501919091528451808503909101815260449093019093526020820180516000805160206132918339815191521660008051602061322e8339815191529092169190911790526121089287921690600090612b16565b505b600654604080517fc92aecc40000000000000000000000000000000000000000000000000000000081529051600092600160a060020a03169163c92aecc4916004808301926020929190829003018186803b15801561216857600080fd5b505afa15801561217c573d6000803e3d6000fd5b505050506040513d602081101561219257600080fd5b50516121b0856b033b2e3c9fd0803ce800000063ffffffff612ae416565b8115156121b957fe5b600654604080517f6a6f696e2875696e7432353629000000000000000000000000000000000000008152815190819003600d0181209490930460248085018290528251808603909101815260449094019091526020830180516000805160206132918339815191521660008051602061322e8339815191529095169490941790935291925061159f918791600160a060020a0390911690600090612b16565b600454600160a060020a038381169116146122c2576040805160008051602061324e833981519152815260206004820152601760248201527f444d3a20746f6b656e2073686f756c6420626520444149000000000000000000604482015290519081900360640190fd5b612710811115612321576040805160008051602061324e833981519152815260206004820152601a60248201527f444d3a20696e76616c6964206672616374696f6e2076616c7565000000000000604482015290519081900360640190fd5b6123508361271061234184612335886127c5565b9063ffffffff612ae416565b81151561234a57fe5b0461059a565b60408051600160a060020a038481168252602082018490528251908616927f9aa275f858ea6286ee2cacd32cd2ae55f918a310ee6d0320caad244ee9d6109e928290030190a2505050565b604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051600091600160a060020a038416916370a0823191602480820192602092909190829003018186803b1580156123fe57600080fd5b505afa158015612412573d6000803e3d6000fd5b505050506040513d602081101561242857600080fd5b505160008054604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201526024810185905290519394509085169263a9059cbb92604480840193602093929083900390910190829087803b15801561249e57600080fd5b505af11580156124b2573d6000803e3d6000fd5b505050506040513d60208110156124c857600080fd5b50505050565b600354600160a060020a031681565b6000805a9050600061252d308c60008d8d8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508f92508c91508b9050612d90565b905061253a8b8983612ed3565b1515612595576040805160008051602061324e833981519152815260206004820152601560248201527f524d3a204475706c696361746520726571756573740000000000000000000000604482015290519081900360640190fd5b6125d58b8b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612ee792505050565b151561261a5760405160008051602061324e833981519152815260040180806020018281038252604a8152602001806131e4604a913960600191505060405180910390fd5b600061265c8c8c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612f6092505050565b905060418102871415612774576126758c868884612f68565b15612774578015806126f857506126f88c8c8c8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8f018190048102820181019092528d815288935091508d908d908190840183828082843760009201919091525061303a92505050565b156127745730600160a060020a03168b8b604051808383808284376040519201945060009350909150508083038183865af19150503d8060008114612759576040519150601f19603f3d011682016040523d82523d6000602084013e61275e565b606091505b5050809450506127748c5a85038888853361305f565b60408051838152905185151591600160a060020a038f16917f6bb0b384ce772133df63560651bc8c727c53306cec1d51e2cbf8ea35fb8f2ec19181900360200190a350505098975050505050505050565b600654604080517f0bebac86000000000000000000000000000000000000000000000000000000008152600160a060020a03848116600483015291516000936b033b2e3c9fd0803ce8000000936128c993911691630bebac8691602480820192602092909190829003018186803b15801561283f57600080fd5b505afa158015612853573d6000803e3d6000fd5b505050506040513d602081101561286957600080fd5b5051600654604080517fc92aecc40000000000000000000000000000000000000000000000000000000081529051600160a060020a039092169163c92aecc491600480820192602092909190829003018186803b1580156114b957600080fd5b8115156128d257fe5b0492915050565b600454600160a060020a031681565b600754600160a060020a031681565b60026020526000908152604090205481565b6004546000908190600160a060020a0384811691161461292a576000612933565b612933846127c5565b946000945092505050565b7fd490da4d0000000000000000000000000000000000000000000000000000000090565b600554600160a060020a031681565b600454600090600160a060020a038581169116146129de576040805160008051602061324e833981519152815260206004820152601760248201527f444d3a20746f6b656e2073686f756c6420626520444149000000000000000000604482015290519081900360640190fd5b6129e88584611b81565b5060045460408051600160a060020a03928316815260208101859052808201849052905184928716917ff8eece150ed2126815122a6def9737751aecd814379d4ce8c9edd07133a49cdb919081900360600190a2949350505050565b600081600160a060020a031683600160a060020a0316638da5cb5b6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015612aa557600080fd5b505afa158015612ab9573d6000803e3d6000fd5b505050506040513d6020811015612acf57600080fd5b5051600160a060020a03161490505b92915050565b6000821515612af557506000612ade565b828202828482811515612b0457fe5b0414612b0f57600080fd5b9392505050565b6060600085600160a060020a03168585856040516024018084600160a060020a0316600160a060020a0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612b85578181015183820152602001612b6d565b50505050905090810190601f168015612bb25780820380516001836020036101000a031916815260200191505b5060408051601f19818403018152918152602082018051600080516020613291833981519152167f8f6f033200000000000000000000000000000000000000000000000000000000178152905182519297509550859450925090508083835b60208310612c305780518252601f199092019160209182019101612c11565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612c92576040519150601f19603f3d011682016040523d82523d6000602084013e612c97565b606091505b5092509050808015612caa575060008251115b15612d1757818060200190516020811015612cc457600080fd5b810190808051640100000000811115612cdc57600080fd5b82016020810184811115612cef57600080fd5b8151640100000000811182820187101715612d0957600080fd5b50909550612d879350505050565b600082511115612d2b573d6000803e3d6000fd5b801515612d87576040805160008051602061324e833981519152815260206004820152601a60248201527f424d3a2077616c6c657420696e766f6b65207265766572746564000000000000604482015290519081900360640190fd5b50949350505050565b6040517f190000000000000000000000000000000000000000000000000000000000000060208083018281526000602185018190526c01000000000000000000000000600160a060020a03808e16820260228801528c16026036860152604a85018a90528851909485938d938d938d938d938d938d938d939192606a909201918701908083835b60208310612e365780518252601f199092019160209182019101612e17565b51815160209384036101000a600019018019909216911617905292019586525084810193909352506040808401919091528051808403820181526060840182528051908301207f19457468657265756d205369676e6564204d6573736167653a0a3332000000006080850152609c808501919091528151808503909101815260bc909301905281519101209e9d5050505050505050505050505050565b6000612edf84846130b3565b949350505050565b60006024825110151515612f4a576040805160008051602061324e833981519152815260206004820152601660248201527f524d3a20496e76616c6964206461746157616c6c657400000000000000000000604482015290519081900360640190fd5b5060240151600160a060020a0391821691161490565b600192915050565b60008083118015612f795750600182115b8015613022575082840285600160a060020a03163110806130225750604080517fd6eb1bbf0000000000000000000000000000000000000000000000000000000081523060048201529051600160a060020a0387169163d6eb1bbf916024808301926020929190829003018186803b158015612ff457600080fd5b505afa158015613008573d6000803e3d6000fd5b505050506040513d602081101561301e57600080fd5b5051155b1561302f57506000612edf565b506001949350505050565b60008061304984846000613139565b90506130558682612a44565b9695505050505050565b61726c85016000851180156130745750600183115b80156130805750838111155b156117a5573a851115613094573a02613097565b84025b610b7a8783836020604051908101604052806000815250612b16565b600160a060020a03821660009081526002602052604081205482116130da57506000612ade565b7001000000000000000000000000000000006fffffffffffffffffffffffffffffffff198316044361271001811115613117576000915050612ade565b5050600160a060020a0391909116600090815260026020526040902055600190565b6041808202830160208101516040820151919092015160009260ff9190911691601b83148061316b57508260ff16601c145b151561317657600080fd5b604080516000815260208082018084528a905260ff8616828401526060820185905260808201849052915160019260a0808401939192601f1981019281900390910190855afa1580156131cd573d6000803e3d6000fd5b5050604051601f1901519897505050505050505056fe524d3a207468652077616c6c657420617574686f72697a656420697320646966666572656e74207468656e2074686520746172676574206f66207468652072656c617965642064617461ffffffff0000000000000000000000000000000000000000000000000000000008c379a000000000000000000000000000000000000000000000000000000000424d3a206d75737420626520616e206f776e657220666f72207468652077616c6c657400000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffa165627a7a723058204799972ba6ce61a3bd48380a6917b63dfcff5c5db122ea9ca64e20f611e3eea60029000000000000000000000000c17d432bd8e8850fd7b32b0270f5afac65db010500000000000000000000000044da3a8051ba88eab0440db3779cab9d679ae76f000000000000000000000000c73e0383f3aff3215e6f04b0331d58cecf0ab849000000000000000000000000197e90f9fad81970ba7976f33cbd77088e5d7cf7

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061019f576000357c0100000000000000000000000000000000000000000000000000000000900480639be65a60116100f5578063c11645bc116100a9578063d490da4d11610083578063d490da4d1461052b578063d9b6ccbf14610556578063ec9e13aa1461055e5761019f565b8063c11645bc146104b6578063c9b5ef8e146104be578063cac7495c146104e45761019f565b8063aacaaf88116100da578063aacaaf8814610398578063ae8d246814610488578063be22f546146104ae5761019f565b80639be65a601461036a578063a30184de146103905761019f565b806336569e77116101575780638c544246116101315780638c544246146102dc5780638d3e0a691461030857806398d53428146103345761019f565b806336569e77146102825780634ba2363a146102a65780635a1db8c4146102ae5761019f565b8063288596a611610188578063288596a6146101f85780632c5ba768146102245780632d0335ab1461024a5761019f565b80630227efa2146101a457806319ab453c146101d2575b600080fd5b6101d0600480360360408110156101ba57600080fd5b50600160a060020a03813516906020013561059a565b005b6101d0600480360360208110156101e857600080fd5b5035600160a060020a0316610b84565b6101d06004803603604081101561020e57600080fd5b50600160a060020a038135169060200135610c2a565b6101d06004803603602081101561023a57600080fd5b5035600160a060020a0316610fff565b6102706004803603602081101561026057600080fd5b5035600160a060020a03166115a7565b60408051918252519081900360200190f35b61028a6115c2565b60408051600160a060020a039092168252519081900360200190f35b61028a6115d1565b6101d0600480360360408110156102c457600080fd5b50600160a060020a03813581169160200135166115e0565b6101d0600480360360408110156102f257600080fd5b50600160a060020a0381351690602001356117ae565b6101d06004803603604081101561031e57600080fd5b50600160a060020a038135169060200135611b81565b6101d06004803603606081101561034a57600080fd5b50600160a060020a03813581169160208101359091169060400135612258565b6101d06004803603602081101561038057600080fd5b5035600160a060020a031661239b565b61028a6124ce565b610474600480360360c08110156103ae57600080fd5b600160a060020a0382351691908101906040810160208201356401000000008111156103d957600080fd5b8201836020820111156103eb57600080fd5b8035906020019184600183028401116401000000008311171561040d57600080fd5b9193909282359260408101906020013564010000000081111561042f57600080fd5b82018360208201111561044157600080fd5b8035906020019184600183028401116401000000008311171561046357600080fd5b9193509150803590602001356124dd565b604080519115158252519081900360200190f35b6102706004803603602081101561049e57600080fd5b5035600160a060020a03166127c5565b61028a6128d9565b61028a6128e8565b610270600480360360208110156104d457600080fd5b5035600160a060020a03166128f7565b610512600480360360408110156104fa57600080fd5b50600160a060020a0381358116916020013516612909565b6040805192835260208301919091528051918290030190f35b61053361293e565b6040805160008051602061322e8339815191529092168252519081900360200190f35b61028a612962565b6102706004803603608081101561057457600080fd5b50600160a060020a03813581169160208101359091169060408101359060600135612971565b81333014806105ae57506105ae8133612a44565b15156105f35760405160008051602061324e833981519152815260040180806020018281038252602381526020018061326e6023913960400191505060405180910390fd5b600154604080517f4a4fbeec000000000000000000000000000000000000000000000000000000008152600160a060020a038087166004830152915186939290921691634a4fbeec91602480820192602092909190829003018186803b15801561065c57600080fd5b505afa158015610670573d6000803e3d6000fd5b505050506040513d602081101561068657600080fd5b5051156106e2576040805160008051602061324e833981519152815260206004820152601b60248201527f424d3a2077616c6c6574206d75737420626520756e6c6f636b65640000000000604482015290519081900360640190fd5b600660009054906101000a9004600160a060020a0316600160a060020a0316639f678cca6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b15801561074e57600080fd5b505af1158015610762573d6000803e3d6000fd5b505050506000600660009054906101000a9004600160a060020a0316600160a060020a031663c92aecc46040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b1580156107d257600080fd5b505afa1580156107e6573d6000803e3d6000fd5b505050506040513d60208110156107fc57600080fd5b505161081a856b033b2e3c9fd0803ce800000063ffffffff612ae416565b81151561082357fe5b600654604080517f657869742875696e7432353629000000000000000000000000000000000000008152815190819003600d0181209490930460248085018290528251808603909101815260449094019091526020830180516000805160206132918339815191521660008051602061322e833981519152909516949094179093529192506108c2918791600160a060020a0390911690600090612b16565b50600854600754604080517f4538c4eb000000000000000000000000000000000000000000000000000000008152600160a060020a038981166004830152928316602482015290519190921691634538c4eb916044808301926020929190829003018186803b15801561093457600080fd5b505afa158015610948573d6000803e3d6000fd5b505050506040513d602081101561095e57600080fd5b50511515610a0457600854604080517f686f7065286164647265737329000000000000000000000000000000000000008152815190819003600d018120600754600160a060020a039081166024808501919091528451808503909101815260449093019093526020820180516000805160206132918339815191521660008051602061322e833981519152909216919091179052610a029288921690600090612b16565b505b600854604080517f6c25b346000000000000000000000000000000000000000000000000000000008152600160a060020a03888116600483015291516000939290921691636c25b34691602480820192602092909190829003018186803b158015610a6e57600080fd5b505afa158015610a82573d6000803e3d6000fd5b505050506040513d6020811015610a9857600080fd5b505190506000610aba866b033b2e3c9fd0803ce800000063ffffffff612ae416565b821015610ad5576b033b2e3c9fd0803ce80000008204610ad7565b855b600754604080517f6578697428616464726573732c75696e7432353629000000000000000000000081528151908190036015018120600160a060020a03808d16602484015260448084018790528451808503909101815260649093019093526020820180516000805160206132918339815191521660008051602061322e833981519152909216919091179052929350610b7a928a929190911690600090612b16565b5050505050505050565b8033600160a060020a03821614610bea576040805160008051602061324e833981519152815260206004820152601960248201527f424d3a2063616c6c6572206d7573742062652077616c6c657400000000000000604482015290519081900360640190fd5b60408051600160a060020a038416815290517f9fcca3f73f85397e2bf03647abf243c20b753bd54463ff3cae74de2971c112fa9181900360200190a15050565b8133301480610c3e5750610c3e8133612a44565b1515610c835760405160008051602061324e833981519152815260040180806020018281038252602381526020018061326e6023913960400191505060405180910390fd5b600154604080517f4a4fbeec000000000000000000000000000000000000000000000000000000008152600160a060020a038087166004830152915186939290921691634a4fbeec91602480820192602092909190829003018186803b158015610cec57600080fd5b505afa158015610d00573d6000803e3d6000fd5b505050506040513d6020811015610d1657600080fd5b505115610d72576040805160008051602061324e833981519152815260206004820152601b60248201527f424d3a2077616c6c6574206d75737420626520756e6c6f636b65640000000000604482015290519081900360640190fd5b60048054604080517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a038881169482019490945290518693909216916370a0823191602480820192602092909190829003018186803b158015610ddd57600080fd5b505afa158015610df1573d6000803e3d6000fd5b505050506040513d6020811015610e0757600080fd5b50511015610e64576040805160008051602061324e833981519152815260206004820152601460248201527f444d3a20696e73756666696369656e7420444149000000000000000000000000604482015290519081900360640190fd5b600454604080517f617070726f766528616464726573732c75696e7432353629000000000000000081528151908190036018018120600554600160a060020a03908116602484015260448084018990528451808503909101815260649093019093526020820180516000805160206132918339815191521660008051602061322e833981519152909216919091179052610f049287921690600090612b16565b50600554604080517f73776170446169546f5361692875696e743235362900000000000000000000008152815190819003601501812060248083018890528351808403909101815260449092019092526020810180516000805160206132918339815191521660008051602061322e83398151915290931692909217909152610f9d918691600160a060020a0390911690600090612b16565b5060045460035460408051600160a060020a03938416815260208101879052918316828201526060820186905251918616917fe0aebc0b49a57880fff1a14cdb8f71331347f88fedf9f4a251ff97b31061d8289181900360800190a250505050565b803330148061101357506110138133612a44565b15156110585760405160008051602061324e833981519152815260040180806020018281038252602381526020018061326e6023913960400191505060405180910390fd5b600154604080517f4a4fbeec000000000000000000000000000000000000000000000000000000008152600160a060020a038086166004830152915185939290921691634a4fbeec91602480820192602092909190829003018186803b1580156110c157600080fd5b505afa1580156110d5573d6000803e3d6000fd5b505050506040513d60208110156110eb57600080fd5b505115611147576040805160008051602061324e833981519152815260206004820152601b60248201527f424d3a2077616c6c6574206d75737420626520756e6c6f636b65640000000000604482015290519081900360640190fd5b600660009054906101000a9004600160a060020a0316600160a060020a0316639f678cca6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b1580156111b357600080fd5b505af11580156111c7573d6000803e3d6000fd5b5050600654604080517f0bebac86000000000000000000000000000000000000000000000000000000008152600160a060020a038881166004830152915160009550919092169250630bebac8691602480820192602092909190829003018186803b15801561123557600080fd5b505afa158015611249573d6000803e3d6000fd5b505050506040513d602081101561125f57600080fd5b5051600654604080517f657869742875696e7432353629000000000000000000000000000000000000008152815190819003600d01812060248083018690528351808403909101815260449092019092526020810180516000805160206132918339815191521660008051602061322e833981519152909316929092179091529192506112fa918691600160a060020a031690600090612b16565b50600854600754604080517f4538c4eb000000000000000000000000000000000000000000000000000000008152600160a060020a038881166004830152928316602482015290519190921691634538c4eb916044808301926020929190829003018186803b15801561136c57600080fd5b505afa158015611380573d6000803e3d6000fd5b505050506040513d602081101561139657600080fd5b5051151561143c57600854604080517f686f7065286164647265737329000000000000000000000000000000000000008152815190819003600d018120600754600160a060020a039081166024808501919091528451808503909101815260449093019093526020820180516000805160206132918339815191521660008051602061322e83398151915290921691909117905261143a9287921690600090612b16565b505b60006b033b2e3c9fd0803ce80000006114f183600660009054906101000a9004600160a060020a0316600160a060020a031663c92aecc46040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b1580156114b957600080fd5b505afa1580156114cd573d6000803e3d6000fd5b505050506040513d60208110156114e357600080fd5b50519063ffffffff612ae416565b8115156114fa57fe5b600754604080517f6578697428616464726573732c75696e7432353629000000000000000000000081528151908190036015018120600160a060020a03808c1660248401529590940460448083018290528351808403909101815260649092019092526020810180516000805160206132918339815191521660008051602061322e83398151915290951694909417909352935061159f928892911690600090612b16565b505050505050565b600160a060020a031660009081526002602052604090205490565b600854600160a060020a031681565b600654600160a060020a031681565b81333014806115f457506115f48133612a44565b15156116395760405160008051602061324e833981519152815260040180806020018281038252602381526020018061326e6023913960400191505060405180910390fd5b600054604080517f0bcd4ebb000000000000000000000000000000000000000000000000000000008152600160a060020a03858116600483015291519190921691630bcd4ebb916024808301926020929190829003018186803b15801561169f57600080fd5b505afa1580156116b3573d6000803e3d6000fd5b505050506040513d60208110156116c957600080fd5b50511515611726576040805160008051602061324e833981519152815260206004820152601c60248201527f424d3a206d6f64756c65206973206e6f74207265676973746572656400000000604482015290519081900360640190fd5b604080517f1f17732d000000000000000000000000000000000000000000000000000000008152600160a060020a03848116600483015260016024830152915191851691631f17732d9160448082019260009290919082900301818387803b15801561179157600080fd5b505af11580156117a5573d6000803e3d6000fd5b50505050505050565b81333014806117c257506117c28133612a44565b15156118075760405160008051602061324e833981519152815260040180806020018281038252602381526020018061326e6023913960400191505060405180910390fd5b600154604080517f4a4fbeec000000000000000000000000000000000000000000000000000000008152600160a060020a038087166004830152915186939290921691634a4fbeec91602480820192602092909190829003018186803b15801561187057600080fd5b505afa158015611884573d6000803e3d6000fd5b505050506040513d602081101561189a57600080fd5b5051156118f6576040805160008051602061324e833981519152815260206004820152601b60248201527f424d3a2077616c6c6574206d75737420626520756e6c6f636b65640000000000604482015290519081900360640190fd5b600354604080517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a0387811660048301529151869392909216916370a0823191602480820192602092909190829003018186803b15801561195f57600080fd5b505afa158015611973573d6000803e3d6000fd5b505050506040513d602081101561198957600080fd5b505110156119e6576040805160008051602061324e833981519152815260206004820152601460248201527f444d3a20696e73756666696369656e7420534149000000000000000000000000604482015290519081900360640190fd5b600354604080517f617070726f766528616464726573732c75696e7432353629000000000000000081528151908190036018018120600554600160a060020a03908116602484015260448084018990528451808503909101815260649093019093526020820180516000805160206132918339815191521660008051602061322e833981519152909216919091179052611a869287921690600090612b16565b50600554604080517f73776170536169546f4461692875696e743235362900000000000000000000008152815190819003601501812060248083018890528351808403909101815260449092019092526020810180516000805160206132918339815191521660008051602061322e83398151915290931692909217909152611b1f918691600160a060020a0390911690600090612b16565b5060035460045460408051600160a060020a03938416815260208101879052918316828201526060820186905251918616917fe0aebc0b49a57880fff1a14cdb8f71331347f88fedf9f4a251ff97b31061d8289181900360800190a250505050565b8133301480611b955750611b958133612a44565b1515611bda5760405160008051602061324e833981519152815260040180806020018281038252602381526020018061326e6023913960400191505060405180910390fd5b600154604080517f4a4fbeec000000000000000000000000000000000000000000000000000000008152600160a060020a038087166004830152915186939290921691634a4fbeec91602480820192602092909190829003018186803b158015611c4357600080fd5b505afa158015611c57573d6000803e3d6000fd5b505050506040513d6020811015611c6d57600080fd5b505115611cc9576040805160008051602061324e833981519152815260206004820152601b60248201527f424d3a2077616c6c6574206d75737420626520756e6c6f636b65640000000000604482015290519081900360640190fd5b60048054604080517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a038881169482019490945290518693909216916370a0823191602480820192602092909190829003018186803b158015611d3457600080fd5b505afa158015611d48573d6000803e3d6000fd5b505050506040513d6020811015611d5e57600080fd5b50511015611e055760048054604080517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a03808916948201949094529051611e0593889316916370a08231916024808301926020929190829003018186803b158015611dd257600080fd5b505afa158015611de6573d6000803e3d6000fd5b505050506040513d6020811015611dfc57600080fd5b505185036117ae565b600660009054906101000a9004600160a060020a0316600160a060020a0316639f678cca6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b158015611e7157600080fd5b505af1158015611e85573d6000803e3d6000fd5b5050600454604080517f617070726f766528616464726573732c75696e7432353629000000000000000081528151908190036018018120600754600160a060020a03908116602484015260448084018b90528451808503909101815260649093019093526020820180516000805160206132918339815191521660008051602061322e833981519152909216919091179052611f2a9450889350911690600090612b16565b50600754604080517f6a6f696e28616464726573732c75696e7432353629000000000000000000000081528151908190036015018120600160a060020a03808916602484015260448084018990528451808503909101815260649093019093526020820180516000805160206132918339815191521660008051602061322e833981519152909216919091179052611fc89287921690600090612b16565b50600854600654604080517f4538c4eb000000000000000000000000000000000000000000000000000000008152600160a060020a038881166004830152928316602482015290519190921691634538c4eb916044808301926020929190829003018186803b15801561203a57600080fd5b505afa15801561204e573d6000803e3d6000fd5b505050506040513d602081101561206457600080fd5b5051151561210a57600854604080517f686f7065286164647265737329000000000000000000000000000000000000008152815190819003600d018120600654600160a060020a039081166024808501919091528451808503909101815260449093019093526020820180516000805160206132918339815191521660008051602061322e8339815191529092169190911790526121089287921690600090612b16565b505b600654604080517fc92aecc40000000000000000000000000000000000000000000000000000000081529051600092600160a060020a03169163c92aecc4916004808301926020929190829003018186803b15801561216857600080fd5b505afa15801561217c573d6000803e3d6000fd5b505050506040513d602081101561219257600080fd5b50516121b0856b033b2e3c9fd0803ce800000063ffffffff612ae416565b8115156121b957fe5b600654604080517f6a6f696e2875696e7432353629000000000000000000000000000000000000008152815190819003600d0181209490930460248085018290528251808603909101815260449094019091526020830180516000805160206132918339815191521660008051602061322e8339815191529095169490941790935291925061159f918791600160a060020a0390911690600090612b16565b600454600160a060020a038381169116146122c2576040805160008051602061324e833981519152815260206004820152601760248201527f444d3a20746f6b656e2073686f756c6420626520444149000000000000000000604482015290519081900360640190fd5b612710811115612321576040805160008051602061324e833981519152815260206004820152601a60248201527f444d3a20696e76616c6964206672616374696f6e2076616c7565000000000000604482015290519081900360640190fd5b6123508361271061234184612335886127c5565b9063ffffffff612ae416565b81151561234a57fe5b0461059a565b60408051600160a060020a038481168252602082018490528251908616927f9aa275f858ea6286ee2cacd32cd2ae55f918a310ee6d0320caad244ee9d6109e928290030190a2505050565b604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051600091600160a060020a038416916370a0823191602480820192602092909190829003018186803b1580156123fe57600080fd5b505afa158015612412573d6000803e3d6000fd5b505050506040513d602081101561242857600080fd5b505160008054604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201526024810185905290519394509085169263a9059cbb92604480840193602093929083900390910190829087803b15801561249e57600080fd5b505af11580156124b2573d6000803e3d6000fd5b505050506040513d60208110156124c857600080fd5b50505050565b600354600160a060020a031681565b6000805a9050600061252d308c60008d8d8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508f92508c91508b9050612d90565b905061253a8b8983612ed3565b1515612595576040805160008051602061324e833981519152815260206004820152601560248201527f524d3a204475706c696361746520726571756573740000000000000000000000604482015290519081900360640190fd5b6125d58b8b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612ee792505050565b151561261a5760405160008051602061324e833981519152815260040180806020018281038252604a8152602001806131e4604a913960600191505060405180910390fd5b600061265c8c8c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612f6092505050565b905060418102871415612774576126758c868884612f68565b15612774578015806126f857506126f88c8c8c8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8f018190048102820181019092528d815288935091508d908d908190840183828082843760009201919091525061303a92505050565b156127745730600160a060020a03168b8b604051808383808284376040519201945060009350909150508083038183865af19150503d8060008114612759576040519150601f19603f3d011682016040523d82523d6000602084013e61275e565b606091505b5050809450506127748c5a85038888853361305f565b60408051838152905185151591600160a060020a038f16917f6bb0b384ce772133df63560651bc8c727c53306cec1d51e2cbf8ea35fb8f2ec19181900360200190a350505098975050505050505050565b600654604080517f0bebac86000000000000000000000000000000000000000000000000000000008152600160a060020a03848116600483015291516000936b033b2e3c9fd0803ce8000000936128c993911691630bebac8691602480820192602092909190829003018186803b15801561283f57600080fd5b505afa158015612853573d6000803e3d6000fd5b505050506040513d602081101561286957600080fd5b5051600654604080517fc92aecc40000000000000000000000000000000000000000000000000000000081529051600160a060020a039092169163c92aecc491600480820192602092909190829003018186803b1580156114b957600080fd5b8115156128d257fe5b0492915050565b600454600160a060020a031681565b600754600160a060020a031681565b60026020526000908152604090205481565b6004546000908190600160a060020a0384811691161461292a576000612933565b612933846127c5565b946000945092505050565b7fd490da4d0000000000000000000000000000000000000000000000000000000090565b600554600160a060020a031681565b600454600090600160a060020a038581169116146129de576040805160008051602061324e833981519152815260206004820152601760248201527f444d3a20746f6b656e2073686f756c6420626520444149000000000000000000604482015290519081900360640190fd5b6129e88584611b81565b5060045460408051600160a060020a03928316815260208101859052808201849052905184928716917ff8eece150ed2126815122a6def9737751aecd814379d4ce8c9edd07133a49cdb919081900360600190a2949350505050565b600081600160a060020a031683600160a060020a0316638da5cb5b6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015612aa557600080fd5b505afa158015612ab9573d6000803e3d6000fd5b505050506040513d6020811015612acf57600080fd5b5051600160a060020a03161490505b92915050565b6000821515612af557506000612ade565b828202828482811515612b0457fe5b0414612b0f57600080fd5b9392505050565b6060600085600160a060020a03168585856040516024018084600160a060020a0316600160a060020a0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612b85578181015183820152602001612b6d565b50505050905090810190601f168015612bb25780820380516001836020036101000a031916815260200191505b5060408051601f19818403018152918152602082018051600080516020613291833981519152167f8f6f033200000000000000000000000000000000000000000000000000000000178152905182519297509550859450925090508083835b60208310612c305780518252601f199092019160209182019101612c11565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612c92576040519150601f19603f3d011682016040523d82523d6000602084013e612c97565b606091505b5092509050808015612caa575060008251115b15612d1757818060200190516020811015612cc457600080fd5b810190808051640100000000811115612cdc57600080fd5b82016020810184811115612cef57600080fd5b8151640100000000811182820187101715612d0957600080fd5b50909550612d879350505050565b600082511115612d2b573d6000803e3d6000fd5b801515612d87576040805160008051602061324e833981519152815260206004820152601a60248201527f424d3a2077616c6c657420696e766f6b65207265766572746564000000000000604482015290519081900360640190fd5b50949350505050565b6040517f190000000000000000000000000000000000000000000000000000000000000060208083018281526000602185018190526c01000000000000000000000000600160a060020a03808e16820260228801528c16026036860152604a85018a90528851909485938d938d938d938d938d938d938d939192606a909201918701908083835b60208310612e365780518252601f199092019160209182019101612e17565b51815160209384036101000a600019018019909216911617905292019586525084810193909352506040808401919091528051808403820181526060840182528051908301207f19457468657265756d205369676e6564204d6573736167653a0a3332000000006080850152609c808501919091528151808503909101815260bc909301905281519101209e9d5050505050505050505050505050565b6000612edf84846130b3565b949350505050565b60006024825110151515612f4a576040805160008051602061324e833981519152815260206004820152601660248201527f524d3a20496e76616c6964206461746157616c6c657400000000000000000000604482015290519081900360640190fd5b5060240151600160a060020a0391821691161490565b600192915050565b60008083118015612f795750600182115b8015613022575082840285600160a060020a03163110806130225750604080517fd6eb1bbf0000000000000000000000000000000000000000000000000000000081523060048201529051600160a060020a0387169163d6eb1bbf916024808301926020929190829003018186803b158015612ff457600080fd5b505afa158015613008573d6000803e3d6000fd5b505050506040513d602081101561301e57600080fd5b5051155b1561302f57506000612edf565b506001949350505050565b60008061304984846000613139565b90506130558682612a44565b9695505050505050565b61726c85016000851180156130745750600183115b80156130805750838111155b156117a5573a851115613094573a02613097565b84025b610b7a8783836020604051908101604052806000815250612b16565b600160a060020a03821660009081526002602052604081205482116130da57506000612ade565b7001000000000000000000000000000000006fffffffffffffffffffffffffffffffff198316044361271001811115613117576000915050612ade565b5050600160a060020a0391909116600090815260026020526040902055600190565b6041808202830160208101516040820151919092015160009260ff9190911691601b83148061316b57508260ff16601c145b151561317657600080fd5b604080516000815260208082018084528a905260ff8616828401526060820185905260808201849052915160019260a0808401939192601f1981019281900390910190855afa1580156131cd573d6000803e3d6000fd5b5050604051601f1901519897505050505050505056fe524d3a207468652077616c6c657420617574686f72697a656420697320646966666572656e74207468656e2074686520746172676574206f66207468652072656c617965642064617461ffffffff0000000000000000000000000000000000000000000000000000000008c379a000000000000000000000000000000000000000000000000000000000424d3a206d75737420626520616e206f776e657220666f72207468652077616c6c657400000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffa165627a7a723058204799972ba6ce61a3bd48380a6917b63dfcff5c5db122ea9ca64e20f611e3eea60029

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000c17d432bd8e8850fd7b32b0270f5afac65db010500000000000000000000000044da3a8051ba88eab0440db3779cab9d679ae76f000000000000000000000000c73e0383f3aff3215e6f04b0331d58cecf0ab849000000000000000000000000197e90f9fad81970ba7976f33cbd77088e5d7cf7

-----Decoded View---------------
Arg [0] : _registry (address): 0xc17D432Bd8e8850Fd7b32B0270f5AfAc65DB0105
Arg [1] : _guardianStorage (address): 0x44DA3A8051bA88EAB0440DB3779cAB9D679ae76f
Arg [2] : _scdMcdMigration (address): 0xc73e0383F3Aff3215E6f04B0331D58CeCf0Ab849
Arg [3] : _pot (address): 0x197E90f9FAD81970bA7976f33CbD77088E5D7cf7

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000c17d432bd8e8850fd7b32b0270f5afac65db0105
Arg [1] : 00000000000000000000000044da3a8051ba88eab0440db3779cab9d679ae76f
Arg [2] : 000000000000000000000000c73e0383f3aff3215e6f04b0331d58cecf0ab849
Arg [3] : 000000000000000000000000197e90f9fad81970ba7976f33cbd77088e5d7cf7


Deployed Bytecode Sourcemap

37301:10298:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37301:10298:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43708:1300;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;43708:1300:0;;;;;;;;:::i;:::-;;10830:120;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10830:120:0;-1:-1:-1;;;;;10830:120:0;;:::i;46981:615::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;46981:615:0;;;;;;;;:::i;45016:1004::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45016:1004:0;-1:-1:-1;;;;;45016:1004:0;;:::i;17003:133::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17003:133:0;-1:-1:-1;;;;;17003:133:0;;:::i;:::-;;;;;;;;;;;;;;;;37828:18;;;:::i;:::-;;;;-1:-1:-1;;;;;37828:18:0;;;;;;;;;;;;;;37703;;;:::i;24488:252::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;24488:252:0;;;;;;;;;;:::i;46194:613::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;46194:613:0;;;;;;;;:::i;42107:1421::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;42107:1421:0;;;;;;;;:::i;40648:429::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;40648:429:0;;;;;;;;;;;;;;;;;:::i;11623:176::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11623:176:0;-1:-1:-1;;;;;11623:176:0;;:::i;37474:23::-;;;:::i;15549:1339::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;15549:1339:0;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;15549:1339:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;15549:1339:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;15549:1339:0;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;15549:1339:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;15549:1339:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;15549:1339:0;;-1:-1:-1;15549:1339:0;-1:-1:-1;15549:1339:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;41787:142;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41787:142:0;-1:-1:-1;;;;;41787:142:0;;:::i;37547:23::-;;;:::i;37767:::-;;;:::i;13536:49::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13536:49:0;-1:-1:-1;;;;;13536:49:0;;:::i;41375:291::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;41375:291:0;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;24032:158;;;:::i;:::-;;;;-1:-1:-1;;;;;;;;;;;24032:158:0;;;;;;;;;;;;;;37635:30;;;:::i;39993:430::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;39993:430:0;;;;;;;;;;;;;;;;;;;;;;:::i;43708:1300::-;43828:7;10258:10;10280:4;10258:27;;:59;;;10289:28;10297:7;10306:10;10289:7;:28::i;:::-;10250:107;;;;;;-1:-1:-1;;;;;;;;;;;10250:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9442:15;;:33;;;;;;-1:-1:-1;;;;;9442:33:0;;;;;;;;;43863:7;;9442:15;;;;;:24;;:33;;;;;;;;;;;;;;;:15;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;9442:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9442:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9442:33:0;9441:34;9433:74;;;;;-1:-1:-1;;;;;;;;;;;9433:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;43964:3;;;;;;;;;-1:-1:-1;;;;;43964:3:0;-1:-1:-1;;;;;43964:8:0;;:10;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43964:10:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43964:10:0;;;;44066:11;44099:3;;;;;;;;;-1:-1:-1;;;;;44099:3:0;-1:-1:-1;;;;;44099:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;8::-1;5:2;;;30:1;27;20:12;5:2;44099:9:0;;;;8::-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44099:9:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44099:9:0;44080:16;:7;38627:8;44080:16;:11;:16;:::i;:::-;:28;;;;;;;44192:3;;38559:26;;;;;;;;;;;;;;;;44080:28;;;;44201:37;;;;;;;;;26:21:-1;;;22:32;;;6:49;;44201:37:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;;;;;;;182:15;-1:-1;;;;;;;;;;;44201:37:0;;;179:29:-1;;;;160:49;;;44080:28:0;;-1:-1:-1;44153:86:0;;44174:7;;-1:-1:-1;;;;;44192:3:0;;;;;;44153:12;:86::i;:::-;-1:-1:-1;44327:3:0;;44361:7;;44327:43;;;;;;-1:-1:-1;;;;;44327:43:0;;;;;;;44361:7;;;44327:43;;;;;;:3;;;;;:7;;:43;;;;;;;;;;;;;;:3;:43;;;5:2:-1;;;;30:1;27;20:12;5:2;44327:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44327:43:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44327:43:0;:48;44323:180;;;44431:3;;38405:26;;;;;;;;;;;;;;;;44481:7;;-1:-1:-1;;;;;44481:7:0;;;44440:50;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;44440:50:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;;;;;;;182:15;-1:-1;;;;;;;;;;;44440:50:0;;;179:29:-1;;;;160:49;;44392:99:0;;44413:7;;44431:3;;;;44392:12;:99::i;:::-;;44323:180;44598:3;;:25;;;;;;-1:-1:-1;;;;;44598:25:0;;;;;;;;;44587:8;;44598:3;;;;;:7;;:25;;;;;;;;;;;;;;;:3;:25;;;5:2:-1;;;;30:1;27;20:12;5:2;44598:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44598:25:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44598:25:0;;-1:-1:-1;44806:17:0;44833:16;:7;38627:8;44833:16;:11;:16;:::i;:::-;44826:3;:23;;:45;;38627:8;44862:3;:9;44826:45;;;44852:7;44826:45;44921:7;;38320:34;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44934:65:0;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;44934:65:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;;;;;;;182:15;-1:-1;;;;;;;;;;;44934:65:0;;;179:29:-1;;;;160:49;;44806:65:0;;-1:-1:-1;44882:118:0;;44903:7;;44921;;;;;;;44882:12;:118::i;:::-;;9518:1;;;10368;43708:1300;;;:::o;10830:120::-;10882:7;9994:10;-1:-1:-1;;;;;9994:30:0;;;9986:68;;;;;-1:-1:-1;;;;;;;;;;;9986:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10907:35;;;-1:-1:-1;;;;;10907:35:0;;;;;;;;;;;;;;;10830:120;;:::o;46981:615::-;47108:7;10258:10;10280:4;10258:27;;:59;;;10289:28;10297:7;10306:10;10289:7;:28::i;:::-;10250:107;;;;;;-1:-1:-1;;;;;;;;;;;10250:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9442:15;;:33;;;;;;-1:-1:-1;;;;;9442:33:0;;;;;;;;;47143:7;;9442:15;;;;;:24;;:33;;;;;;;;;;;;;;;:15;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;9442:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9442:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9442:33:0;9441:34;9433:74;;;;;-1:-1:-1;;;;;;;;;;;9433:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;47176:8;;;:36;;;;;;-1:-1:-1;;;;;47176:36:0;;;;;;;;;;;;47216:7;;47176:8;;;;:18;;:36;;;;;;;;;;;;;;;:8;:36;;;5:2:-1;;;;30:1;27;20:12;5:2;47176:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47176:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47176:36:0;:47;;47168:80;;;;;-1:-1:-1;;;;;;;;;;;47168:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;47298:8;;37961:37;;;;;;;;;;;;;;;;47350:15;;-1:-1:-1;;;;;47350:15:0;;;47312:63;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;47312:63:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;;;;;;;182:15;-1:-1;;;;;;;;;;;47312:63:0;;;179:29:-1;;;;160:49;;47259:117:0;;47280:7;;47298:8;;;;47259:12;:117::i;:::-;-1:-1:-1;47418:15:0;;38142:34;;;;;;;;;;;;;;;;47438:45;;;;;;;;;26:21:-1;;;22:32;;;6:49;;47438:45:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;;;;;;;182:15;-1:-1;;;;;;;;;;;47438:45:0;;;179:29:-1;;;;160:49;;;47387:97:0;;47408:7;;-1:-1:-1;;;;;47418:15:0;;;;;;47387:12;:97::i;:::-;-1:-1:-1;47541:8:0;;47569;;47500:88;;;-1:-1:-1;;;;;47541:8:0;;;47500:88;;;;;;;;47569:8;;;47500:88;;;;;;;;;;;;;;;;;;;;;;;;10368:1;46981:615;;;:::o;45016:1004::-;45115:7;10258:10;10280:4;10258:27;;:59;;;10289:28;10297:7;10306:10;10289:7;:28::i;:::-;10250:107;;;;;;-1:-1:-1;;;;;;;;;;;10250:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9442:15;;:33;;;;;;-1:-1:-1;;;;;9442:33:0;;;;;;;;;45150:7;;9442:15;;;;;:24;;:33;;;;;;;;;;;;;;;:15;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;9442:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9442:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9442:33:0;9441:34;9433:74;;;;;-1:-1:-1;;;;;;;;;;;9433:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;45251:3;;;;;;;;;-1:-1:-1;;;;;45251:3:0;-1:-1:-1;;;;;45251:8:0;;:10;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45251:10:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;45342:3:0;;:25;;;;;;-1:-1:-1;;;;;45342:25:0;;;;;;;;;45328:11;;-1:-1:-1;45342:3:0;;;;;-1:-1:-1;45342:7:0;;:25;;;;;;;;;;;;;;;:3;:25;;;5:2:-1;;;;30:1;27;20:12;5:2;45342:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45342:25:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45342:25:0;45451:3;;38559:26;;;;;;;;;;;;;;;;45460:37;;;;;;;;;26:21:-1;;;22:32;;;6:49;;45460:37:0;;;;;;;45342:25;25:18:-1;;61:17;;-1:-1;;;;;;;;;;;182:15;-1:-1;;;;;;;;;;;45460:37:0;;;179:29:-1;;;;160:49;;;45342:25:0;;-1:-1:-1;45412:86:0;;45433:7;;-1:-1:-1;;;;;45451:3:0;;;;45412:12;:86::i;:::-;-1:-1:-1;45586:3:0;;45620:7;;45586:43;;;;;;-1:-1:-1;;;;;45586:43:0;;;;;;;45620:7;;;45586:43;;;;;;:3;;;;;:7;;:43;;;;;;;;;;;;;;:3;:43;;;5:2:-1;;;;30:1;27;20:12;5:2;45586:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45586:43:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45586:43:0;:48;45582:180;;;45690:3;;38405:26;;;;;;;;;;;;;;;;45740:7;;-1:-1:-1;;;;;45740:7:0;;;45699:50;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;45699:50:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;;;;;;;182:15;-1:-1;;;;;;;;;;;45699:50:0;;;179:29:-1;;;;160:49;;45651:99:0;;45672:7;;45690:3;;;;45651:12;:99::i;:::-;;45582:180;45839:17;38627:8;45859:18;45873:3;45859;;;;;;;;;-1:-1:-1;;;;;45859:3:0;-1:-1:-1;;;;;45859:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;8::-1;5:2;;;30:1;27;20:12;5:2;45859:9:0;;;;8::-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45859:9:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45859:9:0;;:18;:13;:18;:::i;:::-;:24;;;;;;;45933:7;;38320:34;;;;;;;;;;;;;;;;-1:-1:-1;;;;;45946:65:0;;;;;;;45859:24;;;;45946:65;;;;;;;;;26:21:-1;;;22:32;;;6:49;;45946:65:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;;;;;;;182:15;-1:-1;;;;;;;;;;;45946:65:0;;;179:29:-1;;;;160:49;;;45859:24:0;-1:-1:-1;45894:118:0;;45915:7;;45933;;;;;45894:12;:118::i;:::-;;9518:1;;10368;45016:1004;;:::o;17003:133::-;-1:-1:-1;;;;;17097:25:0;17064:13;17097:25;;;:7;:25;;;;;:31;;17003:133::o;37828:18::-;;;-1:-1:-1;;;;;37828:18:0;;:::o;37703:::-;;;-1:-1:-1;;;;;37703:18:0;;:::o;24488:252::-;24568:7;10258:10;10280:4;10258:27;;:59;;;10289:28;10297:7;10306:10;10289:7;:28::i;:::-;10250:107;;;;;;-1:-1:-1;;;;;;;;;;;10250:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24596:8;;:45;;;;;;-1:-1:-1;;;;;24596:45:0;;;;;;;;;:8;;;;;:27;;:45;;;;;;;;;;;;;;:8;:45;;;5:2:-1;;;;30:1;27;20:12;5:2;24596:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24596:45:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24596:45:0;24588:86;;;;;;;-1:-1:-1;;;;;;;;;;;24588:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;24685:47;;;;;;-1:-1:-1;;;;;24685:47:0;;;;;;;24727:4;24685:47;;;;;;:23;;;;;;:47;;;;;-1:-1:-1;;24685:47:0;;;;;;;;-1:-1:-1;24685:23:0;:47;;;5:2:-1;;;;30:1;27;20:12;5:2;24685:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24685:47:0;;;;24488:252;;;:::o;46194:613::-;46319:7;10258:10;10280:4;10258:27;;:59;;;10289:28;10297:7;10306:10;10289:7;:28::i;:::-;10250:107;;;;;;-1:-1:-1;;;;;;;;;;;10250:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9442:15;;:33;;;;;;-1:-1:-1;;;;;9442:33:0;;;;;;;;;46354:7;;9442:15;;;;;:24;;:33;;;;;;;;;;;;;;;:15;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;9442:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9442:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9442:33:0;9441:34;9433:74;;;;;-1:-1:-1;;;;;;;;;;;9433:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;46387:8;;:36;;;;;;-1:-1:-1;;;;;46387:36:0;;;;;;;;;46427:7;;46387:8;;;;;:18;;:36;;;;;;;;;;;;;;;:8;:36;;;5:2:-1;;;;30:1;27;20:12;5:2;46387:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46387:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46387:36:0;:47;;46379:80;;;;;-1:-1:-1;;;;;;;;;;;46379:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;46509:8;;37961:37;;;;;;;;;;;;;;;;46561:15;;-1:-1:-1;;;;;46561:15:0;;;46523:63;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;46523:63:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;;;;;;;182:15;-1:-1;;;;;;;;;;;46523:63:0;;;179:29:-1;;;;160:49;;46470:117:0;;46491:7;;46509:8;;;;46470:12;:117::i;:::-;-1:-1:-1;46629:15:0;;38053:34;;;;;;;;;;;;;;;;46649:45;;;;;;;;;26:21:-1;;;22:32;;;6:49;;46649:45:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;;;;;;;182:15;-1:-1;;;;;;;;;;;46649:45:0;;;179:29:-1;;;;160:49;;;46598:97:0;;46619:7;;-1:-1:-1;;;;;46629:15:0;;;;;;46598:12;:97::i;:::-;-1:-1:-1;46752:8:0;;46780;;46711:88;;;-1:-1:-1;;;;;46752:8:0;;;46711:88;;;;;;;;46780:8;;;46711:88;;;;;;;;;;;;;;;;;;;;;;;;10368:1;46194:613;;;:::o;42107:1421::-;42227:7;10258:10;10280:4;10258:27;;:59;;;10289:28;10297:7;10306:10;10289:7;:28::i;:::-;10250:107;;;;;;-1:-1:-1;;;;;;;;;;;10250:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9442:15;;:33;;;;;;-1:-1:-1;;;;;9442:33:0;;;;;;;;;42262:7;;9442:15;;;;;:24;;:33;;;;;;;;;;;;;;;:15;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;9442:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9442:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9442:33:0;9441:34;9433:74;;;;;-1:-1:-1;;;;;;;;;;;9433:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;42291:8;;;:36;;;;;;-1:-1:-1;;;;;42291:36:0;;;;;;;;;;;;42330:7;;42291:8;;;;:18;;:36;;;;;;;;;;;;;;;:8;:36;;;5:2:-1;;;;30:1;27;20:12;5:2;42291:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42291:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42291:36:0;:46;42287:148;;;42386:8;;;:36;;;;;;-1:-1:-1;;;;;42386:36:0;;;;;;;;;;;;42354:69;;42367:7;;42386:8;;:18;;:36;;;;;;;;;;;;;;:8;:36;;;5:2:-1;;;;30:1;27;20:12;5:2;42386:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42386:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42386:36:0;42376:46;;42354:12;:69::i;:::-;42540:3;;;;;;;;;-1:-1:-1;;;;;42540:3:0;-1:-1:-1;;;;;42540:8:0;;:10;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42540:10:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;42655:8:0;;37961:37;;;;;;;;;;;;;;;;42715:7;;-1:-1:-1;;;;;42715:7:0;;;42669:64;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;42669:64:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;;;;;;;182:15;-1:-1;;;;;;;;;;;42669:64:0;;;179:29:-1;;;;160:49;;42616:118:0;;-1:-1:-1;42637:7:0;;-1:-1:-1;42655:8:0;;;;;42616:12;:118::i;:::-;-1:-1:-1;42932:7:0;;38231:34;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42945:63:0;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;42945:63:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;;;;;;;182:15;-1:-1;;;;;;;;;;;42945:63:0;;;179:29:-1;;;;160:49;;42893:116:0;;42914:7;;42932;;;;42893:12;:116::i;:::-;-1:-1:-1;43116:3:0;;43150;;43116:39;;;;;;-1:-1:-1;;;;;43116:39:0;;;;;;;43150:3;;;43116:39;;;;;;:3;;;;;:7;;:39;;;;;;;;;;;;;;:3;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;43116:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43116:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43116:39:0;:44;43112:172;;;43216:3;;38405:26;;;;;;;;;;;;;;;;43266:3;;-1:-1:-1;;;;;43266:3:0;;;43225:46;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;43225:46:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;;;;;;;182:15;-1:-1;;;;;;;;;;;43225:46:0;;;179:29:-1;;;;160:49;;43177:95:0;;43198:7;;43216:3;;;;43177:12;:95::i;:::-;;43112:172;43372:3;;:9;;;;;;;;43339:11;;-1:-1:-1;;;;;43372:3:0;;:7;;:9;;;;;;;;;;;;;;:3;:9;;;5:2:-1;;;;30:1;27;20:12;5:2;43372:9:0;;;;8::-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43372:9:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43372:9:0;43353:16;:7;38627:8;43353:16;:11;:16;:::i;:::-;:28;;;;;;;43473:3;;38482:26;;;;;;;;;;;;;;;;43353:28;;;;43482:37;;;;;;;;;26:21:-1;;;22:32;;;6:49;;43482:37:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;;;;;;;182:15;-1:-1;;;;;;;;;;;43482:37:0;;;179:29:-1;;;;160:49;;;43353:28:0;;-1:-1:-1;43434:86:0;;43455:7;;-1:-1:-1;;;;;43473:3:0;;;;;;43434:12;:86::i;40648:429::-;40823:8;;-1:-1:-1;;;;;40805:27:0;;;40823:8;;40805:27;40797:63;;;;;-1:-1:-1;;;;;;;;;;;40797:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;40892:5;40879:18;;;40871:57;;;;;-1:-1:-1;;;;;;;;;;;40871:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;40939:60;40947:7;40993:5;40956:34;40980:9;40956:19;40967:7;40956:10;:19::i;:::-;:23;:34;:23;:34;:::i;:::-;:42;;;;;;;;40939:7;:60::i;:::-;41015:54;;;-1:-1:-1;;;;;41015:54:0;;;;;;;;;;;;;;;;;;;;;;;;;40648:429;;;:::o;11623:176::-;11694:38;;;;;;11726:4;11694:38;;;;;;11681:10;;-1:-1:-1;;;;;11694:23:0;;;;;:38;;;;;;;;;;;;;;;:23;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;11694:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11694:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11694:38:0;11774:8;;;11743:48;;;;;;-1:-1:-1;;;;;11774:8:0;;;11743:48;;;;;;;;;;;;11694:38;;-1:-1:-1;11743:22:0;;;;;;:48;;;;;11694:38;;11743:48;;;;;;;;;;;:22;:48;;;5:2:-1;;;;30:1;27;20:12;5:2;11743:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11743:48:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;11623:176:0:o;37474:23::-;;;-1:-1:-1;;;;;37474:23:0;;:::o;15549:1339::-;15787:12;15817:13;15833:9;15817:25;;15853:16;15872:84;15892:4;15907:7;15917:1;15920:5;;15872:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;15927:6:0;;-1:-1:-1;15935:9:0;;-1:-1:-1;15946:9:0;;-1:-1:-1;15872:11:0;:84::i;:::-;15853:103;;15975:51;16000:7;16009:6;16017:8;15975:24;:51::i;:::-;15967:85;;;;;;;-1:-1:-1;;;;;;;;;;;15967:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;16071:35;16090:7;16100:5;;16071:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;16071:10:0;;-1:-1:-1;;;16071:35:0:i;:::-;16063:122;;;;;;-1:-1:-1;;;;;;;;;;;16063:122:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16196:26;16225:37;16247:7;16256:5;;16225:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;16225:21:0;;-1:-1:-1;;;16225:37:0:i;:::-;16196:66;-1:-1:-1;16298:2:0;16277:23;;16276:47;;16273:536;;;16343:63;16356:7;16365:9;16376;16387:18;16343:12;:63::i;:::-;16340:458;;;16430:23;;;:84;;;16457:57;16476:7;16485:5;;16457:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;;16457:57:0;;;;137:4:-1;16457:57:0;;;;;;;;;;;;;;;;;16492:8;;-1:-1:-1;16457:57:0;-1:-1:-1;16502:11:0;;;;;;16457:57;;16502:11;;;;16457:57;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;16457:18:0;;-1:-1:-1;;;16457:57:0:i;:::-;16427:356;;;16632:4;-1:-1:-1;;;;;16624:18:0;16643:5;;16624:25;;;;;30:3:-1;22:6;14;1:33;16624:25:0;;45:16:-1;;;-1:-1;16624:25:0;;-1:-1:-1;16624:25:0;;-1:-1:-1;;16624:25:0;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;16611:38:0;;;;;16672:91;16679:7;16699:9;16688:8;:20;16710:9;16721;16732:18;16752:10;16672:6;:91::i;:::-;16824:56;;;;;;;;;;;;-1:-1:-1;;;;;16824:56:0;;;;;;;;;;;;15549:1339;;;;;;;;;;;;;:::o;41787:142::-;41889:3;;:25;;;;;;-1:-1:-1;;;;;41889:25:0;;;;;;;;;41848:7;;38627:8;;41875:40;;41889:3;;;:7;;:25;;;;;;;;;;;;;;;:3;:25;;;5:2:-1;;;;30:1;27;20:12;5:2;41889:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41889:25:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41889:25:0;41875:3;;:9;;;;;;;;-1:-1:-1;;;;;41875:3:0;;;;:7;;:9;;;;;41889:25;;41875:9;;;;;;;;:3;:9;;;5:2:-1;;;;30:1;27;20:12;41875:40:0;:46;;;;;;;;;41787:142;-1:-1:-1;;41787:142:0:o;37547:23::-;;;-1:-1:-1;;;;;37547:23:0;;:::o;37767:::-;;;-1:-1:-1;;;;;37767:23:0;;:::o;13536:49::-;;;;;;;;;;;;;:::o;41375:291::-;41598:8;;41509:19;;;;-1:-1:-1;;;;;41580:27:0;;;41598:8;;41580:27;:53;;41632:1;41580:53;;;41610:19;41621:7;41610:10;:19::i;:::-;41566:67;41657:1;;-1:-1:-1;41375:291:0;-1:-1:-1;;;41375:291:0:o;24032:158::-;24151:31;24032:158;:::o;37635:30::-;;;-1:-1:-1;;;;;37635:30:0;;:::o;39993:430::-;40226:8;;40165:17;;-1:-1:-1;;;;;40208:27:0;;;40226:8;;40208:27;40200:63;;;;;-1:-1:-1;;;;;;;;;;;40200:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;40274:25;40282:7;40291;40274;:25::i;:::-;-1:-1:-1;40387:8:0;;40345:70;;;-1:-1:-1;;;;;40387:8:0;;;40345:70;;;;;;;;;;;;;;;;40322:7;;40345:70;;;;;;;;;;;;;39993:430;;;;;;:::o;11984:131::-;12059:4;12102:5;-1:-1:-1;;;;;12083:24:0;:7;-1:-1:-1;;;;;12083:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12083:15:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12083:15:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12083:15:0;-1:-1:-1;;;;;12083:24:0;;;-1:-1:-1;11984:131:0;;;;;:::o;6905:433::-;6963:7;7207:6;;7203:47;;;-1:-1:-1;7237:1:0;7230:8;;7203:47;7274:5;;;7278:1;7274;:5;7298;;;;;;;;:10;7290:19;;;;;;7329:1;6905:433;-1:-1:-1;;;6905:433:0:o;12391:845::-;12497:17;12527:12;12628:7;-1:-1:-1;;;;;12628:12:0;12698:3;12703:6;12711:5;12641:76;;;;;;-1:-1:-1;;;;;12641:76:0;-1:-1:-1;;;;;12641:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;12641:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12641:76:0;;;-1:-1:-1;;26:21;;;22:32;6:49;;12641:76:0;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;;;;;;;182:15;12641:76:0;179:29:-1;160:49;;12628:90:0;;;;12641:76;;-1:-1:-1;12628:90:0;-1:-1:-1;12628:90:0;;-1:-1:-1;25:18;-1:-1;12628:90:0;-1:-1:-1;12628:90:0;;25:18:-1;36:153;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;12628:90:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;-1:-1;12610:108:0;-1:-1:-1;12610:108:0;-1:-1:-1;12610:108:0;12732:26;;;;;12757:1;12743:4;:11;:15;12732:26;12729:500;;;12877:4;12866:25;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12866:25:0;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;213:10;;261:11;244:29;;285:43;;;282:58;-1:-1;233:115;230:2;;;361:1;358;351:12;230:2;-1:-1;12866:25:0;;-1:-1:-1;12729:500:0;;-1:-1:-1;;;;12729:500:0;;12927:1;12913:4;:11;:15;12909:320;;;13063:14;13060:1;13057;13042:36;13106:14;13103:1;13096:25;13023:113;13157:7;13156:8;13153:76;;;13181:36;;;-1:-1:-1;;;;;;;;;;;13181:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;13153:76;12391:845;;;;;;;:::o;17741:528::-;18154:94;;18171:10;18154:94;;;;;;;18000:7;18154:94;;;;;;;-1:-1:-1;;;;;18154:94:0;;;;;;;;;;;;;;;;;;;;;;;;18000:7;;;;18192:5;;18199:3;;18204:6;;18212:5;;18219:6;;18227:9;;18238;;18154:94;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;18154:94:0;;;;;-1:-1:-1;18154:94:0;;;;;;;-1:-1:-1;18154:94:0;;;;;;;;;;26:21:-1;;;22:32;;6:49;;18154:94:0;;;;;18144:105;;;;;;18056:204;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;18056:204:0;;;;;;18032:229;;;;;;17741:528;-1:-1:-1;;;;;;;;;;;;;;17741:528:0:o;24904:181::-;25017:4;25041:36;25061:7;25070:6;25041:19;:36::i;:::-;25034:43;24904:181;-1:-1:-1;;;;24904:181:0:o;22643:431::-;22722:4;22763:2;22747:5;:12;:18;;22739:53;;;;;;;-1:-1:-1;;;;;;;;;;;22739:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23011:4:0;23000:16;22994:23;-1:-1:-1;;;;;23045:21:0;;;;;;;22643:431::o;25473:142::-;25606:1;25473:142;;;;:::o;22032:361::-;22146:4;22178:1;22166:9;:13;:45;;;;;22210:1;22196:11;:15;22166:45;:157;;;;;22267:9;22256:8;:20;22237:7;-1:-1:-1;;;;;22229:24:0;;:47;:93;;;-1:-1:-1;22280:33:0;;;;;;22307:4;22280:33;;;;;;-1:-1:-1;;;;;22280:18:0;;;;;:33;;;;;;;;;;;;;;:18;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;22280:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22280:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22280:33:0;:42;22229:93;22163:201;;;-1:-1:-1;22347:5:0;22340:12;;22163:201;-1:-1:-1;22381:4:0;22032:361;;;;;;:::o;25093:372::-;25305:4;25327:14;25344:40;25358:9;25369:11;25382:1;25344:13;:40::i;:::-;25327:57;;25402:24;25410:7;25419:6;25402:7;:24::i;:::-;25395:31;25093:372;-1:-1:-1;;;;;;25093:372:0:o;21091:705::-;21247:5;:16;;21230:14;21457:13;;:32;;;;;21488:1;21474:11;:15;21457:32;:55;;;;;21503:9;21493:6;:19;;21457:55;21454:335;;;21544:11;21532:9;:23;21529:173;;;21594:11;21585:20;21529:173;;;21668:18;;21529:173;21716:61;21737:7;21747:8;21757:6;21765:11;;;;;;;;;;;;;21716:12;:61::i;19066:473::-;-1:-1:-1;;;;;19179:25:0;;19149:4;19179:25;;;:7;:25;;;;;:31;19169:41;;19166:85;;-1:-1:-1;19234:5:0;19227:12;;19166:85;45:20:-1;-1:-1;;19283:75:0;;25:41:-1;19393:12:0;13522:5;19393:25;19380:38;;19377:82;;;19442:5;19435:12;;;;;19377:82;-1:-1:-1;;;;;;;19469:25:0;;;;;;;;:7;:25;;;;;:40;19527:4;;19066:473::o;19813:800::-;20342:4;20338:16;;;20312:44;;20333:4;20312:44;;20306:51;20403:4;20382:44;;20376:51;20456:44;;;;20450:51;19919:7;;20503:4;20446:62;;;;;20542:2;20537:7;;;:18;;;20548:1;:7;;20553:2;20548:7;20537:18;20529:27;;;;;;;;20574:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;20574:31:0;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;20574:31:0;;-1:-1:-1;;20574:31:0;;;19813:800;-1:-1:-1;;;;;;;;19813:800:0:o

Swarm Source

bzzr://4799972ba6ce61a3bd48380a6917b63dfcff5c5db122ea9ca64e20f611e3eea6

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.