More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 471 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw Liquidi... | 12990744 | 1311 days ago | IN | 0 ETH | 0.02667055 | ||||
Withdraw Liquidi... | 12990735 | 1311 days ago | IN | 0 ETH | 0.0264502 | ||||
Withdraw Liquidi... | 12990694 | 1311 days ago | IN | 0 ETH | 0.02949035 | ||||
Withdraw Liquidi... | 12990677 | 1311 days ago | IN | 0 ETH | 0.0290873 | ||||
Withdraw Reward | 12990653 | 1311 days ago | IN | 0 ETH | 0.0167681 | ||||
Withdraw Liquidi... | 12990499 | 1311 days ago | IN | 0 ETH | 0.02284752 | ||||
Withdraw Liquidi... | 12904505 | 1324 days ago | IN | 0 ETH | 0.00788594 | ||||
Withdraw Liquidi... | 12904322 | 1324 days ago | IN | 0 ETH | 0.01126647 | ||||
Withdraw Reward | 12832114 | 1335 days ago | IN | 0 ETH | 0.00340294 | ||||
Transfer Positio... | 12776429 | 1344 days ago | IN | 0 ETH | 0.00706538 | ||||
Withdraw Liquidi... | 12757664 | 1347 days ago | IN | 0 ETH | 0.00137377 | ||||
Withdraw Liquidi... | 12751315 | 1348 days ago | IN | 0 ETH | 0.00508221 | ||||
Withdraw Liquidi... | 12746838 | 1349 days ago | IN | 0 ETH | 0.00243656 | ||||
Withdraw Liquidi... | 12740965 | 1350 days ago | IN | 0 ETH | 0.00083766 | ||||
Withdraw Liquidi... | 12740965 | 1350 days ago | IN | 0 ETH | 0.00057589 | ||||
Withdraw Liquidi... | 12740947 | 1350 days ago | IN | 0 ETH | 0.00432987 | ||||
Withdraw Liquidi... | 12716129 | 1354 days ago | IN | 0 ETH | 0.00107358 | ||||
Withdraw Reward | 12710946 | 1354 days ago | IN | 0 ETH | 0.00098254 | ||||
Withdraw Reward | 12710940 | 1354 days ago | IN | 0 ETH | 0.00098254 | ||||
Withdraw Reward | 12710938 | 1354 days ago | IN | 0 ETH | 0.00115354 | ||||
Withdraw Liquidi... | 12710816 | 1354 days ago | IN | 0 ETH | 0.00096192 | ||||
Withdraw Liquidi... | 12709844 | 1355 days ago | IN | 0 ETH | 0.00075813 | ||||
Withdraw Liquidi... | 12705298 | 1355 days ago | IN | 0 ETH | 0.0046279 | ||||
Withdraw Liquidi... | 12705241 | 1355 days ago | IN | 0 ETH | 0.00538588 | ||||
Withdraw Reward | 12705234 | 1355 days ago | IN | 0 ETH | 0.00179012 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Method | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|---|
- | 12686941 | 1358 days ago | 1.24103247 ETH | ||||
- | 12679444 | 1359 days ago | 0.02935583 ETH | ||||
- | 12658812 | 1363 days ago | 10.28696191 ETH | ||||
- | 12646125 | 1364 days ago | 0.49999999 ETH | ||||
- | 12638244 | 1366 days ago | 0.00498499 ETH | ||||
- | 12638244 | 1366 days ago | 0.00498499 ETH | ||||
- | 12638236 | 1366 days ago | 0.00498497 ETH | ||||
- | 12638236 | 1366 days ago | 0.00498497 ETH | ||||
- | 12638235 | 1366 days ago | 0.00496233 ETH | ||||
- | 12638235 | 1366 days ago | 0.00496233 ETH | ||||
- | 12638229 | 1366 days ago | 0.00498499 ETH | ||||
- | 12638229 | 1366 days ago | 0.00498499 ETH | ||||
- | 12638225 | 1366 days ago | 0.00498499 ETH | ||||
- | 12638225 | 1366 days ago | 0.00498499 ETH | ||||
- | 12638221 | 1366 days ago | 0.00498499 ETH | ||||
- | 12638221 | 1366 days ago | 0.00498499 ETH | ||||
- | 12631728 | 1367 days ago | 1.06977618 ETH | ||||
- | 12582509 | 1374 days ago | 0.24999999 ETH | ||||
- | 12569836 | 1376 days ago | 0.73587559 ETH | ||||
- | 12556109 | 1378 days ago | 0.09999999 ETH | ||||
- | 12543436 | 1380 days ago | 0.27999999 ETH | ||||
- | 12542610 | 1381 days ago | 0.14888933 ETH | ||||
- | 12542610 | 1381 days ago | 0.14888933 ETH | ||||
- | 12539467 | 1381 days ago | 0.26119454 ETH | ||||
- | 12525074 | 1383 days ago | 0.02411326 ETH |
Loading...
Loading
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0x981f626f...2126A29fC The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
FarmMain
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-03-19 */ // File: contracts\amm-aggregator\common\AMMData.sol //SPDX-License-Identifier: MIT pragma solidity ^0.7.6; struct LiquidityPoolData { address liquidityPoolAddress; uint256 amount; address tokenAddress; bool amountIsLiquidityPool; bool involvingETH; address receiver; } struct SwapData { bool enterInETH; bool exitInETH; address[] liquidityPoolAddresses; address[] path; address inputToken; uint256 amount; address receiver; } // File: contracts\amm-aggregator\common\IAMM.sol //SPDX_License_Identifier: MIT pragma solidity ^0.7.6; pragma abicoder v2; interface IAMM { event NewLiquidityPoolAddress(address indexed); function info() external view returns(string memory name, uint256 version); function data() external view returns(address ethereumAddress, uint256 maxTokensPerLiquidityPool, bool hasUniqueLiquidityPools); function balanceOf(address liquidityPoolAddress, address owner) external view returns(uint256, uint256[] memory, address[] memory); function byLiquidityPool(address liquidityPoolAddress) external view returns(uint256, uint256[] memory, address[] memory); function byTokens(address[] calldata liquidityPoolTokens) external view returns(uint256, uint256[] memory, address, address[] memory); function byPercentage(address liquidityPoolAddress, uint256 numerator, uint256 denominator) external view returns (uint256, uint256[] memory, address[] memory); function byLiquidityPoolAmount(address liquidityPoolAddress, uint256 liquidityPoolAmount) external view returns(uint256[] memory, address[] memory); function byTokenAmount(address liquidityPoolAddress, address tokenAddress, uint256 tokenAmount) external view returns(uint256, uint256[] memory, address[] memory); function createLiquidityPoolAndAddLiquidity(address[] calldata tokenAddresses, uint256[] calldata amounts, bool involvingETH, address receiver) external payable returns(uint256, uint256[] memory, address, address[] memory); function addLiquidity(LiquidityPoolData calldata data) external payable returns(uint256, uint256[] memory, address[] memory); function addLiquidityBatch(LiquidityPoolData[] calldata data) external payable returns(uint256[] memory, uint256[][] memory, address[][] memory); function removeLiquidity(LiquidityPoolData calldata data) external returns(uint256, uint256[] memory, address[] memory); function removeLiquidityBatch(LiquidityPoolData[] calldata data) external returns(uint256[] memory, uint256[][] memory, address[][] memory); function getSwapOutput(address tokenAddress, uint256 tokenAmount, address[] calldata, address[] calldata path) view external returns(uint256[] memory); function swapLiquidity(SwapData calldata data) external payable returns(uint256); function swapLiquidityBatch(SwapData[] calldata data) external payable returns(uint256[] memory); } // File: contracts\farming\FarmData.sol //SPDX_License_Identifier: MIT pragma solidity ^0.7.6; struct FarmingPositionRequest { uint256 setupIndex; // index of the chosen setup. uint256 amount; // amount of main token or liquidity pool token. bool amountIsLiquidityPool; //true if user wants to directly share the liquidity pool token amount, false to add liquidity to AMM address positionOwner; // position extension or address(0) [msg.sender]. } struct FarmingSetupConfiguration { bool add; // true if we're adding a new setup, false we're updating it. bool disable; uint256 index; // index of the setup we're updating. FarmingSetupInfo info; // data of the new or updated setup } struct FarmingSetupInfo { bool free; // if the setup is a free farming setup or a locked one. uint256 blockDuration; // duration of setup uint256 originalRewardPerBlock; uint256 minStakeable; // minimum amount of staking tokens. uint256 maxStakeable; // maximum amount stakeable in the setup (used only if free is false). uint256 renewTimes; // if the setup is renewable or if it's one time. address ammPlugin; // amm plugin address used for this setup (eg. uniswap amm plugin address). address liquidityPoolTokenAddress; // address of the liquidity pool token address mainTokenAddress; // eg. buidl address. address ethereumAddress; bool involvingETH; // if the setup involves ETH or not. uint256 penaltyFee; // fee paid when the user exits a still active locked farming setup (used only if free is false). uint256 setupsCount; // number of setups created by this info. uint256 lastSetupIndex; // index of last setup; } struct FarmingSetup { uint256 infoIndex; // setup info bool active; // if the setup is active or not. uint256 startBlock; // farming setup start block. uint256 endBlock; // farming setup end block. uint256 lastUpdateBlock; // number of the block where an update was triggered. uint256 objectId; // items object id for the liquidity pool token (used only if free is false). uint256 rewardPerBlock; // farming setup reward per single block. uint256 totalSupply; // If free it's the LP amount, if locked is currentlyStaked. } struct FarmingPosition { address uniqueOwner; // address representing the owner of the position. uint256 setupIndex; // the setup index related to this position. uint256 creationBlock; // block when this position was created. uint256 liquidityPoolTokenAmount; // amount of liquidity pool token in the position. uint256 mainTokenAmount; // amount of main token in the position (used only if free is false). uint256 reward; // position reward (used only if free is false). uint256 lockedRewardPerBlock; // position locked reward per block (used only if free is false). } // File: contracts\farming\IFarmMain.sol //SPDX_License_Identifier: MIT pragma solidity ^0.7.6; //pragma abicoder v2; interface IFarmMain { function ONE_HUNDRED() external view returns(uint256); function _rewardTokenAddress() external view returns(address); function position(uint256 positionId) external view returns (FarmingPosition memory); function setups() external view returns (FarmingSetup[] memory); function setup(uint256 setupIndex) external view returns (FarmingSetup memory, FarmingSetupInfo memory); function setFarmingSetups(FarmingSetupConfiguration[] memory farmingSetups) external; function openPosition(FarmingPositionRequest calldata request) external payable returns(uint256 positionId); function addLiquidity(uint256 positionId, FarmingPositionRequest calldata request) external payable; } // File: contracts\farming\IFarmExtension.sol //SPDX_License_Identifier: MIT pragma solidity ^0.7.6; //pragma abicoder v2; interface IFarmExtension { function init(bool byMint, address host, address treasury) external; function setHost(address host) external; function setTreasury(address treasury) external; function data() external view returns(address farmMainContract, bool byMint, address host, address treasury, address rewardTokenAddress); function transferTo(uint256 amount) external; function backToYou(uint256 amount) external payable; function setFarmingSetups(FarmingSetupConfiguration[] memory farmingSetups) external; } // File: contracts\farming\IFarmFactory.sol //SPDX_License_Identifier: MIT pragma solidity ^0.7.6; interface IFarmFactory { event ExtensionCloned(address indexed); function feePercentageInfo() external view returns (uint256, address); function farmDefaultExtension() external view returns(address); function cloneFarmDefaultExtension() external returns(address); function getFarmTokenCollectionURI() external view returns (string memory); function getFarmTokenURI() external view returns (string memory); } // File: contracts\farming\util\ERC1155Receiver.sol // File: contracts/usd-v2/util/ERC1155Receiver.sol // SPDX_License_Identifier: MIT pragma solidity ^0.7.6; abstract contract ERC1155Receiver { bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7; mapping(bytes4 => bool) private _supportedInterfaces; constructor() { _registerInterface(_INTERFACE_ID_ERC165); _registerInterface( ERC1155Receiver(0).onERC1155Received.selector ^ ERC1155Receiver(0).onERC1155BatchReceived.selector ); } function supportsInterface(bytes4 interfaceId) public view returns (bool) { return _supportedInterfaces[interfaceId]; } function _registerInterface(bytes4 interfaceId) internal virtual { require(interfaceId != 0xffffffff, "ERC165: invalid interface id"); _supportedInterfaces[interfaceId] = true; } function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external virtual returns(bytes4); function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external virtual returns(bytes4); } // File: contracts\farming\util\IERC20.sol // SPDX_License_Identifier: MIT pragma solidity ^0.7.6; interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function safeApprove(address spender, uint256 amount) external; function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); function decimals() external view returns (uint8); } // File: contracts\farming\util\IEthItemOrchestrator.sol //SPDX_License_Identifier: MIT pragma solidity ^0.7.6; interface IEthItemOrchestrator { function createNative(bytes calldata modelInitPayload, string calldata ens) external returns (address newNativeAddress, bytes memory modelInitCallResponse); } // File: contracts\farming\util\IERC1155.sol // SPDX_License_Identifier: MIT pragma solidity ^0.7.6; interface IERC1155 { event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values); event ApprovalForAll(address indexed account, address indexed operator, bool approved); event URI(string value, uint256 indexed id); function balanceOf(address account, uint256 id) external view returns (uint256); function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); function setApprovalForAll(address operator, bool approved) external; function isApprovedForAll(address account, address operator) external view returns (bool); function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external; function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data) external; } // File: contracts\farming\util\IEthItemInteroperableInterface.sol // SPDX_License_Identifier: MIT pragma solidity ^0.7.6; interface IEthItemInteroperableInterface is IERC20 { function mainInterface() external view returns (address); function objectId() external view returns (uint256); function mint(address owner, uint256 amount) external; function burn(address owner, uint256 amount) external; function permitNonce(address sender) external view returns(uint256); function permit(address owner, address spender, uint value, uint8 v, bytes32 r, bytes32 s) external; function interoperableInterfaceVersion() external pure returns(uint256 ethItemInteroperableInterfaceVersion); } // File: contracts\farming\util\IEthItem.sol // SPDX_License_Identifier: MIT pragma solidity ^0.7.6; interface IEthItem is IERC1155 { function name() external view returns (string memory); function symbol() external view returns (string memory); function totalSupply(uint256 objectId) external view returns (uint256); function name(uint256 objectId) external view returns (string memory); function symbol(uint256 objectId) external view returns (string memory); function decimals(uint256 objectId) external view returns (uint256); function uri(uint256 objectId) external view returns (string memory); function mainInterfaceVersion() external pure returns(uint256 ethItemInteroperableVersion); function toInteroperableInterfaceAmount(uint256 objectId, uint256 ethItemAmount) external view returns (uint256 interoperableInterfaceAmount); function toMainInterfaceAmount(uint256 objectId, uint256 erc20WrapperAmount) external view returns (uint256 mainInterfaceAmount); function interoperableInterfaceModel() external view returns (address, uint256); function asInteroperable(uint256 objectId) external view returns (IEthItemInteroperableInterface); function emitTransferSingleEvent(address sender, address from, address to, uint256 objectId, uint256 amount) external; function mint(uint256 amount, string calldata partialUri) external returns (uint256, address); function burn( uint256 objectId, uint256 amount ) external; function burnBatch( uint256[] calldata objectIds, uint256[] calldata amounts ) external; } // File: contracts\farming\util\INativeV1.sol //SPDX_License_Identifier: MIT pragma solidity ^0.7.6; interface INativeV1 is IEthItem { function init(string calldata name, string calldata symbol, bool hasDecimals, string calldata collectionUri, address extensionAddress, bytes calldata extensionInitPayload) external returns(bytes memory extensionInitCallResponse); function extension() external view returns (address extensionAddress); function canMint(address operator) external view returns (bool result); function isEditable(uint256 objectId) external view returns (bool result); function releaseExtension() external; function uri() external view returns (string memory); function decimals() external view returns (uint256); function mint(uint256 amount, string calldata tokenName, string calldata tokenSymbol, string calldata objectUri, bool editable) external returns (uint256 objectId, address tokenAddress); function mint(uint256 amount, string calldata tokenName, string calldata tokenSymbol, string calldata objectUri) external returns (uint256 objectId, address tokenAddress); function mint(uint256 objectId, uint256 amount) external; function makeReadOnly(uint256 objectId) external; function setUri(string calldata newUri) external; function setUri(uint256 objectId, string calldata newUri) external; } // File: contracts\farming\FarmMain.sol //SPDX_License_Identifier: MIT pragma solidity ^0.7.6; //pragma abicoder v2; contract FarmMain is IFarmMain, ERC1155Receiver { // percentage uint256 public override constant ONE_HUNDRED = 1e18; // event that tracks contracts deployed for the given reward token event RewardToken(address indexed rewardTokenAddress); // new or transferred farming position event event Transfer(uint256 indexed positionId, address indexed from, address indexed to); // event that tracks involved tokens for this contract event SetupToken(address indexed mainToken, address indexed involvedToken); // event that tracks farm tokens event FarmToken(uint256 indexed objectId, address indexed liquidityPoolToken, uint256 setupIndex, uint256 endBlock); // factory address that will create clones of this contract address public _factory; // address of the extension of this contract address public _extension; // address of the reward token address public override _rewardTokenAddress; // farm token collection address public _farmTokenCollection; // mapping containing all the currently available farming setups info mapping(uint256 => FarmingSetupInfo) private _setupsInfo; // counter for the farming setup info uint256 public _farmingSetupsInfoCount; // mapping containing all the currently available farming setups mapping(uint256 => FarmingSetup) private _setups; // counter for the farming setups uint256 public _farmingSetupsCount; // mapping containing all the positions mapping(uint256 => FarmingPosition) private _positions; // mapping containing the reward per token per setup per block mapping(uint256 => uint256) private _rewardPerTokenPerSetup; // mapping containing the reward per token paid per position mapping(uint256 => uint256) private _rewardPerTokenPaid; // mapping containing whether a farming position has been partially reedemed or not mapping(uint256 => uint256) public _partiallyRedeemed; // mapping containing object id to setup index mapping(uint256 => uint256) private _objectIdSetup; // mapping containing all the number of opened positions for each setups mapping(uint256 => uint256) private _setupPositionsCount; // mapping containing all the reward received/paid per setup mapping(uint256 => uint256) public _rewardReceived; mapping(uint256 => uint256) public _rewardPaid; /** Modifiers. */ /** @dev byExtension modifier used to check for unauthorized changes. */ modifier byExtension() { require(msg.sender == _extension, "Unauthorized"); _; } /** @dev byPositionOwner modifier used to check for unauthorized accesses. */ modifier byPositionOwner(uint256 positionId) { require(_positions[positionId].uniqueOwner == msg.sender && _positions[positionId].creationBlock != 0, "Not owned"); _; } /** @dev activeSetupOnly modifier used to check for function calls only if the setup is active. */ modifier activeSetupOnly(uint256 setupIndex) { require(_setups[setupIndex].active, "Setup not active"); require(_setups[setupIndex].startBlock <= block.number && _setups[setupIndex].endBlock > block.number, "Invalid setup"); _; } receive() external payable {} /** Extension methods */ /** @dev initializes the farming contract. * @param extension extension address. * @param extensionInitData lm extension init payload. * @param orchestrator address of the eth item orchestrator. * @param rewardTokenAddress address of the reward token. * @return extensionReturnCall result of the extension initialization function, if it was called. */ function init(address extension, bytes memory extensionInitData, address orchestrator, address rewardTokenAddress, bytes memory farmingSetupInfosBytes) public returns(bytes memory extensionReturnCall) { require(_factory == address(0), "Already initialized"); require((_extension = extension) != address(0), "extension"); _factory = msg.sender; emit RewardToken(_rewardTokenAddress = rewardTokenAddress); if (keccak256(extensionInitData) != keccak256("")) { extensionReturnCall = _call(_extension, extensionInitData); } (_farmTokenCollection,) = IEthItemOrchestrator(orchestrator).createNative(abi.encodeWithSignature("init(string,string,bool,string,address,bytes)", "Covenants Farming", "cFARM", true, IFarmFactory(_factory).getFarmTokenCollectionURI(), address(this), ""), ""); if(farmingSetupInfosBytes.length > 0) { FarmingSetupInfo[] memory farmingSetupInfos = abi.decode(farmingSetupInfosBytes, (FarmingSetupInfo[])); for(uint256 i = 0; i < farmingSetupInfos.length; i++) { _setOrAddFarmingSetupInfo(farmingSetupInfos[i], true, false, 0); } } } function setFarmingSetups(FarmingSetupConfiguration[] memory farmingSetups) public override byExtension { for (uint256 i = 0; i < farmingSetups.length; i++) { _setOrAddFarmingSetupInfo(farmingSetups[i].info, farmingSetups[i].add, farmingSetups[i].disable, farmingSetups[i].index); } } /** Public methods */ /** @dev returns the position with the given id. * @param positionId id of the position. * @return farming position with the given id. */ function position(uint256 positionId) public override view returns (FarmingPosition memory) { return _positions[positionId]; } function setup(uint256 setupIndex) public override view returns (FarmingSetup memory, FarmingSetupInfo memory) { return (_setups[setupIndex], _setupsInfo[_setups[setupIndex].infoIndex]); } function setups() public override view returns (FarmingSetup[] memory) { FarmingSetup[] memory farmingSetups = new FarmingSetup[](_farmingSetupsCount); for (uint256 i = 0; i < _farmingSetupsCount; i++) { farmingSetups[i] = _setups[i]; } return farmingSetups; } function activateSetup(uint256 setupInfoIndex) public { require(_setupsInfo[setupInfoIndex].renewTimes > 0 && !_setups[_setupsInfo[setupInfoIndex].lastSetupIndex].active, "Invalid toggle."); _toggleSetup(_setupsInfo[setupInfoIndex].lastSetupIndex); } function transferPosition(address to, uint256 positionId) public byPositionOwner(positionId) { // retrieve liquidity mining position FarmingPosition memory pos = _positions[positionId]; require( to != address(0) && pos.creationBlock != 0, "Invalid position" ); // pos.uniqueOwner = to; uint256 newPositionId = uint256(keccak256(abi.encode(to, _setupsInfo[_setups[pos.setupIndex].infoIndex].free ? 0 : block.number, pos.setupIndex))); require(_positions[newPositionId].creationBlock == 0, "Invalid transfer"); _positions[newPositionId] = abi.decode(abi.encode(pos), (FarmingPosition)); _positions[newPositionId].uniqueOwner = to; delete _positions[positionId]; emit Transfer(newPositionId, msg.sender, to); } function openPosition(FarmingPositionRequest memory request) public override payable activeSetupOnly(request.setupIndex) returns(uint256 positionId) { // retrieve the setup FarmingSetup storage chosenSetup = _setups[request.setupIndex]; // retrieve the unique owner address uniqueOwner = (request.positionOwner != address(0)) ? request.positionOwner : msg.sender; // create the position id positionId = uint256(keccak256(abi.encode(uniqueOwner, _setupsInfo[chosenSetup.infoIndex].free ? 0 : block.number, request.setupIndex))); require(_positions[positionId].creationBlock == 0, "Invalid open"); // create the lp data for the amm (LiquidityPoolData memory liquidityPoolData, uint256 mainTokenAmount) = _addLiquidity(request.setupIndex, request); // calculate the reward uint256 reward; uint256 lockedRewardPerBlock; if (!_setupsInfo[chosenSetup.infoIndex].free) { (reward, lockedRewardPerBlock) = calculateLockedFarmingReward(request.setupIndex, mainTokenAmount, false, 0); require(reward > 0 && lockedRewardPerBlock > 0, "Insufficient staked amount"); chosenSetup.totalSupply = chosenSetup.totalSupply + mainTokenAmount; chosenSetup.lastUpdateBlock = block.number; _mintFarmTokenAmount(uniqueOwner, liquidityPoolData.amount, request.setupIndex); } else { _updateFreeSetup(request.setupIndex, liquidityPoolData.amount, positionId, false); } _positions[positionId] = FarmingPosition({ uniqueOwner: uniqueOwner, setupIndex : request.setupIndex, liquidityPoolTokenAmount: liquidityPoolData.amount, mainTokenAmount: mainTokenAmount, reward: reward, lockedRewardPerBlock: lockedRewardPerBlock, creationBlock: block.number }); _setupPositionsCount[request.setupIndex] += (1 + (_setupsInfo[chosenSetup.infoIndex].free ? 0 : liquidityPoolData.amount)); emit Transfer(positionId, address(0), uniqueOwner); } function addLiquidity(uint256 positionId, FarmingPositionRequest memory request) public override payable activeSetupOnly(request.setupIndex) byPositionOwner(positionId) { // retrieve farming position FarmingPosition storage farmingPosition = _positions[positionId]; FarmingSetup storage chosenSetup = _setups[farmingPosition.setupIndex]; // check if farmoing position is valid require(_setupsInfo[chosenSetup.infoIndex].free, "Invalid add liquidity"); // create the lp data for the amm (LiquidityPoolData memory liquidityPoolData,) = _addLiquidity(farmingPosition.setupIndex, request); // rebalance the reward per token _rewardPerTokenPerSetup[farmingPosition.setupIndex] += (((block.number - chosenSetup.lastUpdateBlock) * chosenSetup.rewardPerBlock) * 1e18) / chosenSetup.totalSupply; farmingPosition.reward = calculateFreeFarmingReward(positionId, false); _rewardPerTokenPaid[positionId] = _rewardPerTokenPerSetup[farmingPosition.setupIndex]; farmingPosition.liquidityPoolTokenAmount += liquidityPoolData.amount; // update the last block update variablex chosenSetup.lastUpdateBlock = block.number; chosenSetup.totalSupply += liquidityPoolData.amount; } /** @dev this function allows a user to withdraw the reward. * @param positionId farming position id. */ function withdrawReward(uint256 positionId) public byPositionOwner(positionId) { // retrieve farming position FarmingPosition storage farmingPosition = _positions[positionId]; uint256 reward = farmingPosition.reward; uint256 currentBlock = block.number; if (!_setupsInfo[_setups[farmingPosition.setupIndex].infoIndex].free) { // check if reward is available require(farmingPosition.reward > 0, "No reward"); // check if it's a partial reward or not // if (_setups[farmingPosition.setupIndex].endBlock > block.number) { // calculate the reward from the farming position creation block to the current block multiplied by the reward per block (reward,) = calculateLockedFarmingReward(0, 0, true, positionId); //} require(reward <= farmingPosition.reward, "Reward is bigger than expected"); // remove the partial reward from the liquidity mining position total reward farmingPosition.reward = currentBlock >= _setups[farmingPosition.setupIndex].endBlock ? 0 : farmingPosition.reward - reward; farmingPosition.creationBlock = block.number; } else { // rebalance setup currentBlock = currentBlock > _setups[farmingPosition.setupIndex].endBlock ? _setups[farmingPosition.setupIndex].endBlock : currentBlock; _rewardPerTokenPerSetup[farmingPosition.setupIndex] += (((currentBlock - _setups[farmingPosition.setupIndex].lastUpdateBlock) * _setups[farmingPosition.setupIndex].rewardPerBlock) * 1e18) / _setups[farmingPosition.setupIndex].totalSupply; reward = calculateFreeFarmingReward(positionId, false); _rewardPerTokenPaid[positionId] = _rewardPerTokenPerSetup[farmingPosition.setupIndex]; farmingPosition.reward = 0; // update the last block update variable _setups[farmingPosition.setupIndex].lastUpdateBlock = currentBlock; } if (reward > 0) { // transfer the reward if (_rewardTokenAddress != address(0)) { _safeTransfer(_rewardTokenAddress, farmingPosition.uniqueOwner, reward); } else { (bool result,) = farmingPosition.uniqueOwner.call{value:reward}(""); require(result, "Invalid ETH transfer."); } _rewardPaid[farmingPosition.setupIndex] += reward; } if (_setups[farmingPosition.setupIndex].endBlock <= block.number) { if (_setups[farmingPosition.setupIndex].active) { _toggleSetup(farmingPosition.setupIndex); } // close the locked position after withdrawing all the reward if (!_setupsInfo[_setups[farmingPosition.setupIndex].infoIndex].free) { _setupPositionsCount[farmingPosition.setupIndex] -= 1; if (_setupPositionsCount[farmingPosition.setupIndex] == 0 && !_setups[farmingPosition.setupIndex].active) { _giveBack(_rewardReceived[farmingPosition.setupIndex] - _rewardPaid[farmingPosition.setupIndex]); delete _setups[farmingPosition.setupIndex]; } delete _positions[positionId]; } } else if (!_setupsInfo[_setups[farmingPosition.setupIndex].infoIndex].free) { // set the partially redeemed amount _partiallyRedeemed[positionId] += reward; } } function withdrawLiquidity(uint256 positionId, uint256 objectId, bool unwrapPair, uint256 removedLiquidity) public { // retrieve farming position FarmingPosition memory farmingPosition = _positions[positionId]; uint256 setupIndex = farmingPosition.setupIndex; if (objectId != 0 && address(INativeV1(_farmTokenCollection).asInteroperable(objectId)) != address(0)) { setupIndex = _objectIdSetup[objectId]; } require((positionId != 0 && objectId == 0) || (objectId != 0 && positionId == 0 && _setups[setupIndex].objectId == objectId), "Invalid position"); // current owned liquidity require( ( _setupsInfo[_setups[farmingPosition.setupIndex].infoIndex].free && farmingPosition.creationBlock != 0 && removedLiquidity <= farmingPosition.liquidityPoolTokenAmount && farmingPosition.uniqueOwner == msg.sender ) || (INativeV1(_farmTokenCollection).balanceOf(msg.sender, objectId) >= removedLiquidity && (_setups[setupIndex].endBlock <= block.number)), "Invalid withdraw"); // burn the liquidity in the locked setup if (positionId == 0) { _burnFarmTokenAmount(objectId, removedLiquidity); } else { withdrawReward(positionId); _setups[farmingPosition.setupIndex].totalSupply -= removedLiquidity; } _removeLiquidity(positionId, setupIndex, unwrapPair, removedLiquidity, false); if (positionId == 0) { _setupPositionsCount[setupIndex] -= removedLiquidity; if (_setupPositionsCount[setupIndex] == 0 && !_setups[setupIndex].active) { _giveBack(_rewardReceived[setupIndex] - _rewardPaid[setupIndex]); delete _setups[setupIndex]; } } } function unlock(uint256 positionId, bool unwrapPair) public payable byPositionOwner(positionId) { // retrieve liquidity mining position FarmingPosition storage farmingPosition = _positions[positionId]; require(!_setupsInfo[_setups[farmingPosition.setupIndex].infoIndex].free && _setups[farmingPosition.setupIndex].endBlock > block.number, "Invalid unlock"); uint256 rewardToGiveBack = _partiallyRedeemed[positionId]; // must pay a penalty fee rewardToGiveBack += _setupsInfo[_setups[farmingPosition.setupIndex].infoIndex].penaltyFee == 0 ? 0 : (farmingPosition.reward * ((_setupsInfo[_setups[farmingPosition.setupIndex].infoIndex].penaltyFee * 1e18) / ONE_HUNDRED) / 1e18); // add all the unissued reward if (rewardToGiveBack > 0) { _safeTransferFrom(_rewardTokenAddress, msg.sender, address(this), rewardToGiveBack); _giveBack(rewardToGiveBack); } _setups[farmingPosition.setupIndex].totalSupply -= farmingPosition.mainTokenAmount; _burnFarmTokenAmount(_setups[farmingPosition.setupIndex].objectId, farmingPosition.liquidityPoolTokenAmount); _removeLiquidity(positionId, farmingPosition.setupIndex, unwrapPair, farmingPosition.liquidityPoolTokenAmount, true); _setupPositionsCount[farmingPosition.setupIndex] -= 1 + farmingPosition.liquidityPoolTokenAmount; delete _positions[positionId]; } function calculateLockedFarmingReward(uint256 setupIndex, uint256 mainTokenAmount, bool isPartial, uint256 positionId) public view returns(uint256 reward, uint256 relativeRewardPerBlock) { if (isPartial) { // retrieve the position FarmingPosition memory farmingPosition = _positions[positionId]; // calculate the reward uint256 currentBlock = block.number >= _setups[farmingPosition.setupIndex].endBlock ? _setups[farmingPosition.setupIndex].endBlock : block.number; reward = ((currentBlock - farmingPosition.creationBlock) * farmingPosition.lockedRewardPerBlock); } else { FarmingSetup memory setup = _setups[setupIndex]; // check if main token amount is less than the stakeable liquidity require(mainTokenAmount <= _setupsInfo[_setups[setupIndex].infoIndex].maxStakeable - setup.totalSupply, "Invalid liquidity"); uint256 remainingBlocks = block.number >= setup.endBlock ? 0 : setup.endBlock - block.number; // get amount of remaining blocks require(remainingBlocks > 0, "FarmingSetup ended"); // get total reward still available (= 0 if rewardPerBlock = 0) require(setup.rewardPerBlock * remainingBlocks > 0, "No rewards"); // calculate relativeRewardPerBlock relativeRewardPerBlock = (setup.rewardPerBlock * ((mainTokenAmount * 1e18) / _setupsInfo[_setups[setupIndex].infoIndex].maxStakeable)) / 1e18; // check if rewardPerBlock is greater than 0 require(relativeRewardPerBlock > 0, "Invalid rpb"); // calculate reward by multiplying relative reward per block and the remaining blocks reward = relativeRewardPerBlock * remainingBlocks; } } function calculateFreeFarmingReward(uint256 positionId, bool isExt) public view returns(uint256 reward) { FarmingPosition memory farmingPosition = _positions[positionId]; reward = ((_rewardPerTokenPerSetup[farmingPosition.setupIndex] - _rewardPerTokenPaid[positionId]) * farmingPosition.liquidityPoolTokenAmount) / 1e18; if (isExt) { uint256 currentBlock = block.number < _setups[farmingPosition.setupIndex].endBlock ? block.number : _setups[farmingPosition.setupIndex].endBlock; uint256 lastUpdateBlock = _setups[farmingPosition.setupIndex].lastUpdateBlock < _setups[farmingPosition.setupIndex].startBlock ? _setups[farmingPosition.setupIndex].startBlock : _setups[farmingPosition.setupIndex].lastUpdateBlock; uint256 rpt = (((currentBlock - lastUpdateBlock) * _setups[farmingPosition.setupIndex].rewardPerBlock) * 1e18) / _setups[farmingPosition.setupIndex].totalSupply; reward += (rpt * farmingPosition.liquidityPoolTokenAmount) / 1e18; } reward += farmingPosition.reward; } function onERC1155BatchReceived(address, address, uint256[] memory, uint256[] memory, bytes memory) public view override returns(bytes4) { require(_farmTokenCollection == msg.sender, "Invalid sender"); return this.onERC1155BatchReceived.selector; } function onERC1155Received(address, address, uint256, uint256, bytes memory) public view override returns(bytes4) { require(_farmTokenCollection == msg.sender, "Invalid sender"); return this.onERC1155Received.selector; } /** Private methods */ function _setOrAddFarmingSetupInfo(FarmingSetupInfo memory info, bool add, bool disable, uint256 setupIndex) private { FarmingSetupInfo memory farmingSetupInfo = info; if(add || !disable) { farmingSetupInfo.renewTimes = farmingSetupInfo.renewTimes + 1; if(farmingSetupInfo.renewTimes == 0) { farmingSetupInfo.renewTimes = farmingSetupInfo.renewTimes - 1; } } if (add) { require( farmingSetupInfo.ammPlugin != address(0) && farmingSetupInfo.liquidityPoolTokenAddress != address(0) && farmingSetupInfo.originalRewardPerBlock > 0 && (farmingSetupInfo.free || farmingSetupInfo.maxStakeable > 0), "Invalid setup configuration" ); (,,address[] memory tokenAddresses) = IAMM(farmingSetupInfo.ammPlugin).byLiquidityPool(farmingSetupInfo.liquidityPoolTokenAddress); farmingSetupInfo.ethereumAddress = address(0); if (farmingSetupInfo.involvingETH) { (farmingSetupInfo.ethereumAddress,,) = IAMM(farmingSetupInfo.ammPlugin).data(); } bool mainTokenFound = false; bool ethTokenFound = false; for(uint256 z = 0; z < tokenAddresses.length; z++) { if(tokenAddresses[z] == farmingSetupInfo.mainTokenAddress) { mainTokenFound = true; if(tokenAddresses[z] == farmingSetupInfo.ethereumAddress) { ethTokenFound = true; } } else { emit SetupToken(farmingSetupInfo.mainTokenAddress, tokenAddresses[z]); if(tokenAddresses[z] == farmingSetupInfo.ethereumAddress) { ethTokenFound = true; } } } require(mainTokenFound, "No main token"); require(!farmingSetupInfo.involvingETH || ethTokenFound, "No ETH token"); farmingSetupInfo.setupsCount = 0; _setupsInfo[_farmingSetupsInfoCount] = farmingSetupInfo; _setups[_farmingSetupsCount] = FarmingSetup(_farmingSetupsInfoCount, false, 0, 0, 0, 0, farmingSetupInfo.originalRewardPerBlock, 0); _setupsInfo[_farmingSetupsInfoCount].lastSetupIndex = _farmingSetupsCount; _farmingSetupsInfoCount += 1; _farmingSetupsCount += 1; return; } FarmingSetup storage setup = _setups[setupIndex]; farmingSetupInfo = _setupsInfo[_setups[setupIndex].infoIndex]; if(disable) { require(setup.active, "Not possible"); _toggleSetup(setupIndex); return; } info.renewTimes -= 1; if (setup.active && _setupsInfo[_setups[setupIndex].infoIndex].free) { setup = _setups[setupIndex]; if(block.number < setup.endBlock) { uint256 difference = info.originalRewardPerBlock < farmingSetupInfo.originalRewardPerBlock ? farmingSetupInfo.originalRewardPerBlock - info.originalRewardPerBlock : info.originalRewardPerBlock - farmingSetupInfo.originalRewardPerBlock; uint256 duration = setup.endBlock - block.number; uint256 amount = difference * duration; if (amount > 0) { if (info.originalRewardPerBlock > farmingSetupInfo.originalRewardPerBlock) { require(_ensureTransfer(amount), "Insufficient reward in extension."); _rewardReceived[setupIndex] += amount; } _updateFreeSetup(setupIndex, 0, 0, false); setup.rewardPerBlock = info.originalRewardPerBlock; } } _setupsInfo[_setups[setupIndex].infoIndex].originalRewardPerBlock = info.originalRewardPerBlock; } if(_setupsInfo[_setups[setupIndex].infoIndex].renewTimes > 0) { _setupsInfo[_setups[setupIndex].infoIndex].renewTimes = info.renewTimes; } } function _transferToMeAndCheckAllowance(FarmingSetup memory setup, FarmingPositionRequest memory request) private returns(IAMM amm, uint256 liquidityPoolAmount, uint256 mainTokenAmount) { require(request.amount > 0, "No amount"); // retrieve the values amm = IAMM(_setupsInfo[setup.infoIndex].ammPlugin); liquidityPoolAmount = request.amountIsLiquidityPool ? request.amount : 0; mainTokenAmount = request.amountIsLiquidityPool ? 0 : request.amount; address[] memory tokens; uint256[] memory tokenAmounts; // if liquidity pool token amount is provided, the position is opened by liquidity pool token amount if(request.amountIsLiquidityPool) { _safeTransferFrom(_setupsInfo[setup.infoIndex].liquidityPoolTokenAddress, msg.sender, address(this), liquidityPoolAmount); (tokenAmounts, tokens) = amm.byLiquidityPoolAmount(_setupsInfo[setup.infoIndex].liquidityPoolTokenAddress, liquidityPoolAmount); } else { // else it is opened by the tokens amounts (liquidityPoolAmount, tokenAmounts, tokens) = amm.byTokenAmount(_setupsInfo[setup.infoIndex].liquidityPoolTokenAddress, _setupsInfo[setup.infoIndex].mainTokenAddress, mainTokenAmount); } // iterate the tokens and perform the transferFrom and the approve for(uint256 i = 0; i < tokens.length; i++) { if(tokens[i] == _setupsInfo[setup.infoIndex].mainTokenAddress) { mainTokenAmount = tokenAmounts[i]; require(mainTokenAmount >= _setupsInfo[setup.infoIndex].minStakeable, "Invalid liquidity."); if(request.amountIsLiquidityPool) { break; } } if(request.amountIsLiquidityPool) { continue; } if(_setupsInfo[setup.infoIndex].involvingETH && _setupsInfo[setup.infoIndex].ethereumAddress == tokens[i]) { require(msg.value == tokenAmounts[i], "Incorrect eth value"); } else { _safeTransferFrom(tokens[i], msg.sender, address(this), tokenAmounts[i]); _safeApprove(tokens[i], _setupsInfo[setup.infoIndex].ammPlugin, tokenAmounts[i]); } } } function _addLiquidity(uint256 setupIndex, FarmingPositionRequest memory request) private returns(LiquidityPoolData memory liquidityPoolData, uint256 tokenAmount) { (IAMM amm, uint256 liquidityPoolAmount, uint256 mainTokenAmount) = _transferToMeAndCheckAllowance(_setups[setupIndex], request); // liquidity pool data struct for the AMM liquidityPoolData = LiquidityPoolData( _setupsInfo[_setups[setupIndex].infoIndex].liquidityPoolTokenAddress, request.amountIsLiquidityPool ? liquidityPoolAmount : mainTokenAmount, _setupsInfo[_setups[setupIndex].infoIndex].mainTokenAddress, request.amountIsLiquidityPool, _setupsInfo[_setups[setupIndex].infoIndex].involvingETH, address(this) ); tokenAmount = mainTokenAmount; // amount is lp check if (liquidityPoolData.amountIsLiquidityPool || !_setupsInfo[_setups[setupIndex].infoIndex].involvingETH) { require(msg.value == 0, "ETH not involved"); } if (liquidityPoolData.amountIsLiquidityPool) { return(liquidityPoolData, tokenAmount); } // retrieve the poolTokenAmount from the amm if(liquidityPoolData.involvingETH) { (liquidityPoolData.amount,,) = amm.addLiquidity{value : msg.value}(liquidityPoolData); } else { (liquidityPoolData.amount,,) = amm.addLiquidity(liquidityPoolData); } } /** @dev helper function used to remove liquidity from a free position or to burn item farm tokens and retrieve their content. * @param positionId id of the position. * @param setupIndex index of the setup related to the item farm tokens. * @param unwrapPair whether to unwrap the liquidity pool tokens or not. * @param isUnlock if we're removing liquidity from an unlock method or not. */ function _removeLiquidity(uint256 positionId, uint256 setupIndex, bool unwrapPair, uint256 removedLiquidity, bool isUnlock) private { FarmingSetupInfo memory setupInfo = _setupsInfo[_setups[setupIndex].infoIndex]; // create liquidity pool data struct for the AMM LiquidityPoolData memory lpData = LiquidityPoolData( setupInfo.liquidityPoolTokenAddress, removedLiquidity, setupInfo.mainTokenAddress, true, setupInfo.involvingETH, msg.sender ); // retrieve the position FarmingPosition storage farmingPosition = _positions[positionId]; // remaining liquidity uint256 remainingLiquidity; // we are removing liquidity using the setup items if (setupInfo.free && farmingPosition.creationBlock != 0 && positionId != 0) { // update the remaining liquidity remainingLiquidity = farmingPosition.liquidityPoolTokenAmount - removedLiquidity; } // retrieve fee stuff (uint256 exitFeePercentage, address exitFeeWallet) = IFarmFactory(_factory).feePercentageInfo(); // pay the fees! if (exitFeePercentage > 0) { uint256 fee = (lpData.amount * ((exitFeePercentage * 1e18) / ONE_HUNDRED)) / 1e18; _safeTransfer(setupInfo.liquidityPoolTokenAddress, exitFeeWallet, fee); lpData.amount = lpData.amount - fee; } // check if the user wants to unwrap its pair or not if (unwrapPair) { // remove liquidity using AMM _safeApprove(lpData.liquidityPoolAddress, setupInfo.ammPlugin, lpData.amount); IAMM(setupInfo.ammPlugin).removeLiquidity(lpData); } else { // send back the liquidity pool token amount without the fee _safeTransfer(lpData.liquidityPoolAddress, lpData.receiver, lpData.amount); } if (!setupInfo.free && _setups[setupIndex].active && !isUnlock) { _toggleSetup(setupIndex); } else if (setupInfo.free && positionId != 0) { if (_setups[farmingPosition.setupIndex].active && _setups[farmingPosition.setupIndex].endBlock <= block.number) { _toggleSetup(farmingPosition.setupIndex); } // delete the farming position after the withdraw if (remainingLiquidity == 0) { _setupPositionsCount[farmingPosition.setupIndex] -= 1; if (_setupPositionsCount[farmingPosition.setupIndex] == 0 && !_setups[farmingPosition.setupIndex].active) { _giveBack(_rewardReceived[farmingPosition.setupIndex] - _rewardPaid[farmingPosition.setupIndex]); delete _setups[farmingPosition.setupIndex]; } delete _positions[positionId]; } else { // update the creation block and amount farmingPosition.liquidityPoolTokenAmount = remainingLiquidity; } } } /** @dev updates the free setup with the given index. * @param setupIndex index of the setup that we're updating. * @param amount amount of liquidity that we're adding/removeing. * @param positionId position id. * @param fromExit if it's from an exit or not. */ function _updateFreeSetup(uint256 setupIndex, uint256 amount, uint256 positionId, bool fromExit) private { uint256 currentBlock = block.number < _setups[setupIndex].endBlock ? block.number : _setups[setupIndex].endBlock; if (_setups[setupIndex].totalSupply != 0) { uint256 lastUpdateBlock = _setups[setupIndex].lastUpdateBlock < _setups[setupIndex].startBlock ? _setups[setupIndex].startBlock : _setups[setupIndex].lastUpdateBlock; _rewardPerTokenPerSetup[setupIndex] += (((currentBlock - lastUpdateBlock) * _setups[setupIndex].rewardPerBlock) * 1e18) / _setups[setupIndex].totalSupply; } // update the last block update variable _setups[setupIndex].lastUpdateBlock = currentBlock; if (positionId != 0) { _rewardPerTokenPaid[positionId] = _rewardPerTokenPerSetup[setupIndex]; } if (amount > 0) { fromExit ? _setups[setupIndex].totalSupply -= amount : _setups[setupIndex].totalSupply += amount; } } function _toggleSetup(uint256 setupIndex) private { FarmingSetup storage setup = _setups[setupIndex]; // require(!setup.active || block.number >= setup.endBlock, "Not valid activation"); if (setup.active && block.number >= setup.endBlock && _setupsInfo[setup.infoIndex].renewTimes == 0) { setup.active = false; return; } else if (block.number >= setup.startBlock && block.number < setup.endBlock && setup.active) { setup.active = false; _setupsInfo[setup.infoIndex].renewTimes = 0; uint256 amount = (setup.endBlock - block.number) * setup.rewardPerBlock; setup.endBlock = block.number; if (_setupsInfo[setup.infoIndex].free) { _updateFreeSetup(setupIndex, 0, 0, false); } _rewardReceived[setupIndex] -= amount; _giveBack(amount); return; } bool wasActive = setup.active; setup.active = _ensureTransfer(setup.rewardPerBlock * _setupsInfo[setup.infoIndex].blockDuration); if (setup.active && wasActive) { _rewardReceived[_farmingSetupsCount] = setup.rewardPerBlock * _setupsInfo[setup.infoIndex].blockDuration; // set new setup _setups[_farmingSetupsCount] = abi.decode(abi.encode(setup), (FarmingSetup)); // update old setup _setups[setupIndex].active = false; // update new setup _setupsInfo[setup.infoIndex].renewTimes -= 1; _setupsInfo[setup.infoIndex].setupsCount += 1; _setupsInfo[setup.infoIndex].lastSetupIndex = _farmingSetupsCount; _setups[_farmingSetupsCount].startBlock = block.number; _setups[_farmingSetupsCount].endBlock = block.number + _setupsInfo[_setups[_farmingSetupsCount].infoIndex].blockDuration; _setups[_farmingSetupsCount].objectId = 0; _setups[_farmingSetupsCount].totalSupply = 0; _farmingSetupsCount += 1; } else if (setup.active && !wasActive) { _rewardReceived[setupIndex] = setup.rewardPerBlock * _setupsInfo[_setups[setupIndex].infoIndex].blockDuration; // update new setup _setups[setupIndex].startBlock = block.number; _setups[setupIndex].endBlock = block.number + _setupsInfo[_setups[setupIndex].infoIndex].blockDuration; _setups[setupIndex].totalSupply = 0; _setupsInfo[_setups[setupIndex].infoIndex].renewTimes -= 1; } else { _setupsInfo[_setups[setupIndex].infoIndex].renewTimes = 0; } } /** @dev mints a new FarmToken inside the collection for the given position. * @param uniqueOwner farming position owner. * @param amount amount of to mint for a farm token. * @param setupIndex index of the setup. * @return objectId new farm token object id. */ function _mintFarmTokenAmount(address uniqueOwner, uint256 amount, uint256 setupIndex) private returns(uint256 objectId) { if (_setups[setupIndex].objectId == 0) { (objectId,) = INativeV1(_farmTokenCollection).mint(amount, string(abi.encodePacked("Farming LP ", _toString(_setupsInfo[_setups[setupIndex].infoIndex].liquidityPoolTokenAddress))), "fLP", IFarmFactory(_factory).getFarmTokenURI(), true); emit FarmToken(objectId, _setupsInfo[_setups[setupIndex].infoIndex].liquidityPoolTokenAddress, setupIndex, _setups[setupIndex].endBlock); _objectIdSetup[objectId] = setupIndex; _setups[setupIndex].objectId = objectId; } else { INativeV1(_farmTokenCollection).mint(_setups[setupIndex].objectId, amount); } INativeV1(_farmTokenCollection).safeTransferFrom(address(this), uniqueOwner, _setups[setupIndex].objectId, amount, ""); } /** @dev burns a farm token from the collection. * @param objectId object id where to burn liquidity. * @param amount amount of liquidity to burn. */ function _burnFarmTokenAmount(uint256 objectId, uint256 amount) private { INativeV1 tokenCollection = INativeV1(_farmTokenCollection); // transfer the farm token to this contract tokenCollection.safeTransferFrom(msg.sender, address(this), objectId, amount, ""); // burn the farm token tokenCollection.burn(objectId, amount); } /** @dev function used to safely approve ERC20 transfers. * @param erc20TokenAddress address of the token to approve. * @param to receiver of the approval. * @param value amount to approve for. */ function _safeApprove(address erc20TokenAddress, address to, uint256 value) internal virtual { bytes memory returnData = _call(erc20TokenAddress, abi.encodeWithSelector(IERC20(erc20TokenAddress).approve.selector, to, value)); require(returnData.length == 0 || abi.decode(returnData, (bool)), 'APPROVE_FAILED'); } /** @dev function used to safe transfer ERC20 tokens. * @param erc20TokenAddress address of the token to transfer. * @param to receiver of the tokens. * @param value amount of tokens to transfer. */ function _safeTransfer(address erc20TokenAddress, address to, uint256 value) internal virtual { bytes memory returnData = _call(erc20TokenAddress, abi.encodeWithSelector(IERC20(erc20TokenAddress).transfer.selector, to, value)); require(returnData.length == 0 || abi.decode(returnData, (bool)), 'TRANSFER_FAILED'); } /** @dev this function safely transfers the given ERC20 value from an address to another. * @param erc20TokenAddress erc20 token address. * @param from address from. * @param to address to. * @param value amount to transfer. */ function _safeTransferFrom(address erc20TokenAddress, address from, address to, uint256 value) private { bytes memory returnData = _call(erc20TokenAddress, abi.encodeWithSelector(IERC20(erc20TokenAddress).transferFrom.selector, from, to, value)); require(returnData.length == 0 || abi.decode(returnData, (bool)), 'TRANSFERFROM_FAILED'); } /** @dev calls the contract at the given location using the given payload and returns the returnData. * @param location location to call. * @param payload call payload. * @return returnData call return data. */ function _call(address location, bytes memory payload) private returns(bytes memory returnData) { assembly { let result := call(gas(), location, 0, add(payload, 0x20), mload(payload), 0, 0) let size := returndatasize() returnData := mload(0x40) mstore(returnData, size) let returnDataPayloadStart := add(returnData, 0x20) returndatacopy(returnDataPayloadStart, 0, size) mstore(0x40, add(returnDataPayloadStart, size)) switch result case 0 {revert(returnDataPayloadStart, size)} } } /** @dev returns the input address to string. * @param _addr address to convert as string. * @return address as string. */ function _toString(address _addr) internal pure returns(string memory) { bytes32 value = bytes32(uint256(_addr)); bytes memory alphabet = "0123456789abcdef"; bytes memory str = new bytes(42); str[0] = '0'; str[1] = 'x'; for (uint i = 0; i < 20; i++) { str[2+i*2] = alphabet[uint(uint8(value[i + 12] >> 4))]; str[3+i*2] = alphabet[uint(uint8(value[i + 12] & 0x0f))]; } return string(str); } /** @dev gives back the reward to the extension. * @param amount to give back. */ function _giveBack(uint256 amount) private { if(amount == 0) { return; } if (_rewardTokenAddress == address(0)) { IFarmExtension(_extension).backToYou{value : amount}(amount); } else { _safeApprove(_rewardTokenAddress, _extension, amount); IFarmExtension(_extension).backToYou(amount); } } /** @dev ensures the transfer from the contract to the extension. * @param amount amount to transfer. */ function _ensureTransfer(uint256 amount) private returns(bool) { uint256 initialBalance = _rewardTokenAddress == address(0) ? address(this).balance : IERC20(_rewardTokenAddress).balanceOf(address(this)); uint256 expectedBalance = initialBalance + amount; try IFarmExtension(_extension).transferTo(amount) {} catch {} uint256 actualBalance = _rewardTokenAddress == address(0) ? address(this).balance : IERC20(_rewardTokenAddress).balanceOf(address(this)); if(actualBalance == expectedBalance) { return true; } _giveBack(actualBalance - initialBalance); return false; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"objectId","type":"uint256"},{"indexed":true,"internalType":"address","name":"liquidityPoolToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"setupIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endBlock","type":"uint256"}],"name":"FarmToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rewardTokenAddress","type":"address"}],"name":"RewardToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"mainToken","type":"address"},{"indexed":true,"internalType":"address","name":"involvedToken","type":"address"}],"name":"SetupToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"positionId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"ONE_HUNDRED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_extension","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_farmTokenCollection","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_farmingSetupsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_farmingSetupsInfoCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_partiallyRedeemed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_rewardPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_rewardReceived","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_rewardTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"setupInfoIndex","type":"uint256"}],"name":"activateSetup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"positionId","type":"uint256"},{"components":[{"internalType":"uint256","name":"setupIndex","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"amountIsLiquidityPool","type":"bool"},{"internalType":"address","name":"positionOwner","type":"address"}],"internalType":"struct FarmingPositionRequest","name":"request","type":"tuple"}],"name":"addLiquidity","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"positionId","type":"uint256"},{"internalType":"bool","name":"isExt","type":"bool"}],"name":"calculateFreeFarmingReward","outputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"setupIndex","type":"uint256"},{"internalType":"uint256","name":"mainTokenAmount","type":"uint256"},{"internalType":"bool","name":"isPartial","type":"bool"},{"internalType":"uint256","name":"positionId","type":"uint256"}],"name":"calculateLockedFarmingReward","outputs":[{"internalType":"uint256","name":"reward","type":"uint256"},{"internalType":"uint256","name":"relativeRewardPerBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"extension","type":"address"},{"internalType":"bytes","name":"extensionInitData","type":"bytes"},{"internalType":"address","name":"orchestrator","type":"address"},{"internalType":"address","name":"rewardTokenAddress","type":"address"},{"internalType":"bytes","name":"farmingSetupInfosBytes","type":"bytes"}],"name":"init","outputs":[{"internalType":"bytes","name":"extensionReturnCall","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"setupIndex","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"amountIsLiquidityPool","type":"bool"},{"internalType":"address","name":"positionOwner","type":"address"}],"internalType":"struct FarmingPositionRequest","name":"request","type":"tuple"}],"name":"openPosition","outputs":[{"internalType":"uint256","name":"positionId","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"positionId","type":"uint256"}],"name":"position","outputs":[{"components":[{"internalType":"address","name":"uniqueOwner","type":"address"},{"internalType":"uint256","name":"setupIndex","type":"uint256"},{"internalType":"uint256","name":"creationBlock","type":"uint256"},{"internalType":"uint256","name":"liquidityPoolTokenAmount","type":"uint256"},{"internalType":"uint256","name":"mainTokenAmount","type":"uint256"},{"internalType":"uint256","name":"reward","type":"uint256"},{"internalType":"uint256","name":"lockedRewardPerBlock","type":"uint256"}],"internalType":"struct FarmingPosition","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bool","name":"add","type":"bool"},{"internalType":"bool","name":"disable","type":"bool"},{"internalType":"uint256","name":"index","type":"uint256"},{"components":[{"internalType":"bool","name":"free","type":"bool"},{"internalType":"uint256","name":"blockDuration","type":"uint256"},{"internalType":"uint256","name":"originalRewardPerBlock","type":"uint256"},{"internalType":"uint256","name":"minStakeable","type":"uint256"},{"internalType":"uint256","name":"maxStakeable","type":"uint256"},{"internalType":"uint256","name":"renewTimes","type":"uint256"},{"internalType":"address","name":"ammPlugin","type":"address"},{"internalType":"address","name":"liquidityPoolTokenAddress","type":"address"},{"internalType":"address","name":"mainTokenAddress","type":"address"},{"internalType":"address","name":"ethereumAddress","type":"address"},{"internalType":"bool","name":"involvingETH","type":"bool"},{"internalType":"uint256","name":"penaltyFee","type":"uint256"},{"internalType":"uint256","name":"setupsCount","type":"uint256"},{"internalType":"uint256","name":"lastSetupIndex","type":"uint256"}],"internalType":"struct FarmingSetupInfo","name":"info","type":"tuple"}],"internalType":"struct FarmingSetupConfiguration[]","name":"farmingSetups","type":"tuple[]"}],"name":"setFarmingSetups","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"setupIndex","type":"uint256"}],"name":"setup","outputs":[{"components":[{"internalType":"uint256","name":"infoIndex","type":"uint256"},{"internalType":"bool","name":"active","type":"bool"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"endBlock","type":"uint256"},{"internalType":"uint256","name":"lastUpdateBlock","type":"uint256"},{"internalType":"uint256","name":"objectId","type":"uint256"},{"internalType":"uint256","name":"rewardPerBlock","type":"uint256"},{"internalType":"uint256","name":"totalSupply","type":"uint256"}],"internalType":"struct FarmingSetup","name":"","type":"tuple"},{"components":[{"internalType":"bool","name":"free","type":"bool"},{"internalType":"uint256","name":"blockDuration","type":"uint256"},{"internalType":"uint256","name":"originalRewardPerBlock","type":"uint256"},{"internalType":"uint256","name":"minStakeable","type":"uint256"},{"internalType":"uint256","name":"maxStakeable","type":"uint256"},{"internalType":"uint256","name":"renewTimes","type":"uint256"},{"internalType":"address","name":"ammPlugin","type":"address"},{"internalType":"address","name":"liquidityPoolTokenAddress","type":"address"},{"internalType":"address","name":"mainTokenAddress","type":"address"},{"internalType":"address","name":"ethereumAddress","type":"address"},{"internalType":"bool","name":"involvingETH","type":"bool"},{"internalType":"uint256","name":"penaltyFee","type":"uint256"},{"internalType":"uint256","name":"setupsCount","type":"uint256"},{"internalType":"uint256","name":"lastSetupIndex","type":"uint256"}],"internalType":"struct FarmingSetupInfo","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"setups","outputs":[{"components":[{"internalType":"uint256","name":"infoIndex","type":"uint256"},{"internalType":"bool","name":"active","type":"bool"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"endBlock","type":"uint256"},{"internalType":"uint256","name":"lastUpdateBlock","type":"uint256"},{"internalType":"uint256","name":"objectId","type":"uint256"},{"internalType":"uint256","name":"rewardPerBlock","type":"uint256"},{"internalType":"uint256","name":"totalSupply","type":"uint256"}],"internalType":"struct FarmingSetup[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"positionId","type":"uint256"}],"name":"transferPosition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"positionId","type":"uint256"},{"internalType":"bool","name":"unwrapPair","type":"bool"}],"name":"unlock","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"positionId","type":"uint256"},{"internalType":"uint256","name":"objectId","type":"uint256"},{"internalType":"bool","name":"unwrapPair","type":"bool"},{"internalType":"uint256","name":"removedLiquidity","type":"uint256"}],"name":"withdrawLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"positionId","type":"uint256"}],"name":"withdrawReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Deployed Bytecode
0x6080604052600436106101a05760003560e01c80635c4b4064116100ec578063bfaa8cca1161008a578063d8ff139a11610064578063d8ff139a14610482578063e6ec9ea7146104a2578063f23a6e61146104c2578063f7a95a9e146104e2576101a7565b8063bfaa8cca14610445578063c5cc6b6a1461045a578063c8df9d311461046f576101a7565b8063a9015c5c116100c6578063a9015c5c146103aa578063a9e86c1f146103ca578063ab2c3f15146103f8578063bc197c8114610418576101a7565b80635c4b4064146103575780636b41674c146103775780638d2c2fb41461038a576101a7565b8063403be1ff1161015957806349fd034a1161013357806349fd034a146102d35780634f39d1f5146102e8578063523a3f081461031557806354c1fc3214610335576101a7565b8063403be1ff1461027b57806340f1f4af146102905780634313b9e5146102a5576101a7565b806301ffc9a7146101ac57806305c85b40146101e25780631b87220214610204578063207c6efa14610226578063397d321c146102535780633ae1dd9d14610266576101a7565b366101a757005b600080fd5b3480156101b857600080fd5b506101cc6101c7366004614f9e565b61050f565b6040516101d9919061546e565b60405180910390f35b3480156101ee57600080fd5b506101f7610532565b6040516101d99190615375565b34801561021057600080fd5b5061022461021f366004614bf7565b610541565b005b34801561023257600080fd5b5061024661024136600461515a565b6105f4565b6040516101d99190615cf9565b610224610261366004615246565b610606565b34801561027257600080fd5b506101f76107d4565b34801561028757600080fd5b506101f76107e3565b34801561029c57600080fd5b506102466107f2565b3480156102b157600080fd5b506102c56102c036600461515a565b6107f8565b6040516101d9929190615b49565b3480156102df57600080fd5b50610246610a0e565b3480156102f457600080fd5b50610308610303366004614b08565b610a14565b6040516101d9919061548e565b34801561032157600080fd5b5061022461033036600461515a565b610cdf565b34801561034157600080fd5b5061034a611171565b6040516101d9919061541f565b34801561036357600080fd5b50610246610372366004615222565b61126a565b610224610385366004615222565b61140d565b34801561039657600080fd5b506102246103a5366004614b8a565b611636565b3480156103b657600080fd5b506102246103c5366004615272565b611945565b3480156103d657600080fd5b506103ea6103e5366004615272565b611cc3565b6040516101d9929190615d5f565b34801561040457600080fd5b5061024661041336600461515a565b611ef1565b34801561042457600080fd5b50610438610433366004614998565b611f03565b6040516101d99190615479565b34801561045157600080fd5b50610246611f42565b34801561046657600080fd5b506101f7611f4e565b61024661047d36600461502f565b611f5d565b34801561048e57600080fd5b5061022461049d36600461515a565b61229a565b3480156104ae57600080fd5b506102466104bd36600461515a565b612317565b3480156104ce57600080fd5b506104386104dd366004614a41565b612329565b3480156104ee57600080fd5b506105026104fd36600461515a565b612368565b6040516101d99190615af7565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b6003546001600160a01b031681565b6002546001600160a01b031633146105745760405162461bcd60e51b815260040161056b906155b8565b60405180910390fd5b60005b81518110156105f0576105e882828151811061058f57fe5b6020026020010151606001518383815181106105a757fe5b6020026020010151600001518484815181106105bf57fe5b6020026020010151602001518585815181106105d757fe5b6020026020010151604001516123dc565b600101610577565b5050565b600f6020526000908152604090205481565b805160008181526007602052604090206001015460ff166106395760405162461bcd60e51b815260040161056b906159f4565b600081815260076020526040902060020154431080159061066a575060008181526007602052604090206003015443105b6106865760405162461bcd60e51b815260040161056b906155de565b60008381526009602052604090205483906001600160a01b0316331480156106be575060008181526009602052604090206002015415155b6106da5760405162461bcd60e51b815260040161056b90615681565b6000848152600960209081526040808320600181015484526007835281842080548552600590935292205460ff166107245760405162461bcd60e51b815260040161056b90615a4d565b6000610734836001015487612c13565b509050816007015482600601548360040154430302670de0b6b3a7640000028161075a57fe5b60018501546000908152600a60205260408120805493909204909201905561078390889061126a565b600584015560018301546000908152600a6020908152604080832054998352600b82529091209790975590950151600390910180548201905543600486015560079094018054909401909355505050565b6002546001600160a01b031681565b6004546001600160a01b031681565b60065481565b6108006145f6565b61080861463d565b6007600084815260200190815260200160002060056000600760008781526020019081526020016000206000015481526020019081526020016000208160405180610100016040529081600082015481526020016001820160009054906101000a900460ff161515151581526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481525050915080604051806101c00160405290816000820160009054906101000a900460ff1615151515815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016007820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016008820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016009820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016009820160149054906101000a900460ff16151515158152602001600a8201548152602001600b8201548152602001600c82015481525050905091509150915091565b60085481565b6001546060906001600160a01b031615610a405760405162461bcd60e51b815260040161056b906159c7565b600280546001600160a01b0319166001600160a01b038816908117909155610a7a5760405162461bcd60e51b815260040161056b90615954565b600180546001600160a01b03199081163317909155600380546001600160a01b0386169216821790556040517fd9078653fc0ab56789d31bc2c38fcaecf28034549baf737c02b719513837563b90600090a2845160208601207fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47014610b1257600254610b0f906001600160a01b031686612eed565b90505b836001600160a01b03166382cefdde60018060009054906101000a90046001600160a01b03166001600160a01b0316636733b93c6040518163ffffffff1660e01b815260040160006040518083038186803b158015610b7057600080fd5b505afa158015610b84573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bac9190810190614fe2565b30604051602401610bbf939291906156a4565b60408051601f198184030181529181526020820180516001600160e01b0316636d0d57f560e11b1790525160e083901b6001600160e01b0319168152610c0891906004016154a1565b600060405180830381600087803b158015610c2257600080fd5b505af1158015610c36573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610c5e9190810190614aa7565b50600480546001600160a01b0319166001600160a01b0392909216919091179055815115610cd657600082806020019051810190610c9c9190614dcd565b905060005b8151811015610cd357610ccb828281518110610cb957fe5b602002602001015160016000806123dc565b600101610ca1565b50505b95945050505050565b60008181526009602052604090205481906001600160a01b031633148015610d17575060008181526009602052604090206002015415155b610d335760405162461bcd60e51b815260040161056b90615681565b600082815260096020908152604080832060058082015460018301548652600785528386205486529352922054439060ff16610e00576000836005015411610d8d5760405162461bcd60e51b815260040161056b9061582f565b610d9b600080600188611cc3565b506005840154909250821115610dc35760405162461bcd60e51b815260040161056b906157d2565b6001830154600090815260076020526040902060030154811015610ded5781836005015403610df0565b60005b6005840155436002840155610edd565b60018301546000908152600760205260409020600301548111610e235780610e3b565b60018301546000908152600760205260409020600301545b6001840154600090815260076020819052604090912090810154600682015460049092015492935091830302670de0b6b3a76400000281610e7857fe5b60018501546000908152600a602052604081208054939092049092019055610ea190869061126a565b6001840180546000908152600a60209081526040808320548a8452600b8352818420556005880183905592548252600790522060040182905591505b8115610fb1576003546001600160a01b031615610f15576003548354610f10916001600160a01b03908116911684612f2f565b610f97565b82546040516000916001600160a01b0316908490610f3290615372565b60006040518083038185875af1925050503d8060008114610f6f576040519150601f19603f3d011682016040523d82523d6000602084013e610f74565b606091505b5050905080610f955760405162461bcd60e51b815260040161056b90615a1e565b505b600183015460009081526010602052604090208054830190555b6001830154600090815260076020526040902060030154431061112d576001808401546000908152600760205260409020015460ff1615610ff957610ff98360010154612fc4565b60018301546000908152600760209081526040808320548352600590915290205460ff16611128576001830180546000908152600e6020526040808220805460001901905591548152205415801561106757506001808401546000908152600760205260409020015460ff16155b156110e4576001830154600090815260106020908152604080832054600f90925290912054611097919003613331565b60018084015460009081526007602081905260408220828155928301805460ff19169055600283018290556003830182905560048301829055600583018290556006830182905591909101555b600085815260096020526040812080546001600160a01b03191681556001810182905560028101829055600381018290556004810182905560058101829055600601555b61116a565b60018301546000908152600760209081526040808320548352600590915290205460ff1661116a576000858152600c602052604090208054830190555b5050505050565b606060006008546001600160401b038111801561118d57600080fd5b506040519080825280602002602001820160405280156111c757816020015b6111b46145f6565b8152602001906001900390816111ac5790505b50905060005b6008548110156112645760008181526007602081815260409283902083516101008101855281548152600182015460ff161515928101929092526002810154938201939093526003830154606082015260048301546080820152600583015460a0820152600683015460c082015291015460e0820152825183908390811061125157fe5b60209081029190910101526001016111cd565b50905090565b6000828152600960209081526040808320815160e08101835281546001600160a01b03168152600182015481850190815260028301548285015260038301546060830181905260048401546080840152600584015460a084015260069093015460c0830152878652600b85528386205490518652600a909452918420549192670de0b6b3a764000092030204915082156114025760208082015160009081526007909152604081206003015443106113395760208083015160009081526007909152604090206003015461133b565b435b6020808401805160009081526007909252604080832060020154915183528220600401549293509091106113865760208084015160009081526007909152604090206004015461139f565b6020808401516000908152600790915260409020600201545b6020848101805160009081526007928390526040808220909301549151815291822060060154929350909183850302670de0b6b3a764000002816113df57fe5b049050670de0b6b3a764000084606001518202816113f957fe5b04850194505050505b60a001510192915050565b60008281526009602052604090205482906001600160a01b031633148015611445575060008181526009602052604090206002015415155b6114615760405162461bcd60e51b815260040161056b90615681565b6000838152600960209081526040808320600181015484526007835281842054845260059092529091205460ff161580156114b15750600181015460009081526007602052604090206003015443105b6114cd5760405162461bcd60e51b815260040161056b90615977565b6000848152600c602090815260408083205460018501548452600783528184205484526005909252909120600a015415611547576001820154600090815260076020908152604080832054835260059091529020600a0154670de0b6b3a76400009081908102048360050154028161154157fe5b0461154a565b60005b01801561157257600354611569906001600160a01b031633308461342f565b61157281613331565b6004820154600183018054600090815260076020819052604080832090910180549490940390935590548152206005015460038301546115b2919061348f565b6115c8858360010154868560030154600161355d565b506003818101546001928301546000908152600e60209081526040808320805494909403600019019093559681526009909652852080546001600160a01b03191681559182018590556002820185905581018490556004810184905560058101849055600601929092555050565b60008181526009602052604090205481906001600160a01b03163314801561166e575060008181526009602052604090206002015415155b61168a5760405162461bcd60e51b815260040161056b90615681565b600082815260096020908152604091829020825160e08101845281546001600160a01b0390811682526001830154938201939093526002820154938101939093526003810154606084015260048101546080840152600581015460a08401526006015460c08301528416158015906117055750604081015115155b6117215760405162461bcd60e51b815260040161056b906154c6565b6020808201516000908152600782526040808220548252600590925290812054859060ff166117505743611753565b60005b602080850151604051611768949392016153fe565b60408051601f19818403018152918152815160209283012060008181526009909352912060020154909150156117b05760405162461bcd60e51b815260040161056b90615568565b816040516020016117c19190615af7565b6040516020818303038152906040528060200190518101906117e3919061504a565b6009600083815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060155905050846009600083815260200190815260200160002060000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060096000858152602001908152602001600020600080820160006101000a8154906001600160a01b0302191690556001820160009055600282016000905560038201600090556004820160009055600582016000905560068201600090555050846001600160a01b0316336001600160a01b0316827f0a429aba3d89849a2db0153e4534d95c46a1d83c8109d73893f55ebc44010ff460405160405180910390a45050505050565b600084815260096020908152604091829020825160e08101845281546001600160a01b0316815260018201549281018390526002820154938101939093526003810154606084015260048101546080840152600581015460a08401526006015460c08301528415801590611a42575060048054604051630c0f6b7160e01b81526000926001600160a01b0390921691630c0f6b71916119e6918a9101615cf9565b60206040518083038186803b1580156119fe57600080fd5b505afa158015611a12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a369190614fc6565b6001600160a01b031614155b15611a5857506000848152600d60205260409020545b8515801590611a65575084155b80611a9457508415801590611a78575085155b8015611a94575060008181526007602052604090206005015485145b611ab05760405162461bcd60e51b815260040161056b906154c6565b60208083015160009081526007825260408082205482526005909252205460ff168015611ae05750604082015115155b8015611af0575081606001518311155b8015611b05575081516001600160a01b031633145b80611bab575060048054604051627eeac760e11b815285926001600160a01b039092169162fdd58e91611b3c9133918b91016153c1565b60206040518083038186803b158015611b5457600080fd5b505afa158015611b68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8c9190615172565b10158015611bab57506000818152600760205260409020600301544310155b611bc75760405162461bcd60e51b815260040161056b90615657565b85611bdb57611bd6858461348f565b611c02565b611be486610cdf565b60208083015160009081526007918290526040902001805484900390555b611c1086828686600061355d565b85611cbb576000818152600e60205260409020805484900390819055158015611c4b575060008181526007602052604090206001015460ff16155b15611cbb57600081815260106020908152604080832054600f90925290912054611c76919003613331565b6000818152600760208190526040822082815560018101805460ff19169055600281018390556003810183905560048101839055600581018390556006810183905501555b505050505050565b6000808315611d7d576000838152600960209081526040808320815160e08101835281546001600160a01b031681526001820154818501819052600283015482850152600380840154606084015260048401546080840152600584015460a084015260069093015460c0830152855260079093529083200154909190431015611d4c5743611d65565b6020808301516000908152600790915260409020600301545b90508160c00151826040015182030293505050611ee8565b60008681526007602081815260408084208151610100810183528154808252600183015460ff1615158286015260028301548285015260038301546060830152600480840154608084015260058085015460a0850152600685015460c0850152939096015460e083018190529087529190935293209091015490919003861115611e195760405162461bcd60e51b815260040161056b90615aa0565b60008160600151431015611e335743826060015103611e36565b60005b905060008111611e585760405162461bcd60e51b815260040161056b9061562b565b6000818360c001510211611e7e5760405162461bcd60e51b815260040161056b90615a7c565b60008881526007602090815260408083205483526005909152902060040154670de0b6b3a76400009088820281611eb157fe5b048360c001510281611ebf57fe5b04925060008311611ee25760405162461bcd60e51b815260040161056b906158a2565b82029250505b94509492505050565b60106020526000908152604090205481565b6004546000906001600160a01b03163314611f305760405162461bcd60e51b815260040161056b90615787565b5063bc197c8160e01b95945050505050565b670de0b6b3a764000081565b6001546001600160a01b031681565b805160008181526007602052604081206001015490919060ff16611f935760405162461bcd60e51b815260040161056b906159f4565b6000818152600760205260409020600201544310801590611fc4575060008181526007602052604090206003015443105b611fe05760405162461bcd60e51b815260040161056b906155de565b8251600090815260076020526040812060608501519091906001600160a01b031661200b5733612011565b84606001515b8254600090815260056020526040902054909150819060ff166120345743612037565b60005b865160405161204b939291906020016153fe565b60408051601f19818403018152918152815160209283012060008181526009909352912060020154909450156120935760405162461bcd60e51b815260040161056b90615809565b6000806120a4876000015188612c13565b855460009081526005602052604081205492945090925090819060ff1661212c5788516120d49084600080611cc3565b909250905081158015906120e85750600081115b6121045760405162461bcd60e51b815260040161056b90615531565b60078601805484019055436004870155602084015189516121269187916139f3565b50612141565b612141896000015185602001518a6000613cec565b6040518060e00160405280866001600160a01b031681526020018a6000015181526020014381526020018560200151815260200184815260200183815260200182815250600960008a815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060155905050600560008760000154815260200190815260200160002060000160009054906101000a900460ff1661223a57836020015161223d565b60005b89516000908152600e6020526040808220805490930160010190925590516001600160a01b03871691908a907f0a429aba3d89849a2db0153e4534d95c46a1d83c8109d73893f55ebc44010ff4908390a450505050505050919050565b60008181526005602081905260409091200154158015906122dd57506000818152600560209081526040808320600c01548352600790915290206001015460ff16155b6122f95760405162461bcd60e51b815260040161056b906158c7565b6000818152600560205260409020600c015461231490612fc4565b50565b600c6020526000908152604090205481565b6004546000906001600160a01b031633146123565760405162461bcd60e51b815260040161056b90615787565b5063f23a6e6160e01b95945050505050565b6123706146d4565b50600090815260096020908152604091829020825160e08101845281546001600160a01b031681526001820154928101929092526002810154928201929092526003820154606082015260048201546080820152600582015460a082015260069091015460c082015290565b8383806123e7575082155b1561240a5760a0810180516001019081905261240a5760a0810180516000190190525b83156129885760c08101516001600160a01b031615801590612438575060e08101516001600160a01b031615155b8015612448575060008160400151115b80156124605750805180612460575060008160800151115b61247c5760405162461bcd60e51b815260040161056b906158f0565b60c081015160e0820151604051634467d1db60e01b81526000926001600160a01b031691634467d1db916124b39190600401615375565b60006040518083038186803b1580156124cb57600080fd5b505afa1580156124df573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261250791908101906151b9565b60006101208601526101408501519093501591506125a89050578160c001516001600160a01b03166373d4a13a6040518163ffffffff1660e01b815260040160606040518083038186803b15801561255e57600080fd5b505afa158015612572573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125969190614bb5565b50506001600160a01b03166101208301525b60008060005b83518110156126c0578461010001516001600160a01b03168482815181106125d257fe5b60200260200101516001600160a01b0316141561262957600192508461012001516001600160a01b031684828151811061260857fe5b60200260200101516001600160a01b0316141561262457600191505b6126b8565b83818151811061263557fe5b60200260200101516001600160a01b03168561010001516001600160a01b03167fceb0f4ddf364ffb007b08eed9029e1e7e711b894ed4ae9309f30527d3611668960405160405180910390a38461012001516001600160a01b031684828151811061269c57fe5b60200260200101516001600160a01b031614156126b857600191505b6001016125ae565b50816126de5760405162461bcd60e51b815260040161056b9061587b565b83610140015115806126ed5750805b6127095760405162461bcd60e51b815260040161056b90615592565b6000846101800181815250508360056000600654815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060e08201518160070160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506101008201518160080160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506101208201518160090160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506101408201518160090160146101000a81548160ff02191690831515021790555061016082015181600a015561018082015181600b01556101a082015181600c01559050506040518061010001604052806006548152602001600015158152602001600081526020016000815260200160008152602001600081526020018560400151815260200160008152506007600060085481526020019081526020016000206000820151816000015560208201518160010160006101000a81548160ff02191690831515021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e08201518160070155905050600854600560006006548152602001908152602001600020600c01819055506001600660008282540192505081905550600160086000828254019250508190555050505050612c0d565b5060008181526007602081815260408084208054855260058084529482902082516101c081018452815460ff9081161515825260018301549582019590955260028201549381019390935260038101546060840152600481015460808401529485015460a083015260068501546001600160a01b0390811660c084015293850154841660e0830152600885015484166101008301526009850154938416610120830152600160a01b9093049091161515610140820152600a830154610160820152600b830154610180820152600c909201546101a08301528315612a9a57600181015460ff16612a8a5760405162461bcd60e51b815260040161056b90615605565b612a9383612fc4565b5050612c0d565b60a086018051600019019052600181015460ff168015612ad557506000838152600760209081526040808320548352600590915290205460ff165b15612bc2575060008281526007602052604090206003810154431015612b9d5760008260400151876040015110612b16578260400151876040015103612b22565b86604001518360400151035b60038301549091504390038082028015612b9957846040015189604001511115612b8057612b4f81613e53565b612b6b5760405162461bcd60e51b815260040161056b906154f0565b6000868152600f602052604090208054820190555b612b8e866000806000613cec565b604089015160068501555b5050505b6040808701516000858152600760209081528382205482526005905291909120600201555b6000838152600760209081526040808320548352600591829052909120015415611cbb5760a08601516000848152600760209081526040808320548352600591829052909120015550505b50505050565b612c1b61471a565b600083815260076020818152604080842081516101008101835281548152600182015460ff161515938101939093526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c08301529091015460e0820152819081908190612c97908761401a565b6040805160c08101825260008c815260076020818152848320548352600581529184902001546001600160a01b03168252918b0151949750929550909350909190820190612ce55782612ce7565b835b8152600089815260076020908152604080832054808452600580845282852060088101546001600160a01b0316858801528d840151151593870193909352935291905260090154600160a01b900460ff16151560608083019190915230608090920191909152810151909550909350839080612d89575060008781526007602090815260408083205483526005909152902060090154600160a01b900460ff16155b15612dac573415612dac5760405162461bcd60e51b815260040161056b9061575d565b846060015115612dbe57505050612ee6565b846080015115612e585760405163d2283c0960e01b81526001600160a01b0384169063d2283c09903490612df6908990600401615ca8565b6000604051808303818588803b158015612e0f57600080fd5b505af1158015612e23573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052612e4c91908101906151b9565b50506020860152612ee2565b60405163d2283c0960e01b81526001600160a01b0384169063d2283c0990612e84908890600401615ca8565b600060405180830381600087803b158015612e9e57600080fd5b505af1158015612eb2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612eda91908101906151b9565b505060208601525b5050505b9250929050565b60606000808351602085016000875af13d604051925080835260208301816000823e808201604052828015612f2157612f25565b8282fd5b5050505092915050565b6000612f878463a9059cbb60e01b8585604051602401612f509291906153c1565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612eed565b9050805160001480612fa8575080806020019051810190612fa89190614f82565b612c0d5760405162461bcd60e51b815260040161056b90615852565b6000818152600760205260409020600181015460ff168015612fea575080600301544310155b80156130085750805460009081526005602081905260409091200154155b1561301d57600101805460ff19169055612314565b806002015443101580156130345750806003015443105b80156130445750600181015460ff165b156130c85760018101805460ff19169055805460009081526005602081905260408083209091018290556006830154600384018054439182905585548552929093205492909103029060ff16156130a3576130a3836000806000613cec565b6000838152600f60205260409020805482900390556130c181613331565b5050612314565b6001808201548254600090815260056020526040902090910154600683015460ff909216916130f79102613e53565b60018301805460ff1916911515919091179081905560ff1680156131185750805b1561328c57815460009081526005602090815260408083206001015460068601546008548552600f8452938290209302909255905161315991849101615c41565b60405160208183030381529060405280602001905181019061317b91906150cb565b60088054600090815260076020818152604080842086518155868301516001808301805492151560ff199384161790558884015160028085019190915560608a015160038086019190915560808b0151600486015560a08b015160058087019190915560c08c0151600687015560e0909b0151948801949094558c8852848820820180549093169092558a548752888552838720890180546000190190558a548752838720600b0180548201905587548b548852848820600c018190558752858552838720439201829055875487528387208054885289865284882082015495879052949091019390910192909255845484528084209095018390558354835293822001558054909101905561332c565b600182015460ff16801561329e575080155b1561330d57600083815260076020818152604080842080548552600580845282862060019081015460068a01548b8952600f875285892091029055436002840181905583548852948290529286209283015490930160038201559092019290925501805460001901905561332c565b6000838152600760209081526040808320548352600591829052822001555b505050565b8061333b57612314565b6003546001600160a01b03166133b4576002546040516302b492b560e11b81526001600160a01b0390911690630569256a90839061337d908290600401615cf9565b6000604051808303818588803b15801561339657600080fd5b505af11580156133aa573d6000803e3d6000fd5b5050505050612314565b6003546002546133d1916001600160a01b0390811691168361441b565b6002546040516302b492b560e11b81526001600160a01b0390911690630569256a90613401908490600401615cf9565b600060405180830381600087803b15801561341b57600080fd5b505af115801561116a573d6000803e3d6000fd5b6000613452856323b872dd60e01b868686604051602401612f50939291906153da565b90508051600014806134735750808060200190518101906134739190614f82565b61116a5760405162461bcd60e51b815260040161056b90615730565b60048054604051637921219560e11b81526001600160a01b0390911691829163f242432a916134c691339130918991899101615389565b600060405180830381600087803b1580156134e057600080fd5b505af11580156134f4573d6000803e3d6000fd5b505060405163b390c0ab60e01b81526001600160a01b038416925063b390c0ab91506135269086908690600401615d5f565b600060405180830381600087803b15801561354057600080fd5b505af1158015613554573d6000803e3d6000fd5b50505050505050565b6000848152600760208181526040808420548452600580835281852082516101c081018452815460ff9081161515825260018084015483880152600284015483870152600384015460608085019190915260048501546080808601919091529585015460a08086019190915260068601546001600160a01b0390811660c0808801919091529a870154811660e087019081526008880154821661010088019081526009808a01548085166101208b0152600160a01b900490971615156101408901908152600a8a01546101608a0152600b8a01546101808a0152600c909901546101a08901528a519c8d018b52905182168c528b8b018f905251168a89015290890191909152925115159387019390935233918601919091528a86529252832081519193909180156136925750600282015415155b801561369d57508815155b156136ac578582600301540390505b60015460408051631f9de8b560e21b8152815160009384936001600160a01b0390911692637e77a2d49260048083019392829003018186803b1580156136f157600080fd5b505afa158015613705573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613729919061518a565b90925090508115613770576000670de0b6b3a764000080848102048760200151028161375157fe5b0490506137638760e001518383612f2f565b6020860180519190910390525b881561381b5761378d85600001518760c00151876020015161441b565b8560c001516001600160a01b031663592182d6866040518263ffffffff1660e01b81526004016137bd9190615ca8565b600060405180830381600087803b1580156137d757600080fd5b505af11580156137eb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261381391908101906151b9565b505050613832565b61383285600001518660a001518760200151612f2f565b8551158015613852575060008a81526007602052604090206001015460ff165b801561385c575086155b1561386f5761386a8a612fc4565b6139e6565b8551801561387c57508a15155b156139e6576001808501546000908152600760205260409020015460ff1680156138bc575060018401546000908152600760205260409020600301544310155b156138ce576138ce8460010154612fc4565b826139de576001840180546000908152600e6020526040808220805460001901905591548152205415801561391957506001808501546000908152600760205260409020015460ff16155b15613996576001840154600090815260106020908152604080832054600f90925290912054613949919003613331565b60018085015460009081526007602081905260408220828155928301805460ff19169055600283018290556003830182905560048301829055600583018290556006830182905591909101555b60008b815260096020526040812080546001600160a01b03191681556001810182905560028101829055600381018290556004810182905560058101829055600601556139e6565b600384018390555b5050505050505050505050565b600081815260076020526040812060050154613bf7576004546000838152600760208181526040808420548452600590915290912001546001600160a01b039182169163534d4027918691613a489116614479565b604051602001613a58919061533f565b60408051601f1981840301815282825260015463fabc053b60e01b8452915190926001600160a01b039092169163fabc053b916004808301926000929190829003018186803b158015613aaa57600080fd5b505afa158015613abe573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613ae69190810190614fe2565b60016040518563ffffffff1660e01b8152600401613b079493929190615d02565b6040805180830381600087803b158015613b2057600080fd5b505af1158015613b34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b58919061518a565b5060008381526007602081815260408084208054855260058352818520840154948890529290915260039091015490519293506001600160a01b039091169183917ffacc589216d4ed0bbc51eb76ba233e13e3e9faeb7ac1089cbb380797ae908fe691613bc6918791615d5f565b60405180910390a36000818152600d6020908152604080832085905584835260079091529020600501819055613c6d565b6004805460008481526007602052604090819020600501549051630d9778e560e11b81526001600160a01b0390921692631b2ef1ca92613c3a9291889101615d5f565b600060405180830381600087803b158015613c5457600080fd5b505af1158015613c68573d6000803e3d6000fd5b505050505b6004805460008481526007602052604090819020600501549051637921219560e11b81526001600160a01b039092169263f242432a92613cb39230928a928a9101615389565b600060405180830381600087803b158015613ccd57600080fd5b505af1158015613ce1573d6000803e3d6000fd5b505050509392505050565b6000848152600760205260408120600301544310613d1b57600085815260076020526040902060030154613d1d565b435b6000868152600760208190526040909120015490915015613dcf576000858152600760205260408120600281015460049091015410613d6d57600086815260076020526040902060040154613d80565b6000868152600760205260409020600201545b6000878152600760208190526040909120908101546006909101549192509082840302670de0b6b3a76400000281613db457fe5b6000888152600a602052604090208054929091049091019055505b60008581526007602052604090206004018190558215613e08576000858152600a6020908152604080832054868452600b909252909120555b831561116a5781613e32576000858152600760208190526040909120018054850190819055611cbb565b50505060009182526007602081905260409092209091018054919091039055565b60035460009081906001600160a01b031615613eee576003546040516370a0823160e01b81526001600160a01b03909116906370a0823190613e99903090600401615375565b60206040518083038186803b158015613eb157600080fd5b505afa158015613ec5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ee99190615172565b613ef0565b475b60025460405163ba0f49b760e01b8152919250848301916001600160a01b039091169063ba0f49b790613f27908790600401615cf9565b600060405180830381600087803b158015613f4157600080fd5b505af1925050508015613f52575060015b506003546000906001600160a01b031615613fec576003546040516370a0823160e01b81526001600160a01b03909116906370a0823190613f97903090600401615375565b60206040518083038186803b158015613faf57600080fd5b505afa158015613fc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fe79190615172565b613fee565b475b905081811415614004576001935050505061052d565b61400f838203613331565b506000949350505050565b6000806000808460200151116140425760405162461bcd60e51b815260040161056b906157af565b84516000908152600560205260409081902060060154908501516001600160a01b03909116935061407457600061407a565b83602001515b9150836040015161408f578360200151614092565b60005b905060608085604001511561416d5786516000908152600560205260409020600701546140ca906001600160a01b031633308761342f565b86516000908152600560205260409081902060070154905163684943b160e01b81526001600160a01b038781169263684943b192614110929091169088906004016153c1565b60006040518083038186803b15801561412857600080fd5b505afa15801561413c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526141649190810190614f2c565b9250905061421d565b86516000908152600560205260408082206007015489518352918190206008015490516379d16e0d60e01b81526001600160a01b03808916936379d16e0d936141c09391831692169088906004016153da565b60006040518083038186803b1580156141d857600080fd5b505afa1580156141ec573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261421491908101906151b9565b91955090925090505b60005b825181101561441157875160009081526005602052604090206008015483516001600160a01b039091169084908390811061425757fe5b60200260200101516001600160a01b031614156142cd5781818151811061427a57fe5b602002602001015193506005600089600001518152602001908152602001600020600301548410156142be5760405162461bcd60e51b815260040161056b90615acb565b8660400151156142cd57614411565b8660400151156142dc57614409565b8751600090815260056020526040902060090154600160a01b900460ff16801561433d575082818151811061430d57fe5b6020908102919091018101518951600090815260059092526040909120600901546001600160a01b039081169116145b156143795781818151811061434e57fe5b602002602001015134146143745760405162461bcd60e51b815260040161056b90615927565b614409565b6143ab83828151811061438857fe5b6020026020010151333085858151811061439e57fe5b602002602001015161342f565b6144098382815181106143ba57fe5b6020026020010151600560008b60000151815260200190815260200160002060060160009054906101000a90046001600160a01b03168484815181106143fc57fe5b602002602001015161441b565b600101614220565b5050509250925092565b600061443c8463095ea7b360e01b8585604051602401612f509291906153c1565b905080516000148061445d57508080602001905181019061445d9190614f82565b612c0d5760405162461bcd60e51b815260040161056b9061599f565b604080518082018252601081526f181899199a1a9b1b9c1cb0b131b232b360811b60208201528151602a80825260608281019094526001600160a01b0385169291600091602082018180368337019050509050600360fc1b816000815181106144de57fe5b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061450757fe5b60200101906001600160f81b031916908160001a90535060005b60148110156145ed578260048583600c016020811061453c57fe5b1a60f81b6001600160f81b031916901c60f81c60ff168151811061455c57fe5b602001015160f81c60f81b82826002026002018151811061457957fe5b60200101906001600160f81b031916908160001a905350828482600c01602081106145a057fe5b825191901a600f169081106145b157fe5b602001015160f81c60f81b8282600202600301815181106145ce57fe5b60200101906001600160f81b031916908160001a905350600101614521565b50949350505050565b604051806101000160405280600081526020016000151581526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b604051806101c00160405280600015158152602001600081526020016000815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000151581526020016000815260200160008152602001600081525090565b6040518060e0016040528060006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b600061476261475d84615dad565b615d6d565b905082815283838301111561477657600080fd5b614784836020830184615dce565b9392505050565b803561052d81615e00565b805161052d81615e00565b600082601f8301126147b1578081fd5b815160206147c161475d83615d90565b82815281810190858301838502870184018810156147dd578586fd5b855b858110156148045781516147f281615e00565b845292840192908401906001016147df565b5090979650505050505050565b600082601f830112614821578081fd5b8135602061483161475d83615d90565b828152818101908583018385028701840188101561484d578586fd5b855b858110156148045781358452928401929084019060010161484f565b600082601f83011261487b578081fd5b8151602061488b61475d83615d90565b82815281810190858301838502870184018810156148a7578586fd5b855b85811015614804578151845292840192908401906001016148a9565b803561052d81615e15565b805161052d81615e15565b600082601f8301126148eb578081fd5b81356148f961475d82615dad565b81815284602083860101111561490d578283fd5b816020850160208301379081016020019190915292915050565b600060808284031215614938578081fd5b604051608081018181106001600160401b038211171561495457fe5b80604052508091508235815260208301356020820152604083013561497881615e15565b6040820152606083013561498b81615e00565b6060919091015292915050565b600080600080600060a086880312156149af578081fd5b85356149ba81615e00565b945060208601356149ca81615e00565b935060408601356001600160401b03808211156149e5578283fd5b6149f189838a01614811565b94506060880135915080821115614a06578283fd5b614a1289838a01614811565b93506080880135915080821115614a27578283fd5b50614a34888289016148db565b9150509295509295909350565b600080600080600060a08688031215614a58578283fd5b8535614a6381615e00565b94506020860135614a7381615e00565b9350604086013592506060860135915060808601356001600160401b03811115614a9b578182fd5b614a34888289016148db565b60008060408385031215614ab9578182fd5b8251614ac481615e00565b60208401519092506001600160401b03811115614adf578182fd5b8301601f81018513614aef578182fd5b614afe8582516020840161474f565b9150509250929050565b600080600080600060a08688031215614b1f578283fd5b8535614b2a81615e00565b945060208601356001600160401b0380821115614b45578485fd5b614b5189838a016148db565b955060408801359150614b6382615e00565b909350606087013590614b7582615e00565b90925060808701359080821115614a27578283fd5b60008060408385031215614b9c578182fd5b8235614ba781615e00565b946020939093013593505050565b600080600060608486031215614bc9578081fd5b8351614bd481615e00565b602085015160408601519194509250614bec81615e15565b809150509250925092565b60006020808385031215614c09578182fd5b82356001600160401b0380821115614c1f578384fd5b818501915085601f830112614c32578384fd5b8135614c4061475d82615d90565b81815284810190848601610220808502870188018b1015614c5f578889fd5b8896505b84871015614dbe57818b0381811215614c7a57898afd5b6040805160808082018281108b82111715614c9157fe5b83528535614c9e81615e15565b8252858c0135614cad81615e15565b828d0152858301358383015260606101c0605f198601811315614cce578e8ffd5b614cd781615d6d565b9550614ce48289016148c5565b8652828801358e87015260a0808901358688015260c09550858901358388015260e0808a0135858901526101009450848a0135828901526101209150614d2b828b0161478b565b878901526101409650614d3f878b0161478b565b90880152610160614d518a820161478b565b858901526101809450614d65858b0161478b565b828901526101a09150614d79828b016148c5565b87890152828a013581890152506101e0890135848801526102008901358188015250508481840152505080875250505087840193508082019150600187019650614c63565b50909998505050505050505050565b60006020808385031215614ddf578182fd5b82516001600160401b03811115614df4578283fd5b8301601f81018513614e04578283fd5b8051614e1261475d82615d90565b818152838101908385016101c0808502860187018a1015614e31578788fd5b8795505b84861015614f1e5780828b031215614e4b578788fd5b614e5481615d6d565b614e5d836148d0565b8152828801518882015260408084015190820152606080840151908201526080808401519082015260a0808401519082015260c0614e9c818501614796565b9082015260e0614ead848201614796565b90820152610100614ebf848201614796565b90820152610120614ed1848201614796565b90820152610140614ee38482016148d0565b90820152610160838101519082015261018080840151908201526101a080840151908201528452600195909501949286019290810190614e35565b509098975050505050505050565b60008060408385031215614f3e578182fd5b82516001600160401b0380821115614f54578384fd5b614f608683870161486b565b93506020850151915080821115614f75578283fd5b50614afe858286016147a1565b600060208284031215614f93578081fd5b815161478481615e15565b600060208284031215614faf578081fd5b81356001600160e01b031981168114614784578182fd5b600060208284031215614fd7578081fd5b815161478481615e00565b600060208284031215614ff3578081fd5b81516001600160401b03811115615008578182fd5b8201601f81018413615018578182fd5b6150278482516020840161474f565b949350505050565b600060808284031215615040578081fd5b6147848383614927565b600060e0828403121561505b578081fd5b60405160e081018181106001600160401b038211171561507757fe5b60405261508383614796565b81526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c08201528091505092915050565b60006101008083850312156150de578182fd5b604051908101906001600160401b03821181831017156150fa57fe5b816040528351815261510e602085016148d0565b602082015260408401516040820152606084015160608201526080840151608082015260a084015160a082015260c084015160c082015260e084015160e0820152809250505092915050565b60006020828403121561516b578081fd5b5035919050565b600060208284031215615183578081fd5b5051919050565b6000806040838503121561519c578182fd5b8251915060208301516151ae81615e00565b809150509250929050565b6000806000606084860312156151cd578081fd5b8351925060208401516001600160401b03808211156151ea578283fd5b6151f68783880161486b565b9350604086015191508082111561520b578283fd5b50615218868287016147a1565b9150509250925092565b60008060408385031215615234578182fd5b8235915060208301356151ae81615e15565b60008060a08385031215615258578182fd5b823591506152698460208501614927565b90509250929050565b60008060008060808587031215615287578182fd5b843593506020850135925060408501356152a081615e15565b9396929550929360600135925050565b6001600160a01b03169052565b15159052565b600081518084526152db816020860160208601615dce565b601f01601f19169290920160200192915050565b8051825260208101511515602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301525050565b60006a02330b936b4b733902628160ad1b8252825161536581600b850160208701615dce565b91909101600b0192915050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b0394851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b039390931683526020830191909152604082015260600190565b6020808252825182820181905260009190848201906040850190845b818110156154625761544e8385516152ef565b92840192610100929092019160010161543b565b50909695505050505050565b901515815260200190565b6001600160e01b031991909116815260200190565b60006020825261478460208301846152c3565b6000604082526154b460408301846152c3565b82810360209384015290815201919050565b60208082526010908201526f24b73b30b634b2103837b9b4ba34b7b760811b604082015260600190565b60208082526021908201527f496e73756666696369656e742072657761726420696e20657874656e73696f6e6040820152601760f91b606082015260800190565b6020808252601a908201527f496e73756666696369656e74207374616b656420616d6f756e74000000000000604082015260600190565b60208082526010908201526f24b73b30b634b2103a3930b739b332b960811b604082015260600190565b6020808252600c908201526b27379022aa24103a37b5b2b760a11b604082015260600190565b6020808252600c908201526b155b985d5d1a1bdc9a5e995960a21b604082015260600190565b6020808252600d908201526c0496e76616c696420736574757609c1b604082015260600190565b6020808252600c908201526b4e6f7420706f737369626c6560a01b604082015260600190565b60208082526012908201527111985c9b5a5b99d4d95d1d5c08195b99195960721b604082015260600190565b60208082526010908201526f496e76616c696420776974686472617760801b604082015260600190565b602080825260099082015268139bdd081bdddb995960ba1b604082015260600190565b600060c08252601160c083015270436f76656e616e7473204661726d696e6760781b60e08301526101008060208401526005818401525064634641524d60d81b6101208301526101408515156040840152806060840152615707818401866152c3565b6001600160a01b039490941660808401525081830360a090920191909152815260200192915050565b6020808252601390820152721514905394d19154919493d357d19052531151606a1b604082015260600190565b60208082526010908201526f115512081b9bdd081a5b9d9bdb1d995960821b604082015260600190565b6020808252600e908201526d24b73b30b634b21039b2b73232b960911b604082015260600190565b602080825260099082015268139bc8185b5bdd5b9d60ba1b604082015260600190565b6020808252601e908201527f52657761726420697320626967676572207468616e2065787065637465640000604082015260600190565b6020808252600c908201526b24b73b30b634b21037b832b760a11b604082015260600190565b602080825260099082015268139bc81c995dd85c9960ba1b604082015260600190565b6020808252600f908201526e1514905394d1915497d19052531151608a1b604082015260600190565b6020808252600d908201526c27379036b0b4b7103a37b5b2b760991b604082015260600190565b6020808252600b908201526a24b73b30b634b21039383160a91b604082015260600190565b6020808252600f908201526e24b73b30b634b2103a37b3b3b6329760891b604082015260600190565b6020808252601b908201527f496e76616c696420736574757020636f6e66696775726174696f6e0000000000604082015260600190565b602080825260139082015272496e636f7272656374206574682076616c756560681b604082015260600190565b60208082526009908201526832bc3a32b739b4b7b760b91b604082015260600190565b6020808252600e908201526d496e76616c696420756e6c6f636b60901b604082015260600190565b6020808252600e908201526d1054141493d59157d1905253115160921b604082015260600190565b602080825260139082015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604082015260600190565b60208082526010908201526f5365747570206e6f742061637469766560801b604082015260600190565b60208082526015908201527424b73b30b634b21022aa24103a3930b739b332b91760591b604082015260600190565b602080825260159082015274496e76616c696420616464206c697175696469747960581b604082015260600190565b6020808252600a90820152694e6f207265776172647360b01b604082015260600190565b602080825260119082015270496e76616c6964206c697175696469747960781b604082015260600190565b60208082526012908201527124b73b30b634b2103634b8bab4b234ba3c9760711b604082015260600190565b81516001600160a01b031681526020808301519082015260408083015190820152606080830151908201526080808301519082015260a0828101519082015260c0918201519181019190915260e00190565b6102c08101615b5882856152ef565b610100615b6881840185516152bd565b6020840151610120818186015260408601519150610140828187015260608701519250610160838188015260808801519350610180848189015260a089015194506101a085818a015260c08a01519550615bc66101c08a01876152b0565b60e08a01519550615bdb6101e08a01876152b0565b9589015195615bee6102008a01886152b0565b848a01519650615c026102208a01886152b0565b838a01519650615c166102408a01886152bd565b91890151610260890152880151610280880152909601516102a0909501949094525090949350505050565b815481526001820154610100820190615c5990615dfa565b615c6660208401826152bd565b50600283015460408301526003830154606083015260048301546080830152600583015460a0830152600683015460c083015260079092015460e09091015290565b81516001600160a01b0390811682526020808401519083015260408084015182169083015260608084015115159083015260808084015115159083015260a092830151169181019190915260c00190565b90815260200190565b600085825260a06020830152615d1b60a08301866152c3565b82810380604085015260038252620664c560ec1b602083015260408101606085015250615d4b60408201866152c3565b915050821515608083015295945050505050565b918252602082015260400190565b6040518181016001600160401b0381118282101715615d8857fe5b604052919050565b60006001600160401b03821115615da357fe5b5060209081020190565b60006001600160401b03821115615dc057fe5b50601f01601f191660200190565b60005b83811015615de9578181015183820152602001615dd1565b83811115612c0d5750506000910152565b60ff1690565b6001600160a01b038116811461231457600080fd5b801515811461231457600080fdfea2646970667358221220d98942548d117adcfb74fc9c3961c809566e919169e0368dee4f72ddc9ad045f64736f6c63430007060033
Deployed Bytecode Sourcemap
15705:43172:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8593:133;;;;;;;;;;-1:-1:-1;8593:133:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16626:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;20675:320::-;;;;;;;;;;-1:-1:-1;20675:320:0;;;;;:::i;:::-;;:::i;:::-;;18013:50;;;;;;;;;;-1:-1:-1;18013:50:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;25165:1296::-;;;;;;:::i;:::-;;:::i;16558:25::-;;;;;;;;;;;;;:::i;16707:35::-;;;;;;;;;;;;;:::i;16930:38::-;;;;;;;;;;;;;:::i;21343:202::-;;;;;;;;;;-1:-1:-1;21343:202:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;17139:34::-;;;;;;;;;;;;;:::i;19463:1204::-;;;;;;;;;;-1:-1:-1;19463:1204:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;26594:3543::-;;;;;;;;;;-1:-1:-1;26594:3543:0;;;;;:::i;:::-;;:::i;21553:314::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;35319:1079::-;;;;;;;;;;-1:-1:-1;35319:1079:0;;;;;:::i;:::-;;:::i;32032:1449::-;;;;;;:::i;:::-;;:::i;22156:850::-;;;;;;;;;;-1:-1:-1;22156:850:0;;;;;:::i;:::-;;:::i;30145:1879::-;;;;;;;;;;-1:-1:-1;30145:1879:0;;;;;:::i;:::-;;:::i;33489:1822::-;;;;;;;;;;-1:-1:-1;33489:1822:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;18070:46::-;;;;;;;;;;-1:-1:-1;18070:46:0;;;;;:::i;:::-;;:::i;36406:271::-;;;;;;;;;;-1:-1:-1;36406:271:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;15781:51::-;;;;;;;;;;;;;:::i;16478:23::-;;;;;;;;;;;;;:::i;23014:2143::-;;;;;;:::i;:::-;;:::i;21875:273::-;;;;;;;;;;-1:-1:-1;21875:273:0;;;;;:::i;:::-;;:::i;17637:53::-;;;;;;;;;;-1:-1:-1;17637:53:0;;;;;:::i;:::-;;:::i;36685:243::-;;;;;;;;;;-1:-1:-1;36685:243:0;;;;;:::i;:::-;;:::i;21195:140::-;;;;;;;;;;-1:-1:-1;21195:140:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;8593:133::-;-1:-1:-1;;;;;;8685:33:0;;8661:4;8685:33;;;;;;;;;;;;;8593:133;;;;:::o;16626:43::-;;;-1:-1:-1;;;;;16626:43:0;;:::o;20675:320::-;18284:10;;-1:-1:-1;;;;;18284:10:0;18270;:24;18262:49;;;;-1:-1:-1;;;18262:49:0;;;;;;;:::i;:::-;;;;;;;;;20795:9:::1;20790:198;20814:13;:20;20810:1;:24;20790:198;;;20856:120;20882:13;20896:1;20882:16;;;;;;;;;;;;;;:21;;;20905:13;20919:1;20905:16;;;;;;;;;;;;;;:20;;;20927:13;20941:1;20927:16;;;;;;;;;;;;;;:24;;;20953:13;20967:1;20953:16;;;;;;;;;;;;;;:22;;;20856:25;:120::i;:::-;20836:3;;20790:198;;;;20675:320:::0;:::o;18013:50::-;;;;;;;;;;;;;:::o;25165:1296::-;25286:18;;;18789:19;;;:7;:19;;;;;:26;;;;;18781:55;;;;-1:-1:-1;;;18781:55:0;;;;;;;:::i;:::-;18855:19;;;;:7;:19;;;;;:30;;;18889:12;-1:-1:-1;18855:46:0;;;:93;;-1:-1:-1;18905:19:0;;;;:7;:19;;;;;:28;;;18936:12;-1:-1:-1;18855:93:0;18847:119;;;;-1:-1:-1;;;18847:119:0;;;;;;;:::i;:::-;18486:22:::1;::::0;;;:10:::1;:22;::::0;;;;:34;25322:10;;-1:-1:-1;;;;;18486:34:0::1;18524:10;18486:48;:93:::0;::::1;;;-1:-1:-1::0;18538:22:0::1;::::0;;;:10:::1;:22;::::0;;;;:36:::1;;::::0;:41;::::1;18486:93;18478:115;;;;-1:-1:-1::0;;;18478:115:0::1;;;;;;;:::i;:::-;25383:39:::2;25425:22:::0;;;:10:::2;:22;::::0;;;;;;;25501:26:::2;::::0;::::2;::::0;25493:35;;:7:::2;:35:::0;;;;;25607:21;;25595:34;;:11:::2;:34:::0;;;;;:39;::::2;;25587:73;;;;-1:-1:-1::0;;;25587:73:0::2;;;;;;;:::i;:::-;25715:42;25762:50;25776:15;:26;;;25804:7;25762:13;:50::i;:::-;25714:98;;;26008:11;:23;;;25970:11;:26;;;25939:11;:27;;;25924:12;:42;25923:73;26000:4;25922:82;25921:110;;;;;25890:26;::::0;::::2;::::0;25866:51:::2;::::0;;;:23:::2;:51;::::0;;;;:165;;25921:110;;;::::2;25866:165:::0;;::::2;::::0;;26067:45:::2;::::0;26094:10;;26067:26:::2;:45::i;:::-;26042:22;::::0;::::2;:70:::0;26181:26:::2;::::0;::::2;::::0;26157:51:::2;::::0;;;:23:::2;:51;::::0;;;;;;;;26123:31;;;:19:::2;:31:::0;;;;;:85;;;;26263:24;;::::2;::::0;26219:40:::2;::::0;;::::2;:68:::0;;;::::2;::::0;;26379:12:::2;26349:27;::::0;::::2;:42:::0;26402:23:::2;::::0;;::::2;:51:::0;;;;::::2;::::0;;;-1:-1:-1;;;25165:1296:0:o;16558:25::-;;;-1:-1:-1;;;;;16558:25:0;;:::o;16707:35::-;;;-1:-1:-1;;;;;16707:35:0;;:::o;16930:38::-;;;;:::o;21343:202::-;21408:19;;:::i;:::-;21429:23;;:::i;:::-;21473:7;:19;21481:10;21473:19;;;;;;;;;;;21494:11;:42;21506:7;:19;21514:10;21506:19;;;;;;;;;;;:29;;;21494:42;;;;;;;;;;;21465:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21465:72:0;-1:-1:-1;;;;;21465:72:0;-1:-1:-1;;;;;21465:72:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21465:72:0;-1:-1:-1;;;;;21465:72:0;-1:-1:-1;;;;;21465:72:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21465:72:0;-1:-1:-1;;;;;21465:72:0;-1:-1:-1;;;;;21465:72:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21465:72:0;-1:-1:-1;;;;;21465:72:0;-1:-1:-1;;;;;21465:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21343:202;;;:::o;17139:34::-;;;;:::o;19463:1204::-;19683:8;;19630:32;;-1:-1:-1;;;;;19683:8:0;:22;19675:54;;;;-1:-1:-1;;;19675:54:0;;;;;;;:::i;:::-;19749:10;:22;;-1:-1:-1;;;;;;19749:22:0;-1:-1:-1;;;;;19749:22:0;;;;;;;;19740:60;;;;-1:-1:-1;;;19740:60:0;;;;;;;:::i;:::-;19811:8;:21;;-1:-1:-1;;;;;;19811:21:0;;;19822:10;19811:21;;;;19860:19;:40;;-1:-1:-1;;;;;19860:40:0;;;;;;;;19848:53;;;;19811:8;;19848:53;19916:28;;;;;;19948:13;19916:45;19912:136;;20006:10;;20000:36;;-1:-1:-1;;;;;20006:10:0;20018:17;20000:5;:36::i;:::-;19978:58;;19912:136;20105:12;-1:-1:-1;;;;;20084:47:0;;20235:4;20254:8;;;;;;;;;-1:-1:-1;;;;;20254:8:0;-1:-1:-1;;;;;20241:48:0;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;20241:50:0;;;;;;;;;;;;:::i;:::-;20301:4;20132:179;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;20132:179:0;;;;;;;;;;;;;;-1:-1:-1;;;;;20132:179:0;-1:-1:-1;;;20132:179:0;;;20084:232;;;;;-1:-1:-1;;;;;;20084:232:0;;;;;20132:179;20084:232;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;20084:232:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;20059:20:0;20058:258;;-1:-1:-1;;;;;;20058:258:0;-1:-1:-1;;;;;20058:258:0;;;;;;;;;;20330:29;;:33;20327:333;;20380:43;20437:22;20426:56;;;;;;;;;;;;:::i;:::-;20380:102;;20501:9;20497:152;20520:17;:24;20516:1;:28;20497:152;;;20570:63;20596:17;20614:1;20596:20;;;;;;;;;;;;;;20618:4;20624:5;20631:1;20570:25;:63::i;:::-;20546:3;;20497:152;;;;20327:333;;19463:1204;;;;;;;:::o;26594:3543::-;18486:22;;;;:10;:22;;;;;:34;26661:10;;-1:-1:-1;;;;;18486:34:0;18524:10;18486:48;:93;;;;-1:-1:-1;18538:22:0;;;;:10;:22;;;;;:36;;;:41;;18486:93;18478:115;;;;-1:-1:-1;;;18478:115:0;;;;;;;:::i;:::-;26722:39:::1;26764:22:::0;;;:10:::1;:22;::::0;;;;;;;26814::::1;::::0;;::::1;::::0;26918:26:::1;::::0;::::1;::::0;26910:35;;:7:::1;:35:::0;;;;;:45;26898:58;;;;;;:63;26870:12:::1;::::0;26898:63:::1;;26893:1732;;27056:1;27031:15;:22;;;:26;27023:48;;;;-1:-1:-1::0;;;27023:48:0::1;;;;;;;:::i;:::-;27369:52;27398:1;27401::::0;27404:4:::1;27410:10;27369:28;:52::i;:::-;-1:-1:-1::0;27471:22:0::1;::::0;::::1;::::0;27357:64;;-1:-1:-1;27461:32:0;::::1;;27453:75;;;;-1:-1:-1::0;;;27453:75:0::1;;;;;;;:::i;:::-;27682:26;::::0;::::1;::::0;27674:35:::1;::::0;;;:7:::1;:35;::::0;;;;:44:::1;;::::0;27658:60;::::1;;:98;;27750:6;27725:15;:22;;;:31;27658:98;;;27721:1;27658:98;27633:22;::::0;::::1;:123:::0;27803:12:::1;27771:29;::::0;::::1;:44:::0;26893:1732:::1;;;27918:26;::::0;::::1;::::0;27910:35:::1;::::0;;;:7:::1;:35;::::0;;;;:44:::1;;::::0;27895:59;::::1;:121;;28004:12;27895:121;;;27965:26;::::0;::::1;::::0;27957:35:::1;::::0;;;:7:::1;:35;::::0;;;;:44:::1;;::::0;27895:121:::1;28229:26;::::0;::::1;::::0;28221:35:::1;::::0;;;:7:::1;:35;::::0;;;;;;;:47;;::::1;::::0;28159:50:::1;::::0;::::1;::::0;28104:51:::1;::::0;;::::1;::::0;27880:136;;-1:-1:-1;28221:47:0;28089:66;::::1;28088:121;28213:4;28087:130;28221:47:::0;28086:182:::1;;;;28055:26;::::0;::::1;::::0;28031:51:::1;::::0;;;:23:::1;:51;::::0;;;;:237;;28086:182;;;::::1;28031:237:::0;;::::1;::::0;;28292:45:::1;::::0;28319:10;;28292:26:::1;:45::i;:::-;28410:26;::::0;::::1;::::0;;28386:51:::1;::::0;;;:23:::1;:51;::::0;;;;;;;;28352:31;;;:19:::1;:31:::0;;;;;:85;28452:22:::1;::::0;::::1;:26:::0;;;28555;;28547:35;;:7:::1;:35:::0;;;:51:::1;;:66:::0;;;28283:54;-1:-1:-1;26893:1732:0::1;28639:10:::0;;28635:454:::1;;28706:19;::::0;-1:-1:-1;;;;;28706:19:0::1;:33:::0;28702:312:::1;;28774:19;::::0;28795:27;;28760:71:::1;::::0;-1:-1:-1;;;;;28774:19:0;;::::1;::::0;28795:27:::1;28824:6:::0;28760:13:::1;:71::i;:::-;28702:312;;;28889:27:::0;;:50:::1;::::0;28873:11:::1;::::0;-1:-1:-1;;;;;28889:27:0::1;::::0;28928:6;;28889:50:::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28872:67;;;28966:6;28958:40;;;;-1:-1:-1::0;;;28958:40:0::1;;;;;;;:::i;:::-;28702:312;;29040:26;::::0;::::1;::::0;29028:39:::1;::::0;;;:11:::1;:39;::::0;;;;:49;;;::::1;::::0;;28635:454:::1;29111:26;::::0;::::1;::::0;29103:35:::1;::::0;;;:7:::1;:35;::::0;;;;:44:::1;;::::0;29151:12:::1;-1:-1:-1::0;29099:1031:0::1;;29192:26;::::0;;::::1;::::0;29184:35:::1;::::0;;;:7:::1;:35;::::0;;;;:42:::1;::::0;::::1;;29180:123;;;29247:40;29260:15;:26;;;29247:12;:40::i;:::-;29417:26;::::0;::::1;::::0;29397:58:::1;29409:35:::0;;;:7:::1;:35;::::0;;;;;;;:45;29397:58;;:11:::1;:58:::0;;;;;:63;::::1;;29392:534;;29533:1;29502:26:::0;::::1;::::0;;29481:48:::1;::::0;;;:20:::1;:48;::::0;;;;;:53;;-1:-1:-1;;29481:53:0;;;29578:26;;29557:48;;;;:53;:100;::::1;;;-1:-1:-1::0;29623:26:0::1;::::0;;::::1;::::0;29615:35:::1;::::0;;;:7:::1;:35;::::0;;;;:42:::1;::::0;::::1;;29614:43;29557:100;29553:310;;;29750:26;::::0;::::1;::::0;29738:39:::1;::::0;;;:11:::1;:39;::::0;;;;;;;;29692:15:::1;:43:::0;;;;;;;29682:96:::1;::::0;29692:85;::::1;29682:9;:96::i;:::-;29816:26;::::0;;::::1;::::0;29808:35:::1;::::0;;;:7:::1;:35;::::0;;;;;;29801:42;;;;;::::1;::::0;;-1:-1:-1;;29801:42:0::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;29553:310:::1;29888:22;::::0;;;:10:::1;:22;::::0;;;;29881:29;;-1:-1:-1;;;;;;29881:29:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;;::::0;29392:534:::1;29099:1031;;;29968:26;::::0;::::1;::::0;29948:58:::1;29960:35:::0;;;:7:::1;:35;::::0;;;;;;;:45;29948:58;;:11:::1;:58:::0;;;;;:63;::::1;;29943:187;;30078:30;::::0;;;:18:::1;:30;::::0;;;;:40;;;::::1;::::0;;29943:187:::1;18604:1;;;26594:3543:::0;;:::o;21553:314::-;21601:21;21635:35;21692:19;;-1:-1:-1;;;;;21673:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;21635:77;;21728:9;21723:106;21747:19;;21743:1;:23;21723:106;;;21807:10;;;;:7;:10;;;;;;;;;21788:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:16;;:13;;21815:1;;21788:16;;;;;;;;;;;;;;;:29;21768:3;;21723:106;;;-1:-1:-1;21846:13:0;-1:-1:-1;21553:314:0;:::o;35319:1079::-;35407:14;35475:22;;;:10;:22;;;;;;;;35434:63;;;;;;;;;-1:-1:-1;;;;;35434:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35573:31;;;:19;:31;;;;;;35543:26;;35519:51;;:23;:51;;;;;;;35434:63;;35652:4;;35519:85;35518:130;35517:139;35508:148;;35671:5;35667:681;;;35739:26;;;;;35693:20;35731:35;;;:7;:35;;;;;;:44;;;35716:12;:59;:121;;35801:26;;;;;35793:35;;;;:7;:35;;;;;;:44;;;35716:121;;;35778:12;35716:121;35940:26;;;;;;35852:23;35932:35;;;:7;:35;;;;;;;:46;;;35886:26;;35878:35;;;;:51;;;35693:144;;-1:-1:-1;35852:23:0;;35878:100;:203;;36038:26;;;;;36030:35;;;;:7;:35;;;;;;:51;;;35878:203;;;35989:26;;;;;35981:35;;;;:7;:35;;;;;;:46;;;35878:203;36217:26;;;;;;36096:11;36209:35;;;:7;:35;;;;;;;;:47;;;;36155:26;;36147:35;;;;;:50;;;35852:229;;-1:-1:-1;36096:11:0;;36113:30;;;36112:85;36201:4;36111:94;36209:47;36110:146;;;;;36096:160;;36332:4;36288:15;:40;;;36282:3;:46;36281:55;;;;;;36271:65;;;;35667:681;;;;36368:22;;;36358:32;;35319:1079;-1:-1:-1;;35319:1079:0:o;32032:1449::-;18486:22;;;;:10;:22;;;;;:34;32116:10;;-1:-1:-1;;;;;18486:34:0;18524:10;18486:48;:93;;;;-1:-1:-1;18538:22:0;;;;:10;:22;;;;;:36;;;:41;;18486:93;18478:115;;;;-1:-1:-1;;;18478:115:0;;;;;;;:::i;:::-;32186:39:::1;32228:22:::0;;;:10:::1;:22;::::0;;;;;;;32290:26:::1;::::0;::::1;::::0;32282:35;;:7:::1;:35:::0;;;;;:45;32270:58;;:11:::1;:58:::0;;;;;;:63;::::1;;32269:64;:127:::0;::::1;;;-1:-1:-1::0;32345:26:0::1;::::0;::::1;::::0;32337:35:::1;::::0;;;:7:::1;:35;::::0;;;;:44:::1;;::::0;32384:12:::1;-1:-1:-1::0;32269:127:0::1;32261:154;;;;-1:-1:-1::0;;;32261:154:0::1;;;;;;;:::i;:::-;32426:24;32453:30:::0;;;:18:::1;:30;::::0;;;;;;;;32569:26:::1;::::0;::::1;::::0;32561:35;;:7:::1;:35:::0;;;;;:45;32549:58;;:11:::1;:58:::0;;;;;;:69:::1;;::::0;:74;:209:::1;;32678:26;::::0;::::1;::::0;32658:58:::1;32670:35:::0;;;:7:::1;:35;::::0;;;;;;;:45;32658:58;;:11:::1;:58:::0;;;;;:69:::1;;::::0;32753:4:::1;::::0;;;32658:76;::::1;32657:92;32631:15;:22;;;:119;:126;;;;;;32549:209;;;32626:1;32549:209;32529:229;32813:20:::0;;32809:178:::1;;32868:19;::::0;32850:83:::1;::::0;-1:-1:-1;;;;;32868:19:0::1;32889:10;32909:4;32916:16:::0;32850:17:::1;:83::i;:::-;32948:27;32958:16;32948:9;:27::i;:::-;33049:31;::::0;::::1;::::0;33006:26:::1;::::0;::::1;::::0;;32998:35:::1;::::0;;;:7:::1;:35;::::0;;;;;;;:47;;::::1;:82:::0;;;;;::::1;::::0;;;33120:26;;33112:35;;;:44:::1;;::::0;33158:40:::1;::::0;::::1;::::0;33091:108:::1;::::0;33112:44;33091:20:::1;:108::i;:::-;33210:116;33227:10;33239:15;:26;;;33267:10;33279:15;:40;;;33321:4;33210:16;:116::i;:::-;-1:-1:-1::0;33393:40:0::1;::::0;;::::1;::::0;33389:1:::1;33358:26:::0;;::::1;::::0;33337:48:::1;::::0;;;:20:::1;:48;::::0;;;;;;;:96;;;;;;-1:-1:-1;;33337:96:0;;;;33451:22;;;:10:::1;:22:::0;;;;;33444:29;;-1:-1:-1;;;;;;33444:29:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;;::::0;;;;-1:-1:-1;;32032:1449:0:o;22156:850::-;18486:22;;;;:10;:22;;;;;:34;22237:10;;-1:-1:-1;;;;;18486:34:0;18524:10;18486:48;:93;;;;-1:-1:-1;18538:22:0;;;;:10;:22;;;;;:36;;;:41;;18486:93;18478:115;;;;-1:-1:-1;;;18478:115:0;;;;;;;:::i;:::-;22307:26:::1;22336:22:::0;;;:10:::1;:22;::::0;;;;;;;;22307:51;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;22307:51:0;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;;::::0;;;;;22391:16;::::1;::::0;;::::1;::::0;:55:::1;;-1:-1:-1::0;22424:17:0::1;::::0;::::1;::::0;:22;::::1;22391:55;22369:121;;;;-1:-1:-1::0;;;22369:121:0::1;;;;;;;:::i;:::-;22612:14;::::0;;::::1;::::0;22535:21:::1;22604:23:::0;;;:7:::1;:23:::0;;;;;;:33;22592:46;;:11:::1;:46:::0;;;;;;:51;22588:2;;22592:51:::1;;:70;;22650:12;22592:70;;;22646:1;22592:70;22664:14;::::0;;::::1;::::0;22577:102:::1;::::0;::::1;::::0;;;::::1;;:::i;:::-;;::::0;;-1:-1:-1;;22577:102:0;;::::1;::::0;;;;;;22567:113;;22577:102:::1;22567:113:::0;;::::1;::::0;22559:122:::1;22700:25:::0;;;:10:::1;:25:::0;;;;;:39:::1;;::::0;22567:113;;-1:-1:-1;22700:44:0;22692:73:::1;;;;-1:-1:-1::0;;;22692:73:0::1;;;;;;;:::i;:::-;22826:3;22815:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;22804:46;;;;;;;;;;;;:::i;:::-;22776:10;:25;22787:13;22776:25;;;;;;;;;;;:74;;;;;;;;;;;;;-1:-1:-1::0;;;;;22776:74:0::1;;;;;-1:-1:-1::0;;;;;22776:74:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22901:2;22861:10;:25;22872:13;22861:25;;;;;;;;;;;:37;;;:42;;;;;-1:-1:-1::0;;;;;22861:42:0::1;;;;;-1:-1:-1::0;;;;;22861:42:0::1;;;;;;22921:10;:22;22932:10;22921:22;;;;;;;;;;;;22914:29:::0;::::1;;;;;;;;-1:-1:-1::0;;;;;22914:29:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22995:2;-1:-1:-1::0;;;;;22959:39:0::1;22983:10;-1:-1:-1::0;;;;;22959:39:0::1;22968:13;22959:39;;;;;;;;;;18604:1;;22156:850:::0;;;:::o;30145:1879::-;30309:38;30350:22;;;:10;:22;;;;;;;;;30309:63;;;;;;;;;-1:-1:-1;;;;;30309:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30445:13;;;;;:97;;-1:-1:-1;30480:20:0;;;30470:57;;-1:-1:-1;;;30470:57:0;;30540:1;;-1:-1:-1;;;;;30480:20:0;;;;30470:47;;:57;;30518:8;;30470:57;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;30462:80:0;;;30445:97;30441:167;;;-1:-1:-1;30572:24:0;;;;:14;:24;;;;;;30441:167;30627:15;;;;;:32;;-1:-1:-1;30646:13:0;;30627:32;30626:116;;;-1:-1:-1;30665:13:0;;;;;:32;;-1:-1:-1;30682:15:0;;30665:32;:76;;;;-1:-1:-1;30701:19:0;;;;:7;:19;;;;;:28;;;:40;;30665:76;30618:145;;;;-1:-1:-1;;;30618:145:0;;;;;;;:::i;:::-;30871:26;;;;;30851:58;30863:35;;;:7;:35;;;;;;:45;30851:58;;:11;:58;;;;:63;;;:119;;;;-1:-1:-1;30936:29:0;;;;:34;;30851:119;:200;;;;;31011:15;:40;;;30991:16;:60;;30851:200;:262;;;;-1:-1:-1;31072:27:0;;-1:-1:-1;;;;;31072:41:0;31103:10;31072:41;30851:262;30832:435;;;-1:-1:-1;31143:20:0;;;31133:63;;-1:-1:-1;;;31133:63:0;;31200:16;;-1:-1:-1;;;;;31143:20:0;;;;31133:41;;:63;;31175:10;;31187:8;;31133:63;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:83;;:133;;;;-1:-1:-1;31221:19:0;;;;:7;:19;;;;;:28;;;31253:12;-1:-1:-1;31221:44:0;31133:133;30810:478;;;;-1:-1:-1;;;30810:478:0;;;;;;;:::i;:::-;31354:15;31350:237;;31386:48;31407:8;31417:16;31386:20;:48::i;:::-;31350:237;;;31467:26;31482:10;31467:14;:26::i;:::-;31516;;;;;31508:35;;;;:7;:35;;;;;;;:47;:67;;;;;;;31350:237;31597:77;31614:10;31626;31638;31650:16;31668:5;31597:16;:77::i;:::-;31689:15;31685:332;;31721:32;;;;:20;:32;;;;;:52;;;;;;;;;31792:37;:68;;;;-1:-1:-1;31834:19:0;;;;:7;:19;;;;;:26;;;;;31833:27;31792:68;31788:218;;;31921:23;;;;:11;:23;;;;;;;;;31891:15;:27;;;;;;;31881:64;;31891:53;;31881:9;:64::i;:::-;31971:19;;;;:7;:19;;;;;;;31964:26;;;;;;;;-1:-1:-1;;31964:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31788:218;30145:1879;;;;;;:::o;33489:1822::-;33628:14;33644:30;33691:9;33687:1617;;;33755:38;33796:22;;;:10;:22;;;;;;;;33755:63;;;;;;;;;-1:-1:-1;;;;;33755:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33909:35;;:7;:35;;;;;;:44;;33755:63;;:38;33893:12;:60;;:122;;34003:12;33893:122;;;33964:26;;;;;33956:35;;;;:7;:35;;;;;;:44;;;33893:122;33870:145;;34089:15;:36;;;34056:15;:29;;;34041:12;:44;34040:85;34030:96;;33687:1617;;;;;34159:25;34187:19;;;:7;:19;;;;;;;;34159:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34328:42;;;;;;;;;:55;;;;34159:47;;34328:75;;34309:94;;;34301:124;;;;-1:-1:-1;;;34301:124:0;;;;;;;:::i;:::-;34440:23;34482:5;:14;;;34466:12;:30;;:66;;34520:12;34503:5;:14;;;:29;34466:66;;;34499:1;34466:66;34440:92;;34620:1;34602:15;:19;34594:50;;;;-1:-1:-1;;;34594:50:0;;;;;;;:::i;:::-;34785:1;34767:15;34744:5;:20;;;:38;:42;34736:65;;;;-1:-1:-1;;;34736:65:0;;;;;;;:::i;:::-;34942:42;34954:19;;;:7;:19;;;;;;;;:29;34942:42;;:11;:42;;;;;:55;;;35002:4;;34916:22;;;34942:55;34915:82;;;;;34891:5;:20;;;:107;34890:116;;;;;;34865:141;;35112:1;35087:22;:26;35079:50;;;;-1:-1:-1;;;35079:50:0;;;;;;;:::i;:::-;35252:40;;;-1:-1:-1;;33687:1617:0;33489:1822;;;;;;;:::o;18070:46::-;;;;;;;;;;;;;:::o;36406:271::-;36562:20;;36535:6;;-1:-1:-1;;;;;36562:20:0;36586:10;36562:34;36554:61;;;;-1:-1:-1;;;36554:61:0;;;;;;;:::i;:::-;-1:-1:-1;;;;36406:271:0;;;;;;;:::o;15781:51::-;15828:4;15781:51;:::o;16478:23::-;;;-1:-1:-1;;;;;16478:23:0;;:::o;23014:2143::-;23115:18;;23143;18789:19;;;:7;:19;;;;;:26;;;23143:18;;23115;18789:26;;18781:55;;;;-1:-1:-1;;;18781:55:0;;;;;;;:::i;:::-;18855:19;;;;:7;:19;;;;;:30;;;18889:12;-1:-1:-1;18855:46:0;;;:93;;-1:-1:-1;18905:19:0;;;;:7;:19;;;;;:28;;;18936:12;-1:-1:-1;18855:93:0;18847:119;;;;-1:-1:-1;;;18847:119:0;;;;;;;:::i;:::-;23248:18;;23205:32:::1;23240:27:::0;;;:7:::1;:27;::::0;;;;23339:21:::1;::::0;::::1;::::0;23240:27;;23205:32;-1:-1:-1;;;;;23339:35:0::1;23338:74;;23402:10;23338:74;;;23378:7;:21;;;23338:74;23525:21:::0;;23513:34:::1;::::0;;;:11:::1;:34;::::0;;;;:39;23316:96;;-1:-1:-1;23316:96:0;;23513:39:::1;;:58;;23559:12;23513:58;;;23555:1;23513:58;23573:18:::0;;23489:103:::1;::::0;::::1;::::0;;;23573:18;23489:103:::1;;;:::i;:::-;;::::0;;-1:-1:-1;;23489:103:0;;::::1;::::0;;;;;;23479:114;;23489:103:::1;23479:114:::0;;::::1;::::0;23471:123:::1;23613:22:::0;;;:10:::1;:22:::0;;;;;:36:::1;;::::0;23479:114;;-1:-1:-1;23613:41:0;23605:66:::1;;;;-1:-1:-1::0;;;23605:66:0::1;;;;;;;:::i;:::-;23726:42;23770:23:::0;23797:42:::1;23811:7;:18;;;23831:7;23797:13;:42::i;:::-;23964:21:::0;;23883:14:::1;23952:34:::0;;;:11:::1;:34;::::0;;;;:39;23725:114;;-1:-1:-1;23725:114:0;;-1:-1:-1;23883:14:0;;;23952:39:::1;;23947:620;;24070:18:::0;;24041:75:::1;::::0;24090:15;24070:18:::1;::::0;24041:28:::1;:75::i;:::-;24008:108:::0;;-1:-1:-1;24008:108:0;-1:-1:-1;24139:10:0;;;;;:38:::1;;;24176:1;24153:20;:24;24139:38;24131:77;;;;-1:-1:-1::0;;;24131:77:0::1;;;;;;;:::i;:::-;24249:23;::::0;::::1;::::0;;:41;::::1;24223:67:::0;;24335:12:::1;24305:27;::::0;::::1;:42:::0;24396:24:::1;::::0;::::1;::::0;24422:18;;24362:79:::1;::::0;24383:11;;24362:20:::1;:79::i;:::-;;23947:620;;;24474:81;24491:7;:18;;;24511:17;:24;;;24537:10;24549:5;24474:16;:81::i;:::-;24602:353;;;;;;;;24646:11;-1:-1:-1::0;;;;;24602:353:0::1;;;;;24685:7;:18;;;24602:353;;;;24931:12;24602:353;;;;24744:17;:24;;;24602:353;;;;24800:15;24602:353;;;;24838:6;24602:353;;;;24881:20;24602:353;;::::0;24577:10:::1;:22;24588:10;24577:22;;;;;;;;;;;:378;;;;;;;;;;;;;-1:-1:-1::0;;;;;24577:378:0::1;;;;;-1:-1:-1::0;;;;;24577:378:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25016:11;:34;25028:11;:21;;;25016:34;;;;;;;;;;;:39;;;;;;;;;;;;:70;;25062:17;:24;;;25016:70;;;25058:1;25016:70;24987:18:::0;;24966:40:::1;::::0;;;:20:::1;:40;::::0;;;;;:122;;;;;25011:1:::1;24966:122:::0;;;;25104:45;;-1:-1:-1;;;;;25104:45:0;::::1;::::0;24966:40;25113:10;;25104:45:::1;::::0;24966:40;;25104:45:::1;18977:1;;;;;;23014:2143:::0;;;;:::o;21875:273::-;21989:1;21948:27;;;:11;:27;;;;;;;;:38;;:42;;;;:105;;-1:-1:-1;21995:51:0;22003:27;;;:11;:27;;;;;;;;:42;;;21995:51;;:7;:51;;;;;:58;;;;;21994:59;21948:105;21940:133;;;;-1:-1:-1;;;21940:133:0;;;;;;;:::i;:::-;22097:27;;;;:11;:27;;;;;:42;;;22084:56;;:12;:56::i;:::-;21875:273;:::o;17637:53::-;;;;;;;;;;;;;:::o;36685:243::-;36818:20;;36791:6;;-1:-1:-1;;;;;36818:20:0;36842:10;36818:34;36810:61;;;;-1:-1:-1;;;36810:61:0;;;;;;;:::i;:::-;-1:-1:-1;;;;36685:243:0;;;;;;;:::o;21195:140::-;21263:22;;:::i;:::-;-1:-1:-1;21305:22:0;;;;:10;:22;;;;;;;;;21298:29;;;;;;;;;-1:-1:-1;;;;;21298:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21195:140::o;36966:4181::-;37137:4;37157:3;;:15;;;37165:7;37164:8;37157:15;37154:255;;;37219:27;;;;;37249:1;37219:31;37189:61;;;;37265:133;;37351:27;;;;;-1:-1:-1;;37351:31:0;37321:61;;37265:133;37425:3;37421:2077;;;37471:26;;;;-1:-1:-1;;;;;37471:40:0;;;;;:117;;-1:-1:-1;37532:42:0;;;;-1:-1:-1;;;;;37532:56:0;;;37471:117;:181;;;;;37651:1;37609:16;:39;;;:43;37471:181;:262;;;;-1:-1:-1;37674:21:0;;;:58;;;37731:1;37699:16;:29;;;:33;37674:58;37445:351;;;;-1:-1:-1;;;37445:351:0;;;;;;;:::i;:::-;37856:26;;;;37900:42;;;;37851:92;;-1:-1:-1;;;37851:92:0;;37816:31;;-1:-1:-1;;;;;37851:48:0;;;;:92;;37900:42;37851:92;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;37851:92:0;;;;;;;;;;;;:::i;:::-;38001:1;37958:32;;;:45;38022:29;;;;37813:130;;-1:-1:-1;38018:148:0;;-1:-1:-1;38018:148:0;;-1:-1:-1;38018:148:0;38116:16;:26;;;-1:-1:-1;;;;;38111:37:0;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;;38072:78:0;38073:32;;;38072:78;38018:148;38180:19;38222:18;38267:9;38263:628;38286:14;:21;38282:1;:25;38263:628;;;38357:16;:33;;;-1:-1:-1;;;;;38336:54:0;:14;38351:1;38336:17;;;;;;;;;;;;;;-1:-1:-1;;;;;38336:54:0;;38333:543;;;38432:4;38415:21;;38483:16;:32;;;-1:-1:-1;;;;;38462:53:0;:14;38477:1;38462:17;;;;;;;;;;;;;;-1:-1:-1;;;;;38462:53:0;;38459:129;;;38560:4;38544:20;;38459:129;38333:543;;;38687:14;38702:1;38687:17;;;;;;;;;;;;;;-1:-1:-1;;;;;38641:64:0;38652:16;:33;;;-1:-1:-1;;;;;38641:64:0;;;;;;;;;;;38752:16;:32;;;-1:-1:-1;;;;;38731:53:0;:14;38746:1;38731:17;;;;;;;;;;;;;;-1:-1:-1;;;;;38731:53:0;;38728:129;;;38829:4;38813:20;;38728:129;38309:3;;38263:628;;;;38913:14;38905:40;;;;-1:-1:-1;;;38905:40:0;;;;;;;:::i;:::-;38969:16;:29;;;38968:30;:47;;;;39002:13;38968:47;38960:72;;;;-1:-1:-1;;;38960:72:0;;;;;;;:::i;:::-;39078:1;39047:16;:28;;:32;;;;;39133:16;39094:11;:36;39106:23;;39094:36;;;;;;;;;;;:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39094:55:0;;;;;-1:-1:-1;;;;;39094:55:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39094:55:0;;;;;-1:-1:-1;;;;;39094:55:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39094:55:0;;;;;-1:-1:-1;;;;;39094:55:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39094:55:0;;;;;-1:-1:-1;;;;;39094:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39195:100;;;;;;;;39208:23;;39195:100;;;;39233:5;39195:100;;;;;;39240:1;39195:100;;;;39243:1;39195:100;;;;39246:1;39195:100;;;;39249:1;39195:100;;;;39252:16;:39;;;39195:100;;;;39293:1;39195:100;;;39164:7;:28;39172:19;;39164:28;;;;;;;;;;;:131;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39364:19;;39310:11;:36;39322:23;;39310:36;;;;;;;;;;;:51;;:73;;;;39425:1;39398:23;;:28;;;;;;;;;;;39464:1;39441:19;;:24;;;;;;;;;;;39480:7;;;;;;37421:2077;-1:-1:-1;39510:26:0;39539:19;;;:7;:19;;;;;;;;39600:29;;39588:42;;:11;:42;;;;;;;39569:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39569:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39569:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39643:136;;;;39678:12;;;;;;39670:37;;;;-1:-1:-1;;;39670:37:0;;;;;;;:::i;:::-;39722:24;39735:10;39722:12;:24::i;:::-;39761:7;;;;39643:136;39791:15;;;:20;;-1:-1:-1;;39791:20:0;;;39810:1;39828:12;;;;;:63;;;;-1:-1:-1;39844:42:0;39856:19;;;:7;:19;;;;;;;;:29;39844:42;;:11;:42;;;;;:47;;;39828:63;39824:1146;;;-1:-1:-1;39916:19:0;;;;:7;:19;;;;;39968:14;;;;39953:12;:29;39950:899;;;40003:18;40054:16;:39;;;40024:4;:27;;;:69;:213;;40198:16;:39;;;40168:4;:27;;;:69;40024:213;;;40138:4;:27;;;40096:16;:39;;;:69;40024:213;40275:14;;;;40003:234;;-1:-1:-1;40292:12:0;40275:29;;40340:21;;;40384:10;;40380:454;;40453:16;:39;;;40423:4;:27;;;:69;40419:259;;;40529:23;40545:6;40529:15;:23::i;:::-;40521:69;;;;-1:-1:-1;;;40521:69:0;;;;;;;:::i;:::-;40617:27;;;;:15;:27;;;;;:37;;;;;;40419:259;40700:41;40717:10;40729:1;40732;40735:5;40700:16;:41::i;:::-;40787:27;;;;40764:20;;;:50;40380:454;39950:899;;;;40931:27;;;;;40863:42;40875:19;;;:7;:19;;;;;;;:29;40863:42;;:11;:42;;;;;;:65;;:95;39824:1146;41039:1;40995:19;;;:7;:19;;;;;;;;:29;40983:42;;:11;:42;;;;;;;:53;;:57;40980:160;;41113:15;;;;41057:42;41069:19;;;:7;:19;;;;;;;;:29;41057:42;;:11;:42;;;;;;;:53;:71;36966:4181;;;;;;;:::o;43470:1488::-;43568:42;;:::i;:::-;43612:19;43742;;;:7;:19;;;;;;;;43711:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43612:19;;;;;;43711:60;;43763:7;43711:30;:60::i;:::-;43853:411;;;;;;;;-1:-1:-1;43897:19:0;;;:7;:19;;;;;;;:29;43885:42;;:11;:42;;;;;;:68;;-1:-1:-1;;;;;43885:68:0;43853:411;;43968:29;;;;43644:127;;-1:-1:-1;43644:127:0;;-1:-1:-1;43644:127:0;;-1:-1:-1;43853:411:0;;;;;;43968:69;;44022:15;43968:69;;;44000:19;43968:69;43853:411;;44052:42;44064:19;;;:7;43853:411;44064:19;;;;;;;:29;44052:42;;;:11;:42;;;;;;:59;;;;-1:-1:-1;;;;;44052:59:0;43853:411;;;;44126:29;;;;43853:411;;;;;;;;;44170:42;;;;;:55;;;-1:-1:-1;;;44170:55:0;;;;43853:411;;;;;;;;;;44248:4;43853:411;;;;;;;;44350:39;;;;;-1:-1:-1;44289:15:0;;-1:-1:-1;44289:15:0;;44350:39;:99;;-1:-1:-1;44394:42:0;44406:19;;;:7;:19;;;;;;;;:29;44394:42;;:11;:42;;;;;:55;;;-1:-1:-1;;;44394:55:0;;;;44393:56;44350:99;44346:175;;;44474:9;:14;44466:43;;;;-1:-1:-1;;;44466:43:0;;;;;;;:::i;:::-;44535:17;:39;;;44531:110;;;44591:38;;;;;44531:110;44708:17;:30;;;44705:246;;;44786:54;;-1:-1:-1;;;44786:54:0;;-1:-1:-1;;;;;44786:16:0;;;;;44811:9;;44786:54;;44822:17;;44786:54;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44786:54:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;44756:24:0;;;44755:85;44705:246;;;44904:35;;-1:-1:-1;;;44904:35:0;;-1:-1:-1;;;;;44904:16:0;;;;;:35;;44921:17;;44904:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44904:35:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;44874:24:0;;;44873:66;44705:246;43470:1488;;;;;;;;;:::o;56329:608::-;56400:23;56538:1;56535;56525:7;56519:14;56512:4;56503:7;56499:18;56496:1;56486:8;56479:5;56474:66;56566:16;56616:4;56610:11;56596:25;;56654:4;56642:10;56635:24;56719:4;56707:10;56703:21;56780:4;56777:1;56753:22;56738:47;56812:33;;;56806:4;56799:47;56867:6;56874:45;;;;56860:59;;56874:45;56913:4;56889:22;56882:36;56860:59;;;;;56445:485;;;;:::o;55104:338::-;55209:23;55235:104;55241:17;55283:43;;;55328:2;55332:5;55260:78;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;55260:78:0;;;;;;;;;;;;;;-1:-1:-1;;;;;55260:78:0;-1:-1:-1;;;;;;55260:78:0;;;;;;;;;;55235:5;:104::i;:::-;55209:130;;55358:10;:17;55379:1;55358:22;:56;;;;55395:10;55384:30;;;;;;;;;;;;:::i;:::-;55350:84;;;;-1:-1:-1;;;55350:84:0;;;;;;;:::i;49824:2667::-;49885:26;49914:19;;;:7;:19;;;;;50044:12;;;;;;:46;;;;;50076:5;:14;;;50060:12;:30;;50044:46;:94;;;;-1:-1:-1;50106:15:0;;50094:28;;;;:11;:28;;;;;;;;:39;;:44;50044:94;50040:730;;;50155:12;;:20;;-1:-1:-1;;50155:20:0;;;50190:7;;50040:730;50234:5;:16;;;50218:12;:32;;:65;;;;;50269:5;:14;;;50254:12;:29;50218:65;:81;;;;-1:-1:-1;50287:12:0;;;;;;50218:81;50214:556;;;50316:12;;;:20;;-1:-1:-1;;50316:20:0;;;50363:15;;50331:5;50351:28;;;:11;:28;;;;;;;;:39;;;:43;;;50460:20;;;;50427:14;;;;;50444:12;50495:29;;;;50555:15;;50543:28;;;;;;:33;50427:29;;;;50426:54;;50316:20;50543:33;50539:115;;;50597:41;50614:10;50626:1;50629;50632:5;50597:16;:41::i;:::-;50668:27;;;;:15;:27;;;;;:37;;;;;;;50720:17;50699:6;50720:9;:17::i;:::-;50752:7;;;;50214:556;50799:12;;;;;50888:15;;50782:14;50876:28;;;:11;:28;;;;;:42;;;;50853:20;;;;50799:12;;;;;50837:82;;50853:65;50837:15;:82::i;:::-;50822:12;;;:97;;-1:-1:-1;;50822:97:0;;;;;;;;;;;;;50936:12;:25;;;;;50952:9;50936:25;50932:1552;;;51052:15;;51040:28;;;;:11;:28;;;;;;;;:42;;;51017:20;;;;50994:19;;50978:36;;:15;:36;;;;;;51017:65;;50978:104;;;51169:17;;;;51052:5;;51169:17;;:::i;:::-;;;;;;;;;;;;;51158:45;;;;;;;;;;;;:::i;:::-;51135:19;;;51127:28;;;;:7;:28;;;;;;;;:76;;;;;;;;;;;;;;;;;-1:-1:-1;;51127:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51251:19;;;;;;:26;;:34;;;;;;;;51345:15;;51333:28;;;;;;;;:39;;:44;;-1:-1:-1;;51333:44:0;;;51404:15;;51392:28;;;;;:40;;:45;;;;;;51498:19;;51464:15;;51452:28;;;;;:43;;:65;;;51532:28;;;;;;;;51574:12;51532:39;;:54;;;51676:19;;51668:28;;;;;:38;;51656:51;;;;;;;;:65;;;51601:28;;;;51641:80;;;;51601:37;;;;:120;;;;51744:19;;51736:28;;;;;:37;;;:41;;;51800:19;;51792:28;;;;;:40;:44;51851:24;;;;;;;50932:1552;;;51897:12;;;;;;:26;;;;;51914:9;51913:10;51897:26;51893:591;;;51993:42;52005:19;;;:7;:19;;;;;;;;:29;;51993:42;;:11;:42;;;;;;:56;;;;;51970:20;;;;51940:27;;;:15;:27;;;;;51970:79;;51940:109;;52130:12;52097:30;;;:45;;;52215:29;;52203:42;;;;;;;;;:56;;;;52188:71;;;52157:28;;;:102;52274:31;;;:35;;;;52324:53;:58;;-1:-1:-1;;52324:58:0;;;51893:591;;;52471:1;52427:19;;;:7;:19;;;;;;;;:29;52415:42;;:11;:42;;;;;;:53;:57;51893:591;49824:2667;;;:::o;57695:391::-;57752:11;57749:49;;57780:7;;57749:49;57812:19;;-1:-1:-1;;;;;57812:19:0;57808:271;;57877:10;;57862:60;;-1:-1:-1;;;57862:60:0;;-1:-1:-1;;;;;57877:10:0;;;;57862:36;;57907:6;;57862:60;;57907:6;;57862:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57808:271;;;57968:19;;57989:10;;57955:53;;-1:-1:-1;;;;;57968:19:0;;;;57989:10;58001:6;57955:12;:53::i;:::-;58038:10;;58023:44;;-1:-1:-1;;;58023:44:0;;-1:-1:-1;;;;;58038:10:0;;;;58023:36;;:44;;58060:6;;58023:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55717:361;55831:23;55857:114;55863:17;55905:47;;;55954:4;55960:2;55964:5;55882:88;;;;;;;;;;:::i;55857:114::-;55831:140;;55990:10;:17;56011:1;55990:22;:56;;;;56027:10;56016:30;;;;;;;;;;;;:::i;:::-;55982:88;;;;-1:-1:-1;;;55982:88:0;;;;;;;:::i;53917:376::-;54038:20;;;54123:81;;-1:-1:-1;;;54123:81:0;;-1:-1:-1;;;;;54038:20:0;;;;;;54123:32;;:81;;54156:10;;54176:4;;54183:8;;54193:6;;54123:81;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54247:38:0;;-1:-1:-1;;;54247:38:0;;-1:-1:-1;;;;;54247:20:0;;;-1:-1:-1;54247:20:0;;-1:-1:-1;54247:38:0;;54268:8;;54278:6;;54247:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53917:376;;;:::o;45395:3077::-;45538:33;45586:19;;;:7;:19;;;;;;;;:29;45574:42;;:11;:42;;;;;;45538:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;45538:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;45538:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45719:231;;;;;;;45751:35;;45719:231;;;;;;;;;;45832:26;45719:231;;;;;;;;;;;;45892:22;;45719:231;;;;;;;;;45929:10;45719:231;;;;;;;46037:22;;;;;;;46203:14;;45538:78;;46037:22;;46203:52;;;;-1:-1:-1;46221:29:0;;;;:34;;46203:52;:71;;;;-1:-1:-1;46259:15:0;;;46203:71;46199:231;;;46402:16;46359:15;:40;;;:59;46338:80;;46199:231;46537:8;;46524:42;;;-1:-1:-1;;;46524:42:0;;;;46472:25;;;;-1:-1:-1;;;;;46537:8:0;;;;46524:40;;:42;;;;;;;;;;;46537:8;46524:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46471:95;;-1:-1:-1;46471:95:0;-1:-1:-1;46607:21:0;;46603:270;;46645:11;46722:4;;46678:24;;;46677:40;46660:6;:13;;;:58;46659:67;;;;;;46645:81;;46741:70;46755:9;:35;;;46792:13;46807:3;46741:13;:70::i;:::-;46842:13;;;;;:19;;;;46826:35;;46603:270;46949:10;46945:408;;;47019:77;47032:6;:27;;;47061:9;:19;;;47082:6;:13;;;47019:12;:77::i;:::-;47116:9;:19;;;-1:-1:-1;;;;;47111:41:0;;47153:6;47111:49;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;47111:49:0;;;;;;;;;;;;:::i;:::-;;;;46945:408;;;47267:74;47281:6;:27;;;47310:6;:15;;;47327:6;:13;;;47267;:74::i;:::-;47368:14;;47367:15;:45;;;;-1:-1:-1;47386:19:0;;;;:7;:19;;;;;:26;;;;;47367:45;:58;;;;;47417:8;47416:9;47367:58;47363:1102;;;47442:24;47455:10;47442:12;:24::i;:::-;47363:1102;;;47488:14;;:33;;;;-1:-1:-1;47506:15:0;;;47488:33;47484:981;;;47550:26;;;;;47542:35;;;;:7;:35;;;;;:42;;;;:106;;;;-1:-1:-1;47596:26:0;;;;47588:35;;;;:7;:35;;;;;:44;;;47636:12;-1:-1:-1;47588:60:0;47542:106;47538:187;;;47669:40;47682:15;:26;;;47669:12;:40::i;:::-;47806:23;47802:652;;47902:1;47871:26;;;;47850:48;;;;:20;:48;;;;;;:53;;-1:-1:-1;;47850:53:0;;;47947:26;;47926:48;;;;:53;:100;;;;-1:-1:-1;47992:26:0;;;;;47984:35;;;;:7;:35;;;;;:42;;;;47983:43;47926:100;47922:310;;;48119:26;;;;48107:39;;;;:11;:39;;;;;;;;;48061:15;:43;;;;;;;48051:96;;48061:85;;48051:9;:96::i;:::-;48185:26;;;;;48177:35;;;;:7;:35;;;;;;;48170:42;;;;;;;;-1:-1:-1;;48170:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47922:310;48257:22;;;;:10;:22;;;;;48250:29;;-1:-1:-1;;;;;;48250:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47802:652;;;48377:40;;;:61;;;47802:652;45395:3077;;;;;;;;;;;:::o;52800:933::-;52903:16;52936:19;;;:7;:19;;;;;:28;;;52932:665;;53010:20;;;53106:19;;;:7;:19;;;;;;;;:29;53094:42;;:11;:42;;;;;;:68;;-1:-1:-1;;;;;53010:20:0;;;;53000:36;;53037:6;;53084:79;;53094:68;53084:9;:79::i;:::-;53052:112;;;;;;;;:::i;:::-;;;;-1:-1:-1;;53052:112:0;;;;;;;;;53187:8;;-1:-1:-1;;;53174:40:0;;;;53052:112;;-1:-1:-1;;;;;53187:8:0;;;;53174:38;;:40;;;;;53187:8;;53174:40;;;;;;;53187:8;53174:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;53174:40:0;;;;;;;;;;;;:::i;:::-;53216:4;53000:221;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;53261:42:0;53273:19;;;:7;:19;;;;;;;;:29;;53261:42;;:11;:42;;;;;:68;;;53343:19;;;;;;;;:28;;;;;53241:131;;52986:235;;-1:-1:-1;;;;;;53261:68:0;;;;52986:235;;53241:131;;;;53281:10;;53241:131;:::i;:::-;;;;;;;;53387:24;;;;:14;:24;;;;;;;;:37;;;53439:19;;;:7;:19;;;;;:28;;:39;;;52932:665;;;53521:20;;;;53548:19;;;:7;:19;;;;;;;:28;;;53511:74;;-1:-1:-1;;;53511:74:0;;-1:-1:-1;;;;;53521:20:0;;;;53511:36;;:74;;53548:28;53578:6;;53511:74;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52932:665;53617:20;;;;53684:19;;;:7;:19;;;;;;;:28;;;53607:118;;-1:-1:-1;;;53607:118:0;;-1:-1:-1;;;;;53617:20:0;;;;53607:48;;:118;;53664:4;;53671:11;;53714:6;;53607:118;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52800:933;;;;;:::o;48781:1035::-;48897:20;48935:19;;;:7;:19;;;;;:28;;;48920:12;:43;:89;;48981:19;;;;:7;:19;;;;;:28;;;48920:89;;;48966:12;48920:89;49024:19;;;;:7;:19;;;;;;;;:31;;48897:112;;-1:-1:-1;49024:36:0;49020:402;;49077:23;49141:19;;;:7;:19;;;;;:30;;;;49103:35;;;;;:68;:139;;49207:19;;;;:7;:19;;;;;:35;;;49103:139;;;49174:19;;;;:7;:19;;;;;:30;;;49103:139;49379:19;;;;:7;:19;;;;;;;;:31;;;;49333:34;;;;;49077:165;;-1:-1:-1;49379:31:0;49299:30;;;49298:69;49371:4;49297:78;49379:31;49296:114;;;;49257:35;;;;:23;:35;;;;;:153;;49296:114;;;;49257:153;;;;;-1:-1:-1;49020:402:0;49482:19;;;;:7;:19;;;;;:35;;:50;;;49547:15;;49543:117;;49613:35;;;;:23;:35;;;;;;;;;49579:31;;;:19;:31;;;;;;:69;49543:117;49674:10;;49670:139;;49701:8;:96;;49756:19;;;;:7;:19;;;;;;;;:31;:41;;;;;;;;49701:96;;;-1:-1:-1;;;49712:19:0;;;;:7;:19;;;;;;;;:31;;;:41;;;;;;;;48781:1035::o;58217:657::-;58316:19;;58274:4;;;;-1:-1:-1;;;;;58316:19:0;:33;:112;;58383:19;;58376:52;;-1:-1:-1;;;58376:52:0;;-1:-1:-1;;;;;58383:19:0;;;;58376:37;;:52;;58422:4;;58376:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58316:112;;;58352:21;58316:112;58518:10;;58503:45;;-1:-1:-1;;;58503:45:0;;58291:137;;-1:-1:-1;58465:23:0;;;;-1:-1:-1;;;;;58518:10:0;;;;58503:37;;:45;;58482:6;;58503:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58499:61;58594:19;;58570:21;;-1:-1:-1;;;;;58594:19:0;:33;:112;;58661:19;;58654:52;;-1:-1:-1;;;58654:52:0;;-1:-1:-1;;;;;58661:19:0;;;;58654:37;;:52;;58700:4;;58654:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58594:112;;;58630:21;58594:112;58570:136;;58737:15;58720:13;:32;58717:75;;;58776:4;58769:11;;;;;;;58717:75;58802:41;58828:14;58812:13;:30;58802:9;:41::i;:::-;-1:-1:-1;58861:5:0;;58217:657;-1:-1:-1;;;;58217:657:0:o;41155:2307::-;41277:8;41287:27;41316:23;41377:1;41360:7;:14;;;:18;41352:40;;;;-1:-1:-1;;;41352:40:0;;;;;;;:::i;:::-;41458:15;;41446:28;;;;:11;:28;;;;;;;:38;;;41518:29;;;;-1:-1:-1;;;;;41446:38:0;;;;-1:-1:-1;41518:50:0;;41567:1;41518:50;;;41550:7;:14;;;41518:50;41496:72;;41597:7;:29;;;:50;;41633:7;:14;;;41597:50;;;41629:1;41597:50;41579:68;;41658:23;41692:29;41845:7;:29;;;41842:596;;;41921:15;;41909:28;;;;:11;:28;;;;;:54;;;41891:121;;-1:-1:-1;;;;;41909:54:0;41965:10;41985:4;41992:19;41891:17;:121::i;:::-;42090:15;;42078:28;;;;:11;:28;;;;;;;:54;;;42052:102;;-1:-1:-1;;;42052:102:0;;-1:-1:-1;;;;;42052:25:0;;;;;;:102;;42078:54;;;;42134:19;;42052:102;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;42052:102:0;;;;;;;;;;;;:::i;:::-;42027:127;-1:-1:-1;42027:127:0;-1:-1:-1;41842:596:0;;;42319:15;;42307:28;;;;:11;:28;;;;;;:54;;;42375:15;;42363:28;;;;;;:45;;;42289:137;;-1:-1:-1;;;42289:137:0;;-1:-1:-1;;;;;42289:17:0;;;;;;:137;;42307:54;;;;42363:45;;42410:15;;42289:137;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;42289:137:0;;;;;;;;;;;;:::i;:::-;42243:183;;-1:-1:-1;42243:183:0;;-1:-1:-1;42243:183:0;-1:-1:-1;41842:596:0;42530:9;42526:929;42549:6;:13;42545:1;:17;42526:929;;;42612:15;;42600:28;;;;:11;:28;;;;;:45;;;42587:9;;-1:-1:-1;;;;;42600:45:0;;;;42587:6;;42594:1;;42587:9;;;;;;;;;;;;-1:-1:-1;;;;;42587:58:0;;42584:341;;;42684:12;42697:1;42684:15;;;;;;;;;;;;;;42666:33;;42745:11;:28;42757:5;:15;;;42745:28;;;;;;;;;;;:41;;;42726:15;:60;;42718:91;;;;-1:-1:-1;;;42718:91:0;;;;;;;:::i;:::-;42831:7;:29;;;42828:82;;;42885:5;;42828:82;42942:7;:29;;;42939:77;;;42992:8;;42939:77;43045:15;;43033:28;;;;:11;:28;;;;;:41;;;-1:-1:-1;;;43033:41:0;;;;:102;;;;;43126:6;43133:1;43126:9;;;;;;;;;;;;;;;;;;;43090:15;;43078:28;;;;:11;:28;;;;;;;:44;;;-1:-1:-1;;;;;43078:44:0;;;:57;;;43033:102;43030:414;;;43177:12;43190:1;43177:15;;;;;;;;;;;;;;43164:9;:28;43156:60;;;;-1:-1:-1;;;43156:60:0;;;;;;;:::i;:::-;43030:414;;;43257:72;43275:6;43282:1;43275:9;;;;;;;;;;;;;;43286:10;43306:4;43313:12;43326:1;43313:15;;;;;;;;;;;;;;43257:17;:72::i;:::-;43348:80;43361:6;43368:1;43361:9;;;;;;;;;;;;;;43372:11;:28;43384:5;:15;;;43372:28;;;;;;;;;;;:38;;;;;;;;;;-1:-1:-1;;;;;43372:38:0;43412:12;43425:1;43412:15;;;;;;;;;;;;;;43348:12;:80::i;:::-;42564:3;;42526:929;;;;41155:2307;;;;;;;:::o;54530:335::-;54634:23;54660:103;54666:17;54708:42;;;54752:2;54756:5;54685:77;;;;;;;;;:::i;54660:103::-;54634:129;;54782:10;:17;54803:1;54782:22;:56;;;;54819:10;54808:30;;;;;;;;;;;;:::i;:::-;54774:83;;;;-1:-1:-1;;;54774:83:0;;;;;;;:::i;57093:494::-;57225:42;;;;;;;;;;;-1:-1:-1;;;57225:42:0;;;;57299:13;;57309:2;57299:13;;;57149;57299;;;;;;-1:-1:-1;;;;;57199:14:0;;;57225:42;-1:-1:-1;;57299:13:0;;;;;;;;;;-1:-1:-1;57299:13:0;57280:32;;-1:-1:-1;;;57323:3:0;57327:1;57323:6;;;;;;;;;;;:12;-1:-1:-1;;;;;57323:12:0;;;;;;;;;-1:-1:-1;;;57346:3:0;57350:1;57346:6;;;;;;;;;;;:12;-1:-1:-1;;;;;57346:12:0;;;;;;;;;57374:6;57369:182;57390:2;57386:1;:6;57369:182;;;57427:8;57464:1;57447:5;57453:1;57457:2;57453:6;57447:13;;;;;;;;;;-1:-1:-1;;;;;57447:18:0;;;;57441:25;;57436:31;;57427:41;;;;;;;;;;;;;;;;57414:3;57420:1;57422;57420:3;57418:1;:5;57414:10;;;;;;;;;;;:54;-1:-1:-1;;;;;57414:54:0;;;;;;;;;57496:8;57516:5;57522:1;57526:2;57522:6;57516:13;;;;;;;57496:43;;57516:13;;;57532:4;57510:27;;57496:43;;;;;;;;;;;;;;57483:3;57489:1;57491;57489:3;57487:1;:5;57483:10;;;;;;;;;;;:56;-1:-1:-1;;;;;57483:56:0;;;;;;;;-1:-1:-1;57394:3:0;;57369:182;;;-1:-1:-1;57575:3:0;57093:494;-1:-1:-1;;;;57093:494:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:310:1:-;;120:53;135:37;165:6;135:37;:::i;:::-;120:53;:::i;:::-;111:62;;196:6;189:5;182:21;236:3;227:6;222:3;218:16;215:25;212:2;;;253:1;250;243:12;212:2;266:52;311:6;304:4;297:5;293:16;288:3;266:52;:::i;:::-;101:223;;;;;:::o;329:138::-;399:20;;428:33;399:20;428:33;:::i;472:142::-;553:13;;575:33;553:13;575:33;:::i;619:779::-;;743:3;736:4;728:6;724:17;720:27;710:2;;765:5;758;751:20;710:2;798:6;792:13;824:4;848:65;863:49;909:2;863:49;:::i;848:65::-;947:15;;;978:12;;;;1010:15;;;1056:11;;;1044:24;;1040:33;;1037:42;-1:-1:-1;1034:2:1;;;1096:5;1089;1082:20;1034:2;1122:5;1136:233;1150:2;1147:1;1144:9;1136:233;;;1214:3;1208:10;1231:33;1258:5;1231:33;:::i;:::-;1277:18;;1315:12;;;;1347;;;;1168:1;1161:9;1136:233;;;-1:-1:-1;1387:5:1;;700:698;-1:-1:-1;;;;;;;700:698:1:o;1403:705::-;;1516:3;1509:4;1501:6;1497:17;1493:27;1483:2;;1538:5;1531;1524:20;1483:2;1578:6;1565:20;1604:4;1628:65;1643:49;1689:2;1643:49;:::i;1628:65::-;1727:15;;;1758:12;;;;1790:15;;;1836:11;;;1824:24;;1820:33;;1817:42;-1:-1:-1;1814:2:1;;;1876:5;1869;1862:20;1814:2;1902:5;1916:163;1930:2;1927:1;1924:9;1916:163;;;1987:17;;1975:30;;2025:12;;;;2057;;;;1948:1;1941:9;1916:163;;2113:702;;2237:3;2230:4;2222:6;2218:17;2214:27;2204:2;;2259:5;2252;2245:20;2204:2;2292:6;2286:13;2318:4;2342:65;2357:49;2403:2;2357:49;:::i;2342:65::-;2441:15;;;2472:12;;;;2504:15;;;2550:11;;;2538:24;;2534:33;;2531:42;-1:-1:-1;2528:2:1;;;2590:5;2583;2576:20;2528:2;2616:5;2630:156;2644:2;2641:1;2638:9;2630:156;;;2701:10;;2689:23;;2732:12;;;;2764;;;;2662:1;2655:9;2630:156;;2820:132;2887:20;;2916:30;2887:20;2916:30;:::i;2957:136::-;3035:13;;3057:30;3035:13;3057:30;:::i;3098:485::-;;3195:3;3188:4;3180:6;3176:17;3172:27;3162:2;;3217:5;3210;3203:20;3162:2;3257:6;3244:20;3288:49;3303:33;3333:2;3303:33;:::i;3288:49::-;3362:2;3353:7;3346:19;3408:3;3401:4;3396:2;3388:6;3384:15;3380:26;3377:35;3374:2;;;3429:5;3422;3415:20;3374:2;3498;3491:4;3483:6;3479:17;3472:4;3463:7;3459:18;3446:55;3521:16;;;3539:4;3517:27;3510:42;;;;3525:7;3152:431;-1:-1:-1;;3152:431:1:o;3588:768::-;;3708:4;3696:9;3691:3;3687:19;3683:30;3680:2;;;3730:5;3723;3716:20;3680:2;3767;3761:9;3809:4;3801:6;3797:17;3880:6;3868:10;3865:22;-1:-1:-1;;;;;3832:10:1;3829:34;3826:62;3823:2;;;3891:9;3823:2;3922:10;3918:2;3911:22;;3951:6;3942:15;;3994:9;3981:23;3973:6;3966:39;4066:2;4055:9;4051:18;4038:32;4033:2;4025:6;4021:15;4014:57;4123:2;4112:9;4108:18;4095:32;4136;4160:7;4136:32;:::i;:::-;4196:2;4184:15;;4177:32;4261:2;4246:18;;4233:32;4274:35;4233:32;4274:35;:::i;:::-;4337:2;4325:15;;;;4318:32;3670:686;;-1:-1:-1;;3670:686:1:o;4361:1129::-;;;;;;4600:3;4588:9;4579:7;4575:23;4571:33;4568:2;;;4622:6;4614;4607:22;4568:2;4666:9;4653:23;4685:33;4712:5;4685:33;:::i;:::-;4737:5;-1:-1:-1;4794:2:1;4779:18;;4766:32;4807:35;4766:32;4807:35;:::i;:::-;4861:7;-1:-1:-1;4919:2:1;4904:18;;4891:32;-1:-1:-1;;;;;4972:14:1;;;4969:2;;;5004:6;4996;4989:22;4969:2;5032:67;5091:7;5082:6;5071:9;5067:22;5032:67;:::i;:::-;5022:77;;5152:2;5141:9;5137:18;5124:32;5108:48;;5181:2;5171:8;5168:16;5165:2;;;5202:6;5194;5187:22;5165:2;5230:69;5291:7;5280:8;5269:9;5265:24;5230:69;:::i;:::-;5220:79;;5352:3;5341:9;5337:19;5324:33;5308:49;;5382:2;5372:8;5369:16;5366:2;;;5403:6;5395;5388:22;5366:2;;5431:53;5476:7;5465:8;5454:9;5450:24;5431:53;:::i;:::-;5421:63;;;4558:932;;;;;;;;:::o;5495:760::-;;;;;;5684:3;5672:9;5663:7;5659:23;5655:33;5652:2;;;5706:6;5698;5691:22;5652:2;5750:9;5737:23;5769:33;5796:5;5769:33;:::i;:::-;5821:5;-1:-1:-1;5878:2:1;5863:18;;5850:32;5891:35;5850:32;5891:35;:::i;:::-;5945:7;-1:-1:-1;5999:2:1;5984:18;;5971:32;;-1:-1:-1;6050:2:1;6035:18;;6022:32;;-1:-1:-1;6105:3:1;6090:19;;6077:33;-1:-1:-1;;;;;6122:30:1;;6119:2;;;6170:6;6162;6155:22;6119:2;6198:51;6241:7;6232:6;6221:9;6217:22;6198:51;:::i;6260:619::-;;;6409:2;6397:9;6388:7;6384:23;6380:32;6377:2;;;6430:6;6422;6415:22;6377:2;6467:9;6461:16;6486:33;6513:5;6486:33;:::i;:::-;6587:2;6572:18;;6566:25;6538:5;;-1:-1:-1;;;;;;6603:30:1;;6600:2;;;6651:6;6643;6636:22;6600:2;6679:22;;6732:4;6724:13;;6720:27;-1:-1:-1;6710:2:1;;6766:6;6758;6751:22;6710:2;6794:79;6865:7;6860:2;6854:9;6849:2;6845;6841:11;6794:79;:::i;:::-;6784:89;;;6367:512;;;;;:::o;6884:998::-;;;;;;7082:3;7070:9;7061:7;7057:23;7053:33;7050:2;;;7104:6;7096;7089:22;7050:2;7148:9;7135:23;7167:33;7194:5;7167:33;:::i;:::-;7219:5;-1:-1:-1;7275:2:1;7260:18;;7247:32;-1:-1:-1;;;;;7328:14:1;;;7325:2;;;7360:6;7352;7345:22;7325:2;7388:51;7431:7;7422:6;7411:9;7407:22;7388:51;:::i;:::-;7378:61;;7491:2;7480:9;7476:18;7463:32;7448:47;;7504:35;7531:7;7504:35;:::i;:::-;7558:7;;-1:-1:-1;7617:2:1;7602:18;;7589:32;;7630:35;7589:32;7630:35;:::i;:::-;7684:7;;-1:-1:-1;7744:3:1;7729:19;;7716:33;;7761:16;;;7758:2;;;7795:6;7787;7780:22;7887:327;;;8016:2;8004:9;7995:7;7991:23;7987:32;7984:2;;;8037:6;8029;8022:22;7984:2;8081:9;8068:23;8100:33;8127:5;8100:33;:::i;:::-;8152:5;8204:2;8189:18;;;;8176:32;;-1:-1:-1;;;7974:240:1:o;8219:454::-;;;;8373:2;8361:9;8352:7;8348:23;8344:32;8341:2;;;8394:6;8386;8379:22;8341:2;8431:9;8425:16;8450:33;8477:5;8450:33;:::i;:::-;8547:2;8532:18;;8526:25;8596:2;8581:18;;8575:25;8502:5;;-1:-1:-1;8526:25:1;-1:-1:-1;8609:32:1;8575:25;8609:32;:::i;:::-;8660:7;8650:17;;;8331:342;;;;;:::o;8678:3120::-;;8835:2;8878;8866:9;8857:7;8853:23;8849:32;8846:2;;;8899:6;8891;8884:22;8846:2;8944:9;8931:23;-1:-1:-1;;;;;9014:2:1;9006:6;9003:14;9000:2;;;9035:6;9027;9020:22;9000:2;9078:6;9067:9;9063:22;9053:32;;9123:7;9116:4;9112:2;9108:13;9104:27;9094:2;;9150:6;9142;9135:22;9094:2;9191;9178:16;9214:65;9229:49;9275:2;9229:49;:::i;9214:65::-;9313:15;;;9344:12;;;;9376:11;;;9406:6;9439:11;;;9431:20;;9427:29;;9424:42;-1:-1:-1;9421:2:1;;;9484:6;9476;9469:22;9421:2;9511:6;9502:15;;9526:2242;9540:2;9537:1;9534:9;9526:2242;;;9608:3;9599:7;9595:17;9636:2;9632;9628:11;9625:2;;;9657:6;9649;9642:22;9625:2;9689;9724;9718:9;9750:4;9797:2;9789:6;9785:15;9854:6;9842:10;9839:22;9834:2;9822:10;9819:18;9816:46;9813:2;;;9865:9;9813:2;9889:22;;9937:17;;9967:30;9937:17;9967:30;:::i;:::-;10010:21;;10072:12;;;10059:26;10098:32;10059:26;10098:32;:::i;:::-;10150:15;;;10143:32;10225:12;;;10212:26;10195:15;;;10188:51;10262:2;10288:6;-1:-1:-1;;10314:16:1;;10310:26;-1:-1:-1;10307:2:1;;;10354:6;10346;10339:22;10307:2;10391:19;10406:3;10391:19;:::i;:::-;10376:34;;10439:31;10466:2;10461:3;10457:12;10439:31;:::i;:::-;10430:7;10423:48;10531:2;10526:3;10522:12;10509:26;10504:2;10495:7;10491:16;10484:52;10560:3;10623;10618;10614:13;10601:27;10596:2;10587:7;10583:16;10576:53;10653:3;10642:14;;10716:3;10711;10707:13;10694:27;10689:2;10680:7;10676:16;10669:53;10746:3;10809;10804;10800:13;10787:27;10782:2;10773:7;10769:16;10762:53;10839:3;10828:14;;10903:3;10898;10894:13;10881:27;10875:3;10866:7;10862:17;10855:54;10933:3;10922:14;;10975:35;11005:3;11000;10996:13;10975:35;:::i;:::-;10969:3;10960:7;10956:17;10949:62;11035:3;11024:14;;11077:35;11107:3;11102;11098:13;11077:35;:::i;:::-;11058:17;;;11051:62;11137:3;11179:35;11200:13;;;11179:35;:::i;:::-;11173:3;11164:7;11160:17;11153:62;11239:3;11228:14;;11281:35;11311:3;11306;11302:13;11281:35;:::i;:::-;11275:3;11266:7;11262:17;11255:62;11341:3;11330:14;;11383:32;11410:3;11405;11401:13;11383:32;:::i;:::-;11377:3;11368:7;11364:17;11357:59;11477:3;11472;11468:13;11455:27;11449:3;11440:7;11436:17;11429:54;;11544:3;11539;11535:13;11522:27;11516:3;11507:7;11503:17;11496:54;11611:3;11606;11602:13;11589:27;11583:3;11574:7;11570:17;11563:54;;;11654:7;11649:2;11641:6;11637:15;11630:32;;;11687:6;11682:3;11675:19;;;;11723:2;11718:3;11714:12;11707:19;;11755:2;11750:3;11746:12;11739:19;;9558:1;9555;9551:9;9546:14;;9526:2242;;;-1:-1:-1;11787:5:1;;8815:2983;-1:-1:-1;;;;;;;;;8815:2983:1:o;11803:2356::-;;11962:2;12005;11993:9;11984:7;11980:23;11976:32;11973:2;;;12026:6;12018;12011:22;11973:2;12064:9;12058:16;-1:-1:-1;;;;;12089:6:1;12086:30;12083:2;;;12134:6;12126;12119:22;12083:2;12162:22;;12215:4;12207:13;;12203:27;-1:-1:-1;12193:2:1;;12249:6;12241;12234:22;12193:2;12283;12277:9;12306:65;12321:49;12367:2;12321:49;:::i;12306:65::-;12405:15;;;12436:12;;;;12468:11;;;12498:6;12531:11;;;12523:20;;12519:29;;12516:42;-1:-1:-1;12513:2:1;;;12576:6;12568;12561:22;12513:2;12603:6;12594:15;;12618:1511;12632:2;12629:1;12626:9;12618:1511;;;12703:2;12697:3;12688:7;12684:17;12680:26;12677:2;;;12724:6;12716;12709:22;12677:2;12759:18;12774:2;12759:18;:::i;:::-;12804:33;12833:3;12804:33;:::i;:::-;12790:48;;12880:12;;;12874:19;12858:14;;;12851:43;12917:2;12961:12;;;12955:19;12939:14;;;12932:43;12998:2;13042:12;;;13036:19;13020:14;;;13013:43;13079:3;13124:12;;;13118:19;13102:14;;;13095:43;13161:3;13206:12;;;13200:19;13184:14;;;13177:43;13243:3;13282:45;13314:12;;;13282:45;:::i;:::-;13266:14;;;13259:69;13352:3;13392:46;13424:13;;;13392:46;:::i;:::-;13375:15;;;13368:71;13463:3;13503:46;13535:13;;;13503:46;:::i;:::-;13486:15;;;13479:71;13574:3;13614:46;13646:13;;;13614:46;:::i;:::-;13597:15;;;13590:71;13685:3;13725:43;13754:13;;;13725:43;:::i;:::-;13708:15;;;13701:68;13793:3;13839:13;;;13833:20;13816:15;;;13809:45;13878:3;13924:13;;;13918:20;13901:15;;;13894:45;13963:3;14009:13;;;14003:20;13986:15;;;13979:45;14037:18;;12650:1;12643:9;;;;;14075:12;;;;14107;;;;12618:1511;;;-1:-1:-1;14148:5:1;;11942:2217;-1:-1:-1;;;;;;;;11942:2217:1:o;14164:656::-;;;14354:2;14342:9;14333:7;14329:23;14325:32;14322:2;;;14375:6;14367;14360:22;14322:2;14413:9;14407:16;-1:-1:-1;;;;;14483:2:1;14475:6;14472:14;14469:2;;;14504:6;14496;14489:22;14469:2;14532:78;14602:7;14593:6;14582:9;14578:22;14532:78;:::i;:::-;14522:88;;14656:2;14645:9;14641:18;14635:25;14619:41;;14685:2;14675:8;14672:16;14669:2;;;14706:6;14698;14691:22;14669:2;;14734:80;14806:7;14795:8;14784:9;14780:24;14734:80;:::i;14825:257::-;;14945:2;14933:9;14924:7;14920:23;14916:32;14913:2;;;14966:6;14958;14951:22;14913:2;15003:9;14997:16;15022:30;15046:5;15022:30;:::i;15087:306::-;;15198:2;15186:9;15177:7;15173:23;15169:32;15166:2;;;15219:6;15211;15204:22;15166:2;15250:23;;-1:-1:-1;;;;;;15302:32:1;;15292:43;;15282:2;;15354:6;15346;15339:22;15398:301;;15559:2;15547:9;15538:7;15534:23;15530:32;15527:2;;;15580:6;15572;15565:22;15527:2;15617:9;15611:16;15636:33;15663:5;15636:33;:::i;15704:490::-;;15837:2;15825:9;15816:7;15812:23;15808:32;15805:2;;;15858:6;15850;15843:22;15805:2;15896:9;15890:16;-1:-1:-1;;;;;15921:6:1;15918:30;15915:2;;;15966:6;15958;15951:22;15915:2;15994:22;;16047:4;16039:13;;16035:27;-1:-1:-1;16025:2:1;;16081:6;16073;16066:22;16025:2;16109:79;16180:7;16175:2;16169:9;16164:2;16160;16156:11;16109:79;:::i;:::-;16099:89;15795:399;-1:-1:-1;;;;15795:399:1:o;16199:270::-;;16350:3;16338:9;16329:7;16325:23;16321:33;16318:2;;;16372:6;16364;16357:22;16318:2;16400:63;16455:7;16444:9;16400:63;:::i;16474:838::-;;16629:3;16617:9;16608:7;16604:23;16600:33;16597:2;;;16651:6;16643;16636:22;16597:2;16689;16683:9;16731:3;16723:6;16719:16;16801:6;16789:10;16786:22;-1:-1:-1;;;;;16753:10:1;16750:34;16747:62;16744:2;;;16812:9;16744:2;16839;16832:22;16878:42;16910:9;16878:42;:::i;:::-;16870:6;16863:58;16975:2;16964:9;16960:18;16954:25;16949:2;16941:6;16937:15;16930:50;17034:2;17023:9;17019:18;17013:25;17008:2;17000:6;16996:15;16989:50;17093:2;17082:9;17078:18;17072:25;17067:2;17059:6;17055:15;17048:50;17153:3;17142:9;17138:19;17132:26;17126:3;17118:6;17114:16;17107:52;17214:3;17203:9;17199:19;17193:26;17187:3;17179:6;17175:16;17168:52;17275:3;17264:9;17260:19;17254:26;17248:3;17240:6;17236:16;17229:52;17300:6;17290:16;;;16587:725;;;;:::o;17317:913::-;;17447:3;17491:2;17479:9;17470:7;17466:23;17462:32;17459:2;;;17512:6;17504;17497:22;17459:2;17550;17544:9;17580:15;;;;-1:-1:-1;;;;;17610:34:1;;17646:22;;;17607:62;17604:2;;;17672:9;17604:2;17703:10;17699:2;17692:22;17744:9;17738:16;17730:6;17723:32;17788:48;17832:2;17821:9;17817:18;17788:48;:::i;:::-;17783:2;17775:6;17771:15;17764:73;17891:2;17880:9;17876:18;17870:25;17865:2;17857:6;17853:15;17846:50;17950:2;17939:9;17935:18;17929:25;17924:2;17916:6;17912:15;17905:50;18010:3;17999:9;17995:19;17989:26;17983:3;17975:6;17971:16;17964:52;18071:3;18060:9;18056:19;18050:26;18044:3;18036:6;18032:16;18025:52;18132:3;18121:9;18117:19;18111:26;18105:3;18097:6;18093:16;18086:52;18193:3;18182:9;18178:19;18172:26;18166:3;18158:6;18154:16;18147:52;18218:6;18208:16;;;;17427:803;;;;:::o;18235:190::-;;18347:2;18335:9;18326:7;18322:23;18318:32;18315:2;;;18368:6;18360;18353:22;18315:2;-1:-1:-1;18396:23:1;;18305:120;-1:-1:-1;18305:120:1:o;18430:194::-;;18553:2;18541:9;18532:7;18528:23;18524:32;18521:2;;;18574:6;18566;18559:22;18521:2;-1:-1:-1;18602:16:1;;18511:113;-1:-1:-1;18511:113:1:o;18629:324::-;;;18769:2;18757:9;18748:7;18744:23;18740:32;18737:2;;;18790:6;18782;18775:22;18737:2;18824:9;18818:16;18808:26;;18877:2;18866:9;18862:18;18856:25;18890:33;18917:5;18890:33;:::i;:::-;18942:5;18932:15;;;18727:226;;;;;:::o;18958:717::-;;;;19165:2;19153:9;19144:7;19140:23;19136:32;19133:2;;;19186:6;19178;19171:22;19133:2;19220:9;19214:16;19204:26;;19274:2;19263:9;19259:18;19253:25;-1:-1:-1;;;;;19338:2:1;19330:6;19327:14;19324:2;;;19359:6;19351;19344:22;19324:2;19387:78;19457:7;19448:6;19437:9;19433:22;19387:78;:::i;:::-;19377:88;;19511:2;19500:9;19496:18;19490:25;19474:41;;19540:2;19530:8;19527:16;19524:2;;;19561:6;19553;19546:22;19524:2;;19589:80;19661:7;19650:8;19639:9;19635:24;19589:80;:::i;:::-;19579:90;;;19123:552;;;;;:::o;19680:321::-;;;19806:2;19794:9;19785:7;19781:23;19777:32;19774:2;;;19827:6;19819;19812:22;19774:2;19868:9;19855:23;19845:33;;19928:2;19917:9;19913:18;19900:32;19941:30;19965:5;19941:30;:::i;20006:338::-;;;20174:3;20162:9;20153:7;20149:23;20145:33;20142:2;;;20196:6;20188;20181:22;20142:2;20237:9;20224:23;20214:33;;20266:72;20330:7;20325:2;20314:9;20310:18;20266:72;:::i;:::-;20256:82;;20132:212;;;;;:::o;20349:458::-;;;;;20509:3;20497:9;20488:7;20484:23;20480:33;20477:2;;;20531:6;20523;20516:22;20477:2;20572:9;20559:23;20549:33;;20629:2;20618:9;20614:18;20601:32;20591:42;;20683:2;20672:9;20668:18;20655:32;20696:30;20720:5;20696:30;:::i;:::-;20467:340;;;;-1:-1:-1;20745:5:1;;20797:2;20782:18;20769:32;;-1:-1:-1;;20467:340:1:o;20812:114::-;-1:-1:-1;;;;;20888:31:1;20876:44;;20866:60::o;20931:93::-;21003:13;20996:21;20984:34;;20974:50::o;21029:259::-;;21110:5;21104:12;21137:6;21132:3;21125:19;21153:63;21209:6;21202:4;21197:3;21193:14;21186:4;21179:5;21175:16;21153:63;:::i;:::-;21270:2;21249:15;-1:-1:-1;;21245:29:1;21236:39;;;;21277:4;21232:50;;21080:208;-1:-1:-1;;21080:208:1:o;21293:508::-;21380:5;21374:12;21369:3;21362:25;21450:4;21443:5;21439:16;21433:23;21426:31;21419:39;21412:4;21407:3;21403:14;21396:63;21508:4;21501:5;21497:16;21491:23;21484:4;21479:3;21475:14;21468:47;21564:4;21557:5;21553:16;21547:23;21540:4;21535:3;21531:14;21524:47;21620:4;21613:5;21609:16;21603:23;21596:4;21591:3;21587:14;21580:47;21676:4;21669:5;21665:16;21659:23;21652:4;21647:3;21643:14;21636:47;21732:4;21725:5;21721:16;21715:23;21708:4;21703:3;21699:14;21692:47;21788:4;21781:5;21777:16;21771:23;21764:4;21759:3;21755:14;21748:47;21352:449;;:::o;21806:430::-;;-1:-1:-1;;;22063:3:1;22056:26;22111:6;22105:13;22127:62;22182:6;22177:2;22172:3;22168:12;22161:4;22153:6;22149:17;22127:62;:::i;:::-;22209:16;;;;22227:2;22205:25;;22046:190;-1:-1:-1;;22046:190:1:o;22241:205::-;22441:3;22432:14::o;22451:203::-;-1:-1:-1;;;;;22615:32:1;;;;22597:51;;22585:2;22570:18;;22552:102::o;22875:646::-;-1:-1:-1;;;;;23242:15:1;;;23224:34;;23294:15;;;;23289:2;23274:18;;23267:43;23341:2;23326:18;;23319:34;23384:2;23369:18;;23362:34;;;;23204:3;23427;23412:19;;23405:32;;;22875:646;23453:19;;;23446:33;23511:3;23496:19;;23176:345::o;24169:282::-;-1:-1:-1;;;;;24369:32:1;;;;24351:51;;24433:2;24418:18;;24411:34;24339:2;24324:18;;24306:145::o;24456:375::-;-1:-1:-1;;;;;24714:15:1;;;24696:34;;24766:15;;;;24761:2;24746:18;;24739:43;24813:2;24798:18;;24791:34;;;;24646:2;24631:18;;24613:218::o;25115:345::-;-1:-1:-1;;;;;25335:32:1;;;;25317:51;;25399:2;25384:18;;25377:34;;;;25442:2;25427:18;;25420:34;25305:2;25290:18;;25272:188::o;25465:724::-;25694:2;25746:21;;;25816:13;;25719:18;;;25838:22;;;25465:724;;25694:2;25917:15;;;;25891:2;25876:18;;;25465:724;25963:200;25977:6;25974:1;25971:13;25963:200;;;26026:53;26075:3;26066:6;26060:13;26026:53;:::i;:::-;26138:15;;;;26108:6;26099:16;;;;;25999:1;25992:9;25963:200;;;-1:-1:-1;26180:3:1;;25674:515;-1:-1:-1;;;;;;25674:515:1:o;26194:187::-;26359:14;;26352:22;26334:41;;26322:2;26307:18;;26289:92::o;26386:202::-;-1:-1:-1;;;;;;26548:33:1;;;;26530:52;;26518:2;26503:18;;26485:103::o;26593:219::-;;26740:2;26729:9;26722:21;26760:46;26802:2;26791:9;26787:18;26779:6;26760:46;:::i;26817:446::-;;27065:2;27054:9;27047:21;27091:46;27133:2;27122:9;27118:18;27110:6;27091:46;:::i;:::-;27173:22;;;27168:2;27153:18;;;27146:50;27205:20;;;27242:15;;27037:226;-1:-1:-1;27037:226:1:o;27268:340::-;27470:2;27452:21;;;27509:2;27489:18;;;27482:30;-1:-1:-1;;;27543:2:1;27528:18;;27521:46;27599:2;27584:18;;27442:166::o;27613:397::-;27815:2;27797:21;;;27854:2;27834:18;;;27827:30;27893:34;27888:2;27873:18;;27866:62;-1:-1:-1;;;27959:2:1;27944:18;;27937:31;28000:3;27985:19;;27787:223::o;28015:350::-;28217:2;28199:21;;;28256:2;28236:18;;;28229:30;28295:28;28290:2;28275:18;;28268:56;28356:2;28341:18;;28189:176::o;28370:340::-;28572:2;28554:21;;;28611:2;28591:18;;;28584:30;-1:-1:-1;;;28645:2:1;28630:18;;28623:46;28701:2;28686:18;;28544:166::o;28715:336::-;28917:2;28899:21;;;28956:2;28936:18;;;28929:30;-1:-1:-1;;;28990:2:1;28975:18;;28968:42;29042:2;29027:18;;28889:162::o;29056:336::-;29258:2;29240:21;;;29297:2;29277:18;;;29270:30;-1:-1:-1;;;29331:2:1;29316:18;;29309:42;29383:2;29368:18;;29230:162::o;29397:337::-;29599:2;29581:21;;;29638:2;29618:18;;;29611:30;-1:-1:-1;;;29672:2:1;29657:18;;29650:43;29725:2;29710:18;;29571:163::o;29739:336::-;29941:2;29923:21;;;29980:2;29960:18;;;29953:30;-1:-1:-1;;;30014:2:1;29999:18;;29992:42;30066:2;30051:18;;29913:162::o;30080:342::-;30282:2;30264:21;;;30321:2;30301:18;;;30294:30;-1:-1:-1;;;30355:2:1;30340:18;;30333:48;30413:2;30398:18;;30254:168::o;30427:340::-;30629:2;30611:21;;;30668:2;30648:18;;;30641:30;-1:-1:-1;;;30702:2:1;30687:18;;30680:46;30758:2;30743:18;;30601:166::o;30772:332::-;30974:2;30956:21;;;31013:1;30993:18;;;30986:29;-1:-1:-1;;;31046:2:1;31031:18;;31024:39;31095:2;31080:18;;30946:158::o;31109:1153::-;;31627:3;31616:9;31609:22;31668:2;31662:3;31651:9;31647:19;31640:31;-1:-1:-1;;;31702:3:1;31691:9;31687:19;31680:48;31747:3;31788:2;31781:4;31770:9;31766:20;31759:32;31827:1;31822:2;31811:9;31807:18;31800:29;;-1:-1:-1;;;31860:3:1;31849:9;31845:19;31838:36;31893:3;31946:6;31939:14;31932:22;31927:2;31916:9;31912:18;31905:50;31991:2;31986;31975:9;31971:18;31964:30;32017:46;32059:2;32048:9;32044:18;32036:6;32017:46;:::i;:::-;-1:-1:-1;;;;;32100:32:1;;;;32094:3;32079:19;;32072:61;-1:-1:-1;32170:22:1;;;32120:3;32149:19;;;32142:51;;;;32202:20;;32251:4;32239:17;;;-1:-1:-1;;31599:663:1:o;32267:343::-;32469:2;32451:21;;;32508:2;32488:18;;;32481:30;-1:-1:-1;;;32542:2:1;32527:18;;32520:49;32601:2;32586:18;;32441:169::o;32615:340::-;32817:2;32799:21;;;32856:2;32836:18;;;32829:30;-1:-1:-1;;;32890:2:1;32875:18;;32868:46;32946:2;32931:18;;32789:166::o;32960:338::-;33162:2;33144:21;;;33201:2;33181:18;;;33174:30;-1:-1:-1;;;33235:2:1;33220:18;;33213:44;33289:2;33274:18;;33134:164::o;33303:332::-;33505:2;33487:21;;;33544:1;33524:18;;;33517:29;-1:-1:-1;;;33577:2:1;33562:18;;33555:39;33626:2;33611:18;;33477:158::o;33640:354::-;33842:2;33824:21;;;33881:2;33861:18;;;33854:30;33920:32;33915:2;33900:18;;33893:60;33985:2;33970:18;;33814:180::o;33999:336::-;34201:2;34183:21;;;34240:2;34220:18;;;34213:30;-1:-1:-1;;;34274:2:1;34259:18;;34252:42;34326:2;34311:18;;34173:162::o;34340:332::-;34542:2;34524:21;;;34581:1;34561:18;;;34554:29;-1:-1:-1;;;34614:2:1;34599:18;;34592:39;34663:2;34648:18;;34514:158::o;34677:339::-;34879:2;34861:21;;;34918:2;34898:18;;;34891:30;-1:-1:-1;;;34952:2:1;34937:18;;34930:45;35007:2;34992:18;;34851:165::o;35021:337::-;35223:2;35205:21;;;35262:2;35242:18;;;35235:30;-1:-1:-1;;;35296:2:1;35281:18;;35274:43;35349:2;35334:18;;35195:163::o;35363:335::-;35565:2;35547:21;;;35604:2;35584:18;;;35577:30;-1:-1:-1;;;35638:2:1;35623:18;;35616:41;35689:2;35674:18;;35537:161::o;35703:339::-;35905:2;35887:21;;;35944:2;35924:18;;;35917:30;-1:-1:-1;;;35978:2:1;35963:18;;35956:45;36033:2;36018:18;;35877:165::o;36047:351::-;36249:2;36231:21;;;36288:2;36268:18;;;36261:30;36327:29;36322:2;36307:18;;36300:57;36389:2;36374:18;;36221:177::o;36403:343::-;36605:2;36587:21;;;36644:2;36624:18;;;36617:30;-1:-1:-1;;;36678:2:1;36663:18;;36656:49;36737:2;36722:18;;36577:169::o;36751:332::-;36953:2;36935:21;;;36992:1;36972:18;;;36965:29;-1:-1:-1;;;37025:2:1;37010:18;;37003:39;37074:2;37059:18;;36925:158::o;37088:338::-;37290:2;37272:21;;;37329:2;37309:18;;;37302:30;-1:-1:-1;;;37363:2:1;37348:18;;37341:44;37417:2;37402:18;;37262:164::o;37431:338::-;37633:2;37615:21;;;37672:2;37652:18;;;37645:30;-1:-1:-1;;;37706:2:1;37691:18;;37684:44;37760:2;37745:18;;37605:164::o;37774:343::-;37976:2;37958:21;;;38015:2;37995:18;;;37988:30;-1:-1:-1;;;38049:2:1;38034:18;;38027:49;38108:2;38093:18;;37948:169::o;38122:340::-;38324:2;38306:21;;;38363:2;38343:18;;;38336:30;-1:-1:-1;;;38397:2:1;38382:18;;38375:46;38453:2;38438:18;;38296:166::o;38467:345::-;38669:2;38651:21;;;38708:2;38688:18;;;38681:30;-1:-1:-1;;;38742:2:1;38727:18;;38720:51;38803:2;38788:18;;38641:171::o;38817:345::-;39019:2;39001:21;;;39058:2;39038:18;;;39031:30;-1:-1:-1;;;39092:2:1;39077:18;;39070:51;39153:2;39138:18;;38991:171::o;39167:334::-;39369:2;39351:21;;;39408:2;39388:18;;;39381:30;-1:-1:-1;;;39442:2:1;39427:18;;39420:40;39492:2;39477:18;;39341:160::o;39506:341::-;39708:2;39690:21;;;39747:2;39727:18;;;39720:30;-1:-1:-1;;;39781:2:1;39766:18;;39759:47;39838:2;39823:18;;39680:167::o;39852:342::-;40054:2;40036:21;;;40093:2;40073:18;;;40066:30;-1:-1:-1;;;40127:2:1;40112:18;;40105:48;40185:2;40170:18;;40026:168::o;40199:653::-;40432:13;;-1:-1:-1;;;;;40428:39:1;40410:58;;40524:4;40512:17;;;40506:24;40484:20;;;40477:54;40587:4;40575:17;;;40569:24;40547:20;;;40540:54;40650:4;40638:17;;;40632:24;40610:20;;;40603:54;40713:4;40701:17;;;40695:24;40673:20;;;40666:54;40455:3;40764:17;;;40758:24;40736:20;;;40729:54;40839:4;40827:17;;;40821:24;40799:20;;;40792:54;;;;40397:3;40382:19;;40364:488::o;40857:1769::-;41143:3;41128:19;;41156:52;41132:9;41190:6;41156:52;:::i;:::-;41227:3;41239:52;41287:2;41276:9;41272:18;41263:6;41257:13;41239:52;:::i;:::-;41328:4;41320:6;41316:17;41310:24;41353:3;41392:2;41387;41376:9;41372:18;41365:30;41432:4;41424:6;41420:17;41414:24;41404:34;;41457:3;41496:2;41491;41480:9;41476:18;41469:30;41536:4;41528:6;41524:17;41518:24;41508:34;;41561:3;41600:2;41595;41584:9;41580:18;41573:30;41640:4;41632:6;41628:17;41622:24;41612:34;;41665:3;41704:2;41699;41688:9;41684:18;41677:30;41745:4;41737:6;41733:17;41727:24;41716:35;;41771:3;41811;41805;41794:9;41790:19;41783:32;41862:4;41854:6;41850:17;41844:24;41824:44;;41877:63;41935:3;41924:9;41920:19;41906:12;41877:63;:::i;:::-;41989:4;41981:6;41977:17;41971:24;41949:46;;42004:65;42064:3;42053:9;42049:19;42033:14;42004:65;:::i;:::-;42106:15;;;42100:22;;42131:65;42191:3;42176:19;;42100:22;42131:65;:::i;:::-;42245:2;42237:6;42233:15;42227:22;42205:44;;42258:65;42318:3;42307:9;42303:19;42287:14;42258:65;:::i;:::-;42372:2;42364:6;42360:15;42354:22;42332:44;;42385:54;42434:3;42423:9;42419:19;42403:14;42385:54;:::i;:::-;42482:15;;;42476:22;42470:3;42455:19;;42448:51;42542:15;;42536:22;42530:3;42515:19;;42508:51;42602:16;;;42596:23;42590:3;42575:19;;;42568:52;;;;-1:-1:-1;41110:1516:1;;;-1:-1:-1;;;;41110:1516:1:o;42631:780::-;42855:13;;42837:32;;42958:4;42946:17;;42940:24;42824:3;42809:19;;;42898:67;;;:::i;:::-;42974:53;43021:4;43010:9;43006:20;42992:12;42974:53;:::i;:::-;-1:-1:-1;43083:4:1;43071:17;;43065:24;43058:4;43043:20;;43036:54;43146:4;43134:17;;43128:24;43121:4;43106:20;;43099:54;43209:4;43197:17;;43191:24;43184:4;43169:20;;43162:54;43272:4;43260:17;;43254:24;43247:4;43232:20;;43225:54;43335:4;43323:17;;43317:24;43310:4;43295:20;;43288:54;43398:4;43386:17;;;43380:24;43373:4;43358:20;;;43351:54;42791:620;:::o;43416:663::-;43689:13;;-1:-1:-1;;;;;43685:22:1;;;43667:41;;43764:4;43752:17;;;43746:24;43724:20;;;43717:54;43831:4;43819:17;;;43813:24;43809:33;;43787:20;;;43780:63;43913:4;43901:17;;;43895:24;43888:32;43881:40;43859:20;;;43852:70;43992:4;43980:17;;;43974:24;43967:32;43960:40;43938:20;;;43931:70;43647:3;44049:17;;;44043:24;44039:33;44017:20;;;44010:63;;;;43616:3;43601:19;;43583:496::o;44084:177::-;44230:25;;;44218:2;44203:18;;44185:76::o;44266:784::-;;44614:6;44603:9;44596:25;44657:3;44652:2;44641:9;44637:18;44630:31;44684:47;44726:3;44715:9;44711:19;44703:6;44684:47;:::i;:::-;44762:9;44754:6;44750:22;44808:2;44803;44792:9;44788:18;44781:30;44835:1;44827:6;44820:17;-1:-1:-1;;;44865:2:1;44857:6;44853:15;44846:30;44920:2;44916;44912:11;44907:2;44896:9;44892:18;44885:39;;44941:43;44980:2;44972:6;44968:15;44960:6;44941:43;:::i;:::-;44933:51;;;45035:6;45028:14;45021:22;45015:3;45004:9;45000:19;44993:51;44586:464;;;;;;;:::o;45055:248::-;45229:25;;;45285:2;45270:18;;45263:34;45217:2;45202:18;;45184:119::o;45308:242::-;45378:2;45372:9;45408:17;;;-1:-1:-1;;;;;45440:34:1;;45476:22;;;45437:62;45434:2;;;45502:9;45434:2;45529;45522:22;45352:198;;-1:-1:-1;45352:198:1:o;45555:183::-;;-1:-1:-1;;;;;45646:6:1;45643:30;45640:2;;;45676:9;45640:2;-1:-1:-1;45727:4:1;45708:17;;;45704:28;;45630:108::o;45743:181::-;;-1:-1:-1;;;;;45818:6:1;45815:30;45812:2;;;45848:9;45812:2;-1:-1:-1;45907:2:1;45884:17;-1:-1:-1;;45880:31:1;45913:4;45876:42;;45802:122::o;45929:258::-;46001:1;46011:113;46025:6;46022:1;46019:13;46011:113;;;46101:11;;;46095:18;46082:11;;;46075:39;46047:2;46040:10;46011:113;;;46142:6;46139:1;46136:13;46133:2;;;-1:-1:-1;;46177:1:1;46159:16;;46152:27;45982:205::o;46192:122::-;46303:4;46287:21;;46268:46::o;46319:133::-;-1:-1:-1;;;;;46396:31:1;;46386:42;;46376:2;;46442:1;46439;46432:12;46457:120;46545:5;46538:13;46531:21;46524:5;46521:32;46511:2;;46567:1;46564;46557:12
Swarm Source
ipfs://d98942548d117adcfb74fc9c3961c809566e919169e0368dee4f72ddc9ad045f
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $2.25 | 2,571.6233 | $5,786.15 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.