ETH Price: $3,333.01 (-1.31%)

Contract

0xC53051C2b4c84bD623D9d2EB4f7e007DFaD084Ae
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
End Auction135901352021-11-10 18:39:151138 days ago1636569555IN
0xC53051C2...DFaD084Ae
0 ETH0.07225074187.72180604
Create Bid135851042021-11-09 23:39:151139 days ago1636501155IN
0xC53051C2...DFaD084Ae
5.02 ETH0.01662926138.32478235
End Auction135837252021-11-09 18:24:511139 days ago1636482291IN
0xC53051C2...DFaD084Ae
0 ETH0.0757239196.74576135
Create Bid135836732021-11-09 18:10:511139 days ago1636481451IN
0xC53051C2...DFaD084Ae
5.02 ETH0.01863915147
End Auction135836422021-11-09 18:05:271139 days ago1636481127IN
0xC53051C2...DFaD084Ae
0 ETH0.07474215197.18699043
Create Bid135835152021-11-09 17:32:191139 days ago1636479139IN
0xC53051C2...DFaD084Ae
5.01 ETH0.01990303128.65486032
Create Bid135830022021-11-09 15:43:171139 days ago1636472597IN
0xC53051C2...DFaD084Ae
5.01 ETH0.02962936191.52664013
Create Bid135829522021-11-09 15:30:361139 days ago1636471836IN
0xC53051C2...DFaD084Ae
5.25 ETH0.02959652172.27214509
Create Auction135518402021-11-04 18:35:241144 days ago1636050924IN
0xC53051C2...DFaD084Ae
0 ETH0.05705583200.20576414
Create Auction135452382021-11-03 17:36:361145 days ago1635960996IN
0xC53051C2...DFaD084Ae
0 ETH0.04474921157.01589499
Create Auction135391312021-11-02 18:32:181146 days ago1635877938IN
0xC53051C2...DFaD084Ae
0 ETH0.06123858202.71097993
Cancel Auction135069702021-10-28 17:05:051151 days ago1635440705IN
0xC53051C2...DFaD084Ae
0 ETH0.04019937263.30028238
End Auction135069402021-10-28 16:57:231151 days ago1635440243IN
0xC53051C2...DFaD084Ae
0 ETH0.08259138214.58884344
End Auction135069192021-10-28 16:52:151151 days ago1635439935IN
0xC53051C2...DFaD084Ae
0 ETH0.0825389214.45249675
End Auction135069092021-10-28 16:50:221151 days ago1635439822IN
0xC53051C2...DFaD084Ae
0 ETH0.10360874269.19613677
Create Bid135068662021-10-28 16:39:171151 days ago1635439157IN
0xC53051C2...DFaD084Ae
5.02 ETH0.02299603181.36102468
End Auction135067642021-10-28 16:17:411151 days ago1635437861IN
0xC53051C2...DFaD084Ae
0 ETH0.07074561186.64321157
End Auction135067552021-10-28 16:15:281151 days ago1635437728IN
0xC53051C2...DFaD084Ae
0 ETH0.06132472156.15302256
End Auction135066982021-10-28 16:05:051151 days ago1635437105IN
0xC53051C2...DFaD084Ae
0 ETH0.00591784248.02388668
End Auction135066952021-10-28 16:04:321151 days ago1635437072IN
0xC53051C2...DFaD084Ae
0 ETH0.10817874275.45884317
Create Bid135066832021-10-28 16:00:381151 days ago1635436838IN
0xC53051C2...DFaD084Ae
7.01 ETH0.03687302238.350296
Create Bid135066812021-10-28 16:00:081151 days ago1635436808IN
0xC53051C2...DFaD084Ae
5.25 ETH0.0362272234.17561607
Create Bid135066302021-10-28 15:48:081151 days ago1635436088IN
0xC53051C2...DFaD084Ae
5.01 ETH0.02651189171.37504977
Create Bid135065982021-10-28 15:41:341151 days ago1635435694IN
0xC53051C2...DFaD084Ae
7.01 ETH0.02655334171.6429901
Create Bid135064132021-10-28 15:00:531151 days ago1635433253IN
0xC53051C2...DFaD084Ae
5.01 ETH0.03221839208.26237363
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
135901352021-11-10 18:39:151138 days ago1636569555
0xC53051C2...DFaD084Ae
4.518 ETH
135901352021-11-10 18:39:151138 days ago1636569555
0xC53051C2...DFaD084Ae
4.518 ETH
135851042021-11-09 23:39:151139 days ago1636501155
0xC53051C2...DFaD084Ae
5.02 ETH
135851042021-11-09 23:39:151139 days ago1636501155
0xC53051C2...DFaD084Ae
5.01 ETH
135851042021-11-09 23:39:151139 days ago1636501155
0xC53051C2...DFaD084Ae
5.01 ETH
135837252021-11-09 18:24:511139 days ago1636482291
0xC53051C2...DFaD084Ae
4.518 ETH
135837252021-11-09 18:24:511139 days ago1636482291
0xC53051C2...DFaD084Ae
4.518 ETH
135836732021-11-09 18:10:511139 days ago1636481451
0xC53051C2...DFaD084Ae
5.02 ETH
135836732021-11-09 18:10:511139 days ago1636481451
0xC53051C2...DFaD084Ae
5.01 ETH
135836732021-11-09 18:10:511139 days ago1636481451
0xC53051C2...DFaD084Ae
5.01 ETH
135836422021-11-09 18:05:271139 days ago1636481127
0xC53051C2...DFaD084Ae
4.725 ETH
135836422021-11-09 18:05:271139 days ago1636481127
0xC53051C2...DFaD084Ae
4.725 ETH
135835152021-11-09 17:32:191139 days ago1636479139
0xC53051C2...DFaD084Ae
5.01 ETH
135830022021-11-09 15:43:171139 days ago1636472597
0xC53051C2...DFaD084Ae
5.01 ETH
135829522021-11-09 15:30:361139 days ago1636471836
0xC53051C2...DFaD084Ae
5.25 ETH
135069402021-10-28 16:57:231151 days ago1635440243
0xC53051C2...DFaD084Ae
4.509 ETH
135069402021-10-28 16:57:231151 days ago1635440243
0xC53051C2...DFaD084Ae
4.509 ETH
135069192021-10-28 16:52:151151 days ago1635439935
0xC53051C2...DFaD084Ae
4.518 ETH
135069192021-10-28 16:52:151151 days ago1635439935
0xC53051C2...DFaD084Ae
4.518 ETH
135069092021-10-28 16:50:221151 days ago1635439822
0xC53051C2...DFaD084Ae
4.725 ETH
135069092021-10-28 16:50:221151 days ago1635439822
0xC53051C2...DFaD084Ae
4.725 ETH
135068662021-10-28 16:39:171151 days ago1635439157
0xC53051C2...DFaD084Ae
5.02 ETH
135068662021-10-28 16:39:171151 days ago1635439157
0xC53051C2...DFaD084Ae
5.01 ETH
135068662021-10-28 16:39:171151 days ago1635439157
0xC53051C2...DFaD084Ae
5.01 ETH
135067642021-10-28 16:17:411151 days ago1635437861
0xC53051C2...DFaD084Ae
6.75 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
AuctionHouse

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-09-22
*/

// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;
pragma experimental ABIEncoderV2;


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;
    }
}

interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 tokenId) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
      * @dev Safely transfers `tokenId` token from `from` to `to`.
      *
      * Requirements:
      *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
      * - `tokenId` token must exist and be owned by `from`.
      * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
      * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
      *
      * Emits a {Transfer} event.
      */
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
}


abstract 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;
    }
}


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);
}



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);
    }

    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);
            }
        }
    }
}


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");
        }
    }
}


library Counters {
    using SafeMath for uint256;

    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        // The {SafeMath} overflow check can be skipped here, see the comment at the top
        counter._value += 1;
    }

    function decrement(Counter storage counter) internal {
        counter._value = counter._value.sub(1);
    }
}


library Math {
    using SafeMath for uint256;

    // ============ Library Functions ============

    /*
     * Return target * (numerator / denominator).
     */
    function getPartial(
        uint256 target,
        uint256 numerator,
        uint256 denominator
    ) internal pure returns (uint256) {
        return target.mul(numerator).div(denominator);
    }

    /*
     * Return target * (numerator / denominator), but rounded up.
     */
    function getPartialRoundUp(
        uint256 target,
        uint256 numerator,
        uint256 denominator
    ) internal pure returns (uint256) {
        if (target == 0 || numerator == 0) {
            // SafeMath will check for zero denominator
            return SafeMath.div(0, denominator);
        }
        return target.mul(numerator).sub(1).div(denominator).add(1);
    }

    function to128(uint256 number) internal pure returns (uint128) {
        uint128 result = uint128(number);
        require(result == number, "Math: Unsafe cast to uint128");
        return result;
    }

    function to96(uint256 number) internal pure returns (uint96) {
        uint96 result = uint96(number);
        require(result == number, "Math: Unsafe cast to uint96");
        return result;
    }

    function to32(uint256 number) internal pure returns (uint32) {
        uint32 result = uint32(number);
        require(result == number, "Math: Unsafe cast to uint32");
        return result;
    }

    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }
}


library Decimal {
    using SafeMath for uint256;

    // ============ Constants ============

    uint256 constant BASE_POW = 18;
    uint256 constant BASE = 10**BASE_POW;

    // ============ Structs ============

    struct D256 {
        uint256 value;
    }

    // ============ Functions ============

    function one() internal pure returns (D256 memory) {
        return D256({value: BASE});
    }

    function onePlus(D256 memory d) internal pure returns (D256 memory) {
        return D256({value: d.value.add(BASE)});
    }

    function mul(uint256 target, D256 memory d)
        internal
        pure
        returns (uint256)
    {
        return Math.getPartial(target, d.value, BASE);
    }

    function div(uint256 target, D256 memory d)
        internal
        pure
        returns (uint256)
    {
        return Math.getPartial(target, BASE, d.value);
    }
}


interface IMarket {
    struct Bid {
        // Amount of the currency being bid
        uint256 amount;
        // Address to the ERC20 token being used to bid
        address currency;
        // Address of the bidder
        address bidder;
        // Address of the recipient
        address recipient;
        // % of the next sale to award the current owner
        Decimal.D256 sellOnShare;
    }

    struct Ask {
        // Amount of the currency being asked
        uint256 amount;
        // Address to the ERC20 token being asked
        address currency;
    }

    struct BidShares {
        // % of sale value that goes to the _previous_ owner of the nft
        Decimal.D256 prevOwner;
        // % of sale value that goes to the original creator of the nft
        Decimal.D256 creator;
        // % of sale value that goes to the seller (current owner) of the nft
        Decimal.D256 owner;
    }

    event BidCreated(uint256 indexed tokenId, Bid bid);
    event BidRemoved(uint256 indexed tokenId, Bid bid);
    event BidFinalized(uint256 indexed tokenId, Bid bid);
    event AskCreated(uint256 indexed tokenId, Ask ask);
    event AskRemoved(uint256 indexed tokenId, Ask ask);
    event BidShareUpdated(uint256 indexed tokenId, BidShares bidShares);

    function bidForTokenBidder(uint256 tokenId, address bidder)
        external
        view
        returns (Bid memory);

    function currentAskForToken(uint256 tokenId)
        external
        view
        returns (Ask memory);

    function bidSharesForToken(uint256 tokenId)
        external
        view
        returns (BidShares memory);

    function isValidBid(uint256 tokenId, uint256 bidAmount)
        external
        view
        returns (bool);

    function isValidBidShares(BidShares calldata bidShares)
        external
        pure
        returns (bool);

    function splitShare(Decimal.D256 calldata sharePercentage, uint256 amount)
        external
        pure
        returns (uint256);

    function configure(address mediaContractAddress) external;

    function setBidShares(uint256 tokenId, BidShares calldata bidShares)
        external;

    function setAsk(uint256 tokenId, Ask calldata ask) external;

    function removeAsk(uint256 tokenId) external;

    function setBid(
        uint256 tokenId,
        Bid calldata bid,
        address spender
    ) external;

    function removeBid(uint256 tokenId, address bidder) external;

    function acceptBid(uint256 tokenId, Bid calldata expectedBid) external;
}

interface IMedia {
    struct EIP712Signature {
        uint256 deadline;
        uint8 v;
        bytes32 r;
        bytes32 s;
    }

    struct MediaData {
        // A valid URI of the content represented by this token
        string tokenURI;
        // A valid URI of the metadata associated with this token
        string metadataURI;
        // A SHA256 hash of the content pointed to by tokenURI
        bytes32 contentHash;
        // A SHA256 hash of the content pointed to by metadataURI
        bytes32 metadataHash;
    }

    event TokenURIUpdated(uint256 indexed _tokenId, address owner, string _uri);
    event TokenMetadataURIUpdated(
        uint256 indexed _tokenId,
        address owner,
        string _uri
    );

    /**
     * @notice Return the metadata URI for a piece of media given the token URI
     */
    function tokenMetadataURI(uint256 tokenId)
        external
        view
        returns (string memory);

    /**
     * @notice Mint new media for msg.sender.
     */
    function mint(MediaData calldata data, IMarket.BidShares calldata bidShares)
        external;

    /**
     * @notice EIP-712 mintWithSig method. Mints new media for a creator given a valid signature.
     */
    function mintWithSig(
        address creator,
        MediaData calldata data,
        IMarket.BidShares calldata bidShares,
        EIP712Signature calldata sig
    ) external;

    /**
     * @notice Transfer the token with the given ID to a given address.
     * Save the previous owner before the transfer, in case there is a sell-on fee.
     * @dev This can only be called by the auction contract specified at deployment
     */
    function auctionTransfer(uint256 tokenId, address recipient) external;

    /**
     * @notice Set the ask on a piece of media
     */
    function setAsk(uint256 tokenId, IMarket.Ask calldata ask) external;

    /**
     * @notice Remove the ask on a piece of media
     */
    function removeAsk(uint256 tokenId) external;

    /**
     * @notice Set the bid on a piece of media
     */
    function setBid(uint256 tokenId, IMarket.Bid calldata bid) external;

    /**
     * @notice Remove the bid on a piece of media
     */
    function removeBid(uint256 tokenId) external;

    function getTreasurerAddress() external view returns(address);

    function owner() external view returns(address);

    function authorize(address _address) external view returns(bool);

    function acceptBid(uint256 tokenId, IMarket.Bid calldata bid) external;

    /**
     * @notice Revoke approval for a piece of media
     */
    function revokeApproval(uint256 tokenId) external;

    /**
     * @notice Update the token URI
     */
    function updateTokenURI(uint256 tokenId, string calldata tokenURI) external;

    /**
     * @notice Update the token metadata uri
     */
    function updateTokenMetadataURI(
        uint256 tokenId,
        string calldata metadataURI
    ) external;

    /**
     * @notice EIP-712 permit method. Sets an approved spender given a valid signature.
     */
    function permit(
        address spender,
        uint256 tokenId,
        EIP712Signature calldata sig
    ) external;
}


interface IWETH {
    function deposit() external payable;
    function withdraw(uint wad) external;

    function transfer(address to, uint256 value) external returns (bool);
}

interface IMediaExtended is IMedia {
    function marketContract() external returns(address);
}

interface IAuctionHouse {
    struct Auction {
        // ID for the ERC721 token
        uint256 tokenId;
        // Address for the ERC721 contract
        address tokenContract;
        // Whether or not the auction curator has approved the auction to start
        bool approved;
        // The current highest bid amount
        uint256 amount;
        // The length of time to run the auction for, after the first bid was made
        uint256 duration;
        // The time of the first bid
        uint256 firstBidTime;
        // The minimum price of the first bid
        uint256 reservePrice;
        // The sale percentage to send to the curator
        uint8 curatorFeePercentage;
        // The address that should receive the funds once the NFT is sold.
        address tokenOwner;
        // The address of the current highest bid
        address payable bidder;
        // The address of the auction's curator.
        // The curator can reject or approve an auction
        address payable curator;
        // The address of the ERC-20 currency to run the auction with.
        // If set to 0x0, the auction will be run in ETH
        address auctionCurrency;

        uint256 startTime;
    }

    event AuctionCreated(
        uint256 indexed auctionId,
        uint256 indexed tokenId,
        address indexed tokenContract,
        uint256 duration,
        uint256 reservePrice,
        address tokenOwner,
        address curator,
        uint8 curatorFeePercentage,
        address auctionCurrency,
        uint256 startTime
    );

    event AuctionApprovalUpdated(
        uint256 indexed auctionId,
        uint256 indexed tokenId,
        address indexed tokenContract,
        bool approved
        
    );

    event AuctionReservePriceUpdated(
        uint256 indexed auctionId,
        uint256 indexed tokenId,
        address indexed tokenContract,
        uint256 reservePrice
    );

    event RescheduleAuctionTime(
        uint256 indexed auctionId,
        uint256 indexed tokenId,
        address indexed tokenContract,
        uint256 newStartTime
        
    );



