Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
PositionTokenLogicV2
Compiler Version
v0.5.8+commit.23d335f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-02-24 */ /** * Copyright 2017-2019, bZeroX, LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0. */ pragma solidity 0.5.8; pragma experimental ABIEncoderV2; /** * @title ERC20Basic * @dev Simpler version of ERC20 interface * See https://github.com/ethereum/EIPs/issues/179 */ contract ERC20Basic { function totalSupply() public view returns (uint256); function balanceOf(address _who) public view returns (uint256); function transfer(address _to, uint256 _value) public returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); } /** * @title ERC20 interface * @dev see https://github.com/ethereum/EIPs/issues/20 */ contract ERC20 is ERC20Basic { function allowance(address _owner, address _spender) public view returns (uint256); function transferFrom(address _from, address _to, uint256 _value) public returns (bool); function approve(address _spender, uint256 _value) public returns (bool); event Approval( address indexed owner, address indexed spender, uint256 value ); } /** * @title EIP20/ERC20 interface * @dev see https://github.com/ethereum/EIPs/issues/20 */ contract EIP20 is ERC20 { string public name; uint8 public decimals; string public symbol; } contract WETHInterface is EIP20 { function deposit() external payable; function withdraw(uint256 wad) external; } /** * @title SafeMath * @dev Math operations with safety checks that throw on error */ library SafeMath { /** * @dev Multiplies two numbers, throws on overflow. */ function mul(uint256 _a, uint256 _b) internal pure returns (uint256 c) { // Gas optimization: this is cheaper than asserting '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; } c = _a * _b; assert(c / _a == _b); return c; } /** * @dev Integer division of two numbers, truncating the quotient. */ function div(uint256 _a, uint256 _b) internal pure returns (uint256) { // assert(_b > 0); // Solidity automatically throws when dividing by 0 // uint256 c = _a / _b; // assert(_a == _b * c + _a % _b); // There is no case in which this doesn't hold return _a / _b; } /** * @dev Integer division of two numbers, rounding up and truncating the quotient */ function divCeil(uint256 _a, uint256 _b) internal pure returns (uint256) { if (_a == 0) { return 0; } return ((_a - 1) / _b) + 1; } /** * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 _a, uint256 _b) internal pure returns (uint256) { assert(_b <= _a); return _a - _b; } /** * @dev Adds two numbers, throws on overflow. */ function add(uint256 _a, uint256 _b) internal pure returns (uint256 c) { c = _a + _b; assert(c >= _a); return c; } } /** * @title Ownable * @dev The Ownable contract has an owner address, and provides basic authorization control * functions, this simplifies the implementation of "user permissions". */ contract Ownable { address public owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev The Ownable constructor sets the original `owner` of the contract to the sender * account. */ constructor() public { owner = msg.sender; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(msg.sender == owner); _; } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param _newOwner The address to transfer ownership to. */ function transferOwnership(address _newOwner) public onlyOwner { _transferOwnership(_newOwner); } /** * @dev Transfers control of the contract to a newOwner. * @param _newOwner The address to transfer ownership to. */ function _transferOwnership(address _newOwner) internal { require(_newOwner != address(0)); emit OwnershipTransferred(owner, _newOwner); owner = _newOwner; } } /** * @title Helps contracts guard against reentrancy attacks. * @author Remco Bloemen <remco@2π.com>, Eenae <[email protected]> * @dev If you mark a function `nonReentrant`, you should also * mark it `external`. */ contract ReentrancyGuard { /// @dev Constant for unlocked guard state - non-zero to prevent extra gas costs. /// See: https://github.com/OpenZeppelin/openzeppelin-solidity/issues/1056 uint256 internal constant REENTRANCY_GUARD_FREE = 1; /// @dev Constant for locked guard state uint256 internal constant REENTRANCY_GUARD_LOCKED = 2; /** * @dev We use a single lock for the whole contract. */ uint256 internal reentrancyLock = REENTRANCY_GUARD_FREE; /** * @dev Prevents a contract from calling itself, directly or indirectly. * If you mark a function `nonReentrant`, you should also * mark it `external`. Calling one `nonReentrant` function from * another is not supported. Instead, you can implement a * `private` function doing the actual work, and an `external` * wrapper marked as `nonReentrant`. */ modifier nonReentrant() { require(reentrancyLock == REENTRANCY_GUARD_FREE, "nonReentrant"); reentrancyLock = REENTRANCY_GUARD_LOCKED; _; reentrancyLock = REENTRANCY_GUARD_FREE; } } contract LoanTokenizationV2 is ReentrancyGuard, Ownable { uint256 internal constant MAX_UINT = 2**256 - 1; string public name; string public symbol; uint8 public decimals; address public bZxContract; address public bZxVault; address public bZxOracle; address public wethContract; address public loanTokenAddress; bool public mintingPaused; bool public burningPaused; // price of token at last user checkpoint mapping (address => uint256) internal checkpointPrices_; function pauseMinting( bool _isPaused) public onlyOwner { mintingPaused = _isPaused; } function pauseBurning( bool _isPaused) public onlyOwner { burningPaused = _isPaused; } } contract PositionTokenStorageV2 is LoanTokenizationV2 { bool internal isInitialized_ = false; address public loanTokenLender; address public tradeTokenAddress; uint256 public leverageAmount; bytes32 public loanOrderHash; uint256 public loanTokenDecimals; uint256 public loanTokenAdjustment; uint256 public tradeTokenDecimals; uint256 public tradeTokenAdjustment; uint256 public initialPrice; bool public shortPosition; mapping (address => uint256) public userSurplus; mapping (address => uint256) public userDeficit; uint256 public totalSurplus; uint256 public totalDeficit; } contract SplittableTokenStorageV2 is PositionTokenStorageV2 { using SafeMath for uint256; event Transfer( address indexed from, address indexed to, uint256 value ); event Approval( address indexed owner, address indexed spender, uint256 value ); event Mint( address indexed minter, address indexed depositAddress, uint256 depositAmount, uint256 tokenAmount, uint256 price ); event Burn( address indexed burner, address indexed withdrawalAddress, uint256 withdrawalAmount, uint256 tokenAmount, uint256 price ); mapping(address => uint256) internal balances; mapping (address => mapping (address => uint256)) internal allowed; uint256 internal totalSupply_; uint256 public splitFactor = 10**18; function totalSupply() public view returns (uint256) { return denormalize(totalSupply_); } function balanceOf( address _owner) public view returns (uint256) { return denormalize(balances[_owner]); } function allowance( address _owner, address _spender) public view returns (uint256) { return denormalize(allowed[_owner][_spender]); } function normalize( uint256 _value) internal view returns (uint256) { return _value .mul(splitFactor) .div(10**18); } function denormalize( uint256 _value) internal view returns (uint256) { return _value .mul(10**18) .div(splitFactor); } } contract SplittableTokenV2 is SplittableTokenStorageV2 { using SafeMath for uint256; function transferFrom( address _from, address _to, uint256 _value) public returns (bool) { uint256 allowanceAmount = denormalize(allowed[_from][msg.sender]); uint256 fromBalance = denormalize(balances[_from]); require(_value <= fromBalance, "insufficient balance"); require(_value <= allowanceAmount, "insufficient allowance"); require(_to != address(0), "invalid address"); balances[_from] = normalize(fromBalance.sub(_value)); if (balanceOf(_from) == 0) { balances[_from] = 0; } balances[_to] = normalize(denormalize(balances[_to]).add(_value)); if (allowanceAmount != MAX_UINT) { allowed[_from][msg.sender] = normalize(allowanceAmount.sub(_value)); if (allowance(_from, msg.sender) == 0) { allowed[_from][msg.sender] = 0; } } emit Transfer(_from, _to, _value); return true; } function transfer( address _to, uint256 _value) public returns (bool) { uint256 fromBalance = denormalize(balances[msg.sender]); require(_value <= fromBalance, "insufficient balance"); require(_to != address(0), "invalid address"); balances[msg.sender] = normalize(fromBalance.sub(_value)); if (balanceOf(msg.sender) == 0) { balances[msg.sender] = 0; } balances[_to] = normalize(denormalize(balances[_to]).add(_value)); emit Transfer(msg.sender, _to, _value); return true; } function approve( address _spender, uint256 _value) public returns (bool) { allowed[msg.sender][_spender] = _value; if (_value != MAX_UINT && allowance(msg.sender, _spender) == 0) { allowed[msg.sender][_spender] = 0; } emit Approval(msg.sender, _spender, _value); return true; } function _mint( address _to, uint256 _tokenAmount) internal { require(_to != address(0), "invalid address"); totalSupply_ = normalize(denormalize(totalSupply_).add(_tokenAmount)); balances[_to] = normalize(denormalize(balances[_to]).add(_tokenAmount)); emit Transfer(address(0), _to, _tokenAmount); } function _burn( address _who, uint256 _tokenAmount) internal { uint256 whoBalance = denormalize(balances[_who]); require(_tokenAmount <= whoBalance, "burn value exceeds balance"); // no need to require value <= totalSupply, since that would imply the // sender's balance is greater than the totalSupply, which *should* be an assertion failure uint256 offsetAmount; balances[_who] = normalize(whoBalance.sub(_tokenAmount)); if (balances[_who] <= 10 || balanceOf(_who) <= 10) { // we can't leave such small balance quantities offsetAmount = balances[_who]; balances[_who] = 0; } uint256 normSupply = denormalize(totalSupply_); if (normSupply > _tokenAmount) { totalSupply_ = normalize(normSupply.sub(_tokenAmount)); if (totalSupply() == 0) { totalSupply_ = 0; balances[_who] = 0; } } else { balances[_who] = 0; totalSupply_ = 0; } if (offsetAmount > 0) { _tokenAmount = _tokenAmount.add(denormalize(offsetAmount)); if (totalSupply_ > offsetAmount) totalSupply_ = totalSupply_.sub(offsetAmount); else { totalSupply_ = 0; } } emit Transfer(_who, address(0), _tokenAmount); } } interface IBZx { function closeLoanPartiallyFromCollateral( bytes32 loanOrderHash, uint256 closeAmount, bytes calldata loanDataBytes) external payable returns (uint256 actualCloseAmount); function withdrawCollateral( bytes32 loanOrderHash, uint256 withdrawAmount) external returns (uint256 amountWithdrawn); function depositCollateral( bytes32 loanOrderHash, address depositTokenAddress, uint256 depositAmount) external returns (bool); function getMarginLevels( bytes32 loanOrderHash, address trader) external view returns ( uint256 initialMarginAmount, uint256 maintenanceMarginAmount, uint256 currentMarginAmount); function getTotalEscrowWithRate( bytes32 loanOrderHash, address trader, uint256 toCollateralRate, uint256 toCollateralPrecision) external view returns ( uint256 netCollateralAmount, uint256 interestDepositRemaining, uint256 loanToCollateralAmount, uint256, // toCollateralRate uint256); // toCollateralPrecision function oracleAddresses( address oracleAddress) external view returns (address); } interface IBZxOracle { function tradeUserAsset( address sourceTokenAddress, address destTokenAddress, address receiverAddress, address returnToSenderAddress, uint256 sourceTokenAmount, uint256 maxDestTokenAmount, uint256 minConversionRate) external returns (uint256 destTokenAmountReceived, uint256 sourceTokenAmountUsed); function setSaneRate( address sourceTokenAddress, address destTokenAddress) external returns (uint256 saneRate); function clearSaneRate( address sourceTokenAddress, address destTokenAddress) external; function getTradeData( address sourceTokenAddress, address destTokenAddress, uint256 sourceTokenAmount) external view returns (uint256 sourceToDestRate, uint256 sourceToDestPrecision, uint256 destTokenAmount); } contract ILoanToken { function getMaxEscrowAmount( uint256 leverageAmount) public view returns (uint256); function marginTradeFromDeposit( uint256 depositAmount, uint256 leverageAmount, uint256 loanTokenSent, uint256 collateralTokenSent, uint256 tradeTokenSent, address trader, address depositTokenAddress, address collateralTokenAddress, address tradeTokenAddress, bytes calldata loanDataBytes) external payable returns (bytes32 loanOrderHash); } interface IWethHelper { function claimEther( address receiver, uint256 amount) external returns (uint256 claimAmount); } contract PositionTokenLogicV2 is SplittableTokenV2 { using SafeMath for uint256; address internal target_; modifier fixedSaneRate { address currentOracle_ = IBZx(bZxContract).oracleAddresses(bZxOracle); IBZxOracle(currentOracle_).setSaneRate( loanTokenAddress, tradeTokenAddress ); _; IBZxOracle(currentOracle_).clearSaneRate( loanTokenAddress, tradeTokenAddress ); } function() external payable {} /* Public functions */ function mintWithEther( address receiver, uint256 maxPriceAllowed) public payable returns (uint256) { return mintWithEther( receiver, maxPriceAllowed, "" ); } function mintWithToken( address receiver, address depositTokenAddress, uint256 depositAmount, uint256 maxPriceAllowed) public returns (uint256) { return mintWithToken( receiver, depositTokenAddress, depositAmount, maxPriceAllowed, "" ); } function burnToToken( address receiver, address burnTokenAddress, uint256 burnAmount, uint256 minPriceAllowed) public returns (uint256) { return burnToToken( receiver, burnTokenAddress, burnAmount, minPriceAllowed, "" ); } function burnToEther( address receiver, uint256 burnAmount, uint256 minPriceAllowed) public returns (uint256) { return burnToEther( receiver, burnAmount, minPriceAllowed, "" ); } // returns the amount of token minted // maxPriceAllowed of 0 will be ignored function mintWithEther( address receiver, uint256 maxPriceAllowed, bytes memory /*loanDataBytes*/) public payable nonReentrant fixedSaneRate returns (uint256) { require(!mintingPaused, "paused"); require(msg.value != 0, "no ether sent"); uint256 netCollateralAmount; uint256 interestDepositRemaining; uint256 toCollateralRate; uint256 toCollateralPrecision; if (totalSupply() != 0) { (netCollateralAmount, interestDepositRemaining, , toCollateralRate, toCollateralPrecision) = IBZx(bZxContract).getTotalEscrowWithRate( loanOrderHash, address(this), 0, 0 ); } uint256 currentPrice = _tokenPrice(netCollateralAmount, interestDepositRemaining); if (maxPriceAllowed != 0) { require( currentPrice <= maxPriceAllowed, "price too high" ); } address _wethContract = wethContract; WETHInterface(_wethContract).deposit.value(msg.value)(); return _mintWithToken( receiver, _wethContract, msg.value, currentPrice, toCollateralRate, toCollateralPrecision, "" // loanDataBytes ); } // returns the amount of token minted // maxPriceAllowed of 0 is ignored function mintWithToken( address receiver, address depositTokenAddress, uint256 depositAmount, uint256 maxPriceAllowed, bytes memory loanDataBytes) public payable nonReentrant fixedSaneRate returns (uint256) { uint256 mintAmount; require(!mintingPaused, "paused"); require(depositAmount != 0, "depositAmount == 0"); uint256 value1; // netCollateralAmount uint256 value2; // interestDepositRemaining uint256 toCollateralRate; uint256 toCollateralPrecision; if (totalSupply() != 0) { (value1, value2, , toCollateralRate, toCollateralPrecision) = IBZx(bZxContract).getTotalEscrowWithRate( loanOrderHash, address(this), 0, 0 ); } uint256 currentPrice = _tokenPrice(value1, value2); if (maxPriceAllowed != 0) { require( currentPrice <= maxPriceAllowed, "price too high" ); } if (msg.value != 0) { value1 = address(this).balance.sub(msg.value); // beforeEtherBalance } if (depositTokenAddress == address(0)) { require(msg.value >= depositAmount, "insufficient ether"); address _wethContract = wethContract; WETHInterface(_wethContract).deposit.value(depositAmount)(); depositTokenAddress = _wethContract; } else { require(ERC20(depositTokenAddress).transferFrom( msg.sender, address(this), depositAmount ), "transfer of token failed"); } mintAmount = _mintWithToken( receiver, depositTokenAddress, depositAmount, currentPrice, toCollateralRate, toCollateralPrecision, loanDataBytes ); if (msg.value != 0) { value2 = address(this).balance; // finalEtherBalance if (value2 > value1) { (bool success,) = msg.sender.call.value(value2 - value1)(""); require(success, "eth refund failed"); } } return mintAmount; } function burnToEther( address receiver, uint256 burnAmount, uint256 minPriceAllowed, bytes memory loanDataBytes) public payable nonReentrant fixedSaneRate returns (uint256) { require(!burningPaused, "paused"); (uint256 tradeTokenAmountOwed, uint256 currentPrice) = _burnToken( burnAmount, minPriceAllowed, loanDataBytes ); if (tradeTokenAmountOwed != 0) { address _wethContract = wethContract; if (_wethContract != tradeTokenAddress) { (uint256 destTokenAmountReceived,) = _tradeUserAsset( tradeTokenAddress, // sourceTokenAddress address(0), // destTokenAddress (address(0) == Ether) receiver, // receiver tradeTokenAmountOwed, // sourceTokenAmount true // throwOnError ); tradeTokenAmountOwed = destTokenAmountReceived; } else { IWethHelper wethHelper = IWethHelper(0x3b5bDCCDFA2a0a1911984F203C19628EeB6036e0); bool success = ERC20(_wethContract).transfer( address(wethHelper), tradeTokenAmountOwed ); if (success) { success = tradeTokenAmountOwed == wethHelper.claimEther(receiver, tradeTokenAmountOwed); } require(success, "transfer of ETH failed"); } } emit Burn( receiver, address(0), tradeTokenAmountOwed, burnAmount, currentPrice ); return tradeTokenAmountOwed; } function burnToToken( address receiver, address burnTokenAddress, uint256 burnAmount, uint256 minPriceAllowed, bytes memory loanDataBytes) public payable nonReentrant fixedSaneRate returns (uint256) { require(!burningPaused, "paused"); (uint256 tradeTokenAmountOwed, uint256 currentPrice) = _burnToken( burnAmount, minPriceAllowed, loanDataBytes ); if (tradeTokenAmountOwed != 0) { if (burnTokenAddress != tradeTokenAddress) { (uint256 destTokenAmountReceived,) = _tradeUserAsset( tradeTokenAddress, // sourceTokenAddress burnTokenAddress, // destTokenAddress receiver, // receiver tradeTokenAmountOwed, // sourceTokenAmount true // throwOnError ); tradeTokenAmountOwed = destTokenAmountReceived; } else { require(ERC20(tradeTokenAddress).transfer( receiver, tradeTokenAmountOwed ), "transfer of loanToken failed"); } } emit Burn( receiver, burnTokenAddress, tradeTokenAmountOwed, burnAmount, currentPrice ); return tradeTokenAmountOwed; } // Sends non-tradeToken and non-loanToken assets to the Oracle fund // These are assets that would otherwise be "stuck" due to a user accidently sending them to the contract function donateAsset( address tokenAddress) external nonReentrant returns (bool) { if (tokenAddress == tradeTokenAddress || tokenAddress == loanTokenAddress) return false; uint256 balance; address token; if (tokenAddress == address(0)) { balance = address(this).balance; if (balance == 0) return false; address _wethContract = wethContract; WETHInterface(_wethContract).deposit.value(balance)(); token = _wethContract; } else { balance = ERC20(tokenAddress).balanceOf(address(this)); if (balance == 0) return false; token = tokenAddress; } require(ERC20(token).transfer( IBZx(bZxContract).oracleAddresses(bZxOracle), balance ), "transfer of token balance failed"); return true; } function transferFrom( address _from, address _to, uint256 _value) public returns (bool) { super.transferFrom( _from, _to, _value ); if (balanceOf(_from) == 0) { checkpointPrices_[_from] = 0; } return true; } function transfer( address _to, uint256 _value) public returns (bool) { super.transfer( _to, _value ); if (balanceOf(msg.sender) == 0) { checkpointPrices_[msg.sender] = 0; } return true; } // depositTokenAddress is swapped to tradeTokenAddress (collateral token) if needed in the protocol // this is callable by anyone that wants to top up the collateral function depositCollateralToLoan( address depositTokenAddress, uint256 depositAmount) external nonReentrant { require(ERC20(depositTokenAddress).transferFrom( msg.sender, address(this), depositAmount ), "transfer of token failed"); uint256 tempAllowance = ERC20(depositTokenAddress).allowance(address(this), bZxVault); if (tempAllowance < depositAmount) { if (tempAllowance != 0) { // reset approval to 0 require(ERC20(depositTokenAddress).approve(bZxVault, 0), "token approval reset failed"); } require(ERC20(depositTokenAddress).approve(bZxVault, MAX_UINT), "token approval failed"); } require(IBZx(bZxContract).depositCollateral( loanOrderHash, depositTokenAddress, depositAmount ), "deposit failed"); } function triggerPosition( address depositTokenAddress, uint256 depositAmount, uint256 rebalanceAmount, bytes memory loanDataBytes) public payable onlyOwner fixedSaneRate { if (depositTokenAddress == address(0)) { depositTokenAddress = tradeTokenAddress; } if (rebalanceAmount != 0 && msg.sender == owner) { IBZx(bZxContract).withdrawCollateral( loanOrderHash, rebalanceAmount ); } uint256 beforeEtherBalance; if (msg.value != 0) { beforeEtherBalance = address(this).balance.sub(msg.value); } _triggerPosition( depositTokenAddress, depositAmount, loanDataBytes ); if (msg.value != 0) { uint256 afterEtherBalance = address(this).balance; if (afterEtherBalance > beforeEtherBalance) { (bool success,) = msg.sender.call.value(afterEtherBalance - beforeEtherBalance)(""); require(success, "eth refund failed"); } } } /* Public View functions */ function tokenPrice() public view returns (uint256 price) { uint256 netCollateralAmount; uint256 interestDepositRemaining; if (totalSupply() != 0) { (netCollateralAmount, interestDepositRemaining,,,) = IBZx(bZxContract).getTotalEscrowWithRate( loanOrderHash, address(this), 0, 0 ); } return _tokenPrice(netCollateralAmount, interestDepositRemaining); } function liquidationPrice() public view returns (uint256 price) { (uint256 initialMarginAmount, uint256 maintenanceMarginAmount,uint256 currentMarginAmount) = IBZx(bZxContract).getMarginLevels( loanOrderHash, address(this)); if (maintenanceMarginAmount == 0) return 0; else if (currentMarginAmount <= maintenanceMarginAmount) return tokenPrice(); uint256 initialPrice; uint256 currentPrice = tokenPrice(); uint256 offset = currentPrice .mul(initialMarginAmount); if (currentMarginAmount >= initialMarginAmount) { offset = offset .mul(currentMarginAmount - initialMarginAmount) .div(10**40); initialPrice = currentPrice .sub(offset); } else { offset = offset .mul(initialMarginAmount - currentMarginAmount) .div(10**40); initialPrice = currentPrice .add(offset); } uint256 initialLeverage = SafeMath.div(10**38, initialMarginAmount); uint256 currentLeverage = SafeMath.div(10**38, currentMarginAmount); price = initialPrice .mul( maintenanceMarginAmount .mul(currentLeverage) .div(10**20) .add(initialLeverage) ) .div(initialLeverage.add(10**18)); } function checkpointPrice( address _user) public view returns (uint256 price) { return normalize(checkpointPrices_[_user]); } function currentLeverage() public view returns (uint256 leverage) { (,,uint256 currentMarginAmount) = IBZx(bZxContract).getMarginLevels( loanOrderHash, address(this)); if (currentMarginAmount == 0) return 0; return SafeMath.div(10**38, currentMarginAmount); } function marketLiquidityForLoan() public view returns (uint256 value) { value = ILoanToken(loanTokenLender).getMaxEscrowAmount(leverageAmount); } function getMaxDepositAmount() public view returns (uint256 value) { value = ILoanToken(loanTokenLender).getMaxEscrowAmount(leverageAmount); if (!shortPosition) { (uint256 sourceToDestRate, uint256 sourceToDestPrecision,) = IBZxOracle(bZxOracle).getTradeData( loanTokenAddress, tradeTokenAddress, MAX_UINT // get best rate ); value = value .mul(sourceToDestRate) .div(sourceToDestPrecision); } } function positionValue( address _owner) public view returns (uint256 value) { value = balanceOf(_owner) .mul(tokenPrice()) .div(tradeTokenAdjustment); if (shortPosition) { (uint256 sourceToDestRate, uint256 sourceToDestPrecision,) = IBZxOracle(bZxOracle).getTradeData( tradeTokenAddress, loanTokenAddress, MAX_UINT // get best rate ); value = value .mul(sourceToDestRate) .div(sourceToDestPrecision); } } function positionTokenPrice() public view returns (uint256 price) { uint256 sourceToDestRate; uint256 sourceToDestPrecision; if (shortPosition) { (sourceToDestRate, sourceToDestPrecision,) = IBZxOracle(bZxOracle).getTradeData( loanTokenAddress, tradeTokenAddress, MAX_UINT // get best rate ); price = sourceToDestRate .mul(10**loanTokenDecimals) .div(sourceToDestPrecision); } else { (sourceToDestRate, sourceToDestPrecision,) = IBZxOracle(bZxOracle).getTradeData( tradeTokenAddress, loanTokenAddress, MAX_UINT // get best rate ); price = sourceToDestRate .mul(10**tradeTokenDecimals) .div(sourceToDestPrecision); } } /* Internal functions */ // returns the amount of token minted function _mintWithToken( address receiver, address depositTokenAddress, uint256 depositAmount, uint256 currentPrice, uint256 toCollateralRate, uint256 toCollateralPrecision, bytes memory loanDataBytes) internal onlyOwner returns (uint256) { if (depositTokenAddress != tradeTokenAddress && depositTokenAddress != loanTokenAddress) { (uint256 destTokenAmountReceived, uint256 depositAmountUsed) = _tradeUserAsset( depositTokenAddress, // sourceTokenAddress tradeTokenAddress, // destTokenAddress address(this), // receiver depositAmount, // sourceTokenAmount true // throwOnError ); if (depositAmount > depositAmountUsed) { require(ERC20(depositTokenAddress).transfer( msg.sender, depositAmount-depositAmountUsed ), "transfer of token failed"); } depositAmount = destTokenAmountReceived; depositTokenAddress = tradeTokenAddress; } // depositAmount must be >= 0.001 deposit token units require(depositAmount >= (10**15 * 10**uint256(decimals) / (depositTokenAddress == tradeTokenAddress ? tradeTokenAdjustment : loanTokenAdjustment) ), "depositAmount too low"); // open position _triggerPosition( depositTokenAddress, depositAmount, loanDataBytes ); // get post-entry supply (uint256 netCollateralAmount, uint256 interestDepositRemaining,,,) = IBZx(bZxContract).getTotalEscrowWithRate( loanOrderHash, address(this), toCollateralRate, toCollateralPrecision ); uint256 postEntrySupply = ERC20(tradeTokenAddress).balanceOf(address(this)) .add(netCollateralAmount) .add(interestDepositRemaining) .mul(tradeTokenAdjustment) .div(currentPrice); require(postEntrySupply > totalSupply(), "supply not added"); uint256 mintAmount = postEntrySupply - totalSupply(); _mint( receiver, mintAmount ); emit Mint( receiver, depositTokenAddress, depositAmount, mintAmount, currentPrice ); checkpointPrices_[receiver] = denormalize(currentPrice); return mintAmount; } function _burnToken( uint256 burnAmount, uint256 minPriceAllowed, bytes memory loanDataBytes) internal returns (uint256 tradeTokenAmountOwed, uint256 currentPrice) { require(burnAmount != 0, "burnAmount == 0"); if (burnAmount > balanceOf(msg.sender)) { burnAmount = balanceOf(msg.sender); } IBZx _bZxContract = IBZx(bZxContract); (uint256 netCollateralAmount, uint256 interestDepositRemaining, , uint256 toCollateralRate, uint256 toCollateralPrecision) = _bZxContract.getTotalEscrowWithRate( loanOrderHash, address(this), 0, 0 ); currentPrice = _tokenPrice(netCollateralAmount, interestDepositRemaining); if (minPriceAllowed != 0) { require( currentPrice >= minPriceAllowed, "price too low" ); } tradeTokenAmountOwed = burnAmount .mul(currentPrice); tradeTokenAmountOwed = tradeTokenAmountOwed .div(tradeTokenAdjustment); uint256 tradeTokenAmountAvailableInContract = ERC20(tradeTokenAddress).balanceOf(address(this)); uint256 preCloseEscrow = tradeTokenAmountAvailableInContract .add(netCollateralAmount); preCloseEscrow = preCloseEscrow .add(interestDepositRemaining); uint256 tmpValue; bool didCallWithdraw; if (tradeTokenAmountAvailableInContract < tradeTokenAmountOwed) { if (burnAmount < totalSupply()) { tmpValue = tradeTokenAmountOwed - tradeTokenAmountAvailableInContract; } else { tmpValue = MAX_UINT; } _closeLoanPartially( _bZxContract, loanOrderHash, tmpValue, loanDataBytes ); tradeTokenAmountAvailableInContract = ERC20(tradeTokenAddress).balanceOf(address(this)); didCallWithdraw = true; } if (tradeTokenAmountAvailableInContract < tradeTokenAmountOwed && burnAmount < totalSupply()) { tmpValue = tradeTokenAmountOwed - tradeTokenAmountAvailableInContract; uint256 collateralWithdrawn = _bZxContract.withdrawCollateral( loanOrderHash, tmpValue ); if (collateralWithdrawn != 0) { tradeTokenAmountAvailableInContract = tradeTokenAmountAvailableInContract.add(collateralWithdrawn); didCallWithdraw = true; } } if (didCallWithdraw) { uint256 slippageLoss; if (burnAmount < totalSupply()) { (netCollateralAmount, interestDepositRemaining,,,) = _bZxContract.getTotalEscrowWithRate( loanOrderHash, address(this), toCollateralRate, toCollateralPrecision ); uint256 postCloseEscrow = tradeTokenAmountAvailableInContract .add(netCollateralAmount); postCloseEscrow = postCloseEscrow .add(interestDepositRemaining); if (postCloseEscrow < preCloseEscrow) { /*uint256 slippageLoss = tradeTokenAmountOwed .mul(preCloseEscrow - postCloseEscrow) .div(netCollateralAmount);*/ slippageLoss = preCloseEscrow - postCloseEscrow; require(tradeTokenAmountOwed > slippageLoss, "slippage too great"); tradeTokenAmountOwed = tradeTokenAmountOwed - slippageLoss; } } else { netCollateralAmount = 0; interestDepositRemaining = 0; } if (tradeTokenAmountOwed > tradeTokenAmountAvailableInContract) { /* // allow at most 5% loss here slippageLoss = tradeTokenAmountOwed .sub(tradeTokenAmountAvailableInContract); slippageLoss = slippageLoss .mul(10**20); slippageLoss = slippageLoss .div(tradeTokenAmountOwed); require( slippageLoss <= (5 * 10**18), "contract value too low" ); */ tradeTokenAmountOwed = tradeTokenAmountAvailableInContract; } } // unless burning the full balance, tradeTokenAmountOwed must be >= 0.001 tradeToken units require(burnAmount == balanceOf(msg.sender) || tradeTokenAmountOwed >= ( 10**15 * 10**uint256(decimals) / tradeTokenAdjustment ), "burnAmount too low"); _burn( msg.sender, burnAmount ); if (totalSupply() == 0 || _tokenPrice(netCollateralAmount, interestDepositRemaining) == 0) { splitFactor = 10**18; currentPrice = initialPrice; } if (balanceOf(msg.sender) != 0) { checkpointPrices_[msg.sender] = denormalize(currentPrice); } else { checkpointPrices_[msg.sender] = 0; } } function _closeLoanPartially( IBZx _bZxContract, bytes32 loanOrderHash, uint256 cloanAmount, bytes memory loanDataBytes) internal { // will revert if the position needs to be liquidated uint256 beforeEtherBalance; if (msg.value != 0) { beforeEtherBalance = address(this).balance.sub(msg.value); } _bZxContract.closeLoanPartiallyFromCollateral.value(msg.value)( loanOrderHash, cloanAmount, loanDataBytes ); if (msg.value != 0) { uint256 afterEtherBalance = address(this).balance; if (afterEtherBalance > beforeEtherBalance) { (bool success,) = msg.sender.call.value(afterEtherBalance - beforeEtherBalance)(""); require(success, "eth refund failed"); } } } function _tradeUserAsset( address sourceTokenAddress, address destTokenAddress, address receiver, uint256 sourceTokenAmount, bool throwOnError) internal returns (uint256 destTokenAmountReceived, uint256 sourceTokenAmountUsed) { address oracleAddress = IBZx(bZxContract).oracleAddresses(bZxOracle); uint256 tempAllowance = ERC20(sourceTokenAddress).allowance(address(this), oracleAddress); if (tempAllowance < sourceTokenAmount) { if (tempAllowance != 0) { // reset approval to 0 require(ERC20(sourceTokenAddress).approve(oracleAddress, 0), "token approval reset failed"); } require(ERC20(sourceTokenAddress).approve(oracleAddress, MAX_UINT), "token approval failed"); } (bool success, bytes memory data) = oracleAddress.call( abi.encodeWithSignature( "tradeUserAsset(address,address,address,address,uint256,uint256,uint256)", sourceTokenAddress, destTokenAddress, receiver, // receiverAddress receiver, // returnToSenderAddress sourceTokenAmount, MAX_UINT, // maxDestTokenAmount 0 // minConversionRate ) ); require(!throwOnError || success, "trade error"); assembly { if eq(success, 1) { destTokenAmountReceived := mload(add(data, 32)) sourceTokenAmountUsed := mload(add(data, 64)) } } } function _triggerPosition( address depositTokenAddress, uint256 depositAmount, bytes memory loanDataBytes) internal { uint256 tradeTokenDeposit = ERC20(tradeTokenAddress).balanceOf(address(this)); uint256 loanTokenDeposit = ERC20(loanTokenAddress).balanceOf(address(this)); if (loanTokenDeposit != 0 || tradeTokenDeposit != 0) { if (depositTokenAddress == tradeTokenAddress) { if (depositAmount == 0 || depositAmount > tradeTokenDeposit) { loanTokenDeposit = loanTokenDeposit; depositAmount = tradeTokenDeposit; } else { loanTokenDeposit = 0; tradeTokenDeposit = depositAmount; } } else if (depositTokenAddress == loanTokenAddress) { if (depositAmount == 0 || depositAmount > loanTokenDeposit) { tradeTokenDeposit = tradeTokenDeposit; depositAmount = loanTokenDeposit; } else { loanTokenDeposit = depositAmount; tradeTokenDeposit = 0; } } else { revert("invalid deposit"); } uint256 msgValue; if (msg.value != 0) { msgValue = address(this).balance; if (msgValue > msg.value) { msgValue = msg.value; } } ILoanToken(loanTokenLender).marginTradeFromDeposit.value(msgValue)( depositAmount, // depositAmount leverageAmount, // leverageAmount loanTokenDeposit, // loanTokenSent tradeTokenDeposit, // collateralTokenSent 0, // tradeTokenSent address(this), // trader depositTokenAddress, // depositTokenAddress tradeTokenAddress, // collateralTokenAddress tradeTokenAddress, // tradeTokenAddress loanDataBytes // loanDataBytes ); } } /* Internal View functions */ function _tokenPrice( uint256 netCollateralAmount, uint256 interestDepositRemaining) internal view returns (uint256) { return totalSupply_ != 0 ? normalize( ERC20(tradeTokenAddress).balanceOf(address(this)) .add(netCollateralAmount) .add(interestDepositRemaining) .mul(tradeTokenAdjustment) .div(totalSupply_) ) : initialPrice; } /* Owner-Only functions */ function handleSplit() public onlyOwner { if (totalSupply() != 0) { splitFactor = splitFactor .mul(initialPrice) .div( tokenPrice() ); } else { splitFactor = 10**18; } } function updateSettings( address settingsTarget, bytes memory callData) public { if (msg.sender != owner) { address _lowerAdmin; address _lowerAdminContract; //keccak256("pToken_LowerAdminAddress") //keccak256("pToken_LowerAdminContract") assembly { _lowerAdmin := sload(0x4d9d6037d7e53fa4549f7e532571af3aa103c886a59baf156ebf80c2b3b99b6e) _lowerAdminContract := sload(0x544cf74df6879599b75c5fbe7afeb236fc89a80fffaa97fdb08f1e24886a2491) } require(msg.sender == _lowerAdmin && settingsTarget == _lowerAdminContract); } address currentTarget = target_; target_ = settingsTarget; (bool result,) = address(this).call(callData); uint256 size; uint256 ptr; assembly { size := returndatasize ptr := mload(0x40) returndatacopy(ptr, 0, size) if eq(result, 0) { revert(ptr, size) } } target_ = currentTarget; assembly { return(ptr, size) } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[],"name":"tradeTokenDecimals","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"depositTokenAddress","type":"address"},{"name":"depositAmount","type":"uint256"}],"name":"depositCollateralToLoan","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"receiver","type":"address"},{"name":"burnTokenAddress","type":"address"},{"name":"burnAmount","type":"uint256"},{"name":"minPriceAllowed","type":"uint256"}],"name":"burnToToken","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"tradeTokenAdjustment","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"receiver","type":"address"},{"name":"burnAmount","type":"uint256"},{"name":"minPriceAllowed","type":"uint256"},{"name":"loanDataBytes","type":"bytes"}],"name":"burnToEther","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"initialPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"settingsTarget","type":"address"},{"name":"callData","type":"bytes"}],"name":"updateSettings","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_isPaused","type":"bool"}],"name":"pauseBurning","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_isPaused","type":"bool"}],"name":"pauseMinting","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"receiver","type":"address"},{"name":"depositTokenAddress","type":"address"},{"name":"depositAmount","type":"uint256"},{"name":"maxPriceAllowed","type":"uint256"}],"name":"mintWithToken","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"handleSplit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"wethContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"loanTokenLender","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"positionValue","outputs":[{"name":"value","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"receiver","type":"address"},{"name":"maxPriceAllowed","type":"uint256"}],"name":"mintWithEther","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"receiver","type":"address"},{"name":"burnAmount","type":"uint256"},{"name":"minPriceAllowed","type":"uint256"}],"name":"burnToEther","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getMaxDepositAmount","outputs":[{"name":"value","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"tokenAddress","type":"address"}],"name":"donateAsset","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"loanTokenAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenPrice","outputs":[{"name":"price","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"burningPaused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bZxVault","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"receiver","type":"address"},{"name":"burnTokenAddress","type":"address"},{"name":"burnAmount","type":"uint256"},{"name":"minPriceAllowed","type":"uint256"},{"name":"loanDataBytes","type":"bytes"}],"name":"burnToToken","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSurplus","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bZxOracle","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalDeficit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bZxContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"splitFactor","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"leverageAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tradeTokenAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"positionTokenPrice","outputs":[{"name":"price","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"liquidationPrice","outputs":[{"name":"price","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"loanTokenAdjustment","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"shortPosition","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"currentLeverage","outputs":[{"name":"leverage","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"userSurplus","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"receiver","type":"address"},{"name":"maxPriceAllowed","type":"uint256"},{"name":"","type":"bytes"}],"name":"mintWithEther","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"userDeficit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"marketLiquidityForLoan","outputs":[{"name":"value","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"mintingPaused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"loanTokenDecimals","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"depositTokenAddress","type":"address"},{"name":"depositAmount","type":"uint256"},{"name":"rebalanceAmount","type":"uint256"},{"name":"loanDataBytes","type":"bytes"}],"name":"triggerPosition","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"_user","type":"address"}],"name":"checkpointPrice","outputs":[{"name":"price","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"loanOrderHash","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"receiver","type":"address"},{"name":"depositTokenAddress","type":"address"},{"name":"depositAmount","type":"uint256"},{"name":"maxPriceAllowed","type":"uint256"},{"name":"loanDataBytes","type":"bytes"}],"name":"mintWithToken","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"minter","type":"address"},{"indexed":true,"name":"depositAddress","type":"address"},{"indexed":false,"name":"depositAmount","type":"uint256"},{"indexed":false,"name":"tokenAmount","type":"uint256"},{"indexed":false,"name":"price","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"burner","type":"address"},{"indexed":true,"name":"withdrawalAddress","type":"address"},{"indexed":false,"name":"withdrawalAmount","type":"uint256"},{"indexed":false,"name":"tokenAmount","type":"uint256"},{"indexed":false,"name":"price","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]
Contract Creation Code
608060405260016000819055600a805460ff19169055670de0b6b3a7640000601b5580546001600160a01b031916331790556158f1806100406000396000f3fe60806040526004361061036b5760003560e01c806389556ccf116101c6578063c20c49ec116100f7578063e1a283d611610095578063eebc50811161006f578063eebc5081146108a1578063f2fde38b146108c1578063f41e4e6a146108e1578063f5acf904146108f65761036b565b8063e1a283d614610864578063eaa0500214610879578063eb4eff5a1461088e5761036b565b8063d24f22a9116100d1578063d24f22a9146107fc578063db72da2c1461080f578063dd0d3e3b1461082f578063dd62ed3e146108445761036b565b8063c20c49ec146107b2578063c85ab793146107c7578063d05daa04146107dc5761036b565b8063a5507b3511610164578063b2aff0fe1161013e578063b2aff0fe1461075e578063b50823df14610773578063b6fc2d5f14610788578063bc29af141461079d5761036b565b8063a5507b3514610714578063a9059cbb14610729578063ab47c2b3146107495761036b565b806395d89b41116101a057806395d89b41146106c057806396c7871b146106d55780639788b5bb146106ea578063995363d3146106ff5761036b565b806389556ccf146106835780638da5cb5b146106965780638eb955e2146106ab5761036b565b806339039497116102a05780635726a3561161023e578063797bf38511610218578063797bf3851461062f5780637ff9b59614610644578063833c1d9514610659578063894ca3081461066e5761036b565b80635726a356146105da57806359e239af146105ef57806370a082311461060f5761036b565b80634858064c1161027a5780634858064c146105725780634de7c7bd146105875780634e07008d146105a7578063546cb17e146105ba5761036b565b8063390394971461051b578063447eed281461053b5780634780eac1146105505761036b565b806318160ddd1161030d578063284e2f56116102e7578063284e2f5614610499578063304c28ee146104b9578063313ce567146104d9578063359803cd146104fb5761036b565b806318160ddd1461044f5780631d0806ae1461046457806323b872dd146104795761036b565b8063095ea7b311610349578063095ea7b3146103da5780630bde6eb714610407578063150d97ff14610427578063179e3fab1461043c5761036b565b806306b1884d1461036d57806306fdde031461039857806308a62230146103ba575b005b34801561037957600080fd5b50610382610909565b60405161038f9190615427565b60405180910390f35b3480156103a457600080fd5b506103ad61090f565b60405161038f919061550c565b3480156103c657600080fd5b5061036b6103d5366004614a3f565b61099a565b3480156103e657600080fd5b506103fa6103f5366004614a3f565b610d14565b60405161038f9190615419565b34801561041357600080fd5b50610382610422366004614909565b610dd2565b34801561043357600080fd5b50610382610dfb565b61038261044a366004614afc565b610e01565b34801561045b57600080fd5b506103826111ef565b34801561047057600080fd5b50610382611202565b34801561048557600080fd5b506103fa6104943660046148bc565b611208565b3480156104a557600080fd5b5061036b6104b43660046149f7565b611248565b3480156104c557600080fd5b5061036b6104d4366004614b69565b611380565b3480156104e557600080fd5b506104ee6113b8565b60405161038f9190615773565b34801561050757600080fd5b5061036b610516366004614b69565b6113c1565b34801561052757600080fd5b50610382610536366004614909565b611407565b34801561054757600080fd5b5061036b611425565b34801561055c57600080fd5b5061056561148c565b60405161038f91906152e5565b34801561057e57600080fd5b5061056561149b565b34801561059357600080fd5b506103826105a2366004614846565b6114af565b6103826105b5366004614a3f565b6115a0565b3480156105c657600080fd5b506103826105d5366004614aca565b6115bc565b3480156105e657600080fd5b506103826115d9565b3480156105fb57600080fd5b506103fa61060a366004614846565b611729565b34801561061b57600080fd5b5061038261062a366004614846565b6119e8565b34801561063b57600080fd5b50610565611a0a565b34801561065057600080fd5b50610382611a19565b34801561066557600080fd5b506103fa611ace565b34801561067a57600080fd5b50610565611ade565b61038261069136600461496a565b611aed565b3480156106a257600080fd5b50610565611e2c565b3480156106b757600080fd5b50610382611e3b565b3480156106cc57600080fd5b506103ad611e41565b3480156106e157600080fd5b50610565611e9c565b3480156106f657600080fd5b50610382611eab565b34801561070b57600080fd5b50610565611eb1565b34801561072057600080fd5b50610382611ec5565b34801561073557600080fd5b506103fa610744366004614a3f565b611ecb565b34801561075557600080fd5b50610382611eff565b34801561076a57600080fd5b50610565611f05565b34801561077f57600080fd5b50610382611f14565b34801561079457600080fd5b5061038261209a565b3480156107a957600080fd5b506103826122ac565b3480156107be57600080fd5b506103fa6122b2565b3480156107d357600080fd5b506103826122bb565b3480156107e857600080fd5b506103826107f7366004614846565b61237b565b61038261080a366004614a6f565b61238d565b34801561081b57600080fd5b5061038261082a366004614846565b61270f565b34801561083b57600080fd5b50610382612721565b34801561085057600080fd5b5061038261085f366004614882565b6127ac565b34801561087057600080fd5b506103fa6127dd565b34801561088557600080fd5b506103826127ed565b61036b61089c366004614afc565b6127f3565b3480156108ad57600080fd5b506103826108bc366004614846565b612b21565b3480156108cd57600080fd5b5061036b6108dc366004614846565b612b43565b3480156108ed57600080fd5b50610382612b66565b61038261090436600461496a565b612b6c565b60105481565b6002805460408051602060018416156101000260001901909316849004601f810184900484028201840190925281815292918301828280156109925780601f1061096757610100808354040283529160200191610992565b820191906000526020600020905b81548152906001019060200180831161097557829003601f168201915b505050505081565b6001600054146109c857604051600160e51b62461bcd0281526004016109bf9061564d565b60405180910390fd5b6002600055604051600160e01b6323b872dd0281526001600160a01b038316906323b872dd90610a009033903090869060040161531c565b602060405180830381600087803b158015610a1a57600080fd5b505af1158015610a2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610a529190810190614b87565b610a7157604051600160e51b62461bcd0281526004016109bf9061552d565b600554604051600160e11b636eb1769f0281526000916001600160a01b038086169263dd62ed3e92610aaa923092911690600401615301565b60206040518083038186803b158015610ac257600080fd5b505afa158015610ad6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610afa9190810190614ba5565b905081811015610c5d578015610bb357600554604051600160e01b63095ea7b30281526001600160a01b038581169263095ea7b392610b4292909116906000906004016153f0565b602060405180830381600087803b158015610b5c57600080fd5b505af1158015610b70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610b949190810190614b87565b610bb357604051600160e51b62461bcd0281526004016109bf9061553d565b600554604051600160e01b63095ea7b30281526001600160a01b038581169263095ea7b392610bec92909116906000199060040161540b565b602060405180830381600087803b158015610c0657600080fd5b505af1158015610c1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610c3e9190810190614b87565b610c5d57604051600160e51b62461bcd0281526004016109bf9061557d565b60048054600d54604051600160e01b6352cccdb30281526101009092046001600160a01b0316926352cccdb392610c99929188918891016154c3565b602060405180830381600087803b158015610cb357600080fd5b505af1158015610cc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610ceb9190810190614b87565b610d0a57604051600160e51b62461bcd0281526004016109bf9061565d565b5050600160005550565b3360009081526019602090815260408083206001600160a01b038616845290915281208290556000198214801590610d535750610d5133846127ac565b155b15610d7d573360009081526019602090815260408083206001600160a01b03871684529091528120555b826001600160a01b0316336001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610dc09190615427565b60405180910390a35060015b92915050565b6000610df08585858560405180602001604052806000815250611aed565b90505b949350505050565b60115481565b6000600160005414610e2857604051600160e51b62461bcd0281526004016109bf9061564d565b6002600090815560048054600654604051600160e11b6338f5892f0281526001600160a01b036101009093048316936371eb125e93610e69931691016152e5565b60206040518083038186803b158015610e8157600080fd5b505afa158015610e95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610eb99190810190614864565b600854600b54604051600160e21b632b337b330281529293506001600160a01b038085169363accdeccc93610ef69390831692169060040161535f565b602060405180830381600087803b158015610f1057600080fd5b505af1158015610f24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610f489190810190614ba5565b50600854600160a81b900460ff1615610f7657604051600160e51b62461bcd0281526004016109bf906156ad565b600080610f8487878761302e565b915091508160001461112157600754600b546001600160a01b0391821691168114610fd057600b54600090610fc6906001600160a01b0316828c8760016135a0565b50935061111f9050565b604051600160e01b63a9059cbb028152733b5bdccdfa2a0a1911984f203c19628eeb6036e0906000906001600160a01b0384169063a9059cbb9061101a908590899060040161540b565b602060405180830381600087803b15801561103457600080fd5b505af1158015611048573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061106c9190810190614b87565b905080156110fc57604051600160e41b630bfcf63b0281526001600160a01b0383169063bfcf63b0906110a5908e90899060040161540b565b602060405180830381600087803b1580156110bf57600080fd5b505af11580156110d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506110f79190810190614ba5565b851490505b8061111c57604051600160e51b62461bcd0281526004016109bf906155ed565b50505b505b60006001600160a01b0316886001600160a01b03167f4cf25bc1d991c17529c25213d3cc0cda295eeaad5f13f361969b12ea48015f90848a85604051611169939291906156bd565b60405180910390a3509150600854600b54604051600160e01b63e54699c10281526001600160a01b038085169363e54699c1936111ae9391831692169060040161535f565b600060405180830381600087803b1580156111c857600080fd5b505af11580156111dc573d6000803e3d6000fd5b5050600160005550919695505050505050565b60006111fc601a54613909565b90505b90565b60125481565b600061121584848461392b565b5061121f846119e8565b61123d576001600160a01b0384166000908152600960205260408120555b5060015b9392505050565b6001546001600160a01b031633146112d3577f4d9d6037d7e53fa4549f7e532571af3aa103c886a59baf156ebf80c2b3b99b6e547f544cf74df6879599b75c5fbe7afeb236fc89a80fffaa97fdb08f1e24886a249154336001600160a01b0383161480156112c75750806001600160a01b0316846001600160a01b0316145b6112d057600080fd5b50505b601c80546001600160a01b038481166001600160a01b031983161790925560405191169060009030906113079085906152ce565b6000604051808303816000865af19150503d8060008114611344576040519150601f19603f3d011682016040523d82523d6000602084013e611349565b606091505b50506040519091503d90816000823e82611361578181fd5b601c80546001600160a01b0319166001600160a01b0386161790558181f35b6001546001600160a01b0316331461139757600080fd5b60088054911515600160a81b02600160a81b60ff0219909216919091179055565b60045460ff1681565b6001546001600160a01b031633146113d857600080fd5b60088054911515600160a01b0274ff000000000000000000000000000000000000000019909216919091179055565b6000610df08585858560405180602001604052806000815250612b6c565b6001546001600160a01b0316331461143c57600080fd5b6114446111ef565b1561147d57611475611454611a19565b601254601b546114699163ffffffff613b4b16565b9063ffffffff613b7016565b601b5561148a565b670de0b6b3a7640000601b555b565b6007546001600160a01b031681565b600a5461010090046001600160a01b031681565b60006114d76011546114696114c2611a19565b6114cb866119e8565b9063ffffffff613b4b16565b60135490915060ff161561159b57600654600b54600854604051600160e51b6232ccd502815260009384936001600160a01b03918216936306599aa09361152c939283169290911690600019906004016153d5565b60606040518083038186803b15801561154457600080fd5b505afa158015611558573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061157c9190810190614bc3565b50909250905061159681611469858563ffffffff613b4b16565b925050505b919050565b600061124183836040518060200160405280600081525061238d565b6000610df384848460405180602001604052806000815250610e01565b600a54600c54604051600160e21b6320a6ce3d02815260009261010090046001600160a01b03169163829b38f4916116149190600401615427565b60206040518083038186803b15801561162c57600080fd5b505afa158015611640573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506116649190810190614ba5565b60135490915060ff166111ff57600654600854600b54604051600160e51b6232ccd502815260009384936001600160a01b03918216936306599aa0936116b8939283169290911690600019906004016153d5565b60606040518083038186803b1580156116d057600080fd5b505afa1580156116e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506117089190810190614bc3565b50909250905061172281611469858563ffffffff613b4b16565b9250505090565b600060016000541461175057604051600160e51b62461bcd0281526004016109bf9061564d565b6002600055600b546001600160a01b038381169116148061177e57506008546001600160a01b038381169116145b1561178b575060006119de565b6000806001600160a01b03841661181f5730319150816117b0576000925050506119de565b60075460408051600160e41b630d0e30db02815290516001600160a01b0390921691829163d0e30db091869160048082019260009290919082900301818588803b1580156117fd57600080fd5b505af1158015611811573d6000803e3d6000fd5b5050505050809150506118b3565b604051600160e01b6370a082310281526001600160a01b038516906370a082319061184e9030906004016152f3565b60206040518083038186803b15801561186657600080fd5b505afa15801561187a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061189e9190810190614ba5565b9150816118b0576000925050506119de565b50825b60048054600654604051600160e11b6338f5892f0281526001600160a01b038581169463a9059cbb9461010090048216936371eb125e936118f89390911691016152e5565b60206040518083038186803b15801561191057600080fd5b505afa158015611924573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506119489190810190614864565b846040518363ffffffff1660e01b815260040161196692919061540b565b602060405180830381600087803b15801561198057600080fd5b505af1158015611994573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506119b89190810190614b87565b6119d757604051600160e51b62461bcd0281526004016109bf9061558d565b6001925050505b6001600055919050565b6001600160a01b038116600090815260186020526040812054610dcc90613909565b6008546001600160a01b031681565b6000806000611a266111ef565b15611ac45760048054600d54604051600160e01b63b1fd9e050281526101009092046001600160a01b03169263b1fd9e0592611a6a92913091600091829101615450565b60a06040518083038186803b158015611a8257600080fd5b505afa158015611a96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611aba9190810190614c06565b5092945090925050505b6117228282613b83565b600854600160a81b900460ff1681565b6005546001600160a01b031681565b6000600160005414611b1457604051600160e51b62461bcd0281526004016109bf9061564d565b6002600090815560048054600654604051600160e11b6338f5892f0281526001600160a01b036101009093048316936371eb125e93611b55931691016152e5565b60206040518083038186803b158015611b6d57600080fd5b505afa158015611b81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611ba59190810190614864565b600854600b54604051600160e21b632b337b330281529293506001600160a01b038085169363accdeccc93611be29390831692169060040161535f565b602060405180830381600087803b158015611bfc57600080fd5b505af1158015611c10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611c349190810190614ba5565b50600854600160a81b900460ff1615611c6257604051600160e51b62461bcd0281526004016109bf906156ad565b600080611c7087878761302e565b9150915081600014611d5e57600b546001600160a01b03898116911614611cb857600b54600090611cae906001600160a01b03168a8c8660016135a0565b509250611d5e9050565b600b54604051600160e01b63a9059cbb0281526001600160a01b039091169063a9059cbb90611ced908c90869060040161540b565b602060405180830381600087803b158015611d0757600080fd5b505af1158015611d1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611d3f9190810190614b87565b611d5e57604051600160e51b62461bcd0281526004016109bf9061568d565b876001600160a01b0316896001600160a01b03167f4cf25bc1d991c17529c25213d3cc0cda295eeaad5f13f361969b12ea48015f90848a85604051611da5939291906156bd565b60405180910390a3509150600854600b54604051600160e01b63e54699c10281526001600160a01b038085169363e54699c193611dea9391831692169060040161535f565b600060405180830381600087803b158015611e0457600080fd5b505af1158015611e18573d6000803e3d6000fd5b505060016000555091979650505050505050565b6001546001600160a01b031681565b60165481565b6003805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156109925780601f1061096757610100808354040283529160200191610992565b6006546001600160a01b031681565b60175481565b60045461010090046001600160a01b031681565b601b5481565b6000611ed78383613c40565b50611ee1336119e8565b611ef657336000908152600960205260408120555b50600192915050565b600c5481565b600b546001600160a01b031681565b6013546000908190819060ff1615611fe157600654600854600b54604051600160e51b6232ccd50281526001600160a01b03938416936306599aa093611f679390821692911690600019906004016153d5565b60606040518083038186803b158015611f7f57600080fd5b505afa158015611f93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611fb79190810190614bc3565b50600e549193509150611fda908290611469908590600a0a63ffffffff613b4b16565b9250612095565b600654600b54600854604051600160e51b6232ccd50281526001600160a01b03938416936306599aa0936120229390821692911690600019906004016153d5565b60606040518083038186803b15801561203a57600080fd5b505afa15801561204e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506120729190810190614bc3565b506010549193509150611722908290611469908590600a0a63ffffffff613b4b16565b505090565b600080600080600460019054906101000a90046001600160a01b03166001600160a01b031663db4d0ae0600d54306040518363ffffffff1660e01b81526004016120e5929190615435565b60606040518083038186803b1580156120fd57600080fd5b505afa158015612111573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506121359190810190614bc3565b925092509250816000141561215057600093505050506111ff565b8181116121695761215f611a19565b93505050506111ff565b600080612174611a19565b90506000612188828763ffffffff613b4b16565b90508584106121d1576121b8701d6329f1c35ca4bfabb9f56100000000006114698389880363ffffffff613b4b16565b90506121ca828263ffffffff613d6816565b925061220d565b6121f8701d6329f1c35ca4bfabb9f561000000000061146983878a0363ffffffff613b4b16565b905061220a828263ffffffff613d7a16565b92505b60006122296f4b3b4ca85a86c47a098a22400000000088613b70565b905060006122476f4b3b4ca85a86c47a098a22400000000087613b70565b905061229f61226483670de0b6b3a764000063ffffffff613d7a16565b6114696122928561228668056bc75e2d63100000848e8963ffffffff613b4b16565b9063ffffffff613d7a16565b889063ffffffff613b4b16565b9850505050505050505090565b600f5481565b60135460ff1681565b60048054600d54604051600160e51b6306da6857028152600093849361010090046001600160a01b03169263db4d0ae0926122f892309101615435565b60606040518083038186803b15801561231057600080fd5b505afa158015612324573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506123489190810190614bc3565b925050508061235b5760009150506111ff565b6123756f4b3b4ca85a86c47a098a22400000000082613b70565b91505090565b60146020526000908152604090205481565b60006001600054146123b457604051600160e51b62461bcd0281526004016109bf9061564d565b6002600090815560048054600654604051600160e11b6338f5892f0281526001600160a01b036101009093048316936371eb125e936123f5931691016152e5565b60206040518083038186803b15801561240d57600080fd5b505afa158015612421573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506124459190810190614864565b600854600b54604051600160e21b632b337b330281529293506001600160a01b038085169363accdeccc936124829390831692169060040161535f565b602060405180830381600087803b15801561249c57600080fd5b505af11580156124b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506124d49190810190614ba5565b50600854600160a01b900460ff161561250257604051600160e51b62461bcd0281526004016109bf906156ad565b3461252257604051600160e51b62461bcd0281526004016109bf9061563d565b6000806000806125306111ef565b156125d25760048054600d54604051600160e01b63b1fd9e050281526101009092046001600160a01b03169263b1fd9e059261257492913091600091829101615450565b60a06040518083038186803b15801561258c57600080fd5b505afa1580156125a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506125c49190810190614c06565b939750919550909350909150505b60006125de8585613b83565b90508815612609578881111561260957604051600160e51b62461bcd0281526004016109bf9061566d565b60075460408051600160e41b630d0e30db02815290516001600160a01b0390921691829163d0e30db091349160048082019260009290919082900301818588803b15801561265657600080fd5b505af115801561266a573d6000803e3d6000fd5b505050505061268d8b823485888860405180602001604052806000815250613d87565b9750505050505050600854600b54604051600160e01b63e54699c10281526001600160a01b038085169363e54699c1936126cf9391831692169060040161535f565b600060405180830381600087803b1580156126e957600080fd5b505af11580156126fd573d6000803e3d6000fd5b50506001600055509195945050505050565b60156020526000908152604090205481565b600a54600c54604051600160e21b6320a6ce3d02815260009261010090046001600160a01b03169163829b38f49161275c9190600401615427565b60206040518083038186803b15801561277457600080fd5b505afa158015612788573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506111fc9190810190614ba5565b6001600160a01b03808316600090815260196020908152604080832093851683529290529081205461124190613909565b600854600160a01b900460ff1681565b600e5481565b6001546001600160a01b0316331461280a57600080fd5b60048054600654604051600160e11b6338f5892f0281526000936001600160a01b036101009094048416936371eb125e9361284893911691016152e5565b60206040518083038186803b15801561286057600080fd5b505afa158015612874573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506128989190810190614864565b600854600b54604051600160e21b632b337b330281529293506001600160a01b038085169363accdeccc936128d59390831692169060040161535f565b602060405180830381600087803b1580156128ef57600080fd5b505af1158015612903573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506129279190810190614ba5565b506001600160a01b03851661294557600b546001600160a01b031694505b821580159061295e57506001546001600160a01b031633145b156129f15760048054600d54604051600160e11b6350f49a410281526101009092046001600160a01b03169263a1e934829261299d92918891016154d1565b602060405180830381600087803b1580156129b757600080fd5b505af11580156129cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506129ef9190810190614ba5565b505b60003415612a0d57612a0a30313463ffffffff613d6816565b90505b612a188686856140cd565b3415612aad57303181811115612aab576000336001600160a01b0316838303604051612a43906152da565b60006040518083038185875af1925050503d8060008114612a80576040519150601f19603f3d011682016040523d82523d6000602084013e612a85565b606091505b5050905080612aa957604051600160e51b62461bcd0281526004016109bf9061569d565b505b505b50600854600b54604051600160e01b63e54699c10281526001600160a01b038085169363e54699c193612ae89391831692169060040161535f565b600060405180830381600087803b158015612b0257600080fd5b505af1158015612b16573d6000803e3d6000fd5b505050505050505050565b6001600160a01b038116600090815260096020526040812054610dcc90614373565b6001546001600160a01b03163314612b5a57600080fd5b612b6381614396565b50565b600d5481565b6000600160005414612b9357604051600160e51b62461bcd0281526004016109bf9061564d565b6002600090815560048054600654604051600160e11b6338f5892f0281526001600160a01b036101009093048316936371eb125e93612bd4931691016152e5565b60206040518083038186803b158015612bec57600080fd5b505afa158015612c00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612c249190810190614864565b600854600b54604051600160e21b632b337b330281529293506001600160a01b038085169363accdeccc93612c619390831692169060040161535f565b602060405180830381600087803b158015612c7b57600080fd5b505af1158015612c8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612cb39190810190614ba5565b50600854600090600160a01b900460ff1615612ce457604051600160e51b62461bcd0281526004016109bf906156ad565b85612d0457604051600160e51b62461bcd0281526004016109bf9061562d565b600080600080612d126111ef565b15612db45760048054600d54604051600160e01b63b1fd9e050281526101009092046001600160a01b03169263b1fd9e0592612d5692913091600091829101615450565b60a06040518083038186803b158015612d6e57600080fd5b505afa158015612d82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612da69190810190614c06565b939750919550909350909150505b6000612dc08585613b83565b90508915612deb5789811115612deb57604051600160e51b62461bcd0281526004016109bf9061566d565b3415612e0557612e0230313463ffffffff613d6816565b94505b6001600160a01b038c16612ea5578a341015612e3657604051600160e51b62461bcd0281526004016109bf906155ad565b60075460408051600160e41b630d0e30db02815290516001600160a01b0390921691829163d0e30db0918f9160048082019260009290919082900301818588803b158015612e8357600080fd5b505af1158015612e97573d6000803e3d6000fd5b5050505050809c5050612f46565b8b6001600160a01b03166323b872dd33308e6040518463ffffffff1660e01b8152600401612ed59392919061531c565b602060405180830381600087803b158015612eef57600080fd5b505af1158015612f03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612f279190810190614b87565b612f4657604051600160e51b62461bcd0281526004016109bf9061552d565b612f558d8d8d8487878f613d87565b95503415612fec573031935084841115612fec576000336001600160a01b0316868603604051612f84906152da565b60006040518083038185875af1925050503d8060008114612fc1576040519150601f19603f3d011682016040523d82523d6000602084013e612fc6565b606091505b5050905080612fea57604051600160e51b62461bcd0281526004016109bf9061569d565b505b5093955050505050600854600b54604051600160e01b63e54699c10281526001600160a01b038085169363e54699c193611dea9391831692169060040161535f565b6000808461305157604051600160e51b62461bcd0281526004016109bf9061551d565b61305a336119e8565b85111561306d5761306a336119e8565b94505b60048054600d54604051600160e01b63b1fd9e050281526101009092046001600160a01b031692600092839283928392879263b1fd9e05926130b59230918791829101615450565b60a06040518083038186803b1580156130cd57600080fd5b505afa1580156130e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506131059190810190614c06565b9450945050935093506131188484613b83565b95508815613143578886101561314357604051600160e51b62461bcd0281526004016109bf9061555d565b6131538a8763ffffffff613b4b16565b965061316a60115488613b7090919063ffffffff16565b600b54604051600160e01b6370a082310281529198506000916001600160a01b03909116906370a08231906131a39030906004016152f3565b60206040518083038186803b1580156131bb57600080fd5b505afa1580156131cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506131f39190810190614ba5565b90506000613207828763ffffffff613d7a16565b9050613219818663ffffffff613d7a16565b90506000808a8410156132dd5761322e6111ef565b8e101561323f57838b039150613245565b60001991505b61325389600d54848f614405565b600b54604051600160e01b6370a082310281526001600160a01b03909116906370a08231906132869030906004016152f3565b60206040518083038186803b15801561329e57600080fd5b505afa1580156132b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506132d69190810190614ba5565b9350600190505b8a841080156132f257506132ef6111ef565b8e105b156133a457600d54604051600160e11b6350f49a41028152858d0393506000916001600160a01b038c169163a1e93482916133319187906004016154d1565b602060405180830381600087803b15801561334b57600080fd5b505af115801561335f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506133839190810190614ba5565b905080156133a25761339b858263ffffffff613d7a16565b9450600191505b505b80156134c55760006133b46111ef565b8f10156134ae57600d54604051600160e01b63b1fd9e050281526001600160a01b038c169163b1fd9e05916133f2919030908c908c9060040161548e565b60a06040518083038186803b15801561340a57600080fd5b505afa15801561341e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506134429190810190614c06565b50929b509099506000915061345f9050868b63ffffffff613d7a16565b9050613471818a63ffffffff613d7a16565b9050848110156134a8578085039150818d116134a257604051600160e51b62461bcd0281526004016109bf906155bd565b818d039c505b506134b7565b60009850600097505b848c11156134c357849b505b505b6134ce336119e8565b8e14806134f7575060115460045460ff16600a0a66038d7ea4c6800002816134f257fe5b048b10155b61351657604051600160e51b62461bcd0281526004016109bf9061556d565b613520338f614542565b6135286111ef565b158061353b57506135398888613b83565b155b1561355257670de0b6b3a7640000601b5560125499505b61355b336119e8565b1561357e576135698a613909565b3360009081526009602052604090205561358f565b336000908152600960205260408120555b505050505050505050935093915050565b60048054600654604051600160e11b6338f5892f028152600093849384936001600160a01b036101009092048216936371eb125e936135e4939290921691016152e5565b60206040518083038186803b1580156135fc57600080fd5b505afa158015613610573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506136349190810190614864565b90506000886001600160a01b031663dd62ed3e30846040518363ffffffff1660e01b8152600401613666929190615301565b60206040518083038186803b15801561367e57600080fd5b505afa158015613692573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506136b69190810190614ba5565b90508581101561380d57801561376957604051600160e01b63095ea7b30281526001600160a01b038a169063095ea7b3906136f89085906000906004016153f0565b602060405180830381600087803b15801561371257600080fd5b505af1158015613726573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061374a9190810190614b87565b61376957604051600160e51b62461bcd0281526004016109bf9061553d565b604051600160e01b63095ea7b30281526001600160a01b038a169063095ea7b39061379c9085906000199060040161540b565b602060405180830381600087803b1580156137b657600080fd5b505af11580156137ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506137ee9190810190614b87565b61380d57604051600160e51b62461bcd0281526004016109bf9061557d565b60006060836001600160a01b03168b8b8b8c8c600019600060405160240161383b979695949392919061536d565b60408051601f198184030181529181526020820180516001600160e01b0316600160e01b63051c8a8d021790525161387391906152ce565b6000604051808303816000865af19150503d80600081146138b0576040519150601f19603f3d011682016040523d82523d6000602084013e6138b5565b606091505b50915091508615806138c45750815b6138e357604051600160e51b62461bcd0281526004016109bf906155cd565b60018214156138fb5760208101519550604081015194505b505050509550959350505050565b601b54600090610dcc9061146984670de0b6b3a764000063ffffffff613b4b16565b6001600160a01b0383166000908152601960209081526040808320338452909152812054819061395a90613909565b6001600160a01b0386166000908152601860205260408120549192509061398090613909565b9050808411156139a557604051600160e51b62461bcd0281526004016109bf9061561d565b818411156139c857604051600160e51b62461bcd0281526004016109bf9061554d565b6001600160a01b0385166139f157604051600160e51b62461bcd0281526004016109bf906155dd565b613a09613a04828663ffffffff613d6816565b614373565b6001600160a01b038716600090815260186020526040902055613a2b866119e8565b613a49576001600160a01b0386166000908152601860205260408120555b6001600160a01b038516600090815260186020526040902054613a7590613a0490869061228690613909565b6001600160a01b0386166000908152601860205260409020556000198214613b0657613aaa613a04838663ffffffff613d6816565b6001600160a01b038716600090815260196020908152604080832033808552925290912091909155613add9087906127ac565b613b06576001600160a01b03861660009081526019602090815260408083203384529091528120555b846001600160a01b0316866001600160a01b031660008051602061589883398151915286604051613b379190615427565b60405180910390a350600195945050505050565b600082613b5a57506000610dcc565b5081810281838281613b6857fe5b0414610dcc57fe5b6000818381613b7b57fe5b049392505050565b6000601a5460001415613b9857601254611241565b611241613a04601a546114696011546114cb876122868a600b60009054906101000a90046001600160a01b03166001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401613bf091906152f3565b60206040518083038186803b158015613c0857600080fd5b505afa158015613c1c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506122869190810190614ba5565b336000908152601860205260408120548190613c5b90613909565b905080831115613c8057604051600160e51b62461bcd0281526004016109bf9061561d565b6001600160a01b038416613ca957604051600160e51b62461bcd0281526004016109bf906155dd565b613cbc613a04828563ffffffff613d6816565b33600081815260186020526040902091909155613cd8906119e8565b613ced57336000908152601860205260408120555b6001600160a01b038416600090815260186020526040902054613d1990613a0490859061228690613909565b6001600160a01b03851660008181526018602052604090819020929092559051339060008051602061589883398151915290613d56908790615427565b60405180910390a35060019392505050565b600082821115613d7457fe5b50900390565b81810182811015610dcc57fe5b6001546000906001600160a01b03163314613da157600080fd5b600b546001600160a01b03888116911614801590613dcd57506008546001600160a01b03888116911614155b15613eb457600b546000908190613df2908a906001600160a01b0316308b60016135a0565b9150915080881115613ea257604051600160e01b63a9059cbb0281526001600160a01b038a169063a9059cbb90613e31903390858d0390600401615344565b602060405180830381600087803b158015613e4b57600080fd5b505af1158015613e5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613e839190810190614b87565b613ea257604051600160e51b62461bcd0281526004016109bf9061552d565b50600b546001600160a01b0316975095505b600b546001600160a01b03888116911614613ed157600f54613ed5565b6011545b60045460ff16600a0a66038d7ea4c680000281613eee57fe5b04861015613f1157604051600160e51b62461bcd0281526004016109bf9061560d565b613f1c8787846140cd565b60048054600d54604051600160e01b63b1fd9e05028152600093849361010090046001600160a01b03169263b1fd9e0592613f5d9230918c918c910161548e565b60a06040518083038186803b158015613f7557600080fd5b505afa158015613f89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613fad9190810190614c06565b505050915091506000614009886114696011546114cb8661228689600b60009054906101000a90046001600160a01b03166001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401613bf091906152f3565b90506140136111ef565b811161403457604051600160e51b62461bcd0281526004016109bf9061559d565b600061403e6111ef565b8203905061404c8c826146fd565b8a6001600160a01b03168c6001600160a01b03167f458f5fa412d0f69b08dd84872b0215675cc67bc1d5b6fd93300a1c3878b861968c848d604051614093939291906156bd565b60405180910390a36140a489613909565b6001600160a01b038d166000908152600960205260409020559350505050979650505050505050565b600b54604051600160e01b6370a082310281526000916001600160a01b0316906370a08231906141019030906004016152f3565b60206040518083038186803b15801561411957600080fd5b505afa15801561412d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506141519190810190614ba5565b600854604051600160e01b6370a082310281529192506000916001600160a01b03909116906370a082319061418a9030906004016152f3565b60206040518083038186803b1580156141a257600080fd5b505afa1580156141b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506141da9190810190614ba5565b9050801515806141e957508115155b1561436c57600b546001600160a01b038681169116141561422b5783158061421057508184115b1561421f579092508290614226565b5082905060005b614280565b6008546001600160a01b03868116911614156142655783158061424d57508084115b1561425a57925082614226565b506000905082614280565b604051600160e51b62461bcd0281526004016109bf9061567d565b6000341561429657503031348111156142965750345b600a60019054906101000a90046001600160a01b03166001600160a01b0316631c5d1da58287600c5486886000308e600b60009054906101000a90046001600160a01b0316600b60009054906101000a90046001600160a01b03168f6040518c63ffffffff1660e01b81526004016143179a999897969594939291906156d8565b6020604051808303818588803b15801561433057600080fd5b505af1158015614344573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052506143699190810190614ba5565b50505b5050505050565b6000610dcc670de0b6b3a7640000611469601b5485613b4b90919063ffffffff16565b6001600160a01b0381166143a957600080fd5b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b600034156144215761441e30313463ffffffff613d6816565b90505b604051600160e01b6334cf55610281526001600160a01b038616906334cf5561903490614456908890889088906004016154df565b6020604051808303818588803b15801561446f57600080fd5b505af1158015614483573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052506144a89190810190614ba5565b50341561436c5730318181111561453a576000336001600160a01b03168383036040516144d4906152da565b60006040518083038185875af1925050503d8060008114614511576040519150601f19603f3d011682016040523d82523d6000602084013e614516565b606091505b505090508061436957604051600160e51b62461bcd0281526004016109bf9061569d565b505050505050565b6001600160a01b03821660009081526018602052604081205461456490613909565b90508082111561458957604051600160e51b62461bcd0281526004016109bf906155fd565b600061459e613a04838563ffffffff613d6816565b6001600160a01b0385166000908152601860205260409020819055600a1015806145d15750600a6145ce856119e8565b11155b156145f557506001600160a01b038316600090815260186020526040812080549190555b6000614602601a54613909565b9050838111156146515761461f613a04828663ffffffff613d6816565b601a5561462a6111ef565b61464c576000601a8190556001600160a01b0386168152601860205260408120555b614670565b6001600160a01b0385166000908152601860205260408120819055601a555b81156146bc5761468f61468283613909565b859063ffffffff613d7a16565b935081601a5411156146b657601a546146ae908363ffffffff613d6816565b601a556146bc565b6000601a555b60006001600160a01b0316856001600160a01b0316600080516020615898833981519152866040516146ee9190615427565b60405180910390a35050505050565b6001600160a01b03821661472657604051600160e51b62461bcd0281526004016109bf906155dd565b614738613a0482612286601a54613909565b601a556001600160a01b03821660009081526018602052604090205461476790613a0490839061228690613909565b6001600160a01b038316600081815260186020526040808220939093559151909190600080516020615898833981519152906147a4908590615427565b60405180910390a35050565b8035610dcc81615871565b8051610dcc81615871565b8035610dcc81615885565b8051610dcc81615885565b8051610dcc8161588e565b600082601f8301126147f857600080fd5b813561480b614806826157a8565b615781565b9150808252602083016020830185838301111561482757600080fd5b61483283828461582b565b50505092915050565b8035610dcc8161588e565b60006020828403121561485857600080fd5b6000610df384846147b0565b60006020828403121561487657600080fd5b6000610df384846147bb565b6000806040838503121561489557600080fd5b60006148a185856147b0565b92505060206148b2858286016147b0565b9150509250929050565b6000806000606084860312156148d157600080fd5b60006148dd86866147b0565b93505060206148ee868287016147b0565b92505060406148ff8682870161483b565b9150509250925092565b6000806000806080858703121561491f57600080fd5b600061492b87876147b0565b945050602061493c878288016147b0565b935050604061494d8782880161483b565b925050606061495e8782880161483b565b91505092959194509250565b600080600080600060a0868803121561498257600080fd5b600061498e88886147b0565b955050602061499f888289016147b0565b94505060406149b08882890161483b565b93505060606149c18882890161483b565b925050608086013567ffffffffffffffff8111156149de57600080fd5b6149ea888289016147e7565b9150509295509295909350565b60008060408385031215614a0a57600080fd5b6000614a1685856147b0565b925050602083013567ffffffffffffffff811115614a3357600080fd5b6148b2858286016147e7565b60008060408385031215614a5257600080fd5b6000614a5e85856147b0565b92505060206148b28582860161483b565b600080600060608486031215614a8457600080fd5b6000614a9086866147b0565b9350506020614aa18682870161483b565b925050604084013567ffffffffffffffff811115614abe57600080fd5b6148ff868287016147e7565b600080600060608486031215614adf57600080fd5b6000614aeb86866147b0565b93505060206148ee8682870161483b565b60008060008060808587031215614b1257600080fd5b6000614b1e87876147b0565b9450506020614b2f8782880161483b565b9350506040614b408782880161483b565b925050606085013567ffffffffffffffff811115614b5d57600080fd5b61495e878288016147e7565b600060208284031215614b7b57600080fd5b6000610df384846147c6565b600060208284031215614b9957600080fd5b6000610df384846147d1565b600060208284031215614bb757600080fd5b6000610df384846147dc565b600080600060608486031215614bd857600080fd5b6000614be486866147dc565b9350506020614bf5868287016147dc565b92505060406148ff868287016147dc565b600080600080600060a08688031215614c1e57600080fd5b6000614c2a88886147dc565b9550506020614c3b888289016147dc565b9450506040614c4c888289016147dc565b9350506060614c5d888289016147dc565b92505060806149ea888289016147dc565b614c77816157ff565b82525050565b614c77816157dd565b614c77816157e8565b614c77816111ff565b6000614ca3826157d0565b614cad81856157d4565b9350614cbd818560208601615837565b614cc681615867565b9093019392505050565b6000614cdb826157d0565b614ce5818561159b565b9350614cf5818560208601615837565b9290920192915050565b614c778161580a565b614c7781615815565b6000614d1e600f836157d4565b7f6275726e416d6f756e74203d3d20300000000000000000000000000000000000815260200192915050565b6000614d576018836157d4565b7f7472616e73666572206f6620746f6b656e206661696c65640000000000000000815260200192915050565b6000614d90601b836157d4565b7f746f6b656e20617070726f76616c207265736574206661696c65640000000000815260200192915050565b6000614dc96016836157d4565b7f696e73756666696369656e7420616c6c6f77616e636500000000000000000000815260200192915050565b6000614e02600d836157d4565b7f707269636520746f6f206c6f7700000000000000000000000000000000000000815260200192915050565b6000614e3b6012836157d4565b7f6275726e416d6f756e7420746f6f206c6f770000000000000000000000000000815260200192915050565b6000614e746015836157d4565b7f746f6b656e20617070726f76616c206661696c65640000000000000000000000815260200192915050565b6000614ead6020836157d4565b7f7472616e73666572206f6620746f6b656e2062616c616e6365206661696c6564815260200192915050565b6000614ee66010836157d4565b7f737570706c79206e6f7420616464656400000000000000000000000000000000815260200192915050565b6000614f1f6012836157d4565b7f696e73756666696369656e742065746865720000000000000000000000000000815260200192915050565b6000614f586012836157d4565b7f736c69707061676520746f6f2067726561740000000000000000000000000000815260200192915050565b6000614f91600b836157d4565b600160a91b6a3a3930b2329032b93937b902815260200192915050565b6000614fbb600f836157d4565b7f696e76616c696420616464726573730000000000000000000000000000000000815260200192915050565b6000614ff46016836157d4565b7f7472616e73666572206f6620455448206661696c656400000000000000000000815260200192915050565b600061502d601a836157d4565b7f6275726e2076616c756520657863656564732062616c616e6365000000000000815260200192915050565b60006150666015836157d4565b7f6465706f736974416d6f756e7420746f6f206c6f770000000000000000000000815260200192915050565b600061509f6014836157d4565b7f696e73756666696369656e742062616c616e6365000000000000000000000000815260200192915050565b60006150d86012836157d4565b7f6465706f736974416d6f756e74203d3d20300000000000000000000000000000815260200192915050565b6000615111600d836157d4565b7f6e6f2065746865722073656e7400000000000000000000000000000000000000815260200192915050565b6000610dcc60008361159b565b6000615157600c836157d4565b7f6e6f6e5265656e7472616e740000000000000000000000000000000000000000815260200192915050565b6000615190600e836157d4565b7f6465706f736974206661696c6564000000000000000000000000000000000000815260200192915050565b60006151c9600e836157d4565b7f707269636520746f6f2068696768000000000000000000000000000000000000815260200192915050565b6000615202600f836157d4565b7f696e76616c6964206465706f7369740000000000000000000000000000000000815260200192915050565b600061523b601c836157d4565b7f7472616e73666572206f66206c6f616e546f6b656e206661696c656400000000815260200192915050565b60006152746011836157d4565b7f65746820726566756e64206661696c6564000000000000000000000000000000815260200192915050565b60006152ad6006836157d4565b600160d21b651c185d5cd95902815260200192915050565b614c77816157f9565b60006112418284614cd0565b6000610dcc8261513d565b60208101610dcc8284614c7d565b60208101610dcc8284614c6e565b6040810161530f8285614c6e565b6112416020830184614c7d565b6060810161532a8286614c6e565b6153376020830185614c6e565b610df36040830184614c8f565b604081016153528285614c6e565b6112416020830184614c8f565b6040810161530f8285614c7d565b60e0810161537b828a614c7d565b6153886020830189614c7d565b6153956040830188614c7d565b6153a26060830187614c7d565b6153af6080830186614c8f565b6153bc60a0830185614c8f565b6153c960c0830184614d08565b98975050505050505050565b606081016153e38286614c7d565b6153376020830185614c7d565b604081016153fe8285614c7d565b6112416020830184614cff565b604081016153528285614c7d565b60208101610dcc8284614c86565b60208101610dcc8284614c8f565b604081016154438285614c8f565b6112416020830184614c6e565b6080810161545e8287614c8f565b61546b6020830186614c6e565b6154786040830185614cff565b6154856060830184614cff565b95945050505050565b6080810161549c8287614c8f565b6154a96020830186614c6e565b6154b66040830185614c8f565b6154856060830184614c8f565b606081016153e38286614c8f565b604081016153528285614c8f565b606081016154ed8286614c8f565b6154fa6020830185614c8f565b8181036040830152610df08184614c98565b602080825281016112418184614c98565b60208082528101610dcc81614d11565b60208082528101610dcc81614d4a565b60208082528101610dcc81614d83565b60208082528101610dcc81614dbc565b60208082528101610dcc81614df5565b60208082528101610dcc81614e2e565b60208082528101610dcc81614e67565b60208082528101610dcc81614ea0565b60208082528101610dcc81614ed9565b60208082528101610dcc81614f12565b60208082528101610dcc81614f4b565b60208082528101610dcc81614f84565b60208082528101610dcc81614fae565b60208082528101610dcc81614fe7565b60208082528101610dcc81615020565b60208082528101610dcc81615059565b60208082528101610dcc81615092565b60208082528101610dcc816150cb565b60208082528101610dcc81615104565b60208082528101610dcc8161514a565b60208082528101610dcc81615183565b60208082528101610dcc816151bc565b60208082528101610dcc816151f5565b60208082528101610dcc8161522e565b60208082528101610dcc81615267565b60208082528101610dcc816152a0565b606081016156cb8286614c8f565b6153376020830185614c8f565b61014081016156e7828d614c8f565b6156f4602083018c614c8f565b615701604083018b614c8f565b61570e606083018a614c8f565b61571b6080830189614cff565b61572860a0830188614c6e565b61573560c0830187614c7d565b61574260e0830186614c7d565b615750610100830185614c7d565b8181036101208301526157638184614c98565b9c9b505050505050505050505050565b60208101610dcc82846152c5565b60405181810167ffffffffffffffff811182821017156157a057600080fd5b604052919050565b600067ffffffffffffffff8211156157bf57600080fd5b506020601f91909101601f19160190565b5190565b90815260200190565b6000610dcc826157ed565b151590565b6001600160a01b031690565b60ff1690565b6000610dcc82615820565b6000610dcc826111ff565b6000610dcc826157f9565b6000610dcc826157dd565b82818337506000910152565b60005b8381101561585257818101518382015260200161583a565b83811115615861576000848401525b50505050565b601f01601f191690565b61587a816157dd565b8114612b6357600080fd5b61587a816157e8565b61587a816111ff56feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa265627a7a72305820ff79ba3a0727bccb2efc5563a6d2a1e4d6745b69740acfbf25273fed0582724a6c6578706572696d656e74616cf50037
Deployed Bytecode
0x60806040526004361061036b5760003560e01c806389556ccf116101c6578063c20c49ec116100f7578063e1a283d611610095578063eebc50811161006f578063eebc5081146108a1578063f2fde38b146108c1578063f41e4e6a146108e1578063f5acf904146108f65761036b565b8063e1a283d614610864578063eaa0500214610879578063eb4eff5a1461088e5761036b565b8063d24f22a9116100d1578063d24f22a9146107fc578063db72da2c1461080f578063dd0d3e3b1461082f578063dd62ed3e146108445761036b565b8063c20c49ec146107b2578063c85ab793146107c7578063d05daa04146107dc5761036b565b8063a5507b3511610164578063b2aff0fe1161013e578063b2aff0fe1461075e578063b50823df14610773578063b6fc2d5f14610788578063bc29af141461079d5761036b565b8063a5507b3514610714578063a9059cbb14610729578063ab47c2b3146107495761036b565b806395d89b41116101a057806395d89b41146106c057806396c7871b146106d55780639788b5bb146106ea578063995363d3146106ff5761036b565b806389556ccf146106835780638da5cb5b146106965780638eb955e2146106ab5761036b565b806339039497116102a05780635726a3561161023e578063797bf38511610218578063797bf3851461062f5780637ff9b59614610644578063833c1d9514610659578063894ca3081461066e5761036b565b80635726a356146105da57806359e239af146105ef57806370a082311461060f5761036b565b80634858064c1161027a5780634858064c146105725780634de7c7bd146105875780634e07008d146105a7578063546cb17e146105ba5761036b565b8063390394971461051b578063447eed281461053b5780634780eac1146105505761036b565b806318160ddd1161030d578063284e2f56116102e7578063284e2f5614610499578063304c28ee146104b9578063313ce567146104d9578063359803cd146104fb5761036b565b806318160ddd1461044f5780631d0806ae1461046457806323b872dd146104795761036b565b8063095ea7b311610349578063095ea7b3146103da5780630bde6eb714610407578063150d97ff14610427578063179e3fab1461043c5761036b565b806306b1884d1461036d57806306fdde031461039857806308a62230146103ba575b005b34801561037957600080fd5b50610382610909565b60405161038f9190615427565b60405180910390f35b3480156103a457600080fd5b506103ad61090f565b60405161038f919061550c565b3480156103c657600080fd5b5061036b6103d5366004614a3f565b61099a565b3480156103e657600080fd5b506103fa6103f5366004614a3f565b610d14565b60405161038f9190615419565b34801561041357600080fd5b50610382610422366004614909565b610dd2565b34801561043357600080fd5b50610382610dfb565b61038261044a366004614afc565b610e01565b34801561045b57600080fd5b506103826111ef565b34801561047057600080fd5b50610382611202565b34801561048557600080fd5b506103fa6104943660046148bc565b611208565b3480156104a557600080fd5b5061036b6104b43660046149f7565b611248565b3480156104c557600080fd5b5061036b6104d4366004614b69565b611380565b3480156104e557600080fd5b506104ee6113b8565b60405161038f9190615773565b34801561050757600080fd5b5061036b610516366004614b69565b6113c1565b34801561052757600080fd5b50610382610536366004614909565b611407565b34801561054757600080fd5b5061036b611425565b34801561055c57600080fd5b5061056561148c565b60405161038f91906152e5565b34801561057e57600080fd5b5061056561149b565b34801561059357600080fd5b506103826105a2366004614846565b6114af565b6103826105b5366004614a3f565b6115a0565b3480156105c657600080fd5b506103826105d5366004614aca565b6115bc565b3480156105e657600080fd5b506103826115d9565b3480156105fb57600080fd5b506103fa61060a366004614846565b611729565b34801561061b57600080fd5b5061038261062a366004614846565b6119e8565b34801561063b57600080fd5b50610565611a0a565b34801561065057600080fd5b50610382611a19565b34801561066557600080fd5b506103fa611ace565b34801561067a57600080fd5b50610565611ade565b61038261069136600461496a565b611aed565b3480156106a257600080fd5b50610565611e2c565b3480156106b757600080fd5b50610382611e3b565b3480156106cc57600080fd5b506103ad611e41565b3480156106e157600080fd5b50610565611e9c565b3480156106f657600080fd5b50610382611eab565b34801561070b57600080fd5b50610565611eb1565b34801561072057600080fd5b50610382611ec5565b34801561073557600080fd5b506103fa610744366004614a3f565b611ecb565b34801561075557600080fd5b50610382611eff565b34801561076a57600080fd5b50610565611f05565b34801561077f57600080fd5b50610382611f14565b34801561079457600080fd5b5061038261209a565b3480156107a957600080fd5b506103826122ac565b3480156107be57600080fd5b506103fa6122b2565b3480156107d357600080fd5b506103826122bb565b3480156107e857600080fd5b506103826107f7366004614846565b61237b565b61038261080a366004614a6f565b61238d565b34801561081b57600080fd5b5061038261082a366004614846565b61270f565b34801561083b57600080fd5b50610382612721565b34801561085057600080fd5b5061038261085f366004614882565b6127ac565b34801561087057600080fd5b506103fa6127dd565b34801561088557600080fd5b506103826127ed565b61036b61089c366004614afc565b6127f3565b3480156108ad57600080fd5b506103826108bc366004614846565b612b21565b3480156108cd57600080fd5b5061036b6108dc366004614846565b612b43565b3480156108ed57600080fd5b50610382612b66565b61038261090436600461496a565b612b6c565b60105481565b6002805460408051602060018416156101000260001901909316849004601f810184900484028201840190925281815292918301828280156109925780601f1061096757610100808354040283529160200191610992565b820191906000526020600020905b81548152906001019060200180831161097557829003601f168201915b505050505081565b6001600054146109c857604051600160e51b62461bcd0281526004016109bf9061564d565b60405180910390fd5b6002600055604051600160e01b6323b872dd0281526001600160a01b038316906323b872dd90610a009033903090869060040161531c565b602060405180830381600087803b158015610a1a57600080fd5b505af1158015610a2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610a529190810190614b87565b610a7157604051600160e51b62461bcd0281526004016109bf9061552d565b600554604051600160e11b636eb1769f0281526000916001600160a01b038086169263dd62ed3e92610aaa923092911690600401615301565b60206040518083038186803b158015610ac257600080fd5b505afa158015610ad6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610afa9190810190614ba5565b905081811015610c5d578015610bb357600554604051600160e01b63095ea7b30281526001600160a01b038581169263095ea7b392610b4292909116906000906004016153f0565b602060405180830381600087803b158015610b5c57600080fd5b505af1158015610b70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610b949190810190614b87565b610bb357604051600160e51b62461bcd0281526004016109bf9061553d565b600554604051600160e01b63095ea7b30281526001600160a01b038581169263095ea7b392610bec92909116906000199060040161540b565b602060405180830381600087803b158015610c0657600080fd5b505af1158015610c1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610c3e9190810190614b87565b610c5d57604051600160e51b62461bcd0281526004016109bf9061557d565b60048054600d54604051600160e01b6352cccdb30281526101009092046001600160a01b0316926352cccdb392610c99929188918891016154c3565b602060405180830381600087803b158015610cb357600080fd5b505af1158015610cc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610ceb9190810190614b87565b610d0a57604051600160e51b62461bcd0281526004016109bf9061565d565b5050600160005550565b3360009081526019602090815260408083206001600160a01b038616845290915281208290556000198214801590610d535750610d5133846127ac565b155b15610d7d573360009081526019602090815260408083206001600160a01b03871684529091528120555b826001600160a01b0316336001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610dc09190615427565b60405180910390a35060015b92915050565b6000610df08585858560405180602001604052806000815250611aed565b90505b949350505050565b60115481565b6000600160005414610e2857604051600160e51b62461bcd0281526004016109bf9061564d565b6002600090815560048054600654604051600160e11b6338f5892f0281526001600160a01b036101009093048316936371eb125e93610e69931691016152e5565b60206040518083038186803b158015610e8157600080fd5b505afa158015610e95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610eb99190810190614864565b600854600b54604051600160e21b632b337b330281529293506001600160a01b038085169363accdeccc93610ef69390831692169060040161535f565b602060405180830381600087803b158015610f1057600080fd5b505af1158015610f24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610f489190810190614ba5565b50600854600160a81b900460ff1615610f7657604051600160e51b62461bcd0281526004016109bf906156ad565b600080610f8487878761302e565b915091508160001461112157600754600b546001600160a01b0391821691168114610fd057600b54600090610fc6906001600160a01b0316828c8760016135a0565b50935061111f9050565b604051600160e01b63a9059cbb028152733b5bdccdfa2a0a1911984f203c19628eeb6036e0906000906001600160a01b0384169063a9059cbb9061101a908590899060040161540b565b602060405180830381600087803b15801561103457600080fd5b505af1158015611048573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061106c9190810190614b87565b905080156110fc57604051600160e41b630bfcf63b0281526001600160a01b0383169063bfcf63b0906110a5908e90899060040161540b565b602060405180830381600087803b1580156110bf57600080fd5b505af11580156110d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506110f79190810190614ba5565b851490505b8061111c57604051600160e51b62461bcd0281526004016109bf906155ed565b50505b505b60006001600160a01b0316886001600160a01b03167f4cf25bc1d991c17529c25213d3cc0cda295eeaad5f13f361969b12ea48015f90848a85604051611169939291906156bd565b60405180910390a3509150600854600b54604051600160e01b63e54699c10281526001600160a01b038085169363e54699c1936111ae9391831692169060040161535f565b600060405180830381600087803b1580156111c857600080fd5b505af11580156111dc573d6000803e3d6000fd5b5050600160005550919695505050505050565b60006111fc601a54613909565b90505b90565b60125481565b600061121584848461392b565b5061121f846119e8565b61123d576001600160a01b0384166000908152600960205260408120555b5060015b9392505050565b6001546001600160a01b031633146112d3577f4d9d6037d7e53fa4549f7e532571af3aa103c886a59baf156ebf80c2b3b99b6e547f544cf74df6879599b75c5fbe7afeb236fc89a80fffaa97fdb08f1e24886a249154336001600160a01b0383161480156112c75750806001600160a01b0316846001600160a01b0316145b6112d057600080fd5b50505b601c80546001600160a01b038481166001600160a01b031983161790925560405191169060009030906113079085906152ce565b6000604051808303816000865af19150503d8060008114611344576040519150601f19603f3d011682016040523d82523d6000602084013e611349565b606091505b50506040519091503d90816000823e82611361578181fd5b601c80546001600160a01b0319166001600160a01b0386161790558181f35b6001546001600160a01b0316331461139757600080fd5b60088054911515600160a81b02600160a81b60ff0219909216919091179055565b60045460ff1681565b6001546001600160a01b031633146113d857600080fd5b60088054911515600160a01b0274ff000000000000000000000000000000000000000019909216919091179055565b6000610df08585858560405180602001604052806000815250612b6c565b6001546001600160a01b0316331461143c57600080fd5b6114446111ef565b1561147d57611475611454611a19565b601254601b546114699163ffffffff613b4b16565b9063ffffffff613b7016565b601b5561148a565b670de0b6b3a7640000601b555b565b6007546001600160a01b031681565b600a5461010090046001600160a01b031681565b60006114d76011546114696114c2611a19565b6114cb866119e8565b9063ffffffff613b4b16565b60135490915060ff161561159b57600654600b54600854604051600160e51b6232ccd502815260009384936001600160a01b03918216936306599aa09361152c939283169290911690600019906004016153d5565b60606040518083038186803b15801561154457600080fd5b505afa158015611558573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061157c9190810190614bc3565b50909250905061159681611469858563ffffffff613b4b16565b925050505b919050565b600061124183836040518060200160405280600081525061238d565b6000610df384848460405180602001604052806000815250610e01565b600a54600c54604051600160e21b6320a6ce3d02815260009261010090046001600160a01b03169163829b38f4916116149190600401615427565b60206040518083038186803b15801561162c57600080fd5b505afa158015611640573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506116649190810190614ba5565b60135490915060ff166111ff57600654600854600b54604051600160e51b6232ccd502815260009384936001600160a01b03918216936306599aa0936116b8939283169290911690600019906004016153d5565b60606040518083038186803b1580156116d057600080fd5b505afa1580156116e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506117089190810190614bc3565b50909250905061172281611469858563ffffffff613b4b16565b9250505090565b600060016000541461175057604051600160e51b62461bcd0281526004016109bf9061564d565b6002600055600b546001600160a01b038381169116148061177e57506008546001600160a01b038381169116145b1561178b575060006119de565b6000806001600160a01b03841661181f5730319150816117b0576000925050506119de565b60075460408051600160e41b630d0e30db02815290516001600160a01b0390921691829163d0e30db091869160048082019260009290919082900301818588803b1580156117fd57600080fd5b505af1158015611811573d6000803e3d6000fd5b5050505050809150506118b3565b604051600160e01b6370a082310281526001600160a01b038516906370a082319061184e9030906004016152f3565b60206040518083038186803b15801561186657600080fd5b505afa15801561187a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061189e9190810190614ba5565b9150816118b0576000925050506119de565b50825b60048054600654604051600160e11b6338f5892f0281526001600160a01b038581169463a9059cbb9461010090048216936371eb125e936118f89390911691016152e5565b60206040518083038186803b15801561191057600080fd5b505afa158015611924573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506119489190810190614864565b846040518363ffffffff1660e01b815260040161196692919061540b565b602060405180830381600087803b15801561198057600080fd5b505af1158015611994573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506119b89190810190614b87565b6119d757604051600160e51b62461bcd0281526004016109bf9061558d565b6001925050505b6001600055919050565b6001600160a01b038116600090815260186020526040812054610dcc90613909565b6008546001600160a01b031681565b6000806000611a266111ef565b15611ac45760048054600d54604051600160e01b63b1fd9e050281526101009092046001600160a01b03169263b1fd9e0592611a6a92913091600091829101615450565b60a06040518083038186803b158015611a8257600080fd5b505afa158015611a96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611aba9190810190614c06565b5092945090925050505b6117228282613b83565b600854600160a81b900460ff1681565b6005546001600160a01b031681565b6000600160005414611b1457604051600160e51b62461bcd0281526004016109bf9061564d565b6002600090815560048054600654604051600160e11b6338f5892f0281526001600160a01b036101009093048316936371eb125e93611b55931691016152e5565b60206040518083038186803b158015611b6d57600080fd5b505afa158015611b81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611ba59190810190614864565b600854600b54604051600160e21b632b337b330281529293506001600160a01b038085169363accdeccc93611be29390831692169060040161535f565b602060405180830381600087803b158015611bfc57600080fd5b505af1158015611c10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611c349190810190614ba5565b50600854600160a81b900460ff1615611c6257604051600160e51b62461bcd0281526004016109bf906156ad565b600080611c7087878761302e565b9150915081600014611d5e57600b546001600160a01b03898116911614611cb857600b54600090611cae906001600160a01b03168a8c8660016135a0565b509250611d5e9050565b600b54604051600160e01b63a9059cbb0281526001600160a01b039091169063a9059cbb90611ced908c90869060040161540b565b602060405180830381600087803b158015611d0757600080fd5b505af1158015611d1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611d3f9190810190614b87565b611d5e57604051600160e51b62461bcd0281526004016109bf9061568d565b876001600160a01b0316896001600160a01b03167f4cf25bc1d991c17529c25213d3cc0cda295eeaad5f13f361969b12ea48015f90848a85604051611da5939291906156bd565b60405180910390a3509150600854600b54604051600160e01b63e54699c10281526001600160a01b038085169363e54699c193611dea9391831692169060040161535f565b600060405180830381600087803b158015611e0457600080fd5b505af1158015611e18573d6000803e3d6000fd5b505060016000555091979650505050505050565b6001546001600160a01b031681565b60165481565b6003805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156109925780601f1061096757610100808354040283529160200191610992565b6006546001600160a01b031681565b60175481565b60045461010090046001600160a01b031681565b601b5481565b6000611ed78383613c40565b50611ee1336119e8565b611ef657336000908152600960205260408120555b50600192915050565b600c5481565b600b546001600160a01b031681565b6013546000908190819060ff1615611fe157600654600854600b54604051600160e51b6232ccd50281526001600160a01b03938416936306599aa093611f679390821692911690600019906004016153d5565b60606040518083038186803b158015611f7f57600080fd5b505afa158015611f93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611fb79190810190614bc3565b50600e549193509150611fda908290611469908590600a0a63ffffffff613b4b16565b9250612095565b600654600b54600854604051600160e51b6232ccd50281526001600160a01b03938416936306599aa0936120229390821692911690600019906004016153d5565b60606040518083038186803b15801561203a57600080fd5b505afa15801561204e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506120729190810190614bc3565b506010549193509150611722908290611469908590600a0a63ffffffff613b4b16565b505090565b600080600080600460019054906101000a90046001600160a01b03166001600160a01b031663db4d0ae0600d54306040518363ffffffff1660e01b81526004016120e5929190615435565b60606040518083038186803b1580156120fd57600080fd5b505afa158015612111573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506121359190810190614bc3565b925092509250816000141561215057600093505050506111ff565b8181116121695761215f611a19565b93505050506111ff565b600080612174611a19565b90506000612188828763ffffffff613b4b16565b90508584106121d1576121b8701d6329f1c35ca4bfabb9f56100000000006114698389880363ffffffff613b4b16565b90506121ca828263ffffffff613d6816565b925061220d565b6121f8701d6329f1c35ca4bfabb9f561000000000061146983878a0363ffffffff613b4b16565b905061220a828263ffffffff613d7a16565b92505b60006122296f4b3b4ca85a86c47a098a22400000000088613b70565b905060006122476f4b3b4ca85a86c47a098a22400000000087613b70565b905061229f61226483670de0b6b3a764000063ffffffff613d7a16565b6114696122928561228668056bc75e2d63100000848e8963ffffffff613b4b16565b9063ffffffff613d7a16565b889063ffffffff613b4b16565b9850505050505050505090565b600f5481565b60135460ff1681565b60048054600d54604051600160e51b6306da6857028152600093849361010090046001600160a01b03169263db4d0ae0926122f892309101615435565b60606040518083038186803b15801561231057600080fd5b505afa158015612324573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506123489190810190614bc3565b925050508061235b5760009150506111ff565b6123756f4b3b4ca85a86c47a098a22400000000082613b70565b91505090565b60146020526000908152604090205481565b60006001600054146123b457604051600160e51b62461bcd0281526004016109bf9061564d565b6002600090815560048054600654604051600160e11b6338f5892f0281526001600160a01b036101009093048316936371eb125e936123f5931691016152e5565b60206040518083038186803b15801561240d57600080fd5b505afa158015612421573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506124459190810190614864565b600854600b54604051600160e21b632b337b330281529293506001600160a01b038085169363accdeccc936124829390831692169060040161535f565b602060405180830381600087803b15801561249c57600080fd5b505af11580156124b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506124d49190810190614ba5565b50600854600160a01b900460ff161561250257604051600160e51b62461bcd0281526004016109bf906156ad565b3461252257604051600160e51b62461bcd0281526004016109bf9061563d565b6000806000806125306111ef565b156125d25760048054600d54604051600160e01b63b1fd9e050281526101009092046001600160a01b03169263b1fd9e059261257492913091600091829101615450565b60a06040518083038186803b15801561258c57600080fd5b505afa1580156125a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506125c49190810190614c06565b939750919550909350909150505b60006125de8585613b83565b90508815612609578881111561260957604051600160e51b62461bcd0281526004016109bf9061566d565b60075460408051600160e41b630d0e30db02815290516001600160a01b0390921691829163d0e30db091349160048082019260009290919082900301818588803b15801561265657600080fd5b505af115801561266a573d6000803e3d6000fd5b505050505061268d8b823485888860405180602001604052806000815250613d87565b9750505050505050600854600b54604051600160e01b63e54699c10281526001600160a01b038085169363e54699c1936126cf9391831692169060040161535f565b600060405180830381600087803b1580156126e957600080fd5b505af11580156126fd573d6000803e3d6000fd5b50506001600055509195945050505050565b60156020526000908152604090205481565b600a54600c54604051600160e21b6320a6ce3d02815260009261010090046001600160a01b03169163829b38f49161275c9190600401615427565b60206040518083038186803b15801561277457600080fd5b505afa158015612788573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506111fc9190810190614ba5565b6001600160a01b03808316600090815260196020908152604080832093851683529290529081205461124190613909565b600854600160a01b900460ff1681565b600e5481565b6001546001600160a01b0316331461280a57600080fd5b60048054600654604051600160e11b6338f5892f0281526000936001600160a01b036101009094048416936371eb125e9361284893911691016152e5565b60206040518083038186803b15801561286057600080fd5b505afa158015612874573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506128989190810190614864565b600854600b54604051600160e21b632b337b330281529293506001600160a01b038085169363accdeccc936128d59390831692169060040161535f565b602060405180830381600087803b1580156128ef57600080fd5b505af1158015612903573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506129279190810190614ba5565b506001600160a01b03851661294557600b546001600160a01b031694505b821580159061295e57506001546001600160a01b031633145b156129f15760048054600d54604051600160e11b6350f49a410281526101009092046001600160a01b03169263a1e934829261299d92918891016154d1565b602060405180830381600087803b1580156129b757600080fd5b505af11580156129cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506129ef9190810190614ba5565b505b60003415612a0d57612a0a30313463ffffffff613d6816565b90505b612a188686856140cd565b3415612aad57303181811115612aab576000336001600160a01b0316838303604051612a43906152da565b60006040518083038185875af1925050503d8060008114612a80576040519150601f19603f3d011682016040523d82523d6000602084013e612a85565b606091505b5050905080612aa957604051600160e51b62461bcd0281526004016109bf9061569d565b505b505b50600854600b54604051600160e01b63e54699c10281526001600160a01b038085169363e54699c193612ae89391831692169060040161535f565b600060405180830381600087803b158015612b0257600080fd5b505af1158015612b16573d6000803e3d6000fd5b505050505050505050565b6001600160a01b038116600090815260096020526040812054610dcc90614373565b6001546001600160a01b03163314612b5a57600080fd5b612b6381614396565b50565b600d5481565b6000600160005414612b9357604051600160e51b62461bcd0281526004016109bf9061564d565b6002600090815560048054600654604051600160e11b6338f5892f0281526001600160a01b036101009093048316936371eb125e93612bd4931691016152e5565b60206040518083038186803b158015612bec57600080fd5b505afa158015612c00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612c249190810190614864565b600854600b54604051600160e21b632b337b330281529293506001600160a01b038085169363accdeccc93612c619390831692169060040161535f565b602060405180830381600087803b158015612c7b57600080fd5b505af1158015612c8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612cb39190810190614ba5565b50600854600090600160a01b900460ff1615612ce457604051600160e51b62461bcd0281526004016109bf906156ad565b85612d0457604051600160e51b62461bcd0281526004016109bf9061562d565b600080600080612d126111ef565b15612db45760048054600d54604051600160e01b63b1fd9e050281526101009092046001600160a01b03169263b1fd9e0592612d5692913091600091829101615450565b60a06040518083038186803b158015612d6e57600080fd5b505afa158015612d82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612da69190810190614c06565b939750919550909350909150505b6000612dc08585613b83565b90508915612deb5789811115612deb57604051600160e51b62461bcd0281526004016109bf9061566d565b3415612e0557612e0230313463ffffffff613d6816565b94505b6001600160a01b038c16612ea5578a341015612e3657604051600160e51b62461bcd0281526004016109bf906155ad565b60075460408051600160e41b630d0e30db02815290516001600160a01b0390921691829163d0e30db0918f9160048082019260009290919082900301818588803b158015612e8357600080fd5b505af1158015612e97573d6000803e3d6000fd5b5050505050809c5050612f46565b8b6001600160a01b03166323b872dd33308e6040518463ffffffff1660e01b8152600401612ed59392919061531c565b602060405180830381600087803b158015612eef57600080fd5b505af1158015612f03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612f279190810190614b87565b612f4657604051600160e51b62461bcd0281526004016109bf9061552d565b612f558d8d8d8487878f613d87565b95503415612fec573031935084841115612fec576000336001600160a01b0316868603604051612f84906152da565b60006040518083038185875af1925050503d8060008114612fc1576040519150601f19603f3d011682016040523d82523d6000602084013e612fc6565b606091505b5050905080612fea57604051600160e51b62461bcd0281526004016109bf9061569d565b505b5093955050505050600854600b54604051600160e01b63e54699c10281526001600160a01b038085169363e54699c193611dea9391831692169060040161535f565b6000808461305157604051600160e51b62461bcd0281526004016109bf9061551d565b61305a336119e8565b85111561306d5761306a336119e8565b94505b60048054600d54604051600160e01b63b1fd9e050281526101009092046001600160a01b031692600092839283928392879263b1fd9e05926130b59230918791829101615450565b60a06040518083038186803b1580156130cd57600080fd5b505afa1580156130e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506131059190810190614c06565b9450945050935093506131188484613b83565b95508815613143578886101561314357604051600160e51b62461bcd0281526004016109bf9061555d565b6131538a8763ffffffff613b4b16565b965061316a60115488613b7090919063ffffffff16565b600b54604051600160e01b6370a082310281529198506000916001600160a01b03909116906370a08231906131a39030906004016152f3565b60206040518083038186803b1580156131bb57600080fd5b505afa1580156131cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506131f39190810190614ba5565b90506000613207828763ffffffff613d7a16565b9050613219818663ffffffff613d7a16565b90506000808a8410156132dd5761322e6111ef565b8e101561323f57838b039150613245565b60001991505b61325389600d54848f614405565b600b54604051600160e01b6370a082310281526001600160a01b03909116906370a08231906132869030906004016152f3565b60206040518083038186803b15801561329e57600080fd5b505afa1580156132b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506132d69190810190614ba5565b9350600190505b8a841080156132f257506132ef6111ef565b8e105b156133a457600d54604051600160e11b6350f49a41028152858d0393506000916001600160a01b038c169163a1e93482916133319187906004016154d1565b602060405180830381600087803b15801561334b57600080fd5b505af115801561335f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506133839190810190614ba5565b905080156133a25761339b858263ffffffff613d7a16565b9450600191505b505b80156134c55760006133b46111ef565b8f10156134ae57600d54604051600160e01b63b1fd9e050281526001600160a01b038c169163b1fd9e05916133f2919030908c908c9060040161548e565b60a06040518083038186803b15801561340a57600080fd5b505afa15801561341e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506134429190810190614c06565b50929b509099506000915061345f9050868b63ffffffff613d7a16565b9050613471818a63ffffffff613d7a16565b9050848110156134a8578085039150818d116134a257604051600160e51b62461bcd0281526004016109bf906155bd565b818d039c505b506134b7565b60009850600097505b848c11156134c357849b505b505b6134ce336119e8565b8e14806134f7575060115460045460ff16600a0a66038d7ea4c6800002816134f257fe5b048b10155b61351657604051600160e51b62461bcd0281526004016109bf9061556d565b613520338f614542565b6135286111ef565b158061353b57506135398888613b83565b155b1561355257670de0b6b3a7640000601b5560125499505b61355b336119e8565b1561357e576135698a613909565b3360009081526009602052604090205561358f565b336000908152600960205260408120555b505050505050505050935093915050565b60048054600654604051600160e11b6338f5892f028152600093849384936001600160a01b036101009092048216936371eb125e936135e4939290921691016152e5565b60206040518083038186803b1580156135fc57600080fd5b505afa158015613610573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506136349190810190614864565b90506000886001600160a01b031663dd62ed3e30846040518363ffffffff1660e01b8152600401613666929190615301565b60206040518083038186803b15801561367e57600080fd5b505afa158015613692573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506136b69190810190614ba5565b90508581101561380d57801561376957604051600160e01b63095ea7b30281526001600160a01b038a169063095ea7b3906136f89085906000906004016153f0565b602060405180830381600087803b15801561371257600080fd5b505af1158015613726573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061374a9190810190614b87565b61376957604051600160e51b62461bcd0281526004016109bf9061553d565b604051600160e01b63095ea7b30281526001600160a01b038a169063095ea7b39061379c9085906000199060040161540b565b602060405180830381600087803b1580156137b657600080fd5b505af11580156137ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506137ee9190810190614b87565b61380d57604051600160e51b62461bcd0281526004016109bf9061557d565b60006060836001600160a01b03168b8b8b8c8c600019600060405160240161383b979695949392919061536d565b60408051601f198184030181529181526020820180516001600160e01b0316600160e01b63051c8a8d021790525161387391906152ce565b6000604051808303816000865af19150503d80600081146138b0576040519150601f19603f3d011682016040523d82523d6000602084013e6138b5565b606091505b50915091508615806138c45750815b6138e357604051600160e51b62461bcd0281526004016109bf906155cd565b60018214156138fb5760208101519550604081015194505b505050509550959350505050565b601b54600090610dcc9061146984670de0b6b3a764000063ffffffff613b4b16565b6001600160a01b0383166000908152601960209081526040808320338452909152812054819061395a90613909565b6001600160a01b0386166000908152601860205260408120549192509061398090613909565b9050808411156139a557604051600160e51b62461bcd0281526004016109bf9061561d565b818411156139c857604051600160e51b62461bcd0281526004016109bf9061554d565b6001600160a01b0385166139f157604051600160e51b62461bcd0281526004016109bf906155dd565b613a09613a04828663ffffffff613d6816565b614373565b6001600160a01b038716600090815260186020526040902055613a2b866119e8565b613a49576001600160a01b0386166000908152601860205260408120555b6001600160a01b038516600090815260186020526040902054613a7590613a0490869061228690613909565b6001600160a01b0386166000908152601860205260409020556000198214613b0657613aaa613a04838663ffffffff613d6816565b6001600160a01b038716600090815260196020908152604080832033808552925290912091909155613add9087906127ac565b613b06576001600160a01b03861660009081526019602090815260408083203384529091528120555b846001600160a01b0316866001600160a01b031660008051602061589883398151915286604051613b379190615427565b60405180910390a350600195945050505050565b600082613b5a57506000610dcc565b5081810281838281613b6857fe5b0414610dcc57fe5b6000818381613b7b57fe5b049392505050565b6000601a5460001415613b9857601254611241565b611241613a04601a546114696011546114cb876122868a600b60009054906101000a90046001600160a01b03166001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401613bf091906152f3565b60206040518083038186803b158015613c0857600080fd5b505afa158015613c1c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506122869190810190614ba5565b336000908152601860205260408120548190613c5b90613909565b905080831115613c8057604051600160e51b62461bcd0281526004016109bf9061561d565b6001600160a01b038416613ca957604051600160e51b62461bcd0281526004016109bf906155dd565b613cbc613a04828563ffffffff613d6816565b33600081815260186020526040902091909155613cd8906119e8565b613ced57336000908152601860205260408120555b6001600160a01b038416600090815260186020526040902054613d1990613a0490859061228690613909565b6001600160a01b03851660008181526018602052604090819020929092559051339060008051602061589883398151915290613d56908790615427565b60405180910390a35060019392505050565b600082821115613d7457fe5b50900390565b81810182811015610dcc57fe5b6001546000906001600160a01b03163314613da157600080fd5b600b546001600160a01b03888116911614801590613dcd57506008546001600160a01b03888116911614155b15613eb457600b546000908190613df2908a906001600160a01b0316308b60016135a0565b9150915080881115613ea257604051600160e01b63a9059cbb0281526001600160a01b038a169063a9059cbb90613e31903390858d0390600401615344565b602060405180830381600087803b158015613e4b57600080fd5b505af1158015613e5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613e839190810190614b87565b613ea257604051600160e51b62461bcd0281526004016109bf9061552d565b50600b546001600160a01b0316975095505b600b546001600160a01b03888116911614613ed157600f54613ed5565b6011545b60045460ff16600a0a66038d7ea4c680000281613eee57fe5b04861015613f1157604051600160e51b62461bcd0281526004016109bf9061560d565b613f1c8787846140cd565b60048054600d54604051600160e01b63b1fd9e05028152600093849361010090046001600160a01b03169263b1fd9e0592613f5d9230918c918c910161548e565b60a06040518083038186803b158015613f7557600080fd5b505afa158015613f89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613fad9190810190614c06565b505050915091506000614009886114696011546114cb8661228689600b60009054906101000a90046001600160a01b03166001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401613bf091906152f3565b90506140136111ef565b811161403457604051600160e51b62461bcd0281526004016109bf9061559d565b600061403e6111ef565b8203905061404c8c826146fd565b8a6001600160a01b03168c6001600160a01b03167f458f5fa412d0f69b08dd84872b0215675cc67bc1d5b6fd93300a1c3878b861968c848d604051614093939291906156bd565b60405180910390a36140a489613909565b6001600160a01b038d166000908152600960205260409020559350505050979650505050505050565b600b54604051600160e01b6370a082310281526000916001600160a01b0316906370a08231906141019030906004016152f3565b60206040518083038186803b15801561411957600080fd5b505afa15801561412d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506141519190810190614ba5565b600854604051600160e01b6370a082310281529192506000916001600160a01b03909116906370a082319061418a9030906004016152f3565b60206040518083038186803b1580156141a257600080fd5b505afa1580156141b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506141da9190810190614ba5565b9050801515806141e957508115155b1561436c57600b546001600160a01b038681169116141561422b5783158061421057508184115b1561421f579092508290614226565b5082905060005b614280565b6008546001600160a01b03868116911614156142655783158061424d57508084115b1561425a57925082614226565b506000905082614280565b604051600160e51b62461bcd0281526004016109bf9061567d565b6000341561429657503031348111156142965750345b600a60019054906101000a90046001600160a01b03166001600160a01b0316631c5d1da58287600c5486886000308e600b60009054906101000a90046001600160a01b0316600b60009054906101000a90046001600160a01b03168f6040518c63ffffffff1660e01b81526004016143179a999897969594939291906156d8565b6020604051808303818588803b15801561433057600080fd5b505af1158015614344573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052506143699190810190614ba5565b50505b5050505050565b6000610dcc670de0b6b3a7640000611469601b5485613b4b90919063ffffffff16565b6001600160a01b0381166143a957600080fd5b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b600034156144215761441e30313463ffffffff613d6816565b90505b604051600160e01b6334cf55610281526001600160a01b038616906334cf5561903490614456908890889088906004016154df565b6020604051808303818588803b15801561446f57600080fd5b505af1158015614483573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052506144a89190810190614ba5565b50341561436c5730318181111561453a576000336001600160a01b03168383036040516144d4906152da565b60006040518083038185875af1925050503d8060008114614511576040519150601f19603f3d011682016040523d82523d6000602084013e614516565b606091505b505090508061436957604051600160e51b62461bcd0281526004016109bf9061569d565b505050505050565b6001600160a01b03821660009081526018602052604081205461456490613909565b90508082111561458957604051600160e51b62461bcd0281526004016109bf906155fd565b600061459e613a04838563ffffffff613d6816565b6001600160a01b0385166000908152601860205260409020819055600a1015806145d15750600a6145ce856119e8565b11155b156145f557506001600160a01b038316600090815260186020526040812080549190555b6000614602601a54613909565b9050838111156146515761461f613a04828663ffffffff613d6816565b601a5561462a6111ef565b61464c576000601a8190556001600160a01b0386168152601860205260408120555b614670565b6001600160a01b0385166000908152601860205260408120819055601a555b81156146bc5761468f61468283613909565b859063ffffffff613d7a16565b935081601a5411156146b657601a546146ae908363ffffffff613d6816565b601a556146bc565b6000601a555b60006001600160a01b0316856001600160a01b0316600080516020615898833981519152866040516146ee9190615427565b60405180910390a35050505050565b6001600160a01b03821661472657604051600160e51b62461bcd0281526004016109bf906155dd565b614738613a0482612286601a54613909565b601a556001600160a01b03821660009081526018602052604090205461476790613a0490839061228690613909565b6001600160a01b038316600081815260186020526040808220939093559151909190600080516020615898833981519152906147a4908590615427565b60405180910390a35050565b8035610dcc81615871565b8051610dcc81615871565b8035610dcc81615885565b8051610dcc81615885565b8051610dcc8161588e565b600082601f8301126147f857600080fd5b813561480b614806826157a8565b615781565b9150808252602083016020830185838301111561482757600080fd5b61483283828461582b565b50505092915050565b8035610dcc8161588e565b60006020828403121561485857600080fd5b6000610df384846147b0565b60006020828403121561487657600080fd5b6000610df384846147bb565b6000806040838503121561489557600080fd5b60006148a185856147b0565b92505060206148b2858286016147b0565b9150509250929050565b6000806000606084860312156148d157600080fd5b60006148dd86866147b0565b93505060206148ee868287016147b0565b92505060406148ff8682870161483b565b9150509250925092565b6000806000806080858703121561491f57600080fd5b600061492b87876147b0565b945050602061493c878288016147b0565b935050604061494d8782880161483b565b925050606061495e8782880161483b565b91505092959194509250565b600080600080600060a0868803121561498257600080fd5b600061498e88886147b0565b955050602061499f888289016147b0565b94505060406149b08882890161483b565b93505060606149c18882890161483b565b925050608086013567ffffffffffffffff8111156149de57600080fd5b6149ea888289016147e7565b9150509295509295909350565b60008060408385031215614a0a57600080fd5b6000614a1685856147b0565b925050602083013567ffffffffffffffff811115614a3357600080fd5b6148b2858286016147e7565b60008060408385031215614a5257600080fd5b6000614a5e85856147b0565b92505060206148b28582860161483b565b600080600060608486031215614a8457600080fd5b6000614a9086866147b0565b9350506020614aa18682870161483b565b925050604084013567ffffffffffffffff811115614abe57600080fd5b6148ff868287016147e7565b600080600060608486031215614adf57600080fd5b6000614aeb86866147b0565b93505060206148ee8682870161483b565b60008060008060808587031215614b1257600080fd5b6000614b1e87876147b0565b9450506020614b2f8782880161483b565b9350506040614b408782880161483b565b925050606085013567ffffffffffffffff811115614b5d57600080fd5b61495e878288016147e7565b600060208284031215614b7b57600080fd5b6000610df384846147c6565b600060208284031215614b9957600080fd5b6000610df384846147d1565b600060208284031215614bb757600080fd5b6000610df384846147dc565b600080600060608486031215614bd857600080fd5b6000614be486866147dc565b9350506020614bf5868287016147dc565b92505060406148ff868287016147dc565b600080600080600060a08688031215614c1e57600080fd5b6000614c2a88886147dc565b9550506020614c3b888289016147dc565b9450506040614c4c888289016147dc565b9350506060614c5d888289016147dc565b92505060806149ea888289016147dc565b614c77816157ff565b82525050565b614c77816157dd565b614c77816157e8565b614c77816111ff565b6000614ca3826157d0565b614cad81856157d4565b9350614cbd818560208601615837565b614cc681615867565b9093019392505050565b6000614cdb826157d0565b614ce5818561159b565b9350614cf5818560208601615837565b9290920192915050565b614c778161580a565b614c7781615815565b6000614d1e600f836157d4565b7f6275726e416d6f756e74203d3d20300000000000000000000000000000000000815260200192915050565b6000614d576018836157d4565b7f7472616e73666572206f6620746f6b656e206661696c65640000000000000000815260200192915050565b6000614d90601b836157d4565b7f746f6b656e20617070726f76616c207265736574206661696c65640000000000815260200192915050565b6000614dc96016836157d4565b7f696e73756666696369656e7420616c6c6f77616e636500000000000000000000815260200192915050565b6000614e02600d836157d4565b7f707269636520746f6f206c6f7700000000000000000000000000000000000000815260200192915050565b6000614e3b6012836157d4565b7f6275726e416d6f756e7420746f6f206c6f770000000000000000000000000000815260200192915050565b6000614e746015836157d4565b7f746f6b656e20617070726f76616c206661696c65640000000000000000000000815260200192915050565b6000614ead6020836157d4565b7f7472616e73666572206f6620746f6b656e2062616c616e6365206661696c6564815260200192915050565b6000614ee66010836157d4565b7f737570706c79206e6f7420616464656400000000000000000000000000000000815260200192915050565b6000614f1f6012836157d4565b7f696e73756666696369656e742065746865720000000000000000000000000000815260200192915050565b6000614f586012836157d4565b7f736c69707061676520746f6f2067726561740000000000000000000000000000815260200192915050565b6000614f91600b836157d4565b600160a91b6a3a3930b2329032b93937b902815260200192915050565b6000614fbb600f836157d4565b7f696e76616c696420616464726573730000000000000000000000000000000000815260200192915050565b6000614ff46016836157d4565b7f7472616e73666572206f6620455448206661696c656400000000000000000000815260200192915050565b600061502d601a836157d4565b7f6275726e2076616c756520657863656564732062616c616e6365000000000000815260200192915050565b60006150666015836157d4565b7f6465706f736974416d6f756e7420746f6f206c6f770000000000000000000000815260200192915050565b600061509f6014836157d4565b7f696e73756666696369656e742062616c616e6365000000000000000000000000815260200192915050565b60006150d86012836157d4565b7f6465706f736974416d6f756e74203d3d20300000000000000000000000000000815260200192915050565b6000615111600d836157d4565b7f6e6f2065746865722073656e7400000000000000000000000000000000000000815260200192915050565b6000610dcc60008361159b565b6000615157600c836157d4565b7f6e6f6e5265656e7472616e740000000000000000000000000000000000000000815260200192915050565b6000615190600e836157d4565b7f6465706f736974206661696c6564000000000000000000000000000000000000815260200192915050565b60006151c9600e836157d4565b7f707269636520746f6f2068696768000000000000000000000000000000000000815260200192915050565b6000615202600f836157d4565b7f696e76616c6964206465706f7369740000000000000000000000000000000000815260200192915050565b600061523b601c836157d4565b7f7472616e73666572206f66206c6f616e546f6b656e206661696c656400000000815260200192915050565b60006152746011836157d4565b7f65746820726566756e64206661696c6564000000000000000000000000000000815260200192915050565b60006152ad6006836157d4565b600160d21b651c185d5cd95902815260200192915050565b614c77816157f9565b60006112418284614cd0565b6000610dcc8261513d565b60208101610dcc8284614c7d565b60208101610dcc8284614c6e565b6040810161530f8285614c6e565b6112416020830184614c7d565b6060810161532a8286614c6e565b6153376020830185614c6e565b610df36040830184614c8f565b604081016153528285614c6e565b6112416020830184614c8f565b6040810161530f8285614c7d565b60e0810161537b828a614c7d565b6153886020830189614c7d565b6153956040830188614c7d565b6153a26060830187614c7d565b6153af6080830186614c8f565b6153bc60a0830185614c8f565b6153c960c0830184614d08565b98975050505050505050565b606081016153e38286614c7d565b6153376020830185614c7d565b604081016153fe8285614c7d565b6112416020830184614cff565b604081016153528285614c7d565b60208101610dcc8284614c86565b60208101610dcc8284614c8f565b604081016154438285614c8f565b6112416020830184614c6e565b6080810161545e8287614c8f565b61546b6020830186614c6e565b6154786040830185614cff565b6154856060830184614cff565b95945050505050565b6080810161549c8287614c8f565b6154a96020830186614c6e565b6154b66040830185614c8f565b6154856060830184614c8f565b606081016153e38286614c8f565b604081016153528285614c8f565b606081016154ed8286614c8f565b6154fa6020830185614c8f565b8181036040830152610df08184614c98565b602080825281016112418184614c98565b60208082528101610dcc81614d11565b60208082528101610dcc81614d4a565b60208082528101610dcc81614d83565b60208082528101610dcc81614dbc565b60208082528101610dcc81614df5565b60208082528101610dcc81614e2e565b60208082528101610dcc81614e67565b60208082528101610dcc81614ea0565b60208082528101610dcc81614ed9565b60208082528101610dcc81614f12565b60208082528101610dcc81614f4b565b60208082528101610dcc81614f84565b60208082528101610dcc81614fae565b60208082528101610dcc81614fe7565b60208082528101610dcc81615020565b60208082528101610dcc81615059565b60208082528101610dcc81615092565b60208082528101610dcc816150cb565b60208082528101610dcc81615104565b60208082528101610dcc8161514a565b60208082528101610dcc81615183565b60208082528101610dcc816151bc565b60208082528101610dcc816151f5565b60208082528101610dcc8161522e565b60208082528101610dcc81615267565b60208082528101610dcc816152a0565b606081016156cb8286614c8f565b6153376020830185614c8f565b61014081016156e7828d614c8f565b6156f4602083018c614c8f565b615701604083018b614c8f565b61570e606083018a614c8f565b61571b6080830189614cff565b61572860a0830188614c6e565b61573560c0830187614c7d565b61574260e0830186614c7d565b615750610100830185614c7d565b8181036101208301526157638184614c98565b9c9b505050505050505050505050565b60208101610dcc82846152c5565b60405181810167ffffffffffffffff811182821017156157a057600080fd5b604052919050565b600067ffffffffffffffff8211156157bf57600080fd5b506020601f91909101601f19160190565b5190565b90815260200190565b6000610dcc826157ed565b151590565b6001600160a01b031690565b60ff1690565b6000610dcc82615820565b6000610dcc826111ff565b6000610dcc826157f9565b6000610dcc826157dd565b82818337506000910152565b60005b8381101561585257818101518382015260200161583a565b83811115615861576000848401525b50505050565b601f01601f191690565b61587a816157dd565b8114612b6357600080fd5b61587a816157e8565b61587a816111ff56feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa265627a7a72305820ff79ba3a0727bccb2efc5563a6d2a1e4d6745b69740acfbf25273fed0582724a6c6578706572696d656e74616cf50037
Deployed Bytecode Sourcemap
16235:33976:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6868:33;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6868:33:0;;;:::i;:::-;;;;;;;;;;;;;;;;5819:18;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5819:18:0;;;:::i;:::-;;;;;;;;27798:972;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;27798:972:0;;;;;;;;:::i;10803:384::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;10803:384:0;;;;;;;;:::i;:::-;;;;;;;;17517:369;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;17517:369:0;;;;;;;;:::i;6908:35::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6908:35:0;;;:::i;22314:1871::-;;;;;;;;;:::i;8116:136::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8116:136:0;;;:::i;6952:27::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6952:27:0;;;:::i;26920:364::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;26920:364:0;;;;;;;;:::i;49031:1177::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;49031:1177:0;;;;;;;;:::i;6388:132::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;6388:132:0;;;;;;;;:::i;5871:21::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5871:21:0;;;:::i;:::-;;;;;;;;6250:132;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;6250:132:0;;;;;;;;:::i;17124:385::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;17124:385:0;;;;;;;;:::i;48701:322::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48701:322:0;;;:::i;5995:27::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5995:27:0;;;:::i;:::-;;;;;;;;6635:30;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6635:30:0;;;:::i;33432:629::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;33432:629:0;;;;;;;;:::i;16846:270::-;;;;;;;;;:::i;17894:303::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;17894:303:0;;;;;;;;:::i;32839:585::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32839:585:0;;;:::i;25923:989::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;25923:989:0;;;;;;;;:::i;8260:162::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;8260:162:0;;;;;;;;:::i;6031:31::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6031:31:0;;;:::i;30018:530::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30018:530:0;;;:::i;6103:25::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6103:25:0;;;:::i;5934:23::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5934:23:0;;;:::i;24193:1538::-;;;;;;;;;:::i;3326:20::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3326:20:0;;;:::i;7132:27::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7132:27:0;;;:::i;5844:20::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5844:20:0;;;:::i;5964:24::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5964:24:0;;;:::i;7166:27::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7166:27:0;;;:::i;5901:26::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5901:26:0;;;:::i;8072:35::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8072:35:0;;;:::i;27292:322::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;27292:322:0;;;;;;;;:::i;6713:29::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6713:29:0;;;:::i;6672:32::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6672:32:0;;;:::i;34069:947::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34069:947:0;;;:::i;30556:1515::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30556:1515:0;;;:::i;6825:34::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6825:34:0;;;:::i;6988:25::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6988:25:0;;;:::i;32266:366::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32266:366:0;;;:::i;7022:47::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;7022:47:0;;;;;;;;:::i;18293:1493::-;;;;;;;;;:::i;7076:47::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;7076:47:0;;;;;;;;:::i;32640:191::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32640:191:0;;;:::i;8430:198::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;8430:198:0;;;;;;;;:::i;6071:25::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6071:25:0;;;:::i;6786:32::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6786:32:0;;;:::i;28778:1195::-;;;;;;;;;:::i;32079:179::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;32079:179:0;;;;;;;;:::i;3957:105::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3957:105:0;;;;;;;;:::i;6749:28::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6749:28:0;;;:::i;19877:2429::-;;;;;;;;;:::i;6868:33::-;;;;:::o;5819:18::-;;;;;;;;;;;;;;-1:-1:-1;;5819:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27798:972::-;4859:1;5527:14;;:39;5519:64;;;;-1:-1:-1;;;;;5519:64:0;;;;;;;;;;;;;;;;;4963:1;5590:14;:40;27966:131;;-1:-1:-1;;;;;27966:131:0;;-1:-1:-1;;;;;27966:39:0;;;;;:131;;28020:10;;28053:4;;28073:13;;27966:131;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27966:131:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27966:131:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;27966:131:0;;;;;;;;;27958:168;;;;-1:-1:-1;;;;;27958:168:0;;;;;;;;;28215:8;;28163:61;;-1:-1:-1;;;;;28163:61:0;;28139:21;;-1:-1:-1;;;;;28163:36:0;;;;;;:61;;28208:4;;28215:8;;;28163:61;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28163:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28163:61:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;28163:61:0;;;;;;;;;28139:85;;28255:13;28239;:29;28235:352;;;28289:18;;28285:186;;28411:8;;28376:47;;-1:-1:-1;;;;;28376:47:0;;-1:-1:-1;;;;;28376:34:0;;;;;;:47;;28411:8;;;;;;28376:47;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28376:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28376:47:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;28376:47:0;;;;;;;;;28368:87;;;;-1:-1:-1;;;;;28368:87:0;;;;;;;;;28530:8;;28495:54;;-1:-1:-1;;;;;28495:54:0;;-1:-1:-1;;;;;28495:34:0;;;;;;:54;;28530:8;;;;-1:-1:-1;;5800:10:0;28495:54;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28495:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28495:54:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;28495:54:0;;;;;;;;;28487:88;;;;-1:-1:-1;;;;;28487:88:0;;;;;;;;;28612:11;;;28657:13;;28607:136;;-1:-1:-1;;;;;28607:136:0;;28612:11;;;;-1:-1:-1;;;;;28612:11:0;;28607:35;;:136;;28657:13;28685:19;;28719:13;;28607:136;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28607:136:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28607:136:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;28607:136:0;;;;;;;;;28599:163;;;;-1:-1:-1;;;;;28599:163:0;;;;;;;;;-1:-1:-1;;4859:1:0;5645:14;:38;-1:-1:-1;27798:972:0:o;10803:384::-;10937:10;10907:4;10929:19;;;:7;:19;;;;;;;;-1:-1:-1;;;;;10929:29:0;;;;;;;;;:38;;;-1:-1:-1;;10982:18:0;;;;;:58;;;11004:31;11014:10;11026:8;11004:9;:31::i;:::-;:36;10982:58;10978:124;;;11065:10;11089:1;11057:19;;;:7;:19;;;;;;;;-1:-1:-1;;;;;11057:29:0;;;;;;;;;:33;10978:124;11140:8;-1:-1:-1;;;;;11119:38:0;11128:10;-1:-1:-1;;;;;11119:38:0;;11150:6;11119:38;;;;;;;;;;;;;;;-1:-1:-1;11175:4:0;10803:384;;;;;:::o;17517:369::-;17698:7;17730:148;17756:8;17779:16;17810:10;17835:15;17730:148;;;;;;;;;;;;:11;:148::i;:::-;17723:155;;17517:369;;;;;;;:::o;6908:35::-;;;;:::o;22314:1871::-;22559:7;4859:1;5527:14;;:39;5519:64;;;;-1:-1:-1;;;;;5519:64:0;;;;;;;;;4963:1;5590:14;:40;;;16430:11;;;16459:9;;16425:44;;-1:-1:-1;;;;;16425:44:0;;-1:-1:-1;;;;;16430:11:0;;;;;;;16425:33;;:44;;16459:9;;16425:44;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16425:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16425:44:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;16425:44:0;;;;;;;;;16535:16;;16566:17;;16482:112;;-1:-1:-1;;;;;16482:112:0;;16400:69;;-1:-1:-1;;;;;;16482:38:0;;;;;;:112;;16535:16;;;;16566:17;;16482:112;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16482:112:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16482:112:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;16482:112:0;;;;;;;;;-1:-1:-1;22593:13:0;;-1:-1:-1;;;22593:13:0;;;;22592:14;22584:33;;;;-1:-1:-1;;;;;22584:33:0;;;;;;;;;22629:28;22659:20;22683:104;22708:10;22733:15;22763:13;22683:10;:104::i;:::-;22628:159;;;;22802:20;22826:1;22802:25;22798:1172;;22868:12;;22916:17;;-1:-1:-1;;;;;22868:12:0;;;;22916:17;22899:34;;22895:1064;;23029:17;;22955:31;;22991:373;;-1:-1:-1;;;;;23029:17:0;22955:31;23183:8;23240:20;23029:17;22991:15;:373::i;:::-;-1:-1:-1;22954:410:0;-1:-1:-1;22895:1064:0;;-1:-1:-1;22895:1064:0;;23588:133;;-1:-1:-1;;;;;23588:133:0;;23509:42;;23472:22;;-1:-1:-1;;;;;23588:29:0;;;;;:133;;23509:42;;23682:20;;23588:133;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23588:133:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23588:133:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;23588:133:0;;;;;;;;;23573:148;;23744:7;23740:143;;;23810:53;;-1:-1:-1;;;;;23810:53:0;;-1:-1:-1;;;;;23810:21:0;;;;;:53;;23832:8;;23842:20;;23810:53;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23810:53:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23810:53:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;23810:53:0;;;;;;;;;23786:20;:77;23776:87;;23740:143;23909:7;23901:42;;;;-1:-1:-1;;;;;23901:42:0;;;;;;;;;22895:1064;;;22798:1172;;24037:1;-1:-1:-1;;;;;23987:150:0;24006:8;-1:-1:-1;;;;;23987:150:0;;24054:20;24089:10;24114:12;23987:150;;;;;;;;;;;;;;;;;-1:-1:-1;24157:20:0;-1:-1:-1;16676:16:0;;16707:17;;16621:114;;-1:-1:-1;;;;;16621:114:0;;-1:-1:-1;;;;;16621:40:0;;;;;;:114;;16676:16;;;;16707:17;;16621:114;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16621:114:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;4859:1:0;5645:14;:38;-1:-1:-1;22314:1871:0;;;-1:-1:-1;;;;;;22314:1871:0:o;8116:136::-;8187:7;8219:25;8231:12;;8219:11;:25::i;:::-;8212:32;;8116:136;;:::o;6952:27::-;;;;:::o;26920:364::-;27048:4;27070:88;27103:5;27123:3;27141:6;27070:18;:88::i;:::-;;27175:16;27185:5;27175:9;:16::i;:::-;27171:82;;-1:-1:-1;;;;;27213:24:0;;27240:1;27213:24;;;:17;:24;;;;;:28;27171:82;-1:-1:-1;27272:4:0;26920:364;;;;;;:::o;49031:1177::-;49171:5;;-1:-1:-1;;;;;49171:5:0;49157:10;:19;49153:571;;49427:66;49421:73;49541:66;49535:73;49645:10;-1:-1:-1;;;;;49645:25:0;;;:66;;;;;49692:19;-1:-1:-1;;;;;49674:37:0;:14;-1:-1:-1;;;;;49674:37:0;;49645:66;49637:75;;;;;;49153:571;;;49760:7;;;-1:-1:-1;;;;;49778:24:0;;;-1:-1:-1;;;;;;49778:24:0;;;;;;49832:28;;49760:7;;;49736:21;;49840:4;;49832:28;;49851:8;;49832:28;;;;;;;;;;;;;;;;;;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;;49991:4:0;49985:11;49815:45;;-1:-1:-1;49950:14:0;;;49873:12;49985:11;50010:28;50055:13;50052:2;;50083:4;50078:3;50071:17;50052:2;50113:7;:23;;-1:-1:-1;;;;;;50113:23:0;-1:-1:-1;;;;;50113:23:0;;;;;50185:4;50180:3;50173:17;6388:132;3769:5;;-1:-1:-1;;;;;3769:5:0;3755:10;:19;3747:28;;;;;;6487:13;:25;;;;;-1:-1:-1;;;6487:25:0;-1:-1:-1;;;;;;6487:25:0;;;;;;;;;6388:132::o;5871:21::-;;;;;;:::o;6250:132::-;3769:5;;-1:-1:-1;;;;;3769:5:0;3755:10;:19;3747:28;;;;;;6349:13;:25;;;;;-1:-1:-1;;;6349:25:0;-1:-1:-1;;6349:25:0;;;;;;;;;6250:132::o;17124:385::-;17313:7;17345:156;17373:8;17396:19;17430:13;17458:15;17345:156;;;;;;;;;;;;:13;:156::i;48701:322::-;3769:5;;-1:-1:-1;;;;;3769:5:0;3755:10;:19;3747:28;;;;;;48779:13;:11;:13::i;:::-;:18;48775:241;;48828:123;48920:12;:10;:12::i;:::-;48862;;48828:11;;:47;;;:33;:47;:::i;:::-;:69;:123;:69;:123;:::i;:::-;48814:11;:137;48775:241;;;48998:6;48984:11;:20;48775:241;48701:322::o;5995:27::-;;;-1:-1:-1;;;;;5995:27:0;;:::o;6635:30::-;;;;;;-1:-1:-1;;;;;6635:30:0;;:::o;33432:629::-;33529:13;33568:89;33636:20;;33568:49;33604:12;:10;:12::i;:::-;33568:17;33578:6;33568:9;:17::i;:::-;:35;:49;:35;:49;:::i;:89::-;33674:13;;33560:97;;-1:-1:-1;33674:13:0;;33670:384;;;33776:9;;33818:17;;33854:16;;33765:164;;-1:-1:-1;;;;;33765:164:0;;33705:24;;;;-1:-1:-1;;;;;33776:9:0;;;;33765:34;;:164;;33818:17;;;;33854:16;;;;-1:-1:-1;;5800:10:0;33765:164;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33765:164:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33765:164:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;33765:164:0;;;;;;;;;-1:-1:-1;33704:225:0;;-1:-1:-1;33704:225:0;-1:-1:-1;33952:90:0;33704:225;33952:45;:5;33704:225;33952:45;:27;:45;:::i;:90::-;33944:98;;33670:384;;;33432:629;;;:::o;16846:270::-;16982:7;17014:94;17042:8;17065:15;17014:94;;;;;;;;;;;;:13;:94::i;17894:303::-;18040:7;18072:117;18098:8;18121:10;18146:15;18072:117;;;;;;;;;;;;:11;:117::i;32839:585::-;32968:15;;33004:14;;32957:62;;-1:-1:-1;;;;;32957:62:0;;32918:13;;32968:15;;;-1:-1:-1;;;;;32968:15:0;;32957:46;;:62;;33004:14;32957:62;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32957:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32957:62:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;32957:62:0;;;;;;;;;33037:13;;32949:70;;-1:-1:-1;33037:13:0;;33032:385;;33139:9;;33181:16;;33216:17;;33128:164;;-1:-1:-1;;;;;33128:164:0;;33068:24;;;;-1:-1:-1;;;;;33139:9:0;;;;33128:34;;:164;;33181:16;;;;33216:17;;;;-1:-1:-1;;5800:10:0;33128:164;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33128:164:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33128:164:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;33128:164:0;;;;;;;;;-1:-1:-1;33067:225:0;;-1:-1:-1;33067:225:0;-1:-1:-1;33315:90:0;33067:225;33315:45;:5;33067:225;33315:45;:27;:45;:::i;:90::-;33307:98;;33032:385;;32839:585;:::o;25923:989::-;26034:4;4859:1;5527:14;;:39;5519:64;;;;-1:-1:-1;;;;;5519:64:0;;;;;;;;;4963:1;5590:14;:40;26076:17;;-1:-1:-1;;;;;26060:33:0;;;26076:17;;26060:33;;:69;;-1:-1:-1;26113:16:0;;-1:-1:-1;;;;;26097:32:0;;;26113:16;;26097:32;26060:69;26056:100;;;-1:-1:-1;26151:5:0;26144:12;;26056:100;26169:15;;-1:-1:-1;;;;;26223:26:0;;26219:491;;26284:4;26276:21;;-1:-1:-1;26316:12:0;26312:47;;26354:5;26347:12;;;;;;26312:47;26398:12;;26425:53;;;-1:-1:-1;;;;;26425:53:0;;;;-1:-1:-1;;;;;26398:12:0;;;;;;26425:36;;26468:7;;26425:53;;;;;26374:21;;26425:53;;;;;;;;26468:7;26398:12;26425:53;;;5:2:-1;;;;30:1;27;20:12;5:2;26425:53:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26425:53:0;;;;;26501:13;26493:21;;26219:491;;;;26557:44;;-1:-1:-1;;;;;26557:44:0;;-1:-1:-1;;;;;26557:29:0;;;;;:44;;26595:4;;26557:44;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26557:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26557:44:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;26557:44:0;;;;;;;;;26547:54;-1:-1:-1;26620:12:0;26616:47;;26658:5;26651:12;;;;;;26616:47;-1:-1:-1;26686:12:0;26219:491;26771:11;;;26800:9;;26766:44;;-1:-1:-1;;;;;26766:44:0;;-1:-1:-1;;;;;26730:21:0;;;;;;26771:11;;;;;;26766:33;;:44;;26800:9;;;;26766:44;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26766:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26766:44:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;26766:44:0;;;;;;;;;26825:7;26730:113;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26730:113:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26730:113:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;26730:113:0;;;;;;;;;26722:158;;;;-1:-1:-1;;;;;26722:158:0;;;;;;;;;26900:4;26893:11;;;;5637:1;4859;5645:14;:38;25923:989;;-1:-1:-1;25923:989:0:o;8260:162::-;-1:-1:-1;;;;;8397:16:0;;8353:7;8397:16;;;:8;:16;;;;;;8385:29;;:11;:29::i;6031:31::-;;;-1:-1:-1;;;;;6031:31:0;;:::o;30018:530::-;30088:13;30119:27;30157:32;30204:13;:11;:13::i;:::-;:18;30200:263;;30297:11;;;30351:13;;30292:159;;-1:-1:-1;;;;;30292:159:0;;30297:11;;;;-1:-1:-1;;;;;30297:11:0;;30292:40;;:159;;30351:13;30391:4;;30415:1;;;;30292:159;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30292:159:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30292:159:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;30292:159:0;;;;;;;;;-1:-1:-1;30239:212:0;;-1:-1:-1;30239:212:0;;-1:-1:-1;;;30200:263:0;30482:58;30494:19;30515:24;30482:11;:58::i;6103:25::-;;;-1:-1:-1;;;6103:25:0;;;;;:::o;5934:23::-;;;-1:-1:-1;;;;;5934:23:0;;:::o;24193:1538::-;24473:7;4859:1;5527:14;;:39;5519:64;;;;-1:-1:-1;;;;;5519:64:0;;;;;;;;;4963:1;5590:14;:40;;;16430:11;;;16459:9;;16425:44;;-1:-1:-1;;;;;16425:44:0;;-1:-1:-1;;;;;16430:11:0;;;;;;;16425:33;;:44;;16459:9;;16425:44;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16425:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16425:44:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;16425:44:0;;;;;;;;;16535:16;;16566:17;;16482:112;;-1:-1:-1;;;;;16482:112:0;;16400:69;;-1:-1:-1;;;;;;16482:38:0;;;;;;:112;;16535:16;;;;16566:17;;16482:112;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16482:112:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16482:112:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;16482:112:0;;;;;;;;;-1:-1:-1;24507:13:0;;-1:-1:-1;;;24507:13:0;;;;24506:14;24498:33;;;;-1:-1:-1;;;;;24498:33:0;;;;;;;;;24543:28;24573:20;24597:104;24622:10;24647:15;24677:13;24597:10;:104::i;:::-;24542:159;;;;24716:20;24740:1;24716:25;24712:798;;24782:17;;-1:-1:-1;;;;;24762:37:0;;;24782:17;;24762:37;24758:741;;24895:17;;24821:31;;24857:351;;-1:-1:-1;;;;;24895:17:0;24962:16;25027:8;25084:20;24895:17;24857:15;:351::i;:::-;-1:-1:-1;24820:388:0;-1:-1:-1;24758:741:0;;-1:-1:-1;24758:741:0;;25330:17;;25324:126;;-1:-1:-1;;;;;25324:126:0;;-1:-1:-1;;;;;25330:17:0;;;;25324:33;;:126;;25380:8;;25411:20;;25324:126;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25324:126:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25324:126:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;25324:126:0;;;;;;;;;25316:167;;;;-1:-1:-1;;;;;25316:167:0;;;;;;;;;25569:16;-1:-1:-1;;;;;25527:156:0;25546:8;-1:-1:-1;;;;;25527:156:0;;25600:20;25635:10;25660:12;25527:156;;;;;;;;;;;;;;;;;-1:-1:-1;25703:20:0;-1:-1:-1;16676:16:0;;16707:17;;16621:114;;-1:-1:-1;;;;;16621:114:0;;-1:-1:-1;;;;;16621:40:0;;;;;;:114;;16676:16;;;;16707:17;;16621:114;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16621:114:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;4859:1:0;5645:14;:38;-1:-1:-1;24193:1538:0;;;-1:-1:-1;;;;;;;24193:1538:0:o;3326:20::-;;;-1:-1:-1;;;;;3326:20:0;;:::o;7132:27::-;;;;:::o;5844:20::-;;;;;;;;;;;;;;;-1:-1:-1;;5844:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5964:24;;;-1:-1:-1;;;;;5964:24:0;;:::o;7166:27::-;;;;:::o;5901:26::-;;;;;;-1:-1:-1;;;;;5901:26:0;;:::o;8072:35::-;;;;:::o;27292:322::-;27392:4;27414:64;27443:3;27461:6;27414:14;:64::i;:::-;;27495:21;27505:10;27495:9;:21::i;:::-;27491:92;;27556:10;27570:1;27538:29;;;:17;:29;;;;;:33;27491:92;-1:-1:-1;27602:4:0;27292:322;;;;:::o;6713:29::-;;;;:::o;6672:32::-;;;-1:-1:-1;;;;;6672:32:0;;:::o;34069:947::-;34257:13;;34147;;;;;;34257;;34253:756;;;34343:9;;34385:16;;34420:17;;34332:164;;-1:-1:-1;;;;;34332:164:0;;-1:-1:-1;;;;;34343:9:0;;;;34332:34;;:164;;34385:16;;;;34420:17;;;-1:-1:-1;;5800:10:0;34332:164;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34332:164:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34332:164:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;34332:164:0;;;;;;;;;-1:-1:-1;34562:17:0;;34287:209;;-1:-1:-1;34287:209:0;-1:-1:-1;34519:106:0;;34287:209;;34519:61;;34287:209;;34558:2;:21;34519:61;:38;:61;:::i;:106::-;34511:114;;34253:756;;;34714:9;;34756:17;;34792:16;;34703:164;;-1:-1:-1;;;;;34703:164:0;;-1:-1:-1;;;;;34714:9:0;;;;34703:34;;:164;;34756:17;;;;34792:16;;;-1:-1:-1;;5800:10:0;34703:164;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34703:164:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34703:164:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;34703:164:0;;;;;;;;;-1:-1:-1;34933:18:0;;34658:209;;-1:-1:-1;34658:209:0;-1:-1:-1;34890:107:0;;34658:209;;34890:62;;34658:209;;34929:2;:22;34890:62;:38;:62;:::i;34253:756::-;34069:947;;;:::o;30556:1515::-;30632:13;30664:27;30693:31;30725:27;30761:11;;;;;;;;;-1:-1:-1;;;;;30761:11:0;-1:-1:-1;;;;;30756:33:0;;30804:13;;30840:4;30756:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30756:90:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30756:90:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;30756:90:0;;;;;;;;;30663:183;;;;;;30863:23;30890:1;30863:28;30859:155;;;30913:1;30906:8;;;;;;;30859:155;30957:23;30934:19;:46;30930:84;;31002:12;:10;:12::i;:::-;30995:19;;;;;;;30930:84;31027:20;31058;31081:12;:10;:12::i;:::-;31058:35;-1:-1:-1;31104:14:0;31121:51;31058:35;31152:19;31121:51;:30;:51;:::i;:::-;31104:68;;31210:19;31187;:42;31183:460;;31255:93;31341:6;31255:67;:6;31280:41;;;31255:67;:24;:67;:::i;:93::-;31246:102;-1:-1:-1;31380:42:0;:12;31246:102;31380:42;:34;:42;:::i;:::-;31365:57;;31183:460;;;31464:93;31550:6;31464:67;:6;31489:41;;;31464:67;:24;:67;:::i;:93::-;31455:102;-1:-1:-1;31589:42:0;:12;31455:102;31589:42;:34;:42;:::i;:::-;31574:57;;31183:460;31655:23;31681:41;31694:6;31702:19;31681:12;:41::i;:::-;31655:67;;31733:23;31759:41;31772:6;31780:19;31759:12;:41::i;:::-;31733:67;-1:-1:-1;31821:242:0;32035:27;:15;32055:6;32035:27;:19;:27;:::i;:::-;31821:195;31870:131;31985:15;31870:92;31955:6;31821:195;31870:23;31916:15;31870:62;:45;:62;:::i;:92::-;:114;:131;:114;:131;:::i;:::-;31821:12;;:195;:30;:195;:::i;:242::-;31813:250;;30556:1515;;;;;;;;;:::o;6825:34::-;;;;:::o;6988:25::-;;;;;;:::o;32266:366::-;32414:11;;;32457:13;;32409:90;;-1:-1:-1;;;;;32409:90:0;;32341:16;;;;32414:11;;;-1:-1:-1;;;;;32414:11:0;;32409:33;;:90;;32493:4;;32409:90;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32409:90:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32409:90:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;32409:90:0;;;;;;;;;32375:124;-1:-1:-1;;;32516:24:0;32512:51;;32562:1;32555:8;;;;;32512:51;32583:41;32596:6;32604:19;32583:12;:41::i;:::-;32576:48;;;32266:366;:::o;7022:47::-;;;;;;;;;;;;;:::o;18293:1493::-;18515:7;4859:1;5527:14;;:39;5519:64;;;;-1:-1:-1;;;;;5519:64:0;;;;;;;;;4963:1;5590:14;:40;;;16430:11;;;16459:9;;16425:44;;-1:-1:-1;;;;;16425:44:0;;-1:-1:-1;;;;;16430:11:0;;;;;;;16425:33;;:44;;16459:9;;16425:44;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16425:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16425:44:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;16425:44:0;;;;;;;;;16535:16;;16566:17;;16482:112;;-1:-1:-1;;;;;16482:112:0;;16400:69;;-1:-1:-1;;;;;;16482:38:0;;;;;;:112;;16535:16;;;;16566:17;;16482:112;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16482:112:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16482:112:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;16482:112:0;;;;;;;;;-1:-1:-1;18549:13:0;;-1:-1:-1;;;18549:13:0;;;;18548:14;18540:33;;;;-1:-1:-1;;;;;18540:33:0;;;;;;;;;18592:9;18584:40;;;;-1:-1:-1;;;;;18584:40:0;;;;;;;;;18637:27;18675:32;18718:24;18753:29;18797:13;:11;:13::i;:::-;:18;18793:359;;18986:11;;;19040:13;;18981:159;;-1:-1:-1;;;;;18981:159:0;;18986:11;;;;-1:-1:-1;;;;;18986:11:0;;18981:40;;:159;;19040:13;19080:4;;19104:1;;;;18981:159;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18981:159:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18981:159:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;18981:159:0;;;;;;;;;18832:308;;-1:-1:-1;18832:308:0;;-1:-1:-1;18832:308:0;;-1:-1:-1;18832:308:0;;-1:-1:-1;;18793:359:0;19162:20;19185:58;19197:19;19218:24;19185:11;:58::i;:::-;19162:81;-1:-1:-1;19260:20:0;;19256:160;;19339:15;19323:12;:31;;19297:107;;;;-1:-1:-1;;;;;19297:107:0;;;;;;;;;19452:12;;19475:55;;;-1:-1:-1;;;;;19475:55:0;;;;-1:-1:-1;;;;;19452:12:0;;;;;;19475:36;;19518:9;;19475:55;;;;;19428:21;;19475:55;;;;;;;;19518:9;19452:12;19475:55;;;5:2:-1;;;;30:1;27;20:12;5:2;19475:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19475:55:0;;;;;19550:228;19579:8;19602:13;19630:9;19654:12;19681:16;19712:21;19550:228;;;;;;;;;;;;:14;:228::i;:::-;19543:235;;;;;;;;16676:16;;16707:17;;16621:114;;-1:-1:-1;;;;;16621:114:0;;-1:-1:-1;;;;;16621:40:0;;;;;;:114;;16676:16;;;;16707:17;;16621:114;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16621:114:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;4859:1:0;5645:14;:38;-1:-1:-1;18293:1493:0;;;-1:-1:-1;;;;;18293:1493:0:o;7076:47::-;;;;;;;;;;;;;:::o;32640:191::-;32772:15;;32808:14;;32761:62;;-1:-1:-1;;;;;32761:62:0;;32722:13;;32772:15;;;-1:-1:-1;;;;;32772:15:0;;32761:46;;:62;;32808:14;32761:62;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32761:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32761:62:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;32761:62:0;;;;;;;;8430:198;-1:-1:-1;;;;;8594:15:0;;;8550:7;8594:15;;;:7;:15;;;;;;;;:25;;;;;;;;;;;;8582:38;;:11;:38::i;6071:25::-;;;-1:-1:-1;;;6071:25:0;;;;;:::o;6786:32::-;;;;:::o;28778:1195::-;3769:5;;-1:-1:-1;;;;;3769:5:0;3755:10;:19;3747:28;;;;;;16430:11;;;16459:9;;16425:44;;-1:-1:-1;;;;;16425:44:0;;16400:22;;-1:-1:-1;;;;;16430:11:0;;;;;;;16425:33;;:44;;16459:9;;;16425:44;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16425:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16425:44:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;16425:44:0;;;;;;;;;16535:16;;16566:17;;16482:112;;-1:-1:-1;;;;;16482:112:0;;16400:69;;-1:-1:-1;;;;;;16482:38:0;;;;;;:112;;16535:16;;;;16566:17;;16482:112;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16482:112:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16482:112:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;16482:112:0;;;;;;;;;-1:-1:-1;;;;;;29040:33:0;;29036:105;;29112:17;;-1:-1:-1;;;;;29112:17:0;;-1:-1:-1;29036:105:0;29157:20;;;;;:43;;-1:-1:-1;29195:5:0;;-1:-1:-1;;;;;29195:5:0;29181:10;:19;29157:43;29153:193;;;29222:11;;;29272:13;;29217:117;;-1:-1:-1;;;;;29217:117:0;;29222:11;;;;-1:-1:-1;;;;;29222:11:0;;29217:36;;:117;;29272:13;29304:15;;29217:117;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29217:117:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29217:117:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;29217:117:0;;;;;;;;;;29153:193;29358:26;29399:9;:14;29395:104;;29451:36;29459:4;29451:21;29477:9;29451:36;:25;:36;:::i;:::-;29430:57;;29395:104;29511:114;29542:19;29576:13;29604;29511:16;:114::i;:::-;29642:9;:14;29638:328;;29709:4;29701:21;29741:38;;;29737:218;;;29801:12;29818:10;-1:-1:-1;;;;;29818:15:0;29860:18;29840:17;:38;29818:65;;;;;;;;;;;;;;;;;;;;;;;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;;29800:83:0;;;29910:7;29902:37;;;;-1:-1:-1;;;;;29902:37:0;;;;;;;;;29737:218;;29638:328;;-1:-1:-1;16676:16:0;;16707:17;;16621:114;;-1:-1:-1;;;;;16621:114:0;;-1:-1:-1;;;;;16621:40:0;;;;;;:114;;16676:16;;;;16707:17;;16621:114;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16621:114:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16621:114:0;;;;3782:1;28778:1195;;;;:::o;32079:179::-;-1:-1:-1;;;;;32225:24:0;;32177:13;32225:24;;;:17;:24;;;;;;32215:35;;:9;:35::i;3957:105::-;3769:5;;-1:-1:-1;;;;;3769:5:0;3755:10;:19;3747:28;;;;;;4027:29;4046:9;4027:18;:29::i;:::-;3957:105;:::o;6749:28::-;;;;:::o;19877:2429::-;20165:7;4859:1;5527:14;;:39;5519:64;;;;-1:-1:-1;;;;;5519:64:0;;;;;;;;;4963:1;5590:14;:40;;;16430:11;;;16459:9;;16425:44;;-1:-1:-1;;;;;16425:44:0;;-1:-1:-1;;;;;16430:11:0;;;;;;;16425:33;;:44;;16459:9;;16425:44;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16425:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16425:44:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;16425:44:0;;;;;;;;;16535:16;;16566:17;;16482:112;;-1:-1:-1;;;;;16482:112:0;;16400:69;;-1:-1:-1;;;;;;16482:38:0;;;;;;:112;;16535:16;;;;16566:17;;16482:112;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16482:112:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16482:112:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;16482:112:0;;;;;;;;;-1:-1:-1;20228:13:0;;20190:18;;-1:-1:-1;;;20228:13:0;;;;20227:14;20219:33;;;;-1:-1:-1;;;;;20219:33:0;;;;;;;;;20271:18;20263:49;;;;-1:-1:-1;;;;;20263:49:0;;;;;;;;;20325:14;20373;20426:24;20461:29;20505:13;:11;:13::i;:::-;:18;20501:328;;20663:11;;;20717:13;;20658:159;;-1:-1:-1;;;;;20658:159:0;;20663:11;;;;-1:-1:-1;;;;;20663:11:0;;20658:40;;:159;;20717:13;20757:4;;20781:1;;;;20658:159;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20658:159:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20658:159:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;20658:159:0;;;;;;;;;20540:277;;-1:-1:-1;20540:277:0;;-1:-1:-1;20540:277:0;;-1:-1:-1;20540:277:0;;-1:-1:-1;;20501:328:0;20839:20;20862:27;20874:6;20882;20862:11;:27::i;:::-;20839:50;-1:-1:-1;20906:20:0;;20902:160;;20985:15;20969:12;:31;;20943:107;;;;-1:-1:-1;;;;;20943:107:0;;;;;;;;;21078:9;:14;21074:114;;21118:36;21126:4;21118:21;21144:9;21118:36;:25;:36;:::i;:::-;21109:45;;21074:114;-1:-1:-1;;;;;21204:33:0;;21200:515;;21275:13;21262:9;:26;;21254:57;;;;-1:-1:-1;;;;;21254:57:0;;;;;;;;;21350:12;;21377:59;;;-1:-1:-1;;;;;21377:59:0;;;;-1:-1:-1;;;;;21350:12:0;;;;;;21377:36;;21420:13;;21377:59;;;;;21326:21;;21377:59;;;;;;;;21420:13;21350:12;21377:59;;;5:2:-1;;;;30:1;27;20:12;5:2;21377:59:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21377:59:0;;;;;21473:13;21451:35;;21200:515;;;;21533:19;-1:-1:-1;;;;;21527:39:0;;21585:10;21622:4;21646:13;21527:147;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21527:147:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21527:147:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;21527:147:0;;;;;;;;;21519:184;;;;-1:-1:-1;;;;;21519:184:0;;;;;;;;;21740:232;21769:8;21792:19;21826:13;21854:12;21881:16;21912:21;21948:13;21740:14;:232::i;:::-;21727:245;-1:-1:-1;21989:9:0;:14;21985:284;;22037:4;22029:21;;-1:-1:-1;22090:15:0;;;22086:172;;;22127:12;22144:10;-1:-1:-1;;;;;22144:15:0;22175:6;22166;:15;22144:42;;;;;;;;;;;;;;;;;;;;;;;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;;22126:60:0;;;22213:7;22205:37;;;;-1:-1:-1;;;;;22205:37:0;;;;;;;;;22086:172;;-1:-1:-1;22288:10:0;;-1:-1:-1;;;;;16676:16:0;;16707:17;;16621:114;;-1:-1:-1;;;;;16621:114:0;;-1:-1:-1;;;;;16621:40:0;;;;;;:114;;16676:16;;;;16707:17;;16621:114;;;;37830:5465;37987:28;;38063:15;38055:43;;;;-1:-1:-1;;;;;38055:43:0;;;;;;;;;38128:21;38138:10;38128:9;:21::i;:::-;38115:10;:34;38111:101;;;38179:21;38189:10;38179:9;:21::i;:::-;38166:34;;38111:101;38249:11;;;38489:13;;38439:134;;-1:-1:-1;;;;;38439:134:0;;38249:11;;;;-1:-1:-1;;;;;38249:11:0;;38224:17;;;;;;;;38249:11;;38439:35;;:134;;38525:4;;38224:17;;;;38439:134;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38439:134:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38439:134:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;38439:134:0;;;;;;;;;38274:299;;;;;;;;;38599:58;38611:19;38632:24;38599:11;:58::i;:::-;38584:73;-1:-1:-1;38674:20:0;;38670:159;;38753:15;38737:12;:31;;38711:106;;;;-1:-1:-1;;;;;38711:106:0;;;;;;;;;38864:42;:10;38893:12;38864:42;:28;:42;:::i;:::-;38841:65;;38940:60;38979:20;;38940;:38;;:60;;;;:::i;:::-;39065:17;;39059:49;;-1:-1:-1;;;;;39059:49:0;;38917:83;;-1:-1:-1;39013:43:0;;-1:-1:-1;;;;;39065:17:0;;;;39059:34;;:49;;39102:4;;39059:49;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39059:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39059:49:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;39059:49:0;;;;;;;;;39013:95;-1:-1:-1;39121:22:0;39146:74;39013:95;39200:19;39146:74;:53;:74;:::i;:::-;39121:99;-1:-1:-1;39248:58:0;39121:99;39281:24;39248:58;:32;:58;:::i;:::-;39231:75;;39319:16;39346:20;39419;39381:35;:58;39377:598;;;39473:13;:11;:13::i;:::-;39460:10;:26;39456:196;;;39541:35;39518:20;:58;39507:69;;39456:196;;;-1:-1:-1;;39617:19:0;;39456:196;39668:156;39706:12;39737:13;;39769:8;39796:13;39668:19;:156::i;:::-;39883:17;;39877:49;;-1:-1:-1;;;;;39877:49:0;;-1:-1:-1;;;;;39883:17:0;;;;39877:34;;:49;;39920:4;;39877:49;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39877:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39877:49:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;39877:49:0;;;;;;;;;39839:87;;39959:4;39941:22;;39377:598;40029:20;39991:35;:58;:88;;;;;40066:13;:11;:13::i;:::-;40053:10;:26;39991:88;39987:558;;;40260:13;;40210:105;;-1:-1:-1;;;;;40210:105:0;;40107:58;;;;-1:-1:-1;40180:27:0;;-1:-1:-1;;;;;40210:31:0;;;;;:105;;40107:58;;40210:105;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40210:105:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40210:105:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;40210:105:0;;;;;;;;;40180:135;-1:-1:-1;40334:24:0;;40330:204;;40417:60;:35;40457:19;40417:60;:39;:60;:::i;:::-;40379:98;;40514:4;40496:22;;40330:204;39987:558;;40561:15;40557:1954;;;40593:20;40645:13;:11;:13::i;:::-;40632:10;:26;40628:1176;;;40790:13;;40732:209;;-1:-1:-1;;;;;40732:209:0;;-1:-1:-1;;;;;40732:35:0;;;;;:209;;40790:13;40834:4;;40862:16;;40901:21;;40732:209;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40732:209:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40732:209:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;40732:209:0;;;;;;;;;-1:-1:-1;40679:262:0;;-1:-1:-1;40679:262:0;;-1:-1:-1;40960:23:0;;-1:-1:-1;40986:82:0;;-1:-1:-1;40986:35:0;40679:262;40986:82;:61;:82;:::i;:::-;40960:108;-1:-1:-1;41105:67:0;40960:108;41147:24;41105:67;:41;:67;:::i;:::-;41087:85;;41215:14;41197:15;:32;41193:485;;;41471:15;41454:14;:32;41439:47;;41542:12;41519:20;:35;41511:66;;;;-1:-1:-1;;;;;41511:66:0;;;;;;;;;41646:12;41623:20;:35;41600:58;;41193:485;40628:1176;;;;41740:1;41718:23;;41787:1;41760:28;;40628:1176;41847:35;41824:20;:58;41820:680;;;42449:35;42426:58;;41820:680;40557:1954;;42645:21;42655:10;42645:9;:21::i;:::-;42631:10;:35;:168;;;-1:-1:-1;42768:20:0;;42743:8;;;;42731:2;:21;42709:6;:43;42768:20;42709:79;;;;;42670:20;:129;;42631:168;42623:199;;;;-1:-1:-1;;;;;42623:199:0;;;;;;;;;42835:66;42855:10;42880;42835:5;:66::i;:::-;42918:13;:11;:13::i;:::-;:18;;:85;;;42940:58;42952:19;42973:24;42940:11;:58::i;:::-;:63;42918:85;42914:180;;;43034:6;43020:11;:20;43070:12;;;-1:-1:-1;42914:180:0;43110:21;43120:10;43110:9;:21::i;:::-;:26;43106:182;;43185:25;43197:12;43185:11;:25::i;:::-;43171:10;43153:29;;;;:17;:29;;;;;:57;43106:182;;;43261:10;43275:1;43243:29;;;:17;:29;;;;;:33;43106:182;37830:5465;;;;;;;;;;;;;;;:::o;44217:1642::-;44551:11;;;44580:9;;44546:44;;-1:-1:-1;;;;;44546:44:0;;44442:31;;;;;;-1:-1:-1;;;;;44551:11:0;;;;;;;44546:33;;:44;;44580:9;;;;;44546:44;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44546:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44546:44:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;44546:44:0;;;;;;;;;44522:68;;44603:21;44633:18;-1:-1:-1;;;;;44627:35:0;;44671:4;44678:13;44627:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44627:65:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44627:65:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;44627:65:0;;;;;;;;;44603:89;;44723:17;44707:13;:33;44703:364;;;44761:18;;44757:190;;44848:51;;-1:-1:-1;;;;;44848:51:0;;-1:-1:-1;;;;;44848:33:0;;;;;:51;;44882:13;;44897:1;;44848:51;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44848:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44848:51:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;44848:51:0;;;;;;;;;44840:91;;;;-1:-1:-1;;;;;44840:91:0;;;;;;;;;44971:58;;-1:-1:-1;;;;;44971:58:0;;-1:-1:-1;;;;;44971:33:0;;;;;:58;;45005:13;;-1:-1:-1;;5800:10:0;44971:58;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44971:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44971:58:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;44971:58:0;;;;;;;;;44963:92;;;;-1:-1:-1;;;;;44963:92:0;;;;;;;;;45080:12;45094:17;45115:13;-1:-1:-1;;;;;45115:18:0;45282;45319:16;45354:8;45400;45452:17;-1:-1:-1;;45537:1:0;45148:426;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;45148:426:0;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;179:29;160:49;;45115:470:0;;;45148:426;45115:470;;;;;;;;;;;;;;;;;;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;;45079:506:0;;;;45605:12;45604:13;:24;;;;45621:7;45604:24;45596:48;;;;-1:-1:-1;;;;;45596:48:0;;;;;;;;;45694:1;45685:7;45682:14;45679:2;;;45759;45753:4;45749:13;45743:20;45716:47;;45822:2;45816:4;45812:13;45806:20;45781:45;;45679:2;45664:188;;;;;;;;;;;;:::o;8842:200::-;9022:11;;8939:7;;8971:63;;:32;:6;8996;8971:32;:24;:32;:::i;9146:1023::-;-1:-1:-1;;;;;9334:14:0;;9274:4;9334:14;;;:7;:14;;;;;;;;9349:10;9334:26;;;;;;;;9274:4;;9322:39;;:11;:39::i;:::-;-1:-1:-1;;;;;9406:15:0;;9372:19;9406:15;;;:8;:15;;;;;;9296:65;;-1:-1:-1;9372:19:0;9394:28;;:11;:28::i;:::-;9372:50;;9451:11;9441:6;:21;;9433:54;;;;-1:-1:-1;;;;;9433:54:0;;;;;;;;;9516:15;9506:6;:25;;9498:60;;;;-1:-1:-1;;;;;9498:60:0;;;;;;;;;-1:-1:-1;;;;;9577:17:0;;9569:45;;;;-1:-1:-1;;;;;9569:45:0;;;;;;;;;9645:34;9655:23;:11;9671:6;9655:23;:15;:23;:::i;:::-;9645:9;:34::i;:::-;-1:-1:-1;;;;;9627:15:0;;;;;;:8;:15;;;;;:52;9694:16;9636:5;9694:9;:16::i;:::-;9690:73;;-1:-1:-1;;;;;9732:15:0;;9750:1;9732:15;;;:8;:15;;;;;:19;9690:73;-1:-1:-1;;;;;9813:13:0;;;;;;:8;:13;;;;;;9791:49;;9801:38;;9832:6;;9801:26;;:11;:26::i;9791:49::-;-1:-1:-1;;;;;9775:13:0;;;;;;:8;:13;;;;;:65;-1:-1:-1;;9855:27:0;;9851:245;;9928:38;9938:27;:15;9958:6;9938:27;:19;:27;:::i;9928:38::-;-1:-1:-1;;;;;9899:14:0;;;;;;:7;:14;;;;;;;;9914:10;9899:26;;;;;;;;:67;;;;9985:28;;9907:5;;9985:9;:28::i;:::-;9981:104;;-1:-1:-1;;;;;10039:14:0;;10068:1;10039:14;;;:7;:14;;;;;;;;10054:10;10039:26;;;;;;;:30;9981:104;10127:3;-1:-1:-1;;;;;10111:28:0;10120:5;-1:-1:-1;;;;;10111:28:0;-1:-1:-1;;;;;;;;;;;10132:6:0;10111:28;;;;;;;;;;;;;;;-1:-1:-1;10157:4:0;;9146:1023;-1:-1:-1;;;;;9146:1023:0:o;1641:391::-;1701:9;1931:7;1927:38;;-1:-1:-1;1956:1:0;1949:8;;1927:38;-1:-1:-1;1977:7:0;;;1982:2;1977;:7;:2;1998:6;;;;;:12;1991:20;;;2119:288;2179:7;2399:2;2394;:7;;;;;;;2119:288;-1:-1:-1;;;2119:288:0:o;48153:504::-;48306:7;48338:12;;48354:1;48338:17;;:311;;48637:12;;48338:311;;;48371:263;48399:220;48606:12;;48399:184;48562:20;;48399:140;48514:24;48399:92;48471:19;48405:17;;;;;;;;;-1:-1:-1;;;;;48405:17:0;-1:-1:-1;;;;;48399:34:0;;48442:4;48399:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48399:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48399:49:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;48399:49:0;;;;;;;;10177:618;10342:10;10277:4;10333:20;;;:8;:20;;;;;;10277:4;;10321:33;;:11;:33::i;:::-;10299:55;;10383:11;10373:6;:21;;10365:54;;;;-1:-1:-1;;;;;10365:54:0;;;;;;;;;-1:-1:-1;;;;;10438:17:0;;10430:45;;;;-1:-1:-1;;;;;10430:45:0;;;;;;;;;10511:34;10521:23;:11;10537:6;10521:23;:15;:23;:::i;10511:34::-;10497:10;10488:20;;;;:8;:20;;;;;:57;;;;10560:21;;:9;:21::i;:::-;10556:83;;10612:10;10626:1;10603:20;;;:8;:20;;;;;:24;10556:83;-1:-1:-1;;;;;10689:13:0;;;;;;:8;:13;;;;;;10667:49;;10677:38;;10708:6;;10677:26;;:11;:26::i;10667:49::-;-1:-1:-1;;;;;10651:13:0;;;;;;:8;:13;;;;;;;:65;;;;10732:33;;10741:10;;-1:-1:-1;;;;;;;;;;;10732:33:0;;;10758:6;;10732:33;;;;;;;;;;-1:-1:-1;10783:4:0;;10177:618;-1:-1:-1;;;10177:618:0:o;2784:119::-;2844:7;2873:2;2867;:8;;2860:16;;;;-1:-1:-1;2890:7:0;;;2784:119::o;2970:132::-;3052:7;;;3073;;;;3066:15;;;35101:2721;3769:5;;35421:7;;-1:-1:-1;;;;;3769:5:0;3755:10;:19;3747:28;;;;;;35473:17;;-1:-1:-1;;;;;35450:40:0;;;35473:17;;35450:40;;;;:83;;-1:-1:-1;35517:16:0;;-1:-1:-1;;;;;35494:39:0;;;35517:16;;35494:39;;35450:83;35446:884;;;35710:17;;35551:31;;;;35613:327;;35647:19;;-1:-1:-1;;;;;35710:17:0;35779:4;35824:13;35710:17;35613:15;:327::i;:::-;35550:390;;;;35977:17;35961:13;:33;35957:252;;;36023:141;;-1:-1:-1;;;;;36023:141:0;;-1:-1:-1;;;;;36023:35:0;;;;;:141;;36081:10;;36114:31;;;;36023:141;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36023:141:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36023:141:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;36023:141:0;;;;;;;;;36015:178;;;;-1:-1:-1;;;;;36015:178:0;;;;;;;;;-1:-1:-1;36301:17:0;;-1:-1:-1;;;;;36301:17:0;;-1:-1:-1;36241:23:0;-1:-1:-1;35446:884:0;36514:17;;-1:-1:-1;;;;;36491:40:0;;;36514:17;;36491:40;:119;;36591:19;;36491:119;;;36551:20;;36491:119;36465:8;;;;36453:2;:21;36431:6;:43;:180;;;;;;36413:13;:209;;36405:243;;;;-1:-1:-1;;;;;36405:243:0;;;;;;;;;36687:117;36718:19;36752:13;36780;36687:16;:117::i;:::-;36925:11;;;36975:13;;36920:174;;-1:-1:-1;;;;;36920:174:0;;36852:27;;;;36925:11;;;-1:-1:-1;;;;;36925:11:0;;36920:40;;:174;;37011:4;;37031:16;;37062:21;;36920:174;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36920:174:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36920:174:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;36920:174:0;;;;;;;;;36851:243;;;;;;;37105:23;37131:204;37322:12;37131:172;37282:20;;37131:132;37238:24;37131:88;37199:19;37137:17;;;;;;;;;-1:-1:-1;;;;;37137:17:0;-1:-1:-1;;;;;37131:34:0;;37174:4;37131:49;;;;;;;;;;;;;;;;:204;37105:230;;37372:13;:11;:13::i;:::-;37354:15;:31;37346:60;;;;-1:-1:-1;;;;;37346:60:0;;;;;;;;;37419:18;37458:13;:11;:13::i;:::-;37440:15;:31;37419:52;;37484:64;37504:8;37527:10;37484:5;:64::i;:::-;37606:19;-1:-1:-1;;;;;37564:152:0;37583:8;-1:-1:-1;;;;;37564:152:0;;37640:13;37668:10;37693:12;37564:152;;;;;;;;;;;;;;;;;37759:25;37771:12;37759:11;:25::i;:::-;-1:-1:-1;;;;;37729:27:0;;;;;;:17;:27;;;;;:55;37804:10;-1:-1:-1;;;;35101:2721:0;;;;;;;;;:::o;45867:2239::-;46069:17;;46063:49;;-1:-1:-1;;;;;46063:49:0;;46035:25;;-1:-1:-1;;;;;46069:17:0;;46063:34;;:49;;46106:4;;46063:49;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46063:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46063:49:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;46063:49:0;;;;;;;;;46156:16;;46150:48;;-1:-1:-1;;;;;46150:48:0;;46035:77;;-1:-1:-1;46123:24:0;;-1:-1:-1;;;;;46156:16:0;;;;46150:33;;:48;;46192:4;;46150:48;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46150:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46150:48:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;46150:48:0;;;;;;;;;46123:75;-1:-1:-1;46215:21:0;;;;:47;;-1:-1:-1;46240:22:0;;;46215:47;46211:1888;;;46306:17;;-1:-1:-1;;;;;46283:40:0;;;46306:17;;46283:40;46279:871;;;46348:18;;;:55;;;46386:17;46370:13;:33;46348:55;46344:320;;;46502:17;;-1:-1:-1;46502:17:0;;46344:320;;;-1:-1:-1;46631:13:0;;-1:-1:-1;46587:1:0;46344:320;46279:871;;;46712:16;;-1:-1:-1;;;;;46689:39:0;;;46712:16;;46689:39;46685:465;;;46753:18;;;:54;;;46791:16;46775:13;:32;46753:54;46749:320;;;46908:16;-1:-1:-1;46908:16:0;46749:320;;;-1:-1:-1;47048:1:0;;-1:-1:-1;46992:13:0;46685:465;;;47109:25;;-1:-1:-1;;;;;47109:25:0;;;;;;;;46685:465;47166:16;47201:9;:14;47197:194;;-1:-1:-1;47255:4:0;47247:21;47302:9;47291:20;;47287:89;;;-1:-1:-1;47347:9:0;47287:89;47416:15;;;;;;;;;-1:-1:-1;;;;;47416:15:0;-1:-1:-1;;;;;47405:50:0;;47462:8;47490:13;47548:14;;47607:16;47665:17;47729:1;47796:4;47839:19;47903:17;;;;;;;;;-1:-1:-1;;;;;47903:17:0;47970;;;;;;;;;-1:-1:-1;;;;;47970:17:0;48032:13;47405:682;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47405:682:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47405:682:0;;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;47405:682:0;;;;;;;;;;46211:1888;;45867:2239;;;;;:::o;8636:198::-;8731:7;8763:63;8819:6;8763:37;8788:11;;8763:6;:24;;:37;;;;:::i;4203:175::-;-1:-1:-1;;;;;4274:23:0;;4266:32;;;;;;4331:5;;4310:38;;-1:-1:-1;;;;;4310:38:0;;;;4331:5;;4310:38;;4331:5;;4310:38;4355:5;:17;;-1:-1:-1;;;;;;4355:17:0;-1:-1:-1;;;;;4355:17:0;;;;;;;;;;4203:175::o;43303:906::-;43557:26;43598:9;:14;43594:104;;43650:36;43658:4;43650:21;43676:9;43650:36;:25;:36;:::i;:::-;43629:57;;43594:104;43708:155;;-1:-1:-1;;;;;43708:155:0;;-1:-1:-1;;;;;43708:45:0;;;;;43760:9;;43708:155;;43785:13;;43813:11;;43839:13;;43708:155;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43708:155:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43708:155:0;;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;43708:155:0;;;;;;;;;-1:-1:-1;43878:9:0;:14;43874:328;;43945:4;43937:21;43977:38;;;43973:218;;;44037:12;44054:10;-1:-1:-1;;;;;44054:15:0;44096:18;44076:17;:38;44054:65;;;;;;;;;;;;;;;;;;;;;;;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;;44036:83:0;;;44146:7;44138:37;;;;-1:-1:-1;;;;;44138:37:0;;;;;;;;43973:218;43874:328;43303:906;;;;;:::o;11578:1463::-;-1:-1:-1;;;;;11715:14:0;;11682:18;11715:14;;;:8;:14;;;;;;11703:27;;:11;:27::i;:::-;11682:48;;11765:10;11749:12;:26;;11741:65;;;;-1:-1:-1;;;;;11741:65:0;;;;;;;;;12000:20;12048:39;12058:28;:10;12073:12;12058:28;:14;:28;:::i;12048:39::-;-1:-1:-1;;;;;12031:14:0;;;;;;:8;:14;;;;;:56;;;12120:2;-1:-1:-1;12102:20:0;;:45;;;12145:2;12126:15;12136:4;12126:9;:15::i;:::-;:21;;12102:45;12098:188;;;-1:-1:-1;;;;;;12227:14:0;;;;;;:8;:14;;;;;;;12256:18;;;12098:188;12298:18;12319:25;12331:12;;12319:11;:25::i;:::-;12298:46;;12372:12;12359:10;:25;12355:322;;;12416:39;12426:28;:10;12441:12;12426:28;:14;:28;:::i;12416:39::-;12401:12;:54;12476:13;:11;:13::i;:::-;12472:112;;12530:1;12515:12;:16;;;-1:-1:-1;;;;;12550:14:0;;;;:8;:14;;;;;:18;12472:112;12355:322;;;-1:-1:-1;;;;;12616:14:0;;12633:1;12616:14;;;:8;:14;;;;;:18;;;12649:12;:16;12355:322;12693:16;;12689:287;;12741:43;12758:25;12770:12;12758:11;:25::i;:::-;12741:12;;:43;:16;:43;:::i;:::-;12726:58;;12818:12;12803;;:27;12799:166;;;12864:12;;:30;;12881:12;12864:30;:16;:30;:::i;:::-;12849:12;:45;12799:166;;;12948:1;12933:12;:16;12799:166;13016:1;-1:-1:-1;;;;;12993:40:0;13002:4;-1:-1:-1;;;;;12993:40:0;-1:-1:-1;;;;;;;;;;;13020:12:0;12993:40;;;;;;;;;;;;;;;11578:1463;;;;;:::o;11195:375::-;-1:-1:-1;;;;;11306:17:0;;11298:45;;;;-1:-1:-1;;;;;11298:45:0;;;;;;;;;11369:54;11379:43;11409:12;11379:25;11391:12;;11379:11;:25::i;11369:54::-;11354:12;:69;-1:-1:-1;;;;;11472:13:0;;;;;;:8;:13;;;;;;11450:55;;11460:44;;11491:12;;11460:26;;:11;:26::i;11450:55::-;-1:-1:-1;;;;;11434:13:0;;;;;;:8;:13;;;;;;:71;;;;11523:39;;11434:13;;;-1:-1:-1;;;;;;;;;;;11523:39:0;;;11549:12;;11523:39;;;;;;;;;;11195:375;;:::o;5:130:-1:-;72:20;;97:33;72:20;97:33;;142:134;220:13;;238:33;220:13;238:33;;283:124;347:20;;372:30;347:20;372:30;;414:128;489:13;;507:30;489:13;507:30;;549:134;627:13;;645:33;627:13;645:33;;691:440;;792:3;785:4;777:6;773:17;769:27;759:2;;810:1;807;800:12;759:2;847:6;834:20;869:64;884:48;925:6;884:48;;;869:64;;;860:73;;953:6;946:5;939:21;989:4;981:6;977:17;1022:4;1015:5;1011:16;1057:3;1048:6;1043:3;1039:16;1036:25;1033:2;;;1074:1;1071;1064:12;1033:2;1084:41;1118:6;1113:3;1108;1084:41;;;752:379;;;;;;;;1139:130;1206:20;;1231:33;1206:20;1231:33;;1417:241;;1521:2;1509:9;1500:7;1496:23;1492:32;1489:2;;;1537:1;1534;1527:12;1489:2;1572:1;1589:53;1634:7;1614:9;1589:53;;1665:263;;1780:2;1768:9;1759:7;1755:23;1751:32;1748:2;;;1796:1;1793;1786:12;1748:2;1831:1;1848:64;1904:7;1884:9;1848:64;;1935:366;;;2056:2;2044:9;2035:7;2031:23;2027:32;2024:2;;;2072:1;2069;2062:12;2024:2;2107:1;2124:53;2169:7;2149:9;2124:53;;;2114:63;;2086:97;2214:2;2232:53;2277:7;2268:6;2257:9;2253:22;2232:53;;;2222:63;;2193:98;2018:283;;;;;;2308:491;;;;2446:2;2434:9;2425:7;2421:23;2417:32;2414:2;;;2462:1;2459;2452:12;2414:2;2497:1;2514:53;2559:7;2539:9;2514:53;;;2504:63;;2476:97;2604:2;2622:53;2667:7;2658:6;2647:9;2643:22;2622:53;;;2612:63;;2583:98;2712:2;2730:53;2775:7;2766:6;2755:9;2751:22;2730:53;;;2720:63;;2691:98;2408:391;;;;;;2806:617;;;;;2961:3;2949:9;2940:7;2936:23;2932:33;2929:2;;;2978:1;2975;2968:12;2929:2;3013:1;3030:53;3075:7;3055:9;3030:53;;;3020:63;;2992:97;3120:2;3138:53;3183:7;3174:6;3163:9;3159:22;3138:53;;;3128:63;;3099:98;3228:2;3246:53;3291:7;3282:6;3271:9;3267:22;3246:53;;;3236:63;;3207:98;3336:2;3354:53;3399:7;3390:6;3379:9;3375:22;3354:53;;;3344:63;;3315:98;2923:500;;;;;;;;3430:847;;;;;;3611:3;3599:9;3590:7;3586:23;3582:33;3579:2;;;3628:1;3625;3618:12;3579:2;3663:1;3680:53;3725:7;3705:9;3680:53;;;3670:63;;3642:97;3770:2;3788:53;3833:7;3824:6;3813:9;3809:22;3788:53;;;3778:63;;3749:98;3878:2;3896:53;3941:7;3932:6;3921:9;3917:22;3896:53;;;3886:63;;3857:98;3986:2;4004:53;4049:7;4040:6;4029:9;4025:22;4004:53;;;3994:63;;3965:98;4122:3;4111:9;4107:19;4094:33;4147:18;4139:6;4136:30;4133:2;;;4179:1;4176;4169:12;4133:2;4199:62;4253:7;4244:6;4233:9;4229:22;4199:62;;;4189:72;;4073:194;3573:704;;;;;;;;;4284:470;;;4414:2;4402:9;4393:7;4389:23;4385:32;4382:2;;;4430:1;4427;4420:12;4382:2;4465:1;4482:53;4527:7;4507:9;4482:53;;;4472:63;;4444:97;4600:2;4589:9;4585:18;4572:32;4624:18;4616:6;4613:30;4610:2;;;4656:1;4653;4646:12;4610:2;4676:62;4730:7;4721:6;4710:9;4706:22;4676:62;;4761:366;;;4882:2;4870:9;4861:7;4857:23;4853:32;4850:2;;;4898:1;4895;4888:12;4850:2;4933:1;4950:53;4995:7;4975:9;4950:53;;;4940:63;;4912:97;5040:2;5058:53;5103:7;5094:6;5083:9;5079:22;5058:53;;5134:595;;;;5281:2;5269:9;5260:7;5256:23;5252:32;5249:2;;;5297:1;5294;5287:12;5249:2;5332:1;5349:53;5394:7;5374:9;5349:53;;;5339:63;;5311:97;5439:2;5457:53;5502:7;5493:6;5482:9;5478:22;5457:53;;;5447:63;;5418:98;5575:2;5564:9;5560:18;5547:32;5599:18;5591:6;5588:30;5585:2;;;5631:1;5628;5621:12;5585:2;5651:62;5705:7;5696:6;5685:9;5681:22;5651:62;;5736:491;;;;5874:2;5862:9;5853:7;5849:23;5845:32;5842:2;;;5890:1;5887;5880:12;5842:2;5925:1;5942:53;5987:7;5967:9;5942:53;;;5932:63;;5904:97;6032:2;6050:53;6095:7;6086:6;6075:9;6071:22;6050:53;;6234:721;;;;;6398:3;6386:9;6377:7;6373:23;6369:33;6366:2;;;6415:1;6412;6405:12;6366:2;6450:1;6467:53;6512:7;6492:9;6467:53;;;6457:63;;6429:97;6557:2;6575:53;6620:7;6611:6;6600:9;6596:22;6575:53;;;6565:63;;6536:98;6665:2;6683:53;6728:7;6719:6;6708:9;6704:22;6683:53;;;6673:63;;6644:98;6801:2;6790:9;6786:18;6773:32;6825:18;6817:6;6814:30;6811:2;;;6857:1;6854;6847:12;6811:2;6877:62;6931:7;6922:6;6911:9;6907:22;6877:62;;6962:235;;7063:2;7051:9;7042:7;7038:23;7034:32;7031:2;;;7079:1;7076;7069:12;7031:2;7114:1;7131:50;7173:7;7153:9;7131:50;;7204:257;;7316:2;7304:9;7295:7;7291:23;7287:32;7284:2;;;7332:1;7329;7322:12;7284:2;7367:1;7384:61;7437:7;7417:9;7384:61;;7468:263;;7583:2;7571:9;7562:7;7558:23;7554:32;7551:2;;;7599:1;7596;7589:12;7551:2;7634:1;7651:64;7707:7;7687:9;7651:64;;8008:535;;;;8157:2;8145:9;8136:7;8132:23;8128:32;8125:2;;;8173:1;8170;8163:12;8125:2;8208:1;8225:64;8281:7;8261:9;8225:64;;;8215:74;;8187:108;8326:2;8344:64;8400:7;8391:6;8380:9;8376:22;8344:64;;;8334:74;;8305:109;8445:2;8463:64;8519:7;8510:6;8499:9;8495:22;8463:64;;8550:809;;;;;;8733:3;8721:9;8712:7;8708:23;8704:33;8701:2;;;8750:1;8747;8740:12;8701:2;8785:1;8802:64;8858:7;8838:9;8802:64;;;8792:74;;8764:108;8903:2;8921:64;8977:7;8968:6;8957:9;8953:22;8921:64;;;8911:74;;8882:109;9022:2;9040:64;9096:7;9087:6;9076:9;9072:22;9040:64;;;9030:74;;9001:109;9141:2;9159:64;9215:7;9206:6;9195:9;9191:22;9159:64;;;9149:74;;9120:109;9260:3;9279:64;9335:7;9326:6;9315:9;9311:22;9279:64;;9366:142;9457:45;9496:5;9457:45;;;9452:3;9445:58;9439:69;;;9515:113;9598:24;9616:5;9598:24;;9635:104;9712:21;9727:5;9712:21;;9746:113;9829:24;9847:5;9829:24;;9866:343;;9976:38;10008:5;9976:38;;;10026:70;10089:6;10084:3;10026:70;;;10019:77;;10101:52;10146:6;10141:3;10134:4;10127:5;10123:16;10101:52;;;10174:29;10196:6;10174:29;;;10165:39;;;;9956:253;-1:-1;;;9956:253;10216:356;;10344:38;10376:5;10344:38;;;10394:88;10475:6;10470:3;10394:88;;;10387:95;;10487:52;10532:6;10527:3;10520:4;10513:5;10509:16;10487:52;;;10551:16;;;;;10324:248;-1:-1;;10324:248;10579:142;10670:45;10709:5;10670:45;;10728:138;10817:43;10854:5;10817:43;;11220:364;;11380:67;11444:2;11439:3;11380:67;;;11480:66;11460:87;;11575:2;11566:12;;11366:218;-1:-1;;11366:218;11593:364;;11753:67;11817:2;11812:3;11753:67;;;11853:66;11833:87;;11948:2;11939:12;;11739:218;-1:-1;;11739:218;11966:364;;12126:67;12190:2;12185:3;12126:67;;;12226:66;12206:87;;12321:2;12312:12;;12112:218;-1:-1;;12112:218;12339:364;;12499:67;12563:2;12558:3;12499:67;;;12599:66;12579:87;;12694:2;12685:12;;12485:218;-1:-1;;12485:218;12712:364;;12872:67;12936:2;12931:3;12872:67;;;12972:66;12952:87;;13067:2;13058:12;;12858:218;-1:-1;;12858:218;13085:364;;13245:67;13309:2;13304:3;13245:67;;;13345:66;13325:87;;13440:2;13431:12;;13231:218;-1:-1;;13231:218;13458:364;;13618:67;13682:2;13677:3;13618:67;;;13718:66;13698:87;;13813:2;13804:12;;13604:218;-1:-1;;13604:218;13831:364;;13991:67;14055:2;14050:3;13991:67;;;14091:66;14071:87;;14186:2;14177:12;;13977:218;-1:-1;;13977:218;14204:364;;14364:67;14428:2;14423:3;14364:67;;;14464:66;14444:87;;14559:2;14550:12;;14350:218;-1:-1;;14350:218;14577:364;;14737:67;14801:2;14796:3;14737:67;;;14837:66;14817:87;;14932:2;14923:12;;14723:218;-1:-1;;14723:218;14950:364;;15110:67;15174:2;15169:3;15110:67;;;15210:66;15190:87;;15305:2;15296:12;;15096:218;-1:-1;;15096:218;15323:364;;15483:67;15547:2;15542:3;15483:67;;;-1:-1;;;;;15563:87;;15678:2;15669:12;;15469:218;-1:-1;;15469:218;15696:364;;15856:67;15920:2;15915:3;15856:67;;;15956:66;15936:87;;16051:2;16042:12;;15842:218;-1:-1;;15842:218;16069:364;;16229:67;16293:2;16288:3;16229:67;;;16329:66;16309:87;;16424:2;16415:12;;16215:218;-1:-1;;16215:218;16442:364;;16602:67;16666:2;16661:3;16602:67;;;16702:66;16682:87;;16797:2;16788:12;;16588:218;-1:-1;;16588:218;16815:364;;16975:67;17039:2;17034:3;16975:67;;;17075:66;17055:87;;17170:2;17161:12;;16961:218;-1:-1;;16961:218;17188:364;;17348:67;17412:2;17407:3;17348:67;;;17448:66;17428:87;;17543:2;17534:12;;17334:218;-1:-1;;17334:218;17561:364;;17721:67;17785:2;17780:3;17721:67;;;17821:66;17801:87;;17916:2;17907:12;;17707:218;-1:-1;;17707:218;17934:364;;18094:67;18158:2;18153:3;18094:67;;;18194:66;18174:87;;18289:2;18280:12;;18080:218;-1:-1;;18080:218;18307:296;;18484:83;18565:1;18560:3;18484:83;;18612:364;;18772:67;18836:2;18831:3;18772:67;;;18872:66;18852:87;;18967:2;18958:12;;18758:218;-1:-1;;18758:218;18985:364;;19145:67;19209:2;19204:3;19145:67;;;19245:66;19225:87;;19340:2;19331:12;;19131:218;-1:-1;;19131:218;19358:364;;19518:67;19582:2;19577:3;19518:67;;;19618:66;19598:87;;19713:2;19704:12;;19504:218;-1:-1;;19504:218;19731:364;;19891:67;19955:2;19950:3;19891:67;;;19991:66;19971:87;;20086:2;20077:12;;19877:218;-1:-1;;19877:218;20104:364;;20264:67;20328:2;20323:3;20264:67;;;20364:66;20344:87;;20459:2;20450:12;;20250:218;-1:-1;;20250:218;20477:364;;20637:67;20701:2;20696:3;20637:67;;;20737:66;20717:87;;20832:2;20823:12;;20623:218;-1:-1;;20623:218;20850:363;;21010:66;21074:1;21069:3;21010:66;;;-1:-1;;;;;21089:87;;21204:2;21195:12;;20996:217;-1:-1;;20996:217;21341:107;21420:22;21436:5;21420:22;;21455:262;;21599:93;21688:3;21679:6;21599:93;;21724:370;;21922:147;22065:3;21922:147;;22101:213;22219:2;22204:18;;22233:71;22208:9;22277:6;22233:71;;22321:229;22447:2;22432:18;;22461:79;22436:9;22513:6;22461:79;;22557:340;22711:2;22696:18;;22725:79;22700:9;22777:6;22725:79;;;22815:72;22883:2;22872:9;22868:18;22859:6;22815:72;;22904:467;23094:2;23079:18;;23108:79;23083:9;23160:6;23108:79;;;23198:80;23274:2;23263:9;23259:18;23250:6;23198:80;;;23289:72;23357:2;23346:9;23342:18;23333:6;23289:72;;23378:340;23532:2;23517:18;;23546:79;23521:9;23598:6;23546:79;;;23636:72;23704:2;23693:9;23689:18;23680:6;23636:72;;23725:324;23871:2;23856:18;;23885:71;23860:9;23929:6;23885:71;;24056:895;24348:3;24333:19;;24363:71;24337:9;24407:6;24363:71;;;24445:72;24513:2;24502:9;24498:18;24489:6;24445:72;;;24528;24596:2;24585:9;24581:18;24572:6;24528:72;;;24611;24679:2;24668:9;24664:18;24655:6;24611:72;;;24694:73;24762:3;24751:9;24747:19;24738:6;24694:73;;;24778;24846:3;24835:9;24831:19;24822:6;24778:73;;;24862:79;24936:3;24925:9;24921:19;24912:6;24862:79;;;24319:632;;;;;;;;;;;24958:435;25132:2;25117:18;;25146:71;25121:9;25190:6;25146:71;;;25228:72;25296:2;25285:9;25281:18;25272:6;25228:72;;25400:340;25554:2;25539:18;;25568:71;25543:9;25612:6;25568:71;;;25650:80;25726:2;25715:9;25711:18;25702:6;25650:80;;25747:324;25893:2;25878:18;;25907:71;25882:9;25951:6;25907:71;;26078:201;26190:2;26175:18;;26204:65;26179:9;26242:6;26204:65;;26286:213;26404:2;26389:18;;26418:71;26393:9;26462:6;26418:71;;26506:340;26660:2;26645:18;;26674:71;26649:9;26718:6;26674:71;;;26756:80;26832:2;26821:9;26817:18;26808:6;26756:80;;26853:595;27079:3;27064:19;;27094:71;27068:9;27138:6;27094:71;;;27176:80;27252:2;27241:9;27237:18;27228:6;27176:80;;;27267;27343:2;27332:9;27328:18;27319:6;27267:80;;;27358;27434:2;27423:9;27419:18;27410:6;27358:80;;;27050:398;;;;;;;;27455:563;27665:3;27650:19;;27680:71;27654:9;27724:6;27680:71;;;27762:80;27838:2;27827:9;27823:18;27814:6;27762:80;;;27853:72;27921:2;27910:9;27906:18;27897:6;27853:72;;;27936;28004:2;27993:9;27989:18;27980:6;27936:72;;28025:435;28199:2;28184:18;;28213:71;28188:9;28257:6;28213:71;;28467:324;28613:2;28598:18;;28627:71;28602:9;28671:6;28627:71;;28798:519;28990:2;28975:18;;29004:71;28979:9;29048:6;29004:71;;;29086:72;29154:2;29143:9;29139:18;29130:6;29086:72;;;29206:9;29200:4;29196:20;29191:2;29180:9;29176:18;29169:48;29231:76;29302:4;29293:6;29231:76;;29324:293;29458:2;29472:47;;;29443:18;;29533:74;29443:18;29593:6;29533:74;;29624:407;29815:2;29829:47;;;29800:18;;29890:131;29800:18;29890:131;;30038:407;30229:2;30243:47;;;30214:18;;30304:131;30214:18;30304:131;;30452:407;30643:2;30657:47;;;30628:18;;30718:131;30628:18;30718:131;;30866:407;31057:2;31071:47;;;31042:18;;31132:131;31042:18;31132:131;;31280:407;31471:2;31485:47;;;31456:18;;31546:131;31456:18;31546:131;;31694:407;31885:2;31899:47;;;31870:18;;31960:131;31870:18;31960:131;;32108:407;32299:2;32313:47;;;32284:18;;32374:131;32284:18;32374:131;;32522:407;32713:2;32727:47;;;32698:18;;32788:131;32698:18;32788:131;;32936:407;33127:2;33141:47;;;33112:18;;33202:131;33112:18;33202:131;;33350:407;33541:2;33555:47;;;33526:18;;33616:131;33526:18;33616:131;;33764:407;33955:2;33969:47;;;33940:18;;34030:131;33940:18;34030:131;;34178:407;34369:2;34383:47;;;34354:18;;34444:131;34354:18;34444:131;;34592:407;34783:2;34797:47;;;34768:18;;34858:131;34768:18;34858:131;;35006:407;35197:2;35211:47;;;35182:18;;35272:131;35182:18;35272:131;;35420:407;35611:2;35625:47;;;35596:18;;35686:131;35596:18;35686:131;;35834:407;36025:2;36039:47;;;36010:18;;36100:131;36010:18;36100:131;;36248:407;36439:2;36453:47;;;36424:18;;36514:131;36424:18;36514:131;;36662:407;36853:2;36867:47;;;36838:18;;36928:131;36838:18;36928:131;;37076:407;37267:2;37281:47;;;37252:18;;37342:131;37252:18;37342:131;;37490:407;37681:2;37695:47;;;37666:18;;37756:131;37666:18;37756:131;;37904:407;38095:2;38109:47;;;38080:18;;38170:131;38080:18;38170:131;;38318:407;38509:2;38523:47;;;38494:18;;38584:131;38494:18;38584:131;;38732:407;38923:2;38937:47;;;38908:18;;38998:131;38908:18;38998:131;;39146:407;39337:2;39351:47;;;39322:18;;39412:131;39322:18;39412:131;;39560:407;39751:2;39765:47;;;39736:18;;39826:131;39736:18;39826:131;;39974:407;40165:2;40179:47;;;40150:18;;40240:131;40150:18;40240:131;;40608:435;40782:2;40767:18;;40796:71;40771:9;40840:6;40796:71;;;40878:72;40946:2;40935:9;40931:18;40922:6;40878:72;;41050:1335;41454:3;41439:19;;41469:71;41443:9;41513:6;41469:71;;;41551:72;41619:2;41608:9;41604:18;41595:6;41551:72;;;41634;41702:2;41691:9;41687:18;41678:6;41634:72;;;41717;41785:2;41774:9;41770:18;41761:6;41717:72;;;41800:81;41876:3;41865:9;41861:19;41852:6;41800:81;;;41892;41968:3;41957:9;41953:19;41944:6;41892:81;;;41984:73;42052:3;42041:9;42037:19;42028:6;41984:73;;;42068;42136:3;42125:9;42121:19;42112:6;42068:73;;;42152;42220:3;42209:9;42205:19;42196:6;42152:73;;;42274:9;42268:4;42264:20;42258:3;42247:9;42243:19;42236:49;42299:76;42370:4;42361:6;42299:76;;;42291:84;41425:960;-1:-1;;;;;;;;;;;;41425:960;42392:205;42506:2;42491:18;;42520:67;42495:9;42560:6;42520:67;;42604:256;42666:2;42660:9;42692:17;;;42767:18;42752:34;;42788:22;;;42749:62;42746:2;;;42824:1;42821;42814:12;42746:2;42840;42833:22;42644:216;;-1:-1;42644:216;42867:258;;43010:18;43002:6;42999:30;42996:2;;;43042:1;43039;43032:12;42996:2;-1:-1;43115:4;43086;43063:17;;;;-1:-1;;43059:33;43105:15;;42933:192;43132:91;43206:12;;43190:33;43326:162;43428:19;;;43477:4;43468:14;;43421:67;43821:91;;43883:24;43901:5;43883:24;;43919:85;43985:13;43978:21;;43961:43;44090:121;-1:-1;;;;;44152:54;;44135:76;44297:81;44368:4;44357:16;;44340:38;44385:129;;44472:37;44503:5;44472:37;;44521:116;;44608:24;44626:5;44608:24;;44644:112;;44729:22;44745:5;44729:22;;44763:121;;44842:37;44873:5;44842:37;;45007:145;45088:6;45083:3;45078;45065:30;-1:-1;45144:1;45126:16;;45119:27;45058:94;45161:268;45226:1;45233:101;45247:6;45244:1;45241:13;45233:101;;;45314:11;;;45308:18;45295:11;;;45288:39;45269:2;45262:10;45233:101;;;45349:6;45346:1;45343:13;45340:2;;;45414:1;45405:6;45400:3;45396:16;45389:27;45340:2;45210:219;;;;;45437:97;45525:2;45505:14;-1:-1;;45501:28;;45485:49;45542:117;45611:24;45629:5;45611:24;;;45604:5;45601:35;45591:2;;45650:1;45647;45640:12;45666:111;45732:21;45747:5;45732:21;;45784:117;45853:24;45871:5;45853:24;
Swarm Source
bzzr://ff79ba3a0727bccb2efc5563a6d2a1e4d6745b69740acfbf25273fed0582724a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
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.