ETH Price: $3,338.42 (-0.04%)
 

Overview

ETH Balance

1.54753 ETH

Eth Value

$5,166.31 (@ $3,338.42/ETH)
Transaction Hash
Method
Block
From
To
Create Market It...215521132025-01-04 15:48:4722 days ago1736005727IN
0x11ce3c5E...a4863A90c
0 ETH0.0032734417.01868709
Create Market It...215050172024-12-29 2:03:3528 days ago1735437815IN
0x11ce3c5E...a4863A90c
0 ETH0.001187675.39724811
Create Market It...214812312024-12-25 18:19:2332 days ago1735150763IN
0x11ce3c5E...a4863A90c
0 ETH0.001116245.52784341
Cancel Market It...214812182024-12-25 18:16:4732 days ago1735150607IN
0x11ce3c5E...a4863A90c
0 ETH0.000467175.5234073
Cancel Market It...214769972024-12-25 4:07:3532 days ago1735099655IN
0x11ce3c5E...a4863A90c
0 ETH0.000353933.48079044
Create Market It...214745572024-12-24 19:56:5932 days ago1735070219IN
0x11ce3c5E...a4863A90c
0 ETH0.00113445.61807783
Create Market It...214690022024-12-24 1:18:2333 days ago1735003103IN
0x11ce3c5E...a4863A90c
0 ETH0.001624258.04406169
Cancel Market It...214689952024-12-24 1:16:5933 days ago1735003019IN
0x11ce3c5E...a4863A90c
0 ETH0.000714288.44501398
Create Market It...214689792024-12-24 1:13:3533 days ago1735002815IN
0x11ce3c5E...a4863A90c
0 ETH0.001583477.84208683
Create Market It...214614102024-12-22 23:47:3534 days ago1734911255IN
0x11ce3c5E...a4863A90c
0 ETH0.000526684.04489075
Create Market It...214295422024-12-18 12:53:3539 days ago1734526415IN
0x11ce3c5E...a4863A90c
0 ETH0.0032428716.45125899
Cancel Market It...214295302024-12-18 12:51:1139 days ago1734526271IN
0x11ce3c5E...a4863A90c
0 ETH0.001355416.02496775
Create Market It...214286462024-12-18 9:53:1139 days ago1734515591IN
0x11ce3c5E...a4863A90c
0 ETH0.0026501813.44368273
Create Market It...214286242024-12-18 9:48:4739 days ago1734515327IN
0x11ce3c5E...a4863A90c
0 ETH0.002308211.7103387
Create Market It...214190552024-12-17 1:45:4740 days ago1734399947IN
0x11ce3c5E...a4863A90c
0 ETH0.001575367.80193579
Create Market It...213059382024-12-01 6:42:2356 days ago1733035343IN
0x11ce3c5E...a4863A90c
0 ETH0.0022104210.94705374
Create Market It...213059342024-12-01 6:41:3556 days ago1733035295IN
0x11ce3c5E...a4863A90c
0 ETH0.0020893110.34724718
Create Market It...213059332024-12-01 6:41:2356 days ago1733035283IN
0x11ce3c5E...a4863A90c
0 ETH0.0020863510.3331816
Create Market It...213059322024-12-01 6:41:1156 days ago1733035271IN
0x11ce3c5E...a4863A90c
0 ETH0.0021263910.53150042
Create Market It...213059282024-12-01 6:40:2356 days ago1733035223IN
0x11ce3c5E...a4863A90c
0 ETH0.0020749810.27688007
Create Market It...213059262024-12-01 6:39:5956 days ago1733035199IN
0x11ce3c5E...a4863A90c
0 ETH0.0020609710.20747463
Create Market It...213059242024-12-01 6:39:3556 days ago1733035175IN
0x11ce3c5E...a4863A90c
0 ETH0.002074410.27399769
Create Market It...213059202024-12-01 6:38:4756 days ago1733035127IN
0x11ce3c5E...a4863A90c
0 ETH0.0021091910.44633855
Create Market It...213059162024-12-01 6:37:5956 days ago1733035079IN
0x11ce3c5E...a4863A90c
0 ETH0.0021709210.08548264
Create Market It...213058262024-12-01 6:19:5956 days ago1733033999IN
0x11ce3c5E...a4863A90c
0 ETH0.0023555110.94303987
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
209365282024-10-10 16:52:35108 days ago1728579155
0x11ce3c5E...a4863A90c
0.1736 ETH
209365282024-10-10 16:52:35108 days ago1728579155
0x11ce3c5E...a4863A90c
0.6944 ETH
188655032023-12-25 21:46:35397 days ago1703540795
0x11ce3c5E...a4863A90c
0.057 ETH
188654932023-12-25 21:44:35397 days ago1703540675
0x11ce3c5E...a4863A90c
0.057 ETH
172269542023-05-10 2:10:59627 days ago1683684659
0x11ce3c5E...a4863A90c
0.04275 ETH
169166992023-03-27 5:40:23671 days ago1679895623
0x11ce3c5E...a4863A90c
0.057 ETH
169160432023-03-27 3:25:59671 days ago1679887559
0x11ce3c5E...a4863A90c
0.04275 ETH
168069162023-03-11 19:28:35686 days ago1678562915
0x11ce3c5E...a4863A90c
0.2375 ETH
166040952023-02-11 7:41:59715 days ago1676101319
0x11ce3c5E...a4863A90c
0.0475 ETH
164556202023-01-21 13:57:35736 days ago1674309455
0x11ce3c5E...a4863A90c
0.00475 ETH
164556162023-01-21 13:56:47736 days ago1674309407
0x11ce3c5E...a4863A90c
0.00095 ETH
163509792023-01-06 23:18:47750 days ago1673047127
0x11ce3c5E...a4863A90c
0.057 ETH
163363832023-01-04 22:22:11752 days ago1672870931
0x11ce3c5E...a4863A90c
0.04085 ETH
163016582022-12-31 2:06:59757 days ago1672452419
0x11ce3c5E...a4863A90c
0.0475 ETH
160776032022-11-29 19:01:47789 days ago1669748507
0x11ce3c5E...a4863A90c
0.095 ETH
158636632022-10-30 21:47:59818 days ago1667166479
0x11ce3c5E...a4863A90c
0.076 ETH
158575192022-10-30 1:14:11819 days ago1667092451
0x11ce3c5E...a4863A90c
0.06175 ETH
158575162022-10-30 1:13:35819 days ago1667092415
0x11ce3c5E...a4863A90c
0.06175 ETH
158575002022-10-30 1:10:23819 days ago1667092223
0x11ce3c5E...a4863A90c
0.06175 ETH
158574962022-10-30 1:09:35819 days ago1667092175
0x11ce3c5E...a4863A90c
0.06175 ETH
158574922022-10-30 1:08:47819 days ago1667092127
0x11ce3c5E...a4863A90c
0.06175 ETH
158560752022-10-29 20:23:59819 days ago1667075039
0x11ce3c5E...a4863A90c
0.06175 ETH
158560702022-10-29 20:22:59819 days ago1667074979
0x11ce3c5E...a4863A90c
0.095 ETH
158560662022-10-29 20:22:11819 days ago1667074931
0x11ce3c5E...a4863A90c
0.095 ETH
158219872022-10-25 2:03:59824 days ago1666663439
0x11ce3c5E...a4863A90c
0.05 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ShiryoMarket

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-02
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
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);
}

/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256 id,
        uint256 value
    );

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(
        address indexed account,
        address indexed operator,
        bool approved
    );

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id)
        external
        view
        returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator)
        external
        view
        returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
        @dev Handles the receipt of a single ERC1155 token type. This function is
        called at the end of a `safeTransferFrom` after the balance has been updated.
        To accept the transfer, this must return
        `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
        (i.e. 0xf23a6e61, or its own function selector).
        @param operator The address which initiated the transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param id The ID of the token being transferred
        @param value The amount of tokens being transferred
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
    */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
        @dev Handles the receipt of a multiple ERC1155 token types. This function
        is called at the end of a `safeBatchTransferFrom` after the balances have
        been updated. To accept the transfer(s), this must return
        `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
        (i.e. 0xbc197c81, or its own function selector).
        @param operator The address which initiated the batch transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param ids An array containing ids of each token being transferred (order and length must match values array)
        @param values An array containing amounts of each token being transferred (order and length must match ids array)
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
    */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount)
        external
        returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
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;
}

// File: @openzeppelin/contracts/utils/ReentrancyGuard.sol

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
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() {
        _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;
    }
}

// For future use to allow buyers to receive a discount depending on staking or other rules.
interface IDiscountManager {
    function getDiscount(address buyer)
        external
        view
        returns (uint256 discount);
}