    event AuctionBid(
        uint256 indexed auctionId,
        uint256 indexed tokenId,
        address indexed tokenContract,
        address sender,
        uint256 value,
        bool firstBid,
        bool extended
    );

    event AuctionDurationExtended(
        uint256 indexed auctionId,
        uint256 indexed tokenId,
        address indexed tokenContract,
        uint256 duration
    );

    event AuctionEnded(
        uint256 indexed auctionId,
        uint256 indexed tokenId,
        address indexed tokenContract,
        address tokenOwner,
        address curator,
        address winner,
        uint256 amount,
        uint256 curatorFee,
        address auctionCurrency
    );

    event AuctionCanceled(
        uint256 indexed auctionId,
        uint256 indexed tokenId,
        address indexed tokenContract,
        address tokenOwner
    );

    function createAuction(
        uint256 tokenId,
        address tokenContract,
        uint256 duration,
        uint256 reservePrice,
        address payable curator,
        uint8 curatorFeePercentages,
        address auctionCurrency,
        uint256 startTime
    ) external returns (uint256);

    function setAuctionApproval(uint256 auctionId, bool approved) external;

    function setAuctionReservePrice(uint256 auctionId, uint256 reservePrice) external;

    function rescheduleAuctionTime(uint256 auctionId, uint256 newStartTime) external;

    function createBid(uint256 auctionId, uint256 amount) external payable;

    function endAuction(uint256 auctionId) external;

    function cancelAuction(uint256 auctionId) external;
}


