More Info
Private Name Tags
ContractCreator
Multichain Info
Latest 25 from a total of 6,210 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Stake | 13951544 | 971 days ago | IN | 0 ETH | 0.00388362 | ||||
Stake | 13941449 | 972 days ago | IN | 0 ETH | 0.01092038 | ||||
Stake | 13941425 | 972 days ago | IN | 0 ETH | 0.01555196 | ||||
Stake | 13941347 | 972 days ago | IN | 0 ETH | 0.01447193 | ||||
Stake | 13941261 | 972 days ago | IN | 0 ETH | 0.01105351 | ||||
Stake | 13941224 | 972 days ago | IN | 0 ETH | 0.01439791 | ||||
Stake | 13941162 | 972 days ago | IN | 0 ETH | 0.01446249 | ||||
Stake | 13939972 | 973 days ago | IN | 0 ETH | 0.00871526 | ||||
Stake | 13939446 | 973 days ago | IN | 0 ETH | 0.00632309 | ||||
Stake | 13939378 | 973 days ago | IN | 0 ETH | 0.00761086 | ||||
Stake | 13939308 | 973 days ago | IN | 0 ETH | 0.00885389 | ||||
Stake | 13939253 | 973 days ago | IN | 0 ETH | 0.00447683 | ||||
Stake | 13939218 | 973 days ago | IN | 0 ETH | 0.00529715 | ||||
Stake | 13939105 | 973 days ago | IN | 0 ETH | 0.00934798 | ||||
Stake | 13939099 | 973 days ago | IN | 0 ETH | 0.00609762 | ||||
Stake | 13939092 | 973 days ago | IN | 0 ETH | 0.00696727 | ||||
Stake | 13939079 | 973 days ago | IN | 0 ETH | 0.00673405 | ||||
Stake | 13939068 | 973 days ago | IN | 0 ETH | 0.00908801 | ||||
Stake | 13939059 | 973 days ago | IN | 0 ETH | 0.00715952 | ||||
Stake | 13939043 | 973 days ago | IN | 0 ETH | 0.00835175 | ||||
Stake | 13939041 | 973 days ago | IN | 0 ETH | 0.00724011 | ||||
Stake | 13939019 | 973 days ago | IN | 0 ETH | 0.00848391 | ||||
Stake | 13938982 | 973 days ago | IN | 0 ETH | 0.00629626 | ||||
Stake | 13938979 | 973 days ago | IN | 0 ETH | 0.00706472 | ||||
Stake | 13938960 | 973 days ago | IN | 0 ETH | 0.00770923 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
13842373 | 988 days ago | 0.1 ETH | ||||
13842359 | 988 days ago | 0.1 ETH | ||||
13810085 | 993 days ago | 0.005 ETH | ||||
13806258 | 993 days ago | 0.001 ETH | ||||
13802484 | 994 days ago | 0.003 ETH | ||||
13802437 | 994 days ago | 0.001 ETH | ||||
13802360 | 994 days ago | 0.003 ETH | ||||
13802308 | 994 days ago | 0.0027 ETH | ||||
13802267 | 994 days ago | 0.0055 ETH | ||||
13802110 | 994 days ago | 0.005 ETH | ||||
13799618 | 994 days ago | 0.02 ETH | ||||
13799529 | 994 days ago | 0.1 ETH | ||||
13799147 | 994 days ago | 0.5 ETH | ||||
13799058 | 994 days ago | 0.00865222 ETH | ||||
13798772 | 994 days ago | 0.02599999 ETH | ||||
13798717 | 994 days ago | 0.001 ETH | ||||
13798706 | 994 days ago | 0.001 ETH | ||||
13798691 | 994 days ago | 0.001 ETH | ||||
13798687 | 994 days ago | 0.16 ETH | ||||
13798686 | 994 days ago | 0.02581971 ETH | ||||
13798677 | 994 days ago | 0.001 ETH | ||||
13798664 | 994 days ago | 0.001 ETH | ||||
13798651 | 994 days ago | 0.001 ETH | ||||
13798552 | 994 days ago | 0.001 ETH | ||||
13798489 | 995 days ago | 0.0279 ETH |
Loading...
Loading
Contract Name:
LiquidityMigration
Compiler Version
v0.8.2+commit.661d1103
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-12-10 */ //SPDX-License-Identifier: GPL-3.0-or-later pragma solidity >=0.6.0 <0.9.0; interface IERC20NonStandard { function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); 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 transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } interface IEstimator { function estimateItem( uint256 balance, address token ) external view returns (int256); } interface StrategyTypes { enum ItemCategory {BASIC, SYNTH, DEBT, RESERVE} enum EstimatorCategory { DEFAULT_ORACLE, CHAINLINK_ORACLE, UNISWAP_TWAP_ORACLE, SUSHI_TWAP_ORACLE, STRATEGY, BLOCKED, AAVE_V1, AAVE_V2, AAVE_DEBT, BALANCER, COMPOUND, CURVE, CURVE_GAUGE, SUSHI_LP, SUSHI_FARM, UNISWAP_V2_LP, UNISWAP_V3_LP, YEARN_V1, YEARN_V2 } enum TimelockCategory {RESTRUCTURE, THRESHOLD, REBALANCE_SLIPPAGE, RESTRUCTURE_SLIPPAGE, TIMELOCK, PERFORMANCE} struct StrategyItem { address item; int256 percentage; TradeData data; } struct TradeData { address[] adapters; address[] path; bytes cache; } struct InitialState { uint32 timelock; uint16 rebalanceThreshold; uint16 rebalanceSlippage; uint16 restructureSlippage; uint16 performanceFee; bool social; bool set; } struct StrategyState { uint32 timelock; uint16 rebalanceSlippage; uint16 restructureSlippage; bool social; bool set; } /** @notice A time lock requirement for changing the state of this Strategy @dev WARNING: Only one TimelockCategory can be pending at a time */ struct Timelock { TimelockCategory category; uint256 timestamp; bytes data; } } interface IWhitelist { function approve(address account) external; function revoke(address account) external; function approved(address account) external view returns (bool); } interface ITokenRegistry { function itemCategories(address token) external view returns (uint256); function estimatorCategories(address token) external view returns (uint256); function estimators(uint256 categoryIndex) external view returns (IEstimator); function getEstimator(address token) external view returns (IEstimator); function addEstimator(uint256 estimatorCategoryIndex, address estimator) external; function addItem(uint256 itemCategoryIndex, uint256 estimatorCategoryIndex, address token) external; } pragma experimental ABIEncoderV2; interface IOracle { function weth() external view returns (address); function susd() external view returns (address); function tokenRegistry() external view returns (ITokenRegistry); function estimateStrategy(IStrategy strategy) external view returns (uint256, int256[] memory); function estimateItem( uint256 balance, address token ) external view returns (int256); } interface IStrategyRouter { enum RouterCategory {GENERIC, LOOP, SYNTH, BATCH} function rebalance(address strategy, bytes calldata data) external; function restructure(address strategy, bytes calldata data) external; function deposit(address strategy, bytes calldata data) external; function withdraw(address strategy, bytes calldata) external; function controller() external view returns (IStrategyController); function category() external view returns (RouterCategory); } interface IAdapter { struct Call { address target; bytes callData; } function outputTokens(address inputToken) external view returns (address[] memory outputs); function encodeMigration(address _genericRouter, address _strategy, address _lp, uint256 _amount) external view returns (Call[] memory calls); function encodeWithdraw(address _lp, uint256 _amount) external view returns (Call[] memory calls); function buy(address _lp, address _exchange, uint256 _minAmountOut, uint256 _deadline) external payable; function getAmountOut(address _lp, address _exchange, uint256 _amountIn) external returns (uint256); function isWhitelisted(address _token) external view returns (bool); } /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } interface IStrategyProxyFactory is StrategyTypes{ function createStrategy( address manager, string memory name, string memory symbol, StrategyItem[] memory strategyItems, InitialState memory strategyInit, address router, bytes memory data ) external payable returns (address); function updateProxyVersion(address proxy) external; function implementation() external view returns (address); function controller() external view returns (address); function oracle() external view returns (address); function whitelist() external view returns (address); function pool() external view returns (address); function version() external view returns (string memory); function getManager(address proxy) external view returns (address); function salt(address manager, string memory name, string memory symbol) external pure returns (bytes32); } interface IStrategyToken is IERC20NonStandard { function increaseAllowance(address spender, uint256 addedValue) external returns (bool); function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool); function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; function nonces(address owner) external view returns (uint256); } interface IStrategy is IStrategyToken, StrategyTypes { function approveToken( address token, address account, uint256 amount ) external; function approveDebt( address token, address account, uint256 amount ) external; function approveSynths( address account, uint256 amount ) external; function setStructure(StrategyItem[] memory newItems) external; function setCollateral(address token) external; function withdrawAll(uint256 amount) external; function mint(address account, uint256 amount) external; function burn(address account, uint256 amount) external returns (uint256); function delegateSwap( address adapter, uint256 amount, address tokenIn, address tokenOut ) external; function settleSynths() external; function issueStreamingFee() external; function updateTokenValue(uint256 total, uint256 supply) external; function updatePerformanceFee(uint16 fee) external; function updateRebalanceThreshold(uint16 threshold) external; function updateTradeData(address item, TradeData memory data) external; function lock() external; function unlock() external; function locked() external view returns (bool); function items() external view returns (address[] memory); function synths() external view returns (address[] memory); function debt() external view returns (address[] memory); function rebalanceThreshold() external view returns (uint256); function performanceFee() external view returns (uint256); function getPercentage(address item) external view returns (int256); function getTradeData(address item) external view returns (TradeData memory); function getPerformanceFeeOwed(address account) external view returns (uint256); function controller() external view returns (address); function manager() external view returns (address); function oracle() external view returns (IOracle); function whitelist() external view returns (IWhitelist); function supportsSynths() external view returns (bool); } interface IStrategyController is StrategyTypes { function setupStrategy( address manager_, address strategy_, InitialState memory state_, address router_, bytes memory data_ ) external payable; function deposit( IStrategy strategy, IStrategyRouter router, uint256 amount, uint256 slippage, bytes memory data ) external payable; function withdrawETH( IStrategy strategy, IStrategyRouter router, uint256 amount, uint256 slippage, bytes memory data ) external; function withdrawWETH( IStrategy strategy, IStrategyRouter router, uint256 amount, uint256 slippage, bytes memory data ) external; function rebalance( IStrategy strategy, IStrategyRouter router, bytes memory data ) external; function restructure( IStrategy strategy, StrategyItem[] memory strategyItems ) external; function finalizeStructure( IStrategy strategy, IStrategyRouter router, bytes memory data ) external; function updateValue( IStrategy strategy, TimelockCategory category, uint256 newValue ) external; function finalizeValue(address strategy) external; function openStrategy(IStrategy strategy, uint256 fee) external; function setStrategy(IStrategy strategy) external; function initialized(address strategy) external view returns (bool); function strategyState(address strategy) external view returns (StrategyState memory); function verifyStructure(address strategy, StrategyItem[] memory newItems) external view returns (bool); function oracle() external view returns (IOracle); function whitelist() external view returns (IWhitelist); } /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function _setOwner(address owner_) internal { _owner = owner_; emit OwnershipTransferred(address(0), owner_); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } contract Timelocked is Ownable { uint256 public unlocked; // timestamp unlock migration uint256 public modify; // timestamp disallow changes /** * @dev Require unlock time met */ modifier onlyUnlocked() { require(block.timestamp >= unlocked, "Timelock#onlyUnlocked: not unlocked"); _; } /** * @dev Require modifier time not met */ modifier onlyModify() { require(block.timestamp < modify, "Timelock#onlyModify: cannot modify"); _; } constructor(uint256 unlock_, uint256 modify_, address owner_) { require(unlock_ > block.timestamp, 'Timelock#not greater'); unlocked = unlock_; modify = modify_; _setOwner(owner_); } function updateUnlock( uint256 unlock_ ) public onlyOwner onlyModify { unlocked = unlock_; } } contract LiquidityMigration is Timelocked, StrategyTypes { using SafeERC20 for IERC20; address public generic; address public controller; IStrategyProxyFactory public factory; mapping (address => bool) public adapters; mapping (address => uint256) public stakedCount; mapping (address => mapping (address => uint256)) public staked; mapping (address => bool) private _tempIsUnderlying; event Staked(address adapter, address strategy, uint256 amount, address account); event Migrated(address adapter, address lp, address strategy, address account); event Created(address adapter, address lp, address strategy, address account); event Refunded(address lp, uint256 amount, address account); /** * @dev Require adapter registered */ modifier onlyRegistered(address _adapter) { require(adapters[_adapter], "Claimable#onlyState: not registered adapter"); _; } /** * @dev Require adapter allows lp */ modifier onlyWhitelisted(address _adapter, address _lp) { require(IAdapter(_adapter).isWhitelisted(_lp), "Claimable#onlyState: not whitelisted strategy"); _; } constructor( address[] memory adapters_, address generic_, IStrategyProxyFactory factory_, address controller_, uint256 _unlock, uint256 _modify, address _owner ) Timelocked(_unlock, _modify, _owner) { for (uint256 i = 0; i < adapters_.length; i++) { adapters[adapters_[i]] = true; } generic = generic_; factory = factory_; controller = controller_; } function stake( address _lp, uint256 _amount, address _adapter ) public { IERC20(_lp).safeTransferFrom(msg.sender, address(this), _amount); _stake(_lp, _amount, _adapter); } function buyAndStake( address _lp, address _adapter, address _exchange, uint256 _minAmountOut, uint256 _deadline ) external payable { _buyAndStake(_lp, msg.value, _adapter, _exchange, _minAmountOut, _deadline); } function batchStake( address[] memory _lp, uint256[] memory _amount, address[] memory _adapter ) external { require(_lp.length == _amount.length, "LiquidityMigration#batchStake: not same length"); require(_amount.length == _adapter.length, "LiquidityMigration#batchStake: not same length"); for (uint256 i = 0; i < _lp.length; i++) { stake(_lp[i], _amount[i], _adapter[i]); } } function batchBuyAndStake( address[] memory _lp, uint256[] memory _amount, address[] memory _adapter, address[] memory _exchange, uint256[] memory _minAmountOut, uint256 _deadline ) external payable { require(_amount.length == _lp.length, "LiquidityMigration#batchBuyAndStake: not same length"); require(_adapter.length == _lp.length, "LiquidityMigration#batchBuyAndStake: not same length"); require(_exchange.length == _lp.length, "LiquidityMigration#batchBuyAndStake: not same length"); require(_minAmountOut.length == _lp.length, "LiquidityMigration#batchBuyAndStake: not same length"); uint256 total = 0; for (uint256 i = 0; i < _lp.length; i++) { total = total + _amount[i]; _buyAndStake(_lp[i], _amount[i], _adapter[i], _exchange[i], _minAmountOut[i], _deadline); } require(msg.value == total, "LiquidityMigration#batchBuyAndStake: incorrect amounts"); } function migrate( address _lp, address _adapter, IStrategy _strategy, uint256 _slippage ) external onlyUnlocked { _migrate(msg.sender, _lp, _adapter, _strategy, _slippage); } function migrate( address _user, address _lp, address _adapter, IStrategy _strategy, uint256 _slippage ) external onlyOwner onlyUnlocked { _migrate(_user, _lp, _adapter, _strategy, _slippage); } function batchMigrate( address[] memory _lp, address[] memory _adapter, IStrategy[] memory _strategy, uint256[] memory _slippage ) external onlyUnlocked { require(_lp.length == _adapter.length); require(_adapter.length == _strategy.length); for (uint256 i = 0; i < _lp.length; i++) { _migrate(msg.sender, _lp[i], _adapter[i], _strategy[i], _slippage[i]); } } function batchMigrate( address[] memory _user, address[] memory _lp, address[] memory _adapter, IStrategy[] memory _strategy, uint256[] memory _slippage ) external onlyOwner onlyUnlocked { require(_user.length == _lp.length); require(_lp.length == _adapter.length); require(_adapter.length == _strategy.length); for (uint256 i = 0; i < _lp.length; i++) { _migrate(_user[i], _lp[i], _adapter[i], _strategy[i], _slippage[i]); } } function refund( address _user, address _lp ) public onlyOwner { _refund(_user, _lp); } function batchRefund(address[] memory _users, address _lp) public onlyOwner { for (uint256 i = 0; i < _users.length; i++) { _refund(_users[i], _lp); } } function _refund( address _user, address _lp ) internal { uint256 _amount = staked[_user][_lp]; require(_amount > 0, 'LiquidityMigration#_refund: no stake'); delete staked[_user][_lp]; IERC20(_lp).safeTransfer(_user, _amount); emit Refunded(_lp, _amount, _user); } function _migrate( address _user, address _lp, address _adapter, IStrategy _strategy, uint256 _slippage ) internal onlyRegistered(_adapter) onlyWhitelisted(_adapter, _lp) { require( IStrategyController(controller).initialized(address(_strategy)), "LiquidityMigration#_migrate: not enso strategy" ); uint256 _stakeAmount = staked[_user][_lp]; require(_stakeAmount > 0, "LiquidityMigration#_migrate: not staked"); delete staked[_user][_lp]; IERC20(_lp).safeTransfer(generic, _stakeAmount); uint256 _before = _strategy.balanceOf(address(this)); bytes memory migrationData = abi.encode(IAdapter(_adapter).encodeMigration(generic, address(_strategy), _lp, _stakeAmount)); IStrategyController(controller).deposit(_strategy, IStrategyRouter(generic), 0, _slippage, migrationData); uint256 _after = _strategy.balanceOf(address(this)); _strategy.transfer(_user, (_after - _before)); emit Migrated(_adapter, _lp, address(_strategy), _user); } function _stake( address _lp, uint256 _amount, address _adapter ) internal onlyRegistered(_adapter) onlyWhitelisted(_adapter, _lp) { staked[msg.sender][_lp] += _amount; stakedCount[_adapter] += 1; emit Staked(_adapter, _lp, _amount, msg.sender); } function _buyAndStake( address _lp, uint256 _amount, address _adapter, address _exchange, uint256 _minAmountOut, uint256 _deadline ) internal { uint256 balanceBefore = IERC20(_lp).balanceOf(address(this)); IAdapter(_adapter).buy{value: _amount}(_lp, _exchange, _minAmountOut, _deadline); uint256 amountAdded = IERC20(_lp).balanceOf(address(this)) - balanceBefore; _stake(_lp, amountAdded, _adapter); } function createStrategy( address _lp, address _adapter, bytes calldata data ) public onlyRegistered(_adapter) onlyWhitelisted(_adapter, _lp) { ( , , , StrategyItem[] memory strategyItems, , , ) = abi.decode( data, (address, string, string, StrategyItem[], InitialState, address, bytes) ); _validateItems(_adapter, _lp, strategyItems); address strategy = _createStrategy(data); emit Created(_adapter, _lp, strategy, msg.sender); } function updateController(address _controller) external onlyOwner { require(controller != _controller, "LiquidityMigration#updateController: already exists"); controller = _controller; } function updateGeneric(address _generic) external onlyOwner { require(generic != _generic, "LiquidityMigration#updateGeneric: already exists"); generic = _generic; } function updateFactory(address _factory) external onlyOwner { require(factory != IStrategyProxyFactory(_factory), "LiquidityMigration#updateFactory: already exists"); factory = IStrategyProxyFactory(_factory); } function addAdapter(address _adapter) external onlyOwner { require(!adapters[_adapter], "LiquidityMigration#updateAdapter: already exists"); adapters[_adapter] = true; } function removeAdapter(address _adapter) external onlyOwner { require(adapters[_adapter], "LiquidityMigration#updateAdapter: does not exist"); adapters[_adapter] = false; } function hasStaked(address _account, address _lp) external view returns(bool) { return staked[_account][_lp] > 0; } function getStakeCount(address _adapter) external view returns(uint256) { return stakedCount[_adapter]; } function _validateItems(address adapter, address lp, StrategyItem[] memory strategyItems) private { address[] memory underlyingTokens = IAdapter(adapter).outputTokens(lp); for (uint i = 0; i < underlyingTokens.length; i++) { _tempIsUnderlying[underlyingTokens[i]] = true; } uint256 total = strategyItems.length; for (uint i = 0; i < strategyItems.length; i++) { // Strategies may have reserve tokens (such as weth) that don't have value // So we must be careful not to invalidate a strategy for having them if (!_tempIsUnderlying[strategyItems[i].item]) { if (strategyItems[i].percentage == 0) { total--; } else { revert("LiquidityMigration#createStrategy: incorrect length"); } } else { // Otherwise just remove the cached bool after we've checked it delete _tempIsUnderlying[strategyItems[i].item]; } } // If there are some cached bools that have not been deleted then this check will cause a revert require(total == underlyingTokens.length, "LiquidityMigration#createStrategy: does not exist"); } function _createStrategy(bytes memory data) private returns (address) { ( address manager, string memory name, string memory symbol, StrategyItem[] memory strategyItems, InitialState memory strategyState, address router, bytes memory depositData ) = abi.decode( data, (address, string, string, StrategyItem[], InitialState, address, bytes) ); return factory.createStrategy( manager, name, symbol, strategyItems, strategyState, router, depositData ); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address[]","name":"adapters_","type":"address[]"},{"internalType":"address","name":"generic_","type":"address"},{"internalType":"contract IStrategyProxyFactory","name":"factory_","type":"address"},{"internalType":"address","name":"controller_","type":"address"},{"internalType":"uint256","name":"_unlock","type":"uint256"},{"internalType":"uint256","name":"_modify","type":"uint256"},{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"adapter","type":"address"},{"indexed":false,"internalType":"address","name":"lp","type":"address"},{"indexed":false,"internalType":"address","name":"strategy","type":"address"},{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Created","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"adapter","type":"address"},{"indexed":false,"internalType":"address","name":"lp","type":"address"},{"indexed":false,"internalType":"address","name":"strategy","type":"address"},{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Migrated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"lp","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Refunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"adapter","type":"address"},{"indexed":false,"internalType":"address","name":"strategy","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Staked","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"adapters","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_adapter","type":"address"}],"name":"addAdapter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_lp","type":"address[]"},{"internalType":"uint256[]","name":"_amount","type":"uint256[]"},{"internalType":"address[]","name":"_adapter","type":"address[]"},{"internalType":"address[]","name":"_exchange","type":"address[]"},{"internalType":"uint256[]","name":"_minAmountOut","type":"uint256[]"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"batchBuyAndStake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_lp","type":"address[]"},{"internalType":"address[]","name":"_adapter","type":"address[]"},{"internalType":"contract IStrategy[]","name":"_strategy","type":"address[]"},{"internalType":"uint256[]","name":"_slippage","type":"uint256[]"}],"name":"batchMigrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_user","type":"address[]"},{"internalType":"address[]","name":"_lp","type":"address[]"},{"internalType":"address[]","name":"_adapter","type":"address[]"},{"internalType":"contract IStrategy[]","name":"_strategy","type":"address[]"},{"internalType":"uint256[]","name":"_slippage","type":"uint256[]"}],"name":"batchMigrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"},{"internalType":"address","name":"_lp","type":"address"}],"name":"batchRefund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_lp","type":"address[]"},{"internalType":"uint256[]","name":"_amount","type":"uint256[]"},{"internalType":"address[]","name":"_adapter","type":"address[]"}],"name":"batchStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lp","type":"address"},{"internalType":"address","name":"_adapter","type":"address"},{"internalType":"address","name":"_exchange","type":"address"},{"internalType":"uint256","name":"_minAmountOut","type":"uint256"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"buyAndStake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"controller","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_lp","type":"address"},{"internalType":"address","name":"_adapter","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"createStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"contract IStrategyProxyFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"generic","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_adapter","type":"address"}],"name":"getStakeCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"address","name":"_lp","type":"address"}],"name":"hasStaked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"address","name":"_lp","type":"address"},{"internalType":"address","name":"_adapter","type":"address"},{"internalType":"contract IStrategy","name":"_strategy","type":"address"},{"internalType":"uint256","name":"_slippage","type":"uint256"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lp","type":"address"},{"internalType":"address","name":"_adapter","type":"address"},{"internalType":"contract IStrategy","name":"_strategy","type":"address"},{"internalType":"uint256","name":"_slippage","type":"uint256"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"modify","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"address","name":"_lp","type":"address"}],"name":"refund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_adapter","type":"address"}],"name":"removeAdapter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lp","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_adapter","type":"address"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"staked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlocked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_controller","type":"address"}],"name":"updateController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_factory","type":"address"}],"name":"updateFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_generic","type":"address"}],"name":"updateGeneric","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"unlock_","type":"uint256"}],"name":"updateUnlock","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620043a4380380620043a48339810160408190526200003491620001ce565b8282824283116200008b5760405162461bcd60e51b815260206004820152601460248201527f54696d656c6f636b236e6f742067726561746572000000000000000000000000604482015260640160405180910390fd5b60018390556002829055620000a08162000166565b50505060005b87518110156200011e576001600660008a8481518110620000d757634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580620001158162000305565b915050620000a6565b5050600380546001600160a01b039687166001600160a01b03199182161790915560058054958716958216959095179094555050600480549190931691161790555062000343565b600080546001600160a01b0319166001600160a01b03831690811782556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350565b80516001600160a01b0381168114620001c957600080fd5b919050565b600080600080600080600060e0888a031215620001e9578283fd5b87516001600160401b038082111562000200578485fd5b818a0191508a601f83011262000214578485fd5b81516020828211156200022b576200022b6200032d565b808202604051601f19603f830116810181811086821117156200025257620002526200032d565b806040525080945083815282810194508286018f848489010111156200027657898afd5b8996505b84871015620002a3576200028e81620001b1565b8652600196909601959483019483016200027a565b509b50620002b590508c8201620001b1565b995050505050620002c960408901620001b1565b9450620002d960608901620001b1565b93506080880151925060a08801519150620002f760c08901620001b1565b905092959891949750929550565b60006000198214156200032657634e487b7160e01b81526011600452602481fd5b5060010190565b634e487b7160e01b600052604160045260246000fd5b61405180620003536000396000f3fe6080604052600436106101cd5760003560e01c806387ee7d10116100f7578063cf57ee6911610095578063f77c479111610064578063f77c47911461057e578063f8fd1bea1461059e578063fd0b22ce146105b1578063fea080bc146105d1576101cd565b8063cf57ee69146104ee578063d9f165dc1461050e578063e5711ffc1461052e578063f2fde38b1461055e576101cd565b806390eb830c116100d157806390eb830c14610456578063c45a015514610476578063c6d3afc914610496578063cb475dbf146104ce576101cd565b806387ee7d10146103d35780638da5cb5b1461040b57806390be186314610429576101cd565b806341073ab61161016f57806364cf33b81161013e57806364cf33b8146103645780636a5e265014610388578063715018a61461039e5780637b3d0556146103b3576101cd565b806341073ab6146102e4578063585cd34b146103045780635e30b8a61461032457806360d54d4114610344576101cd565b80631ae1bafd116101ab5780631ae1bafd146102715780632912f29414610291578063294091cd146102a457806334fcff0c146102c4576101cd565b806306cb5b66146101d257806310fe6877146101f457806312b3215614610214575b600080fd5b3480156101de57600080fd5b506101f26101ed36600461332c565b6105f1565b005b34801561020057600080fd5b506101f261020f366004613868565b610703565b34801561022057600080fd5b5061025c61022f366004613511565b6001600160a01b039182166000908152600860209081526040808320939094168252919091522054151590565b60405190151581526020015b60405180910390f35b34801561027d57600080fd5b506101f261028c366004613549565b61084b565b6101f261029f3660046135ac565b610910565b3480156102b057600080fd5b506101f26102bf3660046136e3565b61091e565b3480156102d057600080fd5b506101f26102df366004613693565b610943565b3480156102f057600080fd5b506101f26102ff366004613606565b6109b4565b34801561031057600080fd5b506101f261031f36600461332c565b610bf5565b34801561033057600080fd5b506101f261033f366004613511565b610cfe565b34801561035057600080fd5b506101f261035f36600461332c565b610d66565b34801561037057600080fd5b5061037a60025481565b604051908152602001610268565b34801561039457600080fd5b5061037a60015481565b3480156103aa57600080fd5b506101f2610e73565b3480156103bf57600080fd5b506101f26103ce36600461379c565b610f24565b3480156103df57600080fd5b506003546103f3906001600160a01b031681565b6040516001600160a01b039091168152602001610268565b34801561041757600080fd5b506000546001600160a01b03166103f3565b34801561043557600080fd5b5061037a61044436600461332c565b60076020526000908152604090205481565b34801561046257600080fd5b506101f2610471366004613910565b611077565b34801561048257600080fd5b506005546103f3906001600160a01b031681565b3480156104a257600080fd5b5061037a6104b1366004613511565b600860209081526000928352604080842090915290825290205481565b3480156104da57600080fd5b506101f26104e936600461332c565b611203565b3480156104fa57600080fd5b5061037a61050936600461332c565b611310565b34801561051a57600080fd5b506101f261052936600461332c565b61132f565b34801561053a57600080fd5b5061025c61054936600461332c565b60066020526000908152604090205460ff1681565b34801561056a57600080fd5b506101f261057936600461332c565b61143c565b34801561058a57600080fd5b506004546103f3906001600160a01b031681565b6101f26105ac366004613994565b61157a565b3480156105bd57600080fd5b506101f26105cc366004613757565b6118fa565b3480156105dd57600080fd5b506101f26105ec366004613b58565b6119a3565b6000546001600160a01b031633146106505760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6004546001600160a01b03828116911614156106d45760405162461bcd60e51b815260206004820152603360248201527f4c69717569646974794d6967726174696f6e23757064617465436f6e74726f6c60448201527f6c65723a20616c726561647920657869737473000000000000000000000000006064820152608401610647565b6004805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6001544210156107615760405162461bcd60e51b815260206004820152602360248201527f54696d656c6f636b236f6e6c79556e6c6f636b65643a206e6f7420756e6c6f636044820152621ad95960ea1b6064820152608401610647565b825184511461076f57600080fd5b815183511461077d57600080fd5b60005b845181101561084457610832338683815181106107ad57634e487b7160e01b600052603260045260246000fd5b60200260200101518684815181106107d557634e487b7160e01b600052603260045260246000fd5b60200260200101518685815181106107fd57634e487b7160e01b600052603260045260246000fd5b602002602001015186868151811061082557634e487b7160e01b600052603260045260246000fd5b6020026020010151611a79565b8061083c81613f8c565b915050610780565b5050505050565b6000546001600160a01b031633146108a55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610647565b6001544210156109035760405162461bcd60e51b815260206004820152602360248201527f54696d656c6f636b236f6e6c79556e6c6f636b65643a206e6f7420756e6c6f636044820152621ad95960ea1b6064820152608401610647565b6108448585858585611a79565b61084485348686868661213b565b6109336001600160a01b0384163330856122e2565b61093e838383612393565b505050565b6001544210156109a15760405162461bcd60e51b815260206004820152602360248201527f54696d656c6f636b236f6e6c79556e6c6f636b65643a206e6f7420756e6c6f636044820152621ad95960ea1b6064820152608401610647565b6109ae3385858585611a79565b50505050565b6001600160a01b038316600090815260066020526040902054839060ff16610a445760405162461bcd60e51b815260206004820152602b60248201527f436c61696d61626c65236f6e6c7953746174653a206e6f74207265676973746560448201527f72656420616461707465720000000000000000000000000000000000000000006064820152608401610647565b604051633af32abf60e01b81526001600160a01b03808716600483015285918791831690633af32abf9060240160206040518083038186803b158015610a8957600080fd5b505afa158015610a9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac19190613b3c565b610b335760405162461bcd60e51b815260206004820152602d60248201527f436c61696d61626c65236f6e6c7953746174653a206e6f742077686974656c6960448201527f73746564207374726174656779000000000000000000000000000000000000006064820152608401610647565b6000610b4185870187613364565b5050509350505050610b548789836125d1565b6000610b9587878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506128d592505050565b604080516001600160a01b038b811682528c8116602083015283168183015233606082015290519192507f259b30ca39885c6d801a0b5dbc988640f3c25e2f37531fe138c5c5af8955d41b919081900360800190a1505050505050505050565b6000546001600160a01b03163314610c4f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610647565b6001600160a01b03811660009081526006602052604090205460ff16610cdd5760405162461bcd60e51b815260206004820152603060248201527f4c69717569646974794d6967726174696f6e237570646174654164617074657260448201527f3a20646f6573206e6f74206578697374000000000000000000000000000000006064820152608401610647565b6001600160a01b03166000908152600660205260409020805460ff19169055565b6000546001600160a01b03163314610d585760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610647565b610d6282826129b9565b5050565b6000546001600160a01b03163314610dc05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610647565b6001600160a01b03811660009081526006602052604090205460ff1615610e4f5760405162461bcd60e51b815260206004820152603060248201527f4c69717569646974794d6967726174696f6e237570646174654164617074657260448201527f3a20616c726561647920657869737473000000000000000000000000000000006064820152608401610647565b6001600160a01b03166000908152600660205260409020805460ff19166001179055565b6000546001600160a01b03163314610ecd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610647565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36000805473ffffffffffffffffffffffffffffffffffffffff19169055565b6000546001600160a01b03163314610f7e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610647565b600154421015610fdc5760405162461bcd60e51b815260206004820152602360248201527f54696d656c6f636b236f6e6c79556e6c6f636b65643a206e6f7420756e6c6f636044820152621ad95960ea1b6064820152608401610647565b8351855114610fea57600080fd5b8251845114610ff857600080fd5b815183511461100657600080fd5b60005b845181101561106f5761105d86828151811061103557634e487b7160e01b600052603260045260246000fd5b60200260200101518683815181106107ad57634e487b7160e01b600052603260045260246000fd5b8061106781613f8c565b915050611009565b505050505050565b81518351146110ee5760405162461bcd60e51b815260206004820152602e60248201527f4c69717569646974794d6967726174696f6e2362617463685374616b653a206e60448201527f6f742073616d65206c656e6774680000000000000000000000000000000000006064820152608401610647565b80518251146111655760405162461bcd60e51b815260206004820152602e60248201527f4c69717569646974794d6967726174696f6e2362617463685374616b653a206e60448201527f6f742073616d65206c656e6774680000000000000000000000000000000000006064820152608401610647565b60005b83518110156109ae576111f184828151811061119457634e487b7160e01b600052603260045260246000fd5b60200260200101518483815181106111bc57634e487b7160e01b600052603260045260246000fd5b60200260200101518484815181106111e457634e487b7160e01b600052603260045260246000fd5b602002602001015161091e565b806111fb81613f8c565b915050611168565b6000546001600160a01b0316331461125d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610647565b6003546001600160a01b03828116911614156112e15760405162461bcd60e51b815260206004820152603060248201527f4c69717569646974794d6967726174696f6e2375706461746547656e6572696360448201527f3a20616c726561647920657869737473000000000000000000000000000000006064820152608401610647565b6003805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6001600160a01b0381166000908152600760205260409020545b919050565b6000546001600160a01b031633146113895760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610647565b6005546001600160a01b038281169116141561140d5760405162461bcd60e51b815260206004820152603060248201527f4c69717569646974794d6967726174696f6e23757064617465466163746f727960448201527f3a20616c726561647920657869737473000000000000000000000000000000006064820152608401610647565b6005805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6000546001600160a01b031633146114965760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610647565b6001600160a01b0381166115125760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610647565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b85518551146115f15760405162461bcd60e51b815260206004820152603460248201527f4c69717569646974794d6967726174696f6e236261746368427579416e64537460448201527f616b653a206e6f742073616d65206c656e6774680000000000000000000000006064820152608401610647565b85518451146116685760405162461bcd60e51b815260206004820152603460248201527f4c69717569646974794d6967726174696f6e236261746368427579416e64537460448201527f616b653a206e6f742073616d65206c656e6774680000000000000000000000006064820152608401610647565b85518351146116df5760405162461bcd60e51b815260206004820152603460248201527f4c69717569646974794d6967726174696f6e236261746368427579416e64537460448201527f616b653a206e6f742073616d65206c656e6774680000000000000000000000006064820152608401610647565b85518251146117565760405162461bcd60e51b815260206004820152603460248201527f4c69717569646974794d6967726174696f6e236261746368427579416e64537460448201527f616b653a206e6f742073616d65206c656e6774680000000000000000000000006064820152608401610647565b6000805b875181101561187b5786818151811061178357634e487b7160e01b600052603260045260246000fd5b6020026020010151826117969190613f1a565b91506118698882815181106117bb57634e487b7160e01b600052603260045260246000fd5b60200260200101518883815181106117e357634e487b7160e01b600052603260045260246000fd5b602002602001015188848151811061180b57634e487b7160e01b600052603260045260246000fd5b602002602001015188858151811061183357634e487b7160e01b600052603260045260246000fd5b602002602001015188868151811061185b57634e487b7160e01b600052603260045260246000fd5b60200260200101518861213b565b8061187381613f8c565b91505061175a565b508034146118f15760405162461bcd60e51b815260206004820152603660248201527f4c69717569646974794d6967726174696f6e236261746368427579416e64537460448201527f616b653a20696e636f727265637420616d6f756e7473000000000000000000006064820152608401610647565b50505050505050565b6000546001600160a01b031633146119545760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610647565b60005b825181101561093e5761199183828151811061198357634e487b7160e01b600052603260045260246000fd5b6020026020010151836129b9565b8061199b81613f8c565b915050611957565b6000546001600160a01b031633146119fd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610647565b6002544210611a745760405162461bcd60e51b815260206004820152602260248201527f54696d656c6f636b236f6e6c794d6f646966793a2063616e6e6f74206d6f646960448201527f66790000000000000000000000000000000000000000000000000000000000006064820152608401610647565b600155565b6001600160a01b038316600090815260066020526040902054839060ff16611b095760405162461bcd60e51b815260206004820152602b60248201527f436c61696d61626c65236f6e6c7953746174653a206e6f74207265676973746560448201527f72656420616461707465720000000000000000000000000000000000000000006064820152608401610647565b604051633af32abf60e01b81526001600160a01b03808716600483015285918791831690633af32abf9060240160206040518083038186803b158015611b4e57600080fd5b505afa158015611b62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b869190613b3c565b611bf85760405162461bcd60e51b815260206004820152602d60248201527f436c61696d61626c65236f6e6c7953746174653a206e6f742077686974656c6960448201527f73746564207374726174656779000000000000000000000000000000000000006064820152608401610647565b600480546040517fcbca47db0000000000000000000000000000000000000000000000000000000081526001600160a01b038881169382019390935291169063cbca47db9060240160206040518083038186803b158015611c5857600080fd5b505afa158015611c6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c909190613b3c565b611d025760405162461bcd60e51b815260206004820152602e60248201527f4c69717569646974794d6967726174696f6e235f6d6967726174653a206e6f7460448201527f20656e736f2073747261746567790000000000000000000000000000000000006064820152608401610647565b6001600160a01b038089166000908152600860209081526040808320938b168352929052205480611d9b5760405162461bcd60e51b815260206004820152602760248201527f4c69717569646974794d6967726174696f6e235f6d6967726174653a206e6f7460448201527f207374616b6564000000000000000000000000000000000000000000000000006064820152608401610647565b6001600160a01b03808a1660009081526008602090815260408083208c85168085529252822091909155600354611dd3921683612ad4565b6040516370a0823160e01b81523060048201526000906001600160a01b038816906370a082319060240160206040518083038186803b158015611e1557600080fd5b505afa158015611e29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e4d9190613b70565b6003546040517fa9b298610000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015289821660248201528b8216604482015260648101859052919250600091908a169063a9b298619060840160006040518083038186803b158015611ec857600080fd5b505afa158015611edc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611f049190810190613a68565b604051602001611f149190613dba565b60408051808303601f1901815290829052600480546003547f71b8dc690000000000000000000000000000000000000000000000000000000085529294506001600160a01b03908116936371b8dc6993611f7b938e93909116916000918e91899101613e52565b600060405180830381600087803b158015611f9557600080fd5b505af1158015611fa9573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600092506001600160a01b038b1691506370a082319060240160206040518083038186803b158015611fef57600080fd5b505afa158015612003573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120279190613b70565b90506001600160a01b03891663a9059cbb8d6120438685613f32565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156120a157600080fd5b505af11580156120b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120d99190613b3c565b50604080516001600160a01b038c811682528d811660208301528b8116828401528e16606082015290517f415f0af8f5b6deaac4fa61971b0153fa777da7c922b5f0031947b017bd0658d19181900360800190a1505050505050505050505050565b6040516370a0823160e01b81523060048201526000906001600160a01b038816906370a082319060240160206040518083038186803b15801561217d57600080fd5b505afa158015612191573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121b59190613b70565b6040517fa9d424e20000000000000000000000000000000000000000000000000000000081526001600160a01b038981166004830152868116602483015260448201869052606482018590529192509086169063a9d424e29088906084016000604051808303818588803b15801561222c57600080fd5b505af1158015612240573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600093508492506001600160a01b038b1691506370a082319060240160206040518083038186803b15801561228957600080fd5b505afa15801561229d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122c19190613b70565b6122cb9190613f32565b90506122d8888288612393565b5050505050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526109ae9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612b1d565b6001600160a01b038116600090815260066020526040902054819060ff166124235760405162461bcd60e51b815260206004820152602b60248201527f436c61696d61626c65236f6e6c7953746174653a206e6f74207265676973746560448201527f72656420616461707465720000000000000000000000000000000000000000006064820152608401610647565b604051633af32abf60e01b81526001600160a01b03808616600483015283918691831690633af32abf9060240160206040518083038186803b15801561246857600080fd5b505afa15801561247c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a09190613b3c565b6125125760405162461bcd60e51b815260206004820152602d60248201527f436c61696d61626c65236f6e6c7953746174653a206e6f742077686974656c6960448201527f73746564207374726174656779000000000000000000000000000000000000006064820152608401610647565b3360009081526008602090815260408083206001600160a01b038a16845290915281208054879290612545908490613f1a565b90915550506001600160a01b0384166000908152600760205260408120805460019290612573908490613f1a565b9091555050604080516001600160a01b038087168252881660208201529081018690523360608201527f751f7c1e1facd3028e03b5a9e2e34e63fb2f229f99b85eec19864b950ac671d09060800160405180910390a1505050505050565b6040517f51ecd2fa0000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152600091908516906351ecd2fa9060240160006040518083038186803b15801561262f57600080fd5b505afa158015612643573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261266b9190810190613724565b905060005b81518110156126e35760016009600084848151811061269f57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806126db81613f8c565b915050612670565b50815160005b835181101561285e576009600085838151811061271657634e487b7160e01b600052603260045260246000fd5b602090810291909101810151516001600160a01b031682528101919091526040016000205460ff166127fb5783818151811061276257634e487b7160e01b600052603260045260246000fd5b60200260200101516020015160001415612788578161278081613f75565b9250506127f6565b60405162461bcd60e51b815260206004820152603360248201527f4c69717569646974794d6967726174696f6e236372656174655374726174656760448201527f793a20696e636f7272656374206c656e677468000000000000000000000000006064820152608401610647565b61284c565b6009600085838151811061281f57634e487b7160e01b600052603260045260246000fd5b602090810291909101810151516001600160a01b03168252810191909152604001600020805460ff191690555b8061285681613f8c565b9150506126e9565b50815181146108445760405162461bcd60e51b815260206004820152603160248201527f4c69717569646974794d6967726174696f6e236372656174655374726174656760448201527f793a20646f6573206e6f742065786973740000000000000000000000000000006064820152608401610647565b600080600080600080600080888060200190518101906128f59190613442565b6005546040517f2016d1f9000000000000000000000000000000000000000000000000000000008152979e50959c50939a509198509650945092506001600160a01b031690632016d1f99061295a908a908a908a908a908a908a908a90600401613c13565b602060405180830381600087803b15801561297457600080fd5b505af1158015612988573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129ac9190613348565b9998505050505050505050565b6001600160a01b0380831660009081526008602090815260408083209385168352929052205480612a515760405162461bcd60e51b8152602060048201526024808201527f4c69717569646974794d6967726174696f6e235f726566756e643a206e6f207360448201527f74616b65000000000000000000000000000000000000000000000000000000006064820152608401610647565b6001600160a01b03808416600090815260086020908152604080832093861680845293909152812055612a85908483612ad4565b604080516001600160a01b0384811682526020820184905285168183015290517fb44b3631755227290f8fbd7b248fa4be405129d15351313e3c332a3fb99194179181900360600190a1505050565b6040516001600160a01b03831660248201526044810182905261093e9084907fa9059cbb000000000000000000000000000000000000000000000000000000009060640161232f565b6000612b72826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612c029092919063ffffffff16565b80519091501561093e5780806020019051810190612b909190613b3c565b61093e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610647565b6060612c118484600085612c1b565b90505b9392505050565b606082471015612c935760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610647565b843b612ce15760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610647565b600080866001600160a01b03168587604051612cfd9190613bf7565b60006040518083038185875af1925050503d8060008114612d3a576040519150601f19603f3d011682016040523d82523d6000602084013e612d3f565b606091505b5091509150612d4f828286612d5a565b979650505050505050565b60608315612d69575081612c14565b825115612d795782518084602001fd5b8160405162461bcd60e51b81526004016106479190613e8a565b803561132a81613fd3565b805161132a81613fd3565b600082601f830112612db9578081fd5b81356020612dce612dc983613ece565b613e9d565b8281528181019085830183850287018401881015612dea578586fd5b855b85811015612e11578135612dff81613fd3565b84529284019290840190600101612dec565b5090979650505050505050565b600082601f830112612e2e578081fd5b81516020612e3e612dc983613ece565b8281528181019085830183850287018401881015612e5a578586fd5b855b85811015612e11578151612e6f81613fd3565b84529284019290840190600101612e5c565b600082601f830112612e91578081fd5b6020612ea0612dc98435613ece565b8335815281810190828501845b8635811015612fb75781358701601f19606081838c03011215612ece578788fd5b612ed86060613e9d565b87830135612ee581613fd3565b8152604083013588820152606083013567ffffffffffffffff80821115612f0a578a8bfd5b938101936060858e0385011215612f1f578a8bfd5b612f296060613e9d565b935089850135915080821115612f3d578a8bfd5b612f4b8d8b84880101612da9565b84526040850135915080821115612f60578a8bfd5b612f6e8d8b84880101612da9565b8a8501526060850135915080821115612f85578a8bfd5b50612f948c8a8387010161315c565b604084810191909152820192909252865250509284019290840190600101612ead565b50909695505050505050565b600082601f830112612fd3578081fd5b8151612fe1612dc982613ece565b818152602080820191908501845b84811015612fb75781518701601f19606081838c0301121561300f578788fd5b6130196060613e9d565b602083015161302781613fd3565b815260408301516020820152606083015167ffffffffffffffff8082111561304d578a8bfd5b938101936060858e0385011215613062578a8bfd5b61306c6060613e9d565b93506020850151915080821115613081578a8bfd5b6130908d602084880101612e1e565b845260408501519150808211156130a5578a8bfd5b6130b48d602084880101612e1e565b602085015260608501519150808211156130cc578a8bfd5b506130dc8c6020838701016131a8565b604084810191909152820192909252865250506020938401939190910190600101612fef565b600082601f830112613112578081fd5b81356020613122612dc983613ece565b828152818101908583018385028701840188101561313e578586fd5b855b85811015612e1157813584529284019290840190600101613140565b600082601f83011261316c578081fd5b813561317a612dc982613ef2565b81815284602083860101111561318e578283fd5b816020850160208301379081016020019190915292915050565b600082601f8301126131b8578081fd5b81516131c6612dc982613ef2565b8181528460208386010111156131da578283fd5b6131eb826020830160208701613f49565b949350505050565b600060e08284031215613204578081fd5b61320e60e0613e9d565b9050813561321b81614009565b8152602082013561322b81613ff9565b6020820152604082013561323e81613ff9565b6040820152606082013561325181613ff9565b6060820152608082013561326481613ff9565b608082015260a082013561327781613feb565b60a082015260c082013561328a81613feb565b60c082015292915050565b600060e082840312156132a6578081fd5b6132b060e0613e9d565b905081516132bd81614009565b815260208201516132cd81613ff9565b602082015260408201516132e081613ff9565b604082015260608201516132f381613ff9565b6060820152608082015161330681613ff9565b608082015260a082015161331981613feb565b60a082015260c082015161328a81613feb565b60006020828403121561333d578081fd5b8135612c1481613fd3565b600060208284031215613359578081fd5b8151612c1481613fd3565b60008060008060008060006101a0888a03121561337f578283fd5b61338888612d93565b9650602088013567ffffffffffffffff808211156133a4578485fd5b6133b08b838c0161315c565b975060408a01359150808211156133c5578485fd5b6133d18b838c0161315c565b965060608a01359150808211156133e6578485fd5b6133f28b838c01612e81565b95506134018b60808c016131f3565b94506134106101608b01612d93565b93506101808a0135915080821115613426578283fd5b506134338a828b0161315c565b91505092959891949750929550565b60008060008060008060006101a0888a03121561345d578081fd5b61346688612d9e565b9650602088015167ffffffffffffffff80821115613482578283fd5b61348e8b838c016131a8565b975060408a01519150808211156134a3578283fd5b6134af8b838c016131a8565b965060608a01519150808211156134c4578283fd5b6134d08b838c01612fc3565b95506134df8b60808c01613295565b94506134ee6101608b01612d9e565b93506101808a0151915080821115613504578283fd5b506134338a828b016131a8565b60008060408385031215613523578182fd5b823561352e81613fd3565b9150602083013561353e81613fd3565b809150509250929050565b600080600080600060a08688031215613560578283fd5b853561356b81613fd3565b9450602086013561357b81613fd3565b9350604086013561358b81613fd3565b9250606086013561359b81613fd3565b949793965091946080013592915050565b600080600080600060a086880312156135c3578283fd5b85356135ce81613fd3565b945060208601356135de81613fd3565b935060408601356135ee81613fd3565b94979396509394606081013594506080013592915050565b6000806000806060858703121561361b578182fd5b843561362681613fd3565b9350602085013561363681613fd3565b9250604085013567ffffffffffffffff80821115613652578384fd5b818701915087601f830112613665578384fd5b813581811115613673578485fd5b886020828501011115613684578485fd5b95989497505060200194505050565b600080600080608085870312156136a8578182fd5b84356136b381613fd3565b935060208501356136c381613fd3565b925060408501356136d381613fd3565b9396929550929360600135925050565b6000806000606084860312156136f7578081fd5b833561370281613fd3565b925060208401359150604084013561371981613fd3565b809150509250925092565b600060208284031215613735578081fd5b815167ffffffffffffffff81111561374b578182fd5b6131eb84828501612e1e565b60008060408385031215613769578182fd5b823567ffffffffffffffff81111561377f578283fd5b61378b85828601612da9565b925050602083013561353e81613fd3565b600080600080600060a086880312156137b3578283fd5b853567ffffffffffffffff808211156137ca578485fd5b6137d689838a01612da9565b965060208801359150808211156137eb578485fd5b6137f789838a01612da9565b9550604088013591508082111561380c578485fd5b61381889838a01612da9565b9450606088013591508082111561382d578283fd5b61383989838a01612da9565b9350608088013591508082111561384e578283fd5b5061385b88828901613102565b9150509295509295909350565b6000806000806080858703121561387d578182fd5b843567ffffffffffffffff80821115613894578384fd5b6138a088838901612da9565b955060208701359150808211156138b5578384fd5b6138c188838901612da9565b945060408701359150808211156138d6578384fd5b6138e288838901612da9565b935060608701359150808211156138f7578283fd5b5061390487828801613102565b91505092959194509250565b600080600060608486031215613924578081fd5b833567ffffffffffffffff8082111561393b578283fd5b61394787838801612da9565b9450602086013591508082111561395c578283fd5b61396887838801613102565b9350604086013591508082111561397d578283fd5b5061398a86828701612da9565b9150509250925092565b60008060008060008060c087890312156139ac578384fd5b863567ffffffffffffffff808211156139c3578586fd5b6139cf8a838b01612da9565b975060208901359150808211156139e4578586fd5b6139f08a838b01613102565b96506040890135915080821115613a05578586fd5b613a118a838b01612da9565b95506060890135915080821115613a26578384fd5b613a328a838b01612da9565b94506080890135915080821115613a47578384fd5b50613a5489828a01613102565b92505060a087013590509295509295509295565b60006020808385031215613a7a578182fd5b825167ffffffffffffffff80821115613a91578384fd5b818501915085601f830112613aa4578384fd5b8151613ab2612dc982613ece565b81815284810190848601875b84811015613b2d5781518701604080601f19838f03011215613ade578a8bfd5b613ae781613e9d565b8a830151613af481613fd3565b8152908201519088821115613b07578b8cfd5b613b158e8c848601016131a8565b818c0152865250509287019290870190600101613abe565b50909998505050505050505050565b600060208284031215613b4d578081fd5b8151612c1481613feb565b600060208284031215613b69578081fd5b5035919050565b600060208284031215613b81578081fd5b5051919050565b6000815180845260208085019450808401835b83811015613bc05781516001600160a01b031687529582019590820190600101613b9b565b509495945050505050565b60008151808452613be3816020860160208601613f49565b601f01601f19169290920160200192915050565b60008251613c09818460208701613f49565b9190910192915050565b60006101a06001600160a01b03808b16845260208281860152613c388386018c613bcb565b9250604085840381870152613c4d848c613bcb565b9350606086850381880152848b51808752848701915084858202880101858e01895b83811015613d1b57898303601f19018552815180518a16845288810151898501528701518784018790528051878501889052613cae60c0860182613b88565b9050898201517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa080878403016080880152613ce98383613b88565b92508a8401519350808784030160a08801525050613d078183613bcb565b968a01969450505090870190600101613c6f565b5050613d8160808b018e63ffffffff8151168252602081015161ffff8082166020850152806040840151166040850152806060840151166060850152806080840151166080850152505060a0810151151560a083015260c0810151151560c08301525050565b6001600160a01b038c166101608b01528981036101808b0152613da4818c613bcb565b9850505050505050505098975050505050505050565b60208082528251828201819052600091906040908185019080840286018301878501865b83811015613e44578883037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0018552815180516001600160a01b03168452870151878401879052613e3187850182613bcb565b9588019593505090860190600101613dde565b509098975050505050505050565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a06080830152612d4f60a0830184613bcb565b600060208252612c146020830184613bcb565b604051601f8201601f1916810167ffffffffffffffff81118282101715613ec657613ec6613fbd565b604052919050565b600067ffffffffffffffff821115613ee857613ee8613fbd565b5060209081020190565b600067ffffffffffffffff821115613f0c57613f0c613fbd565b50601f01601f191660200190565b60008219821115613f2d57613f2d613fa7565b500190565b600082821015613f4457613f44613fa7565b500390565b60005b83811015613f64578181015183820152602001613f4c565b838111156109ae5750506000910152565b600081613f8457613f84613fa7565b506000190190565b6000600019821415613fa057613fa0613fa7565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114613fe857600080fd5b50565b8015158114613fe857600080fd5b61ffff81168114613fe857600080fd5b63ffffffff81168114613fe857600080fdfea2646970667358221220814b03edae956f9b21eea6d3058f3302626f767295a322ba00af7ac8f53a179464736f6c6343000802003300000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061d7790affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000058ce791454e62f6a5392706745cd863a4f1f52ac00000000000000000000000000000000000000000000000000000000000000060000000000000000000000005f2c716d912ce400a8a49fb87db722e8257257a7000000000000000000000000e149b1f2ef564a289dc094215835f3c8df1695aa0000000000000000000000008f516c0fb0bcf44cfc8d42d60dad3e4cdb35ce260000000000000000000000009c9326c521895c78414bd3c2945e47afc4ef16cc000000000000000000000000ae6859311c341bac4e0bceca0242247c16718ff10000000000000000000000000a883a62660328ead442eb6c2311668ba9c12e57
Deployed Bytecode
0x6080604052600436106101cd5760003560e01c806387ee7d10116100f7578063cf57ee6911610095578063f77c479111610064578063f77c47911461057e578063f8fd1bea1461059e578063fd0b22ce146105b1578063fea080bc146105d1576101cd565b8063cf57ee69146104ee578063d9f165dc1461050e578063e5711ffc1461052e578063f2fde38b1461055e576101cd565b806390eb830c116100d157806390eb830c14610456578063c45a015514610476578063c6d3afc914610496578063cb475dbf146104ce576101cd565b806387ee7d10146103d35780638da5cb5b1461040b57806390be186314610429576101cd565b806341073ab61161016f57806364cf33b81161013e57806364cf33b8146103645780636a5e265014610388578063715018a61461039e5780637b3d0556146103b3576101cd565b806341073ab6146102e4578063585cd34b146103045780635e30b8a61461032457806360d54d4114610344576101cd565b80631ae1bafd116101ab5780631ae1bafd146102715780632912f29414610291578063294091cd146102a457806334fcff0c146102c4576101cd565b806306cb5b66146101d257806310fe6877146101f457806312b3215614610214575b600080fd5b3480156101de57600080fd5b506101f26101ed36600461332c565b6105f1565b005b34801561020057600080fd5b506101f261020f366004613868565b610703565b34801561022057600080fd5b5061025c61022f366004613511565b6001600160a01b039182166000908152600860209081526040808320939094168252919091522054151590565b60405190151581526020015b60405180910390f35b34801561027d57600080fd5b506101f261028c366004613549565b61084b565b6101f261029f3660046135ac565b610910565b3480156102b057600080fd5b506101f26102bf3660046136e3565b61091e565b3480156102d057600080fd5b506101f26102df366004613693565b610943565b3480156102f057600080fd5b506101f26102ff366004613606565b6109b4565b34801561031057600080fd5b506101f261031f36600461332c565b610bf5565b34801561033057600080fd5b506101f261033f366004613511565b610cfe565b34801561035057600080fd5b506101f261035f36600461332c565b610d66565b34801561037057600080fd5b5061037a60025481565b604051908152602001610268565b34801561039457600080fd5b5061037a60015481565b3480156103aa57600080fd5b506101f2610e73565b3480156103bf57600080fd5b506101f26103ce36600461379c565b610f24565b3480156103df57600080fd5b506003546103f3906001600160a01b031681565b6040516001600160a01b039091168152602001610268565b34801561041757600080fd5b506000546001600160a01b03166103f3565b34801561043557600080fd5b5061037a61044436600461332c565b60076020526000908152604090205481565b34801561046257600080fd5b506101f2610471366004613910565b611077565b34801561048257600080fd5b506005546103f3906001600160a01b031681565b3480156104a257600080fd5b5061037a6104b1366004613511565b600860209081526000928352604080842090915290825290205481565b3480156104da57600080fd5b506101f26104e936600461332c565b611203565b3480156104fa57600080fd5b5061037a61050936600461332c565b611310565b34801561051a57600080fd5b506101f261052936600461332c565b61132f565b34801561053a57600080fd5b5061025c61054936600461332c565b60066020526000908152604090205460ff1681565b34801561056a57600080fd5b506101f261057936600461332c565b61143c565b34801561058a57600080fd5b506004546103f3906001600160a01b031681565b6101f26105ac366004613994565b61157a565b3480156105bd57600080fd5b506101f26105cc366004613757565b6118fa565b3480156105dd57600080fd5b506101f26105ec366004613b58565b6119a3565b6000546001600160a01b031633146106505760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6004546001600160a01b03828116911614156106d45760405162461bcd60e51b815260206004820152603360248201527f4c69717569646974794d6967726174696f6e23757064617465436f6e74726f6c60448201527f6c65723a20616c726561647920657869737473000000000000000000000000006064820152608401610647565b6004805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6001544210156107615760405162461bcd60e51b815260206004820152602360248201527f54696d656c6f636b236f6e6c79556e6c6f636b65643a206e6f7420756e6c6f636044820152621ad95960ea1b6064820152608401610647565b825184511461076f57600080fd5b815183511461077d57600080fd5b60005b845181101561084457610832338683815181106107ad57634e487b7160e01b600052603260045260246000fd5b60200260200101518684815181106107d557634e487b7160e01b600052603260045260246000fd5b60200260200101518685815181106107fd57634e487b7160e01b600052603260045260246000fd5b602002602001015186868151811061082557634e487b7160e01b600052603260045260246000fd5b6020026020010151611a79565b8061083c81613f8c565b915050610780565b5050505050565b6000546001600160a01b031633146108a55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610647565b6001544210156109035760405162461bcd60e51b815260206004820152602360248201527f54696d656c6f636b236f6e6c79556e6c6f636b65643a206e6f7420756e6c6f636044820152621ad95960ea1b6064820152608401610647565b6108448585858585611a79565b61084485348686868661213b565b6109336001600160a01b0384163330856122e2565b61093e838383612393565b505050565b6001544210156109a15760405162461bcd60e51b815260206004820152602360248201527f54696d656c6f636b236f6e6c79556e6c6f636b65643a206e6f7420756e6c6f636044820152621ad95960ea1b6064820152608401610647565b6109ae3385858585611a79565b50505050565b6001600160a01b038316600090815260066020526040902054839060ff16610a445760405162461bcd60e51b815260206004820152602b60248201527f436c61696d61626c65236f6e6c7953746174653a206e6f74207265676973746560448201527f72656420616461707465720000000000000000000000000000000000000000006064820152608401610647565b604051633af32abf60e01b81526001600160a01b03808716600483015285918791831690633af32abf9060240160206040518083038186803b158015610a8957600080fd5b505afa158015610a9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac19190613b3c565b610b335760405162461bcd60e51b815260206004820152602d60248201527f436c61696d61626c65236f6e6c7953746174653a206e6f742077686974656c6960448201527f73746564207374726174656779000000000000000000000000000000000000006064820152608401610647565b6000610b4185870187613364565b5050509350505050610b548789836125d1565b6000610b9587878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506128d592505050565b604080516001600160a01b038b811682528c8116602083015283168183015233606082015290519192507f259b30ca39885c6d801a0b5dbc988640f3c25e2f37531fe138c5c5af8955d41b919081900360800190a1505050505050505050565b6000546001600160a01b03163314610c4f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610647565b6001600160a01b03811660009081526006602052604090205460ff16610cdd5760405162461bcd60e51b815260206004820152603060248201527f4c69717569646974794d6967726174696f6e237570646174654164617074657260448201527f3a20646f6573206e6f74206578697374000000000000000000000000000000006064820152608401610647565b6001600160a01b03166000908152600660205260409020805460ff19169055565b6000546001600160a01b03163314610d585760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610647565b610d6282826129b9565b5050565b6000546001600160a01b03163314610dc05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610647565b6001600160a01b03811660009081526006602052604090205460ff1615610e4f5760405162461bcd60e51b815260206004820152603060248201527f4c69717569646974794d6967726174696f6e237570646174654164617074657260448201527f3a20616c726561647920657869737473000000000000000000000000000000006064820152608401610647565b6001600160a01b03166000908152600660205260409020805460ff19166001179055565b6000546001600160a01b03163314610ecd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610647565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36000805473ffffffffffffffffffffffffffffffffffffffff19169055565b6000546001600160a01b03163314610f7e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610647565b600154421015610fdc5760405162461bcd60e51b815260206004820152602360248201527f54696d656c6f636b236f6e6c79556e6c6f636b65643a206e6f7420756e6c6f636044820152621ad95960ea1b6064820152608401610647565b8351855114610fea57600080fd5b8251845114610ff857600080fd5b815183511461100657600080fd5b60005b845181101561106f5761105d86828151811061103557634e487b7160e01b600052603260045260246000fd5b60200260200101518683815181106107ad57634e487b7160e01b600052603260045260246000fd5b8061106781613f8c565b915050611009565b505050505050565b81518351146110ee5760405162461bcd60e51b815260206004820152602e60248201527f4c69717569646974794d6967726174696f6e2362617463685374616b653a206e60448201527f6f742073616d65206c656e6774680000000000000000000000000000000000006064820152608401610647565b80518251146111655760405162461bcd60e51b815260206004820152602e60248201527f4c69717569646974794d6967726174696f6e2362617463685374616b653a206e60448201527f6f742073616d65206c656e6774680000000000000000000000000000000000006064820152608401610647565b60005b83518110156109ae576111f184828151811061119457634e487b7160e01b600052603260045260246000fd5b60200260200101518483815181106111bc57634e487b7160e01b600052603260045260246000fd5b60200260200101518484815181106111e457634e487b7160e01b600052603260045260246000fd5b602002602001015161091e565b806111fb81613f8c565b915050611168565b6000546001600160a01b0316331461125d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610647565b6003546001600160a01b03828116911614156112e15760405162461bcd60e51b815260206004820152603060248201527f4c69717569646974794d6967726174696f6e2375706461746547656e6572696360448201527f3a20616c726561647920657869737473000000000000000000000000000000006064820152608401610647565b6003805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6001600160a01b0381166000908152600760205260409020545b919050565b6000546001600160a01b031633146113895760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610647565b6005546001600160a01b038281169116141561140d5760405162461bcd60e51b815260206004820152603060248201527f4c69717569646974794d6967726174696f6e23757064617465466163746f727960448201527f3a20616c726561647920657869737473000000000000000000000000000000006064820152608401610647565b6005805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6000546001600160a01b031633146114965760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610647565b6001600160a01b0381166115125760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610647565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b85518551146115f15760405162461bcd60e51b815260206004820152603460248201527f4c69717569646974794d6967726174696f6e236261746368427579416e64537460448201527f616b653a206e6f742073616d65206c656e6774680000000000000000000000006064820152608401610647565b85518451146116685760405162461bcd60e51b815260206004820152603460248201527f4c69717569646974794d6967726174696f6e236261746368427579416e64537460448201527f616b653a206e6f742073616d65206c656e6774680000000000000000000000006064820152608401610647565b85518351146116df5760405162461bcd60e51b815260206004820152603460248201527f4c69717569646974794d6967726174696f6e236261746368427579416e64537460448201527f616b653a206e6f742073616d65206c656e6774680000000000000000000000006064820152608401610647565b85518251146117565760405162461bcd60e51b815260206004820152603460248201527f4c69717569646974794d6967726174696f6e236261746368427579416e64537460448201527f616b653a206e6f742073616d65206c656e6774680000000000000000000000006064820152608401610647565b6000805b875181101561187b5786818151811061178357634e487b7160e01b600052603260045260246000fd5b6020026020010151826117969190613f1a565b91506118698882815181106117bb57634e487b7160e01b600052603260045260246000fd5b60200260200101518883815181106117e357634e487b7160e01b600052603260045260246000fd5b602002602001015188848151811061180b57634e487b7160e01b600052603260045260246000fd5b602002602001015188858151811061183357634e487b7160e01b600052603260045260246000fd5b602002602001015188868151811061185b57634e487b7160e01b600052603260045260246000fd5b60200260200101518861213b565b8061187381613f8c565b91505061175a565b508034146118f15760405162461bcd60e51b815260206004820152603660248201527f4c69717569646974794d6967726174696f6e236261746368427579416e64537460448201527f616b653a20696e636f727265637420616d6f756e7473000000000000000000006064820152608401610647565b50505050505050565b6000546001600160a01b031633146119545760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610647565b60005b825181101561093e5761199183828151811061198357634e487b7160e01b600052603260045260246000fd5b6020026020010151836129b9565b8061199b81613f8c565b915050611957565b6000546001600160a01b031633146119fd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610647565b6002544210611a745760405162461bcd60e51b815260206004820152602260248201527f54696d656c6f636b236f6e6c794d6f646966793a2063616e6e6f74206d6f646960448201527f66790000000000000000000000000000000000000000000000000000000000006064820152608401610647565b600155565b6001600160a01b038316600090815260066020526040902054839060ff16611b095760405162461bcd60e51b815260206004820152602b60248201527f436c61696d61626c65236f6e6c7953746174653a206e6f74207265676973746560448201527f72656420616461707465720000000000000000000000000000000000000000006064820152608401610647565b604051633af32abf60e01b81526001600160a01b03808716600483015285918791831690633af32abf9060240160206040518083038186803b158015611b4e57600080fd5b505afa158015611b62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b869190613b3c565b611bf85760405162461bcd60e51b815260206004820152602d60248201527f436c61696d61626c65236f6e6c7953746174653a206e6f742077686974656c6960448201527f73746564207374726174656779000000000000000000000000000000000000006064820152608401610647565b600480546040517fcbca47db0000000000000000000000000000000000000000000000000000000081526001600160a01b038881169382019390935291169063cbca47db9060240160206040518083038186803b158015611c5857600080fd5b505afa158015611c6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c909190613b3c565b611d025760405162461bcd60e51b815260206004820152602e60248201527f4c69717569646974794d6967726174696f6e235f6d6967726174653a206e6f7460448201527f20656e736f2073747261746567790000000000000000000000000000000000006064820152608401610647565b6001600160a01b038089166000908152600860209081526040808320938b168352929052205480611d9b5760405162461bcd60e51b815260206004820152602760248201527f4c69717569646974794d6967726174696f6e235f6d6967726174653a206e6f7460448201527f207374616b6564000000000000000000000000000000000000000000000000006064820152608401610647565b6001600160a01b03808a1660009081526008602090815260408083208c85168085529252822091909155600354611dd3921683612ad4565b6040516370a0823160e01b81523060048201526000906001600160a01b038816906370a082319060240160206040518083038186803b158015611e1557600080fd5b505afa158015611e29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e4d9190613b70565b6003546040517fa9b298610000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015289821660248201528b8216604482015260648101859052919250600091908a169063a9b298619060840160006040518083038186803b158015611ec857600080fd5b505afa158015611edc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611f049190810190613a68565b604051602001611f149190613dba565b60408051808303601f1901815290829052600480546003547f71b8dc690000000000000000000000000000000000000000000000000000000085529294506001600160a01b03908116936371b8dc6993611f7b938e93909116916000918e91899101613e52565b600060405180830381600087803b158015611f9557600080fd5b505af1158015611fa9573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600092506001600160a01b038b1691506370a082319060240160206040518083038186803b158015611fef57600080fd5b505afa158015612003573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120279190613b70565b90506001600160a01b03891663a9059cbb8d6120438685613f32565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156120a157600080fd5b505af11580156120b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120d99190613b3c565b50604080516001600160a01b038c811682528d811660208301528b8116828401528e16606082015290517f415f0af8f5b6deaac4fa61971b0153fa777da7c922b5f0031947b017bd0658d19181900360800190a1505050505050505050505050565b6040516370a0823160e01b81523060048201526000906001600160a01b038816906370a082319060240160206040518083038186803b15801561217d57600080fd5b505afa158015612191573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121b59190613b70565b6040517fa9d424e20000000000000000000000000000000000000000000000000000000081526001600160a01b038981166004830152868116602483015260448201869052606482018590529192509086169063a9d424e29088906084016000604051808303818588803b15801561222c57600080fd5b505af1158015612240573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600093508492506001600160a01b038b1691506370a082319060240160206040518083038186803b15801561228957600080fd5b505afa15801561229d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122c19190613b70565b6122cb9190613f32565b90506122d8888288612393565b5050505050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526109ae9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612b1d565b6001600160a01b038116600090815260066020526040902054819060ff166124235760405162461bcd60e51b815260206004820152602b60248201527f436c61696d61626c65236f6e6c7953746174653a206e6f74207265676973746560448201527f72656420616461707465720000000000000000000000000000000000000000006064820152608401610647565b604051633af32abf60e01b81526001600160a01b03808616600483015283918691831690633af32abf9060240160206040518083038186803b15801561246857600080fd5b505afa15801561247c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a09190613b3c565b6125125760405162461bcd60e51b815260206004820152602d60248201527f436c61696d61626c65236f6e6c7953746174653a206e6f742077686974656c6960448201527f73746564207374726174656779000000000000000000000000000000000000006064820152608401610647565b3360009081526008602090815260408083206001600160a01b038a16845290915281208054879290612545908490613f1a565b90915550506001600160a01b0384166000908152600760205260408120805460019290612573908490613f1a565b9091555050604080516001600160a01b038087168252881660208201529081018690523360608201527f751f7c1e1facd3028e03b5a9e2e34e63fb2f229f99b85eec19864b950ac671d09060800160405180910390a1505050505050565b6040517f51ecd2fa0000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152600091908516906351ecd2fa9060240160006040518083038186803b15801561262f57600080fd5b505afa158015612643573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261266b9190810190613724565b905060005b81518110156126e35760016009600084848151811061269f57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806126db81613f8c565b915050612670565b50815160005b835181101561285e576009600085838151811061271657634e487b7160e01b600052603260045260246000fd5b602090810291909101810151516001600160a01b031682528101919091526040016000205460ff166127fb5783818151811061276257634e487b7160e01b600052603260045260246000fd5b60200260200101516020015160001415612788578161278081613f75565b9250506127f6565b60405162461bcd60e51b815260206004820152603360248201527f4c69717569646974794d6967726174696f6e236372656174655374726174656760448201527f793a20696e636f7272656374206c656e677468000000000000000000000000006064820152608401610647565b61284c565b6009600085838151811061281f57634e487b7160e01b600052603260045260246000fd5b602090810291909101810151516001600160a01b03168252810191909152604001600020805460ff191690555b8061285681613f8c565b9150506126e9565b50815181146108445760405162461bcd60e51b815260206004820152603160248201527f4c69717569646974794d6967726174696f6e236372656174655374726174656760448201527f793a20646f6573206e6f742065786973740000000000000000000000000000006064820152608401610647565b600080600080600080600080888060200190518101906128f59190613442565b6005546040517f2016d1f9000000000000000000000000000000000000000000000000000000008152979e50959c50939a509198509650945092506001600160a01b031690632016d1f99061295a908a908a908a908a908a908a908a90600401613c13565b602060405180830381600087803b15801561297457600080fd5b505af1158015612988573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129ac9190613348565b9998505050505050505050565b6001600160a01b0380831660009081526008602090815260408083209385168352929052205480612a515760405162461bcd60e51b8152602060048201526024808201527f4c69717569646974794d6967726174696f6e235f726566756e643a206e6f207360448201527f74616b65000000000000000000000000000000000000000000000000000000006064820152608401610647565b6001600160a01b03808416600090815260086020908152604080832093861680845293909152812055612a85908483612ad4565b604080516001600160a01b0384811682526020820184905285168183015290517fb44b3631755227290f8fbd7b248fa4be405129d15351313e3c332a3fb99194179181900360600190a1505050565b6040516001600160a01b03831660248201526044810182905261093e9084907fa9059cbb000000000000000000000000000000000000000000000000000000009060640161232f565b6000612b72826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612c029092919063ffffffff16565b80519091501561093e5780806020019051810190612b909190613b3c565b61093e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610647565b6060612c118484600085612c1b565b90505b9392505050565b606082471015612c935760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610647565b843b612ce15760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610647565b600080866001600160a01b03168587604051612cfd9190613bf7565b60006040518083038185875af1925050503d8060008114612d3a576040519150601f19603f3d011682016040523d82523d6000602084013e612d3f565b606091505b5091509150612d4f828286612d5a565b979650505050505050565b60608315612d69575081612c14565b825115612d795782518084602001fd5b8160405162461bcd60e51b81526004016106479190613e8a565b803561132a81613fd3565b805161132a81613fd3565b600082601f830112612db9578081fd5b81356020612dce612dc983613ece565b613e9d565b8281528181019085830183850287018401881015612dea578586fd5b855b85811015612e11578135612dff81613fd3565b84529284019290840190600101612dec565b5090979650505050505050565b600082601f830112612e2e578081fd5b81516020612e3e612dc983613ece565b8281528181019085830183850287018401881015612e5a578586fd5b855b85811015612e11578151612e6f81613fd3565b84529284019290840190600101612e5c565b600082601f830112612e91578081fd5b6020612ea0612dc98435613ece565b8335815281810190828501845b8635811015612fb75781358701601f19606081838c03011215612ece578788fd5b612ed86060613e9d565b87830135612ee581613fd3565b8152604083013588820152606083013567ffffffffffffffff80821115612f0a578a8bfd5b938101936060858e0385011215612f1f578a8bfd5b612f296060613e9d565b935089850135915080821115612f3d578a8bfd5b612f4b8d8b84880101612da9565b84526040850135915080821115612f60578a8bfd5b612f6e8d8b84880101612da9565b8a8501526060850135915080821115612f85578a8bfd5b50612f948c8a8387010161315c565b604084810191909152820192909252865250509284019290840190600101612ead565b50909695505050505050565b600082601f830112612fd3578081fd5b8151612fe1612dc982613ece565b818152602080820191908501845b84811015612fb75781518701601f19606081838c0301121561300f578788fd5b6130196060613e9d565b602083015161302781613fd3565b815260408301516020820152606083015167ffffffffffffffff8082111561304d578a8bfd5b938101936060858e0385011215613062578a8bfd5b61306c6060613e9d565b93506020850151915080821115613081578a8bfd5b6130908d602084880101612e1e565b845260408501519150808211156130a5578a8bfd5b6130b48d602084880101612e1e565b602085015260608501519150808211156130cc578a8bfd5b506130dc8c6020838701016131a8565b604084810191909152820192909252865250506020938401939190910190600101612fef565b600082601f830112613112578081fd5b81356020613122612dc983613ece565b828152818101908583018385028701840188101561313e578586fd5b855b85811015612e1157813584529284019290840190600101613140565b600082601f83011261316c578081fd5b813561317a612dc982613ef2565b81815284602083860101111561318e578283fd5b816020850160208301379081016020019190915292915050565b600082601f8301126131b8578081fd5b81516131c6612dc982613ef2565b8181528460208386010111156131da578283fd5b6131eb826020830160208701613f49565b949350505050565b600060e08284031215613204578081fd5b61320e60e0613e9d565b9050813561321b81614009565b8152602082013561322b81613ff9565b6020820152604082013561323e81613ff9565b6040820152606082013561325181613ff9565b6060820152608082013561326481613ff9565b608082015260a082013561327781613feb565b60a082015260c082013561328a81613feb565b60c082015292915050565b600060e082840312156132a6578081fd5b6132b060e0613e9d565b905081516132bd81614009565b815260208201516132cd81613ff9565b602082015260408201516132e081613ff9565b604082015260608201516132f381613ff9565b6060820152608082015161330681613ff9565b608082015260a082015161331981613feb565b60a082015260c082015161328a81613feb565b60006020828403121561333d578081fd5b8135612c1481613fd3565b600060208284031215613359578081fd5b8151612c1481613fd3565b60008060008060008060006101a0888a03121561337f578283fd5b61338888612d93565b9650602088013567ffffffffffffffff808211156133a4578485fd5b6133b08b838c0161315c565b975060408a01359150808211156133c5578485fd5b6133d18b838c0161315c565b965060608a01359150808211156133e6578485fd5b6133f28b838c01612e81565b95506134018b60808c016131f3565b94506134106101608b01612d93565b93506101808a0135915080821115613426578283fd5b506134338a828b0161315c565b91505092959891949750929550565b60008060008060008060006101a0888a03121561345d578081fd5b61346688612d9e565b9650602088015167ffffffffffffffff80821115613482578283fd5b61348e8b838c016131a8565b975060408a01519150808211156134a3578283fd5b6134af8b838c016131a8565b965060608a01519150808211156134c4578283fd5b6134d08b838c01612fc3565b95506134df8b60808c01613295565b94506134ee6101608b01612d9e565b93506101808a0151915080821115613504578283fd5b506134338a828b016131a8565b60008060408385031215613523578182fd5b823561352e81613fd3565b9150602083013561353e81613fd3565b809150509250929050565b600080600080600060a08688031215613560578283fd5b853561356b81613fd3565b9450602086013561357b81613fd3565b9350604086013561358b81613fd3565b9250606086013561359b81613fd3565b949793965091946080013592915050565b600080600080600060a086880312156135c3578283fd5b85356135ce81613fd3565b945060208601356135de81613fd3565b935060408601356135ee81613fd3565b94979396509394606081013594506080013592915050565b6000806000806060858703121561361b578182fd5b843561362681613fd3565b9350602085013561363681613fd3565b9250604085013567ffffffffffffffff80821115613652578384fd5b818701915087601f830112613665578384fd5b813581811115613673578485fd5b886020828501011115613684578485fd5b95989497505060200194505050565b600080600080608085870312156136a8578182fd5b84356136b381613fd3565b935060208501356136c381613fd3565b925060408501356136d381613fd3565b9396929550929360600135925050565b6000806000606084860312156136f7578081fd5b833561370281613fd3565b925060208401359150604084013561371981613fd3565b809150509250925092565b600060208284031215613735578081fd5b815167ffffffffffffffff81111561374b578182fd5b6131eb84828501612e1e565b60008060408385031215613769578182fd5b823567ffffffffffffffff81111561377f578283fd5b61378b85828601612da9565b925050602083013561353e81613fd3565b600080600080600060a086880312156137b3578283fd5b853567ffffffffffffffff808211156137ca578485fd5b6137d689838a01612da9565b965060208801359150808211156137eb578485fd5b6137f789838a01612da9565b9550604088013591508082111561380c578485fd5b61381889838a01612da9565b9450606088013591508082111561382d578283fd5b61383989838a01612da9565b9350608088013591508082111561384e578283fd5b5061385b88828901613102565b9150509295509295909350565b6000806000806080858703121561387d578182fd5b843567ffffffffffffffff80821115613894578384fd5b6138a088838901612da9565b955060208701359150808211156138b5578384fd5b6138c188838901612da9565b945060408701359150808211156138d6578384fd5b6138e288838901612da9565b935060608701359150808211156138f7578283fd5b5061390487828801613102565b91505092959194509250565b600080600060608486031215613924578081fd5b833567ffffffffffffffff8082111561393b578283fd5b61394787838801612da9565b9450602086013591508082111561395c578283fd5b61396887838801613102565b9350604086013591508082111561397d578283fd5b5061398a86828701612da9565b9150509250925092565b60008060008060008060c087890312156139ac578384fd5b863567ffffffffffffffff808211156139c3578586fd5b6139cf8a838b01612da9565b975060208901359150808211156139e4578586fd5b6139f08a838b01613102565b96506040890135915080821115613a05578586fd5b613a118a838b01612da9565b95506060890135915080821115613a26578384fd5b613a328a838b01612da9565b94506080890135915080821115613a47578384fd5b50613a5489828a01613102565b92505060a087013590509295509295509295565b60006020808385031215613a7a578182fd5b825167ffffffffffffffff80821115613a91578384fd5b818501915085601f830112613aa4578384fd5b8151613ab2612dc982613ece565b81815284810190848601875b84811015613b2d5781518701604080601f19838f03011215613ade578a8bfd5b613ae781613e9d565b8a830151613af481613fd3565b8152908201519088821115613b07578b8cfd5b613b158e8c848601016131a8565b818c0152865250509287019290870190600101613abe565b50909998505050505050505050565b600060208284031215613b4d578081fd5b8151612c1481613feb565b600060208284031215613b69578081fd5b5035919050565b600060208284031215613b81578081fd5b5051919050565b6000815180845260208085019450808401835b83811015613bc05781516001600160a01b031687529582019590820190600101613b9b565b509495945050505050565b60008151808452613be3816020860160208601613f49565b601f01601f19169290920160200192915050565b60008251613c09818460208701613f49565b9190910192915050565b60006101a06001600160a01b03808b16845260208281860152613c388386018c613bcb565b9250604085840381870152613c4d848c613bcb565b9350606086850381880152848b51808752848701915084858202880101858e01895b83811015613d1b57898303601f19018552815180518a16845288810151898501528701518784018790528051878501889052613cae60c0860182613b88565b9050898201517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa080878403016080880152613ce98383613b88565b92508a8401519350808784030160a08801525050613d078183613bcb565b968a01969450505090870190600101613c6f565b5050613d8160808b018e63ffffffff8151168252602081015161ffff8082166020850152806040840151166040850152806060840151166060850152806080840151166080850152505060a0810151151560a083015260c0810151151560c08301525050565b6001600160a01b038c166101608b01528981036101808b0152613da4818c613bcb565b9850505050505050505098975050505050505050565b60208082528251828201819052600091906040908185019080840286018301878501865b83811015613e44578883037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0018552815180516001600160a01b03168452870151878401879052613e3187850182613bcb565b9588019593505090860190600101613dde565b509098975050505050505050565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a06080830152612d4f60a0830184613bcb565b600060208252612c146020830184613bcb565b604051601f8201601f1916810167ffffffffffffffff81118282101715613ec657613ec6613fbd565b604052919050565b600067ffffffffffffffff821115613ee857613ee8613fbd565b5060209081020190565b600067ffffffffffffffff821115613f0c57613f0c613fbd565b50601f01601f191660200190565b60008219821115613f2d57613f2d613fa7565b500190565b600082821015613f4457613f44613fa7565b500390565b60005b83811015613f64578181015183820152602001613f4c565b838111156109ae5750506000910152565b600081613f8457613f84613fa7565b506000190190565b6000600019821415613fa057613fa0613fa7565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114613fe857600080fd5b50565b8015158114613fe857600080fd5b61ffff81168114613fe857600080fd5b63ffffffff81168114613fe857600080fdfea2646970667358221220814b03edae956f9b21eea6d3058f3302626f767295a322ba00af7ac8f53a179464736f6c63430008020033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061d7790affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000058ce791454e62f6a5392706745cd863a4f1f52ac00000000000000000000000000000000000000000000000000000000000000060000000000000000000000005f2c716d912ce400a8a49fb87db722e8257257a7000000000000000000000000e149b1f2ef564a289dc094215835f3c8df1695aa0000000000000000000000008f516c0fb0bcf44cfc8d42d60dad3e4cdb35ce260000000000000000000000009c9326c521895c78414bd3c2945e47afc4ef16cc000000000000000000000000ae6859311c341bac4e0bceca0242247c16718ff10000000000000000000000000a883a62660328ead442eb6c2311668ba9c12e57
-----Decoded View---------------
Arg [0] : adapters_ (address[]): 0x5F2C716D912Ce400a8A49fB87DB722e8257257A7,0xe149B1f2Ef564A289dc094215835f3c8Df1695aa,0x8F516c0FB0bcF44CFc8D42D60dAD3E4cdb35Ce26,0x9c9326C521895c78414BD3C2945e47AFC4Ef16cc,0xaE6859311c341bAc4E0BcEcA0242247c16718FF1,0x0a883a62660328EAd442EB6c2311668ba9c12e57
Arg [1] : generic_ (address): 0x0000000000000000000000000000000000000000
Arg [2] : factory_ (address): 0x0000000000000000000000000000000000000000
Arg [3] : controller_ (address): 0x0000000000000000000000000000000000000000
Arg [4] : _unlock (uint256): 1641511178
Arg [5] : _modify (uint256): 115792089237316195423570985008687907853269984665640564039457584007913129639935
Arg [6] : _owner (address): 0x58CE791454e62f6a5392706745cD863a4f1F52aC
-----Encoded View---------------
14 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000061d7790a
Arg [5] : ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
Arg [6] : 00000000000000000000000058ce791454e62f6a5392706745cd863a4f1f52ac
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [8] : 0000000000000000000000005f2c716d912ce400a8a49fb87db722e8257257a7
Arg [9] : 000000000000000000000000e149b1f2ef564a289dc094215835f3c8df1695aa
Arg [10] : 0000000000000000000000008f516c0fb0bcf44cfc8d42d60dad3e4cdb35ce26
Arg [11] : 0000000000000000000000009c9326c521895c78414bd3c2945e47afc4ef16cc
Arg [12] : 000000000000000000000000ae6859311c341bac4e0bceca0242247c16718ff1
Arg [13] : 0000000000000000000000000a883a62660328ead442eb6c2311668ba9c12e57
Deployed Bytecode Sourcemap
29959:12316:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38773:232;;;;;;;;;;-1:-1:-1;38773:232:0;;;;;:::i;:::-;;:::i;:::-;;34339:478;;;;;;;;;;-1:-1:-1;34339:478:0;;;;;:::i;:::-;;:::i;39946:161::-;;;;;;;;;;-1:-1:-1;39946:161:0;;;;;:::i;:::-;-1:-1:-1;;;;;40074:16:0;;;40045:4;40074:16;;;:6;:16;;;;;;;;:21;;;;;;;;;;;;:25;;;39946:161;;;;33818:14:1;;33811:22;33793:41;;33781:2;33766:18;39946:161:0;;;;;;;;34041:290;;;;;;;;;;-1:-1:-1;34041:290:0;;;;;:::i;:::-;;:::i;31932:299::-;;;;;;:::i;:::-;;:::i;31682:242::-;;;;;;;;;;-1:-1:-1;31682:242:0;;;;;:::i;:::-;;:::i;33781:252::-;;;;;;;;;;-1:-1:-1;33781:252:0;;;;;:::i;:::-;;:::i;38196:569::-;;;;;;;;;;-1:-1:-1;38196:569:0;;;;;:::i;:::-;;:::i;39720:218::-;;;;;;;;;;-1:-1:-1;39720:218:0;;;;;:::i;:::-;;:::i;35407:147::-;;;;;;;;;;-1:-1:-1;35407:147:0;;;;;:::i;:::-;;:::i;39497:215::-;;;;;;;;;;-1:-1:-1;39497:215:0;;;;;:::i;:::-;;:::i;29124:21::-;;;;;;;;;;;;;;;;;;;44103:25:1;;;44091:2;44076:18;29124:21:0;44058:76:1;29064:23:0;;;;;;;;;;;;;;;;28462:148;;;;;;;;;;;;;:::i;34825:574::-;;;;;;;;;;-1:-1:-1;34825:574:0;;;;;:::i;:::-;;:::i;30058:22::-;;;;;;;;;;-1:-1:-1;30058:22:0;;;;-1:-1:-1;;;;;30058:22:0;;;;;;-1:-1:-1;;;;;26796:55:1;;;26778:74;;26766:2;26751:18;30058:22:0;26733:125:1;27811:87:0;;;;;;;;;;-1:-1:-1;27857:7:0;27884:6;-1:-1:-1;;;;;27884:6:0;27811:87;;30212:47;;;;;;;;;;-1:-1:-1;30212:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;32239:479;;;;;;;;;;-1:-1:-1;32239:479:0;;;;;:::i;:::-;;:::i;30119:36::-;;;;;;;;;;-1:-1:-1;30119:36:0;;;;-1:-1:-1;;;;;30119:36:0;;;30266:63;;;;;;;;;;-1:-1:-1;30266:63:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;39013:211;;;;;;;;;;-1:-1:-1;39013:211:0;;;;;:::i;:::-;;:::i;40115:151::-;;;;;;;;;;-1:-1:-1;40115:151:0;;;;;:::i;:::-;;:::i;39232:257::-;;;;;;;;;;-1:-1:-1;39232:257:0;;;;;:::i;:::-;;:::i;30164:41::-;;;;;;;;;;-1:-1:-1;30164:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;28765:244;;;;;;;;;;-1:-1:-1;28765:244:0;;;;;:::i;:::-;;:::i;30087:25::-;;;;;;;;;;-1:-1:-1;30087:25:0;;;;-1:-1:-1;;;;;30087:25:0;;;32726:1047;;;;;;:::i;:::-;;:::i;35562:211::-;;;;;;;;;;-1:-1:-1;35562:211:0;;;;;:::i;:::-;;:::i;29799:153::-;;;;;;;;;;-1:-1:-1;29799:153:0;;;;;:::i;:::-;;:::i;38773:232::-;27857:7;27884:6;-1:-1:-1;;;;;27884:6:0;26538:10;28031:23;28023:68;;;;-1:-1:-1;;;28023:68:0;;38862:2:1;28023:68:0;;;38844:21:1;;;38881:18;;;38874:30;38940:34;38920:18;;;38913:62;38992:18;;28023:68:0;;;;;;;;;38881:10:::1;::::0;-1:-1:-1;;;;;38881:25:0;;::::1;:10:::0;::::1;:25;;38873:89;;;::::0;-1:-1:-1;;;38873:89:0;;43322:2:1;38873:89:0::1;::::0;::::1;43304:21:1::0;43361:2;43341:18;;;43334:30;43400:34;43380:18;;;43373:62;43471:21;43451:18;;;43444:49;43510:19;;38873:89:0::1;43294:241:1::0;38873:89:0::1;38973:10;:24:::0;;-1:-1:-1;;38973:24:0::1;-1:-1:-1::0;;;;;38973:24:0;;;::::1;::::0;;;::::1;::::0;;38773:232::o;34339:478::-;29301:8;;29282:15;:27;;29274:75;;;;-1:-1:-1;;;29274:75:0;;36401:2:1;29274:75:0;;;36383:21:1;36440:2;36420:18;;;36413:30;36479:34;36459:18;;;36452:62;-1:-1:-1;;;36530:18:1;;;36523:33;36573:19;;29274:75:0;36373:225:1;29274:75:0;34589:8:::1;:15;34575:3;:10;:29;34567:38;;;::::0;::::1;;34643:9;:16;34624:8;:15;:35;34616:44;;;::::0;::::1;;34678:9;34673:137;34697:3;:10;34693:1;:14;34673:137;;;34729:69;34738:10;34750:3;34754:1;34750:6;;;;;;-1:-1:-1::0;;;34750:6:0::1;;;;;;;;;;;;;;;34758:8;34767:1;34758:11;;;;;;-1:-1:-1::0;;;34758:11:0::1;;;;;;;;;;;;;;;34771:9;34781:1;34771:12;;;;;;-1:-1:-1::0;;;34771:12:0::1;;;;;;;;;;;;;;;34785:9;34795:1;34785:12;;;;;;-1:-1:-1::0;;;34785:12:0::1;;;;;;;;;;;;;;;34729:8;:69::i;:::-;34709:3:::0;::::1;::::0;::::1;:::i;:::-;;;;34673:137;;;;34339:478:::0;;;;:::o;34041:290::-;27857:7;27884:6;-1:-1:-1;;;;;27884:6:0;26538:10;28031:23;28023:68;;;;-1:-1:-1;;;28023:68:0;;38862:2:1;28023:68:0;;;38844:21:1;;;38881:18;;;38874:30;38940:34;38920:18;;;38913:62;38992:18;;28023:68:0;38834:182:1;28023:68:0;29301:8:::1;;29282:15;:27;;29274:75;;;::::0;-1:-1:-1;;;29274:75:0;;36401:2:1;29274:75:0::1;::::0;::::1;36383:21:1::0;36440:2;36420:18;;;36413:30;36479:34;36459:18;;;36452:62;-1:-1:-1;;;36530:18:1;;;36523:33;36573:19;;29274:75:0::1;36373:225:1::0;29274:75:0::1;34271:52:::2;34280:5;34287:3;34292:8;34302:9;34313;34271:8;:52::i;31932:299::-:0;32148:75;32161:3;32166:9;32177:8;32187:9;32198:13;32213:9;32148:12;:75::i;31682:242::-;31811:64;-1:-1:-1;;;;;31811:28:0;;31840:10;31860:4;31867:7;31811:28;:64::i;:::-;31886:30;31893:3;31898:7;31907:8;31886:6;:30::i;:::-;31682:242;;;:::o;33781:252::-;29301:8;;29282:15;:27;;29274:75;;;;-1:-1:-1;;;29274:75:0;;36401:2:1;29274:75:0;;;36383:21:1;36440:2;36420:18;;;36413:30;36479:34;36459:18;;;36452:62;-1:-1:-1;;;36530:18:1;;;36523:33;36573:19;;29274:75:0;36373:225:1;29274:75:0;33968:57:::1;33977:10;33989:3;33994:8;34004:9;34015;33968:8;:57::i;:::-;33781:252:::0;;;;:::o;38196:569::-;-1:-1:-1;;;;;30839:18:0;;;;;;:8;:18;;;;;;38346:8;;30839:18;;30831:74;;;;-1:-1:-1;;;30831:74:0;;41671:2:1;30831:74:0;;;41653:21:1;41710:2;41690:18;;;41683:30;41749:34;41729:18;;;41722:62;41820:13;41800:18;;;41793:41;41851:19;;30831:74:0;41643:233:1;30831:74:0;31063:37:::1;::::0;-1:-1:-1;;;31063:37:0;;-1:-1:-1;;;;;26796:55:1;;;31063:37:0::1;::::0;::::1;26778:74:1::0;38381:8:0;;38391:3;;31063:32;::::1;::::0;::::1;::::0;26751:18:1;;31063:37:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31055:95;;;::::0;-1:-1:-1;;;31055:95:0;;40899:2:1;31055:95:0::1;::::0;::::1;40881:21:1::0;40938:2;40918:18;;;40911:30;40977:34;40957:18;;;40950:62;41048:15;41028:18;;;41021:43;41081:19;;31055:95:0::1;40871:235:1::0;31055:95:0::1;38420:35:::2;38465:126;::::0;;::::2;38490:4:::0;38465:126:::2;:::i;:::-;38412:179;;;;;;;;38602:44;38617:8;38627:3;38632:13;38602:14;:44::i;:::-;38657:16;38676:21;38692:4;;38676:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;::::0;;;;-1:-1:-1;38676:15:0::2;::::0;-1:-1:-1;;;38676:21:0:i:2;:::-;38713:44;::::0;;-1:-1:-1;;;;;27173:15:1;;;27155:34;;27225:15;;;27220:2;27205:18;;27198:43;27277:15;;27257:18;;;27250:43;38746:10:0::2;27324:2:1::0;27309:18;;27302:43;38713:44:0;;27277:15:1;;-1:-1:-1;38713:44:0::2;::::0;;;;;27081:3:1;38713:44:0;;::::2;31161:1;;30916::::1;;38196:569:::0;;;;;:::o;39720:218::-;27857:7;27884:6;-1:-1:-1;;;;;27884:6:0;26538:10;28031:23;28023:68;;;;-1:-1:-1;;;28023:68:0;;38862:2:1;28023:68:0;;;38844:21:1;;;38881:18;;;38874:30;38940:34;38920:18;;;38913:62;38992:18;;28023:68:0;38834:182:1;28023:68:0;-1:-1:-1;;;;;39822:18:0;::::1;;::::0;;;:8:::1;:18;::::0;;;;;::::1;;39814:79;;;::::0;-1:-1:-1;;;39814:79:0;;35169:2:1;39814:79:0::1;::::0;::::1;35151:21:1::0;35208:2;35188:18;;;35181:30;35247:34;35227:18;;;35220:62;35318:18;35298;;;35291:46;35354:19;;39814:79:0::1;35141:238:1::0;39814:79:0::1;-1:-1:-1::0;;;;;39904:18:0::1;39925:5;39904:18:::0;;;:8:::1;:18;::::0;;;;:26;;-1:-1:-1;;39904:26:0::1;::::0;;39720:218::o;35407:147::-;27857:7;27884:6;-1:-1:-1;;;;;27884:6:0;26538:10;28031:23;28023:68;;;;-1:-1:-1;;;28023:68:0;;38862:2:1;28023:68:0;;;38844:21:1;;;38881:18;;;38874:30;38940:34;38920:18;;;38913:62;38992:18;;28023:68:0;38834:182:1;28023:68:0;35527:19:::1;35535:5;35542:3;35527:7;:19::i;:::-;35407:147:::0;;:::o;39497:215::-;27857:7;27884:6;-1:-1:-1;;;;;27884:6:0;26538:10;28031:23;28023:68;;;;-1:-1:-1;;;28023:68:0;;38862:2:1;28023:68:0;;;38844:21:1;;;38881:18;;;38874:30;38940:34;38920:18;;;38913:62;38992:18;;28023:68:0;38834:182:1;28023:68:0;-1:-1:-1;;;;;39597:18:0;::::1;;::::0;;;:8:::1;:18;::::0;;;;;::::1;;39596:19;39588:80;;;::::0;-1:-1:-1;;;39588:80:0;;43742:2:1;39588:80:0::1;::::0;::::1;43724:21:1::0;43781:2;43761:18;;;43754:30;43820:34;43800:18;;;43793:62;43891:18;43871;;;43864:46;43927:19;;39588:80:0::1;43714:238:1::0;39588:80:0::1;-1:-1:-1::0;;;;;39679:18:0::1;;::::0;;;:8:::1;:18;::::0;;;;:25;;-1:-1:-1;;39679:25:0::1;39700:4;39679:25;::::0;;39497:215::o;28462:148::-;27857:7;27884:6;-1:-1:-1;;;;;27884:6:0;26538:10;28031:23;28023:68;;;;-1:-1:-1;;;28023:68:0;;38862:2:1;28023:68:0;;;38844:21:1;;;38881:18;;;38874:30;38940:34;38920:18;;;38913:62;38992:18;;28023:68:0;38834:182:1;28023:68:0;28569:1:::1;28553:6:::0;;28532:40:::1;::::0;-1:-1:-1;;;;;28553:6:0;;::::1;::::0;28532:40:::1;::::0;28569:1;;28532:40:::1;28600:1;28583:19:::0;;-1:-1:-1;;28583:19:0::1;::::0;;28462:148::o;34825:574::-;27857:7;27884:6;-1:-1:-1;;;;;27884:6:0;26538:10;28031:23;28023:68;;;;-1:-1:-1;;;28023:68:0;;38862:2:1;28023:68:0;;;38844:21:1;;;38881:18;;;38874:30;38940:34;38920:18;;;38913:62;38992:18;;28023:68:0;38834:182:1;28023:68:0;29301:8:::1;;29282:15;:27;;29274:75;;;::::0;-1:-1:-1;;;29274:75:0;;36401:2:1;29274:75:0::1;::::0;::::1;36383:21:1::0;36440:2;36420:18;;;36413:30;36479:34;36459:18;;;36452:62;-1:-1:-1;;;36530:18:1;;;36523:33;36573:19;;29274:75:0::1;36373:225:1::0;29274:75:0::1;35129:3:::2;:10;35113:5;:12;:26;35105:35;;;::::0;::::2;;35173:8;:15;35159:3;:10;:29;35151:38;;;::::0;::::2;;35227:9;:16;35208:8;:15;:35;35200:44;;;::::0;::::2;;35262:9;35257:135;35281:3;:10;35277:1;:14;35257:135;;;35313:67;35322:5;35328:1;35322:8;;;;;;-1:-1:-1::0;;;35322:8:0::2;;;;;;;;;;;;;;;35332:3;35336:1;35332:6;;;;;;-1:-1:-1::0;;;35332:6:0::2;;;;;;;;35313:67;35293:3:::0;::::2;::::0;::::2;:::i;:::-;;;;35257:135;;;;34825:574:::0;;;;;:::o;32239:479::-;32424:7;:14;32410:3;:10;:28;32402:87;;;;-1:-1:-1;;;32402:87:0;;38447:2:1;32402:87:0;;;38429:21:1;38486:2;38466:18;;;38459:30;38525:34;38505:18;;;38498:62;38596:16;38576:18;;;38569:44;38630:19;;32402:87:0;38419:236:1;32402:87:0;32526:8;:15;32508:7;:14;:33;32500:92;;;;-1:-1:-1;;;32500:92:0;;38447:2:1;32500:92:0;;;38429:21:1;38486:2;38466:18;;;38459:30;38525:34;38505:18;;;38498:62;38596:16;38576:18;;;38569:44;38630:19;;32500:92:0;38419:236:1;32500:92:0;32610:9;32605:106;32629:3;:10;32625:1;:14;32605:106;;;32661:38;32667:3;32671:1;32667:6;;;;;;-1:-1:-1;;;32667:6:0;;;;;;;;;;;;;;;32675:7;32683:1;32675:10;;;;;;-1:-1:-1;;;32675:10:0;;;;;;;;;;;;;;;32687:8;32696:1;32687:11;;;;;;-1:-1:-1;;;32687:11:0;;;;;;;;;;;;;;;32661:5;:38::i;:::-;32641:3;;;;:::i;:::-;;;;32605:106;;39013:211;27857:7;27884:6;-1:-1:-1;;;;;27884:6:0;26538:10;28031:23;28023:68;;;;-1:-1:-1;;;28023:68:0;;38862:2:1;28023:68:0;;;38844:21:1;;;38881:18;;;38874:30;38940:34;38920:18;;;38913:62;38992:18;;28023:68:0;38834:182:1;28023:68:0;39115:7:::1;::::0;-1:-1:-1;;;;;39115:19:0;;::::1;:7:::0;::::1;:19;;39107:80;;;::::0;-1:-1:-1;;;39107:80:0;;40061:2:1;39107:80:0::1;::::0;::::1;40043:21:1::0;40100:2;40080:18;;;40073:30;40139:34;40119:18;;;40112:62;40210:18;40190;;;40183:46;40246:19;;39107:80:0::1;40033:238:1::0;39107:80:0::1;39198:7;:18:::0;;-1:-1:-1;;39198:18:0::1;-1:-1:-1::0;;;;;39198:18:0;;;::::1;::::0;;;::::1;::::0;;39013:211::o;40115:151::-;-1:-1:-1;;;;;40237:21:0;;40205:7;40237:21;;;:11;:21;;;;;;40115:151;;;;:::o;39232:257::-;27857:7;27884:6;-1:-1:-1;;;;;27884:6:0;26538:10;28031:23;28023:68;;;;-1:-1:-1;;;28023:68:0;;38862:2:1;28023:68:0;;;38844:21:1;;;38881:18;;;38874:30;38940:34;38920:18;;;38913:62;38992:18;;28023:68:0;38834:182:1;28023:68:0;39334:7:::1;::::0;-1:-1:-1;;;;;39334:42:0;;::::1;:7:::0;::::1;:42;;39326:103;;;::::0;-1:-1:-1;;;39326:103:0;;36805:2:1;39326:103:0::1;::::0;::::1;36787:21:1::0;36844:2;36824:18;;;36817:30;36883:34;36863:18;;;36856:62;36954:18;36934;;;36927:46;36990:19;;39326:103:0::1;36777:238:1::0;39326:103:0::1;39440:7;:41:::0;;-1:-1:-1;;39440:41:0::1;-1:-1:-1::0;;;;;39440:41:0;;;::::1;::::0;;;::::1;::::0;;39232:257::o;28765:244::-;27857:7;27884:6;-1:-1:-1;;;;;27884:6:0;26538:10;28031:23;28023:68;;;;-1:-1:-1;;;28023:68:0;;38862:2:1;28023:68:0;;;38844:21:1;;;38881:18;;;38874:30;38940:34;38920:18;;;38913:62;38992:18;;28023:68:0;38834:182:1;28023:68:0;-1:-1:-1;;;;;28854:22:0;::::1;28846:73;;;::::0;-1:-1:-1;;;28846:73:0;;35994:2:1;28846:73:0::1;::::0;::::1;35976:21:1::0;36033:2;36013:18;;;36006:30;36072:34;36052:18;;;36045:62;36143:8;36123:18;;;36116:36;36169:19;;28846:73:0::1;35966:228:1::0;28846:73:0::1;28956:6;::::0;;28935:38:::1;::::0;-1:-1:-1;;;;;28935:38:0;;::::1;::::0;28956:6;::::1;::::0;28935:38:::1;::::0;::::1;28984:6;:17:::0;;-1:-1:-1;;28984:17:0::1;-1:-1:-1::0;;;;;28984:17:0;;;::::1;::::0;;;::::1;::::0;;28765:244::o;32726:1047::-;33044:3;:10;33026:7;:14;:28;33018:93;;;;-1:-1:-1;;;33018:93:0;;40478:2:1;33018:93:0;;;40460:21:1;40517:2;40497:18;;;40490:30;40556:34;40536:18;;;40529:62;40627:22;40607:18;;;40600:50;40667:19;;33018:93:0;40450:242:1;33018:93:0;33149:3;:10;33130:8;:15;:29;33122:94;;;;-1:-1:-1;;;33122:94:0;;40478:2:1;33122:94:0;;;40460:21:1;40517:2;40497:18;;;40490:30;40556:34;40536:18;;;40529:62;40627:22;40607:18;;;40600:50;40667:19;;33122:94:0;40450:242:1;33122:94:0;33255:3;:10;33235:9;:16;:30;33227:95;;;;-1:-1:-1;;;33227:95:0;;40478:2:1;33227:95:0;;;40460:21:1;40517:2;40497:18;;;40490:30;40556:34;40536:18;;;40529:62;40627:22;40607:18;;;40600:50;40667:19;;33227:95:0;40450:242:1;33227:95:0;33365:3;:10;33341:13;:20;:34;33333:99;;;;-1:-1:-1;;;33333:99:0;;40478:2:1;33333:99:0;;;40460:21:1;40517:2;40497:18;;;40490:30;40556:34;40536:18;;;40529:62;40627:22;40607:18;;;40600:50;40667:19;;33333:99:0;40450:242:1;33333:99:0;33445:13;33478:9;33473:197;33497:3;:10;33493:1;:14;33473:197;;;33545:7;33553:1;33545:10;;;;;;-1:-1:-1;;;33545:10:0;;;;;;;;;;;;;;;33537:5;:18;;;;:::i;:::-;33529:26;;33570:88;33583:3;33587:1;33583:6;;;;;;-1:-1:-1;;;33583:6:0;;;;;;;;;;;;;;;33591:7;33599:1;33591:10;;;;;;-1:-1:-1;;;33591:10:0;;;;;;;;;;;;;;;33603:8;33612:1;33603:11;;;;;;-1:-1:-1;;;33603:11:0;;;;;;;;;;;;;;;33616:9;33626:1;33616:12;;;;;;-1:-1:-1;;;33616:12:0;;;;;;;;;;;;;;;33630:13;33644:1;33630:16;;;;;;-1:-1:-1;;;33630:16:0;;;;;;;;;;;;;;;33648:9;33570:12;:88::i;:::-;33509:3;;;;:::i;:::-;;;;33473:197;;;;33701:5;33688:9;:18;33680:85;;;;-1:-1:-1;;;33680:85:0;;42899:2:1;33680:85:0;;;42881:21:1;42938:2;42918:18;;;42911:30;42977:34;42957:18;;;42950:62;43048:24;43028:18;;;43021:52;43090:19;;33680:85:0;42871:244:1;33680:85:0;32726:1047;;;;;;;:::o;35562:211::-;27857:7;27884:6;-1:-1:-1;;;;;27884:6:0;26538:10;28031:23;28023:68;;;;-1:-1:-1;;;28023:68:0;;38862:2:1;28023:68:0;;;38844:21:1;;;38881:18;;;38874:30;38940:34;38920:18;;;38913:62;38992:18;;28023:68:0;38834:182:1;28023:68:0;35677:9:::1;35672:94;35696:6;:13;35692:1;:17;35672:94;;;35731:23;35739:6;35746:1;35739:9;;;;;;-1:-1:-1::0;;;35739:9:0::1;;;;;;;;;;;;;;;35750:3;35731:7;:23::i;:::-;35711:3:::0;::::1;::::0;::::1;:::i;:::-;;;;35672:94;;29799:153:::0;27857:7;27884:6;-1:-1:-1;;;;;27884:6:0;26538:10;28031:23;28023:68;;;;-1:-1:-1;;;28023:68:0;;38862:2:1;28023:68:0;;;38844:21:1;;;38881:18;;;38874:30;38940:34;38920:18;;;38913:62;38992:18;;28023:68:0;38834:182:1;28023:68:0;29495:6:::1;;29477:15;:24;29469:71;;;::::0;-1:-1:-1;;;29469:71:0;;37629:2:1;29469:71:0::1;::::0;::::1;37611:21:1::0;37668:2;37648:18;;;37641:30;37707:34;37687:18;;;37680:62;37778:4;37758:18;;;37751:32;37800:19;;29469:71:0::1;37601:224:1::0;29469:71:0::1;29926:8:::2;:18:::0;29799:153::o;36140:1174::-;-1:-1:-1;;;;;30839:18:0;;;;;;:8;:18;;;;;;36338:8;;30839:18;;30831:74;;;;-1:-1:-1;;;30831:74:0;;41671:2:1;30831:74:0;;;41653:21:1;41710:2;41690:18;;;41683:30;41749:34;41729:18;;;41722:62;41820:13;41800:18;;;41793:41;41851:19;;30831:74:0;41643:233:1;30831:74:0;31063:37:::1;::::0;-1:-1:-1;;;31063:37:0;;-1:-1:-1;;;;;26796:55:1;;;31063:37:0::1;::::0;::::1;26778:74:1::0;36373:8:0;;36383:3;;31063:32;::::1;::::0;::::1;::::0;26751:18:1;;31063:37:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31055:95;;;::::0;-1:-1:-1;;;31055:95:0;;40899:2:1;31055:95:0::1;::::0;::::1;40881:21:1::0;40938:2;40918:18;;;40911:30;40977:34;40957:18;;;40950:62;41048:15;41028:18;;;41021:43;41081:19;;31055:95:0::1;40871:235:1::0;31055:95:0::1;36446:10:::2;::::0;;36426:63:::2;::::0;;;;-1:-1:-1;;;;;26796:55:1;;;36426:63:0;;::::2;26778:74:1::0;;;;36446:10:0;::::2;::::0;36426:43:::2;::::0;26751:18:1;;36426:63:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36404:159;;;::::0;-1:-1:-1;;;36404:159:0;;38032:2:1;36404:159:0::2;::::0;::::2;38014:21:1::0;38071:2;38051:18;;;38044:30;38110:34;38090:18;;;38083:62;38181:16;38161:18;;;38154:44;38215:19;;36404:159:0::2;38004:236:1::0;36404:159:0::2;-1:-1:-1::0;;;;;36599:13:0;;::::2;36576:20;36599:13:::0;;;:6:::2;:13;::::0;;;;;;;:18;;::::2;::::0;;;;;;;36636:16;36628:68:::2;;;::::0;-1:-1:-1;;;36628:68:0;;35586:2:1;36628:68:0::2;::::0;::::2;35568:21:1::0;35625:2;35605:18;;;35598:30;35664:34;35644:18;;;35637:62;35735:9;35715:18;;;35708:37;35762:19;;36628:68:0::2;35558:229:1::0;36628:68:0::2;-1:-1:-1::0;;;;;36716:13:0;;::::2;;::::0;;;:6:::2;:13;::::0;;;;;;;:18;;::::2;::::0;;;;;;;36709:25;;;;36770:7:::2;::::0;36745:47:::2;::::0;36770:7:::2;36779:12:::0;36745:24:::2;:47::i;:::-;36823:34;::::0;-1:-1:-1;;;36823:34:0;;36851:4:::2;36823:34;::::0;::::2;26778:74:1::0;36805:15:0::2;::::0;-1:-1:-1;;;;;36823:19:0;::::2;::::0;::::2;::::0;26751:18:1;;36823:34:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36956:7;::::0;36921:82:::2;::::0;;;;-1:-1:-1;;;;;36956:7:0;;::::2;36921:82;::::0;::::2;27648:34:1::0;27718:15;;;27698:18;;;27691:43;27770:15;;;27750:18;;;27743:43;27802:18;;;27795:34;;;36805:52:0;;-1:-1:-1;36868:26:0::2;::::0;36921:34;;::::2;::::0;::::2;::::0;27559:19:1;;36921:82:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;::::0;;::::2;-1:-1:-1::0;;36921:82:0::2;::::0;::::2;;::::0;::::2;::::0;;;::::2;::::0;::::2;:::i;:::-;36910:94;;;;;;;;:::i;:::-;;::::0;;;;::::2;-1:-1:-1::0;;36910:94:0;;;;;;;37035:10:::2;::::0;;37082:7:::2;::::0;37015:105;;;36910:94;;-1:-1:-1;;;;;;37035:10:0;;::::2;::::0;37015:39:::2;::::0;:105:::2;::::0;37055:9;;37082:7;;::::2;::::0;37035:10:::2;::::0;37095:9;;36910:94;;37015:105:::2;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;37148:34:0::2;::::0;-1:-1:-1;;;37148:34:0;;37176:4:::2;37148:34;::::0;::::2;26778:74:1::0;37131:14:0::2;::::0;-1:-1:-1;;;;;;37148:19:0;::::2;::::0;-1:-1:-1;37148:19:0::2;::::0;26751:18:1;;37148:34:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37131:51:::0;-1:-1:-1;;;;;;37195:18:0;::::2;;37214:5:::0;37222:16:::2;37231:7:::0;37131:51;37222:16:::2;:::i;:::-;37195:45;::::0;;::::2;::::0;;;;;;-1:-1:-1;;;;;32005:55:1;;;37195:45:0::2;::::0;::::2;31987:74:1::0;32077:18;;;32070:34;31960:18;;37195:45:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;37256:50:0::2;::::0;;-1:-1:-1;;;;;27173:15:1;;;27155:34;;27225:15;;;27220:2;27205:18;;27198:43;27277:15;;;27257:18;;;27250:43;27329:15;;27324:2;27309:18;;27302:43;37256:50:0;;::::2;::::0;;;;27081:3:1;37256:50:0;;::::2;31161:1;;;;30916::::1;;36140:1174:::0;;;;;;:::o;37673:515::-;37923:36;;-1:-1:-1;;;37923:36:0;;37953:4;37923:36;;;26778:74:1;37899:21:0;;-1:-1:-1;;;;;37923:21:0;;;;;26751:18:1;;37923:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37970:80;;;;;-1:-1:-1;;;;;29037:15:1;;;37970:80:0;;;29019:34:1;29089:15;;;29069:18;;;29062:43;29121:18;;;29114:34;;;29164:18;;;29157:34;;;37899:60:0;;-1:-1:-1;37970:22:0;;;;;;38000:7;;28930:19:1;;37970:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;38083:36:0;;-1:-1:-1;;;38083:36:0;;38113:4;38083:36;;;26778:74:1;38061:19:0;;-1:-1:-1;38122:13:0;;-1:-1:-1;;;;;;38083:21:0;;;-1:-1:-1;38083:21:0;;26751:18:1;;38083:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:52;;;;:::i;:::-;38061:74;;38146:34;38153:3;38158:11;38171:8;38146:6;:34::i;:::-;37673:515;;;;;;;;:::o;16934:248::-;17105:68;;-1:-1:-1;;;;;28121:15:1;;;17105:68:0;;;28103:34:1;28173:15;;28153:18;;;28146:43;28205:18;;;28198:34;;;17078:96:0;;17098:5;;17128:27;;28015:18:1;;17105:68:0;;;;-1:-1:-1;;17105:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;17078:19;:96::i;37322:343::-;-1:-1:-1;;;;;30839:18:0;;;;;;:8;:18;;;;;;37462:8;;30839:18;;30831:74;;;;-1:-1:-1;;;30831:74:0;;41671:2:1;30831:74:0;;;41653:21:1;41710:2;41690:18;;;41683:30;41749:34;41729:18;;;41722:62;41820:13;41800:18;;;41793:41;41851:19;;30831:74:0;41643:233:1;30831:74:0;31063:37:::1;::::0;-1:-1:-1;;;31063:37:0;;-1:-1:-1;;;;;26796:55:1;;;31063:37:0::1;::::0;::::1;26778:74:1::0;37497:8:0;;37507:3;;31063:32;::::1;::::0;::::1;::::0;26751:18:1;;31063:37:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31055:95;;;::::0;-1:-1:-1;;;31055:95:0;;40899:2:1;31055:95:0::1;::::0;::::1;40881:21:1::0;40938:2;40918:18;;;40911:30;40977:34;40957:18;;;40950:62;41048:15;41028:18;;;41021:43;41081:19;;31055:95:0::1;40871:235:1::0;31055:95:0::1;37535:10:::2;37528:18;::::0;;;:6:::2;:18;::::0;;;;;;;-1:-1:-1;;;;;37528:23:0;::::2;::::0;;;;;;;:34;;37555:7;;37528:18;:34:::2;::::0;37555:7;;37528:34:::2;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;37573:21:0;::::2;;::::0;;;:11:::2;:21;::::0;;;;:26;;37598:1:::2;::::0;37573:21;:26:::2;::::0;37598:1;;37573:26:::2;:::i;:::-;::::0;;;-1:-1:-1;;37615:42:0::2;::::0;;-1:-1:-1;;;;;28553:15:1;;;28535:34;;28605:15;;28600:2;28585:18;;28578:43;28637:18;;;28630:34;;;37646:10:0::2;28695:2:1::0;28680:18;;28673:43;37615:42:0::2;::::0;28461:3:1;28446:19;37615:42:0::2;;;;;;;30916:1:::1;;37322:343:::0;;;;:::o;40274:1281::-;40419:34;;;;;-1:-1:-1;;;;;26796:55:1;;;40419:34:0;;;26778:74:1;40383:33:0;;40419:30;;;;;;26751:18:1;;40419:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;40419:34:0;;;;;;;;;;;;:::i;:::-;40383:70;;40469:6;40464:123;40485:16;:23;40481:1;:27;40464:123;;;40571:4;40530:17;:38;40548:16;40565:1;40548:19;;;;;;-1:-1:-1;;;40548:19:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40530:38:0;;;;;;;;;;;-1:-1:-1;40530:38:0;:45;;-1:-1:-1;;40530:45:0;;;;;;;;;;40510:3;;;;:::i;:::-;;;;40464:123;;;-1:-1:-1;40613:20:0;;40597:13;40644:693;40665:13;:20;40661:1;:24;40644:693;;;40883:17;:40;40901:13;40915:1;40901:16;;;;;;-1:-1:-1;;;40901:16:0;;;;;;;;;;;;;;;;;;;;:21;-1:-1:-1;;;;;40883:40:0;;;;;;;;;;;40901:21;40883:40;;;;40878:448;;40948:13;40962:1;40948:16;;;;;;-1:-1:-1;;;40948:16:0;;;;;;;;;;;;;;;:27;;;40979:1;40948:32;40944:198;;;41005:7;;;;:::i;:::-;;;;40944:198;;;41061:61;;-1:-1:-1;;;41061:61:0;;39641:2:1;41061:61:0;;;39623:21:1;39680:2;39660:18;;;39653:30;39719:34;39699:18;;;39692:62;39790:21;39770:18;;;39763:49;39829:19;;41061:61:0;39613:241:1;40944:198:0;40878:448;;;41270:17;:40;41288:13;41302:1;41288:16;;;;;;-1:-1:-1;;;41288:16:0;;;;;;;;;;;;;;;;;;;;:21;-1:-1:-1;;;;;41270:40:0;;;;;;;;;;;41288:21;41270:40;41263:47;;-1:-1:-1;;41263:47:0;;;40878:448;40687:3;;;;:::i;:::-;;;;40644:693;;;;41470:16;:23;41461:5;:32;41453:94;;;;-1:-1:-1;;;41453:94:0;;39223:2:1;41453:94:0;;;39205:21:1;39262:2;39242:18;;;39235:30;39301:34;39281:18;;;39274:62;39372:19;39352:18;;;39345:47;39409:19;;41453:94:0;39195:239:1;41563:709:0;41624:7;41659:15;41689:18;41722:20;41757:35;41807:33;41855:14;41884:24;41947:4;41922:126;;;;;;;;;;;;:::i;:::-;42066:7;;:198;;;;;41644:404;;-1:-1:-1;41644:404:0;;-1:-1:-1;41644:404:0;;-1:-1:-1;41644:404:0;;-1:-1:-1;41644:404:0;-1:-1:-1;41644:404:0;-1:-1:-1;41644:404:0;-1:-1:-1;;;;;;42066:7:0;;:22;;:198;;41644:404;;;;;;;;;;;;;;42066:198;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42059:205;41563:709;-1:-1:-1;;;;;;;;;41563:709:0:o;35779:353::-;-1:-1:-1;;;;;35901:13:0;;;35883:15;35901:13;;;:6;:13;;;;;;;;:18;;;;;;;;;;35938:11;35930:60;;;;-1:-1:-1;;;35930:60:0;;42083:2:1;35930:60:0;;;42065:21:1;42122:2;42102:18;;;42095:30;42161:34;42141:18;;;42134:62;42232:6;42212:18;;;42205:34;42256:19;;35930:60:0;42055:226:1;35930:60:0;-1:-1:-1;;;;;36008:13:0;;;;;;;:6;:13;;;;;;;;:18;;;;;;;;;;;;36001:25;36039:40;;36015:5;36071:7;36039:24;:40::i;:::-;36095:29;;;-1:-1:-1;;;;;32396:15:1;;;32378:34;;32443:2;32428:18;;32421:34;;;32491:15;;32471:18;;;32464:43;36095:29:0;;;;;;;32305:2:1;36095:29:0;;;35779:353;;;:::o;16715:211::-;16859:58;;-1:-1:-1;;;;;32005:55:1;;16859:58:0;;;31987:74:1;32077:18;;;32070:34;;;16832:86:0;;16852:5;;16882:23;;31960:18:1;;16859:58:0;31942:168:1;19342:774:0;19766:23;19792:69;19820:4;19792:69;;;;;;;;;;;;;;;;;19800:5;-1:-1:-1;;;;;19792:27:0;;;:69;;;;;:::i;:::-;19876:17;;19766:95;;-1:-1:-1;19876:21:0;19872:237;;20031:10;20020:30;;;;;;;;;;;;:::i;:::-;20012:85;;;;-1:-1:-1;;;20012:85:0;;42488:2:1;20012:85:0;;;42470:21:1;42527:2;42507:18;;;42500:30;42566:34;42546:18;;;42539:62;42637:12;42617:18;;;42610:40;42667:19;;20012:85:0;42460:232:1;11632:229:0;11769:12;11801:52;11823:6;11831:4;11837:1;11840:12;11801:21;:52::i;:::-;11794:59;;11632:229;;;;;;:::o;12752:573::-;12922:12;12980:5;12955:21;:30;;12947:81;;;;-1:-1:-1;;;12947:81:0;;37222:2:1;12947:81:0;;;37204:21:1;37261:2;37241:18;;;37234:30;37300:34;37280:18;;;37273:62;37371:8;37351:18;;;37344:36;37397:19;;12947:81:0;37194:228:1;12947:81:0;9070:20;;13039:60;;;;-1:-1:-1;;;13039:60:0;;41313:2:1;13039:60:0;;;41295:21:1;41352:2;41332:18;;;41325:30;41391:31;41371:18;;;41364:59;41440:18;;13039:60:0;41285:179:1;13039:60:0;13173:12;13187:23;13214:6;-1:-1:-1;;;;;13214:11:0;13234:5;13242:4;13214:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13172:75;;;;13265:52;13283:7;13292:10;13304:12;13265:17;:52::i;:::-;13258:59;12752:573;-1:-1:-1;;;;;;;12752:573:0:o;15403:777::-;15553:12;15582:7;15578:595;;;-1:-1:-1;15613:10:0;15606:17;;15578:595;15727:17;;:21;15723:439;;15990:10;15984:17;16051:15;16038:10;16034:2;16030:19;16023:44;15938:148;16133:12;16126:20;;-1:-1:-1;;;16126:20:0;;;;;;;;:::i;14:142:1:-;90:20;;119:31;90:20;119:31;:::i;161:146::-;248:13;;270:31;248:13;270:31;:::i;312:769::-;;419:3;412:4;404:6;400:17;396:27;386:2;;441:5;434;427:20;386:2;481:6;468:20;507:4;531:60;547:43;587:2;547:43;:::i;:::-;531:60;:::i;:::-;625:15;;;656:12;;;;688:15;;;734:11;;;722:24;;718:33;;715:42;-1:-1:-1;712:2:1;;;774:5;767;760:20;712:2;800:5;814:238;828:2;825:1;822:9;814:238;;;899:3;886:17;916:31;941:5;916:31;:::i;:::-;960:18;;998:12;;;;1030;;;;846:1;839:9;814:238;;;-1:-1:-1;1070:5:1;;376:705;-1:-1:-1;;;;;;;376:705:1:o;1086:766::-;;1204:3;1197:4;1189:6;1185:17;1181:27;1171:2;;1226:5;1219;1212:20;1171:2;1259:6;1253:13;1285:4;1309:60;1325:43;1365:2;1325:43;:::i;1309:60::-;1403:15;;;1434:12;;;;1466:15;;;1512:11;;;1500:24;;1496:33;;1493:42;-1:-1:-1;1490:2:1;;;1552:5;1545;1538:20;1490:2;1578:5;1592:231;1606:2;1603:1;1600:9;1592:231;;;1670:3;1664:10;1687:31;1712:5;1687:31;:::i;:::-;1731:18;;1769:12;;;;1801;;;;1624:1;1617:9;1592:231;;1857:2062;;1976:3;1969:4;1961:6;1957:17;1953:27;1943:2;;1998:5;1991;1984:20;1943:2;2025:4;2049:78;2065:61;2118:6;2105:20;2065:61;:::i;2049:78::-;2173:20;;2161:33;;2210:12;;;;2242:15;;;2275:5;2289:1601;2316:6;2303:20;2300:1;2297:27;2289:1601;;;2401:3;2388:17;2380:6;2376:30;-1:-1:-1;;2538:4:1;2533:2;2528;2523:3;2519:12;2515:21;2511:32;2508:2;;;2560:5;2553;2546:20;2508:2;2594:21;2610:4;2594:21;:::i;:::-;2664:2;2660;2656:11;2643:25;2681:33;2706:7;2681:33;:::i;:::-;2727:22;;2806:2;2798:11;;2785:25;2769:14;;;2762:49;2861:4;2853:13;;2840:27;2890:18;2924:16;;;2921:2;;;2957:5;2950;2943:20;2921:2;2988:17;;;;3048:4;3029:12;;;3025:21;;3021:32;3018:2;;;3070:5;3063;3056:20;3018:2;3106:21;3122:4;3106:21;:::i;:::-;3091:36;;3177:2;3173;3169:11;3156:25;3140:41;;3210:2;3200:8;3197:16;3194:2;;;3230:5;3223;3216:20;3194:2;3267:61;3324:3;3319:2;3308:8;3304:2;3300:17;3296:26;3267:61;:::i;:::-;3258:7;3251:78;3379:2;3375;3371:11;3358:25;3342:41;;3412:2;3402:8;3399:16;3396:2;;;3432:5;3425;3418:20;3396:2;3478:61;3535:3;3530:2;3519:8;3515:2;3511:17;3507:26;3478:61;:::i;:::-;3473:2;3464:7;3460:16;3453:87;3590:4;3586:2;3582:13;3569:27;3553:43;;3625:2;3615:8;3612:16;3609:2;;;3645:5;3638;3631:20;3609:2;;3691:49;3736:3;3731:2;3720:8;3716:2;3712:17;3708:26;3691:49;:::i;:::-;3686:2;3673:16;;;3666:75;;;;3761:14;;3754:31;;;;3798:18;;-1:-1:-1;;3836:12:1;;;;3868;;;;2339:1;2332:9;2289:1601;;;-1:-1:-1;3908:5:1;;1933:1986;-1:-1:-1;;;;;;1933:1986:1:o;3924:2034::-;;4054:3;4047:4;4039:6;4035:17;4031:27;4021:2;;4076:5;4069;4062:20;4021:2;4109:6;4103:13;4136:60;4152:43;4192:2;4152:43;:::i;4136:60::-;4230:15;;;4270:4;4261:14;;;;4218:3;4295:17;;4330:5;4344:1585;4358:2;4355:1;4352:9;4344:1585;;;4431:3;4425:10;4417:6;4413:23;-1:-1:-1;;4568:4:1;4563:2;4558;4553:3;4549:12;4545:21;4541:32;4538:2;;;4590:5;4583;4576:20;4538:2;4624:21;4640:4;4624:21;:::i;:::-;4687:4;4683:2;4679:13;4673:20;4706:33;4731:7;4706:33;:::i;:::-;4752:22;;4826:2;4818:11;;4812:18;4805:4;4794:16;;4787:44;4874:4;4866:13;;4860:20;4903:18;4937:16;;;4934:2;;;4970:5;4963;4956:20;4934:2;5001:17;;;;5061:4;5042:12;;;5038:21;;5034:32;5031:2;;;5083:5;5076;5069:20;5031:2;5119:21;5135:4;5119:21;:::i;:::-;5104:36;;5183:4;5179:2;5175:13;5169:20;5153:36;;5218:2;5208:8;5205:16;5202:2;;;5238:5;5231;5224:20;5202:2;5275:74;5345:3;5338:4;5327:8;5323:2;5319:17;5315:28;5275:74;:::i;:::-;5266:7;5259:91;5393:2;5389;5385:11;5379:18;5363:34;;5426:2;5416:8;5413:16;5410:2;;;5446:5;5439;5432:20;5410:2;5494:74;5564:3;5557:4;5546:8;5542:2;5538:17;5534:28;5494:74;:::i;:::-;5487:4;5478:7;5474:18;5467:102;5612:4;5608:2;5604:13;5598:20;5582:36;;5647:2;5637:8;5634:16;5631:2;;;5667:5;5660;5653:20;5631:2;;5713:62;5771:3;5764:4;5753:8;5749:2;5745:17;5741:28;5713:62;:::i;:::-;5708:2;5695:16;;;5688:88;;;;5796:14;;5789:31;;;;5833:18;;-1:-1:-1;;5880:4:1;5871:14;;;;5905;;;;;4376:1;4369:9;4344:1585;;5963:694;;6070:3;6063:4;6055:6;6051:17;6047:27;6037:2;;6092:5;6085;6078:20;6037:2;6132:6;6119:20;6158:4;6182:60;6198:43;6238:2;6198:43;:::i;6182:60::-;6276:15;;;6307:12;;;;6339:15;;;6385:11;;;6373:24;;6369:33;;6366:42;-1:-1:-1;6363:2:1;;;6425:5;6418;6411:20;6363:2;6451:5;6465:163;6479:2;6476:1;6473:9;6465:163;;;6536:17;;6524:30;;6574:12;;;;6606;;;;6497:1;6490:9;6465:163;;6662:482;;6757:3;6750:4;6742:6;6738:17;6734:27;6724:2;;6779:5;6772;6765:20;6724:2;6819:6;6806:20;6850:48;6866:31;6894:2;6866:31;:::i;6850:48::-;6923:2;6914:7;6907:19;6969:3;6962:4;6957:2;6949:6;6945:15;6941:26;6938:35;6935:2;;;6990:5;6983;6976:20;6935:2;7059;7052:4;7044:6;7040:17;7033:4;7024:7;7020:18;7007:55;7082:16;;;7100:4;7078:27;7071:42;;;;7086:7;6714:430;-1:-1:-1;;6714:430:1:o;7149:444::-;;7255:3;7248:4;7240:6;7236:17;7232:27;7222:2;;7277:5;7270;7263:20;7222:2;7310:6;7304:13;7341:48;7357:31;7385:2;7357:31;:::i;7341:48::-;7414:2;7405:7;7398:19;7460:3;7453:4;7448:2;7440:6;7436:15;7432:26;7429:35;7426:2;;;7481:5;7474;7467:20;7426:2;7498:64;7559:2;7552:4;7543:7;7539:18;7532:4;7524:6;7520:17;7498:64;:::i;:::-;7580:7;7212:381;-1:-1:-1;;;;7212:381:1:o;7598:1125::-;;7705:4;7693:9;7688:3;7684:19;7680:30;7677:2;;;7727:5;7720;7713:20;7677:2;7753:21;7769:4;7753:21;:::i;:::-;7744:30;;7811:9;7798:23;7830:32;7854:7;7830:32;:::i;:::-;7871:22;;7945:2;7930:18;;7917:32;7958;7917;7958;:::i;:::-;8017:2;8006:14;;7999:31;8082:2;8067:18;;8054:32;8095;8054;8095;:::i;:::-;8154:2;8143:14;;8136:31;8219:2;8204:18;;8191:32;8232;8191;8232;:::i;:::-;8291:2;8280:14;;8273:31;8356:3;8341:19;;8328:33;8370:32;8328:33;8370:32;:::i;:::-;8429:3;8418:15;;8411:32;8495:3;8480:19;;8467:33;8509:30;8467:33;8509:30;:::i;:::-;8566:3;8555:15;;8548:32;8632:3;8617:19;;8604:33;8646:30;8604:33;8646:30;:::i;:::-;8703:3;8692:15;;8685:32;8696:5;7667:1056;-1:-1:-1;;7667:1056:1:o;8728:1087::-;;8846:4;8834:9;8829:3;8825:19;8821:30;8818:2;;;8868:5;8861;8854:20;8818:2;8894:21;8910:4;8894:21;:::i;:::-;8885:30;;8945:9;8939:16;8964:32;8988:7;8964:32;:::i;:::-;9005:22;;9072:2;9057:18;;9051:25;9085:32;9051:25;9085:32;:::i;:::-;9144:2;9133:14;;9126:31;9202:2;9187:18;;9181:25;9215:32;9181:25;9215:32;:::i;:::-;9274:2;9263:14;;9256:31;9332:2;9317:18;;9311:25;9345:32;9311:25;9345:32;:::i;:::-;9404:2;9393:14;;9386:31;9462:3;9447:19;;9441:26;9476:32;9441:26;9476:32;:::i;:::-;9535:3;9524:15;;9517:32;9594:3;9579:19;;9573:26;9608:30;9573:26;9608:30;:::i;:::-;9665:3;9654:15;;9647:32;9724:3;9709:19;;9703:26;9738:30;9703:26;9738:30;:::i;9820:257::-;;9932:2;9920:9;9911:7;9907:23;9903:32;9900:2;;;9953:6;9945;9938:22;9900:2;9997:9;9984:23;10016:31;10041:5;10016:31;:::i;10082:261::-;;10205:2;10193:9;10184:7;10180:23;10176:32;10173:2;;;10226:6;10218;10211:22;10173:2;10263:9;10257:16;10282:31;10307:5;10282:31;:::i;10348:1364::-;;;;;;;;10690:3;10678:9;10669:7;10665:23;10661:33;10658:2;;;10712:6;10704;10697:22;10658:2;10740:37;10767:9;10740:37;:::i;:::-;10730:47;;10828:2;10817:9;10813:18;10800:32;10851:18;10892:2;10884:6;10881:14;10878:2;;;10913:6;10905;10898:22;10878:2;10941:49;10982:7;10973:6;10962:9;10958:22;10941:49;:::i;:::-;10931:59;;11043:2;11032:9;11028:18;11015:32;10999:48;;11072:2;11062:8;11059:16;11056:2;;;11093:6;11085;11078:22;11056:2;11121:51;11164:7;11153:8;11142:9;11138:24;11121:51;:::i;:::-;11111:61;;11225:2;11214:9;11210:18;11197:32;11181:48;;11254:2;11244:8;11241:16;11238:2;;;11275:6;11267;11260:22;11238:2;11303:75;11370:7;11359:8;11348:9;11344:24;11303:75;:::i;:::-;11293:85;;11397:60;11449:7;11443:3;11432:9;11428:19;11397:60;:::i;:::-;11387:70;;11476:47;11518:3;11507:9;11503:19;11476:47;:::i;:::-;11466:57;;11576:3;11565:9;11561:19;11548:33;11532:49;;11606:2;11596:8;11593:16;11590:2;;;11627:6;11619;11612:22;11590:2;;11655:51;11698:7;11687:8;11676:9;11672:24;11655:51;:::i;:::-;11645:61;;;10648:1064;;;;;;;;;;:::o;11717:1424::-;;;;;;;;12070:3;12058:9;12049:7;12045:23;12041:33;12038:2;;;12092:6;12084;12077:22;12038:2;12120:48;12158:9;12120:48;:::i;:::-;12110:58;;12212:2;12201:9;12197:18;12191:25;12235:18;12276:2;12268:6;12265:14;12262:2;;;12297:6;12289;12282:22;12262:2;12325:60;12377:7;12368:6;12357:9;12353:22;12325:60;:::i;:::-;12315:70;;12431:2;12420:9;12416:18;12410:25;12394:41;;12460:2;12450:8;12447:16;12444:2;;;12481:6;12473;12466:22;12444:2;12509:62;12563:7;12552:8;12541:9;12537:24;12509:62;:::i;:::-;12499:72;;12617:2;12606:9;12602:18;12596:25;12580:41;;12646:2;12636:8;12633:16;12630:2;;;12667:6;12659;12652:22;12630:2;12695:86;12773:7;12762:8;12751:9;12747:24;12695:86;:::i;:::-;12685:96;;12800:71;12863:7;12857:3;12846:9;12842:19;12800:71;:::i;:::-;12790:81;;12890:58;12943:3;12932:9;12928:19;12890:58;:::i;:::-;12880:68;;12994:3;12983:9;12979:19;12973:26;12957:42;;13024:2;13014:8;13011:16;13008:2;;;13045:6;13037;13030:22;13008:2;;13073:62;13127:7;13116:8;13105:9;13101:24;13073:62;:::i;13146:398::-;;;13275:2;13263:9;13254:7;13250:23;13246:32;13243:2;;;13296:6;13288;13281:22;13243:2;13340:9;13327:23;13359:31;13384:5;13359:31;:::i;:::-;13409:5;-1:-1:-1;13466:2:1;13451:18;;13438:32;13479:33;13438:32;13479:33;:::i;:::-;13531:7;13521:17;;;13233:311;;;;;:::o;13549:768::-;;;;;;13747:3;13735:9;13726:7;13722:23;13718:33;13715:2;;;13769:6;13761;13754:22;13715:2;13813:9;13800:23;13832:31;13857:5;13832:31;:::i;:::-;13882:5;-1:-1:-1;13939:2:1;13924:18;;13911:32;13952:33;13911:32;13952:33;:::i;:::-;14004:7;-1:-1:-1;14063:2:1;14048:18;;14035:32;14076:33;14035:32;14076:33;:::i;:::-;14128:7;-1:-1:-1;14187:2:1;14172:18;;14159:32;14200:33;14159:32;14200:33;:::i;:::-;13705:612;;;;-1:-1:-1;13705:612:1;;14306:3;14291:19;14278:33;;13705:612;-1:-1:-1;;13705:612:1:o;14322:677::-;;;;;;14502:3;14490:9;14481:7;14477:23;14473:33;14470:2;;;14524:6;14516;14509:22;14470:2;14568:9;14555:23;14587:31;14612:5;14587:31;:::i;:::-;14637:5;-1:-1:-1;14694:2:1;14679:18;;14666:32;14707:33;14666:32;14707:33;:::i;:::-;14759:7;-1:-1:-1;14818:2:1;14803:18;;14790:32;14831:33;14790:32;14831:33;:::i;:::-;14460:539;;;;-1:-1:-1;14883:7:1;;14937:2;14922:18;;14909:32;;-1:-1:-1;14988:3:1;14973:19;14960:33;;14460:539;-1:-1:-1;;14460:539:1:o;15004:917::-;;;;;15169:2;15157:9;15148:7;15144:23;15140:32;15137:2;;;15190:6;15182;15175:22;15137:2;15234:9;15221:23;15253:31;15278:5;15253:31;:::i;:::-;15303:5;-1:-1:-1;15360:2:1;15345:18;;15332:32;15373:33;15332:32;15373:33;:::i;:::-;15425:7;-1:-1:-1;15483:2:1;15468:18;;15455:32;15506:18;15536:14;;;15533:2;;;15568:6;15560;15553:22;15533:2;15611:6;15600:9;15596:22;15586:32;;15656:7;15649:4;15645:2;15641:13;15637:27;15627:2;;15683:6;15675;15668:22;15627:2;15728;15715:16;15754:2;15746:6;15743:14;15740:2;;;15775:6;15767;15760:22;15740:2;15825:7;15820:2;15811:6;15807:2;15803:15;15799:24;15796:37;15793:2;;;15851:6;15843;15836:22;15793:2;15127:794;;;;-1:-1:-1;;15887:2:1;15879:11;;-1:-1:-1;;;15127:794:1:o;15926:626::-;;;;;16107:3;16095:9;16086:7;16082:23;16078:33;16075:2;;;16129:6;16121;16114:22;16075:2;16173:9;16160:23;16192:31;16217:5;16192:31;:::i;:::-;16242:5;-1:-1:-1;16299:2:1;16284:18;;16271:32;16312:33;16271:32;16312:33;:::i;:::-;16364:7;-1:-1:-1;16423:2:1;16408:18;;16395:32;16436:33;16395:32;16436:33;:::i;:::-;16065:487;;;;-1:-1:-1;16488:7:1;;16542:2;16527:18;16514:32;;-1:-1:-1;;16065:487:1:o;16557:466::-;;;;16703:2;16691:9;16682:7;16678:23;16674:32;16671:2;;;16724:6;16716;16709:22;16671:2;16768:9;16755:23;16787:31;16812:5;16787:31;:::i;:::-;16837:5;-1:-1:-1;16889:2:1;16874:18;;16861:32;;-1:-1:-1;16945:2:1;16930:18;;16917:32;16958:33;16917:32;16958:33;:::i;:::-;17010:7;17000:17;;;16661:362;;;;;:::o;17028:383::-;;17176:2;17164:9;17155:7;17151:23;17147:32;17144:2;;;17197:6;17189;17182:22;17144:2;17235:9;17229:16;17268:18;17260:6;17257:30;17254:2;;;17305:6;17297;17290:22;17254:2;17333:72;17397:7;17388:6;17377:9;17373:22;17333:72;:::i;17416:503::-;;;17570:2;17558:9;17549:7;17545:23;17541:32;17538:2;;;17591:6;17583;17576:22;17538:2;17636:9;17623:23;17669:18;17661:6;17658:30;17655:2;;;17706:6;17698;17691:22;17655:2;17734:61;17787:7;17778:6;17767:9;17763:22;17734:61;:::i;:::-;17724:71;;;17845:2;17834:9;17830:18;17817:32;17858:31;17883:5;17858:31;:::i;17924:1353::-;;;;;;18247:3;18235:9;18226:7;18222:23;18218:33;18215:2;;;18269:6;18261;18254:22;18215:2;18314:9;18301:23;18343:18;18384:2;18376:6;18373:14;18370:2;;;18405:6;18397;18390:22;18370:2;18433:61;18486:7;18477:6;18466:9;18462:22;18433:61;:::i;:::-;18423:71;;18547:2;18536:9;18532:18;18519:32;18503:48;;18576:2;18566:8;18563:16;18560:2;;;18597:6;18589;18582:22;18560:2;18625:63;18680:7;18669:8;18658:9;18654:24;18625:63;:::i;:::-;18615:73;;18741:2;18730:9;18726:18;18713:32;18697:48;;18770:2;18760:8;18757:16;18754:2;;;18791:6;18783;18776:22;18754:2;18819:63;18874:7;18863:8;18852:9;18848:24;18819:63;:::i;:::-;18809:73;;18935:2;18924:9;18920:18;18907:32;18891:48;;18964:2;18954:8;18951:16;18948:2;;;18985:6;18977;18970:22;18948:2;19013:63;19068:7;19057:8;19046:9;19042:24;19013:63;:::i;:::-;19003:73;;19129:3;19118:9;19114:19;19101:33;19085:49;;19159:2;19149:8;19146:16;19143:2;;;19180:6;19172;19165:22;19143:2;;19208:63;19263:7;19252:8;19241:9;19237:24;19208:63;:::i;:::-;19198:73;;;18205:1072;;;;;;;;:::o;19282:1116::-;;;;;19563:3;19551:9;19542:7;19538:23;19534:33;19531:2;;;19585:6;19577;19570:22;19531:2;19630:9;19617:23;19659:18;19700:2;19692:6;19689:14;19686:2;;;19721:6;19713;19706:22;19686:2;19749:61;19802:7;19793:6;19782:9;19778:22;19749:61;:::i;:::-;19739:71;;19863:2;19852:9;19848:18;19835:32;19819:48;;19892:2;19882:8;19879:16;19876:2;;;19913:6;19905;19898:22;19876:2;19941:63;19996:7;19985:8;19974:9;19970:24;19941:63;:::i;:::-;19931:73;;20057:2;20046:9;20042:18;20029:32;20013:48;;20086:2;20076:8;20073:16;20070:2;;;20107:6;20099;20092:22;20070:2;20135:63;20190:7;20179:8;20168:9;20164:24;20135:63;:::i;:::-;20125:73;;20251:2;20240:9;20236:18;20223:32;20207:48;;20280:2;20270:8;20267:16;20264:2;;;20301:6;20293;20286:22;20264:2;;20329:63;20384:7;20373:8;20362:9;20358:24;20329:63;:::i;:::-;20319:73;;;19521:877;;;;;;;:::o;20403:861::-;;;;20624:2;20612:9;20603:7;20599:23;20595:32;20592:2;;;20645:6;20637;20630:22;20592:2;20690:9;20677:23;20719:18;20760:2;20752:6;20749:14;20746:2;;;20781:6;20773;20766:22;20746:2;20809:61;20862:7;20853:6;20842:9;20838:22;20809:61;:::i;:::-;20799:71;;20923:2;20912:9;20908:18;20895:32;20879:48;;20952:2;20942:8;20939:16;20936:2;;;20973:6;20965;20958:22;20936:2;21001:63;21056:7;21045:8;21034:9;21030:24;21001:63;:::i;:::-;20991:73;;21117:2;21106:9;21102:18;21089:32;21073:48;;21146:2;21136:8;21133:16;21130:2;;;21167:6;21159;21152:22;21130:2;;21195:63;21250:7;21239:8;21228:9;21224:24;21195:63;:::i;:::-;21185:73;;;20582:682;;;;;:::o;21269:1404::-;;;;;;;21591:3;21579:9;21570:7;21566:23;21562:33;21559:2;;;21613:6;21605;21598:22;21559:2;21658:9;21645:23;21687:18;21728:2;21720:6;21717:14;21714:2;;;21749:6;21741;21734:22;21714:2;21777:61;21830:7;21821:6;21810:9;21806:22;21777:61;:::i;:::-;21767:71;;21891:2;21880:9;21876:18;21863:32;21847:48;;21920:2;21910:8;21907:16;21904:2;;;21941:6;21933;21926:22;21904:2;21969:63;22024:7;22013:8;22002:9;21998:24;21969:63;:::i;:::-;21959:73;;22085:2;22074:9;22070:18;22057:32;22041:48;;22114:2;22104:8;22101:16;22098:2;;;22135:6;22127;22120:22;22098:2;22163:63;22218:7;22207:8;22196:9;22192:24;22163:63;:::i;:::-;22153:73;;22279:2;22268:9;22264:18;22251:32;22235:48;;22308:2;22298:8;22295:16;22292:2;;;22329:6;22321;22314:22;22292:2;22357:63;22412:7;22401:8;22390:9;22386:24;22357:63;:::i;:::-;22347:73;;22473:3;22462:9;22458:19;22445:33;22429:49;;22503:2;22493:8;22490:16;22487:2;;;22524:6;22516;22509:22;22487:2;;22552:63;22607:7;22596:8;22585:9;22581:24;22552:63;:::i;:::-;22542:73;;;22662:3;22651:9;22647:19;22634:33;22624:43;;21549:1124;;;;;;;;:::o;22678:1483::-;;22825:2;22868;22856:9;22847:7;22843:23;22839:32;22836:2;;;22889:6;22881;22874:22;22836:2;22927:9;22921:16;22956:18;22997:2;22989:6;22986:14;22983:2;;;23018:6;23010;23003:22;22983:2;23061:6;23050:9;23046:22;23036:32;;23106:7;23099:4;23095:2;23091:13;23087:27;23077:2;;23133:6;23125;23118:22;23077:2;23167;23161:9;23190:60;23206:43;23246:2;23206:43;:::i;23190:60::-;23284:15;;;23315:12;;;;23347:11;;;23376:6;23391:740;23405:2;23402:1;23399:9;23391:740;;;23474:3;23468:10;23464:2;23460:19;23502:4;23617:2;-1:-1:-1;;23543:2:1;23534:7;23530:16;23526:89;23522:98;23519:2;;;23638:6;23630;23623:22;23519:2;23673:19;23689:2;23673:19;:::i;:::-;23734:2;23730;23726:11;23720:18;23751:33;23776:7;23751:33;:::i;:::-;23797:22;;23854:11;;;23848:18;;23882:16;;;23879:2;;;23916:6;23908;23901:22;23879:2;23961:64;24017:7;24012:2;24001:8;23997:2;23993:17;23989:26;23961:64;:::i;:::-;23945:14;;;23938:88;24039:18;;-1:-1:-1;;24077:12:1;;;;24109;;;;23423:1;23416:9;23391:740;;;-1:-1:-1;24150:5:1;;22805:1356;-1:-1:-1;;;;;;;;;22805:1356:1:o;24166:255::-;;24286:2;24274:9;24265:7;24261:23;24257:32;24254:2;;;24307:6;24299;24292:22;24254:2;24344:9;24338:16;24363:28;24385:5;24363:28;:::i;24426:190::-;;24538:2;24526:9;24517:7;24513:23;24509:32;24506:2;;;24559:6;24551;24544:22;24506:2;-1:-1:-1;24587:23:1;;24496:120;-1:-1:-1;24496:120:1:o;24621:194::-;;24744:2;24732:9;24723:7;24719:23;24715:32;24712:2;;;24765:6;24757;24750:22;24712:2;-1:-1:-1;24793:16:1;;24702:113;-1:-1:-1;24702:113:1:o;24952:486::-;;25043:5;25037:12;25070:6;25065:3;25058:19;25096:4;25125:2;25120:3;25116:12;25109:19;;25162:2;25155:5;25151:14;25183:3;25195:218;25209:6;25206:1;25203:13;25195:218;;;25274:13;;-1:-1:-1;;;;;25270:62:1;25258:75;;25353:12;;;;25388:15;;;;25231:1;25224:9;25195:218;;;-1:-1:-1;25429:3:1;;25013:425;-1:-1:-1;;;;;25013:425:1:o;25443:316::-;;25522:5;25516:12;25549:6;25544:3;25537:19;25565:63;25621:6;25614:4;25609:3;25605:14;25598:4;25591:5;25587:16;25565:63;:::i;:::-;25673:2;25661:15;-1:-1:-1;;25657:88:1;25648:98;;;;25748:4;25644:109;;25492:267;-1:-1:-1;;25492:267:1:o;26353:274::-;;26520:6;26514:13;26536:53;26582:6;26577:3;26570:4;26562:6;26558:17;26536:53;:::i;:::-;26605:16;;;;;26490:137;-1:-1:-1;;26490:137:1:o;29202:2606::-;;29715:3;-1:-1:-1;;;;;29818:2:1;29810:6;29806:15;29795:9;29788:34;29841:2;29879;29874;29863:9;29859:18;29852:30;29905:44;29945:2;29934:9;29930:18;29922:6;29905:44;:::i;:::-;29891:58;;29968:2;30018:9;30010:6;30006:22;30001:2;29990:9;29986:18;29979:50;30052:32;30077:6;30069;30052:32;:::i;:::-;30038:46;;30103:2;30153:9;30145:6;30141:22;30136:2;30125:9;30121:18;30114:50;30184:6;30219;30213:13;30250:6;30242;30235:22;30285:2;30277:6;30273:15;30266:22;;30345:2;30339;30331:6;30327:15;30319:6;30315:28;30311:37;30383:2;30375:6;30371:15;30404:4;30417:1152;30431:6;30428:1;30425:13;30417:1152;;;30496:19;;;-1:-1:-1;;30492:92:1;30480:105;;30608:13;;30653:9;;30649:18;;30634:34;;30711:11;;;30705:18;30688:15;;;30681:43;30763:11;;30757:18;30795:15;;;30788:27;;;30850:19;;30889:15;;;30882:27;;;30936:62;30993:3;30981:16;;30850:19;30936:62;:::i;:::-;30922:76;;31057:2;31043:12;31039:21;31033:28;31084:66;31213:2;31204:6;31196;31192:19;31188:28;31182:3;31174:6;31170:16;31163:54;31244:52;31289:6;31273:14;31244:52;:::i;:::-;31230:66;;31355:2;31341:12;31337:21;31331:28;31309:50;;31422:2;31413:6;31405;31401:19;31397:28;31391:3;31383:6;31379:16;31372:54;;;31449:40;31482:6;31466:14;31449:40;:::i;:::-;31547:12;;;;31439:50;-1:-1:-1;;;31512:15:1;;;;30453:1;30446:9;30417:1152;;;30421:3;;31578:59;31632:3;31621:9;31617:19;31609:6;25860:10;25852:5;25846:12;25842:29;25837:3;25830:42;25918:4;25911:5;25907:16;25901:23;25943:6;25999:2;25985:12;25981:21;25974:4;25969:3;25965:14;25958:45;26064:2;26056:4;26049:5;26045:16;26039:23;26035:32;26028:4;26023:3;26019:14;26012:56;26129:2;26121:4;26114:5;26110:16;26104:23;26100:32;26093:4;26088:3;26084:14;26077:56;26194:2;26186:4;26179:5;26175:16;26169:23;26165:32;26158:4;26153:3;26149:14;26142:56;;;26261:4;26254:5;26250:16;26244:23;26237:31;26230:39;26223:4;26218:3;26214:14;26207:63;26333:4;26326:5;26322:16;26316:23;26309:31;26302:39;26295:4;26290:3;26286:14;26279:63;25820:528;;;31578:59;-1:-1:-1;;;;;24886:54:1;;31688:3;31673:19;;24874:67;31742:9;31734:6;31730:22;31724:3;31713:9;31709:19;31702:51;31770:32;31795:6;31787;31770:32;:::i;:::-;31762:40;;;;;;;;;;29695:2113;;;;;;;;;;:::o;32518:1130::-;32731:2;32783:21;;;32853:13;;32756:18;;;32875:22;;;32518:1130;;32731:2;32916;;32934:18;;;;32994:15;;;32979:31;;32975:40;;33038:15;;;32518:1130;33084:535;33098:6;33095:1;33092:13;33084:535;;;33163:22;;;33187:66;33159:95;33147:108;;33278:13;;33323:9;;-1:-1:-1;;;;;33319:58:1;33304:74;;33417:11;;33411:18;33449:15;;;33442:27;;;33492:47;33523:15;;;33411:18;33492:47;:::i;:::-;33597:12;;;;33482:57;-1:-1:-1;;33562:15:1;;;;33120:1;33113:9;33084:535;;;-1:-1:-1;33636:6:1;;32711:937;-1:-1:-1;;;;;;;;32711:937:1:o;34106:632::-;;-1:-1:-1;;;;;34487:2:1;34479:6;34475:15;34464:9;34457:34;34539:2;34531:6;34527:15;34522:2;34511:9;34507:18;34500:43;;34579:6;34574:2;34563:9;34559:18;34552:34;34622:6;34617:2;34606:9;34602:18;34595:34;34666:3;34660;34649:9;34645:19;34638:32;34687:45;34727:3;34716:9;34712:19;34704:6;34687:45;:::i;34743:219::-;;34892:2;34881:9;34874:21;34912:44;34952:2;34941:9;34937:18;34929:6;34912:44;:::i;44139:334::-;44210:2;44204:9;44266:2;44256:13;;-1:-1:-1;;44252:86:1;44240:99;;44369:18;44354:34;;44390:22;;;44351:62;44348:2;;;44416:18;;:::i;:::-;44452:2;44445:22;44184:289;;-1:-1:-1;44184:289:1:o;44478:186::-;;44571:18;44563:6;44560:30;44557:2;;;44593:18;;:::i;:::-;-1:-1:-1;44653:4:1;44634:17;;;44630:28;;44547:117::o;44669:245::-;;44750:18;44742:6;44739:30;44736:2;;;44772:18;;:::i;:::-;-1:-1:-1;44829:2:1;44817:15;-1:-1:-1;;44813:88:1;44903:4;44809:99;;44726:188::o;44919:128::-;;44990:1;44986:6;44983:1;44980:13;44977:2;;;44996:18;;:::i;:::-;-1:-1:-1;45032:9:1;;44967:80::o;45052:125::-;;45120:1;45117;45114:8;45111:2;;;45125:18;;:::i;:::-;-1:-1:-1;45162:9:1;;45101:76::o;45182:258::-;45254:1;45264:113;45278:6;45275:1;45272:13;45264:113;;;45354:11;;;45348:18;45335:11;;;45328:39;45300:2;45293:10;45264:113;;;45395:6;45392:1;45389:13;45386:2;;;-1:-1:-1;;45430:1:1;45412:16;;45405:27;45235:205::o;45445:196::-;;45512:5;45502:2;;45521:18;;:::i;:::-;-1:-1:-1;;;45557:78:1;;45492:149::o;45646:195::-;;-1:-1:-1;;45709:5:1;45706:77;45703:2;;;45786:18;;:::i;:::-;-1:-1:-1;45833:1:1;45822:13;;45693:148::o;45846:184::-;-1:-1:-1;;;45895:1:1;45888:88;45995:4;45992:1;45985:15;46019:4;46016:1;46009:15;46035:184;-1:-1:-1;;;46084:1:1;46077:88;46184:4;46181:1;46174:15;46208:4;46205:1;46198:15;46224:154;-1:-1:-1;;;;;46303:5:1;46299:54;46292:5;46289:65;46279:2;;46368:1;46365;46358:12;46279:2;46269:109;:::o;46383:118::-;46469:5;46462:13;46455:21;46448:5;46445:32;46435:2;;46491:1;46488;46481:12;46506:117;46591:6;46584:5;46580:18;46573:5;46570:29;46560:2;;46613:1;46610;46603:12;46628:121;46713:10;46706:5;46702:22;46695:5;46692:33;46682:2;;46739:1;46736;46729:12
Swarm Source
ipfs://814b03edae956f9b21eea6d3058f3302626f767295a322ba00af7ac8f53a1794
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.