Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 14728357 | 915 days ago | IN | 0 ETH | 0.1031988 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
NestBatchPlatform2
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-05-07 */ // Sources flattened with hardhat v2.6.5 https://hardhat.org // File contracts/libs/TransferHelper.sol // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity ^0.8.6; // helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false library TransferHelper { function safeApprove(address token, address to, uint value) internal { // bytes4(keccak256(bytes('approve(address,uint)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED'); } function safeTransfer(address token, address to, uint value) internal { // bytes4(keccak256(bytes('transfer(address,uint)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED'); } function safeTransferFrom(address token, address from, address to, uint value) internal { // bytes4(keccak256(bytes('transferFrom(address,address,uint)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED'); } function safeTransferETH(address to, uint value) internal { (bool success,) = to.call{value:value,gas:5000}(new bytes(0)); require(success, 'TransferHelper: ETH_TRANSFER_FAILED'); } } // File contracts/interfaces/INestBatchPriceView.sol // GPL-3.0-or-later pragma solidity ^0.8.6; /// @dev This contract implemented the mining logic of nest interface INestBatchPriceView { /// @dev Get the latest trigger price /// @param channelId Target channelId /// @param pairIndex Target pairIndex /// @return blockNumber The block number of price /// @return price The token price. (1eth equivalent to (price) token) function triggeredPrice(uint channelId, uint pairIndex) external view returns (uint blockNumber, uint price); /// @dev Get the full information of latest trigger price /// @param channelId Target channelId /// @param pairIndex Target pairIndex /// @return blockNumber The block number of price /// @return price The token price. (1eth equivalent to (price) token) /// @return avgPrice Average price /// @return sigmaSQ The square of the volatility (18 decimal places). The current implementation assumes that /// the volatility cannot exceed 1. Correspondingly, when the return value is equal to 999999999999996447, /// it means that the volatility has exceeded the range that can be expressed function triggeredPriceInfo(uint channelId, uint pairIndex) external view returns ( uint blockNumber, uint price, uint avgPrice, uint sigmaSQ ); /// @dev Find the price at block number /// @param channelId Target channelId /// @param pairIndex Target pairIndex /// @param height Destination block number /// @return blockNumber The block number of price /// @return price The token price. (1eth equivalent to (price) token) function findPrice( uint channelId, uint pairIndex, uint height ) external view returns (uint blockNumber, uint price); /// @dev Get the last (num) effective price /// @param channelId Target channelId /// @param pairIndex Target pairIndex /// @param count The number of prices that want to return /// @return An array which length is num * 2, each two element expresses one price like blockNumber|price function lastPriceList(uint channelId, uint pairIndex, uint count) external view returns (uint[] memory); /// @dev Returns lastPriceList and triggered price info /// @param channelId Target channelId /// @param pairIndex Target pairIndex /// @param count The number of prices that want to return /// @return prices An array which length is num * 2, each two element expresses one price like blockNumber|price /// @return triggeredPriceBlockNumber The block number of triggered price /// @return triggeredPriceValue The token triggered price. (1eth equivalent to (price) token) /// @return triggeredAvgPrice Average price /// @return triggeredSigmaSQ The square of the volatility (18 decimal places). The current implementation /// assumes that the volatility cannot exceed 1. Correspondingly, when the return value is equal to /// 999999999999996447, it means that the volatility has exceeded the range that can be expressed function lastPriceListAndTriggeredPriceInfo(uint channelId, uint pairIndex, uint count) external view returns ( uint[] memory prices, uint triggeredPriceBlockNumber, uint triggeredPriceValue, uint triggeredAvgPrice, uint triggeredSigmaSQ ); } // File contracts/interfaces/INestBatchPrice2.sol // GPL-3.0-or-later pragma solidity ^0.8.6; /// @dev This contract implemented the mining logic of nest interface INestBatchPrice2 { /// @dev Get the latest trigger price /// @param channelId Target channelId /// @param pairIndices Array of pair indices /// @param payback Address to receive refund /// @return prices Price array, i * 2 is the block where the ith price is located, and i * 2 + 1 is the ith price function triggeredPrice( uint channelId, uint[] calldata pairIndices, address payback ) external payable returns (uint[] memory prices); /// @dev Get the full information of latest trigger price /// @param channelId Target channelId /// @param pairIndices Array of pair indices /// @param payback Address to receive refund /// @return prices Price array, i * 4 is the block where the ith price is located, i * 4 + 1 is the ith price, /// i * 4 + 2 is the ith average price and i * 4 + 3 is the ith volatility function triggeredPriceInfo( uint channelId, uint[] calldata pairIndices, address payback ) external payable returns (uint[] memory prices); /// @dev Find the price at block number /// @param channelId Target channelId /// @param pairIndices Array of pair indices /// @param height Destination block number /// @param payback Address to receive refund /// @return prices Price array, i * 2 is the block where the ith price is located, and i * 2 + 1 is the ith price function findPrice( uint channelId, uint[] calldata pairIndices, uint height, address payback ) external payable returns (uint[] memory prices); /// @dev Get the last (num) effective price /// @param channelId Target channelId /// @param pairIndices Array of pair indices /// @param count The number of prices that want to return /// @param payback Address to receive refund /// @return prices Result array, i * count * 2 to (i + 1) * count * 2 - 1 are /// the price results of group i quotation pairs function lastPriceList( uint channelId, uint[] calldata pairIndices, uint count, address payback ) external payable returns (uint[] memory prices); /// @dev Returns lastPriceList and triggered price info /// @param channelId Target channelId /// @param pairIndices Array of pair indices /// @param count The number of prices that want to return /// @param payback Address to receive refund /// @return prices result of group i quotation pair. Among them, the first two count * are the latest prices, /// and the last four are: trigger price block number, trigger price, average price and volatility function lastPriceListAndTriggeredPriceInfo( uint channelId, uint[] calldata pairIndices, uint count, address payback ) external payable returns (uint[] memory prices); } // File contracts/libs/IERC20.sol // MIT pragma solidity ^0.8.6; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File contracts/interfaces/INestBatchMining.sol // GPL-3.0-or-later pragma solidity ^0.8.6; /// @dev This interface defines the mining methods for nest interface INestBatchMining { /// @dev PriceChannel open event /// @param channelId Target channelId /// @param token0 Address of token0, use to mensuration, 0 means eth /// @param unit Unit of token0 /// @param reward Reward token address event Open(uint channelId, address token0, uint unit, address reward); /// @dev Post event /// @param channelId Target channelId /// @param pairIndex Target pairIndex /// @param miner Address of miner /// @param index Index of the price sheet /// @param scale Scale of this post. (Which times of unit) event Post(uint channelId, uint pairIndex, address miner, uint index, uint scale, uint price); /* ========== Structures ========== */ /// @dev Nest mining configuration structure struct Config { // -- Public configuration // The number of times the sheet assets have doubled. 4 uint8 maxBiteNestedLevel; // Price effective block interval. 20 uint16 priceEffectSpan; // The amount of nest to pledge for each post (Unit: 1000). 100 uint16 pledgeNest; } /// @dev PriceSheetView structure struct PriceSheetView { // Index of the price sheet uint32 index; // Address of miner address miner; // The block number of this price sheet packaged uint32 height; // The remain number of this price sheet uint32 remainNum; // The eth number which miner will got uint32 ethNumBal; // The eth number which equivalent to token's value which miner will got uint32 tokenNumBal; // The pledged number of nest in this sheet. (Unit: 1000nest) uint24 nestNum1k; // The level of this sheet. 0 expresses initial price sheet, a value greater than 0 expresses bite price sheet uint8 level; // Post fee shares, if there are many sheets in one block, this value is used to divide up mining value uint8 shares; // The token price. (1eth equivalent to (price) token) uint152 price; } // Price channel configuration struct ChannelConfig { // Reward per block standard uint96 rewardPerBlock; // Post fee(0.0001eth, DIMI_ETHER). 1000 uint16 postFeeUnit; // Single query fee (0.0001 ether, DIMI_ETHER). 100 uint16 singleFee; // Reduction rate(10000 based). 8000 uint16 reductionRate; } /// @dev PricePair view struct PairView { // Target token address address target; // Count of price sheets uint96 sheetCount; } /// @dev Price channel view struct PriceChannelView { uint channelId; // Address of token0, use to mensuration, 0 means eth address token0; // Unit of token0 uint96 unit; // Reward token address address reward; // Reward per block standard uint96 rewardPerBlock; // Reward total uint128 vault; // The information of mining fee uint96 rewards; // Post fee(0.0001eth, DIMI_ETHER). 1000 uint16 postFeeUnit; // Count of price pairs in this channel uint16 count; // Address of opener address opener; // Genesis block of this channel uint32 genesisBlock; // Single query fee (0.0001 ether, DIMI_ETHER). 100 uint16 singleFee; // Reduction rate(10000 based). 8000 uint16 reductionRate; // Price pair array PairView[] pairs; } /* ========== Configuration ========== */ /// @dev Modify configuration /// @param config Configuration object function setConfig(Config calldata config) external; /// @dev Get configuration /// @return Configuration object function getConfig() external view returns (Config memory); /// @dev Open price channel /// @param token0 Address of token0, use to mensuration, 0 means eth /// @param unit Unit of token0 /// @param reward Reward token address /// @param tokens Target tokens /// @param config Channel configuration function open( address token0, uint96 unit, address reward, address[] calldata tokens, ChannelConfig calldata config ) external; /// @dev Modify channel configuration /// @param channelId Target channelId /// @param config Channel configuration function modify(uint channelId, ChannelConfig calldata config) external; /// @dev Increase vault to channel /// @param channelId Target channelId /// @param vault Total to increase function increase(uint channelId, uint128 vault) external payable; /// @dev Decrease vault from channel /// @param channelId Target channelId /// @param vault Total to decrease function decrease(uint channelId, uint128 vault) external; /// @dev Get channel information /// @param channelId Target channelId /// @return Information of channel function getChannelInfo(uint channelId) external view returns (PriceChannelView memory); /// @dev Post price /// @param channelId Target channelId /// @param scale Scale of this post. (Which times of unit) /// @param equivalents Price array, one to one with pairs function post(uint channelId, uint scale, uint[] calldata equivalents) external payable; /// @notice Call the function to buy TOKEN/NTOKEN from a posted price sheet /// @dev bite TOKEN(NTOKEN) by ETH, (+ethNumBal, -tokenNumBal) /// @param channelId Target price channelId /// @param pairIndex Target pairIndex. When take token0, use pairIndex direct, or add 65536 conversely /// @param index The position of the sheet in priceSheetList[token] /// @param takeNum The amount of biting (in the unit of ETH), realAmount = takeNum * newTokenAmountPerEth /// @param newEquivalent The new price of token (1 ETH : some TOKEN), here some means newTokenAmountPerEth function take(uint channelId, uint pairIndex, uint index, uint takeNum, uint newEquivalent) external payable; /// @dev List sheets by page /// @param channelId Target channelId /// @param pairIndex Target pairIndex /// @param offset Skip previous (offset) records /// @param count Return (count) records /// @param order Order. 0 reverse order, non-0 positive order /// @return List of price sheets function list( uint channelId, uint pairIndex, uint offset, uint count, uint order ) external view returns (PriceSheetView[] memory); /// @notice Close a batch of price sheets passed VERIFICATION-PHASE /// @dev Empty sheets but in VERIFICATION-PHASE aren't allowed /// @param channelId Target channelId /// @param indices Two-dimensional array of sheet indices, first means pair indices, seconds means sheet indices function close(uint channelId, uint[][] calldata indices) external; /// @dev View the number of assets specified by the user /// @param tokenAddress Destination token address /// @param addr Destination address /// @return Number of assets function balanceOf(address tokenAddress, address addr) external view returns (uint); /// @dev Withdraw assets /// @param tokenAddress Destination token address /// @param value The value to withdraw function withdraw(address tokenAddress, uint value) external; /// @dev Estimated mining amount /// @param channelId Target channelId /// @return Estimated mining amount function estimate(uint channelId) external view returns (uint); /// @dev Query the quantity of the target quotation /// @param channelId Target channelId /// @param index The index of the sheet /// @return minedBlocks Mined block period from previous block /// @return totalShares Total shares of sheets in the block function getMinedBlocks( uint channelId, uint index ) external view returns (uint minedBlocks, uint totalShares); /// @dev The function returns eth rewards of specified ntoken /// @param channelId Target channelId function totalETHRewards(uint channelId) external view returns (uint); /// @dev Pay /// @param channelId Target channelId /// @param to Address to receive /// @param value Amount to receive function pay(uint channelId, address to, uint value) external; /// @dev Donate to dao /// @param channelId Target channelId /// @param value Amount to receive function donate(uint channelId, uint value) external; } // File contracts/interfaces/INestLedger.sol // GPL-3.0-or-later pragma solidity ^0.8.6; /// @dev This interface defines the nest ledger methods interface INestLedger { /// @dev Application Flag Changed event /// @param addr DAO application contract address /// @param flag Authorization flag, 1 means authorization, 0 means cancel authorization event ApplicationChanged(address addr, uint flag); /// @dev Set DAO application /// @param addr DAO application contract address /// @param flag Authorization flag, 1 means authorization, 0 means cancel authorization function setApplication(address addr, uint flag) external; /// @dev Check DAO application flag /// @param addr DAO application contract address /// @return Authorization flag, 1 means authorization, 0 means cancel authorization function checkApplication(address addr) external view returns (uint); /// @dev Add reward /// @param channelId Target channelId function addETHReward(uint channelId) external payable; /// @dev The function returns eth rewards of specified ntoken /// @param channelId Target channelId function totalETHRewards(uint channelId) external view returns (uint); /// @dev Pay /// @param channelId Target channelId /// @param tokenAddress Token address of receiving funds (0 means ETH) /// @param to Address to receive /// @param value Amount to receive function pay(uint channelId, address tokenAddress, address to, uint value) external; } // File contracts/interfaces/INToken.sol // GPL-3.0-or-later pragma solidity ^0.8.6; /// @dev ntoken interface interface INToken { event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); /// @dev Mint /// @param value The amount of NToken to add function increaseTotal(uint256 value) external; /// @notice The view of variables about minting /// @dev The naming follows nest v3.0 /// @return createBlock The block number where the contract was created /// @return recentlyUsedBlock The block number where the last minting went function checkBlockInfo() external view returns(uint256 createBlock, uint256 recentlyUsedBlock); /// @dev The ABI keeps unchanged with old NTokens, so as to support token-and-ntoken-mining /// @return The address of bidder function checkBidder() external view returns(address); /// @notice The view of totalSupply /// @return The total supply of ntoken function totalSupply() external view returns (uint256); /// @dev The view of balances /// @param owner The address of an account /// @return The balance of the account function balanceOf(address owner) 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); } // File contracts/custom/ChainConfig.sol // GPL-3.0-or-later pragma solidity ^0.8.6; /// @dev Base contract of nest contract ChainConfig { // ******** Ethereum ******** // // Ethereum average block time interval, 14000 milliseconds uint constant ETHEREUM_BLOCK_TIMESPAN = 14000; // Nest ore drawing attenuation interval. 2400000 blocks, about one year uint constant NEST_REDUCTION_SPAN = 2400000; // The decay limit of nest ore drawing becomes stable after exceeding this interval. // 24 million blocks, about 10 years uint constant NEST_REDUCTION_LIMIT = 24000000; //NEST_REDUCTION_SPAN * 10; // Attenuation gradient array, each attenuation step value occupies 16 bits. The attenuation value is an integer uint constant NEST_REDUCTION_STEPS = 0x280035004300530068008300A300CC010001400190; // 0 // | (uint(400 / uint(1)) << (16 * 0)) // | (uint(400 * 8 / uint(10)) << (16 * 1)) // | (uint(400 * 8 * 8 / uint(10 * 10)) << (16 * 2)) // | (uint(400 * 8 * 8 * 8 / uint(10 * 10 * 10)) << (16 * 3)) // | (uint(400 * 8 * 8 * 8 * 8 / uint(10 * 10 * 10 * 10)) << (16 * 4)) // | (uint(400 * 8 * 8 * 8 * 8 * 8 / uint(10 * 10 * 10 * 10 * 10)) << (16 * 5)) // | (uint(400 * 8 * 8 * 8 * 8 * 8 * 8 / uint(10 * 10 * 10 * 10 * 10 * 10)) << (16 * 6)) // | (uint(400 * 8 * 8 * 8 * 8 * 8 * 8 * 8 / uint(10 * 10 * 10 * 10 * 10 * 10 * 10)) << (16 * 7)) // | (uint(400 * 8 * 8 * 8 * 8 * 8 * 8 * 8 * 8 / uint(10 * 10 * 10 * 10 * 10 * 10 * 10 * 10)) << (16 * 8)) // | (uint(400 * 8 * 8 * 8 * 8 * 8 * 8 * 8 * 8 * 8 / uint(10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10)) << (16 * 9)) // //| (uint(400 * 8 * 8 * 8 * 8 * 8 * 8 * 8 * 8 * 8 * 8 / uint(10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10)) << (16 * 10)); // | (uint(40) << (16 * 10)); // ******** BSC ******** // // // Ethereum average block time interval, 3000 milliseconds // uint constant ETHEREUM_BLOCK_TIMESPAN = 3000; // // Nest ore drawing attenuation interval. 2400000 blocks, about one year // uint constant NEST_REDUCTION_SPAN = 10000000; // // The decay limit of nest ore drawing becomes stable after exceeding this interval. // // 24 million blocks, about 10 years // uint constant NEST_REDUCTION_LIMIT = 100000000; //NEST_REDUCTION_SPAN * 10; // // Attenuation gradient array, each attenuation step value occupies 16 bits. The attenuation value is an integer // uint constant NEST_REDUCTION_STEPS = 0x280035004300530068008300A300CC010001400190; // // 0 // // | (uint(400 / uint(1)) << (16 * 0)) // // | (uint(400 * 8 / uint(10)) << (16 * 1)) // // | (uint(400 * 8 * 8 / uint(10 * 10)) << (16 * 2)) // // | (uint(400 * 8 * 8 * 8 / uint(10 * 10 * 10)) << (16 * 3)) // // | (uint(400 * 8 * 8 * 8 * 8 / uint(10 * 10 * 10 * 10)) << (16 * 4)) // // | (uint(400 * 8 * 8 * 8 * 8 * 8 / uint(10 * 10 * 10 * 10 * 10)) << (16 * 5)) // // | (uint(400 * 8 * 8 * 8 * 8 * 8 * 8 / uint(10 * 10 * 10 * 10 * 10 * 10)) << (16 * 6)) // // | (uint(400 * 8 * 8 * 8 * 8 * 8 * 8 * 8 / uint(10 * 10 * 10 * 10 * 10 * 10 * 10)) << (16 * 7)) // // | (uint(400 * 8 * 8 * 8 * 8 * 8 * 8 * 8 * 8 / uint(10 * 10 * 10 * 10 * 10 * 10 * 10 * 10)) << (16 * 8)) // // | (uint(400 * 8 * 8 * 8 * 8 * 8 * 8 * 8 * 8 * 8 / uint(10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10)) << (16 * 9)) // // //| (uint(400 * 8 * 8 * 8 * 8 * 8 * 8 * 8 * 8 * 8 * 8 / uint(10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10)) << (16 * 10)); // // | (uint(40) << (16 * 10)); // ******** Ploygon ******** // // // Ethereum average block time interval, 2200 milliseconds // uint constant ETHEREUM_BLOCK_TIMESPAN = 2200; // // Nest ore drawing attenuation interval. 2400000 blocks, about one year // uint constant NEST_REDUCTION_SPAN = 15000000; // // The decay limit of nest ore drawing becomes stable after exceeding this interval. // // 24 million blocks, about 10 years // uint constant NEST_REDUCTION_LIMIT = 150000000; //NEST_REDUCTION_SPAN * 10; // // Attenuation gradient array, each attenuation step value occupies 16 bits. The attenuation value is an integer // uint constant NEST_REDUCTION_STEPS = 0x280035004300530068008300A300CC010001400190; // // 0 // // | (uint(400 / uint(1)) << (16 * 0)) // // | (uint(400 * 8 / uint(10)) << (16 * 1)) // // | (uint(400 * 8 * 8 / uint(10 * 10)) << (16 * 2)) // // | (uint(400 * 8 * 8 * 8 / uint(10 * 10 * 10)) << (16 * 3)) // // | (uint(400 * 8 * 8 * 8 * 8 / uint(10 * 10 * 10 * 10)) << (16 * 4)) // // | (uint(400 * 8 * 8 * 8 * 8 * 8 / uint(10 * 10 * 10 * 10 * 10)) << (16 * 5)) // // | (uint(400 * 8 * 8 * 8 * 8 * 8 * 8 / uint(10 * 10 * 10 * 10 * 10 * 10)) << (16 * 6)) // // | (uint(400 * 8 * 8 * 8 * 8 * 8 * 8 * 8 / uint(10 * 10 * 10 * 10 * 10 * 10 * 10)) << (16 * 7)) // // | (uint(400 * 8 * 8 * 8 * 8 * 8 * 8 * 8 * 8 / uint(10 * 10 * 10 * 10 * 10 * 10 * 10 * 10)) << (16 * 8)) // // | (uint(400 * 8 * 8 * 8 * 8 * 8 * 8 * 8 * 8 * 8 / uint(10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10)) << (16 * 9)) // // //| (uint(400 * 8 * 8 * 8 * 8 * 8 * 8 * 8 * 8 * 8 * 8 / uint(10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10)) << (16 * 10)); // | (uint(40) << (16 * 10)); } // File contracts/interfaces/INestMapping.sol // GPL-3.0-or-later pragma solidity ^0.8.6; /// @dev The interface defines methods for nest builtin contract address mapping interface INestMapping { /// @dev Set the built-in contract address of the system /// @param nestTokenAddress Address of nest token contract /// @param nestNodeAddress Address of nest node contract /// @param nestLedgerAddress INestLedger implementation contract address /// @param nestMiningAddress INestMining implementation contract address for nest /// @param ntokenMiningAddress INestMining implementation contract address for ntoken /// @param nestPriceFacadeAddress INestPriceFacade implementation contract address /// @param nestVoteAddress INestVote implementation contract address /// @param nestQueryAddress INestQuery implementation contract address /// @param nnIncomeAddress NNIncome contract address /// @param nTokenControllerAddress INTokenController implementation contract address function setBuiltinAddress( address nestTokenAddress, address nestNodeAddress, address nestLedgerAddress, address nestMiningAddress, address ntokenMiningAddress, address nestPriceFacadeAddress, address nestVoteAddress, address nestQueryAddress, address nnIncomeAddress, address nTokenControllerAddress ) external; /// @dev Get the built-in contract address of the system /// @return nestTokenAddress Address of nest token contract /// @return nestNodeAddress Address of nest node contract /// @return nestLedgerAddress INestLedger implementation contract address /// @return nestMiningAddress INestMining implementation contract address for nest /// @return ntokenMiningAddress INestMining implementation contract address for ntoken /// @return nestPriceFacadeAddress INestPriceFacade implementation contract address /// @return nestVoteAddress INestVote implementation contract address /// @return nestQueryAddress INestQuery implementation contract address /// @return nnIncomeAddress NNIncome contract address /// @return nTokenControllerAddress INTokenController implementation contract address function getBuiltinAddress() external view returns ( address nestTokenAddress, address nestNodeAddress, address nestLedgerAddress, address nestMiningAddress, address ntokenMiningAddress, address nestPriceFacadeAddress, address nestVoteAddress, address nestQueryAddress, address nnIncomeAddress, address nTokenControllerAddress ); /// @dev Get address of nest token contract /// @return Address of nest token contract function getNestTokenAddress() external view returns (address); /// @dev Get address of nest node contract /// @return Address of nest node contract function getNestNodeAddress() external view returns (address); /// @dev Get INestLedger implementation contract address /// @return INestLedger implementation contract address function getNestLedgerAddress() external view returns (address); /// @dev Get INestMining implementation contract address for nest /// @return INestMining implementation contract address for nest function getNestMiningAddress() external view returns (address); /// @dev Get INestMining implementation contract address for ntoken /// @return INestMining implementation contract address for ntoken function getNTokenMiningAddress() external view returns (address); /// @dev Get INestPriceFacade implementation contract address /// @return INestPriceFacade implementation contract address function getNestPriceFacadeAddress() external view returns (address); /// @dev Get INestVote implementation contract address /// @return INestVote implementation contract address function getNestVoteAddress() external view returns (address); /// @dev Get INestQuery implementation contract address /// @return INestQuery implementation contract address function getNestQueryAddress() external view returns (address); /// @dev Get NNIncome contract address /// @return NNIncome contract address function getNnIncomeAddress() external view returns (address); /// @dev Get INTokenController implementation contract address /// @return INTokenController implementation contract address function getNTokenControllerAddress() external view returns (address); /// @dev Registered address. The address registered here is the address accepted by nest system /// @param key The key /// @param addr Destination address. 0 means to delete the registration information function registerAddress(string memory key, address addr) external; /// @dev Get registered address /// @param key The key /// @return Destination address. 0 means empty function checkAddress(string memory key) external view returns (address); } // File contracts/interfaces/INestGovernance.sol // GPL-3.0-or-later pragma solidity ^0.8.6; /// @dev This interface defines the governance methods interface INestGovernance is INestMapping { /// @dev Set governance authority /// @param addr Destination address /// @param flag Weight. 0 means to delete the governance permission of the target address. Weight is not /// implemented in the current system, only the difference between authorized and unauthorized. /// Here, a uint96 is used to represent the weight, which is only reserved for expansion function setGovernance(address addr, uint flag) external; /// @dev Get governance rights /// @param addr Destination address /// @return Weight. 0 means to delete the governance permission of the target address. Weight is not /// implemented in the current system, only the difference between authorized and unauthorized. /// Here, a uint96 is used to represent the weight, which is only reserved for expansion function getGovernance(address addr) external view returns (uint); /// @dev Check whether the target address has governance rights for the given target /// @param addr Destination address /// @param flag Permission weight. The permission of the target address must be greater than this weight /// to pass the check /// @return True indicates permission function checkGovernance(address addr, uint flag) external view returns (bool); } // File contracts/NestBase.sol // GPL-3.0-or-later pragma solidity ^0.8.6; /// @dev Base contract of nest contract NestBase { /// @dev INestGovernance implementation contract address address public _governance; /// @dev To support open-zeppelin/upgrades /// @param governance INestGovernance implementation contract address function initialize(address governance) public virtual { require(_governance == address(0), "NEST:!initialize"); _governance = governance; } /// @dev Rewritten in the implementation contract, for load other contract addresses. Call /// super.update(newGovernance) when overriding, and override method without onlyGovernance /// @param newGovernance INestGovernance implementation contract address function update(address newGovernance) public virtual { address governance = _governance; require(governance == msg.sender || INestGovernance(governance).checkGovernance(msg.sender, 0), "NEST:!gov"); _governance = newGovernance; } //---------modifier------------ modifier onlyGovernance() { require(INestGovernance(_governance).checkGovernance(msg.sender, 0), "NEST:!gov"); _; } modifier noContract() { require(msg.sender == tx.origin, "NEST:!contract"); _; } } // File contracts/custom/NestFrequentlyUsed.sol // GPL-3.0-or-later pragma solidity ^0.8.6; /// @dev Base contract of nest contract NestFrequentlyUsed is NestBase { // Address of nest token contract address constant NEST_TOKEN_ADDRESS = 0x04abEdA201850aC0124161F037Efd70c74ddC74C; // Genesis block number of nest // NEST token contract is created at block height 6913517. However, because the mining algorithm of nest1.0 // is different from that at present, a new mining algorithm is adopted from nest2.0. The new algorithm // includes the attenuation logic according to the block. Therefore, it is necessary to trace the block // where the nest begins to decay. According to the circulation when nest2.0 is online, the new mining // algorithm is used to deduce and convert the nest, and the new algorithm is used to mine the nest2.0 // on-line flow, the actual block is 5120000 //uint constant NEST_GENESIS_BLOCK = 0; // /// @dev Rewritten in the implementation contract, for load other contract addresses. Call // /// super.update(newGovernance) when overriding, and override method without onlyGovernance // /// @param newGovernance IHedgeGovernance implementation contract address // function update(address newGovernance) public virtual override { // super.update(newGovernance); // NEST_TOKEN_ADDRESS = INestGovernance(newGovernance).getNestTokenAddress(); // } } // File contracts/NestBatchMining.sol // GPL-3.0-or-later pragma solidity ^0.8.6; /// @dev This contract implemented the mining logic of nest contract NestBatchMining is ChainConfig, NestFrequentlyUsed, INestBatchMining { /// @dev To support open-zeppelin/upgrades /// @param governance INestGovernance implementation contract address function initialize(address governance) public override { super.initialize(governance); // Placeholder in _accounts, the index of a real account must greater than 0 _accounts.push(); } /// @dev Definitions for the price sheet, include the full information. /// (use 256-bits, a storage unit in ethereum evm) struct PriceSheet { // Index of miner account in _accounts. for this way, mapping an address(which need 160-bits) to a 32-bits // integer, support 4 billion accounts uint32 miner; // The block number of this price sheet packaged uint32 height; // The remain number of this price sheet uint32 remainNum; // The eth number which miner will got uint32 ethNumBal; // The eth number which equivalent to token's value which miner will got uint32 tokenNumBal; // The pledged number of nest in this sheet. (Unit: 1000nest) uint24 nestNum1k; // The level of this sheet. 0 expresses initial price sheet, a value greater than 0 expresses bite price sheet uint8 level; // Post fee shares, if there are many sheets in one block, this value is used to divide up mining value uint8 shares; // Represent price as this way, may lose precision, the error less than 1/10^14 // price = priceFraction * 16 ^ priceExponent uint56 priceFloat; } /// @dev Definitions for the price information struct PriceInfo { // Record the index of price sheet, for update price information from price sheet next time. uint32 index; // The block number of this price uint32 height; // The remain number of this price sheet uint32 remainNum; // Price, represent as float // Represent price as this way, may lose precision, the error less than 1/10^14 uint56 priceFloat; // Avg Price, represent as float // Represent price as this way, may lose precision, the error less than 1/10^14 uint56 avgFloat; // Square of price volatility, need divide by 2^48 uint48 sigmaSQ; } // Price pair structure struct PricePair { address target; PriceInfo price; PriceSheet[] sheets; } /// @dev Price channel struct PriceChannel { // Address of token0, use to mensuration, 0 means eth address token0; // Unit of token0 uint96 unit; // Reward token address address reward; // Reward per block standard uint96 rewardPerBlock; // Reward total uint128 vault; // The information of mining fee uint96 rewards; // Post fee(0.0001eth, DIMI_ETHER). 1000 uint16 postFeeUnit; // Count of price pairs in this channel uint16 count; // Address of opener address opener; // Genesis block of this channel uint32 genesisBlock; // Single query fee (0.0001 ether, DIMI_ETHER). 100 uint16 singleFee; // Reduction rate(10000 based). 8000 uint16 reductionRate; // Price pair array PricePair[0xFFFF] pairs; } /// @dev Structure is used to represent a storage location. Storage variable can be used to avoid indexing /// from mapping many times struct UINT { uint value; } /// @dev Account information struct Account { // Address of account address addr; // Balances of mining account // tokenAddress=>balance mapping(address=>UINT) balances; } // Configuration Config _config; // Registered account information Account[] _accounts; // Mapping from address to index of account. address=>accountIndex mapping(address=>uint) _accountMapping; // Price channels PriceChannel[] _channels; // Unit of post fee. 0.0001 ether uint constant DIMI_ETHER = 0.0001 ether; /* ========== Governance ========== */ /// @dev Modify configuration /// @param config Configuration object function setConfig(Config calldata config) external override onlyGovernance { _config = config; } /// @dev Get configuration /// @return Configuration object function getConfig() external view override returns (Config memory) { return _config; } /// @dev Open price channel /// @param token0 Address of token0, use to mensuration, 0 means eth /// @param unit Unit of token0 /// @param reward Reward token address /// @param tokens Target tokens /// @param config Channel configuration function open( address token0, uint96 unit, address reward, address[] calldata tokens, ChannelConfig calldata config ) external override { // Emit open event emit Open(_channels.length, token0, unit, reward); PriceChannel storage channel = _channels.push(); // Address of token0 channel.token0 = token0; // Unit of token0 channel.unit = unit; // Address of reward channel.reward = reward; channel.vault = uint128(0); channel.rewards = uint96(0); channel.count = uint16(tokens.length); // Address of opener channel.opener = msg.sender; // Genesis block of this channel channel.genesisBlock = uint32(block.number); // Create price pairs for (uint i = 0; i < tokens.length; ++i) { require(token0 != tokens[i], "NOM:token can't equal token0"); for (uint j = 0; j < i; ++j) { require(tokens[i] != tokens[j], "NOM:token reiterated"); } channel.pairs[i].target = tokens[i]; } _modify(channel, config); } /// @dev Modify channel configuration /// @param channelId Target channelId /// @param config Channel configuration function modify(uint channelId, ChannelConfig calldata config) external override { PriceChannel storage channel = _channels[channelId]; require(channel.opener == msg.sender, "NOM:not opener"); _modify(channel, config); } /// @dev Modify channel configuration /// @param channel Target channel /// @param config Channel configuration function _modify(PriceChannel storage channel, ChannelConfig calldata config) private { // Reward per block standard channel.rewardPerBlock = config.rewardPerBlock; // Post fee(0.0001eth, DIMI_ETHER). 1000 channel.postFeeUnit = config.postFeeUnit; // Single query fee (0.0001 ether, DIMI_ETHER). 100 channel.singleFee = config.singleFee; // Reduction rate(10000 based). 8000 channel.reductionRate = config.reductionRate; } /// @dev Add price token, make a pair with token0. (Not support remove, be careful!) /// @param channelId Target channelId /// @param target Target token address function addPair(uint channelId, address target) external { PriceChannel storage channel = _channels[channelId]; require(channel.opener == msg.sender, "NOM:not opener"); require(channel.token0 != target, "NOM:token can't equal token0"); uint count = uint(channel.count); for (uint j = 0; j < count; ++j) { require(channel.pairs[j].target != target, "NOM:token reiterated"); } channel.pairs[count].target = target; ++channel.count; } /// @dev Increase vault to channel /// @param channelId Target channelId /// @param vault Total to increase function increase(uint channelId, uint128 vault) external payable override { PriceChannel storage channel = _channels[channelId]; address reward = channel.reward; if (reward == address(0)) { require(msg.value == uint(vault), "NOM:vault error"); } else { TransferHelper.safeTransferFrom(reward, msg.sender, address(this), uint(vault)); } channel.vault += vault; } /// @dev Decrease vault from channel /// @param channelId Target channelId /// @param vault Total to decrease function decrease(uint channelId, uint128 vault) external override { PriceChannel storage channel = _channels[channelId]; require(channel.opener == msg.sender, "NOM:not opener"); address reward = channel.reward; channel.vault -= vault; if (reward == address(0)) { payable(msg.sender).transfer(uint(vault)); } else { TransferHelper.safeTransfer(reward, msg.sender, uint(vault)); } } /// @dev Change opener /// @param channelId Target channelId /// @param newOpener New opener address function changeOpener(uint channelId, address newOpener) external { PriceChannel storage channel = _channels[channelId]; require(channel.opener == msg.sender, "NOM:not opener"); channel.opener = newOpener; } /// @dev Get channel information /// @param channelId Target channelId /// @return Information of channel function getChannelInfo(uint channelId) external view override returns (PriceChannelView memory) { PriceChannel storage channel = _channels[channelId]; uint count = uint(channel.count); PairView[] memory pairs = new PairView[](count); for (uint i = 0; i < count; ++i) { PricePair storage pair = channel.pairs[i]; pairs[i] = PairView(pair.target, uint96(pair.sheets.length)); } return PriceChannelView ( channelId, // Address of token0, use to mensuration, 0 means eth channel.token0, // Unit of token0 channel.unit, // Reward token address channel.reward, // Reward per block standard channel.rewardPerBlock, // Reward total channel.vault, // The information of mining fee channel.rewards, // Post fee(0.0001eth, DIMI_ETHER). 1000 channel.postFeeUnit, // Count of price pairs in this channel channel.count, // Address of opener channel.opener, // Genesis block of this channel channel.genesisBlock, // Single query fee (0.0001 ether, DIMI_ETHER). 100 channel.singleFee, // Reduction rate(10000 based). 8000 channel.reductionRate, pairs ); } /* ========== Mining ========== */ /// @dev Post price /// @param channelId Target channelId /// @param scale Scale of this post. (Which times of unit) /// @param equivalents Price array, one to one with pairs function post(uint channelId, uint scale, uint[] calldata equivalents) external payable override { // 0. Load config Config memory config = _config; // 1. Check arguments require(scale == 1, "NOM:!scale"); // 2. Load price channel PriceChannel storage channel = _channels[channelId]; // 3. Freeze assets uint accountIndex = _addressIndex(msg.sender); // Freeze token and nest // Because of the use of floating-point representation(fraction * 16 ^ exponent), it may bring some precision // loss After assets are frozen according to tokenAmountPerEth * ethNum, the part with poor accuracy may be // lost when the assets are returned, It should be frozen according to decodeFloat(fraction, exponent) * ethNum // However, considering that the loss is less than 1 / 10 ^ 14, the loss here is ignored, and the part of // precision loss can be transferred out as system income in the future mapping(address=>UINT) storage balances = _accounts[accountIndex].balances; uint cn = uint(channel.count); uint fee = msg.value; // Freeze nest fee = _freeze(balances, NEST_TOKEN_ADDRESS, cn * uint(config.pledgeNest) * 1000 ether, fee); // Freeze token0 fee = _freeze(balances, channel.token0, cn * uint(channel.unit) * scale, fee); // Freeze token1 while (cn > 0) { PricePair storage pair = channel.pairs[--cn]; uint equivalent = equivalents[cn]; require(equivalent > 0, "NOM:!equivalent"); fee = _freeze(balances, pair.target, scale * equivalent, fee); // Calculate the price // According to the current mechanism, the newly added sheet cannot take effect, so the calculated price // is placed before the sheet is added, which can reduce unnecessary traversal _stat(config, pair); // 6. Create token price sheet emit Post(channelId, cn, msg.sender, pair.sheets.length, scale, equivalent); // Only pairIndex 0 has reward _create(pair.sheets, accountIndex, uint32(scale), uint(config.pledgeNest), cn == 0 ? 1 : 0, equivalent); } // // 4. Deposit fee // // Only postFeeUnit > 0 need fee // uint postFeeUnit = uint(channel.postFeeUnit); // if (postFeeUnit > 0) { // require(fee >= postFeeUnit * DIMI_ETHER + tx.gasprice * 400000, "NM:!fee"); // } // if (fee > 0) { // channel.rewards += _toUInt96(fee); // } } /// @notice Call the function to buy TOKEN/NTOKEN from a posted price sheet /// @dev bite TOKEN(NTOKEN) by ETH, (+ethNumBal, -tokenNumBal) /// @param channelId Target price channelId /// @param pairIndex Target pairIndex. When take token0, use pairIndex direct, or add 65536 conversely /// @param index The position of the sheet in priceSheetList[token] /// @param takeNum The amount of biting (in the unit of ETH), realAmount = takeNum * newTokenAmountPerEth /// @param newEquivalent The new price of token (1 ETH : some TOKEN), here some means newTokenAmountPerEth function take( uint channelId, uint pairIndex, uint index, uint takeNum, uint newEquivalent ) external payable override { Config memory config = _config; // 1. Check arguments require(takeNum > 0, "NM:!takeNum"); require(newEquivalent > 0, "NM:!price"); // 2. Load price sheet PriceChannel storage channel = _channels[channelId]; PricePair storage pair = channel.pairs[pairIndex < 0x10000 ? pairIndex : pairIndex - 0x10000]; PriceSheet memory sheet = pair.sheets[index]; // 3. Check state require(uint(sheet.height) + uint(config.priceEffectSpan) >= block.number, "NM:!state"); sheet.remainNum = uint32(uint(sheet.remainNum) - takeNum); uint accountIndex = _addressIndex(msg.sender); // Number of nest to be pledged // sheet.ethNumBal + sheet.tokenNumBal is always two times to sheet.ethNum uint needNest1k = (takeNum << 2) * uint(sheet.nestNum1k) / (uint(sheet.ethNumBal) + uint(sheet.tokenNumBal)); // 4. Calculate the number of eth, token and nest needed, and freeze them uint needEthNum = takeNum; uint level = uint(sheet.level); if (level < 255) { if (level < uint(config.maxBiteNestedLevel)) { // Double scale sheet needEthNum <<= 1; } ++level; } { // Freeze nest and token // Freeze assets: token0, token1, nest mapping(address=>UINT) storage balances = _accounts[accountIndex].balances; uint fee = msg.value; // Target pairIndex. When take token0, use pairIndex direct, or add 65536 conversely // pairIndex < 0x10000 means take token0 if (pairIndex < 0x10000) { // Update the bitten sheet sheet.ethNumBal = uint32(uint(sheet.ethNumBal) - takeNum); sheet.tokenNumBal = uint32(uint(sheet.tokenNumBal) + takeNum); pair.sheets[index] = sheet; // Freeze token0 fee = _freeze(balances, channel.token0, (needEthNum - takeNum) * uint(channel.unit), fee); // Freeze token1 fee = _freeze( balances, pair.target, needEthNum * newEquivalent + _decodeFloat(sheet.priceFloat) * takeNum, fee ); } // pairIndex >= 0x10000 means take target token1 else { pairIndex -= 0x10000; // Update the bitten sheet sheet.ethNumBal = uint32(uint(sheet.ethNumBal) + takeNum); sheet.tokenNumBal = uint32(uint(sheet.tokenNumBal) - takeNum); pair.sheets[index] = sheet; // Freeze token0 fee = _freeze(balances, channel.token0, (needEthNum + takeNum) * uint(channel.unit), fee); // Freeze token1 uint backTokenValue = _decodeFloat(sheet.priceFloat) * takeNum; if (needEthNum * newEquivalent > backTokenValue) { fee = _freeze(balances, pair.target, needEthNum * newEquivalent - backTokenValue, fee); } else { _unfreeze(balances, pair.target, backTokenValue - needEthNum * newEquivalent, msg.sender); } } // Freeze nest fee = _freeze(balances, NEST_TOKEN_ADDRESS, needNest1k * 1000 ether, fee); require(fee == 0, "NOM:!fee"); } // 5. Calculate the price // According to the current mechanism, the newly added sheet cannot take effect, so the calculated price // is placed before the sheet is added, which can reduce unnecessary traversal _stat(config, pair); // 6. Create price sheet emit Post(channelId, pairIndex, msg.sender, pair.sheets.length, needEthNum, newEquivalent); _create(pair.sheets, accountIndex, uint32(needEthNum), needNest1k, level << 8, newEquivalent); } /// @dev List sheets by page /// @param channelId Target channelId /// @param pairIndex Target pairIndex /// @param offset Skip previous (offset) records /// @param count Return (count) records /// @param order Order. 0 reverse order, non-0 positive order /// @return List of price sheets function list( uint channelId, uint pairIndex, uint offset, uint count, uint order ) external view override noContract returns (PriceSheetView[] memory) { PriceSheet[] storage sheets = _channels[channelId].pairs[pairIndex].sheets; PriceSheetView[] memory result = new PriceSheetView[](count); uint length = sheets.length; uint i = 0; // Reverse order if (order == 0) { uint index = length - offset; uint end = index > count ? index - count : 0; while (index > end) { --index; result[i++] = _toPriceSheetView(sheets[index], index); } } // Positive order else { uint index = offset; uint end = index + count; if (end > length) { end = length; } while (index < end) { result[i++] = _toPriceSheetView(sheets[index], index); ++index; } } return result; } /// @notice Close a batch of price sheets passed VERIFICATION-PHASE /// @dev Empty sheets but in VERIFICATION-PHASE aren't allowed /// @param channelId Target channelId /// @param indices Two-dimensional array of sheet indices, first means pair indices, seconds means sheet indices function close(uint channelId, uint[][] calldata indices) external override { Config memory config = _config; PriceChannel storage channel = _channels[channelId]; uint accountIndex = 0; uint reward = 0; uint nestNum1k = 0; uint ethNum = 0; // storage variable must given a value at declaring, this is useless mapping(address=>UINT) storage balances = _accounts[0/*accountIndex*/].balances; uint[3] memory vars = [ uint(channel.rewardPerBlock), uint(channel.genesisBlock), uint(channel.reductionRate) ]; for (uint j = indices.length; j > 0;) { PricePair storage pair = channel.pairs[--j]; /////////////////////////////////////////////////////////////////////////////////////// uint tokenValue = 0; // 1. Traverse sheets for (uint i = indices[j].length; i > 0;) { // --------------------------------------------------------------------------------- uint index = indices[j][--i]; PriceSheet memory sheet = pair.sheets[index]; // Batch closing quotation can only close sheet of the same user if (accountIndex == 0) { // accountIndex == 0 means the first sheet, and the number of this sheet is taken accountIndex = uint(sheet.miner); balances = _accounts[accountIndex].balances; } else { // accountIndex != 0 means that it is a follow-up sheet, and the miner number must be // consistent with the previous record require(accountIndex == uint(sheet.miner), "NM:!miner"); } // Check the status of the price sheet to see if it has reached the effective block interval // or has been finished if (accountIndex > 0 && (uint(sheet.height) + uint(config.priceEffectSpan) < block.number)) { // Only pairIndex 0 has reward if (j == 0) { uint shares = uint(sheet.shares); // Mining logic // The price sheet which shares is zero doesn't mining if (shares > 0) { // Currently, mined represents the number of blocks has mined (uint mined, uint totalShares) = _calcMinedBlocks(pair.sheets, index, sheet); // When rewardPerBlock is very large, this calculated may be truncated, // resulting in a significant reduction in the actual reward, // This situation is unreasonable and needs to be borne by the opener. reward += ( mined * shares * _reduction(uint(sheet.height) - vars[1], vars[2]) * vars[0] / totalShares / 400 ); } } nestNum1k += uint(sheet.nestNum1k); ethNum += uint(sheet.ethNumBal); tokenValue += _decodeFloat(sheet.priceFloat) * uint(sheet.tokenNumBal); // Set sheet.miner to 0, express the sheet is closed sheet.miner = uint32(0); sheet.ethNumBal = uint32(0); sheet.tokenNumBal = uint32(0); pair.sheets[index] = sheet; } // --------------------------------------------------------------------------------- } _stat(config, pair); /////////////////////////////////////////////////////////////////////////////////////// // Unfreeze token1 _unfreeze(balances, pair.target, tokenValue, accountIndex); } // Unfreeze token0 _unfreeze(balances, channel.token0, ethNum * uint(channel.unit), accountIndex); // Unfreeze nest _unfreeze(balances, NEST_TOKEN_ADDRESS, nestNum1k * 1000 ether, accountIndex); uint vault = uint(channel.vault); if (reward > vault) { reward = vault; } // Record the vault for each channel to prevent the opener use the funds in this contract without increase channel.vault = uint96(vault - reward); // Record reward _unfreeze(balances, channel.reward, reward, accountIndex); } /// @dev View the number of assets specified by the user /// @param tokenAddress Destination token address /// @param addr Destination address /// @return Number of assets function balanceOf(address tokenAddress, address addr) external view override returns (uint) { return _accounts[_accountMapping[addr]].balances[tokenAddress].value; } /// @dev Withdraw assets /// @param tokenAddress Destination token address /// @param value The value to withdraw function withdraw(address tokenAddress, uint value) external override { // The user's locked nest and the mining pool's nest are stored together. When the nest is mined over, // the problem of taking the locked nest as the ore drawing will appear // As it will take a long time for nest to finish mining, this problem will not be considered for the time being UINT storage balance = _accounts[_accountMapping[msg.sender]].balances[tokenAddress]; balance.value -= value; TransferHelper.safeTransfer(tokenAddress, msg.sender, value); } /// @dev Estimated mining amount /// @param channelId Target channelId /// @return Estimated mining amount function estimate(uint channelId) external view override returns (uint) { PriceChannel storage channel = _channels[channelId]; PriceSheet[] storage sheets = channel.pairs[0].sheets; uint index = sheets.length; uint blocks = 10; while (index > 0) { PriceSheet memory sheet = sheets[--index]; if (uint(sheet.shares) > 0) { blocks = block.number - uint(sheet.height); break; } } return blocks * uint(channel.rewardPerBlock) * _reduction(block.number - uint(channel.genesisBlock), uint(channel.reductionRate)) / 400; } /// @dev Query the quantity of the target quotation /// @param channelId Target channelId /// @param index The index of the sheet /// @return minedBlocks Mined block period from previous block /// @return totalShares Total shares of sheets in the block function getMinedBlocks( uint channelId, uint index ) external view override returns (uint minedBlocks, uint totalShares) { PriceSheet[] storage sheets = _channels[channelId].pairs[0].sheets; return _calcMinedBlocks(sheets, index, sheets[index]); } /// @dev The function returns eth rewards of specified ntoken /// @param channelId Target channelId function totalETHRewards(uint channelId) external view override returns (uint) { return uint(_channels[channelId].rewards); } /// @dev Pay /// @param channelId Target channelId /// @param to Address to receive /// @param value Amount to receive function pay(uint channelId, address to, uint value) external override { PriceChannel storage channel = _channels[channelId]; require(channel.opener == msg.sender, "NOM:!opener"); channel.rewards -= _toUInt96(value); // pay payable(to).transfer(value); } /// @dev Donate to dao /// @param channelId Target channelId /// @param value Amount to receive function donate(uint channelId, uint value) external override { PriceChannel storage channel = _channels[channelId]; require(channel.opener == msg.sender, "NOM:!opener"); channel.rewards -= _toUInt96(value); INestLedger(INestMapping(_governance).getNestLedgerAddress()).addETHReward { value: value } (channelId); } /// @dev Gets the address corresponding to the given index number /// @param index The index number of the specified address /// @return The address corresponding to the given index number function indexAddress(uint index) public view returns (address) { return _accounts[index].addr; } /// @dev Gets the registration index number of the specified address /// @param addr Destination address /// @return 0 means nonexistent, non-0 means index number function getAccountIndex(address addr) external view returns (uint) { return _accountMapping[addr]; } /// @dev Get the length of registered account array /// @return The length of registered account array function getAccountCount() external view returns (uint) { return _accounts.length; } // Convert PriceSheet to PriceSheetView function _toPriceSheetView(PriceSheet memory sheet, uint index) private view returns (PriceSheetView memory) { return PriceSheetView( // Index number uint32(index), // Miner address indexAddress(sheet.miner), // The block number of this price sheet packaged sheet.height, // The remain number of this price sheet sheet.remainNum, // The eth number which miner will got sheet.ethNumBal, // The eth number which equivalent to token's value which miner will got sheet.tokenNumBal, // The pledged number of nest in this sheet. (Unit: 1000nest) sheet.nestNum1k, // The level of this sheet. 0 expresses initial price sheet, a value greater than 0 expresses // bite price sheet sheet.level, // Post fee shares sheet.shares, // Price uint152(_decodeFloat(sheet.priceFloat)) ); } // Create price sheet function _create( PriceSheet[] storage sheets, uint accountIndex, uint32 ethNum, uint nestNum1k, uint level_shares, uint equivalent ) private { sheets.push(PriceSheet( uint32(accountIndex), // uint32 miner; uint32(block.number), // uint32 height; ethNum, // uint32 remainNum; ethNum, // uint32 ethNumBal; ethNum, // uint32 tokenNumBal; uint24(nestNum1k), // uint32 nestNum1k; uint8(level_shares >> 8), // uint8 level; uint8(level_shares & 0xFF), _encodeFloat(equivalent) )); } // Calculate price, average price and volatility function _stat(Config memory config, PricePair storage pair) private { PriceSheet[] storage sheets = pair.sheets; // Load token price information PriceInfo memory p0 = pair.price; // Length of sheets uint length = sheets.length; // The index of the sheet to be processed in the sheet array uint index = uint(p0.index); // The latest block number for which the price has been calculated uint prev = uint(p0.height); // It's not necessary to load the price information in p0 // Eth count variable used to calculate price uint totalEthNum = 0; // Token count variable for price calculation uint totalTokenValue = 0; // Block number of current sheet uint height = 0; // Traverse the sheets to find the effective price //uint effectBlock = block.number - uint(config.priceEffectSpan); PriceSheet memory sheet; for (; ; ++index) { // Gas attack analysis, each post transaction, calculated according to post, needs to write // at least one sheet and freeze two kinds of assets, which needs to consume at least 30000 gas, // In addition to the basic cost of the transaction, at least 50000 gas is required. // In addition, there are other reading and calculation operations. The gas consumed by each // transaction is impossible less than 70000 gas, The attacker can accumulate up to 20 blocks // of sheets to be generated. To ensure that the calculation can be completed in one block, // it is necessary to ensure that the consumption of each price does not exceed 70000 / 20 = 3500 gas, // According to the current logic, each calculation of a price needs to read a storage unit (800) // and calculate the consumption, which can not reach the dangerous value of 3500, so the gas attack // is not considered // Traverse the sheets that has reached the effective interval from the current position bool flag = index >= length || (height = uint((sheet = sheets[index]).height)) + uint(config.priceEffectSpan) >= block.number; // Not the same block (or flag is false), calculate the price and update it if (flag || prev != height) { // totalEthNum > 0 Can calculate the price if (totalEthNum > 0) { // Calculate average price and Volatility // Calculation method of volatility of follow-up price uint tmp = _decodeFloat(p0.priceFloat); // New price uint price = totalTokenValue / totalEthNum; // Update price p0.remainNum = uint32(totalEthNum); p0.priceFloat = _encodeFloat(price); // Clear cumulative values totalEthNum = 0; totalTokenValue = 0; if (tmp > 0) { // Calculate average price // avgPrice[i + 1] = avgPrice[i] * 90% + price[i] * 10% p0.avgFloat = _encodeFloat((_decodeFloat(p0.avgFloat) * 9 + price) / 10); // When the accuracy of the token is very high or the value of the token relative to // eth is very low, the price may be very large, and there may be overflow problem, // it is not considered for the moment tmp = (price << 48) / tmp; if (tmp > 0x1000000000000) { tmp = tmp - 0x1000000000000; } else { tmp = 0x1000000000000 - tmp; } // earn = price[i] / price[i - 1] - 1; // seconds = time[i] - time[i - 1]; // sigmaSQ[i + 1] = sigmaSQ[i] * 90% + (earn ^ 2 / seconds) * 10% tmp = ( uint(p0.sigmaSQ) * 9 + // It is inevitable that prev greater than p0.height ((tmp * tmp * 1000 / ETHEREUM_BLOCK_TIMESPAN / (prev - uint(p0.height))) >> 48) ) / 10; // The current implementation assumes that the volatility cannot exceed 1, and // corresponding to this, when the calculated value exceeds 1, expressed as 0xFFFFFFFFFFFF if (tmp > 0xFFFFFFFFFFFF) { tmp = 0xFFFFFFFFFFFF; } p0.sigmaSQ = uint48(tmp); } // The calculation methods of average price and volatility are different for first price else { // The average price is equal to the price //p0.avgTokenAmount = uint64(price); p0.avgFloat = p0.priceFloat; // The volatility is 0 p0.sigmaSQ = uint48(0); } // Update price block number p0.height = uint32(prev); } // Move to new block number prev = height; } if (flag) { break; } // Cumulative price information totalEthNum += uint(sheet.remainNum); totalTokenValue += _decodeFloat(sheet.priceFloat) * uint(sheet.remainNum); } // Update price information if (index > uint(p0.index)) { p0.index = uint32(index); pair.price = p0; } } // Calculation number of blocks which mined function _calcMinedBlocks( PriceSheet[] storage sheets, uint index, PriceSheet memory sheet ) private view returns (uint minedBlocks, uint totalShares) { uint length = sheets.length; uint height = uint(sheet.height); totalShares = uint(sheet.shares); // Backward looking for sheets in the same block for (uint i = index; ++i < length && uint(sheets[i].height) == height;) { // Multiple sheets in the same block is a small probability event at present, so it can be ignored // to read more than once, if there are always multiple sheets in the same block, it means that the // sheets are very intensive, and the gas consumed here does not have a great impact totalShares += uint(sheets[i].shares); } // Find sheets in the same block forward uint prev = height; while (index > 0 && uint(prev = sheets[--index].height) == height) { // Multiple sheets in the same block is a small probability event at present, so it can be ignored // to read more than once, if there are always multiple sheets in the same block, it means that the // sheets are very intensive, and the gas consumed here does not have a great impact totalShares += uint(sheets[index].shares); } if (index > 0 || height > prev) { minedBlocks = height - prev; } else { minedBlocks = 10; } } /// @dev freeze token /// @param balances Balances ledger /// @param tokenAddress Destination token address /// @param tokenValue token amount /// @param value The remain value function _freeze( mapping(address=>UINT) storage balances, address tokenAddress, uint tokenValue, uint value ) private returns (uint) { if (tokenAddress == address(0)) { return value - tokenValue; } else { // Unfreeze nest UINT storage balance = balances[tokenAddress]; uint balanceValue = balance.value; if (balanceValue < tokenValue) { balance.value = 0; TransferHelper.safeTransferFrom(tokenAddress, msg.sender, address(this), tokenValue - balanceValue); } else { balance.value = balanceValue - tokenValue; } return value; } } function _unfreeze( mapping(address=>UINT) storage balances, address tokenAddress, uint tokenValue, uint accountIndex ) private { if (tokenValue > 0) { if (tokenAddress == address(0)) { payable(indexAddress(accountIndex)).transfer(tokenValue); } else { balances[tokenAddress].value += tokenValue; } } } function _unfreeze( mapping(address=>UINT) storage balances, address tokenAddress, uint tokenValue, address owner ) private { if (tokenValue > 0) { if (tokenAddress == address(0)) { payable(owner).transfer(tokenValue); } else { balances[tokenAddress].value += tokenValue; } } } /// @dev Gets the index number of the specified address. If it does not exist, register /// @param addr Destination address /// @return The index number of the specified address function _addressIndex(address addr) private returns (uint) { uint index = _accountMapping[addr]; if (index == 0) { // If it exceeds the maximum number that 32 bits can store, you can't continue to register a new account. // If you need to support a new account, you need to update the contract require((_accountMapping[addr] = index = _accounts.length) < 0x100000000, "NM:!accounts"); _accounts.push().addr = addr; } return index; } function _reduction(uint delta, uint reductionRate) private pure returns (uint) { if (delta < NEST_REDUCTION_LIMIT) { uint n = delta / NEST_REDUCTION_SPAN; return 400 * reductionRate ** n / 10000 ** n; } return 400 * reductionRate ** 10 / 10000 ** 10; } /* ========== Tools and methods ========== */ /// @dev Encode the uint value as a floating-point representation in the form of fraction * 16 ^ exponent /// @param value Destination uint value /// @return float format function _encodeFloat(uint value) private pure returns (uint56) { uint exponent = 0; while (value > 0x3FFFFFFFFFFFF) { value >>= 4; ++exponent; } return uint56((value << 6) | exponent); } /// @dev Decode the floating-point representation of fraction * 16 ^ exponent to uint /// @param floatValue fraction value /// @return decode format function _decodeFloat(uint56 floatValue) private pure returns (uint) { return (uint(floatValue) >> 6) << ((uint(floatValue) & 0x3F) << 2); } // Convert uint to uint96 function _toUInt96(uint value) internal pure returns (uint96) { require(value < 0x1000000000000000000000000); return uint96(value); } /* ========== Price Query ========== */ /// @dev Get the latest trigger price /// @param pair Target price pair /// @return blockNumber The block number of price /// @return price The token price. (1eth equivalent to (price) token) function _triggeredPrice(PricePair storage pair) internal view returns (uint blockNumber, uint price) { PriceInfo memory priceInfo = pair.price; if (uint(priceInfo.remainNum) > 0) { return (uint(priceInfo.height) + uint(_config.priceEffectSpan), _decodeFloat(priceInfo.priceFloat)); } return (0, 0); } /// @dev Get the full information of latest trigger price /// @param pair Target price pair /// @return blockNumber The block number of price /// @return price The token price. (1eth equivalent to (price) token) /// @return avgPrice Average price /// @return sigmaSQ The square of the volatility (18 decimal places). The current implementation assumes that /// the volatility cannot exceed 1. Correspondingly, when the return value is equal to 999999999999996447, /// it means that the volatility has exceeded the range that can be expressed function _triggeredPriceInfo(PricePair storage pair) internal view returns ( uint blockNumber, uint price, uint avgPrice, uint sigmaSQ ) { PriceInfo memory priceInfo = pair.price; if (uint(priceInfo.remainNum) > 0) { return ( uint(priceInfo.height) + uint(_config.priceEffectSpan), _decodeFloat(priceInfo.priceFloat), _decodeFloat(priceInfo.avgFloat), (uint(priceInfo.sigmaSQ) * 1 ether) >> 48 ); } return (0, 0, 0, 0); } /// @dev Find the price at block number /// @param pair Target price pair /// @param height Destination block number /// @return blockNumber The block number of price /// @return price The token price. (1eth equivalent to (price) token) function _findPrice( PricePair storage pair, uint height ) internal view returns (uint blockNumber, uint price) { PriceSheet[] storage sheets = pair.sheets; uint priceEffectSpan = uint(_config.priceEffectSpan); uint length = sheets.length; uint index = 0; uint sheetHeight; height -= priceEffectSpan; { // If there is no sheet in this channel, length is 0, length - 1 will overflow, uint right = length - 1; uint left = 0; // Find the index use Binary Search while (left < right) { index = (left + right) >> 1; sheetHeight = uint(sheets[index].height); if (height > sheetHeight) { left = ++index; } else if (height < sheetHeight) { // When index = 0, this statement will have an underflow exception, which usually // indicates that the effective block height passed during the call is lower than // the block height of the first quotation right = --index; } else { break; } } } // Calculate price uint totalEthNum = 0; uint totalTokenValue = 0; uint h = 0; uint remainNum; PriceSheet memory sheet; // Find sheets forward for (uint i = index; i < length;) { sheet = sheets[i++]; sheetHeight = uint(sheet.height); if (height < sheetHeight) { break; } remainNum = uint(sheet.remainNum); if (remainNum > 0) { if (h == 0) { h = sheetHeight; } else if (h != sheetHeight) { break; } totalEthNum += remainNum; totalTokenValue += _decodeFloat(sheet.priceFloat) * remainNum; } } // Find sheets backward while (index > 0) { sheet = sheets[--index]; remainNum = uint(sheet.remainNum); if (remainNum > 0) { sheetHeight = uint(sheet.height); if (h == 0) { h = sheetHeight; } else if (h != sheetHeight) { break; } totalEthNum += remainNum; totalTokenValue += _decodeFloat(sheet.priceFloat) * remainNum; } } if (totalEthNum > 0) { return (h + priceEffectSpan, totalTokenValue / totalEthNum); } return (0, 0); } /// @dev Get the last (num) effective price /// @param pair Target price pair /// @param count The number of prices that want to return /// @return An array which length is num * 2, each two element expresses one price like blockNumber|price function _lastPriceList(PricePair storage pair, uint count) internal view returns (uint[] memory) { PriceSheet[] storage sheets = pair.sheets; PriceSheet memory sheet; uint[] memory array = new uint[](count <<= 1); uint priceEffectSpan = uint(_config.priceEffectSpan); uint index = sheets.length; uint totalEthNum = 0; uint totalTokenValue = 0; uint height = 0; for (uint i = 0; i < count;) { bool flag = index == 0; if (flag || height != uint((sheet = sheets[--index]).height)) { if (totalEthNum > 0 && height + priceEffectSpan < block.number) { array[i++] = height + priceEffectSpan; array[i++] = totalTokenValue / totalEthNum; } if (flag) { break; } totalEthNum = 0; totalTokenValue = 0; height = uint(sheet.height); } uint remainNum = uint(sheet.remainNum); totalEthNum += remainNum; totalTokenValue += _decodeFloat(sheet.priceFloat) * remainNum; } return array; } } // File contracts/NestBatchPlatform2.sol // GPL-3.0-or-later pragma solidity ^0.8.6; /// @dev This contract implemented the query logic of nest contract NestBatchPlatform2 is NestBatchMining, INestBatchPriceView, INestBatchPrice2 { /* ========== INestBatchPriceView ========== */ /// @dev Get the latest trigger price /// @param channelId Target channelId /// @param pairIndex Target pairIndex /// @return blockNumber The block number of price /// @return price The token price. (1eth equivalent to (price) token) function triggeredPrice(uint channelId, uint pairIndex) external view override noContract returns (uint blockNumber, uint price) { return _triggeredPrice(_channels[channelId].pairs[pairIndex]); } /// @dev Get the full information of latest trigger price /// @param channelId Target channelId /// @param pairIndex Target pairIndex /// @return blockNumber The block number of price /// @return price The token price. (1eth equivalent to (price) token) /// @return avgPrice Average price /// @return sigmaSQ The square of the volatility (18 decimal places). The current implementation assumes that /// the volatility cannot exceed 1. Correspondingly, when the return value is equal to 999999999999996447, /// it means that the volatility has exceeded the range that can be expressed function triggeredPriceInfo(uint channelId, uint pairIndex) external view override noContract returns ( uint blockNumber, uint price, uint avgPrice, uint sigmaSQ ) { return _triggeredPriceInfo(_channels[channelId].pairs[pairIndex]); } /// @dev Find the price at block number /// @param channelId Target channelId /// @param pairIndex Target pairIndex /// @param height Destination block number /// @return blockNumber The block number of price /// @return price The token price. (1eth equivalent to (price) token) function findPrice( uint channelId, uint pairIndex, uint height ) external view override noContract returns (uint blockNumber, uint price) { return _findPrice(_channels[channelId].pairs[pairIndex], height); } /// @dev Get the last (num) effective price /// @param channelId Target channelId /// @param pairIndex Target pairIndex /// @param count The number of prices that want to return /// @return An array which length is num * 2, each two element expresses one price like blockNumber|price function lastPriceList(uint channelId, uint pairIndex, uint count) external view override noContract returns (uint[] memory) { return _lastPriceList(_channels[channelId].pairs[pairIndex], count); } /// @dev Returns lastPriceList and triggered price info /// @param channelId Target channelId /// @param pairIndex Target pairIndex /// @param count The number of prices that want to return /// @return prices An array which length is num * 2, each two element expresses one price like blockNumber|price /// @return triggeredPriceBlockNumber The block number of triggered price /// @return triggeredPriceValue The token triggered price. (1eth equivalent to (price) token) /// @return triggeredAvgPrice Average price /// @return triggeredSigmaSQ The square of the volatility (18 decimal places). The current implementation /// assumes that the volatility cannot exceed 1. Correspondingly, when the return value is equal to /// 999999999999996447, it means that the volatility has exceeded the range that can be expressed function lastPriceListAndTriggeredPriceInfo(uint channelId, uint pairIndex, uint count) external view override noContract returns ( uint[] memory prices, uint triggeredPriceBlockNumber, uint triggeredPriceValue, uint triggeredAvgPrice, uint triggeredSigmaSQ ) { //return _lastPriceListAndTriggeredPriceInfo(_channels[channelId].pairs[pairIndex], count); PricePair storage pair = _channels[channelId].pairs[pairIndex]; prices = _lastPriceList(pair, count); ( triggeredPriceBlockNumber, triggeredPriceValue, triggeredAvgPrice, triggeredSigmaSQ ) = _triggeredPriceInfo(pair); } /* ========== INestBatchPrice ========== */ /// @dev Get the latest trigger price /// @param channelId Target channelId /// @param pairIndices Array of pair indices /// @param payback Address to receive refund /// @return prices Price array, i * 2 is the block where the ith price is located, and i * 2 + 1 is the ith price function triggeredPrice( uint channelId, uint[] calldata pairIndices, address payback ) external payable override returns (uint[] memory prices) { PricePair[0xFFFF] storage pairs = _pay(channelId, payback).pairs; uint n = pairIndices.length << 1; prices = new uint[](n); while (n > 0) { n -= 2; (prices[n], prices[n + 1]) = _triggeredPrice(pairs[pairIndices[n >> 1]]); } } /// @dev Get the full information of latest trigger price /// @param channelId Target channelId /// @param pairIndices Array of pair indices /// @param payback Address to receive refund /// @return prices Price array, i * 4 is the block where the ith price is located, i * 4 + 1 is the ith price, /// i * 4 + 2 is the ith average price and i * 4 + 3 is the ith volatility function triggeredPriceInfo( uint channelId, uint[] calldata pairIndices, address payback ) external payable override returns (uint[] memory prices) { PricePair[0xFFFF] storage pairs = _pay(channelId, payback).pairs; uint n = pairIndices.length << 2; prices = new uint[](n); while (n > 0) { n -= 4; (prices[n], prices[n + 1], prices[n + 2], prices[n + 3]) = _triggeredPriceInfo(pairs[pairIndices[n >> 2]]); } } /// @dev Find the price at block number /// @param channelId Target channelId /// @param pairIndices Array of pair indices /// @param height Destination block number /// @param payback Address to receive refund /// @return prices Price array, i * 2 is the block where the ith price is located, and i * 2 + 1 is the ith price function findPrice( uint channelId, uint[] calldata pairIndices, uint height, address payback ) external payable override returns (uint[] memory prices) { PricePair[0xFFFF] storage pairs = _pay(channelId, payback).pairs; uint n = pairIndices.length << 1; prices = new uint[](n); while (n > 0) { n -= 2; (prices[n], prices[n + 1]) = _findPrice(pairs[pairIndices[n >> 1]], height); } } /// @dev Get the last (num) effective price /// @param channelId Target channelId /// @param pairIndices Array of pair indices /// @param count The number of prices that want to return /// @param payback Address to receive refund /// @return prices Result array, i * count * 2 to (i + 1) * count * 2 - 1 are /// the price results of group i quotation pairs function lastPriceList( uint channelId, uint[] calldata pairIndices, uint count, address payback ) external payable override returns (uint[] memory prices) { PricePair[0xFFFF] storage pairs = _pay(channelId, payback).pairs; uint row = count << 1; uint n = pairIndices.length * row; prices = new uint[](n); while (n > 0) { n -= row; uint[] memory pi = _lastPriceList(pairs[pairIndices[n / row]], count); for (uint i = 0; i < row; ++i) { prices[n + i] = pi[i]; } } } /// @dev Returns lastPriceList and triggered price info /// @param channelId Target channelId /// @param pairIndices Array of pair indices /// @param count The number of prices that want to return /// @param payback Address to receive refund /// @return prices result of group i quotation pair. Among them, the first two count * are the latest prices, /// and the last four are: trigger price block number, trigger price, average price and volatility function lastPriceListAndTriggeredPriceInfo( uint channelId, uint[] calldata pairIndices, uint count, address payback ) external payable override returns (uint[] memory prices) { PricePair[0xFFFF] storage pairs = _pay(channelId, payback).pairs; uint row = (count << 1) + 4; uint n = pairIndices.length * row; prices = new uint[](n); while (n > 0) { n -= row; PricePair storage pair = pairs[pairIndices[n / row]]; uint[] memory pi = _lastPriceList(pair, count); for (uint i = 0; i + 4 < row; ++i) { prices[n + i] = pi[i]; } uint j = n + row - 4; ( prices[j], prices[j + 1], prices[j + 2], prices[j + 3] ) = _triggeredPriceInfo(pair); } } // Payment of transfer fee function _pay(uint channelId, address payback) private returns (PriceChannel storage channel) { channel = _channels[channelId]; uint fee = uint(channel.singleFee) * DIMI_ETHER; if (msg.value > fee) { payable(payback).transfer(msg.value - fee); // BSC adopts the old gas calculation strategy. Direct transfer may lead to the excess of gas // in the agency contract. The following methods should be used for transfer //TransferHelper.safeTransferETH(payback, msg.value - fee); } else { require(msg.value == fee, "NOP:!fee"); } channel.rewards += _toUInt96(fee); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"channelId","type":"uint256"},{"indexed":false,"internalType":"address","name":"token0","type":"address"},{"indexed":false,"internalType":"uint256","name":"unit","type":"uint256"},{"indexed":false,"internalType":"address","name":"reward","type":"address"}],"name":"Open","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"channelId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"pairIndex","type":"uint256"},{"indexed":false,"internalType":"address","name":"miner","type":"address"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"scale","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"Post","type":"event"},{"inputs":[],"name":"_governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"address","name":"target","type":"address"}],"name":"addPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"addr","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"address","name":"newOpener","type":"address"}],"name":"changeOpener","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint256[][]","name":"indices","type":"uint256[][]"}],"name":"close","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint128","name":"vault","type":"uint128"}],"name":"decrease","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"donate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"}],"name":"estimate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint256[]","name":"pairIndices","type":"uint256[]"},{"internalType":"uint256","name":"height","type":"uint256"},{"internalType":"address","name":"payback","type":"address"}],"name":"findPrice","outputs":[{"internalType":"uint256[]","name":"prices","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint256","name":"pairIndex","type":"uint256"},{"internalType":"uint256","name":"height","type":"uint256"}],"name":"findPrice","outputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAccountCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getAccountIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"}],"name":"getChannelInfo","outputs":[{"components":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"address","name":"token0","type":"address"},{"internalType":"uint96","name":"unit","type":"uint96"},{"internalType":"address","name":"reward","type":"address"},{"internalType":"uint96","name":"rewardPerBlock","type":"uint96"},{"internalType":"uint128","name":"vault","type":"uint128"},{"internalType":"uint96","name":"rewards","type":"uint96"},{"internalType":"uint16","name":"postFeeUnit","type":"uint16"},{"internalType":"uint16","name":"count","type":"uint16"},{"internalType":"address","name":"opener","type":"address"},{"internalType":"uint32","name":"genesisBlock","type":"uint32"},{"internalType":"uint16","name":"singleFee","type":"uint16"},{"internalType":"uint16","name":"reductionRate","type":"uint16"},{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint96","name":"sheetCount","type":"uint96"}],"internalType":"struct INestBatchMining.PairView[]","name":"pairs","type":"tuple[]"}],"internalType":"struct INestBatchMining.PriceChannelView","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getConfig","outputs":[{"components":[{"internalType":"uint8","name":"maxBiteNestedLevel","type":"uint8"},{"internalType":"uint16","name":"priceEffectSpan","type":"uint16"},{"internalType":"uint16","name":"pledgeNest","type":"uint16"}],"internalType":"struct INestBatchMining.Config","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getMinedBlocks","outputs":[{"internalType":"uint256","name":"minedBlocks","type":"uint256"},{"internalType":"uint256","name":"totalShares","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint128","name":"vault","type":"uint128"}],"name":"increase","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"indexAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"governance","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint256[]","name":"pairIndices","type":"uint256[]"},{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"address","name":"payback","type":"address"}],"name":"lastPriceList","outputs":[{"internalType":"uint256[]","name":"prices","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint256","name":"pairIndex","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"lastPriceList","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint256","name":"pairIndex","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"lastPriceListAndTriggeredPriceInfo","outputs":[{"internalType":"uint256[]","name":"prices","type":"uint256[]"},{"internalType":"uint256","name":"triggeredPriceBlockNumber","type":"uint256"},{"internalType":"uint256","name":"triggeredPriceValue","type":"uint256"},{"internalType":"uint256","name":"triggeredAvgPrice","type":"uint256"},{"internalType":"uint256","name":"triggeredSigmaSQ","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint256[]","name":"pairIndices","type":"uint256[]"},{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"address","name":"payback","type":"address"}],"name":"lastPriceListAndTriggeredPriceInfo","outputs":[{"internalType":"uint256[]","name":"prices","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint256","name":"pairIndex","type":"uint256"},{"internalType":"uint256","name":"offset","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"uint256","name":"order","type":"uint256"}],"name":"list","outputs":[{"components":[{"internalType":"uint32","name":"index","type":"uint32"},{"internalType":"address","name":"miner","type":"address"},{"internalType":"uint32","name":"height","type":"uint32"},{"internalType":"uint32","name":"remainNum","type":"uint32"},{"internalType":"uint32","name":"ethNumBal","type":"uint32"},{"internalType":"uint32","name":"tokenNumBal","type":"uint32"},{"internalType":"uint24","name":"nestNum1k","type":"uint24"},{"internalType":"uint8","name":"level","type":"uint8"},{"internalType":"uint8","name":"shares","type":"uint8"},{"internalType":"uint152","name":"price","type":"uint152"}],"internalType":"struct INestBatchMining.PriceSheetView[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"components":[{"internalType":"uint96","name":"rewardPerBlock","type":"uint96"},{"internalType":"uint16","name":"postFeeUnit","type":"uint16"},{"internalType":"uint16","name":"singleFee","type":"uint16"},{"internalType":"uint16","name":"reductionRate","type":"uint16"}],"internalType":"struct INestBatchMining.ChannelConfig","name":"config","type":"tuple"}],"name":"modify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token0","type":"address"},{"internalType":"uint96","name":"unit","type":"uint96"},{"internalType":"address","name":"reward","type":"address"},{"internalType":"address[]","name":"tokens","type":"address[]"},{"components":[{"internalType":"uint96","name":"rewardPerBlock","type":"uint96"},{"internalType":"uint16","name":"postFeeUnit","type":"uint16"},{"internalType":"uint16","name":"singleFee","type":"uint16"},{"internalType":"uint16","name":"reductionRate","type":"uint16"}],"internalType":"struct INestBatchMining.ChannelConfig","name":"config","type":"tuple"}],"name":"open","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"pay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint256","name":"scale","type":"uint256"},{"internalType":"uint256[]","name":"equivalents","type":"uint256[]"}],"name":"post","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"uint8","name":"maxBiteNestedLevel","type":"uint8"},{"internalType":"uint16","name":"priceEffectSpan","type":"uint16"},{"internalType":"uint16","name":"pledgeNest","type":"uint16"}],"internalType":"struct INestBatchMining.Config","name":"config","type":"tuple"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint256","name":"pairIndex","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"takeNum","type":"uint256"},{"internalType":"uint256","name":"newEquivalent","type":"uint256"}],"name":"take","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"}],"name":"totalETHRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint256[]","name":"pairIndices","type":"uint256[]"},{"internalType":"address","name":"payback","type":"address"}],"name":"triggeredPrice","outputs":[{"internalType":"uint256[]","name":"prices","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint256","name":"pairIndex","type":"uint256"}],"name":"triggeredPrice","outputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint256","name":"pairIndex","type":"uint256"}],"name":"triggeredPriceInfo","outputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"avgPrice","type":"uint256"},{"internalType":"uint256","name":"sigmaSQ","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"channelId","type":"uint256"},{"internalType":"uint256[]","name":"pairIndices","type":"uint256[]"},{"internalType":"address","name":"payback","type":"address"}],"name":"triggeredPriceInfo","outputs":[{"internalType":"uint256[]","name":"prices","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newGovernance","type":"address"}],"name":"update","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50615c6180620000216000396000f3fe60806040526004361061020f5760003560e01c80639ba63e9e11610118578063d2a53f61116100a0578063f3a713211161006f578063f3a71321146106b2578063f3fef3a3146106d2578063f781feb3146106f2578063f7888aec14610705578063fd9b53871461072557600080fd5b8063d2a53f611461061f578063d4aa113c1461063f578063d99f05831461067f578063de0777ed1461069f57600080fd5b8063ba2d4a8f116100e7578063ba2d4a8f14610518578063c3f909d414610538578063c4d66de8146105cc578063c708ba0c146105ec578063c86fe6521461060c57600080fd5b80639ba63e9e1461047f5780639c792938146104c3578063a98e4e77146104e3578063b7e004fa146104f857600080fd5b80634353e7421161019b578063594e25b51161016a578063594e25b5146103e45780636e2f74b9146103f75780637ba3033d1461042c578063860506801461043f578063954b756f1461045f57600080fd5b80634353e74214610371578063493183541461039157806354a80f04146103b15780635938b38d146103c457600080fd5b80631c2f3e3d116101e25780631c2f3e3d146102965780631d7a4993146102d35780632a651c54146103005780632d1e4721146103315780633ac30e4b1461034457600080fd5b80630313766f14610214578063045b2f44146102365780630cdd53f6146102565780631c1b877214610276575b600080fd5b34801561022057600080fd5b5061023461022f366004615081565b610745565b005b34801561024257600080fd5b506102346102513660046150d1565b610850565b34801561026257600080fd5b506102346102713660046150fe565b6108b6565b34801561028257600080fd5b50610234610291366004615120565b610a56565b3480156102a257600080fd5b506000546102b6906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102df57600080fd5b506102f36102ee36600461513d565b610b35565b6040516102ca91906151ae565b34801561030c57600080fd5b5061032061031b3660046152ea565b610dac565b6040516102ca959493929190615346565b61023461033f36600461537d565b610e39565b34801561035057600080fd5b5061036461035f3660046153b9565b610f24565b6040516102ca91906153f4565b61038461037f36600461550f565b6111a0565b6040516102ca919061556e565b34801561039d57600080fd5b506102346103ac366004615581565b6112a1565b6103846103bf3660046155cd565b6118f9565b3480156103d057600080fd5b506102346103df366004615638565b611a2c565b6103846103f23660046155cd565b611aa7565b34801561040357600080fd5b506104176104123660046150fe565b611baa565b604080519283526020830191909152016102ca565b61023461043a36600461565d565b611c13565b34801561044b57600080fd5b506102b661045a36600461513d565b611ecf565b34801561046b57600080fd5b5061023461047a3660046156b0565b611f04565b34801561048b57600080fd5b506104b561049a366004615120565b6001600160a01b031660009081526003602052604090205490565b6040519081526020016102ca565b3480156104cf57600080fd5b506104b56104de36600461513d565b611fbc565b3480156104ef57600080fd5b506002546104b5565b34801561050457600080fd5b506104176105133660046150fe565b612160565b34801561052457600080fd5b506102346105333660046156de565b612265565b34801561054457600080fd5b5061059b6040805160608101825260008082526020820181905291810191909152506040805160608101825260015460ff8116825261ffff6101008204811660208401526301000000909104169181019190915290565b60408051825160ff16815260208084015161ffff9081169183019190915292820151909216908201526060016102ca565b3480156105d857600080fd5b506102346105e7366004615120565b6125b0565b3480156105f857600080fd5b50610234610607366004615638565b6125c8565b61023461061a3660046153b9565b61278f565b34801561062b57600080fd5b5061038461063a3660046152ea565b61309c565b34801561064b57600080fd5b5061065f61065a3660046150fe565b61310a565b6040805194855260208501939093529183015260608201526080016102ca565b34801561068b57600080fd5b506104b561069a36600461513d565b613182565b6103846106ad36600461550f565b6131c3565b3480156106be57600080fd5b506104176106cd3660046152ea565b613302565b3480156106de57600080fd5b506102346106ed366004615769565b613375565b6103846107003660046155cd565b6133e7565b34801561071157600080fd5b506104b5610720366004615795565b6135ea565b34801561073157600080fd5b5061023461074036600461537d565b61364a565b60006004848154811061075a5761075a6157c3565b6000918252602090912060036203000190920201908101549091506001600160a01b031633146107bf5760405162461bcd60e51b815260206004820152600b60248201526a2727a69d10b7b832b732b960a91b60448201526064015b60405180910390fd5b6107c882613765565b6002820180546010906107ec908490600160801b90046001600160601b03166157ef565b92506101000a8154816001600160601b0302191690836001600160601b03160217905550826001600160a01b03166108fc839081150290604051600060405180830381858888f19350505050158015610849573d6000803e3d6000fd5b5050505050565b600060048381548110610865576108656157c3565b6000918252602090912060036203000190920201908101549091506001600160a01b031633146108a75760405162461bcd60e51b81526004016107b690615817565b6108b1818361377b565b505050565b6000600483815481106108cb576108cb6157c3565b6000918252602090912060036203000190920201908101549091506001600160a01b0316331461092b5760405162461bcd60e51b815260206004820152600b60248201526a2727a69d10b7b832b732b960a91b60448201526064016107b6565b61093482613765565b600282018054601090610958908490600160801b90046001600160601b03166157ef565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555060008054906101000a90046001600160a01b03166001600160a01b0316638df18bb56040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f1919061583f565b6001600160a01b031663c840ff2683856040518363ffffffff1660e01b8152600401610a1f91815260200190565b6000604051808303818588803b158015610a3857600080fd5b505af1158015610a4c573d6000803e3d6000fd5b5050505050505050565b6000546001600160a01b031633811480610ada57506040516391e1472b60e01b8152336004820152600060248201526001600160a01b038216906391e1472b90604401602060405180830381865afa158015610ab6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ada919061585c565b610b125760405162461bcd60e51b81526020600482015260096024820152682722a9aa1d10b3b7bb60b91b60448201526064016107b6565b50600080546001600160a01b0319166001600160a01b0392909216919091179055565b604080516101c08101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e08201839052610100820183905261012082018390526101408201839052610160820183905261018082018390526101a08201526004805491929184908110610bbb57610bbb6157c3565b6000918252602082206203000191909102016002810154909250600160f01b900461ffff16908167ffffffffffffffff811115610bfa57610bfa61587e565b604051908082528060200260200182016040528015610c3f57816020015b6040805180820190915260008082526020820152815260200190600190039081610c185790505b50905060005b82811015610ccd576000846004018261ffff8110610c6557610c656157c3565b604080518082019091526003919091029190910180546001600160a01b0316825260028101546001600160601b031660208301528451909250849084908110610cb057610cb06157c3565b60200260200101819052505080610cc690615894565b9050610c45565b50604080516101c08101825295865283546001600160a01b0380821660208901526001600160601b03600160a01b92839004811693890193909352600186015480821660608a01528290048316608089015260028601546001600160801b03811660a08a0152600160801b810490931660c089015261ffff600160e01b8404811660e08a0152600160f01b909304831661010089015260039095015494851661012088015263ffffffff90850416610140870152600160c01b84048116610160870152600160d01b909304909216610180850152506101a08301525090565b60606000808080333214610dd25760405162461bcd60e51b81526004016107b6906158ad565b600060048981548110610de757610de76157c3565b906000526020600020906203000102016004018861ffff8110610e0c57610e0c6157c3565b600302019050610e1c8188613849565b9550610e2781613aa4565b989c929b509099509750945050505050565b600060048381548110610e4e57610e4e6157c3565b60009182526020909120620300019091020160018101549091506001600160a01b031680610ec557826001600160801b03163414610ec05760405162461bcd60e51b815260206004820152600f60248201526e2727a69d3b30bab63a1032b93937b960891b60448201526064016107b6565b610eda565b610eda813330866001600160801b0316613bc4565b600282018054849190600090610efa9084906001600160801b03166158d5565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555050505050565b6060333214610f455760405162461bcd60e51b81526004016107b6906158ad565b600060048781548110610f5a57610f5a6157c3565b906000526020600020906203000102016004018661ffff8110610f7f57610f7f6157c3565b60030201600201905060008467ffffffffffffffff811115610fa357610fa361587e565b604051908082528060200260200182016040528015610fdc57816020015b610fc9614fc9565b815260200190600190039081610fc15790505b508254909150600085810361111f576000610ff78984615900565b90506000888211611009576000611013565b6110138983615900565b90505b808211156111185761102782615917565b91506110eb86838154811061103e5761103e6157c3565b60009182526020918290206040805161012081018252919092015463ffffffff8082168352600160201b8204811694830194909452600160401b8104841692820192909252600160601b820483166060820152600160801b8204909216608083015262ffffff600160a01b82041660a083015260ff600160b81b8204811660c0840152600160c01b82041660e083015266ffffffffffffff600160c81b9091041661010082015283613cf4565b85846110f681615894565b955081518110611108576111086157c3565b6020026020010181905250611016565b5050611192565b87600061112c898361592e565b9050838111156111395750825b8082101561118f5761115686838154811061103e5761103e6157c3565b858461116181615894565b955081518110611173576111736157c3565b60200260200101819052508161118890615894565b9150611139565b50505b509098975050505050505050565b606060006111ae8684613dd7565b6004019050600184901b8067ffffffffffffffff8111156111d1576111d161587e565b6040519080825280602002602001820160405280156111fa578160200160208202803683370190505b5092505b80156112975761120f600282615900565b905061124c828787600185901c81811061122b5761122b6157c3565b9050602002013561ffff8110611243576112436157c3565b60030201613f03565b84838151811061125e5761125e6157c3565b6020026020010185846001611273919061592e565b81518110611283576112836157c3565b6020908102919091010191909152526111fe565b5050949350505050565b6040805160608101825260015460ff8116825261ffff610100820481166020840152630100000090910416918101919091526004805460009190869081106112eb576112eb6157c3565b90600052602060002090620300010201905060008060008060006002600081548110611319576113196157c3565b60009182526020918290206040805160608101825260018b810154600160a01b908190046001600160601b0316835260038d015490810463ffffffff1696830196909652600160d01b90950461ffff1691810191909152600292909202019091019150885b80156118215760006004890161139383615917565b92508261ffff81106113a7576113a76157c3565b6003020190506000808d8d858181106113c2576113c26157c3565b90506020028101906113d49190615946565b9150505b80156117f75760008e8e868181106113f2576113f26157c3565b90506020028101906114049190615946565b61140d84615917565b93508381811061141f5761141f6157c3565b905060200201359050600084600201828154811061143f5761143f6157c3565b600091825260208083206040805161012081018252939091015463ffffffff8082168552600160201b8204811693850193909352600160401b8104831691840191909152600160601b810482166060840152600160801b81049091166080830152600160a01b810462ffffff1660a0830152600160b81b810460ff90811660c0840152600160c01b82041660e0830152600160c81b900466ffffffffffffff1661010082015291508c900361152657806000015163ffffffff169b5060028c8154811061150e5761150e6157c3565b90600052602060002090600202016001019750611568565b805163ffffffff168c146115685760405162461bcd60e51b815260206004820152600960248201526827269d10b6b4b732b960b91b60448201526064016107b6565b60008c1180156115945750438e6020015161ffff16826020015163ffffffff16611592919061592e565b105b156117f057856000036116395760e081015160ff168015611637576000806115c0886002018686613fcf565b8b516020808e0151908801519395509193506101909284926115f6916115ec919063ffffffff16615900565b60408f0151614129565b6116008787615990565b61160a9190615990565b6116149190615990565b61161e91906159af565b61162891906159af565b611632908f61592e565b9d5050505b505b60a081015161164d9062ffffff168b61592e565b9950806060015163ffffffff1689611665919061592e565b6080820151610100830151919a5063ffffffff1690600681901c6603ffffffffffff1660029190911b60fc161b61169c9190615990565b6116a6908561592e565b60008083526060830181905260808301526002860180549195508291849081106116d2576116d26157c3565b60009182526020918290208351910180549284015160408501516060860151608087015160a088015160c089015160e08a0151610100909a015166ffffffffffffff16600160c81b026001600160c81b0360ff9b8c16600160c01b0260ff60c01b199c909316600160b81b029b909b1661ffff60b81b1962ffffff909416600160a01b0262ffffff60a01b1963ffffffff968716600160801b021666ffffffffffffff60801b19978716600160601b0263ffffffff60601b19998816600160401b029990991667ffffffffffffffff60401b199a8816600160201b0267ffffffffffffffff19909e1697909c16969096179b909b17979097169890981794909417929092161795909517949094161792909217929092169190911790555b50506113d8565b506118028b836141b6565b815461181a9086906001600160a01b0316838c6146ac565b505061137e565b5086546118559083906001600160a01b0381169061184f90600160a01b90046001600160601b031687615990565b896146ac565b611881827304abeda201850ac0124161f037efd70c74ddc74c61184f87683635c9adc5dea00000615990565b60028701546001600160801b03168086111561189b578095505b6118a58682615900565b6002890180546fffffffffffffffffffffffffffffffff19166001600160601b039290921691909117905560018801546118eb9084906001600160a01b0316888a6146ac565b505050505050505050505050565b606060006119078784613dd7565b6004019050600184901b600061191d8288615990565b90508067ffffffffffffffff8111156119385761193861587e565b604051908082528060200260200182016040528015611961578160200160208202803683370190505b5093505b8015611a20576119758282615900565b905060006119ba848a8a61198987876159af565b818110611998576119986157c3565b9050602002013561ffff81106119b0576119b06157c3565b6003020188613849565b905060005b83811015611a19578181815181106119d9576119d96157c3565b60200260200101518682856119ee919061592e565b815181106119fe576119fe6157c3565b6020908102919091010152611a1281615894565b90506119bf565b5050611965565b50505095945050505050565b600060048381548110611a4157611a416157c3565b6000918252602090912060036203000190920201908101549091506001600160a01b03163314611a835760405162461bcd60e51b81526004016107b690615817565b60030180546001600160a01b0319166001600160a01b039290921691909117905550565b60606000611ab58784613dd7565b6004019050600185901b8067ffffffffffffffff811115611ad857611ad861587e565b604051908082528060200260200182016040528015611b01578160200160208202803683370190505b5092505b8015611b9f57611b16600282615900565b9050611b54828888600185901c818110611b3257611b326157c3565b9050602002013561ffff8110611b4a57611b4a6157c3565b6003020186614734565b848381518110611b6657611b666157c3565b6020026020010185846001611b7b919061592e565b81518110611b8b57611b8b6157c3565b602090810291909101019190915252611b05565b505095945050505050565b600080333214611bcc5760405162461bcd60e51b81526004016107b6906158ad565b611c0760048581548110611be257611be26157c3565b906000526020600020906203000102016004018461ffff8110611243576112436157c3565b915091505b9250929050565b604080516060810182526001805460ff8116835261ffff61010082048116602085015263010000009091041692820192909252908414611c825760405162461bcd60e51b815260206004820152600a6024820152694e4f4d3a217363616c6560b01b60448201526064016107b6565b600060048681548110611c9757611c976157c3565b9060005260206000209062030001020190506000611cb433614ace565b9050600060028281548110611ccb57611ccb6157c3565b60009182526020909120600285810154604088015160019290940290920101925061ffff600160f01b9091048116913491611d3c9185917304abeda201850ac0124161f037efd70c74ddc74c91611d23911686615990565b611d3690683635c9adc5dea00000615990565b84614ba1565b8554909150611d789084906001600160a01b038116908c90611d6e90600160a01b90046001600160601b031687615990565b611d369190615990565b90505b8115611ec357600060048601611d9084615917565b93508361ffff8110611da457611da46157c3565b6003020190506000898985818110611dbe57611dbe6157c3565b90506020020135905060008111611e095760405162461bcd60e51b815260206004820152600f60248201526e1393d34e88595c5d5a5d985b195b9d608a1b60448201526064016107b6565b8154611e2a9086906001600160a01b0316611e24848f615990565b86614ba1565b9250611e3688836141b6565b6002820154604080518e81526020810187905233818301526060810192909252608082018d905260a08201839052517fa9f51105abd325b0b448a253f5a627f7e2b99b1f2ff238d0779128d29ac3d85b9181900360c00190a1611ebc82600201878d8b6040015161ffff1688600014611eb0576000611eb3565b60015b60ff1686614c1a565b5050611d7b565b50505050505050505050565b600060028281548110611ee457611ee46157c3565b60009182526020909120600290910201546001600160a01b031692915050565b600080546040516391e1472b60e01b815233600482015260248101929092526001600160a01b0316906391e1472b90604401602060405180830381865afa158015611f53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f77919061585c565b611faf5760405162461bcd60e51b81526020600482015260096024820152682722a9aa1d10b3b7bb60b91b60448201526064016107b6565b8060016108b182826159e1565b60008060048381548110611fd257611fd26157c3565b60009182526020909120620300019091020160068101805491925090600a5b81156120ea5760008361200384615917565b93508381548110612016576120166157c3565b60009182526020918290206040805161012081018252929091015463ffffffff8082168452600160201b8204811694840194909452600160401b8104841691830191909152600160601b810483166060830152600160801b81049092166080820152600160a01b820462ffffff1660a0820152600160b81b820460ff90811660c0830152600160c01b83041660e08201819052600160c81b90920466ffffffffffffff166101008201529150156120e45760208101516120dc9063ffffffff1643615900565b9150506120ea565b50611ff1565b6003840154610190906121239061210e90600160a01b900463ffffffff1643615900565b6003870154600160d01b900461ffff16614129565b600186015461214290600160a01b90046001600160601b031684615990565b61214c9190615990565b61215691906159af565b9695505050505050565b600080600060048581548110612178576121786157c3565b60009182526020822060046203000190920201019060030201600201905061225981858387815481106121ad576121ad6157c3565b60009182526020918290206040805161012081018252919092015463ffffffff8082168352600160201b8204811694830194909452600160401b8104841692820192909252600160601b820483166060820152600160801b8204909216608083015262ffffff600160a01b82041660a083015260ff600160b81b8204811660c0840152600160c01b82041660e083015266ffffffffffffff600160c81b90910416610100820152613fcf565b92509250509250929050565b600454604080519182526001600160a01b0388811660208401526001600160601b0388168383015286166060830152517fd5d675c43c23a6c1e3ad060a603f30590f57c52d5e4a71994bf009848e8fe9e19181900360800190a16004805460018101825560009182526001600160a01b03888116600160a01b6001600160601b038a168102919091177f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b620300019094029384019081557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19c840180546001600160a01b031916938a16939093179092557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19d8301805461ffff60e01b16600160f01b61ffff8916021790557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19e90920180546001600160c01b0319163363ffffffff60a01b1916174363ffffffff1690930292909217909155905b8381101561259c578484828181106123f8576123f86157c3565b905060200201602081019061240d9190615120565b6001600160a01b0316886001600160a01b03160361246d5760405162461bcd60e51b815260206004820152601c60248201527f4e4f4d3a746f6b656e2063616e277420657175616c20746f6b656e300000000060448201526064016107b6565b60005b8181101561252c5785858281811061248a5761248a6157c3565b905060200201602081019061249f9190615120565b6001600160a01b03168686848181106124ba576124ba6157c3565b90506020020160208101906124cf9190615120565b6001600160a01b03160361251c5760405162461bcd60e51b81526020600482015260146024820152731393d34e9d1bdad95b881c995a5d195c985d195960621b60448201526064016107b6565b61252581615894565b9050612470565b5084848281811061253f5761253f6157c3565b90506020020160208101906125549190615120565b826004018261ffff811061256a5761256a6157c3565b6003020180546001600160a01b0319166001600160a01b039290921691909117905561259581615894565b90506123de565b506125a7818361377b565b50505050505050565b6125b981614dc5565b50600280546001018155600052565b6000600483815481106125dd576125dd6157c3565b6000918252602090912060036203000190920201908101549091506001600160a01b0316331461261f5760405162461bcd60e51b81526004016107b690615817565b80546001600160a01b0380841691160361267b5760405162461bcd60e51b815260206004820152601c60248201527f4e4f4d3a746f6b656e2063616e277420657175616c20746f6b656e300000000060448201526064016107b6565b6002810154600160f01b900461ffff1660005b8181101561271857836001600160a01b0316836004018261ffff81106126b6576126b66157c3565b60030201546001600160a01b0316036127085760405162461bcd60e51b81526020600482015260146024820152731393d34e9d1bdad95b881c995a5d195c985d195960621b60448201526064016107b6565b61271181615894565b905061268e565b5082826004018261ffff8110612730576127306157c3565b6003020180546001600160a01b0319166001600160a01b0392909216919091179055600282018054601e9061276f90600160f01b900461ffff16615a56565b91906101000a81548161ffff021916908361ffff16021790555050505050565b6040805160608101825260015460ff8116825261ffff61010082048116602084015263010000009091041691810191909152826127fc5760405162461bcd60e51b815260206004820152600b60248201526a4e4d3a2174616b654e756d60a81b60448201526064016107b6565b600082116128385760405162461bcd60e51b81526020600482015260096024820152684e4d3a21707269636560b81b60448201526064016107b6565b60006004878154811061284d5761284d6157c3565b9060005260206000209062030001020190506000816004016201000088106128815761287c6201000089615900565b612883565b875b61ffff8110612894576128946157c3565b60030201905060008160020187815481106128b1576128b16157c3565b60009182526020918290206040805161012081018252929091015463ffffffff8082168452600160201b82048116848601819052600160401b8304821693850193909352600160601b820481166060850152600160801b8204166080840152600160a01b810462ffffff1660a0840152600160b81b810460ff90811660c0850152600160c01b82041660e0840152600160c81b900466ffffffffffffff1661010083015291860151909250439161296c9161ffff169061592e565b10156129a65760405162461bcd60e51b81526020600482015260096024820152684e4d3a21737461746560b81b60448201526064016107b6565b85816040015163ffffffff166129bc9190615900565b63ffffffff16604082015260006129d233614ace565b90506000826080015163ffffffff16836060015163ffffffff166129f6919061592e565b60a0840151612a0e9062ffffff1660028b901b615990565b612a1891906159af565b60c0840151909150889060ff90811690811015612a4f57875160ff16811015612a4357600182901b91505b612a4c81615894565b90505b600060028581548110612a6457612a646157c3565b906000526020600020906002020160010190506000349050620100008e1015612ce7578b876060015163ffffffff16612a9d9190615900565b63ffffffff90811660608901526080880151612abb918e911661592e565b63ffffffff1660808801526002880180548891908f908110612adf57612adf6157c3565b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160086101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001600c6101000a81548163ffffffff021916908363ffffffff16021790555060808201518160000160106101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160000160146101000a81548162ffffff021916908362ffffff16021790555060c08201518160000160176101000a81548160ff021916908360ff16021790555060e08201518160000160186101000a81548160ff021916908360ff1602179055506101008201518160000160196101000a81548166ffffffffffffff021916908366ffffffffffffff160217905550905050612c8d828a60000160009054906101000a90046001600160a01b03168b60000160149054906101000a90046001600160601b03166001600160601b03168f88611d6e9190615900565b8854610100890151919250612ce09184916001600160a01b0316908f90600681901c6603ffffffffffff1660029190911b60fc161b612ccc9190615990565b612cd68f89615990565b611d36919061592e565b9050612fac565b612cf4620100008f615900565b9d508b876060015163ffffffff16612d0c919061592e565b63ffffffff90811660608901526080880151612d2a918e9116615900565b63ffffffff1660808801526002880180548891908f908110612d4e57612d4e6157c3565b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160086101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001600c6101000a81548163ffffffff021916908363ffffffff16021790555060808201518160000160106101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160000160146101000a81548162ffffff021916908362ffffff16021790555060c08201518160000160176101000a81548160ff021916908360ff16021790555060e08201518160000160186101000a81548160ff021916908360ff1602179055506101008201518160000160196101000a81548166ffffffffffffff021916908366ffffffffffffff160217905550905050612efc828a60000160009054906101000a90046001600160a01b03168b60000160149054906101000a90046001600160601b03166001600160601b03168f88611d6e919061592e565b6101008801519091506000908d90600681901c6603ffffffffffff1660029190911b60fc161b612f2c9190615990565b905080612f398d87615990565b1115612f7f57612f78838a60000160009054906101000a90046001600160a01b0316838f89612f689190615990565b612f729190615900565b85614ba1565b9150612faa565b8854612faa9084906001600160a01b0316612f9a8f89615990565b612fa49085615900565b33614e33565b505b612fd8827304abeda201850ac0124161f037efd70c74ddc74c611d3688683635c9adc5dea00000615990565b905080156130135760405162461bcd60e51b81526020600482015260086024820152674e4f4d3a2166656560c01b60448201526064016107b6565b505061301f88876141b6565b6002860154604080518f8152602081018f9052338183015260608101929092526080820184905260a082018b9052517fa9f51105abd325b0b448a253f5a627f7e2b99b1f2ff238d0779128d29ac3d85b9181900360c00190a161308d86600201858486600886901b8e614c1a565b50505050505050505050505050565b60603332146130bd5760405162461bcd60e51b81526004016107b6906158ad565b613102600485815481106130d3576130d36157c3565b906000526020600020906203000102016004018461ffff81106130f8576130f86157c3565b6003020183613849565b949350505050565b600080808033321461312e5760405162461bcd60e51b81526004016107b6906158ad565b61317260048781548110613144576131446157c3565b906000526020600020906203000102016004018661ffff8110613169576131696157c3565b60030201613aa4565b9299919850965090945092505050565b600060048281548110613197576131976157c3565b60009182526020909120620300019091020160020154600160801b90046001600160601b031692915050565b606060006131d18684613dd7565b6004019050600284901b8067ffffffffffffffff8111156131f4576131f461587e565b60405190808252806020026020018201604052801561321d578160200160208202803683370190505b5092505b801561129757613232600482615900565b9050613266828787600285901c81811061324e5761324e6157c3565b9050602002013561ffff8110613169576131696157c3565b868581518110613278576132786157c3565b602002602001018786600161328d919061592e565b8151811061329d5761329d6157c3565b60200260200101888760026132b2919061592e565b815181106132c2576132c26157c3565b60200260200101898860036132d7919061592e565b815181106132e7576132e76157c3565b60209081029190910101939093529290915291905252613221565b6000803332146133245760405162461bcd60e51b81526004016107b6906158ad565b6133696004868154811061333a5761333a6157c3565b906000526020600020906203000102016004018561ffff811061335f5761335f6157c3565b6003020184614734565b91509150935093915050565b3360009081526003602052604081205460028054909190811061339a5761339a6157c3565b600091825260208083206001600160a01b03871684526001600290930201919091019052604081208054909250839183916133d6908490615900565b909155506108b19050833384614e7d565b606060006133f58784613dd7565b60040190506000600185901b600461340d919061592e565b9050600061341b8288615990565b90508067ffffffffffffffff8111156134365761343661587e565b60405190808252806020026020018201604052801561345f578160200160208202803683370190505b5093505b8015611a20576134738282615900565b9050600083898961348486866159af565b818110613493576134936157c3565b9050602002013561ffff81106134ab576134ab6157c3565b60030201905060006134bd8289613849565b905060005b846134ce82600461592e565b1015613526578181815181106134e6576134e66157c3565b60200260200101518782866134fb919061592e565b8151811061350b5761350b6157c3565b602090810291909101015261351f81615894565b90506134c2565b5060006004613535868661592e565b61353f9190615900565b905061354a83613aa4565b8a858151811061355c5761355c6157c3565b602002602001018b866001613571919061592e565b81518110613581576135816157c3565b602002602001018c876002613596919061592e565b815181106135a6576135a66157c3565b602002602001018d8860036135bb919061592e565b815181106135cb576135cb6157c3565b6020908102919091010193909352929091529190525250613463915050565b6001600160a01b038116600090815260036020526040812054600280549091908110613618576136186157c3565b600091825260208083206001600160a01b03871684526001600290930201919091019052604090205490505b92915050565b60006004838154811061365f5761365f6157c3565b6000918252602090912060036203000190920201908101549091506001600160a01b031633146136a15760405162461bcd60e51b81526004016107b690615817565b60018101546002820180546001600160a01b03909216918491906000906136d29084906001600160801b0316615a77565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555060006001600160a01b0316816001600160a01b03160361374b5760405133906001600160801b03851680156108fc02916000818181858888f19350505050158015613745573d6000803e3d6000fd5b5061375f565b61375f8133856001600160801b0316614e7d565b50505050565b6000600160601b821061377757600080fd5b5090565b6137886020820182615a97565b6001830180546001600160601b0392909216600160a01b026001600160a01b039092169190911790556137c16040820160208301615ab2565b60028301805461ffff92909216600160e01b0261ffff60e01b199092169190911790556137f46060820160408301615ab2565b60038301805461ffff92909216600160c01b0261ffff60c01b199092169190911790556138276080820160608301615ab2565b82600301601a6101000a81548161ffff021916908361ffff1602179055505050565b60606002830161385761501d565b6000600185901b94508467ffffffffffffffff8111156138795761387961587e565b6040519080825280602002602001820160405280156138a2578160200160208202803683370190505b506001548454919250610100900461ffff169060008080805b8a811015613a9457841580806139955750896138d687615917565b965086815481106138e9576138e96157c3565b60009182526020918290206040805161012081018252929091015463ffffffff8082168452600160201b82048116948401859052600160401b8204811692840192909252600160601b810482166060840152600160801b81049091166080830152600160a01b810462ffffff1660a0830152600160b81b810460ff90811660c0840152600160c01b82041660e0830152600160c81b900466ffffffffffffff1661010082015299508314155b15613a3f576000851180156139b25750436139b0888561592e565b105b15613a1d576139c1878461592e565b88836139cc81615894565b9450815181106139de576139de6157c3565b60209081029190910101526139f385856159af565b88836139fe81615894565b945081518110613a1057613a106157c3565b6020026020010181815250505b8015613a295750613a94565b6000945060009350886020015163ffffffff1692505b604089015163ffffffff16613a54818761592e565b6101008b01519096508190600681901c6603ffffffffffff1660029190911b60fc161b613a819190615990565b613a8b908661592e565b945050506138bb565b50949a9950505050505050505050565b6040805160c081018252600183015463ffffffff8082168352600160201b820481166020840152600160401b82041692820183905266ffffffffffffff600160601b820481166060840152600160981b820416608083015265ffffffffffff600160d01b9091041660a08201526000918291829182919015613bad576001546020820151613b4191610100900461ffff169063ffffffff1661592e565b6060820151600681901c6603ffffffffffff1660029190911b60fc161b6080830151600681901c6603ffffffffffff1660029190911b60fc161b60308460a0015165ffffffffffff16670de0b6b3a7640000613b9d9190615990565b901c945094509450945050613bbd565b6000806000809450945094509450505b9193509193565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b1790529151600092839290881691613c289190615acf565b6000604051808303816000865af19150503d8060008114613c65576040519150601f19603f3d011682016040523d82523d6000602084013e613c6a565b606091505b5091509150818015613c94575080511580613c94575080806020019051810190613c94919061585c565b613cec5760405162461bcd60e51b8152602060048201526024808201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f46416044820152631253115160e21b60648201526084016107b6565b505050505050565b613cfc614fc9565b6040518061014001604052808363ffffffff168152602001613d27856000015163ffffffff16611ecf565b6001600160a01b03168152602001846020015163ffffffff168152602001846040015163ffffffff168152602001846060015163ffffffff168152602001846080015163ffffffff1681526020018460a0015162ffffff1681526020018460c0015160ff1681526020018460e0015160ff168152602001613dc58561010001516603ffffffffffff600682901c1660fc60029290921b919091161b90565b6001600160981b031690529392505050565b600060048381548110613dec57613dec6157c3565b6000918252602082206203000191909102016003810154909250613e2290655af3107a400090600160c01b900461ffff16615990565b905080341115613e71576001600160a01b0383166108fc613e438334615900565b6040518115909202916000818181858888f19350505050158015613e6b573d6000803e3d6000fd5b50613eab565b803414613eab5760405162461bcd60e51b81526020600482015260086024820152674e4f503a2166656560c01b60448201526064016107b6565b613eb481613765565b600283018054601090613ed8908490600160801b90046001600160601b0316615b0a565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505092915050565b6040805160c081018252600183015463ffffffff8082168352600160201b820481166020840152600160401b82041692820183905266ffffffffffffff600160601b820481166060840152600160981b820416608083015265ffffffffffff600160d01b9091041660a082015260009182919015613fc3576001546020820151613f9c91610100900461ffff169063ffffffff1661592e565b6060820151600681901c6603ffffffffffff1660029190911b60fc161b9250925050915091565b50600093849350915050565b8254602082015160e083015160009260ff9091169163ffffffff16855b82613ff682615894565b91508110801561402f575081888281548110614014576140146157c3565b600091825260209091200154600160201b900463ffffffff16145b1561406d57878181548110614046576140466157c3565b60009182526020909120015461406690600160c01b900460ff168561592e565b9350613fec565b50805b6000871180156140b75750818861408689615917565b98508881548110614099576140996157c3565b600091825260209091200154600160201b900463ffffffff16915081145b156140f5578787815481106140ce576140ce6157c3565b6000918252602090912001546140ee90600160c01b900460ff168561592e565b9350614070565b600087118061410357508082115b15614119576141128183615900565b945061411e565b600a94505b505050935093915050565b600063016e360083101561417c57600061414662249f00856159af565b905061415481612710615c10565b61415e8285615c10565b61416a90610190615990565b61417491906159af565b915050613644565b701d6329f1c35ca4bfabb9f5610000000000614199600a84615c1c565b6141a590610190615990565b6141af91906159af565b9392505050565b6040805160c081018252600183015463ffffffff808216808452600160201b8304821660208501819052600160401b840490921694840194909452600160601b820466ffffffffffffff9081166060850152600160981b8304166080840152600160d01b90910465ffffffffffff1660a0830152600284018054909390916000808061424061501d565b600087871015806143205750438c6020015161ffff168b8981548110614268576142686157c3565b60009182526020918290206040805161012081018252929091015463ffffffff8082168452600160201b82048116948401859052600160401b8204811692840192909252600160601b810482166060840152600160801b81049091166080830152600160a01b810462ffffff1660a0830152600160b81b810460ff90811660c0840152600160c01b82041660e0830152600160c81b900466ffffffffffffff16610100820152909550935061431d908561592e565b10155b9050808061432e5750828614155b156144ff5784156144fb576060890151600681901c6603ffffffffffff1660029190911b60fc161b600061436287876159af565b63ffffffff881660408d0152905061437981614f91565b66ffffffffffffff1660608c01526000965086955081156144d15760808b01516143de90600a908390600681901c6603ffffffffffff1660029190911b60fc161b6143c5906009615990565b6143cf919061592e565b6143d991906159af565b614f91565b66ffffffffffffff1660808c01526143fa82603083901b6159af565b9150600160301b82111561441d57614416600160301b83615900565b915061442e565b61442b82600160301b615900565b91505b600a60308c6020015163ffffffff168a6144489190615900565b6136b06144558680615990565b614461906103e8615990565b61446b91906159af565b61447591906159af565b901c8c60a0015165ffffffffffff1660096144909190615990565b61449a919061592e565b6144a491906159af565b915065ffffffffffff8211156144be5765ffffffffffff91505b65ffffffffffff821660a08c01526144ec565b60608b015166ffffffffffffff1660808c0152600060a08c01525b505063ffffffff861660208a01525b8295505b801561450b5750614575565b60408201516145209063ffffffff168661592e565b604083015161010084015191965063ffffffff1690600681901c6603ffffffffffff1660029190911b60fc161b6145579190615990565b614561908561592e565b9350508561456e90615894565b9550614240565b875163ffffffff1686111561469f5785886000019063ffffffff16908163ffffffff1681525050878a60010160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160086101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001600c6101000a81548166ffffffffffffff021916908366ffffffffffffff16021790555060808201518160000160136101000a81548166ffffffffffffff021916908366ffffffffffffff16021790555060a082015181600001601a6101000a81548165ffffffffffff021916908365ffffffffffff1602179055509050505b5050505050505050505050565b811561375f576001600160a01b038316614701576146c981611ecf565b6001600160a01b03166108fc839081150290604051600060405180830381858888f19350505050158015613745573d6000803e3d6000fd5b6001600160a01b0383166000908152602085905260408120805484929061472990849061592e565b909155505050505050565b60015460028301805460009283929161010090910461ffff1690838061475a8489615900565b97506000614769600185615900565b905060005b818110156147e9576001614782838361592e565b901c9350868481548110614798576147986157c3565b600091825260209091200154600160201b900463ffffffff169250828a11156147ce576147c484615894565b935083905061476e565b828a10156147e9576147df84615917565b935083915061476e565b50506000806000806147f961501d565b865b88811015614946578a8161480e81615894565b925081548110614820576148206157c3565b60009182526020918290206040805161012081018252929091015463ffffffff8082168452600160201b82048116948401859052600160401b8204811692840192909252600160601b810482166060840152600160801b81049091166080830152600160a01b810462ffffff1660a0830152600160b81b810460ff90811660c0840152600160c01b82041660e0830152600160c81b900466ffffffffffffff166101008201529097509150868e1061494657604082015163ffffffff169250821561494157836000036148f5578693506148fd565b868403614946575b614907838761592e565b6101008301519096508390600681901c6603ffffffffffff1660029190911b60fc161b6149349190615990565b61493e908661592e565b94505b6147fb565b505b8615614a8b578961495888615917565b9750878154811061496b5761496b6157c3565b60009182526020918290206040805161012081018252929091015463ffffffff8082168452600160201b8204811694840194909452600160401b81048416918301829052600160601b810484166060840152600160801b81049093166080830152600160a01b830462ffffff1660a0830152600160b81b830460ff90811660c0840152600160c01b84041660e0830152600160c81b90920466ffffffffffffff1661010082015290925090508115614a8657806020015163ffffffff16955082600003614a3a57859250614a42565b858303614a8b575b614a4c828661592e565b6101008201519095508290600681901c6603ffffffffffff1660029190911b60fc161b614a799190615990565b614a83908561592e565b93505b614948565b8415614ab857614a9b898461592e565b614aa586866159af565b9b509b5050505050505050505050611c0c565b5060009d8e9d509b505050505050505050505050565b6001600160a01b03811660009081526003602052604081205480820361364457506002546001600160a01b0383166000908152600360205260409020819055600160201b8110614b4f5760405162461bcd60e51b815260206004820152600c60248201526b4e4d3a216163636f756e747360a01b60448201526064016107b6565b6002805460018101825560008290527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace91020180546001600160a01b0319166001600160a01b03851617905592915050565b60006001600160a01b038416614bc257614bbb8383615900565b9050613102565b6001600160a01b0384166000908152602086905260409020805484811015614c025760008255614bfd863330614bf8858a615900565b613bc4565b614c0f565b614c0c8582615900565b82555b509195945050505050565b856040518061012001604052808763ffffffff1681526020014363ffffffff1681526020018663ffffffff1681526020018663ffffffff1681526020018663ffffffff1681526020018562ffffff168152602001600885901c60ff1681526020018460ff1660ff168152602001614c9084614f91565b66ffffffffffffff908116909152825460018101845560009384526020938490208351910180549484015160408501516060860151608087015160a088015160c089015160e08a0151610100909a0151909816600160c81b026001600160c81b0360ff9a8b16600160c01b0260ff60c01b199b909a16600160b81b029a909a1661ffff60b81b1962ffffff909316600160a01b0262ffffff60a01b1963ffffffff958616600160801b021666ffffffffffffff60801b19968616600160601b0263ffffffff60601b19988716600160401b029890981667ffffffffffffffff60401b19998716600160201b0267ffffffffffffffff19909f1696909b16959095179c909c1796909616979097179390931791909116179690961795909516949094179190911791909116179055505050505050565b6000546001600160a01b031615614e115760405162461bcd60e51b815260206004820152601060248201526f4e4553543a21696e697469616c697a6560801b60448201526064016107b6565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b811561375f576001600160a01b038316614701576040516001600160a01b0382169083156108fc029084906000818181858888f19350505050158015613745573d6000803e3d6000fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691614ed99190615acf565b6000604051808303816000865af19150503d8060008114614f16576040519150601f19603f3d011682016040523d82523d6000602084013e614f1b565b606091505b5091509150818015614f45575080511580614f45575080806020019051810190614f45919061585c565b6108495760405162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c45440060448201526064016107b6565b6000805b6603ffffffffffff831115614fbb5760049290921c91614fb481615894565b9050614f95565b60069290921b909117919050565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081019190915290565b6040805161012081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081019190915290565b6001600160a01b038116811461507e57600080fd5b50565b60008060006060848603121561509657600080fd5b8335925060208401356150a881615069565b929592945050506040919091013590565b6000608082840312156150cb57600080fd5b50919050565b60008060a083850312156150e457600080fd5b823591506150f584602085016150b9565b90509250929050565b6000806040838503121561511157600080fd5b50508035926020909101359150565b60006020828403121561513257600080fd5b81356141af81615069565b60006020828403121561514f57600080fd5b5035919050565b600081518084526020808501945080840160005b838110156151a357815180516001600160a01b031688528301516001600160601b0316838801526040909601959082019060010161516a565b509495945050505050565b6020815281516020820152600060208301516151d560408401826001600160a01b03169052565b5060408301516001600160601b03811660608401525060608301516001600160a01b03811660808401525060808301516001600160601b03811660a08401525060a08301516001600160801b03811660c08401525060c08301516001600160601b03811660e08401525060e08301516101006152568185018361ffff169052565b840151905061012061526d8482018361ffff169052565b8401519050610140615289848201836001600160a01b03169052565b84015190506101606152a28482018363ffffffff169052565b84015190506101806152b98482018361ffff169052565b84015190506101a06152d08482018361ffff169052565b8401516101c08481015290506131026101e0840182615156565b6000806000606084860312156152ff57600080fd5b505081359360208301359350604090920135919050565b600081518084526020808501945080840160005b838110156151a35781518752958201959082019060010161532a565b60a08152600061535960a0830188615316565b90508560208301528460408301528360608301528260808301529695505050505050565b6000806040838503121561539057600080fd5b8235915060208301356001600160801b03811681146153ae57600080fd5b809150509250929050565b600080600080600060a086880312156153d157600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b602080825282518282018190526000919060409081850190868401855b828110156154bd578151805163ffffffff9081168652878201516001600160a01b0316888701528682015181168787015260608083015182169087015260808083015182169087015260a0808301519091169086015260c08082015162ffffff169086015260e08082015160ff908116918701919091526101008083015190911690860152610120908101516001600160981b0316908501526101409093019290850190600101615411565b5091979650505050505050565b60008083601f8401126154dc57600080fd5b50813567ffffffffffffffff8111156154f457600080fd5b6020830191508360208260051b8501011115611c0c57600080fd5b6000806000806060858703121561552557600080fd5b84359350602085013567ffffffffffffffff81111561554357600080fd5b61554f878288016154ca565b909450925050604085013561556381615069565b939692955090935050565b6020815260006141af6020830184615316565b60008060006040848603121561559657600080fd5b83359250602084013567ffffffffffffffff8111156155b457600080fd5b6155c0868287016154ca565b9497909650939450505050565b6000806000806000608086880312156155e557600080fd5b85359450602086013567ffffffffffffffff81111561560357600080fd5b61560f888289016154ca565b90955093505060408601359150606086013561562a81615069565b809150509295509295909350565b6000806040838503121561564b57600080fd5b8235915060208301356153ae81615069565b6000806000806060858703121561567357600080fd5b8435935060208501359250604085013567ffffffffffffffff81111561569857600080fd5b6156a4878288016154ca565b95989497509550505050565b6000606082840312156150cb57600080fd5b80356001600160601b03811681146156d957600080fd5b919050565b60008060008060008061010087890312156156f857600080fd5b863561570381615069565b9550615711602088016156c2565b9450604087013561572181615069565b9350606087013567ffffffffffffffff81111561573d57600080fd5b61574989828a016154ca565b909450925061575d905088608089016150b9565b90509295509295509295565b6000806040838503121561577c57600080fd5b823561578781615069565b946020939093013593505050565b600080604083850312156157a857600080fd5b82356157b381615069565b915060208301356153ae81615069565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001600160601b038381169083168181101561580f5761580f6157d9565b039392505050565b6020808252600e908201526d2727a69d3737ba1037b832b732b960911b604082015260600190565b60006020828403121561585157600080fd5b81516141af81615069565b60006020828403121561586e57600080fd5b815180151581146141af57600080fd5b634e487b7160e01b600052604160045260246000fd5b6000600182016158a6576158a66157d9565b5060010190565b6020808252600e908201526d139154d50e8858dbdb9d1c9858dd60921b604082015260600190565b60006001600160801b038083168185168083038211156158f7576158f76157d9565b01949350505050565b600082821015615912576159126157d9565b500390565b600081615926576159266157d9565b506000190190565b60008219821115615941576159416157d9565b500190565b6000808335601e1984360301811261595d57600080fd5b83018035915067ffffffffffffffff82111561597857600080fd5b6020019150600581901b3603821315611c0c57600080fd5b60008160001904831182151516156159aa576159aa6157d9565b500290565b6000826159cc57634e487b7160e01b600052601260045260246000fd5b500490565b61ffff8116811461507e57600080fd5b813560ff81168082146159f357600080fd5b825460ff1981168217845591506020840135615a0e816159d1565b62ffff008160081b169050808262ffffff198516171784556040850135615a34816159d1565b64ffffffffff19939093169091171760189190911b64ffff0000001617905550565b600061ffff808316818103615a6d57615a6d6157d9565b6001019392505050565b60006001600160801b038381169083168181101561580f5761580f6157d9565b600060208284031215615aa957600080fd5b6141af826156c2565b600060208284031215615ac457600080fd5b81356141af816159d1565b6000825160005b81811015615af05760208186018101518583015201615ad6565b81811115615aff576000828501525b509190910192915050565b60006001600160601b038083168185168083038211156158f7576158f76157d9565b600181815b80851115615b67578160001904821115615b4d57615b4d6157d9565b80851615615b5a57918102915b93841c9390800290615b31565b509250929050565b600082615b7e57506001613644565b81615b8b57506000613644565b8160018114615ba15760028114615bab57615bc7565b6001915050613644565b60ff841115615bbc57615bbc6157d9565b50506001821b613644565b5060208310610133831016604e8410600b8410161715615bea575081810a613644565b615bf48383615b2c565b8060001904821115615c0857615c086157d9565b029392505050565b60006141af8383615b6f565b60006141af60ff841683615b6f56fea26469706673582212200cee153871bd293e04467f2aa670731da84919fc24550faf488e9dd64550843364736f6c634300080d0033
Deployed Bytecode
0x60806040526004361061020f5760003560e01c80639ba63e9e11610118578063d2a53f61116100a0578063f3a713211161006f578063f3a71321146106b2578063f3fef3a3146106d2578063f781feb3146106f2578063f7888aec14610705578063fd9b53871461072557600080fd5b8063d2a53f611461061f578063d4aa113c1461063f578063d99f05831461067f578063de0777ed1461069f57600080fd5b8063ba2d4a8f116100e7578063ba2d4a8f14610518578063c3f909d414610538578063c4d66de8146105cc578063c708ba0c146105ec578063c86fe6521461060c57600080fd5b80639ba63e9e1461047f5780639c792938146104c3578063a98e4e77146104e3578063b7e004fa146104f857600080fd5b80634353e7421161019b578063594e25b51161016a578063594e25b5146103e45780636e2f74b9146103f75780637ba3033d1461042c578063860506801461043f578063954b756f1461045f57600080fd5b80634353e74214610371578063493183541461039157806354a80f04146103b15780635938b38d146103c457600080fd5b80631c2f3e3d116101e25780631c2f3e3d146102965780631d7a4993146102d35780632a651c54146103005780632d1e4721146103315780633ac30e4b1461034457600080fd5b80630313766f14610214578063045b2f44146102365780630cdd53f6146102565780631c1b877214610276575b600080fd5b34801561022057600080fd5b5061023461022f366004615081565b610745565b005b34801561024257600080fd5b506102346102513660046150d1565b610850565b34801561026257600080fd5b506102346102713660046150fe565b6108b6565b34801561028257600080fd5b50610234610291366004615120565b610a56565b3480156102a257600080fd5b506000546102b6906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102df57600080fd5b506102f36102ee36600461513d565b610b35565b6040516102ca91906151ae565b34801561030c57600080fd5b5061032061031b3660046152ea565b610dac565b6040516102ca959493929190615346565b61023461033f36600461537d565b610e39565b34801561035057600080fd5b5061036461035f3660046153b9565b610f24565b6040516102ca91906153f4565b61038461037f36600461550f565b6111a0565b6040516102ca919061556e565b34801561039d57600080fd5b506102346103ac366004615581565b6112a1565b6103846103bf3660046155cd565b6118f9565b3480156103d057600080fd5b506102346103df366004615638565b611a2c565b6103846103f23660046155cd565b611aa7565b34801561040357600080fd5b506104176104123660046150fe565b611baa565b604080519283526020830191909152016102ca565b61023461043a36600461565d565b611c13565b34801561044b57600080fd5b506102b661045a36600461513d565b611ecf565b34801561046b57600080fd5b5061023461047a3660046156b0565b611f04565b34801561048b57600080fd5b506104b561049a366004615120565b6001600160a01b031660009081526003602052604090205490565b6040519081526020016102ca565b3480156104cf57600080fd5b506104b56104de36600461513d565b611fbc565b3480156104ef57600080fd5b506002546104b5565b34801561050457600080fd5b506104176105133660046150fe565b612160565b34801561052457600080fd5b506102346105333660046156de565b612265565b34801561054457600080fd5b5061059b6040805160608101825260008082526020820181905291810191909152506040805160608101825260015460ff8116825261ffff6101008204811660208401526301000000909104169181019190915290565b60408051825160ff16815260208084015161ffff9081169183019190915292820151909216908201526060016102ca565b3480156105d857600080fd5b506102346105e7366004615120565b6125b0565b3480156105f857600080fd5b50610234610607366004615638565b6125c8565b61023461061a3660046153b9565b61278f565b34801561062b57600080fd5b5061038461063a3660046152ea565b61309c565b34801561064b57600080fd5b5061065f61065a3660046150fe565b61310a565b6040805194855260208501939093529183015260608201526080016102ca565b34801561068b57600080fd5b506104b561069a36600461513d565b613182565b6103846106ad36600461550f565b6131c3565b3480156106be57600080fd5b506104176106cd3660046152ea565b613302565b3480156106de57600080fd5b506102346106ed366004615769565b613375565b6103846107003660046155cd565b6133e7565b34801561071157600080fd5b506104b5610720366004615795565b6135ea565b34801561073157600080fd5b5061023461074036600461537d565b61364a565b60006004848154811061075a5761075a6157c3565b6000918252602090912060036203000190920201908101549091506001600160a01b031633146107bf5760405162461bcd60e51b815260206004820152600b60248201526a2727a69d10b7b832b732b960a91b60448201526064015b60405180910390fd5b6107c882613765565b6002820180546010906107ec908490600160801b90046001600160601b03166157ef565b92506101000a8154816001600160601b0302191690836001600160601b03160217905550826001600160a01b03166108fc839081150290604051600060405180830381858888f19350505050158015610849573d6000803e3d6000fd5b5050505050565b600060048381548110610865576108656157c3565b6000918252602090912060036203000190920201908101549091506001600160a01b031633146108a75760405162461bcd60e51b81526004016107b690615817565b6108b1818361377b565b505050565b6000600483815481106108cb576108cb6157c3565b6000918252602090912060036203000190920201908101549091506001600160a01b0316331461092b5760405162461bcd60e51b815260206004820152600b60248201526a2727a69d10b7b832b732b960a91b60448201526064016107b6565b61093482613765565b600282018054601090610958908490600160801b90046001600160601b03166157ef565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555060008054906101000a90046001600160a01b03166001600160a01b0316638df18bb56040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f1919061583f565b6001600160a01b031663c840ff2683856040518363ffffffff1660e01b8152600401610a1f91815260200190565b6000604051808303818588803b158015610a3857600080fd5b505af1158015610a4c573d6000803e3d6000fd5b5050505050505050565b6000546001600160a01b031633811480610ada57506040516391e1472b60e01b8152336004820152600060248201526001600160a01b038216906391e1472b90604401602060405180830381865afa158015610ab6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ada919061585c565b610b125760405162461bcd60e51b81526020600482015260096024820152682722a9aa1d10b3b7bb60b91b60448201526064016107b6565b50600080546001600160a01b0319166001600160a01b0392909216919091179055565b604080516101c08101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e08201839052610100820183905261012082018390526101408201839052610160820183905261018082018390526101a08201526004805491929184908110610bbb57610bbb6157c3565b6000918252602082206203000191909102016002810154909250600160f01b900461ffff16908167ffffffffffffffff811115610bfa57610bfa61587e565b604051908082528060200260200182016040528015610c3f57816020015b6040805180820190915260008082526020820152815260200190600190039081610c185790505b50905060005b82811015610ccd576000846004018261ffff8110610c6557610c656157c3565b604080518082019091526003919091029190910180546001600160a01b0316825260028101546001600160601b031660208301528451909250849084908110610cb057610cb06157c3565b60200260200101819052505080610cc690615894565b9050610c45565b50604080516101c08101825295865283546001600160a01b0380821660208901526001600160601b03600160a01b92839004811693890193909352600186015480821660608a01528290048316608089015260028601546001600160801b03811660a08a0152600160801b810490931660c089015261ffff600160e01b8404811660e08a0152600160f01b909304831661010089015260039095015494851661012088015263ffffffff90850416610140870152600160c01b84048116610160870152600160d01b909304909216610180850152506101a08301525090565b60606000808080333214610dd25760405162461bcd60e51b81526004016107b6906158ad565b600060048981548110610de757610de76157c3565b906000526020600020906203000102016004018861ffff8110610e0c57610e0c6157c3565b600302019050610e1c8188613849565b9550610e2781613aa4565b989c929b509099509750945050505050565b600060048381548110610e4e57610e4e6157c3565b60009182526020909120620300019091020160018101549091506001600160a01b031680610ec557826001600160801b03163414610ec05760405162461bcd60e51b815260206004820152600f60248201526e2727a69d3b30bab63a1032b93937b960891b60448201526064016107b6565b610eda565b610eda813330866001600160801b0316613bc4565b600282018054849190600090610efa9084906001600160801b03166158d5565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555050505050565b6060333214610f455760405162461bcd60e51b81526004016107b6906158ad565b600060048781548110610f5a57610f5a6157c3565b906000526020600020906203000102016004018661ffff8110610f7f57610f7f6157c3565b60030201600201905060008467ffffffffffffffff811115610fa357610fa361587e565b604051908082528060200260200182016040528015610fdc57816020015b610fc9614fc9565b815260200190600190039081610fc15790505b508254909150600085810361111f576000610ff78984615900565b90506000888211611009576000611013565b6110138983615900565b90505b808211156111185761102782615917565b91506110eb86838154811061103e5761103e6157c3565b60009182526020918290206040805161012081018252919092015463ffffffff8082168352600160201b8204811694830194909452600160401b8104841692820192909252600160601b820483166060820152600160801b8204909216608083015262ffffff600160a01b82041660a083015260ff600160b81b8204811660c0840152600160c01b82041660e083015266ffffffffffffff600160c81b9091041661010082015283613cf4565b85846110f681615894565b955081518110611108576111086157c3565b6020026020010181905250611016565b5050611192565b87600061112c898361592e565b9050838111156111395750825b8082101561118f5761115686838154811061103e5761103e6157c3565b858461116181615894565b955081518110611173576111736157c3565b60200260200101819052508161118890615894565b9150611139565b50505b509098975050505050505050565b606060006111ae8684613dd7565b6004019050600184901b8067ffffffffffffffff8111156111d1576111d161587e565b6040519080825280602002602001820160405280156111fa578160200160208202803683370190505b5092505b80156112975761120f600282615900565b905061124c828787600185901c81811061122b5761122b6157c3565b9050602002013561ffff8110611243576112436157c3565b60030201613f03565b84838151811061125e5761125e6157c3565b6020026020010185846001611273919061592e565b81518110611283576112836157c3565b6020908102919091010191909152526111fe565b5050949350505050565b6040805160608101825260015460ff8116825261ffff610100820481166020840152630100000090910416918101919091526004805460009190869081106112eb576112eb6157c3565b90600052602060002090620300010201905060008060008060006002600081548110611319576113196157c3565b60009182526020918290206040805160608101825260018b810154600160a01b908190046001600160601b0316835260038d015490810463ffffffff1696830196909652600160d01b90950461ffff1691810191909152600292909202019091019150885b80156118215760006004890161139383615917565b92508261ffff81106113a7576113a76157c3565b6003020190506000808d8d858181106113c2576113c26157c3565b90506020028101906113d49190615946565b9150505b80156117f75760008e8e868181106113f2576113f26157c3565b90506020028101906114049190615946565b61140d84615917565b93508381811061141f5761141f6157c3565b905060200201359050600084600201828154811061143f5761143f6157c3565b600091825260208083206040805161012081018252939091015463ffffffff8082168552600160201b8204811693850193909352600160401b8104831691840191909152600160601b810482166060840152600160801b81049091166080830152600160a01b810462ffffff1660a0830152600160b81b810460ff90811660c0840152600160c01b82041660e0830152600160c81b900466ffffffffffffff1661010082015291508c900361152657806000015163ffffffff169b5060028c8154811061150e5761150e6157c3565b90600052602060002090600202016001019750611568565b805163ffffffff168c146115685760405162461bcd60e51b815260206004820152600960248201526827269d10b6b4b732b960b91b60448201526064016107b6565b60008c1180156115945750438e6020015161ffff16826020015163ffffffff16611592919061592e565b105b156117f057856000036116395760e081015160ff168015611637576000806115c0886002018686613fcf565b8b516020808e0151908801519395509193506101909284926115f6916115ec919063ffffffff16615900565b60408f0151614129565b6116008787615990565b61160a9190615990565b6116149190615990565b61161e91906159af565b61162891906159af565b611632908f61592e565b9d5050505b505b60a081015161164d9062ffffff168b61592e565b9950806060015163ffffffff1689611665919061592e565b6080820151610100830151919a5063ffffffff1690600681901c6603ffffffffffff1660029190911b60fc161b61169c9190615990565b6116a6908561592e565b60008083526060830181905260808301526002860180549195508291849081106116d2576116d26157c3565b60009182526020918290208351910180549284015160408501516060860151608087015160a088015160c089015160e08a0151610100909a015166ffffffffffffff16600160c81b026001600160c81b0360ff9b8c16600160c01b0260ff60c01b199c909316600160b81b029b909b1661ffff60b81b1962ffffff909416600160a01b0262ffffff60a01b1963ffffffff968716600160801b021666ffffffffffffff60801b19978716600160601b0263ffffffff60601b19998816600160401b029990991667ffffffffffffffff60401b199a8816600160201b0267ffffffffffffffff19909e1697909c16969096179b909b17979097169890981794909417929092161795909517949094161792909217929092169190911790555b50506113d8565b506118028b836141b6565b815461181a9086906001600160a01b0316838c6146ac565b505061137e565b5086546118559083906001600160a01b0381169061184f90600160a01b90046001600160601b031687615990565b896146ac565b611881827304abeda201850ac0124161f037efd70c74ddc74c61184f87683635c9adc5dea00000615990565b60028701546001600160801b03168086111561189b578095505b6118a58682615900565b6002890180546fffffffffffffffffffffffffffffffff19166001600160601b039290921691909117905560018801546118eb9084906001600160a01b0316888a6146ac565b505050505050505050505050565b606060006119078784613dd7565b6004019050600184901b600061191d8288615990565b90508067ffffffffffffffff8111156119385761193861587e565b604051908082528060200260200182016040528015611961578160200160208202803683370190505b5093505b8015611a20576119758282615900565b905060006119ba848a8a61198987876159af565b818110611998576119986157c3565b9050602002013561ffff81106119b0576119b06157c3565b6003020188613849565b905060005b83811015611a19578181815181106119d9576119d96157c3565b60200260200101518682856119ee919061592e565b815181106119fe576119fe6157c3565b6020908102919091010152611a1281615894565b90506119bf565b5050611965565b50505095945050505050565b600060048381548110611a4157611a416157c3565b6000918252602090912060036203000190920201908101549091506001600160a01b03163314611a835760405162461bcd60e51b81526004016107b690615817565b60030180546001600160a01b0319166001600160a01b039290921691909117905550565b60606000611ab58784613dd7565b6004019050600185901b8067ffffffffffffffff811115611ad857611ad861587e565b604051908082528060200260200182016040528015611b01578160200160208202803683370190505b5092505b8015611b9f57611b16600282615900565b9050611b54828888600185901c818110611b3257611b326157c3565b9050602002013561ffff8110611b4a57611b4a6157c3565b6003020186614734565b848381518110611b6657611b666157c3565b6020026020010185846001611b7b919061592e565b81518110611b8b57611b8b6157c3565b602090810291909101019190915252611b05565b505095945050505050565b600080333214611bcc5760405162461bcd60e51b81526004016107b6906158ad565b611c0760048581548110611be257611be26157c3565b906000526020600020906203000102016004018461ffff8110611243576112436157c3565b915091505b9250929050565b604080516060810182526001805460ff8116835261ffff61010082048116602085015263010000009091041692820192909252908414611c825760405162461bcd60e51b815260206004820152600a6024820152694e4f4d3a217363616c6560b01b60448201526064016107b6565b600060048681548110611c9757611c976157c3565b9060005260206000209062030001020190506000611cb433614ace565b9050600060028281548110611ccb57611ccb6157c3565b60009182526020909120600285810154604088015160019290940290920101925061ffff600160f01b9091048116913491611d3c9185917304abeda201850ac0124161f037efd70c74ddc74c91611d23911686615990565b611d3690683635c9adc5dea00000615990565b84614ba1565b8554909150611d789084906001600160a01b038116908c90611d6e90600160a01b90046001600160601b031687615990565b611d369190615990565b90505b8115611ec357600060048601611d9084615917565b93508361ffff8110611da457611da46157c3565b6003020190506000898985818110611dbe57611dbe6157c3565b90506020020135905060008111611e095760405162461bcd60e51b815260206004820152600f60248201526e1393d34e88595c5d5a5d985b195b9d608a1b60448201526064016107b6565b8154611e2a9086906001600160a01b0316611e24848f615990565b86614ba1565b9250611e3688836141b6565b6002820154604080518e81526020810187905233818301526060810192909252608082018d905260a08201839052517fa9f51105abd325b0b448a253f5a627f7e2b99b1f2ff238d0779128d29ac3d85b9181900360c00190a1611ebc82600201878d8b6040015161ffff1688600014611eb0576000611eb3565b60015b60ff1686614c1a565b5050611d7b565b50505050505050505050565b600060028281548110611ee457611ee46157c3565b60009182526020909120600290910201546001600160a01b031692915050565b600080546040516391e1472b60e01b815233600482015260248101929092526001600160a01b0316906391e1472b90604401602060405180830381865afa158015611f53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f77919061585c565b611faf5760405162461bcd60e51b81526020600482015260096024820152682722a9aa1d10b3b7bb60b91b60448201526064016107b6565b8060016108b182826159e1565b60008060048381548110611fd257611fd26157c3565b60009182526020909120620300019091020160068101805491925090600a5b81156120ea5760008361200384615917565b93508381548110612016576120166157c3565b60009182526020918290206040805161012081018252929091015463ffffffff8082168452600160201b8204811694840194909452600160401b8104841691830191909152600160601b810483166060830152600160801b81049092166080820152600160a01b820462ffffff1660a0820152600160b81b820460ff90811660c0830152600160c01b83041660e08201819052600160c81b90920466ffffffffffffff166101008201529150156120e45760208101516120dc9063ffffffff1643615900565b9150506120ea565b50611ff1565b6003840154610190906121239061210e90600160a01b900463ffffffff1643615900565b6003870154600160d01b900461ffff16614129565b600186015461214290600160a01b90046001600160601b031684615990565b61214c9190615990565b61215691906159af565b9695505050505050565b600080600060048581548110612178576121786157c3565b60009182526020822060046203000190920201019060030201600201905061225981858387815481106121ad576121ad6157c3565b60009182526020918290206040805161012081018252919092015463ffffffff8082168352600160201b8204811694830194909452600160401b8104841692820192909252600160601b820483166060820152600160801b8204909216608083015262ffffff600160a01b82041660a083015260ff600160b81b8204811660c0840152600160c01b82041660e083015266ffffffffffffff600160c81b90910416610100820152613fcf565b92509250509250929050565b600454604080519182526001600160a01b0388811660208401526001600160601b0388168383015286166060830152517fd5d675c43c23a6c1e3ad060a603f30590f57c52d5e4a71994bf009848e8fe9e19181900360800190a16004805460018101825560009182526001600160a01b03888116600160a01b6001600160601b038a168102919091177f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b620300019094029384019081557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19c840180546001600160a01b031916938a16939093179092557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19d8301805461ffff60e01b16600160f01b61ffff8916021790557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19e90920180546001600160c01b0319163363ffffffff60a01b1916174363ffffffff1690930292909217909155905b8381101561259c578484828181106123f8576123f86157c3565b905060200201602081019061240d9190615120565b6001600160a01b0316886001600160a01b03160361246d5760405162461bcd60e51b815260206004820152601c60248201527f4e4f4d3a746f6b656e2063616e277420657175616c20746f6b656e300000000060448201526064016107b6565b60005b8181101561252c5785858281811061248a5761248a6157c3565b905060200201602081019061249f9190615120565b6001600160a01b03168686848181106124ba576124ba6157c3565b90506020020160208101906124cf9190615120565b6001600160a01b03160361251c5760405162461bcd60e51b81526020600482015260146024820152731393d34e9d1bdad95b881c995a5d195c985d195960621b60448201526064016107b6565b61252581615894565b9050612470565b5084848281811061253f5761253f6157c3565b90506020020160208101906125549190615120565b826004018261ffff811061256a5761256a6157c3565b6003020180546001600160a01b0319166001600160a01b039290921691909117905561259581615894565b90506123de565b506125a7818361377b565b50505050505050565b6125b981614dc5565b50600280546001018155600052565b6000600483815481106125dd576125dd6157c3565b6000918252602090912060036203000190920201908101549091506001600160a01b0316331461261f5760405162461bcd60e51b81526004016107b690615817565b80546001600160a01b0380841691160361267b5760405162461bcd60e51b815260206004820152601c60248201527f4e4f4d3a746f6b656e2063616e277420657175616c20746f6b656e300000000060448201526064016107b6565b6002810154600160f01b900461ffff1660005b8181101561271857836001600160a01b0316836004018261ffff81106126b6576126b66157c3565b60030201546001600160a01b0316036127085760405162461bcd60e51b81526020600482015260146024820152731393d34e9d1bdad95b881c995a5d195c985d195960621b60448201526064016107b6565b61271181615894565b905061268e565b5082826004018261ffff8110612730576127306157c3565b6003020180546001600160a01b0319166001600160a01b0392909216919091179055600282018054601e9061276f90600160f01b900461ffff16615a56565b91906101000a81548161ffff021916908361ffff16021790555050505050565b6040805160608101825260015460ff8116825261ffff61010082048116602084015263010000009091041691810191909152826127fc5760405162461bcd60e51b815260206004820152600b60248201526a4e4d3a2174616b654e756d60a81b60448201526064016107b6565b600082116128385760405162461bcd60e51b81526020600482015260096024820152684e4d3a21707269636560b81b60448201526064016107b6565b60006004878154811061284d5761284d6157c3565b9060005260206000209062030001020190506000816004016201000088106128815761287c6201000089615900565b612883565b875b61ffff8110612894576128946157c3565b60030201905060008160020187815481106128b1576128b16157c3565b60009182526020918290206040805161012081018252929091015463ffffffff8082168452600160201b82048116848601819052600160401b8304821693850193909352600160601b820481166060850152600160801b8204166080840152600160a01b810462ffffff1660a0840152600160b81b810460ff90811660c0850152600160c01b82041660e0840152600160c81b900466ffffffffffffff1661010083015291860151909250439161296c9161ffff169061592e565b10156129a65760405162461bcd60e51b81526020600482015260096024820152684e4d3a21737461746560b81b60448201526064016107b6565b85816040015163ffffffff166129bc9190615900565b63ffffffff16604082015260006129d233614ace565b90506000826080015163ffffffff16836060015163ffffffff166129f6919061592e565b60a0840151612a0e9062ffffff1660028b901b615990565b612a1891906159af565b60c0840151909150889060ff90811690811015612a4f57875160ff16811015612a4357600182901b91505b612a4c81615894565b90505b600060028581548110612a6457612a646157c3565b906000526020600020906002020160010190506000349050620100008e1015612ce7578b876060015163ffffffff16612a9d9190615900565b63ffffffff90811660608901526080880151612abb918e911661592e565b63ffffffff1660808801526002880180548891908f908110612adf57612adf6157c3565b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160086101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001600c6101000a81548163ffffffff021916908363ffffffff16021790555060808201518160000160106101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160000160146101000a81548162ffffff021916908362ffffff16021790555060c08201518160000160176101000a81548160ff021916908360ff16021790555060e08201518160000160186101000a81548160ff021916908360ff1602179055506101008201518160000160196101000a81548166ffffffffffffff021916908366ffffffffffffff160217905550905050612c8d828a60000160009054906101000a90046001600160a01b03168b60000160149054906101000a90046001600160601b03166001600160601b03168f88611d6e9190615900565b8854610100890151919250612ce09184916001600160a01b0316908f90600681901c6603ffffffffffff1660029190911b60fc161b612ccc9190615990565b612cd68f89615990565b611d36919061592e565b9050612fac565b612cf4620100008f615900565b9d508b876060015163ffffffff16612d0c919061592e565b63ffffffff90811660608901526080880151612d2a918e9116615900565b63ffffffff1660808801526002880180548891908f908110612d4e57612d4e6157c3565b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160086101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001600c6101000a81548163ffffffff021916908363ffffffff16021790555060808201518160000160106101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160000160146101000a81548162ffffff021916908362ffffff16021790555060c08201518160000160176101000a81548160ff021916908360ff16021790555060e08201518160000160186101000a81548160ff021916908360ff1602179055506101008201518160000160196101000a81548166ffffffffffffff021916908366ffffffffffffff160217905550905050612efc828a60000160009054906101000a90046001600160a01b03168b60000160149054906101000a90046001600160601b03166001600160601b03168f88611d6e919061592e565b6101008801519091506000908d90600681901c6603ffffffffffff1660029190911b60fc161b612f2c9190615990565b905080612f398d87615990565b1115612f7f57612f78838a60000160009054906101000a90046001600160a01b0316838f89612f689190615990565b612f729190615900565b85614ba1565b9150612faa565b8854612faa9084906001600160a01b0316612f9a8f89615990565b612fa49085615900565b33614e33565b505b612fd8827304abeda201850ac0124161f037efd70c74ddc74c611d3688683635c9adc5dea00000615990565b905080156130135760405162461bcd60e51b81526020600482015260086024820152674e4f4d3a2166656560c01b60448201526064016107b6565b505061301f88876141b6565b6002860154604080518f8152602081018f9052338183015260608101929092526080820184905260a082018b9052517fa9f51105abd325b0b448a253f5a627f7e2b99b1f2ff238d0779128d29ac3d85b9181900360c00190a161308d86600201858486600886901b8e614c1a565b50505050505050505050505050565b60603332146130bd5760405162461bcd60e51b81526004016107b6906158ad565b613102600485815481106130d3576130d36157c3565b906000526020600020906203000102016004018461ffff81106130f8576130f86157c3565b6003020183613849565b949350505050565b600080808033321461312e5760405162461bcd60e51b81526004016107b6906158ad565b61317260048781548110613144576131446157c3565b906000526020600020906203000102016004018661ffff8110613169576131696157c3565b60030201613aa4565b9299919850965090945092505050565b600060048281548110613197576131976157c3565b60009182526020909120620300019091020160020154600160801b90046001600160601b031692915050565b606060006131d18684613dd7565b6004019050600284901b8067ffffffffffffffff8111156131f4576131f461587e565b60405190808252806020026020018201604052801561321d578160200160208202803683370190505b5092505b801561129757613232600482615900565b9050613266828787600285901c81811061324e5761324e6157c3565b9050602002013561ffff8110613169576131696157c3565b868581518110613278576132786157c3565b602002602001018786600161328d919061592e565b8151811061329d5761329d6157c3565b60200260200101888760026132b2919061592e565b815181106132c2576132c26157c3565b60200260200101898860036132d7919061592e565b815181106132e7576132e76157c3565b60209081029190910101939093529290915291905252613221565b6000803332146133245760405162461bcd60e51b81526004016107b6906158ad565b6133696004868154811061333a5761333a6157c3565b906000526020600020906203000102016004018561ffff811061335f5761335f6157c3565b6003020184614734565b91509150935093915050565b3360009081526003602052604081205460028054909190811061339a5761339a6157c3565b600091825260208083206001600160a01b03871684526001600290930201919091019052604081208054909250839183916133d6908490615900565b909155506108b19050833384614e7d565b606060006133f58784613dd7565b60040190506000600185901b600461340d919061592e565b9050600061341b8288615990565b90508067ffffffffffffffff8111156134365761343661587e565b60405190808252806020026020018201604052801561345f578160200160208202803683370190505b5093505b8015611a20576134738282615900565b9050600083898961348486866159af565b818110613493576134936157c3565b9050602002013561ffff81106134ab576134ab6157c3565b60030201905060006134bd8289613849565b905060005b846134ce82600461592e565b1015613526578181815181106134e6576134e66157c3565b60200260200101518782866134fb919061592e565b8151811061350b5761350b6157c3565b602090810291909101015261351f81615894565b90506134c2565b5060006004613535868661592e565b61353f9190615900565b905061354a83613aa4565b8a858151811061355c5761355c6157c3565b602002602001018b866001613571919061592e565b81518110613581576135816157c3565b602002602001018c876002613596919061592e565b815181106135a6576135a66157c3565b602002602001018d8860036135bb919061592e565b815181106135cb576135cb6157c3565b6020908102919091010193909352929091529190525250613463915050565b6001600160a01b038116600090815260036020526040812054600280549091908110613618576136186157c3565b600091825260208083206001600160a01b03871684526001600290930201919091019052604090205490505b92915050565b60006004838154811061365f5761365f6157c3565b6000918252602090912060036203000190920201908101549091506001600160a01b031633146136a15760405162461bcd60e51b81526004016107b690615817565b60018101546002820180546001600160a01b03909216918491906000906136d29084906001600160801b0316615a77565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555060006001600160a01b0316816001600160a01b03160361374b5760405133906001600160801b03851680156108fc02916000818181858888f19350505050158015613745573d6000803e3d6000fd5b5061375f565b61375f8133856001600160801b0316614e7d565b50505050565b6000600160601b821061377757600080fd5b5090565b6137886020820182615a97565b6001830180546001600160601b0392909216600160a01b026001600160a01b039092169190911790556137c16040820160208301615ab2565b60028301805461ffff92909216600160e01b0261ffff60e01b199092169190911790556137f46060820160408301615ab2565b60038301805461ffff92909216600160c01b0261ffff60c01b199092169190911790556138276080820160608301615ab2565b82600301601a6101000a81548161ffff021916908361ffff1602179055505050565b60606002830161385761501d565b6000600185901b94508467ffffffffffffffff8111156138795761387961587e565b6040519080825280602002602001820160405280156138a2578160200160208202803683370190505b506001548454919250610100900461ffff169060008080805b8a811015613a9457841580806139955750896138d687615917565b965086815481106138e9576138e96157c3565b60009182526020918290206040805161012081018252929091015463ffffffff8082168452600160201b82048116948401859052600160401b8204811692840192909252600160601b810482166060840152600160801b81049091166080830152600160a01b810462ffffff1660a0830152600160b81b810460ff90811660c0840152600160c01b82041660e0830152600160c81b900466ffffffffffffff1661010082015299508314155b15613a3f576000851180156139b25750436139b0888561592e565b105b15613a1d576139c1878461592e565b88836139cc81615894565b9450815181106139de576139de6157c3565b60209081029190910101526139f385856159af565b88836139fe81615894565b945081518110613a1057613a106157c3565b6020026020010181815250505b8015613a295750613a94565b6000945060009350886020015163ffffffff1692505b604089015163ffffffff16613a54818761592e565b6101008b01519096508190600681901c6603ffffffffffff1660029190911b60fc161b613a819190615990565b613a8b908661592e565b945050506138bb565b50949a9950505050505050505050565b6040805160c081018252600183015463ffffffff8082168352600160201b820481166020840152600160401b82041692820183905266ffffffffffffff600160601b820481166060840152600160981b820416608083015265ffffffffffff600160d01b9091041660a08201526000918291829182919015613bad576001546020820151613b4191610100900461ffff169063ffffffff1661592e565b6060820151600681901c6603ffffffffffff1660029190911b60fc161b6080830151600681901c6603ffffffffffff1660029190911b60fc161b60308460a0015165ffffffffffff16670de0b6b3a7640000613b9d9190615990565b901c945094509450945050613bbd565b6000806000809450945094509450505b9193509193565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b1790529151600092839290881691613c289190615acf565b6000604051808303816000865af19150503d8060008114613c65576040519150601f19603f3d011682016040523d82523d6000602084013e613c6a565b606091505b5091509150818015613c94575080511580613c94575080806020019051810190613c94919061585c565b613cec5760405162461bcd60e51b8152602060048201526024808201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f46416044820152631253115160e21b60648201526084016107b6565b505050505050565b613cfc614fc9565b6040518061014001604052808363ffffffff168152602001613d27856000015163ffffffff16611ecf565b6001600160a01b03168152602001846020015163ffffffff168152602001846040015163ffffffff168152602001846060015163ffffffff168152602001846080015163ffffffff1681526020018460a0015162ffffff1681526020018460c0015160ff1681526020018460e0015160ff168152602001613dc58561010001516603ffffffffffff600682901c1660fc60029290921b919091161b90565b6001600160981b031690529392505050565b600060048381548110613dec57613dec6157c3565b6000918252602082206203000191909102016003810154909250613e2290655af3107a400090600160c01b900461ffff16615990565b905080341115613e71576001600160a01b0383166108fc613e438334615900565b6040518115909202916000818181858888f19350505050158015613e6b573d6000803e3d6000fd5b50613eab565b803414613eab5760405162461bcd60e51b81526020600482015260086024820152674e4f503a2166656560c01b60448201526064016107b6565b613eb481613765565b600283018054601090613ed8908490600160801b90046001600160601b0316615b0a565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505092915050565b6040805160c081018252600183015463ffffffff8082168352600160201b820481166020840152600160401b82041692820183905266ffffffffffffff600160601b820481166060840152600160981b820416608083015265ffffffffffff600160d01b9091041660a082015260009182919015613fc3576001546020820151613f9c91610100900461ffff169063ffffffff1661592e565b6060820151600681901c6603ffffffffffff1660029190911b60fc161b9250925050915091565b50600093849350915050565b8254602082015160e083015160009260ff9091169163ffffffff16855b82613ff682615894565b91508110801561402f575081888281548110614014576140146157c3565b600091825260209091200154600160201b900463ffffffff16145b1561406d57878181548110614046576140466157c3565b60009182526020909120015461406690600160c01b900460ff168561592e565b9350613fec565b50805b6000871180156140b75750818861408689615917565b98508881548110614099576140996157c3565b600091825260209091200154600160201b900463ffffffff16915081145b156140f5578787815481106140ce576140ce6157c3565b6000918252602090912001546140ee90600160c01b900460ff168561592e565b9350614070565b600087118061410357508082115b15614119576141128183615900565b945061411e565b600a94505b505050935093915050565b600063016e360083101561417c57600061414662249f00856159af565b905061415481612710615c10565b61415e8285615c10565b61416a90610190615990565b61417491906159af565b915050613644565b701d6329f1c35ca4bfabb9f5610000000000614199600a84615c1c565b6141a590610190615990565b6141af91906159af565b9392505050565b6040805160c081018252600183015463ffffffff808216808452600160201b8304821660208501819052600160401b840490921694840194909452600160601b820466ffffffffffffff9081166060850152600160981b8304166080840152600160d01b90910465ffffffffffff1660a0830152600284018054909390916000808061424061501d565b600087871015806143205750438c6020015161ffff168b8981548110614268576142686157c3565b60009182526020918290206040805161012081018252929091015463ffffffff8082168452600160201b82048116948401859052600160401b8204811692840192909252600160601b810482166060840152600160801b81049091166080830152600160a01b810462ffffff1660a0830152600160b81b810460ff90811660c0840152600160c01b82041660e0830152600160c81b900466ffffffffffffff16610100820152909550935061431d908561592e565b10155b9050808061432e5750828614155b156144ff5784156144fb576060890151600681901c6603ffffffffffff1660029190911b60fc161b600061436287876159af565b63ffffffff881660408d0152905061437981614f91565b66ffffffffffffff1660608c01526000965086955081156144d15760808b01516143de90600a908390600681901c6603ffffffffffff1660029190911b60fc161b6143c5906009615990565b6143cf919061592e565b6143d991906159af565b614f91565b66ffffffffffffff1660808c01526143fa82603083901b6159af565b9150600160301b82111561441d57614416600160301b83615900565b915061442e565b61442b82600160301b615900565b91505b600a60308c6020015163ffffffff168a6144489190615900565b6136b06144558680615990565b614461906103e8615990565b61446b91906159af565b61447591906159af565b901c8c60a0015165ffffffffffff1660096144909190615990565b61449a919061592e565b6144a491906159af565b915065ffffffffffff8211156144be5765ffffffffffff91505b65ffffffffffff821660a08c01526144ec565b60608b015166ffffffffffffff1660808c0152600060a08c01525b505063ffffffff861660208a01525b8295505b801561450b5750614575565b60408201516145209063ffffffff168661592e565b604083015161010084015191965063ffffffff1690600681901c6603ffffffffffff1660029190911b60fc161b6145579190615990565b614561908561592e565b9350508561456e90615894565b9550614240565b875163ffffffff1686111561469f5785886000019063ffffffff16908163ffffffff1681525050878a60010160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160086101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001600c6101000a81548166ffffffffffffff021916908366ffffffffffffff16021790555060808201518160000160136101000a81548166ffffffffffffff021916908366ffffffffffffff16021790555060a082015181600001601a6101000a81548165ffffffffffff021916908365ffffffffffff1602179055509050505b5050505050505050505050565b811561375f576001600160a01b038316614701576146c981611ecf565b6001600160a01b03166108fc839081150290604051600060405180830381858888f19350505050158015613745573d6000803e3d6000fd5b6001600160a01b0383166000908152602085905260408120805484929061472990849061592e565b909155505050505050565b60015460028301805460009283929161010090910461ffff1690838061475a8489615900565b97506000614769600185615900565b905060005b818110156147e9576001614782838361592e565b901c9350868481548110614798576147986157c3565b600091825260209091200154600160201b900463ffffffff169250828a11156147ce576147c484615894565b935083905061476e565b828a10156147e9576147df84615917565b935083915061476e565b50506000806000806147f961501d565b865b88811015614946578a8161480e81615894565b925081548110614820576148206157c3565b60009182526020918290206040805161012081018252929091015463ffffffff8082168452600160201b82048116948401859052600160401b8204811692840192909252600160601b810482166060840152600160801b81049091166080830152600160a01b810462ffffff1660a0830152600160b81b810460ff90811660c0840152600160c01b82041660e0830152600160c81b900466ffffffffffffff166101008201529097509150868e1061494657604082015163ffffffff169250821561494157836000036148f5578693506148fd565b868403614946575b614907838761592e565b6101008301519096508390600681901c6603ffffffffffff1660029190911b60fc161b6149349190615990565b61493e908661592e565b94505b6147fb565b505b8615614a8b578961495888615917565b9750878154811061496b5761496b6157c3565b60009182526020918290206040805161012081018252929091015463ffffffff8082168452600160201b8204811694840194909452600160401b81048416918301829052600160601b810484166060840152600160801b81049093166080830152600160a01b830462ffffff1660a0830152600160b81b830460ff90811660c0840152600160c01b84041660e0830152600160c81b90920466ffffffffffffff1661010082015290925090508115614a8657806020015163ffffffff16955082600003614a3a57859250614a42565b858303614a8b575b614a4c828661592e565b6101008201519095508290600681901c6603ffffffffffff1660029190911b60fc161b614a799190615990565b614a83908561592e565b93505b614948565b8415614ab857614a9b898461592e565b614aa586866159af565b9b509b5050505050505050505050611c0c565b5060009d8e9d509b505050505050505050505050565b6001600160a01b03811660009081526003602052604081205480820361364457506002546001600160a01b0383166000908152600360205260409020819055600160201b8110614b4f5760405162461bcd60e51b815260206004820152600c60248201526b4e4d3a216163636f756e747360a01b60448201526064016107b6565b6002805460018101825560008290527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace91020180546001600160a01b0319166001600160a01b03851617905592915050565b60006001600160a01b038416614bc257614bbb8383615900565b9050613102565b6001600160a01b0384166000908152602086905260409020805484811015614c025760008255614bfd863330614bf8858a615900565b613bc4565b614c0f565b614c0c8582615900565b82555b509195945050505050565b856040518061012001604052808763ffffffff1681526020014363ffffffff1681526020018663ffffffff1681526020018663ffffffff1681526020018663ffffffff1681526020018562ffffff168152602001600885901c60ff1681526020018460ff1660ff168152602001614c9084614f91565b66ffffffffffffff908116909152825460018101845560009384526020938490208351910180549484015160408501516060860151608087015160a088015160c089015160e08a0151610100909a0151909816600160c81b026001600160c81b0360ff9a8b16600160c01b0260ff60c01b199b909a16600160b81b029a909a1661ffff60b81b1962ffffff909316600160a01b0262ffffff60a01b1963ffffffff958616600160801b021666ffffffffffffff60801b19968616600160601b0263ffffffff60601b19988716600160401b029890981667ffffffffffffffff60401b19998716600160201b0267ffffffffffffffff19909f1696909b16959095179c909c1796909616979097179390931791909116179690961795909516949094179190911791909116179055505050505050565b6000546001600160a01b031615614e115760405162461bcd60e51b815260206004820152601060248201526f4e4553543a21696e697469616c697a6560801b60448201526064016107b6565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b811561375f576001600160a01b038316614701576040516001600160a01b0382169083156108fc029084906000818181858888f19350505050158015613745573d6000803e3d6000fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691614ed99190615acf565b6000604051808303816000865af19150503d8060008114614f16576040519150601f19603f3d011682016040523d82523d6000602084013e614f1b565b606091505b5091509150818015614f45575080511580614f45575080806020019051810190614f45919061585c565b6108495760405162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c45440060448201526064016107b6565b6000805b6603ffffffffffff831115614fbb5760049290921c91614fb481615894565b9050614f95565b60069290921b909117919050565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081019190915290565b6040805161012081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081019190915290565b6001600160a01b038116811461507e57600080fd5b50565b60008060006060848603121561509657600080fd5b8335925060208401356150a881615069565b929592945050506040919091013590565b6000608082840312156150cb57600080fd5b50919050565b60008060a083850312156150e457600080fd5b823591506150f584602085016150b9565b90509250929050565b6000806040838503121561511157600080fd5b50508035926020909101359150565b60006020828403121561513257600080fd5b81356141af81615069565b60006020828403121561514f57600080fd5b5035919050565b600081518084526020808501945080840160005b838110156151a357815180516001600160a01b031688528301516001600160601b0316838801526040909601959082019060010161516a565b509495945050505050565b6020815281516020820152600060208301516151d560408401826001600160a01b03169052565b5060408301516001600160601b03811660608401525060608301516001600160a01b03811660808401525060808301516001600160601b03811660a08401525060a08301516001600160801b03811660c08401525060c08301516001600160601b03811660e08401525060e08301516101006152568185018361ffff169052565b840151905061012061526d8482018361ffff169052565b8401519050610140615289848201836001600160a01b03169052565b84015190506101606152a28482018363ffffffff169052565b84015190506101806152b98482018361ffff169052565b84015190506101a06152d08482018361ffff169052565b8401516101c08481015290506131026101e0840182615156565b6000806000606084860312156152ff57600080fd5b505081359360208301359350604090920135919050565b600081518084526020808501945080840160005b838110156151a35781518752958201959082019060010161532a565b60a08152600061535960a0830188615316565b90508560208301528460408301528360608301528260808301529695505050505050565b6000806040838503121561539057600080fd5b8235915060208301356001600160801b03811681146153ae57600080fd5b809150509250929050565b600080600080600060a086880312156153d157600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b602080825282518282018190526000919060409081850190868401855b828110156154bd578151805163ffffffff9081168652878201516001600160a01b0316888701528682015181168787015260608083015182169087015260808083015182169087015260a0808301519091169086015260c08082015162ffffff169086015260e08082015160ff908116918701919091526101008083015190911690860152610120908101516001600160981b0316908501526101409093019290850190600101615411565b5091979650505050505050565b60008083601f8401126154dc57600080fd5b50813567ffffffffffffffff8111156154f457600080fd5b6020830191508360208260051b8501011115611c0c57600080fd5b6000806000806060858703121561552557600080fd5b84359350602085013567ffffffffffffffff81111561554357600080fd5b61554f878288016154ca565b909450925050604085013561556381615069565b939692955090935050565b6020815260006141af6020830184615316565b60008060006040848603121561559657600080fd5b83359250602084013567ffffffffffffffff8111156155b457600080fd5b6155c0868287016154ca565b9497909650939450505050565b6000806000806000608086880312156155e557600080fd5b85359450602086013567ffffffffffffffff81111561560357600080fd5b61560f888289016154ca565b90955093505060408601359150606086013561562a81615069565b809150509295509295909350565b6000806040838503121561564b57600080fd5b8235915060208301356153ae81615069565b6000806000806060858703121561567357600080fd5b8435935060208501359250604085013567ffffffffffffffff81111561569857600080fd5b6156a4878288016154ca565b95989497509550505050565b6000606082840312156150cb57600080fd5b80356001600160601b03811681146156d957600080fd5b919050565b60008060008060008061010087890312156156f857600080fd5b863561570381615069565b9550615711602088016156c2565b9450604087013561572181615069565b9350606087013567ffffffffffffffff81111561573d57600080fd5b61574989828a016154ca565b909450925061575d905088608089016150b9565b90509295509295509295565b6000806040838503121561577c57600080fd5b823561578781615069565b946020939093013593505050565b600080604083850312156157a857600080fd5b82356157b381615069565b915060208301356153ae81615069565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001600160601b038381169083168181101561580f5761580f6157d9565b039392505050565b6020808252600e908201526d2727a69d3737ba1037b832b732b960911b604082015260600190565b60006020828403121561585157600080fd5b81516141af81615069565b60006020828403121561586e57600080fd5b815180151581146141af57600080fd5b634e487b7160e01b600052604160045260246000fd5b6000600182016158a6576158a66157d9565b5060010190565b6020808252600e908201526d139154d50e8858dbdb9d1c9858dd60921b604082015260600190565b60006001600160801b038083168185168083038211156158f7576158f76157d9565b01949350505050565b600082821015615912576159126157d9565b500390565b600081615926576159266157d9565b506000190190565b60008219821115615941576159416157d9565b500190565b6000808335601e1984360301811261595d57600080fd5b83018035915067ffffffffffffffff82111561597857600080fd5b6020019150600581901b3603821315611c0c57600080fd5b60008160001904831182151516156159aa576159aa6157d9565b500290565b6000826159cc57634e487b7160e01b600052601260045260246000fd5b500490565b61ffff8116811461507e57600080fd5b813560ff81168082146159f357600080fd5b825460ff1981168217845591506020840135615a0e816159d1565b62ffff008160081b169050808262ffffff198516171784556040850135615a34816159d1565b64ffffffffff19939093169091171760189190911b64ffff0000001617905550565b600061ffff808316818103615a6d57615a6d6157d9565b6001019392505050565b60006001600160801b038381169083168181101561580f5761580f6157d9565b600060208284031215615aa957600080fd5b6141af826156c2565b600060208284031215615ac457600080fd5b81356141af816159d1565b6000825160005b81811015615af05760208186018101518583015201615ad6565b81811115615aff576000828501525b509190910192915050565b60006001600160601b038083168185168083038211156158f7576158f76157d9565b600181815b80851115615b67578160001904821115615b4d57615b4d6157d9565b80851615615b5a57918102915b93841c9390800290615b31565b509250929050565b600082615b7e57506001613644565b81615b8b57506000613644565b8160018114615ba15760028114615bab57615bc7565b6001915050613644565b60ff841115615bbc57615bbc6157d9565b50506001821b613644565b5060208310610133831016604e8410600b8410161715615bea575081810a613644565b615bf48383615b2c565b8060001904821115615c0857615c086157d9565b029392505050565b60006141af8383615b6f565b60006141af60ff841683615b6f56fea26469706673582212200cee153871bd293e04467f2aa670731da84919fc24550faf488e9dd64550843364736f6c634300080d0033
Deployed Bytecode Sourcemap
89168:10122:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67341:306;;;;;;;;;;-1:-1:-1;67341:306:0;;;;;:::i;:::-;;:::i;:::-;;45197:252;;;;;;;;;;-1:-1:-1;45197:252:0;;;;;:::i;:::-;;:::i;67766:357::-;;;;;;;;;;-1:-1:-1;67766:357:0;;;;;:::i;:::-;;:::i;36503:264::-;;;;;;;;;;-1:-1:-1;36503:264:0;;;;;:::i;:::-;;:::i;35897:26::-;;;;;;;;;;-1:-1:-1;35897:26:0;;;;-1:-1:-1;;;;;35897:26:0;;;;;;-1:-1:-1;;;;;1852:55:1;;;1834:74;;1822:2;1807:18;35897:26:0;;;;;;;;48472:1486;;;;;;;;;;-1:-1:-1;48472:1486:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;92713:734::-;;;;;;;;;;-1:-1:-1;92713:734:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;46925:447::-;;;;;;:::i;:::-;;:::i;58107:1127::-;;;;;;;;;;-1:-1:-1;58107:1127:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;93811:483::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;59544:4857::-;;;;;;;;;;-1:-1:-1;59544:4857:0;;;;;:::i;:::-;;:::i;96493:638::-;;;;;;:::i;:::-;;:::i;48104:239::-;;;;;;;;;;-1:-1:-1;48104:239:0;;;;;:::i;:::-;;:::i;95588:504::-;;;;;;:::i;:::-;;:::i;89577:209::-;;;;;;;;;;-1:-1:-1;89577:209:0;;;;;:::i;:::-;;:::i;:::-;;;;12604:25:1;;;12660:2;12645:18;;12638:34;;;;12577:18;89577:209:0;12430:248:1;50203:2699:0;;;;;;:::i;:::-;;:::i;68335:111::-;;;;;;;;;;-1:-1:-1;68335:111:0;;;;;:::i;:::-;;:::i;43256:::-;;;;;;;;;;-1:-1:-1;43256:111:0;;;;;:::i;:::-;;:::i;68632:115::-;;;;;;;;;;-1:-1:-1;68632:115:0;;;;;:::i;:::-;-1:-1:-1;;;;;68718:21:0;68694:4;68718:21;;;:15;:21;;;;;;;68632:115;;;;13603:25:1;;;13591:2;13576:18;68632:115:0;13457:177:1;65642:715:0;;;;;;;;;;-1:-1:-1;65642:715:0;;;;;:::i;:::-;;:::i;68868:98::-;;;;;;;;;;-1:-1:-1;68942:9:0;:16;68868:98;;66643:294;;;;;;;;;;-1:-1:-1;66643:294:0;;;;;:::i;:::-;;:::i;43823:1235::-;;;;;;;;;;-1:-1:-1;43823:1235:0;;;;;:::i;:::-;;:::i;43445:101::-;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;43524:14:0;;;;;;;;43531:7;43524:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43445:101;;;;;14966:13:1;;14981:4;14962:24;14944:43;;15034:4;15022:17;;;15016:24;15059:6;15103:21;;;15081:20;;;15074:51;;;;15173:17;;;15167:24;15163:33;;;15141:20;;;15134:63;14932:2;14917:18;43445:101:0;14752:451:1;38922:216:0;;;;;;;;;;-1:-1:-1;38922:216:0;;;;;:::i;:::-;;:::i;46272:522::-;;;;;;;;;;-1:-1:-1;46272:522:0;;;;;:::i;:::-;;:::i;53513:4262::-;;;;;;:::i;:::-;;:::i;91617:211::-;;;;;;;;;;-1:-1:-1;91617:211:0;;;;;:::i;:::-;;:::i;90440:289::-;;;;;;;;;;-1:-1:-1;90440:289:0;;;;;:::i;:::-;;:::i;:::-;;;;15439:25:1;;;15495:2;15480:18;;15473:34;;;;15523:18;;;15516:34;15581:2;15566:18;;15559:34;15426:3;15411:19;90440:289:0;15208:391:1;67055:139:0;;;;;;;;;;-1:-1:-1;67055:139:0;;;;;:::i;:::-;;:::i;94704:521::-;;;;;;:::i;:::-;;:::i;91046:254::-;;;;;;;;;;-1:-1:-1;91046:254:0;;;;;:::i;:::-;;:::i;64918:594::-;;;;;;;;;;-1:-1:-1;64918:594:0;;;;;:::i;:::-;;:::i;97626:931::-;;;;;;:::i;:::-;;:::i;64601:180::-;;;;;;;;;;-1:-1:-1;64601:180:0;;;;;:::i;:::-;;:::i;47505:475::-;;;;;;;;;;-1:-1:-1;47505:475:0;;;;;:::i;:::-;;:::i;67341:306::-;67425:28;67456:9;67466;67456:20;;;;;;;;:::i;:::-;;;;;;;;;67495:14;67456:20;;;;;67495:14;;;;67456:20;;-1:-1:-1;;;;;;67495:14:0;67513:10;67495:28;67487:52;;;;-1:-1:-1;;;67487:52:0;;16651:2:1;67487:52:0;;;16633:21:1;16690:2;16670:18;;;16663:30;-1:-1:-1;;;16709:18:1;;;16702:41;16760:18;;67487:52:0;;;;;;;;;67569:16;67579:5;67569:9;:16::i;:::-;67550:15;;;:35;;:15;;:35;;;;-1:-1:-1;;;67550:35:0;;-1:-1:-1;;;;;67550:35:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;67550:35:0;;;;;-1:-1:-1;;;;;67550:35:0;;;;;;67620:2;-1:-1:-1;;;;;67612:20:0;:27;67633:5;67612:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67412:235;67341:306;;;:::o;45197:252::-;45289:28;45320:9;45330;45320:20;;;;;;;;:::i;:::-;;;;;;;;;45359:14;45320:20;;;;;45359:14;;;;45320:20;;-1:-1:-1;;;;;;45359:14:0;45377:10;45359:28;45351:55;;;;-1:-1:-1;;;45351:55:0;;;;;;;:::i;:::-;45417:24;45425:7;45434:6;45417:7;:24::i;:::-;45278:171;45197:252;;:::o;67766:357::-;67841:28;67872:9;67882;67872:20;;;;;;;;:::i;:::-;;;;;;;;;67911:14;67872:20;;;;;67911:14;;;;67872:20;;-1:-1:-1;;;;;;67911:14:0;67929:10;67911:28;67903:52;;;;-1:-1:-1;;;67903:52:0;;16651:2:1;67903:52:0;;;16633:21:1;16690:2;16670:18;;;16663:30;-1:-1:-1;;;16709:18:1;;;16702:41;16760:18;;67903:52:0;16449:335:1;67903:52:0;67985:16;67995:5;67985:9;:16::i;:::-;67966:15;;;:35;;:15;;:35;;;;-1:-1:-1;;;67966:35:0;;-1:-1:-1;;;;;67966:35:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;67966:35:0;;;;;-1:-1:-1;;;;;67966:35:0;;;;;;68037:11;;;;;;;;-1:-1:-1;;;;;68037:11:0;-1:-1:-1;;;;;68024:46:0;;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;68012:74:0;;68096:5;68105:9;68012:103;;;;;;;;;;;;;13603:25:1;;13591:2;13576:18;;13457:177;68012:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67828:295;67766:357;;:::o;36503:264::-;36570:18;36591:11;-1:-1:-1;;;;;36591:11:0;36635:10;36621:24;;;:86;;-1:-1:-1;36649:58:0;;-1:-1:-1;;;36649:58:0;;36693:10;36649:58;;;17944:74:1;36705:1:0;18034:18:1;;;18027:34;-1:-1:-1;;;;;36649:43:0;;;;;17917:18:1;;36649:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36613:108;;;;-1:-1:-1;;;36613:108:0;;18556:2:1;36613:108:0;;;18538:21:1;18595:1;18575:18;;;18568:29;-1:-1:-1;;;18613:18:1;;;18606:39;18662:18;;36613:108:0;18354:332:1;36613:108:0;-1:-1:-1;36732:11:0;:27;;-1:-1:-1;;;;;;36732:27:0;-1:-1:-1;;;;;36732:27:0;;;;;;;;;;36503:264::o;48472:1486::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48611:9:0;:20;;-1:-1:-1;;;48621:9:0;;48611:20;;;;;;:::i;:::-;;;;;;;;;;;;;;48662:13;;;;48611:20;;-1:-1:-1;;;;48662:13:0;;;;;;48713:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;48713:21:0;;;;;;;;;;;;;;;;48687:47;;48750:6;48745:176;48766:5;48762:1;:9;48745:176;;;48793:22;48818:7;:13;;48832:1;48818:16;;;;;;;:::i;:::-;48860:49;;;;;;;;;48818:16;;;;;;;;;48869:11;;-1:-1:-1;;;;;48869:11:0;48860:49;;48889:11;;;:18;-1:-1:-1;;;;;48860:49:0;;;;;48849:8;;48818:16;;-1:-1:-1;48849:5:0;;48855:1;;48849:8;;;;;;:::i;:::-;;;;;;:60;;;;48778:143;48773:3;;;;:::i;:::-;;;48745:176;;;-1:-1:-1;48940:1010:0;;;;;;;;;;;49065:14;;-1:-1:-1;;;;;49065:14:0;;;48940:1010;;;;-1:-1:-1;;;;;;;;49125:12:0;;;;;;48940:1010;;;;;;;49065:14;49191;;;;;;48940:1010;;;;49262:22;;;;;48940:1010;;;;49330:13;;;;-1:-1:-1;;;;;49330:13:0;;48940:1010;;;;-1:-1:-1;;;49404:15:0;;;;;48940:1010;;;;49488:19;-1:-1:-1;;;49488:19:0;;;;48940:1010;;;;-1:-1:-1;;;49575:13:0;;;;;49065:14;48940:1010;;;49639:14;;;;;;;;48940:1010;;;;49714:20;;;;;48940:1010;;;;-1:-1:-1;;;49814:17:0;;;;48940:1010;;;;-1:-1:-1;;;49896:21:0;;;;;;48940:1010;;;;-1:-1:-1;48940:1010:0;;;;-1:-1:-1;48940:1010:0;48472:1486::o;92713:734::-;92859:20;92890:30;;;;37001:10;37015:9;37001:23;36993:50;;;;-1:-1:-1;;;36993:50:0;;;;;;;:::i;:::-;93140:22:::1;93165:9;93175;93165:20;;;;;;;;:::i;:::-;;;;;;;;;;;:26;;93192:9;93165:37;;;;;;;:::i;:::-;;;;93140:62;;93222:27;93237:4;93243:5;93222:14;:27::i;:::-;93213:36;;93414:25;93434:4;93414:19;:25::i;:::-;92713:734:::0;;93260:179;;-1:-1:-1;93260:179:0;;-1:-1:-1;93260:179:0;-1:-1:-1;92713:734:0;-1:-1:-1;;;;;92713:734:0:o;46925:447::-;47011:28;47042:9;47052;47042:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;47090:14;;;;47042:20;;-1:-1:-1;;;;;;47090:14:0;;47115:217;;47182:5;-1:-1:-1;;;;;47177:11:0;47164:9;:24;47156:52;;;;-1:-1:-1;;;47156:52:0;;19508:2:1;47156:52:0;;;19490:21:1;19547:2;19527:18;;;19520:30;-1:-1:-1;;;19566:18:1;;;19559:45;19621:18;;47156:52:0;19306:339:1;47156:52:0;47115:217;;;47241:79;47273:6;47281:10;47301:4;47313:5;-1:-1:-1;;;;;47308:11:0;47241:31;:79::i;:::-;47342:13;;;:22;;47359:5;;47342:13;;;:22;;47359:5;;-1:-1:-1;;;;;47342:22:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;47342:22:0;;;;;-1:-1:-1;;;;;47342:22:0;;;;;;47000:372;;46925:447;;:::o;58107:1127::-;58285:23;37001:10;37015:9;37001:23;36993:50;;;;-1:-1:-1;;;36993:50:0;;;;;;;:::i;:::-;58323:27:::1;58353:9;58363;58353:20;;;;;;;;:::i;:::-;;;;;;;;;;;:26;;58380:9;58353:37;;;;;;;:::i;:::-;;;;:44;;58323:74;;58408:30;58462:5;58441:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1::0;58493:13:0;;58408:60;;-1:-1:-1;58479:11:0::1;58570:10:::0;;;58566:637:::1;;58599:10;58612:15;58621:6:::0;58612;:15:::1;:::i;:::-;58599:28;;58642:8;58661:5;58653;:13;:33;;58685:1;58653:33;;;58669:13;58677:5:::0;58669;:13:::1;:::i;:::-;58642:44;;58701:134;58716:3;58708:5;:11;58701:134;;;58740:7;::::0;::::1;:::i;:::-;;;58780:39;58798:6;58805:5;58798:13;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;58780:39:::1;::::0;;::::1;::::0;::::1;::::0;;58798:13;;;::::1;58780:39:::0;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;58780:39:0;::::1;::::0;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;58780:39:0;::::1;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;58780:39:0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;58780:39:0;::::1;::::0;;::::1;::::0;;;;::::1;-1:-1:-1::0;;;58780:39:0;::::1;;::::0;;;;::::1;-1:-1:-1::0;;;58780:39:0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;58780:39:0;::::1;;::::0;;;;::::1;-1:-1:-1::0;;;58780:39:0;;::::1;;;::::0;;;58813:5;58780:17:::1;:39::i;:::-;58766:6:::0;58773:3;::::1;::::0;::::1;:::i;:::-;;;58766:11;;;;;;;;:::i;:::-;;;;;;:53;;;;58701:134;;;58582:264;;58566:637;;;58919:6:::0;58906:10:::1;58951:13;58959:5:::0;58919:6;58951:13:::1;:::i;:::-;58940:24;;58989:6;58983:3;:12;58979:65;;;-1:-1:-1::0;59022:6:0;58979:65:::1;59073:3;59065:5;:11;59058:134;;;59111:39;59129:6;59136:5;59129:13;;;;;;;;:::i;59111:39::-;59097:6:::0;59104:3;::::1;::::0;::::1;:::i;:::-;;;59097:11;;;;;;;;:::i;:::-;;;;;;:53;;;;59169:7;;;;:::i;:::-;;;59058:134;;;58889:314;;58566:637;-1:-1:-1::0;59220:6:0;;58107:1127;-1:-1:-1;;;;;;;;58107:1127:0:o;93811:483::-;93967:20;94000:31;94034:24;94039:9;94050:7;94034:4;:24::i;:::-;:30;;;-1:-1:-1;94108:1:0;94086:23;;;;94129:13;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;94129:13:0;;94120:22;;94153:134;94160:5;;94153:134;;94182:6;94187:1;94182:6;;:::i;:::-;;;94232:43;94248:5;94254:11;;94271:1;94266;:6;;94254:19;;;;;;;:::i;:::-;;;;;;;94248:26;;;;;;;:::i;:::-;;;;94232:15;:43::i;:::-;94204:6;94211:1;94204:9;;;;;;;;:::i;:::-;;;;;;94215:6;94222:1;94226;94222:5;;;;:::i;:::-;94215:13;;;;;;;;:::i;:::-;;;;;;;;;;94203:72;;;;;94153:134;;;93989:305;;93811:483;;;;;;:::o;59544:4857::-;59641:30;;;;;;;;59664:7;59641:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;59713:9;:20;;59641;;59713:9;59723;;59713:20;;;;;;:::i;:::-;;;;;;;;;;;59682:51;;59754:17;59786:11;59812:14;59841:11;59947:39;59989:9;59999:1;59989:28;;;;;;;;:::i;:::-;;;;;;;;;;60037:161;;;;;;;;59989:37;60079:22;;;;-1:-1:-1;;;60079:22:0;;;;-1:-1:-1;;;;;60079:22:0;60037:161;;60123:20;;;;;;;;;60037:161;;;;;;;-1:-1:-1;;;60165:21:0;;;;;60037:161;;;;;;;59989:28;;;;;;:37;;;;-1:-1:-1;60225:7:0;60211:3555;60241:5;;60211:3555;;60264:22;60289:13;;;60303:3;;;:::i;:::-;;;;60289:18;;;;;;;:::i;:::-;;;;60264:43;;60425:15;60501:6;60510:7;;60518:1;60510:10;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:17;-1:-1:-1;;60496:3015:0;60529:5;;60496:3015;;60660:10;60673:7;;60681:1;60673:10;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;60684:3;;;:::i;:::-;;;;60673:15;;;;;;;:::i;:::-;;;;;;;60660:28;;60707:23;60733:4;:11;;60745:5;60733:18;;;;;;;;:::i;:::-;;;;;;;;;60707:44;;;;;;;;60733:18;;;;60707:44;;;;;;;-1:-1:-1;;;60707:44:0;;;;;;;;;;;-1:-1:-1;;;60707:44:0;;;;;;;;;;;-1:-1:-1;;;60707:44:0;;;;;;;;-1:-1:-1;;;60707:44:0;;;;;;;;;-1:-1:-1;;;60707:44:0;;;;;;;;-1:-1:-1;;;60707:44:0;;;;;;;;;;-1:-1:-1;;;60707:44:0;;;;;;;-1:-1:-1;;;60707:44:0;;;;;;;;;-1:-1:-1;60874:17:0;;;60870:539;;61039:5;:11;;;61034:17;;61019:32;;61085:9;61095:12;61085:23;;;;;;;;:::i;:::-;;;;;;;;;;;:32;;61074:43;;60870:539;;;61363:11;;61358:17;;61342:33;;61334:55;;;;-1:-1:-1;;;61334:55:0;;21064:2:1;61334:55:0;;;21046:21:1;21103:1;21083:18;;;21076:29;-1:-1:-1;;;21121:18:1;;;21114:39;21170:18;;61334:55:0;20862:332:1;61334:55:0;61600:1;61585:12;:16;:86;;;;;61658:12;61632:6;:22;;;61627:28;;61611:5;:12;;;61606:18;;:49;;;;:::i;:::-;:64;61585:86;61581:1811;;;61754:1;61759;61754:6;61750:1144;;61808:12;;;;61803:18;;61973:10;;61969:902;;62110:10;62122:16;62142:43;62159:4;:11;;62172:5;62179;62142:16;:43::i;:::-;62752:7;;;62699;;;;62683:12;;;;62109:76;;-1:-1:-1;62109:76:0;;-1:-1:-1;62809:3:0;;62109:76;;62667:49;;62678:28;;62699:7;62678:18;;:28;:::i;:::-;62708:7;;;;62667:10;:49::i;:::-;62584:47;62625:6;62584:5;:47;:::i;:::-;:132;;;;:::i;:::-;:175;;;;:::i;:::-;:222;;;;:::i;:::-;:228;;;;:::i;:::-;62539:304;;;;:::i;:::-;;;61985:886;;61969:902;61762:1132;61750:1144;62936:15;;;;62918:34;;62931:21;;62918:34;;:::i;:::-;;;62990:5;:15;;;62985:21;;62975:31;;;;;:::i;:::-;63081:17;;;;63056:16;;;;62975:31;;-1:-1:-1;63076:23:0;;;82333:1;82313:21;;;;;82369:1;82340:30;;;;;;82312:59;63043:56;;;;:::i;:::-;63029:70;;;;:::i;:::-;63219:1;63198:23;;;63244:15;;;:27;;;63294:17;;;:29;63346:11;;;:18;;63029:70;;-1:-1:-1;63198:5:0;;63358;;63346:18;;;;;;:::i;:::-;;;;;;;;;;:26;;:18;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63346:26:0;-1:-1:-1;;;;;63346:26:0;;;;-1:-1:-1;;;63346:26:0;-1:-1:-1;;;;63346:26:0;;;;-1:-1:-1;;;63346:26:0;;;;;-1:-1:-1;;;;63346:26:0;;;;-1:-1:-1;;;63346:26:0;-1:-1:-1;;;;63346:26:0;;;;-1:-1:-1;;;63346:26:0;;-1:-1:-1;;;;63346:26:0;;;-1:-1:-1;;;63346:26:0;-1:-1:-1;;;;63346:26:0;;;-1:-1:-1;;;63346:26:0;;;;;-1:-1:-1;;;;63346:26:0;;;-1:-1:-1;;;63346:26:0;-1:-1:-1;;63346:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61581:1811;60537:2974;;60496:3015;;;;63527:19;63533:6;63541:4;63527:5;:19::i;:::-;63716:11;;63696:58;;63706:8;;-1:-1:-1;;;;;63716:11:0;63729:10;63741:12;63696:9;:58::i;:::-;60249:3517;;60211:3555;;;-1:-1:-1;63826:14:0;;63806:78;;63816:8;;-1:-1:-1;;;;;63826:14:0;;;63842:27;;-1:-1:-1;;;63856:12:0;;-1:-1:-1;;;;;63856:12:0;63842:6;:27;:::i;:::-;63871:12;63806:9;:78::i;:::-;63931:77;63941:8;37329:42;63971:22;:9;63983:10;63971:22;:::i;63931:77::-;64039:13;;;;-1:-1:-1;;;;;64039:13:0;64068:14;;;64064:61;;;64108:5;64099:14;;64064:61;64274:14;64282:6;64274:5;:14;:::i;:::-;64251:13;;;:38;;-1:-1:-1;;64251:38:0;-1:-1:-1;;;;;64251:38:0;;;;;;;;;;;64356:14;;;64336:57;;64346:8;;-1:-1:-1;;;;;64356:14:0;64372:6;64380:12;64336:9;:57::i;:::-;59620:4781;;;;;;;;;59544:4857;;;:::o;96493:638::-;96671:20;96704:31;96738:24;96743:9;96754:7;96738:4;:24::i;:::-;:30;;;-1:-1:-1;96801:1:0;96792:10;;;96781:8;96822:24;96792:10;96822:11;:24;:::i;:::-;96813:33;;96877:1;96866:13;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;96866:13:0;;96857:22;;96890:234;96897:5;;96890:234;;96919:8;96924:3;96919:8;;:::i;:::-;;-1:-1:-1;96942:16:0;96961:50;96976:5;96982:11;;96994:7;96998:3;96919:8;96994:7;:::i;:::-;96982:20;;;;;;;:::i;:::-;;;;;;;96976:27;;;;;;;:::i;:::-;;;;97005:5;96961:14;:50::i;:::-;96942:69;;97031:6;97026:87;97047:3;97043:1;:7;97026:87;;;97092:2;97095:1;97092:5;;;;;;;;:::i;:::-;;;;;;;97076:6;97087:1;97083;:5;;;;:::i;:::-;97076:13;;;;;;;;:::i;:::-;;;;;;;;;;:21;97052:3;;;:::i;:::-;;;97026:87;;;;96904:220;96890:234;;;96693:438;;;96493:638;;;;;;;:::o;48104:239::-;48181:28;48212:9;48222;48212:20;;;;;;;;:::i;:::-;;;;;;;;;48251:14;48212:20;;;;;48251:14;;;;48212:20;;-1:-1:-1;;;;;;48251:14:0;48269:10;48251:28;48243:55;;;;-1:-1:-1;;;48243:55:0;;;;;;;:::i;:::-;48309:14;;:26;;-1:-1:-1;;;;;;48309:26:0;-1:-1:-1;;;;;48309:26:0;;;;;;;;;;-1:-1:-1;48104:239:0:o;95588:504::-;95762:20;95795:31;95829:24;95834:9;95845:7;95829:4;:24::i;:::-;:30;;;-1:-1:-1;95903:1:0;95881:23;;;;95924:13;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;95924:13:0;;95915:22;;95948:137;95955:5;;95948:137;;95977:6;95982:1;95977:6;;:::i;:::-;;;96027:46;96038:5;96044:11;;96061:1;96056;:6;;96044:19;;;;;;;:::i;:::-;;;;;;;96038:26;;;;;;;:::i;:::-;;;;96066:6;96027:10;:46::i;:::-;95999:6;96006:1;95999:9;;;;;;;;:::i;:::-;;;;;;96010:6;96017:1;96021;96017:5;;;;:::i;:::-;96010:13;;;;;;;;:::i;:::-;;;;;;;;;;95998:75;;;;;95948:137;;;95784:308;;95588:504;;;;;;;:::o;89577:209::-;89676:16;;37001:10;37015:9;37001:23;36993:50;;;;-1:-1:-1;;;36993:50:0;;;;;;;:::i;:::-;89724:54:::1;89740:9;89750;89740:20;;;;;;;;:::i;:::-;;;;;;;;;;;:26;;89767:9;89740:37;;;;;;;:::i;89724:54::-;89717:61;;;;37054:1;89577:209:::0;;;;;:::o;50203:2699::-;50340:30;;;;;;;;50363:7;50340:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50422:10;;50414:33;;;;-1:-1:-1;;;50414:33:0;;21796:2:1;50414:33:0;;;21778:21:1;21835:2;21815:18;;;21808:30;-1:-1:-1;;;21854:18:1;;;21847:40;21904:18;;50414:33:0;21594:334:1;50414:33:0;50494:28;50525:9;50535;50525:20;;;;;;;;:::i;:::-;;;;;;;;;;;50494:51;;50587:17;50607:25;50621:10;50607:13;:25::i;:::-;50587:45;;51234:39;51276:9;51286:12;51276:23;;;;;;;;:::i;:::-;;;;;;;;;;51336:13;;;;51472:17;;;;51276:32;:23;;;;;;;:32;;-1:-1:-1;51336:13:0;-1:-1:-1;;;51336:13:0;;;;;;51372:9;;51424:85;;51276:32;;37329:42;;51462:28;;51467:23;51336:13;51462:28;:::i;:::-;:41;;51493:10;51462:41;:::i;:::-;51505:3;51424:7;:85::i;:::-;51576:14;;51418:91;;-1:-1:-1;51558:71:0;;51566:8;;-1:-1:-1;;;;;51576:14:0;;;51618:5;;51592:23;;-1:-1:-1;;;51602:12:0;;-1:-1:-1;;;;;51602:12:0;51592:2;:23;:::i;:::-;:31;;;;:::i;51558:71::-;51552:77;;51668:859;51675:6;;51668:859;;51698:22;51723:13;;;51737:4;;;:::i;:::-;;;;51723:19;;;;;;;:::i;:::-;;;;51698:44;;51757:15;51775:11;;51787:2;51775:15;;;;;;;:::i;:::-;;;;;;;51757:33;;51826:1;51813:10;:14;51805:42;;;;-1:-1:-1;;;51805:42:0;;22135:2:1;51805:42:0;;;22117:21:1;22174:2;22154:18;;;22147:30;-1:-1:-1;;;22193:18:1;;;22186:45;22248:18;;51805:42:0;21933:339:1;51805:42:0;51886:11;;51868:55;;51876:8;;-1:-1:-1;;;;;51886:11:0;51899:18;51907:10;51899:5;:18;:::i;:::-;51919:3;51868:7;:55::i;:::-;51862:61;;52186:19;52192:6;52200:4;52186:5;:19::i;:::-;52315:11;;;:18;52283:70;;;22564:25:1;;;22620:2;22605:18;;22598:34;;;52303:10:0;22648:18:1;;;22641:83;22755:2;22740:18;;22733:34;;;;22798:3;22783:19;;22776:35;;;22842:3;22827:19;;22820:35;;;52283:70:0;;;;;;22551:3:1;52283:70:0;;;52412:103;52420:4;:11;;52433:12;52454:5;52467:6;:17;;;52462:23;;52487:2;52493:1;52487:7;:15;;52501:1;52487:15;;;52497:1;52487:15;52412:103;;52504:10;52412:7;:103::i;:::-;51683:844;;51668:859;;;50300:2602;;;;;;50203:2699;;;;:::o;68335:111::-;68390:7;68417:9;68427:5;68417:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:21;-1:-1:-1;;;;;68417:21:0;;68335:111;-1:-1:-1;;68335:111:0:o;43256:::-;36875:11;;;36859:59;;-1:-1:-1;;;36859:59:0;;36904:10;36859:59;;;17944:74:1;18034:18;;;18027:34;;;;-1:-1:-1;;;;;36875:11:0;;36859:44;;17917:18:1;;36859:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36851:81;;;;-1:-1:-1;;;36851:81:0;;18556:2:1;36851:81:0;;;18538:21:1;18595:1;18575:18;;;18568:29;-1:-1:-1;;;18613:18:1;;;18606:39;18662:18;;36851:81:0;18354:332:1;36851:81:0;43353:6;43343:7:::1;:16;43353:6:::0;43343:7;:16:::1;:::i;65642:715::-:0;65708:4;65727:28;65758:9;65768;65758:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;65819:23;;;65866:13;;65758:20;;-1:-1:-1;65819:23:0;65904:2;65917:231;65924:9;;65917:231;;65952:23;65978:6;65985:7;;;:::i;:::-;;;;65978:15;;;;;;;;:::i;:::-;;;;;;;;;;65952:41;;;;;;;;65978:15;;;;65952:41;;;;;;;-1:-1:-1;;;65952:41:0;;;;;;;;;;;-1:-1:-1;;;65952:41:0;;;;;;;;;;;-1:-1:-1;;;65952:41:0;;;;;;;;-1:-1:-1;;;65952:41:0;;;;;;;;;-1:-1:-1;;;65952:41:0;;;;;;;;-1:-1:-1;;;65952:41:0;;;;;;;;;;-1:-1:-1;;;65952:41:0;;;;;;;;;-1:-1:-1;;;65952:41:0;;;;;;;;;;-1:-1:-1;66012:22:0;66008:129;;66084:12;;;;66064:33;;66079:18;;66064:12;:33;:::i;:::-;66055:42;;66116:5;;;66008:129;65935:213;65917:231;;;66279:20;;;;66346:3;;66248:82;;66259:41;;-1:-1:-1;;;66279:20:0;;;;66259:12;:41;:::i;:::-;66307:21;;;;-1:-1:-1;;;66307:21:0;;;;66248:10;:82::i;:::-;66208:22;;;;66181:50;;-1:-1:-1;;;66208:22:0;;-1:-1:-1;;;;;66208:22:0;66181:6;:50;:::i;:::-;:149;;;;:::i;:::-;:168;;;;:::i;:::-;66160:189;65642:715;-1:-1:-1;;;;;;65642:715:0:o;66643:294::-;66752:16;66770;66799:27;66829:9;66839;66829:20;;;;;;;;:::i;:::-;;;;;;;;:26;:20;;;;;:26;;:29;;;:36;;66799:66;;66883:46;66900:6;66908:5;66915:6;66922:5;66915:13;;;;;;;;:::i;:::-;;;;;;;;;;66883:46;;;;;;;;66915:13;;;;66883:46;;;;;;;-1:-1:-1;;;66883:46:0;;;;;;;;;;;-1:-1:-1;;;66883:46:0;;;;;;;;;;;-1:-1:-1;;;66883:46:0;;;;;;;;-1:-1:-1;;;66883:46:0;;;;;;;;;;-1:-1:-1;;;66883:46:0;;;;;;;;-1:-1:-1;;;66883:46:0;;;;;;;;-1:-1:-1;;;66883:46:0;;;;;;;;-1:-1:-1;;;66883:46:0;;;;;;;;:16;:46::i;:::-;66876:53;;;;;66643:294;;;;;:::o;43823:1235::-;44064:9;:16;44059:44;;;23983:25:1;;;-1:-1:-1;;;;;24105:15:1;;;24100:2;24085:18;;24078:43;-1:-1:-1;;;;;24157:39:1;;24137:18;;;24130:67;24233:15;;24228:2;24213:18;;24206:43;44059:44:0;;;;;;23970:3:1;44059:44:0;;;44155:9;:16;;;;;;;-1:-1:-1;44155:16:0;;;-1:-1:-1;;;;;44214:23:0;;;-1:-1:-1;;;;;;;;44275:19:0;;;;;;;;44155:16;;;;;;;;44275:19;;;44337:14;;;:23;;-1:-1:-1;;;;;;44337:23:0;;;;;;;;;;;44373:13;;;:26;;-1:-1:-1;;;44448:37:0;-1:-1:-1;;;44448:37:0;;;;;;;44536:14;;;;:27;;-1:-1:-1;;;;;;44616:43:0;44553:10;-1:-1:-1;;;;44616:43:0;;44646:12;44616:43;;;;;;;;;;;;44155:16;44703:311;44720:17;;;44703:311;;;44777:6;;44784:1;44777:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;44767:19:0;:6;-1:-1:-1;;;;;44767:19:0;;44759:60;;;;-1:-1:-1;;;44759:60:0;;24462:2:1;44759:60:0;;;24444:21:1;24501:2;24481:18;;;24474:30;24540;24520:18;;;24513:58;24588:18;;44759:60:0;24260:352:1;44759:60:0;44839:6;44834:119;44855:1;44851;:5;44834:119;;;44903:6;;44910:1;44903:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;44890:22:0;:6;;44897:1;44890:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;44890:22:0;;44882:55;;;;-1:-1:-1;;;44882:55:0;;24819:2:1;44882:55:0;;;24801:21:1;24858:2;24838:18;;;24831:30;-1:-1:-1;;;24877:18:1;;;24870:50;24937:18;;44882:55:0;24617:344:1;44882:55:0;44858:3;;;:::i;:::-;;;44834:119;;;;44993:6;;45000:1;44993:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;44967:7;:13;;44981:1;44967:16;;;;;;;:::i;:::-;;;;:35;;-1:-1:-1;;;;;;44967:35:0;-1:-1:-1;;;;;44967:35:0;;;;;;;;;;44739:3;;;:::i;:::-;;;44703:311;;;;45026:24;45034:7;45043:6;45026:7;:24::i;:::-;44013:1045;43823:1235;;;;;;:::o;38922:216::-;38989:28;39006:10;38989:16;:28::i;:::-;-1:-1:-1;39114:9:0;:16;;;;;;-1:-1:-1;39114:16:0;38922:216::o;46272:522::-;46341:28;46372:9;46382;46372:20;;;;;;;;:::i;:::-;;;;;;;;;46411:14;46372:20;;;;;46411:14;;;;46372:20;;-1:-1:-1;;;;;;46411:14:0;46429:10;46411:28;46403:55;;;;-1:-1:-1;;;46403:55:0;;;;;;;:::i;:::-;46477:14;;-1:-1:-1;;;;;46477:24:0;;;:14;;:24;46469:65;;;;-1:-1:-1;;;46469:65:0;;24462:2:1;46469:65:0;;;24444:21:1;24501:2;24481:18;;;24474:30;24540;24520:18;;;24513:58;24588:18;;46469:65:0;24260:352:1;46469:65:0;46563:13;;;;-1:-1:-1;;;46563:13:0;;;;46545:10;46588:126;46609:5;46605:1;:9;46588:126;;;46671:6;-1:-1:-1;;;;;46644:33:0;:7;:13;;46658:1;46644:16;;;;;;;:::i;:::-;;;;:23;-1:-1:-1;;;;;46644:23:0;:33;46636:66;;;;-1:-1:-1;;;46636:66:0;;24819:2:1;46636:66:0;;;24801:21:1;24858:2;24838:18;;;24831:30;-1:-1:-1;;;24877:18:1;;;24870:50;24937:18;;46636:66:0;24617:344:1;46636:66:0;46616:3;;;:::i;:::-;;;46588:126;;;;46754:6;46724:7;:13;;46738:5;46724:20;;;;;;;:::i;:::-;;;;:36;;-1:-1:-1;;;;;;46724:36:0;-1:-1:-1;;;;;46724:36:0;;;;;;;;;;46773:13;;;46771:15;;46773:13;;46771:15;;-1:-1:-1;;;46771:15:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;46330:464;;46272:522;;:::o;53513:4262::-;53700:30;;;;;;;;53723:7;53700:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;53782:11;53774:35;;;;-1:-1:-1;;;53774:35:0;;25370:2:1;53774:35:0;;;25352:21:1;25409:2;25389:18;;;25382:30;-1:-1:-1;;;25428:18:1;;;25421:41;25479:18;;53774:35:0;25168:335:1;53774:35:0;53844:1;53828:13;:17;53820:39;;;;-1:-1:-1;;;53820:39:0;;25710:2:1;53820:39:0;;;25692:21:1;25749:1;25729:18;;;25722:29;-1:-1:-1;;;25767:18:1;;;25760:39;25816:18;;53820:39:0;25508:332:1;53820:39:0;53904:28;53935:9;53945;53935:20;;;;;;;;:::i;:::-;;;;;;;;;;;53904:51;;53966:22;53991:7;:13;;54017:7;54005:9;:19;:53;;54039:19;54051:7;54039:9;:19;:::i;:::-;54005:53;;;54027:9;54005:53;53991:68;;;;;;;:::i;:::-;;;;53966:93;;54070:23;54096:4;:11;;54108:5;54096:18;;;;;;;;:::i;:::-;;;;;;;;;;54070:44;;;;;;;;54096:18;;;;54070:44;;;;;;;-1:-1:-1;;;54070:44:0;;;;;;;;;;-1:-1:-1;;;54070:44:0;;;;;;;;;;;-1:-1:-1;;;54070:44:0;;;;;;;;-1:-1:-1;;;54070:44:0;;;;;;;-1:-1:-1;;;54070:44:0;;;;;;;;-1:-1:-1;;;54070:44:0;;;;;;;;;;-1:-1:-1;;;54070:44:0;;;;;;;-1:-1:-1;;;54070:44:0;;;;;;;;54188:22;;;;54070:44;;-1:-1:-1;54215:12:0;;54162:49;;54183:28;;;54162:49;:::i;:::-;:65;;54154:87;;;;-1:-1:-1;;;54154:87:0;;26047:2:1;54154:87:0;;;26029:21:1;26086:1;26066:18;;;26059:29;-1:-1:-1;;;26104:18:1;;;26097:39;26153:18;;54154:87:0;25845:332:1;54154:87:0;54301:7;54282:5;:15;;;54277:21;;:31;;;;:::i;:::-;54252:57;;:15;;;:57;54322:17;54342:25;54356:10;54342:13;:25::i;:::-;54322:45;;54503:15;54592:5;:17;;;54587:23;;54568:5;:15;;;54563:21;;:47;;;;:::i;:::-;54543:15;;;;54521:38;;54538:21;;54533:1;54522:12;;;54521:38;:::i;:::-;:90;;;;:::i;:::-;54761:11;;;;54503:108;;-1:-1:-1;54725:7:0;;54756:17;;;;;54788:11;;54784:200;;;54833:25;;54828:31;;54820:39;;54816:135;;;54934:1;54919:16;;;;;54816:135;54965:7;;;:::i;:::-;;;54784:200;55101:39;55143:9;55153:12;55143:23;;;;;;;;:::i;:::-;;;;;;;;;;;:32;;55101:74;;55190:8;55201:9;55190:20;;55395:7;55383:9;:19;55379:1676;;;55516:7;55497:5;:15;;;55492:21;;:31;;;;:::i;:::-;55467:57;;;;:15;;;:57;55575:17;;;;55570:33;;55596:7;;55570:23;:33;:::i;:::-;55543:61;;:17;;;:61;55623:11;;;:18;;55543:5;;55623:11;55635:5;;55623:18;;;;;;:::i;:::-;;;;;;;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55710:83;55718:8;55728:7;:14;;;;;;;;;;-1:-1:-1;;;;;55728:14:0;55774:7;:12;;;;;;;;;;-1:-1:-1;;;;;55774:12:0;-1:-1:-1;;;;;55769:18:0;55758:7;55745:10;:20;;;;:::i;55710:83::-;55914:11;;;55991:16;;;55704:89;;-1:-1:-1;55852:212:0;;55882:8;;-1:-1:-1;;;;;55914:11:0;;56011:7;;82333:1;82313:21;;;;;82369:1;82340:30;;;;;;82312:59;55978:40;;;;:::i;:::-;55949:26;55962:13;55949:10;:26;:::i;:::-;:69;;;;:::i;55852:212::-;55846:218;;55379:1676;;;56181:20;56194:7;56181:20;;:::i;:::-;;;56313:7;56294:5;:15;;;56289:21;;:31;;;;:::i;:::-;56264:57;;;;:15;;;:57;56372:17;;;;56367:33;;56393:7;;56367:23;:33;:::i;:::-;56340:61;;:17;;;:61;56420:11;;;:18;;56340:5;;56420:11;56432:5;;56420:18;;;;;;:::i;:::-;;;;;;;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56507:83;56515:8;56525:7;:14;;;;;;;;;;-1:-1:-1;;;;;56525:14:0;56571:7;:12;;;;;;;;;;-1:-1:-1;;;;;56571:12:0;-1:-1:-1;;;;;56566:18:0;56555:7;56542:10;:20;;;;:::i;56507:83::-;56678:16;;;;56501:89;;-1:-1:-1;56643:19:0;;56698:7;;82333:1;82313:21;;;;;82369:1;82340:30;;;;;;82312:59;56665:40;;;;:::i;:::-;56643:62;-1:-1:-1;56643:62:0;56728:26;56741:13;56728:10;:26;:::i;:::-;:43;56724:316;;;56802:80;56810:8;56820:4;:11;;;;;;;;;;-1:-1:-1;;;;;56820:11:0;56862:14;56846:13;56833:10;:26;;;;:::i;:::-;:43;;;;:::i;:::-;56878:3;56802:7;:80::i;:::-;56796:86;;56724:316;;;56951:11;;56931:89;;56941:8;;-1:-1:-1;;;;;56951:11:0;56981:26;56994:13;56981:10;:26;:::i;:::-;56964:43;;:14;:43;:::i;:::-;57009:10;56931:9;:89::i;:::-;56162:893;55379:1676;57121:67;57129:8;37329:42;57159:23;:10;57172;57159:23;:::i;57121:67::-;57115:73;-1:-1:-1;57213:8:0;;57205:29;;;;-1:-1:-1;;;57205:29:0;;26384:2:1;57205:29:0;;;26366:21:1;26423:1;26403:18;;;26396:29;-1:-1:-1;;;26441:18:1;;;26434:38;26489:18;;57205:29:0;26182:331:1;57205:29:0;54996:2250;;57507:19;57513:6;57521:4;57507:5;:19::i;:::-;57617:11;;;:18;57578:85;;;22564:25:1;;;22620:2;22605:18;;22598:34;;;57605:10:0;22648:18:1;;;22641:83;22755:2;22740:18;;22733:34;;;;22798:3;22783:19;;22776:35;;;22842:3;22827:19;;22820:35;;;57578:85:0;;;;;;22551:3:1;57578:85:0;;;57674:93;57682:4;:11;;57695:12;57716:10;57729;57750:1;57741:5;:10;;57753:13;57674:7;:93::i;:::-;53687:4088;;;;;;;;53513:4262;;;;;:::o;91617:211::-;91727:13;37001:10;37015:9;37001:23;36993:50;;;;-1:-1:-1;;;36993:50:0;;;;;;;:::i;:::-;91760:60:::1;91775:9;91785;91775:20;;;;;;;;:::i;:::-;;;;;;;;;;;:26;;91802:9;91775:37;;;;;;;:::i;:::-;;;;91814:5;91760:14;:60::i;:::-;91753:67:::0;91617:211;-1:-1:-1;;;;91617:211:0:o;90440:289::-;90553:16;;;;37001:10;37015:9;37001:23;36993:50;;;;-1:-1:-1;;;36993:50:0;;;;;;;:::i;:::-;90663:58:::1;90683:9;90693;90683:20;;;;;;;;:::i;:::-;;;;;;;;;;;:26;;90710:9;90683:37;;;;;;;:::i;:::-;;;;90663:19;:58::i;:::-;90656:65:::0;;;;-1:-1:-1;90656:65:0;-1:-1:-1;90656:65:0;;-1:-1:-1;90440:289:0;-1:-1:-1;;;90440:289:0:o;67055:139::-;67128:4;67157:9;67167;67157:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:28;;;-1:-1:-1;;;67157:28:0;;-1:-1:-1;;;;;67157:28:0;;;-1:-1:-1;;67055:139:0:o;94704:521::-;94864:20;94897:31;94931:24;94936:9;94947:7;94931:4;:24::i;:::-;:30;;;-1:-1:-1;95005:1:0;94983:23;;;;95026:13;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;95026:13:0;;95017:22;;95050:168;95057:5;;95050:168;;95079:6;95084:1;95079:6;;:::i;:::-;;;95159:47;95179:5;95185:11;;95202:1;95197;:6;;95185:19;;;;;;;:::i;:::-;;;;;;;95179:26;;;;;;;:::i;95159:47::-;95101:6;95108:1;95101:9;;;;;;;;:::i;:::-;;;;;;95112:6;95119:1;95123;95119:5;;;;:::i;:::-;95112:13;;;;;;;;:::i;:::-;;;;;;95127:6;95134:1;95138;95134:5;;;;:::i;:::-;95127:13;;;;;;;;:::i;:::-;;;;;;95142:6;95149:1;95153;95149:5;;;;:::i;:::-;95142:13;;;;;;;;:::i;:::-;;;;;;;;;;95100:106;;;;;;;;;;;;95050:168;;91046:254;91187:16;;37001:10;37015:9;37001:23;36993:50;;;;-1:-1:-1;;;36993:50:0;;;;;;;:::i;:::-;91235:57:::1;91246:9;91256;91246:20;;;;;;;;:::i;:::-;;;;;;;;;;;:26;;91273:9;91246:37;;;;;;;:::i;:::-;;;;91285:6;91235:10;:57::i;:::-;91228:64;;;;91046:254:::0;;;;;;:::o;64918:594::-;65365:10;65316:20;65349:27;;;:15;:27;;;;;;65339:9;:38;;:9;;65349:27;65339:38;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;65339:61:0;;;;:47;:38;;;;;:47;;;;:61;;;;;65411:22;;65339:61;;-1:-1:-1;65428:5:0;;65339:61;;65411:22;;65428:5;;65411:22;:::i;:::-;;;;-1:-1:-1;65444:60:0;;-1:-1:-1;65472:12:0;65486:10;65498:5;65444:27;:60::i;97626:931::-;97824:20;97857:31;97891:24;97896:9;97907:7;97891:4;:24::i;:::-;:30;;97857:64;;97934:8;97955:1;97946:5;:10;;97960:1;97945:16;;;;:::i;:::-;97934:27;-1:-1:-1;97972:6:0;97981:24;97934:27;97981:11;:24;:::i;:::-;97972:33;;98036:1;98025:13;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;98025:13:0;;98016:22;;98049:501;98056:5;;98049:501;;98078:8;98083:3;98078:8;;:::i;:::-;;-1:-1:-1;98103:22:0;98128:5;98134:11;;98146:7;98150:3;98078:8;98146:7;:::i;:::-;98134:20;;;;;;;:::i;:::-;;;;;;;98128:27;;;;;;;:::i;:::-;;;;98103:52;;98170:16;98189:27;98204:4;98210:5;98189:14;:27::i;:::-;98170:46;;98236:6;98231:91;98256:3;98248:5;:1;98252;98248:5;:::i;:::-;:11;98231:91;;;98301:2;98304:1;98301:5;;;;;;;;:::i;:::-;;;;;;;98285:6;98296:1;98292;:5;;;;:::i;:::-;98285:13;;;;;;;;:::i;:::-;;;;;;;;;;:21;98261:3;;;:::i;:::-;;;98231:91;;;-1:-1:-1;98336:6:0;98355:1;98345:7;98349:3;98345:1;:7;:::i;:::-;:11;;;;:::i;:::-;98336:20;;98513:25;98533:4;98513:19;:25::i;:::-;98390:6;98397:1;98390:9;;;;;;;;:::i;:::-;;;;;;98418:6;98425:1;98429;98425:5;;;;:::i;:::-;98418:13;;;;;;;;:::i;:::-;;;;;;98450:6;98457:1;98461;98457:5;;;;:::i;:::-;98450:13;;;;;;;;:::i;:::-;;;;;;98482:6;98489:1;98493;98489:5;;;;:::i;:::-;98482:13;;;;;;;;:::i;:::-;;;;;;;;;;98371:167;;;;;;;;;;;;-1:-1:-1;98049:501:0;;-1:-1:-1;;98049:501:0;64601:180;-1:-1:-1;;;;;64722:21:0;;64688:4;64722:21;;;:15;:21;;;;;;64712:9;:32;;:9;;64722:21;64712:32;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;64712:55:0;;;;:41;:32;;;;;:41;;;;:55;;;;;:61;;-1:-1:-1;64601:180:0;;;;;:::o;47505:475::-;47583:28;47614:9;47624;47614:20;;;;;;;;:::i;:::-;;;;;;;;;47653:14;47614:20;;;;;47653:14;;;;47614:20;;-1:-1:-1;;;;;;47653:14:0;47671:10;47653:28;47645:55;;;;-1:-1:-1;;;47645:55:0;;;;;;;:::i;:::-;47728:14;;;;47753:13;;;:22;;-1:-1:-1;;;;;47728:14:0;;;;47770:5;;47753:13;47711:14;;47753:22;;47770:5;;-1:-1:-1;;;;;47753:22:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;47753:22:0;;;;;-1:-1:-1;;;;;47753:22:0;;;;;;47808:1;-1:-1:-1;;;;;47790:20:0;:6;-1:-1:-1;;;;;47790:20:0;;47786:187;;47827:41;;47835:10;;-1:-1:-1;;;;;47856:11:0;;47827:41;;;;;;;;;47856:11;47835:10;47827:41;;;;;;;;;;;;;;;;;;;;;47786:187;;;47901:60;47929:6;47937:10;47954:5;-1:-1:-1;;;;;47949:11:0;47901:27;:60::i;:::-;47572:408;;47505:475;;:::o;82418:156::-;82472:6;-1:-1:-1;;;82499:5:0;:35;82491:44;;;;;;-1:-1:-1;82560:5:0;82418:156::o;45584:503::-;45744:21;;;;:6;:21;:::i;:::-;45719:22;;;:46;;-1:-1:-1;;;;;45719:46:0;;;;-1:-1:-1;;;45719:46:0;-1:-1:-1;;;;;45719:46:0;;;;;;;;;45850:18;;;;;;;;:::i;:::-;45828:19;;;:40;;;;;;;-1:-1:-1;;;45828:40:0;-1:-1:-1;;;;45828:40:0;;;;;;;;;45962:16;;;;;;;;:::i;:::-;45942:17;;;:36;;;;;;;-1:-1:-1;;;45942:36:0;-1:-1:-1;;;;45942:36:0;;;;;;;;;46059:20;;;;;;;;:::i;:::-;46035:7;:21;;;:44;;;;;;;;;;;;;;;;;;45584:503;;:::o;87763:1244::-;87846:13;87904:11;;;87926:23;;:::i;:::-;87960:19;88003:1;87993:11;;;;;;87982:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;87982:23:0;-1:-1:-1;88046:7:0;:23;88094:13;;87960:45;;-1:-1:-1;88046:23:0;;;;;;88018:20;;;;88212:763;88233:5;88229:1;:9;88212:763;;;88270:10;;;;88299:56;;-1:-1:-1;88331:6:0;88338:7;;;:::i;:::-;;;;88331:15;;;;;;;;:::i;:::-;;;;;;;;;;88323:23;;;;;;;;88331:15;;;;88323:23;;;;;;;-1:-1:-1;;;88323:23:0;;;;;;;;;;-1:-1:-1;;;88323:23:0;;;;;;;;;;;-1:-1:-1;;;88323:23:0;;;;;;;;-1:-1:-1;;;88323:23:0;;;;;;;;;-1:-1:-1;;;88323:23:0;;;;;;;;-1:-1:-1;;;88323:23:0;;;;;;;;;;-1:-1:-1;;;88323:23:0;;;;;;;-1:-1:-1;;;88323:23:0;;;;;;;;;-1:-1:-1;88307:48:0;;;88299:56;88295:499;;;88394:1;88380:11;:15;:58;;;;-1:-1:-1;88426:12:0;88399:24;88408:15;88399:6;:24;:::i;:::-;:39;88380:58;88376:209;;;88476:24;88485:15;88476:6;:24;:::i;:::-;88463:5;88469:3;;;;:::i;:::-;;;88463:10;;;;;;;;:::i;:::-;;;;;;;;;;:37;88536:29;88554:11;88536:15;:29;:::i;:::-;88523:5;88529:3;;;;:::i;:::-;;;88523:10;;;;;;;;:::i;:::-;;;;;;:42;;;;;88376:209;88607:4;88603:58;;;88636:5;;;88603:58;88693:1;88679:15;;88731:1;88713:19;;88765:5;:12;;;88760:18;;88751:27;;88295:499;88832:15;;;;88827:21;;88863:24;88827:21;88863:24;;:::i;:::-;88934:16;;;;88863:24;;-1:-1:-1;88954:9:0;;82333:1;82313:21;;;;;82369:1;82340:30;;;;;;82312:59;88921:42;;;;:::i;:::-;88902:61;;;;:::i;:::-;;;88241:734;;88212:763;;;-1:-1:-1;88994:5:0;;87763:1244;-1:-1:-1;;;;;;;;;;87763:1244:0:o;83821:603::-;84012:39;;;;;;;;84041:10;;;84012:39;;;;;;;-1:-1:-1;;;84012:39:0;;;;;;;;-1:-1:-1;;;84012:39:0;;;;;;;;;;-1:-1:-1;;;84012:39:0;;;;;;;;-1:-1:-1;;;84012:39:0;;;;;;;;-1:-1:-1;;;84012:39:0;;;;;;;;83907:16;;;;;;;;84012:39;84068:29;84064:321;;84170:7;:23;84145:16;;;;84140:54;;84170:23;;;;;;84140:22;;:54;:::i;:::-;84226:20;;;;82333:1;82313:21;;;;;82369:1;82340:30;;;;;;82312:59;84279:18;;;;82333:1;82313:21;;;;;82369:1;82340:30;;;;;;82312:59;84356:2;84323:9;:17;;;84318:23;;84344:7;84318:33;;;;:::i;:::-;84317:41;;84114:259;;;;;;;;;;;84064:321;84405:1;84408;84411;84414;84397:19;;;;;;;;;83821:603;;;;;;:::o;1055:399::-;1277:51;;;-1:-1:-1;;;;;27489:15:1;;;1277:51:0;;;27471:34:1;27541:15;;;27521:18;;;27514:43;27573:18;;;;27566:34;;;1277:51:0;;;;;;;;;;27383:18:1;;;;1277:51:0;;;;;;;-1:-1:-1;;;;;1277:51:0;-1:-1:-1;;;1277:51:0;;;1266:63;;-1:-1:-1;;;;1266:10:0;;;;:63;;1277:51;1266:63;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1230:99;;;;1348:7;:57;;;;-1:-1:-1;1360:11:0;;:16;;:44;;;1391:4;1380:24;;;;;;;;;;;;:::i;:::-;1340:106;;;;-1:-1:-1;;;1340:106:0;;28244:2:1;1340:106:0;;;28226:21:1;28283:2;28263:18;;;28256:30;28322:34;28302:18;;;28295:62;-1:-1:-1;;;28373:18:1;;;28366:34;28417:19;;1340:106:0;28042:400:1;1340:106:0;1143:311;;1055:399;;;;:::o;69019:1069::-;69105:21;;:::i;:::-;69148:932;;;;;;;;69213:5;69148:932;;;;;;69264:25;69277:5;:11;;;69264:25;;:12;:25::i;:::-;-1:-1:-1;;;;;69148:932:0;;;;;69366:5;:12;;;69148:932;;;;;;69447:5;:15;;;69148:932;;;;;;69529:5;:15;;;69148:932;;;;;;69645:5;:17;;;69148:932;;;;;;69752:5;:15;;;69148:932;;;;;;69923:5;:11;;;69148:932;;;;;;69981:5;:12;;;69148:932;;;;;;70038:30;70051:5;:16;;;82313:21;82333:1;82313:21;;;;82340:30;82369:1;82340:30;;;;;;;;82312:59;;82225:154;70038:30;-1:-1:-1;;;;;69148:932:0;;;69141:939;69019:1069;-1:-1:-1;;;69019:1069:0:o;98597:690::-;98661:28;98714:9;98724;98714:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;98761:17;;;;98714:20;;-1:-1:-1;98756:36:0;;43110:12;;-1:-1:-1;;;98761:17:0;;;;98756:36;:::i;:::-;98745:47;;98819:3;98807:9;:15;98803:431;;;-1:-1:-1;;;;;98839:25:0;;:42;98865:15;98877:3;98865:9;:15;:::i;:::-;98839:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;98803:431;;;99206:3;99193:9;:16;99185:37;;;;-1:-1:-1;;;99185:37:0;;28649:2:1;99185:37:0;;;28631:21:1;28688:1;28668:18;;;28661:29;-1:-1:-1;;;28706:18:1;;;28699:38;28754:18;;99185:37:0;28447:331:1;99185:37:0;99265:14;99275:3;99265:9;:14::i;:::-;99246:15;;;:33;;:15;;:33;;;;-1:-1:-1;;;99246:33:0;;-1:-1:-1;;;;;99246:33:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;99246:33:0;;;;;-1:-1:-1;;;;;99246:33:0;;;;;;98691:596;98597:690;;;;:::o;82845:369::-;82960:39;;;;;;;;82989:10;;;82960:39;;;;;;;-1:-1:-1;;;82960:39:0;;;;;;;;-1:-1:-1;;;82960:39:0;;;;;;;;;;-1:-1:-1;;;82960:39:0;;;;;;;;-1:-1:-1;;;82960:39:0;;;;;;;;-1:-1:-1;;;82960:39:0;;;;;;;;82917:16;;;;82960:39;83016:29;83012:161;;83100:7;:23;83075:16;;;;83070:54;;83100:23;;;;;;83070:22;;:54;:::i;:::-;83139:20;;;;82333:1;82313:21;;;;;82369:1;82340:30;;;;;;82312:59;83062:99;;;;;82845:369;;;:::o;83012:161::-;-1:-1:-1;83201:1:0;;;;-1:-1:-1;82845:369:0;-1:-1:-1;;82845:369:0:o;77097:1560::-;77308:13;;77351:12;;;;77394;;;;77245:16;;77389:18;;;;;77346;;77492:5;77478:473;77505:6;77499:3;;;:::i;:::-;;;;:12;:48;;;;;77541:6;77520;77527:1;77520:9;;;;;;;;:::i;:::-;;;;;;;;;;:16;-1:-1:-1;;;77520:16:0;;;;77515:32;77499:48;77478:473;;;77922:6;77929:1;77922:9;;;;;;;;:::i;:::-;;;;;;;;;;:16;77902:37;;-1:-1:-1;;;77922:16:0;;;;77902:37;;:::i;:::-;;;77478:473;;;-1:-1:-1;78025:6:0;78042:461;78057:1;78049:5;:9;:58;;;;-1:-1:-1;78101:6:0;78074;78081:7;;;:::i;:::-;;;;78074:15;;;;;;;;:::i;:::-;;;;;;;;;;:22;-1:-1:-1;;;78074:22:0;;;;;-1:-1:-1;78062:45:0;;78049:58;78042:461;;;78470:6;78477:5;78470:13;;;;;;;;:::i;:::-;;;;;;;;;;:20;78450:41;;-1:-1:-1;;;78470:20:0;;;;78450:41;;:::i;:::-;;;78042:461;;;78527:1;78519:5;:9;:26;;;;78541:4;78532:6;:13;78519:26;78515:135;;;78576:13;78585:4;78576:6;:13;:::i;:::-;78562:27;;78515:135;;;78636:2;78622:16;;78515:135;77281:1376;;;77097:1560;;;;;;:::o;81238:311::-;81312:4;24094:8;81333:5;:28;81329:156;;;81378:6;81387:27;23910:7;81387:5;:27;:::i;:::-;81378:36;-1:-1:-1;81463:10:0;81378:36;81463:5;:10;:::i;:::-;81442:18;81459:1;81442:13;:18;:::i;:::-;81436:24;;:3;:24;:::i;:::-;:37;;;;:::i;:::-;81429:44;;;;;81329:156;81530:11;81508:19;81525:2;81508:13;:19;:::i;:::-;81502:25;;:3;:25;:::i;:::-;:39;;;;:::i;:::-;81495:46;81238:311;-1:-1:-1;;;81238:311:0:o;71057:5983::-;71240:32;;;;;;;;71262:10;;;71240:32;;;;;;;;-1:-1:-1;;;71240:32:0;;;;;;;;;;-1:-1:-1;;;71240:32:0;;;;;;;;;;;;-1:-1:-1;;;71240:32:0;;;;;;;;;;-1:-1:-1;;;71240:32:0;;;;;;;-1:-1:-1;;;71240:32:0;;;;;;;;;71177:11;;;71328:13;;71177:11;;71328:13;;-1:-1:-1;;;72024:23:0;;:::i;:::-;73203:9;73224:6;73215:5;:15;;:130;;;;73333:12;73306:6;:22;;;73301:28;;73275:6;73282:5;73275:13;;;;;;;;:::i;:::-;;;;;;;;;;73267:21;;;;;;;;73275:13;;;;73267:21;;;;;;;-1:-1:-1;;;73267:21:0;;;;;;;;;;-1:-1:-1;;;73267:21:0;;;;;;;;;;;-1:-1:-1;;;73267:21:0;;;;;;;;-1:-1:-1;;;73267:21:0;;;;;;;;;-1:-1:-1;;;73267:21:0;;;;;;;;-1:-1:-1;;;73267:21:0;;;;;;;;;;-1:-1:-1;;;73267:21:0;;;;;;;-1:-1:-1;;;73267:21:0;;;;;;;;;;-1:-1:-1;73267:21:0;-1:-1:-1;73251:78:0;;73267:21;73251:78;:::i;:::-;:94;;73215:130;73203:142;;73455:4;:22;;;;73471:6;73463:4;:14;;73455:22;73451:3161;;;73564:15;;73560:2958;;73769:13;;;;82333:1;82313:21;;;;;82369:1;82340:30;;;;;;82312:59;73745:8;73853:29;73871:11;73853:15;:29;:::i;:::-;73942:34;;;:12;;;:34;73840:42;-1:-1:-1;74015:19:0;73840:42;74015:12;:19::i;:::-;73999:35;;:13;;;:35;74119:1;;-1:-1:-1;74119:1:0;;-1:-1:-1;74191:7:0;;74187:2213;;74401:11;;;;74374:58;;74429:2;;74420:5;;82333:1;82313:21;;;;;82369:1;82340:30;;;;;;82312:59;74388:29;;74416:1;74388:29;:::i;:::-;:37;;;;:::i;:::-;74387:44;;;;:::i;:::-;74374:12;:58::i;:::-;74360:72;;:11;;;:72;74750:19;74766:3;74760:2;74751:11;;;74750:19;:::i;:::-;74744:25;;-1:-1:-1;;;74800:3:0;:21;74796:205;;;74860:21;-1:-1:-1;;;74860:3:0;:21;:::i;:::-;74854:27;;74796:205;;;74952:21;74970:3;-1:-1:-1;;;74952:21:0;:::i;:::-;74946:27;;74796:205;75526:2;75493;75477;:9;;;75472:15;;75465:4;:22;;;;:::i;:::-;23782:5;75419:9;75425:3;;75419:9;:::i;:::-;:16;;75431:4;75419:16;:::i;:::-;:42;;;;:::i;:::-;:69;;;;:::i;:::-;75418:77;;75287:2;:10;;;75282:16;;75301:1;75282:20;;;;:::i;:::-;:214;;;;:::i;:::-;75251:277;;;;:::i;:::-;75245:283;;75787:14;75781:3;:20;75777:105;;;75840:14;75834:20;;75777:105;75908:24;;;:10;;;:24;74187:2213;;;76264:13;;;;76250:27;;:11;;;:27;-1:-1:-1;76354:10:0;;;:22;74187:2213;-1:-1:-1;;76474:24:0;;;:9;;;:24;73560:2958;76590:6;76583:13;;73451:3161;76632:4;76628:50;;;76657:5;;;76628:50;76759:15;;;;76739:36;;76754:21;;76739:36;;:::i;:::-;76847:15;;;;76822:16;;;;76739:36;;-1:-1:-1;76842:21:0;;;82333:1;82313:21;;;;;82369:1;82340:30;;;;;;82312:59;76809:54;;;;:::i;:::-;76790:73;;;;:::i;:::-;;;72076:4799;72067:7;;;;:::i;:::-;;;72058:4817;;;76941:8;;76936:14;;76928:22;;76924:109;;;76985:5;76967:2;:8;;:24;;;;;;;;;;;77019:2;77006:4;:10;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76924:109;71126:5914;;;;;;;;;71057:5983;;:::o;79634:441::-;79820:14;;79816:252;;-1:-1:-1;;;;;79855:26:0;;79851:206;;79910:26;79923:12;79910;:26::i;:::-;-1:-1:-1;;;;;79902:44:0;:56;79947:10;79902:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79851:206;-1:-1:-1;;;;;79999:22:0;;;;;;;;;;;;;:42;;80031:10;;79999:22;:42;;80031:10;;79999:42;:::i;:::-;;;;-1:-1:-1;;79634:441:0;;;;:::o;84694:2799::-;84922:7;:23;84872:11;;;84973:13;;84799:16;;;;84872:11;84922:23;;;;;;;84799:16;;85049:25;84922:23;85049:25;;:::i;:::-;;-1:-1:-1;85193:10:0;85206;85215:1;85206:6;:10;:::i;:::-;85193:23;;85231:9;85308:661;85322:5;85315:4;:12;85308:661;;;85376:1;85359:12;85366:5;85359:4;:12;:::i;:::-;85358:19;;85350:27;;85415:6;85422:5;85415:13;;;;;;;;:::i;:::-;;;;;;;;;;:20;-1:-1:-1;;;85415:20:0;;;;;-1:-1:-1;85459:20:0;;;85455:499;;;85511:7;;;:::i;:::-;;;;85504:14;;85308:661;;85455:499;85557:11;85548:6;:20;85544:410;;;85873:7;;;:::i;:::-;;;;85865:15;;85308:661;;85544:410;85085:895;;86020:16;86051:20;86086:6;86107:14;86132:23;;:::i;:::-;86214:5;86200:593;86225:6;86221:1;:10;86200:593;;;86259:6;86266:3;;;;:::i;:::-;;;86259:11;;;;;;;;:::i;:::-;;;;;;;;;;86251:19;;;;;;;;86259:11;;;;86251:19;;;;;;;-1:-1:-1;;;86251:19:0;;;;;;;;;;-1:-1:-1;;;86251:19:0;;;;;;;;;;;-1:-1:-1;;;86251:19:0;;;;;;;;-1:-1:-1;;;86251:19:0;;;;;;;;;-1:-1:-1;;;86251:19:0;;;;;;;;-1:-1:-1;;;86251:19:0;;;;;;;;;;-1:-1:-1;;;86251:19:0;;;;;;;-1:-1:-1;;;86251:19:0;;;;;;;;;;-1:-1:-1;86251:19:0;-1:-1:-1;86336:20:0;;;86377:5;86332:66;86429:15;;;;86424:21;;;-1:-1:-1;86464:13:0;;86460:322;;86502:1;86507;86502:6;86498:146;;86537:11;86533:15;;86498:146;;;86583:11;86578:1;:16;86619:5;86574:70;;86662:24;86677:9;86662:24;;:::i;:::-;86737:16;;;;86662:24;;-1:-1:-1;86757:9:0;;82333:1;82313:21;;;;;82369:1;82340:30;;;;;;82312:59;86724:42;;;;:::i;:::-;86705:61;;;;:::i;:::-;;;86460:322;86200:593;;;;86838:505;86845:9;;86838:505;;86881:6;86888:7;;;:::i;:::-;;;;86881:15;;;;;;;;:::i;:::-;;;;;;;;;;86873:23;;;;;;;;86881:15;;;;86873:23;;;;;;;-1:-1:-1;;;86873:23:0;;;;;;;;;;;-1:-1:-1;;;86873:23:0;;;;;;;;;;-1:-1:-1;;;86873:23:0;;;;;;;;-1:-1:-1;;;86873:23:0;;;;;;;;;-1:-1:-1;;;86873:23:0;;;;;;;;-1:-1:-1;;;86873:23:0;;;;;;;;;;-1:-1:-1;;;86873:23:0;;;;;;;-1:-1:-1;;;86873:23:0;;;;;;;;;;;-1:-1:-1;86873:23:0;-1:-1:-1;86963:13:0;;86959:373;;87016:5;:12;;;87011:18;;86997:32;;87052:1;87057;87052:6;87048:146;;87087:11;87083:15;;87048:146;;;87133:11;87128:1;:16;87169:5;87124:70;;87212:24;87227:9;87212:24;;:::i;:::-;87287:16;;;;87212:24;;-1:-1:-1;87307:9:0;;82333:1;82313:21;;;;;82369:1;82340:30;;;;;;82312:59;87274:42;;;;:::i;:::-;87255:61;;;;:::i;:::-;;;86959:373;86838:505;;;87359:15;;87355:107;;87399:19;87403:15;87399:1;:19;:::i;:::-;87420:29;87438:11;87420:15;:29;:::i;:::-;87391:59;;;;;;;;;;;;;;;;87355:107;-1:-1:-1;87480:1:0;;;;-1:-1:-1;84694:2799:0;-1:-1:-1;;;;;;;;;;;;84694:2799:0:o;80700:530::-;-1:-1:-1;;;;;80786:21:0;;80754:4;80786:21;;;:15;:21;;;;;;80822:10;;;80818:380;;-1:-1:-1;81095:9:0;:16;-1:-1:-1;;;;;81063:21:0;;;;;;:15;:21;;;;;:48;;;-1:-1:-1;;;81062:64:0;;81054:89;;;;-1:-1:-1;;;81054:89:0;;30753:2:1;81054:89:0;;;30735:21:1;30792:2;30772:18;;;30765:30;-1:-1:-1;;;30811:18:1;;;30804:42;30863:18;;81054:89:0;30551:336:1;81054:89:0;81158:9;:16;;;;;;;-1:-1:-1;81158:16:0;;;;;;;:28;;-1:-1:-1;;;;;;81158:28:0;-1:-1:-1;;;;;81158:28:0;;;;;81217:5;80700:530;-1:-1:-1;;80700:530:0:o;78867:759::-;79038:4;-1:-1:-1;;;;;79059:26:0;;79055:564;;79109:18;79117:10;79109:5;:18;:::i;:::-;79102:25;;;;79055:564;-1:-1:-1;;;;;79213:22:0;;79190:20;79213:22;;;;;;;;;;79270:13;;79302:25;;;79298:283;;;79364:1;79348:17;;79384:99;79416:12;79430:10;79450:4;79457:25;79470:12;79457:10;:25;:::i;:::-;79384:31;:99::i;:::-;79298:283;;;79540:25;79555:10;79540:12;:25;:::i;:::-;79524:41;;79298:283;-1:-1:-1;79602:5:0;;78867:759;-1:-1:-1;;;;;78867:759:0:o;70123:872::-;70337:6;70349:637;;;;;;;;70381:12;70349:637;;;;;;70455:12;70349:637;;;;;;70523:6;70349:637;;;;;;70601:6;70349:637;;;;;;70679:6;70349:637;;;;;;70766:9;70349:637;;;;;;70859:1;70843:12;:17;;70349:637;;;;;;70916:12;70931:4;70916:19;70349:637;;;;;;70951:24;70964:10;70951:12;:24::i;:::-;70349:637;;;;;;;70337:650;;;;;;;-1:-1:-1;70337:650:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;70337:650:0;-1:-1:-1;;;;;70337:650:0;;;;-1:-1:-1;;;70337:650:0;-1:-1:-1;;;;70337:650:0;;;;-1:-1:-1;;;70337:650:0;;;;;-1:-1:-1;;;;70337:650:0;;;;-1:-1:-1;;;70337:650:0;-1:-1:-1;;;;70337:650:0;;;;-1:-1:-1;;;70337:650:0;;-1:-1:-1;;;;70337:650:0;;;-1:-1:-1;;;70337:650:0;-1:-1:-1;;;;70337:650:0;;;-1:-1:-1;;;70337:650:0;;;;;-1:-1:-1;;;;70337:650:0;;;-1:-1:-1;;;70337:650:0;-1:-1:-1;;70337:650:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;70123:872:0:o;36055:163::-;36152:1;36129:11;-1:-1:-1;;;;;36129:11:0;:25;36121:54;;;;-1:-1:-1;;;36121:54:0;;31094:2:1;36121:54:0;;;31076:21:1;31133:2;31113:18;;;31106:30;-1:-1:-1;;;31152:18:1;;;31145:46;31208:18;;36121:54:0;30892:340:1;36121:54:0;36186:11;:24;;-1:-1:-1;;;;;;36186:24:0;-1:-1:-1;;;;;36186:24:0;;;;;;;;;;36055:163::o;80083:416::-;80265:14;;80261:231;;-1:-1:-1;;;;;80300:26:0;;80296:185;;80347:35;;-1:-1:-1;;;;;80347:23:0;;;:35;;;;;80371:10;;80347:35;;;;80371:10;80347:23;:35;;;;;;;;;;;;;;;;;;;689:358;881:45;;;-1:-1:-1;;;;;17962:55:1;;;881:45:0;;;17944:74:1;18034:18;;;;18027:34;;;881:45:0;;;;;;;;;;17917:18:1;;;;881:45:0;;;;;;;-1:-1:-1;;;;;881:45:0;-1:-1:-1;;;881:45:0;;;870:57;;-1:-1:-1;;;;870:10:0;;;;:57;;881:45;870:57;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;834:93;;;;946:7;:57;;;;-1:-1:-1;958:11:0;;:16;;:44;;;989:4;978:24;;;;;;;;;;;;:::i;:::-;938:101;;;;-1:-1:-1;;;938:101:0;;31741:2:1;938:101:0;;;31723:21:1;31780:2;31760:18;;;31753:30;31819:33;31799:18;;;31792:61;31870:18;;938:101:0;31539:355:1;81796:257:0;81852:6;;81902:95;81917:15;81909:5;:23;81902:95;;;81959:1;81949:11;;;;;81975:10;;;:::i;:::-;;;81902:95;;;82031:1;82022:10;;;;82021:23;;;;81796:257;-1:-1:-1;81796:257:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:154:1:-;-1:-1:-1;;;;;93:5:1;89:54;82:5;79:65;69:93;;158:1;155;148:12;69:93;14:154;:::o;173:383::-;250:6;258;266;319:2;307:9;298:7;294:23;290:32;287:52;;;335:1;332;325:12;287:52;371:9;358:23;348:33;;431:2;420:9;416:18;403:32;444:31;469:5;444:31;:::i;:::-;173:383;;494:5;;-1:-1:-1;;;546:2:1;531:18;;;;518:32;;173:383::o;561:162::-;627:5;672:3;663:6;658:3;654:16;650:26;647:46;;;689:1;686;679:12;647:46;-1:-1:-1;711:6:1;561:162;-1:-1:-1;561:162:1:o;728:318::-;828:6;836;889:3;877:9;868:7;864:23;860:33;857:53;;;906:1;903;896:12;857:53;942:9;929:23;919:33;;971:69;1032:7;1027:2;1016:9;1012:18;971:69;:::i;:::-;961:79;;728:318;;;;;:::o;1051:248::-;1119:6;1127;1180:2;1168:9;1159:7;1155:23;1151:32;1148:52;;;1196:1;1193;1186:12;1148:52;-1:-1:-1;;1219:23:1;;;1289:2;1274:18;;;1261:32;;-1:-1:-1;1051:248:1:o;1304:247::-;1363:6;1416:2;1404:9;1395:7;1391:23;1387:32;1384:52;;;1432:1;1429;1422:12;1384:52;1471:9;1458:23;1490:31;1515:5;1490:31;:::i;1919:180::-;1978:6;2031:2;2019:9;2010:7;2006:23;2002:32;1999:52;;;2047:1;2044;2037:12;1999:52;-1:-1:-1;2070:23:1;;1919:180;-1:-1:-1;1919:180:1:o;2537:612::-;2598:3;2636:5;2630:12;2663:6;2658:3;2651:19;2689:4;2718:2;2713:3;2709:12;2702:19;;2755:2;2748:5;2744:14;2776:1;2786:338;2800:6;2797:1;2794:13;2786:338;;;2859:13;;2901:9;;-1:-1:-1;;;;;2897:58:1;2885:71;;3000:11;;2994:18;-1:-1:-1;;;;;2990:51:1;2976:12;;;2969:73;3071:4;3062:14;;;;3099:15;;;;2822:1;2815:9;2786:338;;;-1:-1:-1;3140:3:1;;2537:612;-1:-1:-1;;;;;2537:612:1:o;3154:1987::-;3349:2;3338:9;3331:21;3394:6;3388:13;3383:2;3372:9;3368:18;3361:41;3312:4;3449:2;3441:6;3437:15;3431:22;3462:52;3510:2;3499:9;3495:18;3481:12;-1:-1:-1;;;;;1622:54:1;1610:67;;1556:127;3462:52;-1:-1:-1;3563:2:1;3551:15;;3545:22;-1:-1:-1;;;;;2169:38:1;;3625:2;3610:18;;2157:51;-1:-1:-1;3678:2:1;3666:15;;3660:22;-1:-1:-1;;;;;1622:54:1;;3741:3;3726:19;;1610:67;-1:-1:-1;3795:3:1;3783:16;;3777:23;-1:-1:-1;;;;;2169:38:1;;3858:3;3843:19;;2157:51;-1:-1:-1;3912:3:1;3900:16;;3894:23;-1:-1:-1;;;;;2285:46:1;;3976:3;3961:19;;2273:59;-1:-1:-1;4030:3:1;4018:16;;4012:23;-1:-1:-1;;;;;2169:38:1;;4093:3;4078:19;;2157:51;4044:54;4147:3;4139:6;4135:16;4129:23;4171:3;4183:53;4232:2;4221:9;4217:18;4201:14;2419:6;2408:18;2396:31;;2343:90;4183:53;4273:15;;4267:22;;-1:-1:-1;4308:3:1;4320:53;4354:18;;;4267:22;2419:6;2408:18;2396:31;;2343:90;4320:53;4410:15;;4404:22;;-1:-1:-1;4445:3:1;4457:54;4492:18;;;4404:22;-1:-1:-1;;;;;1622:54:1;1610:67;;1556:127;4457:54;4548:15;;4542:22;;-1:-1:-1;4583:3:1;4595:53;4629:18;;;4542:22;2514:10;2503:22;2491:35;;2438:94;4595:53;4686:15;;4680:22;;-1:-1:-1;4721:3:1;4733:54;4768:18;;;4680:22;2419:6;2408:18;2396:31;;2343:90;4733:54;4825:15;;4819:22;;-1:-1:-1;4860:3:1;4872:54;4907:18;;;4819:22;2419:6;2408:18;2396:31;;2343:90;4872:54;4964:15;;4958:22;4999:6;5021:18;;;5014:30;4958:22;-1:-1:-1;5061:74:1;5130:3;5115:19;;4958:22;5061:74;:::i;5146:316::-;5223:6;5231;5239;5292:2;5280:9;5271:7;5267:23;5263:32;5260:52;;;5308:1;5305;5298:12;5260:52;-1:-1:-1;;5331:23:1;;;5401:2;5386:18;;5373:32;;-1:-1:-1;5452:2:1;5437:18;;;5424:32;;5146:316;-1:-1:-1;5146:316:1:o;5467:435::-;5520:3;5558:5;5552:12;5585:6;5580:3;5573:19;5611:4;5640:2;5635:3;5631:12;5624:19;;5677:2;5670:5;5666:14;5698:1;5708:169;5722:6;5719:1;5716:13;5708:169;;;5783:13;;5771:26;;5817:12;;;;5852:15;;;;5744:1;5737:9;5708:169;;5907:548;6198:3;6187:9;6180:22;6161:4;6219:57;6271:3;6260:9;6256:19;6248:6;6219:57;:::i;:::-;6211:65;;6312:6;6307:2;6296:9;6292:18;6285:34;6355:6;6350:2;6339:9;6335:18;6328:34;6398:6;6393:2;6382:9;6378:18;6371:34;6442:6;6436:3;6425:9;6421:19;6414:35;5907:548;;;;;;;;:::o;6460:369::-;6528:6;6536;6589:2;6577:9;6568:7;6564:23;6560:32;6557:52;;;6605:1;6602;6595:12;6557:52;6641:9;6628:23;6618:33;;6701:2;6690:9;6686:18;6673:32;-1:-1:-1;;;;;6738:5:1;6734:46;6727:5;6724:57;6714:85;;6795:1;6792;6785:12;6714:85;6818:5;6808:15;;;6460:369;;;;;:::o;6834:454::-;6929:6;6937;6945;6953;6961;7014:3;7002:9;6993:7;6989:23;6985:33;6982:53;;;7031:1;7028;7021:12;6982:53;-1:-1:-1;;7054:23:1;;;7124:2;7109:18;;7096:32;;-1:-1:-1;7175:2:1;7160:18;;7147:32;;7226:2;7211:18;;7198:32;;-1:-1:-1;7277:3:1;7262:19;7249:33;;-1:-1:-1;6834:454:1;-1:-1:-1;6834:454:1:o;7600:1971::-;7833:2;7885:21;;;7955:13;;7858:18;;;7977:22;;;7804:4;;7833:2;8018;;8036:18;;;;8077:15;;;7804:4;8120:1425;8134:6;8131:1;8128:13;8120:1425;;;8193:13;;8237:9;;2514:10;2503:22;;;2491:35;;8291:11;;;8285:18;-1:-1:-1;;;;;1622:54:1;8349:12;;;1610:67;8403:11;;;8397:18;2503:22;;8462:12;;;2491:35;8498:4;8543:11;;;8537:18;2503:22;;8602:12;;;2491:35;8638:4;8683:11;;;8677:18;2503:22;;8742:12;;;2491:35;8778:4;8823:11;;;8817:18;2503:22;;;8882:12;;;2491:35;8918:4;8963:11;;;8957:18;7369:8;7358:20;9022:12;;;7346:33;9058:4;9103:11;;;9097:18;7457:4;7446:16;;;9161:12;;;7434:29;;;;9197:6;9244:11;;;9238:18;7446:16;;;9302:12;;;7434:29;9339:6;9386:12;;;9380:19;-1:-1:-1;;;;;7536:52:1;9447:13;;;7524:65;9490:6;9481:16;;;;9520:15;;;;8156:1;8149:9;8120:1425;;;-1:-1:-1;9562:3:1;;7600:1971;-1:-1:-1;;;;;;;7600:1971:1:o;9576:367::-;9639:8;9649:6;9703:3;9696:4;9688:6;9684:17;9680:27;9670:55;;9721:1;9718;9711:12;9670:55;-1:-1:-1;9744:20:1;;9787:18;9776:30;;9773:50;;;9819:1;9816;9809:12;9773:50;9856:4;9848:6;9844:17;9832:29;;9916:3;9909:4;9899:6;9896:1;9892:14;9884:6;9880:27;9876:38;9873:47;9870:67;;;9933:1;9930;9923:12;9948:640;10052:6;10060;10068;10076;10129:2;10117:9;10108:7;10104:23;10100:32;10097:52;;;10145:1;10142;10135:12;10097:52;10181:9;10168:23;10158:33;;10242:2;10231:9;10227:18;10214:32;10269:18;10261:6;10258:30;10255:50;;;10301:1;10298;10291:12;10255:50;10340:70;10402:7;10393:6;10382:9;10378:22;10340:70;:::i;:::-;10429:8;;-1:-1:-1;10314:96:1;-1:-1:-1;;10514:2:1;10499:18;;10486:32;10527:31;10486:32;10527:31;:::i;:::-;9948:640;;;;-1:-1:-1;9948:640:1;;-1:-1:-1;;9948:640:1:o;10593:261::-;10772:2;10761:9;10754:21;10735:4;10792:56;10844:2;10833:9;10829:18;10821:6;10792:56;:::i;10859:532::-;10981:6;10989;10997;11050:2;11038:9;11029:7;11025:23;11021:32;11018:52;;;11066:1;11063;11056:12;11018:52;11102:9;11089:23;11079:33;;11163:2;11152:9;11148:18;11135:32;11190:18;11182:6;11179:30;11176:50;;;11222:1;11219;11212:12;11176:50;11261:70;11323:7;11314:6;11303:9;11299:22;11261:70;:::i;:::-;10859:532;;11350:8;;-1:-1:-1;11235:96:1;;-1:-1:-1;;;;10859:532:1:o;11396:709::-;11509:6;11517;11525;11533;11541;11594:3;11582:9;11573:7;11569:23;11565:33;11562:53;;;11611:1;11608;11601:12;11562:53;11647:9;11634:23;11624:33;;11708:2;11697:9;11693:18;11680:32;11735:18;11727:6;11724:30;11721:50;;;11767:1;11764;11757:12;11721:50;11806:70;11868:7;11859:6;11848:9;11844:22;11806:70;:::i;:::-;11895:8;;-1:-1:-1;11780:96:1;-1:-1:-1;;11977:2:1;11962:18;;11949:32;;-1:-1:-1;12031:2:1;12016:18;;12003:32;12044:31;12003:32;12044:31;:::i;:::-;12094:5;12084:15;;;11396:709;;;;;;;;:::o;12110:315::-;12178:6;12186;12239:2;12227:9;12218:7;12214:23;12210:32;12207:52;;;12255:1;12252;12245:12;12207:52;12291:9;12278:23;12268:33;;12351:2;12340:9;12336:18;12323:32;12364:31;12389:5;12364:31;:::i;12683:573::-;12787:6;12795;12803;12811;12864:2;12852:9;12843:7;12839:23;12835:32;12832:52;;;12880:1;12877;12870:12;12832:52;12916:9;12903:23;12893:33;;12973:2;12962:9;12958:18;12945:32;12935:42;;13028:2;13017:9;13013:18;13000:32;13055:18;13047:6;13044:30;13041:50;;;13087:1;13084;13077:12;13041:50;13126:70;13188:7;13179:6;13168:9;13164:22;13126:70;:::i;:::-;12683:573;;;;-1:-1:-1;13215:8:1;-1:-1:-1;;;;12683:573:1:o;13261:191::-;13345:6;13398:2;13386:9;13377:7;13373:23;13369:32;13366:52;;;13414:1;13411;13404:12;13639:179;13706:20;;-1:-1:-1;;;;;13755:38:1;;13745:49;;13735:77;;13808:1;13805;13798:12;13735:77;13639:179;;;:::o;13823:924::-;13976:6;13984;13992;14000;14008;14016;14069:3;14057:9;14048:7;14044:23;14040:33;14037:53;;;14086:1;14083;14076:12;14037:53;14125:9;14112:23;14144:31;14169:5;14144:31;:::i;:::-;14194:5;-1:-1:-1;14218:37:1;14251:2;14236:18;;14218:37;:::i;:::-;14208:47;;14307:2;14296:9;14292:18;14279:32;14320:33;14345:7;14320:33;:::i;:::-;14372:7;-1:-1:-1;14430:2:1;14415:18;;14402:32;14457:18;14446:30;;14443:50;;;14489:1;14486;14479:12;14443:50;14528:70;14590:7;14581:6;14570:9;14566:22;14528:70;:::i;:::-;14617:8;;-1:-1:-1;14502:96:1;-1:-1:-1;14671:70:1;;-1:-1:-1;14733:7:1;14727:3;14712:19;;14671:70;:::i;:::-;14661:80;;13823:924;;;;;;;;:::o;15604:315::-;15672:6;15680;15733:2;15721:9;15712:7;15708:23;15704:32;15701:52;;;15749:1;15746;15739:12;15701:52;15788:9;15775:23;15807:31;15832:5;15807:31;:::i;:::-;15857:5;15909:2;15894:18;;;;15881:32;;-1:-1:-1;;;15604:315:1:o;15924:388::-;15992:6;16000;16053:2;16041:9;16032:7;16028:23;16024:32;16021:52;;;16069:1;16066;16059:12;16021:52;16108:9;16095:23;16127:31;16152:5;16127:31;:::i;:::-;16177:5;-1:-1:-1;16234:2:1;16219:18;;16206:32;16247:33;16206:32;16247:33;:::i;16317:127::-;16378:10;16373:3;16369:20;16366:1;16359:31;16409:4;16406:1;16399:15;16433:4;16430:1;16423:15;16789:127;16850:10;16845:3;16841:20;16838:1;16831:31;16881:4;16878:1;16871:15;16905:4;16902:1;16895:15;16921:237;16960:4;-1:-1:-1;;;;;17065:10:1;;;;17035;;17087:12;;;17084:38;;;17102:18;;:::i;:::-;17139:13;;16921:237;-1:-1:-1;;;16921:237:1:o;17163:338::-;17365:2;17347:21;;;17404:2;17384:18;;;17377:30;-1:-1:-1;;;17438:2:1;17423:18;;17416:44;17492:2;17477:18;;17163:338::o;17506:251::-;17576:6;17629:2;17617:9;17608:7;17604:23;17600:32;17597:52;;;17645:1;17642;17635:12;17597:52;17677:9;17671:16;17696:31;17721:5;17696:31;:::i;18072:277::-;18139:6;18192:2;18180:9;18171:7;18167:23;18163:32;18160:52;;;18208:1;18205;18198:12;18160:52;18240:9;18234:16;18293:5;18286:13;18279:21;18272:5;18269:32;18259:60;;18315:1;18312;18305:12;18691:127;18752:10;18747:3;18743:20;18740:1;18733:31;18783:4;18780:1;18773:15;18807:4;18804:1;18797:15;18823:135;18862:3;18883:17;;;18880:43;;18903:18;;:::i;:::-;-1:-1:-1;18950:1:1;18939:13;;18823:135::o;18963:338::-;19165:2;19147:21;;;19204:2;19184:18;;;19177:30;-1:-1:-1;;;19238:2:1;19223:18;;19216:44;19292:2;19277:18;;18963:338::o;19650:253::-;19690:3;-1:-1:-1;;;;;19779:2:1;19776:1;19772:10;19809:2;19806:1;19802:10;19840:3;19836:2;19832:12;19827:3;19824:21;19821:47;;;19848:18;;:::i;:::-;19884:13;;19650:253;-1:-1:-1;;;;19650:253:1:o;19908:125::-;19948:4;19976:1;19973;19970:8;19967:34;;;19981:18;;:::i;:::-;-1:-1:-1;20018:9:1;;19908:125::o;20038:136::-;20077:3;20105:5;20095:39;;20114:18;;:::i;:::-;-1:-1:-1;;;20150:18:1;;20038:136::o;20179:128::-;20219:3;20250:1;20246:6;20243:1;20240:13;20237:39;;;20256:18;;:::i;:::-;-1:-1:-1;20292:9:1;;20179:128::o;20312:545::-;20405:4;20411:6;20471:11;20458:25;20565:2;20561:7;20550:8;20534:14;20530:29;20526:43;20506:18;20502:68;20492:96;;20584:1;20581;20574:12;20492:96;20611:33;;20663:20;;;-1:-1:-1;20706:18:1;20695:30;;20692:50;;;20738:1;20735;20728:12;20692:50;20771:4;20759:17;;-1:-1:-1;20822:1:1;20818:14;;;20802;20798:35;20788:46;;20785:66;;;20847:1;20844;20837:12;21199:168;21239:7;21305:1;21301;21297:6;21293:14;21290:1;21287:21;21282:1;21275:9;21268:17;21264:45;21261:71;;;21312:18;;:::i;:::-;-1:-1:-1;21352:9:1;;21199:168::o;21372:217::-;21412:1;21438;21428:132;;21482:10;21477:3;21473:20;21470:1;21463:31;21517:4;21514:1;21507:15;21545:4;21542:1;21535:15;21428:132;-1:-1:-1;21574:9:1;;21372:217::o;22866:117::-;22951:6;22944:5;22940:18;22933:5;22930:29;22920:57;;22973:1;22970;22963:12;22988:760;23149:5;23136:19;23187:4;23178:7;23174:18;23223:2;23214:7;23211:15;23201:43;;23240:1;23237;23230:12;23201:43;23263:11;;-1:-1:-1;;23299:17:1;;23296:25;;23283:39;;23263:11;-1:-1:-1;23370:2:1;23359:14;;23346:28;23383:32;23346:28;23383:32;:::i;:::-;23461:8;23451:7;23448:1;23444:15;23440:30;23424:46;;23527:8;23522:2;23510:8;23506:13;23502:2;23498:22;23495:30;23492:44;23486:4;23479:58;23585:2;23578:5;23574:14;23561:28;23598:32;23622:7;23598:32;:::i;:::-;-1:-1:-1;;23671:26:1;;;;23668:34;;;23655:48;23713:2;23709:16;;;;23727:12;23705:35;23652:89;23639:103;;-1:-1:-1;22988:760:1:o;24966:197::-;25004:3;25032:6;25073:2;25066:5;25062:14;25100:2;25091:7;25088:15;25085:41;;25106:18;;:::i;:::-;25155:1;25142:15;;24966:197;-1:-1:-1;;;24966:197:1:o;26518:246::-;26558:4;-1:-1:-1;;;;;26671:10:1;;;;26641;;26693:12;;;26690:38;;;26708:18;;:::i;26769:184::-;26827:6;26880:2;26868:9;26859:7;26855:23;26851:32;26848:52;;;26896:1;26893;26886:12;26848:52;26919:28;26937:9;26919:28;:::i;26958:245::-;27016:6;27069:2;27057:9;27048:7;27044:23;27040:32;27037:52;;;27085:1;27082;27075:12;27037:52;27124:9;27111:23;27143:30;27167:5;27143:30;:::i;27611:426::-;27740:3;27778:6;27772:13;27803:1;27813:129;27827:6;27824:1;27821:13;27813:129;;;27925:4;27909:14;;;27905:25;;27899:32;27886:11;;;27879:53;27842:12;27813:129;;;27960:6;27957:1;27954:13;27951:48;;;27995:1;27986:6;27981:3;27977:16;27970:27;27951:48;-1:-1:-1;28015:16:1;;;;;27611:426;-1:-1:-1;;27611:426:1:o;28783:244::-;28822:3;-1:-1:-1;;;;;28903:2:1;28900:1;28896:10;28933:2;28930:1;28926:10;28964:3;28960:2;28956:12;28951:3;28948:21;28945:47;;;28972:18;;:::i;29032:422::-;29121:1;29164:5;29121:1;29178:270;29199:7;29189:8;29186:21;29178:270;;;29258:4;29254:1;29250:6;29246:17;29240:4;29237:27;29234:53;;;29267:18;;:::i;:::-;29317:7;29307:8;29303:22;29300:55;;;29337:16;;;;29300:55;29416:22;;;;29376:15;;;;29178:270;;;29182:3;29032:422;;;;;:::o;29459:806::-;29508:5;29538:8;29528:80;;-1:-1:-1;29579:1:1;29593:5;;29528:80;29627:4;29617:76;;-1:-1:-1;29664:1:1;29678:5;;29617:76;29709:4;29727:1;29722:59;;;;29795:1;29790:130;;;;29702:218;;29722:59;29752:1;29743:10;;29766:5;;;29790:130;29827:3;29817:8;29814:17;29811:43;;;29834:18;;:::i;:::-;-1:-1:-1;;29890:1:1;29876:16;;29905:5;;29702:218;;30004:2;29994:8;29991:16;29985:3;29979:4;29976:13;29972:36;29966:2;29956:8;29953:16;29948:2;29942:4;29939:12;29935:35;29932:77;29929:159;;;-1:-1:-1;30041:19:1;;;30073:5;;29929:159;30120:34;30145:8;30139:4;30120:34;:::i;:::-;30190:6;30186:1;30182:6;30178:19;30169:7;30166:32;30163:58;;;30201:18;;:::i;:::-;30239:20;;29459:806;-1:-1:-1;;;29459:806:1:o;30270:131::-;30330:5;30359:36;30386:8;30380:4;30359:36;:::i;30406:140::-;30464:5;30493:47;30534:4;30524:8;30520:19;30514:4;30493:47;:::i
Swarm Source
ipfs://0cee153871bd293e04467f2aa670731da84919fc24550faf488e9dd645508433
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.