contract AuctionHouse is IAuctionHouse, ReentrancyGuard {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;
    using Counters for Counters.Counter;

    // The minimum amount of time left in an auction after a new bid is created
    uint256 public timeBuffer;

    // The minimum wei difference between the last bid amount and the current bid.
    uint256 public minBidIncrementWei;

    // The address of the media protocol to use via this contract
    address public media;

    // / The address of the WETH contract, so that any ETH transferred can be handled as an ERC-20
    address public wethAddress;

    // A mapping of all of the auctions currently running.
    mapping(uint256 => IAuctionHouse.Auction) public auctions;

    bytes4 constant interfaceId = 0x80ac58cd; // 721 interface id

    Counters.Counter private _auctionIdTracker;

    /**
     * @notice Require that the specified auction exists
     */
    modifier auctionExists(uint256 auctionId) {
        require(_exists(auctionId), "Auction doesn't exist");
        _;
    }

    /*
     * Constructor
     */
    constructor(address _media, address _weth) public {
        require(
            IERC165(_media).supportsInterface(interfaceId),
            "Doesn't support NFT interface"
        );
        media = _media;
        wethAddress = _weth;
        timeBuffer = 600; // extend 10 minutes after every bid made in last 10 minutes
        minBidIncrementWei = 10000000000000000; // 0.01 eth
    }

    function setBufferTime(uint256 _timebuffer) public {
        require (msg.sender == IMedia(media).owner(),"You are not a Superadmin" );
        require (_timebuffer > 0,"must be greater than Zero");
        timeBuffer = _timebuffer;
    }

    /**
     * @notice Create an auction.
     * @dev Store the auction details in the auctions mapping and emit an AuctionCreated event.
     * If there is no curator, or if the curator is the auction creator, automatically approve the auction.
     */
    function createAuction(
        uint256 tokenId,
        address tokenContract,
        uint256 duration,
        uint256 reservePrice,
        address payable curator,
        uint8 curatorFeePercentage,
        address auctionCurrency,
        uint256 _startTime
    ) public override nonReentrant returns (uint256) {
        require(
            IERC165(tokenContract).supportsInterface(interfaceId),
            "tokenContract does not support ERC721 interface"
        );
        require(curatorFeePercentage < 100, "curatorFeePercentage must be less than 100");
        require(tokenContract == media, "only Atro token place");
        require(reservePrice >= minBidIncrementWei,"first bid must be greater than 0.01 eth");

        require (_startTime == 0 || _startTime >= block.timestamp,"Start time must be greater than equal to current time  ");

        if(_startTime == 0){
            _startTime = block.timestamp;
        }

        
        address tokenOwner = IERC721(tokenContract).ownerOf(tokenId);
        require(msg.sender == IERC721(tokenContract).getApproved(tokenId) || msg.sender == tokenOwner, "Caller must be approved or owner for token id");
        uint256 auctionId = _auctionIdTracker.current();

        auctions[auctionId] = Auction({
            tokenId: tokenId,
            tokenContract: tokenContract,
            approved: false,
            amount: 0,
            duration: duration,
            firstBidTime: 0,
            reservePrice: reservePrice,
            curatorFeePercentage: curatorFeePercentage,
            tokenOwner: tokenOwner,
            bidder: address(0),
            curator: curator,
            auctionCurrency: auctionCurrency,
            startTime: _startTime
        });

        IERC721(tokenContract).transferFrom(tokenOwner, address(this), tokenId);

        _auctionIdTracker.increment();

        emit AuctionCreated(auctionId, tokenId, tokenContract, duration, reservePrice, tokenOwner, curator, curatorFeePercentage, auctionCurrency,_startTime);


        if(auctions[auctionId].curator == address(0) || curator == tokenOwner) {
            _approveAuction(auctionId,true);
        }

        return auctionId;
    }

    /**
     * @notice Approve an auction, opening up the auction for bids.
     * @dev Only callable by the curator. Cannot be called if the auction has already started.
     */
    function setAuctionApproval(uint256 auctionId, bool approved) external override auctionExists(auctionId) {
        require(msg.sender == auctions[auctionId].curator, "Must be auction curator");
        require(auctions[auctionId].firstBidTime == 0, "Auction has already started");
        _approveAuction(auctionId, approved);
    }

    function setAuctionReservePrice(uint256 auctionId, uint256 reservePrice) external override auctionExists(auctionId) {
        require(msg.sender == auctions[auctionId].curator || msg.sender == auctions[auctionId].tokenOwner, "Must be auction curator or token owner");
        require(auctions[auctionId].firstBidTime == 0, "Auction has already started");

        auctions[auctionId].reservePrice = reservePrice;

        emit AuctionReservePriceUpdated(auctionId, auctions[auctionId].tokenId, auctions[auctionId].tokenContract, reservePrice);
    }

    function rescheduleAuctionTime(uint256 auctionId, uint256 newStartTime) external override auctionExists(auctionId) {
        require(msg.sender == auctions[auctionId].curator || msg.sender == auctions[auctionId].tokenOwner, "Must be auction curator or token owner");
        require(auctions[auctionId].firstBidTime == 0, "Auction has already started");
        require(auctions[auctionId].startTime > block.timestamp,"Enable to Reschedule Auction Time" );
        require (newStartTime >= block.timestamp,"Start time must be greater than equal to current time ");
        auctions[auctionId].startTime = newStartTime;

        emit RescheduleAuctionTime(auctionId, auctions[auctionId].tokenId, auctions[auctionId].tokenContract, newStartTime);
    }

    /**
     * @notice Create a bid on a token, with a given amount.
     * @dev If provided a valid bid, transfers the provided amount to this contract.
     * If the auction is run in native ETH, the ETH is wrapped so it can be identically to other
     * auction currencies in this contract.
     */
    function createBid(uint256 auctionId, uint256 amount)
    external
    override
    payable
    auctionExists(auctionId)
    nonReentrant
    {
        address payable lastBidder = auctions[auctionId].bidder;
        require(auctions[auctionId].approved, "Auction must be approved by curator");

        require (auctions[auctionId].startTime <= block.timestamp,"Auction is not begun");
        
        require(
            block.timestamp <
            auctions[auctionId].startTime.add(auctions[auctionId].duration),
            "Auction expired"
        );
        require(
            amount >= auctions[auctionId].reservePrice,
                "Must send at least reservePrice"
        );
        require(
            amount >= auctions[auctionId].amount.add(minBidIncrementWei),
            "Must send more than last bid by minBidIncrementWei amount"
        );

        // For Zora Protocol, ensure that the bid is valid for the current bidShare configuration
        if(auctions[auctionId].tokenContract == media) {
            require(
                IMarket(IMediaExtended(media).marketContract()).isValidBid(
                    auctions[auctionId].tokenId,
                    amount
                ),
                "Bid invalid for share splitting"
            );
        }

        // If this is the first valid bid, we should set the starting time now.
        // If it's not, then we should refund the last bidder
        if(auctions[auctionId].firstBidTime == 0) {
            auctions[auctionId].firstBidTime = block.timestamp;
        } else if(lastBidder != address(0)) {
            _handleOutgoingBid(lastBidder, auctions[auctionId].amount, auctions[auctionId].auctionCurrency);
        }

        _handleIncomingBid(amount, auctions[auctionId].auctionCurrency);

        auctions[auctionId].amount = amount;
        auctions[auctionId].bidder = msg.sender;


        bool extended = false;
        // at this point we know that the timestamp is less than start + duration (since the auction would be over, otherwise)
        // we want to know by how much the timestamp is less than start + duration
        // if the difference is less than the timeBuffer, increase the duration by the timeBuffer
        if (
            auctions[auctionId].startTime.add(auctions[auctionId].duration).sub(
                block.timestamp
            ) < timeBuffer
        ) {
            // Playing code golf for gas optimization:
            // uint256 expectedEnd = auctions[auctionId].startTime.add(auctions[auctionId].duration);
            // uint256 timeRemaining = expectedEnd.sub(block.timestamp);
            // uint256 timeToAdd = timeBuffer.sub(timeRemaining);
            // uint256 newDuration = auctions[auctionId].duration.add(timeToAdd);
            uint256 oldDuration = auctions[auctionId].duration;
            auctions[auctionId].duration =
                oldDuration.add(timeBuffer.sub(auctions[auctionId].startTime.add(oldDuration).sub(block.timestamp)));
            extended = true;
        }

        emit AuctionBid(
            auctionId,
            auctions[auctionId].tokenId,
            auctions[auctionId].tokenContract,
            msg.sender,
            amount,
            lastBidder == address(0), // firstBid boolean
            extended
        );

        if (extended) {
            emit AuctionDurationExtended(
                auctionId,
                auctions[auctionId].tokenId,
                auctions[auctionId].tokenContract,
                auctions[auctionId].duration
            );
        }
    }

    /**
     * @notice End an auction, finalizing the bid on Zora if applicable and paying out the respective parties.
     * @dev If for some reason the auction cannot be finalized (invalid token recipient, for example),
     * The auction is reset and the NFT is transferred back to the auction creator.
     */
    function endAuction(uint256 auctionId) external override auctionExists(auctionId) nonReentrant {
        require(
            uint256(auctions[auctionId].firstBidTime) != 0,
            "Auction hasn't begun"
        );
        require(
            block.timestamp >=
            auctions[auctionId].startTime.add(auctions[auctionId].duration),
            "Auction hasn't completed"
        );

        address currency = auctions[auctionId].auctionCurrency == address(0) ? wethAddress : auctions[auctionId].auctionCurrency;
        uint256 curatorFee = 0;

        uint256 tokenOwnerProfit = auctions[auctionId].amount;

        if(auctions[auctionId].tokenContract == media) {
            // If the auction is running on media, settle it on the protocol
            (bool success, uint256 remainingProfit) = _handleZoraAuctionSettlement(auctionId);
            tokenOwnerProfit = remainingProfit;
            if(success != true) {
                _handleOutgoingBid(auctions[auctionId].bidder, auctions[auctionId].amount, auctions[auctionId].auctionCurrency);
                _cancelAuction(auctionId);
                return;
            }
        } else {
            // Otherwise, transfer the token to the winner and pay out the participants below
            try IERC721(auctions[auctionId].tokenContract).safeTransferFrom(address(this), auctions[auctionId].bidder, auctions[auctionId].tokenId) {} catch {
                _handleOutgoingBid(auctions[auctionId].bidder, auctions[auctionId].amount, auctions[auctionId].auctionCurrency);
                _cancelAuction(auctionId);
                return;
            }
        }


        if(auctions[auctionId].curator != address(0)) {
            curatorFee = tokenOwnerProfit.mul(auctions[auctionId].curatorFeePercentage).div(100);
            tokenOwnerProfit = tokenOwnerProfit.sub(curatorFee);
            _handleOutgoingBid(auctions[auctionId].curator, curatorFee, auctions[auctionId].auctionCurrency);
        }

        if(IMedia(media).owner() == auctions[auctionId].tokenOwner || IMedia(media).authorize(auctions[auctionId].tokenOwner)){
            _handleOutgoingBid(IMedia(media).getTreasurerAddress(), tokenOwnerProfit, auctions[auctionId].auctionCurrency);
        }
        
        else{

            _handleOutgoingBid(auctions[auctionId].tokenOwner, tokenOwnerProfit, auctions[auctionId].auctionCurrency);
        }

        emit AuctionEnded(
            auctionId,
            auctions[auctionId].tokenId,
            auctions[auctionId].tokenContract,
            auctions[auctionId].tokenOwner,
            auctions[auctionId].curator,
            auctions[auctionId].bidder,
            tokenOwnerProfit,
            curatorFee,
            currency
        );
        delete auctions[auctionId];
    }

    /**
     * @notice Cancel an auction.
     * @dev Transfers the NFT back to the auction creator and emits an AuctionCanceled event
     */
    function cancelAuction(uint256 auctionId) external override nonReentrant auctionExists(auctionId) {
        require(
            auctions[auctionId].tokenOwner == msg.sender || auctions[auctionId].curator == msg.sender,
            "Can only be called by auction creator or curator"
        );
        require(
            uint256(auctions[auctionId].firstBidTime) == 0,
            "Can't cancel an auction once it's begun"
        );
        _cancelAuction(auctionId);
    }

    /**
     * @dev Given an amount and a currency, transfer the currency to this contract.
     * If the currency is ETH (0x0), attempt to wrap the amount as WETH
     */
    function _handleIncomingBid(uint256 amount, address currency) internal {
        // If this is an ETH bid, ensure they sent enough and convert it to WETH under the hood
        if(currency == address(0)) {
            require(msg.value == amount, "Sent ETH Value does not match specified bid amount");
            IWETH(wethAddress).deposit{value: amount}();
        } else {
            // We must check the balance that was actually transferred to the auction,
            // as some tokens impose a transfer fee and would not actually transfer the
            // full amount to the market, resulting in potentally locked funds
            IERC20 token = IERC20(currency);
            uint256 beforeBalance = token.balanceOf(address(this));
            token.safeTransferFrom(msg.sender, address(this), amount);
            uint256 afterBalance = token.balanceOf(address(this));
            require(beforeBalance.add(amount) == afterBalance, "Token transfer call did not transfer expected amount");
        }
    }

    function _handleOutgoingBid(address to, uint256 amount, address currency) internal {
        // If the auction is in ETH, unwrap it from its underlying WETH and try to send it to the recipient.
        if(currency == address(0)) {
            IWETH(wethAddress).withdraw(amount);

            // If the ETH transfer fails (sigh), rewrap the ETH and try send it as WETH.
            if(!_safeTransferETH(to, amount)) {
                IWETH(wethAddress).deposit{value: amount}();
                IERC20(wethAddress).safeTransfer(to, amount);
            }
        } else {
            IERC20(currency).safeTransfer(to, amount);
        }
    }

    function _safeTransferETH(address to, uint256 value) internal returns (bool) {
        (bool success, ) = to.call{value: value}(new bytes(0));
        return success;
    }

    function _cancelAuction(uint256 auctionId) internal {
        address tokenOwner = auctions[auctionId].tokenOwner;
        IERC721(auctions[auctionId].tokenContract).safeTransferFrom(address(this), tokenOwner, auctions[auctionId].tokenId);

        emit AuctionCanceled(auctionId, auctions[auctionId].tokenId, auctions[auctionId].tokenContract, tokenOwner);
        delete auctions[auctionId];
    }

    function _approveAuction(uint256 auctionId, bool approved) internal {
        auctions[auctionId].approved = approved;
        emit AuctionApprovalUpdated(auctionId, auctions[auctionId].tokenId, auctions[auctionId].tokenContract, approved);
    }

    function _exists(uint256 auctionId) internal view returns(bool) {
        return auctions[auctionId].tokenOwner != address(0);
    }

    function _handleZoraAuctionSettlement(uint256 auctionId) internal returns (bool, uint256) {
        address currency = auctions[auctionId].auctionCurrency == address(0) ? wethAddress : auctions[auctionId].auctionCurrency;

        IMarket.Bid memory bid = IMarket.Bid({
            amount: auctions[auctionId].amount,
            currency: currency,
            bidder: address(this),
            recipient: auctions[auctionId].bidder,
            sellOnShare: Decimal.D256(0)
        });

        IERC20(currency).approve(IMediaExtended(media).marketContract(), bid.amount);
        IMedia(media).setBid(auctions[auctionId].tokenId, bid);
        uint256 beforeBalance = IERC20(currency).balanceOf(address(this));
        try IMedia(media).acceptBid(auctions[auctionId].tokenId, bid) {} catch {
            // If the underlying NFT transfer here fails, we should cancel the auction and refund the winner
            IMediaExtended(media).removeBid(auctions[auctionId].tokenId);
            return (false, 0);
        }


        uint256 afterBalance = IERC20(currency).balanceOf(address(this));

        // We have to calculate the amount to send to the token owner here in case there was a
        // sell-on share on the token
        return (true, afterBalance.sub(beforeBalance));
    }

    // TODO: consider reverting if the message sender is not WETH
    receive() external payable {}
    fallback() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_media","type":"address"},{"internalType":"address","name":"_weth","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"auctionId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"tokenContract","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"AuctionApprovalUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"auctionId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"tokenContract","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bool","name":"firstBid","type":"bool"},{"indexed":false,"internalType":"bool","name":"extended","type":"bool"}],"name":"AuctionBid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"auctionId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"tokenContract","type":"address"},{"indexed":false,"internalType":"address","name":"tokenOwner","type":"address"}],"name":"AuctionCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"auctionId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"tokenContract","type":"address"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reservePrice","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenOwner","type":"address"},{"indexed":false,"internalType":"address","name":"curator","type":"address"},{"indexed":false,"internalType":"uint8","name":"curatorFeePercentage","type":"uint8"},{"indexed":false,"internalType":"address","name":"auctionCurrency","type":"address"},{"indexed":false,"internalType":"uint256","name":"startTime","type":"uint256"}],"name":"AuctionCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"auctionId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"tokenContract","type":"address"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"AuctionDurationExtended","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"auctionId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"tokenContract","type":"address"},{"indexed":false,"internalType":"address","name":"tokenOwner","type":"address"},{"indexed":false,"internalType":"address","name":"curator","type":"address"},{"indexed":false,"internalType":"address","name":"winner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"curatorFee","type":"uint256"},{"indexed":false,"internalType":"address","name":"auctionCurrency","type":"address"}],"name":"AuctionEnded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"auctionId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"tokenContract","type":"address"},{"indexed":false,"internalType":"uint256","name":"reservePrice","type":"uint256"}],"name":"AuctionReservePriceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"auctionId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"tokenContract","type":"address"},{"indexed":false,"internalType":"uint256","name":"newStartTime","type":"uint256"}],"name":"RescheduleAuctionTime","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"auctions","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"bool","name":"approved","type":"bool"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"firstBidTime","type":"uint256"},{"internalType":"uint256","name":"reservePrice","type":"uint256"},{"internalType":"uint8","name":"curatorFeePercentage","type":"uint8"},{"internalType":"address","name":"tokenOwner","type":"address"},{"internalType":"address payable","name":"bidder","type":"address"},{"internalType":"address payable","name":"curator","type":"address"},{"internalType":"address","name":"auctionCurrency","type":"address"},{"internalType":"uint256","name":"startTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"cancelAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"reservePrice","type":"uint256"},{"internalType":"address payable","name":"curator","type":"address"},{"internalType":"uint8","name":"curatorFeePercentage","type":"uint8"},{"internalType":"address","name":"auctionCurrency","type":"address"},{"internalType":"uint256","name":"_startTime","type":"uint256"}],"name":"createAuction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"createBid","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"endAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"media","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minBidIncrementWei","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"},{"internalType":"uint256","name":"newStartTime","type":"uint256"}],"name":"rescheduleAuctionTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setAuctionApproval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"},{"internalType":"uint256","name":"reservePrice","type":"uint256"}],"name":"setAuctionReservePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timebuffer","type":"uint256"}],"name":"setBufferTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"timeBuffer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wethAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b50604051620034af380380620034af83398101604081905262000034916200012d565b60016000556040516301ffc9a760e01b81526001600160a01b038316906301ffc9a7906200006e906380ac58cd60e01b9060040162000194565b60206040518083038186803b1580156200008757600080fd5b505afa1580156200009c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000c291906200016b565b620000ea5760405162461bcd60e51b8152600401620000e190620001a9565b60405180910390fd5b600380546001600160a01b039384166001600160a01b03199182161790915560048054929093169116179055610258600155662386f26fc10000600255620001f9565b6000806040838503121562000140578182fd5b82516200014d81620001e0565b60208401519092506200016081620001e0565b809150509250929050565b6000602082840312156200017d578081fd5b815180151581146200018d578182fd5b9392505050565b6001600160e01b031991909116815260200190565b6020808252601d908201527f446f65736e277420737570706f7274204e465420696e74657266616365000000604082015260600190565b6001600160a01b0381168114620001f657600080fd5b50565b6132a680620002096000396000f3fe6080604052600436106100c65760003560e01c80636f8a41e11161007f578063b7751c7111610059578063b7751c711461020a578063b9a2de3a1461021d578063ebb551551461023d578063ec91f2a41461025d576100cd565b80636f8a41e1146101aa57806396b5a755146101ca578063973ddb4a146101ea576100cd565b806319a41133146100cf5780631aac030c1461010557806342814efa1461012557806349077a4f1461013a5780634f0e0ef31461015c578063571a26a014610171576100cd565b366100cd57005b005b3480156100db57600080fd5b506100ef6100ea3660046126c7565b610272565b6040516100fc91906130ed565b60405180910390f35b34801561011157600080fd5b506100cd610120366004612697565b610854565b34801561013157600080fd5b506100ef61092f565b34801561014657600080fd5b5061014f610935565b6040516100fc91906127c9565b34801561016857600080fd5b5061014f610944565b34801561017d57600080fd5b5061019161018c366004612697565b610953565b6040516100fc9d9c9b9a999897969594939291906130f6565b3480156101b657600080fd5b506100cd6101c536600461277f565b6109d0565b3480156101d657600080fd5b506100cd6101e5366004612697565b610af1565b3480156101f657600080fd5b506100cd610205366004612750565b610be2565b6100cd61021836600461277f565b610c7f565b34801561022957600080fd5b506100cd610238366004612697565b61116c565b34801561024957600080fd5b506100cd61025836600461277f565b61178f565b34801561026957600080fd5b506100ef6118f2565b6000600260005414156102a05760405162461bcd60e51b815260040161029790612fbc565b60405180910390fd5b60026000556040516301ffc9a760e01b81526001600160a01b038916906301ffc9a7906102d8906380ac58cd60e01b90600401612887565b60206040518083038186803b1580156102f057600080fd5b505afa158015610304573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610328919061267b565b6103445760405162461bcd60e51b81526004016102979061304a565b60648460ff16106103675760405162461bcd60e51b815260040161029790612f25565b6003546001600160a01b038981169116146103945760405162461bcd60e51b8152600401610297906129cb565b6002548610156103b65760405162461bcd60e51b815260040161029790612984565b8115806103c35750428210155b6103df5760405162461bcd60e51b815260040161029790612d3d565b816103e8574291505b6040516331a9108f60e11b81526000906001600160a01b038a1690636352211e90610417908d906004016130ed565b60206040518083038186803b15801561042f57600080fd5b505afa158015610443573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610467919061265f565b60405163020604bf60e21b81529091506001600160a01b038a169063081812fc90610496908d906004016130ed565b60206040518083038186803b1580156104ae57600080fd5b505afa1580156104c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104e6919061265f565b6001600160a01b0316336001600160a01b0316148061050d5750336001600160a01b038216145b6105295760405162461bcd60e51b815260040161029790612f6f565b600061053560066118f8565b9050604051806101a001604052808c81526020018b6001600160a01b03168152602001600015158152602001600081526020018a8152602001600081526020018981526020018760ff168152602001836001600160a01b0316815260200160006001600160a01b03168152602001886001600160a01b03168152602001866001600160a01b0316815260200185815250600560008381526020019081526020016000206000820151816000015560208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a81548160ff021916908315150217905550606082015181600201556080820151816003015560a0820151816004015560c0820151816005015560e08201518160060160006101000a81548160ff021916908360ff1602179055506101008201518160060160016101000a8154816001600160a01b0302191690836001600160a01b031602179055506101208201518160070160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506101408201518160080160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506101608201518160090160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555061018082015181600a0155905050896001600160a01b03166323b872dd83308e6040518463ffffffff1660e01b815260040161076e939291906127dd565b600060405180830381600087803b15801561078857600080fd5b505af115801561079c573d6000803e3d6000fd5b505050506107aa60066118fc565b896001600160a01b03168b827f7ededa5ddb432b4568129753c879d4f557ccf360eff1e660af372b448a53433a8c8c878d8d8d8d6040516107f197969594939291906131e2565b60405180910390a46000818152600560205260409020600801546001600160a01b031615806108315750816001600160a01b0316876001600160a01b0316145b1561084157610841816001611905565b60016000559a9950505050505050505050565b600360009054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156108a257600080fd5b505afa1580156108b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108da919061265f565b6001600160a01b0316336001600160a01b03161461090a5760405162461bcd60e51b815260040161029790612c44565b6000811161092a5760405162461bcd60e51b815260040161029790612de0565b600155565b60025481565b6003546001600160a01b031681565b6004546001600160a01b031681565b600560208190526000918252604090912080546001820154600283015460038401546004850154958501546006860154600787015460088801546009890154600a9099015497996001600160a01b038089169a60ff600160a01b909a048a169a98999798929786169561010090048216948216938216929116908d565b816109da8161197c565b6109f65760405162461bcd60e51b815260040161029790612cbc565b6000838152600560205260409020600801546001600160a01b0316331480610a3c575060008381526005602052604090206006015461010090046001600160a01b031633145b610a585760405162461bcd60e51b815260040161029790612d9a565b60008381526005602052604090206004015415610a875760405162461bcd60e51b815260040161029790612c0d565b6000838152600560208190526040918290209081018490556001810154905491516001600160a01b03909116919085907f01e6a465ec1edd582d333147c7b7edf5998164f2cf2269dcb9c93d46c67bd31790610ae49087906130ed565b60405180910390a4505050565b60026000541415610b145760405162461bcd60e51b815260040161029790612fbc565b600260005580610b238161197c565b610b3f5760405162461bcd60e51b815260040161029790612cbc565b60008281526005602052604090206006015461010090046001600160a01b0316331480610b8557506000828152600560205260409020600801546001600160a01b031633145b610ba15760405162461bcd60e51b815260040161029790612b02565b60008281526005602052604090206004015415610bd05760405162461bcd60e51b815260040161029790612906565b610bd9826119a1565b50506001600055565b81610bec8161197c565b610c085760405162461bcd60e51b815260040161029790612cbc565b6000838152600560205260409020600801546001600160a01b03163314610c415760405162461bcd60e51b81526004016102979061294d565b60008381526005602052604090206004015415610c705760405162461bcd60e51b815260040161029790612c0d565b610c7a8383611905565b505050565b81610c898161197c565b610ca55760405162461bcd60e51b815260040161029790612cbc565b60026000541415610cc85760405162461bcd60e51b815260040161029790612fbc565b6002600090815583815260056020526040902060078101546001909101546001600160a01b0390911690600160a01b900460ff16610d185760405162461bcd60e51b815260040161029790612b89565b6000848152600560205260409020600a0154421015610d495760405162461bcd60e51b81526004016102979061301c565b60008481526005602052604090206003810154600a90910154610d6b91611b03565b4210610d895760405162461bcd60e51b815260040161029790612ff3565b60008481526005602081905260409091200154831015610dbb5760405162461bcd60e51b815260040161029790612b52565b60028054600086815260056020526040902090910154610dda91611b03565b831015610df95760405162461bcd60e51b815260040161029790612a31565b6003546000858152600560205260409020600101546001600160a01b0390811691161415610f5357600360009054906101000a90046001600160a01b03166001600160a01b031663a1794bcd6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610e7157600080fd5b505af1158015610e85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea9919061265f565b600085815260056020526040908190205490516302e8fe1360e01b81526001600160a01b0392909216916302e8fe1391610ee79187906004016131d4565b60206040518083038186803b158015610eff57600080fd5b505afa158015610f13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f37919061267b565b610f535760405162461bcd60e51b8152600401610297906128cf565b600084815260056020526040902060040154610f8357600084815260056020526040902042600490910155610fbf565b6001600160a01b03811615610fbf5760008481526005602052604090206002810154600990910154610fbf9183916001600160a01b0316611b31565b600084815260056020526040902060090154610fe59084906001600160a01b0316611c3e565b6000848152600560205260408120600281018590556007810180546001600160a01b031916331790556001546003820154600a90920154909161103491429161102e9190611b03565b90611e17565b10156110935760008581526005602052604090206003810154600a9091015461107b906110749061106b90429061102e9086611b03565b60015490611e17565b8290611b03565b60008781526005602052604090206003015550600190505b600085815260056020526040908190206001810154905491516001600160a01b03918216929188917fda6b779568630ce5e5658b317174df474d5b335541ed9471bd8424a017f3be6d916110f19133918b91908a1615908990612801565b60405180910390a4801561116057600085815260056020526040908190206001810154815460039092015492516001600160a01b039091169288917f55cf2b31608fbe49fa31cd0285b6b6cce46f56d26c8c59980a2af5a0ffbdd5db91611157916130ed565b60405180910390a45b50506001600055505050565b806111768161197c565b6111925760405162461bcd60e51b815260040161029790612cbc565b600260005414156111b55760405162461bcd60e51b815260040161029790612fbc565b60026000908155828152600560205260409020600401546111e85760405162461bcd60e51b815260040161029790612ad4565b60008281526005602052604090206003810154600a9091015461120a91611b03565b4210156112295760405162461bcd60e51b815260040161029790612eee565b6000828152600560205260408120600901546001600160a01b031615611269576000838152600560205260409020600901546001600160a01b0316611276565b6004546001600160a01b03165b6000848152600560205260408120600281015460035460019092015493945091926001600160a01b0390811691161415611317576000806112b687611e59565b93509150829050600182151514611310576000878152600560205260409020600781015460028201546009909201546112fd926001600160a01b0392831692909116611b31565b611306876119a1565b5050505050610bd9565b50506113d9565b600085815260056020526040908190206001810154600782015491549251632142170760e11b81526001600160a01b03918216936342842e0e93611363933093911691906004016127dd565b600060405180830381600087803b15801561137d57600080fd5b505af192505050801561138e575060015b6113d9576000858152600560205260409020600781015460028201546009909201546113c8926001600160a01b0392831692909116611b31565b6113d1856119a1565b505050610bd9565b6000858152600560205260409020600801546001600160a01b031615611466576000858152600560205260409020600601546114269060649061142090849060ff1661227f565b906122b9565b91506114328183611e17565b60008681526005602052604090206008810154600990910154919250611466916001600160a01b0391821691859116611b31565b600085815260056020908152604091829020600601546003548351638da5cb5b60e01b815293516101009092046001600160a01b0390811694911692638da5cb5b92600480840193829003018186803b1580156114c257600080fd5b505afa1580156114d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114fa919061265f565b6001600160a01b031614806115a5575060035460008681526005602052604090819020600601549051635b52ebef60e11b81526001600160a01b039283169263b6a5d7de9261155592610100909104909116906004016127c9565b60206040518083038186803b15801561156d57600080fd5b505afa158015611581573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a5919061267b565b1561164f5760035460408051630ced656d60e31b8152905161164a926001600160a01b03169163676b2b68916004808301926020929190829003018186803b1580156115f057600080fd5b505afa158015611604573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611628919061265f565b60008781526005602052604090206009015483906001600160a01b0316611b31565b611685565b60008581526005602052604090206006810154600990910154611685916001600160a01b03610100909104811691849116611b31565b60008581526005602052604090819020600181015481546006830154600884015460079094015494516001600160a01b039384169592948b947f4f35fb3ea0081b3ccbe8df613cab0f9e1694d50a025e0aa09b88a86a3d07c2de946116fe9461010090048216939282169291169089908b908d9061282b565b60405180910390a4505050600082815260056020819052604082208281556001810180546001600160a81b03199081169091556002820184905560038201849055600482018490559181018390556006810180549092169091556007810180546001600160a01b0319908116909155600882018054821690556009820180549091169055600a015550506001600055565b816117998161197c565b6117b55760405162461bcd60e51b815260040161029790612cbc565b6000838152600560205260409020600801546001600160a01b03163314806117fb575060008381526005602052604090206006015461010090046001600160a01b031633145b6118175760405162461bcd60e51b815260040161029790612d9a565b600083815260056020526040902060040154156118465760405162461bcd60e51b815260040161029790612c0d565b6000838152600560205260409020600a015442106118765760405162461bcd60e51b815260040161029790612bcc565b428210156118965760405162461bcd60e51b815260040161029790612e17565b60008381526005602052604090819020600a81018490556001810154905491516001600160a01b03909116919085907f1d78732ae2aefa604bcfc1b5f6cf78d82f62a8a63d757bcf08eb5d8278549c2590610ae49087906130ed565b60015481565b5490565b80546001019055565b6000828152600560205260409081902060018101805460ff60a01b1916600160a01b851515021790819055905491516001600160a01b03909116919084907fec35d321ab4972475f131e184c0c0fe52c5a58a29d74f7db2969af2f6dd93a1f9061197090869061287c565b60405180910390a45050565b60009081526005602052604090206006015461010090046001600160a01b0316151590565b600081815260056020526040908190206006810154600182015491549251632142170760e11b81526101009091046001600160a01b03908116939216916342842e0e916119f59130918691906004016127dd565b600060405180830381600087803b158015611a0f57600080fd5b505af1158015611a23573d6000803e3d6000fd5b505050600083815260056020526040908190206001810154905491516001600160a01b03909116925084907f6091afcbe8514686c43b167ca4f1b03e24446d29d8490d496e438f8a2c76343990611a7b9086906127c9565b60405180910390a450600090815260056020819052604082208281556001810180546001600160a81b03199081169091556002820184905560038201849055600482018490559181018390556006810180549092169091556007810180546001600160a01b0319908116909155600882018054821690556009820180549091169055600a0155565b600082820183811015611b285760405162461bcd60e51b8152600401610297906129fa565b90505b92915050565b6001600160a01b038116611c2a5760048054604051632e1a7d4d60e01b81526001600160a01b0390911691632e1a7d4d91611b6e918691016130ed565b600060405180830381600087803b158015611b8857600080fd5b505af1158015611b9c573d6000803e3d6000fd5b50505050611baa83836122fb565b611c25576004805460408051630d0e30db60e41b815290516001600160a01b039092169263d0e30db0928692808301926000929182900301818588803b158015611bf357600080fd5b505af1158015611c07573d6000803e3d6000fd5b5050600454611c2593506001600160a01b0316915085905084612372565b610c7a565b610c7a6001600160a01b0382168484612372565b6001600160a01b038116611cce57813414611c6b5760405162461bcd60e51b815260040161029790612ceb565b6004805460408051630d0e30db60e41b815290516001600160a01b039092169263d0e30db0928692808301926000929182900301818588803b158015611cb057600080fd5b505af1158015611cc4573d6000803e3d6000fd5b5050505050611e13565b6040516370a0823160e01b815281906000906001600160a01b038316906370a0823190611cff9030906004016127c9565b60206040518083038186803b158015611d1757600080fd5b505afa158015611d2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d4f91906126af565b9050611d666001600160a01b0383163330876123c8565b6040516370a0823160e01b81526000906001600160a01b038416906370a0823190611d959030906004016127c9565b60206040518083038186803b158015611dad57600080fd5b505afa158015611dc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611de591906126af565b905080611df28387611b03565b14611e0f5760405162461bcd60e51b815260040161029790613099565b5050505b5050565b6000611b2883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506123ef565b600081815260056020526040812060090154819081906001600160a01b031615611e9d576000848152600560205260409020600901546001600160a01b0316611eaa565b6004546001600160a01b03165b9050611eb46125fd565b506040805160a081018252600086815260056020818152848320600281015485526001600160a01b0380881683870181905230878901528b865293835260079091015481166060860152855180830187528481526080860152600354865163a1794bcd60e01b815296519596939563095ea7b395919092169363a1794bcd93600480830194919391928390030190829087803b158015611f5357600080fd5b505af1158015611f67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8b919061265f565b83516040516001600160e01b031960e085901b168152611faf929190600401612863565b602060405180830381600087803b158015611fc957600080fd5b505af1158015611fdd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612001919061267b565b5060035460008681526005602052604090819020549051632dfb121160e11b81526001600160a01b0390921691635bf6242291612042918590600401613186565b600060405180830381600087803b15801561205c57600080fd5b505af1158015612070573d6000803e3d6000fd5b50506040516370a0823160e01b8152600092506001600160a01b03851691506370a08231906120a39030906004016127c9565b60206040518083038186803b1580156120bb57600080fd5b505afa1580156120cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120f391906126af565b6003546000888152600560205260409081902054905163ba33939960e01b81529293506001600160a01b039091169163ba33939991612136918690600401613186565b600060405180830381600087803b15801561215057600080fd5b505af1925050508015612161575060015b6121e4576003546000878152600560205260409081902054905163b320f45960e01b81526001600160a01b039092169163b320f459916121a3916004016130ed565b600060405180830381600087803b1580156121bd57600080fd5b505af11580156121d1573d6000803e3d6000fd5b505050506000809450945050505061227a565b6040516370a0823160e01b81526000906001600160a01b038516906370a08231906122139030906004016127c9565b60206040518083038186803b15801561222b57600080fd5b505afa15801561223f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061226391906126af565b905060016122718284611e17565b95509550505050505b915091565b60008261228e57506000611b2b565b8282028284828161229b57fe5b0414611b285760405162461bcd60e51b815260040161029790612c7b565b6000611b2883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612420565b60408051600080825260208201928390529182916001600160a01b038616918591612325916127ad565b60006040518083038185875af1925050503d8060008114612362576040519150601f19603f3d011682016040523d82523d6000602084013e612367565b606091505b509095945050505050565b610c7a8363a9059cbb60e01b8484604051602401612391929190612863565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612457565b6123e9846323b872dd60e01b858585604051602401612391939291906127dd565b50505050565b600081848411156124135760405162461bcd60e51b8152600401610297919061289c565b50508183035b9392505050565b600081836124415760405162461bcd60e51b8152600401610297919061289c565b50600083858161244d57fe5b0495945050505050565b60606124ac826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166124e69092919063ffffffff16565b805190915015610c7a57808060200190518101906124ca919061267b565b610c7a5760405162461bcd60e51b815260040161029790612ea4565b60606124f584846000856124fd565b949350505050565b60608247101561251f5760405162461bcd60e51b815260040161029790612a8e565b612528856125be565b6125445760405162461bcd60e51b815260040161029790612e6d565b60006060866001600160a01b0316858760405161256191906127ad565b60006040518083038185875af1925050503d806000811461259e576040519150601f19603f3d011682016040523d82523d6000602084013e6125a3565b606091505b50915091506125b38282866125c4565b979650505050505050565b3b151590565b606083156125d3575081612419565b8251156125e35782518084602001fd5b8160405162461bcd60e51b8152600401610297919061289c565b6040518060a001604052806000815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200161264761264c565b905290565b6040518060200160405280600081525090565b600060208284031215612670578081fd5b8151611b288161324a565b60006020828403121561268c578081fd5b8151611b2881613262565b6000602082840312156126a8578081fd5b5035919050565b6000602082840312156126c0578081fd5b5051919050565b600080600080600080600080610100898b0312156126e3578384fd5b8835975060208901356126f58161324a565b9650604089013595506060890135945060808901356127138161324a565b935060a089013560ff81168114612728578384fd5b925060c08901356127388161324a565b8092505060e089013590509295985092959890939650565b60008060408385031215612762578182fd5b82359150602083013561277481613262565b809150509250929050565b60008060408385031215612791578182fd5b50508035926020909101359150565b6001600160a01b03169052565b600082516127bf81846020870161321e565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b039490941684526020840192909252151560408301521515606082015260800190565b6001600160a01b039687168152948616602086015292851660408501526060840191909152608083015290911660a082015260c00190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b6001600160e01b031991909116815260200190565b60006020825282518060208401526128bb81604085016020870161321e565b601f01601f19169190910160400192915050565b6020808252601f908201527f42696420696e76616c696420666f722073686172652073706c697474696e6700604082015260600190565b60208082526027908201527f43616e27742063616e63656c20616e2061756374696f6e206f6e63652069742760408201526639903132b3bab760c91b606082015260800190565b60208082526017908201527f4d7573742062652061756374696f6e2063757261746f72000000000000000000604082015260600190565b60208082526027908201527f666972737420626964206d7573742062652067726561746572207468616e203060408201526605c606240cae8d60cb1b606082015260800190565b6020808252601590820152746f6e6c79204174726f20746f6b656e20706c61636560581b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526039908201527f4d7573742073656e64206d6f7265207468616e206c617374206269642062792060408201527f6d696e426964496e6372656d656e7457656920616d6f756e7400000000000000606082015260800190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b60208082526014908201527320bab1ba34b7b7103430b9b713ba103132b3bab760611b604082015260600190565b60208082526030908201527f43616e206f6e6c792062652063616c6c65642062792061756374696f6e20637260408201526f32b0ba37b91037b91031bab930ba37b960811b606082015260800190565b6020808252601f908201527f4d7573742073656e64206174206c656173742072657365727665507269636500604082015260600190565b60208082526023908201527f41756374696f6e206d75737420626520617070726f76656420627920637572616040820152623a37b960e91b606082015260800190565b60208082526021908201527f456e61626c6520746f2052657363686564756c652041756374696f6e2054696d6040820152606560f81b606082015260800190565b6020808252601b908201527f41756374696f6e2068617320616c726561647920737461727465640000000000604082015260600190565b60208082526018908201527f596f7520617265206e6f74206120537570657261646d696e0000000000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b602080825260159082015274105d58dd1a5bdb88191bd95cdb89dd08195e1a5cdd605a1b604082015260600190565b60208082526032908201527f53656e74204554482056616c756520646f6573206e6f74206d617463682073706040820152711958da599a595908189a5908185b5bdd5b9d60721b606082015260800190565b60208082526037908201527f53746172742074696d65206d7573742062652067726561746572207468616e2060408201527f657175616c20746f2063757272656e742074696d652020000000000000000000606082015260800190565b60208082526026908201527f4d7573742062652061756374696f6e2063757261746f72206f7220746f6b656e6040820152651037bbb732b960d11b606082015260800190565b60208082526019908201527f6d7573742062652067726561746572207468616e205a65726f00000000000000604082015260600190565b60208082526036908201527f53746172742074696d65206d7573742062652067726561746572207468616e20604082015275032b8bab0b6103a379031bab93932b73a103a34b6b2960551b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526018908201527f41756374696f6e206861736e277420636f6d706c657465640000000000000000604082015260600190565b6020808252602a908201527f63757261746f7246656550657263656e74616765206d757374206265206c6573604082015269073207468616e203130360b41b606082015260800190565b6020808252602d908201527f43616c6c6572206d75737420626520617070726f766564206f72206f776e657260408201526c08199bdc881d1bdad95b881a59609a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252600f908201526e105d58dd1a5bdb88195e1c1a5c9959608a1b604082015260600190565b60208082526014908201527320bab1ba34b7b71034b9903737ba103132b3bab760611b604082015260600190565b6020808252602f908201527f746f6b656e436f6e747261637420646f6573206e6f7420737570706f7274204560408201526e524337323120696e7465726661636560881b606082015260800190565b60208082526034908201527f546f6b656e207472616e736665722063616c6c20646964206e6f74207472616e6040820152731cd9995c88195e1c1958dd195908185b5bdd5b9d60621b606082015260800190565b90815260200190565b8d81526001600160a01b038d811660208301528c15156040830152606082018c9052608082018b905260a082018a905260c0820189905260ff881660e083015286166101008201526101a081016131516101208301876127a0565b61315f6101408301866127a0565b61316d6101608301856127a0565b826101808301529e9d5050505050505050505050505050565b91825280516020808401919091528101516001600160a01b0390811660408085019190915282015181166060808501919091528201511660808084019190915201515160a082015260c00190565b918252602082015260400190565b96875260208701959095526001600160a01b039384166040870152918316606086015260ff1660808501521660a083015260c082015260e00190565b60005b83811015613239578181015183820152602001613221565b838111156123e95750506000910152565b6001600160a01b038116811461325f57600080fd5b50565b801515811461325f57600080fdfea2646970667358221220921cf9b85d153789660eae2a51c127a82cc503d25ce1c93708ae688bcfd49c3464736f6c634300060c0033000000000000000000000000f2e9db3b8d2af2752865af51a71bcd548bd27834000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2

