Contract Overview
Balance:
0 MATIC
MATIC Value:
$0.00
My Name Tag:
Not Available, login to update
Txn Hash |
Method
|
Block
|
From
|
To
|
Value | [Txn Fee] | |||
---|---|---|---|---|---|---|---|---|---|
0x43f37cc2a56a83a0436ac0270e5f82cc1532483161cd46ac06ac0d384cb7a8c9 | Initialize | 38512942 | 2 days 5 hrs ago | 0xe3c601b1fc6564ebf5603fcad7956697761e39db | IN | 0xab770aa6ce1fd9305c25e0c3ab03fd8c53e4c880 | 0 MATIC | 0.0151319311 | |
0x610379d8b43acbeedc33fa6fe155ceca902685d5f0ed8d0a848216ef37a1f25c | 0x60806040 | 38511188 | 2 days 6 hrs ago | 0xe3c601b1fc6564ebf5603fcad7956697761e39db | IN | Create: OrderBook | 0 MATIC | 0.436165177149 |
[ Download CSV Export ]
Contract Name:
OrderBook
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2023-01-25 */ // SPDX-License-Identifier: MIT pragma solidity ^0.6.2; /** * @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.3._ */ 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.3._ */ 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); } } } } pragma solidity 0.6.12; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor () internal { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } pragma solidity 0.6.12; interface IRouter { function addPlugin(address _plugin) external; function pluginTransfer(address _token, address _account, address _receiver, uint256 _amount) external; function pluginIncreasePosition(address _account, address _collateralToken, address _indexToken, uint256 _sizeDelta, bool _isLong) external; function pluginDecreasePosition(address _account, address _collateralToken, address _indexToken, uint256 _collateralDelta, uint256 _sizeDelta, bool _isLong, address _receiver) external returns (uint256); function swap(address[] memory _path, uint256 _amountIn, uint256 _minOut, address _receiver) external; function plugins(address _plugin) external returns (bool); } pragma solidity 0.6.12; interface IVault { function isInitialized() external view returns (bool); function isSwapEnabled() external view returns (bool); function isLeverageEnabled() external view returns (bool); function setError(uint256 _errorCode, string calldata _error) external; function router() external view returns (address); function usdg() external view returns (address); function gov() external view returns (address); function whitelistedTokenCount() external view returns (uint256); function maxLeverage() external view returns (uint256); function minProfitTime() external view returns (uint256); function hasDynamicFees() external view returns (bool); function fundingInterval() external view returns (uint256); function totalTokenWeights() external view returns (uint256); function inManagerMode() external view returns (bool); function inPrivateLiquidationMode() external view returns (bool); function maxGasPrice() external view returns (uint256); function approvedRouters(address _account, address _router) external view returns (bool); function isLiquidator(address _account) external view returns (bool); function isManager(address _account) external view returns (bool); function minProfitBasisPoints(address _token) external view returns (uint256); function tokenBalances(address _token) external view returns (uint256); function lastFundingTimes(address _token) external view returns (uint256); function setInManagerMode(bool _inManagerMode) external; function setManager(address _manager, bool _isManager) external; function setIsSwapEnabled(bool _isSwapEnabled) external; function setIsLeverageEnabled(bool _isLeverageEnabled) external; function setMaxGasPrice(uint256 _maxGasPrice) external; function setBufferAmount(address _token, uint256 _amount) external; function setFees( uint256 _taxBasisPoints, uint256 _stableTaxBasisPoints, uint256 _mintBurnFeeBasisPoints, uint256 _swapFeeBasisPoints, uint256 _stableSwapFeeBasisPoints, uint256 _marginFeeBasisPoints, uint256 _liquidationFeeUsd, uint256 _minProfitTime, bool _hasDynamicFees ) external; function setTokenConfig( address _token, uint256 _tokenDecimals, uint256 _redemptionBps, uint256 _minProfitBps, uint256 _maxUsdgAmount, bool _isStable, bool _isShortable ) external; function setPriceFeed(address _priceFeed) external; function withdrawFees(address _token, address _receiver) external returns (uint256); function directPoolDeposit(address _token) external; function buyUSDG(address _token, address _receiver) external returns (uint256); function sellUSDG(address _token, address _receiver) external returns (uint256); function swap(address _tokenIn, address _tokenOut, address _receiver) external returns (uint256); function increasePosition(address _account, address _collateralToken, address _indexToken, uint256 _sizeDelta, bool _isLong) external; function decreasePosition(address _account, address _collateralToken, address _indexToken, uint256 _collateralDelta, uint256 _sizeDelta, bool _isLong, address _receiver) external returns (uint256); function tokenToUsdMin(address _token, uint256 _tokenAmount) external view returns (uint256); function priceFeed() external view returns (address); function fundingRateFactor() external view returns (uint256); function stableFundingRateFactor() external view returns (uint256); function cumulativeFundingRates(address _token) external view returns (uint256); function getNextFundingRate(address _token) external view returns (uint256); function getFeeBasisPoints(address _token, uint256 _usdgDelta, uint256 _feeBasisPoints, uint256 _taxBasisPoints, bool _increment) external view returns (uint256); function liquidationFeeUsd() external view returns (uint256); function taxBasisPoints() external view returns (uint256); function stableTaxBasisPoints() external view returns (uint256); function mintBurnFeeBasisPoints() external view returns (uint256); function swapFeeBasisPoints() external view returns (uint256); function stableSwapFeeBasisPoints() external view returns (uint256); function marginFeeBasisPoints() external view returns (uint256); function allWhitelistedTokensLength() external view returns (uint256); function allWhitelistedTokens(uint256) external view returns (address); function whitelistedTokens(address _token) external view returns (bool); function stableTokens(address _token) external view returns (bool); function shortableTokens(address _token) external view returns (bool); function feeReserves(address _token) external view returns (uint256); function globalShortSizes(address _token) external view returns (uint256); function globalShortAveragePrices(address _token) external view returns (uint256); function tokenDecimals(address _token) external view returns (uint256); function tokenWeights(address _token) external view returns (uint256); function guaranteedUsd(address _token) external view returns (uint256); function poolAmounts(address _token) external view returns (uint256); function bufferAmounts(address _token) external view returns (uint256); function reservedAmounts(address _token) external view returns (uint256); function usdgAmounts(address _token) external view returns (uint256); function maxUsdgAmounts(address _token) external view returns (uint256); function getRedemptionAmount(address _token, uint256 _usdgAmount) external view returns (uint256); function getMaxPrice(address _token) external view returns (uint256); function getMinPrice(address _token) external view returns (uint256); function getDelta(address _indexToken, uint256 _size, uint256 _averagePrice, bool _isLong, uint256 _lastIncreasedTime) external view returns (bool, uint256); function getPosition(address _account, address _collateralToken, address _indexToken, bool _isLong) external view returns (uint256, uint256, uint256, uint256, uint256, uint256, bool, uint256); } pragma solidity 0.6.12; interface IOrderBook { function getSwapOrder(address _account, uint256 _orderIndex) external view returns ( address path0, address path1, address path2, uint256 amountIn, uint256 minOut, uint256 triggerRatio, bool triggerAboveThreshold, bool shouldUnwrap, uint256 executionFee ); function getIncreaseOrder(address _account, uint256 _orderIndex) external view returns ( address purchaseToken, uint256 purchaseTokenAmount, address collateralToken, address indexToken, uint256 sizeDelta, bool isLong, uint256 triggerPrice, bool triggerAboveThreshold, uint256 executionFee ); function getDecreaseOrder(address _account, uint256 _orderIndex) external view returns ( address collateralToken, uint256 collateralDelta, address indexToken, uint256 sizeDelta, bool isLong, uint256 triggerPrice, bool triggerAboveThreshold, uint256 executionFee ); } pragma solidity 0.6.12; interface IWETH { function deposit() external payable; function transfer(address to, uint value) external returns (bool); function withdraw(uint) external; } pragma solidity 0.6.12; /** * @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); } pragma solidity 0.6.12; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } pragma solidity 0.6.12; /** * @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 SafeMath for uint256; 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).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _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"); } } } pragma solidity ^0.6.0; contract OrderBook is ReentrancyGuard, IOrderBook { using SafeMath for uint256; using SafeERC20 for IERC20; using Address for address payable; uint256 public constant PRICE_PRECISION = 1e30; uint256 public constant USDG_PRECISION = 1e18; struct IncreaseOrder { address account; address purchaseToken; uint256 purchaseTokenAmount; address collateralToken; address indexToken; uint256 sizeDelta; bool isLong; uint256 triggerPrice; bool triggerAboveThreshold; uint256 executionFee; } struct DecreaseOrder { address account; address collateralToken; uint256 collateralDelta; address indexToken; uint256 sizeDelta; bool isLong; uint256 triggerPrice; bool triggerAboveThreshold; uint256 executionFee; } struct SwapOrder { address account; address[] path; uint256 amountIn; uint256 minOut; uint256 triggerRatio; bool triggerAboveThreshold; bool shouldUnwrap; uint256 executionFee; } mapping (address => mapping(uint256 => IncreaseOrder)) public increaseOrders; mapping (address => uint256) public increaseOrdersIndex; mapping (address => mapping(uint256 => DecreaseOrder)) public decreaseOrders; mapping (address => uint256) public decreaseOrdersIndex; mapping (address => mapping(uint256 => SwapOrder)) public swapOrders; mapping (address => uint256) public swapOrdersIndex; address public gov; address public weth; address public usdg; address public router; address public vault; uint256 public minExecutionFee; uint256 public minPurchaseTokenAmountUsd; bool public isInitialized = false; event CreateIncreaseOrder( address indexed account, uint256 orderIndex, address purchaseToken, uint256 purchaseTokenAmount, address collateralToken, address indexToken, uint256 sizeDelta, bool isLong, uint256 triggerPrice, bool triggerAboveThreshold, uint256 executionFee ); event CancelIncreaseOrder( address indexed account, uint256 orderIndex, address purchaseToken, uint256 purchaseTokenAmount, address collateralToken, address indexToken, uint256 sizeDelta, bool isLong, uint256 triggerPrice, bool triggerAboveThreshold, uint256 executionFee ); event ExecuteIncreaseOrder( address indexed account, uint256 orderIndex, address purchaseToken, uint256 purchaseTokenAmount, address collateralToken, address indexToken, uint256 sizeDelta, bool isLong, uint256 triggerPrice, bool triggerAboveThreshold, uint256 executionFee, uint256 executionPrice ); event UpdateIncreaseOrder( address indexed account, uint256 orderIndex, address collateralToken, address indexToken, bool isLong, uint256 sizeDelta, uint256 triggerPrice, bool triggerAboveThreshold ); event CreateDecreaseOrder( address indexed account, uint256 orderIndex, address collateralToken, uint256 collateralDelta, address indexToken, uint256 sizeDelta, bool isLong, uint256 triggerPrice, bool triggerAboveThreshold, uint256 executionFee ); event CancelDecreaseOrder( address indexed account, uint256 orderIndex, address collateralToken, uint256 collateralDelta, address indexToken, uint256 sizeDelta, bool isLong, uint256 triggerPrice, bool triggerAboveThreshold, uint256 executionFee ); event ExecuteDecreaseOrder( address indexed account, uint256 orderIndex, address collateralToken, uint256 collateralDelta, address indexToken, uint256 sizeDelta, bool isLong, uint256 triggerPrice, bool triggerAboveThreshold, uint256 executionFee, uint256 executionPrice ); event UpdateDecreaseOrder( address indexed account, uint256 orderIndex, address collateralToken, uint256 collateralDelta, address indexToken, uint256 sizeDelta, bool isLong, uint256 triggerPrice, bool triggerAboveThreshold ); event CreateSwapOrder( address indexed account, uint256 orderIndex, address[] path, uint256 amountIn, uint256 minOut, uint256 triggerRatio, bool triggerAboveThreshold, bool shouldUnwrap, uint256 executionFee ); event CancelSwapOrder( address indexed account, uint256 orderIndex, address[] path, uint256 amountIn, uint256 minOut, uint256 triggerRatio, bool triggerAboveThreshold, bool shouldUnwrap, uint256 executionFee ); event UpdateSwapOrder( address indexed account, uint256 ordexIndex, address[] path, uint256 amountIn, uint256 minOut, uint256 triggerRatio, bool triggerAboveThreshold, bool shouldUnwrap, uint256 executionFee ); event ExecuteSwapOrder( address indexed account, uint256 orderIndex, address[] path, uint256 amountIn, uint256 minOut, uint256 amountOut, uint256 triggerRatio, bool triggerAboveThreshold, bool shouldUnwrap, uint256 executionFee ); event Initialize( address router, address vault, address weth, address usdg, uint256 minExecutionFee, uint256 minPurchaseTokenAmountUsd ); event UpdateMinExecutionFee(uint256 minExecutionFee); event UpdateMinPurchaseTokenAmountUsd(uint256 minPurchaseTokenAmountUsd); event UpdateGov(address gov); modifier onlyGov() { require(msg.sender == gov, "OrderBook: forbidden"); _; } constructor() public { gov = msg.sender; } function initialize( address _router, address _vault, address _weth, address _usdg, uint256 _minExecutionFee, uint256 _minPurchaseTokenAmountUsd ) external onlyGov { require(!isInitialized, "OrderBook: already initialized"); isInitialized = true; router = _router; vault = _vault; weth = _weth; usdg = _usdg; minExecutionFee = _minExecutionFee; minPurchaseTokenAmountUsd = _minPurchaseTokenAmountUsd; emit Initialize(_router, _vault, _weth, _usdg, _minExecutionFee, _minPurchaseTokenAmountUsd); } receive() external payable { require(msg.sender == weth, "OrderBook: invalid sender"); } function setMinExecutionFee(uint256 _minExecutionFee) external onlyGov { minExecutionFee = _minExecutionFee; emit UpdateMinExecutionFee(_minExecutionFee); } function setMinPurchaseTokenAmountUsd(uint256 _minPurchaseTokenAmountUsd) external onlyGov { minPurchaseTokenAmountUsd = _minPurchaseTokenAmountUsd; emit UpdateMinPurchaseTokenAmountUsd(_minPurchaseTokenAmountUsd); } function setGov(address _gov) external onlyGov { require(_gov != address(0x0), 'Wrong address'); gov = _gov; emit UpdateGov(_gov); } function getSwapOrder(address _account, uint256 _orderIndex) override public view returns ( address path0, address path1, address path2, uint256 amountIn, uint256 minOut, uint256 triggerRatio, bool triggerAboveThreshold, bool shouldUnwrap, uint256 executionFee ) { SwapOrder memory order = swapOrders[_account][_orderIndex]; return ( order.path.length > 0 ? order.path[0] : address(0), order.path.length > 1 ? order.path[1] : address(0), order.path.length > 2 ? order.path[2] : address(0), order.amountIn, order.minOut, order.triggerRatio, order.triggerAboveThreshold, order.shouldUnwrap, order.executionFee ); } function createSwapOrder( address[] memory _path, uint256 _amountIn, uint256 _minOut, uint256 _triggerRatio, // tokenB / tokenA bool _triggerAboveThreshold, uint256 _executionFee, bool _shouldWrap, bool _shouldUnwrap ) external payable nonReentrant { require(_path.length == 2 || _path.length == 3, "OrderBook: invalid _path.length"); require(_path[0] != _path[_path.length - 1], "OrderBook: invalid _path"); require(_amountIn > 0, "OrderBook: invalid _amountIn"); require(_executionFee >= minExecutionFee, "OrderBook: insufficient execution fee"); // always need this call because of mandatory executionFee user has to transfer in ETH _transferInETH(); if (_shouldWrap) { require(_path[0] == weth, "OrderBook: only weth could be wrapped"); require(msg.value == _executionFee.add(_amountIn), "OrderBook: incorrect value transferred"); } else { require(msg.value == _executionFee, "OrderBook: incorrect execution fee transferred"); IRouter(router).pluginTransfer(_path[0], msg.sender, address(this), _amountIn); } _createSwapOrder(msg.sender, _path, _amountIn, _minOut, _triggerRatio, _triggerAboveThreshold, _shouldUnwrap, _executionFee); } function _createSwapOrder( address _account, address[] memory _path, uint256 _amountIn, uint256 _minOut, uint256 _triggerRatio, bool _triggerAboveThreshold, bool _shouldUnwrap, uint256 _executionFee ) private { uint256 _orderIndex = swapOrdersIndex[_account]; SwapOrder memory order = SwapOrder( _account, _path, _amountIn, _minOut, _triggerRatio, _triggerAboveThreshold, _shouldUnwrap, _executionFee ); swapOrdersIndex[_account] = _orderIndex.add(1); swapOrders[_account][_orderIndex] = order; emit CreateSwapOrder( _account, _orderIndex, _path, _amountIn, _minOut, _triggerRatio, _triggerAboveThreshold, _shouldUnwrap, _executionFee ); } function cancelMultiple( uint256[] memory _swapOrderIndexes, uint256[] memory _increaseOrderIndexes, uint256[] memory _decreaseOrderIndexes ) external { for (uint256 i = 0; i < _swapOrderIndexes.length; i++) { cancelSwapOrder(_swapOrderIndexes[i]); } for (uint256 i = 0; i < _increaseOrderIndexes.length; i++) { cancelIncreaseOrder(_increaseOrderIndexes[i]); } for (uint256 i = 0; i < _decreaseOrderIndexes.length; i++) { cancelDecreaseOrder(_decreaseOrderIndexes[i]); } } function cancelSwapOrder(uint256 _orderIndex) public nonReentrant { SwapOrder memory order = swapOrders[msg.sender][_orderIndex]; require(order.account != address(0), "OrderBook: non-existent order"); delete swapOrders[msg.sender][_orderIndex]; if (order.path[0] == weth) { _transferOutETH(order.executionFee.add(order.amountIn), msg.sender); } else { IERC20(order.path[0]).safeTransfer(msg.sender, order.amountIn); _transferOutETH(order.executionFee, msg.sender); } emit CancelSwapOrder( msg.sender, _orderIndex, order.path, order.amountIn, order.minOut, order.triggerRatio, order.triggerAboveThreshold, order.shouldUnwrap, order.executionFee ); } function getUsdgMinPrice(address _otherToken) public view returns (uint256) { // USDG_PRECISION is the same as 1 USDG uint256 redemptionAmount = IVault(vault).getRedemptionAmount(_otherToken, USDG_PRECISION); uint256 otherTokenPrice = IVault(vault).getMinPrice(_otherToken); uint256 otherTokenDecimals = IVault(vault).tokenDecimals(_otherToken); return redemptionAmount.mul(otherTokenPrice).div(10 ** otherTokenDecimals); } function validateSwapOrderPriceWithTriggerAboveThreshold( address[] memory _path, uint256 _triggerRatio ) public view returns (bool) { require(_path.length == 2 || _path.length == 3, "OrderBook: invalid _path.length"); // limit orders don't need this validation because minOut is enough // so this validation handles scenarios for stop orders only // when a user wants to swap when a price of tokenB increases relative to tokenA address tokenA = _path[0]; address tokenB = _path[_path.length - 1]; uint256 tokenAPrice; uint256 tokenBPrice; // 1. USDG doesn't have a price feed so we need to calculate it based on redepmtion amount of a specific token // That's why USDG price in USD can vary depending on the redepmtion token // 2. In complex scenarios with path=[USDG, BNB, BTC] we need to know how much BNB we'll get for provided USDG // to know how much BTC will be received // That's why in such scenario BNB should be used to determine price of USDG if (tokenA == usdg) { // with both _path.length == 2 or 3 we need usdg price against _path[1] tokenAPrice = getUsdgMinPrice(_path[1]); } else { tokenAPrice = IVault(vault).getMinPrice(tokenA); } if (tokenB == usdg) { tokenBPrice = PRICE_PRECISION; } else { tokenBPrice = IVault(vault).getMaxPrice(tokenB); } uint256 currentRatio = tokenBPrice.mul(PRICE_PRECISION).div(tokenAPrice); bool isValid = currentRatio > _triggerRatio; return isValid; } function updateSwapOrder(uint256 _orderIndex, uint256 _minOut, uint256 _triggerRatio, bool _triggerAboveThreshold) external nonReentrant { SwapOrder storage order = swapOrders[msg.sender][_orderIndex]; require(order.account != address(0), "OrderBook: non-existent order"); order.minOut = _minOut; order.triggerRatio = _triggerRatio; order.triggerAboveThreshold = _triggerAboveThreshold; emit UpdateSwapOrder( msg.sender, _orderIndex, order.path, order.amountIn, _minOut, _triggerRatio, _triggerAboveThreshold, order.shouldUnwrap, order.executionFee ); } function executeSwapOrder(address _account, uint256 _orderIndex, address payable _feeReceiver) external nonReentrant { SwapOrder memory order = swapOrders[_account][_orderIndex]; require(order.account != address(0), "OrderBook: non-existent order"); if (order.triggerAboveThreshold) { // gas optimisation // order.minAmount should prevent wrong price execution in case of simple limit order require( validateSwapOrderPriceWithTriggerAboveThreshold(order.path, order.triggerRatio), "OrderBook: invalid price for execution" ); } delete swapOrders[_account][_orderIndex]; IERC20(order.path[0]).safeTransfer(vault, order.amountIn); uint256 _amountOut; if (order.path[order.path.length - 1] == weth && order.shouldUnwrap) { _amountOut = _swap(order.path, order.minOut, address(this)); _transferOutETH(_amountOut, payable(order.account)); } else { _amountOut = _swap(order.path, order.minOut, order.account); } // pay executor _transferOutETH(order.executionFee, _feeReceiver); emit ExecuteSwapOrder( _account, _orderIndex, order.path, order.amountIn, order.minOut, _amountOut, order.triggerRatio, order.triggerAboveThreshold, order.shouldUnwrap, order.executionFee ); } function validatePositionOrderPrice( bool _triggerAboveThreshold, uint256 _triggerPrice, address _indexToken, bool _maximizePrice, bool _raise ) public view returns (uint256, bool) { uint256 currentPrice = _maximizePrice ? IVault(vault).getMaxPrice(_indexToken) : IVault(vault).getMinPrice(_indexToken); bool isPriceValid = _triggerAboveThreshold ? currentPrice > _triggerPrice : currentPrice < _triggerPrice; if (_raise) { require(isPriceValid, "OrderBook: invalid price for execution"); } return (currentPrice, isPriceValid); } function getDecreaseOrder(address _account, uint256 _orderIndex) override public view returns ( address collateralToken, uint256 collateralDelta, address indexToken, uint256 sizeDelta, bool isLong, uint256 triggerPrice, bool triggerAboveThreshold, uint256 executionFee ) { DecreaseOrder memory order = decreaseOrders[_account][_orderIndex]; return ( order.collateralToken, order.collateralDelta, order.indexToken, order.sizeDelta, order.isLong, order.triggerPrice, order.triggerAboveThreshold, order.executionFee ); } function getIncreaseOrder(address _account, uint256 _orderIndex) override public view returns ( address purchaseToken, uint256 purchaseTokenAmount, address collateralToken, address indexToken, uint256 sizeDelta, bool isLong, uint256 triggerPrice, bool triggerAboveThreshold, uint256 executionFee ) { IncreaseOrder memory order = increaseOrders[_account][_orderIndex]; return ( order.purchaseToken, order.purchaseTokenAmount, order.collateralToken, order.indexToken, order.sizeDelta, order.isLong, order.triggerPrice, order.triggerAboveThreshold, order.executionFee ); } function createIncreaseOrder( address[] memory _path, uint256 _amountIn, address _indexToken, uint256 _minOut, uint256 _sizeDelta, address _collateralToken, bool _isLong, uint256 _triggerPrice, bool _triggerAboveThreshold, uint256 _executionFee, bool _shouldWrap ) external payable nonReentrant { // always need this call because of mandatory executionFee user has to transfer in ETH _transferInETH(); require(_executionFee >= minExecutionFee, "OrderBook: insufficient execution fee"); if (_shouldWrap) { require(_path[0] == weth, "OrderBook: only weth could be wrapped"); require(msg.value == _executionFee.add(_amountIn), "OrderBook: incorrect value transferred"); } else { require(msg.value == _executionFee, "OrderBook: incorrect execution fee transferred"); IRouter(router).pluginTransfer(_path[0], msg.sender, address(this), _amountIn); } address _purchaseToken = _path[_path.length - 1]; uint256 _purchaseTokenAmount; if (_path.length > 1) { require(_path[0] != _purchaseToken, "OrderBook: invalid _path"); IERC20(_path[0]).safeTransfer(vault, _amountIn); _purchaseTokenAmount = _swap(_path, _minOut, address(this)); } else { _purchaseTokenAmount = _amountIn; } { uint256 _purchaseTokenAmountUsd = IVault(vault).tokenToUsdMin(_purchaseToken, _purchaseTokenAmount); require(_purchaseTokenAmountUsd >= minPurchaseTokenAmountUsd, "OrderBook: insufficient collateral"); } _createIncreaseOrder( msg.sender, _purchaseToken, _purchaseTokenAmount, _collateralToken, _indexToken, _sizeDelta, _isLong, _triggerPrice, _triggerAboveThreshold, _executionFee ); } function _createIncreaseOrder( address _account, address _purchaseToken, uint256 _purchaseTokenAmount, address _collateralToken, address _indexToken, uint256 _sizeDelta, bool _isLong, uint256 _triggerPrice, bool _triggerAboveThreshold, uint256 _executionFee ) private { uint256 _orderIndex = increaseOrdersIndex[msg.sender]; IncreaseOrder memory order = IncreaseOrder( _account, _purchaseToken, _purchaseTokenAmount, _collateralToken, _indexToken, _sizeDelta, _isLong, _triggerPrice, _triggerAboveThreshold, _executionFee ); increaseOrdersIndex[_account] = _orderIndex.add(1); increaseOrders[_account][_orderIndex] = order; emit CreateIncreaseOrder( _account, _orderIndex, _purchaseToken, _purchaseTokenAmount, _collateralToken, _indexToken, _sizeDelta, _isLong, _triggerPrice, _triggerAboveThreshold, _executionFee ); } function updateIncreaseOrder(uint256 _orderIndex, uint256 _sizeDelta, uint256 _triggerPrice, bool _triggerAboveThreshold) external nonReentrant { IncreaseOrder storage order = increaseOrders[msg.sender][_orderIndex]; require(order.account != address(0), "OrderBook: non-existent order"); order.triggerPrice = _triggerPrice; order.triggerAboveThreshold = _triggerAboveThreshold; order.sizeDelta = _sizeDelta; emit UpdateIncreaseOrder( msg.sender, _orderIndex, order.collateralToken, order.indexToken, order.isLong, _sizeDelta, _triggerPrice, _triggerAboveThreshold ); } function cancelIncreaseOrder(uint256 _orderIndex) public nonReentrant { IncreaseOrder memory order = increaseOrders[msg.sender][_orderIndex]; require(order.account != address(0), "OrderBook: non-existent order"); delete increaseOrders[msg.sender][_orderIndex]; if (order.purchaseToken == weth) { _transferOutETH(order.executionFee.add(order.purchaseTokenAmount), msg.sender); } else { IERC20(order.purchaseToken).safeTransfer(msg.sender, order.purchaseTokenAmount); _transferOutETH(order.executionFee, msg.sender); } emit CancelIncreaseOrder( order.account, _orderIndex, order.purchaseToken, order.purchaseTokenAmount, order.collateralToken, order.indexToken, order.sizeDelta, order.isLong, order.triggerPrice, order.triggerAboveThreshold, order.executionFee ); } function executeIncreaseOrder(address _address, uint256 _orderIndex, address payable _feeReceiver) external nonReentrant { // check if orderbook is approved as plugin on router require(IRouter(router).plugins(address(this)) == true, 'orderbook not approved as plugin on router'); IncreaseOrder memory order = increaseOrders[_address][_orderIndex]; require(order.account != address(0), "OrderBook: non-existent order"); // increase long should use max price // increase short should use min price (uint256 currentPrice, ) = validatePositionOrderPrice( order.triggerAboveThreshold, order.triggerPrice, order.indexToken, order.isLong, true ); delete increaseOrders[_address][_orderIndex]; IERC20(order.purchaseToken).safeTransfer(vault, order.purchaseTokenAmount); if (order.purchaseToken != order.collateralToken) { address[] memory path = new address[](2); path[0] = order.purchaseToken; path[1] = order.collateralToken; uint256 amountOut = _swap(path, 0, address(this)); IERC20(order.collateralToken).safeTransfer(vault, amountOut); } IRouter(router).pluginIncreasePosition(order.account, order.collateralToken, order.indexToken, order.sizeDelta, order.isLong); // pay executor _transferOutETH(order.executionFee, _feeReceiver); emit ExecuteIncreaseOrder( order.account, _orderIndex, order.purchaseToken, order.purchaseTokenAmount, order.collateralToken, order.indexToken, order.sizeDelta, order.isLong, order.triggerPrice, order.triggerAboveThreshold, order.executionFee, currentPrice ); } function createDecreaseOrder( address _indexToken, uint256 _sizeDelta, address _collateralToken, uint256 _collateralDelta, bool _isLong, uint256 _triggerPrice, bool _triggerAboveThreshold ) external payable nonReentrant { _transferInETH(); require(msg.value > minExecutionFee, "OrderBook: insufficient execution fee"); _createDecreaseOrder( msg.sender, _collateralToken, _collateralDelta, _indexToken, _sizeDelta, _isLong, _triggerPrice, _triggerAboveThreshold ); } function _createDecreaseOrder( address _account, address _collateralToken, uint256 _collateralDelta, address _indexToken, uint256 _sizeDelta, bool _isLong, uint256 _triggerPrice, bool _triggerAboveThreshold ) private { uint256 _orderIndex = decreaseOrdersIndex[_account]; DecreaseOrder memory order = DecreaseOrder( _account, _collateralToken, _collateralDelta, _indexToken, _sizeDelta, _isLong, _triggerPrice, _triggerAboveThreshold, msg.value ); decreaseOrdersIndex[_account] = _orderIndex.add(1); decreaseOrders[_account][_orderIndex] = order; emit CreateDecreaseOrder( _account, _orderIndex, _collateralToken, _collateralDelta, _indexToken, _sizeDelta, _isLong, _triggerPrice, _triggerAboveThreshold, msg.value ); } function executeDecreaseOrder(address _address, uint256 _orderIndex, address payable _feeReceiver) external nonReentrant { // check if orderbook is approved as plugin on router require(IRouter(router).plugins(address(this)) == true, 'orderbook not approved as plugin on router'); DecreaseOrder memory order = decreaseOrders[_address][_orderIndex]; require(order.account != address(0), "OrderBook: non-existent order"); // decrease long should use min price // decrease short should use max price (uint256 currentPrice, ) = validatePositionOrderPrice( order.triggerAboveThreshold, order.triggerPrice, order.indexToken, !order.isLong, true ); delete decreaseOrders[_address][_orderIndex]; uint256 amountOut = IRouter(router).pluginDecreasePosition( order.account, order.collateralToken, order.indexToken, order.collateralDelta, order.sizeDelta, order.isLong, address(this) ); // transfer released collateral to user if (order.collateralToken == weth) { _transferOutETH(amountOut, payable(order.account)); } else { IERC20(order.collateralToken).safeTransfer(order.account, amountOut); } // pay executor _transferOutETH(order.executionFee, _feeReceiver); emit ExecuteDecreaseOrder( order.account, _orderIndex, order.collateralToken, order.collateralDelta, order.indexToken, order.sizeDelta, order.isLong, order.triggerPrice, order.triggerAboveThreshold, order.executionFee, currentPrice ); } function cancelDecreaseOrder(uint256 _orderIndex) public nonReentrant { DecreaseOrder memory order = decreaseOrders[msg.sender][_orderIndex]; require(order.account != address(0), "OrderBook: non-existent order"); delete decreaseOrders[msg.sender][_orderIndex]; _transferOutETH(order.executionFee, msg.sender); emit CancelDecreaseOrder( order.account, _orderIndex, order.collateralToken, order.collateralDelta, order.indexToken, order.sizeDelta, order.isLong, order.triggerPrice, order.triggerAboveThreshold, order.executionFee ); } function updateDecreaseOrder( uint256 _orderIndex, uint256 _collateralDelta, uint256 _sizeDelta, uint256 _triggerPrice, bool _triggerAboveThreshold ) external nonReentrant { DecreaseOrder storage order = decreaseOrders[msg.sender][_orderIndex]; require(order.account != address(0), "OrderBook: non-existent order"); order.triggerPrice = _triggerPrice; order.triggerAboveThreshold = _triggerAboveThreshold; order.sizeDelta = _sizeDelta; order.collateralDelta = _collateralDelta; emit UpdateDecreaseOrder( msg.sender, _orderIndex, order.collateralToken, _collateralDelta, order.indexToken, _sizeDelta, order.isLong, _triggerPrice, _triggerAboveThreshold ); } function _transferInETH() private { if (msg.value != 0) { IWETH(weth).deposit{value: msg.value}(); } } function _transferOutETH(uint256 _amountOut, address payable _receiver) private { IWETH(weth).withdraw(_amountOut); _receiver.sendValue(_amountOut); } function _swap(address[] memory _path, uint256 _minOut, address _receiver) private returns (uint256) { if (_path.length == 2) { return _vaultSwap(_path[0], _path[1], _minOut, _receiver); } if (_path.length == 3) { uint256 midOut = _vaultSwap(_path[0], _path[1], 0, address(this)); IERC20(_path[1]).safeTransfer(vault, midOut); return _vaultSwap(_path[1], _path[2], _minOut, _receiver); } revert("OrderBook: invalid _path.length"); } function _vaultSwap(address _tokenIn, address _tokenOut, uint256 _minOut, address _receiver) private returns (uint256) { uint256 amountOut; if (_tokenOut == usdg) { // buyUSDG amountOut = IVault(vault).buyUSDG(_tokenIn, _receiver); } else if (_tokenIn == usdg) { // sellUSDG amountOut = IVault(vault).sellUSDG(_tokenOut, _receiver); } else { // swap amountOut = IVault(vault).swap(_tokenIn, _tokenOut, _receiver); } require(amountOut >= _minOut, "OrderBook: insufficient amountOut"); return amountOut; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"orderIndex","type":"uint256"},{"indexed":false,"internalType":"address","name":"collateralToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"collateralDelta","type":"uint256"},{"indexed":false,"internalType":"address","name":"indexToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"sizeDelta","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isLong","type":"bool"},{"indexed":false,"internalType":"uint256","name":"triggerPrice","type":"uint256"},{"indexed":false,"internalType":"bool","name":"triggerAboveThreshold","type":"bool"},{"indexed":false,"internalType":"uint256","name":"executionFee","type":"uint256"}],"name":"CancelDecreaseOrder","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"orderIndex","type":"uint256"},{"indexed":false,"internalType":"address","name":"purchaseToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"purchaseTokenAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"collateralToken","type":"address"},{"indexed":false,"internalType":"address","name":"indexToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"sizeDelta","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isLong","type":"bool"},{"indexed":false,"internalType":"uint256","name":"triggerPrice","type":"uint256"},{"indexed":false,"internalType":"bool","name":"triggerAboveThreshold","type":"bool"},{"indexed":false,"internalType":"uint256","name":"executionFee","type":"uint256"}],"name":"CancelIncreaseOrder","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"orderIndex","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minOut","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"triggerRatio","type":"uint256"},{"indexed":false,"internalType":"bool","name":"triggerAboveThreshold","type":"bool"},{"indexed":false,"internalType":"bool","name":"shouldUnwrap","type":"bool"},{"indexed":false,"internalType":"uint256","name":"executionFee","type":"uint256"}],"name":"CancelSwapOrder","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"orderIndex","type":"uint256"},{"indexed":false,"internalType":"address","name":"collateralToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"collateralDelta","type":"uint256"},{"indexed":false,"internalType":"address","name":"indexToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"sizeDelta","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isLong","type":"bool"},{"indexed":false,"internalType":"uint256","name":"triggerPrice","type":"uint256"},{"indexed":false,"internalType":"bool","name":"triggerAboveThreshold","type":"bool"},{"indexed":false,"internalType":"uint256","name":"executionFee","type":"uint256"}],"name":"CreateDecreaseOrder","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"orderIndex","type":"uint256"},{"indexed":false,"internalType":"address","name":"purchaseToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"purchaseTokenAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"collateralToken","type":"address"},{"indexed":false,"internalType":"address","name":"indexToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"sizeDelta","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isLong","type":"bool"},{"indexed":false,"internalType":"uint256","name":"triggerPrice","type":"uint256"},{"indexed":false,"internalType":"bool","name":"triggerAboveThreshold","type":"bool"},{"indexed":false,"internalType":"uint256","name":"executionFee","type":"uint256"}],"name":"CreateIncreaseOrder","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"orderIndex","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minOut","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"triggerRatio","type":"uint256"},{"indexed":false,"internalType":"bool","name":"triggerAboveThreshold","type":"bool"},{"indexed":false,"internalType":"bool","name":"shouldUnwrap","type":"bool"},{"indexed":false,"internalType":"uint256","name":"executionFee","type":"uint256"}],"name":"CreateSwapOrder","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"orderIndex","type":"uint256"},{"indexed":false,"internalType":"address","name":"collateralToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"collateralDelta","type":"uint256"},{"indexed":false,"internalType":"address","name":"indexToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"sizeDelta","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isLong","type":"bool"},{"indexed":false,"internalType":"uint256","name":"triggerPrice","type":"uint256"},{"indexed":false,"internalType":"bool","name":"triggerAboveThreshold","type":"bool"},{"indexed":false,"internalType":"uint256","name":"executionFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"executionPrice","type":"uint256"}],"name":"ExecuteDecreaseOrder","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"orderIndex","type":"uint256"},{"indexed":false,"internalType":"address","name":"purchaseToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"purchaseTokenAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"collateralToken","type":"address"},{"indexed":false,"internalType":"address","name":"indexToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"sizeDelta","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isLong","type":"bool"},{"indexed":false,"internalType":"uint256","name":"triggerPrice","type":"uint256"},{"indexed":false,"internalType":"bool","name":"triggerAboveThreshold","type":"bool"},{"indexed":false,"internalType":"uint256","name":"executionFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"executionPrice","type":"uint256"}],"name":"ExecuteIncreaseOrder","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"orderIndex","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minOut","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"triggerRatio","type":"uint256"},{"indexed":false,"internalType":"bool","name":"triggerAboveThreshold","type":"bool"},{"indexed":false,"internalType":"bool","name":"shouldUnwrap","type":"bool"},{"indexed":false,"internalType":"uint256","name":"executionFee","type":"uint256"}],"name":"ExecuteSwapOrder","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"router","type":"address"},{"indexed":false,"internalType":"address","name":"vault","type":"address"},{"indexed":false,"internalType":"address","name":"weth","type":"address"},{"indexed":false,"internalType":"address","name":"usdg","type":"address"},{"indexed":false,"internalType":"uint256","name":"minExecutionFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minPurchaseTokenAmountUsd","type":"uint256"}],"name":"Initialize","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"orderIndex","type":"uint256"},{"indexed":false,"internalType":"address","name":"collateralToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"collateralDelta","type":"uint256"},{"indexed":false,"internalType":"address","name":"indexToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"sizeDelta","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isLong","type":"bool"},{"indexed":false,"internalType":"uint256","name":"triggerPrice","type":"uint256"},{"indexed":false,"internalType":"bool","name":"triggerAboveThreshold","type":"bool"}],"name":"UpdateDecreaseOrder","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"gov","type":"address"}],"name":"UpdateGov","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"orderIndex","type":"uint256"},{"indexed":false,"internalType":"address","name":"collateralToken","type":"address"},{"indexed":false,"internalType":"address","name":"indexToken","type":"address"},{"indexed":false,"internalType":"bool","name":"isLong","type":"bool"},{"indexed":false,"internalType":"uint256","name":"sizeDelta","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"triggerPrice","type":"uint256"},{"indexed":false,"internalType":"bool","name":"triggerAboveThreshold","type":"bool"}],"name":"UpdateIncreaseOrder","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"minExecutionFee","type":"uint256"}],"name":"UpdateMinExecutionFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"minPurchaseTokenAmountUsd","type":"uint256"}],"name":"UpdateMinPurchaseTokenAmountUsd","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"ordexIndex","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minOut","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"triggerRatio","type":"uint256"},{"indexed":false,"internalType":"bool","name":"triggerAboveThreshold","type":"bool"},{"indexed":false,"internalType":"bool","name":"shouldUnwrap","type":"bool"},{"indexed":false,"internalType":"uint256","name":"executionFee","type":"uint256"}],"name":"UpdateSwapOrder","type":"event"},{"inputs":[],"name":"PRICE_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USDG_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_orderIndex","type":"uint256"}],"name":"cancelDecreaseOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_orderIndex","type":"uint256"}],"name":"cancelIncreaseOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_swapOrderIndexes","type":"uint256[]"},{"internalType":"uint256[]","name":"_increaseOrderIndexes","type":"uint256[]"},{"internalType":"uint256[]","name":"_decreaseOrderIndexes","type":"uint256[]"}],"name":"cancelMultiple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_orderIndex","type":"uint256"}],"name":"cancelSwapOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_indexToken","type":"address"},{"internalType":"uint256","name":"_sizeDelta","type":"uint256"},{"internalType":"address","name":"_collateralToken","type":"address"},{"internalType":"uint256","name":"_collateralDelta","type":"uint256"},{"internalType":"bool","name":"_isLong","type":"bool"},{"internalType":"uint256","name":"_triggerPrice","type":"uint256"},{"internalType":"bool","name":"_triggerAboveThreshold","type":"bool"}],"name":"createDecreaseOrder","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_path","type":"address[]"},{"internalType":"uint256","name":"_amountIn","type":"uint256"},{"internalType":"address","name":"_indexToken","type":"address"},{"internalType":"uint256","name":"_minOut","type":"uint256"},{"internalType":"uint256","name":"_sizeDelta","type":"uint256"},{"internalType":"address","name":"_collateralToken","type":"address"},{"internalType":"bool","name":"_isLong","type":"bool"},{"internalType":"uint256","name":"_triggerPrice","type":"uint256"},{"internalType":"bool","name":"_triggerAboveThreshold","type":"bool"},{"internalType":"uint256","name":"_executionFee","type":"uint256"},{"internalType":"bool","name":"_shouldWrap","type":"bool"}],"name":"createIncreaseOrder","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_path","type":"address[]"},{"internalType":"uint256","name":"_amountIn","type":"uint256"},{"internalType":"uint256","name":"_minOut","type":"uint256"},{"internalType":"uint256","name":"_triggerRatio","type":"uint256"},{"internalType":"bool","name":"_triggerAboveThreshold","type":"bool"},{"internalType":"uint256","name":"_executionFee","type":"uint256"},{"internalType":"bool","name":"_shouldWrap","type":"bool"},{"internalType":"bool","name":"_shouldUnwrap","type":"bool"}],"name":"createSwapOrder","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"decreaseOrders","outputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"collateralToken","type":"address"},{"internalType":"uint256","name":"collateralDelta","type":"uint256"},{"internalType":"address","name":"indexToken","type":"address"},{"internalType":"uint256","name":"sizeDelta","type":"uint256"},{"internalType":"bool","name":"isLong","type":"bool"},{"internalType":"uint256","name":"triggerPrice","type":"uint256"},{"internalType":"bool","name":"triggerAboveThreshold","type":"bool"},{"internalType":"uint256","name":"executionFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"decreaseOrdersIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_orderIndex","type":"uint256"},{"internalType":"address payable","name":"_feeReceiver","type":"address"}],"name":"executeDecreaseOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_orderIndex","type":"uint256"},{"internalType":"address payable","name":"_feeReceiver","type":"address"}],"name":"executeIncreaseOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_orderIndex","type":"uint256"},{"internalType":"address payable","name":"_feeReceiver","type":"address"}],"name":"executeSwapOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_orderIndex","type":"uint256"}],"name":"getDecreaseOrder","outputs":[{"internalType":"address","name":"collateralToken","type":"address"},{"internalType":"uint256","name":"collateralDelta","type":"uint256"},{"internalType":"address","name":"indexToken","type":"address"},{"internalType":"uint256","name":"sizeDelta","type":"uint256"},{"internalType":"bool","name":"isLong","type":"bool"},{"internalType":"uint256","name":"triggerPrice","type":"uint256"},{"internalType":"bool","name":"triggerAboveThreshold","type":"bool"},{"internalType":"uint256","name":"executionFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_orderIndex","type":"uint256"}],"name":"getIncreaseOrder","outputs":[{"internalType":"address","name":"purchaseToken","type":"address"},{"internalType":"uint256","name":"purchaseTokenAmount","type":"uint256"},{"internalType":"address","name":"collateralToken","type":"address"},{"internalType":"address","name":"indexToken","type":"address"},{"internalType":"uint256","name":"sizeDelta","type":"uint256"},{"internalType":"bool","name":"isLong","type":"bool"},{"internalType":"uint256","name":"triggerPrice","type":"uint256"},{"internalType":"bool","name":"triggerAboveThreshold","type":"bool"},{"internalType":"uint256","name":"executionFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_orderIndex","type":"uint256"}],"name":"getSwapOrder","outputs":[{"internalType":"address","name":"path0","type":"address"},{"internalType":"address","name":"path1","type":"address"},{"internalType":"address","name":"path2","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minOut","type":"uint256"},{"internalType":"uint256","name":"triggerRatio","type":"uint256"},{"internalType":"bool","name":"triggerAboveThreshold","type":"bool"},{"internalType":"bool","name":"shouldUnwrap","type":"bool"},{"internalType":"uint256","name":"executionFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_otherToken","type":"address"}],"name":"getUsdgMinPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gov","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"increaseOrders","outputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"purchaseToken","type":"address"},{"internalType":"uint256","name":"purchaseTokenAmount","type":"uint256"},{"internalType":"address","name":"collateralToken","type":"address"},{"internalType":"address","name":"indexToken","type":"address"},{"internalType":"uint256","name":"sizeDelta","type":"uint256"},{"internalType":"bool","name":"isLong","type":"bool"},{"internalType":"uint256","name":"triggerPrice","type":"uint256"},{"internalType":"bool","name":"triggerAboveThreshold","type":"bool"},{"internalType":"uint256","name":"executionFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"increaseOrdersIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_router","type":"address"},{"internalType":"address","name":"_vault","type":"address"},{"internalType":"address","name":"_weth","type":"address"},{"internalType":"address","name":"_usdg","type":"address"},{"internalType":"uint256","name":"_minExecutionFee","type":"uint256"},{"internalType":"uint256","name":"_minPurchaseTokenAmountUsd","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minExecutionFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minPurchaseTokenAmountUsd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_gov","type":"address"}],"name":"setGov","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minExecutionFee","type":"uint256"}],"name":"setMinExecutionFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minPurchaseTokenAmountUsd","type":"uint256"}],"name":"setMinPurchaseTokenAmountUsd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"swapOrders","outputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minOut","type":"uint256"},{"internalType":"uint256","name":"triggerRatio","type":"uint256"},{"internalType":"bool","name":"triggerAboveThreshold","type":"bool"},{"internalType":"bool","name":"shouldUnwrap","type":"bool"},{"internalType":"uint256","name":"executionFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"swapOrdersIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_orderIndex","type":"uint256"},{"internalType":"uint256","name":"_collateralDelta","type":"uint256"},{"internalType":"uint256","name":"_sizeDelta","type":"uint256"},{"internalType":"uint256","name":"_triggerPrice","type":"uint256"},{"internalType":"bool","name":"_triggerAboveThreshold","type":"bool"}],"name":"updateDecreaseOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_orderIndex","type":"uint256"},{"internalType":"uint256","name":"_sizeDelta","type":"uint256"},{"internalType":"uint256","name":"_triggerPrice","type":"uint256"},{"internalType":"bool","name":"_triggerAboveThreshold","type":"bool"}],"name":"updateIncreaseOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_orderIndex","type":"uint256"},{"internalType":"uint256","name":"_minOut","type":"uint256"},{"internalType":"uint256","name":"_triggerRatio","type":"uint256"},{"internalType":"bool","name":"_triggerAboveThreshold","type":"bool"}],"name":"updateSwapOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"usdg","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_triggerAboveThreshold","type":"bool"},{"internalType":"uint256","name":"_triggerPrice","type":"uint256"},{"internalType":"address","name":"_indexToken","type":"address"},{"internalType":"bool","name":"_maximizePrice","type":"bool"},{"internalType":"bool","name":"_raise","type":"bool"}],"name":"validatePositionOrderPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_path","type":"address[]"},{"internalType":"uint256","name":"_triggerRatio","type":"uint256"}],"name":"validateSwapOrderPriceWithTriggerAboveThreshold","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080604052600e805460ff1916905534801561001a57600080fd5b506001600055600780546001600160a01b031916331790556155af806100416000396000f3fe6080604052600436106101c35760003560e01c8062cf066b1461022a578063026032ee1461026f57806307c7edc3146102fa5780630d5cc9381461033d57806311d9444a1461036757806312d43a51146103aa578063269ae6c2146103db5780632b7d6290146104a6578063392e53cd146105465780633fc8cef31461056f57806347e0bbd0146105845780634a686d67146105ae5780634c54f0b0146105c357806363ae21031461062d57806379221fa214610642578063807c5600146106c15780638de10c2e1461087357806395082d25146108885780639983ee1b1461089d5780639e23de5c146108db5780639e71b0f01461090e578063a397ea5414610938578063aec224551461097c578063b142a4b0146109af578063c16cde8a14610a99578063c4a1821b14610ae9578063c86b0f7d14610b99578063cfad57a214610bd7578063d0d40cd614610c0a578063d38ab51914610c9d578063d3bab1d114610ce0578063d566d0ca14610d74578063d7c41c7914610da7578063f2d2e01b14610e00578063f5b91b7b14610e94578063f882ac0714610ea9578063f887ea4014610ed3578063fbfa77cf14610ee8578063fc2cee6214610efd57610225565b36610225576008546001600160a01b03163314610223576040805162461bcd60e51b815260206004820152601960248201527827b93232b92137b7b59d1034b73b30b634b21039b2b73232b960391b604482015290519081900360640190fd5b005b600080fd5b34801561023657600080fd5b5061025d6004803603602081101561024d57600080fd5b50356001600160a01b0316610f27565b60408051918252519081900360200190f35b34801561027b57600080fd5b506102a86004803603604081101561029257600080fd5b506001600160a01b038135169060200135610f39565b604080516001600160a01b03998a168152602081019890985295909716868601526060860193909352901515608085015260a0840152151560c083015260e08201929092529051908190036101000190f35b34801561030657600080fd5b506102236004803603606081101561031d57600080fd5b506001600160a01b0381358116916020810135916040909101351661100c565b34801561034957600080fd5b506102236004803603602081101561036057600080fd5b5035611417565b34801561037357600080fd5b506102236004803603606081101561038a57600080fd5b506001600160a01b038135811691602081013591604090910135166114a8565b3480156103b657600080fd5b506103bf611912565b604080516001600160a01b039092168252519081900360200190f35b61022360048036036101008110156103f257600080fd5b810190602081018135600160201b81111561040c57600080fd5b82018360208201111561041e57600080fd5b803590602001918460208302840111600160201b8311171561043f57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050823593505050602081013590604081013590606081013515159060808101359060a081013515159060c001351515611921565b3480156104b257600080fd5b506104df600480360360408110156104c957600080fd5b506001600160a01b038135169060200135611caa565b604080516001600160a01b039b8c168152998b1660208b015289810198909852958916606089015293909716608087015260a0860191909152151560c085015260e08401949094529215156101008301526101208201929092529051908190036101400190f35b34801561055257600080fd5b5061055b611d1c565b604080519115158252519081900360200190f35b34801561057b57600080fd5b506103bf611d25565b34801561059057600080fd5b50610223600480360360208110156105a757600080fd5b5035611d34565b3480156105ba57600080fd5b5061025d61203e565b3480156105cf57600080fd5b50610614600480360360a08110156105e657600080fd5b5080351515906020810135906001600160a01b0360408201351690606081013515159060800135151561204a565b6040805192835290151560208301528051918290030190f35b34801561063957600080fd5b5061025d6121b3565b34801561064e57600080fd5b5061067b6004803603604081101561066557600080fd5b506001600160a01b0381351690602001356121b9565b604080516001600160a01b039098168852602088019690965286860194909452606086019290925215156080850152151560a084015260c0830152519081900360e00190f35b3480156106cd57600080fd5b50610223600480360360608110156106e457600080fd5b810190602081018135600160201b8111156106fe57600080fd5b82018360208201111561071057600080fd5b803590602001918460208302840111600160201b8311171561073157600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561078057600080fd5b82018360208201111561079257600080fd5b803590602001918460208302840111600160201b831117156107b357600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561080257600080fd5b82018360208201111561081457600080fd5b803590602001918460208302840111600160201b8311171561083557600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061220d945050505050565b34801561087f57600080fd5b5061025d6122a5565b34801561089457600080fd5b5061025d6122ab565b3480156108a957600080fd5b50610223600480360360808110156108c057600080fd5b508035906020810135906040810135906060013515156122bb565b3480156108e757600080fd5b5061025d600480360360208110156108fe57600080fd5b50356001600160a01b0316612413565b34801561091a57600080fd5b506102236004803603602081101561093157600080fd5b50356125bd565b34801561094457600080fd5b50610223600480360360a081101561095b57600080fd5b5080359060208101359060408101359060608101359060800135151561282f565b34801561098857600080fd5b5061025d6004803603602081101561099f57600080fd5b50356001600160a01b0316612997565b61022360048036036101608110156109c657600080fd5b810190602081018135600160201b8111156109e057600080fd5b8201836020820111156109f257600080fd5b803590602001918460208302840111600160201b83111715610a1357600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505082359350506001600160a01b036020830135811692604081013592506060810135916080820135169060a081013515159060c08101359060e081013515159061010081013590610120013515156129a9565b610223600480360360e0811015610aaf57600080fd5b506001600160a01b03813581169160208101359160408201351690606081013590608081013515159060a08101359060c001351515612dab565b348015610af557600080fd5b5061055b60048036036040811015610b0c57600080fd5b810190602081018135600160201b811115610b2657600080fd5b820183602082011115610b3857600080fd5b803590602001918460208302840111600160201b83111715610b5957600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250612e5c915050565b348015610ba557600080fd5b5061022360048036036080811015610bbc57600080fd5b50803590602081013590604081013590606001351515613073565b348015610be357600080fd5b5061022360048036036020811015610bfa57600080fd5b50356001600160a01b031661323c565b348015610c1657600080fd5b50610c4360048036036040811015610c2d57600080fd5b506001600160a01b038135169060200135613331565b604080516001600160a01b039a8b168152988a1660208a015296909816878701526060870194909452608086019290925260a0850152151560c0840152151560e08301526101008201929092529051908190036101200190f35b348015610ca957600080fd5b5061022360048036036060811015610cc057600080fd5b506001600160a01b038135811691602081013591604090910135166134ee565b348015610cec57600080fd5b50610d1960048036036040811015610d0357600080fd5b506001600160a01b038135169060200135613a12565b604080516001600160a01b039a8b1681526020810199909952968916888801529490971660608701526080860192909252151560a085015260c084015292151560e08301526101008201929092529051908190036101200190f35b348015610d8057600080fd5b5061025d60048036036020811015610d9757600080fd5b50356001600160a01b0316613af8565b348015610db357600080fd5b50610223600480360360c0811015610dca57600080fd5b506001600160a01b0381358116916020810135821691604082013581169160608101359091169060808101359060a00135613b0a565b348015610e0c57600080fd5b50610e3960048036036040811015610e2357600080fd5b506001600160a01b038135169060200135613c79565b604080516001600160a01b039a8b168152988a1660208a0152888101979097529490971660608701526080860192909252151560a085015260c084015292151560e08301526101008201929092529051908190036101200190f35b348015610ea057600080fd5b506103bf613ce3565b348015610eb557600080fd5b5061022360048036036020811015610ecc57600080fd5b5035613cf2565b348015610edf57600080fd5b506103bf61402f565b348015610ef457600080fd5b506103bf61403e565b348015610f0957600080fd5b5061022360048036036020811015610f2057600080fd5b503561404d565b60066020526000908152604090205481565b600080600080600080600080610f4d615191565b505050506001600160a01b03968716600090815260036020818152604080842099845298815291889020885161012081018a5281548b16815260018201548b1693810184905260028201549981018a9052918101549099166060820181905260048a01546080830181905260058b015460ff908116151560a0850181905260068d015460c0860181905260078e0154909216151560e086018190526008909d0154610100909501859052949c9a9b929a91995093975092955093509150565b60026000541415611052576040805162461bcd60e51b815260206004820152601f602482015260008051602061535e833981519152604482015290519081900360640190fd5b600260005561105f6151dd565b6001600160a01b038085166000908152600560209081526040808320878452825291829020825161010081018452815490941684526001810180548451818502810185019095528085529193858401939092908301828280156110eb57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116110cd575b5050509183525050600282015460208201526003820154604082015260048201546060820152600582015460ff8082161515608084015261010090910416151560a082015260069091015460c09091015280519091506001600160a01b0316611189576040805162461bcd60e51b815260206004820152601d602482015260008051602061533e833981519152604482015290519081900360640190fd5b8060a00151156111e0576111a581602001518260800151612e5c565b6111e05760405162461bcd60e51b81526004018080602001828103825260268152602001806154dc6026913960400191505060405180910390fd5b6001600160a01b0384166000908152600560209081526040808320868452909152812080546001600160a01b03191681559061121f600183018261522f565b50600060028201819055600382018190556004820181905560058201805461ffff191690556006909101819055600b54604083015160208401518051611292946001600160a01b03909416939061127257fe5b60200260200101516001600160a01b03166140de9092919063ffffffff16565b600854602082015180516000926001600160a01b0316919060001981019081106112b857fe5b60200260200101516001600160a01b03161480156112d757508160c001515b15611304576112ef8260200151836060015130614135565b90506112ff818360000151614264565b61131e565b61131b826020015183606001518460000151614135565b90505b61132c8260e0015184614264565b846001600160a01b03167f7e1fe496989eea92b738a562dbf9c0ae6aa6fcf3f1ef09e95ee4f7603721706b858460200151856040015186606001518688608001518960a001518a60c001518b60e00151604051808a8152602001806020018981526020018881526020018781526020018681526020018515158152602001841515815260200183815260200182810382528a818151815260200191508051906020019060200280838360005b838110156113f05781810151838201526020016113d8565b505050509050019a505050505050505050505060405180910390a250506001600055505050565b6007546001600160a01b0316331461146d576040805162461bcd60e51b815260206004820152601460248201527327b93232b92137b7b59d103337b93134b23232b760611b604482015290519081900360640190fd5b600d8190556040805182815290517fe46d9daf6d25f7615efa1d0183b90ac6759d85014b598e409aadf0fd918d59a69181900360200190a150565b600260005414156114ee576040805162461bcd60e51b815260206004820152601f602482015260008051602061535e833981519152604482015290519081900360640190fd5b60026000908155600a5460408051634b12e64360e01b815230600482015290516001600160a01b0390921692634b12e643926024808401936020939083900390910190829087803b15801561154257600080fd5b505af1158015611556573d6000803e3d6000fd5b505050506040513d602081101561156c57600080fd5b505115156001146115ae5760405162461bcd60e51b815260040180806020018281038252602a8152602001806153a0602a913960400191505060405180910390fd5b6115b6615191565b506001600160a01b03808416600090815260036020818152604080842087855282529283902083516101208101855281548616808252600183015487169382019390935260028201549481019490945291820154909316606083015260048101546080830152600581015460ff908116151560a0840152600682015460c0840152600782015416151560e0830152600801546101008201529061168e576040805162461bcd60e51b815260206004820152601d602482015260008051602061533e833981519152604482015290519081900360640190fd5b60006116af8260e001518360c0015184606001518560a0015115600161204a565b506001600160a01b0380871660009081526003602081815260408084208a8552825280842080546001600160a01b0319908116825560018201805482169055600282018690559381018054909416909355600480840185905560058401805460ff199081169091556006850186905560078501805490911690556008909301849055600a5488518984015160608b01518b85015160808d015160a08e01518751632662166b60e01b8152958c1699860199909952928a16602485015290891660448401526064830152608482015293151560a48501523060c4850152905195965092949290931692632662166b9260e48084019382900301818787803b1580156117b857600080fd5b505af11580156117cc573d6000803e3d6000fd5b505050506040513d60208110156117e257600080fd5b505160085460208501519192506001600160a01b039182169116141561181557611810818460000151614264565b611832565b82516020840151611832916001600160a01b0390911690836140de565b61184183610100015185614264565b82600001516001600160a01b03167f9a382661d6573da86db000471303be6f0b2b1bb66089b08e3c16a85d7b6e94f88685602001518660400151876060015188608001518960a001518a60c001518b60e001518c61010001518c604051808b81526020018a6001600160a01b03168152602001898152602001886001600160a01b03168152602001878152602001861515815260200185815260200184151581526020018381526020018281526020019a505050505050505050505060405180910390a25050600160005550505050565b6007546001600160a01b031681565b60026000541415611967576040805162461bcd60e51b815260206004820152601f602482015260008051602061535e833981519152604482015290519081900360640190fd5b600260008190558851148061197d575087516003145b6119bc576040805162461bcd60e51b815260206004820152601f6024820152600080516020615502833981519152604482015290519081900360640190fd5b876001895103815181106119cc57fe5b60200260200101516001600160a01b0316886000815181106119ea57fe5b60200260200101516001600160a01b03161415611a49576040805162461bcd60e51b815260206004820152601860248201527709ee4c8cae484deded67440d2dcecc2d8d2c840bee0c2e8d60431b604482015290519081900360640190fd5b60008711611a9d576040805162461bcd60e51b815260206004820152601c60248201527b27b93232b92137b7b59d1034b73b30b634b2102fb0b6b7bab73a24b760211b604482015290519081900360640190fd5b600c54831015611ade5760405162461bcd60e51b81526004018080602001828103825260258152602001806154706025913960400191505060405180910390fd5b611ae66142e1565b8115611ba15760085488516001600160a01b03909116908990600090611b0857fe5b60200260200101516001600160a01b031614611b555760405162461bcd60e51b815260040180806020018281038252602581526020018061544b6025913960400191505060405180910390fd5b611b5f8388614353565b3414611b9c5760405162461bcd60e51b81526004018080602001828103825260268152602001806154b66026913960400191505060405180910390fd5b611c8b565b823414611bdf5760405162461bcd60e51b815260040180806020018281038252602e81526020018061554c602e913960400191505060405180910390fd5b600a5488516001600160a01b0390911690631b827878908a90600090611c0157fe5b602002602001015133308b6040518563ffffffff1660e01b815260040180856001600160a01b03168152602001846001600160a01b03168152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b158015611c7257600080fd5b505af1158015611c86573d6000803e3d6000fd5b505050505b611c9b338989898989878a6143ab565b50506001600055505050505050565b6001602081815260009384526040808520909152918352912080549181015460028201546003830154600484015460058501546006860154600787015460088801546009909801546001600160a01b03998a1699978816989697958616969490951694929360ff92831693919216908a565b600e5460ff1681565b6008546001600160a01b031681565b60026000541415611d7a576040805162461bcd60e51b815260206004820152601f602482015260008051602061535e833981519152604482015290519081900360640190fd5b6002600055611d87615250565b5033600090815260016020818152604080842085855282529283902083516101408101855281546001600160a01b039081168083529483015481169382019390935260028201549481019490945260038101548216606085015260048101549091166080840152600581015460a0840152600681015460ff908116151560c0850152600782015460e0850152600882015416151561010084015260090154610120830152611e6a576040805162461bcd60e51b815260206004820152601d602482015260008051602061533e833981519152604482015290519081900360640190fd5b3360009081526001602081815260408084208685528252832080546001600160a01b0319908116825592810180548416905560028101849055600381018054841690556004810180549093169092556005820183905560068201805460ff19908116909155600783018490556008808401805490921690915560099092019290925554908201516001600160a01b0390811691161415611f2e57611f29611f23826040015183610120015161435390919063ffffffff16565b33614264565b611f63565b611f5433826040015183602001516001600160a01b03166140de9092919063ffffffff16565b611f6381610120015133614264565b80600001516001600160a01b03167fd500f34e0ec655b7614ae42e1d9c666d5e4dde909a1297829f8c5ecf00805d328383602001518460400151856060015186608001518760a001518860c001518960e001518a61010001518b6101200151604051808b81526020018a6001600160a01b03168152602001898152602001886001600160a01b03168152602001876001600160a01b03168152602001868152602001851515815260200184815260200183151581526020018281526020019a505050505050505050505060405180910390a250506001600055565b670de0b6b3a764000081565b6000806000846120d257600b54604080516340d3096b60e11b81526001600160a01b038981166004830152915191909216916381a612d6916024808301926020929190829003018186803b1580156120a157600080fd5b505afa1580156120b5573d6000803e3d6000fd5b505050506040513d60208110156120cb57600080fd5b505161214c565b600b5460408051637092736960e11b81526001600160a01b0389811660048301529151919092169163e124e6d2916024808301926020929190829003018186803b15801561211f57600080fd5b505afa158015612133573d6000803e3d6000fd5b505050506040513d602081101561214957600080fd5b50515b905060008861215d57878210612161565b8782115b905084156121a557806121a55760405162461bcd60e51b81526004018080602001828103825260268152602001806154dc6026913960400191505060405180910390fd5b909890975095505050505050565b600c5481565b600560208181526000938452604080852090915291835291208054600282015460038301546004840154948401546006909401546001600160a01b03909316949193909260ff808316926101009004169087565b60005b835181101561223d5761223584828151811061222857fe5b6020026020010151613cf2565b600101612210565b5060005b825181101561226e5761226683828151811061225957fe5b6020026020010151611d34565b600101612241565b5060005b815181101561229f5761229782828151811061228a57fe5b60200260200101516125bd565b600101612272565b50505050565b600d5481565b68327cb2734119d3b7a9601e1b81565b60026000541415612301576040805162461bcd60e51b815260206004820152601f602482015260008051602061535e833981519152604482015290519081900360640190fd5b60026000908155338152600160209081526040808320878452909152902080546001600160a01b0316612369576040805162461bcd60e51b815260206004820152601d602482015260008051602061533e833981519152604482015290519081900360640190fd5b6007810183905560088101805483151560ff19909116811790915560058201859055600382015460048301546006840154604080518a81526001600160a01b039485166020820152929093168284015260ff16151560608201526080810187905260a0810186905260c08101929092525133917f0a0360dd5c354235bbf8d386ba3b24ef8134088e0785677de1504df219d9149a919081900360e00190a250506001600055505050565b600b5460408051632c668ec160e01b81526001600160a01b038481166004830152670de0b6b3a76400006024830152915160009384931691632c668ec1916044808301926020929190829003018186803b15801561247057600080fd5b505afa158015612484573d6000803e3d6000fd5b505050506040513d602081101561249a57600080fd5b5051600b54604080516340d3096b60e11b81526001600160a01b038781166004830152915193945060009391909216916381a612d6916024808301926020929190829003018186803b1580156124ef57600080fd5b505afa158015612503573d6000803e3d6000fd5b505050506040513d602081101561251957600080fd5b5051600b54604080516323b95ceb60e21b81526001600160a01b03888116600483015291519394506000939190921691638ee573ac916024808301926020929190829003018186803b15801561256e57600080fd5b505afa158015612582573d6000803e3d6000fd5b505050506040513d602081101561259857600080fd5b505190506125b4600a82900a6125ae85856145ba565b90614613565b95945050505050565b60026000541415612603576040805162461bcd60e51b815260206004820152601f602482015260008051602061535e833981519152604482015290519081900360640190fd5b6002600055612610615191565b5033600090815260036020818152604080842085855282529283902083516101208101855281546001600160a01b03908116808352600184015482169483019490945260028301549582019590955292810154909316606083015260048301546080830152600583015460ff908116151560a0840152600684015460c0840152600784015416151560e0830152600890920154610100820152906126e9576040805162461bcd60e51b815260206004820152601d602482015260008051602061533e833981519152604482015290519081900360640190fd5b336000818152600360208181526040808420878552909152822080546001600160a01b03199081168255600182018054821690556002820184905591810180549092169091556004810182905560058101805460ff199081169091556006820183905560078201805490911690556008015561010082015161276a91614264565b80600001516001600160a01b03167f1154174c82984656b028c8021671988f60a346497e56fe02554761184f82a0758383602001518460400151856060015186608001518760a001518860c001518960e001518a6101000151604051808a8152602001896001600160a01b03168152602001888152602001876001600160a01b0316815260200186815260200185151581526020018481526020018315158152602001828152602001995050505050505050505060405180910390a250506001600055565b60026000541415612875576040805162461bcd60e51b815260206004820152601f602482015260008051602061535e833981519152604482015290519081900360640190fd5b60026000908155338152600360209081526040808320888452909152902080546001600160a01b03166128dd576040805162461bcd60e51b815260206004820152601d602482015260008051602061533e833981519152604482015290519081900360640190fd5b6006810183905560078101805483151560ff1990911681179091556004820185905560028201869055600182015460038301546005840154604080518b81526001600160a01b0394851660208201528082018b90529290931660608301526080820188905260ff16151560a082015260c0810186905260e08101929092525133917f75781255bc71c83f89f29e5a2599f2c174a562d2cd8f2e818a47f132e728049891908190036101000190a25050600160005550505050565b60026020526000908152604090205481565b600260005414156129ef576040805162461bcd60e51b815260206004820152601f602482015260008051602061535e833981519152604482015290519081900360640190fd5b60026000556129fc6142e1565b600c54821015612a3d5760405162461bcd60e51b81526004018080602001828103825260258152602001806154706025913960400191505060405180910390fd5b8015612af8576008548b516001600160a01b03909116908c90600090612a5f57fe5b60200260200101516001600160a01b031614612aac5760405162461bcd60e51b815260040180806020018281038252602581526020018061544b6025913960400191505060405180910390fd5b612ab6828b614353565b3414612af35760405162461bcd60e51b81526004018080602001828103825260268152602001806154b66026913960400191505060405180910390fd5b612be2565b813414612b365760405162461bcd60e51b815260040180806020018281038252602e81526020018061554c602e913960400191505060405180910390fd5b600a548b516001600160a01b0390911690631b827878908d90600090612b5857fe5b602002602001015133308e6040518563ffffffff1660e01b815260040180856001600160a01b03168152602001846001600160a01b03168152602001836001600160a01b03168152602001828152602001945050505050600060405180830381600087803b158015612bc957600080fd5b505af1158015612bdd573d6000803e3d6000fd5b505050505b60008b60018d510381518110612bf457fe5b60200260200101519050600060018d511115612cb957816001600160a01b03168d600081518110612c2157fe5b60200260200101516001600160a01b03161415612c80576040805162461bcd60e51b815260206004820152601860248201527709ee4c8cae484deded67440d2dcecc2d8d2c840bee0c2e8d60431b604482015290519081900360640190fd5b612ca7600b60009054906101000a90046001600160a01b03168d8f60008151811061127257fe5b612cb28d8b30614135565b9050612cbc565b508a5b600b5460408051630a48d5a960e01b81526001600160a01b0385811660048301526024820185905291516000939290921691630a48d5a991604480820192602092909190829003018186803b158015612d1457600080fd5b505afa158015612d28573d6000803e3d6000fd5b505050506040513d6020811015612d3e57600080fd5b5051600d54909150811015612d845760405162461bcd60e51b815260040180806020018281038252602281526020018061537e6022913960400191505060405180910390fd5b50612d973383838b8f8e8d8d8d8d614652565b505060016000555050505050505050505050565b60026000541415612df1576040805162461bcd60e51b815260206004820152601f602482015260008051602061535e833981519152604482015290519081900360640190fd5b6002600055612dfe6142e1565b600c543411612e3e5760405162461bcd60e51b81526004018080602001828103825260258152602001806154706025913960400191505060405180910390fd5b612e4e3386868a8a888888614925565b505060016000555050505050565b6000825160021480612e6f575082516003145b612eae576040805162461bcd60e51b815260206004820152601f6024820152600080516020615502833981519152604482015290519081900360640190fd5b600083600081518110612ebd57fe5b60200260200101519050600084600186510381518110612ed957fe5b602090810291909101015160095490915060009081906001600160a01b0385811691161415612f2657612f1f87600181518110612f1257fe5b6020026020010151612413565b9150612fa2565b600b54604080516340d3096b60e11b81526001600160a01b038781166004830152915191909216916381a612d6916024808301926020929190829003018186803b158015612f7357600080fd5b505afa158015612f87573d6000803e3d6000fd5b505050506040513d6020811015612f9d57600080fd5b505191505b6009546001600160a01b0384811691161415612fcb575068327cb2734119d3b7a9601e1b613047565b600b5460408051637092736960e11b81526001600160a01b0386811660048301529151919092169163e124e6d2916024808301926020929190829003018186803b15801561301857600080fd5b505afa15801561302c573d6000803e3d6000fd5b505050506040513d602081101561304257600080fd5b505190505b6000613063836125ae8468327cb2734119d3b7a9601e1b6145ba565b8710955050505050505b92915050565b600260005414156130b9576040805162461bcd60e51b815260206004820152601f602482015260008051602061535e833981519152604482015290519081900360640190fd5b60026000908155338152600560209081526040808320878452909152902080546001600160a01b0316613121576040805162461bcd60e51b815260206004820152601d602482015260008051602061533e833981519152604482015290519081900360640190fd5b838160030181905550828160040181905550818160050160006101000a81548160ff021916908315150217905550336001600160a01b03167fa7f9f4a25eb76f5ec01b1a429d95d6a00833f0f137c88827c58799a1c1ff0dfe868360010184600201548888888860050160019054906101000a900460ff168960060154604051808981526020018060200188815260200187815260200186815260200185151581526020018415158152602001838152602001828103825289818154815260200191508054801561321b57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116131fd575b5050995050505050505050505060405180910390a250506001600055505050565b6007546001600160a01b03163314613292576040805162461bcd60e51b815260206004820152601460248201527327b93232b92137b7b59d103337b93134b23232b760611b604482015290519081900360640190fd5b6001600160a01b0381166132dd576040805162461bcd60e51b815260206004820152600d60248201526c57726f6e67206164647265737360981b604482015290519081900360640190fd5b600780546001600160a01b0383166001600160a01b0319909116811790915560408051918252517fe24c39186e9137521953beaa8446e71f55b8f12296984f9d4273ceb1af728d909181900360200190a150565b60008060008060008060008060006133476151dd565b6001600160a01b03808d1660009081526005602090815260408083208f8452825291829020825161010081018452815490941684526001810180548451818502810185019095528085529193858401939092908301828280156133d357602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116133b5575b505050918352505060028201546020808301919091526003830154604083015260048301546060830152600583015460ff8082161515608085015261010090910416151560a083015260069092015460c0909101528101515190915061343a576000613454565b806020015160008151811061344b57fe5b60200260200101515b600182602001515111613468576000613482565b816020015160018151811061347957fe5b60200260200101515b6002836020015151116134965760006134b0565b82602001516002815181106134a757fe5b60200260200101515b8360400151846060015185608001518660a001518760c001518860e00151995099509950995099509950995099509950509295985092959850929598565b60026000541415613534576040805162461bcd60e51b815260206004820152601f602482015260008051602061535e833981519152604482015290519081900360640190fd5b60026000908155600a5460408051634b12e64360e01b815230600482015290516001600160a01b0390921692634b12e643926024808401936020939083900390910190829087803b15801561358857600080fd5b505af115801561359c573d6000803e3d6000fd5b505050506040513d60208110156135b257600080fd5b505115156001146135f45760405162461bcd60e51b815260040180806020018281038252602a8152602001806153a0602a913960400191505060405180910390fd5b6135fc615250565b506001600160a01b038084166000908152600160208181526040808420878552825292839020835161014081018552815486168082529382015486169281019290925260028101549382019390935260038301548416606082015260048301549093166080840152600582015460a0840152600682015460ff908116151560c0850152600783015460e085015260088301541615156101008401526009909101546101208301526136e2576040805162461bcd60e51b815260206004820152601d602482015260008051602061533e833981519152604482015290519081900360640190fd5b60006137038261010001518360e0015184608001518560c00151600161204a565b506001600160a01b0380871660009081526001602081815260408084208a8552825280842080546001600160a01b0319908116825593810180548516905560028101859055600381018054851690556004810180549094169093556005830184905560068301805460ff19908116909155600784018590556008840180549091169055600990920192909255600b5490860151918601519394506137ab9383169216906140de565b81606001516001600160a01b031682602001516001600160a01b0316146138835760408051600280825260608083018452926020830190803683370190505090508260200151816000815181106137fe57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505082606001518160018151811061383057fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600061385e82600030614135565b600b546060860151919250613880916001600160a01b039081169116836140de565b50505b600a5482516060840151608085015160a086015160c087015160408051630f8ee8bb60e11b81526001600160a01b03968716600482015294861660248601529285166044850152606484019190915215156084830152519190921691631f1dd1769160a480830192600092919082900301818387803b15801561390557600080fd5b505af1158015613919573d6000803e3d6000fd5b5050505061392c82610120015184614264565b81600001516001600160a01b03167f7fb1c74d1ea6aa1c9c585e17ce8274c8ff98745e85e7459b73f87d784494f58e8584602001518560400151866060015187608001518860a001518960c001518a60e001518b61010001518c61012001518c604051808c81526020018b6001600160a01b031681526020018a8152602001896001600160a01b03168152602001886001600160a01b03168152602001878152602001861515815260200185815260200184151581526020018381526020018281526020019b50505050505050505050505060405180910390a250506001600055505050565b6000806000806000806000806000613a28615250565b505050506001600160a01b0397881660009081526001602081815260408084209a845299815291899020895161014081018b5281548c168152918101548b1692820183905260028101549982018a905260038101548b16606083018190526004820154909b1660808301819052600582015460a08401819052600683015460ff908116151560c08601819052600785015460e08701819052600886015490921615156101008701819052600990950154610120909601869052959e9c9d9c929b5090995093975092955093509150565b60046020526000908152604090205481565b6007546001600160a01b03163314613b60576040805162461bcd60e51b815260206004820152601460248201527327b93232b92137b7b59d103337b93134b23232b760611b604482015290519081900360640190fd5b600e5460ff1615613bb8576040805162461bcd60e51b815260206004820152601e60248201527f4f72646572426f6f6b3a20616c726561647920696e697469616c697a65640000604482015290519081900360640190fd5b600e805460ff19166001179055600a80546001600160a01b038089166001600160a01b03199283168117909355600b8054898316908416811790915560088054898416908516811790915560098054938916939094168317909355600c869055600d8590556040805194855260208501919091528381019290925260608301526080820184905260a08201839052517fcfb7ef8749fafc8da2af1ba3d025479ffc4e58f7dc420113e112512a3bda59639181900360c00190a1505050505050565b600360208181526000938452604080852090915291835291208054600182015460028301549383015460048401546005850154600686015460078701546008909701546001600160a01b039687169895871697959690941694929360ff9283169391929091169089565b6009546001600160a01b031681565b60026000541415613d38576040805162461bcd60e51b815260206004820152601f602482015260008051602061535e833981519152604482015290519081900360640190fd5b6002600055613d456151dd565b33600090815260056020908152604080832085845282529182902082516101008101845281546001600160a01b0316815260018201805485518186028101860190965280865291949293858101939290830182828015613dce57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613db0575b5050509183525050600282015460208201526003820154604082015260048201546060820152600582015460ff8082161515608084015261010090910416151560a082015260069091015460c09091015280519091506001600160a01b0316613e6c576040805162461bcd60e51b815260206004820152601d602482015260008051602061533e833981519152604482015290519081900360640190fd5b336000908152600560209081526040808320858452909152812080546001600160a01b031916815590613ea2600183018261522f565b50600060028201819055600382018190556004820181905560058201805461ffff191690556006909101819055600854602083015180516001600160a01b03909216929091613eed57fe5b60200260200101516001600160a01b03161415613f2757613f22611f2382604001518360e0015161435390919063ffffffff16565b613f4f565b613f41338260400151836020015160008151811061127257fe5b613f4f8160e0015133614264565b336001600160a01b03167fefd66d4f9c2f880c70aedeb5b26a44fb474cea07e5d6c533f2d27c303d5d94538383602001518460400151856060015186608001518760a001518860c001518960e00151604051808981526020018060200188815260200187815260200186815260200185151581526020018415158152602001838152602001828103825289818151815260200191508051906020019060200280838360005b8381101561400c578181015183820152602001613ff4565b50505050905001995050505050505050505060405180910390a250506001600055565b600a546001600160a01b031681565b600b546001600160a01b031681565b6007546001600160a01b031633146140a3576040805162461bcd60e51b815260206004820152601460248201527327b93232b92137b7b59d103337b93134b23232b760611b604482015290519081900360640190fd5b600c8190556040805182815290517fbde5eafdc37b81830d70124cddccaaa6d034e71dda3c8fc18a959ca76a7cbcfc9181900360200190a150565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052614130908490614b9b565b505050565b600083516002141561417c576141758460008151811061415157fe5b60200260200101518560018151811061416657fe5b60200260200101518585614c4c565b905061425d565b8351600314156142225760006141bd8560008151811061419857fe5b6020026020010151866001815181106141ad57fe5b6020026020010151600030614c4c565b90506141e6600b60009054906101000a90046001600160a01b0316828760018151811061127257fe5b61421a856001815181106141f657fe5b60200260200101518660028151811061420b57fe5b60200260200101518686614c4c565b91505061425d565b6040805162461bcd60e51b815260206004820152601f6024820152600080516020615502833981519152604482015290519081900360640190fd5b9392505050565b60085460408051632e1a7d4d60e01b81526004810185905290516001600160a01b0390921691632e1a7d4d9160248082019260009290919082900301818387803b1580156142b157600080fd5b505af11580156142c5573d6000803e3d6000fd5b506142dd925050506001600160a01b03821683614e2b565b5050565b341561435157600860009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561433757600080fd5b505af115801561434b573d6000803e3d6000fd5b50505050505b565b60008282018381101561425d576040805162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b604482015290519081900360640190fd5b6001600160a01b0388166000908152600660205260409020546143cc6151dd565b6040518061010001604052808b6001600160a01b031681526020018a81526020018981526020018881526020018781526020018615158152602001851515815260200184815250905061442960018361435390919063ffffffff16565b6001600160a01b038b8116600090815260066020908152604080832094909455600581528382208683528152929020835181546001600160a01b031916921691909117815582820151805184936144879260018501929101906152a4565b5060408201518160020155606082015181600301556080820151816004015560a08201518160050160006101000a81548160ff02191690831515021790555060c08201518160050160016101000a81548160ff02191690831515021790555060e08201518160060155905050896001600160a01b03167fdf06bb56ffc4029dc0b62b68bb5bbadea93a38b530cefc9b81afb742a6555d88838b8b8b8b8b8b8b604051808981526020018060200188815260200187815260200186815260200185151581526020018415158152602001838152602001828103825289818151815260200191508051906020019060200280838360005b8381101561459457818101518382015260200161457c565b50505050905001995050505050505050505060405180910390a250505050505050505050565b6000826145c95750600061306d565b828202828482816145d657fe5b041461425d5760405162461bcd60e51b81526004018080602001828103825260218152602001806154956021913960400191505060405180910390fd5b600061425d83836040518060400160405280601a815260200179536166654d6174683a206469766973696f6e206279207a65726f60301b815250614f10565b3360009081526002602052604090205461466a615250565b6040518061014001604052808d6001600160a01b031681526020018c6001600160a01b031681526020018b81526020018a6001600160a01b03168152602001896001600160a01b03168152602001888152602001871515815260200186815260200185151581526020018481525090506146ee60018361435390919063ffffffff16565b600260008e6001600160a01b03166001600160a01b031681526020019081526020016000208190555080600160008e6001600160a01b03166001600160a01b03168152602001908152602001600020600084815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506040820151816002015560608201518160030160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060808201518160040160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060a0820151816005015560c08201518160060160006101000a81548160ff02191690831515021790555060e082015181600701556101008201518160080160006101000a81548160ff02191690831515021790555061012082015181600901559050508b6001600160a01b03167fb27b9afe3043b93788c40cfc3cc73f5d928a2e40f3ba01820b246426de8fa1b9838d8d8d8d8d8d8d8d8d604051808b81526020018a6001600160a01b03168152602001898152602001886001600160a01b03168152602001876001600160a01b03168152602001868152602001851515815260200184815260200183151581526020018281526020019a505050505050505050505060405180910390a2505050505050505050505050565b6001600160a01b038816600090815260046020526040902054614946615191565b5060408051610120810182526001600160a01b03808c1682528a8116602083015291810189905290871660608201526080810186905284151560a082015260c0810184905282151560e0820152346101008201526149a5826001614353565b600460008c6001600160a01b03166001600160a01b031681526020019081526020016000208190555080600360008c6001600160a01b03166001600160a01b03168152602001908152602001600020600084815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506040820151816002015560608201518160030160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506080820151816004015560a08201518160050160006101000a81548160ff02191690831515021790555060c0820151816006015560e08201518160070160006101000a81548160ff0219169083151502179055506101008201518160080155905050896001600160a01b03167f48ee333d2a65cc45fdb83bc012920d89181c3377390cd239d2b63f2bef67a02d838b8b8b8b8b8b8b34604051808a8152602001896001600160a01b03168152602001888152602001876001600160a01b0316815260200186815260200185151581526020018481526020018315158152602001828152602001995050505050505050505060405180910390a250505050505050505050565b6060614bf0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316614fb29092919063ffffffff16565b80519091501561413057808060200190516020811015614c0f57600080fd5b50516141305760405162461bcd60e51b815260040180806020018281038252602a815260200180615522602a913960400191505060405180910390fd5b60095460009081906001600160a01b0386811691161415614cf157600b546040805163817bb85760e01b81526001600160a01b03898116600483015286811660248301529151919092169163817bb8579160448083019260209291908290030181600087803b158015614cbe57600080fd5b505af1158015614cd2573d6000803e3d6000fd5b505050506040513d6020811015614ce857600080fd5b50519050614dec565b6009546001600160a01b0387811691161415614d5e57600b5460408051630711e61960e41b81526001600160a01b03888116600483015286811660248301529151919092169163711e61909160448083019260209291908290030181600087803b158015614cbe57600080fd5b600b5460408051634998b10960e11b81526001600160a01b038981166004830152888116602483015286811660448301529151919092169163933162129160648083019260209291908290030181600087803b158015614dbd57600080fd5b505af1158015614dd1573d6000803e3d6000fd5b505050506040513d6020811015614de757600080fd5b505190505b838110156125b45760405162461bcd60e51b815260040180806020018281038252602181526020018061542a6021913960400191505060405180910390fd5b80471015614e80576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015290519081900360640190fd5b6040516000906001600160a01b0384169083908381818185875af1925050503d8060008114614ecb576040519150601f19603f3d011682016040523d82523d6000602084013e614ed0565b606091505b50509050806141305760405162461bcd60e51b815260040180806020018281038252603a8152602001806153ca603a913960400191505060405180910390fd5b60008183614f9c5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614f61578181015183820152602001614f49565b50505050905090810190601f168015614f8e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581614fa857fe5b0495945050505050565b6060614fc18484600085614fc9565b949350505050565b60608247101561500a5760405162461bcd60e51b81526004018080602001828103825260268152602001806154046026913960400191505060405180910390fd5b61501385615125565b615064576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106150a35780518252601f199092019160209182019101615084565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114615105576040519150601f19603f3d011682016040523d82523d6000602084013e61510a565b606091505b509150915061511a82828661512b565b979650505050505050565b3b151590565b6060831561513a57508161425d565b82511561514a5782518084602001fd5b60405162461bcd60e51b8152602060048201818152845160248401528451859391928392604401919085019080838360008315614f61578181015183820152602001614f49565b6040805161012081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081019190915290565b60405180610100016040528060006001600160a01b0316815260200160608152602001600081526020016000815260200160008152602001600015158152602001600015158152602001600081525090565b508054600082559060005260206000209081019061524d9190615309565b50565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081019190915290565b8280548282559060005260206000209081019282156152f9579160200282015b828111156152f957825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906152c4565b5061530592915061531e565b5090565b5b80821115615305576000815560010161530a565b5b808211156153055780546001600160a01b031916815560010161531f56fe4f72646572426f6f6b3a206e6f6e2d6578697374656e74206f726465720000005265656e7472616e637947756172643a207265656e7472616e742063616c6c004f72646572426f6f6b3a20696e73756666696369656e7420636f6c6c61746572616c6f72646572626f6f6b206e6f7420617070726f76656420617320706c7567696e206f6e20726f75746572416464726573733a20756e61626c6520746f2073656e642076616c75652c20726563697069656e74206d61792068617665207265766572746564416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c4f72646572426f6f6b3a20696e73756666696369656e7420616d6f756e744f75744f72646572426f6f6b3a206f6e6c79207765746820636f756c6420626520777261707065644f72646572426f6f6b3a20696e73756666696369656e7420657865637574696f6e20666565536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f72646572426f6f6b3a20696e636f72726563742076616c7565207472616e736665727265644f72646572426f6f6b3a20696e76616c696420707269636520666f7220657865637574696f6e4f72646572426f6f6b3a20696e76616c6964205f706174682e6c656e677468005361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565644f72646572426f6f6b3a20696e636f727265637420657865637574696f6e20666565207472616e73666572726564a264697066735822122015baaa9b2de51328a43c7b2267f06fbff79e454fc2de204746ed6bcf9049d1b464736f6c634300060c0033
Deployed ByteCode Sourcemap
30865:33322:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38099:4;;-1:-1:-1;;;;;38099:4:0;38085:10;:18;38077:56;;;;;-1:-1:-1;;;38077:56:0;;;;;;;;;;;;-1:-1:-1;;;38077:56:0;;;;;;;;;;;;;;;30865:33322;;;;;32415:51;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32415:51:0;-1:-1:-1;;;;;32415:51:0;;:::i;:::-;;;;;;;;;;;;;;;;48688:730;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;48688:730:0;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;48688:730:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46455:1562;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;46455:1562:0;;;;;;;;;;;;;;;;;:::i;38338:241::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38338:241:0;;:::i;59142:1905::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;59142:1905:0;;;;;;;;;;;;;;;;;:::i;32475:18::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;32475:18:0;;;;;;;;;;;;;;39616:1370;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39616:1370:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39616:1370:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39616:1370:0;;-1:-1:-1;;39616:1370:0;;;-1:-1:-1;;;39616:1370:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;32050:76::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;32050:76:0;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;32050:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32691:33;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;32500:19;;;;;;;;;;;;;:::i;54332:1028::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54332:1028:0;;:::i;31083:45::-;;;;;;;;;;;;;:::i;48025:655::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48025:655:0;;;;;;;;;;-1:-1:-1;;;;;48025:655:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;32607:30;;;;;;;;;;;;;:::i;32340:68::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;32340:68:0;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;32340:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42009:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42009:602:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42009:602:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42009:602:0;;;;;;;;-1:-1:-1;42009:602:0;;-1:-1:-1;;;;;42009:602:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42009:602:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42009:602:0;;;;;;;;-1:-1:-1;42009:602:0;;-1:-1:-1;;;;;42009:602:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42009:602:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42009:602:0;;-1:-1:-1;42009:602:0;;-1:-1:-1;;;;;42009:602:0:i;32644:40::-;;;;;;;;;;;;;:::i;31030:46::-;;;;;;;;;;;;;:::i;53580:744::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53580:744:0;;;;;;;;;;;;;;;;;;;:::i;43514:475::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43514:475:0;-1:-1:-1;;;;;43514:475:0;;:::i;61055:724::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61055:724:0;;:::i;61787:904::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61787:904:0;;;;;;;;;;;;;;;;;;;;;;;;:::i;32133:55::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32133:55:0;-1:-1:-1;;;;;32133:55:0;;:::i;50238:2068::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;50238:2068:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;50238:2068:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50238:2068:0;;-1:-1:-1;;50238:2068:0;;;-1:-1:-1;;;;;;;50238:2068:0;;;;;;;;;;;;-1:-1:-1;50238:2068:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;57331:682::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;57331:682:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;43997:1700::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;43997:1700:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;43997:1700:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43997:1700:0;;-1:-1:-1;;43997:1700:0;;;-1:-1:-1;43997:1700:0;;-1:-1:-1;;43997:1700:0:i;45705:742::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45705:742:0;;;;;;;;;;;;;;;;;;;:::i;38587:166::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38587:166:0;-1:-1:-1;;;;;38587:166:0;;:::i;38761:847::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;38761:847:0;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;38761:847:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55368:1955;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;55368:1955:0;;;;;;;;;;;;;;;;;:::i;49426:804::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;49426:804:0;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;49426:804:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32278:55;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32278:55:0;-1:-1:-1;;;;;32278:55:0;;:::i;37386:645::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;37386:645:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;32195:76::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;32195:76:0;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;32195:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32526:19;;;;;;;;;;;;;:::i;42619:887::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42619:887:0;;:::i;32552:21::-;;;;;;;;;;;;;:::i;32580:20::-;;;;;;;;;;;;;:::i;38149:181::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38149:181:0;;:::i;32415:51::-;;;;;;;;;;;;;:::o;48688:730::-;48793:23;48827;48861:18;48890:17;48918:11;48940:20;48971:26;49008:20;49047:26;;:::i;:::-;-1:-1:-1;;;;;;;;;49076:24:0;;;;;;;:14;:24;;;;;;;;:37;;;;;;;;;;49047:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49047:66:0;;-1:-1:-1;49047:66:0;;-1:-1:-1;49047:66:0;-1:-1:-1;49047:66:0;-1:-1:-1;48688:730:0:o;46455:1562::-;9671:1;10277:7;;:19;;10269:63;;;;;-1:-1:-1;;;10269:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10269:63:0;;;;;;;;;;;;;;;9671:1;10410:7;:18;46583:22:::1;;:::i;:::-;-1:-1:-1::0;;;;;46608:20:0;;::::1;;::::0;;;:10:::1;:20;::::0;;;;;;;:33;;;;;;;;;46583:58;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;;;;;::::1;::::0;;;;;;;;;;46608:33;;46583:58;;::::1;::::0;;;;;::::1;::::0;;;::::1;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;46583:58:0::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;-1:-1:-1::0;;;46583:58:0;;;-1:-1:-1;;46583:58:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;;;::::0;;;;::::1;::::0;;::::1;;;;::::0;;;;::::1;::::0;;::::1;::::0;;;;;;46660:13;;46583:58;;-1:-1:-1;;;;;;46660:27:0::1;46652:69;;;::::0;;-1:-1:-1;;;46652:69:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;46652:69:0;;;;;;;;;;;;;::::1;;46738:5;:27;;;46734:371;;;46940:79;46988:5;:10;;;47000:5;:18;;;46940:47;:79::i;:::-;46914:179;;;;-1:-1:-1::0;;;46914:179:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;47124:20:0;::::1;;::::0;;;:10:::1;:20;::::0;;;;;;;:33;;;;;;;;47117:40;;-1:-1:-1;;;;;;47117:40:0::1;::::0;;47124:33;47117:40:::1;::::0;;::::1;47124:20:::0;47117:40:::1;:::i;:::-;-1:-1:-1::0;47117:40:0::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;47117:40:0;;;::::1;::::0;;::::1;::::0;;;47205:5:::1;::::0;47212:14:::1;::::0;::::1;::::0;47177:10:::1;::::0;::::1;::::0;:13;;47170:57:::1;::::0;-1:-1:-1;;;;;47205:5:0;;::::1;::::0;47117:40;47177:13:::1;;;;;;;;;;-1:-1:-1::0;;;;;47170:34:0::1;;;:57;;;;;:::i;:::-;47310:4;::::0;47273:10:::1;::::0;::::1;::::0;47284:17;;47240:18:::1;::::0;-1:-1:-1;;;;;47310:4:0::1;::::0;47273:10;-1:-1:-1;;47284:21:0;;;47273:33;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;47273:41:0::1;;:63;;;;;47318:5;:18;;;47273:63;47269:313;;;47366:46;47372:5;:10;;;47384:5;:12;;;47406:4;47366:5;:46::i;:::-;47353:59;;47427:51;47443:10;47463:5;:13;;;47427:15;:51::i;:::-;47269:313;;;47524:46;47530:5;:10;;;47542:5;:12;;;47556:5;:13;;;47524:5;:46::i;:::-;47511:59;;47269:313;47619:49;47635:5;:18;;;47655:12;47619:15;:49::i;:::-;47717:8;-1:-1:-1::0;;;;;47686:323:0::1;;47740:11;47766:5;:10;;;47791:5;:14;;;47820:5;:12;;;47847:10;47872:5;:18;;;47905:5;:27;;;47947:5;:18;;;47980:5;:18;;;47686:323;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;9627:1:0;10589:7;:22;-1:-1:-1;;;46455:1562:0:o;38338:241::-;37266:3;;-1:-1:-1;;;;;37266:3:0;37252:10;:17;37244:50;;;;;-1:-1:-1;;;37244:50:0;;;;;;;;;;;;-1:-1:-1;;;37244:50:0;;;;;;;;;;;;;;;38440:25:::1;:54:::0;;;38512:59:::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;38338:241:::0;:::o;59142:1905::-;9671:1;10277:7;;:19;;10269:63;;;;;-1:-1:-1;;;10269:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10269:63:0;;;;;;;;;;;;;;;9671:1;10410:7;:18;;;59356:6:::1;::::0;59348:38:::1;::::0;;-1:-1:-1;;;59348:38:0;;59380:4:::1;59348:38;::::0;::::1;::::0;;;-1:-1:-1;;;;;59356:6:0;;::::1;::::0;59348:23:::1;::::0;:38;;;;;::::1;::::0;;;;;;;;;;;59356:6;59348:38;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;59348:38:0;:46:::1;;59390:4;59348:46;59340:101;;;;-1:-1:-1::0;;;59340:101:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59454:26;;:::i;:::-;-1:-1:-1::0;;;;;;59483:24:0;;::::1;;::::0;;;:14:::1;:24;::::0;;;;;;;:37;;;;;;;;;59454:66;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;;;;;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;;;::::0;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;::::1;;;::::0;;;;::::1;;::::0;::::1;::::0;;;;59531:69:::1;;;::::0;;-1:-1:-1;;;59531:69:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;59531:69:0;;;;;;;;;;;;;::::1;;59709:20;59735:190;59776:5;:27;;;59818:5;:18;;;59851:5;:16;;;59883:5;:12;;;59882:13;59910:4;59735:26;:190::i;:::-;-1:-1:-1::0;;;;;;59945:24:0;;::::1;;::::0;;;:14:::1;:24;::::0;;;;;;;:37;;;;;;;;59938:44;;-1:-1:-1;;;;;;59938:44:0;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;59938:44:0;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;60023:6:::1;::::0;60068:13;;60096:21;;::::1;::::0;60132:16:::1;::::0;::::1;::::0;60163:21;;::::1;::::0;60199:15:::1;::::0;::::1;::::0;60229:12:::1;::::0;::::1;::::0;60015:265;;-1:-1:-1;;;60015:265:0;;;;::::1;::::0;;::::1;::::0;;;;;;::::1;::::0;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;::::0;;;;60264:4:::1;60015:265:::0;;;;;;59708:217;;-1:-1:-1;59945:24:0;;60023:6;;;::::1;::::0;60015:38:::1;::::0;:265;;;;;;;;;;59945:24;60023:6;60015:265;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;60015:265:0;60371:4:::1;::::0;60015:265:::1;60346:21:::0;::::1;::::0;60015:265;;-1:-1:-1;;;;;;60346:29:0;;::::1;60371:4:::0;::::1;60346:29;60342:213;;;60392:50;60408:9;60427:5;:13;;;60392:15;:50::i;:::-;60342:213;;;60518:13:::0;;60482:21:::1;::::0;::::1;::::0;60475:68:::1;::::0;-1:-1:-1;;;;;60475:42:0;;::::1;::::0;60533:9;60475:42:::1;:68::i;:::-;60592:49;60608:5;:18;;;60628:12;60592:15;:49::i;:::-;60694:5;:13;;;-1:-1:-1::0;;;;;60659:380:0::1;;60722:11;60748:5;:21;;;60784:5;:21;;;60820:5;:16;;;60851:5;:15;;;60881:5;:12;;;60908:5;:18;;;60941:5;:27;;;60983:5;:18;;;61016:12;60659:380;;;;;;;;;-1:-1:-1::0;;;;;60659:380:0::1;;;;;;;;;;;-1:-1:-1::0;;;;;60659:380:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;9627:1:0;10589:7;:22;-1:-1:-1;;;;59142:1905:0:o;32475:18::-;;;-1:-1:-1;;;;;32475:18:0;;:::o;39616:1370::-;9671:1;10277:7;;:19;;10269:63;;;;;-1:-1:-1;;;10269:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10269:63:0;;;;;;;;;;;;;;;9671:1;10410:7;:18;;;39961:12;;:17:::1;::::0;:38:::1;;;39982:5;:12;39998:1;39982:17;39961:38;39953:82;;;::::0;;-1:-1:-1;;;39953:82:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;39953:82:0;;;;;;;;;;;;;::::1;;40066:5;40087:1;40072:5;:12;:16;40066:23;;;;;;;;;;;;;;-1:-1:-1::0;;;;;40054:35:0::1;:5;40060:1;40054:8;;;;;;;;;;;;;;-1:-1:-1::0;;;;;40054:35:0::1;;;40046:72;;;::::0;;-1:-1:-1;;;40046:72:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40046:72:0;;;;;;;;;;;;;::::1;;40149:1;40137:9;:13;40129:54;;;::::0;;-1:-1:-1;;;40129:54:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40129:54:0;;;;;;;;;;;;;::::1;;40219:15;;40202:13;:32;;40194:82;;;;-1:-1:-1::0;;;40194:82:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40385:16;:14;:16::i;:::-;40418:11;40414:428;;;40466:4;::::0;40454:8;;-1:-1:-1;;;;;40466:4:0;;::::1;::::0;40454:5;;40466:4:::1;::::0;40454:8:::1;;;;;;;;;;-1:-1:-1::0;;;;;40454:16:0::1;;40446:66;;;;-1:-1:-1::0;;;40446:66:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40548:28;:13:::0;40566:9;40548:17:::1;:28::i;:::-;40535:9;:41;40527:92;;;;-1:-1:-1::0;;;40527:92:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40414:428;;;40673:13;40660:9;:26;40652:85;;;;-1:-1:-1::0;;;40652:85:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40760:6;::::0;40783:8;;-1:-1:-1;;;;;40760:6:0;;::::1;::::0;40752:30:::1;::::0;40783:5;;40760:6:::1;::::0;40783:8:::1;;;;;;;;;;40793:10;40813:4;40820:9;40752:78;;;;;;;;;;;;;-1:-1:-1::0;;;;;40752:78:0::1;;;;;;-1:-1:-1::0;;;;;40752:78:0::1;;;;;;-1:-1:-1::0;;;;;40752:78:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;40414:428;40854:124;40871:10;40883:5;40890:9;40901:7;40910:13;40925:22;40949:13;40964;40854:16;:124::i;:::-;-1:-1:-1::0;;9627:1:0;10589:7;:22;-1:-1:-1;;;;;;39616:1370:0:o;32050:76::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32050:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32691:33::-;;;;;;:::o;32500:19::-;;;-1:-1:-1;;;;;32500:19:0;;:::o;54332:1028::-;9671:1;10277:7;;:19;;10269:63;;;;;-1:-1:-1;;;10269:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10269:63:0;;;;;;;;;;;;;;;9671:1;10410:7;:18;54413:26:::1;;:::i;:::-;-1:-1:-1::0;54457:10:0::1;54442:26;::::0;;;:14:::1;:26;::::0;;;;;;;:39;;;;;;;;;54413:68;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;54413:68:0;;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;;;::::0;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;::::1;;;;::::0;;;::::1;;::::0;;;;;54492:69:::1;;;::::0;;-1:-1:-1;;;54492:69:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;54492:69:0;;;;;;;;;;;;;::::1;;54596:10;54581:26;::::0;;;:14:::1;:26;::::0;;;;;;;:39;;;;;;;54574:46;;-1:-1:-1;;;;;;54574:46:0;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;54574:46:0;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;;54660:4;54637:19;;::::1;::::0;-1:-1:-1;;;;;54637:27:0;;::::1;54660:4:::0;::::1;54637:27;54633:312;;;54681:78;54697:49;54720:5;:25;;;54697:5;:18;;;:22;;:49;;;;:::i;:::-;54748:10;54681:15;:78::i;:::-;54633:312;;;54792:79;54833:10;54845:5;:25;;;54799:5;:19;;;-1:-1:-1::0;;;;;54792:40:0::1;;;:79;;;;;:::i;:::-;54886:47;54902:5;:18;;;54922:10;54886:15;:47::i;:::-;54996:5;:13;;;-1:-1:-1::0;;;;;54962:390:0::1;;55024:11;55050:5;:19;;;55084:5;:25;;;55124:5;:21;;;55160:5;:16;;;55191:5;:15;;;55221:5;:12;;;55248:5;:18;;;55281:5;:27;;;55323:5;:18;;;54962:390;;;;;;;;;-1:-1:-1::0;;;;;54962:390:0::1;;;;;;;;;;;-1:-1:-1::0;;;;;54962:390:0::1;;;;;;-1:-1:-1::0;;;;;54962:390:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;9627:1:0;10589:7;:22;54332:1028::o;31083:45::-;31124:4;31083:45;:::o;48025:655::-;48241:7;48250:4;48267:20;48290:14;:109;;48368:5;;48361:38;;;-1:-1:-1;;;48361:38:0;;-1:-1:-1;;;;;48361:38:0;;;;;;;;;48368:5;;;;;48361:25;;:38;;;;;;;;;;;;;;48368:5;48361:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48361:38:0;48290:109;;;48327:5;;48320:38;;;-1:-1:-1;;;48320:38:0;;-1:-1:-1;;;;;48320:38:0;;;;;;;;;48327:5;;;;;48320:25;;:38;;;;;;;;;;;;;;48327:5;48320:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48320:38:0;48290:109;48267:132;;48410:17;48430:22;:84;;48501:13;48486:12;:28;48430:84;;;48470:13;48455:12;:28;48430:84;48410:104;;48529:6;48525:102;;;48560:12;48552:63;;;;-1:-1:-1;;;48552:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48645:12;;;;-1:-1:-1;48025:655:0;-1:-1:-1;;;;;;48025:655:0:o;32607:30::-;;;;:::o;32340:68::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32340:68:0;;;;;;;;;;;;;;;;;;;:::o;42009:602::-;42208:9;42203:119;42227:17;:24;42223:1;:28;42203:119;;;42273:37;42289:17;42307:1;42289:20;;;;;;;;;;;;;;42273:15;:37::i;:::-;42253:3;;42203:119;;;;42337:9;42332:131;42356:21;:28;42352:1;:32;42332:131;;;42406:45;42426:21;42448:1;42426:24;;;;;;;;;;;;;;42406:19;:45::i;:::-;42386:3;;42332:131;;;;42478:9;42473:131;42497:21;:28;42493:1;:32;42473:131;;;42547:45;42567:21;42589:1;42567:24;;;;;;;;;;;;;;42547:19;:45::i;:::-;42527:3;;42473:131;;;;42009:602;;;:::o;32644:40::-;;;;:::o;31030:46::-;-1:-1:-1;;;31030:46:0;:::o;53580:744::-;9671:1;10277:7;;:19;;10269:63;;;;;-1:-1:-1;;;10269:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10269:63:0;;;;;;;;;;;;;;;9671:1;10410:7;:18;;;53780:10:::1;53765:26:::0;;:14:::1;:26;::::0;;;;;;;:39;;;;;;;;53823:13;;-1:-1:-1;;;;;53823:13:0::1;53815:69;;;::::0;;-1:-1:-1;;;53815:69:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;53815:69:0;;;;;;;;;;;;;::::1;;53897:18;::::0;::::1;:34:::0;;;53942:27:::1;::::0;::::1;:52:::0;;;::::1;;-1:-1:-1::0;;53942:52:0;;::::1;::::0;::::1;::::0;;;54005:15:::1;::::0;::::1;:28:::0;;;-1:-1:-1;54136:21:0;::::1;::::0;54172:16:::1;::::0;::::1;::::0;54203:12:::1;::::0;::::1;::::0;54051:265:::1;::::0;;;;;-1:-1:-1;;;;;54136:21:0;;::::1;54051:265;::::0;::::1;::::0;54172:16;;;::::1;54051:265:::0;;;;53942:52:::1;54203:12;54051:265;;::::0;;;;;;;;;;;;;;;;;;;;;;;;54085:10:::1;::::0;54051:265:::1;::::0;;;;;;;;::::1;-1:-1:-1::0;;9627:1:0;10589:7;:22;-1:-1:-1;;;53580:744:0:o;43514:475::-;43684:5;;43677:62;;;-1:-1:-1;;;43677:62:0;;-1:-1:-1;;;;;43677:62:0;;;;;;;31124:4;43677:62;;;;;;43581:7;;;;43684:5;;43677:33;;:62;;;;;;;;;;;;;;43684:5;43677:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43677:62:0;43783:5;;43776:38;;;-1:-1:-1;;;43776:38:0;;-1:-1:-1;;;;;43776:38:0;;;;;;;;;43677:62;;-1:-1:-1;43750:23:0;;43783:5;;;;;43776:25;;:38;;;;;43677:62;;43776:38;;;;;;;43783:5;43776:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43776:38:0;43863:5;;43856:40;;;-1:-1:-1;;;43856:40:0;;-1:-1:-1;;;;;43856:40:0;;;;;;;;;43776:38;;-1:-1:-1;43827:26:0;;43863:5;;;;;43856:27;;:40;;;;;43776:38;;43856:40;;;;;;;43863:5;43856:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43856:40:0;;-1:-1:-1;43914:67:0;43956:2;:24;;;43914:37;:16;43935:15;43914:20;:37::i;:::-;:41;;:67::i;:::-;43907:74;43514:475;-1:-1:-1;;;;;43514:475:0:o;61055:724::-;9671:1;10277:7;;:19;;10269:63;;;;;-1:-1:-1;;;10269:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10269:63:0;;;;;;;;;;;;;;;9671:1;10410:7;:18;61136:26:::1;;:::i;:::-;-1:-1:-1::0;61180:10:0::1;61165:26;::::0;;;:14:::1;:26;::::0;;;;;;;:39;;;;;;;;;61136:68;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;61136:68:0;;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;;;;;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;;;::::0;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;::::1;;;::::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;61215:69:::1;;;::::0;;-1:-1:-1;;;61215:69:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;61215:69:0;;;;;;;;;;;;;::::1;;61319:10;61304:26;::::0;;;:14:::1;:26;::::0;;;;;;;:39;;;;;;;;61297:46;;-1:-1:-1;;;;;;61297:46:0;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;61297:46:0;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;;::::0;::::1;61370:18:::0;::::1;::::0;61354:47:::1;::::0;:15:::1;:47::i;:::-;61453:5;:13;;;-1:-1:-1::0;;;;;61419:352:0::1;;61481:11;61507:5;:21;;;61543:5;:21;;;61579:5;:16;;;61610:5;:15;;;61640:5;:12;;;61667:5;:18;;;61700:5;:27;;;61742:5;:18;;;61419:352;;;;;;;;;-1:-1:-1::0;;;;;61419:352:0::1;;;;;;;;;;;-1:-1:-1::0;;;;;61419:352:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;9627:1:0;10589:7;:22;61055:724::o;61787:904::-;9671:1;10277:7;;:19;;10269:63;;;;;-1:-1:-1;;;10269:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10269:63:0;;;;;;;;;;;;;;;9671:1;10410:7;:18;;;62065:10:::1;62050:26:::0;;:14:::1;:26;::::0;;;;;;;:39;;;;;;;;62108:13;;-1:-1:-1;;;;;62108:13:0::1;62100:69;;;::::0;;-1:-1:-1;;;62100:69:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;62100:69:0;;;;;;;;;;;;;::::1;;62182:18;::::0;::::1;:34:::0;;;62227:27:::1;::::0;::::1;:52:::0;;;::::1;;-1:-1:-1::0;;62227:52:0;;::::1;::::0;::::1;::::0;;;62290:15:::1;::::0;::::1;:28:::0;;;-1:-1:-1;62329:21:0;::::1;:40:::0;;;62227:52;62472:21;::::1;::::0;-1:-1:-1;62539:16:0;::::1;::::0;-1:-1:-1;62595:12:0;::::1;::::0;62387:296:::1;::::0;;;;;-1:-1:-1;;;;;62472:21:0;;::::1;62387:296;::::0;::::1;::::0;;;;;;;62539:16;;;::::1;62387:296:::0;;;;;;;;;;62227:52:::1;62595:12;62387:296;;::::0;;;;;;;;;;;;;;;;;;62421:10:::1;::::0;62387:296:::1;::::0;;;;;62227:52:::1;62387:296:::0;;::::1;-1:-1:-1::0;;9627:1:0;10589:7;:22;-1:-1:-1;;;;61787:904:0:o;32133:55::-;;;;;;;;;;;;;:::o;50238:2068::-;9671:1;10277:7;;:19;;10269:63;;;;;-1:-1:-1;;;10269:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10269:63:0;;;;;;;;;;;;;;;9671:1;10410:7;:18;50744:16:::1;:14;:16::i;:::-;50798:15;;50781:13;:32;;50773:82;;;;-1:-1:-1::0;;;50773:82:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50870:11;50866:428;;;50918:4;::::0;50906:8;;-1:-1:-1;;;;;50918:4:0;;::::1;::::0;50906:5;;50918:4:::1;::::0;50906:8:::1;;;;;;;;;;-1:-1:-1::0;;;;;50906:16:0::1;;50898:66;;;;-1:-1:-1::0;;;50898:66:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51000:28;:13:::0;51018:9;51000:17:::1;:28::i;:::-;50987:9;:41;50979:92;;;;-1:-1:-1::0;;;50979:92:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50866:428;;;51125:13;51112:9;:26;51104:85;;;;-1:-1:-1::0;;;51104:85:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51212:6;::::0;51235:8;;-1:-1:-1;;;;;51212:6:0;;::::1;::::0;51204:30:::1;::::0;51235:5;;51212:6:::1;::::0;51235:8:::1;;;;;;;;;;51245:10;51265:4;51272:9;51204:78;;;;;;;;;;;;;-1:-1:-1::0;;;;;51204:78:0::1;;;;;;-1:-1:-1::0;;;;;51204:78:0::1;;;;;;-1:-1:-1::0;;;;;51204:78:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;50866:428;51306:22;51331:5;51352:1;51337:5;:12;:16;51331:23;;;;;;;;;;;;;;51306:48;;51365:28;51423:1;51408:5;:12;:16;51404:313;;;51461:14;-1:-1:-1::0;;;;;51449:26:0::1;:5;51455:1;51449:8;;;;;;;;;;;;;;-1:-1:-1::0;;;;;51449:26:0::1;;;51441:63;;;::::0;;-1:-1:-1;;;51441:63:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;51441:63:0;;;;;;;;;;;;;::::1;;51519:47;51549:5;;;;;;;;;-1:-1:-1::0;;;;;51549:5:0::1;51556:9;51526:5;51532:1;51526:8;;;;;;;51519:47;51604:36;51610:5;51617:7;51634:4;51604:5;:36::i;:::-;51581:59;;51404:313;;;-1:-1:-1::0;51696:9:0;51404:313:::1;51785:5;::::0;51778:65:::1;::::0;;-1:-1:-1;;;51778:65:0;;-1:-1:-1;;;;;51778:65:0;;::::1;;::::0;::::1;::::0;;;;;;;;;51744:31:::1;::::0;51785:5;;;::::1;::::0;51778:27:::1;::::0;:65;;;;;::::1;::::0;;;;;;;;;51785:5;51778:65;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;51778:65:0;51893:25:::1;::::0;51778:65;;-1:-1:-1;51866:52:0;::::1;;51858:99;;;;-1:-1:-1::0;;;51858:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10441:1;51981:317;52016:10;52041:14;52070:20;52105:16;52136:11;52162:10;52187:7;52209:13;52237:22;52274:13;51981:20;:317::i;:::-;-1:-1:-1::0;;9627:1:0;10589:7;:22;-1:-1:-1;;;;;;;;;;;50238:2068:0:o;57331:682::-;9671:1;10277:7;;:19;;10269:63;;;;;-1:-1:-1;;;10269:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10269:63:0;;;;;;;;;;;;;;;9671:1;10410:7;:18;57630:16:::1;:14;:16::i;:::-;57679:15;;57667:9;:27;57659:77;;;;-1:-1:-1::0;;;57659:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57749:256;57784:10;57809:16;57840;57871:11;57897:10;57922:7;57944:13;57972:22;57749:20;:256::i;:::-;-1:-1:-1::0;;9627:1:0;10589:7;:22;-1:-1:-1;;;;;57331:682:0:o;43997:1700::-;44147:4;44172:5;:12;44188:1;44172:17;:38;;;;44193:5;:12;44209:1;44193:17;44172:38;44164:82;;;;;-1:-1:-1;;;44164:82:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;44164:82:0;;;;;;;;;;;;;;;44496:14;44513:5;44519:1;44513:8;;;;;;;;;;;;;;44496:25;;44532:14;44549:5;44570:1;44555:5;:12;:16;44549:23;;;;;;;;;;;;;;;;;;45119:4;;44549:23;;-1:-1:-1;44583:19:0;;;;-1:-1:-1;;;;;45109:14:0;;;45119:4;;45109:14;45105:251;;;45239:25;45255:5;45261:1;45255:8;;;;;;;;;;;;;;45239:15;:25::i;:::-;45225:39;;45105:251;;;45318:5;;45311:33;;;-1:-1:-1;;;45311:33:0;;-1:-1:-1;;;;;45311:33:0;;;;;;;;;45318:5;;;;;45311:25;;:33;;;;;;;;;;;;;;45318:5;45311:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45311:33:0;;-1:-1:-1;45105:251:0;45382:4;;-1:-1:-1;;;;;45372:14:0;;;45382:4;;45372:14;45368:156;;;-1:-1:-1;;;;45368:156:0;;;45486:5;;45479:33;;;-1:-1:-1;;;45479:33:0;;-1:-1:-1;;;;;45479:33:0;;;;;;;;;45486:5;;;;;45479:25;;:33;;;;;;;;;;;;;;45486:5;45479:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45479:33:0;;-1:-1:-1;45368:156:0;45536:20;45559:49;45596:11;45559:32;:11;-1:-1:-1;;;45559:15:0;:32::i;:49::-;45636:28;-1:-1:-1;45636:28:0;-1:-1:-1;;;;;;43997:1700:0;;;;;:::o;45705:742::-;9671:1;10277:7;;:19;;10269:63;;;;;-1:-1:-1;;;10269:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10269:63:0;;;;;;;;;;;;;;;9671:1;10410:7;:18;;;45890:10:::1;45879:22:::0;;:10:::1;:22;::::0;;;;;;;:35;;;;;;;;45933:13;;-1:-1:-1;;;;;45933:13:0::1;45925:69;;;::::0;;-1:-1:-1;;;45925:69:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;45925:69:0;;;;;;;;;;;;;::::1;;46022:7;46007:5;:12;;:22;;;;46061:13;46040:5;:18;;:34;;;;46115:22;46085:5;:27;;;:52;;;;;;;;;;;;;;;;;;46185:10;-1:-1:-1::0;;;;;46155:284:0::1;;46210:11;46236:5;:10;;46261:5;:14;;;46290:7;46312:13;46340:22;46377:5;:18;;;;;;;;;;;;46410:5;:18;;;46155:284;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;46155:284:0::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;9627:1:0;10589:7;:22;-1:-1:-1;;;45705:742:0:o;38587:166::-;37266:3;;-1:-1:-1;;;;;37266:3:0;37252:10;:17;37244:50;;;;;-1:-1:-1;;;37244:50:0;;;;;;;;;;;;-1:-1:-1;;;37244:50:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;38653:20:0;::::1;38645:46;;;::::0;;-1:-1:-1;;;38645:46:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;38645:46:0;;;;;;;;;;;;;::::1;;38702:3;:10:::0;;-1:-1:-1;;;;;38702:10:0;::::1;-1:-1:-1::0;;;;;;38702:10:0;;::::1;::::0;::::1;::::0;;;38730:15:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;38587:166:::0;:::o;38761:847::-;38862:13;38886;38910;38934:16;38961:14;38986:20;39017:26;39054:17;39082:20;39121:22;;:::i;:::-;-1:-1:-1;;;;;39146:20:0;;;;;;;:10;:20;;;;;;;;:33;;;;;;;;;39121:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39146:33;;39121:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39121:58:0;;;;;;;;;;;;;;;;-1:-1:-1;;;39121:58:0;;;-1:-1:-1;;39121:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39212:10;;;:17;39121:58;;-1:-1:-1;39212:50:0;;39260:1;39212:50;;;39236:5;:10;;;39247:1;39236:13;;;;;;;;;;;;;;39212:50;39297:1;39277:5;:10;;;:17;:21;:50;;39325:1;39277:50;;;39301:5;:10;;;39312:1;39301:13;;;;;;;;;;;;;;39277:50;39362:1;39342:5;:10;;;:17;:21;:50;;39390:1;39342:50;;;39366:5;:10;;;39377:1;39366:13;;;;;;;;;;;;;;39342:50;39407:5;:14;;;39436:5;:12;;;39463:5;:18;;;39496:5;:27;;;39538:5;:18;;;39571:5;:18;;;39190:410;;;;;;;;;;;;;;;;;;;38761:847;;;;;;;;;;;:::o;55368:1955::-;9671:1;10277:7;;:19;;10269:63;;;;;-1:-1:-1;;;10269:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10269:63:0;;;;;;;;;;;;;;;9671:1;10410:7;:18;;;55582:6:::1;::::0;55574:38:::1;::::0;;-1:-1:-1;;;55574:38:0;;55606:4:::1;55574:38;::::0;::::1;::::0;;;-1:-1:-1;;;;;55582:6:0;;::::1;::::0;55574:23:::1;::::0;:38;;;;;::::1;::::0;;;;;;;;;;;55582:6;55574:38;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;55574:38:0;:46:::1;;55616:4;55574:46;55566:101;;;;-1:-1:-1::0;;;55566:101:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55680:26;;:::i;:::-;-1:-1:-1::0;;;;;;55709:24:0;;::::1;;::::0;;;:14:::1;:24;::::0;;;;;;;:37;;;;;;;;;55680:66;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;;;::::0;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;::::1;;;;::::0;;;::::1;::::0;;::::1;::::0;;;;;55757:69:::1;;;::::0;;-1:-1:-1;;;55757:69:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;55757:69:0;;;;;;;;;;;;;::::1;;55935:20;55961:189;56002:5;:27;;;56044:5;:18;;;56077:5;:16;;;56108:5;:12;;;56135:4;55961:26;:189::i;:::-;-1:-1:-1::0;;;;;;56170:24:0;;::::1;;::::0;;;:14:::1;:24;::::0;;;;;;;:37;;;;;;;;56163:44;;-1:-1:-1;;;;;;56163:44:0;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;56163:44:0;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;56261:5:::1;::::0;56268:25;;::::1;::::0;56227:19;;::::1;::::0;55934:216;;-1:-1:-1;56220:74:0::1;::::0;:40;::::1;::::0;56261:5:::1;::::0;56220:40:::1;:74::i;:::-;56334:5;:21;;;-1:-1:-1::0;;;;;56311:44:0::1;:5;:19;;;-1:-1:-1::0;;;;;56311:44:0::1;;56307:348;;56396:16;::::0;;56410:1:::1;56396:16:::0;;;56372:21:::1;56396:16:::0;;::::1;::::0;;56372:21;56396:16:::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;56396:16:0::1;56372:40;;56437:5;:19;;;56427:4;56432:1;56427:7;;;;;;;;;;;;;:29;-1:-1:-1::0;;;;;56427:29:0::1;;;-1:-1:-1::0;;;;;56427:29:0::1;;;::::0;::::1;56481:5;:21;;;56471:4;56476:1;56471:7;;;;;;;;;;;;;:31;-1:-1:-1::0;;;;;56471:31:0::1;;;-1:-1:-1::0;;;;;56471:31:0::1;;;::::0;::::1;56519:17;56539:29;56545:4;56551:1;56562:4;56539:5;:29::i;:::-;56626:5;::::0;56590:21:::1;::::0;::::1;::::0;56519:49;;-1:-1:-1;56583:60:0::1;::::0;-1:-1:-1;;;;;56583:42:0;;::::1;::::0;56626:5:::1;56519:49:::0;56583:42:::1;:60::i;:::-;56307:348;;;56675:6;::::0;56706:13;;56721:21:::1;::::0;::::1;::::0;56744:16:::1;::::0;::::1;::::0;56762:15:::1;::::0;::::1;::::0;56779:12:::1;::::0;::::1;::::0;56667:125:::1;::::0;;-1:-1:-1;;;56667:125:0;;-1:-1:-1;;;;;56667:125:0;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;;;::::1;::::0;;;;;;;;;;;::::1;;::::0;;;;;56675:6;;;::::1;::::0;56667:38:::1;::::0;:125;;;;;56675:6:::1;::::0;56667:125;;;;;;;56675:6;;56667:125;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;56830:49;56846:5;:18;;;56866:12;56830:15;:49::i;:::-;56932:5;:13;;;-1:-1:-1::0;;;;;56897:418:0::1;;56960:11;56986:5;:19;;;57020:5;:25;;;57060:5;:21;;;57096:5;:16;;;57127:5;:15;;;57157:5;:12;;;57184:5;:18;;;57217:5;:27;;;57259:5;:18;;;57292:12;56897:418;;;;;;;;;-1:-1:-1::0;;;;;56897:418:0::1;;;;;;;;;;;-1:-1:-1::0;;;;;56897:418:0::1;;;;;;-1:-1:-1::0;;;;;56897:418:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;9627:1:0;10589:7;:22;-1:-1:-1;;;55368:1955:0:o;49426:804::-;49531:21;49563:27;49601:23;49635:18;49664:17;49692:11;49714:20;49745:26;49782:20;49821:26;;:::i;:::-;-1:-1:-1;;;;;;;;;49850:24:0;;;;;;;:14;:24;;;;;;;;:37;;;;;;;;;;49821:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49821:66:0;;-1:-1:-1;49821:66:0;;-1:-1:-1;49821:66:0;;-1:-1:-1;49821:66:0;-1:-1:-1;49821:66:0;-1:-1:-1;49426:804:0:o;32278:55::-;;;;;;;;;;;;;:::o;37386:645::-;37266:3;;-1:-1:-1;;;;;37266:3:0;37252:10;:17;37244:50;;;;;-1:-1:-1;;;37244:50:0;;;;;;;;;;;;-1:-1:-1;;;37244:50:0;;;;;;;;;;;;;;;37629:13:::1;::::0;::::1;;37628:14;37620:57;;;::::0;;-1:-1:-1;;;37620:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;37688:13;:20:::0;;-1:-1:-1;;37688:20:0::1;37704:4;37688:20;::::0;;37721:6:::1;:16:::0;;-1:-1:-1;;;;;37721:16:0;;::::1;-1:-1:-1::0;;;;;;37721:16:0;;::::1;::::0;::::1;::::0;;;37748:5:::1;:14:::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;37773:4:::1;:12:::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;37796:4:::1;:12:::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;37819:15:::1;:34:::0;;;37864:25:::1;:54:::0;;;37936:87:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::1;::::0;;;;;;;::::1;37386:645:::0;;;;;;:::o;32195:76::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32195:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32526:19::-;;;-1:-1:-1;;;;;32526:19:0;;:::o;42619:887::-;9671:1;10277:7;;:19;;10269:63;;;;;-1:-1:-1;;;10269:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10269:63:0;;;;;;;;;;;;;;;9671:1;10410:7;:18;42696:22:::1;;:::i;:::-;42732:10;42721:22;::::0;;;:10:::1;:22;::::0;;;;;;;:35;;;;;;;;;42696:60;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;42696:60:0::1;::::0;;;;::::1;::::0;;;;;;::::1;::::0;;;;;;;;;;;;42721:35;;42696:60;;::::1;::::0;;;;::::1;::::0;;;::::1;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;42696:60:0::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;-1:-1:-1::0;;;42696:60:0;;;-1:-1:-1;;42696:60:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;;;::::0;;;;::::1;::::0;;::::1;;;;::::0;;;;::::1;::::0;;::::1;::::0;;;;;;42775:13;;42696:60;;-1:-1:-1;;;;;;42775:27:0::1;42767:69;;;::::0;;-1:-1:-1;;;42767:69:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;42767:69:0;;;;;;;;;;;;;::::1;;42867:10;42856:22;::::0;;;:10:::1;:22;::::0;;;;;;;:35;;;;;;;;42849:42;;-1:-1:-1;;;;;;42849:42:0::1;::::0;;42856:35;42849:42:::1;::::0;;::::1;42856:22:::0;42849:42:::1;:::i;:::-;-1:-1:-1::0;42849:42:0::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;42849:42:0;;;::::1;::::0;;::::1;::::0;;;42925:4:::1;::::0;42908:10:::1;::::0;::::1;::::0;:13;;-1:-1:-1;;;;;42925:4:0;;::::1;::::0;42908:10;;:13:::1;;;;;;;;;;-1:-1:-1::0;;;;;42908:21:0::1;;42904:278;;;42946:67;42962:38;42985:5;:14;;;42962:5;:18;;;:22;;:38;;;;:::i;42946:67::-;42904:278;;;43046:62;43081:10;43093:5;:14;;;43053:5;:10;;;43064:1;43053:13;;;;;;;43046:62;43123:47;43139:5;:18;;;43159:10;43123:15;:47::i;:::-;43229:10;-1:-1:-1::0;;;;;43199:299:0::1;;43254:11;43280:5;:10;;;43305:5;:14;;;43334:5;:12;;;43361:5;:18;;;43394:5;:27;;;43436:5;:18;;;43469:5;:18;;;43199:299;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;9627:1:0;10589:7;:22;42619:887::o;32552:21::-;;;-1:-1:-1;;;;;32552:21:0;;:::o;32580:20::-;;;-1:-1:-1;;;;;32580:20:0;;:::o;38149:181::-;37266:3;;-1:-1:-1;;;;;37266:3:0;37252:10;:17;37244:50;;;;;-1:-1:-1;;;37244:50:0;;;;;;;;;;;;-1:-1:-1;;;37244:50:0;;;;;;;;;;;;;;;38231:15:::1;:34:::0;;;38283:39:::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;38149:181:::0;:::o;27763:177::-;27873:58;;;-1:-1:-1;;;;;27873:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27873:58:0;-1:-1:-1;;;27873:58:0;;;27846:86;;27866:5;;27846:19;:86::i;:::-;27763:177;;;:::o;63026:536::-;63118:7;63142:5;:12;63158:1;63142:17;63138:107;;;63183:50;63194:5;63200:1;63194:8;;;;;;;;;;;;;;63204:5;63210:1;63204:8;;;;;;;;;;;;;;63214:7;63223:9;63183:10;:50::i;:::-;63176:57;;;;63138:107;63259:5;:12;63275:1;63259:17;63255:246;;;63293:14;63310:48;63321:5;63327:1;63321:8;;;;;;;;;;;;;;63331:5;63337:1;63331:8;;;;;;;;;;;;;;63341:1;63352:4;63310:10;:48::i;:::-;63293:65;;63373:44;63403:5;;;;;;;;;-1:-1:-1;;;;;63403:5:0;63410:6;63380:5;63386:1;63380:8;;;;;;;63373:44;63439:50;63450:5;63456:1;63450:8;;;;;;;;;;;;;;63460:5;63466:1;63460:8;;;;;;;;;;;;;;63470:7;63479:9;63439:10;:50::i;:::-;63432:57;;;;;63255:246;63513:41;;;-1:-1:-1;;;63513:41:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;63513:41:0;;;;;;;;;;;;;;63026:536;;;;;;:::o;62845:173::-;62942:4;;62936:32;;;-1:-1:-1;;;62936:32:0;;;;;;;;;;-1:-1:-1;;;;;62942:4:0;;;;62936:20;;:32;;;;;62942:4;;62936:32;;;;;;;;62942:4;;62936:32;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62979:31:0;;-1:-1:-1;;;;;;;;62979:19:0;;62999:10;62979:19;:31::i;:::-;62845:173;;:::o;62699:138::-;62748:9;:14;62744:86;;62785:4;;;;;;;;;-1:-1:-1;;;;;62785:4:0;-1:-1:-1;;;;;62779:19:0;;62806:9;62779:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62744:86;62699:138::o;22715:181::-;22773:7;22805:5;;;22829:6;;;;22821:46;;;;;-1:-1:-1;;;22821:46:0;;;;;;;;;;;;-1:-1:-1;;;22821:46:0;;;;;;;;;;;;;;40994:1007;-1:-1:-1;;;;;41313:25:0;;41291:19;41313:25;;;:15;:25;;;;;;41349:22;;:::i;:::-;41374:230;;;;;;;;41398:8;-1:-1:-1;;;;;41374:230:0;;;;;41421:5;41374:230;;;;41441:9;41374:230;;;;41465:7;41374:230;;;;41487:13;41374:230;;;;41515:22;41374:230;;;;;;41552:13;41374:230;;;;;;41580:13;41374:230;;;41349:255;;41643:18;41659:1;41643:11;:15;;:18;;;;:::i;:::-;-1:-1:-1;;;;;41615:25:0;;;;;;;:15;:25;;;;;;;;:46;;;;41672:10;:20;;;;;:33;;;;;;;;:41;;;;-1:-1:-1;;;;;;41672:41:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;41672:41:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41761:8;-1:-1:-1;;;;;41731:262:0;;41784:11;41810:5;41830:9;41854:7;41876:13;41904:22;41941:13;41969;41731:262;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40994:1007;;;;;;;;;;:::o;24069:471::-;24127:7;24372:6;24368:47;;-1:-1:-1;24402:1:0;24395:8;;24368:47;24439:5;;;24443:1;24439;:5;:1;24463:5;;;;;:10;24455:56;;;;-1:-1:-1;;;24455:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25016:132;25074:7;25101:39;25105:1;25108;25101:39;;;;;;;;;;;;;-1:-1:-1;;;25101:39:0;;;:3;:39::i;52314:1258::-;52730:10;52688:19;52710:31;;;:19;:31;;;;;;52752:26;;:::i;:::-;52781:308;;;;;;;;52809:8;-1:-1:-1;;;;;52781:308:0;;;;;52832:14;-1:-1:-1;;;;;52781:308:0;;;;;52861:20;52781:308;;;;52896:16;-1:-1:-1;;;;;52781:308:0;;;;;52927:11;-1:-1:-1;;;;;52781:308:0;;;;;52953:10;52781:308;;;;52978:7;52781:308;;;;;;53000:13;52781:308;;;;53028:22;52781:308;;;;;;53065:13;52781:308;;;52752:337;;53132:18;53148:1;53132:11;:15;;:18;;;;:::i;:::-;53100:19;:29;53120:8;-1:-1:-1;;;;;53100:29:0;-1:-1:-1;;;;;53100:29:0;;;;;;;;;;;;:50;;;;53201:5;53161:14;:24;53176:8;-1:-1:-1;;;;;53161:24:0;-1:-1:-1;;;;;53161:24:0;;;;;;;;;;;;:37;53186:11;53161:37;;;;;;;;;;;:45;;;;;;;;;;;;;-1:-1:-1;;;;;53161:45:0;;;;;-1:-1:-1;;;;;53161:45:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;53161:45:0;;;;;-1:-1:-1;;;;;53161:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;53161:45:0;;;;;-1:-1:-1;;;;;53161:45:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;53161:45:0;;;;;-1:-1:-1;;;;;53161:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53258:8;-1:-1:-1;;;;;53224:340:0;;53281:11;53307:14;53336:20;53371:16;53402:11;53428:10;53453:7;53475:13;53503:22;53540:13;53224:340;;;;;;;;;-1:-1:-1;;;;;53224:340:0;;;;;;;;;;;-1:-1:-1;;;;;53224:340:0;;;;;;-1:-1:-1;;;;;53224:340:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52314:1258;;;;;;;;;;;;:::o;58021:1113::-;-1:-1:-1;;;;;58348:29:0;;58326:19;58348:29;;;:19;:29;;;;;;58388:26;;:::i;:::-;-1:-1:-1;58417:271:0;;;;;;;;-1:-1:-1;;;;;58417:271:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58668:9;58417:271;;;;58731:18;:11;58747:1;58731:15;:18::i;:::-;58699:19;:29;58719:8;-1:-1:-1;;;;;58699:29:0;-1:-1:-1;;;;;58699:29:0;;;;;;;;;;;;:50;;;;58800:5;58760:14;:24;58775:8;-1:-1:-1;;;;;58760:24:0;-1:-1:-1;;;;;58760:24:0;;;;;;;;;;;;:37;58785:11;58760:37;;;;;;;;;;;:45;;;;;;;;;;;;;-1:-1:-1;;;;;58760:45:0;;;;;-1:-1:-1;;;;;58760:45:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;58760:45:0;;;;;-1:-1:-1;;;;;58760:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;58760:45:0;;;;;-1:-1:-1;;;;;58760:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58857:8;-1:-1:-1;;;;;58823:303:0;;58880:11;58906:16;58937;58968:11;58994:10;59019:7;59041:13;59069:22;59106:9;58823:303;;;;;;;;;-1:-1:-1;;;;;58823:303:0;;;;;;;;;;;-1:-1:-1;;;;;58823:303:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58021:1113;;;;;;;;;;:::o;30068:761::-;30492:23;30518:69;30546:4;30518:69;;;;;;;;;;;;;;;;;30526:5;-1:-1:-1;;;;;30518:27:0;;;:69;;;;;:::i;:::-;30602:17;;30492:95;;-1:-1:-1;30602:21:0;30598:224;;30744:10;30733:30;;;;;;;;;;;;;;;-1:-1:-1;30733:30:0;30725:85;;;;-1:-1:-1;;;30725:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63570:614;63747:4;;63680:7;;;;-1:-1:-1;;;;;63734:17:0;;;63747:4;;63734:17;63730:341;;;63798:5;;63791:42;;;-1:-1:-1;;;63791:42:0;;-1:-1:-1;;;;;63791:42:0;;;;;;;;;;;;;;;;63798:5;;;;;63791:21;;:42;;;;;;;;;;;;;;63798:5;;63791:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63791:42:0;;-1:-1:-1;63730:341:0;;;63867:4;;-1:-1:-1;;;;;63855:16:0;;;63867:4;;63855:16;63851:220;;;63919:5;;63912:44;;;-1:-1:-1;;;63912:44:0;;-1:-1:-1;;;;;63912:44:0;;;;;;;;;;;;;;;;63919:5;;;;;63912:22;;:44;;;;;;;;;;;;;;63919:5;;63912:44;;;;;;;;;;63851:220;64016:5;;64009:50;;;-1:-1:-1;;;64009:50:0;;-1:-1:-1;;;;;64009:50:0;;;;;;;;;;;;;;;;;;;;;;;64016:5;;;;;64009:18;;:50;;;;;;;;;;;;;;64016:5;;64009:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64009:50:0;;-1:-1:-1;63851:220:0;64104:7;64091:9;:20;;64083:66;;;;-1:-1:-1;;;64083:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2100:397;2215:6;2190:21;:31;;2182:73;;;;;-1:-1:-1;;;2182:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;2365:35;;2347:12;;-1:-1:-1;;;;;2365:14:0;;;2388:6;;2347:12;2365:35;2347:12;2365:35;2388:6;2365:14;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2346:54;;;2419:7;2411:78;;;;-1:-1:-1;;;2411:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25644:278;25730:7;25765:12;25758:5;25750:28;;;;-1:-1:-1;;;25750:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25789:9;25805:1;25801;:5;;;;;;;25644:278;-1:-1:-1;;;;;25644:278:0:o;3661:195::-;3764:12;3796:52;3818:6;3826:4;3832:1;3835:12;3796:21;:52::i;:::-;3789:59;3661:195;-1:-1:-1;;;;3661:195:0:o;4713:530::-;4840:12;4898:5;4873:21;:30;;4865:81;;;;-1:-1:-1;;;4865:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4965:18;4976:6;4965:10;:18::i;:::-;4957:60;;;;;-1:-1:-1;;;4957:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;5091:12;5105:23;5132:6;-1:-1:-1;;;;;5132:11:0;5152:5;5160:4;5132:33;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5132:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5090:75;;;;5183:52;5201:7;5210:10;5222:12;5183:17;:52::i;:::-;5176:59;4713:530;-1:-1:-1;;;;;;;4713:530:0:o;743:422::-;1110:20;1149:8;;;743:422::o;7253:742::-;7368:12;7397:7;7393:595;;;-1:-1:-1;7428:10:0;7421:17;;7393:595;7542:17;;:21;7538:439;;7805:10;7799:17;7866:15;7853:10;7849:2;7845:19;7838:44;7753:148;7941:20;;-1:-1:-1;;;7941:20:0;;;;;;;;;;;;;;;;;7948:12;;7941:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Swarm Source
ipfs://15baaa9b2de51328a43c7b2267f06fbff79e454fc2de204746ed6bcf9049d1b4
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.