More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 42,114 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Execute | 21295117 | 28 days ago | IN | 0 ETH | 0.00066707 | ||||
Execute | 21295111 | 28 days ago | IN | 0 ETH | 0.00068287 | ||||
Execute | 21295110 | 28 days ago | IN | 0 ETH | 0.0006732 | ||||
Execute | 21295108 | 28 days ago | IN | 0 ETH | 0.00090836 | ||||
Execute | 20912884 | 82 days ago | IN | 0 ETH | 0.00181869 | ||||
Execute | 20725508 | 108 days ago | IN | 0 ETH | 0.00038622 | ||||
Execute | 20439369 | 148 days ago | IN | 0 ETH | 0.00052039 | ||||
Execute | 20210787 | 180 days ago | IN | 0 ETH | 0.00093558 | ||||
Execute | 20177625 | 184 days ago | IN | 0 ETH | 0.00139209 | ||||
Execute | 19858598 | 229 days ago | IN | 0 ETH | 0.00079387 | ||||
Execute | 19428456 | 289 days ago | IN | 0 ETH | 0.01461473 | ||||
Execute | 19428284 | 289 days ago | IN | 0 ETH | 0.01559034 | ||||
Execute | 19283786 | 309 days ago | IN | 0 ETH | 0.01469805 | ||||
Execute | 19106381 | 334 days ago | IN | 0 ETH | 0.00330688 | ||||
Execute | 18967239 | 354 days ago | IN | 0 ETH | 0.00350524 | ||||
Execute | 18877299 | 366 days ago | IN | 0 ETH | 0.00938846 | ||||
Execute | 18859632 | 369 days ago | IN | 0 ETH | 0.00396231 | ||||
Execute | 18704161 | 391 days ago | IN | 0 ETH | 0.00641958 | ||||
Execute | 18420626 | 430 days ago | IN | 0 ETH | 0.00971102 | ||||
Execute | 18380515 | 436 days ago | IN | 0 ETH | 0.00165846 | ||||
Execute | 18299600 | 447 days ago | IN | 0 ETH | 0.0015073 | ||||
Execute | 18266458 | 452 days ago | IN | 0 ETH | 0.00175867 | ||||
Execute | 18094206 | 476 days ago | IN | 0 ETH | 0.0037466 | ||||
Execute | 18077823 | 478 days ago | IN | 0 ETH | 0.00494102 | ||||
Execute | 17979668 | 492 days ago | IN | 0 ETH | 0.00882299 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
TransferManager
Compiler Version
v0.5.4+commit.9549d8ff
Contract Source Code (Solidity)
/** *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); function() external payable; } /** * @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 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 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 TransferManager * @dev Module to transfer and approve tokens (ETH or ERC20) or data (contract call) based on a security context (daily limit, whitelist, etc). * This module is the V2 of TokenTransfer. * @author Julien Niset - <[email protected]> */ contract TransferManager is BaseModule, RelayerModule, OnlyOwnerModule, BaseTransfer, LimitManager { bytes32 constant NAME = "TransferManager"; bytes4 private constant ERC721_ISVALIDSIGNATURE_BYTES = bytes4(keccak256("isValidSignature(bytes,bytes)")); bytes4 private constant ERC721_ISVALIDSIGNATURE_BYTES32 = bytes4(keccak256("isValidSignature(bytes32,bytes)")); enum ActionType { Transfer } using SafeMath for uint256; struct TokenManagerConfig { // Mapping between pending action hash and their timestamp mapping (bytes32 => uint256) pendingActions; } // wallet specific storage mapping (address => TokenManagerConfig) internal configs; // The security period uint256 public securityPeriod; // The execution window uint256 public securityWindow; // The Token storage TransferStorage public transferStorage; // The Token price provider TokenPriceProvider public priceProvider; // The previous limit manager needed to migrate the limits LimitManager public oldLimitManager; // *************** Events *************************** // event AddedToWhitelist(address indexed wallet, address indexed target, uint64 whitelistAfter); event RemovedFromWhitelist(address indexed wallet, address indexed target); event PendingTransferCreated(address indexed wallet, bytes32 indexed id, uint256 indexed executeAfter, address token, address to, uint256 amount, bytes data); event PendingTransferExecuted(address indexed wallet, bytes32 indexed id); event PendingTransferCanceled(address indexed wallet, bytes32 indexed id); // *************** Constructor ********************** // constructor( ModuleRegistry _registry, TransferStorage _transferStorage, GuardianStorage _guardianStorage, address _priceProvider, uint256 _securityPeriod, uint256 _securityWindow, uint256 _defaultLimit, LimitManager _oldLimitManager ) BaseModule(_registry, _guardianStorage, NAME) LimitManager(_defaultLimit) public { transferStorage = _transferStorage; priceProvider = TokenPriceProvider(_priceProvider); securityPeriod = _securityPeriod; securityWindow = _securityWindow; oldLimitManager = _oldLimitManager; } /** * @dev Inits the module for a wallet by setting up the isValidSignature (EIP 1271) * static call redirection from the wallet to the module and copying all the parameters * of the daily limit from the previous implementation of the LimitManager module. * @param _wallet The target wallet. */ function init(BaseWallet _wallet) public onlyWallet(_wallet) { // setup static calls _wallet.enableStaticCall(address(this), ERC721_ISVALIDSIGNATURE_BYTES); _wallet.enableStaticCall(address(this), ERC721_ISVALIDSIGNATURE_BYTES32); // setup default limit for new deployment if(address(oldLimitManager) == address(0)) { super.init(_wallet); return; } // get limit from previous LimitManager uint256 current = oldLimitManager.getCurrentLimit(_wallet); (uint256 pending, uint64 changeAfter) = oldLimitManager.getPendingLimit(_wallet); // setup default limit for new wallets if(current == 0 && changeAfter == 0) { super.init(_wallet); return; } // migrate existing limit for existing wallets if(current == pending) { limits[address(_wallet)].limit.current = uint128(current); } else { limits[address(_wallet)].limit = Limit(uint128(current), uint128(pending), changeAfter); } // migrate daily pending if we are within a rolling period (uint256 unspent, uint64 periodEnd) = oldLimitManager.getDailyUnspent(_wallet); // solium-disable-next-line security/no-block-members if(periodEnd > now) { limits[address(_wallet)].dailySpent = DailySpent(uint128(current.sub(unspent)), periodEnd); } } // *************** External/Public Functions ********************* // /** * @dev lets the owner transfer tokens (ETH or ERC20) from a wallet. * @param _wallet The target wallet. * @param _token The address of the token to transfer. * @param _to The destination address * @param _amount The amoutn of token to transfer * @param _data The data for the transaction */ function transferToken( BaseWallet _wallet, address _token, address _to, uint256 _amount, bytes calldata _data ) external onlyWalletOwner(_wallet) onlyWhenUnlocked(_wallet) { if(isWhitelisted(_wallet, _to)) { // transfer to whitelist doTransfer(_wallet, _token, _to, _amount, _data); } else { uint256 etherAmount = (_token == ETH_TOKEN) ? _amount : priceProvider.getEtherValue(_amount, _token); if (checkAndUpdateDailySpent(_wallet, etherAmount)) { // transfer under the limit doTransfer(_wallet, _token, _to, _amount, _data); } else { // transfer above the limit (bytes32 id, uint256 executeAfter) = addPendingAction(ActionType.Transfer, _wallet, _token, _to, _amount, _data); emit PendingTransferCreated(address(_wallet), id, executeAfter, _token, _to, _amount, _data); } } } /** * @dev lets the owner approve an allowance of ERC20 tokens for a spender (dApp). * @param _wallet The target wallet. * @param _token The address of the token to transfer. * @param _spender The address of the spender * @param _amount The amount of tokens to approve */ function approveToken( BaseWallet _wallet, address _token, address _spender, uint256 _amount ) external onlyWalletOwner(_wallet) onlyWhenUnlocked(_wallet) { if(isWhitelisted(_wallet, _spender)) { // approve to whitelist doApproveToken(_wallet, _token, _spender, _amount); } else { // get current alowance uint256 currentAllowance = ERC20(_token).allowance(address(_wallet), _spender); if(_amount <= currentAllowance) { // approve if we reduce the allowance doApproveToken(_wallet, _token, _spender, _amount); } else { // check if delta is under the limit uint delta = _amount - currentAllowance; uint256 deltaInEth = priceProvider.getEtherValue(delta, _token); require(checkAndUpdateDailySpent(_wallet, deltaInEth), "TM: Approve above daily limit"); // approve if under the limit doApproveToken(_wallet, _token, _spender, _amount); } } } /** * @dev lets the owner call a contract. * @param _wallet The target wallet. * @param _contract The address of the contract. * @param _value The amount of ETH to transfer as part of call * @param _data The encoded method data */ function callContract( BaseWallet _wallet, address _contract, uint256 _value, bytes calldata _data ) external onlyWalletOwner(_wallet) onlyWhenUnlocked(_wallet) { // Make sure we don't call a module, the wallet itself, or a supported ERC20 authoriseContractCall(_wallet, _contract); if(isWhitelisted(_wallet, _contract)) { // call to whitelist doCallContract(_wallet, _contract, _value, _data); } else { require(checkAndUpdateDailySpent(_wallet, _value), "TM: Call contract above daily limit"); // call under the limit doCallContract(_wallet, _contract, _value, _data); } } /** * @dev lets the owner do an ERC20 approve followed by a call to a contract. * We assume that the contract will pull the tokens and does not require ETH. * @param _wallet The target wallet. * @param _token The token to approve. * @param _contract The address of the contract. * @param _amount The amount of ERC20 tokens to approve. * @param _data The encoded method data */ function approveTokenAndCallContract( BaseWallet _wallet, address _token, address _contract, uint256 _amount, bytes calldata _data ) external onlyWalletOwner(_wallet) onlyWhenUnlocked(_wallet) { // Make sure we don't call a module, the wallet itself, or a supported ERC20 authoriseContractCall(_wallet, _contract); if(isWhitelisted(_wallet, _contract)) { doApproveToken(_wallet, _token, _contract, _amount); doCallContract(_wallet, _contract, 0, _data); } else { // get current alowance uint256 currentAllowance = ERC20(_token).allowance(address(_wallet), _contract); if(_amount <= currentAllowance) { // no need to approve more doCallContract(_wallet, _contract, 0, _data); } else { // check if delta is under the limit uint delta = _amount - currentAllowance; uint256 deltaInEth = priceProvider.getEtherValue(delta, _token); require(checkAndUpdateDailySpent(_wallet, deltaInEth), "TM: Approve above daily limit"); // approve if under the limit doApproveToken(_wallet, _token, _contract, _amount); doCallContract(_wallet, _contract, 0, _data); } } } /** * @dev Adds an address to the whitelist of a wallet. * @param _wallet The target wallet. * @param _target The address to add. */ function addToWhitelist( BaseWallet _wallet, address _target ) external onlyWalletOwner(_wallet) onlyWhenUnlocked(_wallet) { require(!isWhitelisted(_wallet, _target), "TT: target already whitelisted"); // solium-disable-next-line security/no-block-members uint256 whitelistAfter = now.add(securityPeriod); transferStorage.setWhitelist(_wallet, _target, whitelistAfter); emit AddedToWhitelist(address(_wallet), _target, uint64(whitelistAfter)); } /** * @dev Removes an address from the whitelist of a wallet. * @param _wallet The target wallet. * @param _target The address to remove. */ function removeFromWhitelist( BaseWallet _wallet, address _target ) external onlyWalletOwner(_wallet) onlyWhenUnlocked(_wallet) { require(isWhitelisted(_wallet, _target), "TT: target not whitelisted"); transferStorage.setWhitelist(_wallet, _target, 0); emit RemovedFromWhitelist(address(_wallet), _target); } /** * @dev Executes a pending transfer for a wallet. * The method can be called by anyone to enable orchestration. * @param _wallet The target wallet. * @param _token The token of the pending transfer. * @param _to The destination address of the pending transfer. * @param _amount The amount of token to transfer of the pending transfer. * @param _data The data associated to the pending transfer. * @param _block The block at which the pending transfer was created. */ function executePendingTransfer( BaseWallet _wallet, address _token, address _to, uint _amount, bytes calldata _data, uint _block ) external onlyWhenUnlocked(_wallet) { bytes32 id = keccak256(abi.encodePacked(ActionType.Transfer, _token, _to, _amount, _data, _block)); uint executeAfter = configs[address(_wallet)].pendingActions[id]; require(executeAfter > 0, "TT: unknown pending transfer"); uint executeBefore = executeAfter.add(securityWindow); // solium-disable-next-line security/no-block-members require(executeAfter <= now && now <= executeBefore, "TT: transfer outside of the execution window"); delete configs[address(_wallet)].pendingActions[id]; doTransfer(_wallet, _token, _to, _amount, _data); emit PendingTransferExecuted(address(_wallet), id); } function cancelPendingTransfer( BaseWallet _wallet, bytes32 _id ) external onlyWalletOwner(_wallet) onlyWhenUnlocked(_wallet) { require(configs[address(_wallet)].pendingActions[_id] > 0, "TT: unknown pending action"); delete configs[address(_wallet)].pendingActions[_id]; emit PendingTransferCanceled(address(_wallet), _id); } /** * @dev Lets the owner of a wallet change its daily limit. * The limit is expressed in ETH. Changes to the limit take 24 hours. * @param _wallet The target wallet. * @param _newLimit The new limit. */ function changeLimit(BaseWallet _wallet, uint256 _newLimit) external onlyWalletOwner(_wallet) onlyWhenUnlocked(_wallet) { changeLimit(_wallet, _newLimit, securityPeriod); } /** * @dev Convenience method to disable the limit * The limit is disabled by setting it to an arbitrary large value. * @param _wallet The target wallet. */ function disableLimit(BaseWallet _wallet) external onlyWalletOwner(_wallet) onlyWhenUnlocked(_wallet) { disableLimit(_wallet, securityPeriod); } /** * @dev Checks if an address is whitelisted for a wallet. * @param _wallet The target wallet. * @param _target The address. * @return true if the address is whitelisted. */ function isWhitelisted(BaseWallet _wallet, address _target) public view returns (bool _isWhitelisted) { uint whitelistAfter = transferStorage.getWhitelist(_wallet, _target); // solium-disable-next-line security/no-block-members return whitelistAfter > 0 && whitelistAfter < now; } /** * @dev Gets the info of a pending transfer for a wallet. * @param _wallet The target wallet. * @param _id The pending transfer ID. * @return the epoch time at which the pending transfer can be executed. */ function getPendingTransfer(BaseWallet _wallet, bytes32 _id) external view returns (uint64 _executeAfter) { _executeAfter = uint64(configs[address(_wallet)].pendingActions[_id]); } /** * @dev Implementation of EIP 1271. * Should return whether the signature provided is valid for the provided data. * @param _data Arbitrary length data signed on the behalf of address(this) * @param _signature Signature byte array associated with _data */ function isValidSignature(bytes calldata _data, bytes calldata _signature) external view returns (bytes4) { bytes32 msgHash = keccak256(abi.encodePacked(_data)); isValidSignature(msgHash, _signature); return ERC721_ISVALIDSIGNATURE_BYTES; } /** * @dev Implementation of EIP 1271. * Should return whether the signature provided is valid for the provided data. * @param _msgHash Hash of a message signed on the behalf of address(this) * @param _signature Signature byte array associated with _msgHash */ function isValidSignature(bytes32 _msgHash, bytes memory _signature) public view returns (bytes4) { require(_signature.length == 65, "TM: invalid signature length"); address signer = recoverSigner(_msgHash, _signature, 0); require(isOwner(BaseWallet(msg.sender), signer), "TM: Invalid signer"); return ERC721_ISVALIDSIGNATURE_BYTES32; } // *************** Internal Functions ********************* // /** * @dev Creates a new pending action for a wallet. * @param _action The target action. * @param _wallet The target wallet. * @param _token The target token for the action. * @param _to The recipient of the action. * @param _amount The amount of token associated to the action. * @param _data The data associated to the action. * @return the identifier for the new pending action and the time when the action can be executed */ function addPendingAction( ActionType _action, BaseWallet _wallet, address _token, address _to, uint _amount, bytes memory _data ) internal returns (bytes32 id, uint256 executeAfter) { id = keccak256(abi.encodePacked(_action, _token, _to, _amount, _data, block.number)); require(configs[address(_wallet)].pendingActions[id] == 0, "TM: duplicate pending action"); // solium-disable-next-line security/no-block-members executeAfter = now.add(securityPeriod); configs[address(_wallet)].pendingActions[id] = executeAfter; } /** * @dev Make sure a contract call is not trying to call a module, the wallet itself, or a supported ERC20. * @param _wallet The target wallet. * @param _contract The address of the contract. */ function authoriseContractCall(BaseWallet _wallet, address _contract) internal view { require( _contract != address(_wallet) && // not the wallet itself !_wallet.authorised(_contract) && // not an authorised module (priceProvider.cachedPrices(_contract) == 0 || isLimitDisabled(_wallet)), // not an ERC20 listed in the provider (or limit disabled) "TM: Forbidden contract"); } // *************** Implementation of RelayerModule methods ********************* // // Overrides refund to add the refund in the daily limit. function refund(BaseWallet _wallet, uint _gasUsed, uint _gasPrice, uint _gasLimit, uint _signatures, address _relayer) internal { // 21000 (transaction) + 7620 (execution of refund) + 7324 (execution of updateDailySpent) + 672 to log the event + _gasUsed uint256 amount = 36616 + _gasUsed; if(_gasPrice > 0 && _signatures > 0 && amount <= _gasLimit) { if(_gasPrice > tx.gasprice) { amount = amount * tx.gasprice; } else { amount = amount * _gasPrice; } checkAndUpdateDailySpent(_wallet, amount); invokeWallet(address(_wallet), _relayer, amount, EMPTY_BYTES); } } // Overrides verifyRefund to add the refund in the daily limit. function verifyRefund(BaseWallet _wallet, uint _gasUsed, uint _gasPrice, uint _signatures) internal view returns (bool) { if(_gasPrice > 0 && _signatures > 0 && ( address(_wallet).balance < _gasUsed * _gasPrice || isWithinDailyLimit(_wallet, getCurrentLimit(_wallet), _gasUsed * _gasPrice) == false || _wallet.authorised(address(this)) == false )) { return false; } return true; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[],"name":"securityWindow","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_token","type":"address"},{"name":"_contract","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"approveTokenAndCallContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_token","type":"address"},{"name":"_spender","type":"address"},{"name":"_amount","type":"uint256"}],"name":"approveToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_msgHash","type":"bytes32"},{"name":"_signature","type":"bytes"}],"name":"isValidSignature","outputs":[{"name":"","type":"bytes4"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"}],"name":"init","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_data","type":"bytes"},{"name":"_signature","type":"bytes"}],"name":"isValidSignature","outputs":[{"name":"","type":"bytes4"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_wallet","type":"address"}],"name":"getNonce","outputs":[{"name":"nonce","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_token","type":"address"},{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"transferToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_wallet","type":"address"}],"name":"getCurrentLimit","outputs":[{"name":"_currentLimit","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_target","type":"address"}],"name":"addToWhitelist","outputs":[],"payable":false,"stateMutability":"nonpayable","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":"_token","type":"address"},{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_data","type":"bytes"},{"name":"_block","type":"uint256"}],"name":"executePendingTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_wallet","type":"address"}],"name":"getDailyUnspent","outputs":[{"name":"_unspent","type":"uint256"},{"name":"_periodEnd","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"securityPeriod","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"oldLimitManager","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"transferStorage","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"}],"name":"recoverToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_wallet","type":"address"}],"name":"getPendingLimit","outputs":[{"name":"_pendingLimit","type":"uint256"},{"name":"_changeAfter","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"}],"name":"disableLimit","outputs":[],"payable":false,"stateMutability":"nonpayable","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":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_newLimit","type":"uint256"}],"name":"changeLimit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_id","type":"bytes32"}],"name":"cancelPendingTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_wallet","type":"address"},{"name":"_target","type":"address"}],"name":"isWhitelisted","outputs":[{"name":"_isWhitelisted","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"priceProvider","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":"isOnlyOwnerModule","outputs":[{"name":"","type":"bytes4"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"_wallet","type":"address"},{"name":"_id","type":"bytes32"}],"name":"getPendingTransfer","outputs":[{"name":"_executeAfter","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"defaultLimit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_target","type":"address"}],"name":"removeFromWhitelist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_wallet","type":"address"}],"name":"isLimitDisabled","outputs":[{"name":"_limitDisabled","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"},{"name":"_contract","type":"address"},{"name":"_value","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"callContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_registry","type":"address"},{"name":"_transferStorage","type":"address"},{"name":"_guardianStorage","type":"address"},{"name":"_priceProvider","type":"address"},{"name":"_securityPeriod","type":"uint256"},{"name":"_securityWindow","type":"uint256"},{"name":"_defaultLimit","type":"uint256"},{"name":"_oldLimitManager","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"wallet","type":"address"},{"indexed":true,"name":"target","type":"address"},{"indexed":false,"name":"whitelistAfter","type":"uint64"}],"name":"AddedToWhitelist","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"wallet","type":"address"},{"indexed":true,"name":"target","type":"address"}],"name":"RemovedFromWhitelist","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"wallet","type":"address"},{"indexed":true,"name":"id","type":"bytes32"},{"indexed":true,"name":"executeAfter","type":"uint256"},{"indexed":false,"name":"token","type":"address"},{"indexed":false,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"data","type":"bytes"}],"name":"PendingTransferCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"wallet","type":"address"},{"indexed":true,"name":"id","type":"bytes32"}],"name":"PendingTransferExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"wallet","type":"address"},{"indexed":true,"name":"id","type":"bytes32"}],"name":"PendingTransferCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"wallet","type":"address"},{"indexed":true,"name":"newLimit","type":"uint256"},{"indexed":true,"name":"startAfter","type":"uint64"}],"name":"LimitChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"wallet","type":"address"},{"indexed":true,"name":"token","type":"address"},{"indexed":true,"name":"amount","type":"uint256"},{"indexed":false,"name":"to","type":"address"},{"indexed":false,"name":"data","type":"bytes"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"wallet","type":"address"},{"indexed":true,"name":"token","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"spender","type":"address"}],"name":"Approved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"wallet","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"data","type":"bytes"}],"name":"CalledContract","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"}]
Contract Creation Code
608060405234801561001057600080fd5b506040516101008062004aea833981018060405261010081101561003357600080fd5b5080516020808301516040808501516060860151608087015160a088015160c089015160e09099015160008054600160a060020a03808c16600160a060020a031992831617909255600180549288169290911691909117905585517f5472616e736665724d616e6167657200000000000000000000000000000000008082529651999a979995989497939692959394919385938c938b9391927f3019c8fc80239e3dff8f781212ae2004839c2cb61d6c70acd279ac65392145df9281900390910190a150505060045560088054600160a060020a03988916600160a060020a031991821617909155600980549689169682169690961790955560069390935550600755600a805491909416911617909155505061499480620001566000396000f3fe608060405234801561001057600080fd5b5060043610610201576000357c010000000000000000000000000000000000000000000000000000000090048063961bfeee1161012c578063b888879e116100bf578063e26b013b1161008e578063e26b013b1461097b578063f8d3277d14610983578063f9f6499e146109b1578063fd6ac309146109d757610201565b8063b888879e146108fc578063c9b5ef8e14610904578063d490da4d1461092a578063e1ee38ec1461093257610201565b8063aacaaf88116100fb578063aacaaf8814610786578063b20f3f3714610876578063b377a9d5146108a2578063b6b35272146108ce57610201565b8063961bfeee1461070c5780639be65a6014610714578063a0aec1051461073a578063a3411c0a1461076057610201565b80632df546f4116101a45780635ed4bf81116101735780635ed4bf81146106005780637cb8f8ba146106985780637cc0d906146106e057806395813db4146106e857610201565b80632df546f4146104e657806343cd5c7e1461057e57806357518243146105a45780635a1db8c4146105d257610201565b80631626ba7e116101e05780631626ba7e146102f657806319ab453c146103d857806320c13b0b146103fe5780632d0335ab146104c057610201565b80626fda351461020657806309d22c8e1461022057806312ef080d146102ba575b600080fd5b61020e610a67565b60408051918252519081900360200190f35b6102b8600480360360a081101561023657600080fd5b600160a060020a03823581169260208101358216926040820135909216916060820135919081019060a08101608082013564010000000081111561027957600080fd5b82018360208201111561028b57600080fd5b803590602001918460018302840111640100000000831117156102ad57600080fd5b509092509050610a6d565b005b6102b8600480360360808110156102d057600080fd5b50600160a060020a03813581169160208101358216916040820135169060600135610e5f565b6103a36004803603604081101561030c57600080fd5b8135919081019060408101602082013564010000000081111561032e57600080fd5b82018360208201111561034057600080fd5b8035906020019184600183028401116401000000008311171561036257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611185945050505050565b604080517fffffffff000000000000000000000000000000000000000000000000000000009092168252519081900360200190f35b6102b8600480360360208110156103ee57600080fd5b5035600160a060020a031661128c565b6103a36004803603604081101561041457600080fd5b81019060208101813564010000000081111561042f57600080fd5b82018360208201111561044157600080fd5b8035906020019184600183028401116401000000008311171561046357600080fd5b91939092909160208101903564010000000081111561048157600080fd5b82018360208201111561049357600080fd5b803590602001918460018302840111640100000000831117156104b557600080fd5b509092509050611888565b61020e600480360360208110156104d657600080fd5b5035600160a060020a031661193c565b6102b8600480360360a08110156104fc57600080fd5b600160a060020a03823581169260208101358216926040820135909216916060820135919081019060a08101608082013564010000000081111561053f57600080fd5b82018360208201111561055157600080fd5b8035906020019184600183028401116401000000008311171561057357600080fd5b509092509050611957565b61020e6004803603602081101561059457600080fd5b5035600160a060020a0316611d02565b6102b8600480360360408110156105ba57600080fd5b50600160a060020a0381358116916020013516611d79565b6102b8600480360360408110156105e857600080fd5b50600160a060020a0381358116916020013516612010565b6102b8600480360360c081101561061657600080fd5b600160a060020a03823581169260208101358216926040820135909216916060820135919081019060a08101608082013564010000000081111561065957600080fd5b82018360208201111561066b57600080fd5b8035906020019184600183028401116401000000008311171561068d57600080fd5b9193509150356121cb565b6106be600480360360208110156106ae57600080fd5b5035600160a060020a0316612530565b6040805192835267ffffffffffffffff90911660208301528051918290030190f35b61020e6125ef565b6106f06125f5565b60408051600160a060020a039092168252519081900360200190f35b6106f0612604565b6102b86004803603602081101561072a57600080fd5b5035600160a060020a0316612613565b6106be6004803603602081101561075057600080fd5b5035600160a060020a0316612746565b6102b86004803603602081101561077657600080fd5b5035600160a060020a03166127c2565b610862600480360360c081101561079c57600080fd5b600160a060020a0382351691908101906040810160208201356401000000008111156107c757600080fd5b8201836020820111156107d957600080fd5b803590602001918460018302840111640100000000831117156107fb57600080fd5b9193909282359260408101906020013564010000000081111561081d57600080fd5b82018360208201111561082f57600080fd5b8035906020019184600183028401116401000000008311171561085157600080fd5b919350915080359060200135612911565b604080519115158252519081900360200190f35b6102b86004803603604081101561088c57600080fd5b50600160a060020a038135169060200135612bef565b6102b8600480360360408110156108b857600080fd5b50600160a060020a038135169060200135612d3a565b610862600480360360408110156108e457600080fd5b50600160a060020a0381358116916020013516612f45565b6106f0612ff7565b61020e6004803603602081101561091a57600080fd5b5035600160a060020a0316613006565b6103a3613018565b61095e6004803603604081101561094857600080fd5b50600160a060020a03813516906020013561303c565b6040805167ffffffffffffffff9092168252519081900360200190f35b61020e613063565b6102b86004803603604081101561099957600080fd5b50600160a060020a0381358116916020013516613069565b610862600480360360208110156109c757600080fd5b5035600160a060020a03166132d1565b6102b8600480360360808110156109ed57600080fd5b600160a060020a03823581169260208101359091169160408201359190810190608081016060820135640100000000811115610a2857600080fd5b820183602082011115610a3a57600080fd5b80359060200191846001830284011164010000000083111715610a5c57600080fd5b5090925090506132f6565b60075481565b8533301480610a815750610a81813361351b565b1515610ac15760405160e560020a62461bcd0281526004018080602001828103825260238152602001806149466023913960400191505060405180910390fd5b600154604080517f4a4fbeec000000000000000000000000000000000000000000000000000000008152600160a060020a03808b16600483015291518a939290921691634a4fbeec91602480820192602092909190829003018186803b158015610b2a57600080fd5b505afa158015610b3e573d6000803e3d6000fd5b505050506040513d6020811015610b5457600080fd5b505115610bab576040805160e560020a62461bcd02815260206004820152601b60248201527f424d3a2077616c6c6574206d75737420626520756e6c6f636b65640000000000604482015290519081900360640190fd5b610bb588876135b9565b610bbf8887612f45565b15610c1857610bd088888888613775565b610c138887600087878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061384992505050565b610e55565b604080517fdd62ed3e000000000000000000000000000000000000000000000000000000008152600160a060020a038a81166004830152888116602483015291516000928a169163dd62ed3e916044808301926020929190829003018186803b158015610c8457600080fd5b505afa158015610c98573d6000803e3d6000fd5b505050506040513d6020811015610cae57600080fd5b50519050808611610d0157610cfc8988600088888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061384992505050565b610e53565b600954604080517fce55c85200000000000000000000000000000000000000000000000000000000815283890360048201819052600160a060020a038c8116602484015292519093600093169163ce55c852916044808301926020929190829003018186803b158015610d7357600080fd5b505afa158015610d87573d6000803e3d6000fd5b505050506040513d6020811015610d9d57600080fd5b50519050610dab8b82613911565b1515610e01576040805160e560020a62461bcd02815260206004820152601d60248201527f544d3a20417070726f76652061626f7665206461696c79206c696d6974000000604482015290519081900360640190fd5b610e0d8b8b8b8b613775565b610e508b8a60008a8a8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061384992505050565b50505b505b5050505050505050565b8333301480610e735750610e73813361351b565b1515610eb35760405160e560020a62461bcd0281526004018080602001828103825260238152602001806149466023913960400191505060405180910390fd5b600154604080517f4a4fbeec000000000000000000000000000000000000000000000000000000008152600160a060020a038089166004830152915188939290921691634a4fbeec91602480820192602092909190829003018186803b158015610f1c57600080fd5b505afa158015610f30573d6000803e3d6000fd5b505050506040513d6020811015610f4657600080fd5b505115610f9d576040805160e560020a62461bcd02815260206004820152601b60248201527f424d3a2077616c6c6574206d75737420626520756e6c6f636b65640000000000604482015290519081900360640190fd5b610fa78685612f45565b15610fbd57610fb886868686613775565b61117d565b604080517fdd62ed3e000000000000000000000000000000000000000000000000000000008152600160a060020a0388811660048301528681166024830152915160009288169163dd62ed3e916044808301926020929190829003018186803b15801561102957600080fd5b505afa15801561103d573d6000803e3d6000fd5b505050506040513d602081101561105357600080fd5b5051905080841161106f5761106a87878787613775565b61117b565b600954604080517fce55c85200000000000000000000000000000000000000000000000000000000815283870360048201819052600160a060020a038a8116602484015292519093600093169163ce55c852916044808301926020929190829003018186803b1580156110e157600080fd5b505afa1580156110f5573d6000803e3d6000fd5b505050506040513d602081101561110b57600080fd5b505190506111198982613911565b151561116f576040805160e560020a62461bcd02815260206004820152601d60248201527f544d3a20417070726f76652061626f7665206461696c79206c696d6974000000604482015290519081900360640190fd5b610e5389898989613775565b505b505050505050565b80516000906041146111e1576040805160e560020a62461bcd02815260206004820152601c60248201527f544d3a20696e76616c6964207369676e6174757265206c656e67746800000000604482015290519081900360640190fd5b60006111ef848460006139c8565b90506111fb338261351b565b1515611251576040805160e560020a62461bcd02815260206004820152601260248201527f544d3a20496e76616c6964207369676e65720000000000000000000000000000604482015290519081900360640190fd5b5050604080517f697356616c69645369676e617475726528627974657333322c627974657329008152905190819003601f0190205b92915050565b8033600160a060020a038216146112ed576040805160e560020a62461bcd02815260206004820152601960248201527f424d3a2063616c6c6572206d7573742062652077616c6c657400000000000000604482015290519081900360640190fd5b604080517f697356616c69645369676e61747572652862797465732c6279746573290000008152815190819003601d0181207f13da30b20000000000000000000000000000000000000000000000000000000082523060048301527fffffffff000000000000000000000000000000000000000000000000000000001660248201529051600160a060020a038416916313da30b291604480830192600092919082900301818387803b1580156113a257600080fd5b505af11580156113b6573d6000803e3d6000fd5b5050604080517f697356616c69645369676e617475726528627974657333322c627974657329008152815190819003601f0181207f13da30b20000000000000000000000000000000000000000000000000000000082523060048301527fffffffff000000000000000000000000000000000000000000000000000000001660248201529051600160a060020a03861693506313da30b29250604480830192600092919082900301818387803b15801561146f57600080fd5b505af1158015611483573d6000803e3d6000fd5b5050600a54600160a060020a0316151591506114a99050576114a482613a73565b611884565b600a54604080517f43cd5c7e000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152915160009392909216916343cd5c7e91602480820192602092909190829003018186803b15801561151357600080fd5b505afa158015611527573d6000803e3d6000fd5b505050506040513d602081101561153d57600080fd5b5051600a54604080517fa0aec105000000000000000000000000000000000000000000000000000000008152600160a060020a03878116600483015282519495506000948594919091169263a0aec1059260248082019391829003018186803b1580156115a957600080fd5b505afa1580156115bd573d6000803e3d6000fd5b505050506040513d60408110156115d357600080fd5b5080516020909101519092509050821580156115f7575067ffffffffffffffff8116155b1561160d5761160585613a73565b505050611884565b8183141561165d57600160a060020a038516600090815260036020526040902080546fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff851617905561170d565b604080516060810182526fffffffffffffffffffffffffffffffff8086168252848116602080840191825267ffffffffffffffff808716858701908152600160a060020a038c1660009081526003909352959091209351845492518416700100000000000000000000000000000000029084166fffffffffffffffffffffffffffffffff19909316929092179092161782559151600190910180549190921667ffffffffffffffff199091161790555b600a54604080517f7cb8f8ba000000000000000000000000000000000000000000000000000000008152600160a060020a03888116600483015282516000948594921692637cb8f8ba926024808301939192829003018186803b15801561177357600080fd5b505afa158015611787573d6000803e3d6000fd5b505050506040513d604081101561179d57600080fd5b50805160209091015190925090504267ffffffffffffffff8216111561117b5760408051808201909152806117d8878563ffffffff613b5116565b6fffffffffffffffffffffffffffffffff908116825267ffffffffffffffff938416602092830152600160a060020a038a166000908152600383526040902083516002909101805494909301516fffffffffffffffffffffffffffffffff199094169116177fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000009290931691909102919091179055505050505b5050565b60008085856040516020018083838082843780830192505050925050506040516020818303038152906040528051906020012090506118fd8185858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061118592505050565b5050604080517f697356616c69645369676e61747572652862797465732c6279746573290000008152905190819003601d01902090505b949350505050565b600160a060020a031660009081526002602052604090205490565b853330148061196b575061196b813361351b565b15156119ab5760405160e560020a62461bcd0281526004018080602001828103825260238152602001806149466023913960400191505060405180910390fd5b600154604080517f4a4fbeec000000000000000000000000000000000000000000000000000000008152600160a060020a03808b16600483015291518a939290921691634a4fbeec91602480820192602092909190829003018186803b158015611a1457600080fd5b505afa158015611a28573d6000803e3d6000fd5b505050506040513d6020811015611a3e57600080fd5b505115611a95576040805160e560020a62461bcd02815260206004820152601b60248201527f424d3a2077616c6c6574206d75737420626520756e6c6f636b65640000000000604482015290519081900360640190fd5b611a9f8887612f45565b15611ae757610c138888888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613b6692505050565b6000600160a060020a03881673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14611bab57600954604080517fce55c85200000000000000000000000000000000000000000000000000000000815260048101899052600160a060020a038b811660248301529151919092169163ce55c852916044808301926020929190829003018186803b158015611b7a57600080fd5b505afa158015611b8e573d6000803e3d6000fd5b505050506040513d6020811015611ba457600080fd5b5051611bad565b855b9050611bb98982613911565b15611c0157610cfc8989898989898080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613b6692505050565b600080611c4960008c8c8c8c8c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613d0192505050565b9150915080828c600160a060020a03167fc63146cfd39cd6097f6e314e8595c4554faf95175b45c6215517903c12e765d98d8d8d8d8d6040518086600160a060020a0316600160a060020a0316815260200185600160a060020a0316600160a060020a03168152602001848152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039850909650505050505050a45050505050505050505050565b600160a060020a038116600090815260036020526040812080546001820154611d60916fffffffffffffffffffffffffffffffff80821692700100000000000000000000000000000000909204169067ffffffffffffffff16613ee7565b6fffffffffffffffffffffffffffffffff169392505050565b8133301480611d8d5750611d8d813361351b565b1515611dcd5760405160e560020a62461bcd0281526004018080602001828103825260238152602001806149466023913960400191505060405180910390fd5b600154604080517f4a4fbeec000000000000000000000000000000000000000000000000000000008152600160a060020a038087166004830152915186939290921691634a4fbeec91602480820192602092909190829003018186803b158015611e3657600080fd5b505afa158015611e4a573d6000803e3d6000fd5b505050506040513d6020811015611e6057600080fd5b505115611eb7576040805160e560020a62461bcd02815260206004820152601b60248201527f424d3a2077616c6c6574206d75737420626520756e6c6f636b65640000000000604482015290519081900360640190fd5b611ec18484612f45565b15611f16576040805160e560020a62461bcd02815260206004820152601e60248201527f54543a2074617267657420616c72656164792077686974656c69737465640000604482015290519081900360640190fd5b6000611f2d60065442613f1f90919063ffffffff16565b600854604080517f80bfbe68000000000000000000000000000000000000000000000000000000008152600160a060020a03898116600483015288811660248301526044820185905291519394509116916380bfbe689160648082019260009290919082900301818387803b158015611fa557600080fd5b505af1158015611fb9573d6000803e3d6000fd5b50506040805167ffffffffffffffff851681529051600160a060020a038089169450891692507f1f57f9641d3e8733ed672fef5ac85464bd7215ef2f21e83428e8408248b13dcd9181900360200190a35050505050565b81333014806120245750612024813361351b565b15156120645760405160e560020a62461bcd0281526004018080602001828103825260238152602001806149466023913960400191505060405180910390fd5b600054604080517f0bcd4ebb000000000000000000000000000000000000000000000000000000008152600160a060020a03858116600483015291519190921691630bcd4ebb916024808301926020929190829003018186803b1580156120ca57600080fd5b505afa1580156120de573d6000803e3d6000fd5b505050506040513d60208110156120f457600080fd5b5051151561214c576040805160e560020a62461bcd02815260206004820152601c60248201527f424d3a206d6f64756c65206973206e6f74207265676973746572656400000000604482015290519081900360640190fd5b604080517f1f17732d000000000000000000000000000000000000000000000000000000008152600160a060020a03848116600483015260016024830152915191851691631f17732d9160448082019260009290919082900301818387803b1580156121b757600080fd5b505af115801561117b573d6000803e3d6000fd5b600154604080517f4a4fbeec000000000000000000000000000000000000000000000000000000008152600160a060020a03808b16600483015291518a939290921691634a4fbeec91602480820192602092909190829003018186803b15801561223457600080fd5b505afa158015612248573d6000803e3d6000fd5b505050506040513d602081101561225e57600080fd5b5051156122b5576040805160e560020a62461bcd02815260206004820152601b60248201527f424d3a2077616c6c6574206d75737420626520756e6c6f636b65640000000000604482015290519081900360640190fd5b600080888888888888604051602001808860008111156122d157fe5b60ff167f010000000000000000000000000000000000000000000000000000000000000002815260010187600160a060020a0316600160a060020a03166c0100000000000000000000000002815260140186600160a060020a0316600160a060020a03166c01000000000000000000000000028152601401858152602001848480828437808301925050508281526020019750505050505050506040516020818303038152906040528051906020012090506000600560008b600160a060020a0316600160a060020a03168152602001908152602001600020600001600083815260200190815260200160002054905060008111151561241b576040805160e560020a62461bcd02815260206004820152601c60248201527f54543a20756e6b6e6f776e2070656e64696e67207472616e7366657200000000604482015290519081900360640190fd5b600061243260075483613f1f90919063ffffffff16565b90504282111580156124445750804211155b15156124845760405160e560020a62461bcd02815260040180806020018281038252602c81526020018061491a602c913960400191505060405180910390fd5b600160a060020a038b1660009081526005602090815260408083208684528252808320929092558151601f89018290048202810182019092528782526124ed918d918d918d918d91908d908d9081908401838280828437600092019190915250613b6692505050565b6040518390600160a060020a038d16907f53d984c4cd3917405bdcc3baabad7c1269dd3baf7c2c53ca571d8d7de9629bc990600090a35050505050505050505050565b600080600061253e84611d02565b600160a060020a0385166000908152600360205260409020600201805491925090700100000000000000000000000000000000900467ffffffffffffffff164211156125945781935042620151800192506125e8565b805467ffffffffffffffff70010000000000000000000000000000000082041693506fffffffffffffffffffffffffffffffff168211156125e85780546fffffffffffffffffffffffffffffffff16820393505b5050915091565b60065481565b600a54600160a060020a031681565b600854600160a060020a031681565b604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051600091600160a060020a038416916370a0823191602480820192602092909190829003018186803b15801561267657600080fd5b505afa15801561268a573d6000803e3d6000fd5b505050506040513d60208110156126a057600080fd5b505160008054604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201526024810185905290519394509085169263a9059cbb92604480840193602093929083900390910190829087803b15801561271657600080fd5b505af115801561272a573d6000803e3d6000fd5b505050506040513d602081101561274057600080fd5b50505050565b600160a060020a0381166000908152600360205260408120600181015482919067ffffffffffffffff16421061277e576000806127b8565b805460018201547001000000000000000000000000000000009091046fffffffffffffffffffffffffffffffff169067ffffffffffffffff165b9250925050915091565b80333014806127d657506127d6813361351b565b15156128165760405160e560020a62461bcd0281526004018080602001828103825260238152602001806149466023913960400191505060405180910390fd5b600154604080517f4a4fbeec000000000000000000000000000000000000000000000000000000008152600160a060020a038086166004830152915185939290921691634a4fbeec91602480820192602092909190829003018186803b15801561287f57600080fd5b505afa158015612893573d6000803e3d6000fd5b505050506040513d60208110156128a957600080fd5b505115612900576040805160e560020a62461bcd02815260206004820152601b60248201527f424d3a2077616c6c6574206d75737420626520756e6c6f636b65640000000000604482015290519081900360640190fd5b61290c83600654613f31565b505050565b6000805a90506000612961308c60008d8d8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508f92508c91508b9050613f4c565b905061296e8b898361408f565b15156129c4576040805160e560020a62461bcd02815260206004820152601560248201527f524d3a204475706c696361746520726571756573740000000000000000000000604482015290519081900360640190fd5b612a048b8b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061409b92505050565b1515612a445760405160e560020a62461bcd02815260040180806020018281038252604a8152602001806148ad604a913960600191505060405180910390fd5b6000612a868c8c8c8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061410f92505050565b905060418102871415612b9e57612a9f8c868884614117565b15612b9e57801580612b225750612b228c8c8c8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8f018190048102820181019092528d815288935091508d908d908190840183828082843760009201919091525061420692505050565b15612b9e5730600160a060020a03168b8b604051808383808284376040519201945060009350909150508083038183865af19150503d8060008114612b83576040519150601f19603f3d011682016040523d82523d6000602084013e612b88565b606091505b505080945050612b9e8c5a85038888853361422b565b60408051838152905185151591600160a060020a038f16917f6bb0b384ce772133df63560651bc8c727c53306cec1d51e2cbf8ea35fb8f2ec19181900360200190a350505098975050505050505050565b8133301480612c035750612c03813361351b565b1515612c435760405160e560020a62461bcd0281526004018080602001828103825260238152602001806149466023913960400191505060405180910390fd5b600154604080517f4a4fbeec000000000000000000000000000000000000000000000000000000008152600160a060020a038087166004830152915186939290921691634a4fbeec91602480820192602092909190829003018186803b158015612cac57600080fd5b505afa158015612cc0573d6000803e3d6000fd5b505050506040513d6020811015612cd657600080fd5b505115612d2d576040805160e560020a62461bcd02815260206004820152601b60248201527f424d3a2077616c6c6574206d75737420626520756e6c6f636b65640000000000604482015290519081900360640190fd5b612740848460065461428a565b8133301480612d4e5750612d4e813361351b565b1515612d8e5760405160e560020a62461bcd0281526004018080602001828103825260238152602001806149466023913960400191505060405180910390fd5b600154604080517f4a4fbeec000000000000000000000000000000000000000000000000000000008152600160a060020a038087166004830152915186939290921691634a4fbeec91602480820192602092909190829003018186803b158015612df757600080fd5b505afa158015612e0b573d6000803e3d6000fd5b505050506040513d6020811015612e2157600080fd5b505115612e78576040805160e560020a62461bcd02815260206004820152601b60248201527f424d3a2077616c6c6574206d75737420626520756e6c6f636b65640000000000604482015290519081900360640190fd5b600160a060020a038416600090815260056020908152604080832086845290915281205411612ef1576040805160e560020a62461bcd02815260206004820152601a60248201527f54543a20756e6b6e6f776e2070656e64696e6720616374696f6e000000000000604482015290519081900360640190fd5b600160a060020a0384166000818152600560209081526040808320878452909152808220829055518592917f2914460f2e2359d06bcda666d815164a8e77d104644dfbe6360885abfa2da59c91a350505050565b600854604080517f13f4a0ea000000000000000000000000000000000000000000000000000000008152600160a060020a03858116600483015284811660248301529151600093849316916313f4a0ea916044808301926020929190829003018186803b158015612fb557600080fd5b505afa158015612fc9573d6000803e3d6000fd5b505050506040513d6020811015612fdf57600080fd5b50519050600081118015611934575042119392505050565b600954600160a060020a031681565b60026020526000908152604090205481565b7fd490da4d0000000000000000000000000000000000000000000000000000000090565b600160a060020a039091166000908152600560209081526040808320938352929052205490565b60045481565b813330148061307d575061307d813361351b565b15156130bd5760405160e560020a62461bcd0281526004018080602001828103825260238152602001806149466023913960400191505060405180910390fd5b600154604080517f4a4fbeec000000000000000000000000000000000000000000000000000000008152600160a060020a038087166004830152915186939290921691634a4fbeec91602480820192602092909190829003018186803b15801561312657600080fd5b505afa15801561313a573d6000803e3d6000fd5b505050506040513d602081101561315057600080fd5b5051156131a7576040805160e560020a62461bcd02815260206004820152601b60248201527f424d3a2077616c6c6574206d75737420626520756e6c6f636b65640000000000604482015290519081900360640190fd5b6131b18484612f45565b1515613207576040805160e560020a62461bcd02815260206004820152601a60248201527f54543a20746172676574206e6f742077686974656c6973746564000000000000604482015290519081900360640190fd5b600854604080517f80bfbe68000000000000000000000000000000000000000000000000000000008152600160a060020a038781166004830152868116602483015260006044830181905292519316926380bfbe689260648084019391929182900301818387803b15801561327b57600080fd5b505af115801561328f573d6000803e3d6000fd5b5050604051600160a060020a038087169350871691507fd288ab5da2e1f37cf384a1565a3f905ad289b092fbdd31950dbbfef148c04f8890600090a350505050565b6000806132dd83611d02565b6fffffffffffffffffffffffffffffffff149392505050565b843330148061330a575061330a813361351b565b151561334a5760405160e560020a62461bcd0281526004018080602001828103825260238152602001806149466023913960400191505060405180910390fd5b600154604080517f4a4fbeec000000000000000000000000000000000000000000000000000000008152600160a060020a03808a166004830152915189939290921691634a4fbeec91602480820192602092909190829003018186803b1580156133b357600080fd5b505afa1580156133c7573d6000803e3d6000fd5b505050506040513d60208110156133dd57600080fd5b505115613434576040805160e560020a62461bcd02815260206004820152601b60248201527f424d3a2077616c6c6574206d75737420626520756e6c6f636b65640000000000604482015290519081900360640190fd5b61343e87876135b9565b6134488787612f45565b1561348f5761106a87878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061384992505050565b6134998786613911565b15156134d95760405160e560020a62461bcd0281526004018080602001828103825260238152602001806148f76023913960400191505060405180910390fd5b61117b87878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061384992505050565b600081600160a060020a031683600160a060020a0316638da5cb5b6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801561357c57600080fd5b505afa158015613590573d6000803e3d6000fd5b505050506040513d60208110156135a657600080fd5b5051600160a060020a0316149392505050565b81600160a060020a031681600160a060020a031614158015613676575081600160a060020a031663d6eb1bbf826040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082600160a060020a0316600160a060020a0316815260200191505060206040518083038186803b15801561364857600080fd5b505afa15801561365c573d6000803e3d6000fd5b505050506040513d602081101561367257600080fd5b5051155b801561371f5750600954604080517f837479c9000000000000000000000000000000000000000000000000000000008152600160a060020a0384811660048301529151919092169163837479c9916024808301926020929190829003018186803b1580156136e357600080fd5b505afa1580156136f7573d6000803e3d6000fd5b505050506040513d602081101561370d57600080fd5b5051158061371f575061371f826132d1565b1515611884576040805160e560020a62461bcd02815260206004820152601660248201527f544d3a20466f7262696464656e20636f6e747261637400000000000000000000604482015290519081900360640190fd5b60408051600160a060020a038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b3000000000000000000000000000000000000000000000000000000001790526137f785856000846143e8565b5060408051838152600160a060020a038581166020830152825181881693918916927fdc47705473b4a899de6e16a740ecc86f2a65dc7dbb9eadd0a06ce5421a44e23092908290030190a35050505050565b613855848484846143e8565b5082600160a060020a031684600160a060020a03167fbfbd7fb6c6d7dd1ef01d18a7e98333f084363d82d5ce600328e8b941a53d665484846040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156138d05781810151838201526020016138b8565b50505050905090810190601f1680156138fd5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a350505050565b600081151561392257506001611286565b600160a060020a038316600090815260036020526040812080546001820154919291613983916fffffffffffffffffffffffffffffffff80821692700100000000000000000000000000000000909204169067ffffffffffffffff16613ee7565b90506139a285826fffffffffffffffffffffffffffffffff168661466b565b156139bd576139b285828661471d565b600192505050611286565b506000949350505050565b6041808202830160208101516040820151919092015160009260ff9190911691601b8314806139fa57508260ff16601c145b1515613a0557600080fd5b604080516000815260208082018084528a905260ff8616828401526060820185905260808201849052915160019260a0808401939192601f1981019281900390910190855afa158015613a5c573d6000803e3d6000fd5b5050506020604051035193505050505b9392505050565b8033600160a060020a03821614613ad4576040805160e560020a62461bcd02815260206004820152601960248201527f424d3a2063616c6c6572206d7573742062652077616c6c657400000000000000604482015290519081900360640190fd5b600160a060020a038216600090815260036020526040902080546fffffffffffffffffffffffffffffffff16158015613b195750600181015467ffffffffffffffff16155b1561290c5760045481546fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff9091161790555050565b600082821115613b6057600080fd5b50900390565b600160a060020a03841673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415613bad57613ba785848460206040519081016040528060008152506143e8565b50613c32565b60408051600160a060020a038516602482015260448082018590528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052613c2f86866000846143e8565b50505b8184600160a060020a031686600160a060020a03167fd5c97f2e041b2046be3b4337472f05720760a198f4d7d84980b7155eec7cca6f86856040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015613cbf578181015183820152602001613ca7565b50505050905090810190601f168015613cec5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a45050505050565b60008087868686864360405160200180876000811115613d1d57fe5b60ff167f010000000000000000000000000000000000000000000000000000000000000002815260010186600160a060020a0316600160a060020a03166c0100000000000000000000000002815260140185600160a060020a0316600160a060020a03166c0100000000000000000000000002815260140184815260200183805190602001908083835b60208310613dc65780518252601f199092019160209182019101613da7565b6001836020036101000a03801982511681845116808217855250505050505090500182815260200196505050505050506040516020818303038152906040528051906020012091506005600088600160a060020a0316600160a060020a031681526020019081526020016000206000016000838152602001908152602001600020546000141515613ea1576040805160e560020a62461bcd02815260206004820152601c60248201527f544d3a206475706c69636174652070656e64696e6720616374696f6e00000000604482015290519081900360640190fd5b600654613eb590429063ffffffff613f1f16565b600160a060020a0390971660009081526005602090815260408083208584529091529020879055509694955050505050565b6000808267ffffffffffffffff16118015613f0b5750428267ffffffffffffffff16105b15613f17575081613a6c565b509192915050565b600082820183811015613a6c57600080fd5b611884826fffffffffffffffffffffffffffffffff8361428a565b6040517f190000000000000000000000000000000000000000000000000000000000000060208083018281526000602185018190526c01000000000000000000000000600160a060020a03808e16820260228801528c16026036860152604a85018a90528851909485938d938d938d938d938d938d938d939192606a909201918701908083835b60208310613ff25780518252601f199092019160209182019101613fd3565b51815160209384036101000a600019018019909216911617905292019586525084810193909352506040808401919091528051808403820181526060840182528051908301207f19457468657265756d205369676e6564204d6573736167653a0a3332000000006080850152609c808501919091528151808503909101815260bc909301905281519101209e9d5050505050505050505050505050565b60006119348484614826565b600060248251101515156140f9576040805160e560020a62461bcd02815260206004820152601660248201527f524d3a20496e76616c6964206461746157616c6c657400000000000000000000604482015290519081900360640190fd5b5060240151600160a060020a0391821691161490565b600192915050565b600080831180156141285750600082115b80156141ee575082840285600160a060020a031631108061415b57506141598561415187611d02565b85870261466b565b155b806141ee5750604080517fd6eb1bbf0000000000000000000000000000000000000000000000000000000081523060048201529051600160a060020a0387169163d6eb1bbf916024808301926020929190829003018186803b1580156141c057600080fd5b505afa1580156141d4573d6000803e3d6000fd5b505050506040513d60208110156141ea57600080fd5b5051155b156141fb57506000611934565b506001949350505050565b600080614215848460006139c8565b9050614221868261351b565b9695505050505050565b618f0885016000851180156142405750600083115b801561424c5750838111155b1561117b573a851115614260573a02614263565b84025b61426d8782613911565b50610e5587838360206040519081016040528060008152506143e8565b600160a060020a0383166000908152600360205260408120600181015490919067ffffffffffffffff16811080156142d1575060018201544267ffffffffffffffff909116105b6142ee5781546fffffffffffffffffffffffffffffffff16614317565b815470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff165b82546fffffffffffffffffffffffffffffffff868116700100000000000000000000000000000000028184166fffffffffffffffffffffffffffffffff1990931692909217161783559050614372428463ffffffff613f1f16565b60018301805467ffffffffffffffff191667ffffffffffffffff929092169190911790556143a04284613f1f565b67ffffffffffffffff168486600160a060020a03167f8a747eae44b6307d1b112c127968367d02d9f52ffef8533b3e899983ff2b1d4a60405160405180910390a45050505050565b6060600085600160a060020a03168585856040516024018084600160a060020a0316600160a060020a0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561445757818101518382015260200161443f565b50505050905090810190601f1680156144845780820380516001836020036101000a031916815260200191505b5060408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8f6f033200000000000000000000000000000000000000000000000000000000178152905182519297509550859450925090508083835b602083106145105780518252601f1990920191602091820191016144f1565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614572576040519150601f19603f3d011682016040523d82523d6000602084013e614577565b606091505b509250905080801561458a575060008251115b156145f7578180602001905160208110156145a457600080fd5b8101908080516401000000008111156145bc57600080fd5b820160208101848111156145cf57600080fd5b81516401000000008111828201871017156145e957600080fd5b509095506146629350505050565b60008251111561460b573d6000803e3d6000fd5b801515614662576040805160e560020a62461bcd02815260206004820152601a60248201527f424d3a2077616c6c657420696e766f6b65207265766572746564000000000000604482015290519081900360640190fd5b50949350505050565b60006fffffffffffffffffffffffffffffffff83141561468d57506001613a6c565b600160a060020a038416600090815260036020526040902060020180544270010000000000000000000000000000000090910467ffffffffffffffff1610156146db57505081811115613a6c565b80546fffffffffffffffffffffffffffffffff1683018410801590614715575080546fffffffffffffffffffffffffffffffff1683810110155b915050613a6c565b6fffffffffffffffffffffffffffffffff8281161461290c57600160a060020a038316600090815260036020526040902060020180544270010000000000000000000000000000000090910467ffffffffffffffff1610156147ef5780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000042620151800167ffffffffffffffff1602176fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff8316178155612740565b80546fffffffffffffffffffffffffffffffff8082168401166fffffffffffffffffffffffffffffffff1990911617815550505050565b600160a060020a038216600090815260026020526040812054821161484d57506000611286565b7001000000000000000000000000000000006fffffffffffffffffffffffffffffffff19831604436127100181111561488a576000915050611286565b5050600160a060020a039190911660009081526002602052604090205560019056fe524d3a207468652077616c6c657420617574686f72697a656420697320646966666572656e74207468656e2074686520746172676574206f66207468652072656c617965642064617461544d3a2043616c6c20636f6e74726163742061626f7665206461696c79206c696d697454543a207472616e73666572206f757473696465206f662074686520657865637574696f6e2077696e646f77424d3a206d75737420626520616e206f776e657220666f72207468652077616c6c6574a165627a7a72305820d4581618ef509331176c22d93961eaece70c220f5a286e8b1b3885e6273b83e60029000000000000000000000000c17d432bd8e8850fd7b32b0270f5afac65db0105000000000000000000000000391f0e86da951c03b1183c60b195090671adea8800000000000000000000000044da3a8051ba88eab0440db3779cab9d679ae76f000000000000000000000000e8a76d2f37fe50b6a95d27fb92291fe0b57407d30000000000000000000000000000000000000000000000000000000000015180000000000000000000000000000000000000000000000000000000000000a8c00000000000000000000000000000000000000000000000008ac7230489e80000000000000000000000000000df6767a7715381867738cf211290f61697ecd938
Deployed Bytecode
0x608060405234801561001057600080fd5b5060043610610201576000357c010000000000000000000000000000000000000000000000000000000090048063961bfeee1161012c578063b888879e116100bf578063e26b013b1161008e578063e26b013b1461097b578063f8d3277d14610983578063f9f6499e146109b1578063fd6ac309146109d757610201565b8063b888879e146108fc578063c9b5ef8e14610904578063d490da4d1461092a578063e1ee38ec1461093257610201565b8063aacaaf88116100fb578063aacaaf8814610786578063b20f3f3714610876578063b377a9d5146108a2578063b6b35272146108ce57610201565b8063961bfeee1461070c5780639be65a6014610714578063a0aec1051461073a578063a3411c0a1461076057610201565b80632df546f4116101a45780635ed4bf81116101735780635ed4bf81146106005780637cb8f8ba146106985780637cc0d906146106e057806395813db4146106e857610201565b80632df546f4146104e657806343cd5c7e1461057e57806357518243146105a45780635a1db8c4146105d257610201565b80631626ba7e116101e05780631626ba7e146102f657806319ab453c146103d857806320c13b0b146103fe5780632d0335ab146104c057610201565b80626fda351461020657806309d22c8e1461022057806312ef080d146102ba575b600080fd5b61020e610a67565b60408051918252519081900360200190f35b6102b8600480360360a081101561023657600080fd5b600160a060020a03823581169260208101358216926040820135909216916060820135919081019060a08101608082013564010000000081111561027957600080fd5b82018360208201111561028b57600080fd5b803590602001918460018302840111640100000000831117156102ad57600080fd5b509092509050610a6d565b005b6102b8600480360360808110156102d057600080fd5b50600160a060020a03813581169160208101358216916040820135169060600135610e5f565b6103a36004803603604081101561030c57600080fd5b8135919081019060408101602082013564010000000081111561032e57600080fd5b82018360208201111561034057600080fd5b8035906020019184600183028401116401000000008311171561036257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611185945050505050565b604080517fffffffff000000000000000000000000000000000000000000000000000000009092168252519081900360200190f35b6102b8600480360360208110156103ee57600080fd5b5035600160a060020a031661128c565b6103a36004803603604081101561041457600080fd5b81019060208101813564010000000081111561042f57600080fd5b82018360208201111561044157600080fd5b8035906020019184600183028401116401000000008311171561046357600080fd5b91939092909160208101903564010000000081111561048157600080fd5b82018360208201111561049357600080fd5b803590602001918460018302840111640100000000831117156104b557600080fd5b509092509050611888565b61020e600480360360208110156104d657600080fd5b5035600160a060020a031661193c565b6102b8600480360360a08110156104fc57600080fd5b600160a060020a03823581169260208101358216926040820135909216916060820135919081019060a08101608082013564010000000081111561053f57600080fd5b82018360208201111561055157600080fd5b8035906020019184600183028401116401000000008311171561057357600080fd5b509092509050611957565b61020e6004803603602081101561059457600080fd5b5035600160a060020a0316611d02565b6102b8600480360360408110156105ba57600080fd5b50600160a060020a0381358116916020013516611d79565b6102b8600480360360408110156105e857600080fd5b50600160a060020a0381358116916020013516612010565b6102b8600480360360c081101561061657600080fd5b600160a060020a03823581169260208101358216926040820135909216916060820135919081019060a08101608082013564010000000081111561065957600080fd5b82018360208201111561066b57600080fd5b8035906020019184600183028401116401000000008311171561068d57600080fd5b9193509150356121cb565b6106be600480360360208110156106ae57600080fd5b5035600160a060020a0316612530565b6040805192835267ffffffffffffffff90911660208301528051918290030190f35b61020e6125ef565b6106f06125f5565b60408051600160a060020a039092168252519081900360200190f35b6106f0612604565b6102b86004803603602081101561072a57600080fd5b5035600160a060020a0316612613565b6106be6004803603602081101561075057600080fd5b5035600160a060020a0316612746565b6102b86004803603602081101561077657600080fd5b5035600160a060020a03166127c2565b610862600480360360c081101561079c57600080fd5b600160a060020a0382351691908101906040810160208201356401000000008111156107c757600080fd5b8201836020820111156107d957600080fd5b803590602001918460018302840111640100000000831117156107fb57600080fd5b9193909282359260408101906020013564010000000081111561081d57600080fd5b82018360208201111561082f57600080fd5b8035906020019184600183028401116401000000008311171561085157600080fd5b919350915080359060200135612911565b604080519115158252519081900360200190f35b6102b86004803603604081101561088c57600080fd5b50600160a060020a038135169060200135612bef565b6102b8600480360360408110156108b857600080fd5b50600160a060020a038135169060200135612d3a565b610862600480360360408110156108e457600080fd5b50600160a060020a0381358116916020013516612f45565b6106f0612ff7565b61020e6004803603602081101561091a57600080fd5b5035600160a060020a0316613006565b6103a3613018565b61095e6004803603604081101561094857600080fd5b50600160a060020a03813516906020013561303c565b6040805167ffffffffffffffff9092168252519081900360200190f35b61020e613063565b6102b86004803603604081101561099957600080fd5b50600160a060020a0381358116916020013516613069565b610862600480360360208110156109c757600080fd5b5035600160a060020a03166132d1565b6102b8600480360360808110156109ed57600080fd5b600160a060020a03823581169260208101359091169160408201359190810190608081016060820135640100000000811115610a2857600080fd5b820183602082011115610a3a57600080fd5b80359060200191846001830284011164010000000083111715610a5c57600080fd5b5090925090506132f6565b60075481565b8533301480610a815750610a81813361351b565b1515610ac15760405160e560020a62461bcd0281526004018080602001828103825260238152602001806149466023913960400191505060405180910390fd5b600154604080517f4a4fbeec000000000000000000000000000000000000000000000000000000008152600160a060020a03808b16600483015291518a939290921691634a4fbeec91602480820192602092909190829003018186803b158015610b2a57600080fd5b505afa158015610b3e573d6000803e3d6000fd5b505050506040513d6020811015610b5457600080fd5b505115610bab576040805160e560020a62461bcd02815260206004820152601b60248201527f424d3a2077616c6c6574206d75737420626520756e6c6f636b65640000000000604482015290519081900360640190fd5b610bb588876135b9565b610bbf8887612f45565b15610c1857610bd088888888613775565b610c138887600087878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061384992505050565b610e55565b604080517fdd62ed3e000000000000000000000000000000000000000000000000000000008152600160a060020a038a81166004830152888116602483015291516000928a169163dd62ed3e916044808301926020929190829003018186803b158015610c8457600080fd5b505afa158015610c98573d6000803e3d6000fd5b505050506040513d6020811015610cae57600080fd5b50519050808611610d0157610cfc8988600088888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061384992505050565b610e53565b600954604080517fce55c85200000000000000000000000000000000000000000000000000000000815283890360048201819052600160a060020a038c8116602484015292519093600093169163ce55c852916044808301926020929190829003018186803b158015610d7357600080fd5b505afa158015610d87573d6000803e3d6000fd5b505050506040513d6020811015610d9d57600080fd5b50519050610dab8b82613911565b1515610e01576040805160e560020a62461bcd02815260206004820152601d60248201527f544d3a20417070726f76652061626f7665206461696c79206c696d6974000000604482015290519081900360640190fd5b610e0d8b8b8b8b613775565b610e508b8a60008a8a8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061384992505050565b50505b505b5050505050505050565b8333301480610e735750610e73813361351b565b1515610eb35760405160e560020a62461bcd0281526004018080602001828103825260238152602001806149466023913960400191505060405180910390fd5b600154604080517f4a4fbeec000000000000000000000000000000000000000000000000000000008152600160a060020a038089166004830152915188939290921691634a4fbeec91602480820192602092909190829003018186803b158015610f1c57600080fd5b505afa158015610f30573d6000803e3d6000fd5b505050506040513d6020811015610f4657600080fd5b505115610f9d576040805160e560020a62461bcd02815260206004820152601b60248201527f424d3a2077616c6c6574206d75737420626520756e6c6f636b65640000000000604482015290519081900360640190fd5b610fa78685612f45565b15610fbd57610fb886868686613775565b61117d565b604080517fdd62ed3e000000000000000000000000000000000000000000000000000000008152600160a060020a0388811660048301528681166024830152915160009288169163dd62ed3e916044808301926020929190829003018186803b15801561102957600080fd5b505afa15801561103d573d6000803e3d6000fd5b505050506040513d602081101561105357600080fd5b5051905080841161106f5761106a87878787613775565b61117b565b600954604080517fce55c85200000000000000000000000000000000000000000000000000000000815283870360048201819052600160a060020a038a8116602484015292519093600093169163ce55c852916044808301926020929190829003018186803b1580156110e157600080fd5b505afa1580156110f5573d6000803e3d6000fd5b505050506040513d602081101561110b57600080fd5b505190506111198982613911565b151561116f576040805160e560020a62461bcd02815260206004820152601d60248201527f544d3a20417070726f76652061626f7665206461696c79206c696d6974000000604482015290519081900360640190fd5b610e5389898989613775565b505b505050505050565b80516000906041146111e1576040805160e560020a62461bcd02815260206004820152601c60248201527f544d3a20696e76616c6964207369676e6174757265206c656e67746800000000604482015290519081900360640190fd5b60006111ef848460006139c8565b90506111fb338261351b565b1515611251576040805160e560020a62461bcd02815260206004820152601260248201527f544d3a20496e76616c6964207369676e65720000000000000000000000000000604482015290519081900360640190fd5b5050604080517f697356616c69645369676e617475726528627974657333322c627974657329008152905190819003601f0190205b92915050565b8033600160a060020a038216146112ed576040805160e560020a62461bcd02815260206004820152601960248201527f424d3a2063616c6c6572206d7573742062652077616c6c657400000000000000604482015290519081900360640190fd5b604080517f697356616c69645369676e61747572652862797465732c6279746573290000008152815190819003601d0181207f13da30b20000000000000000000000000000000000000000000000000000000082523060048301527fffffffff000000000000000000000000000000000000000000000000000000001660248201529051600160a060020a038416916313da30b291604480830192600092919082900301818387803b1580156113a257600080fd5b505af11580156113b6573d6000803e3d6000fd5b5050604080517f697356616c69645369676e617475726528627974657333322c627974657329008152815190819003601f0181207f13da30b20000000000000000000000000000000000000000000000000000000082523060048301527fffffffff000000000000000000000000000000000000000000000000000000001660248201529051600160a060020a03861693506313da30b29250604480830192600092919082900301818387803b15801561146f57600080fd5b505af1158015611483573d6000803e3d6000fd5b5050600a54600160a060020a0316151591506114a99050576114a482613a73565b611884565b600a54604080517f43cd5c7e000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152915160009392909216916343cd5c7e91602480820192602092909190829003018186803b15801561151357600080fd5b505afa158015611527573d6000803e3d6000fd5b505050506040513d602081101561153d57600080fd5b5051600a54604080517fa0aec105000000000000000000000000000000000000000000000000000000008152600160a060020a03878116600483015282519495506000948594919091169263a0aec1059260248082019391829003018186803b1580156115a957600080fd5b505afa1580156115bd573d6000803e3d6000fd5b505050506040513d60408110156115d357600080fd5b5080516020909101519092509050821580156115f7575067ffffffffffffffff8116155b1561160d5761160585613a73565b505050611884565b8183141561165d57600160a060020a038516600090815260036020526040902080546fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff851617905561170d565b604080516060810182526fffffffffffffffffffffffffffffffff8086168252848116602080840191825267ffffffffffffffff808716858701908152600160a060020a038c1660009081526003909352959091209351845492518416700100000000000000000000000000000000029084166fffffffffffffffffffffffffffffffff19909316929092179092161782559151600190910180549190921667ffffffffffffffff199091161790555b600a54604080517f7cb8f8ba000000000000000000000000000000000000000000000000000000008152600160a060020a03888116600483015282516000948594921692637cb8f8ba926024808301939192829003018186803b15801561177357600080fd5b505afa158015611787573d6000803e3d6000fd5b505050506040513d604081101561179d57600080fd5b50805160209091015190925090504267ffffffffffffffff8216111561117b5760408051808201909152806117d8878563ffffffff613b5116565b6fffffffffffffffffffffffffffffffff908116825267ffffffffffffffff938416602092830152600160a060020a038a166000908152600383526040902083516002909101805494909301516fffffffffffffffffffffffffffffffff199094169116177fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000009290931691909102919091179055505050505b5050565b60008085856040516020018083838082843780830192505050925050506040516020818303038152906040528051906020012090506118fd8185858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061118592505050565b5050604080517f697356616c69645369676e61747572652862797465732c6279746573290000008152905190819003601d01902090505b949350505050565b600160a060020a031660009081526002602052604090205490565b853330148061196b575061196b813361351b565b15156119ab5760405160e560020a62461bcd0281526004018080602001828103825260238152602001806149466023913960400191505060405180910390fd5b600154604080517f4a4fbeec000000000000000000000000000000000000000000000000000000008152600160a060020a03808b16600483015291518a939290921691634a4fbeec91602480820192602092909190829003018186803b158015611a1457600080fd5b505afa158015611a28573d6000803e3d6000fd5b505050506040513d6020811015611a3e57600080fd5b505115611a95576040805160e560020a62461bcd02815260206004820152601b60248201527f424d3a2077616c6c6574206d75737420626520756e6c6f636b65640000000000604482015290519081900360640190fd5b611a9f8887612f45565b15611ae757610c138888888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613b6692505050565b6000600160a060020a03881673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14611bab57600954604080517fce55c85200000000000000000000000000000000000000000000000000000000815260048101899052600160a060020a038b811660248301529151919092169163ce55c852916044808301926020929190829003018186803b158015611b7a57600080fd5b505afa158015611b8e573d6000803e3d6000fd5b505050506040513d6020811015611ba457600080fd5b5051611bad565b855b9050611bb98982613911565b15611c0157610cfc8989898989898080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613b6692505050565b600080611c4960008c8c8c8c8c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613d0192505050565b9150915080828c600160a060020a03167fc63146cfd39cd6097f6e314e8595c4554faf95175b45c6215517903c12e765d98d8d8d8d8d6040518086600160a060020a0316600160a060020a0316815260200185600160a060020a0316600160a060020a03168152602001848152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039850909650505050505050a45050505050505050505050565b600160a060020a038116600090815260036020526040812080546001820154611d60916fffffffffffffffffffffffffffffffff80821692700100000000000000000000000000000000909204169067ffffffffffffffff16613ee7565b6fffffffffffffffffffffffffffffffff169392505050565b8133301480611d8d5750611d8d813361351b565b1515611dcd5760405160e560020a62461bcd0281526004018080602001828103825260238152602001806149466023913960400191505060405180910390fd5b600154604080517f4a4fbeec000000000000000000000000000000000000000000000000000000008152600160a060020a038087166004830152915186939290921691634a4fbeec91602480820192602092909190829003018186803b158015611e3657600080fd5b505afa158015611e4a573d6000803e3d6000fd5b505050506040513d6020811015611e6057600080fd5b505115611eb7576040805160e560020a62461bcd02815260206004820152601b60248201527f424d3a2077616c6c6574206d75737420626520756e6c6f636b65640000000000604482015290519081900360640190fd5b611ec18484612f45565b15611f16576040805160e560020a62461bcd02815260206004820152601e60248201527f54543a2074617267657420616c72656164792077686974656c69737465640000604482015290519081900360640190fd5b6000611f2d60065442613f1f90919063ffffffff16565b600854604080517f80bfbe68000000000000000000000000000000000000000000000000000000008152600160a060020a03898116600483015288811660248301526044820185905291519394509116916380bfbe689160648082019260009290919082900301818387803b158015611fa557600080fd5b505af1158015611fb9573d6000803e3d6000fd5b50506040805167ffffffffffffffff851681529051600160a060020a038089169450891692507f1f57f9641d3e8733ed672fef5ac85464bd7215ef2f21e83428e8408248b13dcd9181900360200190a35050505050565b81333014806120245750612024813361351b565b15156120645760405160e560020a62461bcd0281526004018080602001828103825260238152602001806149466023913960400191505060405180910390fd5b600054604080517f0bcd4ebb000000000000000000000000000000000000000000000000000000008152600160a060020a03858116600483015291519190921691630bcd4ebb916024808301926020929190829003018186803b1580156120ca57600080fd5b505afa1580156120de573d6000803e3d6000fd5b505050506040513d60208110156120f457600080fd5b5051151561214c576040805160e560020a62461bcd02815260206004820152601c60248201527f424d3a206d6f64756c65206973206e6f74207265676973746572656400000000604482015290519081900360640190fd5b604080517f1f17732d000000000000000000000000000000000000000000000000000000008152600160a060020a03848116600483015260016024830152915191851691631f17732d9160448082019260009290919082900301818387803b1580156121b757600080fd5b505af115801561117b573d6000803e3d6000fd5b600154604080517f4a4fbeec000000000000000000000000000000000000000000000000000000008152600160a060020a03808b16600483015291518a939290921691634a4fbeec91602480820192602092909190829003018186803b15801561223457600080fd5b505afa158015612248573d6000803e3d6000fd5b505050506040513d602081101561225e57600080fd5b5051156122b5576040805160e560020a62461bcd02815260206004820152601b60248201527f424d3a2077616c6c6574206d75737420626520756e6c6f636b65640000000000604482015290519081900360640190fd5b600080888888888888604051602001808860008111156122d157fe5b60ff167f010000000000000000000000000000000000000000000000000000000000000002815260010187600160a060020a0316600160a060020a03166c0100000000000000000000000002815260140186600160a060020a0316600160a060020a03166c01000000000000000000000000028152601401858152602001848480828437808301925050508281526020019750505050505050506040516020818303038152906040528051906020012090506000600560008b600160a060020a0316600160a060020a03168152602001908152602001600020600001600083815260200190815260200160002054905060008111151561241b576040805160e560020a62461bcd02815260206004820152601c60248201527f54543a20756e6b6e6f776e2070656e64696e67207472616e7366657200000000604482015290519081900360640190fd5b600061243260075483613f1f90919063ffffffff16565b90504282111580156124445750804211155b15156124845760405160e560020a62461bcd02815260040180806020018281038252602c81526020018061491a602c913960400191505060405180910390fd5b600160a060020a038b1660009081526005602090815260408083208684528252808320929092558151601f89018290048202810182019092528782526124ed918d918d918d918d91908d908d9081908401838280828437600092019190915250613b6692505050565b6040518390600160a060020a038d16907f53d984c4cd3917405bdcc3baabad7c1269dd3baf7c2c53ca571d8d7de9629bc990600090a35050505050505050505050565b600080600061253e84611d02565b600160a060020a0385166000908152600360205260409020600201805491925090700100000000000000000000000000000000900467ffffffffffffffff164211156125945781935042620151800192506125e8565b805467ffffffffffffffff70010000000000000000000000000000000082041693506fffffffffffffffffffffffffffffffff168211156125e85780546fffffffffffffffffffffffffffffffff16820393505b5050915091565b60065481565b600a54600160a060020a031681565b600854600160a060020a031681565b604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051600091600160a060020a038416916370a0823191602480820192602092909190829003018186803b15801561267657600080fd5b505afa15801561268a573d6000803e3d6000fd5b505050506040513d60208110156126a057600080fd5b505160008054604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201526024810185905290519394509085169263a9059cbb92604480840193602093929083900390910190829087803b15801561271657600080fd5b505af115801561272a573d6000803e3d6000fd5b505050506040513d602081101561274057600080fd5b50505050565b600160a060020a0381166000908152600360205260408120600181015482919067ffffffffffffffff16421061277e576000806127b8565b805460018201547001000000000000000000000000000000009091046fffffffffffffffffffffffffffffffff169067ffffffffffffffff165b9250925050915091565b80333014806127d657506127d6813361351b565b15156128165760405160e560020a62461bcd0281526004018080602001828103825260238152602001806149466023913960400191505060405180910390fd5b600154604080517f4a4fbeec000000000000000000000000000000000000000000000000000000008152600160a060020a038086166004830152915185939290921691634a4fbeec91602480820192602092909190829003018186803b15801561287f57600080fd5b505afa158015612893573d6000803e3d6000fd5b505050506040513d60208110156128a957600080fd5b505115612900576040805160e560020a62461bcd02815260206004820152601b60248201527f424d3a2077616c6c6574206d75737420626520756e6c6f636b65640000000000604482015290519081900360640190fd5b61290c83600654613f31565b505050565b6000805a90506000612961308c60008d8d8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508f92508c91508b9050613f4c565b905061296e8b898361408f565b15156129c4576040805160e560020a62461bcd02815260206004820152601560248201527f524d3a204475706c696361746520726571756573740000000000000000000000604482015290519081900360640190fd5b612a048b8b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061409b92505050565b1515612a445760405160e560020a62461bcd02815260040180806020018281038252604a8152602001806148ad604a913960600191505060405180910390fd5b6000612a868c8c8c8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061410f92505050565b905060418102871415612b9e57612a9f8c868884614117565b15612b9e57801580612b225750612b228c8c8c8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8f018190048102820181019092528d815288935091508d908d908190840183828082843760009201919091525061420692505050565b15612b9e5730600160a060020a03168b8b604051808383808284376040519201945060009350909150508083038183865af19150503d8060008114612b83576040519150601f19603f3d011682016040523d82523d6000602084013e612b88565b606091505b505080945050612b9e8c5a85038888853361422b565b60408051838152905185151591600160a060020a038f16917f6bb0b384ce772133df63560651bc8c727c53306cec1d51e2cbf8ea35fb8f2ec19181900360200190a350505098975050505050505050565b8133301480612c035750612c03813361351b565b1515612c435760405160e560020a62461bcd0281526004018080602001828103825260238152602001806149466023913960400191505060405180910390fd5b600154604080517f4a4fbeec000000000000000000000000000000000000000000000000000000008152600160a060020a038087166004830152915186939290921691634a4fbeec91602480820192602092909190829003018186803b158015612cac57600080fd5b505afa158015612cc0573d6000803e3d6000fd5b505050506040513d6020811015612cd657600080fd5b505115612d2d576040805160e560020a62461bcd02815260206004820152601b60248201527f424d3a2077616c6c6574206d75737420626520756e6c6f636b65640000000000604482015290519081900360640190fd5b612740848460065461428a565b8133301480612d4e5750612d4e813361351b565b1515612d8e5760405160e560020a62461bcd0281526004018080602001828103825260238152602001806149466023913960400191505060405180910390fd5b600154604080517f4a4fbeec000000000000000000000000000000000000000000000000000000008152600160a060020a038087166004830152915186939290921691634a4fbeec91602480820192602092909190829003018186803b158015612df757600080fd5b505afa158015612e0b573d6000803e3d6000fd5b505050506040513d6020811015612e2157600080fd5b505115612e78576040805160e560020a62461bcd02815260206004820152601b60248201527f424d3a2077616c6c6574206d75737420626520756e6c6f636b65640000000000604482015290519081900360640190fd5b600160a060020a038416600090815260056020908152604080832086845290915281205411612ef1576040805160e560020a62461bcd02815260206004820152601a60248201527f54543a20756e6b6e6f776e2070656e64696e6720616374696f6e000000000000604482015290519081900360640190fd5b600160a060020a0384166000818152600560209081526040808320878452909152808220829055518592917f2914460f2e2359d06bcda666d815164a8e77d104644dfbe6360885abfa2da59c91a350505050565b600854604080517f13f4a0ea000000000000000000000000000000000000000000000000000000008152600160a060020a03858116600483015284811660248301529151600093849316916313f4a0ea916044808301926020929190829003018186803b158015612fb557600080fd5b505afa158015612fc9573d6000803e3d6000fd5b505050506040513d6020811015612fdf57600080fd5b50519050600081118015611934575042119392505050565b600954600160a060020a031681565b60026020526000908152604090205481565b7fd490da4d0000000000000000000000000000000000000000000000000000000090565b600160a060020a039091166000908152600560209081526040808320938352929052205490565b60045481565b813330148061307d575061307d813361351b565b15156130bd5760405160e560020a62461bcd0281526004018080602001828103825260238152602001806149466023913960400191505060405180910390fd5b600154604080517f4a4fbeec000000000000000000000000000000000000000000000000000000008152600160a060020a038087166004830152915186939290921691634a4fbeec91602480820192602092909190829003018186803b15801561312657600080fd5b505afa15801561313a573d6000803e3d6000fd5b505050506040513d602081101561315057600080fd5b5051156131a7576040805160e560020a62461bcd02815260206004820152601b60248201527f424d3a2077616c6c6574206d75737420626520756e6c6f636b65640000000000604482015290519081900360640190fd5b6131b18484612f45565b1515613207576040805160e560020a62461bcd02815260206004820152601a60248201527f54543a20746172676574206e6f742077686974656c6973746564000000000000604482015290519081900360640190fd5b600854604080517f80bfbe68000000000000000000000000000000000000000000000000000000008152600160a060020a038781166004830152868116602483015260006044830181905292519316926380bfbe689260648084019391929182900301818387803b15801561327b57600080fd5b505af115801561328f573d6000803e3d6000fd5b5050604051600160a060020a038087169350871691507fd288ab5da2e1f37cf384a1565a3f905ad289b092fbdd31950dbbfef148c04f8890600090a350505050565b6000806132dd83611d02565b6fffffffffffffffffffffffffffffffff149392505050565b843330148061330a575061330a813361351b565b151561334a5760405160e560020a62461bcd0281526004018080602001828103825260238152602001806149466023913960400191505060405180910390fd5b600154604080517f4a4fbeec000000000000000000000000000000000000000000000000000000008152600160a060020a03808a166004830152915189939290921691634a4fbeec91602480820192602092909190829003018186803b1580156133b357600080fd5b505afa1580156133c7573d6000803e3d6000fd5b505050506040513d60208110156133dd57600080fd5b505115613434576040805160e560020a62461bcd02815260206004820152601b60248201527f424d3a2077616c6c6574206d75737420626520756e6c6f636b65640000000000604482015290519081900360640190fd5b61343e87876135b9565b6134488787612f45565b1561348f5761106a87878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061384992505050565b6134998786613911565b15156134d95760405160e560020a62461bcd0281526004018080602001828103825260238152602001806148f76023913960400191505060405180910390fd5b61117b87878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061384992505050565b600081600160a060020a031683600160a060020a0316638da5cb5b6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801561357c57600080fd5b505afa158015613590573d6000803e3d6000fd5b505050506040513d60208110156135a657600080fd5b5051600160a060020a0316149392505050565b81600160a060020a031681600160a060020a031614158015613676575081600160a060020a031663d6eb1bbf826040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082600160a060020a0316600160a060020a0316815260200191505060206040518083038186803b15801561364857600080fd5b505afa15801561365c573d6000803e3d6000fd5b505050506040513d602081101561367257600080fd5b5051155b801561371f5750600954604080517f837479c9000000000000000000000000000000000000000000000000000000008152600160a060020a0384811660048301529151919092169163837479c9916024808301926020929190829003018186803b1580156136e357600080fd5b505afa1580156136f7573d6000803e3d6000fd5b505050506040513d602081101561370d57600080fd5b5051158061371f575061371f826132d1565b1515611884576040805160e560020a62461bcd02815260206004820152601660248201527f544d3a20466f7262696464656e20636f6e747261637400000000000000000000604482015290519081900360640190fd5b60408051600160a060020a038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b3000000000000000000000000000000000000000000000000000000001790526137f785856000846143e8565b5060408051838152600160a060020a038581166020830152825181881693918916927fdc47705473b4a899de6e16a740ecc86f2a65dc7dbb9eadd0a06ce5421a44e23092908290030190a35050505050565b613855848484846143e8565b5082600160a060020a031684600160a060020a03167fbfbd7fb6c6d7dd1ef01d18a7e98333f084363d82d5ce600328e8b941a53d665484846040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156138d05781810151838201526020016138b8565b50505050905090810190601f1680156138fd5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a350505050565b600081151561392257506001611286565b600160a060020a038316600090815260036020526040812080546001820154919291613983916fffffffffffffffffffffffffffffffff80821692700100000000000000000000000000000000909204169067ffffffffffffffff16613ee7565b90506139a285826fffffffffffffffffffffffffffffffff168661466b565b156139bd576139b285828661471d565b600192505050611286565b506000949350505050565b6041808202830160208101516040820151919092015160009260ff9190911691601b8314806139fa57508260ff16601c145b1515613a0557600080fd5b604080516000815260208082018084528a905260ff8616828401526060820185905260808201849052915160019260a0808401939192601f1981019281900390910190855afa158015613a5c573d6000803e3d6000fd5b5050506020604051035193505050505b9392505050565b8033600160a060020a03821614613ad4576040805160e560020a62461bcd02815260206004820152601960248201527f424d3a2063616c6c6572206d7573742062652077616c6c657400000000000000604482015290519081900360640190fd5b600160a060020a038216600090815260036020526040902080546fffffffffffffffffffffffffffffffff16158015613b195750600181015467ffffffffffffffff16155b1561290c5760045481546fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff9091161790555050565b600082821115613b6057600080fd5b50900390565b600160a060020a03841673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415613bad57613ba785848460206040519081016040528060008152506143e8565b50613c32565b60408051600160a060020a038516602482015260448082018590528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052613c2f86866000846143e8565b50505b8184600160a060020a031686600160a060020a03167fd5c97f2e041b2046be3b4337472f05720760a198f4d7d84980b7155eec7cca6f86856040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015613cbf578181015183820152602001613ca7565b50505050905090810190601f168015613cec5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a45050505050565b60008087868686864360405160200180876000811115613d1d57fe5b60ff167f010000000000000000000000000000000000000000000000000000000000000002815260010186600160a060020a0316600160a060020a03166c0100000000000000000000000002815260140185600160a060020a0316600160a060020a03166c0100000000000000000000000002815260140184815260200183805190602001908083835b60208310613dc65780518252601f199092019160209182019101613da7565b6001836020036101000a03801982511681845116808217855250505050505090500182815260200196505050505050506040516020818303038152906040528051906020012091506005600088600160a060020a0316600160a060020a031681526020019081526020016000206000016000838152602001908152602001600020546000141515613ea1576040805160e560020a62461bcd02815260206004820152601c60248201527f544d3a206475706c69636174652070656e64696e6720616374696f6e00000000604482015290519081900360640190fd5b600654613eb590429063ffffffff613f1f16565b600160a060020a0390971660009081526005602090815260408083208584529091529020879055509694955050505050565b6000808267ffffffffffffffff16118015613f0b5750428267ffffffffffffffff16105b15613f17575081613a6c565b509192915050565b600082820183811015613a6c57600080fd5b611884826fffffffffffffffffffffffffffffffff8361428a565b6040517f190000000000000000000000000000000000000000000000000000000000000060208083018281526000602185018190526c01000000000000000000000000600160a060020a03808e16820260228801528c16026036860152604a85018a90528851909485938d938d938d938d938d938d938d939192606a909201918701908083835b60208310613ff25780518252601f199092019160209182019101613fd3565b51815160209384036101000a600019018019909216911617905292019586525084810193909352506040808401919091528051808403820181526060840182528051908301207f19457468657265756d205369676e6564204d6573736167653a0a3332000000006080850152609c808501919091528151808503909101815260bc909301905281519101209e9d5050505050505050505050505050565b60006119348484614826565b600060248251101515156140f9576040805160e560020a62461bcd02815260206004820152601660248201527f524d3a20496e76616c6964206461746157616c6c657400000000000000000000604482015290519081900360640190fd5b5060240151600160a060020a0391821691161490565b600192915050565b600080831180156141285750600082115b80156141ee575082840285600160a060020a031631108061415b57506141598561415187611d02565b85870261466b565b155b806141ee5750604080517fd6eb1bbf0000000000000000000000000000000000000000000000000000000081523060048201529051600160a060020a0387169163d6eb1bbf916024808301926020929190829003018186803b1580156141c057600080fd5b505afa1580156141d4573d6000803e3d6000fd5b505050506040513d60208110156141ea57600080fd5b5051155b156141fb57506000611934565b506001949350505050565b600080614215848460006139c8565b9050614221868261351b565b9695505050505050565b618f0885016000851180156142405750600083115b801561424c5750838111155b1561117b573a851115614260573a02614263565b84025b61426d8782613911565b50610e5587838360206040519081016040528060008152506143e8565b600160a060020a0383166000908152600360205260408120600181015490919067ffffffffffffffff16811080156142d1575060018201544267ffffffffffffffff909116105b6142ee5781546fffffffffffffffffffffffffffffffff16614317565b815470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff165b82546fffffffffffffffffffffffffffffffff868116700100000000000000000000000000000000028184166fffffffffffffffffffffffffffffffff1990931692909217161783559050614372428463ffffffff613f1f16565b60018301805467ffffffffffffffff191667ffffffffffffffff929092169190911790556143a04284613f1f565b67ffffffffffffffff168486600160a060020a03167f8a747eae44b6307d1b112c127968367d02d9f52ffef8533b3e899983ff2b1d4a60405160405180910390a45050505050565b6060600085600160a060020a03168585856040516024018084600160a060020a0316600160a060020a0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561445757818101518382015260200161443f565b50505050905090810190601f1680156144845780820380516001836020036101000a031916815260200191505b5060408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8f6f033200000000000000000000000000000000000000000000000000000000178152905182519297509550859450925090508083835b602083106145105780518252601f1990920191602091820191016144f1565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614572576040519150601f19603f3d011682016040523d82523d6000602084013e614577565b606091505b509250905080801561458a575060008251115b156145f7578180602001905160208110156145a457600080fd5b8101908080516401000000008111156145bc57600080fd5b820160208101848111156145cf57600080fd5b81516401000000008111828201871017156145e957600080fd5b509095506146629350505050565b60008251111561460b573d6000803e3d6000fd5b801515614662576040805160e560020a62461bcd02815260206004820152601a60248201527f424d3a2077616c6c657420696e766f6b65207265766572746564000000000000604482015290519081900360640190fd5b50949350505050565b60006fffffffffffffffffffffffffffffffff83141561468d57506001613a6c565b600160a060020a038416600090815260036020526040902060020180544270010000000000000000000000000000000090910467ffffffffffffffff1610156146db57505081811115613a6c565b80546fffffffffffffffffffffffffffffffff1683018410801590614715575080546fffffffffffffffffffffffffffffffff1683810110155b915050613a6c565b6fffffffffffffffffffffffffffffffff8281161461290c57600160a060020a038316600090815260036020526040902060020180544270010000000000000000000000000000000090910467ffffffffffffffff1610156147ef5780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000042620151800167ffffffffffffffff1602176fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff8316178155612740565b80546fffffffffffffffffffffffffffffffff8082168401166fffffffffffffffffffffffffffffffff1990911617815550505050565b600160a060020a038216600090815260026020526040812054821161484d57506000611286565b7001000000000000000000000000000000006fffffffffffffffffffffffffffffffff19831604436127100181111561488a576000915050611286565b5050600160a060020a039190911660009081526002602052604090205560019056fe524d3a207468652077616c6c657420617574686f72697a656420697320646966666572656e74207468656e2074686520746172676574206f66207468652072656c617965642064617461544d3a2043616c6c20636f6e74726163742061626f7665206461696c79206c696d697454543a207472616e73666572206f757473696465206f662074686520657865637574696f6e2077696e646f77424d3a206d75737420626520616e206f776e657220666f72207468652077616c6c6574a165627a7a72305820d4581618ef509331176c22d93961eaece70c220f5a286e8b1b3885e6273b83e60029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c17d432bd8e8850fd7b32b0270f5afac65db0105000000000000000000000000391f0e86da951c03b1183c60b195090671adea8800000000000000000000000044da3a8051ba88eab0440db3779cab9d679ae76f000000000000000000000000e8a76d2f37fe50b6a95d27fb92291fe0b57407d30000000000000000000000000000000000000000000000000000000000015180000000000000000000000000000000000000000000000000000000000000a8c00000000000000000000000000000000000000000000000008ac7230489e80000000000000000000000000000df6767a7715381867738cf211290f61697ecd938
-----Decoded View---------------
Arg [0] : _registry (address): 0xc17D432Bd8e8850Fd7b32B0270f5AfAc65DB0105
Arg [1] : _transferStorage (address): 0x391f0e86dA951C03b1183C60b195090671ADea88
Arg [2] : _guardianStorage (address): 0x44DA3A8051bA88EAB0440DB3779cAB9D679ae76f
Arg [3] : _priceProvider (address): 0xE8a76D2f37Fe50B6A95d27FB92291Fe0B57407d3
Arg [4] : _securityPeriod (uint256): 86400
Arg [5] : _securityWindow (uint256): 43200
Arg [6] : _defaultLimit (uint256): 10000000000000000000
Arg [7] : _oldLimitManager (address): 0xdf6767A7715381867738cF211290F61697ecd938
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 000000000000000000000000c17d432bd8e8850fd7b32b0270f5afac65db0105
Arg [1] : 000000000000000000000000391f0e86da951c03b1183c60b195090671adea88
Arg [2] : 00000000000000000000000044da3a8051ba88eab0440db3779cab9d679ae76f
Arg [3] : 000000000000000000000000e8a76d2f37fe50b6a95d27fb92291fe0b57407d3
Arg [4] : 0000000000000000000000000000000000000000000000000000000000015180
Arg [5] : 000000000000000000000000000000000000000000000000000000000000a8c0
Arg [6] : 0000000000000000000000000000000000000000000000008ac7230489e80000
Arg [7] : 000000000000000000000000df6767a7715381867738cf211290f61697ecd938
Deployed Bytecode Sourcemap
35439:19668:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35439:19668:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36254:29;;;:::i;:::-;;;;;;;;;;;;;;;;44158:1450;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;44158:1450:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;44158:1450:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;44158:1450: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;-1:-1;44158:1450:0;;-1:-1:-1;44158:1450:0;-1:-1:-1;44158:1450:0;:::i;:::-;;41491:1191;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;41491:1191:0;;;;;;;;;;;;;;;;;;;;;;:::i;51400:377::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;51400:377:0;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;51400:377:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;51400:377: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;51400:377:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;51400:377:0;;-1:-1:-1;51400:377:0;;-1:-1:-1;;;;;51400:377:0:i;:::-;;;;;;;;;;;;;;;;;;;38201:1479;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38201:1479:0;-1:-1:-1;;;;;38201:1479:0;;:::i;50829:272::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;50829:272:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;50829:272:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;50829:272: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;50829:272:0;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;50829:272:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;50829:272: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;-1:-1;50829:272:0;;-1:-1:-1;50829:272:0;-1:-1:-1;50829:272:0;:::i;15037:133::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15037:133:0;-1:-1:-1;;;;;15037:133:0;;:::i;40100:1076::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;40100:1076:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;40100:1076:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;40100:1076: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;-1:-1;40100:1076:0;;-1:-1:-1;40100:1076:0;-1:-1:-1;40100:1076:0;:::i;27175:257::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27175:257:0;-1:-1:-1;;;;;27175:257:0;;:::i;45778:550::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;45778:550:0;;;;;;;;;;:::i;22522:252::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;22522:252:0;;;;;;;;;;:::i;47429:929::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;47429:929:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;47429:929:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;47429:929: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;47429:929:0;;-1:-1:-1;47429:929:0;-1:-1:-1;47429:929:0;;:::i;28661:693::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28661:693:0;-1:-1:-1;;;;;28661:693:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;36189:29;;;:::i;36504:35::-;;;:::i;:::-;;;;-1:-1:-1;;;;;36504:35:0;;;;;;;;;;;;;;36316:38;;;:::i;9657:176::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9657:176:0;-1:-1:-1;;;;;9657:176:0;;:::i;28058:344::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28058:344:0;-1:-1:-1;;;;;28058:344:0;;:::i;49406:158::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;49406:158:0;-1:-1:-1;;;;;49406:158:0;;:::i;13583:1339::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;13583:1339:0;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;13583:1339:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;13583: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;13583:1339:0;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;13583:1339:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;13583: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;13583:1339:0;;-1:-1:-1;13583:1339:0;-1:-1:-1;13583:1339:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;49026:186;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;49026:186:0;;;;;;;;:::i;48366:413::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;48366:413:0;;;;;;;;:::i;49778:312::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;49778:312:0;;;;;;;;;;:::i;36394:39::-;;;:::i;11570:49::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11570:49:0;-1:-1:-1;;;;;11570:49:0;;:::i;22066:158::-;;;:::i;50338:194::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;50338:194:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;24746:27;;;:::i;46506:395::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;46506:395:0;;;;;;;;;;:::i;27637:211::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27637:211:0;-1:-1:-1;;;;;27637:211:0;;:::i;42956:772::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;42956:772:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;42956:772:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;42956:772: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;-1:-1;42956:772:0;;-1:-1:-1;42956:772:0;-1:-1:-1;42956:772:0;:::i;36254:29::-;;;;:::o;44158:1450::-;44384:7;8292:10;8314:4;8292:27;;:59;;;8323:28;8331:7;8340:10;8323:7;:28::i;:::-;8284:107;;;;;;-1:-1:-1;;;;;8284:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7476:15;;:33;;;;;;-1:-1:-1;;;;;7476:33:0;;;;;;;;;44419:7;;7476:15;;;;;:24;;:33;;;;;;;;;;;;;;;:15;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;7476:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7476:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7476:33:0;7475:34;7467:74;;;;;-1:-1:-1;;;;;7467:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;44530:41;44552:7;44561:9;44530:21;:41::i;:::-;44587:33;44601:7;44610:9;44587:13;:33::i;:::-;44584:1017;;;44637:51;44652:7;44661:6;44669:9;44680:7;44637:14;:51::i;:::-;44703:44;44718:7;44727:9;44738:1;44741:5;;44703:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;44703:14:0;;-1:-1:-1;;;44703:44:0:i;:::-;44584:1017;;;44853:52;;;;;;-1:-1:-1;;;;;44853:52:0;;;;;;;;;;;;;;;;44826:24;;44853:23;;;;;:52;;;;;;;;;;;;;;:23;:52;;;5:2:-1;;;;30:1;27;20:12;5:2;44853:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44853:52:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44853:52:0;;-1:-1:-1;44923:27:0;;;44920:670;;45015:44;45030:7;45039:9;45050:1;45053:5;;45015:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;45015:14:0;;-1:-1:-1;;;45015:44:0:i;:::-;44920:670;;;45246:13;;:42;;;;;;45180:26;;;45246:42;;;;;;-1:-1:-1;;;;;45246:42:0;;;;;;;;;45180:26;;45167:10;;45246:13;;:27;;:42;;;;;;;;;;;;;;:13;:42;;;5:2:-1;;;;30:1;27;20:12;5:2;45246:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45246:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45246:42:0;;-1:-1:-1;45315:45:0;45340:7;45246:42;45315:24;:45::i;:::-;45307:87;;;;;;;-1:-1:-1;;;;;45307:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;45460:51;45475:7;45484:6;45492:9;45503:7;45460:14;:51::i;:::-;45530:44;45545:7;45554:9;45565:1;45568:5;;45530:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;45530:14:0;;-1:-1:-1;;;45530:44:0:i;:::-;44920:670;;;44584:1017;;8402:1;44158:1450;;;;;;;:::o;41491:1191::-;41670:7;8292:10;8314:4;8292:27;;:59;;;8323:28;8331:7;8340:10;8323:7;:28::i;:::-;8284:107;;;;;;-1:-1:-1;;;;;8284:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7476:15;;:33;;;;;;-1:-1:-1;;;;;7476:33:0;;;;;;;;;41705:7;;7476:15;;;;;:24;;:33;;;;;;;;;;;;;;;:15;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;7476:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7476:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7476:33:0;7475:34;7467:74;;;;;-1:-1:-1;;;;;7467:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;41733:32;41747:7;41756:8;41733:13;:32::i;:::-;41730:945;;;41819:50;41834:7;41843:6;41851:8;41861:7;41819:14;:50::i;:::-;41730:945;;;41975:51;;;;;;-1:-1:-1;;;;;41975:51:0;;;;;;;;;;;;;;;;41948:24;;41975:23;;;;;:51;;;;;;;;;;;;;;:23;:51;;;5:2:-1;;;;30:1;27;20:12;5:2;41975:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41975:51:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41975:51:0;;-1:-1:-1;42044:27:0;;;42041:623;;42147:50;42162:7;42171:6;42179:8;42189:7;42147:14;:50::i;:::-;42041:623;;;42384:13;;:42;;;;;;42318:26;;;42384:42;;;;;;-1:-1:-1;;;;;42384:42:0;;;;;;;;;42318:26;;42305:10;;42384:13;;:27;;:42;;;;;;;;;;;;;;:13;:42;;;5:2:-1;;;;30:1;27;20:12;5:2;42384:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42384:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42384:42:0;;-1:-1:-1;42453:45:0;42478:7;42384:42;42453:24;:45::i;:::-;42445:87;;;;;;;-1:-1:-1;;;;;42445:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;42598:50;42613:7;42622:6;42630:8;42640:7;42598:14;:50::i;42041:623::-;41730:945;;8402:1;41491:1191;;;;;:::o;51400:377::-;51517:17;;51490:6;;51538:2;51517:23;51509:64;;;;;-1:-1:-1;;;;;51509:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;51584:14;51601:38;51615:8;51625:10;51637:1;51601:13;:38::i;:::-;51584:55;;51658:39;51677:10;51690:6;51658:7;:39::i;:::-;51650:70;;;;;;;-1:-1:-1;;;;;51650:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;35775:44:0;;;;;;;;;;;;;;;;51400:377;;;;;:::o;38201:1479::-;38253:7;8028:10;-1:-1:-1;;;;;8028:30:0;;;8020:68;;;;;-1:-1:-1;;;;;8020:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;35660:42;;;;;;;;;;;;;;;;38306:70;;;38339:4;38306:70;;;;;;;;;;;;-1:-1:-1;;;;;38306:24:0;;;;;:70;;;;;-1:-1:-1;;38306:70:0;;;;;;;-1:-1:-1;38306:24:0;:70;;;5:2:-1;;;;30:1;27;20:12;5:2;38306:70:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;35775:44:0;;;;;;;;;;;;;;;;38387:72;;;38420:4;38387:72;;;;;;;;;;;;-1:-1:-1;;;;;38387:24:0;;;-1:-1:-1;38387:24:0;;-1:-1:-1;38387:72:0;;;;;-1:-1:-1;;38387:72:0;;;;;;;-1:-1:-1;38387:24:0;:72;;;5:2:-1;;;;30:1;27;20:12;5:2;38387:72:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;38534:15:0;;-1:-1:-1;;;;;38534:15:0;38526:38;38523:110;;-1:-1:-1;38523:110:0;;-1:-1:-1;38523:110:0;38581:19;38592:7;38581:10;:19::i;:::-;38615:7;;38523:110;38710:15;;:40;;;;;;-1:-1:-1;;;;;38710:40:0;;;;;;;;;38692:15;;38710;;;;;:31;;:40;;;;;;;;;;;;;;;:15;:40;;;5:2:-1;;;;30:1;27;20:12;5:2;38710:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38710:40:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38710:40:0;38801:15;;:40;;;;;;-1:-1:-1;;;;;38801:40:0;;;;;;;;;38710;;-1:-1:-1;38762:15:0;;;;38801;;;;;:31;;:40;;;;;;;;;;;:15;:40;;;5:2:-1;;;;30:1;27;20:12;5:2;38801:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38801:40:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38801:40:0;;;;;;;;;-1:-1:-1;38801:40:0;-1:-1:-1;38903:12:0;;:32;;;;-1:-1:-1;38919:16:0;;;;38903:32;38900:104;;;38952:19;38963:7;38952:10;:19::i;:::-;38986:7;;;;;38900:104;39084:7;39073;:18;39070:236;;;-1:-1:-1;;;;;39108:24:0;;;;;;:6;:24;;;;;:57;;-1:-1:-1;;39108:57:0;;;;;;;39070:236;;;39240:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39207:24:0;;-1:-1:-1;39207:24:0;;;:6;:24;;;;;;;:87;;;;;;;;;;;;;-1:-1:-1;;39207:87:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;39207:87:0;;;;;;39070:236;39422:15;;:40;;;;;;-1:-1:-1;;;;;39422:40:0;;;;;;;;;39385:15;;;;39422;;;:31;;:40;;;;;;;;;;;;:15;:40;;;5:2:-1;;;;30:1;27;20:12;5:2;39422:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39422:40:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39422:40:0;;;;;;;;;-1:-1:-1;39422:40:0;-1:-1:-1;39551:3:0;39539:15;;;;39536:137;;;39609:52;;;;;;;;;;39628:20;:7;39640;39628:20;:11;:20;:::i;:::-;39609:52;;;;;;;;;;;;;;;-1:-1:-1;;;;;39571:24:0;;-1:-1:-1;39571:24:0;;;:6;:24;;;;;:90;;:35;;;;:90;;;;;;;-1:-1:-1;;39571:90:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;8099:1:0;38201:1479;;:::o;50829:272::-;50927:6;50946:15;50991:5;;50974:23;;;;;;;30:3:-1;22:6;14;1:33;57:3;49:6;45:16;35:26;;50974:23:0;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;50974:23:0;;;50964:34;;;;;;50946:52;;51009:37;51026:7;51035:10;;51009:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;51009:16:0;;-1:-1:-1;;;51009:37:0:i;:::-;-1:-1:-1;;35660:42:0;;;;;;;;;;;;;;;;;-1:-1:-1;50829:272:0;;;;;;;:::o;15037:133::-;-1:-1:-1;;;;;15131:25:0;15098:13;15131:25;;;:7;:25;;;;;:31;;15037:133::o;40100:1076::-;40306:7;8292:10;8314:4;8292:27;;:59;;;8323:28;8331:7;8340:10;8323:7;:28::i;:::-;8284:107;;;;;;-1:-1:-1;;;;;8284:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7476:15;;:33;;;;;;-1:-1:-1;;;;;7476:33:0;;;;;;;;;40341:7;;7476:15;;;;;:24;;:33;;;;;;;;;;;;;;;:15;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;7476:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7476:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7476:33:0;7475:34;7467:74;;;;;-1:-1:-1;;;;;7467:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;40369:27;40383:7;40392:3;40369:13;:27::i;:::-;40366:803;;;40451:48;40462:7;40471:6;40479:3;40484:7;40493:5;;40451:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;40451:10:0;;-1:-1:-1;;;40451:48:0:i;40366:803::-;40541:19;-1:-1:-1;;;;;40564:19:0;;32710:42;40564:19;40563:78;;40597:13;;:44;;;;;;;;;;;;-1:-1:-1;;;;;40597:44:0;;;;;;;;;:13;;;;;:27;;:44;;;;;;;;;;;;;;:13;:44;;;5:2:-1;;;;30:1;27;20:12;5:2;40597:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40597:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40597:44:0;40563:78;;;40587:7;40563:78;40541:100;;40660:46;40685:7;40694:11;40660:24;:46::i;:::-;40656:502;;;40772:48;40783:7;40792:6;40800:3;40805:7;40814:5;;40772:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;40772:10:0;;-1:-1:-1;;;40772:48:0:i;40656:502::-;40920:10;40932:20;40956:75;40973:19;40994:7;41003:6;41011:3;41016:7;41025:5;;40956:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;40956:16:0;;-1:-1:-1;;;40956:75:0:i;:::-;40919:112;;;;41100:12;41096:2;41086:7;-1:-1:-1;;;;;41055:87:0;;41114:6;41122:3;41127:7;41136:5;;41055:87;;;;-1:-1:-1;;;;;41055:87:0;-1:-1:-1;;;;;41055:87:0;;;;;;-1:-1:-1;;;;;41055:87:0;-1:-1:-1;;;;;41055:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;41055:87:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;41055:87:0;;;;-1:-1:-1;41055:87:0;;-1:-1:-1;;;;;;;41055:87:0;40656:502;;40366:803;8402:1;40100:1076;;;;;;;:::o;27175:257::-;-1:-1:-1;;;;;27297:24:0;;27241:21;27297:24;;;:6;:24;;;;;27375:13;;;27405:17;;;27362:61;;27375:13;;;;;27390;;;;;;27405:17;;27362:12;:61::i;:::-;27354:70;;;27175:257;-1:-1:-1;;;27175:257:0:o;45778:550::-;45907:7;8292:10;8314:4;8292:27;;:59;;;8323:28;8331:7;8340:10;8323:7;:28::i;:::-;8284:107;;;;;;-1:-1:-1;;;;;8284:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7476:15;;:33;;;;;;-1:-1:-1;;;;;7476:33:0;;;;;;;;;45942:7;;7476:15;;;;;:24;;:33;;;;;;;;;;;;;;;:15;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;7476:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7476:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7476:33:0;7475:34;7467:74;;;;;-1:-1:-1;;;;;7467:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;45976:31;45990:7;45999;45976:13;:31::i;:::-;45975:32;45967:75;;;;;-1:-1:-1;;;;;45967:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;46116:22;46141:23;46149:14;;46141:3;:7;;:23;;;;:::i;:::-;46175:15;;:62;;;;;;-1:-1:-1;;;;;46175:62:0;;;;;;;;;;;;;;;;;;;;;;46116:48;;-1:-1:-1;46175:15:0;;;:28;;:62;;;;;:15;;:62;;;;;;;;:15;;:62;;;5:2:-1;;;;30:1;27;20:12;5:2;46175:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;46253:67:0;;;;;;;;;;-1:-1:-1;;;;;46253:67:0;;;;-1:-1:-1;46253:67:0;;;-1:-1:-1;46253:67:0;;;;;;;;;7552:1;8402;45778:550;;;:::o;22522:252::-;22602:7;8292:10;8314:4;8292:27;;:59;;;8323:28;8331:7;8340:10;8323:7;:28::i;:::-;8284:107;;;;;;-1:-1:-1;;;;;8284:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22630:8;;:45;;;;;;-1:-1:-1;;;;;22630:45:0;;;;;;;;;:8;;;;;:27;;:45;;;;;;;;;;;;;;:8;:45;;;5:2:-1;;;;30:1;27;20:12;5:2;22630:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22630:45:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22630:45:0;22622:86;;;;;;;-1:-1:-1;;;;;22622:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;22719:47;;;;;;-1:-1:-1;;;;;22719:47:0;;;;;;;22761:4;22719:47;;;;;;:23;;;;;;:47;;;;;-1:-1:-1;;22719:47:0;;;;;;;;-1:-1:-1;22719:23:0;:47;;;5:2:-1;;;;30:1;27;20:12;5:2;22719:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;47429:929:0;7476:15;;:33;;;;;;-1:-1:-1;;;;;7476:33:0;;;;;;;;;47664:7;;7476:15;;;;;:24;;:33;;;;;;;;;;;;;;;:15;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;7476:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7476:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7476:33:0;7475:34;7467:74;;;;;-1:-1:-1;;;;;7467:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;47689:10;47729:19;47750:6;47758:3;47763:7;47772:5;;47779:6;47712:74;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47712:74:0;-1:-1:-1;;;;;47712:74:0;;;;;;;;-1:-1:-1;;;;;47712:74:0;-1:-1:-1;;;;;47712:74:0;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;57:3;49:6;45:16;35:26;;47712:74:0;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;47712:74:0;;;47702:85;;;;;;47689:98;;47798:17;47818:7;:25;47834:7;-1:-1:-1;;;;;47818:25:0;-1:-1:-1;;;;;47818:25:0;;;;;;;;;;;;:40;;:44;47859:2;47818:44;;;;;;;;;;;;47798:64;;47896:1;47881:12;:16;47873:57;;;;;;;-1:-1:-1;;;;;47873:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;47941:18;47962:32;47979:14;;47962:12;:16;;:32;;;;:::i;:::-;47941:53;;48092:3;48076:12;:19;;:43;;;;;48106:13;48099:3;:20;;48076:43;48068:100;;;;;;-1:-1:-1;;;;;48068:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48186:25:0;;;;;;:7;:25;;;;;;;;:44;;;;;;;;48179:51;;;;48241:48;;;;;;;;;;;;;;;;;;;;;;48202:7;;48261:6;;48269:3;;48274:7;;48241:48;48283:5;;;;;;48241:48;;48283:5;;;;48241:48;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;48241:10:0;;-1:-1:-1;;;48241:48:0:i;:::-;48305:45;;48347:2;;-1:-1:-1;;;;;48305:45:0;;;;;;;;7552:1;;;47429:929;;;;;;;;:::o;28661:693::-;28729:16;28747:17;28777:13;28793:24;28809:7;28793:15;:24::i;:::-;-1:-1:-1;;;;;28857:24:0;;28828:26;28857:24;;;:6;:24;;;;;:35;;28975:17;;28777:40;;-1:-1:-1;28857:35:0;28975:17;;;;;28969:3;:23;28966:381;;;29020:5;29009:16;;29127:3;29133:8;29127:14;29107:35;;28966:381;;;29197:17;;;;;;;;-1:-1:-1;29232:20:0;;:28;-1:-1:-1;29229:107:0;;;29300:20;;;;29292:28;;;-1:-1:-1;29229:107:0;28661:693;;;;;:::o;36189:29::-;;;;:::o;36504:35::-;;;-1:-1:-1;;;;;36504:35:0;;:::o;36316:38::-;;;-1:-1:-1;;;;;36316:38:0;;:::o;9657:176::-;9728:38;;;;;;9760:4;9728:38;;;;;;9715:10;;-1:-1:-1;;;;;9728:23:0;;;;;:38;;;;;;;;;;;;;;;:23;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;9728:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9728:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9728:38:0;9808:8;;;9777:48;;;;;;-1:-1:-1;;;;;9808:8:0;;;9777:48;;;;;;;;;;;;9728:38;;-1:-1:-1;9777:22:0;;;;;;:48;;;;;9728:38;;9777:48;;;;;;;;;;;:22;:48;;;5:2:-1;;;;30:1;27;20:12;5:2;9777:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9777:48:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;9657:176:0:o;28058:344::-;-1:-1:-1;;;;;28203:24:0;;28126:21;28203:24;;;:6;:24;;;;;28322:17;;;;28126:21;;28203:24;28322:17;;28316:3;:23;28315:78;;28389:1;;28315:78;;;28351:13;;28367:17;;;;28351:13;;;;;;;28367:17;;28315:78;28307:87;;;;;28058:344;;;:::o;49406:158::-;49473:7;8292:10;8314:4;8292:27;;:59;;;8323:28;8331:7;8340:10;8323:7;:28::i;:::-;8284:107;;;;;;-1:-1:-1;;;;;8284:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7476:15;;:33;;;;;;-1:-1:-1;;;;;7476:33:0;;;;;;;;;49499:7;;7476:15;;;;;:24;;:33;;;;;;;;;;;;;;;:15;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;7476:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7476:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7476:33:0;7475:34;7467:74;;;;;-1:-1:-1;;;;;7467:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;49519:37;49532:7;49541:14;;49519:12;:37::i;:::-;8402:1;49406:158;;:::o;13583:1339::-;13821:12;13851:13;13867:9;13851:25;;13887:16;13906:84;13926:4;13941:7;13951:1;13954:5;;13906:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;13961:6:0;;-1:-1:-1;13969:9:0;;-1:-1:-1;13980:9:0;;-1:-1:-1;13906:11:0;:84::i;:::-;13887:103;;14009:51;14034:7;14043:6;14051:8;14009:24;:51::i;:::-;14001:85;;;;;;;-1:-1:-1;;;;;14001:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;14105:35;14124:7;14134:5;;14105:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;14105:10:0;;-1:-1:-1;;;14105:35:0:i;:::-;14097:122;;;;;;-1:-1:-1;;;;;14097:122:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14230:26;14259:37;14281:7;14290:5;;14259:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;14259:21:0;;-1:-1:-1;;;14259:37:0:i;:::-;14230:66;-1:-1:-1;14332:2:0;14311:23;;14310:47;;14307:536;;;14377:63;14390:7;14399:9;14410;14421:18;14377:12;:63::i;:::-;14374:458;;;14464:23;;;:84;;;14491:57;14510:7;14519:5;;14491:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;;14491:57:0;;;;137:4:-1;14491:57:0;;;;;;;;;;;;;;;;;14526:8;;-1:-1:-1;14491:57:0;-1:-1:-1;14536:11:0;;;;;;14491:57;;14536:11;;;;14491:57;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;14491:18:0;;-1:-1:-1;;;14491:57:0:i;:::-;14461:356;;;14666:4;-1:-1:-1;;;;;14658:18:0;14677:5;;14658:25;;;;;30:3:-1;22:6;14;1:33;14658:25:0;;45:16:-1;;;-1:-1;14658:25:0;;-1:-1:-1;14658:25:0;;-1:-1:-1;;14658: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;;14645:38:0;;;;;14706:91;14713:7;14733:9;14722:8;:20;14744:9;14755;14766:18;14786:10;14706:6;:91::i;:::-;14858:56;;;;;;;;;;;;-1:-1:-1;;;;;14858:56:0;;;;;;;;;;;;13583:1339;;;;;;;;;;;;;:::o;49026:186::-;49111:7;8292:10;8314:4;8292:27;;:59;;;8323:28;8331:7;8340:10;8323:7;:28::i;:::-;8284:107;;;;;;-1:-1:-1;;;;;8284:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7476:15;;:33;;;;;;-1:-1:-1;;;;;7476:33:0;;;;;;;;;49137:7;;7476:15;;;;;:24;;:33;;;;;;;;;;;;;;;:15;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;7476:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7476:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7476:33:0;7475:34;7467:74;;;;;-1:-1:-1;;;;;7467:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;49157:47;49169:7;49178:9;49189:14;;49157:11;:47::i;48366:413::-;48498:7;8292:10;8314:4;8292:27;;:59;;;8323:28;8331:7;8340:10;8323:7;:28::i;:::-;8284:107;;;;;;-1:-1:-1;;;;;8284:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7476:15;;:33;;;;;;-1:-1:-1;;;;;7476:33:0;;;;;;;;;48533:7;;7476:15;;;;;:24;;:33;;;;;;;;;;;;;;;:15;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;7476:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7476:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7476:33:0;7475:34;7467:74;;;;;-1:-1:-1;;;;;7467:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48566:25:0;;48614:1;48566:25;;;:7;:25;;;;;;;;:45;;;;;;;;;:49;48558:88;;;;;-1:-1:-1;;;;;48558:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48664:25:0;;;;;;:7;:25;;;;;;;;:45;;;;;;;;;48657:52;;;48725:46;48705:3;;48664:25;48725:46;;;8402:1;48366:413;;;:::o;49778:312::-;49913:15;;:46;;;;;;-1:-1:-1;;;;;49913:46:0;;;;;;;;;;;;;;;;49859:19;;;;49913:15;;:28;;:46;;;;;;;;;;;;;;:15;:46;;;5:2:-1;;;;30:1;27;20:12;5:2;49913:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49913:46:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;49913:46:0;;-1:-1:-1;50057:1:0;50040:18;;:42;;;;-1:-1:-1;50079:3:0;-1:-1:-1;50062:20:0;50033:49;-1:-1:-1;;;49778:312:0:o;36394:39::-;;;-1:-1:-1;;;;;36394:39:0;;:::o;11570:49::-;;;;;;;;;;;;;:::o;22066:158::-;22185:31;22066:158;:::o;50338:194::-;-1:-1:-1;;;;;50478:25:0;;;50422:20;50478:25;;;:7;:25;;;;;;;;:45;;;;;;;;;50338:194::o;24746:27::-;;;;:::o;46506:395::-;46640:7;8292:10;8314:4;8292:27;;:59;;;8323:28;8331:7;8340:10;8323:7;:28::i;:::-;8284:107;;;;;;-1:-1:-1;;;;;8284:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7476:15;;:33;;;;;;-1:-1:-1;;;;;7476:33:0;;;;;;;;;46675:7;;7476:15;;;;;:24;;:33;;;;;;;;;;;;;;;:15;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;7476:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7476:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7476:33:0;7475:34;7467:74;;;;;-1:-1:-1;;;;;7467:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;46708:31;46722:7;46731;46708:13;:31::i;:::-;46700:70;;;;;;;-1:-1:-1;;;;;46700:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;46781:15;;:49;;;;;;-1:-1:-1;;;;;46781:49:0;;;;;;;;;;;;;;:15;:49;;;;;;;;:15;;;:28;;:49;;;;;:15;;:49;;;;;;:15;;:49;;;5:2:-1;;;;30:1;27;20:12;5:2;46781:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;46846:47:0;;-1:-1:-1;;;;;46846:47:0;;;;-1:-1:-1;46846:47:0;;;-1:-1:-1;46846:47:0;;;;;8402:1;46506:395;;;:::o;27637:211::-;27703:19;27735:20;27758:24;27774:7;27758:15;:24::i;:::-;27810:30;;;27637:211;-1:-1:-1;;;27637:211:0:o;42956:772::-;43141:7;8292:10;8314:4;8292:27;;:59;;;8323:28;8331:7;8340:10;8323:7;:28::i;:::-;8284:107;;;;;;-1:-1:-1;;;;;8284:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7476:15;;:33;;;;;;-1:-1:-1;;;;;7476:33:0;;;;;;;;;43176:7;;7476:15;;;;;:24;;:33;;;;;;;;;;;;;;;:15;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;7476:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7476:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7476:33:0;7475:34;7467:74;;;;;-1:-1:-1;;;;;7467:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;43287:41;43309:7;43318:9;43287:21;:41::i;:::-;43344:33;43358:7;43367:9;43344:13;:33::i;:::-;43341:380;;;43428:49;43443:7;43452:9;43463:6;43471:5;;43428:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;43428:14:0;;-1:-1:-1;;;43428:49:0:i;43341:380::-;43527:41;43552:7;43561:6;43527:24;:41::i;:::-;43519:89;;;;;;-1:-1:-1;;;;;43519:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43660:49;43675:7;43684:9;43695:6;43703:5;;43660:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;43660:14:0;;-1:-1:-1;;;43660:49:0:i;10018:131::-;10093:4;10136:5;-1:-1:-1;;;;;10117:24:0;:7;-1:-1:-1;;;;;10117:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10117:15:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10117:15:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10117:15:0;-1:-1:-1;;;;;10117:24:0;;;10018:131;-1:-1:-1;;;10018:131:0:o;53226:442::-;53364:7;-1:-1:-1;;;;;53343:29:0;:9;-1:-1:-1;;;;;53343:29:0;;;:101;;;;;53415:7;-1:-1:-1;;;;;53415:18:0;;53434:9;53415:29;;;;;;;;;;;;;-1:-1:-1;;;;;53415:29:0;-1:-1:-1;;;;;53415:29:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53415:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53415:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53415:29:0;53414:30;53343:101;:218;;;;-1:-1:-1;53490:13:0;;:37;;;;;;-1:-1:-1;;;;;53490:37:0;;;;;;;;;:13;;;;;:26;;:37;;;;;;;;;;;;;;:13;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;53490:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53490:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53490:37:0;:42;;:70;;;53536:24;53552:7;53536:15;:24::i;:::-;53321:339;;;;;;;-1:-1:-1;;;;;53321:339:0;;;;;;;;;;;;;;;;;;;;;;;;;;;34300:349;34440:69;;;-1:-1:-1;;;;;34440:69:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;34440:69:0;;;;;;;;25:18:-1;;61:17;;34440:69:0;182:15:-1;34440:69:0;179:29:-1;160:49;;34520:53:0;34541:7;34551:6;-1:-1:-1;34440:69:0;34520:12;:53::i;:::-;-1:-1:-1;34589:52:0;;;;;;-1:-1:-1;;;;;34589:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;34300:349;;;;;:::o;34902:257::-;35021:56;35042:7;35052:9;35063:6;35071:5;35021:12;:56::i;:::-;;35126:9;-1:-1:-1;;;;;35093:58:0;35116:7;-1:-1:-1;;;;;35093:58:0;;35137:6;35145:5;35093:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;35093:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34902:257;;;;:::o;29607:471::-;29693:4;29713:12;;29710:28;;;-1:-1:-1;29734:4:0;29727:11;;29710:28;-1:-1:-1;;;;;29771:24:0;;29749:19;29771:24;;;:6;:24;;;;;29843:13;;;29873:17;;;29771:24;;29749:19;29830:61;;29843:13;;;;;29858;;;;;;29873:17;;29830:12;:61::i;:::-;29812:79;;29905:45;29924:7;29933;29905:45;;29942:7;29905:18;:45::i;:::-;29902:146;;;29967:43;29984:7;29993;30002;29967:16;:43::i;:::-;30032:4;30025:11;;;;;;29902:146;-1:-1:-1;30065:5:0;;29607:471;-1:-1:-1;;;;29607:471:0:o;17847:800::-;18376:4;18372:16;;;18346:44;;18367:4;18346:44;;18340:51;18437:4;18416:44;;18410:51;18490:44;;;;18484:51;17953:7;;18537:4;18480:62;;;;;18576:2;18571:7;;;:18;;;18582:1;:7;;18587:2;18582:7;18571:18;18563:27;;;;;;;;18608:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;18608:31:0;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18608:31:0;;;;;;;;18601:38;;;;;17847:800;;;;;;:::o;25331:255::-;25383:7;8028:10;-1:-1:-1;;;;;8028:30:0;;;8020:68;;;;;-1:-1:-1;;;;;8020:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25425:24:0;;25403:19;25425:24;;;:6;:24;;;;;25469:13;;;;:18;:44;;;;-1:-1:-1;25491:17:0;;;;;;:22;25469:44;25466:113;;;25554:12;;25530:37;;-1:-1:-1;;25530:37:0;;;;;;;;-1:-1:-1;;25331:255:0:o;5915:150::-;5973:7;6001:6;;;;5993:15;;;;;;-1:-1:-1;6031:5:0;;;5915:150::o;33517:510::-;-1:-1:-1;;;;;33645:19:0;;32710:42;33645:19;33642:308;;;33681:56;33702:7;33712:3;33717:6;33725:11;;;;;;;;;;;;;33681:12;:56::i;:::-;;33642:308;;;33805:65;;;-1:-1:-1;;;;;33805:65:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;33805:65:0;;;;;;;;25:18:-1;;61:17;;33805:65:0;182:15:-1;33805:65:0;179:29:-1;160:49;;33885:53:0;33906:7;33916:6;-1:-1:-1;33805:65:0;33885:12;:53::i;:::-;;33642:308;;34000:6;33992;-1:-1:-1;;;;;33965:54:0;33982:7;-1:-1:-1;;;;;33965:54:0;;34008:3;34013:5;33965:54;;;;-1:-1:-1;;;;;33965:54:0;-1:-1:-1;;;;;33965:54: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;33965:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33517:510;;;;;:::o;52344:651::-;52570:10;52582:20;52652:7;52661:6;52669:3;52674:7;52683:5;52690:12;52635:68;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52635:68:0;-1:-1:-1;;;;;52635:68:0;;;;;;;;-1:-1:-1;;;;;52635:68:0;-1:-1:-1;;;;;52635:68:0;;;;;;;;;;;;;;;;;;;;;;36:153:-1;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;;;52635:68:0;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;52635:68:0;;;52625:79;;;;;;52620:84;;52723:7;:25;52739:7;-1:-1:-1;;;;;52723:25:0;-1:-1:-1;;;;;52723:25:0;;;;;;;;;;;;:40;;:44;52764:2;52723:44;;;;;;;;;;;;52771:1;52723:49;52715:90;;;;;;;-1:-1:-1;;;;;52715:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;52902:14;;52894:23;;:3;;:23;:7;:23;:::i;:::-;-1:-1:-1;;;;;52928:25:0;;;;;;;:7;:25;;;;;;;;:44;;;;;;;;:59;;;-1:-1:-1;52969:2:0;52879:38;;-1:-1:-1;;;;;52344:651:0:o;32123:303::-;32225:7;32326:1;32311:12;:16;;;:38;;;;;32346:3;32331:12;:18;;;32311:38;32308:85;;;-1:-1:-1;32373:8:0;32366:15;;32308:85;-1:-1:-1;32410:8:0;;32123:303;-1:-1:-1;;32123:303:0:o;6141:150::-;6199:7;6231:5;;;6255:6;;;;6247:15;;;;;26855:148;26942:53;26954:7;26942:53;26979:15;26942:11;:53::i;15775:528::-;16188:94;;16205:10;16188:94;;;;;;;16034:7;16188:94;;;;;;;-1:-1:-1;;;;;16188:94:0;;;;;;;;;;;;;;;;;;;;;;;;16034:7;;;;16226:5;;16233:3;;16238:6;;16246:5;;16253:6;;16261:9;;16272;;16188: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;;16188:94:0;;;;;-1:-1:-1;16188:94:0;;;;;;;-1:-1:-1;16188:94:0;;;;;;;;;;26:21:-1;;;22:32;;6:49;;16188:94:0;;;;;16178:105;;;;;;16090:204;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;16090:204:0;;;;;;16066:229;;;;;;15775:528;-1:-1:-1;;;;;;;;;;;;;;15775:528:0:o;22938:181::-;23051:4;23075:36;23095:7;23104:6;23075:19;:36::i;20677:431::-;20756:4;20797:2;20781:5;:12;:18;;20773:53;;;;;;;-1:-1:-1;;;;;20773:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21045:4:0;21034:16;21028:23;-1:-1:-1;;;;;21079:21:0;;;;;;;20677:431::o;23507:142::-;23640:1;23507:142;;;;:::o;54622:482::-;54736:4;54768:1;54756:9;:13;:32;;;;;54787:1;54773:11;:15;54756:32;:269;;;;;54845:9;54834:8;:20;54815:7;-1:-1:-1;;;;;54807:24:0;;:47;:148;;;;54871:75;54890:7;54899:24;54915:7;54899:15;:24::i;:::-;54936:9;54925:8;:20;54871:18;:75::i;:::-;:84;54807:148;:207;;;-1:-1:-1;54972:33:0;;;;;;54999:4;54972:33;;;;;;-1:-1:-1;;;;;54972:18:0;;;;;:33;;;;;;;;;;;;;;:18;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;54972:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54972:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54972:33:0;:42;54807:207;54753:322;;;-1:-1:-1;55058:5:0;55051:12;;54753:322;-1:-1:-1;55092:4:0;54622:482;;;;;;:::o;23127:372::-;23339:4;23361:14;23378:40;23392:9;23403:11;23416:1;23378:13;:40::i;:::-;23361:57;;23436:24;23444:7;23453:6;23436:7;:24::i;:::-;23429:31;23127:372;-1:-1:-1;;;;;;23127:372:0:o;53830:715::-;54120:5;:16;;54103:14;54150:13;;:32;;;;;54181:1;54167:11;:15;54150:32;:55;;;;;54196:9;54186:6;:19;;54150:55;54147:391;;;54237:11;54225:9;:23;54222:173;;;54287:11;54278:20;54222:173;;;54361:18;;54222:173;54409:41;54434:7;54443:6;54409:24;:41::i;:::-;;54465:61;54486:7;54496:8;54506:6;54514:11;;;;;;;;;;;;;54465:12;:61::i;25943:698::-;-1:-1:-1;;;;;26070:24:0;;26048:19;26070:24;;;:6;:24;;;;;26193:17;;;;26070:24;;26048:19;26193:17;;:21;-1:-1:-1;26193:48:0;;;;-1:-1:-1;26218:17:0;;;;26238:3;26218:17;;;;:23;26193:48;26192:82;;26261:13;;;;26192:82;;;26245:13;;;;;;;26192:82;26285:23;;;26319:34;;;;;26285:23;;;-1:-1:-1;;26285:23:0;;;;;;;26319:34;;;;26174:100;-1:-1:-1;26454:24:0;:3;26462:15;26454:24;:7;:24;:::i;:::-;26427:17;;;:52;;-1:-1:-1;;26427:52:0;;;;;;;;;;;;26607:24;:3;26615:15;26607:7;:24::i;:::-;26558:75;;26589:9;26579:7;-1:-1:-1;;;;;26558:75:0;;;;;;;;;;;25943:698;;;;;:::o;10425:845::-;10531:17;10561:12;10662:7;-1:-1:-1;;;;;10662:12:0;10732:3;10737:6;10745:5;10675:76;;;;;;-1:-1:-1;;;;;10675:76:0;-1:-1:-1;;;;;10675: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;10675:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10675:76:0;;;-1:-1:-1;;26:21;;;22:32;6:49;;10675:76:0;;;49:4:-1;25:18;;61:17;;10675:76:0;182:15:-1;10675:76:0;179:29:-1;160:49;;10662:90:0;;;;10675:76;;-1:-1:-1;10662:90:0;-1:-1:-1;10662:90:0;;-1:-1:-1;25:18;-1:-1;10662:90:0;-1:-1:-1;10662: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;;;10662: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;10644:108:0;-1:-1:-1;10644:108:0;-1:-1:-1;10644:108:0;10766:26;;;;;10791:1;10777:4;:11;:15;10766:26;10763:500;;;10911:4;10900:25;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;10900: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;10900:25:0;;-1:-1:-1;10763:500:0;;-1:-1:-1;;;;10763:500:0;;10961:1;10947:4;:11;:15;10943:320;;;11097:14;11094:1;11091;11076:36;11140:14;11137:1;11130:25;11057:113;11191:7;11190:8;11187:76;;;11215:36;;;-1:-1:-1;;;;;11215:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;11187:76;10425:845;;;;;;;:::o;31284:560::-;31382:4;31403:24;;;31400:67;;;-1:-1:-1;31451:4:0;31444:11;;31400:67;-1:-1:-1;;;;;31506:24:0;;31477:26;31506:24;;;:6;:24;;;;;:35;;31619:17;;31639:3;31619:17;;;;;;:23;31615:222;;;-1:-1:-1;;31667:17:0;;;;31659:26;;31615:222;31726:20;;;;:30;;:40;-1:-1:-1;31726:40:0;;;:98;;-1:-1:-1;31804:20:0;;;;31770:30;;;:54;;31726:98;31718:107;;;;;30335:633;30434:24;;;;;30431:530;;-1:-1:-1;;;;;30504:24:0;;30475:26;30504:24;;;:6;:24;;;;;:35;;30625:17;;30645:3;30625:17;;;;;;:23;30621:329;;;30740:42;;;;;30767:3;30773:8;30767:14;30740:42;;;;-1:-1:-1;;30801:39:0;;;;;;;30621:329;;;30894:40;;;;;;;;;-1:-1:-1;;30894:40:0;;;;;;30431:530;30335:633;;;:::o;17100:473::-;-1:-1:-1;;;;;17213:25:0;;17183:4;17213:25;;;:7;:25;;;;;:31;17203:41;;17200:85;;-1:-1:-1;17268:5:0;17261:12;;17200:85;45:20:-1;-1:-1;;17317:75:0;;25:41:-1;17427:12:0;11556:5;17427:25;17414:38;;17411:82;;;17476:5;17469:12;;;;;17411:82;-1:-1:-1;;;;;;;17503:25:0;;;;;;;;:7;:25;;;;;:40;17561:4;;17100:473::o
Swarm Source
bzzr://d4581618ef509331176c22d93961eaece70c220f5a286e8b1b3885e6273b83e6
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.