Deployed Bytecode

0x6080604052600436106100c65760003560e01c80636f8a41e11161007f578063b7751c7111610059578063b7751c711461020a578063b9a2de3a1461021d578063ebb551551461023d578063ec91f2a41461025d576100cd565b80636f8a41e1146101aa57806396b5a755146101ca578063973ddb4a146101ea576100cd565b806319a41133146100cf5780631aac030c1461010557806342814efa1461012557806349077a4f1461013a5780634f0e0ef31461015c578063571a26a014610171576100cd565b366100cd57005b005b3480156100db57600080fd5b506100ef6100ea3660046126c7565b610272565b6040516100fc91906130ed565b60405180910390f35b34801561011157600080fd5b506100cd610120366004612697565b610854565b34801561013157600080fd5b506100ef61092f565b34801561014657600080fd5b5061014f610935565b6040516100fc91906127c9565b34801561016857600080fd5b5061014f610944565b34801561017d57600080fd5b5061019161018c366004612697565b610953565b6040516100fc9d9c9b9a999897969594939291906130f6565b3480156101b657600080fd5b506100cd6101c536600461277f565b6109d0565b3480156101d657600080fd5b506100cd6101e5366004612697565b610af1565b3480156101f657600080fd5b506100cd610205366004612750565b610be2565b6100cd61021836600461277f565b610c7f565b34801561022957600080fd5b506100cd610238366004612697565b61116c565b34801561024957600080fd5b506100cd61025836600461277f565b61178f565b34801561026957600080fd5b506100ef6118f2565b6000600260005414156102a05760405162461bcd60e51b815260040161029790612fbc565b60405180910390fd5b60026000556040516301ffc9a760e01b81526001600160a01b038916906301ffc9a7906102d8906380ac58cd60e01b90600401612887565b60206040518083038186803b1580156102f057600080fd5b505afa158015610304573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610328919061267b565b6103445760405162461bcd60e51b81526004016102979061304a565b60648460ff16106103675760405162461bcd60e51b815260040161029790612f25565b6003546001600160a01b038981169116146103945760405162461bcd60e51b8152600401610297906129cb565b6002548610156103b65760405162461bcd60e51b815260040161029790612984565b8115806103c35750428210155b6103df5760405162461bcd60e51b815260040161029790612d3d565b816103e8574291505b6040516331a9108f60e11b81526000906001600160a01b038a1690636352211e90610417908d906004016130ed565b60206040518083038186803b15801561042f57600080fd5b505afa158015610443573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610467919061265f565b60405163020604bf60e21b81529091506001600160a01b038a169063081812fc90610496908d906004016130ed565b60206040518083038186803b1580156104ae57600080fd5b505afa1580156104c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104e6919061265f565b6001600160a01b0316336001600160a01b0316148061050d5750336001600160a01b038216145b6105295760405162461bcd60e51b815260040161029790612f6f565b600061053560066118f8565b9050604051806101a001604052808c81526020018b6001600160a01b03168152602001600015158152602001600081526020018a8152602001600081526020018981526020018760ff168152602001836001600160a01b0316815260200160006001600160a01b03168152602001886001600160a01b03168152602001866001600160a01b0316815260200185815250600560008381526020019081526020016000206000820151816000015560208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a81548160ff021916908315150217905550606082015181600201556080820151816003015560a0820151816004015560c0820151816005015560e08201518160060160006101000a81548160ff021916908360ff1602179055506101008201518160060160016101000a8154816001600160a01b0302191690836001600160a01b031602179055506101208201518160070160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506101408201518160080160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506101608201518160090160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555061018082015181600a0155905050896001600160a01b03166323b872dd83308e6040518463ffffffff1660e01b815260040161076e939291906127dd565b600060405180830381600087803b15801561078857600080fd5b505af115801561079c573d6000803e3d6000fd5b505050506107aa60066118fc565b896001600160a01b03168b827f7ededa5ddb432b4568129753c879d4f557ccf360eff1e660af372b448a53433a8c8c878d8d8d8d6040516107f197969594939291906131e2565b60405180910390a46000818152600560205260409020600801546001600160a01b031615806108315750816001600160a01b0316876001600160a01b0316145b1561084157610841816001611905565b60016000559a9950505050505050505050565b600360009054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156108a257600080fd5b505afa1580156108b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108da919061265f565b6001600160a01b0316336001600160a01b03161461090a5760405162461bcd60e51b815260040161029790612c44565b6000811161092a5760405162461bcd60e51b815260040161029790612de0565b600155565b60025481565b6003546001600160a01b031681565b6004546001600160a01b031681565b600560208190526000918252604090912080546001820154600283015460038401546004850154958501546006860154600787015460088801546009890154600a9099015497996001600160a01b038089169a60ff600160a01b909a048a169a98999798929786169561010090048216948216938216929116908d565b816109da8161197c565b6109f65760405162461bcd60e51b815260040161029790612cbc565b6000838152600560205260409020600801546001600160a01b0316331480610a3c575060008381526005602052604090206006015461010090046001600160a01b031633145b610a585760405162461bcd60e51b815260040161029790612d9a565b60008381526005602052604090206004015415610a875760405162461bcd60e51b815260040161029790612c0d565b6000838152600560208190526040918290209081018490556001810154905491516001600160a01b03909116919085907f01e6a465ec1edd582d333147c7b7edf5998164f2cf2269dcb9c93d46c67bd31790610ae49087906130ed565b60405180910390a4505050565b60026000541415610b145760405162461bcd60e51b815260040161029790612fbc565b600260005580610b238161197c565b610b3f5760405162461bcd60e51b815260040161029790612cbc565b60008281526005602052604090206006015461010090046001600160a01b0316331480610b8557506000828152600560205260409020600801546001600160a01b031633145b610ba15760405162461bcd60e51b815260040161029790612b02565b60008281526005602052604090206004015415610bd05760405162461bcd60e51b815260040161029790612906565b610bd9826119a1565b50506001600055565b81610bec8161197c565b610c085760405162461bcd60e51b815260040161029790612cbc565b6000838152600560205260409020600801546001600160a01b03163314610c415760405162461bcd60e51b81526004016102979061294d565b60008381526005602052604090206004015415610c705760405162461bcd60e51b815260040161029790612c0d565b610c7a8383611905565b505050565b81610c898161197c565b610ca55760405162461bcd60e51b815260040161029790612cbc565b60026000541415610cc85760405162461bcd60e51b815260040161029790612fbc565b6002600090815583815260056020526040902060078101546001909101546001600160a01b0390911690600160a01b900460ff16610d185760405162461bcd60e51b815260040161029790612b89565b6000848152600560205260409020600a0154421015610d495760405162461bcd60e51b81526004016102979061301c565b60008481526005602052604090206003810154600a90910154610d6b91611b03565b4210610d895760405162461bcd60e51b815260040161029790612ff3565b60008481526005602081905260409091200154831015610dbb5760405162461bcd60e51b815260040161029790612b52565b60028054600086815260056020526040902090910154610dda91611b03565b831015610df95760405162461bcd60e51b815260040161029790612a31565b6003546000858152600560205260409020600101546001600160a01b0390811691161415610f5357600360009054906101000a90046001600160a01b03166001600160a01b031663a1794bcd6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610e7157600080fd5b505af1158015610e85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea9919061265f565b600085815260056020526040908190205490516302e8fe1360e01b81526001600160a01b0392909216916302e8fe1391610ee79187906004016131d4565b60206040518083038186803b158015610eff57600080fd5b505afa158015610f13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f37919061267b565b610f535760405162461bcd60e51b8152600401610297906128cf565b600084815260056020526040902060040154610f8357600084815260056020526040902042600490910155610fbf565b6001600160a01b03811615610fbf5760008481526005602052604090206002810154600990910154610fbf9183916001600160a01b0316611b31565b600084815260056020526040902060090154610fe59084906001600160a01b0316611c3e565b6000848152600560205260408120600281018590556007810180546001600160a01b031916331790556001546003820154600a90920154909161103491429161102e9190611b03565b90611e17565b10156110935760008581526005602052604090206003810154600a9091015461107b906110749061106b90429061102e9086611b03565b60015490611e17565b8290611b03565b60008781526005602052604090206003015550600190505b600085815260056020526040908190206001810154905491516001600160a01b03918216929188917fda6b779568630ce5e5658b317174df474d5b335541ed9471bd8424a017f3be6d916110f19133918b91908a1615908990612801565b60405180910390a4801561116057600085815260056020526040908190206001810154815460039092015492516001600160a01b039091169288917f55cf2b31608fbe49fa31cd0285b6b6cce46f56d26c8c59980a2af5a0ffbdd5db91611157916130ed565b60405180910390a45b50506001600055505050565b806111768161197c565b6111925760405162461bcd60e51b815260040161029790612cbc565b600260005414156111b55760405162461bcd60e51b815260040161029790612fbc565b60026000908155828152600560205260409020600401546111e85760405162461bcd60e51b815260040161029790612ad4565b60008281526005602052604090206003810154600a9091015461120a91611b03565b4210156112295760405162461bcd60e51b815260040161029790612eee565b6000828152600560205260408120600901546001600160a01b031615611269576000838152600560205260409020600901546001600160a01b0316611276565b6004546001600160a01b03165b6000848152600560205260408120600281015460035460019092015493945091926001600160a01b0390811691161415611317576000806112b687611e59565b93509150829050600182151514611310576000878152600560205260409020600781015460028201546009909201546112fd926001600160a01b0392831692909116611b31565b611306876119a1565b5050505050610bd9565b50506113d9565b600085815260056020526040908190206001810154600782015491549251632142170760e11b81526001600160a01b03918216936342842e0e93611363933093911691906004016127dd565b600060405180830381600087803b15801561137d57600080fd5b505af192505050801561138e575060015b6113d9576000858152600560205260409020600781015460028201546009909201546113c8926001600160a01b0392831692909116611b31565b6113d1856119a1565b505050610bd9565b6000858152600560205260409020600801546001600160a01b031615611466576000858152600560205260409020600601546114269060649061142090849060ff1661227f565b906122b9565b91506114328183611e17565b60008681526005602052604090206008810154600990910154919250611466916001600160a01b0391821691859116611b31565b600085815260056020908152604091829020600601546003548351638da5cb5b60e01b815293516101009092046001600160a01b0390811694911692638da5cb5b92600480840193829003018186803b1580156114c257600080fd5b505afa1580156114d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114fa919061265f565b6001600160a01b031614806115a5575060035460008681526005602052604090819020600601549051635b52ebef60e11b81526001600160a01b039283169263b6a5d7de9261155592610100909104909116906004016127c9565b60206040518083038186803b15801561156d57600080fd5b505afa158015611581573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a5919061267b565b1561164f5760035460408051630ced656d60e31b8152905161164a926001600160a01b03169163676b2b68916004808301926020929190829003018186803b1580156115f057600080fd5b505afa158015611604573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611628919061265f565b60008781526005602052604090206009015483906001600160a01b0316611b31565b611685565b60008581526005602052604090206006810154600990910154611685916001600160a01b03610100909104811691849116611b31565b60008581526005602052604090819020600181015481546006830154600884015460079094015494516001600160a01b039384169592948b947f4f35fb3ea0081b3ccbe8df613cab0f9e1694d50a025e0aa09b88a86a3d07c2de946116fe9461010090048216939282169291169089908b908d9061282b565b60405180910390a4505050600082815260056020819052604082208281556001810180546001600160a81b03199081169091556002820184905560038201849055600482018490559181018390556006810180549092169091556007810180546001600160a01b0319908116909155600882018054821690556009820180549091169055600a015550506001600055565b816117998161197c565b6117b55760405162461bcd60e51b815260040161029790612cbc565b6000838152600560205260409020600801546001600160a01b03163314806117fb575060008381526005602052604090206006015461010090046001600160a01b031633145b6118175760405162461bcd60e51b815260040161029790612d9a565b600083815260056020526040902060040154156118465760405162461bcd60e51b815260040161029790612c0d565b6000838152600560205260409020600a015442106118765760405162461bcd60e51b815260040161029790612bcc565b428210156118965760405162461bcd60e51b815260040161029790612e17565b60008381526005602052604090819020600a81018490556001810154905491516001600160a01b03909116919085907f1d78732ae2aefa604bcfc1b5f6cf78d82f62a8a63d757bcf08eb5d8278549c2590610ae49087906130ed565b60015481565b5490565b80546001019055565b6000828152600560205260409081902060018101805460ff60a01b1916600160a01b851515021790819055905491516001600160a01b03909116919084907fec35d321ab4972475f131e184c0c0fe52c5a58a29d74f7db2969af2f6dd93a1f9061197090869061287c565b60405180910390a45050565b60009081526005602052604090206006015461010090046001600160a01b0316151590565b600081815260056020526040908190206006810154600182015491549251632142170760e11b81526101009091046001600160a01b03908116939216916342842e0e916119f59130918691906004016127dd565b600060405180830381600087803b158015611a0f57600080fd5b505af1158015611a23573d6000803e3d6000fd5b505050600083815260056020526040908190206001810154905491516001600160a01b03909116925084907f6091afcbe8514686c43b167ca4f1b03e24446d29d8490d496e438f8a2c76343990611a7b9086906127c9565b60405180910390a450600090815260056020819052604082208281556001810180546001600160a81b03199081169091556002820184905560038201849055600482018490559181018390556006810180549092169091556007810180546001600160a01b0319908116909155600882018054821690556009820180549091169055600a0155565b600082820183811015611b285760405162461bcd60e51b8152600401610297906129fa565b90505b92915050565b6001600160a01b038116611c2a5760048054604051632e1a7d4d60e01b81526001600160a01b0390911691632e1a7d4d91611b6e918691016130ed565b600060405180830381600087803b158015611b8857600080fd5b505af1158015611b9c573d6000803e3d6000fd5b50505050611baa83836122fb565b611c25576004805460408051630d0e30db60e41b815290516001600160a01b039092169263d0e30db0928692808301926000929182900301818588803b158015611bf357600080fd5b505af1158015611c07573d6000803e3d6000fd5b5050600454611c2593506001600160a01b0316915085905084612372565b610c7a565b610c7a6001600160a01b0382168484612372565b6001600160a01b038116611cce57813414611c6b5760405162461bcd60e51b815260040161029790612ceb565b6004805460408051630d0e30db60e41b815290516001600160a01b039092169263d0e30db0928692808301926000929182900301818588803b158015611cb057600080fd5b505af1158015611cc4573d6000803e3d6000fd5b5050505050611e13565b6040516370a0823160e01b815281906000906001600160a01b038316906370a0823190611cff9030906004016127c9565b60206040518083038186803b158015611d1757600080fd5b505afa158015611d2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d4f91906126af565b9050611d666001600160a01b0383163330876123c8565b6040516370a0823160e01b81526000906001600160a01b038416906370a0823190611d959030906004016127c9565b60206040518083038186803b158015611dad57600080fd5b505afa158015611dc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611de591906126af565b905080611df28387611b03565b14611e0f5760405162461bcd60e51b815260040161029790613099565b5050505b5050565b6000611b2883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506123ef565b600081815260056020526040812060090154819081906001600160a01b031615611e9d576000848152600560205260409020600901546001600160a01b0316611eaa565b6004546001600160a01b03165b9050611eb46125fd565b506040805160a081018252600086815260056020818152848320600281015485526001600160a01b0380881683870181905230878901528b865293835260079091015481166060860152855180830187528481526080860152600354865163a1794bcd60e01b815296519596939563095ea7b395919092169363a1794bcd93600480830194919391928390030190829087803b158015611f5357600080fd5b505af1158015611f67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8b919061265f565b83516040516001600160e01b031960e085901b168152611faf929190600401612863565b602060405180830381600087803b158015611fc957600080fd5b505af1158015611fdd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612001919061267b565b5060035460008681526005602052604090819020549051632dfb121160e11b81526001600160a01b0390921691635bf6242291612042918590600401613186565b600060405180830381600087803b15801561205c57600080fd5b505af1158015612070573d6000803e3d6000fd5b50506040516370a0823160e01b8152600092506001600160a01b03851691506370a08231906120a39030906004016127c9565b60206040518083038186803b1580156120bb57600080fd5b505afa1580156120cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120f391906126af565b6003546000888152600560205260409081902054905163ba33939960e01b81529293506001600160a01b039091169163ba33939991612136918690600401613186565b600060405180830381600087803b15801561215057600080fd5b505af1925050508015612161575060015b6121e4576003546000878152600560205260409081902054905163b320f45960e01b81526001600160a01b039092169163b320f459916121a3916004016130ed565b600060405180830381600087803b1580156121bd57600080fd5b505af11580156121d1573d6000803e3d6000fd5b505050506000809450945050505061227a565b6040516370a0823160e01b81526000906001600160a01b038516906370a08231906122139030906004016127c9565b60206040518083038186803b15801561222b57600080fd5b505afa15801561223f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061226391906126af565b905060016122718284611e17565b95509550505050505b915091565b60008261228e57506000611b2b565b8282028284828161229b57fe5b0414611b285760405162461bcd60e51b815260040161029790612c7b565b6000611b2883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612420565b60408051600080825260208201928390529182916001600160a01b038616918591612325916127ad565b60006040518083038185875af1925050503d8060008114612362576040519150601f19603f3d011682016040523d82523d6000602084013e612367565b606091505b509095945050505050565b610c7a8363a9059cbb60e01b8484604051602401612391929190612863565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612457565b6123e9846323b872dd60e01b858585604051602401612391939291906127dd565b50505050565b600081848411156124135760405162461bcd60e51b8152600401610297919061289c565b50508183035b9392505050565b600081836124415760405162461bcd60e51b8152600401610297919061289c565b50600083858161244d57fe5b0495945050505050565b60606124ac826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166124e69092919063ffffffff16565b805190915015610c7a57808060200190518101906124ca919061267b565b610c7a5760405162461bcd60e51b815260040161029790612ea4565b60606124f584846000856124fd565b949350505050565b60608247101561251f5760405162461bcd60e51b815260040161029790612a8e565b612528856125be565b6125445760405162461bcd60e51b815260040161029790612e6d565b60006060866001600160a01b0316858760405161256191906127ad565b60006040518083038185875af1925050503d806000811461259e576040519150601f19603f3d011682016040523d82523d6000602084013e6125a3565b606091505b50915091506125b38282866125c4565b979650505050505050565b3b151590565b606083156125d3575081612419565b8251156125e35782518084602001fd5b8160405162461bcd60e51b8152600401610297919061289c565b6040518060a001604052806000815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200161264761264c565b905290565b6040518060200160405280600081525090565b600060208284031215612670578081fd5b8151611b288161324a565b60006020828403121561268c578081fd5b8151611b2881613262565b6000602082840312156126a8578081fd5b5035919050565b6000602082840312156126c0578081fd5b5051919050565b600080600080600080600080610100898b0312156126e3578384fd5b8835975060208901356126f58161324a565b9650604089013595506060890135945060808901356127138161324a565b935060a089013560ff81168114612728578384fd5b925060c08901356127388161324a565b8092505060e089013590509295985092959890939650565b60008060408385031215612762578182fd5b82359150602083013561277481613262565b809150509250929050565b60008060408385031215612791578182fd5b50508035926020909101359150565b6001600160a01b03169052565b600082516127bf81846020870161321e565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b039490941684526020840192909252151560408301521515606082015260800190565b6001600160a01b039687168152948616602086015292851660408501526060840191909152608083015290911660a082015260c00190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b6001600160e01b031991909116815260200190565b60006020825282518060208401526128bb81604085016020870161321e565b601f01601f19169190910160400192915050565b6020808252601f908201527f42696420696e76616c696420666f722073686172652073706c697474696e6700604082015260600190565b60208082526027908201527f43616e27742063616e63656c20616e2061756374696f6e206f6e63652069742760408201526639903132b3bab760c91b606082015260800190565b60208082526017908201527f4d7573742062652061756374696f6e2063757261746f72000000000000000000604082015260600190565b60208082526027908201527f666972737420626964206d7573742062652067726561746572207468616e203060408201526605c606240cae8d60cb1b606082015260800190565b6020808252601590820152746f6e6c79204174726f20746f6b656e20706c61636560581b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526039908201527f4d7573742073656e64206d6f7265207468616e206c617374206269642062792060408201527f6d696e426964496e6372656d656e7457656920616d6f756e7400000000000000606082015260800190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b60208082526014908201527320bab1ba34b7b7103430b9b713ba103132b3bab760611b604082015260600190565b60208082526030908201527f43616e206f6e6c792062652063616c6c65642062792061756374696f6e20637260408201526f32b0ba37b91037b91031bab930ba37b960811b606082015260800190565b6020808252601f908201527f4d7573742073656e64206174206c656173742072657365727665507269636500604082015260600190565b60208082526023908201527f41756374696f6e206d75737420626520617070726f76656420627920637572616040820152623a37b960e91b606082015260800190565b60208082526021908201527f456e61626c6520746f2052657363686564756c652041756374696f6e2054696d6040820152606560f81b606082015260800190565b6020808252601b908201527f41756374696f6e2068617320616c726561647920737461727465640000000000604082015260600190565b60208082526018908201527f596f7520617265206e6f74206120537570657261646d696e0000000000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b602080825260159082015274105d58dd1a5bdb88191bd95cdb89dd08195e1a5cdd605a1b604082015260600190565b60208082526032908201527f53656e74204554482056616c756520646f6573206e6f74206d617463682073706040820152711958da599a595908189a5908185b5bdd5b9d60721b606082015260800190565b60208082526037908201527f53746172742074696d65206d7573742062652067726561746572207468616e2060408201527f657175616c20746f2063757272656e742074696d652020000000000000000000606082015260800190565b60208082526026908201527f4d7573742062652061756374696f6e2063757261746f72206f7220746f6b656e6040820152651037bbb732b960d11b606082015260800190565b60208082526019908201527f6d7573742062652067726561746572207468616e205a65726f00000000000000604082015260600190565b60208082526036908201527f53746172742074696d65206d7573742062652067726561746572207468616e20604082015275032b8bab0b6103a379031bab93932b73a103a34b6b2960551b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526018908201527f41756374696f6e206861736e277420636f6d706c657465640000000000000000604082015260600190565b6020808252602a908201527f63757261746f7246656550657263656e74616765206d757374206265206c6573604082015269073207468616e203130360b41b606082015260800190565b6020808252602d908201527f43616c6c6572206d75737420626520617070726f766564206f72206f776e657260408201526c08199bdc881d1bdad95b881a59609a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252600f908201526e105d58dd1a5bdb88195e1c1a5c9959608a1b604082015260600190565b60208082526014908201527320bab1ba34b7b71034b9903737ba103132b3bab760611b604082015260600190565b6020808252602f908201527f746f6b656e436f6e747261637420646f6573206e6f7420737570706f7274204560408201526e524337323120696e7465726661636560881b606082015260800190565b60208082526034908201527f546f6b656e207472616e736665722063616c6c20646964206e6f74207472616e6040820152731cd9995c88195e1c1958dd195908185b5bdd5b9d60621b606082015260800190565b90815260200190565b8d81526001600160a01b038d811660208301528c15156040830152606082018c9052608082018b905260a082018a905260c0820189905260ff881660e083015286166101008201526101a081016131516101208301876127a0565b61315f6101408301866127a0565b61316d6101608301856127a0565b826101808301529e9d5050505050505050505050505050565b91825280516020808401919091528101516001600160a01b0390811660408085019190915282015181166060808501919091528201511660808084019190915201515160a082015260c00190565b918252602082015260400190565b96875260208701959095526001600160a01b039384166040870152918316606086015260ff1660808501521660a083015260c082015260e00190565b60005b83811015613239578181015183820152602001613221565b838111156123e95750506000910152565b6001600160a01b038116811461325f57600080fd5b50565b801515811461325f57600080fdfea2646970667358221220921cf9b85d153789660eae2a51c127a82cc503d25ce1c93708ae688bcfd49c3464736f6c634300060c0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000f2e9db3b8d2af2752865af51a71bcd548bd27834000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2