contract ShiryoMarket is IERC1155Receiver, ReentrancyGuard {
    using SafeMath for uint256;

    modifier onlyOwner() {
        require(msg.sender == owner);
        _;
    }

     modifier onlyClevel() {
        require(msg.sender == walletA || msg.sender == walletB || msg.sender == owner);
    _;
    }

    address walletA;
    address walletB;
    uint256 walletBPercentage = 20;

    using Counters for Counters.Counter;
    Counters.Counter public _itemIds; // Id for each individual item
    Counters.Counter private _itemsSold; // Number of items sold
    Counters.Counter private _itemsCancelled; // Number of items sold
    Counters.Counter private _offerIds; // Tracking offers

    address payable public owner; // The owner of the market contract
    address public discountManager = address(0x0); // a contract that can be callled to discover if there is a discount on the transaction fee.

    uint256 public saleFeePercentage = 5; // Percentage fee paid to team for each sale
    uint256 public accumulatedFee = 0;

    uint256 public volumeTraded = 0; // Total amount traded

    enum TokenType {
        ERC721, //0
        ERC1155, //1
        ERC20 //2
    }

    constructor() {
        owner = payable(msg.sender);
    }

    struct MarketOffer {
        uint256 offerId;
        uint256 itemId;
        address payable bidder;
        uint256 offerAmount;
        uint256 offerTime;
        bool cancelled;
        bool accepted;
    }

    struct MarketItem {
        uint256 itemId;
        address tokenContract;
        TokenType tokenType;
        uint256 tokenId; // 0 If token is ERC20
        uint256 amount; // 1 unless QTY of ERC20
        address payable seller;
        address payable buyer;
        string category;
        uint256 price;
        bool isSold;
        bool cancelled;
    }

    mapping(uint256 => MarketItem) public idToMarketItem;

    mapping(uint256 => uint256[]) public itemIdToMarketOfferIds;

    mapping(uint256 => MarketOffer) public offerIdToMarketOffer;

    mapping(address => uint256[]) public bidderToMarketOfferIds;

    mapping(address => bool) public approvedSourceContracts;

    event MarketItemCreated(
        uint256 indexed itemId,
        address indexed tokenContract,
        uint256 indexed tokenId,
        uint256 amount,
        address seller,
        address owner,
        string category,
        uint256 price
    );

    event MarketSaleCreated(
        uint256 indexed itemId,
        address indexed tokenContract,
        uint256 indexed tokenId,
        address seller,
        address buyer,
        string category,
        uint256 price
    );

    event ItemOfferCreated(
        uint256 indexed itemId,
        address indexed tokenContract,
        address owner,
        address bidder,
        uint256 bidAmount
    );

    // transfers one of the token types to/from the contracts
    function transferAnyToken(
        TokenType _tokenType,
        address _tokenContract,
        address _from,
        address _to,
        uint256 _tokenId,
        uint256 _amount
    ) internal {
        // type = 0
        if (_tokenType == TokenType.ERC721) {
            //IERC721(_tokenContract).approve(address(this), _tokenId);
            IERC721(_tokenContract).transferFrom(_from, _to, _tokenId);
            return;
        }

        // type = 1
        if (_tokenType == TokenType.ERC1155) {
            IERC1155(_tokenContract).safeTransferFrom(
                _from,
                _to,
                _tokenId,
                1,
                ""
            ); // amount - only 1 of an ERC1155 per item
            return;
        }

        // type = 2
        if (_tokenType == TokenType.ERC20) {
            if (_from==address(this)){
                IERC20(_tokenContract).approve(address(this), _amount);
            }
            IERC20(_tokenContract).transferFrom(_from, _to, _amount); // amount - ERC20 can be multiple tokens per item (bundle)
            return;
        }
    }

   // market item functions
    
    // creates a market item by transferring it from the originating contract
    // the amount will be 1 for ERC721 or ERC1155
    // amount could be more for ERC20
    function createMarketItem(
        address _tokenContract,
        TokenType _tokenType,
        uint256 _tokenId,
        uint256 _amount,
        uint256 _price,
        string calldata _category
    ) public nonReentrant {
        require(_price > 0, "No item for free here");
        require(_amount > 0, "At least one token");
        require(approvedSourceContracts[_tokenContract]==true,"Token contract not approved");

        _itemIds.increment();
        uint256 itemId = _itemIds.current();
        idToMarketItem[itemId] = MarketItem(
            itemId,
            _tokenContract,
            _tokenType,
            _tokenId,
            _amount,
            payable(msg.sender),
            payable(address(0)), // No owner for the item
            _category,
            _price,
            false,
            false
        );

        transferAnyToken(
            _tokenType,
            _tokenContract,
            msg.sender,
            address(this),
            _tokenId,
            _amount
        );

        emit MarketItemCreated(
            itemId,
            _tokenContract,
            _tokenId,
            _amount,
            msg.sender,
            address(0),
            _category,
            _price
        );
    }

    // cancels a market item that's for sale
    function cancelMarketItem(uint256 itemId) public {
        require(itemId <= _itemIds.current());
        require(idToMarketItem[itemId].seller == msg.sender);
        require(
            idToMarketItem[itemId].cancelled == false &&
                idToMarketItem[itemId].isSold == false
        );

        idToMarketItem[itemId].cancelled = true;
        _itemsCancelled.increment();

        transferAnyToken(
            idToMarketItem[itemId].tokenType,
            idToMarketItem[itemId].tokenContract,
            address(this),
            msg.sender,
            idToMarketItem[itemId].tokenId,
            idToMarketItem[itemId].amount
        );
    }

    // buys an item at it's current sale value

    function createMarketSale(uint256 itemId) public payable nonReentrant {
        uint256 price = idToMarketItem[itemId].price;
        uint256 tokenId = idToMarketItem[itemId].tokenId;
        require(
            msg.value == price,
            "Not the correct message value"
        );
        require(
            idToMarketItem[itemId].isSold == false,
            "This item is already sold."
        );
        require(
            idToMarketItem[itemId].cancelled == false,
            "This item is not for sale."
        );
        require(
            idToMarketItem[itemId].seller != msg.sender,
            "Cannot buy your own item."
        );

        // take fees and transfer the balance to the seller (TODO)
        uint256 fees = SafeMath.div(price, 100).mul(saleFeePercentage);

        if (discountManager != address(0x0)) {
            // how much discount does this user get?
            uint256 feeDiscountPercent = IDiscountManager(discountManager)
                .getDiscount(msg.sender);
            fees = fees.div(100).mul(feeDiscountPercent);
        }

        uint256 saleAmount = price.sub(fees);
        idToMarketItem[itemId].seller.transfer(saleAmount);
        accumulatedFee+=fees;

        transferAnyToken(
            idToMarketItem[itemId].tokenType,
            idToMarketItem[itemId].tokenContract,
            address(this),
            msg.sender,
            tokenId,
            idToMarketItem[itemId].amount
        );

        idToMarketItem[itemId].isSold = true;
        idToMarketItem[itemId].buyer = payable(msg.sender);

        _itemsSold.increment();
        volumeTraded = volumeTraded.add(price);

        emit MarketSaleCreated(
            itemId,
            idToMarketItem[itemId].tokenContract,
            tokenId,
            idToMarketItem[itemId].seller,
            msg.sender,
            idToMarketItem[itemId].category,
            price
        );
    }

    function getMarketItemsByPage(uint256 _from, uint256 _to) external view returns (MarketItem[] memory) {
        require(_from < _itemIds.current() && _to <= _itemIds.current(), "Page out of range.");

        uint256 itemCount;
        for (uint256 i = _from; i <= _to; i++) {
            if (
                idToMarketItem[i].buyer == address(0) &&
                idToMarketItem[i].cancelled == false &&
                idToMarketItem[i].isSold == false
            ){
                itemCount++;
            }
        }

        uint256 currentIndex = 0;
        MarketItem[] memory marketItems = new MarketItem[](itemCount);
        for (uint256 i = _from; i <= _to; i++) {

             if (
                idToMarketItem[i].buyer == address(0) &&
                idToMarketItem[i].cancelled == false &&
                idToMarketItem[i].isSold == false
            ){
                uint256 currentId = idToMarketItem[i].itemId;
                MarketItem storage currentItem = idToMarketItem[currentId];
                marketItems[currentIndex] = currentItem;
                currentIndex += 1;
            }

        }
        return marketItems;
    }

    // returns all of the current items for sale
    function getMarketItems() external view returns (MarketItem[] memory) {
        uint256 itemCount = _itemIds.current();
        uint256 unsoldItemCount = _itemIds.current() -
            (_itemsSold.current() + _itemsCancelled.current());
        uint256 currentIndex = 0;

        MarketItem[] memory marketItems = new MarketItem[](unsoldItemCount);
        for (uint256 i = 0; i < itemCount; i++) {
            if (
                idToMarketItem[i + 1].buyer == address(0) &&
                idToMarketItem[i + 1].cancelled == false &&
                idToMarketItem[i + 1].isSold == false
            ) {
                uint256 currentId = idToMarketItem[i + 1].itemId;
                MarketItem storage currentItem = idToMarketItem[currentId];
                marketItems[currentIndex] = currentItem;
                currentIndex += 1;
            }
        }
        return marketItems;
    }

    // returns all itemsby seller and
    function getMarketItemsBySeller(address _seller)
        external
        view
        returns (MarketItem[] memory)
    {
        uint256 totalItemCount = _itemIds.current();
        uint256 itemCount = 0;
        uint256 currentIndex = 0;

        for (uint256 i = 0; i < totalItemCount; i++) {
            if (
                idToMarketItem[i + 1].seller == _seller &&
                idToMarketItem[i + 1].cancelled == false &&
                idToMarketItem[i + 1].isSold == false //&&
                //idToMarketItem[i + 1].tokenContract == _tokenContract
            ) {
                itemCount += 1; // No dynamic length. Predefined length has to be made
            }
        }

        MarketItem[] memory marketItems = new MarketItem[](itemCount);
        for (uint256 i = 0; i < totalItemCount; i++) {
            if (
                idToMarketItem[i + 1].seller == _seller &&
                idToMarketItem[i + 1].cancelled == false &&
                idToMarketItem[i + 1].isSold == false //&&
                //idToMarketItem[i + 1].tokenContract == _tokenContract
            ) {
                uint256 currentId = idToMarketItem[i + 1].itemId;
                MarketItem storage currentItem = idToMarketItem[currentId];
                marketItems[currentIndex] = currentItem;
                currentIndex += 1;
            }
        }
        return marketItems;
    }

       // returns all itemsby seller and
    function getMarketItemsBySellerByPage(address _seller, uint256 _from , uint256 _to)
        external
        view
        returns (MarketItem[] memory)
    {
        require(_from < _itemIds.current() && _to <= _itemIds.current(), "Page out of range.");

        uint256 itemCount = 0;
        uint256 currentIndex = 0;

        for (uint256 i = _from; i <= _to; i++) {
            if (
                idToMarketItem[i].seller == _seller &&
                idToMarketItem[i].cancelled == false &&
                idToMarketItem[i].isSold == false //&&
            ) {
                itemCount += 1; // No dynamic length. Predefined length has to be made
            }
        }

        MarketItem[] memory marketItems = new MarketItem[](itemCount);
        for (uint256 i =  _from; i <= _to; i++) {
            if (
                idToMarketItem[i].seller == _seller &&
                idToMarketItem[i].cancelled == false &&
                idToMarketItem[i].isSold == false //&&
            ) {
                uint256 currentId = idToMarketItem[i].itemId;
                MarketItem storage currentItem = idToMarketItem[currentId];
                marketItems[currentIndex] = currentItem;
                currentIndex += 1;
            }
        }
        return marketItems;
    }

    // Get items by category
    // This could be used with different collections
    function getItemsByCategory(string calldata category)
        external
        view
        returns (MarketItem[] memory)
    {
        uint256 totalItemCount = _itemIds.current();
        uint256 itemCount = 0;
        uint256 currentIndex = 0;

        for (uint256 i = 0; i < totalItemCount; i++) {
            if (
                keccak256(abi.encodePacked(idToMarketItem[i + 1].category)) ==
                keccak256(abi.encodePacked(category)) &&
                idToMarketItem[i + 1].buyer == address(0) &&
                idToMarketItem[i + 1].cancelled == false &&
                idToMarketItem[i + 1].isSold == false
            ) {
                itemCount += 1;
            }
        }

        MarketItem[] memory marketItems = new MarketItem[](itemCount);
        for (uint256 i = 0; i < totalItemCount; i++) {
            if (
                keccak256(abi.encodePacked(idToMarketItem[i + 1].category)) ==
                keccak256(abi.encodePacked(category)) &&
                idToMarketItem[i + 1].buyer == address(0) &&
                idToMarketItem[i + 1].cancelled == false &&
                idToMarketItem[i + 1].isSold == false
            ) {
                uint256 currentId = idToMarketItem[i + 1].itemId;
                MarketItem storage currentItem = idToMarketItem[currentId];
                marketItems[currentIndex] = currentItem;
                currentIndex += 1;
            }
        }
        return marketItems;
    }

       // returns the total number of items sold
    function getItemsSold() external view returns (uint256) {
        return _itemsSold.current();
    }

    // returns the current number of listed items
    function numberOfItemsListed() external view returns (uint256) {
        uint256 unsoldItemCount = _itemIds.current() -
            (_itemsSold.current() + _itemsCancelled.current());
        return unsoldItemCount;
    }



    // Offers functions
    // make offer
    // cancel offer
    // accept offer
    // offersByItem
    // offersByBidder


    function makeItemOffer(uint256 _itemId) public payable nonReentrant {
        require(
            idToMarketItem[_itemId].tokenContract != address(0x0) &&
                idToMarketItem[_itemId].isSold == false &&
                idToMarketItem[_itemId].cancelled == false,
            "Invalid item id."
        );
        require(msg.value > 0, "Can't offer nothing.");

        _offerIds.increment();
        uint256 offerId = _offerIds.current();

        MarketOffer memory offer = MarketOffer(
            offerId,
            _itemId,
            payable(msg.sender),
            msg.value,
            block.timestamp,
            false,
            false
        );

        offerIdToMarketOffer[offerId] = offer;
        itemIdToMarketOfferIds[_itemId].push(offerId);
        bidderToMarketOfferIds[msg.sender].push(offerId);

        emit ItemOfferCreated(
            _itemId,
            idToMarketItem[_itemId].tokenContract,
            idToMarketItem[_itemId].seller,
            msg.sender,
            msg.value
        );
    }

    function acceptItemOffer(uint256 _offerId) public nonReentrant {
        uint256 itemId = offerIdToMarketOffer[_offerId].itemId;

        require(idToMarketItem[itemId].seller == msg.sender, "Not item seller");

        require(
            offerIdToMarketOffer[_offerId].accepted == false &&
                offerIdToMarketOffer[_offerId].cancelled == false,
            "Already accepted or cancelled."
        );

        uint256 price = offerIdToMarketOffer[_offerId].offerAmount;
        address bidder = payable(offerIdToMarketOffer[_offerId].bidder);

        uint256 fees = SafeMath.div(price, 100).mul(saleFeePercentage);

        // fees and payment
        if (discountManager != address(0x0)) {
            // how much discount does this user get?
            uint256 feeDiscountPercent = IDiscountManager(discountManager)
                .getDiscount(msg.sender);
            fees = fees.div(100).mul(feeDiscountPercent);
        }

        uint256 saleAmount = price.sub(fees);
        payable(msg.sender).transfer(saleAmount);
        if (fees > 0) {
            accumulatedFee+=fees;
        }

        transferAnyToken(
            idToMarketItem[itemId].tokenType,
            idToMarketItem[itemId].tokenContract,
            address(this),
            offerIdToMarketOffer[_offerId].bidder,
            idToMarketItem[itemId].tokenId,
            idToMarketItem[itemId].amount
        );

        offerIdToMarketOffer[_offerId].accepted = true;
        
        idToMarketItem[itemId].isSold = true;
        idToMarketItem[itemId].buyer = offerIdToMarketOffer[_offerId].bidder;

        _itemsSold.increment();

        emit MarketSaleCreated(
            itemId,
            idToMarketItem[itemId].tokenContract,
            idToMarketItem[itemId].tokenId,
            msg.sender,
            bidder,
            idToMarketItem[itemId].category,
            price
        );

        volumeTraded = volumeTraded.add(price);
    }

    function canceItemOffer(uint256 _offerId) public nonReentrant {
        require(
            offerIdToMarketOffer[_offerId].bidder == msg.sender &&
                offerIdToMarketOffer[_offerId].cancelled == false,
            "Wrong bidder or offer is already cancelled"
        );
        require(
            offerIdToMarketOffer[_offerId].accepted == false,
            "Already accepted."
        );

        address bidder = offerIdToMarketOffer[_offerId].bidder;

        offerIdToMarketOffer[_offerId].cancelled = true;
        payable(bidder).transfer(offerIdToMarketOffer[_offerId].offerAmount);

        //TODO emit
    }

     function getOffersByBidder(address _bidder)
        external
        view
        returns (MarketOffer[] memory)
    {
        uint256 openOfferCount = 0;
        uint256[] memory itemOfferIds = bidderToMarketOfferIds[_bidder];

        for (uint256 i = 0; i < itemOfferIds.length; i++) {
            if (
                offerIdToMarketOffer[itemOfferIds[i]].accepted == false &&
                offerIdToMarketOffer[itemOfferIds[i]].cancelled == false
            ) {
                openOfferCount++;
            }
        }

        MarketOffer[] memory openOffers = new MarketOffer[](openOfferCount);
        uint256 currentIndex = 0;
        for (uint256 i = 0; i < itemOfferIds.length; i++) {
            if (
                offerIdToMarketOffer[itemOfferIds[i]].accepted == false &&
                offerIdToMarketOffer[itemOfferIds[i]].cancelled == false
            ) {
                MarketOffer memory currentItem = offerIdToMarketOffer[
                    itemOfferIds[i]
                ];
                openOffers[currentIndex] = currentItem;
                currentIndex += 1;
            }
        }

        return openOffers;
    }

     function getTotalOffersMadeByBidder(address _bidder) external view returns (uint256){
         return bidderToMarketOfferIds[_bidder].length;
     }

     function getOpenOffersByBidderByPage(address _bidder, uint256 _from , uint256 _to)
        external
        view
        returns (MarketOffer[] memory)
    {
        uint256 openOfferCount = 0;
        uint256[] memory itemOfferIds = bidderToMarketOfferIds[_bidder];

        for (uint256 i = _from; i <= _to; i++) {
            if (
                offerIdToMarketOffer[itemOfferIds[i]].accepted == false &&
                offerIdToMarketOffer[itemOfferIds[i]].cancelled == false
            ) {
                openOfferCount++;
            }
        }

        MarketOffer[] memory openOffers = new MarketOffer[](openOfferCount);
        uint256 currentIndex = 0;
        for (uint256 i = _from; i <= _to; i++) {
            if (
                offerIdToMarketOffer[itemOfferIds[i]].accepted == false &&
                offerIdToMarketOffer[itemOfferIds[i]].cancelled == false
            ) {
                MarketOffer memory currentItem = offerIdToMarketOffer[
                    itemOfferIds[i]
                ];
                openOffers[currentIndex] = currentItem;
                currentIndex += 1;
            }
        }

        return openOffers;
    }

    function getItemOffers(uint256 _itemId)
        external
        view
        returns (MarketOffer[] memory)
    {
        uint256 openOfferCount = 0;
        uint256[] memory itemOfferIds = itemIdToMarketOfferIds[_itemId];

        for (uint256 i = 0; i < itemOfferIds.length; i++) {
            if (
                offerIdToMarketOffer[itemOfferIds[i]].accepted == false &&
                offerIdToMarketOffer[itemOfferIds[i]].cancelled == false
            ) {
                openOfferCount++;
            }
        }

        MarketOffer[] memory openOffers = new MarketOffer[](openOfferCount);
        uint256 currentIndex = 0;
        for (uint256 i = 0; i < itemOfferIds.length; i++) {
            if (
                offerIdToMarketOffer[itemOfferIds[i]].accepted == false &&
                offerIdToMarketOffer[itemOfferIds[i]].cancelled == false
            ) {
                MarketOffer memory currentItem = offerIdToMarketOffer[
                    itemOfferIds[i]
                ];
                openOffers[currentIndex] = currentItem;
                currentIndex += 1;
            }
        }

        return openOffers;
    }

    // administration functions
    function setSalePercentageFee(uint256 _amount) public onlyOwner {
        require(_amount <= 5, "5% maximum fee allowed.");
        saleFeePercentage = _amount;
    }

    function setOwner(address _owner) public onlyOwner {
        require(_owner != address(0x0), "0x0 address not permitted");
        owner = payable(_owner);
    }

    function setDiscountManager(address _discountManager) public onlyOwner {
        require(_discountManager != address(0x0), "0x0 address not permitted");
        discountManager = _discountManager;
    }

    function setSourceContractApproved(address _tokenContract, bool _approved) external onlyOwner {
        approvedSourceContracts[_tokenContract]=_approved;
    }


    // IERC1155Receiver implementations

    function onERC1155Received(
        address,
        address,
        uint256,
        uint256,
        bytes memory
    ) public virtual override returns (bytes4) {
        return this.onERC1155Received.selector;
    }

    function onERC1155BatchReceived(
        address,
        address,
        uint256[] memory,
        uint256[] memory,
        bytes memory
    ) public virtual override returns (bytes4) {
        return this.onERC1155BatchReceived.selector;
    }


    function supportsInterface(bytes4 interfaceId) override external pure returns (bool){
            return interfaceId == type(IERC1155Receiver).interfaceId
            || true;
    }

    function withdraw_all() external onlyClevel {
        require (accumulatedFee > 0);
        uint256 amountB = SafeMath.div(accumulatedFee,100).mul(walletBPercentage);
        uint256 amountA = accumulatedFee.sub(amountB);
        accumulatedFee = 0;
        payable(walletA).transfer(amountA);
        payable(walletB).transfer(amountB);
    }

    function setWalletA(address _walletA) external onlyOwner {
        require (_walletA != address(0x0), "Invalid wallet");
        walletA = _walletA;
    }

    function setWalletB(address _walletB) external onlyOwner {
        require (_walletB != address(0x0), "Invalid wallet.");
        walletB = _walletB;
    }

    function setWalletBPercentage(uint256 _percentage) external onlyOwner {
        require (_percentage>walletBPercentage && _percentage<=100, "Invalid new slice.");
        walletBPercentage = _percentage;
    }

}

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    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 {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

library SafeMath {
    /**
     * @dev Multiplies two numbers, throws on overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }
        uint256 c = a * b;
        assert(c / a == b);
        return c;
    }

    /**
     * @dev Integer division of two numbers, truncating the quotient.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // assert(b > 0); // Solidity automatically throws when dividing by 0
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold
        return c;
    }

    /**
     * @dev Substracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        assert(b <= a);
        return a - b;
    }

    /**
     * @dev Adds two numbers, throws on overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        assert(c >= a);
        return c;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"itemId","type":"uint256"},{"indexed":true,"internalType":"address","name":"tokenContract","type":"address"},{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"bidder","type":"address"},{"indexed":false,"internalType":"uint256","name":"bidAmount","type":"uint256"}],"name":"ItemOfferCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"itemId","type":"uint256"},{"indexed":true,"internalType":"address","name":"tokenContract","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"seller","type":"address"},{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"string","name":"category","type":"string"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"MarketItemCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"itemId","type":"uint256"},{"indexed":true,"internalType":"address","name":"tokenContract","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"seller","type":"address"},{"indexed":false,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"string","name":"category","type":"string"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"MarketSaleCreated","type":"event"},{"inputs":[],"name":"_itemIds","outputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_offerId","type":"uint256"}],"name":"acceptItemOffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"accumulatedFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"approvedSourceContracts","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"bidderToMarketOfferIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_offerId","type":"uint256"}],"name":"canceItemOffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"itemId","type":"uint256"}],"name":"cancelMarketItem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"enum ShiryoMarket.TokenType","name":"_tokenType","type":"uint8"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"string","name":"_category","type":"string"}],"name":"createMarketItem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"itemId","type":"uint256"}],"name":"createMarketSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"discountManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_itemId","type":"uint256"}],"name":"getItemOffers","outputs":[{"components":[{"internalType":"uint256","name":"offerId","type":"uint256"},{"internalType":"uint256","name":"itemId","type":"uint256"},{"internalType":"address payable","name":"bidder","type":"address"},{"internalType":"uint256","name":"offerAmount","type":"uint256"},{"internalType":"uint256","name":"offerTime","type":"uint256"},{"internalType":"bool","name":"cancelled","type":"bool"},{"internalType":"bool","name":"accepted","type":"bool"}],"internalType":"struct ShiryoMarket.MarketOffer[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"category","type":"string"}],"name":"getItemsByCategory","outputs":[{"components":[{"internalType":"uint256","name":"itemId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"enum ShiryoMarket.TokenType","name":"tokenType","type":"uint8"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address payable","name":"seller","type":"address"},{"internalType":"address payable","name":"buyer","type":"address"},{"internalType":"string","name":"category","type":"string"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bool","name":"isSold","type":"bool"},{"internalType":"bool","name":"cancelled","type":"bool"}],"internalType":"struct ShiryoMarket.MarketItem[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getItemsSold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMarketItems","outputs":[{"components":[{"internalType":"uint256","name":"itemId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"enum ShiryoMarket.TokenType","name":"tokenType","type":"uint8"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address payable","name":"seller","type":"address"},{"internalType":"address payable","name":"buyer","type":"address"},{"internalType":"string","name":"category","type":"string"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bool","name":"isSold","type":"bool"},{"internalType":"bool","name":"cancelled","type":"bool"}],"internalType":"struct ShiryoMarket.MarketItem[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"getMarketItemsByPage","outputs":[{"components":[{"internalType":"uint256","name":"itemId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"enum ShiryoMarket.TokenType","name":"tokenType","type":"uint8"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address payable","name":"seller","type":"address"},{"internalType":"address payable","name":"buyer","type":"address"},{"internalType":"string","name":"category","type":"string"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bool","name":"isSold","type":"bool"},{"internalType":"bool","name":"cancelled","type":"bool"}],"internalType":"struct ShiryoMarket.MarketItem[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_seller","type":"address"}],"name":"getMarketItemsBySeller","outputs":[{"components":[{"internalType":"uint256","name":"itemId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"enum ShiryoMarket.TokenType","name":"tokenType","type":"uint8"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address payable","name":"seller","type":"address"},{"internalType":"address payable","name":"buyer","type":"address"},{"internalType":"string","name":"category","type":"string"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bool","name":"isSold","type":"bool"},{"internalType":"bool","name":"cancelled","type":"bool"}],"internalType":"struct ShiryoMarket.MarketItem[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_seller","type":"address"},{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"getMarketItemsBySellerByPage","outputs":[{"components":[{"internalType":"uint256","name":"itemId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"enum ShiryoMarket.TokenType","name":"tokenType","type":"uint8"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address payable","name":"seller","type":"address"},{"internalType":"address payable","name":"buyer","type":"address"},{"internalType":"string","name":"category","type":"string"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bool","name":"isSold","type":"bool"},{"internalType":"bool","name":"cancelled","type":"bool"}],"internalType":"struct ShiryoMarket.MarketItem[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_bidder","type":"address"}],"name":"getOffersByBidder","outputs":[{"components":[{"internalType":"uint256","name":"offerId","type":"uint256"},{"internalType":"uint256","name":"itemId","type":"uint256"},{"internalType":"address payable","name":"bidder","type":"address"},{"internalType":"uint256","name":"offerAmount","type":"uint256"},{"internalType":"uint256","name":"offerTime","type":"uint256"},{"internalType":"bool","name":"cancelled","type":"bool"},{"internalType":"bool","name":"accepted","type":"bool"}],"internalType":"struct ShiryoMarket.MarketOffer[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_bidder","type":"address"},{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"getOpenOffersByBidderByPage","outputs":[{"components":[{"internalType":"uint256","name":"offerId","type":"uint256"},{"internalType":"uint256","name":"itemId","type":"uint256"},{"internalType":"address payable","name":"bidder","type":"address"},{"internalType":"uint256","name":"offerAmount","type":"uint256"},{"internalType":"uint256","name":"offerTime","type":"uint256"},{"internalType":"bool","name":"cancelled","type":"bool"},{"internalType":"bool","name":"accepted","type":"bool"}],"internalType":"struct ShiryoMarket.MarketOffer[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_bidder","type":"address"}],"name":"getTotalOffersMadeByBidder","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"idToMarketItem","outputs":[{"internalType":"uint256","name":"itemId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"enum ShiryoMarket.TokenType","name":"tokenType","type":"uint8"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address payable","name":"seller","type":"address"},{"internalType":"address payable","name":"buyer","type":"address"},{"internalType":"string","name":"category","type":"string"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bool","name":"isSold","type":"bool"},{"internalType":"bool","name":"cancelled","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"itemIdToMarketOfferIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_itemId","type":"uint256"}],"name":"makeItemOffer","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"numberOfItemsListed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"offerIdToMarketOffer","outputs":[{"internalType":"uint256","name":"offerId","type":"uint256"},{"internalType":"uint256","name":"itemId","type":"uint256"},{"internalType":"address payable","name":"bidder","type":"address"},{"internalType":"uint256","name":"offerAmount","type":"uint256"},{"internalType":"uint256","name":"offerTime","type":"uint256"},{"internalType":"bool","name":"cancelled","type":"bool"},{"internalType":"bool","name":"accepted","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleFeePercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_discountManager","type":"address"}],"name":"setDiscountManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setSalePercentageFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setSourceContractApproved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_walletA","type":"address"}],"name":"setWalletA","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_walletB","type":"address"}],"name":"setWalletB","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_percentage","type":"uint256"}],"name":"setWalletBPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"volumeTraded","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw_all","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526014600355600980546001600160a01b03191690556005600a556000600b819055600c5534801561003457600080fd5b506001600055600880546001600160a01b0319163317905561467c8061005b6000396000f3fe6080604052600436106102305760003560e01c80636a6e4c381161012e578063aad48c17116100ab578063c4b151411161006f578063c4b1514114610755578063dd473d2b1461076a578063e61a70c01461077f578063f23a6e61146107b6578063f8ce3164146107e257600080fd5b8063aad48c17146106b2578063b027a725146106d2578063b1433f7f146106e7578063bc197c81146106fd578063be9af5361461074257600080fd5b806395478fbf116100f257806395478fbf1461058757806396cbf2e9146105a7578063a28ad112146105c7578063a6e22b0214610672578063a7fa49c51461069257600080fd5b80636a6e4c38146104b357806371029ffd146104e35780637be3f006146105195780637ee87a271461052f5780638da5cb5b1461056757600080fd5b80632211fec4116101bc57806343b555dd1161018057806343b555dd14610413578063450defaa1461043357806346c4a388146104535780634a63421c146104735780634c89b86c1461049357600080fd5b80632211fec41461038757806329aa3a42146103a75780632a983a04146103bc5780632aa74ce4146103dc57806334a7f193146103fc57600080fd5b8063111992851161020357806311199285146102e757806313af403514610314578063166117e81461033457806317ce4f1e146103475780631e7c9e181461036757600080fd5b806301839ee31461023557806301ffc9a714610257578063023d20b01461028c5780630761b9bd146102b9575b600080fd5b34801561024157600080fd5b5061025561025036600461402c565b6107f8565b005b34801561026357600080fd5b50610277610272366004613fc1565b61086a565b60405190151581526020015b60405180910390f35b34801561029857600080fd5b506102ac6102a7366004613d61565b61088f565b6040516102839190614225565b3480156102c557600080fd5b506102d96102d436600461405e565b610c3a565b604051908152602001610283565b3480156102f357600080fd5b50610307610302366004613d61565b610c6b565b6040516102839190614335565b34801561032057600080fd5b5061025561032f366004613d61565b610f4e565b61025561034236600461402c565b610fd9565b34801561035357600080fd5b50610255610362366004613d61565b61124f565b34801561037357600080fd5b5061025561038236600461402c565b6112da565b34801561039357600080fd5b506102556103a2366004613e89565b61166a565b3480156103b357600080fd5b506102ac6116ac565b3480156103c857600080fd5b506102556103d736600461402c565b6119a7565b3480156103e857600080fd5b506102ac6103f736600461405e565b611a16565b34801561040857600080fd5b506004546102d99081565b34801561041f57600080fd5b5061030761042e36600461402c565b611d6c565b34801561043f57600080fd5b506102ac61044e366004613f71565b61203a565b34801561045f57600080fd5b5061025561046e366004613ec0565b6123a3565b34801561047f57600080fd5b5061025561048e36600461402c565b612704565b34801561049f57600080fd5b506102556104ae366004613d61565b612888565b3480156104bf57600080fd5b506102776104ce366004613d61565b60116020526000908152604090205460ff1681565b3480156104ef57600080fd5b506102d96104fe366004613d61565b6001600160a01b031660009081526010602052604090205490565b34801561052557600080fd5b506102d9600a5481565b34801561053b57600080fd5b5060095461054f906001600160a01b031681565b6040516001600160a01b039091168152602001610283565b34801561057357600080fd5b5060085461054f906001600160a01b031681565b34801561059357600080fd5b506102ac6105a2366004613feb565b612908565b3480156105b357600080fd5b506102556105c2366004613d61565b612d8b565b3480156105d357600080fd5b5061062d6105e236600461402c565b600f60205260009081526040902080546001820154600283015460038401546004850154600590950154939492936001600160a01b0390921692909160ff8082169161010090041687565b6040805197885260208801969096526001600160a01b03909416948601949094526060850191909152608084015290151560a0830152151560c082015260e001610283565b34801561067e57600080fd5b5061025561068d36600461402c565b612e0c565b34801561069e57600080fd5b506102d96106ad366004613f47565b612ef2565b3480156106be57600080fd5b506103076106cd366004613f71565b612f0e565b3480156106de57600080fd5b506102d96131f0565b3480156106f357600080fd5b506102d9600c5481565b34801561070957600080fd5b50610729610718366004613d7c565b63bc197c8160e01b95945050505050565b6040516001600160e01b03199091168152602001610283565b61025561075036600461402c565b613216565b34801561076157600080fd5b506102d9613602565b34801561077657600080fd5b50610255613612565b34801561078b57600080fd5b5061079f61079a36600461402c565b613711565b6040516102839b9a99989796959493929190614455565b3480156107c257600080fd5b506107296107d1366004613e25565b63f23a6e6160e01b95945050505050565b3480156107ee57600080fd5b506102d9600b5481565b6008546001600160a01b0316331461080f57600080fd5b60058111156108655760405162461bcd60e51b815260206004820152601760248201527f3525206d6178696d756d2066656520616c6c6f7765642e00000000000000000060448201526064015b60405180910390fd5b600a55565b60006001600160e01b03198216630271189760e51b1480610889575060015b92915050565b6060600061089c60045490565b905060008060005b8381101561096b576001600160a01b038616600d60006108c5846001614504565b81526020810191909152604001600020600401546001600160a01b03161480156109175750600d60006108f9836001614504565b8152602081019190915260400160002060080154610100900460ff16155b80156109465750600d600061092d836001614504565b815260208101919091526040016000206008015460ff16155b1561095957610956600184614504565b92505b80610963816145af565b9150506108a4565b506000826001600160401b0381111561098657610986614622565b6040519080825280602002602001820160405280156109bf57816020015b6109ac613acc565b8152602001906001900390816109a45790505b50905060005b84811015610c30576001600160a01b038716600d60006109e6846001614504565b81526020810191909152604001600020600401546001600160a01b0316148015610a385750600d6000610a1a836001614504565b8152602081019190915260400160002060080154610100900460ff16155b8015610a675750600d6000610a4e836001614504565b815260208101919091526040016000206008015460ff16155b15610c1e576000600d81610a7c846001614504565b81526020808201929092526040908101600090812054808252600d8452908290208251610160810184528154815260018201546001600160a01b03811695820195909552919450929091839190830190600160a01b900460ff166002811115610ae757610ae76145f6565b6002811115610af857610af86145f6565b8152600282015460208201526003820154604082015260048201546001600160a01b039081166060830152600583015416608082015260068201805460a090920191610b4390614574565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6f90614574565b8015610bbc5780601f10610b9157610100808354040283529160200191610bbc565b820191906000526020600020905b815481529060010190602001808311610b9f57829003601f168201915b50505091835250506007820154602082015260089091015460ff808216151560408401526101009091041615156060909101528451859087908110610c0357610c0361460c565b6020908102919091010152610c19600186614504565b945050505b80610c28816145af565b9150506109c5565b5095945050505050565b600e6020528160005260406000208181548110610c5657600080fd5b90600052602060002001600091509150505481565b6001600160a01b03811660009081526010602090815260408083208054825181850281018501909352808352606094938493929190830182828015610ccf57602002820191906000526020600020905b815481526020019060010190808311610cbb575b5050505050905060005b8151811015610d8457600f6000838381518110610cf857610cf861460c565b602090810291909101810151825281019190915260400160002060050154610100900460ff16158015610d5f5750600f6000838381518110610d3c57610d3c61460c565b60209081029190910181015182528101919091526040016000206005015460ff16155b15610d725782610d6e816145af565b9350505b80610d7c816145af565b915050610cd9565b506000826001600160401b03811115610d9f57610d9f614622565b604051908082528060200260200182016040528015610dd857816020015b610dc5613b26565b815260200190600190039081610dbd5790505b5090506000805b8351811015610f4357600f6000858381518110610dfe57610dfe61460c565b602090810291909101810151825281019190915260400160002060050154610100900460ff16158015610e655750600f6000858381518110610e4257610e4261460c565b60209081029190910181015182528101919091526040016000206005015460ff16155b15610f31576000600f6000868481518110610e8257610e8261460c565b6020908102919091018101518252818101929092526040908101600020815160e0810183528154815260018201549381019390935260028101546001600160a01b03169183019190915260038101546060830152600481015460808301526005015460ff808216151560a084015261010090910416151560c082015284519091508190859085908110610f1757610f1761460c565b6020908102919091010152610f2d600184614504565b9250505b80610f3b816145af565b915050610ddf565b509095945050505050565b6008546001600160a01b03163314610f6557600080fd5b6001600160a01b038116610fb75760405162461bcd60e51b81526020600482015260196024820152780c1e0c081859191c995cdcc81b9bdd081c195c9b5a5d1d1959603a1b604482015260640161085c565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b60026000541415610ffc5760405162461bcd60e51b815260040161085c906143c4565b60026000908155818152600d60205260409020600101546001600160a01b03161580159061103c57506000818152600d602052604090206008015460ff16155b801561105f57506000818152600d6020526040902060080154610100900460ff16155b61109e5760405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b21034ba32b69034b21760811b604482015260640161085c565b600034116110e55760405162461bcd60e51b815260206004820152601460248201527321b0b713ba1037b33332b9103737ba3434b7339760611b604482015260640161085c565b6110f3600780546001019055565b60006110fe60075490565b6040805160e0810182528281526020808201868152338385018181523460608087018281524260808901908152600060a08a0181815260c08b018281528d8352600f8b528c83208c51815599516001808c0191909155975160028b0180546001600160a01b039283166001600160a01b0319909116179055945160038b015592516004808b0191909155905160059099018054935115156101000261ff00199a15159a909a1661ffff1990941693909317989098179091558c8152600e885289812080548087018255908252888220018b90558581526010885289812080548087018255908252888220018b90558c8152600d88528990209384015493909501548851908616815295860193909352848701529451959650929493169286927f9078ebced75ce8ca9324d2ab0c437296b64a0eff2a049ae70dde1790b443ede1928290030190a35050600160005550565b6008546001600160a01b0316331461126657600080fd5b6001600160a01b0381166112b85760405162461bcd60e51b81526020600482015260196024820152780c1e0c081859191c995cdcc81b9bdd081c195c9b5a5d1d1959603a1b604482015260640161085c565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b600260005414156112fd5760405162461bcd60e51b815260040161085c906143c4565b60026000908155818152600f6020908152604080832060010154808452600d909252909120600401546001600160a01b0316331461136f5760405162461bcd60e51b815260206004820152600f60248201526e2737ba1034ba32b69039b2b63632b960891b604482015260640161085c565b6000828152600f6020526040902060050154610100900460ff161580156113a857506000828152600f602052604090206005015460ff16155b6113f45760405162461bcd60e51b815260206004820152601e60248201527f416c7265616479206163636570746564206f722063616e63656c6c65642e0000604482015260640161085c565b6000828152600f602052604081206003810154600290910154600a5491926001600160a01b03909116916114339061142d856064613809565b9061381e565b6009549091506001600160a01b0316156114d8576009546040516303793c8d60e11b81523360048201526000916001600160a01b0316906306f2791a9060240160206040518083038186803b15801561148b57600080fd5b505afa15801561149f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c39190614045565b90506114d48161142d846064613809565b9150505b60006114e4848361385a565b604051909150339082156108fc029083906000818181858888f19350505050158015611514573d6000803e3d6000fd5b5081156115335781600b600082825461152d9190614504565b90915550505b6000858152600d6020818152604080842060018101548b8652600f8452918520600290810154958b905293909252918101546003909101546115929360ff600160a01b850416936001600160a01b039081169330939290911691613876565b6000868152600f602090815260408083206005808201805461ff001916610100179055898552600d9093529281902060088101805460ff1916600190811790915560029485015482850180546001600160a01b0319166001600160a01b039283161790558454820190945593810154938101549151919092169188917f1f4ecd8562ffa9ee0b2ae53cd3747ab603ad7fd1a39605f4a9cb2fc083cd7b6a916116459133918a916006909101908c906141e8565b60405180910390a4600c5461165a9085613aad565b600c555050600160005550505050565b6008546001600160a01b0316331461168157600080fd5b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b606060006116b960045490565b905060006116c660065490565b6005546116d39190614504565b6004546116e0919061455d565b9050600080826001600160401b038111156116fd576116fd614622565b60405190808252806020026020018201604052801561173657816020015b611723613acc565b81526020019060019003908161171b5790505b50905060005b8481101561199e576000600d81611754846001614504565b81526020810191909152604001600020600501546001600160a01b03161480156117a65750600d6000611788836001614504565b8152602081019190915260400160002060080154610100900460ff16155b80156117d55750600d60006117bc836001614504565b815260208101919091526040016000206008015460ff16155b1561198c576000600d816117ea846001614504565b81526020808201929092526040908101600090812054808252600d8452908290208251610160810184528154815260018201546001600160a01b03811695820195909552919450929091839190830190600160a01b900460ff166002811115611855576118556145f6565b6002811115611866576118666145f6565b8152600282015460208201526003820154604082015260048201546001600160a01b039081166060830152600583015416608082015260068201805460a0909201916118b190614574565b80601f01602080910402602001604051908101604052809291908181526020018280546118dd90614574565b801561192a5780601f106118ff5761010080835404028352916020019161192a565b820191906000526020600020905b81548152906001019060200180831161190d57829003601f168201915b50505091835250506007820154602082015260089091015460ff8082161515604084015261010090910416151560609091015284518590879081106119715761197161460c565b6020908102919091010152611987600186614504565b945050505b80611996816145af565b91505061173c565b50949350505050565b6008546001600160a01b031633146119be57600080fd5b600354811180156119d0575060648111155b611a115760405162461bcd60e51b815260206004820152601260248201527124b73b30b634b2103732bb9039b634b1b29760711b604482015260640161085c565b600355565b6060611a2160045490565b83108015611a3157506004548211155b611a725760405162461bcd60e51b81526020600482015260126024820152712830b3b29037baba1037b3103930b733b29760711b604482015260640161085c565b6000835b838111611aff576000818152600d60205260409020600501546001600160a01b0316158015611abc57506000818152600d6020526040902060080154610100900460ff16155b8015611ada57506000818152600d602052604090206008015460ff16155b15611aed5781611ae9816145af565b9250505b80611af7816145af565b915050611a76565b50600080826001600160401b03811115611b1b57611b1b614622565b604051908082528060200260200182016040528015611b5457816020015b611b41613acc565b815260200190600190039081611b395790505b509050855b858111610c30576000818152600d60205260409020600501546001600160a01b0316158015611b9f57506000818152600d6020526040902060080154610100900460ff16155b8015611bbd57506000818152600d602052604090206008015460ff16155b15611d5a576000818152600d6020908152604080832054808452928190208151610160810183528154815260018201546001600160a01b0381169482019490945290929091839190830190600160a01b900460ff166002811115611c2357611c236145f6565b6002811115611c3457611c346145f6565b8152600282015460208201526003820154604082015260048201546001600160a01b039081166060830152600583015416608082015260068201805460a090920191611c7f90614574565b80601f0160208091040260200160405190810160405280929190818152602001828054611cab90614574565b8015611cf85780601f10611ccd57610100808354040283529160200191611cf8565b820191906000526020600020905b815481529060010190602001808311611cdb57829003601f168201915b50505091835250506007820154602082015260089091015460ff808216151560408401526101009091041615156060909101528451859087908110611d3f57611d3f61460c565b6020908102919091010152611d55600186614504565b945050505b80611d64816145af565b915050611b59565b6000818152600e602090815260408083208054825181850281018501909352808352606094938493929190830182828015611dc657602002820191906000526020600020905b815481526020019060010190808311611db2575b5050505050905060005b8151811015611e7b57600f6000838381518110611def57611def61460c565b602090810291909101810151825281019190915260400160002060050154610100900460ff16158015611e565750600f6000838381518110611e3357611e3361460c565b60209081029190910181015182528101919091526040016000206005015460ff16155b15611e695782611e65816145af565b9350505b80611e73816145af565b915050611dd0565b506000826001600160401b03811115611e9657611e96614622565b604051908082528060200260200182016040528015611ecf57816020015b611ebc613b26565b815260200190600190039081611eb45790505b5090506000805b8351811015610f4357600f6000858381518110611ef557611ef561460c565b602090810291909101810151825281019190915260400160002060050154610100900460ff16158015611f5c5750600f6000858381518110611f3957611f3961460c565b60209081029190910181015182528101919091526040016000206005015460ff16155b15612028576000600f6000868481518110611f7957611f7961460c565b6020908102919091018101518252818101929092526040908101600020815160e0810183528154815260018201549381019390935260028101546001600160a01b03169183019190915260038101546060830152600481015460808301526005015460ff808216151560a084015261010090910416151560c08201528451909150819085908590811061200e5761200e61460c565b6020908102919091010152612024600184614504565b9250505b80612032816145af565b915050611ed6565b606061204560045490565b8310801561205557506004548211155b6120965760405162461bcd60e51b81526020600482015260126024820152712830b3b29037baba1037b3103930b733b29760711b604482015260640161085c565b600080845b848111612128576000818152600d60205260409020600401546001600160a01b0388811691161480156120e557506000818152600d6020526040902060080154610100900460ff16155b801561210357506000818152600d602052604090206008015460ff16155b1561211657612113600184614504565b92505b80612120816145af565b91505061209b565b506000826001600160401b0381111561214357612143614622565b60405190808252806020026020018201604052801561217c57816020015b612169613acc565b8152602001906001900390816121615790505b509050855b858111612398576000818152600d60205260409020600401546001600160a01b0389811691161480156121cb57506000818152600d6020526040902060080154610100900460ff16155b80156121e957506000818152600d602052604090206008015460ff16155b15612386576000818152600d6020908152604080832054808452928190208151610160810183528154815260018201546001600160a01b0381169482019490945290929091839190830190600160a01b900460ff16600281111561224f5761224f6145f6565b6002811115612260576122606145f6565b8152600282015460208201526003820154604082015260048201546001600160a01b039081166060830152600583015416608082015260068201805460a0909201916122ab90614574565b80601f01602080910402602001604051908101604052809291908181526020018280546122d790614574565b80156123245780601f106122f957610100808354040283529160200191612324565b820191906000526020600020905b81548152906001019060200180831161230757829003601f168201915b50505091835250506007820154602082015260089091015460ff80821615156040840152610100909104161515606090910152845185908790811061236b5761236b61460c565b6020908102919091010152612381600186614504565b945050505b80612390816145af565b915050612181565b509695505050505050565b600260005414156123c65760405162461bcd60e51b815260040161085c906143c4565b6002600055826124105760405162461bcd60e51b81526020600482015260156024820152744e6f206974656d20666f722066726565206865726560581b604482015260640161085c565b600084116124555760405162461bcd60e51b815260206004820152601260248201527120ba103632b0b9ba1037b732903a37b5b2b760711b604482015260640161085c565b6001600160a01b03871660009081526011602052604090205460ff1615156001146124c25760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e20636f6e7472616374206e6f7420617070726f7665640000000000604482015260640161085c565b6124d0600480546001019055565b60006124db60045490565b9050604051806101600160405280828152602001896001600160a01b03168152602001886002811115612510576125106145f6565b8152602001878152602001868152602001336001600160a01b0316815260200160006001600160a01b0316815260200184848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250938552505050602080830188905260408084018390526060909301829052848252600d81529082902083518155908301516001820180546001600160a01b039092166001600160a01b031983168117825593850151929390916001600160a81b03191617600160a01b8360028111156125ed576125ed6145f6565b0217905550606082015160028201556080820151600382015560a08201516004820180546001600160a01b039283166001600160a01b03199182161790915560c084015160058401805491909316911617905560e0820151805161265b916006840191602090910190613b70565b50610100828101516007830155610120830151600890920180546101409094015161ffff1990941692151561ff00191692909217921515029190911790556126a7878933308a8a613876565b85886001600160a01b0316827fb14a35721f094e1cc300be4448eaca7bfd8ea84ec6ce595ef237cfdd3220d0e38833600089898c6040516126ed969594939291906143fb565b60405180910390a450506001600055505050505050565b600260005414156127275760405162461bcd60e51b815260040161085c906143c4565b60026000818155828152600f6020526040902001546001600160a01b03163314801561276557506000818152600f602052604090206005015460ff16155b6127c45760405162461bcd60e51b815260206004820152602a60248201527f57726f6e6720626964646572206f72206f6666657220697320616c72656164796044820152690818d85b98d95b1b195960b21b606482015260840161085c565b6000818152600f6020526040902060050154610100900460ff161561281f5760405162461bcd60e51b815260206004820152601160248201527020b63932b0b23c9030b1b1b2b83a32b21760791b604482015260640161085c565b6000818152600f6020526040808220600281015460058201805460ff1916600117905560039091015491516001600160a01b0390911692839280156108fc02929091818181858888f1935050505015801561287e573d6000803e3d6000fd5b5050600160005550565b6008546001600160a01b0316331461289f57600080fd5b6001600160a01b0381166128e65760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a59081dd85b1b195d60921b604482015260640161085c565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6060600061291560045490565b905060008060005b83811015612a55578686604051602001612938929190614166565b60405160208183030381529060405280519060200120600d600083600161295f9190614504565b81526020019081526020016000206006016040516020016129809190614176565b604051602081830303815290604052805190602001201480156129cd57506000600d816129ae846001614504565b81526020810191909152604001600020600501546001600160a01b0316145b8015612a015750600d60006129e3836001614504565b8152602081019190915260400160002060080154610100900460ff16155b8015612a305750600d6000612a17836001614504565b815260208101919091526040016000206008015460ff16155b15612a4357612a40600184614504565b92505b80612a4d816145af565b91505061291d565b506000826001600160401b03811115612a7057612a70614622565b604051908082528060200260200182016040528015612aa957816020015b612a96613acc565b815260200190600190039081612a8e5790505b50905060005b84811015612398578787604051602001612aca929190614166565b60405160208183030381529060405280519060200120600d6000836001612af19190614504565b8152602001908152602001600020600601604051602001612b129190614176565b60405160208183030381529060405280519060200120148015612b5f57506000600d81612b40846001614504565b81526020810191909152604001600020600501546001600160a01b0316145b8015612b935750600d6000612b75836001614504565b8152602081019190915260400160002060080154610100900460ff16155b8015612bc25750600d6000612ba9836001614504565b815260208101919091526040016000206008015460ff16155b15612d79576000600d81612bd7846001614504565b81526020808201929092526040908101600090812054808252600d8452908290208251610160810184528154815260018201546001600160a01b03811695820195909552919450929091839190830190600160a01b900460ff166002811115612c4257612c426145f6565b6002811115612c5357612c536145f6565b8152600282015460208201526003820154604082015260048201546001600160a01b039081166060830152600583015416608082015260068201805460a090920191612c9e90614574565b80601f0160208091040260200160405190810160405280929190818152602001828054612cca90614574565b8015612d175780601f10612cec57610100808354040283529160200191612d17565b820191906000526020600020905b815481529060010190602001808311612cfa57829003601f168201915b50505091835250506007820154602082015260089091015460ff808216151560408401526101009091041615156060909101528451859087908110612d5e57612d5e61460c565b6020908102919091010152612d74600186614504565b945050505b80612d83816145af565b915050612aaf565b6008546001600160a01b03163314612da257600080fd5b6001600160a01b038116612dea5760405162461bcd60e51b815260206004820152600f60248201526e24b73b30b634b2103bb0b63632ba1760891b604482015260640161085c565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b600454811115612e1b57600080fd5b6000818152600d60205260409020600401546001600160a01b03163314612e4157600080fd5b6000818152600d6020526040902060080154610100900460ff16158015612e7a57506000818152600d602052604090206008015460ff16155b612e8357600080fd5b6000818152600d60205260409020600801805461ff001916610100179055612eaf600680546001019055565b6000818152600d6020526040902060018101546002820154600390920154612eef9260ff600160a01b840416926001600160a01b03169130913391613876565b50565b60106020528160005260406000208181548110610c5657600080fd5b6001600160a01b03831660009081526010602090815260408083208054825181850281018501909352808352606094938493929190830182828015612f7257602002820191906000526020600020905b815481526020019060010190808311612f5e575b509394508893505050505b84811161302657600f6000838381518110612f9a57612f9a61460c565b602090810291909101810151825281019190915260400160002060050154610100900460ff161580156130015750600f6000838381518110612fde57612fde61460c565b60209081029190910181015182528101919091526040016000206005015460ff16155b156130145782613010816145af565b9350505b8061301e816145af565b915050612f7d565b506000826001600160401b0381111561304157613041614622565b60405190808252806020026020018201604052801561307a57816020015b613067613b26565b81526020019060019003908161305f5790505b5090506000865b8681116131e357600f600085838151811061309e5761309e61460c565b602090810291909101810151825281019190915260400160002060050154610100900460ff161580156131055750600f60008583815181106130e2576130e261460c565b60209081029190910181015182528101919091526040016000206005015460ff16155b156131d1576000600f60008684815181106131225761312261460c565b6020908102919091018101518252818101929092526040908101600020815160e0810183528154815260018201549381019390935260028101546001600160a01b03169183019190915260038101546060830152600481015460808301526005015460ff808216151560a084015261010090910416151560c0820152845190915081908590859081106131b7576131b761460c565b60209081029190910101526131cd600184614504565b9250505b806131db816145af565b915050613081565b5090979650505050505050565b6000806131fc60065490565b6005546132099190614504565b600454610889919061455d565b600260005414156132395760405162461bcd60e51b815260040161085c906143c4565b60026000818155828152600d6020526040902060078101549101543482146132a35760405162461bcd60e51b815260206004820152601d60248201527f4e6f742074686520636f7272656374206d6573736167652076616c7565000000604482015260640161085c565b6000838152600d602052604090206008015460ff16156133055760405162461bcd60e51b815260206004820152601a60248201527f54686973206974656d20697320616c726561647920736f6c642e000000000000604482015260640161085c565b6000838152600d6020526040902060080154610100900460ff161561336c5760405162461bcd60e51b815260206004820152601a60248201527f54686973206974656d206973206e6f7420666f722073616c652e000000000000604482015260640161085c565b6000838152600d60205260409020600401546001600160a01b03163314156133d65760405162461bcd60e51b815260206004820152601960248201527f43616e6e6f742062757920796f7572206f776e206974656d2e00000000000000604482015260640161085c565b60006133e9600a5461142d856064613809565b6009549091506001600160a01b03161561348e576009546040516303793c8d60e11b81523360048201526000916001600160a01b0316906306f2791a9060240160206040518083038186803b15801561344157600080fd5b505afa158015613455573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134799190614045565b905061348a8161142d846064613809565b9150505b600061349a848361385a565b6000868152600d60205260408082206004015490519293506001600160a01b03169183156108fc0291849190818181858888f193505050501580156134e3573d6000803e3d6000fd5b5081600b60008282546134f69190614504565b90915550506000858152600d60205260409020600181015460039091015461353a9160ff600160a01b820416916001600160a01b0390911690309033908890613876565b6000858152600d6020526040902060088101805460ff19166001179055600590810180546001600160a01b031916331790556135799080546001019055565b600c546135869085613aad565b600c556000858152600d60205260409081902060018101546004820154925186936001600160a01b03928316938a937f1f4ecd8562ffa9ee0b2ae53cd3747ab603ad7fd1a39605f4a9cb2fc083cd7b6a936135ee939091169133916006909101908c906141e8565b60405180910390a450506001600055505050565b600061360d60055490565b905090565b6001546001600160a01b031633148061363557506002546001600160a01b031633145b8061364a57506008546001600160a01b031633145b61365357600080fd5b6000600b541161366257600080fd5b600061367760035461142d600b546064613809565b9050600061369082600b5461385a90919063ffffffff16565b6000600b8190556001546040519293506001600160a01b03169183156108fc0291849190818181858888f193505050501580156136d1573d6000803e3d6000fd5b506002546040516001600160a01b039091169083156108fc029084906000818181858888f1935050505015801561370c573d6000803e3d6000fd5b505050565b600d60205260009081526040902080546001820154600283015460038401546004850154600586015460068701805496976001600160a01b0380881698600160a01b90980460ff16979481169493169290919061376d90614574565b80601f016020809104026020016040519081016040528092919081815260200182805461379990614574565b80156137e65780601f106137bb576101008083540402835291602001916137e6565b820191906000526020600020905b8154815290600101906020018083116137c957829003601f168201915b50505050600783015460089093015491929160ff8082169250610100909104168b565b600080613816838561451c565b949350505050565b60008261382d57506000610889565b6000613839838561453e565b905082613846858361451c565b14613853576138536145ca565b9392505050565b60008282111561386c5761386c6145ca565b613853828461455d565b600086600281111561388a5761388a6145f6565b1415613900576040516323b872dd60e01b81526001600160a01b0385811660048301528481166024830152604482018490528616906323b872dd906064015b600060405180830381600087803b1580156138e357600080fd5b505af11580156138f7573d6000803e3d6000fd5b50505050613aa5565b6001866002811115613914576139146145f6565b141561396c57604051637921219560e11b81526001600160a01b0385811660048301528481166024830152604482018490526001606483015260a06084830152600060a483015286169063f242432a9060c4016138c9565b6002866002811115613980576139806145f6565b1415613aa5576001600160a01b038416301415613a195760405163095ea7b360e01b8152306004820152602481018290526001600160a01b0386169063095ea7b390604401602060405180830381600087803b1580156139df57600080fd5b505af11580156139f3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a179190613fa4565b505b6040516323b872dd60e01b81526001600160a01b0385811660048301528481166024830152604482018390528616906323b872dd90606401602060405180830381600087803b158015613a6b57600080fd5b505af1158015613a7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613aa39190613fa4565b505b505050505050565b600080613aba8385614504565b905083811015613853576138536145ca565b6040805161016081018252600080825260208201819052909182019081526000602082018190526040820181905260608083018290526080830182905260a083015260c0820181905260e082018190526101009091015290565b6040518060e00160405280600081526020016000815260200160006001600160a01b0316815260200160008152602001600081526020016000151581526020016000151581525090565b828054613b7c90614574565b90600052602060002090601f016020900481019282613b9e5760008555613be4565b82601f10613bb757805160ff1916838001178555613be4565b82800160010185558215613be4579182015b82811115613be4578251825591602001919060010190613bc9565b50613bf0929150613bf4565b5090565b5b80821115613bf05760008155600101613bf5565b80356001600160a01b0381168114613c2057600080fd5b919050565b600082601f830112613c3657600080fd5b813560206001600160401b03821115613c5157613c51614622565b8160051b613c608282016144d4565b838152828101908684018388018501891015613c7b57600080fd5b600093505b85841015613c9e578035835260019390930192918401918401613c80565b50979650505050505050565b600082601f830112613cbb57600080fd5b81356001600160401b03811115613cd457613cd4614622565b613ce7601f8201601f19166020016144d4565b818152846020838601011115613cfc57600080fd5b816020850160208301376000918101602001919091529392505050565b60008083601f840112613d2b57600080fd5b5081356001600160401b03811115613d4257600080fd5b602083019150836020828501011115613d5a57600080fd5b9250929050565b600060208284031215613d7357600080fd5b61385382613c09565b600080600080600060a08688031215613d9457600080fd5b613d9d86613c09565b9450613dab60208701613c09565b935060408601356001600160401b0380821115613dc757600080fd5b613dd389838a01613c25565b94506060880135915080821115613de957600080fd5b613df589838a01613c25565b93506080880135915080821115613e0b57600080fd5b50613e1888828901613caa565b9150509295509295909350565b600080600080600060a08688031215613e3d57600080fd5b613e4686613c09565b9450613e5460208701613c09565b9350604086013592506060860135915060808601356001600160401b03811115613e7d57600080fd5b613e1888828901613caa565b60008060408385031215613e9c57600080fd5b613ea583613c09565b91506020830135613eb581614638565b809150509250929050565b600080600080600080600060c0888a031215613edb57600080fd5b613ee488613c09565b9650602088013560038110613ef857600080fd5b955060408801359450606088013593506080880135925060a08801356001600160401b03811115613f2857600080fd5b613f348a828b01613d19565b989b979a50959850939692959293505050565b60008060408385031215613f5a57600080fd5b613f6383613c09565b946020939093013593505050565b600080600060608486031215613f8657600080fd5b613f8f84613c09565b95602085013595506040909401359392505050565b600060208284031215613fb657600080fd5b815161385381614638565b600060208284031215613fd357600080fd5b81356001600160e01b03198116811461385357600080fd5b60008060208385031215613ffe57600080fd5b82356001600160401b0381111561401457600080fd5b61402085828601613d19565b90969095509350505050565b60006020828403121561403e57600080fd5b5035919050565b60006020828403121561405757600080fd5b5051919050565b6000806040838503121561407157600080fd5b50508035926020909101359150565b6003811061409e57634e487b7160e01b600052602160045260246000fd5b9052565b6000815180845260005b818110156140c8576020818501810151868301820152016140ac565b818111156140da576000602083870101525b50601f01601f19169290920160200192915050565b600081546140fc81614574565b808552602060018381168015614119576001811461412d5761415b565b60ff1985168884015260408801955061415b565b866000528260002060005b858110156141535781548a8201860152908301908401614138565b890184019650505b505050505092915050565b8183823760009101908152919050565b600080835461418481614574565b6001828116801561419c57600181146141ad576141dc565b60ff198416875282870194506141dc565b8760005260208060002060005b858110156141d35781548a8201529084019082016141ba565b50505082870194505b50929695505050505050565b6001600160a01b03858116825284166020820152608060408201819052600090614214908301856140ef565b905082606083015295945050505050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b8381101561432757603f19898403018552815180518452878101516001600160a01b031688850152868101516101609061428889870182614080565b50606082810151908601526080808301519086015260a0808301516001600160a01b03811682880152505060c0828101516001600160a01b03811687830152505060e08083015182828801526142e0838801826140a2565b92505050610100808301518187015250610120808301516143048288018215159052565b50506101409182015115159490910193909352938601939086019060010161424c565b509098975050505050505050565b602080825282518282018190526000919060409081850190868401855b828110156143b7578151805185528681015187860152858101516001600160a01b031686860152606080820151908601526080808201519086015260a08082015115159086015260c09081015115159085015260e09093019290850190600101614352565b5091979650505050505050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b8681526001600160a01b0386811660208301528516604082015260a06060820181905281018390526000838560c0840137600060c0858401015260c0601f19601f8601168301019050826080830152979650505050505050565b8b81526001600160a01b038b811660208301526000906101609061447c604085018e614080565b8b60608501528a6080850152808a1660a085015280891660c0850152508060e08401526144ab818401886140a2565b610100840196909652505091151561012083015215156101409091015298975050505050505050565b604051601f8201601f191681016001600160401b03811182821017156144fc576144fc614622565b604052919050565b60008219821115614517576145176145e0565b500190565b60008261453957634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615614558576145586145e0565b500290565b60008282101561456f5761456f6145e0565b500390565b600181811c9082168061458857607f821691505b602082108114156145a957634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156145c3576145c36145e0565b5060010190565b634e487b7160e01b600052600160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b8015158114612eef57600080fdfea2646970667358221220c41f50b588772cd0977122454e7feaa244a2bc55778e8b7188e1e7e73bd6f4f964736f6c63430008060033

Deployed Bytecode

0x6080604052600436106102305760003560e01c80636a6e4c381161012e578063aad48c17116100ab578063c4b151411161006f578063c4b1514114610755578063dd473d2b1461076a578063e61a70c01461077f578063f23a6e61146107b6578063f8ce3164146107e257600080fd5b8063aad48c17146106b2578063b027a725146106d2578063b1433f7f146106e7578063bc197c81146106fd578063be9af5361461074257600080fd5b806395478fbf116100f257806395478fbf1461058757806396cbf2e9146105a7578063a28ad112146105c7578063a6e22b0214610672578063a7fa49c51461069257600080fd5b80636a6e4c38146104b357806371029ffd146104e35780637be3f006146105195780637ee87a271461052f5780638da5cb5b1461056757600080fd5b80632211fec4116101bc57806343b555dd1161018057806343b555dd14610413578063450defaa1461043357806346c4a388146104535780634a63421c146104735780634c89b86c1461049357600080fd5b80632211fec41461038757806329aa3a42146103a75780632a983a04146103bc5780632aa74ce4146103dc57806334a7f193146103fc57600080fd5b8063111992851161020357806311199285146102e757806313af403514610314578063166117e81461033457806317ce4f1e146103475780631e7c9e181461036757600080fd5b806301839ee31461023557806301ffc9a714610257578063023d20b01461028c5780630761b9bd146102b9575b600080fd5b34801561024157600080fd5b5061025561025036600461402c565b6107f8565b005b34801561026357600080fd5b50610277610272366004613fc1565b61086a565b60405190151581526020015b60405180910390f35b34801561029857600080fd5b506102ac6102a7366004613d61565b61088f565b6040516102839190614225565b3480156102c557600080fd5b506102d96102d436600461405e565b610c3a565b604051908152602001610283565b3480156102f357600080fd5b50610307610302366004613d61565b610c6b565b6040516102839190614335565b34801561032057600080fd5b5061025561032f366004613d61565b610f4e565b61025561034236600461402c565b610fd9565b34801561035357600080fd5b50610255610362366004613d61565b61124f565b34801561037357600080fd5b5061025561038236600461402c565b6112da565b34801561039357600080fd5b506102556103a2366004613e89565b61166a565b3480156103b357600080fd5b506102ac6116ac565b3480156103c857600080fd5b506102556103d736600461402c565b6119a7565b3480156103e857600080fd5b506102ac6103f736600461405e565b611a16565b34801561040857600080fd5b506004546102d99081565b34801561041f57600080fd5b5061030761042e36600461402c565b611d6c565b34801561043f57600080fd5b506102ac61044e366004613f71565b61203a565b34801561045f57600080fd5b5061025561046e366004613ec0565b6123a3565b34801561047f57600080fd5b5061025561048e36600461402c565b612704565b34801561049f57600080fd5b506102556104ae366004613d61565b612888565b3480156104bf57600080fd5b506102776104ce366004613d61565b60116020526000908152604090205460ff1681565b3480156104ef57600080fd5b506102d96104fe366004613d61565b6001600160a01b031660009081526010602052604090205490565b34801561052557600080fd5b506102d9600a5481565b34801561053b57600080fd5b5060095461054f906001600160a01b031681565b6040516001600160a01b039091168152602001610283565b34801561057357600080fd5b5060085461054f906001600160a01b031681565b34801561059357600080fd5b506102ac6105a2366004613feb565b612908565b3480156105b357600080fd5b506102556105c2366004613d61565b612d8b565b3480156105d357600080fd5b5061062d6105e236600461402c565b600f60205260009081526040902080546001820154600283015460038401546004850154600590950154939492936001600160a01b0390921692909160ff8082169161010090041687565b6040805197885260208801969096526001600160a01b03909416948601949094526060850191909152608084015290151560a0830152151560c082015260e001610283565b34801561067e57600080fd5b5061025561068d36600461402c565b612e0c565b34801561069e57600080fd5b506102d96106ad366004613f47565b612ef2565b3480156106be57600080fd5b506103076106cd366004613f71565b612f0e565b3480156106de57600080fd5b506102d96131f0565b3480156106f357600080fd5b506102d9600c5481565b34801561070957600080fd5b50610729610718366004613d7c565b63bc197c8160e01b95945050505050565b6040516001600160e01b03199091168152602001610283565b61025561075036600461402c565b613216565b34801561076157600080fd5b506102d9613602565b34801561077657600080fd5b50610255613612565b34801561078b57600080fd5b5061079f61079a36600461402c565b613711565b6040516102839b9a99989796959493929190614455565b3480156107c257600080fd5b506107296107d1366004613e25565b63f23a6e6160e01b95945050505050565b3480156107ee57600080fd5b506102d9600b5481565b6008546001600160a01b0316331461080f57600080fd5b60058111156108655760405162461bcd60e51b815260206004820152601760248201527f3525206d6178696d756d2066656520616c6c6f7765642e00000000000000000060448201526064015b60405180910390fd5b600a55565b60006001600160e01b03198216630271189760e51b1480610889575060015b92915050565b6060600061089c60045490565b905060008060005b8381101561096b576001600160a01b038616600d60006108c5846001614504565b81526020810191909152604001600020600401546001600160a01b03161480156109175750600d60006108f9836001614504565b8152602081019190915260400160002060080154610100900460ff16155b80156109465750600d600061092d836001614504565b815260208101919091526040016000206008015460ff16155b1561095957610956600184614504565b92505b80610963816145af565b9150506108a4565b506000826001600160401b0381111561098657610986614622565b6040519080825280602002602001820160405280156109bf57816020015b6109ac613acc565b8152602001906001900390816109a45790505b50905060005b84811015610c30576001600160a01b038716600d60006109e6846001614504565b81526020810191909152604001600020600401546001600160a01b0316148015610a385750600d6000610a1a836001614504565b8152602081019190915260400160002060080154610100900460ff16155b8015610a675750600d6000610a4e836001614504565b815260208101919091526040016000206008015460ff16155b15610c1e576000600d81610a7c846001614504565b81526020808201929092526040908101600090812054808252600d8452908290208251610160810184528154815260018201546001600160a01b03811695820195909552919450929091839190830190600160a01b900460ff166002811115610ae757610ae76145f6565b6002811115610af857610af86145f6565b8152600282015460208201526003820154604082015260048201546001600160a01b039081166060830152600583015416608082015260068201805460a090920191610b4390614574565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6f90614574565b8015610bbc5780601f10610b9157610100808354040283529160200191610bbc565b820191906000526020600020905b815481529060010190602001808311610b9f57829003601f168201915b50505091835250506007820154602082015260089091015460ff808216151560408401526101009091041615156060909101528451859087908110610c0357610c0361460c565b6020908102919091010152610c19600186614504565b945050505b80610c28816145af565b9150506109c5565b5095945050505050565b600e6020528160005260406000208181548110610c5657600080fd5b90600052602060002001600091509150505481565b6001600160a01b03811660009081526010602090815260408083208054825181850281018501909352808352606094938493929190830182828015610ccf57602002820191906000526020600020905b815481526020019060010190808311610cbb575b5050505050905060005b8151811015610d8457600f6000838381518110610cf857610cf861460c565b602090810291909101810151825281019190915260400160002060050154610100900460ff16158015610d5f5750600f6000838381518110610d3c57610d3c61460c565b60209081029190910181015182528101919091526040016000206005015460ff16155b15610d725782610d6e816145af565b9350505b80610d7c816145af565b915050610cd9565b506000826001600160401b03811115610d9f57610d9f614622565b604051908082528060200260200182016040528015610dd857816020015b610dc5613b26565b815260200190600190039081610dbd5790505b5090506000805b8351811015610f4357600f6000858381518110610dfe57610dfe61460c565b602090810291909101810151825281019190915260400160002060050154610100900460ff16158015610e655750600f6000858381518110610e4257610e4261460c565b60209081029190910181015182528101919091526040016000206005015460ff16155b15610f31576000600f6000868481518110610e8257610e8261460c565b6020908102919091018101518252818101929092526040908101600020815160e0810183528154815260018201549381019390935260028101546001600160a01b03169183019190915260038101546060830152600481015460808301526005015460ff808216151560a084015261010090910416151560c082015284519091508190859085908110610f1757610f1761460c565b6020908102919091010152610f2d600184614504565b9250505b80610f3b816145af565b915050610ddf565b509095945050505050565b6008546001600160a01b03163314610f6557600080fd5b6001600160a01b038116610fb75760405162461bcd60e51b81526020600482015260196024820152780c1e0c081859191c995cdcc81b9bdd081c195c9b5a5d1d1959603a1b604482015260640161085c565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b60026000541415610ffc5760405162461bcd60e51b815260040161085c906143c4565b60026000908155818152600d60205260409020600101546001600160a01b03161580159061103c57506000818152600d602052604090206008015460ff16155b801561105f57506000818152600d6020526040902060080154610100900460ff16155b61109e5760405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b21034ba32b69034b21760811b604482015260640161085c565b600034116110e55760405162461bcd60e51b815260206004820152601460248201527321b0b713ba1037b33332b9103737ba3434b7339760611b604482015260640161085c565b6110f3600780546001019055565b60006110fe60075490565b6040805160e0810182528281526020808201868152338385018181523460608087018281524260808901908152600060a08a0181815260c08b018281528d8352600f8b528c83208c51815599516001808c0191909155975160028b0180546001600160a01b039283166001600160a01b0319909116179055945160038b015592516004808b0191909155905160059099018054935115156101000261ff00199a15159a909a1661ffff1990941693909317989098179091558c8152600e885289812080548087018255908252888220018b90558581526010885289812080548087018255908252888220018b90558c8152600d88528990209384015493909501548851908616815295860193909352848701529451959650929493169286927f9078ebced75ce8ca9324d2ab0c437296b64a0eff2a049ae70dde1790b443ede1928290030190a35050600160005550565b6008546001600160a01b0316331461126657600080fd5b6001600160a01b0381166112b85760405162461bcd60e51b81526020600482015260196024820152780c1e0c081859191c995cdcc81b9bdd081c195c9b5a5d1d1959603a1b604482015260640161085c565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b600260005414156112fd5760405162461bcd60e51b815260040161085c906143c4565b60026000908155818152600f6020908152604080832060010154808452600d909252909120600401546001600160a01b0316331461136f5760405162461bcd60e51b815260206004820152600f60248201526e2737ba1034ba32b69039b2b63632b960891b604482015260640161085c565b6000828152600f6020526040902060050154610100900460ff161580156113a857506000828152600f602052604090206005015460ff16155b6113f45760405162461bcd60e51b815260206004820152601e60248201527f416c7265616479206163636570746564206f722063616e63656c6c65642e0000604482015260640161085c565b6000828152600f602052604081206003810154600290910154600a5491926001600160a01b03909116916114339061142d856064613809565b9061381e565b6009549091506001600160a01b0316156114d8576009546040516303793c8d60e11b81523360048201526000916001600160a01b0316906306f2791a9060240160206040518083038186803b15801561148b57600080fd5b505afa15801561149f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c39190614045565b90506114d48161142d846064613809565b9150505b60006114e4848361385a565b604051909150339082156108fc029083906000818181858888f19350505050158015611514573d6000803e3d6000fd5b5081156115335781600b600082825461152d9190614504565b90915550505b6000858152600d6020818152604080842060018101548b8652600f8452918520600290810154958b905293909252918101546003909101546115929360ff600160a01b850416936001600160a01b039081169330939290911691613876565b6000868152600f602090815260408083206005808201805461ff001916610100179055898552600d9093529281902060088101805460ff1916600190811790915560029485015482850180546001600160a01b0319166001600160a01b039283161790558454820190945593810154938101549151919092169188917f1f4ecd8562ffa9ee0b2ae53cd3747ab603ad7fd1a39605f4a9cb2fc083cd7b6a916116459133918a916006909101908c906141e8565b60405180910390a4600c5461165a9085613aad565b600c555050600160005550505050565b6008546001600160a01b0316331461168157600080fd5b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b606060006116b960045490565b905060006116c660065490565b6005546116d39190614504565b6004546116e0919061455d565b9050600080826001600160401b038111156116fd576116fd614622565b60405190808252806020026020018201604052801561173657816020015b611723613acc565b81526020019060019003908161171b5790505b50905060005b8481101561199e576000600d81611754846001614504565b81526020810191909152604001600020600501546001600160a01b03161480156117a65750600d6000611788836001614504565b8152602081019190915260400160002060080154610100900460ff16155b80156117d55750600d60006117bc836001614504565b815260208101919091526040016000206008015460ff16155b1561198c576000600d816117ea846001614504565b81526020808201929092526040908101600090812054808252600d8452908290208251610160810184528154815260018201546001600160a01b03811695820195909552919450929091839190830190600160a01b900460ff166002811115611855576118556145f6565b6002811115611866576118666145f6565b8152600282015460208201526003820154604082015260048201546001600160a01b039081166060830152600583015416608082015260068201805460a0909201916118b190614574565b80601f01602080910402602001604051908101604052809291908181526020018280546118dd90614574565b801561192a5780601f106118ff5761010080835404028352916020019161192a565b820191906000526020600020905b81548152906001019060200180831161190d57829003601f168201915b50505091835250506007820154602082015260089091015460ff8082161515604084015261010090910416151560609091015284518590879081106119715761197161460c565b6020908102919091010152611987600186614504565b945050505b80611996816145af565b91505061173c565b50949350505050565b6008546001600160a01b031633146119be57600080fd5b600354811180156119d0575060648111155b611a115760405162461bcd60e51b815260206004820152601260248201527124b73b30b634b2103732bb9039b634b1b29760711b604482015260640161085c565b600355565b6060611a2160045490565b83108015611a3157506004548211155b611a725760405162461bcd60e51b81526020600482015260126024820152712830b3b29037baba1037b3103930b733b29760711b604482015260640161085c565b6000835b838111611aff576000818152600d60205260409020600501546001600160a01b0316158015611abc57506000818152600d6020526040902060080154610100900460ff16155b8015611ada57506000818152600d602052604090206008015460ff16155b15611aed5781611ae9816145af565b9250505b80611af7816145af565b915050611a76565b50600080826001600160401b03811115611b1b57611b1b614622565b604051908082528060200260200182016040528015611b5457816020015b611b41613acc565b815260200190600190039081611b395790505b509050855b858111610c30576000818152600d60205260409020600501546001600160a01b0316158015611b9f57506000818152600d6020526040902060080154610100900460ff16155b8015611bbd57506000818152600d602052604090206008015460ff16155b15611d5a576000818152600d6020908152604080832054808452928190208151610160810183528154815260018201546001600160a01b0381169482019490945290929091839190830190600160a01b900460ff166002811115611c2357611c236145f6565b6002811115611c3457611c346145f6565b8152600282015460208201526003820154604082015260048201546001600160a01b039081166060830152600583015416608082015260068201805460a090920191611c7f90614574565b80601f0160208091040260200160405190810160405280929190818152602001828054611cab90614574565b8015611cf85780601f10611ccd57610100808354040283529160200191611cf8565b820191906000526020600020905b815481529060010190602001808311611cdb57829003601f168201915b50505091835250506007820154602082015260089091015460ff808216151560408401526101009091041615156060909101528451859087908110611d3f57611d3f61460c565b6020908102919091010152611d55600186614504565b945050505b80611d64816145af565b915050611b59565b6000818152600e602090815260408083208054825181850281018501909352808352606094938493929190830182828015611dc657602002820191906000526020600020905b815481526020019060010190808311611db2575b5050505050905060005b8151811015611e7b57600f6000838381518110611def57611def61460c565b602090810291909101810151825281019190915260400160002060050154610100900460ff16158015611e565750600f6000838381518110611e3357611e3361460c565b60209081029190910181015182528101919091526040016000206005015460ff16155b15611e695782611e65816145af565b9350505b80611e73816145af565b915050611dd0565b506000826001600160401b03811115611e9657611e96614622565b604051908082528060200260200182016040528015611ecf57816020015b611ebc613b26565b815260200190600190039081611eb45790505b5090506000805b8351811015610f4357600f6000858381518110611ef557611ef561460c565b602090810291909101810151825281019190915260400160002060050154610100900460ff16158015611f5c5750600f6000858381518110611f3957611f3961460c565b60209081029190910181015182528101919091526040016000206005015460ff16155b15612028576000600f6000868481518110611f7957611f7961460c565b6020908102919091018101518252818101929092526040908101600020815160e0810183528154815260018201549381019390935260028101546001600160a01b03169183019190915260038101546060830152600481015460808301526005015460ff808216151560a084015261010090910416151560c08201528451909150819085908590811061200e5761200e61460c565b6020908102919091010152612024600184614504565b9250505b80612032816145af565b915050611ed6565b606061204560045490565b8310801561205557506004548211155b6120965760405162461bcd60e51b81526020600482015260126024820152712830b3b29037baba1037b3103930b733b29760711b604482015260640161085c565b600080845b848111612128576000818152600d60205260409020600401546001600160a01b0388811691161480156120e557506000818152600d6020526040902060080154610100900460ff16155b801561210357506000818152600d602052604090206008015460ff16155b1561211657612113600184614504565b92505b80612120816145af565b91505061209b565b506000826001600160401b0381111561214357612143614622565b60405190808252806020026020018201604052801561217c57816020015b612169613acc565b8152602001906001900390816121615790505b509050855b858111612398576000818152600d60205260409020600401546001600160a01b0389811691161480156121cb57506000818152600d6020526040902060080154610100900460ff16155b80156121e957506000818152600d602052604090206008015460ff16155b15612386576000818152600d6020908152604080832054808452928190208151610160810183528154815260018201546001600160a01b0381169482019490945290929091839190830190600160a01b900460ff16600281111561224f5761224f6145f6565b6002811115612260576122606145f6565b8152600282015460208201526003820154604082015260048201546001600160a01b039081166060830152600583015416608082015260068201805460a0909201916122ab90614574565b80601f01602080910402602001604051908101604052809291908181526020018280546122d790614574565b80156123245780601f106122f957610100808354040283529160200191612324565b820191906000526020600020905b81548152906001019060200180831161230757829003601f168201915b50505091835250506007820154602082015260089091015460ff80821615156040840152610100909104161515606090910152845185908790811061236b5761236b61460c565b6020908102919091010152612381600186614504565b945050505b80612390816145af565b915050612181565b509695505050505050565b600260005414156123c65760405162461bcd60e51b815260040161085c906143c4565b6002600055826124105760405162461bcd60e51b81526020600482015260156024820152744e6f206974656d20666f722066726565206865726560581b604482015260640161085c565b600084116124555760405162461bcd60e51b815260206004820152601260248201527120ba103632b0b9ba1037b732903a37b5b2b760711b604482015260640161085c565b6001600160a01b03871660009081526011602052604090205460ff1615156001146124c25760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e20636f6e7472616374206e6f7420617070726f7665640000000000604482015260640161085c565b6124d0600480546001019055565b60006124db60045490565b9050604051806101600160405280828152602001896001600160a01b03168152602001886002811115612510576125106145f6565b8152602001878152602001868152602001336001600160a01b0316815260200160006001600160a01b0316815260200184848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250938552505050602080830188905260408084018390526060909301829052848252600d81529082902083518155908301516001820180546001600160a01b039092166001600160a01b031983168117825593850151929390916001600160a81b03191617600160a01b8360028111156125ed576125ed6145f6565b0217905550606082015160028201556080820151600382015560a08201516004820180546001600160a01b039283166001600160a01b03199182161790915560c084015160058401805491909316911617905560e0820151805161265b916006840191602090910190613b70565b50610100828101516007830155610120830151600890920180546101409094015161ffff1990941692151561ff00191692909217921515029190911790556126a7878933308a8a613876565b85886001600160a01b0316827fb14a35721f094e1cc300be4448eaca7bfd8ea84ec6ce595ef237cfdd3220d0e38833600089898c6040516126ed969594939291906143fb565b60405180910390a450506001600055505050505050565b600260005414156127275760405162461bcd60e51b815260040161085c906143c4565b60026000818155828152600f6020526040902001546001600160a01b03163314801561276557506000818152600f602052604090206005015460ff16155b6127c45760405162461bcd60e51b815260206004820152602a60248201527f57726f6e6720626964646572206f72206f6666657220697320616c72656164796044820152690818d85b98d95b1b195960b21b606482015260840161085c565b6000818152600f6020526040902060050154610100900460ff161561281f5760405162461bcd60e51b815260206004820152601160248201527020b63932b0b23c9030b1b1b2b83a32b21760791b604482015260640161085c565b6000818152600f6020526040808220600281015460058201805460ff1916600117905560039091015491516001600160a01b0390911692839280156108fc02929091818181858888f1935050505015801561287e573d6000803e3d6000fd5b5050600160005550565b6008546001600160a01b0316331461289f57600080fd5b6001600160a01b0381166128e65760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a59081dd85b1b195d60921b604482015260640161085c565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6060600061291560045490565b905060008060005b83811015612a55578686604051602001612938929190614166565b60405160208183030381529060405280519060200120600d600083600161295f9190614504565b81526020019081526020016000206006016040516020016129809190614176565b604051602081830303815290604052805190602001201480156129cd57506000600d816129ae846001614504565b81526020810191909152604001600020600501546001600160a01b0316145b8015612a015750600d60006129e3836001614504565b8152602081019190915260400160002060080154610100900460ff16155b8015612a305750600d6000612a17836001614504565b815260208101919091526040016000206008015460ff16155b15612a4357612a40600184614504565b92505b80612a4d816145af565b91505061291d565b506000826001600160401b03811115612a7057612a70614622565b604051908082528060200260200182016040528015612aa957816020015b612a96613acc565b815260200190600190039081612a8e5790505b50905060005b84811015612398578787604051602001612aca929190614166565b60405160208183030381529060405280519060200120600d6000836001612af19190614504565b8152602001908152602001600020600601604051602001612b129190614176565b60405160208183030381529060405280519060200120148015612b5f57506000600d81612b40846001614504565b81526020810191909152604001600020600501546001600160a01b0316145b8015612b935750600d6000612b75836001614504565b8152602081019190915260400160002060080154610100900460ff16155b8015612bc25750600d6000612ba9836001614504565b815260208101919091526040016000206008015460ff16155b15612d79576000600d81612bd7846001614504565b81526020808201929092526040908101600090812054808252600d8452908290208251610160810184528154815260018201546001600160a01b03811695820195909552919450929091839190830190600160a01b900460ff166002811115612c4257612c426145f6565b6002811115612c5357612c536145f6565b8152600282015460208201526003820154604082015260048201546001600160a01b039081166060830152600583015416608082015260068201805460a090920191612c9e90614574565b80601f0160208091040260200160405190810160405280929190818152602001828054612cca90614574565b8015612d175780601f10612cec57610100808354040283529160200191612d17565b820191906000526020600020905b815481529060010190602001808311612cfa57829003601f168201915b50505091835250506007820154602082015260089091015460ff808216151560408401526101009091041615156060909101528451859087908110612d5e57612d5e61460c565b6020908102919091010152612d74600186614504565b945050505b80612d83816145af565b915050612aaf565b6008546001600160a01b03163314612da257600080fd5b6001600160a01b038116612dea5760405162461bcd60e51b815260206004820152600f60248201526e24b73b30b634b2103bb0b63632ba1760891b604482015260640161085c565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b600454811115612e1b57600080fd5b6000818152600d60205260409020600401546001600160a01b03163314612e4157600080fd5b6000818152600d6020526040902060080154610100900460ff16158015612e7a57506000818152600d602052604090206008015460ff16155b612e8357600080fd5b6000818152600d60205260409020600801805461ff001916610100179055612eaf600680546001019055565b6000818152600d6020526040902060018101546002820154600390920154612eef9260ff600160a01b840416926001600160a01b03169130913391613876565b50565b60106020528160005260406000208181548110610c5657600080fd5b6001600160a01b03831660009081526010602090815260408083208054825181850281018501909352808352606094938493929190830182828015612f7257602002820191906000526020600020905b815481526020019060010190808311612f5e575b509394508893505050505b84811161302657600f6000838381518110612f9a57612f9a61460c565b602090810291909101810151825281019190915260400160002060050154610100900460ff161580156130015750600f6000838381518110612fde57612fde61460c565b60209081029190910181015182528101919091526040016000206005015460ff16155b156130145782613010816145af565b9350505b8061301e816145af565b915050612f7d565b506000826001600160401b0381111561304157613041614622565b60405190808252806020026020018201604052801561307a57816020015b613067613b26565b81526020019060019003908161305f5790505b5090506000865b8681116131e357600f600085838151811061309e5761309e61460c565b602090810291909101810151825281019190915260400160002060050154610100900460ff161580156131055750600f60008583815181106130e2576130e261460c565b60209081029190910181015182528101919091526040016000206005015460ff16155b156131d1576000600f60008684815181106131225761312261460c565b6020908102919091018101518252818101929092526040908101600020815160e0810183528154815260018201549381019390935260028101546001600160a01b03169183019190915260038101546060830152600481015460808301526005015460ff808216151560a084015261010090910416151560c0820152845190915081908590859081106131b7576131b761460c565b60209081029190910101526131cd600184614504565b9250505b806131db816145af565b915050613081565b5090979650505050505050565b6000806131fc60065490565b6005546132099190614504565b600454610889919061455d565b600260005414156132395760405162461bcd60e51b815260040161085c906143c4565b60026000818155828152600d6020526040902060078101549101543482146132a35760405162461bcd60e51b815260206004820152601d60248201527f4e6f742074686520636f7272656374206d6573736167652076616c7565000000604482015260640161085c565b6000838152600d602052604090206008015460ff16156133055760405162461bcd60e51b815260206004820152601a60248201527f54686973206974656d20697320616c726561647920736f6c642e000000000000604482015260640161085c565b6000838152600d6020526040902060080154610100900460ff161561336c5760405162461bcd60e51b815260206004820152601a60248201527f54686973206974656d206973206e6f7420666f722073616c652e000000000000604482015260640161085c565b6000838152600d60205260409020600401546001600160a01b03163314156133d65760405162461bcd60e51b815260206004820152601960248201527f43616e6e6f742062757920796f7572206f776e206974656d2e00000000000000604482015260640161085c565b60006133e9600a5461142d856064613809565b6009549091506001600160a01b03161561348e576009546040516303793c8d60e11b81523360048201526000916001600160a01b0316906306f2791a9060240160206040518083038186803b15801561344157600080fd5b505afa158015613455573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134799190614045565b905061348a8161142d846064613809565b9150505b600061349a848361385a565b6000868152600d60205260408082206004015490519293506001600160a01b03169183156108fc0291849190818181858888f193505050501580156134e3573d6000803e3d6000fd5b5081600b60008282546134f69190614504565b90915550506000858152600d60205260409020600181015460039091015461353a9160ff600160a01b820416916001600160a01b0390911690309033908890613876565b6000858152600d6020526040902060088101805460ff19166001179055600590810180546001600160a01b031916331790556135799080546001019055565b600c546135869085613aad565b600c556000858152600d60205260409081902060018101546004820154925186936001600160a01b03928316938a937f1f4ecd8562ffa9ee0b2ae53cd3747ab603ad7fd1a39605f4a9cb2fc083cd7b6a936135ee939091169133916006909101908c906141e8565b60405180910390a450506001600055505050565b600061360d60055490565b905090565b6001546001600160a01b031633148061363557506002546001600160a01b031633145b8061364a57506008546001600160a01b031633145b61365357600080fd5b6000600b541161366257600080fd5b600061367760035461142d600b546064613809565b9050600061369082600b5461385a90919063ffffffff16565b6000600b8190556001546040519293506001600160a01b03169183156108fc0291849190818181858888f193505050501580156136d1573d6000803e3d6000fd5b506002546040516001600160a01b039091169083156108fc029084906000818181858888f1935050505015801561370c573d6000803e3d6000fd5b505050565b600d60205260009081526040902080546001820154600283015460038401546004850154600586015460068701805496976001600160a01b0380881698600160a01b90980460ff16979481169493169290919061376d90614574565b80601f016020809104026020016040519081016040528092919081815260200182805461379990614574565b80156137e65780601f106137bb576101008083540402835291602001916137e6565b820191906000526020600020905b8154815290600101906020018083116137c957829003601f168201915b50505050600783015460089093015491929160ff8082169250610100909104168b565b600080613816838561451c565b949350505050565b60008261382d57506000610889565b6000613839838561453e565b905082613846858361451c565b14613853576138536145ca565b9392505050565b60008282111561386c5761386c6145ca565b613853828461455d565b600086600281111561388a5761388a6145f6565b1415613900576040516323b872dd60e01b81526001600160a01b0385811660048301528481166024830152604482018490528616906323b872dd906064015b600060405180830381600087803b1580156138e357600080fd5b505af11580156138f7573d6000803e3d6000fd5b50505050613aa5565b6001866002811115613914576139146145f6565b141561396c57604051637921219560e11b81526001600160a01b0385811660048301528481166024830152604482018490526001606483015260a06084830152600060a483015286169063f242432a9060c4016138c9565b6002866002811115613980576139806145f6565b1415613aa5576001600160a01b038416301415613a195760405163095ea7b360e01b8152306004820152602481018290526001600160a01b0386169063095ea7b390604401602060405180830381600087803b1580156139df57600080fd5b505af11580156139f3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a179190613fa4565b505b6040516323b872dd60e01b81526001600160a01b0385811660048301528481166024830152604482018390528616906323b872dd90606401602060405180830381600087803b158015613a6b57600080fd5b505af1158015613a7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613aa39190613fa4565b505b505050505050565b600080613aba8385614504565b905083811015613853576138536145ca565b6040805161016081018252600080825260208201819052909182019081526000602082018190526040820181905260608083018290526080830182905260a083015260c0820181905260e082018190526101009091015290565b6040518060e00160405280600081526020016000815260200160006001600160a01b0316815260200160008152602001600081526020016000151581526020016000151581525090565b828054613b7c90614574565b90600052602060002090601f016020900481019282613b9e5760008555613be4565b82601f10613bb757805160ff1916838001178555613be4565b82800160010185558215613be4579182015b82811115613be4578251825591602001919060010190613bc9565b50613bf0929150613bf4565b5090565b5b80821115613bf05760008155600101613bf5565b80356001600160a01b0381168114613c2057600080fd5b919050565b600082601f830112613c3657600080fd5b813560206001600160401b03821115613c5157613c51614622565b8160051b613c608282016144d4565b838152828101908684018388018501891015613c7b57600080fd5b600093505b85841015613c9e578035835260019390930192918401918401613c80565b50979650505050505050565b600082601f830112613cbb57600080fd5b81356001600160401b03811115613cd457613cd4614622565b613ce7601f8201601f19166020016144d4565b818152846020838601011115613cfc57600080fd5b816020850160208301376000918101602001919091529392505050565b60008083601f840112613d2b57600080fd5b5081356001600160401b03811115613d4257600080fd5b602083019150836020828501011115613d5a57600080fd5b9250929050565b600060208284031215613d7357600080fd5b61385382613c09565b600080600080600060a08688031215613d9457600080fd5b613d9d86613c09565b9450613dab60208701613c09565b935060408601356001600160401b0380821115613dc757600080fd5b613dd389838a01613c25565b94506060880135915080821115613de957600080fd5b613df589838a01613c25565b93506080880135915080821115613e0b57600080fd5b50613e1888828901613caa565b9150509295509295909350565b600080600080600060a08688031215613e3d57600080fd5b613e4686613c09565b9450613e5460208701613c09565b9350604086013592506060860135915060808601356001600160401b03811115613e7d57600080fd5b613e1888828901613caa565b60008060408385031215613e9c57600080fd5b613ea583613c09565b91506020830135613eb581614638565b809150509250929050565b600080600080600080600060c0888a031215613edb57600080fd5b613ee488613c09565b9650602088013560038110613ef857600080fd5b955060408801359450606088013593506080880135925060a08801356001600160401b03811115613f2857600080fd5b613f348a828b01613d19565b989b979a50959850939692959293505050565b60008060408385031215613f5a57600080fd5b613f6383613c09565b946020939093013593505050565b600080600060608486031215613f8657600080fd5b613f8f84613c09565b95602085013595506040909401359392505050565b600060208284031215613fb657600080fd5b815161385381614638565b600060208284031215613fd357600080fd5b81356001600160e01b03198116811461385357600080fd5b60008060208385031215613ffe57600080fd5b82356001600160401b0381111561401457600080fd5b61402085828601613d19565b90969095509350505050565b60006020828403121561403e57600080fd5b5035919050565b60006020828403121561405757600080fd5b5051919050565b6000806040838503121561407157600080fd5b50508035926020909101359150565b6003811061409e57634e487b7160e01b600052602160045260246000fd5b9052565b6000815180845260005b818110156140c8576020818501810151868301820152016140ac565b818111156140da576000602083870101525b50601f01601f19169290920160200192915050565b600081546140fc81614574565b808552602060018381168015614119576001811461412d5761415b565b60ff1985168884015260408801955061415b565b866000528260002060005b858110156141535781548a8201860152908301908401614138565b890184019650505b505050505092915050565b8183823760009101908152919050565b600080835461418481614574565b6001828116801561419c57600181146141ad576141dc565b60ff198416875282870194506141dc565b8760005260208060002060005b858110156141d35781548a8201529084019082016141ba565b50505082870194505b50929695505050505050565b6001600160a01b03858116825284166020820152608060408201819052600090614214908301856140ef565b905082606083015295945050505050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b8381101561432757603f19898403018552815180518452878101516001600160a01b031688850152868101516101609061428889870182614080565b50606082810151908601526080808301519086015260a0808301516001600160a01b03811682880152505060c0828101516001600160a01b03811687830152505060e08083015182828801526142e0838801826140a2565b92505050610100808301518187015250610120808301516143048288018215159052565b50506101409182015115159490910193909352938601939086019060010161424c565b509098975050505050505050565b602080825282518282018190526000919060409081850190868401855b828110156143b7578151805185528681015187860152858101516001600160a01b031686860152606080820151908601526080808201519086015260a08082015115159086015260c09081015115159085015260e09093019290850190600101614352565b5091979650505050505050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b8681526001600160a01b0386811660208301528516604082015260a06060820181905281018390526000838560c0840137600060c0858401015260c0601f19601f8601168301019050826080830152979650505050505050565b8b81526001600160a01b038b811660208301526000906101609061447c604085018e614080565b8b60608501528a6080850152808a1660a085015280891660c0850152508060e08401526144ab818401886140a2565b610100840196909652505091151561012083015215156101409091015298975050505050505050565b604051601f8201601f191681016001600160401b03811182821017156144fc576144fc614622565b604052919050565b60008219821115614517576145176145e0565b500190565b60008261453957634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615614558576145586145e0565b500290565b60008282101561456f5761456f6145e0565b500390565b600181811c9082168061458857607f821691505b602082108114156145a957634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156145c3576145c36145e0565b5060010190565b634e487b7160e01b600052600160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b8015158114612eef57600080fdfea2646970667358221220c41f50b588772cd0977122454e7feaa244a2bc55778e8b7188e1e7e73bd6f4f964736f6c63430008060033

Deployed Bytecode Sourcemap

17880:25578:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41083:169;;;;;;;;;;-1:-1:-1;41083:169:0;;;;;:::i;:::-;;:::i;:::-;;42360:184;;;;;;;;;;-1:-1:-1;42360:184:0;;;;;:::i;:::-;;:::i;:::-;;;16420:14:1;;16413:22;16395:41;;16383:2;16368:18;42360:184:0;;;;;;;;28546:1427;;;;;;;;;;-1:-1:-1;28546:1427:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;19840:59::-;;;;;;;;;;-1:-1:-1;19840:59:0;;;;;:::i;:::-;;:::i;:::-;;;23876:25:1;;;23864:2;23849:18;19840:59:0;23831:76:1;37289:1188:0;;;;;;;;;;-1:-1:-1;37289:1188:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;41260:164::-;;;;;;;;;;-1:-1:-1;41260:164:0;;;;;:::i;:::-;;:::i;33528:1080::-;;;;;;:::i;:::-;;:::i;41432:205::-;;;;;;;;;;-1:-1:-1;41432:205:0;;;;;:::i;:::-;;:::i;34616:2007::-;;;;;;;;;;-1:-1:-1;34616:2007:0;;;;;:::i;:::-;;:::i;41645:162::-;;;;;;;;;;-1:-1:-1;41645:162:0;;;;;:::i;:::-;;:::i;27579:920::-;;;;;;;;;;;;;:::i;43241:212::-;;;;;;;;;;-1:-1:-1;43241:212:0;;;;;:::i;:::-;;:::i;26325:1196::-;;;;;;;;;;-1:-1:-1;26325:1196:0;;;;;:::i;:::-;;:::i;18330:32::-;;;;;;;;;;-1:-1:-1;18330:32:0;;;;;;39858:1184;;;;;;;;;;-1:-1:-1;39858:1184:0;;;;;:::i;:::-;;:::i;30023:1322::-;;;;;;;;;;-1:-1:-1;30023:1322:0;;;;;:::i;:::-;;:::i;22234:1304::-;;;;;;;;;;-1:-1:-1;22234:1304:0;;;;;:::i;:::-;;:::i;36631:649::-;;;;;;;;;;-1:-1:-1;36631:649:0;;;;;:::i;:::-;;:::i;42910:157::-;;;;;;;;;;-1:-1:-1;42910:157:0;;;;;:::i;:::-;;:::i;20044:55::-;;;;;;;;;;-1:-1:-1;20044:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;38486:150;;;;;;;;;;-1:-1:-1;38486:150:0;;;;;:::i;:::-;-1:-1:-1;;;;;38589:31:0;38562:7;38589:31;;;:22;:31;;;;;:38;;38486:150;18817:36;;;;;;;;;;;;;;;;18670:45;;;;;;;;;;-1:-1:-1;18670:45:0;;;;-1:-1:-1;;;;;18670:45:0;;;;;;-1:-1:-1;;;;;9834:32:1;;;9816:51;;9804:2;9789:18;18670:45:0;9771:102:1;18599:28:0;;;;;;;;;;-1:-1:-1;18599:28:0;;;;-1:-1:-1;;;;;18599:28:0;;;31437:1501;;;;;;;;;;-1:-1:-1;31437:1501:0;;;;;:::i;:::-;;:::i;43075:158::-;;;;;;;;;;-1:-1:-1;43075:158:0;;;;;:::i;:::-;;:::i;19908:59::-;;;;;;;;;;-1:-1:-1;19908:59:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19908:59:0;;;;;;;;;;;;;;;;;;;;;26085:25:1;;;26141:2;26126:18;;26119:34;;;;-1:-1:-1;;;;;26189:32:1;;;26169:18;;;26162:60;;;;26253:2;26238:18;;26231:34;;;;26296:3;26281:19;;26274:35;26353:14;;26346:22;26209:3;26325:19;;26318:51;26413:14;26406:22;26400:3;26385:19;;26378:51;26072:3;26057:19;19908:59:0;26039:396:1;23592:682:0;;;;;;;;;;-1:-1:-1;23592:682:0;;;;;:::i;:::-;;:::i;19976:59::-;;;;;;;;;;-1:-1:-1;19976:59:0;;;;;:::i;:::-;;:::i;38645:1205::-;;;;;;;;;;-1:-1:-1;38645:1205:0;;;;;:::i;:::-;;:::i;33157:225::-;;;;;;;;;;;;;:::i;18947:31::-;;;;;;;;;;;;;;;;42095:255;;;;;;;;;;-1:-1:-1;42095:255:0;;;;;:::i;:::-;-1:-1:-1;;;42095:255:0;;;;;;;;;;;-1:-1:-1;;;;;;16609:33:1;;;16591:52;;16579:2;16564:18;42095:255:0;16546:103:1;24332:1985:0;;;;;;:::i;:::-;;:::i;32996:102::-;;;;;;;;;;;;;:::i;42552:350::-;;;;;;;;;;;;;:::i;19779:52::-;;;;;;;;;;-1:-1:-1;19779:52:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;41860:227::-;;;;;;;;;;-1:-1:-1;41860:227:0;;;;;:::i;:::-;-1:-1:-1;;;41860:227:0;;;;;;;;18905:33;;;;;;;;;;;;;;;;41083:169;18035:5;;-1:-1:-1;;;;;18035:5:0;18021:10;:19;18013:28;;;;;;41177:1:::1;41166:7;:12;;41158:48;;;::::0;-1:-1:-1;;;41158:48:0;;17555:2:1;41158:48:0::1;::::0;::::1;17537:21:1::0;17594:2;17574:18;;;17567:30;17633:25;17613:18;;;17606:53;17676:18;;41158:48:0::1;;;;;;;;;41217:17;:27:::0;41083:169::o;42360:184::-;42439:4;-1:-1:-1;;;;;;42466:49:0;;-1:-1:-1;;;42466:49:0;;:70;;;42532:4;42466:70;42459:77;42360:184;-1:-1:-1;;42360:184:0:o;28546:1427::-;28645:19;28682:22;28707:18;:8;44285:14;;44193:114;28707:18;28682:43;;28736:17;28768:20;28810:9;28805:449;28829:14;28825:1;:18;28805:449;;;-1:-1:-1;;;;;28887:39:0;;:14;:21;28902:5;:1;28906;28902:5;:::i;:::-;28887:21;;;;;;;;;;;-1:-1:-1;28887:21:0;:28;;;-1:-1:-1;;;;;28887:28:0;:39;:100;;;;-1:-1:-1;28947:14:0;:21;28962:5;:1;28966;28962:5;:::i;:::-;28947:21;;;;;;;;;;;-1:-1:-1;28947:21:0;:31;;;;;;;;:40;28887:100;:158;;;;-1:-1:-1;29008:14:0;:21;29023:5;:1;29027;29023:5;:::i;:::-;29008:21;;;;;;;;;;;-1:-1:-1;29008:21:0;:28;;;;;:37;28887:158;28865:378;;;29158:14;29171:1;29158:14;;:::i;:::-;;;28865:378;28845:3;;;;:::i;:::-;;;;28805:449;;;;29266:31;29317:9;-1:-1:-1;;;;;29300:27:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;29266:61;;29343:9;29338:599;29362:14;29358:1;:18;29338:599;;;-1:-1:-1;;;;;29420:39:0;;:14;:21;29435:5;:1;29439;29435:5;:::i;:::-;29420:21;;;;;;;;;;;-1:-1:-1;29420:21:0;:28;;;-1:-1:-1;;;;;29420:28:0;:39;:100;;;;-1:-1:-1;29480:14:0;:21;29495:5;:1;29499;29495:5;:::i;:::-;29480:21;;;;;;;;;;;-1:-1:-1;29480:21:0;:31;;;;;;;;:40;29420:100;:158;;;;-1:-1:-1;29541:14:0;:21;29556:5;:1;29560;29556:5;:::i;:::-;29541:21;;;;;;;;;;;-1:-1:-1;29541:21:0;:28;;;;;:37;29420:158;29398:528;;;29691:17;29711:14;29691:17;29726:5;:1;29730;29726:5;:::i;:::-;29711:21;;;;;;;;;;;;;;-1:-1:-1;29711:21:0;;;:28;29791:25;;;:14;:25;;;;;;29835:39;;;;;;;;;;;;;;;-1:-1:-1;;;;;29835:39:0;;;;;;;;;29711:28;;-1:-1:-1;29791:25:0;29835:39;;29791:25;;29835:39;;;;-1:-1:-1;;;29835:39:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29835:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29835:39:0;;;-1:-1:-1;;29835:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:25;;:11;;29847:12;;29835:25;;;;;;:::i;:::-;;;;;;;;;;:39;29893:17;29909:1;29893:17;;:::i;:::-;;;29672:254;;29398:528;29378:3;;;;:::i;:::-;;;;29338:599;;;-1:-1:-1;29954:11:0;28546:1427;-1:-1:-1;;;;;28546:1427:0:o;19840:59::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37289:1188::-;-1:-1:-1;;;;;37490:31:0;;37421:22;37490:31;;;:22;:31;;;;;;;;37458:63;;;;;;;;;;;;;;;;;37383:20;;37421:22;;;37458:63;37490:31;37458:63;;;37490:31;37458:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37539:9;37534:297;37558:12;:19;37554:1;:23;37534:297;;;37621:20;:37;37642:12;37655:1;37642:15;;;;;;;;:::i;:::-;;;;;;;;;;;;37621:37;;;;;;;;;;-1:-1:-1;37621:37:0;:46;;;;;;;;:55;;;:132;;;37697:20;:37;37718:12;37731:1;37718:15;;;;;;;;:::i;:::-;;;;;;;;;;;;37697:37;;;;;;;;;;-1:-1:-1;37697:37:0;:47;;;;;:56;37621:132;37599:221;;;37788:16;;;;:::i;:::-;;;;37599:221;37579:3;;;;:::i;:::-;;;;37534:297;;;;37843:31;37895:14;-1:-1:-1;;;;;37877:33:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;37843:67;;37921:20;37961:9;37956:484;37980:12;:19;37976:1;:23;37956:484;;;38043:20;:37;38064:12;38077:1;38064:15;;;;;;;;:::i;:::-;;;;;;;;;;;;38043:37;;;;;;;;;;-1:-1:-1;38043:37:0;:46;;;;;;;;:55;;;:132;;;38119:20;:37;38140:12;38153:1;38140:15;;;;;;;;:::i;:::-;;;;;;;;;;;;38119:37;;;;;;;;;;-1:-1:-1;38119:37:0;:47;;;;;:56;38043:132;38021:408;;;38210:30;38243:20;:77;38286:12;38299:1;38286:15;;;;;;;;:::i;:::-;;;;;;;;;;;;38243:77;;;;;;;;;;;;;-1:-1:-1;38243:77:0;38210:110;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38210:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38339:24;;38210:110;;-1:-1:-1;38210:110:0;;38339:10;;38350:12;;38339:24;;;;;;:::i;:::-;;;;;;;;;;:38;38396:17;38412:1;38396:17;;:::i;:::-;;;38191:238;38021:408;38001:3;;;;:::i;:::-;;;;37956:484;;;-1:-1:-1;38459:10:0;;37289:1188;-1:-1:-1;;;;;37289:1188:0:o;41260:164::-;18035:5;;-1:-1:-1;;;;;18035:5:0;18021:10;:19;18013:28;;;;;;-1:-1:-1;;;;;41330:22:0;::::1;41322:60;;;::::0;-1:-1:-1;;;41322:60:0;;21400:2:1;41322:60:0::1;::::0;::::1;21382:21:1::0;21439:2;21419:18;;;21412:30;-1:-1:-1;;;21458:18:1;;;21451:55;21523:18;;41322:60:0::1;21372:175:1::0;41322:60:0::1;41393:5;:23:::0;;-1:-1:-1;;;;;;41393:23:0::1;-1:-1:-1::0;;;;;41393:23:0;;;::::1;::::0;;;::::1;::::0;;41260:164::o;33528:1080::-;16696:1;17292:7;;:19;;17284:63;;;;-1:-1:-1;;;17284:63:0;;;;;;;:::i;:::-;16696:1;17425:7;:18;;;33629:23;;;:14:::1;:23;::::0;;;;:37:::1;;::::0;-1:-1:-1;;;;;33629:37:0::1;:53:::0;;::::1;::::0;:113:::1;;-1:-1:-1::0;33703:23:0::1;::::0;;;:14:::1;:23;::::0;;;;:30:::1;;::::0;::::1;;:39;33629:113;:176;;;;-1:-1:-1::0;33763:23:0::1;::::0;;;:14:::1;:23;::::0;;;;:33:::1;;::::0;::::1;::::0;::::1;;;:42;33629:176;33607:242;;;::::0;-1:-1:-1;;;33607:242:0;;18257:2:1;33607:242:0::1;::::0;::::1;18239:21:1::0;18296:2;18276:18;;;18269:30;-1:-1:-1;;;18315:18:1;;;18308:46;18371:18;;33607:242:0::1;18229:166:1::0;33607:242:0::1;33880:1;33868:9;:13;33860:46;;;::::0;-1:-1:-1;;;33860:46:0;;21051:2:1;33860:46:0::1;::::0;::::1;21033:21:1::0;21090:2;21070:18;;;21063:30;-1:-1:-1;;;21109:18:1;;;21102:50;21169:18;;33860:46:0::1;21023:170:1::0;33860:46:0::1;33919:21;:9;44404:19:::0;;44422:1;44404:19;;;44315:127;33919:21:::1;33951:15;33969:19;:9;44285:14:::0;;44193:114;33969:19:::1;34028:194;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;34106:10:::1;34028:194:::0;;;;;;34132:9:::1;34028:194:::0;;;;;;;34156:15:::1;34028:194:::0;;;;;;-1:-1:-1;34028:194:0;;;;;;;;;;;;34235:29;;;:20:::1;:29:::0;;;;;:37;;;;;;34028:194;34235:37;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;34235:37:0;;::::1;-1:-1:-1::0;;;;;;34235:37:0;;::::1;;::::0;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;;;;::::1;;;;-1:-1:-1::0;;34235:37:0;::::1;;::::0;;;;-1:-1:-1;;34235:37:0;;;;;;;;;;::::1;::::0;;;34283:31;;;:22:::1;:31:::0;;;;;:45;;;;::::1;::::0;;;;;;;;::::1;::::0;;;34339:34;;;:22:::1;:34:::0;;;;;:48;;;;::::1;::::0;;;;;;;;::::1;::::0;;;34458:23;;;:14:::1;:23:::0;;;;;:37;;::::1;::::0;34510:30;;;::::1;::::0;34405:195;;34510:30;;::::1;10859:34:1::0;;10909:18;;;10902:43;;;;10961:18;;;10954:34;34405:195:0;;34028:194;;-1:-1:-1;34028:194:0;;34458:37;::::1;::::0;34028:194;;34405:195:::1;::::0;;;;;;::::1;-1:-1:-1::0;;16652:1:0;17604:7;:22;-1:-1:-1;33528:1080:0:o;41432:205::-;18035:5;;-1:-1:-1;;;;;18035:5:0;18021:10;:19;18013:28;;;;;;-1:-1:-1;;;;;41522:32:0;::::1;41514:70;;;::::0;-1:-1:-1;;;41514:70:0;;21400:2:1;41514:70:0::1;::::0;::::1;21382:21:1::0;21439:2;21419:18;;;21412:30;-1:-1:-1;;;21458:18:1;;;21451:55;21523:18;;41514:70:0::1;21372:175:1::0;41514:70:0::1;41595:15;:34:::0;;-1:-1:-1;;;;;;41595:34:0::1;-1:-1:-1::0;;;;;41595:34:0;;;::::1;::::0;;;::::1;::::0;;41432:205::o;34616:2007::-;16696:1;17292:7;;:19;;17284:63;;;;-1:-1:-1;;;17284:63:0;;;;;;;:::i;:::-;16696:1;17425:7;:18;;;34707:30;;;:20:::1;:30;::::0;;;;;;;:37:::1;;::::0;34765:22;;;:14:::1;:22:::0;;;;;;:29:::1;;::::0;-1:-1:-1;;;;;34765:29:0::1;34798:10;34765:43;34757:71;;;::::0;-1:-1:-1;;;34757:71:0;;17211:2:1;34757:71:0::1;::::0;::::1;17193:21:1::0;17250:2;17230:18;;;17223:30;-1:-1:-1;;;17269:18:1;;;17262:45;17324:18;;34757:71:0::1;17183:165:1::0;34757:71:0::1;34863:30;::::0;;;:20:::1;:30;::::0;;;;:39:::1;;::::0;::::1;::::0;::::1;;;:48;::::0;::::1;:118;;-1:-1:-1::0;34932:30:0::1;::::0;;;:20:::1;:30;::::0;;;;:40:::1;;::::0;::::1;;:49;34863:118;34841:198;;;::::0;-1:-1:-1;;;34841:198:0;;22101:2:1;34841:198:0::1;::::0;::::1;22083:21:1::0;22140:2;22120:18;;;22113:30;22179:32;22159:18;;;22152:60;22229:18;;34841:198:0::1;22073:180:1::0;34841:198:0::1;35052:13;35068:30:::0;;;:20:::1;:30;::::0;;;;:42:::1;::::0;::::1;::::0;35146:37:::1;::::0;;::::1;::::0;35241:17:::1;::::0;35068:42;;-1:-1:-1;;;;;35146:37:0;;::::1;::::0;35212:47:::1;::::0;:24:::1;35068:42:::0;35232:3:::1;35212:12;:24::i;:::-;:28:::0;::::1;:47::i;:::-;35305:15;::::0;35197:62;;-1:-1:-1;;;;;;35305:15:0::1;:31:::0;35301:281:::1;;35453:15;::::0;35436:75:::1;::::0;-1:-1:-1;;;35436:75:0;;35500:10:::1;35436:75;::::0;::::1;9816:51:1::0;35407:26:0::1;::::0;-1:-1:-1;;;;;35453:15:0::1;::::0;35436:63:::1;::::0;9789:18:1;;35436:75:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35407:104:::0;-1:-1:-1;35533:37:0::1;35407:104:::0;35533:13:::1;:4:::0;35542:3:::1;35533:8;:13::i;:37::-;35526:44;;35338:244;35301:281;35594:18;35615:15;:5:::0;35625:4;35615:9:::1;:15::i;:::-;35641:40;::::0;35594:36;;-1:-1:-1;35649:10:0::1;::::0;35641:40;::::1;;;::::0;35594:36;;35641:40:::1;::::0;;;35594:36;35649:10;35641:40;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;35696:8:0;;35692:61:::1;;35737:4;35721:14;;:20;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;35692:61:0::1;35796:22;::::0;;;:14:::1;:22;::::0;;;;;;;:32:::1;::::0;::::1;::::0;35922:30;;;:20:::1;:30:::0;;;;;:37:::1;::::0;;::::1;::::0;35974:22;;;;;;;;:30;;::::1;::::0;36019:29:::1;::::0;;::::1;::::0;35765:294:::1;::::0;35796:32:::1;-1:-1:-1::0;;;35796:32:0;::::1;;::::0;-1:-1:-1;;;;;35843:36:0;;::::1;::::0;35902:4:::1;::::0;35922:37;;;::::1;::::0;35765:16:::1;:294::i;:::-;36072:30;::::0;;;:20:::1;:30;::::0;;;;;;;:39:::1;::::0;;::::1;:46:::0;;-1:-1:-1;;36072:46:0::1;;;::::0;;36139:22;;;:14:::1;:22:::0;;;;;;;:29:::1;::::0;::::1;:36:::0;;-1:-1:-1;;36139:36:0::1;-1:-1:-1::0;36139:36:0;;::::1;::::0;;;36217:37:::1;::::0;;::::1;::::0;36186:28;;::::1;:68:::0;;-1:-1:-1;;;;;;36186:68:0::1;-1:-1:-1::0;;;;;36217:37:0;;::::1;36186:68;::::0;;44404:19;;;;;;;36411:30;;::::1;::::0;36360:36;;::::1;::::0;36307:257;;36360:36;;;::::1;::::0;36139:22;;36307:257:::1;::::0;::::1;::::0;36456:10:::1;::::0;36481:6;;36502:31:::1;::::0;;::::1;::::0;36548:5;;36307:257:::1;:::i;:::-;;;;;;;;36592:12;::::0;:23:::1;::::0;36609:5;36592:16:::1;:23::i;:::-;36577:12;:38:::0;-1:-1:-1;;16652:1:0;17604:7;:22;-1:-1:-1;;;;34616:2007:0:o;41645:162::-;18035:5;;-1:-1:-1;;;;;18035:5:0;18021:10;:19;18013:28;;;;;;-1:-1:-1;;;;;41750:39:0;;;::::1;;::::0;;;:23:::1;:39;::::0;;;;:49;;-1:-1:-1;;41750:49:0::1;::::0;::::1;;::::0;;;::::1;::::0;;41645:162::o;27579:920::-;27628:19;27660:17;27680:18;:8;44285:14;;44193:114;27680:18;27660:38;;27709:23;27793:25;:15;44285:14;;44193:114;27793:25;27770:10;44285:14;27770:48;;;;:::i;:::-;27735:8;44285:14;27735:84;;;;:::i;:::-;27709:110;;27830:20;27867:31;27918:15;-1:-1:-1;;;;;27901:33:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;27867:67;;27950:9;27945:518;27969:9;27965:1;:13;27945:518;;;28061:1;28022:14;28061:1;28037:5;:1;28041;28037:5;:::i;:::-;28022:21;;;;;;;;;;;-1:-1:-1;28022:21:0;:27;;;-1:-1:-1;;;;;28022:27:0;:41;:102;;;;-1:-1:-1;28084:14:0;:21;28099:5;:1;28103;28099:5;:::i;:::-;28084:21;;;;;;;;;;;-1:-1:-1;28084:21:0;:31;;;;;;;;:40;28022:102;:160;;;;-1:-1:-1;28145:14:0;:21;28160:5;:1;28164;28160:5;:::i;:::-;28145:21;;;;;;;;;;;-1:-1:-1;28145:21:0;:28;;;;;:37;28022:160;28000:452;;;28217:17;28237:14;28217:17;28252:5;:1;28256;28252:5;:::i;:::-;28237:21;;;;;;;;;;;;;;-1:-1:-1;28237:21:0;;;:28;28317:25;;;:14;:25;;;;;;28361:39;;;;;;;;;;;;;;;-1:-1:-1;;;;;28361:39:0;;;;;;;;;28237:28;;-1:-1:-1;28317:25:0;28361:39;;28317:25;;28361:39;;;;-1:-1:-1;;;28361:39:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28361:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28361:39:0;;;-1:-1:-1;;28361:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:25;;:11;;28373:12;;28361:25;;;;;;:::i;:::-;;;;;;;;;;:39;28419:17;28435:1;28419:17;;:::i;:::-;;;28198:254;;28000:452;27980:3;;;;:::i;:::-;;;;27945:518;;;-1:-1:-1;28480:11:0;27579:920;-1:-1:-1;;;;27579:920:0:o;43241:212::-;18035:5;;-1:-1:-1;;;;;18035:5:0;18021:10;:19;18013:28;;;;;;43343:17:::1;;43331:11;:29;:49;;;;;43377:3;43364:11;:16;;43331:49;43322:81;;;::::0;-1:-1:-1;;;43322:81:0;;18602:2:1;43322:81:0::1;::::0;::::1;18584:21:1::0;18641:2;18621:18;;;18614:30;-1:-1:-1;;;18660:18:1;;;18653:48;18718:18;;43322:81:0::1;18574:168:1::0;43322:81:0::1;43414:17;:31:::0;43241:212::o;26325:1196::-;26406:19;26454:18;:8;44285:14;;44193:114;26454:18;26446:5;:26;:55;;;;-1:-1:-1;26483:8:0;44285:14;26476:3;:25;;26446:55;26438:86;;;;-1:-1:-1;;;26438:86:0;;20704:2:1;26438:86:0;;;20686:21:1;20743:2;20723:18;;;20716:30;-1:-1:-1;;;20762:18:1;;;20755:48;20820:18;;26438:86:0;20676:168:1;26438:86:0;26537:17;26582:5;26565:296;26594:3;26589:1;:8;26565:296;;26676:1;26641:17;;;:14;:17;;;;;:23;;;-1:-1:-1;;;;;26641:23:0;:37;:94;;;;-1:-1:-1;26699:17:0;;;;:14;:17;;;;;:27;;;;;;;;:36;26641:94;:148;;;;-1:-1:-1;26756:17:0;;;;:14;:17;;;;;:24;;;;;:33;26641:148;26619:231;;;26823:11;;;;:::i;:::-;;;;26619:231;26599:3;;;;:::i;:::-;;;;26565:296;;;;26873:20;26908:31;26959:9;-1:-1:-1;;;;;26942:27:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;26908:61:0;-1:-1:-1;26997:5:0;26980:505;27009:3;27004:1;:8;26980:505;;27094:1;27059:17;;;:14;:17;;;;;:23;;;-1:-1:-1;;;;;27059:23:0;:37;:94;;;;-1:-1:-1;27117:17:0;;;;:14;:17;;;;;:27;;;;;;;;:36;27059:94;:148;;;;-1:-1:-1;27174:17:0;;;;:14;:17;;;;;:24;;;;;:33;27059:148;27037:435;;;27241:17;27261;;;:14;:17;;;;;;;;:24;27337:25;;;;;;;27381:39;;;;;;;;;;;;;;;-1:-1:-1;;;;;27381:39:0;;;;;;;;;27337:25;;27381:39;;27337:25;;27381:39;;;;-1:-1:-1;;;27381:39:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27381:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27381:39:0;;;-1:-1:-1;;27381:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:25;;:11;;27393:12;;27381:25;;;;;;:::i;:::-;;;;;;;;;;:39;27439:17;27455:1;27439:17;;:::i;:::-;;;27222:250;;27037:435;27014:3;;;;:::i;:::-;;;;26980:505;;39858:1184;39986:22;40055:31;;;:22;:31;;;;;;;;40023:63;;;;;;;;;;;;;;;;;39948:20;;39986:22;;;40023:63;40055:31;40023:63;;;40055:31;40023:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40104:9;40099:297;40123:12;:19;40119:1;:23;40099:297;;;40186:20;:37;40207:12;40220:1;40207:15;;;;;;;;:::i;:::-;;;;;;;;;;;;40186:37;;;;;;;;;;-1:-1:-1;40186:37:0;:46;;;;;;;;:55;;;:132;;;40262:20;:37;40283:12;40296:1;40283:15;;;;;;;;:::i;:::-;;;;;;;;;;;;40262:37;;;;;;;;;;-1:-1:-1;40262:37:0;:47;;;;;:56;40186:132;40164:221;;;40353:16;;;;:::i;:::-;;;;40164:221;40144:3;;;;:::i;:::-;;;;40099:297;;;;40408:31;40460:14;-1:-1:-1;;;;;40442:33:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;40408:67;;40486:20;40526:9;40521:484;40545:12;:19;40541:1;:23;40521:484;;;40608:20;:37;40629:12;40642:1;40629:15;;;;;;;;:::i;:::-;;;;;;;;;;;;40608:37;;;;;;;;;;-1:-1:-1;40608:37:0;:46;;;;;;;;:55;;;:132;;;40684:20;:37;40705:12;40718:1;40705:15;;;;;;;;:::i;:::-;;;;;;;;;;;;40684:37;;;;;;;;;;-1:-1:-1;40684:37:0;:47;;;;;:56;40608:132;40586:408;;;40775:30;40808:20;:77;40851:12;40864:1;40851:15;;;;;;;;:::i;:::-;;;;;;;;;;;;40808:77;;;;;;;;;;;;;-1:-1:-1;40808:77:0;40775:110;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40775:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40904:24;;40775:110;;-1:-1:-1;40775:110:0;;40904:10;;40915:12;;40904:24;;;;;;:::i;:::-;;;;;;;;;;:38;40961:17;40977:1;40961:17;;:::i;:::-;;;40756:238;40586:408;40566:3;;;;:::i;:::-;;;;40521:484;;30023:1322;30157:19;30210:18;:8;44285:14;;44193:114;30210:18;30202:5;:26;:55;;;;-1:-1:-1;30239:8:0;44285:14;30232:3;:25;;30202:55;30194:86;;;;-1:-1:-1;;;30194:86:0;;20704:2:1;30194:86:0;;;20686:21:1;20743:2;20723:18;;;20716:30;-1:-1:-1;;;20762:18:1;;;20755:48;20820:18;;30194:86:0;20676:168:1;30194:86:0;30293:17;;30379:5;30362:358;30391:3;30386:1;:8;30362:358;;30438:17;;;;:14;:17;;;;;:24;;;-1:-1:-1;;;;;30438:35:0;;;:24;;:35;:92;;;;-1:-1:-1;30494:17:0;;;;:14;:17;;;;;:27;;;;;;;;:36;30438:92;:146;;;;-1:-1:-1;30551:17:0;;;;:14;:17;;;;;:24;;;;;:33;30438:146;30416:293;;;30624:14;30637:1;30624:14;;:::i;:::-;;;30416:293;30396:3;;;;:::i;:::-;;;;30362:358;;;;30732:31;30783:9;-1:-1:-1;;;;;30766:27:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;30732:61:0;-1:-1:-1;30822:5:0;30804:505;30834:3;30829:1;:8;30804:505;;30881:17;;;;:14;:17;;;;;:24;;;-1:-1:-1;;;;;30881:35:0;;;:24;;:35;:92;;;;-1:-1:-1;30937:17:0;;;;:14;:17;;;;;:27;;;;;;;;:36;30881:92;:146;;;;-1:-1:-1;30994:17:0;;;;:14;:17;;;;;:24;;;;;:33;30881:146;30859:439;;;31067:17;31087;;;:14;:17;;;;;;;;:24;31163:25;;;;;;;31207:39;;;;;;;;;;;;;;;-1:-1:-1;;;;;31207:39:0;;;;;;;;;31163:25;;31207:39;;31163:25;;31207:39;;;;-1:-1:-1;;;31207:39:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31207:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31207:39:0;;;-1:-1:-1;;31207:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:25;;:11;;31219:12;;31207:25;;;;;;:::i;:::-;;;;;;;;;;:39;31265:17;31281:1;31265:17;;:::i;:::-;;;31048:250;;30859:439;30839:3;;;;:::i;:::-;;;;30804:505;;;-1:-1:-1;31326:11:0;30023:1322;-1:-1:-1;;;;;;30023:1322:0:o;22234:1304::-;16696:1;17292:7;;:19;;17284:63;;;;-1:-1:-1;;;17284:63:0;;;;;;;:::i;:::-;16696:1;17425:7;:18;22484:10;22476:44:::1;;;::::0;-1:-1:-1;;;22476:44:0;;17907:2:1;22476:44:0::1;::::0;::::1;17889:21:1::0;17946:2;17926:18;;;17919:30;-1:-1:-1;;;17965:18:1;;;17958:51;18026:18;;22476:44:0::1;17879:171:1::0;22476:44:0::1;22549:1;22539:7;:11;22531:42;;;::::0;-1:-1:-1;;;22531:42:0;;21754:2:1;22531:42:0::1;::::0;::::1;21736:21:1::0;21793:2;21773:18;;;21766:30;-1:-1:-1;;;21812:18:1;;;21805:48;21870:18;;22531:42:0::1;21726:168:1::0;22531:42:0::1;-1:-1:-1::0;;;;;22592:39:0;::::1;;::::0;;;:23:::1;:39;::::0;;;;;::::1;;:45;;:39:::0;:45:::1;22584:84;;;::::0;-1:-1:-1;;;22584:84:0;;20348:2:1;22584:84:0::1;::::0;::::1;20330:21:1::0;20387:2;20367:18;;;20360:30;20426:29;20406:18;;;20399:57;20473:18;;22584:84:0::1;20320:177:1::0;22584:84:0::1;22681:20;:8;44404:19:::0;;44422:1;44404:19;;;44315:127;22681:20:::1;22712:14;22729:18;:8;44285:14:::0;;44193:114;22729:18:::1;22712:35;;22783:319;;;;;;;;22808:6;22783:319;;;;22829:14;-1:-1:-1::0;;;;;22783:319:0::1;;;;;22858:10;22783:319;;;;;;;;:::i;:::-;;;;;22883:8;22783:319;;;;22906:7;22783:319;;;;22936:10;-1:-1:-1::0;;;;;22783:319:0::1;;;;;22978:1;-1:-1:-1::0;;;;;22783:319:0::1;;;;;23021:9;;22783:319;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;-1:-1:-1;22783:319:0;;;-1:-1:-1;;;22783:319:0::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;22758:22;;;:14:::1;:22:::0;;;;;;:344;;;;;;::::1;::::0;22783:319;22758:344;::::1;::::0;;-1:-1:-1;;;;;22758:344:0;;::::1;-1:-1:-1::0;;;;;;22758:344:0;::::1;::::0;::::1;::::0;;;;::::1;::::0;:22;;:344;;-1:-1:-1;;;;;;22758:344:0;;-1:-1:-1;;;22758:344:0;::::1;::::0;::::1;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;22758:344:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;22758:344:0;;::::1;-1:-1:-1::0;;;;;;22758:344:0;;::::1;;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;22758:344:0::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;;22758:344:0;;;;::::1;;-1:-1:-1::0;;22758:344:0;;;;;;::::1;;;::::0;;;::::1;::::0;;23115:179:::1;23146:10:::0;23171:14;23200:10:::1;23233:4;23253:8:::0;23276:7;23115:16:::1;:179::i;:::-;23394:8;23365:14;-1:-1:-1::0;;;;;23312:218:0::1;23344:6;23312:218;23417:7;23439:10;23472:1;23489:9;;23513:6;23312:218;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;16652:1:0;17604:7;:22;-1:-1:-1;;;;;;22234:1304:0:o;36631:649::-;16696:1;17292:7;;:19;;17284:63;;;;-1:-1:-1;;;17284:63:0;;;;;;;:::i;:::-;16696:1;17425:7;:18;;;36726:30;;;:20:::1;:30;::::0;;;;:37:::1;::::0;-1:-1:-1;;;;;36726:37:0::1;36767:10;36726:51;:121:::0;::::1;;;-1:-1:-1::0;36798:30:0::1;::::0;;;:20:::1;:30;::::0;;;;:40:::1;;::::0;::::1;;:49;36726:121;36704:213;;;::::0;-1:-1:-1;;;36704:213:0;;22820:2:1;36704:213:0::1;::::0;::::1;22802:21:1::0;22859:2;22839:18;;;22832:30;22898:34;22878:18;;;22871:62;-1:-1:-1;;;22949:18:1;;;22942:40;22999:19;;36704:213:0::1;22792:232:1::0;36704:213:0::1;36950:30;::::0;;;:20:::1;:30;::::0;;;;:39:::1;;::::0;::::1;::::0;::::1;;;:48;36928:115;;;::::0;-1:-1:-1;;;36928:115:0;;20002:2:1;36928:115:0::1;::::0;::::1;19984:21:1::0;20041:2;20021:18;;;20014:30;-1:-1:-1;;;20060:18:1;;;20053:47;20117:18;;36928:115:0::1;19974:167:1::0;36928:115:0::1;37056:14;37073:30:::0;;;:20:::1;:30;::::0;;;;;:37:::1;::::0;::::1;::::0;37123:40:::1;::::0;::::1;:47:::0;;-1:-1:-1;;37123:47:0::1;37073:37:::0;37123:47:::1;::::0;;37206:42:::1;::::0;;::::1;::::0;37181:68;;-1:-1:-1;;;;;37073:37:0;;::::1;::::0;;;37181:68;::::1;;;::::0;37206:42;;37181:68;37056:14;37181:68;37206:42;37073:37;37181:68;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;16652:1:0;17604:7;:22;-1:-1:-1;36631:649:0:o;42910:157::-;18035:5;;-1:-1:-1;;;;;18035:5:0;18021:10;:19;18013:28;;;;;;-1:-1:-1;;;;;42987:24:0;::::1;42978:52;;;::::0;-1:-1:-1;;;42978:52:0;;23589:2:1;42978:52:0::1;::::0;::::1;23571:21:1::0;23628:2;23608:18;;;23601:30;-1:-1:-1;;;23647:18:1;;;23640:44;23701:18;;42978:52:0::1;23561:164:1::0;42978:52:0::1;43041:7;:18:::0;;-1:-1:-1;;;;;;43041:18:0::1;-1:-1:-1::0;;;;;43041:18:0;;;::::1;::::0;;;::::1;::::0;;42910:157::o;31437:1501::-;31541:19;31578:22;31603:18;:8;44285:14;;44193:114;31603:18;31578:43;;31632:17;31664:20;31706:9;31701:456;31725:14;31721:1;:18;31701:456;;;31890:8;;31873:26;;;;;;;;;:::i;:::-;;;;;;;;;;;;;31863:37;;;;;;31810:14;:21;31825:1;31829;31825:5;;;;:::i;:::-;31810:21;;;;;;;;;;;:30;;31793:48;;;;;;;;:::i;:::-;;;;;;;;;;;;;31783:59;;;;;;:117;:179;;;;-1:-1:-1;31960:1:0;31921:14;31960:1;31936:5;:1;31940;31936:5;:::i;:::-;31921:21;;;;;;;;;;;-1:-1:-1;31921:21:0;:27;;;-1:-1:-1;;;;;31921:27:0;:41;31783:179;:240;;;;-1:-1:-1;31983:14:0;:21;31998:5;:1;32002;31998:5;:::i;:::-;31983:21;;;;;;;;;;;-1:-1:-1;31983:21:0;:31;;;;;;;;:40;31783:240;:298;;;;-1:-1:-1;32044:14:0;:21;32059:5;:1;32063;32059:5;:::i;:::-;32044:21;;;;;;;;;;;-1:-1:-1;32044:21:0;:28;;;;;:37;31783:298;31761:385;;;32116:14;32129:1;32116:14;;:::i;:::-;;;31761:385;31741:3;;;;:::i;:::-;;;;31701:456;;;;32169:31;32220:9;-1:-1:-1;;;;;32203:27:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;32169:61;;32246:9;32241:661;32265:14;32261:1;:18;32241:661;;;32430:8;;32413:26;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32403:37;;;;;;32350:14;:21;32365:1;32369;32365:5;;;;:::i;:::-;32350:21;;;;;;;;;;;:30;;32333:48;;;;;;;;:::i;:::-;;;;;;;;;;;;;32323:59;;;;;;:117;:179;;;;-1:-1:-1;32500:1:0;32461:14;32500:1;32476:5;:1;32480;32476:5;:::i;:::-;32461:21;;;;;;;;;;;-1:-1:-1;32461:21:0;:27;;;-1:-1:-1;;;;;32461:27:0;:41;32323:179;:240;;;;-1:-1:-1;32523:14:0;:21;32538:5;:1;32542;32538:5;:::i;:::-;32523:21;;;;;;;;;;;-1:-1:-1;32523:21:0;:31;;;;;;;;:40;32323:240;:298;;;;-1:-1:-1;32584:14:0;:21;32599:5;:1;32603;32599:5;:::i;:::-;32584:21;;;;;;;;;;;-1:-1:-1;32584:21:0;:28;;;;;:37;32323:298;32301:590;;;32656:17;32676:14;32656:17;32691:5;:1;32695;32691:5;:::i;:::-;32676:21;;;;;;;;;;;;;;-1:-1:-1;32676:21:0;;;:28;32756:25;;;:14;:25;;;;;;32800:39;;;;;;;;;;;;;;;-1:-1:-1;;;;;32800:39:0;;;;;;;;;32676:28;;-1:-1:-1;32756:25:0;32800:39;;32756:25;;32800:39;;;;-1:-1:-1;;;32800:39:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32800:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32800:39:0;;;-1:-1:-1;;32800:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:25;;:11;;32812:12;;32800:25;;;;;;:::i;:::-;;;;;;;;;;:39;32858:17;32874:1;32858:17;;:::i;:::-;;;32637:254;;32301:590;32281:3;;;;:::i;:::-;;;;32241:661;;43075:158;18035:5;;-1:-1:-1;;;;;18035:5:0;18021:10;:19;18013:28;;;;;;-1:-1:-1;;;;;43152:24:0;::::1;43143:53;;;::::0;-1:-1:-1;;;43143:53:0;;19658:2:1;43143:53:0::1;::::0;::::1;19640:21:1::0;19697:2;19677:18;;;19670:30;-1:-1:-1;;;19716:18:1;;;19709:45;19771:18;;43143:53:0::1;19630:165:1::0;43143:53:0::1;43207:7;:18:::0;;-1:-1:-1;;;;;;43207:18:0::1;-1:-1:-1::0;;;;;43207:18:0;;;::::1;::::0;;;::::1;::::0;;43075:158::o;23592:682::-;23670:8;44285:14;23660:6;:28;;23652:37;;;;;;23708:22;;;;:14;:22;;;;;:29;;;-1:-1:-1;;;;;23708:29:0;23741:10;23708:43;23700:52;;;;;;23785:22;;;;:14;:22;;;;;:32;;;;;;;;:41;;;:100;;-1:-1:-1;23847:22:0;;;;:14;:22;;;;;:29;;;;;:38;23785:100;23763:133;;;;;;23909:22;;;;:14;:22;;;;;:32;;:39;;-1:-1:-1;;23909:39:0;;;;;23959:27;:15;44404:19;;44422:1;44404:19;;;44315:127;23959:27;24030:22;;;;:14;:22;;;;;:32;;;;24181:30;;;;24226:29;;;;;23999:267;;24030:32;-1:-1:-1;;;24030:32:0;;;;-1:-1:-1;;;;;24077:36:0;;24136:4;;24156:10;;23999:16;:267::i;:::-;23592:682;:::o;19976:59::-;;;;;;;;;;;;;;;;;;;;38645:1205;-1:-1:-1;;;;;38885:31:0;;38816:22;38885:31;;;:22;:31;;;;;;;;38853:63;;;;;;;;;;;;;;;;;38778:20;;38816:22;;;38853:63;38885:31;38853:63;;;38885:31;38853:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38853:63:0;;-1:-1:-1;38946:5:0;;-1:-1:-1;;;;38929:286:0;38958:3;38953:1;:8;38929:286;;39005:20;:37;39026:12;39039:1;39026:15;;;;;;;;:::i;:::-;;;;;;;;;;;;39005:37;;;;;;;;;;-1:-1:-1;39005:37:0;:46;;;;;;;;:55;;;:132;;;39081:20;:37;39102:12;39115:1;39102:15;;;;;;;;:::i;:::-;;;;;;;;;;;;39081:37;;;;;;;;;;-1:-1:-1;39081:37:0;:47;;;;;:56;39005:132;38983:221;;;39172:16;;;;:::i;:::-;;;;38983:221;38963:3;;;;:::i;:::-;;;;38929:286;;;;39227:31;39279:14;-1:-1:-1;;;;;39261:33:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;39227:67:0;-1:-1:-1;39305:20:0;39357:5;39340:473;39369:3;39364:1;:8;39340:473;;39416:20;:37;39437:12;39450:1;39437:15;;;;;;;;:::i;:::-;;;;;;;;;;;;39416:37;;;;;;;;;;-1:-1:-1;39416:37:0;:46;;;;;;;;:55;;;:132;;;39492:20;:37;39513:12;39526:1;39513:15;;;;;;;;:::i;:::-;;;;;;;;;;;;39492:37;;;;;;;;;;-1:-1:-1;39492:37:0;:47;;;;;:56;39416:132;39394:408;;;39583:30;39616:20;:77;39659:12;39672:1;39659:15;;;;;;;;:::i;:::-;;;;;;;;;;;;39616:77;;;;;;;;;;;;;-1:-1:-1;39616:77:0;39583:110;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39583:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39712:24;;39583:110;;-1:-1:-1;39583:110:0;;39712:10;;39723:12;;39712:24;;;;;;:::i;:::-;;;;;;;;;;:38;39769:17;39785:1;39769:17;;:::i;:::-;;;39564:238;39394:408;39374:3;;;;:::i;:::-;;;;39340:473;;;-1:-1:-1;39832:10:0;;38645:1205;-1:-1:-1;;;;;;;38645:1205:0:o;33157:225::-;33211:7;33231:23;33315:25;:15;44285:14;;44193:114;33315:25;33292:10;44285:14;33292:48;;;;:::i;:::-;33257:8;44285:14;33257:84;;;;:::i;24332:1985::-;16696:1;17292:7;;:19;;17284:63;;;;-1:-1:-1;;;17284:63:0;;;;;;;:::i;:::-;16696:1;17425:7;:18;;;24429:22;;;:14:::1;:22;::::0;;;;:28:::1;::::0;::::1;::::0;24486:30;::::1;::::0;24549:9:::1;:18:::0;::::1;24527:97;;;::::0;-1:-1:-1;;;24527:97:0;;23231:2:1;24527:97:0::1;::::0;::::1;23213:21:1::0;23270:2;23250:18;;;23243:30;23309:31;23289:18;;;23282:59;23358:18;;24527:97:0::1;23203:179:1::0;24527:97:0::1;24657:22;::::0;;;:14:::1;:22;::::0;;;;:29:::1;;::::0;::::1;;:38;24635:114;;;::::0;-1:-1:-1;;;24635:114:0;;16856:2:1;24635:114:0::1;::::0;::::1;16838:21:1::0;16895:2;16875:18;;;16868:30;16934:28;16914:18;;;16907:56;16980:18;;24635:114:0::1;16828:176:1::0;24635:114:0::1;24782:22;::::0;;;:14:::1;:22;::::0;;;;:32:::1;;::::0;::::1;::::0;::::1;;;:41;24760:117;;;::::0;-1:-1:-1;;;24760:117:0;;19303:2:1;24760:117:0::1;::::0;::::1;19285:21:1::0;19342:2;19322:18;;;19315:30;19381:28;19361:18;;;19354:56;19427:18;;24760:117:0::1;19275:176:1::0;24760:117:0::1;24910:22;::::0;;;:14:::1;:22;::::0;;;;:29:::1;;::::0;-1:-1:-1;;;;;24910:29:0::1;24943:10;24910:43;;24888:118;;;::::0;-1:-1:-1;;;24888:118:0;;18949:2:1;24888:118:0::1;::::0;::::1;18931:21:1::0;18988:2;18968:18;;;18961:30;19027:27;19007:18;;;19000:55;19072:18;;24888:118:0::1;18921:175:1::0;24888:118:0::1;25087:12;25102:47;25131:17;;25102:24;25115:5;25122:3;25102:12;:24::i;:47::-;25166:15;::::0;25087:62;;-1:-1:-1;;;;;;25166:15:0::1;:31:::0;25162:281:::1;;25314:15;::::0;25297:75:::1;::::0;-1:-1:-1;;;25297:75:0;;25361:10:::1;25297:75;::::0;::::1;9816:51:1::0;25268:26:0::1;::::0;-1:-1:-1;;;;;25314:15:0::1;::::0;25297:63:::1;::::0;9789:18:1;;25297:75:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25268:104:::0;-1:-1:-1;25394:37:0::1;25268:104:::0;25394:13:::1;:4:::0;25403:3:::1;25394:8;:13::i;:37::-;25387:44;;25199:244;25162:281;25455:18;25476:15;:5:::0;25486:4;25476:9:::1;:15::i;:::-;25502:22;::::0;;;:14:::1;:22;::::0;;;;;:29:::1;;::::0;:50;;25455:36;;-1:-1:-1;;;;;;25502:29:0::1;::::0;:50;::::1;;;::::0;25455:36;;25502:50;;:22;:50;25455:36;25502:29;:50;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;25579:4;25563:14;;:20;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;25627:22:0::1;::::0;;;:14:::1;:22;::::0;;;;:32:::1;::::0;::::1;::::0;25800:29:::1;::::0;;::::1;::::0;25596:244:::1;::::0;25627:32:::1;-1:-1:-1::0;;;25627:32:0;::::1;;::::0;-1:-1:-1;;;;;25674:36:0;;::::1;::::0;25733:4:::1;::::0;25753:10:::1;::::0;25778:7;;25596:16:::1;:244::i;:::-;25853:22;::::0;;;:14:::1;:22;::::0;;;;:29:::1;::::0;::::1;:36:::0;;-1:-1:-1;;25853:36:0::1;25885:4;25853:36;::::0;;25900:28:::1;::::0;;::::1;:50:::0;;-1:-1:-1;;;;;;25900:50:0::1;25939:10;25900:50;::::0;;25963:22:::1;::::0;44404:19;;44422:1;44404:19;;;44315:127;25963:22:::1;26011:12;::::0;:23:::1;::::0;26028:5;26011:16:::1;:23::i;:::-;25996:12;:38:::0;26105:22:::1;::::0;;;:14:::1;:22;::::0;;;;;;:36:::1;::::0;::::1;::::0;26178:29:::1;::::0;::::1;::::0;26052:257;;26156:7;;-1:-1:-1;;;;;26105:36:0;;::::1;::::0;26120:6;;26052:257:::1;::::0;::::1;::::0;26178:29;;::::1;::::0;26222:10:::1;::::0;26247:31:::1;::::0;;::::1;::::0;26293:5;;26052:257:::1;:::i;:::-;;;;;;;;-1:-1:-1::0;;16652:1:0;17604:7;:22;-1:-1:-1;;;24332:1985:0:o;32996:102::-;33043:7;33070:20;:10;44285:14;;44193:114;33070:20;33063:27;;32996:102;:::o;42552:350::-;18125:7;;-1:-1:-1;;;;;18125:7:0;18111:10;:21;;:46;;-1:-1:-1;18150:7:0;;-1:-1:-1;;;;;18150:7:0;18136:10;:21;18111:46;:69;;;-1:-1:-1;18175:5:0;;-1:-1:-1;;;;;18175:5:0;18161:10;:19;18111:69;18103:78;;;;;;42633:1:::1;42616:14;;:18;42607:28;;;::::0;::::1;;42646:15;42664:55;42701:17;;42664:32;42677:14;;42692:3;42664:12;:32::i;:55::-;42646:73;;42730:15;42748:27;42767:7;42748:14;;:18;;:27;;;;:::i;:::-;42803:1;42786:14;:18:::0;;;42823:7:::1;::::0;42815:34:::1;::::0;42730:45;;-1:-1:-1;;;;;;42823:7:0::1;::::0;42815:34;::::1;;;::::0;42730:45;;42815:34;;42803:1;42815:34;42730:45;42823:7;42815:34;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;42868:7:0::1;::::0;42860:34:::1;::::0;-1:-1:-1;;;;;42868:7:0;;::::1;::::0;42860:34;::::1;;;::::0;42886:7;;42868::::1;42860:34:::0;42868:7;42860:34;42886:7;42868;42860:34;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;42596:306;;42552:350::o:0;19779:52::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19779:52:0;;;;-1:-1:-1;;;19779:52:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;19779:52:0;;;;;;;;;;;;;;;;;-1:-1:-1;19779:52:0;;;;;;:::o;45190:288::-;45248:7;;45359:5;45363:1;45359;:5;:::i;:::-;45347:17;45190:288;-1:-1:-1;;;;45190:288:0:o;44885:208::-;44943:7;44967:6;44963:47;;-1:-1:-1;44997:1:0;44990:8;;44963:47;45020:9;45032:5;45036:1;45032;:5;:::i;:::-;45020:17;-1:-1:-1;45064:1:0;45055:5;45059:1;45020:17;45055:5;:::i;:::-;:10;45048:18;;;;:::i;:::-;45084:1;44885:208;-1:-1:-1;;;44885:208:0:o;45606:123::-;45664:7;45696:1;45691;:6;;45684:14;;;;:::i;:::-;45716:5;45720:1;45716;:5;:::i;20874:1148::-;21129:16;21115:10;:30;;;;;;;;:::i;:::-;;21111:215;;;21235:58;;-1:-1:-1;;;21235:58:0;;-1:-1:-1;;;;;10877:15:1;;;21235:58:0;;;10859:34:1;10929:15;;;10909:18;;;10902:43;10961:18;;;10954:34;;;21235:36:0;;;;;10794:18:1;;21235:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21308:7;;21111:215;21377:17;21363:10;:31;;;;;;;;:::i;:::-;;21359:297;;;21411:170;;-1:-1:-1;;;21411:170:0;;-1:-1:-1;;;;;12239:15:1;;;21411:170:0;;;12221:34:1;12291:15;;;12271:18;;;12264:43;12323:18;;;12316:34;;;21544:1:0;12366:18:1;;;12359:34;12201:3;12409:19;;;12402:32;-1:-1:-1;12450:19:1;;;12443:30;21411:41:0;;;;;12490:19:1;;21411:170:0;12173:342:1;21359:297:0;21707:15;21693:10;:29;;;;;;;;:::i;:::-;;21689:326;;;-1:-1:-1;;;;;21743:20:0;;21758:4;21743:20;21739:114;;;21783:54;;-1:-1:-1;;;21783:54:0;;21822:4;21783:54;;;12694:51:1;12761:18;;;12754:34;;;-1:-1:-1;;;;;21783:30:0;;;;;12667:18:1;;21783:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;21739:114;21867:56;;-1:-1:-1;;;21867:56:0;;-1:-1:-1;;;;;10877:15:1;;;21867:56:0;;;10859:34:1;10929:15;;;10909:18;;;10902:43;10961:18;;;10954:34;;;21867:35:0;;;;;10794:18:1;;21867:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;21689:326;20874:1148;;;;;;:::o;45806:147::-;45864:7;;45896:5;45900:1;45896;:5;:::i;:::-;45884:17;;45924:1;45919;:6;;45912:14;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:2;;177:1;174;167:12;111:2;63:124;;;:::o;192:723::-;246:5;299:3;292:4;284:6;280:17;276:27;266:2;;317:1;314;307:12;266:2;353:6;340:20;379:4;-1:-1:-1;;;;;398:2:1;395:26;392:2;;;424:18;;:::i;:::-;470:2;467:1;463:10;493:28;517:2;513;509:11;493:28;:::i;:::-;555:15;;;586:12;;;;618:15;;;652;;;648:24;;645:33;-1:-1:-1;642:2:1;;;691:1;688;681:12;642:2;713:1;704:10;;723:163;737:2;734:1;731:9;723:163;;;794:17;;782:30;;755:1;748:9;;;;;832:12;;;;864;;723:163;;;-1:-1:-1;904:5:1;256:659;-1:-1:-1;;;;;;;256:659:1:o;920:530::-;962:5;1015:3;1008:4;1000:6;996:17;992:27;982:2;;1033:1;1030;1023:12;982:2;1069:6;1056:20;-1:-1:-1;;;;;1091:2:1;1088:26;1085:2;;;1117:18;;:::i;:::-;1161:55;1204:2;1185:13;;-1:-1:-1;;1181:27:1;1210:4;1177:38;1161:55;:::i;:::-;1241:2;1232:7;1225:19;1287:3;1280:4;1275:2;1267:6;1263:15;1259:26;1256:35;1253:2;;;1304:1;1301;1294:12;1253:2;1369;1362:4;1354:6;1350:17;1343:4;1334:7;1330:18;1317:55;1417:1;1392:16;;;1410:4;1388:27;1381:38;;;;1396:7;972:478;-1:-1:-1;;;972:478:1:o;1455:348::-;1507:8;1517:6;1571:3;1564:4;1556:6;1552:17;1548:27;1538:2;;1589:1;1586;1579:12;1538:2;-1:-1:-1;1612:20:1;;-1:-1:-1;;;;;1644:30:1;;1641:2;;;1687:1;1684;1677:12;1641:2;1724:4;1716:6;1712:17;1700:29;;1776:3;1769:4;1760:6;1752;1748:19;1744:30;1741:39;1738:2;;;1793:1;1790;1783:12;1738:2;1528:275;;;;;:::o;1808:186::-;1867:6;1920:2;1908:9;1899:7;1895:23;1891:32;1888:2;;;1936:1;1933;1926:12;1888:2;1959:29;1978:9;1959:29;:::i;1999:943::-;2153:6;2161;2169;2177;2185;2238:3;2226:9;2217:7;2213:23;2209:33;2206:2;;;2255:1;2252;2245:12;2206:2;2278:29;2297:9;2278:29;:::i;:::-;2268:39;;2326:38;2360:2;2349:9;2345:18;2326:38;:::i;:::-;2316:48;;2415:2;2404:9;2400:18;2387:32;-1:-1:-1;;;;;2479:2:1;2471:6;2468:14;2465:2;;;2495:1;2492;2485:12;2465:2;2518:61;2571:7;2562:6;2551:9;2547:22;2518:61;:::i;:::-;2508:71;;2632:2;2621:9;2617:18;2604:32;2588:48;;2661:2;2651:8;2648:16;2645:2;;;2677:1;2674;2667:12;2645:2;2700:63;2755:7;2744:8;2733:9;2729:24;2700:63;:::i;:::-;2690:73;;2816:3;2805:9;2801:19;2788:33;2772:49;;2846:2;2836:8;2833:16;2830:2;;;2862:1;2859;2852:12;2830:2;;2885:51;2928:7;2917:8;2906:9;2902:24;2885:51;:::i;:::-;2875:61;;;2196:746;;;;;;;;:::o;2947:606::-;3051:6;3059;3067;3075;3083;3136:3;3124:9;3115:7;3111:23;3107:33;3104:2;;;3153:1;3150;3143:12;3104:2;3176:29;3195:9;3176:29;:::i;:::-;3166:39;;3224:38;3258:2;3247:9;3243:18;3224:38;:::i;:::-;3214:48;;3309:2;3298:9;3294:18;3281:32;3271:42;;3360:2;3349:9;3345:18;3332:32;3322:42;;3415:3;3404:9;3400:19;3387:33;-1:-1:-1;;;;;3435:6:1;3432:30;3429:2;;;3475:1;3472;3465:12;3429:2;3498:49;3539:7;3530:6;3519:9;3515:22;3498:49;:::i;3558:315::-;3623:6;3631;3684:2;3672:9;3663:7;3659:23;3655:32;3652:2;;;3700:1;3697;3690:12;3652:2;3723:29;3742:9;3723:29;:::i;:::-;3713:39;;3802:2;3791:9;3787:18;3774:32;3815:28;3837:5;3815:28;:::i;:::-;3862:5;3852:15;;;3642:231;;;;;:::o;3878:849::-;4007:6;4015;4023;4031;4039;4047;4055;4108:3;4096:9;4087:7;4083:23;4079:33;4076:2;;;4125:1;4122;4115:12;4076:2;4148:29;4167:9;4148:29;:::i;:::-;4138:39;;4227:2;4216:9;4212:18;4199:32;4260:1;4253:5;4250:12;4240:2;;4276:1;4273;4266:12;4240:2;4299:5;-1:-1:-1;4351:2:1;4336:18;;4323:32;;-1:-1:-1;4402:2:1;4387:18;;4374:32;;-1:-1:-1;4453:3:1;4438:19;;4425:33;;-1:-1:-1;4509:3:1;4494:19;;4481:33;-1:-1:-1;;;;;4526:30:1;;4523:2;;;4569:1;4566;4559:12;4523:2;4608:59;4659:7;4650:6;4639:9;4635:22;4608:59;:::i;:::-;4066:661;;;;-1:-1:-1;4066:661:1;;-1:-1:-1;4066:661:1;;;;4582:85;;-1:-1:-1;;;4066:661:1:o;4732:254::-;4800:6;4808;4861:2;4849:9;4840:7;4836:23;4832:32;4829:2;;;4877:1;4874;4867:12;4829:2;4900:29;4919:9;4900:29;:::i;:::-;4890:39;4976:2;4961:18;;;;4948:32;;-1:-1:-1;;;4819:167:1:o;4991:322::-;5068:6;5076;5084;5137:2;5125:9;5116:7;5112:23;5108:32;5105:2;;;5153:1;5150;5143:12;5105:2;5176:29;5195:9;5176:29;:::i;:::-;5166:39;5252:2;5237:18;;5224:32;;-1:-1:-1;5303:2:1;5288:18;;;5275:32;;5095:218;-1:-1:-1;;;5095:218:1:o;5318:245::-;5385:6;5438:2;5426:9;5417:7;5413:23;5409:32;5406:2;;;5454:1;5451;5444:12;5406:2;5486:9;5480:16;5505:28;5527:5;5505:28;:::i;5568:286::-;5626:6;5679:2;5667:9;5658:7;5654:23;5650:32;5647:2;;;5695:1;5692;5685:12;5647:2;5721:23;;-1:-1:-1;;;;;;5773:32:1;;5763:43;;5753:2;;5820:1;5817;5810:12;5859:411;5930:6;5938;5991:2;5979:9;5970:7;5966:23;5962:32;5959:2;;;6007:1;6004;5997:12;5959:2;6047:9;6034:23;-1:-1:-1;;;;;6072:6:1;6069:30;6066:2;;;6112:1;6109;6102:12;6066:2;6151:59;6202:7;6193:6;6182:9;6178:22;6151:59;:::i;:::-;6229:8;;6125:85;;-1:-1:-1;5949:321:1;-1:-1:-1;;;;5949:321:1:o;6275:180::-;6334:6;6387:2;6375:9;6366:7;6362:23;6358:32;6355:2;;;6403:1;6400;6393:12;6355:2;-1:-1:-1;6426:23:1;;6345:110;-1:-1:-1;6345:110:1:o;6460:184::-;6530:6;6583:2;6571:9;6562:7;6558:23;6554:32;6551:2;;;6599:1;6596;6589:12;6551:2;-1:-1:-1;6622:16:1;;6541:103;-1:-1:-1;6541:103:1:o;6649:248::-;6717:6;6725;6778:2;6766:9;6757:7;6753:23;6749:32;6746:2;;;6794:1;6791;6784:12;6746:2;-1:-1:-1;;6817:23:1;;;6887:2;6872:18;;;6859:32;;-1:-1:-1;6736:161:1:o;7115:237::-;7196:1;7189:5;7186:12;7176:2;;7241:10;7236:3;7232:20;7229:1;7222:31;7276:4;7273:1;7266:15;7304:4;7301:1;7294:15;7176:2;7328:18;;7166:186::o;7357:472::-;7399:3;7437:5;7431:12;7464:6;7459:3;7452:19;7489:1;7499:162;7513:6;7510:1;7507:13;7499:162;;;7575:4;7631:13;;;7627:22;;7621:29;7603:11;;;7599:20;;7592:59;7528:12;7499:162;;;7679:6;7676:1;7673:13;7670:2;;;7745:1;7738:4;7729:6;7724:3;7720:16;7716:27;7709:38;7670:2;-1:-1:-1;7811:2:1;7790:15;-1:-1:-1;;7786:29:1;7777:39;;;;7818:4;7773:50;;7407:422;-1:-1:-1;;7407:422:1:o;7834:735::-;7884:3;7925:5;7919:12;7954:36;7980:9;7954:36;:::i;:::-;7999:19;;;8037:4;8060:1;8077:18;;;8104:109;;;;8227:1;8222:341;;;;8070:493;;8104:109;-1:-1:-1;;8146:24:1;;8132:12;;;8125:46;8200:2;8191:12;;;-1:-1:-1;8104:109:1;;8222:341;8253:5;8250:1;8243:16;8300:2;8297:1;8287:16;8325:1;8339:174;8353:6;8350:1;8347:13;8339:174;;;8440:14;;8422:11;;;8418:20;;8411:44;8483:16;;;;8368:10;;8339:174;;;8537:11;;8533:20;;;-1:-1:-1;;8070:493:1;;;;;;7892:677;;;;:::o;8574:273::-;8759:6;8751;8746:3;8733:33;8715:3;8785:16;;8810:13;;;8785:16;8723:124;-1:-1:-1;8723:124:1:o;8852:813::-;8980:3;9009:1;9042:6;9036:13;9072:36;9098:9;9072:36;:::i;:::-;9127:1;9144:18;;;9171:104;;;;9289:1;9284:356;;;;9137:503;;9171:104;-1:-1:-1;;9204:24:1;;9192:37;;9249:16;;;;-1:-1:-1;9171:104:1;;9284:356;9315:6;9312:1;9305:17;9345:4;9390:2;9387:1;9377:16;9415:1;9429:165;9443:6;9440:1;9437:13;9429:165;;;9521:14;;9508:11;;;9501:35;9564:16;;;;9458:10;;9429:165;;;9433:3;;;9623:6;9618:3;9614:16;9607:23;;9137:503;-1:-1:-1;9656:3:1;;8988:677;-1:-1:-1;;;;;;8988:677:1:o;10102:504::-;-1:-1:-1;;;;;10378:15:1;;;10360:34;;10430:15;;10425:2;10410:18;;10403:43;10482:3;10477:2;10462:18;;10455:31;;;10303:4;;10503:54;;10537:19;;10529:6;10503:54;:::i;:::-;10495:62;;10593:6;10588:2;10577:9;10573:18;10566:34;10312:294;;;;;;;:::o;12799:2219::-;12995:4;13024:2;13064;13053:9;13049:18;13094:2;13083:9;13076:21;13117:6;13152;13146:13;13183:6;13175;13168:22;13209:2;13199:12;;13242:2;13231:9;13227:18;13220:25;;13304:2;13294:6;13291:1;13287:14;13276:9;13272:30;13268:39;13342:2;13334:6;13330:15;13363:1;13373:1616;13387:6;13384:1;13381:13;13373:1616;;;-1:-1:-1;;13452:22:1;;;13448:36;13436:49;;13508:13;;13578:9;;13563:25;;13627:11;;;13621:18;-1:-1:-1;;;;;6976:31:1;13693:15;;;6964:44;13750:11;;;13744:18;13544:6;;13775:58;13817:15;;;13744:18;13775:58;:::i;:::-;-1:-1:-1;13856:4:1;13903:11;;;13897:18;13880:15;;;13873:43;13939:4;13986:11;;;13980:18;13963:15;;;13956:43;14022:4;14067:11;;;14061:18;-1:-1:-1;;;;;6976:31:1;;14135:15;;;6964:44;-1:-1:-1;;14174:4:1;14219:11;;;14213:18;-1:-1:-1;;;;;6976:31:1;;14287:15;;;6964:44;14244:59;;14326:4;14379:2;14375;14371:11;14365:18;14420:2;14415;14407:6;14403:15;14396:27;14450:50;14496:2;14488:6;14484:15;14468:14;14450:50;:::i;:::-;14436:64;;;;14524:6;14582:3;14578:2;14574:12;14568:19;14562:3;14554:6;14550:16;14543:45;;14612:6;14667:3;14663:2;14659:12;14653:19;14685:49;14729:3;14721:6;14717:16;14701:14;7089:13;7082:21;7070:34;;7060:50;14685:49;-1:-1:-1;;14758:6:1;14805:12;;;14799:19;7089:13;7082:21;14863:16;;;;7070:34;;;;14967:12;;;;14932:15;;;;13409:1;13402:9;13373:1616;;;-1:-1:-1;15006:6:1;;13004:2014;-1:-1:-1;;;;;;;;13004:2014:1:o;15023:1227::-;15250:2;15302:21;;;15372:13;;15275:18;;;15394:22;;;15221:4;;15250:2;15435;;15453:18;;;;15494:15;;;15221:4;15537:687;15551:6;15548:1;15545:13;15537:687;;;15610:13;;15648:9;;15636:22;;15698:11;;;15692:18;15678:12;;;15671:40;15755:11;;;15749:18;-1:-1:-1;;;;;15745:44:1;15731:12;;;15724:66;15813:4;15857:11;;;15851:18;15837:12;;;15830:40;15893:4;15937:11;;;15931:18;15917:12;;;15910:40;15777:3;16031:11;;;16025:18;16018:26;16011:34;15997:12;;;15990:56;16069:4;16127:11;;;16121:18;16114:26;16107:34;16093:12;;;16086:56;16171:4;16162:14;;;;16199:15;;;;15786:1;15566:9;15537:687;;;-1:-1:-1;16241:3:1;;15230:1020;-1:-1:-1;;;;;;;15230:1020:1:o;22258:355::-;22460:2;22442:21;;;22499:2;22479:18;;;22472:30;22538:33;22533:2;22518:18;;22511:61;22604:2;22589:18;;22432:181::o;23912:736::-;24165:25;;;-1:-1:-1;;;;;24264:15:1;;;24259:2;24244:18;;24237:43;24316:15;;24311:2;24296:18;;24289:43;24217:3;24363:2;24348:18;;24341:31;;;24388:19;;24381:35;;;24146:4;24409:6;24459;24453:3;24438:19;;24425:49;24524:1;24518:3;24509:6;24498:9;24494:22;24490:32;24483:43;24594:3;24587:2;24583:7;24578:2;24570:6;24566:15;24562:29;24551:9;24547:45;24543:55;24535:63;;24635:6;24629:3;24618:9;24614:19;24607:35;24155:493;;;;;;;;;:::o;24653:1108::-;25118:25;;;-1:-1:-1;;;;;25217:15:1;;;25212:2;25197:18;;25190:43;25077:4;;25106:3;;25242:53;25291:2;25276:18;;25268:6;25242:53;:::i;:::-;25331:6;25326:2;25315:9;25311:18;25304:34;25375:6;25369:3;25358:9;25354:19;25347:35;25431:2;25423:6;25419:15;25413:3;25402:9;25398:19;25391:44;25484:2;25476:6;25472:15;25466:3;25455:9;25451:19;25444:44;;25525:2;25519:3;25508:9;25504:19;25497:31;25545:45;25586:2;25575:9;25571:18;25563:6;25545:45;:::i;:::-;25621:3;25606:19;;25599:35;;;;-1:-1:-1;;25678:14:1;;25671:22;25665:3;25650:19;;25643:51;25738:15;25731:23;25725:3;25710:19;;;25703:52;25537:53;25086:675;-1:-1:-1;;;;;;;;25086:675:1:o;26440:275::-;26511:2;26505:9;26576:2;26557:13;;-1:-1:-1;;26553:27:1;26541:40;;-1:-1:-1;;;;;26596:34:1;;26632:22;;;26593:62;26590:2;;;26658:18;;:::i;:::-;26694:2;26687:22;26485:230;;-1:-1:-1;26485:230:1:o;26720:128::-;26760:3;26791:1;26787:6;26784:1;26781:13;26778:2;;;26797:18;;:::i;:::-;-1:-1:-1;26833:9:1;;26768:80::o;26853:217::-;26893:1;26919;26909:2;;26963:10;26958:3;26954:20;26951:1;26944:31;26998:4;26995:1;26988:15;27026:4;27023:1;27016:15;26909:2;-1:-1:-1;27055:9:1;;26899:171::o;27075:168::-;27115:7;27181:1;27177;27173:6;27169:14;27166:1;27163:21;27158:1;27151:9;27144:17;27140:45;27137:2;;;27188:18;;:::i;:::-;-1:-1:-1;27228:9:1;;27127:116::o;27248:125::-;27288:4;27316:1;27313;27310:8;27307:2;;;27321:18;;:::i;:::-;-1:-1:-1;27358:9:1;;27297:76::o;27378:380::-;27457:1;27453:12;;;;27500;;;27521:2;;27575:4;27567:6;27563:17;27553:27;;27521:2;27628;27620:6;27617:14;27597:18;27594:38;27591:2;;;27674:10;27669:3;27665:20;27662:1;27655:31;27709:4;27706:1;27699:15;27737:4;27734:1;27727:15;27591:2;;27433:325;;;:::o;27763:135::-;27802:3;-1:-1:-1;;27823:17:1;;27820:2;;;27843:18;;:::i;:::-;-1:-1:-1;27890:1:1;27879:13;;27810:88::o;27903:127::-;27964:10;27959:3;27955:20;27952:1;27945:31;27995:4;27992:1;27985:15;28019:4;28016:1;28009:15;28035:127;28096:10;28091:3;28087:20;28084:1;28077:31;28127:4;28124:1;28117:15;28151:4;28148:1;28141:15;28167:127;28228:10;28223:3;28219:20;28216:1;28209:31;28259:4;28256:1;28249:15;28283:4;28280:1;28273:15;28299:127;28360:10;28355:3;28351:20;28348:1;28341:31;28391:4;28388:1;28381:15;28415:4;28412:1;28405:15;28431:127;28492:10;28487:3;28483:20;28480:1;28473:31;28523:4;28520:1;28513:15;28547:4;28544:1;28537:15;28563:118;28649:5;28642:13;28635:21;28628:5;28625:32;28615:2;;28671:1;28668;28661:12

Swarm Source

ipfs://c41f50b588772cd0977122454e7feaa244a2bc55778e8b7188e1e7e73bd6f4f9

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.