Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 1,978 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Make Order_ | 17571118 | 598 days ago | IN | 0 ETH | 0.00128284 | ||||
Make Order_ | 17283187 | 639 days ago | IN | 0 ETH | 0.00425512 | ||||
Make Order_ | 17281468 | 639 days ago | IN | 0 ETH | 0.00422172 | ||||
Make Order_ | 17279548 | 639 days ago | IN | 0 ETH | 0.00423912 | ||||
Make Order_ | 17279543 | 639 days ago | IN | 0 ETH | 0.00473702 | ||||
Make Order_ | 17279534 | 639 days ago | IN | 0 ETH | 0.00417115 | ||||
Make Order_ | 17279527 | 639 days ago | IN | 0 ETH | 0.00448833 | ||||
Make Order_ | 17087215 | 666 days ago | IN | 0 ETH | 0.00370827 | ||||
Make Order_ | 16965721 | 684 days ago | IN | 0 ETH | 0.00147857 | ||||
Make Order_ | 16887108 | 695 days ago | IN | 0 ETH | 0.00105943 | ||||
Make Order_ | 16874621 | 697 days ago | IN | 0 ETH | 0.00120442 | ||||
Make Order_ | 16822903 | 704 days ago | IN | 0 ETH | 0.00145674 | ||||
Make Order_ | 16668428 | 726 days ago | IN | 0 ETH | 0.00167399 | ||||
Make Order_ | 16665564 | 726 days ago | IN | 0 ETH | 0.00178692 | ||||
Make Order_ | 16665546 | 726 days ago | IN | 0 ETH | 0.00172263 | ||||
Make Order_ | 16588299 | 737 days ago | IN | 0 ETH | 0.00252902 | ||||
Make Order_ | 16504711 | 748 days ago | IN | 0 ETH | 0.00116741 | ||||
Make Order_ | 16470364 | 753 days ago | IN | 0 ETH | 0.00163868 | ||||
Make Order_ | 16470197 | 753 days ago | IN | 0 ETH | 0.00120801 | ||||
Make Order_ | 16470179 | 753 days ago | IN | 0 ETH | 0.00137038 | ||||
Make Order_ | 16343081 | 771 days ago | IN | 0 ETH | 0.00169127 | ||||
Cancel Order_ | 16315241 | 775 days ago | IN | 0 ETH | 0.00101323 | ||||
Make Order_ | 16315221 | 775 days ago | IN | 0 ETH | 0.00126121 | ||||
Make Order_ | 16300630 | 777 days ago | IN | 0 ETH | 0.00254636 | ||||
Make Order_ | 16288229 | 779 days ago | IN | 0 ETH | 0.00123799 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
16090939 | 806 days ago | 0.012 ETH | ||||
16090937 | 806 days ago | 0.04 ETH | ||||
16090936 | 806 days ago | 0.041 ETH | ||||
16090931 | 806 days ago | 0.01 ETH | ||||
16090930 | 806 days ago | 0.035 ETH | ||||
16090928 | 806 days ago | 0.04 ETH | ||||
16090928 | 806 days ago | 0.04 ETH | ||||
16090928 | 806 days ago | 0.013 ETH | ||||
16090925 | 806 days ago | 0.04 ETH | ||||
16090925 | 806 days ago | 0.02 ETH | ||||
16090924 | 806 days ago | 0.013 ETH | ||||
16079480 | 808 days ago | 0.00001 ETH | ||||
16079443 | 808 days ago | 0.00001 ETH | ||||
16076855 | 808 days ago | 0.13 ETH | ||||
16076848 | 808 days ago | 0.108 ETH | ||||
16076806 | 808 days ago | 0.09 ETH | ||||
16076652 | 808 days ago | 0.041 ETH | ||||
16076650 | 808 days ago | 0.023 ETH | ||||
16076648 | 808 days ago | 0.02 ETH | ||||
16076647 | 808 days ago | 0.013 ETH | ||||
16076645 | 808 days ago | 0.04 ETH | ||||
16076643 | 808 days ago | 0.035 ETH | ||||
16076643 | 808 days ago | 0.04 ETH | ||||
16076641 | 808 days ago | 0.013 ETH | ||||
16076638 | 808 days ago | 0.012 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
NiftyConnectExchange
Compiler Version
v0.4.26+commit.4563c3fc
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-05-24 */ // File: contracts/ArrayUtils.sol pragma solidity 0.4.26; library ArrayUtils { /** * Replace bytes in an array with bytes in another array, guarded by a bitmask * Efficiency of this function is a bit unpredictable because of the EVM's word-specific model (arrays under 32 bytes will be slower) * * @dev Mask must be the size of the byte array. A nonzero byte means the byte array can be changed. * @param array The original array * @param desired The target array * @param mask The mask specifying which bits can be changed * @return The updated byte array (the parameter will be modified inplace) */ function guardedArrayReplace(bytes memory array, bytes memory desired, bytes memory mask) internal pure { require(array.length == desired.length); require(array.length == mask.length); uint words = array.length / 0x20; uint index = words * 0x20; assert(index / 0x20 == words); uint i; for (i = 0; i < words; i++) { /* Conceptually: array[i] = (!mask[i] && array[i]) || (mask[i] && desired[i]), bitwise in word chunks. */ assembly { let commonIndex := mul(0x20, add(1, i)) let maskValue := mload(add(mask, commonIndex)) mstore(add(array, commonIndex), or(and(not(maskValue), mload(add(array, commonIndex))), and(maskValue, mload(add(desired, commonIndex))))) } } /* Deal with the last section of the byte array. */ if (words > 0) { /* This overlaps with bytes already set but is still more efficient than iterating through each of the remaining bytes individually. */ i = words; assembly { let commonIndex := mul(0x20, add(1, i)) let maskValue := mload(add(mask, commonIndex)) mstore(add(array, commonIndex), or(and(not(maskValue), mload(add(array, commonIndex))), and(maskValue, mload(add(desired, commonIndex))))) } } else { /* If the byte array is shorter than a word, we must unfortunately do the whole thing bytewise. (bounds checks could still probably be optimized away in assembly, but this is a rare case) */ for (i = index; i < array.length; i++) { array[i] = ((mask[i] ^ 0xff) & array[i]) | (mask[i] & desired[i]); } } } /** * Test if two arrays are equal * @param a First array * @param b Second array * @return Whether or not all bytes in the arrays are equal */ function arrayEq(bytes memory a, bytes memory b) internal pure returns (bool) { return keccak256(a) == keccak256(b); } /** * Unsafe write byte array into a memory location * * @param index Memory location * @param source Byte array to write * @return End memory index */ function unsafeWriteBytes(uint index, bytes source) internal pure returns (uint) { if (source.length > 0) { assembly { let length := mload(source) let end := add(source, add(0x20, length)) let arrIndex := add(source, 0x20) let tempIndex := index for { } eq(lt(arrIndex, end), 1) { arrIndex := add(arrIndex, 0x20) tempIndex := add(tempIndex, 0x20) } { mstore(tempIndex, mload(arrIndex)) } index := add(index, length) } } return index; } /** * Unsafe write address into a memory location * * @param index Memory location * @param source Address to write * @return End memory index */ function unsafeWriteAddress(uint index, address source) internal pure returns (uint) { uint conv = uint(source) << 0x60; assembly { mstore(index, conv) index := add(index, 0x14) } return index; } /** * Unsafe write address into a memory location using entire word * * @param index Memory location * @param source uint to write * @return End memory index */ function unsafeWriteAddressWord(uint index, address source) internal pure returns (uint) { assembly { mstore(index, source) index := add(index, 0x20) } return index; } /** * Unsafe write uint into a memory location * * @param index Memory location * @param source uint to write * @return End memory index */ function unsafeWriteUint(uint index, uint source) internal pure returns (uint) { assembly { mstore(index, source) index := add(index, 0x20) } return index; } /** * Unsafe write uint8 into a memory location * * @param index Memory location * @param source uint8 to write * @return End memory index */ function unsafeWriteUint8(uint index, uint8 source) internal pure returns (uint) { assembly { mstore8(index, source) index := add(index, 0x1) } return index; } /** * Unsafe write uint8 into a memory location using entire word * * @param index Memory location * @param source uint to write * @return End memory index */ function unsafeWriteUint8Word(uint index, uint8 source) internal pure returns (uint) { assembly { mstore(index, source) index := add(index, 0x20) } return index; } /** * Unsafe write bytes32 into a memory location using entire word * * @param index Memory location * @param source uint to write * @return End memory index */ function unsafeWriteBytes32(uint index, bytes32 source) internal pure returns (uint) { assembly { mstore(index, source) index := add(index, 0x20) } return index; } } // File: openzeppelin-solidity/contracts/token/ERC20/IERC20.sol pragma solidity ^0.4.24; /** * @title ERC20 interface * @dev see https://github.com/ethereum/EIPs/issues/20 */ interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address who) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function transfer(address to, uint256 value) external returns (bool); function approve(address spender, uint256 value) external returns (bool); function transferFrom(address from, address to, uint256 value) external returns (bool); event Transfer( address indexed from, address indexed to, uint256 value ); event Approval( address indexed owner, address indexed spender, uint256 value ); } // File: openzeppelin-solidity/contracts/math/SafeMath.sol pragma solidity ^0.4.24; /** * @title SafeMath * @dev Math operations with safety checks that revert on error */ library SafeMath { /** * @dev Multiplies two numbers, reverts on overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b); return c; } /** * @dev Integer division of two numbers truncating the quotient, reverts on division by zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0); // Solidity only automatically asserts when dividing by 0 uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Subtracts two numbers, reverts on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a); uint256 c = a - b; return c; } /** * @dev Adds two numbers, reverts on overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a); return c; } /** * @dev Divides two numbers and returns the remainder (unsigned integer modulo), * reverts when dividing by zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b != 0); return a % b; } } // File: openzeppelin-solidity/contracts/token/ERC20/SafeERC20.sol pragma solidity ^0.4.24; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure. * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; function safeTransfer( IERC20 token, address to, uint256 value ) internal { require(token.transfer(to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { require(token.transferFrom(from, to, value)); } function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require((value == 0) || (token.allowance(address(this), spender) == 0)); require(token.approve(spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); require(token.approve(spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value); require(token.approve(spender, newAllowance)); } } // File: contracts/TokenTransferProxy.sol pragma solidity 0.4.26; contract TokenTransferProxy { using SafeERC20 for IERC20; /* Whether initialized. */ bool public initialized = false; address public exchangeAddress; function initialize (address _exchangeAddress) public { require(!initialized); initialized = true; exchangeAddress = _exchangeAddress; } /** * Call ERC20 `transferFrom` * * @dev Authenticated contract only * @param token IERC20 token address * @param from From address * @param to To address * @param amount Transfer amount */ function transferFrom(address token, address from, address to, uint amount) public returns (bool) { require(msg.sender==exchangeAddress, "not authorized"); IERC20(token).safeTransferFrom(from, to, amount); return true; } } // File: contracts/IERC2981.sol pragma solidity 0.4.26; /// /// @dev Interface for the NFT Royalty Standard /// interface IERC2981 { /// @notice Called with the sale price to determine how much royalty // is owed and to whom. /// @param _tokenId - the NFT asset queried for royalty information /// @param _salePrice - the sale price of the NFT asset specified by _tokenId /// @return receiver - address of who should be sent the royalty payment /// @return royaltyAmount - the royalty payment amount for _salePrice function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view returns (address receiver, uint256 royaltyAmount); } // File: contracts/IRoyaltyRegisterHub.sol pragma solidity 0.4.26; /// /// @dev Interface for the NFT Royalty Standard /// interface IRoyaltyRegisterHub { /// @notice Called with the sale price to determine how much royalty // is owed and to whom. /// @param _nftAddress - the NFT contract address /// @param _salePrice - the sale price of the NFT asset specified by _tokenId /// @return receiver - address of who should be sent the royalty payment /// @return royaltyAmount - the royalty payment amount for _salePrice function royaltyInfo(address _nftAddress, uint256 _salePrice) external view returns (address receiver, uint256 royaltyAmount); } // File: contracts/ReentrancyGuarded.sol pragma solidity 0.4.26; contract ReentrancyGuarded { bool reentrancyLock = false; /* Prevent a contract function from being reentrant-called. */ modifier reentrancyGuard { if (reentrancyLock) { revert(); } reentrancyLock = true; _; reentrancyLock = false; } } // File: contracts/Ownable.sol pragma solidity 0.4.26; contract Ownable { address public owner; event OwnershipRenounced(address indexed previousOwner); 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 { require(newOwner != address(0)); emit OwnershipTransferred(owner, newOwner); owner = newOwner; } /** * @dev Allows the current owner to relinquish control of the contract. */ function renounceOwnership() public onlyOwner { emit OwnershipRenounced(owner); owner = address(0); } } // File: contracts/Governable.sol pragma solidity 0.4.26; contract Governable { address public governor; address public pendingGovernor; event GovernanceTransferred( address indexed previousGovernor, address indexed newGovernor ); event NewPendingGovernor(address indexed newPendingGovernor); /** * @dev The Governable constructor sets the original `governor` of the contract to the sender * account. */ constructor() public { governor = msg.sender; } /** * @dev Throws if called by any account other than the governor. */ modifier onlyGovernor() { require(msg.sender == governor); _; } function acceptGovernance() external { require(msg.sender == pendingGovernor, "acceptGovernance: Call must come from pendingGovernor."); address previousGovernor = governor; governor = msg.sender; pendingGovernor = address(0); emit GovernanceTransferred(previousGovernor, governor); } function setPendingGovernor(address pendingGovernor_) external { require(msg.sender == governor, "setPendingGovernor: Call must come from governor."); pendingGovernor = pendingGovernor_; emit NewPendingGovernor(pendingGovernor); } } // File: contracts/SaleKindInterface.sol pragma solidity 0.4.26; library SaleKindInterface { /** * Side: buy or sell. */ enum Side { Buy, Sell } /** * Currently supported kinds of sale: fixed price, Dutch auction. * English auctions cannot be supported without stronger escrow guarantees. * Future interesting options: Vickrey auction, nonlinear Dutch auctions. */ enum SaleKind { FixedPrice, DutchAuction } /** * @dev Check whether the parameters of a sale are valid * @param saleKind Kind of sale * @param expirationTime Order expiration time * @return Whether the parameters were valid */ function validateParameters(SaleKind saleKind, uint expirationTime) pure internal returns (bool) { /* Auctions must have a set expiration date. */ return (saleKind == SaleKind.FixedPrice || expirationTime > 0); } /** * @dev Return whether or not an order can be settled * @dev Precondition: parameters have passed validateParameters * @param listingTime Order listing time * @param expirationTime Order expiration time */ function canSettleOrder(uint listingTime, uint expirationTime) view internal returns (bool) { return (listingTime < now) && (expirationTime == 0 || now < expirationTime); } /** * @dev Calculate the settlement price of an order * @dev Precondition: parameters have passed validateParameters. * @param side Order side * @param saleKind Method of sale * @param basePrice Order base price * @param extra Order extra price data * @param listingTime Order listing time * @param expirationTime Order expiration time */ function calculateFinalPrice(Side side, SaleKind saleKind, uint basePrice, uint extra, uint listingTime, uint expirationTime) view internal returns (uint finalPrice) { if (saleKind == SaleKind.FixedPrice) { return basePrice; } else if (saleKind == SaleKind.DutchAuction) { uint diff = SafeMath.div(SafeMath.mul(extra, SafeMath.sub(now, listingTime)), SafeMath.sub(expirationTime, listingTime)); if (side == Side.Sell) { /* Sell-side - start price: basePrice. End price: basePrice - extra. */ return SafeMath.sub(basePrice, diff); } else { /* Buy-side - start price: basePrice. End price: basePrice + extra. */ return SafeMath.add(basePrice, diff); } } } } // File: contracts/ExchangeCore.sol pragma solidity 0.4.26; contract ExchangeCore is ReentrancyGuarded, Ownable, Governable { string public constant name = "NiftyConnect Exchange Contract"; string public constant version = "1.0"; // NOTE: these hashes are derived and verified in the constructor. bytes32 private constant _EIP_712_DOMAIN_TYPEHASH = 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f; bytes32 private constant _NAME_HASH = 0x97b3fae253daa304aa40063e4f71c3efec8d260848d7379fc623e35f84c73f47; bytes32 private constant _VERSION_HASH = 0xe6bbd6277e1bf288eed5e8d1780f9a50b239e86b153736bceebccf4ea79d90b3; bytes32 private constant _ORDER_TYPEHASH = 0xf446866267029076a71bb126e250b9480cd4ac2699baa745a582b10b361ec951; bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a; // bytes4(keccak256("royaltyInfo(uint256,uint256)")); bytes4 private constant _EIP_165_SUPPORT_INTERFACE = 0x01ffc9a7; // bytes4(keccak256("supportsInterface(bytes4)")); // // NOTE: chainId opcode is not supported in solidiy 0.4.x; here we hardcode as 56. // In order to protect against orders that are replayable across forked chains, // either the solidity version needs to be bumped up or it needs to be retrieved // from another contract. uint256 private constant _CHAIN_ID = 1; // Note: the domain separator is derived and verified in the constructor. */ bytes32 public constant DOMAIN_SEPARATOR = 0x048b125515112cdaed03d1edbee453f1de399178750917e49ce82b75444d7a21; uint256 public constant MAXIMUM_EXCHANGE_RATE = 500; //5% /* Token transfer proxy. */ TokenTransferProxy public tokenTransferProxy; /* Cancelled / finalized orders, by hash. */ mapping(bytes32 => bool) public cancelledOrFinalized; /* Orders verified by on-chain approval (alternative to ECDSA signatures so that smart contracts can place orders directly). */ /* Note that the maker's nonce at the time of approval **plus one** is stored in the mapping. */ mapping(bytes32 => uint256) private _approvedOrdersByNonce; /* Track per-maker nonces that can be incremented by the maker to cancel orders in bulk. */ // The current nonce for the maker represents the only valid nonce that can be signed by the maker // If a signature was signed with a nonce that's different from the one stored in nonces, it // will fail validation. mapping(address => uint256) public nonces; /* Required protocol taker fee, in basis points. Paid to takerRelayerFeeRecipient, makerRelayerFeeRecipient and protocol owner */ /* Initial rate 2% */ uint public exchangeFeeRate = 0; /* Share of exchangeFee which will be paid to takerRelayerFeeRecipient, in basis points. */ /* Initial share 15% */ uint public takerRelayerFeeShare = 1500; /* Share of exchangeFee which will be paid to makerRelayerFeeRecipient, in basis points. */ /* Initial share 80% */ uint public makerRelayerFeeShare = 8000; /* Share of exchangeFee which will be paid to protocolFeeRecipient, in basis points. */ /* Initial share 5% */ uint public protocolFeeShare = 500; /* Recipient of protocol fees. */ address public protocolFeeRecipient; /* Inverse basis point. */ uint public constant INVERSE_BASIS_POINT = 10000; /* */ address public merkleValidatorContract; /* */ address public royaltyRegisterHub; /* An order on the exchange. */ struct Order { /* Exchange address, intended as a versioning mechanism. */ address exchange; /* Order maker address. */ address maker; /* Order taker address, if specified. */ address taker; /* Order fee recipient or zero address for taker order. */ address makerRelayerFeeRecipient; /* Taker order fee recipient */ address takerRelayerFeeRecipient; /* Side (buy/sell). */ SaleKindInterface.Side side; /* Kind of sale. */ SaleKindInterface.SaleKind saleKind; /* nftAddress. */ address nftAddress; /* nft tokenId. */ uint tokenId; /* Calldata. */ bytes calldata; /* Calldata replacement pattern, or an empty byte array for no replacement. */ bytes replacementPattern; /* Static call target, zero-address for no static call. */ address staticTarget; /* Static call extra data. */ bytes staticExtradata; /* Token used to pay for the order, or the zero-address as a sentinel value for Ether. */ address paymentToken; /* Base price of the order (in paymentTokens). */ uint basePrice; /* Auction extra parameter - minimum bid increment for English auctions, starting/ending price difference. */ uint extra; /* Listing timestamp. */ uint listingTime; /* Expiration timestamp - 0 for no expiry. */ uint expirationTime; /* Order salt, used to prevent duplicate hashes. */ uint salt; /* NOTE: uint nonce is an additional component of the order but is read from storage */ } event OrderApprovedPartOne (bytes32 indexed hash, address exchange, address indexed maker, address taker, address indexed makerRelayerFeeRecipient, SaleKindInterface.Side side, SaleKindInterface.SaleKind saleKind, address nftAddress, uint256 tokenId, bytes32 ipfsHash); event OrderApprovedPartTwo (bytes32 indexed hash, bytes calldata, bytes replacementPattern, address staticTarget, bytes staticExtradata, address paymentToken, uint basePrice, uint extra, uint listingTime, uint expirationTime, uint salt); event OrderCancelled (bytes32 indexed hash); event OrdersMatched (bytes32 buyHash, bytes32 sellHash, address indexed maker, address indexed taker, address makerRelayerFeeRecipient, address takerRelayerFeeRecipient, uint price, bytes32 indexed metadata); event NonceIncremented (address indexed maker, uint newNonce); constructor () public { require(keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)") == _EIP_712_DOMAIN_TYPEHASH); require(keccak256(bytes(name)) == _NAME_HASH); require(keccak256(bytes(version)) == _VERSION_HASH); require(keccak256("Order(address exchange,address maker,address taker,address makerRelayerFeeRecipient,address takerRelayerFeeRecipient,uint8 side,uint8 saleKind,address nftAddress,uint tokenId,bytes32 merkleRoot,bytes calldata,bytes replacementPattern,address staticTarget,bytes staticExtradata,address paymentToken,uint256 basePrice,uint256 extra,uint256 listingTime,uint256 expirationTime,uint256 salt,uint256 nonce)") == _ORDER_TYPEHASH); require(DOMAIN_SEPARATOR == _deriveDomainSeparator()); } /** * @dev Derive the domain separator for EIP-712 signatures. * @return The domain separator. */ function _deriveDomainSeparator() private view returns (bytes32) { return keccak256( abi.encode( _EIP_712_DOMAIN_TYPEHASH, // keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)") _NAME_HASH, // keccak256("NiftyConnect Exchange Contract") _VERSION_HASH, // keccak256(bytes("1.0")) _CHAIN_ID, address(this) )); // NOTE: this is fixed, need to use solidity 0.5+ or make external call to support! } function checkRoyalties(address _contract) internal returns (bool) { bool success; bytes memory data = abi.encodeWithSelector(_EIP_165_SUPPORT_INTERFACE, _INTERFACE_ID_ERC2981); bytes memory result = new bytes(32); assembly { success := call( gas, // gas remaining _contract, // destination address 0, // no ether add(data, 32), // input buffer (starts after the first 32 bytes in the `data` array) mload(data), // input length (loaded from the first 32 bytes in the `data` array) result, // output buffer 32 // output length ) } if (!success) { return false; } bool supportERC2981; assembly { supportERC2981 := mload(result) } return supportERC2981; } /** * Increment a particular maker's nonce, thereby invalidating all orders that were not signed * with the original nonce. */ function incrementNonce() external { uint newNonce = ++nonces[msg.sender]; emit NonceIncremented(msg.sender, newNonce); } /** * @dev Change the exchange fee rate * @param newExchangeFeeRate New fee to set in basis points */ function changeExchangeFeeRate(uint newExchangeFeeRate) public onlyGovernor { require(newExchangeFeeRate<=MAXIMUM_EXCHANGE_RATE, "invalid exchange fee rate"); exchangeFeeRate = newExchangeFeeRate; } /** * @dev Change the taker fee paid to the taker relayer (owner only) * @param newTakerRelayerFeeShare New fee to set in basis points * @param newMakerRelayerFeeShare New fee to set in basis points * @param newProtocolFeeShare New fee to set in basis points */ function changeTakerRelayerFeeShare(uint newTakerRelayerFeeShare, uint newMakerRelayerFeeShare, uint newProtocolFeeShare) public onlyGovernor { require(SafeMath.add(SafeMath.add(newTakerRelayerFeeShare, newMakerRelayerFeeShare), newProtocolFeeShare) == INVERSE_BASIS_POINT, "invalid new fee share"); takerRelayerFeeShare = newTakerRelayerFeeShare; makerRelayerFeeShare = newMakerRelayerFeeShare; protocolFeeShare = newProtocolFeeShare; } /** * @dev Change the protocol fee recipient (owner only) * @param newProtocolFeeRecipient New protocol fee recipient address */ function changeProtocolFeeRecipient(address newProtocolFeeRecipient) public onlyOwner { protocolFeeRecipient = newProtocolFeeRecipient; } /** * @dev Transfer tokens * @param token Token to transfer * @param from Address to charge fees * @param to Address to receive fees * @param amount Amount of protocol tokens to charge */ function transferTokens(address token, address from, address to, uint amount) internal { if (amount > 0) { require(tokenTransferProxy.transferFrom(token, from, to, amount)); } } /** * @dev Execute a STATICCALL (introduced with Ethereum Metropolis, non-state-modifying external call) * @param target Contract to call * @param calldata Calldata (appended to extradata) * @param extradata Base data for STATICCALL (probably function selector and argument encoding) * @return The result of the call (success or failure) */ function staticCall(address target, bytes memory calldata, bytes memory extradata) public view returns (bool result) { bytes memory combined = new bytes(calldata.length + extradata.length); uint index; assembly { index := add(combined, 0x20) } index = ArrayUtils.unsafeWriteBytes(index, extradata); ArrayUtils.unsafeWriteBytes(index, calldata); assembly { result := staticcall(gas, target, add(combined, 0x20), mload(combined), mload(0x40), 0) } return result; } /** * @dev Hash an order, returning the canonical EIP-712 order hash without the domain separator * @param order Order to hash * @param nonce maker nonce to hash * @return Hash of order */ function hashOrder(Order memory order, uint nonce) internal pure returns (bytes32 hash) { /* Unfortunately abi.encodePacked doesn't work here, stack size constraints. */ uint size = 672; bytes memory array = new bytes(size); uint index; assembly { index := add(array, 0x20) } index = ArrayUtils.unsafeWriteBytes32(index, _ORDER_TYPEHASH); index = ArrayUtils.unsafeWriteAddressWord(index, order.exchange); index = ArrayUtils.unsafeWriteAddressWord(index, order.maker); index = ArrayUtils.unsafeWriteAddressWord(index, order.taker); index = ArrayUtils.unsafeWriteAddressWord(index, order.makerRelayerFeeRecipient); index = ArrayUtils.unsafeWriteAddressWord(index, order.takerRelayerFeeRecipient); index = ArrayUtils.unsafeWriteUint8Word(index, uint8(order.side)); index = ArrayUtils.unsafeWriteUint8Word(index, uint8(order.saleKind)); index = ArrayUtils.unsafeWriteAddressWord(index, order.nftAddress); index = ArrayUtils.unsafeWriteUint(index, order.tokenId); index = ArrayUtils.unsafeWriteBytes32(index, keccak256(order.calldata)); index = ArrayUtils.unsafeWriteBytes32(index, keccak256(order.replacementPattern)); index = ArrayUtils.unsafeWriteAddressWord(index, order.staticTarget); index = ArrayUtils.unsafeWriteBytes32(index, keccak256(order.staticExtradata)); index = ArrayUtils.unsafeWriteAddressWord(index, order.paymentToken); index = ArrayUtils.unsafeWriteUint(index, order.basePrice); index = ArrayUtils.unsafeWriteUint(index, order.extra); index = ArrayUtils.unsafeWriteUint(index, order.listingTime); index = ArrayUtils.unsafeWriteUint(index, order.expirationTime); index = ArrayUtils.unsafeWriteUint(index, order.salt); index = ArrayUtils.unsafeWriteUint(index, nonce); assembly { hash := keccak256(add(array, 0x20), size) } return hash; } /** * @dev Hash an order, returning the hash that a client must sign via EIP-712 including the message prefix * @param order Order to hash * @param nonce Nonce to hash * @return Hash of message prefix and order hash per Ethereum format */ function hashToSign(Order memory order, uint nonce) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", DOMAIN_SEPARATOR, hashOrder(order, nonce))); } /** * @dev Assert an order is valid and return its hash * @param order Order to validate * @param nonce Nonce to validate */ function requireValidOrder(Order memory order, uint nonce) internal view returns (bytes32) { bytes32 hash = hashToSign(order, nonce); require(validateOrder(hash, order), "invalid order"); return hash; } /** * @dev Validate order parameters * @param order Order to validate */ function validateOrderParameters(Order memory order) internal view returns (bool) { /* Order must be targeted at this protocol version (this Exchange contract). */ if (order.exchange != address(this)) { return false; } /* Order must have a maker. */ if (order.maker == address(0)) { return false; } /* Order must possess valid sale kind parameter combination. */ if (!SaleKindInterface.validateParameters(order.saleKind, order.expirationTime)) { return false; } return true; } /** * @dev Validate a provided previously approved / signed order, hash * @param hash Order hash (already calculated, passed to avoid recalculation) * @param order Order to validate */ function validateOrder(bytes32 hash, Order memory order) internal view returns (bool) { /* Not done in an if-conditional to prevent unnecessary ecrecover evaluation, which seems to happen even though it should short-circuit. */ /* Order must have valid parameters. */ if (!validateOrderParameters(order)) { return false; } /* Order must have not been canceled or already filled. */ if (cancelledOrFinalized[hash]) { return false; } /* Return true if order has been previously approved with the current nonce */ uint approvedOrderNoncePlusOne = _approvedOrdersByNonce[hash]; if (approvedOrderNoncePlusOne == 0) { return false; } return approvedOrderNoncePlusOne == nonces[order.maker] + 1; } /** * @dev Determine if an order has been approved. Note that the order may not still * be valid in cases where the maker's nonce has been incremented. * @param hash Hash of the order * @return whether or not the order was approved. */ function approvedOrders(bytes32 hash) public view returns (bool approved) { return _approvedOrdersByNonce[hash] != 0; } /** * @dev Approve an order and optionally mark it for orderbook inclusion. Must be called by the maker of the order * @param order Order to approve * @param ipfsHash Order metadata on IPFS */ function makeOrder(Order memory order, bytes32 ipfsHash) internal { /* CHECKS */ /* Assert sender is authorized to approve order. */ require(msg.sender == order.maker); /* Calculate order hash. */ bytes32 hash = hashToSign(order, nonces[order.maker]); /* Assert order has not already been approved. */ require(_approvedOrdersByNonce[hash] == 0, "duplicated order hash"); /* EFFECTS */ /* Mark order as approved. */ _approvedOrdersByNonce[hash] = nonces[order.maker] + 1; /* Log approval event. Must be split in two due to Solidity stack size limitations. */ { emit OrderApprovedPartOne(hash, order.exchange, order.maker, order.taker, order.makerRelayerFeeRecipient, order.side, order.saleKind, order.nftAddress, order.tokenId, ipfsHash); } { emit OrderApprovedPartTwo(hash, order.calldata, order.replacementPattern, order.staticTarget, order.staticExtradata, order.paymentToken, order.basePrice, order.extra, order.listingTime, order.expirationTime, order.salt); } } /** * @dev Cancel an order, preventing it from being matched. Must be called by the maker of the order * @param order Order to cancel * @param nonce Nonce to cancel */ function cancelOrder(Order memory order, uint nonce) internal { /* CHECKS */ /* Calculate order hash. */ bytes32 hash = requireValidOrder(order, nonce); /* Assert sender is authorized to cancel order. */ require(msg.sender == order.maker); /* EFFECTS */ /* Mark order as cancelled, preventing it from being matched. */ cancelledOrFinalized[hash] = true; /* Log cancel event. */ emit OrderCancelled(hash); } /** * @dev Calculate the current price of an order (convenience function) * @param order Order to calculate the price of * @return The current price of the order */ function calculateCurrentPrice (Order memory order) internal view returns (uint) { return SaleKindInterface.calculateFinalPrice(order.side, order.saleKind, order.basePrice, order.extra, order.listingTime, order.expirationTime); } /** * @dev Calculate the price two orders would match at, if in fact they would match (otherwise fail) * @param buy Buy-side order * @param sell Sell-side order * @return Match price */ function calculateMatchPrice(Order memory buy, Order memory sell) view internal returns (uint) { /* Calculate sell price. */ uint sellPrice = SaleKindInterface.calculateFinalPrice(sell.side, sell.saleKind, sell.basePrice, sell.extra, sell.listingTime, sell.expirationTime); /* Calculate buy price. */ uint buyPrice = SaleKindInterface.calculateFinalPrice(buy.side, buy.saleKind, buy.basePrice, buy.extra, buy.listingTime, buy.expirationTime); /* Require price cross. */ require(buyPrice >= sellPrice); /* Maker/taker priority. */ return sell.makerRelayerFeeRecipient != address(0) ? sellPrice : buyPrice; } /** * @dev Execute all IERC20 token / Ether transfers associated with an order match (fees and buyer => seller transfer) * @param buy Buy-side order * @param sell Sell-side order */ function executeFundsTransfer(Order memory buy, Order memory sell) internal returns (uint) { /* Only payable in the special case of unwrapped Ether. */ if (sell.paymentToken != address(0)) { require(msg.value == 0); } /* Calculate match price. */ uint price = calculateMatchPrice(buy, sell); /* If paying using a token (not Ether), transfer tokens. This is done prior to fee payments to that a seller will have tokens before being charged fees. */ if (price > 0 && sell.paymentToken != address(0)) { transferTokens(sell.paymentToken, buy.maker, sell.maker, price); } /* Amount that will be received by seller (for Ether). */ uint receiveAmount = price; /* Amount that must be sent by buyer (for Ether). */ uint requiredAmount = price; uint exchangeFee = SafeMath.div(SafeMath.mul(exchangeFeeRate, price), INVERSE_BASIS_POINT); address royaltyReceiver = address(0x00); uint256 royaltyAmount; if (checkRoyalties(sell.nftAddress)) { (royaltyReceiver, royaltyAmount) = IERC2981(sell.nftAddress).royaltyInfo(buy.tokenId, price); } else { (royaltyReceiver, royaltyAmount) = IRoyaltyRegisterHub(royaltyRegisterHub).royaltyInfo(sell.nftAddress, price); } if (royaltyReceiver != address(0x00) && royaltyAmount != 0) { if (sell.paymentToken == address(0)) { receiveAmount = SafeMath.sub(receiveAmount, royaltyAmount); royaltyReceiver.transfer(royaltyAmount); } else { transferTokens(sell.paymentToken, sell.maker, royaltyReceiver, royaltyAmount); } } /* Determine maker/taker and charge fees accordingly. */ if (sell.makerRelayerFeeRecipient != address(0) && exchangeFee != 0) { /* Sell-side order is maker. */ /* Maker fees are deducted from the token amount that the maker receives. Taker fees are extra tokens that must be paid by the taker. */ uint makerRelayerFee = SafeMath.div(SafeMath.mul(makerRelayerFeeShare, exchangeFee), INVERSE_BASIS_POINT); if (sell.paymentToken == address(0)) { receiveAmount = SafeMath.sub(receiveAmount, makerRelayerFee); sell.makerRelayerFeeRecipient.transfer(makerRelayerFee); } else { transferTokens(sell.paymentToken, sell.maker, sell.makerRelayerFeeRecipient, makerRelayerFee); } if (buy.takerRelayerFeeRecipient != address(0)) { uint takerRelayerFee = SafeMath.div(SafeMath.mul(takerRelayerFeeShare, exchangeFee), INVERSE_BASIS_POINT); if (sell.paymentToken == address(0)) { receiveAmount = SafeMath.sub(receiveAmount, takerRelayerFee); buy.takerRelayerFeeRecipient.transfer(takerRelayerFee); } else { transferTokens(sell.paymentToken, sell.maker, buy.takerRelayerFeeRecipient, takerRelayerFee); } } uint protocolFee = SafeMath.div(SafeMath.mul(protocolFeeShare, exchangeFee), INVERSE_BASIS_POINT); if (sell.paymentToken == address(0)) { receiveAmount = SafeMath.sub(receiveAmount, protocolFee); protocolFeeRecipient.transfer(protocolFee); } else { transferTokens(sell.paymentToken, sell.maker, protocolFeeRecipient, protocolFee); } } else if (sell.makerRelayerFeeRecipient == address(0)){ /* Buy-side order is maker. */ /* The Exchange does not escrow Ether, so direct Ether can only be used to with sell-side maker / buy-side taker orders. */ require(sell.paymentToken != address(0)); if (exchangeFee != 0) { makerRelayerFee = SafeMath.div(SafeMath.mul(makerRelayerFeeShare, exchangeFee), INVERSE_BASIS_POINT); transferTokens(sell.paymentToken, sell.maker, buy.makerRelayerFeeRecipient, makerRelayerFee); if (sell.takerRelayerFeeRecipient != address(0)) { takerRelayerFee = SafeMath.div(SafeMath.mul(takerRelayerFeeShare, exchangeFee), INVERSE_BASIS_POINT); transferTokens(sell.paymentToken, sell.maker, sell.takerRelayerFeeRecipient, takerRelayerFee); } protocolFee = SafeMath.div(SafeMath.mul(protocolFeeShare, exchangeFee), INVERSE_BASIS_POINT); transferTokens(sell.paymentToken, sell.maker, protocolFeeRecipient, protocolFee); } } if (sell.paymentToken == address(0)) { /* Special-case Ether, order must be matched by buyer. */ require(msg.value >= requiredAmount); sell.maker.transfer(receiveAmount); /* Allow overshoot for variable-price auctions, refund difference. */ uint diff = SafeMath.sub(msg.value, requiredAmount); if (diff > 0) { buy.maker.transfer(diff); } } /* This contract should never hold Ether, however, we cannot assert this, since it is impossible to prevent anyone from sending Ether e.g. with selfdestruct. */ return price; } /** * @dev Return whether or not two orders can be matched with each other by basic parameters (does not check order signatures / calldata or perform static calls) * @param buy Buy-side order * @param sell Sell-side order * @return Whether or not the two orders can be matched */ function ordersCanMatch(Order memory buy, Order memory sell) internal view returns (bool) { return ( /* Must be opposite-side. */ (buy.side == SaleKindInterface.Side.Buy && sell.side == SaleKindInterface.Side.Sell) && /* Must use same payment token. */ (buy.paymentToken == sell.paymentToken) && /* Must match maker/taker addresses. */ (sell.taker == address(0) || sell.taker == buy.maker) && (buy.taker == address(0) || buy.taker == sell.maker) && /* One must be maker and the other must be taker (no bool XOR in Solidity). */ ((sell.makerRelayerFeeRecipient == address(0) && buy.makerRelayerFeeRecipient != address(0)) || (sell.makerRelayerFeeRecipient != address(0) && buy.makerRelayerFeeRecipient == address(0))) && /* Must match nftAddress. */ (buy.nftAddress == sell.nftAddress) && /* Buy-side order must be settleable. */ SaleKindInterface.canSettleOrder(buy.listingTime, buy.expirationTime) && /* Sell-side order must be settleable. */ SaleKindInterface.canSettleOrder(sell.listingTime, sell.expirationTime) ); } /** * @dev Atomically match two orders, ensuring validity of the match, and execute all associated state transitions. Protected against reentrancy by a contract-global lock. * @param buy Buy-side order * @param sell Sell-side order */ function takeOrder(Order memory buy, Order memory sell, bytes32 metadata) internal reentrancyGuard { /* CHECKS */ /* Ensure buy order validity and calculate hash if necessary. */ bytes32 buyHash; if (buy.maker == msg.sender) { require(validateOrderParameters(buy), "invalid buy params"); } else { buyHash = _requireValidOrderWithNonce(buy); } /* Ensure sell order validity and calculate hash if necessary. */ bytes32 sellHash; if (sell.maker == msg.sender) { require(validateOrderParameters(sell), "invalid sell params"); } else { sellHash = _requireValidOrderWithNonce(sell); } /* Must be matchable. */ require(ordersCanMatch(buy, sell), "order can't match"); /* Must match calldata after replacement, if specified. */ if (buy.replacementPattern.length > 0) { ArrayUtils.guardedArrayReplace(buy.calldata, sell.calldata, buy.replacementPattern); } if (sell.replacementPattern.length > 0) { ArrayUtils.guardedArrayReplace(sell.calldata, buy.calldata, sell.replacementPattern); } require(ArrayUtils.arrayEq(buy.calldata, sell.calldata), "calldata doesn't equal"); /* EFFECTS */ /* Mark previously signed or approved orders as finalized. */ if (msg.sender != buy.maker) { cancelledOrFinalized[buyHash] = true; } if (msg.sender != sell.maker) { cancelledOrFinalized[sellHash] = true; } /* INTERACTIONS */ /* Execute funds transfer and pay fees. */ uint price = executeFundsTransfer(buy, sell); require(merkleValidatorContract.delegatecall(sell.calldata), "order calldata failure"); /* Static calls are intentionally done after the effectful call so they can check resulting state. */ /* Handle buy-side static call if specified. */ if (buy.staticTarget != address(0)) { require(staticCall(buy.staticTarget, sell.calldata, buy.staticExtradata)); } /* Handle sell-side static call if specified. */ if (sell.staticTarget != address(0)) { require(staticCall(sell.staticTarget, sell.calldata, sell.staticExtradata)); } /* Log match event. */ emit OrdersMatched( buyHash, sellHash, sell.makerRelayerFeeRecipient != address(0) ? sell.maker : buy.maker, sell.makerRelayerFeeRecipient != address(0) ? buy.maker : sell.maker, sell.makerRelayerFeeRecipient != address(0) ? sell.makerRelayerFeeRecipient : buy.makerRelayerFeeRecipient, sell.makerRelayerFeeRecipient != address(0) ? buy.takerRelayerFeeRecipient : sell.takerRelayerFeeRecipient, price, metadata); } function _requireValidOrderWithNonce(Order memory order) internal view returns (bytes32) { return requireValidOrder(order, nonces[order.maker]); } } // File: contracts/NiftyConnectExchange.sol pragma solidity 0.4.26; contract NiftyConnectExchange is ExchangeCore { enum MerkleValidatorSelector { MatchERC721UsingCriteria, MatchERC721WithSafeTransferUsingCriteria, MatchERC1155UsingCriteria } constructor ( TokenTransferProxy tokenTransferProxyAddress, address protocolFeeAddress, address merkleValidatorAddress, address royaltyRegisterHubAddress) public { tokenTransferProxy = tokenTransferProxyAddress; protocolFeeRecipient = protocolFeeAddress; merkleValidatorContract = merkleValidatorAddress; royaltyRegisterHub = royaltyRegisterHubAddress; } function buildCallData( uint selector, address from, address to, address nftAddress, uint256 tokenId, uint256 amount, bytes32 merkleRoot, bytes32[] memory merkleProof) public view returns(bytes) { MerkleValidatorSelector merkleValidatorSelector = MerkleValidatorSelector(selector); if (merkleValidatorSelector == MerkleValidatorSelector.MatchERC721UsingCriteria) { return abi.encodeWithSignature("matchERC721UsingCriteria(address,address,address,uint256,bytes32,bytes32[])", from, to, nftAddress, tokenId, merkleRoot, merkleProof); } else if (merkleValidatorSelector == MerkleValidatorSelector.MatchERC721WithSafeTransferUsingCriteria) { return abi.encodeWithSignature("matchERC721WithSafeTransferUsingCriteria(address,address,address,uint256,bytes32,bytes32[])", from, to, nftAddress, tokenId, merkleRoot, merkleProof); } else if (merkleValidatorSelector == MerkleValidatorSelector.MatchERC1155UsingCriteria) { return abi.encodeWithSignature("matchERC1155UsingCriteria(address,address,address,uint256,uint256,bytes32,bytes32[])", from, to, nftAddress, tokenId, amount, merkleRoot, merkleProof); } else { return new bytes(0); } } function buildCallDataInternal( address from, address to, address nftAddress, uint[9] uints, bytes32 merkleRoot) internal view returns(bytes) { bytes32[] memory merkleProof; if (uints[8]==0) { require(merkleRoot==bytes32(0x00), "invalid merkleRoot"); return buildCallData(uints[5],from,to,nftAddress,uints[6],uints[7],merkleRoot,merkleProof); } require(uints[8]>=2&&merkleRoot!=bytes32(0x00), "invalid merkle data"); uint256 merkleProofLength; uint256 divResult = uints[8]; bool hasMod = false; for(;divResult!=0;) { uint256 tempDivResult = divResult/2; if (SafeMath.mul(tempDivResult, 2)<divResult) { hasMod = true; } divResult=tempDivResult; merkleProofLength++; } if (!hasMod) { merkleProofLength--; } merkleProof = new bytes32[](merkleProofLength); return buildCallData(uints[5],from,to,nftAddress,uints[6],uints[7],merkleRoot,merkleProof); } function guardedArrayReplace(bytes array, bytes desired, bytes mask) public pure returns (bytes) { ArrayUtils.guardedArrayReplace(array, desired, mask); return array; } function calculateFinalPrice(SaleKindInterface.Side side, SaleKindInterface.SaleKind saleKind, uint basePrice, uint extra, uint listingTime, uint expirationTime) public view returns (uint) { return SaleKindInterface.calculateFinalPrice(side, saleKind, basePrice, extra, listingTime, expirationTime); } function hashToSign_( address[9] addrs, uint[9] uints, SaleKindInterface.Side side, SaleKindInterface.SaleKind saleKind, bytes replacementPattern, bytes staticExtradata, bytes32 merkleRoot) public view returns (bytes32) { bytes memory orderCallData = buildCallDataInternal(addrs[7],addrs[8],addrs[4],uints,merkleRoot); return hashToSign( Order(addrs[0], addrs[1], addrs[2], addrs[3], address(0x00), side, saleKind, addrs[4], uints[6], orderCallData, replacementPattern, addrs[5], staticExtradata, IERC20(addrs[6]), uints[0], uints[1], uints[2], uints[3], uints[4]), nonces[addrs[1]] ); } function validateOrderParameters_ ( address[9] addrs, uint[9] uints, SaleKindInterface.Side side, SaleKindInterface.SaleKind saleKind, bytes replacementPattern, bytes staticExtradata, bytes32 merkleRoot) view public returns (bool) { bytes memory orderCallData = buildCallDataInternal(addrs[7],addrs[8],addrs[4],uints,merkleRoot); Order memory order = Order(addrs[0], addrs[1], addrs[2], addrs[3], address(0x00), side, saleKind, addrs[4], uints[6], orderCallData, replacementPattern, addrs[5], staticExtradata, IERC20(addrs[6]), uints[0], uints[1], uints[2], uints[3], uints[4]); return validateOrderParameters( order ); } function validateOrder_ ( address[9] addrs, uint[9] uints, SaleKindInterface.Side side, SaleKindInterface.SaleKind saleKind, bytes replacementPattern, bytes staticExtradata, bytes32 merkleRoot) view public returns (bool) { bytes memory orderCallData = buildCallDataInternal(addrs[7],addrs[8],addrs[4],uints,merkleRoot); Order memory order = Order(addrs[0], addrs[1], addrs[2], addrs[3], address(0x00), side, saleKind, addrs[4], uints[6], orderCallData, replacementPattern, addrs[5], staticExtradata, IERC20(addrs[6]), uints[0], uints[1], uints[2], uints[3], uints[4]); return validateOrder( hashToSign(order, nonces[order.maker]), order ); } function makeOrder_ ( address[9] addrs, uint[9] uints, SaleKindInterface.Side side, SaleKindInterface.SaleKind saleKind, bytes replacementPattern, bytes staticExtradata, bytes32[2] merkleData) public { bytes memory orderCallData = buildCallDataInternal(addrs[7],addrs[8],addrs[4],uints,merkleData[0]); require(addrs[3]!=address(0x00), "makerRelayerFeeRecipient must not be zero"); require(orderCallData.length==replacementPattern.length, "replacement pattern length mismatch"); Order memory order = Order(addrs[0], addrs[1], addrs[2], addrs[3], address(0x00), side, saleKind, addrs[4], uints[6], orderCallData, replacementPattern, addrs[5], staticExtradata, IERC20(addrs[6]), uints[0], uints[1], uints[2], uints[3], uints[4]); return makeOrder(order, merkleData[1]); } function cancelOrder_( address[9] addrs, uint[9] uints, SaleKindInterface.Side side, SaleKindInterface.SaleKind saleKind, bytes replacementPattern, bytes staticExtradata, bytes32 merkleRoot) public { bytes memory orderCallData = buildCallDataInternal(addrs[7],addrs[8],addrs[4],uints,merkleRoot); Order memory order = Order(addrs[0], addrs[1], addrs[2], addrs[3], address(0x00), side, saleKind, addrs[4], uints[6], orderCallData, replacementPattern, addrs[5], staticExtradata, IERC20(addrs[6]), uints[0], uints[1], uints[2], uints[3], uints[4]); return cancelOrder( order, nonces[order.maker] ); } function calculateCurrentPrice_( address[9] addrs, uint[9] uints, SaleKindInterface.Side side, SaleKindInterface.SaleKind saleKind, bytes replacementPattern, bytes staticExtradata, bytes32 merkleRoot) public view returns (uint) { bytes memory orderCallData = buildCallDataInternal(addrs[7],addrs[8],addrs[4],uints,merkleRoot); return calculateCurrentPrice( Order(addrs[0], addrs[1], addrs[2], addrs[3], address(0x00), side, saleKind, addrs[4], uints[6], orderCallData, replacementPattern, addrs[5], staticExtradata, IERC20(addrs[6]), uints[0], uints[1], uints[2], uints[3], uints[4]) ); } function ordersCanMatch_( address[16] addrs, uint[12] uints, uint8[4] sidesKinds, bytes calldataBuy, bytes calldataSell, bytes replacementPatternBuy, bytes replacementPatternSell, bytes staticExtradataBuy, bytes staticExtradataSell) public view returns (bool) { Order memory buy = Order(addrs[0], addrs[1], addrs[2], addrs[3], addrs[4], SaleKindInterface.Side(sidesKinds[0]), SaleKindInterface.SaleKind(sidesKinds[1]), addrs[5], uints[5], calldataBuy, replacementPatternBuy, addrs[6], staticExtradataBuy, IERC20(addrs[7]), uints[0], uints[1], uints[2], uints[3], uints[4]); Order memory sell = Order(addrs[8], addrs[9], addrs[10], addrs[11], addrs[12], SaleKindInterface.Side(sidesKinds[2]), SaleKindInterface.SaleKind(sidesKinds[3]), addrs[13], uints[11], calldataSell, replacementPatternSell, addrs[14], staticExtradataSell, IERC20(addrs[15]), uints[6], uints[7], uints[8], uints[9], uints[10]); return ordersCanMatch( buy, sell ); } function orderCalldataCanMatch(bytes buyCalldata, bytes buyReplacementPattern, bytes sellCalldata, bytes sellReplacementPattern) public pure returns (bool) { if (buyReplacementPattern.length > 0) { ArrayUtils.guardedArrayReplace(buyCalldata, sellCalldata, buyReplacementPattern); } if (sellReplacementPattern.length > 0) { ArrayUtils.guardedArrayReplace(sellCalldata, buyCalldata, sellReplacementPattern); } return ArrayUtils.arrayEq(buyCalldata, sellCalldata); } function calculateMatchPrice_( address[16] addrs, uint[12] uints, uint8[4] sidesKinds, bytes calldataBuy, bytes calldataSell, bytes replacementPatternBuy, bytes replacementPatternSell, bytes staticExtradataBuy, bytes staticExtradataSell) public view returns (uint) { Order memory buy = Order(addrs[0], addrs[1], addrs[2], addrs[3], addrs[4], SaleKindInterface.Side(sidesKinds[0]), SaleKindInterface.SaleKind(sidesKinds[1]), addrs[5], uints[5], calldataBuy, replacementPatternBuy, addrs[6], staticExtradataBuy, IERC20(addrs[7]), uints[0], uints[1], uints[2], uints[3], uints[4]); Order memory sell = Order(addrs[8], addrs[9], addrs[10], addrs[11], addrs[12], SaleKindInterface.Side(sidesKinds[2]), SaleKindInterface.SaleKind(sidesKinds[3]), addrs[13], uints[11], calldataSell, replacementPatternSell, addrs[14], staticExtradataSell, IERC20(addrs[15]), uints[6], uints[7], uints[8], uints[9], uints[10]); return calculateMatchPrice( buy, sell ); } function takeOrder_( address[16] addrs, uint[12] uints, uint8[4] sidesKinds, bytes calldataBuy, bytes calldataSell, bytes replacementPatternBuy, bytes replacementPatternSell, bytes staticExtradataBuy, bytes staticExtradataSell, bytes32 rssMetadata) public payable { return takeOrder( Order(addrs[0], addrs[1], addrs[2], addrs[3], addrs[4], SaleKindInterface.Side(sidesKinds[0]), SaleKindInterface.SaleKind(sidesKinds[1]), addrs[5], uints[5], calldataBuy, replacementPatternBuy, addrs[6], staticExtradataBuy, IERC20(addrs[7]), uints[0], uints[1], uints[2], uints[3], uints[4]), Order(addrs[8], addrs[9], addrs[10], addrs[11], addrs[12], SaleKindInterface.Side(sidesKinds[2]), SaleKindInterface.SaleKind(sidesKinds[3]), addrs[13], uints[11], calldataSell, replacementPatternSell, addrs[14], staticExtradataSell, IERC20(addrs[15]), uints[6], uints[7], uints[8], uints[9], uints[10]), rssMetadata ); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[{"name":"addrs","type":"address[16]"},{"name":"uints","type":"uint256[12]"},{"name":"sidesKinds","type":"uint8[4]"},{"name":"calldataBuy","type":"bytes"},{"name":"calldataSell","type":"bytes"},{"name":"replacementPatternBuy","type":"bytes"},{"name":"replacementPatternSell","type":"bytes"},{"name":"staticExtradataBuy","type":"bytes"},{"name":"staticExtradataSell","type":"bytes"}],"name":"calculateMatchPrice_","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":true,"inputs":[],"name":"governor","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenTransferProxy","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"exchangeFeeRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"target","type":"address"},{"name":"calldata","type":"bytes"},{"name":"extradata","type":"bytes"}],"name":"staticCall","outputs":[{"name":"result","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"addrs","type":"address[16]"},{"name":"uints","type":"uint256[12]"},{"name":"sidesKinds","type":"uint8[4]"},{"name":"calldataBuy","type":"bytes"},{"name":"calldataSell","type":"bytes"},{"name":"replacementPatternBuy","type":"bytes"},{"name":"replacementPatternSell","type":"bytes"},{"name":"staticExtradataBuy","type":"bytes"},{"name":"staticExtradataSell","type":"bytes"}],"name":"ordersCanMatch_","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"addrs","type":"address[9]"},{"name":"uints","type":"uint256[9]"},{"name":"side","type":"uint8"},{"name":"saleKind","type":"uint8"},{"name":"replacementPattern","type":"bytes"},{"name":"staticExtradata","type":"bytes"},{"name":"merkleRoot","type":"bytes32"}],"name":"calculateCurrentPrice_","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"acceptGovernance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"array","type":"bytes"},{"name":"desired","type":"bytes"},{"name":"mask","type":"bytes"}],"name":"guardedArrayReplace","outputs":[{"name":"","type":"bytes"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"selector","type":"uint256"},{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"nftAddress","type":"address"},{"name":"tokenId","type":"uint256"},{"name":"amount","type":"uint256"},{"name":"merkleRoot","type":"bytes32"},{"name":"merkleProof","type":"bytes32[]"}],"name":"buildCallData","outputs":[{"name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newTakerRelayerFeeShare","type":"uint256"},{"name":"newMakerRelayerFeeShare","type":"uint256"},{"name":"newProtocolFeeShare","type":"uint256"}],"name":"changeTakerRelayerFeeShare","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"addrs","type":"address[9]"},{"name":"uints","type":"uint256[9]"},{"name":"side","type":"uint8"},{"name":"saleKind","type":"uint8"},{"name":"replacementPattern","type":"bytes"},{"name":"staticExtradata","type":"bytes"},{"name":"merkleRoot","type":"bytes32"}],"name":"validateOrder_","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"royaltyRegisterHub","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"takerRelayerFeeShare","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newProtocolFeeRecipient","type":"address"}],"name":"changeProtocolFeeRecipient","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"version","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"buyCalldata","type":"bytes"},{"name":"buyReplacementPattern","type":"bytes"},{"name":"sellCalldata","type":"bytes"},{"name":"sellReplacementPattern","type":"bytes"}],"name":"orderCalldataCanMatch","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[],"name":"incrementNonce","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"side","type":"uint8"},{"name":"saleKind","type":"uint8"},{"name":"basePrice","type":"uint256"},{"name":"extra","type":"uint256"},{"name":"listingTime","type":"uint256"},{"name":"expirationTime","type":"uint256"}],"name":"calculateFinalPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"protocolFeeRecipient","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"addrs","type":"address[16]"},{"name":"uints","type":"uint256[12]"},{"name":"sidesKinds","type":"uint8[4]"},{"name":"calldataBuy","type":"bytes"},{"name":"calldataSell","type":"bytes"},{"name":"replacementPatternBuy","type":"bytes"},{"name":"replacementPatternSell","type":"bytes"},{"name":"staticExtradataBuy","type":"bytes"},{"name":"staticExtradataSell","type":"bytes"},{"name":"rssMetadata","type":"bytes32"}],"name":"takeOrder_","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"nonces","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"cancelledOrFinalized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"addrs","type":"address[9]"},{"name":"uints","type":"uint256[9]"},{"name":"side","type":"uint8"},{"name":"saleKind","type":"uint8"},{"name":"replacementPattern","type":"bytes"},{"name":"staticExtradata","type":"bytes"},{"name":"merkleRoot","type":"bytes32"}],"name":"hashToSign_","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"addrs","type":"address[9]"},{"name":"uints","type":"uint256[9]"},{"name":"side","type":"uint8"},{"name":"saleKind","type":"uint8"},{"name":"replacementPattern","type":"bytes"},{"name":"staticExtradata","type":"bytes"},{"name":"merkleRoot","type":"bytes32"}],"name":"cancelOrder_","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"protocolFeeShare","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"addrs","type":"address[9]"},{"name":"uints","type":"uint256[9]"},{"name":"side","type":"uint8"},{"name":"saleKind","type":"uint8"},{"name":"replacementPattern","type":"bytes"},{"name":"staticExtradata","type":"bytes"},{"name":"merkleData","type":"bytes32[2]"}],"name":"makeOrder_","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newExchangeFeeRate","type":"uint256"}],"name":"changeExchangeFeeRate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"INVERSE_BASIS_POINT","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pendingGovernor","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAXIMUM_EXCHANGE_RATE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"hash","type":"bytes32"}],"name":"approvedOrders","outputs":[{"name":"approved","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"addrs","type":"address[9]"},{"name":"uints","type":"uint256[9]"},{"name":"side","type":"uint8"},{"name":"saleKind","type":"uint8"},{"name":"replacementPattern","type":"bytes"},{"name":"staticExtradata","type":"bytes"},{"name":"merkleRoot","type":"bytes32"}],"name":"validateOrderParameters_","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"makerRelayerFeeShare","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"merkleValidatorContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"pendingGovernor_","type":"address"}],"name":"setPendingGovernor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"tokenTransferProxyAddress","type":"address"},{"name":"protocolFeeAddress","type":"address"},{"name":"merkleValidatorAddress","type":"address"},{"name":"royaltyRegisterHubAddress","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"hash","type":"bytes32"},{"indexed":false,"name":"exchange","type":"address"},{"indexed":true,"name":"maker","type":"address"},{"indexed":false,"name":"taker","type":"address"},{"indexed":true,"name":"makerRelayerFeeRecipient","type":"address"},{"indexed":false,"name":"side","type":"uint8"},{"indexed":false,"name":"saleKind","type":"uint8"},{"indexed":false,"name":"nftAddress","type":"address"},{"indexed":false,"name":"tokenId","type":"uint256"},{"indexed":false,"name":"ipfsHash","type":"bytes32"}],"name":"OrderApprovedPartOne","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"hash","type":"bytes32"},{"indexed":false,"name":"calldata","type":"bytes"},{"indexed":false,"name":"replacementPattern","type":"bytes"},{"indexed":false,"name":"staticTarget","type":"address"},{"indexed":false,"name":"staticExtradata","type":"bytes"},{"indexed":false,"name":"paymentToken","type":"address"},{"indexed":false,"name":"basePrice","type":"uint256"},{"indexed":false,"name":"extra","type":"uint256"},{"indexed":false,"name":"listingTime","type":"uint256"},{"indexed":false,"name":"expirationTime","type":"uint256"},{"indexed":false,"name":"salt","type":"uint256"}],"name":"OrderApprovedPartTwo","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"hash","type":"bytes32"}],"name":"OrderCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"buyHash","type":"bytes32"},{"indexed":false,"name":"sellHash","type":"bytes32"},{"indexed":true,"name":"maker","type":"address"},{"indexed":true,"name":"taker","type":"address"},{"indexed":false,"name":"makerRelayerFeeRecipient","type":"address"},{"indexed":false,"name":"takerRelayerFeeRecipient","type":"address"},{"indexed":false,"name":"price","type":"uint256"},{"indexed":true,"name":"metadata","type":"bytes32"}],"name":"OrdersMatched","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"maker","type":"address"},{"indexed":false,"name":"newNonce","type":"uint256"}],"name":"NonceIncremented","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousGovernor","type":"address"},{"indexed":true,"name":"newGovernor","type":"address"}],"name":"GovernanceTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"newPendingGovernor","type":"address"}],"name":"NewPendingGovernor","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]
Contract Creation Code
60806040526000805460ff191681556007556105dc600855611f406009556101f4600a553480156200003057600080fd5b50604051608080620054a7833981016040818152825160208085015183860151606090960151600080546101003390810261010060a860020a03199092169190911790915560018054600160a060020a03191690911790557f454950373132446f6d61696e28737472696e67206e616d652c737472696e672086527f76657273696f6e2c75696e7432353620636861696e49642c6164647265737320928601929092527f766572696679696e67436f6e7472616374290000000000000000000000000000848601529251938490036052019093209093919290600080516020620052f7833981519152146200012457600080fd5b604080518082018252601e8082527f4e69667479436f6e6e6563742045786368616e676520436f6e74726163740000602083019081529251600080516020620052b78339815191529390918291908083835b60208310620001975780518252601f19909201916020918201910162000176565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902060001916141515620001d557600080fd5b60408051808201825260038082527f312e300000000000000000000000000000000000000000000000000000000000602083019081529251600080516020620052d78339815191529390918291908083835b60208310620002485780518252601f19909201916020918201910162000227565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020600019161415156200028657600080fd5b6040517ff446866267029076a71bb126e250b9480cd4ac2699baa745a582b10b361ec951908061019062005317823960405190819003610190019020919091149050620002d257600080fd5b620002e564010000000062000365810204565b7f048b125515112cdaed03d1edbee453f1de399178750917e49ce82b75444d7a21146200031157600080fd5b60038054600160a060020a03958616600160a060020a031991821617909155600b805494861694821694909417909355600c805492851692841692909217909155600d805491909316911617905562000432565b60408051600080516020620052f7833981519152602080830191909152600080516020620052b783398151915282840152600080516020620052d78339815191526060830152600160808301523060a0808401919091528351808403909101815260c0909201928390528151600093918291908401908083835b60208310620004005780518252601f199092019160209182019101620003df565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020905090565b614e7580620004426000396000f3006080604052600436106101f85763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663028e01cf81146101fd57806306fdde03146104155780630c340a241461049f5780630eefdbad146104d05780630f9b4955146104e557806310796a47146104fa5780631f2c56d7146105b35780631f86dbc0146107b9578063238efcbc146108b8578063239e83df146108cf5780633644e515146109a457806337146f2e146109b95780633d1cf52614610a3a5780633df6be1314610a585780633eeb5bc814610b575780634a3b5e0514610b6c578063514f033014610b8157806354fd4d5014610ba2578063562b2ebc14610bb7578063627cdcb914610cca57806363d36c0b14610cdf57806364df049e14610d0c578063715018a614610d215780637da26f5514610d365780637ecebe0014610f315780638076f00514610f5257806381da91a014610f6a5780638da5cb5b14611069578063941461661461107e578063960b26a21461117d57806397cea71b14611192578063ade0ccb2146112b2578063cae6047f146112ca578063e3056a34146112df578063e4e098f7146112f4578063e57d4adb14611309578063e7b74b6414611321578063e8898e6d14611420578063f111357514611435578063f235757f1461144a578063f2fde38b1461146b575b600080fd5b34801561020957600080fd5b5060408051610200818101909252610403913691600491610204919083906010908390839080828437505060408051610180818101909252949796958181019594509250600c9150839083908082843750506040805160808181019092529497969581810195945092506004915083908390808284375050604080516020601f88358a0180359182018390048302840183019094528083529699989781019691955091820193509150819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375094975061148c9650505050505050565b60408051918252519081900360200190f35b34801561042157600080fd5b5061042a6117ac565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561046457818101518382015260200161044c565b50505050905090810190601f1680156104915780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104ab57600080fd5b506104b46117e3565b60408051600160a060020a039092168252519081900360200190f35b3480156104dc57600080fd5b506104b46117f2565b3480156104f157600080fd5b50610403611801565b34801561050657600080fd5b5060408051602060046024803582810135601f810185900485028601850190965285855261059f958335600160a060020a031695369560449491939091019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a9998810197919650918201945092508291508401838280828437509497506118079650505050505050565b604080519115158252519081900360200190f35b3480156105bf57600080fd5b506040805161020081810190925261059f913691600491610204919083906010908390839080828437505060408051610180818101909252949796958181019594509250600c9150839083908082843750506040805160808181019092529497969581810195945092506004915083908390808284375050604080516020601f88358a0180359182018390048302840183019094528083529699989781019691955091820193509150819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a9998810197919650918201945092508291508401838280828437509497506118769650505050505050565b3480156107c557600080fd5b50604080516101208181019092526104039136916004916101249190839060099083908390808284375050604080516101208181019092529497969581810195945092506009915083908390808284375050604080516020601f838901358a018035918201839004830284018301909452808352969960ff893581169a838b01359091169991989097506060909101955091935091820191819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a9998810197919650918201945092508291508401838280828437509497505093359450611b869350505050565b3480156108c457600080fd5b506108cd611cbc565b005b3480156108db57600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261042a94369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a999881019791965091820194509250829150840183828082843750949750611db29650505050505050565b3480156109b057600080fd5b50610403611dc7565b3480156109c557600080fd5b50604080516020600460e43581810135838102808601850190965280855261042a9583359560248035600160a060020a0390811697604435821697606435909216966084359660a4359660c435963696610104959194019291829185019084908082843750949750611deb9650505050505050565b348015610a4657600080fd5b506108cd60043560243560443561211d565b348015610a6457600080fd5b506040805161012081810190925261059f9136916004916101249190839060099083908390808284375050604080516101208181019092529497969581810195945092506009915083908390808284375050604080516020601f838901358a018035918201839004830284018301909452808352969960ff893581169a838b01359091169991989097506060909101955091935091820191819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375094975050933594506121ad9350505050565b348015610b6357600080fd5b506104b4612313565b348015610b7857600080fd5b50610403612322565b348015610b8d57600080fd5b506108cd600160a060020a0360043516612328565b348015610bae57600080fd5b5061042a612373565b348015610bc357600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261059f94369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a9998810197919650918201945092508291508401838280828437509497506123aa9650505050505050565b348015610cd657600080fd5b506108cd6123e8565b348015610ceb57600080fd5b5061040360ff6004358116906024351660443560643560843560a43561243a565b348015610d1857600080fd5b506104b4612455565b348015610d2d57600080fd5b506108cd612464565b604080516102008181019092526108cd913691600491610204919083906010908390839080828437505060408051610180818101909252949796958181019594509250600c9150839083908082843750506040805160808181019092529497969581810195945092506004915083908390808284375050604080516020601f88358a0180359182018390048302840183019094528083529699989781019691955091820193509150819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375094975050933594506124da9350505050565b348015610f3d57600080fd5b50610403600160a060020a03600435166127a4565b348015610f5e57600080fd5b5061059f6004356127b6565b348015610f7657600080fd5b50604080516101208181019092526104039136916004916101249190839060099083908390808284375050604080516101208181019092529497969581810195945092506009915083908390808284375050604080516020601f838901358a018035918201839004830284018301909452808352969960ff893581169a838b01359091169991989097506060909101955091935091820191819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375094975050933594506127cb9350505050565b34801561107557600080fd5b506104b46128f9565b34801561108a57600080fd5b50604080516101208181019092526108cd9136916004916101249190839060099083908390808284375050604080516101208181019092529497969581810195945092506009915083908390808284375050604080516020601f838901358a018035918201839004830284018301909452808352969960ff893581169a838b01359091169991989097506060909101955091935091820191819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a999881019791965091820194509250829150840183828082843750949750509335945061290d9350505050565b34801561118957600080fd5b50610403612a51565b34801561119e57600080fd5b50604080516101208181019092526108cd9136916004916101249190839060099083908390808284375050604080516101208181019092529497969581810195945092506009915083908390808284375050604080516020601f838901358a018035918201839004830284018301909452808352969960ff893581169a838b01359091169991989097506060909101955091935091820191819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a999881019791965091820194509250829150840183828082843750506040805180820182529598979681810196955093506002925084915083908082843750939650612a5795505050505050565b3480156112be57600080fd5b506108cd600435612c9d565b3480156112d657600080fd5b50610403612d13565b3480156112eb57600080fd5b506104b4612d19565b34801561130057600080fd5b50610403612d28565b34801561131557600080fd5b5061059f600435612d2e565b34801561132d57600080fd5b506040805161012081810190925261059f9136916004916101249190839060099083908390808284375050604080516101208181019092529497969581810195945092506009915083908390808284375050604080516020601f838901358a018035918201839004830284018301909452808352969960ff893581169a838b01359091169991989097506060909101955091935091820191819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a9998810197919650918201945092508291508401838280828437509497505093359450612d459350505050565b34801561142c57600080fd5b50610403612e65565b34801561144157600080fd5b506104b4612e6b565b34801561145657600080fd5b506108cd600160a060020a0360043516612e7a565b34801561147757600080fd5b506108cd600160a060020a0360043516612f5f565b6000611496614d9c565b61149e614d9c565b604080516102608101909152808d600060209081029190910151600160a060020a03168252018d600160209081029190910151600160a060020a03168252018d600260209081029190910151600160a060020a03168252018d600360209081029190910151600160a060020a03168252018d600460209081029190910151600160a060020a03168252018b6000602002015160ff16600181111561153e57fe5b600181111561154957fe5b81526020018b6001602002015160ff16600181111561156457fe5b600181111561156f57fe5b815260a0808f0151600160a060020a031660208301528d8101516040830152606082018c9052608082018a9052018d60066020020151600160a060020a031681526020018681526020018d60076010811015156115c857fe5b60209081029190910151600160a060020a03168252018c6000602090810291909101518252018c6001602090810291909101518252018c6002602090810291909101518252018c6003602090810291909101518252018c600460200201519052604080516102608101909152909250808d600860209081029190910151600160a060020a03168252018d600960209081029190910151600160a060020a03168252018d600a60209081029190910151600160a060020a03168252018d600b60209081029190910151600160a060020a03168252018d600c60209081029190910151600160a060020a03168252018b6002602002015160ff1660018111156116cb57fe5b60018111156116d657fe5b81526020018b6003602002015160ff1660018111156116f157fe5b60018111156116fc57fe5b81526101a08e0151600160a060020a0390811660208301526101608e01516040830152606082018b9052608082018990526101c08f01511660a082015260c0810186905260e0018d600f60209081029190910151600160a060020a0316825260c08e01519082015260e08d015160408201526101008d015160608201526101208d015160808201526101408d015160a090910152905061179c8282613003565b9c9b505050505050505050505050565b60408051808201909152601e81527f4e69667479436f6e6e6563742045786368616e676520436f6e74726163740000602082015281565b600154600160a060020a031681565b600354600160a060020a031681565b60075481565b60006060600083518551016040519080825280601f01601f19166020018201604052801561183f578160200160208202803883390190505b5091505060208101611851818561308f565b905061185d818661308f565b506000604051835160208501895afa9695505050505050565b6000611880614d9c565b611888614d9c565b604080516102608101909152808d600060209081029190910151600160a060020a03168252018d600160209081029190910151600160a060020a03168252018d600260209081029190910151600160a060020a03168252018d600360209081029190910151600160a060020a03168252018d600460209081029190910151600160a060020a03168252018b6000602002015160ff16600181111561192857fe5b600181111561193357fe5b81526020018b6001602002015160ff16600181111561194e57fe5b600181111561195957fe5b815260a0808f0151600160a060020a031660208301528d8101516040830152606082018c9052608082018a9052018d60066020020151600160a060020a031681526020018681526020018d60076010811015156119b257fe5b60209081029190910151600160a060020a03168252018c6000602090810291909101518252018c6001602090810291909101518252018c6002602090810291909101518252018c6003602090810291909101518252018c600460200201519052604080516102608101909152909250808d600860209081029190910151600160a060020a03168252018d600960209081029190910151600160a060020a03168252018d600a60209081029190910151600160a060020a03168252018d600b60209081029190910151600160a060020a03168252018d600c60209081029190910151600160a060020a03168252018b6002602002015160ff166001811115611ab557fe5b6001811115611ac057fe5b81526020018b6003602002015160ff166001811115611adb57fe5b6001811115611ae657fe5b81526101a08e0151600160a060020a0390811660208301526101608e01516040830152606082018b9052608082018990526101c08f01511660a082015260c0810186905260e0018d600f60209081029190910151600160a060020a0316825260c08e01519082015260e08d015160408201526101008d015160608201526101208d015160808201526101408d015160a090910152905061179c82826130d3565b60006060611ba88960075b60200201516101008b015160808c01518b8761325a565b60408051610260810182528b51600160a060020a0390811682526020808e01518216908301528c8301518116928201929092526060808d01519092169181019190915260006080820152909150611caf9060a08101896001811115611c0957fe5b8152602001886001811115611c1a57fe5b815260808c810151600160a060020a03908116602084015260c08d8101516040850152606084018790529183018a905260a0808f015190911690830152810187905260e0018b600660209081029190910151600160a060020a031682528b51828201528b01516040808301919091528b01516060808301919091528b01516080808301919091528b015160a0909101526133f4565b9998505050505050505050565b600254600090600160a060020a03163314611d47576040805160e560020a62461bcd02815260206004820152603660248201527f616363657074476f7665726e616e63653a2043616c6c206d75737420636f6d6560448201527f2066726f6d2070656e64696e67476f7665726e6f722e00000000000000000000606482015290519081900360840190fd5b506001805473ffffffffffffffffffffffffffffffffffffffff19808216331792839055600280549091169055604051600160a060020a03918216929091169082907f5f56bee8cffbe9a78652a74a60705edede02af10b0bbb888ca44b79a0d42ce8090600090a350565b6060611dbf848484613426565b509192915050565b7f048b125515112cdaed03d1edbee453f1de399178750917e49ce82b75444d7a2181565b60606000896002811115611dfb57fe5b90506000816002811115611e0b57fe5b1415611eee57604051600160a060020a03808b1660248301908152818b16604484015290891660648301526084820188905260a4820186905260c060c48301908152855160e484015285518c938c938c938c938b938b939291610104909101906020808601910280838360005b83811015611e90578181015183820152602001611e78565b50506040805193909501838103601f19018452909452506020810180517ffb16a59500000000000000000000000000000000000000000000000000000000600160e060020a039091161790529b506121109950505050505050505050565b6001816002811115611efc57fe5b1415611fdf57604051600160a060020a03808b1660248301908152818b16604484015290891660648301526084820188905260a4820186905260c060c48301908152855160e484015285518c938c938c938c938b938b939291610104909101906020808601910280838360005b83811015611f81578181015183820152602001611f69565b50506040805193909501838103601f19018452909452506020810180517fc5a0236e00000000000000000000000000000000000000000000000000000000600160e060020a039091161790529b506121109950505050505050505050565b6002816002811115611fed57fe5b14156120fe57888888888888886040516024018088600160a060020a0316600160a060020a0316815260200187600160a060020a0316600160a060020a0316815260200186600160a060020a0316600160a060020a03168152602001858152602001848152602001836000191660001916815260200180602001828103825283818151815260200191508051906020019060200280838360005b8381101561209f578181015183820152602001612087565b50506040805193909501838103601f19018452909452506020810180517f96809f9000000000000000000000000000000000000000000000000000000000600160e060020a039091161790529c506121109a5050505050505050505050565b60408051600081526020810190915291505b5098975050505050505050565b600154600160a060020a0316331461213457600080fd5b61271061214a61214485856135ad565b836135ad565b1461219f576040805160e560020a62461bcd02815260206004820152601560248201527f696e76616c6964206e6577206665652073686172650000000000000000000000604482015290519081900360640190fd5b600892909255600955600a55565b600060606121b9614d9c565b6121d78a60075b60200201516101008c015160808d01518c8861325a565b60408051610260810182528c51600160a060020a0390811682526020808f01518216908301528d8301518116928201929092526060808e0151909216918101919091526000608082015290925060a0810189600181111561223457fe5b815260200188600181111561224557fe5b815260808c810151600160a060020a03908116602084015260c08d8101516040850152606084018790529183018a905260a0808f015190911690830152810187905260e0018b600660209081029190910151600160a060020a0390811683528c51838301528c820151604080850191909152808e01516060808601919091528e01516080808601919091528e015160a0909401939093528382015116600090815260069091522054909150612305906122ff9083906135ca565b826136a8565b9a9950505050505050505050565b600d54600160a060020a031681565b60085481565b6000546101009004600160a060020a0316331461234457600080fd5b600b805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60408051808201909152600381527f312e300000000000000000000000000000000000000000000000000000000000602082015281565b600080845111156123c0576123c0858486613426565b6000825111156123d5576123d5838684613426565b6123df858461372f565b95945050505050565b33600081815260066020908152604091829020805460010190819055825181815292519093927fa82a649bbd060c9099cd7b7326e2b0dc9e9af0836480e0f849dc9eaa79710b3b92908290030190a250565b600061244a8787878787876137f1565b979650505050505050565b600b54600160a060020a031681565b6000546101009004600160a060020a0316331461248057600080fd5b60008054604051610100909104600160a060020a0316917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a26000805474ffffffffffffffffffffffffffffffffffffffff0019169055565b60408051610260810182528b51600160a060020a0390811682526020808e01518216908301528c8301518116928201929092526060808d01518316908201526080808d0151909216918101919091528851612798919060a082019060ff16600181111561254357fe5b600181111561254e57fe5b81526020018a6001602002015160ff16600181111561256957fe5b600181111561257457fe5b815260a0808e0151600160a060020a031660208301528c8101516040830152606082018b905260808201899052018c60066020020151600160a060020a031681526020018581526020018c60076010811015156125cd57fe5b60209081029190910151600160a060020a03168252018b6000602090810291909101518252018b6001602090810291909101518252018b6002602090810291909101518252018b6003602090810291909101518252018b600460200201519052604080516102608101909152808d600860209081029190910151600160a060020a03168252018d600960209081029190910151600160a060020a03168252018d600a60209081029190910151600160a060020a03168252018d600b60209081029190910151600160a060020a03168252018d600c60209081029190910151600160a060020a03168252018b6002602002015160ff1660018111156126cd57fe5b60018111156126d857fe5b81526020018b6003602002015160ff1660018111156126f357fe5b60018111156126fe57fe5b81526101a08e0151600160a060020a0390811660208301526101608e01516040830152606082018b9052608082018990526101c08f01511660a082015260c0810186905260e0018d600f60209081029190910151600160a060020a0316825260c08e01519082015260e08d015160408201526101008d015160608201526101208d015160808201526101408d015160a09091015283613884565b50505050505050505050565b60066020526000908152604090205481565b60046020526000908152604090205460ff1681565b600060606127da896007611b91565b60408051610260810182528b51600160a060020a0390811682526020808e01518216908301528c8301518116928201929092526060808d01519092169181019190915260006080820152909150611caf9060a0810189600181111561283b57fe5b815260200188600181111561284c57fe5b815260808c810151600160a060020a03908116602084015260c08d8101516040850152606084018790529183018a905260a0808f015190911690830152810187905260e0018b600660209081029190910151600160a060020a0390811683528c51838301528c820151604080850191909152808e01516060808601919091528e01516080808601919091528e015160a0909401939093528d820151166000908152600690915220546135ca565b6000546101009004600160a060020a031681565b6060612917614d9c565b612922896007611b91565b60408051610260810182528b51600160a060020a0390811682526020808e01518216908301528c8301518116928201929092526060808d0151909216918101919091526000608082015290925060a0810188600181111561297f57fe5b815260200187600181111561299057fe5b815260808b810151600160a060020a03908116602084015260c08c81015160408501526060840187905291830189905260a0808e015190911690830152810186905260e0018a600660209081029190910151600160a060020a0390811683528b51838301528b820151604080850191909152808d01516060808601919091528d01516080808601919091528d015160a0909401939093528382015116600090815260069091522054909150612a46908290613d93565b505050505050505050565b600a5481565b6060612a61614d9c565b60e08901516101008a015160808b01518551612a81939291908c9061325a565b60608a0151909250600160a060020a03161515612b0e576040805160e560020a62461bcd02815260206004820152602960248201527f6d616b657252656c61796572466565526563697069656e74206d757374206e6f60448201527f74206265207a65726f0000000000000000000000000000000000000000000000606482015290519081900360840190fd5b8451825114612b8d576040805160e560020a62461bcd02815260206004820152602360248201527f7265706c6163656d656e74207061747465726e206c656e677468206d69736d6160448201527f7463680000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60408051610260810182528a51600160a060020a0390811682526020808d01518216908301528b8301518116928201929092526060808c0151909216918101919091526000608082015260a08101886001811115612be757fe5b8152602001876001811115612bf857fe5b815260808b810151600160a060020a03908116602084015260c08c81015160408501526060840187905291830189905260a0808e015190911690830152810186905260e0018a600660209081029190910151600160a060020a031682528a51828201528a8101516040808401919091528b01516060808401919091528b01516080808401919091528b015160a090920191909152840151909150612a46908290613e00565b600154600160a060020a03163314612cb457600080fd5b6101f4811115612d0e576040805160e560020a62461bcd02815260206004820152601960248201527f696e76616c69642065786368616e676520666565207261746500000000000000604482015290519081900360640190fd5b600755565b61271081565b600254600160a060020a031681565b6101f481565b60008181526005602052604090205415155b919050565b60006060612d51614d9c565b612d5c8a60076121c0565b60408051610260810182528c51600160a060020a0390811682526020808f01518216908301528d8301518116928201929092526060808e0151909216918101919091526000608082015290925060a08101896001811115612db957fe5b8152602001886001811115612dca57fe5b815260808c810151600160a060020a03908116602084015260c08d8101516040850152606084018790529183018a905260a0808f015190911690830152810187905260e0018b600660209081029190910151600160a060020a031682528b51828201528b01516040808301919091528b01516060808301919091528b01516080808301919091528b015160a0909101529050612305816141e0565b60095481565b600c54600160a060020a031681565b600154600160a060020a03163314612f02576040805160e560020a62461bcd02815260206004820152603160248201527f73657450656e64696e67476f7665726e6f723a2043616c6c206d75737420636f60448201527f6d652066726f6d20676f7665726e6f722e000000000000000000000000000000606482015290519081900360840190fd5b6002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383811691909117918290556040519116907fe6df4d3d01a6133dfdecd1b451c04ec286cb4b10e7235d2b27321b476216e6d790600090a250565b6000546101009004600160a060020a03163314612f7b57600080fd5b600160a060020a0381161515612f9057600080fd5b60008054604051600160a060020a038085169361010090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360008054600160a060020a039092166101000274ffffffffffffffffffffffffffffffffffffffff0019909216919091179055565b60008060006130328460a001518560c00151866101c00151876101e001518861020001518961022001516137f1565b915061305e8560a001518660c00151876101c00151886101e001518961020001518a61022001516137f1565b90508181101561306d57600080fd5b6060840151600160a060020a0316151561308757806123df565b509392505050565b600080825111156130cc57815180602001830160208401855b600183831014156130c35781518152602091820191016130a8565b50505092909201915b5090919050565b6000808360a0015160018111156130e657fe5b148015613102575060018260a00151600181111561310057fe5b145b80156131295750816101a00151600160a060020a0316836101a00151600160a060020a0316145b801561316357506040820151600160a060020a0316158061316357508260200151600160a060020a03168260400151600160a060020a0316145b801561319d57506040830151600160a060020a0316158061319d57508160200151600160a060020a03168360400151600160a060020a0316145b80156131f857506060820151600160a060020a03161580156131cb57506060830151600160a060020a031615155b806131f857506060820151600160a060020a0316158015906131f857506060830151600160a060020a0316155b801561321d57508160e00151600160a060020a03168360e00151600160a060020a0316145b80156132385750613238836102000151846102200151614241565b80156132535750613253826102000151836102200151614241565b9392505050565b6060806000808080876008602002015115156132f35786156132c6576040805160e560020a62461bcd02815260206004820152601260248201527f696e76616c6964206d65726b6c65526f6f740000000000000000000000000000604482015290519081900360640190fd5b6132ec8860055b60200201518c8c8c8c600660200201518d600760200201518d8c611deb565b95506133e6565b61010088015160021180159061330857508615155b151561335e576040805160e560020a62461bcd02815260206004820152601360248201527f696e76616c6964206d65726b6c65206461746100000000000000000000000000604482015290519081900360640190fd5b6101008801519250600091505b821561339c576002830490508261338382600261425d565b101561338e57600191505b60019093019291508161336b565b8115156133ab57600019909301925b836040519080825280602002602001820160405280156133d5578160200160208202803883390190505b5094506133e38860056132cd565b95505b505050505095945050505050565b60006134208260a001518360c00151846101c00151856101e001518661020001518761022001516137f1565b92915050565b60008060008451865114151561343b57600080fd5b835186511461344957600080fd5b855160209004925060208084029250839083041461346357fe5b5060005b828110156134935760010160208102848101518682015191880180519282169119909216179052613467565b60008311156134c357829050806001016020028085015181870151811682890151821916178289015250506135a5565b50805b85518110156135a55784818151811015156134dd57fe5b90602001015160f860020a900460f860020a0284828151811015156134fe57fe5b90602001015160f860020a900460f860020a0216868281518110151561352057fe5b90602001015160f860020a900460f860020a02858381518110151561354157fe5b90602001015160f860020a900460f860020a0260ff60f860020a02181617868281518110151561356d57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001016134c6565b505050505050565b6000828201838110156135bf57600080fd5b8091505b5092915050565b60007f048b125515112cdaed03d1edbee453f1de399178750917e49ce82b75444d7a216135f7848461428b565b604080517f19010000000000000000000000000000000000000000000000000000000000006020808301919091526022820194909452604280820193909352815180820390930183526062019081905281519192909182918401908083835b602083106136755780518252601f199092019160209182019101613656565b5181516020939093036101000a600019018019909116921691909117905260405192018290039091209695505050505050565b6000806136b4836141e0565b15156136c357600091506135c3565b60008481526004602052604090205460ff16156136e357600091506135c3565b5060008381526005602052604090205480151561370357600091506135c3565b602080840151600160a060020a0316600090815260069091526040902054600101811491505092915050565b6000816040518082805190602001908083835b602083106137615780518252601f199092019160209182019101613742565b51815160209384036101000a6000190180199092169116179052604051919093018190038120885190955088945090928392508401908083835b602083106137ba5780518252601f19909201916020918201910161379b565b5181516020939093036101000a60001901801990911692169190911790526040519201829003909120939093149695505050505050565b6000808087600181111561380157fe5b141561380f57859150613879565b600187600181111561381d57fe5b1415613879576138486138398661383442886144fa565b61425d565b61384385876144fa565b614511565b9050600188600181111561385857fe5b141561386f5761386886826144fa565b9150613879565b61386886826135ad565b509695505050505050565b600080548190819060ff161561389957600080fd5b6000805460ff191660011790556020860151600160a060020a031633141561391f576138c4866141e0565b151561391a576040805160e560020a62461bcd02815260206004820152601260248201527f696e76616c69642062757920706172616d730000000000000000000000000000604482015290519081900360640190fd5b61392b565b61392886614534565b92505b6020850151600160a060020a03163314156139a457613949856141e0565b151561399f576040805160e560020a62461bcd02815260206004820152601360248201527f696e76616c69642073656c6c20706172616d7300000000000000000000000000604482015290519081900360640190fd5b6139b0565b6139ad85614534565b91505b6139ba86866130d3565b1515613a10576040805160e560020a62461bcd02815260206004820152601160248201527f6f726465722063616e2774206d61746368000000000000000000000000000000604482015290519081900360640190fd5b6000866101400151511115613a3957613a39866101200151866101200151886101400151613426565b6000856101400151511115613a6257613a62856101200151876101200151876101400151613426565b613a7686610120015186610120015161372f565b1515613acc576040805160e560020a62461bcd02815260206004820152601660248201527f63616c6c6461746120646f65736e277420657175616c00000000000000000000604482015290519081900360640190fd5b6020860151600160a060020a03163314613afa576000838152600460205260409020805460ff191660011790555b6020850151600160a060020a03163314613b28576000828152600460205260409020805460ff191660011790555b613b32868661455d565b600c546101208701516040518151939450600160a060020a03909216929091908190602084019080838360005b83811015613b77578181015183820152602001613b5f565b50505050905090810190601f168015613ba45780820380516001836020036101000a031916815260200191505b50915050600060405180830381855af49150501515613c0d576040805160e560020a62461bcd02815260206004820152601660248201527f6f726465722063616c6c64617461206661696c75726500000000000000000000604482015290519081900360640190fd5b610160860151600160a060020a031615613c4657613c3b866101600151866101200151886101800151611807565b1515613c4657600080fd5b610160850151600160a060020a031615613c7f57613c74856101600151866101200151876101800151611807565b1515613c7f57600080fd5b60608501518490600160a060020a03161515613c9f578560200151613ca5565b86602001515b6060870151600160a060020a0391821691161515613cc7578760200151613ccd565b86602001515b600160a060020a03167f5e89bc5bf129d9595ae14697a763c17e6acd67579b9f1f4fa548f57ec762a05786866000600160a060020a03168b60600151600160a060020a03161415613d22578b60600151613d28565b8a606001515b60608c0151600160a060020a03161515613d46578b60800151613d4c565b8c608001515b604080519485526020850193909352600160a060020a039182168484015216606083015260808201879052519081900360a00190a450506000805460ff1916905550505050565b6000613d9f8383614b76565b6020840151909150600160a060020a03163314613dbb57600080fd5b600081815260046020526040808220805460ff191660011790555182917f5152abf959f6564662358c2e52b702259b78bac5ee7842a0f01937e670efcc7d91a2505050565b6020820151600090600160a060020a03163314613e1c57600080fd5b602080840151600160a060020a0316600090815260069091526040902054613e459084906135ca565b60008181526005602052604090205490915015613eac576040805160e560020a62461bcd02815260206004820152601560248201527f6475706c696361746564206f7264657220686173680000000000000000000000604482015290519081900360640190fd5b600660008460200151600160a060020a0316600160a060020a0316815260200190815260200160002054600101600560008360001916600019168152602001908152602001600020819055508260600151600160a060020a03168360200151600160a060020a031682600019167fbfc991b64000533072b5f27ccd5e8628fea28ae33286778a627005b3156c6fe1866000015187604001518860a001518960c001518a60e001518b61010001518b6040518088600160a060020a0316600160a060020a0316815260200187600160a060020a0316600160a060020a03168152602001866001811115613f9a57fe5b60ff168152602001856001811115613fae57fe5b60ff168152600160a060020a0390941660208501525060408084019290925260608301525190819003608001945092505050a480600019167fb7c210e6374e28618aff2db2406f01343e302b15476278b7795869bccc51f979846101200151856101400151866101600151876101800151886101a00151896101c001518a6101e001518b61020001518c61022001518d61024001516040518080602001806020018b600160a060020a0316600160a060020a03168152602001806020018a600160a060020a0316600160a060020a0316815260200189815260200188815260200187815260200186815260200185815260200184810384528e818151815260200191508051906020019080838360005b838110156140d65781810151838201526020016140be565b50505050905090810190601f1680156141035780820380516001836020036101000a031916815260200191505b5084810383528d5181528d516020918201918f019080838360005b8381101561413657818101518382015260200161411e565b50505050905090810190601f1680156141635780820380516001836020036101000a031916815260200191505b5084810382528b5181528b516020918201918d019080838360005b8381101561419657818101518382015260200161417e565b50505050905090810190601f1680156141c35780820380516001836020036101000a031916815260200191505b509d505050505050505050505050505060405180910390a2505050565b8051600090600160a060020a031630146141fc57506000612d40565b6020820151600160a060020a0316151561421857506000612d40565b61422b8260c00151836102200151614be5565b151561423957506000612d40565b506001919050565b6000428310801561325357508115806132535750504210919050565b60008083151561427057600091506135c3565b5082820282848281151561428057fe5b04146135bf57600080fd5b604080516102a08082526102c0820190925260009190606090839083602082016154008038833901905050915050602081016142e7817ff446866267029076a71bb126e250b9480cd4ac2699baa745a582b10b361ec951614c04565b90506142f7818760000151614c04565b9050614307818760200151614c04565b9050614317818760400151614c04565b9050614327818760600151614c04565b9050614337818760800151614c04565b9050614352818760a00151600181111561434d57fe5b614c04565b9050614368818760c00151600181111561434d57fe5b9050614378818760e00151614c04565b905061438981876101000151614c04565b90506143f6818761012001516040518082805190602001908083835b602083106143c45780518252601f1990920191602091820191016143a5565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020614c04565b905061443081876101400151604051808280519060200190808383602083106143c45780518252601f1990920191602091820191016143a5565b905061444181876101600151614c04565b905061447b81876101800151604051808280519060200190808383602083106143c45780518252601f1990920191602091820191016143a5565b905061448c81876101a00151614c04565b905061449d81876101c00151614c04565b90506144ae81876101e00151614c04565b90506144bf81876102000151614c04565b90506144d081876102200151614c04565b90506144e181876102400151614c04565b90506144ed8186614c04565b5050602001209392505050565b6000808383111561450a57600080fd5b5050900390565b60008080831161452057600080fd5b828481151561452b57fe5b04949350505050565b602080820151600160a060020a0316600090815260069091526040812054613420908390614b76565b600080600080600080600080600080600080600160a060020a03168c6101a00151600160a060020a031614151561459957341561459957600080fd5b6145a38d8d613003565b995060008a1180156145c257506101a08c0151600160a060020a031615155b156145e0576145e08c6101a001518e602001518e602001518d614c0c565b8998508997506145fd6145f56007548c61425d565b612710614511565b9650600095506146108c60e00151614cd1565b156146c4578b60e00151600160a060020a0316632a55205a8e61010001518c6040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180838152602001828152602001925050506040805180830381600087803b15801561468757600080fd5b505af115801561469b573d6000803e3d6000fd5b505050506040513d60408110156146b157600080fd5b508051602090910151909650945061476d565b600d5460e08d0151604080517f2782d6c7000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152602481018e905281519290931692632782d6c792604480830193928290030181600087803b15801561473457600080fd5b505af1158015614748573d6000803e3d6000fd5b505050506040513d604081101561475e57600080fd5b50805160209091015190965094505b600160a060020a0386161580159061478457508415155b156147fc576101a08c0151600160a060020a031615156147e7576147a889866144fa565b604051909950600160a060020a0387169086156108fc029087906000818181858888f193505050501580156147e1573d6000803e3d6000fd5b506147fc565b6147fc8c6101a001518d602001518888614c0c565b60608c0151600160a060020a03161580159061481757508615155b156149e35761482b6145f56009548961425d565b6101a08d0151909450600160a060020a031615156148905761484d89856144fa565b60608d0151604051919a50600160a060020a03169085156108fc029086906000818181858888f1935050505015801561488a573d6000803e3d6000fd5b506148a9565b6148a98c6101a001518d602001518e6060015187614c0c565b60808d0151600160a060020a031615614949576148cb6145f56008548961425d565b6101a08d0151909350600160a060020a03161515614930576148ed89846144fa565b60808e0151604051919a50600160a060020a03169084156108fc029085906000818181858888f1935050505015801561492a573d6000803e3d6000fd5b50614949565b6149498c6101a001518d602001518f6080015186614c0c565b6149586145f5600a548961425d565b6101a08d0151909250600160a060020a031615156149bb5761497a89836144fa565b600b54604051919a50600160a060020a03169083156108fc029084906000818181858888f193505050501580156149b5573d6000803e3d6000fd5b506149de565b6101a08c015160208d0151600b546149de929190600160a060020a031685614c0c565b614ab1565b60608c0151600160a060020a03161515614ab1576101a08c0151600160a060020a03161515614a1157600080fd5b8615614ab157614a266145f56009548961425d565b9350614a418c6101a001518d602001518f6060015187614c0c565b60808c0151600160a060020a031615614a7e57614a636145f56008548961425d565b9250614a7e8c6101a001518d602001518e6080015186614c0c565b614a8d6145f5600a548961425d565b6101a08d015160208e0151600b54929450614ab192600160a060020a031685614c0c565b6101a08c0151600160a060020a03161515614b655734881115614ad357600080fd5b8b60200151600160a060020a03166108fc8a9081150290604051600060405180830381858888f19350505050158015614b10573d6000803e3d6000fd5b50614b1b34896144fa565b90506000811115614b65578c60200151600160a060020a03166108fc829081150290604051600060405180830381858888f19350505050158015614b63573d6000803e3d6000fd5b505b50979b9a5050505050505050505050565b600080614b8384846135ca565b9050614b8f81856136a8565b15156135bf576040805160e560020a62461bcd02815260206004820152600d60248201527f696e76616c6964206f7264657200000000000000000000000000000000000000604482015290519081900360640190fd5b600080836001811115614bf457fe5b1480613253575050600010919050565b815260200190565b6000811115614ccb57600354604080517f15dacbea000000000000000000000000000000000000000000000000000000008152600160a060020a0387811660048301528681166024830152858116604483015260648201859052915191909216916315dacbea9160848083019260209291908290030181600087803b158015614c9457600080fd5b505af1158015614ca8573d6000803e3d6000fd5b505050506040513d6020811015614cbe57600080fd5b50511515614ccb57600080fd5b50505050565b604080517f2a55205a00000000000000000000000000000000000000000000000000000000602480830191909152825180830390910181526044909101825260208181018051600160e060020a03167f01ffc9a7000000000000000000000000000000000000000000000000000000001790528251818152808401909352600092839291606091849181602001602082028038833901905050915060208284516020860160008a5af19350831515614d8c5760009450614d93565b5080519350835b50505050919050565b604080516102608101825260008082526020820181905291810182905260608101829052608081018290529060a08201908152602001600081526020016000600160a060020a031681526020016000815260200160608152602001606081526020016000600160a060020a03168152602001606081526020016000600160a060020a03168152602001600081526020016000815260200160008152602001600081526020016000815250905600a165627a7a7230582033844ff19818572d40975a7a52f206c4f20c5ea6cfa35bdc44884f44faf6bbd8002997b3fae253daa304aa40063e4f71c3efec8d260848d7379fc623e35f84c73f47e6bbd6277e1bf288eed5e8d1780f9a50b239e86b153736bceebccf4ea79d90b38b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f4f7264657228616464726573732065786368616e67652c61646472657373206d616b65722c616464726573732074616b65722c61646472657373206d616b657252656c61796572466565526563697069656e742c616464726573732074616b657252656c61796572466565526563697069656e742c75696e743820736964652c75696e74382073616c654b696e642c61646472657373206e6674416464726573732c75696e7420746f6b656e49642c62797465733332206d65726b6c65526f6f742c62797465732063616c6c646174612c6279746573207265706c6163656d656e745061747465726e2c61646472657373207374617469635461726765742c6279746573207374617469634578747261646174612c61646472657373207061796d656e74546f6b656e2c75696e74323536206261736550726963652c75696e743235362065787472612c75696e74323536206c697374696e6754696d652c75696e743235362065787069726174696f6e54696d652c75696e743235362073616c742c75696e74323536206e6f6e636529000000000000000000000000c09f6ebf24d9cc1b4140baa992afb7a5bf41a54700000000000000000000000044a6eaa71ad81f206829dbb59b63e6c733295f4f0000000000000000000000005d01d08834283885b97c4a9eef16631707c83f9b000000000000000000000000d766fab1a146c835ca3ae2b2bf27b179f52b0211
Deployed Bytecode
0x6080604052600436106101f85763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663028e01cf81146101fd57806306fdde03146104155780630c340a241461049f5780630eefdbad146104d05780630f9b4955146104e557806310796a47146104fa5780631f2c56d7146105b35780631f86dbc0146107b9578063238efcbc146108b8578063239e83df146108cf5780633644e515146109a457806337146f2e146109b95780633d1cf52614610a3a5780633df6be1314610a585780633eeb5bc814610b575780634a3b5e0514610b6c578063514f033014610b8157806354fd4d5014610ba2578063562b2ebc14610bb7578063627cdcb914610cca57806363d36c0b14610cdf57806364df049e14610d0c578063715018a614610d215780637da26f5514610d365780637ecebe0014610f315780638076f00514610f5257806381da91a014610f6a5780638da5cb5b14611069578063941461661461107e578063960b26a21461117d57806397cea71b14611192578063ade0ccb2146112b2578063cae6047f146112ca578063e3056a34146112df578063e4e098f7146112f4578063e57d4adb14611309578063e7b74b6414611321578063e8898e6d14611420578063f111357514611435578063f235757f1461144a578063f2fde38b1461146b575b600080fd5b34801561020957600080fd5b5060408051610200818101909252610403913691600491610204919083906010908390839080828437505060408051610180818101909252949796958181019594509250600c9150839083908082843750506040805160808181019092529497969581810195945092506004915083908390808284375050604080516020601f88358a0180359182018390048302840183019094528083529699989781019691955091820193509150819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375094975061148c9650505050505050565b60408051918252519081900360200190f35b34801561042157600080fd5b5061042a6117ac565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561046457818101518382015260200161044c565b50505050905090810190601f1680156104915780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104ab57600080fd5b506104b46117e3565b60408051600160a060020a039092168252519081900360200190f35b3480156104dc57600080fd5b506104b46117f2565b3480156104f157600080fd5b50610403611801565b34801561050657600080fd5b5060408051602060046024803582810135601f810185900485028601850190965285855261059f958335600160a060020a031695369560449491939091019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a9998810197919650918201945092508291508401838280828437509497506118079650505050505050565b604080519115158252519081900360200190f35b3480156105bf57600080fd5b506040805161020081810190925261059f913691600491610204919083906010908390839080828437505060408051610180818101909252949796958181019594509250600c9150839083908082843750506040805160808181019092529497969581810195945092506004915083908390808284375050604080516020601f88358a0180359182018390048302840183019094528083529699989781019691955091820193509150819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a9998810197919650918201945092508291508401838280828437509497506118769650505050505050565b3480156107c557600080fd5b50604080516101208181019092526104039136916004916101249190839060099083908390808284375050604080516101208181019092529497969581810195945092506009915083908390808284375050604080516020601f838901358a018035918201839004830284018301909452808352969960ff893581169a838b01359091169991989097506060909101955091935091820191819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a9998810197919650918201945092508291508401838280828437509497505093359450611b869350505050565b3480156108c457600080fd5b506108cd611cbc565b005b3480156108db57600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261042a94369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a999881019791965091820194509250829150840183828082843750949750611db29650505050505050565b3480156109b057600080fd5b50610403611dc7565b3480156109c557600080fd5b50604080516020600460e43581810135838102808601850190965280855261042a9583359560248035600160a060020a0390811697604435821697606435909216966084359660a4359660c435963696610104959194019291829185019084908082843750949750611deb9650505050505050565b348015610a4657600080fd5b506108cd60043560243560443561211d565b348015610a6457600080fd5b506040805161012081810190925261059f9136916004916101249190839060099083908390808284375050604080516101208181019092529497969581810195945092506009915083908390808284375050604080516020601f838901358a018035918201839004830284018301909452808352969960ff893581169a838b01359091169991989097506060909101955091935091820191819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375094975050933594506121ad9350505050565b348015610b6357600080fd5b506104b4612313565b348015610b7857600080fd5b50610403612322565b348015610b8d57600080fd5b506108cd600160a060020a0360043516612328565b348015610bae57600080fd5b5061042a612373565b348015610bc357600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261059f94369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a9998810197919650918201945092508291508401838280828437509497506123aa9650505050505050565b348015610cd657600080fd5b506108cd6123e8565b348015610ceb57600080fd5b5061040360ff6004358116906024351660443560643560843560a43561243a565b348015610d1857600080fd5b506104b4612455565b348015610d2d57600080fd5b506108cd612464565b604080516102008181019092526108cd913691600491610204919083906010908390839080828437505060408051610180818101909252949796958181019594509250600c9150839083908082843750506040805160808181019092529497969581810195945092506004915083908390808284375050604080516020601f88358a0180359182018390048302840183019094528083529699989781019691955091820193509150819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375094975050933594506124da9350505050565b348015610f3d57600080fd5b50610403600160a060020a03600435166127a4565b348015610f5e57600080fd5b5061059f6004356127b6565b348015610f7657600080fd5b50604080516101208181019092526104039136916004916101249190839060099083908390808284375050604080516101208181019092529497969581810195945092506009915083908390808284375050604080516020601f838901358a018035918201839004830284018301909452808352969960ff893581169a838b01359091169991989097506060909101955091935091820191819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375094975050933594506127cb9350505050565b34801561107557600080fd5b506104b46128f9565b34801561108a57600080fd5b50604080516101208181019092526108cd9136916004916101249190839060099083908390808284375050604080516101208181019092529497969581810195945092506009915083908390808284375050604080516020601f838901358a018035918201839004830284018301909452808352969960ff893581169a838b01359091169991989097506060909101955091935091820191819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a999881019791965091820194509250829150840183828082843750949750509335945061290d9350505050565b34801561118957600080fd5b50610403612a51565b34801561119e57600080fd5b50604080516101208181019092526108cd9136916004916101249190839060099083908390808284375050604080516101208181019092529497969581810195945092506009915083908390808284375050604080516020601f838901358a018035918201839004830284018301909452808352969960ff893581169a838b01359091169991989097506060909101955091935091820191819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a999881019791965091820194509250829150840183828082843750506040805180820182529598979681810196955093506002925084915083908082843750939650612a5795505050505050565b3480156112be57600080fd5b506108cd600435612c9d565b3480156112d657600080fd5b50610403612d13565b3480156112eb57600080fd5b506104b4612d19565b34801561130057600080fd5b50610403612d28565b34801561131557600080fd5b5061059f600435612d2e565b34801561132d57600080fd5b506040805161012081810190925261059f9136916004916101249190839060099083908390808284375050604080516101208181019092529497969581810195945092506009915083908390808284375050604080516020601f838901358a018035918201839004830284018301909452808352969960ff893581169a838b01359091169991989097506060909101955091935091820191819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a9998810197919650918201945092508291508401838280828437509497505093359450612d459350505050565b34801561142c57600080fd5b50610403612e65565b34801561144157600080fd5b506104b4612e6b565b34801561145657600080fd5b506108cd600160a060020a0360043516612e7a565b34801561147757600080fd5b506108cd600160a060020a0360043516612f5f565b6000611496614d9c565b61149e614d9c565b604080516102608101909152808d600060209081029190910151600160a060020a03168252018d600160209081029190910151600160a060020a03168252018d600260209081029190910151600160a060020a03168252018d600360209081029190910151600160a060020a03168252018d600460209081029190910151600160a060020a03168252018b6000602002015160ff16600181111561153e57fe5b600181111561154957fe5b81526020018b6001602002015160ff16600181111561156457fe5b600181111561156f57fe5b815260a0808f0151600160a060020a031660208301528d8101516040830152606082018c9052608082018a9052018d60066020020151600160a060020a031681526020018681526020018d60076010811015156115c857fe5b60209081029190910151600160a060020a03168252018c6000602090810291909101518252018c6001602090810291909101518252018c6002602090810291909101518252018c6003602090810291909101518252018c600460200201519052604080516102608101909152909250808d600860209081029190910151600160a060020a03168252018d600960209081029190910151600160a060020a03168252018d600a60209081029190910151600160a060020a03168252018d600b60209081029190910151600160a060020a03168252018d600c60209081029190910151600160a060020a03168252018b6002602002015160ff1660018111156116cb57fe5b60018111156116d657fe5b81526020018b6003602002015160ff1660018111156116f157fe5b60018111156116fc57fe5b81526101a08e0151600160a060020a0390811660208301526101608e01516040830152606082018b9052608082018990526101c08f01511660a082015260c0810186905260e0018d600f60209081029190910151600160a060020a0316825260c08e01519082015260e08d015160408201526101008d015160608201526101208d015160808201526101408d015160a090910152905061179c8282613003565b9c9b505050505050505050505050565b60408051808201909152601e81527f4e69667479436f6e6e6563742045786368616e676520436f6e74726163740000602082015281565b600154600160a060020a031681565b600354600160a060020a031681565b60075481565b60006060600083518551016040519080825280601f01601f19166020018201604052801561183f578160200160208202803883390190505b5091505060208101611851818561308f565b905061185d818661308f565b506000604051835160208501895afa9695505050505050565b6000611880614d9c565b611888614d9c565b604080516102608101909152808d600060209081029190910151600160a060020a03168252018d600160209081029190910151600160a060020a03168252018d600260209081029190910151600160a060020a03168252018d600360209081029190910151600160a060020a03168252018d600460209081029190910151600160a060020a03168252018b6000602002015160ff16600181111561192857fe5b600181111561193357fe5b81526020018b6001602002015160ff16600181111561194e57fe5b600181111561195957fe5b815260a0808f0151600160a060020a031660208301528d8101516040830152606082018c9052608082018a9052018d60066020020151600160a060020a031681526020018681526020018d60076010811015156119b257fe5b60209081029190910151600160a060020a03168252018c6000602090810291909101518252018c6001602090810291909101518252018c6002602090810291909101518252018c6003602090810291909101518252018c600460200201519052604080516102608101909152909250808d600860209081029190910151600160a060020a03168252018d600960209081029190910151600160a060020a03168252018d600a60209081029190910151600160a060020a03168252018d600b60209081029190910151600160a060020a03168252018d600c60209081029190910151600160a060020a03168252018b6002602002015160ff166001811115611ab557fe5b6001811115611ac057fe5b81526020018b6003602002015160ff166001811115611adb57fe5b6001811115611ae657fe5b81526101a08e0151600160a060020a0390811660208301526101608e01516040830152606082018b9052608082018990526101c08f01511660a082015260c0810186905260e0018d600f60209081029190910151600160a060020a0316825260c08e01519082015260e08d015160408201526101008d015160608201526101208d015160808201526101408d015160a090910152905061179c82826130d3565b60006060611ba88960075b60200201516101008b015160808c01518b8761325a565b60408051610260810182528b51600160a060020a0390811682526020808e01518216908301528c8301518116928201929092526060808d01519092169181019190915260006080820152909150611caf9060a08101896001811115611c0957fe5b8152602001886001811115611c1a57fe5b815260808c810151600160a060020a03908116602084015260c08d8101516040850152606084018790529183018a905260a0808f015190911690830152810187905260e0018b600660209081029190910151600160a060020a031682528b51828201528b01516040808301919091528b01516060808301919091528b01516080808301919091528b015160a0909101526133f4565b9998505050505050505050565b600254600090600160a060020a03163314611d47576040805160e560020a62461bcd02815260206004820152603660248201527f616363657074476f7665726e616e63653a2043616c6c206d75737420636f6d6560448201527f2066726f6d2070656e64696e67476f7665726e6f722e00000000000000000000606482015290519081900360840190fd5b506001805473ffffffffffffffffffffffffffffffffffffffff19808216331792839055600280549091169055604051600160a060020a03918216929091169082907f5f56bee8cffbe9a78652a74a60705edede02af10b0bbb888ca44b79a0d42ce8090600090a350565b6060611dbf848484613426565b509192915050565b7f048b125515112cdaed03d1edbee453f1de399178750917e49ce82b75444d7a2181565b60606000896002811115611dfb57fe5b90506000816002811115611e0b57fe5b1415611eee57604051600160a060020a03808b1660248301908152818b16604484015290891660648301526084820188905260a4820186905260c060c48301908152855160e484015285518c938c938c938c938b938b939291610104909101906020808601910280838360005b83811015611e90578181015183820152602001611e78565b50506040805193909501838103601f19018452909452506020810180517ffb16a59500000000000000000000000000000000000000000000000000000000600160e060020a039091161790529b506121109950505050505050505050565b6001816002811115611efc57fe5b1415611fdf57604051600160a060020a03808b1660248301908152818b16604484015290891660648301526084820188905260a4820186905260c060c48301908152855160e484015285518c938c938c938c938b938b939291610104909101906020808601910280838360005b83811015611f81578181015183820152602001611f69565b50506040805193909501838103601f19018452909452506020810180517fc5a0236e00000000000000000000000000000000000000000000000000000000600160e060020a039091161790529b506121109950505050505050505050565b6002816002811115611fed57fe5b14156120fe57888888888888886040516024018088600160a060020a0316600160a060020a0316815260200187600160a060020a0316600160a060020a0316815260200186600160a060020a0316600160a060020a03168152602001858152602001848152602001836000191660001916815260200180602001828103825283818151815260200191508051906020019060200280838360005b8381101561209f578181015183820152602001612087565b50506040805193909501838103601f19018452909452506020810180517f96809f9000000000000000000000000000000000000000000000000000000000600160e060020a039091161790529c506121109a5050505050505050505050565b60408051600081526020810190915291505b5098975050505050505050565b600154600160a060020a0316331461213457600080fd5b61271061214a61214485856135ad565b836135ad565b1461219f576040805160e560020a62461bcd02815260206004820152601560248201527f696e76616c6964206e6577206665652073686172650000000000000000000000604482015290519081900360640190fd5b600892909255600955600a55565b600060606121b9614d9c565b6121d78a60075b60200201516101008c015160808d01518c8861325a565b60408051610260810182528c51600160a060020a0390811682526020808f01518216908301528d8301518116928201929092526060808e0151909216918101919091526000608082015290925060a0810189600181111561223457fe5b815260200188600181111561224557fe5b815260808c810151600160a060020a03908116602084015260c08d8101516040850152606084018790529183018a905260a0808f015190911690830152810187905260e0018b600660209081029190910151600160a060020a0390811683528c51838301528c820151604080850191909152808e01516060808601919091528e01516080808601919091528e015160a0909401939093528382015116600090815260069091522054909150612305906122ff9083906135ca565b826136a8565b9a9950505050505050505050565b600d54600160a060020a031681565b60085481565b6000546101009004600160a060020a0316331461234457600080fd5b600b805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60408051808201909152600381527f312e300000000000000000000000000000000000000000000000000000000000602082015281565b600080845111156123c0576123c0858486613426565b6000825111156123d5576123d5838684613426565b6123df858461372f565b95945050505050565b33600081815260066020908152604091829020805460010190819055825181815292519093927fa82a649bbd060c9099cd7b7326e2b0dc9e9af0836480e0f849dc9eaa79710b3b92908290030190a250565b600061244a8787878787876137f1565b979650505050505050565b600b54600160a060020a031681565b6000546101009004600160a060020a0316331461248057600080fd5b60008054604051610100909104600160a060020a0316917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a26000805474ffffffffffffffffffffffffffffffffffffffff0019169055565b60408051610260810182528b51600160a060020a0390811682526020808e01518216908301528c8301518116928201929092526060808d01518316908201526080808d0151909216918101919091528851612798919060a082019060ff16600181111561254357fe5b600181111561254e57fe5b81526020018a6001602002015160ff16600181111561256957fe5b600181111561257457fe5b815260a0808e0151600160a060020a031660208301528c8101516040830152606082018b905260808201899052018c60066020020151600160a060020a031681526020018581526020018c60076010811015156125cd57fe5b60209081029190910151600160a060020a03168252018b6000602090810291909101518252018b6001602090810291909101518252018b6002602090810291909101518252018b6003602090810291909101518252018b600460200201519052604080516102608101909152808d600860209081029190910151600160a060020a03168252018d600960209081029190910151600160a060020a03168252018d600a60209081029190910151600160a060020a03168252018d600b60209081029190910151600160a060020a03168252018d600c60209081029190910151600160a060020a03168252018b6002602002015160ff1660018111156126cd57fe5b60018111156126d857fe5b81526020018b6003602002015160ff1660018111156126f357fe5b60018111156126fe57fe5b81526101a08e0151600160a060020a0390811660208301526101608e01516040830152606082018b9052608082018990526101c08f01511660a082015260c0810186905260e0018d600f60209081029190910151600160a060020a0316825260c08e01519082015260e08d015160408201526101008d015160608201526101208d015160808201526101408d015160a09091015283613884565b50505050505050505050565b60066020526000908152604090205481565b60046020526000908152604090205460ff1681565b600060606127da896007611b91565b60408051610260810182528b51600160a060020a0390811682526020808e01518216908301528c8301518116928201929092526060808d01519092169181019190915260006080820152909150611caf9060a0810189600181111561283b57fe5b815260200188600181111561284c57fe5b815260808c810151600160a060020a03908116602084015260c08d8101516040850152606084018790529183018a905260a0808f015190911690830152810187905260e0018b600660209081029190910151600160a060020a0390811683528c51838301528c820151604080850191909152808e01516060808601919091528e01516080808601919091528e015160a0909401939093528d820151166000908152600690915220546135ca565b6000546101009004600160a060020a031681565b6060612917614d9c565b612922896007611b91565b60408051610260810182528b51600160a060020a0390811682526020808e01518216908301528c8301518116928201929092526060808d0151909216918101919091526000608082015290925060a0810188600181111561297f57fe5b815260200187600181111561299057fe5b815260808b810151600160a060020a03908116602084015260c08c81015160408501526060840187905291830189905260a0808e015190911690830152810186905260e0018a600660209081029190910151600160a060020a0390811683528b51838301528b820151604080850191909152808d01516060808601919091528d01516080808601919091528d015160a0909401939093528382015116600090815260069091522054909150612a46908290613d93565b505050505050505050565b600a5481565b6060612a61614d9c565b60e08901516101008a015160808b01518551612a81939291908c9061325a565b60608a0151909250600160a060020a03161515612b0e576040805160e560020a62461bcd02815260206004820152602960248201527f6d616b657252656c61796572466565526563697069656e74206d757374206e6f60448201527f74206265207a65726f0000000000000000000000000000000000000000000000606482015290519081900360840190fd5b8451825114612b8d576040805160e560020a62461bcd02815260206004820152602360248201527f7265706c6163656d656e74207061747465726e206c656e677468206d69736d6160448201527f7463680000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60408051610260810182528a51600160a060020a0390811682526020808d01518216908301528b8301518116928201929092526060808c0151909216918101919091526000608082015260a08101886001811115612be757fe5b8152602001876001811115612bf857fe5b815260808b810151600160a060020a03908116602084015260c08c81015160408501526060840187905291830189905260a0808e015190911690830152810186905260e0018a600660209081029190910151600160a060020a031682528a51828201528a8101516040808401919091528b01516060808401919091528b01516080808401919091528b015160a090920191909152840151909150612a46908290613e00565b600154600160a060020a03163314612cb457600080fd5b6101f4811115612d0e576040805160e560020a62461bcd02815260206004820152601960248201527f696e76616c69642065786368616e676520666565207261746500000000000000604482015290519081900360640190fd5b600755565b61271081565b600254600160a060020a031681565b6101f481565b60008181526005602052604090205415155b919050565b60006060612d51614d9c565b612d5c8a60076121c0565b60408051610260810182528c51600160a060020a0390811682526020808f01518216908301528d8301518116928201929092526060808e0151909216918101919091526000608082015290925060a08101896001811115612db957fe5b8152602001886001811115612dca57fe5b815260808c810151600160a060020a03908116602084015260c08d8101516040850152606084018790529183018a905260a0808f015190911690830152810187905260e0018b600660209081029190910151600160a060020a031682528b51828201528b01516040808301919091528b01516060808301919091528b01516080808301919091528b015160a0909101529050612305816141e0565b60095481565b600c54600160a060020a031681565b600154600160a060020a03163314612f02576040805160e560020a62461bcd02815260206004820152603160248201527f73657450656e64696e67476f7665726e6f723a2043616c6c206d75737420636f60448201527f6d652066726f6d20676f7665726e6f722e000000000000000000000000000000606482015290519081900360840190fd5b6002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383811691909117918290556040519116907fe6df4d3d01a6133dfdecd1b451c04ec286cb4b10e7235d2b27321b476216e6d790600090a250565b6000546101009004600160a060020a03163314612f7b57600080fd5b600160a060020a0381161515612f9057600080fd5b60008054604051600160a060020a038085169361010090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360008054600160a060020a039092166101000274ffffffffffffffffffffffffffffffffffffffff0019909216919091179055565b60008060006130328460a001518560c00151866101c00151876101e001518861020001518961022001516137f1565b915061305e8560a001518660c00151876101c00151886101e001518961020001518a61022001516137f1565b90508181101561306d57600080fd5b6060840151600160a060020a0316151561308757806123df565b509392505050565b600080825111156130cc57815180602001830160208401855b600183831014156130c35781518152602091820191016130a8565b50505092909201915b5090919050565b6000808360a0015160018111156130e657fe5b148015613102575060018260a00151600181111561310057fe5b145b80156131295750816101a00151600160a060020a0316836101a00151600160a060020a0316145b801561316357506040820151600160a060020a0316158061316357508260200151600160a060020a03168260400151600160a060020a0316145b801561319d57506040830151600160a060020a0316158061319d57508160200151600160a060020a03168360400151600160a060020a0316145b80156131f857506060820151600160a060020a03161580156131cb57506060830151600160a060020a031615155b806131f857506060820151600160a060020a0316158015906131f857506060830151600160a060020a0316155b801561321d57508160e00151600160a060020a03168360e00151600160a060020a0316145b80156132385750613238836102000151846102200151614241565b80156132535750613253826102000151836102200151614241565b9392505050565b6060806000808080876008602002015115156132f35786156132c6576040805160e560020a62461bcd02815260206004820152601260248201527f696e76616c6964206d65726b6c65526f6f740000000000000000000000000000604482015290519081900360640190fd5b6132ec8860055b60200201518c8c8c8c600660200201518d600760200201518d8c611deb565b95506133e6565b61010088015160021180159061330857508615155b151561335e576040805160e560020a62461bcd02815260206004820152601360248201527f696e76616c6964206d65726b6c65206461746100000000000000000000000000604482015290519081900360640190fd5b6101008801519250600091505b821561339c576002830490508261338382600261425d565b101561338e57600191505b60019093019291508161336b565b8115156133ab57600019909301925b836040519080825280602002602001820160405280156133d5578160200160208202803883390190505b5094506133e38860056132cd565b95505b505050505095945050505050565b60006134208260a001518360c00151846101c00151856101e001518661020001518761022001516137f1565b92915050565b60008060008451865114151561343b57600080fd5b835186511461344957600080fd5b855160209004925060208084029250839083041461346357fe5b5060005b828110156134935760010160208102848101518682015191880180519282169119909216179052613467565b60008311156134c357829050806001016020028085015181870151811682890151821916178289015250506135a5565b50805b85518110156135a55784818151811015156134dd57fe5b90602001015160f860020a900460f860020a0284828151811015156134fe57fe5b90602001015160f860020a900460f860020a0216868281518110151561352057fe5b90602001015160f860020a900460f860020a02858381518110151561354157fe5b90602001015160f860020a900460f860020a0260ff60f860020a02181617868281518110151561356d57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001016134c6565b505050505050565b6000828201838110156135bf57600080fd5b8091505b5092915050565b60007f048b125515112cdaed03d1edbee453f1de399178750917e49ce82b75444d7a216135f7848461428b565b604080517f19010000000000000000000000000000000000000000000000000000000000006020808301919091526022820194909452604280820193909352815180820390930183526062019081905281519192909182918401908083835b602083106136755780518252601f199092019160209182019101613656565b5181516020939093036101000a600019018019909116921691909117905260405192018290039091209695505050505050565b6000806136b4836141e0565b15156136c357600091506135c3565b60008481526004602052604090205460ff16156136e357600091506135c3565b5060008381526005602052604090205480151561370357600091506135c3565b602080840151600160a060020a0316600090815260069091526040902054600101811491505092915050565b6000816040518082805190602001908083835b602083106137615780518252601f199092019160209182019101613742565b51815160209384036101000a6000190180199092169116179052604051919093018190038120885190955088945090928392508401908083835b602083106137ba5780518252601f19909201916020918201910161379b565b5181516020939093036101000a60001901801990911692169190911790526040519201829003909120939093149695505050505050565b6000808087600181111561380157fe5b141561380f57859150613879565b600187600181111561381d57fe5b1415613879576138486138398661383442886144fa565b61425d565b61384385876144fa565b614511565b9050600188600181111561385857fe5b141561386f5761386886826144fa565b9150613879565b61386886826135ad565b509695505050505050565b600080548190819060ff161561389957600080fd5b6000805460ff191660011790556020860151600160a060020a031633141561391f576138c4866141e0565b151561391a576040805160e560020a62461bcd02815260206004820152601260248201527f696e76616c69642062757920706172616d730000000000000000000000000000604482015290519081900360640190fd5b61392b565b61392886614534565b92505b6020850151600160a060020a03163314156139a457613949856141e0565b151561399f576040805160e560020a62461bcd02815260206004820152601360248201527f696e76616c69642073656c6c20706172616d7300000000000000000000000000604482015290519081900360640190fd5b6139b0565b6139ad85614534565b91505b6139ba86866130d3565b1515613a10576040805160e560020a62461bcd02815260206004820152601160248201527f6f726465722063616e2774206d61746368000000000000000000000000000000604482015290519081900360640190fd5b6000866101400151511115613a3957613a39866101200151866101200151886101400151613426565b6000856101400151511115613a6257613a62856101200151876101200151876101400151613426565b613a7686610120015186610120015161372f565b1515613acc576040805160e560020a62461bcd02815260206004820152601660248201527f63616c6c6461746120646f65736e277420657175616c00000000000000000000604482015290519081900360640190fd5b6020860151600160a060020a03163314613afa576000838152600460205260409020805460ff191660011790555b6020850151600160a060020a03163314613b28576000828152600460205260409020805460ff191660011790555b613b32868661455d565b600c546101208701516040518151939450600160a060020a03909216929091908190602084019080838360005b83811015613b77578181015183820152602001613b5f565b50505050905090810190601f168015613ba45780820380516001836020036101000a031916815260200191505b50915050600060405180830381855af49150501515613c0d576040805160e560020a62461bcd02815260206004820152601660248201527f6f726465722063616c6c64617461206661696c75726500000000000000000000604482015290519081900360640190fd5b610160860151600160a060020a031615613c4657613c3b866101600151866101200151886101800151611807565b1515613c4657600080fd5b610160850151600160a060020a031615613c7f57613c74856101600151866101200151876101800151611807565b1515613c7f57600080fd5b60608501518490600160a060020a03161515613c9f578560200151613ca5565b86602001515b6060870151600160a060020a0391821691161515613cc7578760200151613ccd565b86602001515b600160a060020a03167f5e89bc5bf129d9595ae14697a763c17e6acd67579b9f1f4fa548f57ec762a05786866000600160a060020a03168b60600151600160a060020a03161415613d22578b60600151613d28565b8a606001515b60608c0151600160a060020a03161515613d46578b60800151613d4c565b8c608001515b604080519485526020850193909352600160a060020a039182168484015216606083015260808201879052519081900360a00190a450506000805460ff1916905550505050565b6000613d9f8383614b76565b6020840151909150600160a060020a03163314613dbb57600080fd5b600081815260046020526040808220805460ff191660011790555182917f5152abf959f6564662358c2e52b702259b78bac5ee7842a0f01937e670efcc7d91a2505050565b6020820151600090600160a060020a03163314613e1c57600080fd5b602080840151600160a060020a0316600090815260069091526040902054613e459084906135ca565b60008181526005602052604090205490915015613eac576040805160e560020a62461bcd02815260206004820152601560248201527f6475706c696361746564206f7264657220686173680000000000000000000000604482015290519081900360640190fd5b600660008460200151600160a060020a0316600160a060020a0316815260200190815260200160002054600101600560008360001916600019168152602001908152602001600020819055508260600151600160a060020a03168360200151600160a060020a031682600019167fbfc991b64000533072b5f27ccd5e8628fea28ae33286778a627005b3156c6fe1866000015187604001518860a001518960c001518a60e001518b61010001518b6040518088600160a060020a0316600160a060020a0316815260200187600160a060020a0316600160a060020a03168152602001866001811115613f9a57fe5b60ff168152602001856001811115613fae57fe5b60ff168152600160a060020a0390941660208501525060408084019290925260608301525190819003608001945092505050a480600019167fb7c210e6374e28618aff2db2406f01343e302b15476278b7795869bccc51f979846101200151856101400151866101600151876101800151886101a00151896101c001518a6101e001518b61020001518c61022001518d61024001516040518080602001806020018b600160a060020a0316600160a060020a03168152602001806020018a600160a060020a0316600160a060020a0316815260200189815260200188815260200187815260200186815260200185815260200184810384528e818151815260200191508051906020019080838360005b838110156140d65781810151838201526020016140be565b50505050905090810190601f1680156141035780820380516001836020036101000a031916815260200191505b5084810383528d5181528d516020918201918f019080838360005b8381101561413657818101518382015260200161411e565b50505050905090810190601f1680156141635780820380516001836020036101000a031916815260200191505b5084810382528b5181528b516020918201918d019080838360005b8381101561419657818101518382015260200161417e565b50505050905090810190601f1680156141c35780820380516001836020036101000a031916815260200191505b509d505050505050505050505050505060405180910390a2505050565b8051600090600160a060020a031630146141fc57506000612d40565b6020820151600160a060020a0316151561421857506000612d40565b61422b8260c00151836102200151614be5565b151561423957506000612d40565b506001919050565b6000428310801561325357508115806132535750504210919050565b60008083151561427057600091506135c3565b5082820282848281151561428057fe5b04146135bf57600080fd5b604080516102a08082526102c0820190925260009190606090839083602082016154008038833901905050915050602081016142e7817ff446866267029076a71bb126e250b9480cd4ac2699baa745a582b10b361ec951614c04565b90506142f7818760000151614c04565b9050614307818760200151614c04565b9050614317818760400151614c04565b9050614327818760600151614c04565b9050614337818760800151614c04565b9050614352818760a00151600181111561434d57fe5b614c04565b9050614368818760c00151600181111561434d57fe5b9050614378818760e00151614c04565b905061438981876101000151614c04565b90506143f6818761012001516040518082805190602001908083835b602083106143c45780518252601f1990920191602091820191016143a5565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020614c04565b905061443081876101400151604051808280519060200190808383602083106143c45780518252601f1990920191602091820191016143a5565b905061444181876101600151614c04565b905061447b81876101800151604051808280519060200190808383602083106143c45780518252601f1990920191602091820191016143a5565b905061448c81876101a00151614c04565b905061449d81876101c00151614c04565b90506144ae81876101e00151614c04565b90506144bf81876102000151614c04565b90506144d081876102200151614c04565b90506144e181876102400151614c04565b90506144ed8186614c04565b5050602001209392505050565b6000808383111561450a57600080fd5b5050900390565b60008080831161452057600080fd5b828481151561452b57fe5b04949350505050565b602080820151600160a060020a0316600090815260069091526040812054613420908390614b76565b600080600080600080600080600080600080600160a060020a03168c6101a00151600160a060020a031614151561459957341561459957600080fd5b6145a38d8d613003565b995060008a1180156145c257506101a08c0151600160a060020a031615155b156145e0576145e08c6101a001518e602001518e602001518d614c0c565b8998508997506145fd6145f56007548c61425d565b612710614511565b9650600095506146108c60e00151614cd1565b156146c4578b60e00151600160a060020a0316632a55205a8e61010001518c6040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180838152602001828152602001925050506040805180830381600087803b15801561468757600080fd5b505af115801561469b573d6000803e3d6000fd5b505050506040513d60408110156146b157600080fd5b508051602090910151909650945061476d565b600d5460e08d0151604080517f2782d6c7000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152602481018e905281519290931692632782d6c792604480830193928290030181600087803b15801561473457600080fd5b505af1158015614748573d6000803e3d6000fd5b505050506040513d604081101561475e57600080fd5b50805160209091015190965094505b600160a060020a0386161580159061478457508415155b156147fc576101a08c0151600160a060020a031615156147e7576147a889866144fa565b604051909950600160a060020a0387169086156108fc029087906000818181858888f193505050501580156147e1573d6000803e3d6000fd5b506147fc565b6147fc8c6101a001518d602001518888614c0c565b60608c0151600160a060020a03161580159061481757508615155b156149e35761482b6145f56009548961425d565b6101a08d0151909450600160a060020a031615156148905761484d89856144fa565b60608d0151604051919a50600160a060020a03169085156108fc029086906000818181858888f1935050505015801561488a573d6000803e3d6000fd5b506148a9565b6148a98c6101a001518d602001518e6060015187614c0c565b60808d0151600160a060020a031615614949576148cb6145f56008548961425d565b6101a08d0151909350600160a060020a03161515614930576148ed89846144fa565b60808e0151604051919a50600160a060020a03169084156108fc029085906000818181858888f1935050505015801561492a573d6000803e3d6000fd5b50614949565b6149498c6101a001518d602001518f6080015186614c0c565b6149586145f5600a548961425d565b6101a08d0151909250600160a060020a031615156149bb5761497a89836144fa565b600b54604051919a50600160a060020a03169083156108fc029084906000818181858888f193505050501580156149b5573d6000803e3d6000fd5b506149de565b6101a08c015160208d0151600b546149de929190600160a060020a031685614c0c565b614ab1565b60608c0151600160a060020a03161515614ab1576101a08c0151600160a060020a03161515614a1157600080fd5b8615614ab157614a266145f56009548961425d565b9350614a418c6101a001518d602001518f6060015187614c0c565b60808c0151600160a060020a031615614a7e57614a636145f56008548961425d565b9250614a7e8c6101a001518d602001518e6080015186614c0c565b614a8d6145f5600a548961425d565b6101a08d015160208e0151600b54929450614ab192600160a060020a031685614c0c565b6101a08c0151600160a060020a03161515614b655734881115614ad357600080fd5b8b60200151600160a060020a03166108fc8a9081150290604051600060405180830381858888f19350505050158015614b10573d6000803e3d6000fd5b50614b1b34896144fa565b90506000811115614b65578c60200151600160a060020a03166108fc829081150290604051600060405180830381858888f19350505050158015614b63573d6000803e3d6000fd5b505b50979b9a5050505050505050505050565b600080614b8384846135ca565b9050614b8f81856136a8565b15156135bf576040805160e560020a62461bcd02815260206004820152600d60248201527f696e76616c6964206f7264657200000000000000000000000000000000000000604482015290519081900360640190fd5b600080836001811115614bf457fe5b1480613253575050600010919050565b815260200190565b6000811115614ccb57600354604080517f15dacbea000000000000000000000000000000000000000000000000000000008152600160a060020a0387811660048301528681166024830152858116604483015260648201859052915191909216916315dacbea9160848083019260209291908290030181600087803b158015614c9457600080fd5b505af1158015614ca8573d6000803e3d6000fd5b505050506040513d6020811015614cbe57600080fd5b50511515614ccb57600080fd5b50505050565b604080517f2a55205a00000000000000000000000000000000000000000000000000000000602480830191909152825180830390910181526044909101825260208181018051600160e060020a03167f01ffc9a7000000000000000000000000000000000000000000000000000000001790528251818152808401909352600092839291606091849181602001602082028038833901905050915060208284516020860160008a5af19350831515614d8c5760009450614d93565b5080519350835b50505050919050565b604080516102608101825260008082526020820181905291810182905260608101829052608081018290529060a08201908152602001600081526020016000600160a060020a031681526020016000815260200160608152602001606081526020016000600160a060020a03168152602001606081526020016000600160a060020a03168152602001600081526020016000815260200160008152602001600081526020016000815250905600a165627a7a7230582033844ff19818572d40975a7a52f206c4f20c5ea6cfa35bdc44884f44faf6bbd80029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c09f6ebf24d9cc1b4140baa992afb7a5bf41a54700000000000000000000000044a6eaa71ad81f206829dbb59b63e6c733295f4f0000000000000000000000005d01d08834283885b97c4a9eef16631707c83f9b000000000000000000000000d766fab1a146c835ca3ae2b2bf27b179f52b0211
-----Decoded View---------------
Arg [0] : tokenTransferProxyAddress (address): 0xC09F6EbF24D9cc1B4140BaA992AfB7A5BF41A547
Arg [1] : protocolFeeAddress (address): 0x44a6eAa71ad81F206829dBB59b63e6c733295f4f
Arg [2] : merkleValidatorAddress (address): 0x5D01D08834283885b97c4A9EEF16631707C83F9b
Arg [3] : royaltyRegisterHubAddress (address): 0xD766fAB1A146C835CA3aE2b2bf27B179f52b0211
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000c09f6ebf24d9cc1b4140baa992afb7a5bf41a547
Arg [1] : 00000000000000000000000044a6eaa71ad81f206829dbb59b63e6c733295f4f
Arg [2] : 0000000000000000000000005d01d08834283885b97c4a9eef16631707c83f9b
Arg [3] : 000000000000000000000000d766fab1a146c835ca3ae2b2bf27b179f52b0211
Deployed Bytecode Sourcemap
50408:12233:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60449:1113;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;60449:1113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;60449:1113:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;60449:1113:0;-1:-1:-1;60449:1113:0;;-1:-1:-1;60449:1113:0;;;;;;;;-1:-1:-1;;60449:1113:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;60449:1113:0;-1:-1:-1;60449:1113:0;;-1:-1:-1;60449:1113:0;;;;;;;;-1:-1:-1;;60449:1113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60449:1113:0;;;;-1:-1:-1;60449:1113:0;-1:-1:-1;60449:1113:0;;;;;;;;;;-1:-1:-1;;60449:1113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60449:1113:0;;;;-1:-1:-1;60449:1113:0;-1:-1:-1;60449:1113:0;;-1:-1:-1;60449:1113:0;;;;;;;;-1:-1:-1;;60449:1113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60449:1113:0;;;;-1:-1:-1;60449:1113:0;-1:-1:-1;60449:1113:0;;-1:-1:-1;60449:1113:0;;;;;;;;-1:-1:-1;;60449:1113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60449:1113:0;;;;-1:-1:-1;60449:1113:0;-1:-1:-1;60449:1113:0;;-1:-1:-1;60449:1113:0;;;;;;;;-1:-1:-1;;60449:1113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60449:1113:0;;;;-1:-1:-1;60449:1113:0;-1:-1:-1;60449:1113:0;;-1:-1:-1;60449:1113:0;;;;;;;;-1:-1:-1;;60449:1113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60449:1113:0;;;;-1:-1:-1;60449:1113:0;-1:-1:-1;60449:1113:0;;-1:-1:-1;60449:1113:0;;;;;;;;-1:-1:-1;60449:1113:0;;-1:-1:-1;60449:1113:0;;-1:-1:-1;;;;;;;60449:1113:0;;;;;;;;;;;;;;;;;19052:62;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19052:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;19052:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14969:23;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14969:23:0;;;;;;;;-1:-1:-1;;;;;14969:23:0;;;;;;;;;;;;;;20591:44;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20591:44:0;;;;21598:31;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21598:31:0;;;;30193:594;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;30193:594:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30193:594:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30193:594:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30193:594:0;;;;-1:-1:-1;30193:594:0;-1:-1:-1;30193:594:0;;-1:-1:-1;30193:594:0;;;;;;;;-1:-1:-1;30193:594:0;;-1:-1:-1;30193:594:0;;-1:-1:-1;;;;;;;30193:594:0;;;;;;;;;;;;;;;;;;;58771:1103;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;58771:1103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;58771:1103:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;58771:1103:0;-1:-1:-1;58771:1103:0;;-1:-1:-1;58771:1103:0;;;;;;;;-1:-1:-1;;58771:1103:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;58771:1103:0;-1:-1:-1;58771:1103:0;;-1:-1:-1;58771:1103:0;;;;;;;;-1:-1:-1;;58771:1103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58771:1103:0;;;;-1:-1:-1;58771:1103:0;-1:-1:-1;58771:1103:0;;;;;;;;;;-1:-1:-1;;58771:1103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58771:1103:0;;;;-1:-1:-1;58771:1103:0;-1:-1:-1;58771:1103:0;;-1:-1:-1;58771:1103:0;;;;;;;;-1:-1:-1;;58771:1103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58771:1103:0;;;;-1:-1:-1;58771:1103:0;-1:-1:-1;58771:1103:0;;-1:-1:-1;58771:1103:0;;;;;;;;-1:-1:-1;;58771:1103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58771:1103:0;;;;-1:-1:-1;58771:1103:0;-1:-1:-1;58771:1103:0;;-1:-1:-1;58771:1103:0;;;;;;;;-1:-1:-1;;58771:1103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58771:1103:0;;;;-1:-1:-1;58771:1103:0;-1:-1:-1;58771:1103:0;;-1:-1:-1;58771:1103:0;;;;;;;;-1:-1:-1;;58771:1103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58771:1103:0;;;;-1:-1:-1;58771:1103:0;-1:-1:-1;58771:1103:0;;-1:-1:-1;58771:1103:0;;;;;;;;-1:-1:-1;58771:1103:0;;-1:-1:-1;58771:1103:0;;-1:-1:-1;;;;;;;58771:1103:0;58047:716;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;58047:716:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;58047:716:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;58047:716:0;-1:-1:-1;58047:716:0;;-1:-1:-1;58047:716:0;;;;;;;;-1:-1:-1;;58047:716:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58047:716:0;;;;;-1:-1:-1;58047:716:0;;-1:-1:-1;58047:716:0;;;;;;;;;;;;;;-1:-1:-1;;58047:716:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58047:716:0;;;;-1:-1:-1;58047:716:0;-1:-1:-1;58047:716:0;;-1:-1:-1;58047:716:0;;;;;;;;-1:-1:-1;58047:716:0;;-1:-1:-1;;58047:716:0;;;-1:-1:-1;58047:716:0;;-1:-1:-1;;;;58047:716:0;15616:336;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15616:336:0;;;;;;53545:211;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;53545:211:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;53545:211:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53545:211:0;;;;-1:-1:-1;53545:211:0;-1:-1:-1;53545:211:0;;-1:-1:-1;53545:211:0;;;;;;;;-1:-1:-1;;53545:211:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53545:211:0;;;;-1:-1:-1;53545:211:0;-1:-1:-1;53545:211:0;;-1:-1:-1;53545:211:0;;;;;;;;-1:-1:-1;53545:211:0;;-1:-1:-1;53545:211:0;;-1:-1:-1;;;;;;;53545:211:0;20375:109;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20375:109:0;;;;51073:1317;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;51073:1317:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51073:1317:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51073:1317:0;;-1:-1:-1;51073:1317:0;;-1:-1:-1;;;;;;;51073:1317:0;28524:493;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;28524:493:0;;;;;;;;;55604:791;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;55604:791:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;55604:791:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;55604:791:0;-1:-1:-1;55604:791:0;;-1:-1:-1;55604:791:0;;;;;;;;-1:-1:-1;;55604:791:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55604:791:0;;;;;-1:-1:-1;55604:791:0;;-1:-1:-1;55604:791:0;;;;;;;;;;;;;;-1:-1:-1;;55604:791:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55604:791:0;;;;-1:-1:-1;55604:791:0;-1:-1:-1;55604:791:0;;-1:-1:-1;55604:791:0;;;;;;;;-1:-1:-1;55604:791:0;;-1:-1:-1;;55604:791:0;;;-1:-1:-1;55604:791:0;;-1:-1:-1;;;;55604:791:0;22393:33;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22393:33:0;;;;21764:39;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21764:39:0;;;;29177:166;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;29177:166:0;-1:-1:-1;;;;;29177:166:0;;;;;19121:38;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19121:38:0;;;;59882:559;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;59882:559:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;59882:559:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59882:559:0;;;;-1:-1:-1;59882:559:0;-1:-1:-1;59882:559:0;;-1:-1:-1;59882:559:0;;;;;;;;-1:-1:-1;;59882:559:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59882:559:0;;;;-1:-1:-1;59882:559:0;-1:-1:-1;59882:559:0;;-1:-1:-1;59882:559:0;;;;;;;;-1:-1:-1;;59882:559:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59882:559:0;;;;-1:-1:-1;59882:559:0;-1:-1:-1;59882:559:0;;-1:-1:-1;59882:559:0;;;;;;;;-1:-1:-1;59882:559:0;;-1:-1:-1;59882:559:0;;-1:-1:-1;;;;;;;59882:559:0;27706:144;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27706:144:0;;;;53764:335;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;53764:335:0;;;;;;;;;;;;;;;;;;;;22189:35;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22189:35:0;;;;14747:124;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14747:124:0;;;;61570:1066;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;61570:1066:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;61570:1066:0;-1:-1:-1;61570:1066:0;;-1:-1:-1;61570:1066:0;;;;;;;;-1:-1:-1;;61570:1066:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;61570:1066:0;-1:-1:-1;61570:1066:0;;-1:-1:-1;61570:1066:0;;;;;;;;-1:-1:-1;;61570:1066:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61570:1066:0;;;;-1:-1:-1;61570:1066:0;-1:-1:-1;61570:1066:0;;;;;;;;;;-1:-1:-1;;61570:1066:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61570:1066:0;;;;-1:-1:-1;61570:1066:0;-1:-1:-1;61570:1066:0;;-1:-1:-1;61570:1066:0;;;;;;;;-1:-1:-1;;61570:1066:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61570:1066:0;;;;-1:-1:-1;61570:1066:0;-1:-1:-1;61570:1066:0;;-1:-1:-1;61570:1066:0;;;;;;;;-1:-1:-1;;61570:1066:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61570:1066:0;;;;-1:-1:-1;61570:1066:0;-1:-1:-1;61570:1066:0;;-1:-1:-1;61570:1066:0;;;;;;;;-1:-1:-1;;61570:1066:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61570:1066:0;;;;-1:-1:-1;61570:1066:0;-1:-1:-1;61570:1066:0;;-1:-1:-1;61570:1066:0;;;;;;;;-1:-1:-1;;61570:1066:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61570:1066:0;;;;-1:-1:-1;61570:1066:0;-1:-1:-1;61570:1066:0;;-1:-1:-1;61570:1066:0;;;;;;;;-1:-1:-1;61570:1066:0;;-1:-1:-1;;61570:1066:0;;;-1:-1:-1;61570:1066:0;;-1:-1:-1;;;;61570:1066:0;21386:41;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;21386:41:0;-1:-1:-1;;;;;21386:41:0;;;;;20694:52;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;20694:52:0;;;;;54107:728;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;54107:728:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54107:728:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;54107:728:0;-1:-1:-1;54107:728:0;;-1:-1:-1;54107:728:0;;;;;;;;-1:-1:-1;;54107:728:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54107:728:0;;;;;-1:-1:-1;54107:728:0;;-1:-1:-1;54107:728:0;;;;;;;;;;;;;;-1:-1:-1;;54107:728:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54107:728:0;;;;-1:-1:-1;54107:728:0;-1:-1:-1;54107:728:0;;-1:-1:-1;54107:728:0;;;;;;;;-1:-1:-1;54107:728:0;;-1:-1:-1;;54107:728:0;;;-1:-1:-1;54107:728:0;;-1:-1:-1;;;;54107:728:0;13706:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13706:20:0;;;;57302:737;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;57302:737:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;57302:737:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;57302:737:0;-1:-1:-1;57302:737:0;;-1:-1:-1;57302:737:0;;;;;;;;-1:-1:-1;;57302:737:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57302:737:0;;;;;-1:-1:-1;57302:737:0;;-1:-1:-1;57302:737:0;;;;;;;;;;;;;;-1:-1:-1;;57302:737:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57302:737:0;;;;-1:-1:-1;57302:737:0;-1:-1:-1;57302:737:0;;-1:-1:-1;57302:737:0;;;;;;;;-1:-1:-1;57302:737:0;;-1:-1:-1;;57302:737:0;;;-1:-1:-1;57302:737:0;;-1:-1:-1;;;;57302:737:0;22107:34;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22107:34:0;;;;56403:891;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;56403:891:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;56403:891:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;56403:891:0;-1:-1:-1;56403:891:0;;-1:-1:-1;56403:891:0;;;;;;;;-1:-1:-1;;56403:891:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56403:891:0;;;;;-1:-1:-1;56403:891:0;;-1:-1:-1;56403:891:0;;;;;;;;;;;;;;-1:-1:-1;;56403:891:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56403:891:0;;;;-1:-1:-1;56403:891:0;-1:-1:-1;56403:891:0;;-1:-1:-1;56403:891:0;;;;;;;;-1:-1:-1;;56403:891:0;;;;;;;;;;;;;;;;;-1:-1:-1;56403:891:0;-1:-1:-1;56403:891:0;;-1:-1:-1;56403:891:0;;-1:-1:-1;56403:891:0;;;;;;-1:-1:-1;56403:891:0;;-1:-1:-1;56403:891:0;;-1:-1:-1;;;;;;56403:891:0;27983:236;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;27983:236:0;;;;;22265:48;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22265:48:0;;;;14999:30;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14999:30:0;;;;20493:51;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20493:51:0;;;;36111:133;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;36111:133:0;;;;;54843:753;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;54843:753:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54843:753:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;54843:753:0;-1:-1:-1;54843:753:0;;-1:-1:-1;54843:753:0;;;;;;;;-1:-1:-1;;54843:753:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54843:753:0;;;;;-1:-1:-1;54843:753:0;;-1:-1:-1;54843:753:0;;;;;;;;;;;;;;-1:-1:-1;;54843:753:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54843:753:0;;;;-1:-1:-1;54843:753:0;-1:-1:-1;54843:753:0;;-1:-1:-1;54843:753:0;;;;;;;;-1:-1:-1;54843:753:0;;-1:-1:-1;;54843:753:0;;;-1:-1:-1;54843:753:0;;-1:-1:-1;;;;54843:753:0;21938:39;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21938:39:0;;;;22334:38;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22334:38:0;;;;15960:264;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;15960:264:0;-1:-1:-1;;;;;15960:264:0;;;;;14452:192;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;14452:192:0;-1:-1:-1;;;;;14452:192:0;;;;;60449:1113;60804:4;60826:16;;:::i;:::-;61147:17;;:::i;:::-;60845:291;;;;;;;;;;60851:5;-1:-1:-1;60851:8:0;;;;;;;;;-1:-1:-1;;;;;60845:291:0;;;;60861:5;60867:1;60861:8;;;;;;;;;-1:-1:-1;;;;;60845:291:0;;;;60871:5;60877:1;60871:8;;;;;;;;;-1:-1:-1;;;;;60845:291:0;;;;60881:5;60887:1;60881:8;;;;;;;;;-1:-1:-1;;;;;60845:291:0;;;;60891:5;60897:1;60891:8;;;;;;;;;-1:-1:-1;;;;;60845:291:0;;;;60924:10;60935:1;60924:13;;;;60901:37;;;;;;;;;;60845:291;;;;;;;;;;;;60967:10;60978:1;60967:13;;;;60940:41;;;;;;;;;;60845:291;;;;;;;;;;60983:8;;;;;-1:-1:-1;;;;;60845:291:0;;;;;60993:8;;;;60845:291;;;;-1:-1:-1;60845:291:0;;;;;-1:-1:-1;60845:291:0;;;;;;60983:5;61045:1;61039:8;;;;-1:-1:-1;;;;;60845:291:0;;;;;61049:18;60845:291;;;;61076:5;61082:1;61076:8;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;60845:291:0;;;;61087:5;61093:1;61087:8;;;;;;;;;60845:291;;;61097:5;61103:1;61097:8;;;;;;;;;60845:291;;;61107:5;61113:1;61107:8;;;;;;;;;60845:291;;;61117:5;61123:1;61117:8;;;;;;;;;60845:291;;;61127:5;61133:1;61127:8;;;;60845:291;;61167:302;;;;;;;;;60826:310;;-1:-1:-1;61167:302:0;61173:5;61179:1;61173:8;;;;;;;;;-1:-1:-1;;;;;61167:302:0;;;;61183:5;61189:1;61183:8;;;;;;;;;-1:-1:-1;;;;;61167:302:0;;;;61193:5;61199:2;61193:9;;;;;;;;;-1:-1:-1;;;;;61167:302:0;;;;61204:5;61210:2;61204:9;;;;;;;;;-1:-1:-1;;;;;61167:302:0;;;;61215:5;61221:2;61215:9;;;;;;;;;-1:-1:-1;;;;;61167:302:0;;;;61249:10;61260:1;61249:13;;;;61226:37;;;;;;;;;;61167:302;;;;;;;;;;;;61292:10;61303:1;61292:13;;;;61265:41;;;;;;;;;;61167:302;;;;;;;;;;61308:9;;;;-1:-1:-1;;;;;61167:302:0;;;;;;;61319:9;;;;61167:302;;;;;;;;;;;;;;;;61368:9;;;;61167:302;;;;;;;;;;;;;61308:9;61413:2;61407:9;;;;;;;;;-1:-1:-1;;;;;61167:302:0;;;61419:8;;;;61167:302;;;;61429:8;;;;61167:302;;;;61439:8;;;;61167:302;;;;61449:8;;;;61167:302;;;;61459:9;;;;-1:-1:-1;61167:302:0;;;;61147:322;-1:-1:-1;61487:67:0;61521:3;61147:322;61487:19;:67::i;:::-;61480:74;60449:1113;-1:-1:-1;;;;;;;;;;;;60449:1113:0:o;19052:62::-;;;;;;;;;;;;;;;;;;;:::o;14969:23::-;;;-1:-1:-1;;;;;14969:23:0;;:::o;20591:44::-;;;-1:-1:-1;;;;;20591:44:0;;:::o;21598:31::-;;;;:::o;30193:594::-;30312:11;30341:21;30421:10;30393:9;:16;30375:8;:15;:34;30365:45;;;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;30365:45:0;-1:-1:-1;30341:69:0;-1:-1:-1;;30489:4:0;30475:19;;30523:45;30475:19;30558:9;30523:27;:45::i;:::-;30515:53;;30579:44;30607:5;30614:8;30579:27;:44::i;:::-;;30743:1;30736:4;30730:11;30719:8;30713:15;30706:4;30696:8;30692:19;30684:6;30679:3;30668:77;30658:87;30193:594;-1:-1:-1;;;;;;30193:594:0:o;58771:1103::-;59121:4;59143:16;;:::i;:::-;59464:17;;:::i;:::-;59162:291;;;;;;;;;;59168:5;-1:-1:-1;59168:8:0;;;;;;;;;-1:-1:-1;;;;;59162:291:0;;;;59178:5;59184:1;59178:8;;;;;;;;;-1:-1:-1;;;;;59162:291:0;;;;59188:5;59194:1;59188:8;;;;;;;;;-1:-1:-1;;;;;59162:291:0;;;;59198:5;59204:1;59198:8;;;;;;;;;-1:-1:-1;;;;;59162:291:0;;;;59208:5;59214:1;59208:8;;;;;;;;;-1:-1:-1;;;;;59162:291:0;;;;59241:10;59252:1;59241:13;;;;59218:37;;;;;;;;;;59162:291;;;;;;;;;;;;59284:10;59295:1;59284:13;;;;59257:41;;;;;;;;;;59162:291;;;;;;;;;;59300:8;;;;;-1:-1:-1;;;;;59162:291:0;;;;;59310:8;;;;59162:291;;;;-1:-1:-1;59162:291:0;;;;;-1:-1:-1;59162:291:0;;;;;;59300:5;59362:1;59356:8;;;;-1:-1:-1;;;;;59162:291:0;;;;;59366:18;59162:291;;;;59393:5;59399:1;59393:8;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;59162:291:0;;;;59404:5;59410:1;59404:8;;;;;;;;;59162:291;;;59414:5;59420:1;59414:8;;;;;;;;;59162:291;;;59424:5;59430:1;59424:8;;;;;;;;;59162:291;;;59434:5;59440:1;59434:8;;;;;;;;;59162:291;;;59444:5;59450:1;59444:8;;;;59162:291;;59484:302;;;;;;;;;59143:310;;-1:-1:-1;59484:302:0;59490:5;59496:1;59490:8;;;;;;;;;-1:-1:-1;;;;;59484:302:0;;;;59500:5;59506:1;59500:8;;;;;;;;;-1:-1:-1;;;;;59484:302:0;;;;59510:5;59516:2;59510:9;;;;;;;;;-1:-1:-1;;;;;59484:302:0;;;;59521:5;59527:2;59521:9;;;;;;;;;-1:-1:-1;;;;;59484:302:0;;;;59532:5;59538:2;59532:9;;;;;;;;;-1:-1:-1;;;;;59484:302:0;;;;59566:10;59577:1;59566:13;;;;59543:37;;;;;;;;;;59484:302;;;;;;;;;;;;59609:10;59620:1;59609:13;;;;59582:41;;;;;;;;;;59484:302;;;;;;;;;;59625:9;;;;-1:-1:-1;;;;;59484:302:0;;;;;;;59636:9;;;;59484:302;;;;;;;;;;;;;;;;59685:9;;;;59484:302;;;;;;;;;;;;;59625:9;59730:2;59724:9;;;;;;;;;-1:-1:-1;;;;;59484:302:0;;;59736:8;;;;59484:302;;;;59746:8;;;;59484:302;;;;59756:8;;;;59484:302;;;;59766:8;;;;59484:302;;;;59776:9;;;;-1:-1:-1;59484:302:0;;;;59464:322;-1:-1:-1;59804:62:0;59833:3;59464:322;59804:14;:62::i;58047:716::-;58347:4;58369:26;58398:66;58420:5;58426:1;58420:8;;;;;58429;;;;58438;;;;58447:5;58453:10;58398:21;:66::i;:::-;58518:226;;;;;;;;58524:8;;-1:-1:-1;;;;;58518:226:0;;;;;58524:8;58534;;;;58518:226;;;;;;58544:8;;;;58518:226;;;;;;;;;;58554:8;;;;58518:226;;;;;;;;;;-1:-1:-1;58518:226:0;;;;58369:95;;-1:-1:-1;58482:273:0;;58518:226;;;58579:4;58540:1;58518:226;;;;;;;;;;;58585:8;58518:226;;;;;;;;;;58595:8;;;;;-1:-1:-1;;;;;58518:226:0;;;;;;;58605:8;;;;;58518:226;;;;-1:-1:-1;58518:226:0;;;;;;;;;;;;58650:8;;;;58518:226;;;;;;;;;;;;;;58595:8;58690:1;58684:8;;;;;;;;;-1:-1:-1;;;;;58518:226:0;;;58695:8;;58518:226;;;;58705:8;;;58518:226;;;;;;;;58715:8;;;58518:226;;;;;;;;58725:8;;;58518:226;;;;;;;;58735:8;;;58518:226;;;;;58482:21;:273::i;:::-;58475:280;58047:716;-1:-1:-1;;;;;;;;;58047:716:0:o;15616:336::-;15686:15;;15771:24;;-1:-1:-1;;;;;15686:15:0;15672:10;:29;15664:96;;;;;-1:-1:-1;;;;;15664:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15798:8:0;;;-1:-1:-1;;15817:21:0;;;15828:10;15817:21;;;;;15849:15;:28;;;;;;;15895:49;;-1:-1:-1;;;;;15798:8:0;;;;15935;;;;15798;;15895:49;;15798:8;;15895:49;15616:336;:::o;53545:211::-;53650:5;53673:52;53704:5;53711:7;53720:4;53673:30;:52::i;:::-;-1:-1:-1;53743:5:0;;53545:211;-1:-1:-1;;53545:211:0:o;20375:109::-;20418:66;20375:109;:::o;51073:1317::-;51338:5;51356:47;51430:8;51406:33;;;;;;;;51356:83;-1:-1:-1;51481:48:0;51454:23;:75;;;;;;;;;51450:933;;;51553:158;;-1:-1:-1;;;;;51553:158:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51656:4;;51662:2;;51666:10;;51678:7;;51687:10;;51699:11;;51553:158;;;;;;;;;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;-1:-1;;51553:158:0;;;;;;;26:21:-1;;;-1:-1;;22:32;6:49;;51553:158:0;;;-1:-1:-1;49:4;25:18;;61:17;;51553:158:0;-1:-1:-1;;;;;182:15;;;179:29;160:49;;51553:158:0;-1:-1:-1;51546:165:0;;-1:-1:-1;;;;;;;;;;51546:165:0;51450:933;51760:64;51733:23;:91;;;;;;;;;51729:654;;;51848:174;;-1:-1:-1;;;;;51848:174:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51967:4;;51973:2;;51977:10;;51989:7;;51998:10;;52010:11;;51848:174;;;;;;;;;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;-1:-1;;51848:174:0;;;;;;;26:21:-1;;;-1:-1;;22:32;6:49;;51848:174:0;;;-1:-1:-1;49:4;25:18;;61:17;;51848:174:0;-1:-1:-1;;;;;182:15;;;179:29;160:49;;51848:174:0;-1:-1:-1;51841:181:0;;-1:-1:-1;;;;;;;;;;51841:181:0;51729:654;52071:49;52044:23;:76;;;;;;;;;52040:343;;;52256:4;52262:2;52266:10;52278:7;52287:6;52295:10;52307:11;52144:175;;;;;;-1:-1:-1;;;;;52144:175:0;-1:-1:-1;;;;;52144:175:0;;;;;;-1:-1:-1;;;;;52144:175:0;-1:-1:-1;;;;;52144:175:0;;;;;;-1:-1:-1;;;;;52144:175:0;-1:-1:-1;;;;;52144:175:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;-1:-1;;52144:175:0;;;;;;;26:21:-1;;;-1:-1;;22:32;6:49;;52144:175:0;;;-1:-1:-1;49:4;25:18;;61:17;;52144:175:0;-1:-1:-1;;;;;182:15;;;179:29;160:49;;52144:175:0;-1:-1:-1;52137:182:0;;-1:-1:-1;;;;;;;;;;;52137:182:0;52040:343;52359:12;;;52369:1;52359:12;;;;;;;;;-1:-1:-1;52040:343:0;51073:1317;;;;;;;;;;;:::o;28524:493::-;15579:8;;-1:-1:-1;;;;;15579:8:0;15565:10;:22;15557:31;;;;;;22308:5;28700:97;28713:62;28726:23;28751;28713:12;:62::i;:::-;28777:19;28700:12;:97::i;:::-;:120;28692:154;;;;;-1:-1:-1;;;;;28692:154:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;28857:20;:46;;;;28914:20;:46;28971:16;:38;28524:493::o;55604:791::-;55897:4;55919:26;56025:18;;:::i;:::-;55948:66;55970:5;55976:1;55970:8;;;;;55979;;;;55988;;;;55997:5;56003:10;55948:21;:66::i;:::-;56046:226;;;;;;;;56052:8;;-1:-1:-1;;;;;56046:226:0;;;;;56052:8;56062;;;;56046:226;;;;;;56072:8;;;;56046:226;;;;;;;;;;56082:8;;;;56046:226;;;;;;;;;;-1:-1:-1;56046:226:0;;;;55919:95;;-1:-1:-1;56046:226:0;;;56107:4;56068:1;56046:226;;;;;;;;;;;56113:8;56046:226;;;;;;;;;;56123:8;;;;;-1:-1:-1;;;;;56046:226:0;;;;;;;56133:8;;;;;56046:226;;;;-1:-1:-1;56046:226:0;;;;;;;;;;;;56178:8;;;;56046:226;;;;;;;;;;;;;;56123:8;56218:1;56212:8;;;;;;;;;-1:-1:-1;;;;;56046:226:0;;;;;56223:8;;56046:226;;;;56233:8;;;;56046:226;;;;;;;;56243:8;;;;56046:226;;;;;;;;56253:8;;;56046:226;;;;;;;;56263:8;;;56046:226;;;;;;;;56343:11;;;;56336:19;56229:1;56336:19;;;:6;:19;;;;;56025:247;;-1:-1:-1;56290:97:0;;56318:38;;56025:247;;56318:10;:38::i;:::-;56371:5;56290:13;:97::i;:::-;56283:104;55604:791;-1:-1:-1;;;;;;;;;;55604:791:0:o;22393:33::-;;;-1:-1:-1;;;;;22393:33:0;;:::o;21764:39::-;;;;:::o;29177:166::-;14249:5;;;;;-1:-1:-1;;;;;14249:5:0;14235:10;:19;14227:28;;;;;;29289:20;:46;;-1:-1:-1;;29289:46:0;-1:-1:-1;;;;;29289:46:0;;;;;;;;;;29177:166::o;19121:38::-;;;;;;;;;;;;;;;;;;;:::o;59882:559::-;60047:4;60104:1;60073:21;:28;:32;60069:145;;;60122:80;60153:11;60166:12;60180:21;60122:30;:80::i;:::-;60260:1;60228:22;:29;:33;60224:147;;;60278:81;60309:12;60323:11;60336:22;60278:30;:81::i;:::-;60388:45;60407:11;60420:12;60388:18;:45::i;:::-;60381:52;59882:559;-1:-1:-1;;;;;59882:559:0:o;27706:144::-;27777:10;27752:13;27770:18;;;:6;:18;;;;;;;;;27768:20;;;;;;;;27804:38;;;;;;;27768:20;;27777:10;27804:38;;;;;;;;;27706:144;:::o;53764:335::-;53962:4;53991:100;54029:4;54035:8;54045:9;54056:5;54063:11;54076:14;53991:37;:100::i;:::-;53984:107;53764:335;-1:-1:-1;;;;;;;53764:335:0:o;22189:35::-;;;-1:-1:-1;;;;;22189:35:0;;:::o;14747:124::-;14249:5;;;;;-1:-1:-1;;;;;14249:5:0;14235:10;:19;14227:28;;;;;;14828:5;;;14809:25;;14828:5;;;;-1:-1:-1;;;;;14828:5:0;;14809:25;;;14861:1;14845:18;;-1:-1:-1;;14845:18:0;;;14747:124::o;61570:1066::-;61983:291;;;;;;;;61989:8;;-1:-1:-1;;;;;61983:291:0;;;;;61989:8;61999;;;;61983:291;;;;;;62009:8;;;;61983:291;;;;;;;;;;62019:8;;;;61983:291;;;;;;;62029:8;;;;61983:291;;;;;;;;;;62062:13;;61959:669;;61983:291;;;;;62039:37;;62005:1;62039:37;;;;;;;61983:291;;;;;;;;;;;;62105:10;62116:1;62105:13;;;;62078:41;;;;;;;;;;61983:291;;;;;;;;;;62121:8;;;;;-1:-1:-1;;;;;61983:291:0;;;;;62131:8;;;;61983:291;;;;-1:-1:-1;61983:291:0;;;;;-1:-1:-1;61983:291:0;;;;;;62121:5;62183:1;62177:8;;;;-1:-1:-1;;;;;61983:291:0;;;;;62187:18;61983:291;;;;62214:5;62220:1;62214:8;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;61983:291:0;;;;62225:5;62231:1;62225:8;;;;;;;;;61983:291;;;62235:5;62241:1;62235:8;;;;;;;;;61983:291;;;62245:5;62251:1;62245:8;;;;;;;;;61983:291;;;62255:5;62261:1;62255:8;;;;;;;;;61983:291;;;62265:5;62271:1;62265:8;;;;61983:291;;62289:302;;;;;;;;;;62295:5;62301:1;62295:8;;;;;;;;;-1:-1:-1;;;;;62289:302:0;;;;62305:5;62311:1;62305:8;;;;;;;;;-1:-1:-1;;;;;62289:302:0;;;;62315:5;62321:2;62315:9;;;;;;;;;-1:-1:-1;;;;;62289:302:0;;;;62326:5;62332:2;62326:9;;;;;;;;;-1:-1:-1;;;;;62289:302:0;;;;62337:5;62343:2;62337:9;;;;;;;;;-1:-1:-1;;;;;62289:302:0;;;;62371:10;62382:1;62371:13;;;;62348:37;;;;;;;;;;62289:302;;;;;;;;;;;;62414:10;62425:1;62414:13;;;;62387:41;;;;;;;;;;62289:302;;;;;;;;;;62430:9;;;;-1:-1:-1;;;;;62289:302:0;;;;;;;62441:9;;;;62289:302;;;;;;;;;;;;;;;;62490:9;;;;62289:302;;;;;;;;;;;;;62430:9;62535:2;62529:9;;;;;;;;;-1:-1:-1;;;;;62289:302:0;;;62541:8;;;;62289:302;;;;62551:8;;;;62289:302;;;;62561:8;;;;62289:302;;;;62571:8;;;;62289:302;;;;62581:9;;;;-1:-1:-1;62289:302:0;;;;62606:11;61959:9;:669::i;:::-;61570:1066;;;;;;;;;;:::o;21386:41::-;;;;;;;;;;;;;:::o;20694:52::-;;;;;;;;;;;;;;;:::o;54107:728::-;54396:7;54421:26;54450:66;54472:5;54478:1;54472:8;;54450:66;54559:226;;;;;;;;54565:8;;-1:-1:-1;;;;;54559:226:0;;;;;54565:8;54575;;;;54559:226;;;;;;54585:8;;;;54559:226;;;;;;;;;;54595:8;;;;54559:226;;;;;;;;;;-1:-1:-1;54559:226:0;;;;54421:95;;-1:-1:-1;54534:293:0;;54559:226;;;54620:4;54581:1;54559:226;;;;;;;;;;;54626:8;54559:226;;;;;;;;;;54636:8;;;;;-1:-1:-1;;;;;54559:226:0;;;;;;;54646:8;;;;;54559:226;;;;-1:-1:-1;54559:226:0;;;;;;;;;;;;54691:8;;;;54559:226;;;;;;;;;;;;;;54636:8;54731:1;54725:8;;;;;;;;;-1:-1:-1;;;;;54559:226:0;;;;;54736:8;;54559:226;;;;54746:8;;;;54559:226;;;;;;;;54756:8;;;;54559:226;;;;;;;;54766:8;;;54559:226;;;;;;;;54776:8;;;54559:226;;;;;;;;54807:8;;;;54800:16;54742:1;54800:16;;;:6;:16;;;;;54534:10;:293::i;13706:20::-;;;;;;-1:-1:-1;;;;;13706:20:0;;:::o;57302:737::-;57584:26;57690:18;;:::i;:::-;57613:66;57635:5;57641:1;57635:8;;57613:66;57711:226;;;;;;;;57717:8;;-1:-1:-1;;;;;57711:226:0;;;;;57717:8;57727;;;;57711:226;;;;;;57737:8;;;;57711:226;;;;;;;;;;57747:8;;;;57711:226;;;;;;;;;;-1:-1:-1;57711:226:0;;;;57584:95;;-1:-1:-1;57711:226:0;;;57772:4;57733:1;57711:226;;;;;;;;;;;57778:8;57711:226;;;;;;;;;;57788:8;;;;;-1:-1:-1;;;;;57711:226:0;;;;;;;57798:8;;;;;57711:226;;;;-1:-1:-1;57711:226:0;;;;;;;;;;;;57843:8;;;;57711:226;;;;;;;;;;;;;;57788:8;57883:1;57877:8;;;;;;;;;-1:-1:-1;;;;;57711:226:0;;;;;57888:8;;57711:226;;;;57898:8;;;;57711:226;;;;;;;;57908:8;;;;57711:226;;;;;;;;57918:8;;;57711:226;;;;;;;;57928:8;;;57711:226;;;;;;;;58008:11;;;;58001:19;57894:1;58001:19;;;:6;:19;;;;;57690:247;;-1:-1:-1;57955:76:0;;57690:247;;57955:11;:76::i;:::-;57302:737;;;;;;;;;:::o;22107:34::-;;;;:::o;56403:891::-;56687:26;56990:18;;:::i;:::-;56738:8;;;;56747;;;;56756;;;;56771:13;;56716:69;;56738:8;56747;56756;56765:5;;56716:21;:69::i;:::-;56804:8;;;;56687:98;;-1:-1:-1;;;;;;56804:23:0;;;56796:77;;;;;-1:-1:-1;;;;;56796:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56914:25;;56892:20;;:47;56884:95;;;;;-1:-1:-1;;;;;56884:95:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57011:226;;;;;;;;57017:8;;-1:-1:-1;;;;;57011:226:0;;;;;57017:8;57027;;;;57011:226;;;;;;57037:8;;;;57011:226;;;;;;;;;;57047:8;;;;57011:226;;;;;;;;;;-1:-1:-1;57011:226:0;;;;;;;57072:4;57033:1;57011:226;;;;;;;;;;;57078:8;57011:226;;;;;;;;;;57088:8;;;;;-1:-1:-1;;;;;57011:226:0;;;;;;;57098:8;;;;;57011:226;;;;-1:-1:-1;57011:226:0;;;;;;;;;;;;57143:8;;;;57011:226;;;;;;;;;;;;;;57088:8;57183:1;57177:8;;;;;;;;;-1:-1:-1;;;;;57011:226:0;;;57188:8;;57011:226;;;;57198:8;;;;57011:226;;;;;;;;57208:8;;;57011:226;;;;;;;;57218:8;;;57011:226;;;;;;;;57228:8;;;57011:226;;;;;;;;57272:13;;;56990:247;;-1:-1:-1;57255:31:0;;56990:247;;57255:9;:31::i;27983:236::-;15579:8;;-1:-1:-1;;;;;15579:8:0;15565:10;:22;15557:31;;;;;;20541:3;28093:41;;;28085:79;;;;;-1:-1:-1;;;;;28085:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;28175:15;:36;27983:236::o;22265:48::-;22308:5;22265:48;:::o;14999:30::-;;;-1:-1:-1;;;;;14999:30:0;;:::o;20493:51::-;20541:3;20493:51;:::o;36111:133::-;36170:13;36203:28;;;:22;:28;;;;;;:33;;36111:133;;;;:::o;54843:753::-;55146:4;55163:26;55269:18;;:::i;:::-;55192:66;55214:5;55220:1;55214:8;;55192:66;55290:226;;;;;;;;55296:8;;-1:-1:-1;;;;;55290:226:0;;;;;55296:8;55306;;;;55290:226;;;;;;55316:8;;;;55290:226;;;;;;;;;;55326:8;;;;55290:226;;;;;;;;;;-1:-1:-1;55290:226:0;;;;55163:95;;-1:-1:-1;55290:226:0;;;55351:4;55312:1;55290:226;;;;;;;;;;;55357:8;55290:226;;;;;;;;;;55367:8;;;;;-1:-1:-1;;;;;55290:226:0;;;;;;;55377:8;;;;;55290:226;;;;-1:-1:-1;55290:226:0;;;;;;;;;;;;55422:8;;;;55290:226;;;;;;;;;;;;;;55367:8;55462:1;55456:8;;;;;;;;;-1:-1:-1;;;;;55290:226:0;;;55467:8;;55290:226;;;;55477:8;;;55290:226;;;;;;;;55487:8;;;55290:226;;;;;;;;55497:8;;;55290:226;;;;;;;;55507:8;;;55290:226;;;;;55269:247;-1:-1:-1;55534:54:0;55269:247;55534:23;:54::i;21938:39::-;;;;:::o;22334:38::-;;;-1:-1:-1;;;;;22334:38:0;;:::o;15960:264::-;16056:8;;-1:-1:-1;;;;;16056:8:0;16042:10;:22;16034:84;;;;;-1:-1:-1;;;;;16034:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16129:15;:34;;-1:-1:-1;;16129:34:0;-1:-1:-1;;;;;16129:34:0;;;;;;;;;;;16181:35;;16200:15;;;16181:35;;-1:-1:-1;;16181:35:0;15960:264;:::o;14452:192::-;14249:5;;;;;-1:-1:-1;;;;;14249:5:0;14235:10;:19;14227:28;;;;;;-1:-1:-1;;;;;14533:22:0;;;;14525:31;;;;;;14593:5;;;14572:37;;-1:-1:-1;;;;;14572:37:0;;;;14593:5;;;;;;14572:37;;;14620:5;:16;;-1:-1:-1;;;;;14620:16:0;;;;;-1:-1:-1;;14620:16:0;;;;;;;;;14452:192::o;39048:709::-;39152:4;39211:14;39407:13;39228:130;39266:4;:9;;;39277:4;:13;;;39292:4;:14;;;39308:4;:10;;;39320:4;:16;;;39338:4;:19;;;39228:37;:130::i;:::-;39211:147;;39423:124;39461:3;:8;;;39471:3;:12;;;39485:3;:13;;;39500:3;:9;;;39511:3;:15;;;39528:3;:18;;;39423:37;:124::i;:::-;39407:140;-1:-1:-1;39604:21:0;;;;39596:30;;;;;;39683:29;;;;-1:-1:-1;;;;;39683:43:0;;;:66;;39741:8;39683:66;;;-1:-1:-1;39729:9:0;39676:73;-1:-1:-1;;;39048:709:0:o;3042:712::-;3132:4;3174:1;3158:6;:13;:17;3154:570;;;3240:6;3234:13;3298:6;3292:4;3288:17;3280:6;3276:30;3352:4;3344:6;3340:17;3392:5;3415:238;3445:1;3439:3;3429:8;3426:17;3423:24;3415:238;;;3618:15;;3600:34;;3497:4;3483:19;;;;3537:20;3415:238;;;-1:-1:-1;;;3680:18:0;;;;;3201:512;-1:-1:-1;3741:5:0;;3042:712;-1:-1:-1;3042:712:0:o;45740:1198::-;45839:4;;45918:3;:8;;;:38;;;;;;;;;:82;;;;-1:-1:-1;45973:27:0;45960:4;:9;;;:40;;;;;;;;;45918:82;45917:180;;;;;46079:4;:17;;;-1:-1:-1;;;;;46059:37:0;:3;:16;;;-1:-1:-1;;;;;46059:37:0;;45917:180;:295;;;;-1:-1:-1;46160:10:0;;;;-1:-1:-1;;;;;46160:24:0;;;:51;;;46202:3;:9;;;-1:-1:-1;;;;;46188:23:0;:4;:10;;;-1:-1:-1;;;;;46188:23:0;;46160:51;45917:360;;;;-1:-1:-1;46226:9:0;;;;-1:-1:-1;;;;;46226:23:0;;;:50;;;46266:4;:10;;;-1:-1:-1;;;;;46253:23:0;:3;:9;;;-1:-1:-1;;;;;46253:23:0;;46226:50;45917:649;;;;-1:-1:-1;46380:29:0;;;;-1:-1:-1;;;;;46380:43:0;;:89;;;;-1:-1:-1;46427:28:0;;;;-1:-1:-1;;;;;46427:42:0;;;46380:89;46379:186;;;-1:-1:-1;46475:29:0;;;;-1:-1:-1;;;;;46475:43:0;;;;;:89;;-1:-1:-1;46522:28:0;;;;-1:-1:-1;;;;;46522:42:0;;46475:89;45917:735;;;;;46636:4;:15;;;-1:-1:-1;;;;;46618:33:0;:3;:14;;;-1:-1:-1;;;;;46618:33:0;;45917:735;:867;;;;;46715:69;46748:3;:15;;;46765:3;:18;;;46715:32;:69::i;:::-;45917:1002;;;;;46848:71;46881:4;:16;;;46899:4;:19;;;46848:32;:71::i;:::-;45861:1069;45740:1198;-1:-1:-1;;;45740:1198:0:o;52398:1139::-;52583:5;;52936:25;;;;52644:5;52650:1;52644:8;;;;:11;52640:205;;;52680:25;;52672:56;;;;;-1:-1:-1;;;;;52672:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;52750:83;52764:5;52770:1;52764:8;;;;;52773:4;52778:2;52781:10;52792:5;52798:1;52792:8;;;;52801:5;52807:1;52801:8;;;;52810:10;52821:11;52750:13;:83::i;:::-;52743:90;;;;52640:205;52863:8;;;;52873:1;-1:-1:-1;52863:11:0;;;:38;;-1:-1:-1;52876:25:0;;;52863:38;52855:70;;;;;;;-1:-1:-1;;;;;52855:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;52992:8;;;;;-1:-1:-1;53025:5:0;;-1:-1:-1;53041:262:0;53046:12;;53041:262;;53110:1;53100:9;:11;53076:35;;53161:9;53130:30;53143:13;53158:1;53130:12;:30::i;:::-;:40;53126:94;;;53200:4;53191:13;;53126:94;53272:19;;;;;53244:13;-1:-1:-1;53244:13:0;53041:262;;;53318:6;53317:7;53313:59;;;-1:-1:-1;;53341:19:0;;;;53313:59;53410:17;53396:32;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;53396:32:0;-1:-1:-1;53382:46:0;-1:-1:-1;53446:83:0;53460:5;53466:1;53460:8;;53446:83;53439:90;;52398:1139;;;;;;;;;;;;;:::o;38556:263::-;38646:4;38675:136;38713:5;:10;;;38725:5;:14;;;38741:5;:15;;;38758:5;:11;;;38771:5;:17;;;38790:5;:20;;;38675:37;:136::i;:::-;38668:143;38556:263;-1:-1:-1;;38556:263:0:o;673:1829::-;902:10;945;1021:6;827:7;:14;811:5;:12;:30;803:39;;;;;;;;877:11;;861:12;;:27;853:36;;;;;;915:12;;930:4;;915:19;;-1:-1:-1;966:4:0;958:12;;;;-1:-1:-1;915:19:0;;958:12;988;:21;981:29;;;;-1:-1:-1;1049:1:0;1040:475;1056:5;1052:1;:9;1040:475;;;1263:1;1259:9;1253:4;1249:20;;1310:22;;;1304:29;1460:25;;;1454:32;1412:23;;;1406:30;;1439:48;;;1390:14;;1386:51;;;1383:105;1351:138;;1040:475;;;1600:1;1592:5;:9;1588:907;;;1771:5;1767:9;;1855:1;1852;1848:9;1842:4;1838:20;1909:11;1903:4;1899:22;1893:29;2062:11;2053:7;2049:25;2043:32;2032:9;2028:48;2012:11;2005:5;2001:23;1995:30;1983:9;1979:14;1975:51;1972:105;1958:11;1951:5;1947:23;1940:138;1800:293;;;;;-1:-1:-1;2354:5:0;2345:139;2365:5;:12;2361:1;:16;2345:139;;;2457:7;2465:1;2457:10;;;;;;;;;;;;;;;-1:-1:-1;;;2457:10:0;;-1:-1:-1;;;2457:10:0;2447:4;2452:1;2447:7;;;;;;;;;;;;;;;-1:-1:-1;;;2447:7:0;;-1:-1:-1;;;2447:7:0;:20;2434:5;2440:1;2434:8;;;;;;;;;;;;;;;-1:-1:-1;;;2434:8:0;;-1:-1:-1;;;2434:8:0;2416:4;2421:1;2416:7;;;;;;;;;;;;;;;-1:-1:-1;;;2416:7:0;;-1:-1:-1;;;2416:7:0;2426:4;-1:-1:-1;;;2416:14:0;;2415:27;2414:54;2403:5;2409:1;2403:8;;;;;;;;;;;;;;:65;;;;;;;;;;-1:-1:-1;2379:3:0;;2345:139;;;673:1829;;;;;;:::o;8723:136::-;8781:7;8809:5;;;8829:6;;;;8821:15;;;;;;8852:1;8845:8;;8723:136;;;;;;:::o;33374:212::-;33464:7;20418:66;33553:23;33563:5;33570;33553:9;:23::i;:::-;33506:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;33506:71:0;;;;;;33496:82;;33506:71;;;;;;33496:82;;;;33506:71;33496:82;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;;;;365:33;;33496:82:0;;;;;;;;;;;;-1:-1:-1;;;;;;33374:212:0:o;34964:868::-;35059:4;35608:30;35286;35310:5;35286:23;:30::i;:::-;35285:31;35281:76;;;35340:5;35333:12;;;;35281:76;35441:26;;;;:20;:26;;;;;;;;35437:71;;;35491:5;35484:12;;;;35437:71;-1:-1:-1;35641:28:0;;;;:22;:28;;;;;;35684:30;;35680:75;;;35738:5;35731:12;;;;35680:75;35808:11;;;;;-1:-1:-1;;;;;35801:19:0;;;;;:6;:19;;;;;;;35823:1;35801:23;35772:52;;;-1:-1:-1;34964:868:0;;;;;:::o;2689:152::-;2776:4;2831:1;2821:12;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;2821:12:0;;;;;;;;;;;2805;;2821;;-1:-1:-1;2805:12:0;;-1:-1:-1;2821:12:0;;;;-1:-1:-1;2805:12:0;;;;2821;2805;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;;;;365:33;;2805:12:0;;;;;;;;;;:28;;;;;;-1:-1:-1;;;;;;2689:152:0:o;18052:838::-;18216:15;;;18253:8;:31;;;;;;;;;18249:634;;;18308:9;18301:16;;;;18249:634;18351:21;18339:8;:33;;;;;;;;;18335:548;;;18401:108;18414:51;18427:5;18434:30;18447:3;18452:11;18434:12;:30::i;:::-;18414:12;:51::i;:::-;18467:41;18480:14;18496:11;18467:12;:41::i;:::-;18401:12;:108::i;:::-;18389:120;-1:-1:-1;18536:9:0;18528:4;:17;;;;;;;;;18524:348;;;18662:29;18675:9;18686:4;18662:12;:29::i;:::-;18655:36;;;;18524:348;18827:29;18840:9;18851:4;18827:12;:29::i;18524:348::-;18052:838;;;;;;;;;:::o;47210:2943::-;47433:15;13477:14;;47433:15;;;;13477:14;;13473:55;;;13508:8;;;13473:55;13538:14;:21;;-1:-1:-1;;13538:21:0;13555:4;13538:21;;;47463:9;;;;-1:-1:-1;;;;;47463:23:0;47476:10;47463:23;47459:190;;;47511:28;47535:3;47511:23;:28::i;:::-;47503:59;;;;;;;-1:-1:-1;;;;;47503:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;47459:190;;;47605:32;47633:3;47605:27;:32::i;:::-;47595:42;;47459:190;47767:10;;;;-1:-1:-1;;;;;47767:24:0;47781:10;47767:24;47763:195;;;47816:29;47840:4;47816:23;:29::i;:::-;47808:61;;;;;;;-1:-1:-1;;;;;47808:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;47763:195;;;47913:33;47941:4;47913:27;:33::i;:::-;47902:44;;47763:195;48012:25;48027:3;48032:4;48012:14;:25::i;:::-;48004:55;;;;;;;-1:-1:-1;;;;;48004:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;48176:1;48144:3;:22;;;:29;:33;48140:149;;;48194:83;48225:3;:12;;;48239:4;:13;;;48254:3;:22;;;48194:30;:83::i;:::-;48336:1;48303:4;:23;;;:30;:34;48299:151;;;48354:84;48385:4;:13;;;48400:3;:12;;;48414:4;:23;;;48354:30;:84::i;:::-;48468:47;48487:3;:12;;;48501:4;:13;;;48468:18;:47::i;:::-;48460:82;;;;;;;-1:-1:-1;;;;;48460:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;48669:9;;;;-1:-1:-1;;;;;48655:23:0;:10;:23;48651:92;;48695:29;;;;:20;:29;;;;;:36;;-1:-1:-1;;48695:36:0;48727:4;48695:36;;;48651:92;48771:10;;;;-1:-1:-1;;;;;48757:24:0;:10;:24;48753:94;;48798:30;;;;:20;:30;;;;;:37;;-1:-1:-1;;48798:37:0;48831:4;48798:37;;;48753:94;48954:31;48975:3;48980:4;48954:20;:31::i;:::-;49006:23;;49043:13;;;;49006:51;;;;48941:44;;-1:-1:-1;;;;;;49006:23:0;;;;49043:13;;49006:51;;;;;;;;;;:23;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;49006:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48998:86;;;;;;;-1:-1:-1;;;;;48998:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;49271:16;;;;-1:-1:-1;;;;;49271:30:0;;49267:136;;49326:64;49337:3;:16;;;49355:4;:13;;;49370:3;:19;;;49326:10;:64::i;:::-;49318:73;;;;;;;;49477:17;;;;-1:-1:-1;;;;;49477:31:0;;49473:139;;49533:66;49544:4;:17;;;49563:4;:13;;;49578:4;:20;;;49533:10;:66::i;:::-;49525:75;;;;;;;;49804:29;;;;50136:8;;-1:-1:-1;;;;;49804:43:0;;;:68;;49862:4;:10;;;49804:68;;;49850:3;:9;;;49804:68;49721:29;;;;-1:-1:-1;;;;;49661:484:0;;;;49721:43;;;:68;;49780:3;:9;;;49721:68;;;49767:4;:10;;;49721:68;-1:-1:-1;;;;;49661:484:0;;49689:7;49698:8;49928:1;-1:-1:-1;;;;;49887:43:0;:4;:29;;;-1:-1:-1;;;;;49887:43:0;;;:106;;49965:3;:28;;;49887:106;;;49933:4;:29;;;49887:106;50008:29;;;;-1:-1:-1;;;;;50008:43:0;;;:106;;50085:4;:29;;;50008:106;;;50054:3;:28;;;50008:106;49661:484;;;;;;;;;;;;;-1:-1:-1;;;;;49661:484:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;13599:5:0;13582:22;;-1:-1:-1;;13582:22:0;;;-1:-1:-1;;;;47210:2943:0:o;37833:521::-;37977:12;37992:31;38010:5;38017;37992:17;:31::i;:::-;38118:11;;;;37977:46;;-1:-1:-1;;;;;;38104:25:0;:10;:25;38096:34;;;;;;38242:26;;;;:20;:26;;;;;;:33;;-1:-1:-1;;38242:33:0;38271:4;38242:33;;;38326:20;38263:4;;38326:20;;;37833:521;;;:::o;36474:1154::-;36668:11;;;;36730:12;;-1:-1:-1;;;;;36654:25:0;:10;:25;36646:34;;;;;;36770:11;;;;;-1:-1:-1;;;;;36763:19:0;;;;;:6;:19;;;;;;;36745:38;;36756:5;;36745:10;:38::i;:::-;36863:28;;;;:22;:28;;;;;;36730:53;;-1:-1:-1;36863:33:0;36855:67;;;;;-1:-1:-1;;;;;36855:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;37030:6;:19;37037:5;:11;;;-1:-1:-1;;;;;37030:19:0;-1:-1:-1;;;;;37030:19:0;;;;;;;;;;;;;37052:1;37030:23;36999:22;:28;37022:4;36999:28;;;;;;;;;;;;;;;;;:54;;;;37251:5;:30;;;-1:-1:-1;;;;;37182:171:0;37225:5;:11;;;-1:-1:-1;;;;;37182:171:0;37203:4;37182:171;;;;37209:5;:14;;;37238:5;:11;;;37283:5;:10;;;37295:5;:14;;;37311:5;:16;;;37329:5;:13;;;37344:8;37182:171;;;;-1:-1:-1;;;;;37182:171:0;-1:-1:-1;;;;;37182:171:0;;;;;;-1:-1:-1;;;;;37182:171:0;-1:-1:-1;;;;;37182:171:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37182:171:0;;;;;;;-1:-1:-1;37182:171:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37182:171:0;-1:-1:-1;;;37182:171:0;37416:4;37395:214;;;;37422:5;:14;;;37438:5;:24;;;37464:5;:18;;;37484:5;:21;;;37507:5;:18;;;37527:5;:15;;;37544:5;:11;;;37557:5;:17;;;37576:5;:20;;;37598:5;:10;;;37395:214;;;;;;;;;;-1:-1:-1;;;;;37395:214:0;-1:-1:-1;;;;;37395:214:0;;;;;;;;;-1:-1:-1;;;;;37395:214:0;-1:-1:-1;;;;;37395:214:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;37395:214:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37395:214:0;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;37395:214:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37395:214:0;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;37395:214:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36474:1154;;;:::o;34106:636::-;34312:14;;34197:4;;-1:-1:-1;;;;;34312:31:0;34338:4;34312:31;34308:76;;-1:-1:-1;34367:5:0;34360:12;;34308:76;34440:11;;;;-1:-1:-1;;;;;34440:25:0;;34436:70;;;-1:-1:-1;34489:5:0;34482:12;;34436:70;34596:74;34633:5;:14;;;34649:5;:20;;;34596:36;:74::i;:::-;34595:75;34591:120;;;-1:-1:-1;34694:5:0;34687:12;;34591:120;-1:-1:-1;34730:4:0;34106:636;;;:::o;17440:206::-;17541:4;17585:3;17571:11;:17;17570:68;;;;-1:-1:-1;17594:19:0;;;:43;;-1:-1:-1;;17617:3:0;:20;;17440:206;-1:-1:-1;17440:206:0:o;7617:393::-;7675:7;;7903:6;;7899:37;;;7927:1;7920:8;;;;7899:37;-1:-1:-1;7956:5:0;;;7960:1;7956;:5;7976;;;;;;;;:10;7968:19;;;;;31019:2073;31274:15;;;31239:3;31274:15;;;;;;;;;31108:12;;31239:3;31253:18;;31108:12;;31239:3;31274:15;;;17::-1;;105:10;31274:15:0;88:34:-1;136:17;;-1:-1;;31253:36:0;-1:-1:-1;;31365:4:0;31354:16;;31399:53;31354:16;19633:66;31399:29;:53::i;:::-;31391:61;;31471:56;31505:5;31512;:14;;;31471:33;:56::i;:::-;31463:64;;31546:53;31580:5;31587;:11;;;31546:33;:53::i;:::-;31538:61;;31618:53;31652:5;31659;:11;;;31618:33;:53::i;:::-;31610:61;;31690:72;31724:5;31731;:30;;;31690:33;:72::i;:::-;31682:80;;31781:72;31815:5;31822;:30;;;31781:33;:72::i;:::-;31773:80;;31872:57;31904:5;31917;:10;;;31911:17;;;;;;;;31872:31;:57::i;:::-;31864:65;;31948:61;31980:5;31993;:14;;;31987:21;;;;;;;31948:61;31940:69;;32028:58;32062:5;32069;:16;;;32028:33;:58::i;:::-;32020:66;;32105:48;32132:5;32139;:13;;;32105:26;:48::i;:::-;32097:56;;32172:63;32202:5;32219;:14;;;32209:25;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;32209:25:0;;;;;;;;;;;;;;;;32172:29;:63::i;:::-;32164:71;;32254:73;32284:5;32301;:24;;;32291:35;;;;;;;;;;;;;66:2:-1;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;32254:73:0;32246:81;;32346:60;32380:5;32387;:18;;;32346:33;:60::i;:::-;32338:68;;32425:70;32455:5;32472;:21;;;32462:32;;;;;;;;;;;;;66:2:-1;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;32425:70:0;32417:78;;32514:60;32548:5;32555;:18;;;32514:33;:60::i;:::-;32506:68;;32593:50;32620:5;32627;:15;;;32593:26;:50::i;:::-;32585:58;;32662:46;32689:5;32696;:11;;;32662:26;:46::i;:::-;32654:54;;32727:52;32754:5;32761;:17;;;32727:26;:52::i;:::-;32719:60;;32798:55;32825:5;32832;:20;;;32798:26;:55::i;:::-;32790:63;;32872:45;32899:5;32906;:10;;;32872:26;:45::i;:::-;32864:53;;32936:40;32963:5;32970;32936:26;:40::i;:::-;-1:-1:-1;;33040:4:0;33029:16;33019:33;;31019:2073;-1:-1:-1;;;31019:2073:0:o;8519:136::-;8577:7;;8601:6;;;;8593:15;;;;;;-1:-1:-1;;8627:5:0;;;8519:136::o;8125:276::-;8183:7;;8207:5;;;8199:14;;;;;;8294:1;8290;:5;;;;;;;;;8125:276;-1:-1:-1;;;;8125:276:0:o;50161:160::-;50300:11;;;;;-1:-1:-1;;;;;50293:19:0;50241:7;50293:19;;;:6;:19;;;;;;;50268:45;;50286:5;;50268:17;:45::i;39976:5441::-;40071:4;40298:10;40738:18;40839:19;40879:16;40982:23;41032:21;42128:20;42671;43184:16;45063:9;40194:1;-1:-1:-1;;;;;40165:31:0;:4;:17;;;-1:-1:-1;;;;;40165:31:0;;;40161:87;;;40221:9;:14;40213:23;;;;;;40311:30;40331:3;40336:4;40311:19;:30::i;:::-;40298:43;;40531:1;40523:5;:9;:44;;;;-1:-1:-1;40536:17:0;;;;-1:-1:-1;;;;;40536:31:0;;;40523:44;40519:140;;;40584:63;40599:4;:17;;;40618:3;:9;;;40629:4;:10;;;40641:5;40584:14;:63::i;:::-;40759:5;40738:26;;40861:5;40839:27;;40898:71;40911:36;40924:15;;40941:5;40911:12;:36::i;:::-;22308:5;40898:12;:71::i;:::-;40879:90;;41016:4;40982:39;;41068:31;41083:4;:15;;;41068:14;:31::i;:::-;41064:299;;;41160:4;:15;;;-1:-1:-1;;;;;41151:37:0;;41189:3;:11;;;41202:5;41151:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41151:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41151:57:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41151:57:0;;;;;;;;;-1:-1:-1;41151:57:0;-1:-1:-1;41064:299:0;;;41296:18;;41328:15;;;;41276:75;;;;;;-1:-1:-1;;;;;41276:75:0;;;;;;;;;;;;;;;41296:18;;;;;41276:51;;:75;;;;;;;;;;;41296:18;;41276:75;;;5:2:-1;;;;30:1;27;20:12;5:2;41276:75:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41276:75:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41276:75:0;;;;;;;;;-1:-1:-1;41276:75:0;-1:-1:-1;41064:299:0;-1:-1:-1;;;;;41379:32:0;;;;;;:54;;-1:-1:-1;41415:18:0;;;41379:54;41375:392;;;41454:17;;;;-1:-1:-1;;;;;41454:31:0;;41450:306;;;41522:42;41535:13;41550;41522:12;:42::i;:::-;41583:39;;41506:58;;-1:-1:-1;;;;;;41583:24:0;;;:39;;;;;41608:13;;41583:39;;;;41608:13;41583:24;:39;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41583:39:0;41450:306;;;41663:77;41678:4;:17;;;41697:4;:10;;;41709:15;41726:13;41663:14;:77::i;:::-;41849:29;;;;-1:-1:-1;;;;;41849:43:0;;;;;:63;;-1:-1:-1;41896:16:0;;;41849:63;41845:2900;;;42151:82;42164:47;42177:20;;42199:11;42164:12;:47::i;42151:82::-;42252:17;;;;42128:105;;-1:-1:-1;;;;;;42252:31:0;;42248:340;;;42320:44;42333:13;42348:15;42320:12;:44::i;:::-;42383:29;;;;:55;;42304:60;;-1:-1:-1;;;;;;42383:38:0;;:55;;;;;42422:15;;42383:55;;;;42422:15;42383:38;:55;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42383:55:0;42248:340;;;42479:93;42494:4;:17;;;42513:4;:10;;;42525:4;:29;;;42556:15;42479:14;:93::i;:::-;42608:28;;;;-1:-1:-1;;;;;42608:42:0;;42604:564;;42694:82;42707:47;42720:20;;42742:11;42707:12;:47::i;42694:82::-;42799:17;;;;42671:105;;-1:-1:-1;;;;;;42799:31:0;;42795:358;;;42871:44;42884:13;42899:15;42871:12;:44::i;:::-;42938:28;;;;:54;;42855:60;;-1:-1:-1;;;;;;42938:37:0;;:54;;;;;42976:15;;42938:54;;;;42976:15;42938:37;:54;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42938:54:0;42795:358;;;43041:92;43056:4;:17;;;43075:4;:10;;;43087:3;:28;;;43117:15;43041:14;:92::i;:::-;43203:78;43216:43;43229:16;;43247:11;43216:12;:43::i;43203:78::-;43300:17;;;;43184:97;;-1:-1:-1;;;;;;43300:31:0;;43296:310;;;43368:40;43381:13;43396:11;43368:12;:40::i;:::-;43427:20;;:42;;43352:56;;-1:-1:-1;;;;;;43427:20:0;;:42;;;;;43457:11;;43427:20;:42;:20;:42;43457:11;43427:20;:42;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43427:42:0;43296:310;;;43525:17;;;;43544:10;;;;43556:20;;43510:80;;43525:17;43544:10;-1:-1:-1;;;;;43556:20:0;43578:11;43510:14;:80::i;:::-;41845:2900;;;43627:29;;;;-1:-1:-1;;;;;43627:43:0;;43623:1122;;;43877:17;;;;-1:-1:-1;;;;;43877:31:0;;;43869:40;;;;;;43930:16;;43926:808;;43985:82;43998:47;44011:20;;44033:11;43998:12;:47::i;43985:82::-;43967:100;;44086:92;44101:4;:17;;;44120:4;:10;;;44132:3;:28;;;44162:15;44086:14;:92::i;:::-;44203:29;;;;-1:-1:-1;;;;;44203:43:0;;44199:308;;44289:82;44302:47;44315:20;;44337:11;44302:12;:47::i;44289:82::-;44271:100;;44394:93;44409:4;:17;;;44428:4;:10;;;44440:4;:29;;;44471:15;44394:14;:93::i;:::-;44541:78;44554:43;44567:16;;44585:11;44554:12;:43::i;44541:78::-;44653:17;;;;44672:10;;;;44684:20;;44527:92;;-1:-1:-1;44638:80:0;;-1:-1:-1;;;;;44684:20:0;44527:92;44638:14;:80::i;:::-;44761:17;;;;-1:-1:-1;;;;;44761:31:0;;44757:456;;;44888:9;:27;-1:-1:-1;44888:27:0;44880:36;;;;;;44931:4;:10;;;-1:-1:-1;;;;;44931:19:0;:34;44951:13;44931:34;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44931:34:0;45075:39;45088:9;45099:14;45075:12;:39::i;:::-;45063:51;;45140:1;45133:4;:8;45129:73;;;45162:3;:9;;;-1:-1:-1;;;;;45162:18:0;:24;45181:4;45162:24;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45162:24:0;45129:73;-1:-1:-1;45404:5:0;;39976:5441;-1:-1:-1;;;;;;;;;;;39976:5441:0:o;33748:254::-;33845:7;33870:12;33885:24;33896:5;33903;33885:10;:24::i;:::-;33870:39;;33928:26;33942:4;33948:5;33928:13;:26::i;:::-;33920:52;;;;;;;-1:-1:-1;;;;;33920:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;16933:255;17039:4;;17126:8;:31;;;;;;;;;:53;;;-1:-1:-1;;17178:1:0;-1:-1:-1;17161:18:0;16933:255;-1:-1:-1;16933:255:0:o;6197:241::-;6337:21;;6392:4;6381:16;;6197:241::o;29580:223::-;29701:1;29692:6;:10;29688:108;;;29727:18;;:56;;;;;;-1:-1:-1;;;;;29727:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:18;;;;;:31;;:56;;;;;;;;;;;;;;:18;;:56;;;5:2:-1;;;;30:1;27;20:12;5:2;29727:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29727:56:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29727:56:0;29719:65;;;;;;;;29580:223;;;;:::o;26567:981::-;26688:73;;;26739:21;26688:73;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;26688:73:0;;;;;;;25:18:-1;;;61:17;;-1:-1;;;;;182:15;26711:26:0;179:29:-1;160:49;;26794:13:0;;;;;;;;;;;26628:4;;;;26688:73;26668:17;;26628:4;;26794:13;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;26794:13:0;26772:35;;27282:2;27232:6;27136:4;27130:11;27037:2;27031:4;27027:13;26982:1;26926:9;26876:3;26853:476;26842:487;;27355:7;27354:8;27350:53;;;27386:5;27379:12;;;;27350:53;-1:-1:-1;27485:13:0;;;-1:-1:-1;27485:13:0;26567:981;;;;;;;;:::o;50408:12233::-;;;;;;;;;-1:-1:-1;50408:12233:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;50408:12233:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;50408:12233:0;;;;;;;;;;;-1:-1:-1;;;;;50408:12233:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
bzzr://33844ff19818572d40975a7a52f206c4f20c5ea6cfa35bdc44884f44faf6bbd8
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.