-----Decoded View---------------
Arg [0] : _media (address): 0xf2e9Db3b8D2AF2752865aF51a71bCd548Bd27834
Arg [1] : _weth (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000f2e9db3b8d2af2752865af51a71bcd548bd27834
Arg [1] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2


Deployed Bytecode Sourcemap

37931:18286:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39983:2249;;;;;;;;;;-1:-1:-1;39983:2249:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39474:242;;;;;;;;;;-1:-1:-1;39474:242:0;;;;;:::i;:::-;;:::i;38303:33::-;;;;;;;;;;;;;:::i;38412:20::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;38541:26::-;;;;;;;;;;;;;:::i;38636:57::-;;;;;;;;;;-1:-1:-1;38636:57:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;42767:556::-;;;;;;;;;;-1:-1:-1;42767:556:0;;;;;:::i;:::-;;:::i;51390:486::-;;;;;;;;;;-1:-1:-1;51390:486:0;;;;;:::i;:::-;;:::i;42423:336::-;;;;;;;;;;-1:-1:-1;42423:336:0;;;;;:::i;:::-;;:::i;44406:3658::-;;;;;;:::i;:::-;;:::i;48391:2844::-;;;;;;;;;;-1:-1:-1;48391:2844:0;;;;;:::i;:::-;;:::i;43331:758::-;;;;;;;;;;-1:-1:-1;43331:758:0;;;;;:::i;:::-;;:::i;38185:25::-;;;;;;;;;;;;;:::i;39983:2249::-;40301:7;10711:1;11317:7;;:19;;11309:63;;;;-1:-1:-1;;;11309:63:0;;;;;;;:::i;:::-;;;;;;;;;10711:1;11450:7;:18;40343:53:::1;::::0;-1:-1:-1;;;40343:53:0;;-1:-1:-1;;;;;40343:40:0;::::1;::::0;::::1;::::0;:53:::1;::::0;-1:-1:-1;;;40384:11:0;40343:53:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40321:150;;;;-1:-1:-1::0;;;40321:150:0::1;;;;;;;:::i;:::-;40513:3;40490:20;:26;;;40482:81;;;;-1:-1:-1::0;;;40482:81:0::1;;;;;;;:::i;:::-;40599:5;::::0;-1:-1:-1;;;;;40582:22:0;;::::1;40599:5:::0;::::1;40582:22;40574:56;;;;-1:-1:-1::0;;;40574:56:0::1;;;;;;;:::i;:::-;40665:18;;40649:12;:34;;40641:85;;;;-1:-1:-1::0;;;40641:85:0::1;;;;;;;:::i;:::-;40748:15:::0;;;:48:::1;;;40781:15;40767:10;:29;;40748:48;40739:116;;;;-1:-1:-1::0;;;40739:116:0::1;;;;;;;:::i;:::-;40871:15:::0;40868:74:::1;;40915:15;40902:28;;40868:74;40985:39;::::0;-1:-1:-1;;;40985:39:0;;40964:18:::1;::::0;-1:-1:-1;;;;;40985:30:0;::::1;::::0;::::1;::::0;:39:::1;::::0;41016:7;;40985:39:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41057:43;::::0;-1:-1:-1;;;41057:43:0;;40964:60;;-1:-1:-1;;;;;;41057:34:0;::::1;::::0;::::1;::::0;:43:::1;::::0;41092:7;;41057:43:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;41043:57:0::1;:10;-1:-1:-1::0;;;;;41043:57:0::1;;:85;;;-1:-1:-1::0;41104:10:0::1;-1:-1:-1::0;;;;;41104:24:0;::::1;;41043:85;41035:143;;;;-1:-1:-1::0;;;41035:143:0::1;;;;;;;:::i;:::-;41189:17;41209:27;:17;:25;:27::i;:::-;41189:47;;41271:493;;;;;;;;41303:7;41271:493;;;;41340:13;-1:-1:-1::0;;;;;41271:493:0::1;;;;;41378:5;41271:493;;;;;;41406:1;41271:493;;;;41432:8;41271:493;;;;41469:1;41271:493;;;;41499:12;41271:493;;;;41548:20;41271:493;;;;;;41595:10;-1:-1:-1::0;;;;;41271:493:0::1;;;;;41636:1;-1:-1:-1::0;;;;;41271:493:0::1;;;;;41662:7;-1:-1:-1::0;;;;;41271:493:0::1;;;;;41701:15;-1:-1:-1::0;;;;;41271:493:0::1;;;;;41742:10;41271:493;;::::0;41249:8:::1;:19;41258:9;41249:19;;;;;;;;;;;:515;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;41249:515:0::1;;;;;-1:-1:-1::0;;;;;41249:515:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;41249:515:0::1;;;;;-1:-1:-1::0;;;;;41249:515:0::1;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;41249:515:0::1;;;;;-1:-1:-1::0;;;;;41249:515:0::1;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;41249:515:0::1;;;;;-1:-1:-1::0;;;;;41249:515:0::1;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;41249:515:0::1;;;;;-1:-1:-1::0;;;;;41249:515:0::1;;;;;;;;;;;;;;;;;41785:13;-1:-1:-1::0;;;;;41777:35:0::1;;41813:10;41833:4;41840:7;41777:71;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;41861:29;:17;:27;:29::i;:::-;41943:13;-1:-1:-1::0;;;;;41908:144:0::1;41934:7;41923:9;41908:144;41958:8;41968:12;41982:10;41994:7;42003:20;42025:15;42041:10;41908:144;;;;;;;;;;;;:::i;:::-;;;;;;;;42109:1;42070:19:::0;;;:8:::1;:19;::::0;;;;:27:::1;;::::0;-1:-1:-1;;;;;42070:27:0::1;:41:::0;;:66:::1;;;42126:10;-1:-1:-1::0;;;;;42115:21:0::1;:7;-1:-1:-1::0;;;;;42115:21:0::1;;42070:66;42067:129;;;42153:31;42169:9;42179:4;42153:15;:31::i;:::-;10667:1:::0;11629:7;:22;42215:9;39983:2249;-1:-1:-1;;;;;;;;;;39983:2249:0:o;39474:242::-;39566:5;;;;;;;;;-1:-1:-1;;;;;39566:5:0;-1:-1:-1;;;;;39559:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;39545:35:0;:10;-1:-1:-1;;;;;39545:35:0;;39536:73;;;;-1:-1:-1;;;39536:73:0;;;;;;;:::i;:::-;39643:1;39629:11;:15;39620:53;;;;-1:-1:-1;;;39620:53:0;;;;;;;:::i;:::-;39684:10;:24;39474:242::o;38303:33::-;;;;:::o;38412:20::-;;;-1:-1:-1;;;;;38412:20:0;;:::o;38541:26::-;;;-1:-1:-1;;;;;38541:26:0;;:::o;38636:57::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38636:57:0;;;;;-1:-1:-1;;;38636:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;42767:556::-;42872:9;38959:18;38967:9;38959:7;:18::i;:::-;38951:52;;;;-1:-1:-1;;;38951:52:0;;;;;;;:::i;:::-;42916:19:::1;::::0;;;:8:::1;:19;::::0;;;;:27:::1;;::::0;-1:-1:-1;;;;;42916:27:0::1;42902:10;:41;::::0;:89:::1;;-1:-1:-1::0;42961:19:0::1;::::0;;;:8:::1;:19;::::0;;;;:30:::1;;::::0;::::1;::::0;::::1;-1:-1:-1::0;;;;;42961:30:0::1;42947:10;:44;42902:89;42894:140;;;;-1:-1:-1::0;;;42894:140:0::1;;;;;;;:::i;:::-;43053:19;::::0;;;:8:::1;:19;::::0;;;;:32:::1;;::::0;:37;43045:77:::1;;;;-1:-1:-1::0;;;43045:77:0::1;;;;;;;:::i;:::-;43135:19;::::0;;;:8:::1;:19;::::0;;;;;;;;:32;;::::1;:47:::0;;;43267:33:::1;::::0;::::1;::::0;43238:27;;43200:115;;-1:-1:-1;;;;;43267:33:0;;::::1;::::0;43238:27;43144:9;;43200:115:::1;::::0;::::1;::::0;43170:12;;43200:115:::1;:::i;:::-;;;;;;;;42767:556:::0;;;:::o;51390:486::-;10711:1;11317:7;;:19;;11309:63;;;;-1:-1:-1;;;11309:63:0;;;;;;;:::i;:::-;10711:1;11450:7;:18;51477:9;38959:18:::1;51477:9:::0;38959:7:::1;:18::i;:::-;38951:52;;;;-1:-1:-1::0;;;38951:52:0::1;;;;;;;:::i;:::-;51521:19:::2;::::0;;;:8:::2;:19;::::0;;;;:30:::2;;::::0;::::2;::::0;::::2;-1:-1:-1::0;;;;;51521:30:0::2;51555:10;51521:44;::::0;:89:::2;;-1:-1:-1::0;51569:19:0::2;::::0;;;:8:::2;:19;::::0;;;;:27:::2;;::::0;-1:-1:-1;;;;;51569:27:0::2;51600:10;51569:41;51521:89;51499:187;;;;-1:-1:-1::0;;;51499:187:0::2;;;;;;;:::i;:::-;51727:19;::::0;;;:8:::2;:19;::::0;;;;:32:::2;;::::0;51719:46;51697:135:::2;;;;-1:-1:-1::0;;;51697:135:0::2;;;;;;;:::i;:::-;51843:25;51858:9;51843:14;:25::i;:::-;-1:-1:-1::0;;10667:1:0;11629:7;:22;51390:486::o;42423:336::-;42517:9;38959:18;38967:9;38959:7;:18::i;:::-;38951:52;;;;-1:-1:-1;;;38951:52:0;;;;;;;:::i;:::-;42561:19:::1;::::0;;;:8:::1;:19;::::0;;;;:27:::1;;::::0;-1:-1:-1;;;;;42561:27:0::1;42547:10;:41;42539:77;;;;-1:-1:-1::0;;;42539:77:0::1;;;;;;;:::i;:::-;42635:19;::::0;;;:8:::1;:19;::::0;;;;:32:::1;;::::0;:37;42627:77:::1;;;;-1:-1:-1::0;;;42627:77:0::1;;;;;;;:::i;:::-;42715:36;42731:9;42742:8;42715:15;:36::i;:::-;42423:336:::0;;;:::o;44406:3658::-;44520:9;38959:18;38967:9;38959:7;:18::i;:::-;38951:52;;;;-1:-1:-1;;;38951:52:0;;;;;;;:::i;:::-;10711:1:::1;11317:7;;:19;;11309:63;;;;-1:-1:-1::0;;;11309:63:0::1;;;;;;;:::i;:::-;10711:1;11450:7;:18:::0;;;44594:19;;;:8:::2;:19;::::0;;;;:26:::2;::::0;::::2;::::0;;44639:28;;::::2;::::0;-1:-1:-1;;;;;44594:26:0;;::::2;::::0;-1:-1:-1;;;44639:28:0;::::2;;;44631:76;;;;-1:-1:-1::0;;;44631:76:0::2;;;;;;;:::i;:::-;44729:19;::::0;;;:8:::2;:19;::::0;;;;:29:::2;;::::0;44762:15:::2;-1:-1:-1::0;44729:48:0::2;44720:81;;;;-1:-1:-1::0;;;44720:81:0::2;;;;;;;:::i;:::-;44909:19;::::0;;;:8:::2;:19;::::0;;;;:28:::2;::::0;::::2;::::0;44875:29:::2;::::0;;::::2;::::0;:63:::2;::::0;:33:::2;:63::i;:::-;44844:15;:94;44822:159;;;;-1:-1:-1::0;;;44822:159:0::2;;;;;;;:::i;:::-;45024:19;::::0;;;:8:::2;:19;::::0;;;;;;;:32:::2;::::0;45014:42;::::2;;44992:127;;;;-1:-1:-1::0;;;44992:127:0::2;;;;;;;:::i;:::-;45193:18;::::0;;45162:19:::2;::::0;;;:8:::2;:19;::::0;;;;:26;;::::2;::::0;:50:::2;::::0;:30:::2;:50::i;:::-;45152:6;:60;;45130:167;;;;-1:-1:-1::0;;;45130:167:0::2;;;;;;;:::i;:::-;45449:5;::::0;::::2;45412:19:::0;;;:8:::2;:19;::::0;;;;45449:5;45412:33:::2;::::0;-1:-1:-1;;;;;45412:33:0;;::::2;45449:5:::0;::::2;45412:42;45409:323;;;45520:5;;;;;;;;;-1:-1:-1::0;;;;;45520:5:0::2;-1:-1:-1::0;;;;;45505:36:0::2;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45578:19;::::0;;;:8:::2;:19;::::0;;;;;;:27;45497:156;;-1:-1:-1;;;45497:156:0;;-1:-1:-1;;;;;45497:58:0;;;::::2;::::0;::::2;::::0;:156:::2;::::0;45628:6;;45497:156:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45471:249;;;;-1:-1:-1::0;;;45471:249:0::2;;;;;;;:::i;:::-;45891:19;::::0;;;:8:::2;:19;::::0;;;;:32:::2;;::::0;45888:276:::2;;45945:19;::::0;;;:8:::2;:19;::::0;;;;45980:15:::2;45945:32;::::0;;::::2;:50:::0;45888:276:::2;;;-1:-1:-1::0;;;;;46016:24:0;::::2;::::0;46013:151:::2;;46088:19;::::0;;;:8:::2;:19;::::0;;;;:26:::2;::::0;::::2;::::0;46116:35:::2;::::0;;::::2;::::0;46057:95:::2;::::0;46076:10;;-1:-1:-1;;;;;46116:35:0::2;46057:18;:95::i;:::-;46203:19;::::0;;;:8:::2;:19;::::0;;;;:35:::2;;::::0;46176:63:::2;::::0;46195:6;;-1:-1:-1;;;;;46203:35:0::2;46176:18;:63::i;:::-;46252:19;::::0;;;:8:::2;:19;::::0;;;;:26:::2;::::0;::::2;:35:::0;;;46298:26:::2;::::0;::::2;:39:::0;;-1:-1:-1;;;;;;46298:39:0::2;46327:10;46298:39;::::0;;;46832:10;46747:28:::2;::::0;::::2;::::0;46713:29:::2;::::0;;::::2;::::0;46832:10;;46713:116:::2;::::0;46799:15:::2;::::0;46713:63:::2;::::0;:29;:33:::2;:63::i;:::-;:67:::0;::::2;:116::i;:::-;:129;46695:812;;;47252:19;47274::::0;;;:8:::2;:19;::::0;;;;:28:::2;::::0;::::2;::::0;47396:29:::2;::::0;;::::2;::::0;47365:100:::2;::::0;47381:83:::2;::::0;47396:67:::2;::::0;47447:15:::2;::::0;47396:46:::2;::::0;47274:28;47396:33:::2;:46::i;:67::-;47381:10;::::0;;:14:::2;:83::i;:::-;47365:11:::0;;:15:::2;:100::i;:::-;47317:19;::::0;;;:8:::2;:19;::::0;;;;:28:::2;;:148:::0;-1:-1:-1;47491:4:0::2;::::0;-1:-1:-1;46695:812:0::2;47615:19;::::0;;;:8:::2;:19;::::0;;;;;;:33:::2;::::0;::::2;::::0;47573:27;;47524:263;;-1:-1:-1;;;;;47615:33:0;;::::2;::::0;47573:27;47624:9;;47524:263:::2;::::0;::::2;::::0;47663:10:::2;::::0;47688:6;;47709:24;;::::2;::::0;;47768:8;;47524:263:::2;:::i;:::-;;;;;;;;47804:8;47800:257;;;47950:19;::::0;;;:8:::2;:19;::::0;;;;;;:33:::2;::::0;::::2;::::0;47904:27;;48002:28:::2;::::0;;::::2;::::0;47834:211;;-1:-1:-1;;;;;47950:33:0;;::::2;::::0;47959:9;;47834:211:::2;::::0;::::2;::::0;::::2;:::i;:::-;;;;;;;;47800:257;-1:-1:-1::0;;10667:1:0::1;11629:7;:22:::0;-1:-1:-1;;;44406:3658:0:o;48391:2844::-;48462:9;38959:18;38967:9;38959:7;:18::i;:::-;38951:52;;;;-1:-1:-1;;;38951:52:0;;;;;;;:::i;:::-;10711:1:::1;11317:7;;:19;;11309:63;;;;-1:-1:-1::0;;;11309:63:0::1;;;;;;;:::i;:::-;10711:1;11450:7;:18:::0;;;48527:19;;;:8:::2;:19;::::0;;;;:32:::2;;::::0;48497:116:::2;;;;-1:-1:-1::0;;;48497:116:0::2;;;;;;;:::i;:::-;48712:19;::::0;;;:8:::2;:19;::::0;;;;:28:::2;::::0;::::2;::::0;48678:29:::2;::::0;;::::2;::::0;:63:::2;::::0;:33:::2;:63::i;:::-;48646:15;:95;;48624:169;;;;-1:-1:-1::0;;;48624:169:0::2;;;;;;;:::i;:::-;48806:16;48825:19:::0;;;:8:::2;:19;::::0;;;;:35:::2;;::::0;-1:-1:-1;;;;;48825:35:0::2;:49:::0;:101:::2;;48891:19;::::0;;;:8:::2;:19;::::0;;;;:35:::2;;::::0;-1:-1:-1;;;;;48891:35:0::2;48825:101;;;48877:11;::::0;-1:-1:-1;;;;;48877:11:0::2;48825:101;48937:18;48999:19:::0;;;:8:::2;:19;::::0;;;;:26:::2;::::0;::::2;::::0;49078:5:::2;::::0;;49041:33;;::::2;::::0;48806:120;;-1:-1:-1;48937:18:0;;-1:-1:-1;;;;;49041:33:0;;::::2;49078:5:::0;::::2;49041:42;49038:1018;;;49179:12;49193:23:::0;49220:39:::2;49249:9;49220:28;:39::i;:::-;49178:81:::0;-1:-1:-1;49178:81:0;-1:-1:-1;49178:81:0;;-1:-1:-1;49337:4:0::2;49326:15:::0;::::2;;;49323:235;;49381:19;::::0;;;:8:::2;:19;::::0;;;;:26:::2;::::0;::::2;::::0;49409::::2;::::0;::::2;::::0;49437:35:::2;::::0;;::::2;::::0;49362:111:::2;::::0;-1:-1:-1;;;;;49381:26:0;;::::2;::::0;49409;;49437:35:::2;49362:18;:111::i;:::-;49492:25;49507:9;49492:14;:25::i;:::-;49536:7;;;;;;;49323:235;49038:1018;;;;;49697:19;::::0;;;:8:::2;:19;::::0;;;;;;:33:::2;::::0;::::2;::::0;49764:26:::2;::::0;::::2;::::0;49792:27;;49689:131;;-1:-1:-1;;;49689:131:0;;-1:-1:-1;;;;;49697:33:0;;::::2;::::0;49689:59:::2;::::0;:131:::2;::::0;49757:4:::2;::::0;49764:26;::::2;::::0;49792:27;49689:131:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;49685:360;;49868:19;::::0;;;:8:::2;:19;::::0;;;;:26:::2;::::0;::::2;::::0;49896::::2;::::0;::::2;::::0;49924:35:::2;::::0;;::::2;::::0;49849:111:::2;::::0;-1:-1:-1;;;;;49868:26:0;;::::2;::::0;49896;;49924:35:::2;49849:18;:111::i;:::-;49979:25;49994:9;49979:14;:25::i;:::-;50023:7;;;;;49685:360;50112:1;50073:19:::0;;;:8:::2;:19;::::0;;;;:27:::2;;::::0;-1:-1:-1;;;;;50073:27:0::2;:41:::0;50070:334:::2;;50165:19;::::0;;;:8:::2;:19;::::0;;;;:40:::2;;::::0;50144:71:::2;::::0;50211:3:::2;::::0;50144:62:::2;::::0;:16;;50165:40:::2;;50144:20;:62::i;:::-;:66:::0;::::2;:71::i;:::-;50131:84:::0;-1:-1:-1;50249:32:0::2;:16:::0;50131:84;50249:20:::2;:32::i;:::-;50315:19;::::0;;;:8:::2;:19;::::0;;;;:27:::2;::::0;::::2;::::0;50356:35:::2;::::0;;::::2;::::0;50230:51;;-1:-1:-1;50296:96:0::2;::::0;-1:-1:-1;;;;;50315:27:0;;::::2;::::0;50344:10;;50356:35:::2;50296:18;:96::i;:::-;50444:19;::::0;;;:8:::2;:19;::::0;;;;;;;;:30:::2;;::::0;50426:5:::2;::::0;50419:21;;-1:-1:-1;;;50419:21:0;;;;50444:30:::2;::::0;;::::2;-1:-1:-1::0;;;;;50444:30:0;;::::2;::::0;50426:5;::::2;::::0;50419:19:::2;::::0;:21:::2;::::0;;::::2;::::0;;;;;;50426:5;50419:21;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;50419:55:0::2;;:114;;;-1:-1:-1::0;50485:5:0::2;::::0;::::2;50502:19:::0;;;:8:::2;:19;::::0;;;;;;:30:::2;;::::0;50478:55;;-1:-1:-1;;;50478:55:0;;-1:-1:-1;;;;;50485:5:0;;::::2;::::0;50478:23:::2;::::0;:55:::2;::::0;50485:5:::2;50502:30:::0;;::::2;::::0;;::::2;::::0;50478:55:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50416:413;;;50575:5;::::0;50568:35:::2;::::0;;-1:-1:-1;;;50568:35:0;;;;50549:110:::2;::::0;-1:-1:-1;;;;;50575:5:0::2;::::0;50568:33:::2;::::0;:35:::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;;50575:5;50568:35;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50623:19;::::0;;;:8:::2;:19;::::0;;;;:35:::2;;::::0;50605:16;;-1:-1:-1;;;;;50623:35:0::2;50549:18;:110::i;:::-;50416:413;;;50731:19;::::0;;;:8:::2;:19;::::0;;;;:30:::2;::::0;::::2;::::0;50781:35:::2;::::0;;::::2;::::0;50712:105:::2;::::0;-1:-1:-1;;;;;50731:30:0::2;::::0;;::::2;::::0;::::2;::::0;50763:16;;50781:35:::2;50712:18;:105::i;:::-;50939:19;::::0;;;:8:::2;:19;::::0;;;;;;:33:::2;::::0;::::2;::::0;50897:27;;50987:30:::2;::::0;::::2;::::0;51032:27:::2;::::0;::::2;::::0;51074:26:::2;::::0;;::::2;::::0;50846:344;;-1:-1:-1;;;;;50939:33:0;;::::2;::::0;50897:27;;50948:9;;50846:344:::2;::::0;::::2;::::0;50939:33:::2;50987:30:::0;::::2;::::0;::::2;::::0;51032:27;;::::2;::::0;51074:26;::::2;::::0;51115:16;;51146:10;;51171:8;;50846:344:::2;:::i;:::-;;;;;;;;-1:-1:-1::0;;;51208:19:0::2;::::0;;;:8:::2;:19;::::0;;;;;;51201:26;;;::::2;::::0;::::2;::::0;;-1:-1:-1;;;;;;51201:26:0;;;;;;::::2;::::0;::::2;::::0;;;::::2;::::0;::::2;::::0;;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;;;::::2;::::0;::::2;::::0;;;;;;;;::::2;::::0;::::2;::::0;;-1:-1:-1;;;;;;51201:26:0;;::::2;::::0;;;::::2;::::0;::::2;::::0;;;::::2;::::0;;::::2;::::0;::::2;::::0;;;;::::2;::::0;;::::2;;::::0;-1:-1:-1;;10667:1:0::1;11629:7;:22:::0;48391:2844::o;43331:758::-;43435:9;38959:18;38967:9;38959:7;:18::i;:::-;38951:52;;;;-1:-1:-1;;;38951:52:0;;;;;;;:::i;:::-;43479:19:::1;::::0;;;:8:::1;:19;::::0;;;;:27:::1;;::::0;-1:-1:-1;;;;;43479:27:0::1;43465:10;:41;::::0;:89:::1;;-1:-1:-1::0;43524:19:0::1;::::0;;;:8:::1;:19;::::0;;;;:30:::1;;::::0;::::1;::::0;::::1;-1:-1:-1::0;;;;;43524:30:0::1;43510:10;:44;43465:89;43457:140;;;;-1:-1:-1::0;;;43457:140:0::1;;;;;;;:::i;:::-;43616:19;::::0;;;:8:::1;:19;::::0;;;;:32:::1;;::::0;:37;43608:77:::1;;;;-1:-1:-1::0;;;43608:77:0::1;;;;;;;:::i;:::-;43704:19;::::0;;;:8:::1;:19;::::0;;;;:29:::1;;::::0;43736:15:::1;-1:-1:-1::0;43696:93:0::1;;;;-1:-1:-1::0;;;43696:93:0::1;;;;;;;:::i;:::-;43825:15;43809:12;:31;;43800:98;;;;-1:-1:-1::0;;;43800:98:0::1;;;;;;;:::i;:::-;43909:19;::::0;;;:8:::1;:19;::::0;;;;;;:29:::1;::::0;::::1;:44:::0;;;44033:33:::1;::::0;::::1;::::0;44004:27;;43971:110;;-1:-1:-1;;;;;44033:33:0;;::::1;::::0;44004:27;43918:9;;43971:110:::1;::::0;::::1;::::0;43941:12;;43971:110:::1;:::i;38185:25::-:0;;;;:::o;24791:114::-;24883:14;;24791:114::o;24913:181::-;25067:19;;25085:1;25067:19;;;24913:181::o;54358:249::-;54437:19;;;;:8;:19;;;;;;;:28;;;:39;;-1:-1:-1;;;;54437:39:0;-1:-1:-1;;;54437:39:0;;;;;;;;;54526:27;;54492:107;;-1:-1:-1;;;;;54555:33:0;;;;54526:27;54437:19;;54492:107;;;;54437:39;;54492:107;:::i;:::-;;;;;;;;54358:249;;:::o;54615:134::-;54673:4;54697:19;;;:8;:19;;;;;:30;;;;;;-1:-1:-1;;;;;54697:30:0;:44;;;54615:134::o;53945:405::-;54008:18;54029:19;;;:8;:19;;;;;;;:30;;;;;54078:33;;;54157:27;;54070:115;;-1:-1:-1;;;54070:115:0;;54029:30;;;;-1:-1:-1;;;;;54029:30:0;;;;54078:33;;;54070:59;;:115;;54138:4;;54029:30;;54157:27;54070:115;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;54259:19:0;;;;:8;:19;;;;;;;:33;;;;54230:27;;54203:102;;-1:-1:-1;;;;;54259:33:0;;;;-1:-1:-1;54268:9:0;;54203:102;;;;54294:10;;54203:102;:::i;:::-;;;;;;;;-1:-1:-1;54323:19:0;;;;:8;:19;;;;;;;54316:26;;;;;;;;-1:-1:-1;;;;;;54316:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;54316:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;53945:405::o;369:181::-;427:7;459:5;;;483:6;;;;475:46;;;;-1:-1:-1;;;475:46:0;;;;;;;:::i;:::-;541:1;-1:-1:-1;369:181:0;;;;;:::o;53099:655::-;-1:-1:-1;;;;;53306:22:0;;53303:444;;53351:11;;;53345:35;;-1:-1:-1;;;53345:35:0;;-1:-1:-1;;;;;53351:11:0;;;;53345:27;;:35;;53373:6;;53345:35;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53491:28;53508:2;53512:6;53491:16;:28::i;:::-;53487:175;;53546:11;;;53540:43;;;-1:-1:-1;;;53540:43:0;;;;-1:-1:-1;;;;;53546:11:0;;;;53540:26;;53574:6;;53540:43;;;;53546:11;;53540:43;;;;;;53574:6;53546:11;53540:43;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;53609:11:0;;53602:44;;-1:-1:-1;;;;;;53609:11:0;;-1:-1:-1;53635:2:0;;-1:-1:-1;53639:6:0;53602:32;:44::i;:::-;53303:444;;;53694:41;-1:-1:-1;;;;;53694:29:0;;53724:2;53728:6;53694:29;:41::i;52060:1031::-;-1:-1:-1;;;;;52242:22:0;;52239:845;;52302:6;52289:9;:19;52281:82;;;;-1:-1:-1;;;52281:82:0;;;;;;;:::i;:::-;52384:11;;;52378:43;;;-1:-1:-1;;;52378:43:0;;;;-1:-1:-1;;;;;52384:11:0;;;;52378:26;;52412:6;;52378:43;;;;52384:11;;52378:43;;;;;;52412:6;52384:11;52378:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52239:845;;;52781:30;;-1:-1:-1;;;52781:30:0;;52733:8;;52711:12;;-1:-1:-1;;;;;52781:15:0;;;;;:30;;52805:4;;52781:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52757:54;-1:-1:-1;52826:57:0;-1:-1:-1;;;;;52826:22:0;;52849:10;52869:4;52876:6;52826:22;:57::i;:::-;52921:30;;-1:-1:-1;;;52921:30:0;;52898:20;;-1:-1:-1;;;;;52921:15:0;;;;;:30;;52945:4;;52921:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52898:53;-1:-1:-1;52898:53:0;52974:25;:13;52992:6;52974:17;:25::i;:::-;:41;52966:106;;;;-1:-1:-1;;;52966:106:0;;;;;;;:::i;:::-;52239:845;;;;52060:1031;;:::o;833:136::-;891:7;918:43;922:1;925;918:43;;;;;;;;;;;;;;;;;:3;:43::i;54757:1317::-;54832:4;54877:19;;;:8;:19;;;;;:35;;;54832:4;;;;-1:-1:-1;;;;;54877:35:0;:49;:101;;54943:19;;;;:8;:19;;;;;:35;;;-1:-1:-1;;;;;54943:35:0;54877:101;;;54929:11;;-1:-1:-1;;;;;54929:11:0;54877:101;54858:120;;54991:22;;:::i;:::-;-1:-1:-1;55016:237:0;;;;;;;;-1:-1:-1;55051:19:0;;;:8;:19;;;;;;;:26;;;;55016:237;;-1:-1:-1;;;;;55016:237:0;;;;;;;;;55141:4;55016:237;;;;55172:19;;;;;;:26;;;;;;;55016:237;;;;55226:15;;;;;;;;;;55016:237;;;;55306:5;;55291:38;;-1:-1:-1;;;55291:38:0;;;;55016:237;;;;55266:24;;55306:5;;;;;55291:36;;:38;;;;;55051:19;;55291:38;;;;;;;;;55306:5;55291:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55331:10;;55266:76;;-1:-1:-1;;;;;;55266:76:0;;;;;;;;;;55331:10;55266:76;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;55360:5:0;;;55374:19;;;:8;:19;;;;;;;:27;55353:54;;-1:-1:-1;;;55353:54:0;;-1:-1:-1;;;;;55360:5:0;;;;55353:20;;:54;;55403:3;;55353:54;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;55442:41:0;;-1:-1:-1;;;55442:41:0;;55418:21;;-1:-1:-1;;;;;;55442:26:0;;;-1:-1:-1;55442:26:0;;:41;;55477:4;;55442:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55505:5;;;55522:19;;;:8;:19;;;;;;;:27;55498:57;;-1:-1:-1;;;55498:57:0;;55418:65;;-1:-1:-1;;;;;;55505:5:0;;;;55498:23;;:57;;55551:3;;55498:57;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55494:300;;55705:5;;;55722:19;;;:8;:19;;;;;;;:27;55690:60;;-1:-1:-1;;;55690:60:0;;-1:-1:-1;;;;;55705:5:0;;;;55690:31;;:60;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55773:5;55780:1;55765:17;;;;;;;;;55494:300;55831:41;;-1:-1:-1;;;55831:41:0;;55808:20;;-1:-1:-1;;;;;55831:26:0;;;;;:41;;55866:4;;55831:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55808:64;-1:-1:-1;56028:4:0;56034:31;55808:64;56051:13;56034:16;:31::i;:::-;56020:46;;;;;;;;54757:1317;;;;:::o;1723:471::-;1781:7;2026:6;2022:47;;-1:-1:-1;2056:1:0;2049:8;;2022:47;2093:5;;;2097:1;2093;:5;:1;2117:5;;;;;:10;2109:56;;;;-1:-1:-1;;;2109:56:0;;;;;;;:::i;2670:132::-;2728:7;2755:39;2759:1;2762;2755:39;;;;;;;;;;;;;;;;;:3;:39::i;53762:175::-;53891:12;;;53833:4;53891:12;;;;;;;;;;53833:4;;;-1:-1:-1;;;;;53869:7:0;;;53884:5;;53869:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53850:54:0;;53762:175;-1:-1:-1;;;;;53762:175:0:o;21270:177::-;21353:86;21373:5;21403:23;;;21428:2;21432:5;21380:58;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;21380:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;21380:58:0;-1:-1:-1;;;;;;21380:58:0;;;;;;;;;;21353:19;:86::i;21455:205::-;21556:96;21576:5;21606:27;;;21635:4;21641:2;21645:5;21583:68;;;;;;;;;;:::i;21556:96::-;21455:205;;;;:::o;1272:192::-;1358:7;1394:12;1386:6;;;;1378:29;;;;-1:-1:-1;;;1378:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;1430:5:0;;;1272:192;;;;;;:::o;3298:278::-;3384:7;3419:12;3412:5;3404:28;;;;-1:-1:-1;;;3404:28:0;;;;;;;;:::i;:::-;;3443:9;3459:1;3455;:5;;;;;;;3298:278;-1:-1:-1;;;;;3298:278:0:o;23575:761::-;23999:23;24025:69;24053:4;24025:69;;;;;;;;;;;;;;;;;24033:5;-1:-1:-1;;;;;24025:27:0;;;:69;;;;;:::i;:::-;24109:17;;23999:95;;-1:-1:-1;24109:21:0;24105:224;;24251:10;24240:30;;;;;;;;;;;;:::i;:::-;24232:85;;;;-1:-1:-1;;;24232:85:0;;;;;;;:::i;17839:195::-;17942:12;17974:52;17996:6;18004:4;18010:1;18013:12;17974:21;:52::i;:::-;17967:59;17839:195;-1:-1:-1;;;;17839:195:0:o;18891:530::-;19018:12;19076:5;19051:21;:30;;19043:81;;;;-1:-1:-1;;;19043:81:0;;;;;;;:::i;:::-;19143:18;19154:6;19143:10;:18::i;:::-;19135:60;;;;-1:-1:-1;;;19135:60:0;;;;;;;:::i;:::-;19269:12;19283:23;19310:6;-1:-1:-1;;;;;19310:11:0;19330:5;19338:4;19310:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19268:75;;;;19361:52;19379:7;19388:10;19400:12;19361:17;:52::i;:::-;19354:59;18891:530;-1:-1:-1;;;;;;;18891:530:0:o;14921:422::-;15288:20;15327:8;;;14921:422::o;20427:742::-;20542:12;20571:7;20567:595;;;-1:-1:-1;20602:10:0;20595:17;;20567:595;20716:17;;:21;20712:439;;20979:10;20973:17;21040:15;21027:10;21023:2;21019:19;21012:44;20927:148;21122:12;21115:20;;-1:-1:-1;;;21115:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;:::o;1113:263::-;;1228:2;1216:9;1207:7;1203:23;1199:32;1196:2;;;-1:-1;;1234:12;1196:2;226:6;220:13;238:33;265:5;238:33;:::i;1383:257::-;;1495:2;1483:9;1474:7;1470:23;1466:32;1463:2;;;-1:-1;;1501:12;1463:2;648:6;642:13;660:30;684:5;660:30;:::i;1647:241::-;;1751:2;1739:9;1730:7;1726:23;1722:32;1719:2;;;-1:-1;;1757:12;1719:2;-1:-1;769:20;;1713:175;-1:-1;1713:175::o;1895:263::-;;2010:2;1998:9;1989:7;1985:23;1981:32;1978:2;;;-1:-1;;2016:12;1978:2;-1:-1;917:13;;1972:186;-1:-1;1972:186::o;2165:1133::-;;;;;;;;;2394:3;2382:9;2373:7;2369:23;2365:33;2362:2;;;-1:-1;;2401:12;2362:2;782:6;769:20;2453:63;;2553:2;2596:9;2592:22;72:20;97:33;124:5;97:33;:::i;:::-;2561:63;-1:-1;2661:2;2700:22;;769:20;;-1:-1;2769:2;2808:22;;769:20;;-1:-1;2877:3;2925:22;;358:20;383:41;358:20;383:41;:::i;:::-;2886:71;-1:-1;2994:3;3032:22;;1045:20;42359:4;42348:16;;43700:33;;43690:2;;-1:-1;;43737:12;43690:2;3003:61;-1:-1;3101:3;3141:22;;72:20;97:33;72:20;97:33;:::i;:::-;3110:63;;;;3210:3;3254:9;3250:22;769:20;3219:63;;2356:942;;;;;;;;;;;:::o;3305:360::-;;;3423:2;3411:9;3402:7;3398:23;3394:32;3391:2;;;-1:-1;;3429:12;3391:2;782:6;769:20;3481:63;;3581:2;3621:9;3617:22;500:20;525:30;549:5;525:30;:::i;:::-;3589:60;;;;3385:280;;;;;:::o;3672:366::-;;;3793:2;3781:9;3772:7;3768:23;3764:32;3761:2;;;-1:-1;;3799:12;3761:2;-1:-1;;769:20;;;3951:2;3990:22;;;769:20;;-1:-1;3755:283::o;4194:137::-;-1:-1;;;;;42143:54;4281:45;;4275:56::o;18901:271::-;;4956:5;41139:12;5067:52;5112:6;5107:3;5100:4;5093:5;5089:16;5067:52;:::i;:::-;5131:16;;;;;19035:137;-1:-1;;19035:137::o;19179:222::-;-1:-1;;;;;42143:54;;;;4281:45;;19306:2;19291:18;;19277:124::o;19653:476::-;-1:-1;;;;;42143:54;;;4124:58;;42143:54;;;;20032:2;20017:18;;4124:58;20115:2;20100:18;;18618:37;;;;19852:2;19837:18;;19823:306::o;20603:548::-;-1:-1;;;;;42143:54;;;;4124:58;;20983:2;20968:18;;18618:37;;;;41904:13;41897:21;21060:2;21045:18;;4633:34;41904:13;41897:21;21137:2;21122:18;;4633:34;20810:3;20795:19;;20781:370::o;21158:812::-;-1:-1;;;;;42143:54;;;4281:45;;42143:54;;;21614:2;21599:18;;4124:58;42143:54;;;21705:2;21690:18;;4124:58;21788:2;21773:18;;18618:37;;;;21871:3;21856:19;;18618:37;42143:54;;;42154:42;21940:19;;4281:45;21441:3;21426:19;;21412:558::o;22895:333::-;-1:-1;;;;;42143:54;;;;4281:45;;23214:2;23199:18;;18618:37;23050:2;23035:18;;23021:207::o;23235:210::-;41904:13;;41897:21;4633:34;;23356:2;23341:18;;23327:118::o;23452:218::-;-1:-1;;;;;;41991:78;;;;4748:36;;23577:2;23562:18;;23548:122::o;23677:310::-;;23824:2;23845:17;23838:47;5304:5;41139:12;41578:6;23824:2;23813:9;23809:18;41566:19;5398:52;5443:6;41606:14;23813:9;41606:14;23824:2;5424:5;5420:16;5398:52;:::i;:::-;43116:7;43100:14;-1:-1;;43096:28;5462:39;;;;41606:14;5462:39;;23795:192;-1:-1;;23795:192::o;23994:416::-;24194:2;24208:47;;;5738:2;24179:18;;;41566:19;5774:33;41606:14;;;5754:54;5827:12;;;24165:245::o;24417:416::-;24617:2;24631:47;;;6078:2;24602:18;;;41566:19;6114:34;41606:14;;;6094:55;-1:-1;;;6169:12;;;6162:31;6212:12;;;24588:245::o;24840:416::-;25040:2;25054:47;;;6463:2;25025:18;;;41566:19;6499:25;41606:14;;;6479:46;6544:12;;;25011:245::o;25263:416::-;25463:2;25477:47;;;6795:2;25448:18;;;41566:19;6831:34;41606:14;;;6811:55;-1:-1;;;6886:12;;;6879:31;6929:12;;;25434:245::o;25686:416::-;25886:2;25900:47;;;7180:2;25871:18;;;41566:19;-1:-1;;;41606:14;;;7196:44;7259:12;;;25857:245::o;26109:416::-;26309:2;26323:47;;;7510:2;26294:18;;;41566:19;7546:29;41606:14;;;7526:50;7595:12;;;26280:245::o;26532:416::-;26732:2;26746:47;;;7846:2;26717:18;;;41566:19;7882:34;41606:14;;;7862:55;7951:27;7937:12;;;7930:49;7998:12;;;26703:245::o;26955:416::-;27155:2;27169:47;;;8249:2;27140:18;;;41566:19;8285:34;41606:14;;;8265:55;-1:-1;;;8340:12;;;8333:30;8382:12;;;27126:245::o;27378:416::-;27578:2;27592:47;;;8633:2;27563:18;;;41566:19;-1:-1;;;41606:14;;;8649:43;8711:12;;;27549:245::o;27801:416::-;28001:2;28015:47;;;8962:2;27986:18;;;41566:19;8998:34;41606:14;;;8978:55;-1:-1;;;9053:12;;;9046:40;9105:12;;;27972:245::o;28224:416::-;28424:2;28438:47;;;9356:2;28409:18;;;41566:19;9392:33;41606:14;;;9372:54;9445:12;;;28395:245::o;28647:416::-;28847:2;28861:47;;;9696:2;28832:18;;;41566:19;9732:34;41606:14;;;9712:55;-1:-1;;;9787:12;;;9780:27;9826:12;;;28818:245::o;29070:416::-;29270:2;29284:47;;;10077:2;29255:18;;;41566:19;10113:34;41606:14;;;10093:55;-1:-1;;;10168:12;;;10161:25;10205:12;;;29241:245::o;29493:416::-;29693:2;29707:47;;;10456:2;29678:18;;;41566:19;10492:29;41606:14;;;10472:50;10541:12;;;29664:245::o;29916:416::-;30116:2;30130:47;;;10792:2;30101:18;;;41566:19;10828:26;41606:14;;;10808:47;10874:12;;;30087:245::o;30339:416::-;30539:2;30553:47;;;11125:2;30524:18;;;41566:19;11161:34;41606:14;;;11141:55;-1:-1;;;11216:12;;;11209:25;11253:12;;;30510:245::o;30762:416::-;30962:2;30976:47;;;11504:2;30947:18;;;41566:19;-1:-1;;;41606:14;;;11520:44;11583:12;;;30933:245::o;31185:416::-;31385:2;31399:47;;;11834:2;31370:18;;;41566:19;11870:34;41606:14;;;11850:55;-1:-1;;;11925:12;;;11918:42;11979:12;;;31356:245::o;31608:416::-;31808:2;31822:47;;;12230:2;31793:18;;;41566:19;12266:34;41606:14;;;12246:55;12335:25;12321:12;;;12314:47;12380:12;;;31779:245::o;32031:416::-;32231:2;32245:47;;;12631:2;32216:18;;;41566:19;12667:34;41606:14;;;12647:55;-1:-1;;;12722:12;;;12715:30;12764:12;;;32202:245::o;32454:416::-;32654:2;32668:47;;;13015:2;32639:18;;;41566:19;13051:27;41606:14;;;13031:48;13098:12;;;32625:245::o;32877:416::-;33077:2;33091:47;;;13349:2;33062:18;;;41566:19;13385:34;41606:14;;;13365:55;-1:-1;;;13440:12;;;13433:46;13498:12;;;33048:245::o;33300:416::-;33500:2;33514:47;;;13749:2;33485:18;;;41566:19;13785:31;41606:14;;;13765:52;13836:12;;;33471:245::o;33723:416::-;33923:2;33937:47;;;14087:2;33908:18;;;41566:19;14123:34;41606:14;;;14103:55;-1:-1;;;14178:12;;;14171:34;14224:12;;;33894:245::o;34146:416::-;34346:2;34360:47;;;14475:2;34331:18;;;41566:19;14511:26;41606:14;;;14491:47;14557:12;;;34317:245::o;34569:416::-;34769:2;34783:47;;;14808:2;34754:18;;;41566:19;14844:34;41606:14;;;14824:55;-1:-1;;;14899:12;;;14892:34;14945:12;;;34740:245::o;34992:416::-;35192:2;35206:47;;;15196:2;35177:18;;;41566:19;15232:34;41606:14;;;15212:55;-1:-1;;;15287:12;;;15280:37;15336:12;;;35163:245::o;35415:416::-;35615:2;35629:47;;;15587:2;35600:18;;;41566:19;15623:33;41606:14;;;15603:54;15676:12;;;35586:245::o;35838:416::-;36038:2;36052:47;;;15927:2;36023:18;;;41566:19;-1:-1;;;41606:14;;;15943:38;16000:12;;;36009:245::o;36261:416::-;36461:2;36475:47;;;16251:2;36446:18;;;41566:19;-1:-1;;;41606:14;;;16267:43;16329:12;;;36432:245::o;36684:416::-;36884:2;36898:47;;;16580:2;36869:18;;;41566:19;16616:34;41606:14;;;16596:55;-1:-1;;;16671:12;;;16664:39;16722:12;;;36855:245::o;37107:416::-;37307:2;37321:47;;;16973:2;37292:18;;;41566:19;17009:34;41606:14;;;16989:55;-1:-1;;;17064:12;;;17057:44;17120:12;;;37278:245::o;37530:222::-;18618:37;;;37657:2;37642:18;;37628:124::o;37759:1614::-;18618:37;;;-1:-1;;;;;42143:54;;;38412:2;38397:18;;4281:45;41904:13;;41897:21;38489:2;38474:18;;4633:34;38572:2;38557:18;;18618:37;;;38655:3;38640:19;;18618:37;;;42154:42;38724:19;;18618:37;;;38823:3;38808:19;;18618:37;;;42359:4;42348:16;;38903:3;38888:19;;18854:35;42143:54;;38987:3;38972:19;;4281:45;38247:3;38232:19;;39003:89;39087:3;39072:19;;39063:6;39003:89;:::i;:::-;39103:90;39188:3;39177:9;39173:19;39163:7;39103:90;:::i;:::-;39204:74;39273:3;39262:9;39258:19;39248:7;39204:74;:::i;:::-;18648:5;39358:3;39347:9;39343:19;18618:37;38218:1155;;;;;;;;;;;;;;;;:::o;39380:418::-;18618:37;;;17396:23;;39784:2;39769:18;;;18618:37;;;;17560:16;;17554:23;-1:-1;;;;;42143:54;;;17631:14;;;;4281:45;;;;17716:16;;17710:23;42143:54;;17787:14;;;;4281:45;;;;17875:16;;17869:23;42143:54;17946:14;;;;4281:45;;;;18036:16;18030:23;18437;42154:42;18151:14;;18618:37;39577:3;39562:19;;39548:250::o;39805:333::-;18618:37;;;40124:2;40109:18;;18618:37;39960:2;39945:18;;39931:207::o;40145:900::-;18618:37;;;40609:2;40594:18;;18618:37;;;;-1:-1;;;;;42143:54;;;40692:2;40677:18;;4281:45;42143:54;;;40783:2;40768:18;;4124:58;42359:4;42348:16;40862:3;40847:19;;18854:35;42143:54;42154:42;40931:19;;4281:45;41030:3;41015:19;;18618:37;40444:3;40429:19;;40415:630::o;42756:268::-;42821:1;42828:101;42842:6;42839:1;42836:13;42828:101;;;42909:11;;;42903:18;42890:11;;;42883:39;42864:2;42857:10;42828:101;;;42944:6;42941:1;42938:13;42935:2;;;-1:-1;;42821:1;42991:16;;42984:27;42805:219::o;43137:117::-;-1:-1;;;;;42143:54;;43196:35;;43186:2;;43245:1;;43235:12;43186:2;43180:74;:::o;43401:111::-;43482:5;41904:13;41897:21;43460:5;43457:32;43447:2;;43503:1;;43493:12

Swarm Source

ipfs://921cf9b85d153789660eae2a51c127a82cc503d25ce1c93708ae688bcfd49c34

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.