ETH Price: $3,360.06 (+0.37%)

Token

Editions (EDTN)
 

Overview

Max Total Supply

353 EDTN

Holders

61

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0x92fbd2faf1e67b5a55ce9196b4eaa3b55c23ceca
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Editions

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 2 of 2: Editions.sol
// SPDX-License-Identifier: MIT

/*

 /$$$$$$$$ /$$$$$$$  /$$$$$$ /$$$$$$$$ /$$$$$$  /$$$$$$  /$$   /$$  /$$$$$$
| $$_____/| $$__  $$|_  $$_/|__  $$__/|_  $$_/ /$$__  $$| $$$ | $$ /$$__  $$
| $$      | $$  \ $$  | $$     | $$     | $$  | $$  \ $$| $$$$| $$| $$  \__/
| $$$$$   | $$  | $$  | $$     | $$     | $$  | $$  | $$| $$ $$ $$|  $$$$$$
| $$__/   | $$  | $$  | $$     | $$     | $$  | $$  | $$| $$  $$$$ \____  $$
| $$      | $$  | $$  | $$     | $$     | $$  | $$  | $$| $$\  $$$ /$$  \ $$
| $$$$$$$$| $$$$$$$/ /$$$$$$   | $$    /$$$$$$|  $$$$$$/| $$ \  $$|  $$$$$$/
|________/|_______/ |______/   |__/   |______/ \______/ |__/  \__/ \______/


- steviep.eth

*/

import "./Dependencies.sol";

pragma solidity ^0.8.11;

interface TokenURI {
  function uri(uint256) external view returns (string memory);
}

contract Editions is ERC1155, Ownable {
  mapping(uint256 => address) public tokenIdToMinter;
  mapping(uint256 => address) public tokenIdToURIContract;
  mapping(uint256 => uint16) public tokenIdToRoyaltyBP;
  mapping(uint256 => address) public tokenIdToRoyaltyBeneficiary;

  string public constant name = 'Editions';
  string public constant symbol = 'EDTN';
  address public defaultURIContract;

  event MetadataUpdate(uint256 _tokenId);
  event ProjectEvent(address indexed poster, string indexed eventType, string content);
  event TokenEvent(address indexed poster, uint256 indexed tokenId, string indexed eventType, string content);

  modifier onlyMinter(uint256 id) {
    require(msg.sender == tokenIdToMinter[id], 'Caller is not the minter');
    _;
  }

  function mint(address to, uint256 id, uint256 amount) external onlyMinter(id) {
    _mint(to, id, amount, "");
  }

  function batchMint(address[] calldata recipients, uint256 id, uint256[] calldata amounts) external onlyMinter(id) {
    uint256 recipientCount = recipients.length;
    require(recipientCount == amounts.length, 'Length of recipient and amount arrays mismatched');

    for (uint256 i; i < recipientCount; ++i) {
      _mint(recipients[i], id, amounts[i], "");
    }
  }

  function setMinterForToken(uint256 id, address minter) external onlyOwner {
    tokenIdToMinter[id] = minter;
  }

  function setURIContractForToken(uint256 id, address addr) external onlyOwner {
    tokenIdToURIContract[id] = addr;
    emit MetadataUpdate(id);
  }

  function setDefaultURIContract(address addr) external onlyOwner {
    defaultURIContract = addr;
  }

  function uri(uint256 id) external view returns (string memory) {
    if (tokenIdToURIContract[id] == address(0)) {
      return TokenURI(defaultURIContract).uri(id);
    } else {
      return TokenURI(tokenIdToURIContract[id]).uri(id);
    }
  }


  function emitTokenEvent(uint256 tokenId, string calldata eventType, string calldata content) external {
    require(
      owner() == msg.sender || balanceOf(msg.sender, tokenId) > 0,
      'Only project or token owner can emit token event'
    );
    emit TokenEvent(msg.sender, tokenId, eventType, content);
  }

  function emitProjectEvent(string calldata eventType, string calldata content) external onlyOwner {
    emit ProjectEvent(msg.sender, eventType, content);
  }

  // Royalty Info
  function setRoyaltyInfo(
    uint256 tokenId,
    address _royaltyBenificiary,
    uint16 _royaltyBasisPoints
  ) external onlyOwner {
    tokenIdToRoyaltyBP[tokenId] = _royaltyBasisPoints;
    tokenIdToRoyaltyBeneficiary[tokenId] = _royaltyBenificiary;
  }

  function royaltyInfo(uint256 tokenId, uint256 _salePrice) external view returns (address, uint256) {
    return (tokenIdToRoyaltyBeneficiary[tokenId], _salePrice * tokenIdToRoyaltyBP[tokenId] / 10000);
  }

  function supportsInterface(bytes4 interfaceId) public view virtual override(ERC1155) returns (bool) {
    // ERC2981 & ERC4906
    return interfaceId == bytes4(0x2a55205a) || interfaceId == bytes4(0x49064906) || super.supportsInterface(interfaceId);
  }
}

File 1 of 2: Dependencies.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.1;


/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}
/**
 * @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 Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}


/**
 * @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.
     *
     * NOTE: 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.
     *
     * NOTE: 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 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 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 Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}


/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */

// Modified by steviep.eth to implement custom uri logic

abstract contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

    // Mapping from account to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;


    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC1155).interfaceId ||
            interfaceId == type(IERC1155MetadataURI).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: address zero is not a valid owner");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC1155-isApprovedForAll}.
     */
    function isApprovedForAll(address account, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[account][operator];
    }

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `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 memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - 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[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * 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 _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC1155: setting approval status for self");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `ids` and `amounts` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    /**
     * @dev Hook that is called after any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


/// [MIT License]
/// @title Base64
/// @notice Provides a function for encoding some bytes in base64
/// @author Brecht Devos <[email protected]>
library Base64 {
    bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /// @notice Encodes some bytes to the base64 representation
    function encode(bytes memory data) internal pure returns (string memory) {
        uint256 len = data.length;
        if (len == 0) return "";

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((len + 2) / 3);

        // Add some extra buffer at the end
        bytes memory result = new bytes(encodedLen + 32);

        bytes memory table = TABLE;

        assembly {
            let tablePtr := add(table, 1)
            let resultPtr := add(result, 32)

            for {
                let i := 0
            } lt(i, len) {

            } {
                i := add(i, 3)
                let input := and(mload(add(data, i)), 0xffffff)

                let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF))
                out := shl(224, out)

                mstore(resultPtr, out)

                resultPtr := add(resultPtr, 4)
            }

            switch mod(len, 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }

            mstore(result, encodedLen)
        }

        return string(result);
    }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"MetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"poster","type":"address"},{"indexed":true,"internalType":"string","name":"eventType","type":"string"},{"indexed":false,"internalType":"string","name":"content","type":"string"}],"name":"ProjectEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"poster","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"string","name":"eventType","type":"string"},{"indexed":false,"internalType":"string","name":"content","type":"string"}],"name":"TokenEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"defaultURIContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"eventType","type":"string"},{"internalType":"string","name":"content","type":"string"}],"name":"emitProjectEvent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"eventType","type":"string"},{"internalType":"string","name":"content","type":"string"}],"name":"emitTokenEvent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setDefaultURIContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"minter","type":"address"}],"name":"setMinterForToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"_royaltyBenificiary","type":"address"},{"internalType":"uint16","name":"_royaltyBasisPoints","type":"uint16"}],"name":"setRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"addr","type":"address"}],"name":"setURIContractForToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIdToMinter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIdToRoyaltyBP","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIdToRoyaltyBeneficiary","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIdToURIContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b5062000032620000266200003860201b60201c565b6200004060201b60201c565b62000106565b600033905090565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613f4980620001166000396000f3fe608060405234801561001057600080fd5b50600436106101a85760003560e01c806352a6c8c9116100f9578063a22cb46511610097578063e6e94c9b11610071578063e6e94c9b146104da578063e985e9c5146104f8578063f242432a14610528578063f2fde38b14610544576101a8565b8063a22cb46514610486578063d4434ab0146104a2578063d93c6b18146104be576101a8565b8063715018a6116100d3578063715018a6146104245780638da5cb5b1461042e578063951fa4d51461044c57806395d89b4114610468576101a8565b806352a6c8c9146103d05780635ab80a7c146103ec5780636979764c14610408576101a8565b80632218f1191161016657806330a31ee81161014057806330a31ee8146103245780633b0bb45c1461035457806345c9a9db146103705780634e1273f4146103a0576101a8565b80632218f119146102a75780632a55205a146102d75780632eb2c2d614610308576101a8565b8062fdd58e146101ad57806301ffc9a7146101dd57806306fdde031461020d5780630e89341c1461022b578063156e29f61461025b57806320721b1914610277575b600080fd5b6101c760048036038101906101c29190612425565b610560565b6040516101d49190612474565b60405180910390f35b6101f760048036038101906101f291906124e7565b610629565b604051610204919061252f565b60405180910390f35b6102156106d9565b60405161022291906125e3565b60405180910390f35b61024560048036038101906102409190612605565b610712565b60405161025291906125e3565b60405180910390f35b61027560048036038101906102709190612632565b6108de565b005b610291600480360381019061028c9190612605565b6109a1565b60405161029e9190612694565b60405180910390f35b6102c160048036038101906102bc9190612605565b6109d4565b6040516102ce9190612694565b60405180910390f35b6102f160048036038101906102ec91906126af565b610a07565b6040516102ff9291906126ef565b60405180910390f35b610322600480360381019061031d9190612915565b610a87565b005b61033e60048036038101906103399190612605565b610b28565b60405161034b9190612a01565b60405180910390f35b61036e60048036038101906103699190612a48565b610b49565b005b61038a60048036038101906103859190612605565b610bd6565b6040516103979190612694565b60405180910390f35b6103ba60048036038101906103b59190612b5e565b610c09565b6040516103c79190612c94565b60405180910390f35b6103ea60048036038101906103e59190612d11565b610d22565b005b61040660048036038101906104019190612da6565b610e1b565b005b610422600480360381019061041d9190612da6565b610e79565b005b61042c610f0e565b005b610436610f22565b6040516104439190612694565b60405180910390f35b61046660048036038101906104619190612e92565b610f4c565b005b6104706110bc565b60405161047d91906125e3565b60405180910390f35b6104a0600480360381019061049b9190612f53565b6110f5565b005b6104bc60048036038101906104b79190612f93565b61110b565b005b6104d860048036038101906104d39190613014565b611181565b005b6104e26111cd565b6040516104ef9190612694565b60405180910390f35b610512600480360381019061050d9190613041565b6111f3565b60405161051f919061252f565b60405180910390f35b610542600480360381019061053d9190613081565b611287565b005b61055e60048036038101906105599190613014565b611328565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156105d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105c89061318a565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000632a55205a60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106c25750634906490660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106d257506106d1826113ac565b5b9050919050565b6040518060400160405280600881526020017f45646974696f6e7300000000000000000000000000000000000000000000000081525081565b6060600073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561082457600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630e89341c836040518263ffffffff1660e01b81526004016107d79190612474565b600060405180830381865afa1580156107f4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061081d919061324b565b90506108d9565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630e89341c836040518263ffffffff1660e01b81526004016108909190612474565b600060405180830381865afa1580156108ad573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906108d6919061324b565b90505b919050565b816003600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610980576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610977906132e0565b60405180910390fd5b61099b8484846040518060200160405280600081525061148e565b50505050565b60066020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60036020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806006600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166127106005600087815260200190815260200160002060009054906101000a900461ffff1661ffff1685610a72919061332f565b610a7c91906133b8565b915091509250929050565b610a8f61163f565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610ad55750610ad485610acf61163f565b6111f3565b5b610b14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0b9061345b565b60405180910390fd5b610b218585858585611647565b5050505050565b60056020528060005260406000206000915054906101000a900461ffff1681565b610b51611969565b806005600085815260200190815260200160002060006101000a81548161ffff021916908361ffff160217905550816006600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60608151835114610c4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c46906134ed565b60405180910390fd5b6000835167ffffffffffffffff811115610c6c57610c6b61271d565b5b604051908082528060200260200182016040528015610c9a5781602001602082028036833780820191505090505b50905060005b8451811015610d1757610ce7858281518110610cbf57610cbe61350d565b5b6020026020010151858381518110610cda57610cd961350d565b5b6020026020010151610560565b828281518110610cfa57610cf961350d565b5b60200260200101818152505080610d109061353c565b9050610ca0565b508091505092915050565b3373ffffffffffffffffffffffffffffffffffffffff16610d41610f22565b73ffffffffffffffffffffffffffffffffffffffff161480610d6c57506000610d6a3387610560565b115b610dab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da2906135f7565b60405180910390fd5b8383604051610dbb929190613647565b6040518091039020853373ffffffffffffffffffffffffffffffffffffffff167fad000c5a693465b4555f1044ddd1221ef0bfc49e5621ceb705b952ff97e2caac8585604051610e0c92919061368d565b60405180910390a45050505050565b610e23611969565b806003600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b610e81611969565b806004600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce782604051610f029190612474565b60405180910390a15050565b610f16611969565b610f2060006119e7565b565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b826003600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe5906132e0565b60405180910390fd5b600086869050905083839050811461103b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103290613723565b60405180910390fd5b60005b818110156110b2576110a188888381811061105c5761105b61350d565b5b90506020020160208101906110719190613014565b878787858181106110855761108461350d565b5b905060200201356040518060200160405280600081525061148e565b806110ab9061353c565b905061103e565b5050505050505050565b6040518060400160405280600481526020017f4544544e0000000000000000000000000000000000000000000000000000000081525081565b61110761110061163f565b8383611aad565b5050565b611113611969565b8383604051611123929190613647565b60405180910390203373ffffffffffffffffffffffffffffffffffffffff167f3d366eac52dec4372766dc4b15bba20b935b45d33171465a598eedabb5a5dff8848460405161117392919061368d565b60405180910390a350505050565b611189611969565b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61128f61163f565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806112d557506112d4856112cf61163f565b6111f3565b5b611314576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130b9061345b565b60405180910390fd5b6113218585858585611c1a565b5050505050565b611330611969565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611397906137b5565b60405180910390fd5b6113a9816119e7565b50565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061147757507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611487575061148682611eb6565b5b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156114fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f590613847565b60405180910390fd5b600061150861163f565b9050600061151585611f20565b9050600061152285611f20565b905061153383600089858589611f9a565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115929190613867565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289896040516116109291906138bd565b60405180910390a461162783600089858589611fa2565b61163683600089898989611faa565b50505050505050565b600033905090565b815183511461168b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168290613958565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156116fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f2906139ea565b60405180910390fd5b600061170561163f565b9050611715818787878787611f9a565b60005b84518110156118c65760008582815181106117365761173561350d565b5b6020026020010151905060008583815181106117555761175461350d565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156117f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ed90613a7c565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118ab9190613867565b92505081905550505050806118bf9061353c565b9050611718565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161193d929190613a9c565b60405180910390a4611953818787878787611fa2565b611961818787878787612182565b505050505050565b61197161163f565b73ffffffffffffffffffffffffffffffffffffffff1661198f610f22565b73ffffffffffffffffffffffffffffffffffffffff16146119e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119dc90613b1f565b60405180910390fd5b565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611b1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1390613bb1565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c0d919061252f565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611c8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c81906139ea565b60405180910390fd5b6000611c9461163f565b90506000611ca185611f20565b90506000611cae85611f20565b9050611cbe838989858589611f9a565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905085811015611d55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4c90613a7c565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e0a9190613867565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a604051611e879291906138bd565b60405180910390a4611e9d848a8a86868a611fa2565b611eab848a8a8a8a8a611faa565b505050505050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60606000600167ffffffffffffffff811115611f3f57611f3e61271d565b5b604051908082528060200260200182016040528015611f6d5781602001602082028036833780820191505090505b5090508281600081518110611f8557611f8461350d565b5b60200260200101818152505080915050919050565b505050505050565b505050505050565b611fc98473ffffffffffffffffffffffffffffffffffffffff1661235a565b1561217a578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b815260040161200f959493929190613c26565b6020604051808303816000875af192505050801561204b57506040513d601f19601f820116820180604052508101906120489190613c95565b60015b6120f157612057613ccf565b806308c379a014156120b4575061206c613cf1565b8061207757506120b6565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ab91906125e3565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e890613df9565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216f90613e8b565b60405180910390fd5b505b505050505050565b6121a18473ffffffffffffffffffffffffffffffffffffffff1661235a565b15612352578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b81526004016121e7959493929190613eab565b6020604051808303816000875af192505050801561222357506040513d601f19601f820116820180604052508101906122209190613c95565b60015b6122c95761222f613ccf565b806308c379a0141561228c5750612244613cf1565b8061224f575061228e565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228391906125e3565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c090613df9565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612350576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234790613e8b565b60405180910390fd5b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123bc82612391565b9050919050565b6123cc816123b1565b81146123d757600080fd5b50565b6000813590506123e9816123c3565b92915050565b6000819050919050565b612402816123ef565b811461240d57600080fd5b50565b60008135905061241f816123f9565b92915050565b6000806040838503121561243c5761243b612387565b5b600061244a858286016123da565b925050602061245b85828601612410565b9150509250929050565b61246e816123ef565b82525050565b60006020820190506124896000830184612465565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6124c48161248f565b81146124cf57600080fd5b50565b6000813590506124e1816124bb565b92915050565b6000602082840312156124fd576124fc612387565b5b600061250b848285016124d2565b91505092915050565b60008115159050919050565b61252981612514565b82525050565b60006020820190506125446000830184612520565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612584578082015181840152602081019050612569565b83811115612593576000848401525b50505050565b6000601f19601f8301169050919050565b60006125b58261254a565b6125bf8185612555565b93506125cf818560208601612566565b6125d881612599565b840191505092915050565b600060208201905081810360008301526125fd81846125aa565b905092915050565b60006020828403121561261b5761261a612387565b5b600061262984828501612410565b91505092915050565b60008060006060848603121561264b5761264a612387565b5b6000612659868287016123da565b935050602061266a86828701612410565b925050604061267b86828701612410565b9150509250925092565b61268e816123b1565b82525050565b60006020820190506126a96000830184612685565b92915050565b600080604083850312156126c6576126c5612387565b5b60006126d485828601612410565b92505060206126e585828601612410565b9150509250929050565b60006040820190506127046000830185612685565b6127116020830184612465565b9392505050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61275582612599565b810181811067ffffffffffffffff821117156127745761277361271d565b5b80604052505050565b600061278761237d565b9050612793828261274c565b919050565b600067ffffffffffffffff8211156127b3576127b261271d565b5b602082029050602081019050919050565b600080fd5b60006127dc6127d784612798565b61277d565b905080838252602082019050602084028301858111156127ff576127fe6127c4565b5b835b8181101561282857806128148882612410565b845260208401935050602081019050612801565b5050509392505050565b600082601f83011261284757612846612718565b5b81356128578482602086016127c9565b91505092915050565b600080fd5b600067ffffffffffffffff8211156128805761287f61271d565b5b61288982612599565b9050602081019050919050565b82818337600083830152505050565b60006128b86128b384612865565b61277d565b9050828152602081018484840111156128d4576128d3612860565b5b6128df848285612896565b509392505050565b600082601f8301126128fc576128fb612718565b5b813561290c8482602086016128a5565b91505092915050565b600080600080600060a0868803121561293157612930612387565b5b600061293f888289016123da565b9550506020612950888289016123da565b945050604086013567ffffffffffffffff8111156129715761297061238c565b5b61297d88828901612832565b935050606086013567ffffffffffffffff81111561299e5761299d61238c565b5b6129aa88828901612832565b925050608086013567ffffffffffffffff8111156129cb576129ca61238c565b5b6129d7888289016128e7565b9150509295509295909350565b600061ffff82169050919050565b6129fb816129e4565b82525050565b6000602082019050612a1660008301846129f2565b92915050565b612a25816129e4565b8114612a3057600080fd5b50565b600081359050612a4281612a1c565b92915050565b600080600060608486031215612a6157612a60612387565b5b6000612a6f86828701612410565b9350506020612a80868287016123da565b9250506040612a9186828701612a33565b9150509250925092565b600067ffffffffffffffff821115612ab657612ab561271d565b5b602082029050602081019050919050565b6000612ada612ad584612a9b565b61277d565b90508083825260208201905060208402830185811115612afd57612afc6127c4565b5b835b81811015612b265780612b1288826123da565b845260208401935050602081019050612aff565b5050509392505050565b600082601f830112612b4557612b44612718565b5b8135612b55848260208601612ac7565b91505092915050565b60008060408385031215612b7557612b74612387565b5b600083013567ffffffffffffffff811115612b9357612b9261238c565b5b612b9f85828601612b30565b925050602083013567ffffffffffffffff811115612bc057612bbf61238c565b5b612bcc85828601612832565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612c0b816123ef565b82525050565b6000612c1d8383612c02565b60208301905092915050565b6000602082019050919050565b6000612c4182612bd6565b612c4b8185612be1565b9350612c5683612bf2565b8060005b83811015612c87578151612c6e8882612c11565b9750612c7983612c29565b925050600181019050612c5a565b5085935050505092915050565b60006020820190508181036000830152612cae8184612c36565b905092915050565b600080fd5b60008083601f840112612cd157612cd0612718565b5b8235905067ffffffffffffffff811115612cee57612ced612cb6565b5b602083019150836001820283011115612d0a57612d096127c4565b5b9250929050565b600080600080600060608688031215612d2d57612d2c612387565b5b6000612d3b88828901612410565b955050602086013567ffffffffffffffff811115612d5c57612d5b61238c565b5b612d6888828901612cbb565b9450945050604086013567ffffffffffffffff811115612d8b57612d8a61238c565b5b612d9788828901612cbb565b92509250509295509295909350565b60008060408385031215612dbd57612dbc612387565b5b6000612dcb85828601612410565b9250506020612ddc858286016123da565b9150509250929050565b60008083601f840112612dfc57612dfb612718565b5b8235905067ffffffffffffffff811115612e1957612e18612cb6565b5b602083019150836020820283011115612e3557612e346127c4565b5b9250929050565b60008083601f840112612e5257612e51612718565b5b8235905067ffffffffffffffff811115612e6f57612e6e612cb6565b5b602083019150836020820283011115612e8b57612e8a6127c4565b5b9250929050565b600080600080600060608688031215612eae57612ead612387565b5b600086013567ffffffffffffffff811115612ecc57612ecb61238c565b5b612ed888828901612de6565b95509550506020612eeb88828901612410565b935050604086013567ffffffffffffffff811115612f0c57612f0b61238c565b5b612f1888828901612e3c565b92509250509295509295909350565b612f3081612514565b8114612f3b57600080fd5b50565b600081359050612f4d81612f27565b92915050565b60008060408385031215612f6a57612f69612387565b5b6000612f78858286016123da565b9250506020612f8985828601612f3e565b9150509250929050565b60008060008060408587031215612fad57612fac612387565b5b600085013567ffffffffffffffff811115612fcb57612fca61238c565b5b612fd787828801612cbb565b9450945050602085013567ffffffffffffffff811115612ffa57612ff961238c565b5b61300687828801612cbb565b925092505092959194509250565b60006020828403121561302a57613029612387565b5b6000613038848285016123da565b91505092915050565b6000806040838503121561305857613057612387565b5b6000613066858286016123da565b9250506020613077858286016123da565b9150509250929050565b600080600080600060a0868803121561309d5761309c612387565b5b60006130ab888289016123da565b95505060206130bc888289016123da565b94505060406130cd88828901612410565b93505060606130de88828901612410565b925050608086013567ffffffffffffffff8111156130ff576130fe61238c565b5b61310b888289016128e7565b9150509295509295909350565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b6000613174602a83612555565b915061317f82613118565b604082019050919050565b600060208201905081810360008301526131a381613167565b9050919050565b600067ffffffffffffffff8211156131c5576131c461271d565b5b6131ce82612599565b9050602081019050919050565b60006131ee6131e9846131aa565b61277d565b90508281526020810184848401111561320a57613209612860565b5b613215848285612566565b509392505050565b600082601f83011261323257613231612718565b5b81516132428482602086016131db565b91505092915050565b60006020828403121561326157613260612387565b5b600082015167ffffffffffffffff81111561327f5761327e61238c565b5b61328b8482850161321d565b91505092915050565b7f43616c6c6572206973206e6f7420746865206d696e7465720000000000000000600082015250565b60006132ca601883612555565b91506132d582613294565b602082019050919050565b600060208201905081810360008301526132f9816132bd565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061333a826123ef565b9150613345836123ef565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561337e5761337d613300565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006133c3826123ef565b91506133ce836123ef565b9250826133de576133dd613389565b5b828204905092915050565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206e6f7220617070726f7665640000000000000000000000000000000000602082015250565b6000613445602f83612555565b9150613450826133e9565b604082019050919050565b6000602082019050818103600083015261347481613438565b9050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b60006134d7602983612555565b91506134e28261347b565b604082019050919050565b60006020820190508181036000830152613506816134ca565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000613547826123ef565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561357a57613579613300565b5b600182019050919050565b7f4f6e6c792070726f6a656374206f7220746f6b656e206f776e65722063616e2060008201527f656d697420746f6b656e206576656e7400000000000000000000000000000000602082015250565b60006135e1603083612555565b91506135ec82613585565b604082019050919050565b60006020820190508181036000830152613610816135d4565b9050919050565b600081905092915050565b600061362e8385613617565b935061363b838584612896565b82840190509392505050565b6000613654828486613622565b91508190509392505050565b600061366c8385612555565b9350613679838584612896565b61368283612599565b840190509392505050565b600060208201905081810360008301526136a8818486613660565b90509392505050565b7f4c656e677468206f6620726563697069656e7420616e6420616d6f756e74206160008201527f7272617973206d69736d61746368656400000000000000000000000000000000602082015250565b600061370d603083612555565b9150613718826136b1565b604082019050919050565b6000602082019050818103600083015261373c81613700565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061379f602683612555565b91506137aa82613743565b604082019050919050565b600060208201905081810360008301526137ce81613792565b9050919050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613831602183612555565b915061383c826137d5565b604082019050919050565b6000602082019050818103600083015261386081613824565b9050919050565b6000613872826123ef565b915061387d836123ef565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156138b2576138b1613300565b5b828201905092915050565b60006040820190506138d26000830185612465565b6138df6020830184612465565b9392505050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b6000613942602883612555565b915061394d826138e6565b604082019050919050565b6000602082019050818103600083015261397181613935565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006139d4602583612555565b91506139df82613978565b604082019050919050565b60006020820190508181036000830152613a03816139c7565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000613a66602a83612555565b9150613a7182613a0a565b604082019050919050565b60006020820190508181036000830152613a9581613a59565b9050919050565b60006040820190508181036000830152613ab68185612c36565b90508181036020830152613aca8184612c36565b90509392505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613b09602083612555565b9150613b1482613ad3565b602082019050919050565b60006020820190508181036000830152613b3881613afc565b9050919050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b6000613b9b602983612555565b9150613ba682613b3f565b604082019050919050565b60006020820190508181036000830152613bca81613b8e565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613bf882613bd1565b613c028185613bdc565b9350613c12818560208601612566565b613c1b81612599565b840191505092915050565b600060a082019050613c3b6000830188612685565b613c486020830187612685565b613c556040830186612465565b613c626060830185612465565b8181036080830152613c748184613bed565b90509695505050505050565b600081519050613c8f816124bb565b92915050565b600060208284031215613cab57613caa612387565b5b6000613cb984828501613c80565b91505092915050565b60008160e01c9050919050565b600060033d1115613cee5760046000803e613ceb600051613cc2565b90505b90565b600060443d1015613d0157613d84565b613d0961237d565b60043d036004823e80513d602482011167ffffffffffffffff82111715613d31575050613d84565b808201805167ffffffffffffffff811115613d4f5750505050613d84565b80602083010160043d038501811115613d6c575050505050613d84565b613d7b8260200185018661274c565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b6000613de3603483612555565b9150613dee82613d87565b604082019050919050565b60006020820190508181036000830152613e1281613dd6565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b6000613e75602883612555565b9150613e8082613e19565b604082019050919050565b60006020820190508181036000830152613ea481613e68565b9050919050565b600060a082019050613ec06000830188612685565b613ecd6020830187612685565b8181036040830152613edf8186612c36565b90508181036060830152613ef38185612c36565b90508181036080830152613f078184613bed565b9050969550505050505056fea26469706673582212205854a206491868eec6d979fb470be1886e12c5af87e40a870971964b085217ba64736f6c634300080b0033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101a85760003560e01c806352a6c8c9116100f9578063a22cb46511610097578063e6e94c9b11610071578063e6e94c9b146104da578063e985e9c5146104f8578063f242432a14610528578063f2fde38b14610544576101a8565b8063a22cb46514610486578063d4434ab0146104a2578063d93c6b18146104be576101a8565b8063715018a6116100d3578063715018a6146104245780638da5cb5b1461042e578063951fa4d51461044c57806395d89b4114610468576101a8565b806352a6c8c9146103d05780635ab80a7c146103ec5780636979764c14610408576101a8565b80632218f1191161016657806330a31ee81161014057806330a31ee8146103245780633b0bb45c1461035457806345c9a9db146103705780634e1273f4146103a0576101a8565b80632218f119146102a75780632a55205a146102d75780632eb2c2d614610308576101a8565b8062fdd58e146101ad57806301ffc9a7146101dd57806306fdde031461020d5780630e89341c1461022b578063156e29f61461025b57806320721b1914610277575b600080fd5b6101c760048036038101906101c29190612425565b610560565b6040516101d49190612474565b60405180910390f35b6101f760048036038101906101f291906124e7565b610629565b604051610204919061252f565b60405180910390f35b6102156106d9565b60405161022291906125e3565b60405180910390f35b61024560048036038101906102409190612605565b610712565b60405161025291906125e3565b60405180910390f35b61027560048036038101906102709190612632565b6108de565b005b610291600480360381019061028c9190612605565b6109a1565b60405161029e9190612694565b60405180910390f35b6102c160048036038101906102bc9190612605565b6109d4565b6040516102ce9190612694565b60405180910390f35b6102f160048036038101906102ec91906126af565b610a07565b6040516102ff9291906126ef565b60405180910390f35b610322600480360381019061031d9190612915565b610a87565b005b61033e60048036038101906103399190612605565b610b28565b60405161034b9190612a01565b60405180910390f35b61036e60048036038101906103699190612a48565b610b49565b005b61038a60048036038101906103859190612605565b610bd6565b6040516103979190612694565b60405180910390f35b6103ba60048036038101906103b59190612b5e565b610c09565b6040516103c79190612c94565b60405180910390f35b6103ea60048036038101906103e59190612d11565b610d22565b005b61040660048036038101906104019190612da6565b610e1b565b005b610422600480360381019061041d9190612da6565b610e79565b005b61042c610f0e565b005b610436610f22565b6040516104439190612694565b60405180910390f35b61046660048036038101906104619190612e92565b610f4c565b005b6104706110bc565b60405161047d91906125e3565b60405180910390f35b6104a0600480360381019061049b9190612f53565b6110f5565b005b6104bc60048036038101906104b79190612f93565b61110b565b005b6104d860048036038101906104d39190613014565b611181565b005b6104e26111cd565b6040516104ef9190612694565b60405180910390f35b610512600480360381019061050d9190613041565b6111f3565b60405161051f919061252f565b60405180910390f35b610542600480360381019061053d9190613081565b611287565b005b61055e60048036038101906105599190613014565b611328565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156105d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105c89061318a565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000632a55205a60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106c25750634906490660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106d257506106d1826113ac565b5b9050919050565b6040518060400160405280600881526020017f45646974696f6e7300000000000000000000000000000000000000000000000081525081565b6060600073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561082457600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630e89341c836040518263ffffffff1660e01b81526004016107d79190612474565b600060405180830381865afa1580156107f4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061081d919061324b565b90506108d9565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630e89341c836040518263ffffffff1660e01b81526004016108909190612474565b600060405180830381865afa1580156108ad573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906108d6919061324b565b90505b919050565b816003600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610980576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610977906132e0565b60405180910390fd5b61099b8484846040518060200160405280600081525061148e565b50505050565b60066020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60036020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806006600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166127106005600087815260200190815260200160002060009054906101000a900461ffff1661ffff1685610a72919061332f565b610a7c91906133b8565b915091509250929050565b610a8f61163f565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610ad55750610ad485610acf61163f565b6111f3565b5b610b14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0b9061345b565b60405180910390fd5b610b218585858585611647565b5050505050565b60056020528060005260406000206000915054906101000a900461ffff1681565b610b51611969565b806005600085815260200190815260200160002060006101000a81548161ffff021916908361ffff160217905550816006600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60608151835114610c4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c46906134ed565b60405180910390fd5b6000835167ffffffffffffffff811115610c6c57610c6b61271d565b5b604051908082528060200260200182016040528015610c9a5781602001602082028036833780820191505090505b50905060005b8451811015610d1757610ce7858281518110610cbf57610cbe61350d565b5b6020026020010151858381518110610cda57610cd961350d565b5b6020026020010151610560565b828281518110610cfa57610cf961350d565b5b60200260200101818152505080610d109061353c565b9050610ca0565b508091505092915050565b3373ffffffffffffffffffffffffffffffffffffffff16610d41610f22565b73ffffffffffffffffffffffffffffffffffffffff161480610d6c57506000610d6a3387610560565b115b610dab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da2906135f7565b60405180910390fd5b8383604051610dbb929190613647565b6040518091039020853373ffffffffffffffffffffffffffffffffffffffff167fad000c5a693465b4555f1044ddd1221ef0bfc49e5621ceb705b952ff97e2caac8585604051610e0c92919061368d565b60405180910390a45050505050565b610e23611969565b806003600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b610e81611969565b806004600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce782604051610f029190612474565b60405180910390a15050565b610f16611969565b610f2060006119e7565b565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b826003600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe5906132e0565b60405180910390fd5b600086869050905083839050811461103b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103290613723565b60405180910390fd5b60005b818110156110b2576110a188888381811061105c5761105b61350d565b5b90506020020160208101906110719190613014565b878787858181106110855761108461350d565b5b905060200201356040518060200160405280600081525061148e565b806110ab9061353c565b905061103e565b5050505050505050565b6040518060400160405280600481526020017f4544544e0000000000000000000000000000000000000000000000000000000081525081565b61110761110061163f565b8383611aad565b5050565b611113611969565b8383604051611123929190613647565b60405180910390203373ffffffffffffffffffffffffffffffffffffffff167f3d366eac52dec4372766dc4b15bba20b935b45d33171465a598eedabb5a5dff8848460405161117392919061368d565b60405180910390a350505050565b611189611969565b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61128f61163f565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806112d557506112d4856112cf61163f565b6111f3565b5b611314576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130b9061345b565b60405180910390fd5b6113218585858585611c1a565b5050505050565b611330611969565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611397906137b5565b60405180910390fd5b6113a9816119e7565b50565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061147757507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611487575061148682611eb6565b5b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156114fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f590613847565b60405180910390fd5b600061150861163f565b9050600061151585611f20565b9050600061152285611f20565b905061153383600089858589611f9a565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115929190613867565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289896040516116109291906138bd565b60405180910390a461162783600089858589611fa2565b61163683600089898989611faa565b50505050505050565b600033905090565b815183511461168b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168290613958565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156116fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f2906139ea565b60405180910390fd5b600061170561163f565b9050611715818787878787611f9a565b60005b84518110156118c65760008582815181106117365761173561350d565b5b6020026020010151905060008583815181106117555761175461350d565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156117f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ed90613a7c565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118ab9190613867565b92505081905550505050806118bf9061353c565b9050611718565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161193d929190613a9c565b60405180910390a4611953818787878787611fa2565b611961818787878787612182565b505050505050565b61197161163f565b73ffffffffffffffffffffffffffffffffffffffff1661198f610f22565b73ffffffffffffffffffffffffffffffffffffffff16146119e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119dc90613b1f565b60405180910390fd5b565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611b1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1390613bb1565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c0d919061252f565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611c8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c81906139ea565b60405180910390fd5b6000611c9461163f565b90506000611ca185611f20565b90506000611cae85611f20565b9050611cbe838989858589611f9a565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905085811015611d55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4c90613a7c565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e0a9190613867565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a604051611e879291906138bd565b60405180910390a4611e9d848a8a86868a611fa2565b611eab848a8a8a8a8a611faa565b505050505050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60606000600167ffffffffffffffff811115611f3f57611f3e61271d565b5b604051908082528060200260200182016040528015611f6d5781602001602082028036833780820191505090505b5090508281600081518110611f8557611f8461350d565b5b60200260200101818152505080915050919050565b505050505050565b505050505050565b611fc98473ffffffffffffffffffffffffffffffffffffffff1661235a565b1561217a578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b815260040161200f959493929190613c26565b6020604051808303816000875af192505050801561204b57506040513d601f19601f820116820180604052508101906120489190613c95565b60015b6120f157612057613ccf565b806308c379a014156120b4575061206c613cf1565b8061207757506120b6565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ab91906125e3565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e890613df9565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216f90613e8b565b60405180910390fd5b505b505050505050565b6121a18473ffffffffffffffffffffffffffffffffffffffff1661235a565b15612352578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b81526004016121e7959493929190613eab565b6020604051808303816000875af192505050801561222357506040513d601f19601f820116820180604052508101906122209190613c95565b60015b6122c95761222f613ccf565b806308c379a0141561228c5750612244613cf1565b8061224f575061228e565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228391906125e3565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c090613df9565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612350576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234790613e8b565b60405180910390fd5b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123bc82612391565b9050919050565b6123cc816123b1565b81146123d757600080fd5b50565b6000813590506123e9816123c3565b92915050565b6000819050919050565b612402816123ef565b811461240d57600080fd5b50565b60008135905061241f816123f9565b92915050565b6000806040838503121561243c5761243b612387565b5b600061244a858286016123da565b925050602061245b85828601612410565b9150509250929050565b61246e816123ef565b82525050565b60006020820190506124896000830184612465565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6124c48161248f565b81146124cf57600080fd5b50565b6000813590506124e1816124bb565b92915050565b6000602082840312156124fd576124fc612387565b5b600061250b848285016124d2565b91505092915050565b60008115159050919050565b61252981612514565b82525050565b60006020820190506125446000830184612520565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612584578082015181840152602081019050612569565b83811115612593576000848401525b50505050565b6000601f19601f8301169050919050565b60006125b58261254a565b6125bf8185612555565b93506125cf818560208601612566565b6125d881612599565b840191505092915050565b600060208201905081810360008301526125fd81846125aa565b905092915050565b60006020828403121561261b5761261a612387565b5b600061262984828501612410565b91505092915050565b60008060006060848603121561264b5761264a612387565b5b6000612659868287016123da565b935050602061266a86828701612410565b925050604061267b86828701612410565b9150509250925092565b61268e816123b1565b82525050565b60006020820190506126a96000830184612685565b92915050565b600080604083850312156126c6576126c5612387565b5b60006126d485828601612410565b92505060206126e585828601612410565b9150509250929050565b60006040820190506127046000830185612685565b6127116020830184612465565b9392505050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61275582612599565b810181811067ffffffffffffffff821117156127745761277361271d565b5b80604052505050565b600061278761237d565b9050612793828261274c565b919050565b600067ffffffffffffffff8211156127b3576127b261271d565b5b602082029050602081019050919050565b600080fd5b60006127dc6127d784612798565b61277d565b905080838252602082019050602084028301858111156127ff576127fe6127c4565b5b835b8181101561282857806128148882612410565b845260208401935050602081019050612801565b5050509392505050565b600082601f83011261284757612846612718565b5b81356128578482602086016127c9565b91505092915050565b600080fd5b600067ffffffffffffffff8211156128805761287f61271d565b5b61288982612599565b9050602081019050919050565b82818337600083830152505050565b60006128b86128b384612865565b61277d565b9050828152602081018484840111156128d4576128d3612860565b5b6128df848285612896565b509392505050565b600082601f8301126128fc576128fb612718565b5b813561290c8482602086016128a5565b91505092915050565b600080600080600060a0868803121561293157612930612387565b5b600061293f888289016123da565b9550506020612950888289016123da565b945050604086013567ffffffffffffffff8111156129715761297061238c565b5b61297d88828901612832565b935050606086013567ffffffffffffffff81111561299e5761299d61238c565b5b6129aa88828901612832565b925050608086013567ffffffffffffffff8111156129cb576129ca61238c565b5b6129d7888289016128e7565b9150509295509295909350565b600061ffff82169050919050565b6129fb816129e4565b82525050565b6000602082019050612a1660008301846129f2565b92915050565b612a25816129e4565b8114612a3057600080fd5b50565b600081359050612a4281612a1c565b92915050565b600080600060608486031215612a6157612a60612387565b5b6000612a6f86828701612410565b9350506020612a80868287016123da565b9250506040612a9186828701612a33565b9150509250925092565b600067ffffffffffffffff821115612ab657612ab561271d565b5b602082029050602081019050919050565b6000612ada612ad584612a9b565b61277d565b90508083825260208201905060208402830185811115612afd57612afc6127c4565b5b835b81811015612b265780612b1288826123da565b845260208401935050602081019050612aff565b5050509392505050565b600082601f830112612b4557612b44612718565b5b8135612b55848260208601612ac7565b91505092915050565b60008060408385031215612b7557612b74612387565b5b600083013567ffffffffffffffff811115612b9357612b9261238c565b5b612b9f85828601612b30565b925050602083013567ffffffffffffffff811115612bc057612bbf61238c565b5b612bcc85828601612832565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612c0b816123ef565b82525050565b6000612c1d8383612c02565b60208301905092915050565b6000602082019050919050565b6000612c4182612bd6565b612c4b8185612be1565b9350612c5683612bf2565b8060005b83811015612c87578151612c6e8882612c11565b9750612c7983612c29565b925050600181019050612c5a565b5085935050505092915050565b60006020820190508181036000830152612cae8184612c36565b905092915050565b600080fd5b60008083601f840112612cd157612cd0612718565b5b8235905067ffffffffffffffff811115612cee57612ced612cb6565b5b602083019150836001820283011115612d0a57612d096127c4565b5b9250929050565b600080600080600060608688031215612d2d57612d2c612387565b5b6000612d3b88828901612410565b955050602086013567ffffffffffffffff811115612d5c57612d5b61238c565b5b612d6888828901612cbb565b9450945050604086013567ffffffffffffffff811115612d8b57612d8a61238c565b5b612d9788828901612cbb565b92509250509295509295909350565b60008060408385031215612dbd57612dbc612387565b5b6000612dcb85828601612410565b9250506020612ddc858286016123da565b9150509250929050565b60008083601f840112612dfc57612dfb612718565b5b8235905067ffffffffffffffff811115612e1957612e18612cb6565b5b602083019150836020820283011115612e3557612e346127c4565b5b9250929050565b60008083601f840112612e5257612e51612718565b5b8235905067ffffffffffffffff811115612e6f57612e6e612cb6565b5b602083019150836020820283011115612e8b57612e8a6127c4565b5b9250929050565b600080600080600060608688031215612eae57612ead612387565b5b600086013567ffffffffffffffff811115612ecc57612ecb61238c565b5b612ed888828901612de6565b95509550506020612eeb88828901612410565b935050604086013567ffffffffffffffff811115612f0c57612f0b61238c565b5b612f1888828901612e3c565b92509250509295509295909350565b612f3081612514565b8114612f3b57600080fd5b50565b600081359050612f4d81612f27565b92915050565b60008060408385031215612f6a57612f69612387565b5b6000612f78858286016123da565b9250506020612f8985828601612f3e565b9150509250929050565b60008060008060408587031215612fad57612fac612387565b5b600085013567ffffffffffffffff811115612fcb57612fca61238c565b5b612fd787828801612cbb565b9450945050602085013567ffffffffffffffff811115612ffa57612ff961238c565b5b61300687828801612cbb565b925092505092959194509250565b60006020828403121561302a57613029612387565b5b6000613038848285016123da565b91505092915050565b6000806040838503121561305857613057612387565b5b6000613066858286016123da565b9250506020613077858286016123da565b9150509250929050565b600080600080600060a0868803121561309d5761309c612387565b5b60006130ab888289016123da565b95505060206130bc888289016123da565b94505060406130cd88828901612410565b93505060606130de88828901612410565b925050608086013567ffffffffffffffff8111156130ff576130fe61238c565b5b61310b888289016128e7565b9150509295509295909350565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b6000613174602a83612555565b915061317f82613118565b604082019050919050565b600060208201905081810360008301526131a381613167565b9050919050565b600067ffffffffffffffff8211156131c5576131c461271d565b5b6131ce82612599565b9050602081019050919050565b60006131ee6131e9846131aa565b61277d565b90508281526020810184848401111561320a57613209612860565b5b613215848285612566565b509392505050565b600082601f83011261323257613231612718565b5b81516132428482602086016131db565b91505092915050565b60006020828403121561326157613260612387565b5b600082015167ffffffffffffffff81111561327f5761327e61238c565b5b61328b8482850161321d565b91505092915050565b7f43616c6c6572206973206e6f7420746865206d696e7465720000000000000000600082015250565b60006132ca601883612555565b91506132d582613294565b602082019050919050565b600060208201905081810360008301526132f9816132bd565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061333a826123ef565b9150613345836123ef565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561337e5761337d613300565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006133c3826123ef565b91506133ce836123ef565b9250826133de576133dd613389565b5b828204905092915050565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206e6f7220617070726f7665640000000000000000000000000000000000602082015250565b6000613445602f83612555565b9150613450826133e9565b604082019050919050565b6000602082019050818103600083015261347481613438565b9050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b60006134d7602983612555565b91506134e28261347b565b604082019050919050565b60006020820190508181036000830152613506816134ca565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000613547826123ef565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561357a57613579613300565b5b600182019050919050565b7f4f6e6c792070726f6a656374206f7220746f6b656e206f776e65722063616e2060008201527f656d697420746f6b656e206576656e7400000000000000000000000000000000602082015250565b60006135e1603083612555565b91506135ec82613585565b604082019050919050565b60006020820190508181036000830152613610816135d4565b9050919050565b600081905092915050565b600061362e8385613617565b935061363b838584612896565b82840190509392505050565b6000613654828486613622565b91508190509392505050565b600061366c8385612555565b9350613679838584612896565b61368283612599565b840190509392505050565b600060208201905081810360008301526136a8818486613660565b90509392505050565b7f4c656e677468206f6620726563697069656e7420616e6420616d6f756e74206160008201527f7272617973206d69736d61746368656400000000000000000000000000000000602082015250565b600061370d603083612555565b9150613718826136b1565b604082019050919050565b6000602082019050818103600083015261373c81613700565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061379f602683612555565b91506137aa82613743565b604082019050919050565b600060208201905081810360008301526137ce81613792565b9050919050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613831602183612555565b915061383c826137d5565b604082019050919050565b6000602082019050818103600083015261386081613824565b9050919050565b6000613872826123ef565b915061387d836123ef565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156138b2576138b1613300565b5b828201905092915050565b60006040820190506138d26000830185612465565b6138df6020830184612465565b9392505050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b6000613942602883612555565b915061394d826138e6565b604082019050919050565b6000602082019050818103600083015261397181613935565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006139d4602583612555565b91506139df82613978565b604082019050919050565b60006020820190508181036000830152613a03816139c7565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000613a66602a83612555565b9150613a7182613a0a565b604082019050919050565b60006020820190508181036000830152613a9581613a59565b9050919050565b60006040820190508181036000830152613ab68185612c36565b90508181036020830152613aca8184612c36565b90509392505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613b09602083612555565b9150613b1482613ad3565b602082019050919050565b60006020820190508181036000830152613b3881613afc565b9050919050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b6000613b9b602983612555565b9150613ba682613b3f565b604082019050919050565b60006020820190508181036000830152613bca81613b8e565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613bf882613bd1565b613c028185613bdc565b9350613c12818560208601612566565b613c1b81612599565b840191505092915050565b600060a082019050613c3b6000830188612685565b613c486020830187612685565b613c556040830186612465565b613c626060830185612465565b8181036080830152613c748184613bed565b90509695505050505050565b600081519050613c8f816124bb565b92915050565b600060208284031215613cab57613caa612387565b5b6000613cb984828501613c80565b91505092915050565b60008160e01c9050919050565b600060033d1115613cee5760046000803e613ceb600051613cc2565b90505b90565b600060443d1015613d0157613d84565b613d0961237d565b60043d036004823e80513d602482011167ffffffffffffffff82111715613d31575050613d84565b808201805167ffffffffffffffff811115613d4f5750505050613d84565b80602083010160043d038501811115613d6c575050505050613d84565b613d7b8260200185018661274c565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b6000613de3603483612555565b9150613dee82613d87565b604082019050919050565b60006020820190508181036000830152613e1281613dd6565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b6000613e75602883612555565b9150613e8082613e19565b604082019050919050565b60006020820190508181036000830152613ea481613e68565b9050919050565b600060a082019050613ec06000830188612685565b613ecd6020830187612685565b8181036040830152613edf8186612c36565b90508181036060830152613ef38185612c36565b90508181036080830152613f078184613bed565b9050969550505050505056fea26469706673582212205854a206491868eec6d979fb470be1886e12c5af87e40a870971964b085217ba64736f6c634300080b0033

Deployed Bytecode Sourcemap

814:3102:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18398:227:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3661:253:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1092:40;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2445:245;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1582:114;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1025:62;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;856:50;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3452:205;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;20278:427:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;969:52:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3191:257;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;910:55;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18782:508:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2695:313:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2072:113;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2189:148;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34240:101:0;;;:::i;:::-;;33610:85;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1700:368:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1136:38;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19358:153:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3012:157:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2341:100;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1178:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19578:166:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19811:395;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34490:198;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18398:227;18484:7;18530:1;18511:21;;:7;:21;;;;18503:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;18596:9;:13;18606:2;18596:13;;;;;;;;;;;:22;18610:7;18596:22;;;;;;;;;;;;;;;;18589:29;;18398:227;;;;:::o;3661:253:1:-;3755:4;3821:10;3814:18;;3799:33;;;:11;:33;;;;:70;;;;3858:10;3851:18;;3836:33;;;:11;:33;;;;3799:70;:110;;;;3873:36;3897:11;3873:23;:36::i;:::-;3799:110;3792:117;;3661:253;;;:::o;1092:40::-;;;;;;;;;;;;;;;;;;;:::o;2445:245::-;2493:13;2554:1;2518:38;;:20;:24;2539:2;2518:24;;;;;;;;;;;;;;;;;;;;;:38;;;2514:172;;;2582:18;;;;;;;;;;;2573:32;;;2606:2;2573:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2566:43;;;;2514:172;2646:20;:24;2667:2;2646:24;;;;;;;;;;;;;;;;;;;;;2637:38;;;2676:2;2637:42;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2630:49;;2445:245;;;;:::o;1582:114::-;1656:2;1518:15;:19;1534:2;1518:19;;;;;;;;;;;;;;;;;;;;;1504:33;;:10;:33;;;1496:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;1666:25:::1;1672:2;1676;1680:6;1666:25;;;;;;;;;;;::::0;:5:::1;:25::i;:::-;1582:114:::0;;;;:::o;1025:62::-;;;;;;;;;;;;;;;;;;;;;;:::o;856:50::-;;;;;;;;;;;;;;;;;;;;;;:::o;3452:205::-;3533:7;3542;3565:27;:36;3593:7;3565:36;;;;;;;;;;;;;;;;;;;;;3646:5;3616:18;:27;3635:7;3616:27;;;;;;;;;;;;;;;;;;;;;3603:40;;:10;:40;;;;:::i;:::-;:48;;;;:::i;:::-;3557:95;;;;3452:205;;;;;:::o;20278:427:0:-;20511:12;:10;:12::i;:::-;20503:20;;:4;:20;;;:60;;;;20527:36;20544:4;20550:12;:10;:12::i;:::-;20527:16;:36::i;:::-;20503:60;20482:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;20646:52;20669:4;20675:2;20679:3;20684:7;20693:4;20646:22;:52::i;:::-;20278:427;;;;;:::o;969:52:1:-;;;;;;;;;;;;;;;;;;;;;;:::o;3191:257::-;33503:13:0;:11;:13::i;:::-;3360:19:1::1;3330:18;:27;3349:7;3330:27;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;3424:19;3385:27;:36;3413:7;3385:36;;;;;;;;;;;;:58;;;;;;;;;;;;;;;;;;3191:257:::0;;;:::o;910:55::-;;;;;;;;;;;;;;;;;;;;;;:::o;18782:508:0:-;18933:16;18992:3;:10;18973:8;:15;:29;18965:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;19059:30;19106:8;:15;19092:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19059:63;;19138:9;19133:120;19157:8;:15;19153:1;:19;19133:120;;;19212:30;19222:8;19231:1;19222:11;;;;;;;;:::i;:::-;;;;;;;;19235:3;19239:1;19235:6;;;;;;;;:::i;:::-;;;;;;;;19212:9;:30::i;:::-;19193:13;19207:1;19193:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;19174:3;;;;:::i;:::-;;;19133:120;;;;19270:13;19263:20;;;18782:508;;;;:::o;2695:313:1:-;2829:10;2818:21;;:7;:5;:7::i;:::-;:21;;;:59;;;;2876:1;2843:30;2853:10;2865:7;2843:9;:30::i;:::-;:34;2818:59;2803:138;;;;;;;;;;;;:::i;:::-;;;;;;;;;2984:9;;2952:51;;;;;;;:::i;:::-;;;;;;;;2975:7;2963:10;2952:51;;;2995:7;;2952:51;;;;;;;:::i;:::-;;;;;;;;2695:313;;;;;:::o;2072:113::-;33503:13:0;:11;:13::i;:::-;2174:6:1::1;2152:15;:19;2168:2;2152:19;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;2072:113:::0;;:::o;2189:148::-;33503:13:0;:11;:13::i;:::-;2299:4:1::1;2272:20;:24;2293:2;2272:24;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;2314:18;2329:2;2314:18;;;;;;:::i;:::-;;;;;;;;2189:148:::0;;:::o;34240:101:0:-;33503:13;:11;:13::i;:::-;34304:30:::1;34331:1;34304:18;:30::i;:::-;34240:101::o:0;33610:85::-;33656:7;33682:6;;;;;;;;;;;33675:13;;33610:85;:::o;1700:368:1:-;1810:2;1518:15;:19;1534:2;1518:19;;;;;;;;;;;;;;;;;;;;;1504:33;;:10;:33;;;1496:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;1820:22:::1;1845:10;;:17;;1820:42;;1894:7;;:14;;1876;:32;1868:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;1973:9;1968:96;1988:14;1984:1;:18;1968:96;;;2017:40;2023:10;;2034:1;2023:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;2038:2;2042:7;;2050:1;2042:10;;;;;;;:::i;:::-;;;;;;;;2017:40;;;;;;;;;;;::::0;:5:::1;:40::i;:::-;2004:3;;;;:::i;:::-;;;1968:96;;;;1814:254;1700:368:::0;;;;;;:::o;1136:38::-;;;;;;;;;;;;;;;;;;;:::o;19358:153:0:-;19452:52;19471:12;:10;:12::i;:::-;19485:8;19495;19452:18;:52::i;:::-;19358:153;;:::o;3012:157:1:-;33503:13:0;:11;:13::i;:::-;3145:9:1::1;;3120:44;;;;;;;:::i;:::-;;;;;;;;3133:10;3120:44;;;3156:7;;3120:44;;;;;;;:::i;:::-;;;;;;;;3012:157:::0;;;;:::o;2341:100::-;33503:13:0;:11;:13::i;:::-;2432:4:1::1;2411:18;;:25;;;;;;;;;;;;;;;;;;2341:100:::0;:::o;1178:33::-;;;;;;;;;;;;;:::o;19578:166:0:-;19677:4;19700:18;:27;19719:7;19700:27;;;;;;;;;;;;;;;:37;19728:8;19700:37;;;;;;;;;;;;;;;;;;;;;;;;;19693:44;;19578:166;;;;:::o;19811:395::-;20019:12;:10;:12::i;:::-;20011:20;;:4;:20;;;:60;;;;20035:36;20052:4;20058:12;:10;:12::i;:::-;20035:16;:36::i;:::-;20011:60;19990:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;20154:45;20172:4;20178:2;20182;20186:6;20194:4;20154:17;:45::i;:::-;19811:395;;;;;:::o;34490:198::-;33503:13;:11;:13::i;:::-;34598:1:::1;34578:22;;:8;:22;;;;34570:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34653:28;34672:8;34653:18;:28::i;:::-;34490:198:::0;:::o;17951:305::-;18053:4;18103:26;18088:41;;;:11;:41;;;;:109;;;;18160:37;18145:52;;;:11;:52;;;;18088:109;:161;;;;18213:36;18237:11;18213:23;:36::i;:::-;18088:161;18069:180;;17951:305;;;:::o;23936:709::-;24097:1;24083:16;;:2;:16;;;;24075:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;24148:16;24167:12;:10;:12::i;:::-;24148:31;;24189:20;24212:21;24230:2;24212:17;:21::i;:::-;24189:44;;24243:24;24270:25;24288:6;24270:17;:25::i;:::-;24243:52;;24306:66;24327:8;24345:1;24349:2;24353:3;24358:7;24367:4;24306:20;:66::i;:::-;24404:6;24383:9;:13;24393:2;24383:13;;;;;;;;;;;:17;24397:2;24383:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;24462:2;24425:52;;24458:1;24425:52;;24440:8;24425:52;;;24466:2;24470:6;24425:52;;;;;;;:::i;:::-;;;;;;;;24488:65;24508:8;24526:1;24530:2;24534:3;24539:7;24548:4;24488:19;:65::i;:::-;24564:74;24595:8;24613:1;24617:2;24621;24625:6;24633:4;24564:30;:74::i;:::-;24065:580;;;23936:709;;;;:::o;588:96::-;641:7;667:10;660:17;;588:96;:::o;22448:1115::-;22668:7;:14;22654:3;:10;:28;22646:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;22759:1;22745:16;;:2;:16;;;;22737:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;22814:16;22833:12;:10;:12::i;:::-;22814:31;;22856:60;22877:8;22887:4;22893:2;22897:3;22902:7;22911:4;22856:20;:60::i;:::-;22932:9;22927:411;22951:3;:10;22947:1;:14;22927:411;;;22982:10;22995:3;22999:1;22995:6;;;;;;;;:::i;:::-;;;;;;;;22982:19;;23015:14;23032:7;23040:1;23032:10;;;;;;;;:::i;:::-;;;;;;;;23015:27;;23057:19;23079:9;:13;23089:2;23079:13;;;;;;;;;;;:19;23093:4;23079:19;;;;;;;;;;;;;;;;23057:41;;23135:6;23120:11;:21;;23112:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;23266:6;23252:11;:20;23230:9;:13;23240:2;23230:13;;;;;;;;;;;:19;23244:4;23230:19;;;;;;;;;;;;;;;:42;;;;23321:6;23300:9;:13;23310:2;23300:13;;;;;;;;;;;:17;23314:2;23300:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;22968:370;;;22963:3;;;;:::i;:::-;;;22927:411;;;;23383:2;23353:47;;23377:4;23353:47;;23367:8;23353:47;;;23387:3;23392:7;23353:47;;;;;;;:::i;:::-;;;;;;;;23411:59;23431:8;23441:4;23447:2;23451:3;23456:7;23465:4;23411:19;:59::i;:::-;23481:75;23517:8;23527:4;23533:2;23537:3;23542:7;23551:4;23481:35;:75::i;:::-;22636:927;22448:1115;;;;;:::o;33768:130::-;33842:12;:10;:12::i;:::-;33831:23;;:7;:5;:7::i;:::-;:23;;;33823:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33768:130::o;34842:187::-;34915:16;34934:6;;;;;;;;;;;34915:25;;34959:8;34950:6;;:17;;;;;;;;;;;;;;;;;;35013:8;34982:40;;35003:8;34982:40;;;;;;;;;;;;34905:124;34842:187;:::o;28216:323::-;28366:8;28357:17;;:5;:17;;;;28349:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;28468:8;28430:18;:25;28449:5;28430:25;;;;;;;;;;;;;;;:35;28456:8;28430:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;28513:8;28491:41;;28506:5;28491:41;;;28523:8;28491:41;;;;;;:::i;:::-;;;;;;;;28216:323;;;:::o;21155:947::-;21350:1;21336:16;;:2;:16;;;;21328:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;21405:16;21424:12;:10;:12::i;:::-;21405:31;;21446:20;21469:21;21487:2;21469:17;:21::i;:::-;21446:44;;21500:24;21527:25;21545:6;21527:17;:25::i;:::-;21500:52;;21563:60;21584:8;21594:4;21600:2;21604:3;21609:7;21618:4;21563:20;:60::i;:::-;21634:19;21656:9;:13;21666:2;21656:13;;;;;;;;;;;:19;21670:4;21656:19;;;;;;;;;;;;;;;;21634:41;;21708:6;21693:11;:21;;21685:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;21831:6;21817:11;:20;21795:9;:13;21805:2;21795:13;;;;;;;;;;;:19;21809:4;21795:19;;;;;;;;;;;;;;;:42;;;;21878:6;21857:9;:13;21867:2;21857:13;;;;;;;;;;;:17;21871:2;21857:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;21931:2;21900:46;;21925:4;21900:46;;21915:8;21900:46;;;21935:2;21939:6;21900:46;;;;;;;:::i;:::-;;;;;;;;21957:59;21977:8;21987:4;21993:2;21997:3;22002:7;22011:4;21957:19;:59::i;:::-;22027:68;22058:8;22068:4;22074:2;22078;22082:6;22090:4;22027:30;:68::i;:::-;21318:784;;;;21155:947;;;;;:::o;10382:155::-;10467:4;10505:25;10490:40;;;:11;:40;;;;10483:47;;10382:155;;;:::o;32370:193::-;32436:16;32464:22;32503:1;32489:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32464:41;;32526:7;32515:5;32521:1;32515:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;32551:5;32544:12;;;32370:193;;;:::o;29475:214::-;;;;;;;:::o;30622:213::-;;;;;;;:::o;30841:725::-;31048:15;:2;:13;;;:15::i;:::-;31044:516;;;31100:2;31083:38;;;31122:8;31132:4;31138:2;31142:6;31150:4;31083:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31079:471;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;31426:6;31419:14;;;;;;;;;;;:::i;:::-;;;;;;;;31079:471;;;31473:62;;;;;;;;;;:::i;:::-;;;;;;;;31079:471;31216:43;;;31204:55;;;:8;:55;;;;31200:152;;31283:50;;;;;;;;;;:::i;:::-;;;;;;;;31200:152;31156:210;31044:516;30841:725;;;;;;:::o;31572:792::-;31804:15;:2;:13;;;:15::i;:::-;31800:558;;;31856:2;31839:43;;;31883:8;31893:4;31899:3;31904:7;31913:4;31839:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31835:513;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;32224:6;32217:14;;;;;;;;;;;:::i;:::-;;;;;;;;31835:513;;;32271:62;;;;;;;;;;:::i;:::-;;;;;;;;31835:513;32009:48;;;31997:60;;;:8;:60;;;;31993:157;;32081:50;;;;;;;;;;:::i;:::-;;;;;;;;31993:157;31919:245;31800:558;31572:792;;;;;;:::o;1842:320::-;1902:4;2154:1;2132:7;:19;;;:23;2125:30;;1842:320;;;:::o;7:75:2:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:77::-;878:7;907:5;896:16;;841:77;;;:::o;924:122::-;997:24;1015:5;997:24;:::i;:::-;990:5;987:35;977:63;;1036:1;1033;1026:12;977:63;924:122;:::o;1052:139::-;1098:5;1136:6;1123:20;1114:29;;1152:33;1179:5;1152:33;:::i;:::-;1052:139;;;;:::o;1197:474::-;1265:6;1273;1322:2;1310:9;1301:7;1297:23;1293:32;1290:119;;;1328:79;;:::i;:::-;1290:119;1448:1;1473:53;1518:7;1509:6;1498:9;1494:22;1473:53;:::i;:::-;1463:63;;1419:117;1575:2;1601:53;1646:7;1637:6;1626:9;1622:22;1601:53;:::i;:::-;1591:63;;1546:118;1197:474;;;;;:::o;1677:118::-;1764:24;1782:5;1764:24;:::i;:::-;1759:3;1752:37;1677:118;;:::o;1801:222::-;1894:4;1932:2;1921:9;1917:18;1909:26;;1945:71;2013:1;2002:9;1998:17;1989:6;1945:71;:::i;:::-;1801:222;;;;:::o;2029:149::-;2065:7;2105:66;2098:5;2094:78;2083:89;;2029:149;;;:::o;2184:120::-;2256:23;2273:5;2256:23;:::i;:::-;2249:5;2246:34;2236:62;;2294:1;2291;2284:12;2236:62;2184:120;:::o;2310:137::-;2355:5;2393:6;2380:20;2371:29;;2409:32;2435:5;2409:32;:::i;:::-;2310:137;;;;:::o;2453:327::-;2511:6;2560:2;2548:9;2539:7;2535:23;2531:32;2528:119;;;2566:79;;:::i;:::-;2528:119;2686:1;2711:52;2755:7;2746:6;2735:9;2731:22;2711:52;:::i;:::-;2701:62;;2657:116;2453:327;;;;:::o;2786:90::-;2820:7;2863:5;2856:13;2849:21;2838:32;;2786:90;;;:::o;2882:109::-;2963:21;2978:5;2963:21;:::i;:::-;2958:3;2951:34;2882:109;;:::o;2997:210::-;3084:4;3122:2;3111:9;3107:18;3099:26;;3135:65;3197:1;3186:9;3182:17;3173:6;3135:65;:::i;:::-;2997:210;;;;:::o;3213:99::-;3265:6;3299:5;3293:12;3283:22;;3213:99;;;:::o;3318:169::-;3402:11;3436:6;3431:3;3424:19;3476:4;3471:3;3467:14;3452:29;;3318:169;;;;:::o;3493:307::-;3561:1;3571:113;3585:6;3582:1;3579:13;3571:113;;;3670:1;3665:3;3661:11;3655:18;3651:1;3646:3;3642:11;3635:39;3607:2;3604:1;3600:10;3595:15;;3571:113;;;3702:6;3699:1;3696:13;3693:101;;;3782:1;3773:6;3768:3;3764:16;3757:27;3693:101;3542:258;3493:307;;;:::o;3806:102::-;3847:6;3898:2;3894:7;3889:2;3882:5;3878:14;3874:28;3864:38;;3806:102;;;:::o;3914:364::-;4002:3;4030:39;4063:5;4030:39;:::i;:::-;4085:71;4149:6;4144:3;4085:71;:::i;:::-;4078:78;;4165:52;4210:6;4205:3;4198:4;4191:5;4187:16;4165:52;:::i;:::-;4242:29;4264:6;4242:29;:::i;:::-;4237:3;4233:39;4226:46;;4006:272;3914:364;;;;:::o;4284:313::-;4397:4;4435:2;4424:9;4420:18;4412:26;;4484:9;4478:4;4474:20;4470:1;4459:9;4455:17;4448:47;4512:78;4585:4;4576:6;4512:78;:::i;:::-;4504:86;;4284:313;;;;:::o;4603:329::-;4662:6;4711:2;4699:9;4690:7;4686:23;4682:32;4679:119;;;4717:79;;:::i;:::-;4679:119;4837:1;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4808:117;4603:329;;;;:::o;4938:619::-;5015:6;5023;5031;5080:2;5068:9;5059:7;5055:23;5051:32;5048:119;;;5086:79;;:::i;:::-;5048:119;5206:1;5231:53;5276:7;5267:6;5256:9;5252:22;5231:53;:::i;:::-;5221:63;;5177:117;5333:2;5359:53;5404:7;5395:6;5384:9;5380:22;5359:53;:::i;:::-;5349:63;;5304:118;5461:2;5487:53;5532:7;5523:6;5512:9;5508:22;5487:53;:::i;:::-;5477:63;;5432:118;4938:619;;;;;:::o;5563:118::-;5650:24;5668:5;5650:24;:::i;:::-;5645:3;5638:37;5563:118;;:::o;5687:222::-;5780:4;5818:2;5807:9;5803:18;5795:26;;5831:71;5899:1;5888:9;5884:17;5875:6;5831:71;:::i;:::-;5687:222;;;;:::o;5915:474::-;5983:6;5991;6040:2;6028:9;6019:7;6015:23;6011:32;6008:119;;;6046:79;;:::i;:::-;6008:119;6166:1;6191:53;6236:7;6227:6;6216:9;6212:22;6191:53;:::i;:::-;6181:63;;6137:117;6293:2;6319:53;6364:7;6355:6;6344:9;6340:22;6319:53;:::i;:::-;6309:63;;6264:118;5915:474;;;;;:::o;6395:332::-;6516:4;6554:2;6543:9;6539:18;6531:26;;6567:71;6635:1;6624:9;6620:17;6611:6;6567:71;:::i;:::-;6648:72;6716:2;6705:9;6701:18;6692:6;6648:72;:::i;:::-;6395:332;;;;;:::o;6733:117::-;6842:1;6839;6832:12;6856:180;6904:77;6901:1;6894:88;7001:4;6998:1;6991:15;7025:4;7022:1;7015:15;7042:281;7125:27;7147:4;7125:27;:::i;:::-;7117:6;7113:40;7255:6;7243:10;7240:22;7219:18;7207:10;7204:34;7201:62;7198:88;;;7266:18;;:::i;:::-;7198:88;7306:10;7302:2;7295:22;7085:238;7042:281;;:::o;7329:129::-;7363:6;7390:20;;:::i;:::-;7380:30;;7419:33;7447:4;7439:6;7419:33;:::i;:::-;7329:129;;;:::o;7464:311::-;7541:4;7631:18;7623:6;7620:30;7617:56;;;7653:18;;:::i;:::-;7617:56;7703:4;7695:6;7691:17;7683:25;;7763:4;7757;7753:15;7745:23;;7464:311;;;:::o;7781:117::-;7890:1;7887;7880:12;7921:710;8017:5;8042:81;8058:64;8115:6;8058:64;:::i;:::-;8042:81;:::i;:::-;8033:90;;8143:5;8172:6;8165:5;8158:21;8206:4;8199:5;8195:16;8188:23;;8259:4;8251:6;8247:17;8239:6;8235:30;8288:3;8280:6;8277:15;8274:122;;;8307:79;;:::i;:::-;8274:122;8422:6;8405:220;8439:6;8434:3;8431:15;8405:220;;;8514:3;8543:37;8576:3;8564:10;8543:37;:::i;:::-;8538:3;8531:50;8610:4;8605:3;8601:14;8594:21;;8481:144;8465:4;8460:3;8456:14;8449:21;;8405:220;;;8409:21;8023:608;;7921:710;;;;;:::o;8654:370::-;8725:5;8774:3;8767:4;8759:6;8755:17;8751:27;8741:122;;8782:79;;:::i;:::-;8741:122;8899:6;8886:20;8924:94;9014:3;9006:6;8999:4;8991:6;8987:17;8924:94;:::i;:::-;8915:103;;8731:293;8654:370;;;;:::o;9030:117::-;9139:1;9136;9129:12;9153:307;9214:4;9304:18;9296:6;9293:30;9290:56;;;9326:18;;:::i;:::-;9290:56;9364:29;9386:6;9364:29;:::i;:::-;9356:37;;9448:4;9442;9438:15;9430:23;;9153:307;;;:::o;9466:154::-;9550:6;9545:3;9540;9527:30;9612:1;9603:6;9598:3;9594:16;9587:27;9466:154;;;:::o;9626:410::-;9703:5;9728:65;9744:48;9785:6;9744:48;:::i;:::-;9728:65;:::i;:::-;9719:74;;9816:6;9809:5;9802:21;9854:4;9847:5;9843:16;9892:3;9883:6;9878:3;9874:16;9871:25;9868:112;;;9899:79;;:::i;:::-;9868:112;9989:41;10023:6;10018:3;10013;9989:41;:::i;:::-;9709:327;9626:410;;;;;:::o;10055:338::-;10110:5;10159:3;10152:4;10144:6;10140:17;10136:27;10126:122;;10167:79;;:::i;:::-;10126:122;10284:6;10271:20;10309:78;10383:3;10375:6;10368:4;10360:6;10356:17;10309:78;:::i;:::-;10300:87;;10116:277;10055:338;;;;:::o;10399:1509::-;10553:6;10561;10569;10577;10585;10634:3;10622:9;10613:7;10609:23;10605:33;10602:120;;;10641:79;;:::i;:::-;10602:120;10761:1;10786:53;10831:7;10822:6;10811:9;10807:22;10786:53;:::i;:::-;10776:63;;10732:117;10888:2;10914:53;10959:7;10950:6;10939:9;10935:22;10914:53;:::i;:::-;10904:63;;10859:118;11044:2;11033:9;11029:18;11016:32;11075:18;11067:6;11064:30;11061:117;;;11097:79;;:::i;:::-;11061:117;11202:78;11272:7;11263:6;11252:9;11248:22;11202:78;:::i;:::-;11192:88;;10987:303;11357:2;11346:9;11342:18;11329:32;11388:18;11380:6;11377:30;11374:117;;;11410:79;;:::i;:::-;11374:117;11515:78;11585:7;11576:6;11565:9;11561:22;11515:78;:::i;:::-;11505:88;;11300:303;11670:3;11659:9;11655:19;11642:33;11702:18;11694:6;11691:30;11688:117;;;11724:79;;:::i;:::-;11688:117;11829:62;11883:7;11874:6;11863:9;11859:22;11829:62;:::i;:::-;11819:72;;11613:288;10399:1509;;;;;;;;:::o;11914:89::-;11950:7;11990:6;11983:5;11979:18;11968:29;;11914:89;;;:::o;12009:115::-;12094:23;12111:5;12094:23;:::i;:::-;12089:3;12082:36;12009:115;;:::o;12130:218::-;12221:4;12259:2;12248:9;12244:18;12236:26;;12272:69;12338:1;12327:9;12323:17;12314:6;12272:69;:::i;:::-;12130:218;;;;:::o;12354:120::-;12426:23;12443:5;12426:23;:::i;:::-;12419:5;12416:34;12406:62;;12464:1;12461;12454:12;12406:62;12354:120;:::o;12480:137::-;12525:5;12563:6;12550:20;12541:29;;12579:32;12605:5;12579:32;:::i;:::-;12480:137;;;;:::o;12623:617::-;12699:6;12707;12715;12764:2;12752:9;12743:7;12739:23;12735:32;12732:119;;;12770:79;;:::i;:::-;12732:119;12890:1;12915:53;12960:7;12951:6;12940:9;12936:22;12915:53;:::i;:::-;12905:63;;12861:117;13017:2;13043:53;13088:7;13079:6;13068:9;13064:22;13043:53;:::i;:::-;13033:63;;12988:118;13145:2;13171:52;13215:7;13206:6;13195:9;13191:22;13171:52;:::i;:::-;13161:62;;13116:117;12623:617;;;;;:::o;13246:311::-;13323:4;13413:18;13405:6;13402:30;13399:56;;;13435:18;;:::i;:::-;13399:56;13485:4;13477:6;13473:17;13465:25;;13545:4;13539;13535:15;13527:23;;13246:311;;;:::o;13580:710::-;13676:5;13701:81;13717:64;13774:6;13717:64;:::i;:::-;13701:81;:::i;:::-;13692:90;;13802:5;13831:6;13824:5;13817:21;13865:4;13858:5;13854:16;13847:23;;13918:4;13910:6;13906:17;13898:6;13894:30;13947:3;13939:6;13936:15;13933:122;;;13966:79;;:::i;:::-;13933:122;14081:6;14064:220;14098:6;14093:3;14090:15;14064:220;;;14173:3;14202:37;14235:3;14223:10;14202:37;:::i;:::-;14197:3;14190:50;14269:4;14264:3;14260:14;14253:21;;14140:144;14124:4;14119:3;14115:14;14108:21;;14064:220;;;14068:21;13682:608;;13580:710;;;;;:::o;14313:370::-;14384:5;14433:3;14426:4;14418:6;14414:17;14410:27;14400:122;;14441:79;;:::i;:::-;14400:122;14558:6;14545:20;14583:94;14673:3;14665:6;14658:4;14650:6;14646:17;14583:94;:::i;:::-;14574:103;;14390:293;14313:370;;;;:::o;14689:894::-;14807:6;14815;14864:2;14852:9;14843:7;14839:23;14835:32;14832:119;;;14870:79;;:::i;:::-;14832:119;15018:1;15007:9;15003:17;14990:31;15048:18;15040:6;15037:30;15034:117;;;15070:79;;:::i;:::-;15034:117;15175:78;15245:7;15236:6;15225:9;15221:22;15175:78;:::i;:::-;15165:88;;14961:302;15330:2;15319:9;15315:18;15302:32;15361:18;15353:6;15350:30;15347:117;;;15383:79;;:::i;:::-;15347:117;15488:78;15558:7;15549:6;15538:9;15534:22;15488:78;:::i;:::-;15478:88;;15273:303;14689:894;;;;;:::o;15589:114::-;15656:6;15690:5;15684:12;15674:22;;15589:114;;;:::o;15709:184::-;15808:11;15842:6;15837:3;15830:19;15882:4;15877:3;15873:14;15858:29;;15709:184;;;;:::o;15899:132::-;15966:4;15989:3;15981:11;;16019:4;16014:3;16010:14;16002:22;;15899:132;;;:::o;16037:108::-;16114:24;16132:5;16114:24;:::i;:::-;16109:3;16102:37;16037:108;;:::o;16151:179::-;16220:10;16241:46;16283:3;16275:6;16241:46;:::i;:::-;16319:4;16314:3;16310:14;16296:28;;16151:179;;;;:::o;16336:113::-;16406:4;16438;16433:3;16429:14;16421:22;;16336:113;;;:::o;16485:732::-;16604:3;16633:54;16681:5;16633:54;:::i;:::-;16703:86;16782:6;16777:3;16703:86;:::i;:::-;16696:93;;16813:56;16863:5;16813:56;:::i;:::-;16892:7;16923:1;16908:284;16933:6;16930:1;16927:13;16908:284;;;17009:6;17003:13;17036:63;17095:3;17080:13;17036:63;:::i;:::-;17029:70;;17122:60;17175:6;17122:60;:::i;:::-;17112:70;;16968:224;16955:1;16952;16948:9;16943:14;;16908:284;;;16912:14;17208:3;17201:10;;16609:608;;;16485:732;;;;:::o;17223:373::-;17366:4;17404:2;17393:9;17389:18;17381:26;;17453:9;17447:4;17443:20;17439:1;17428:9;17424:17;17417:47;17481:108;17584:4;17575:6;17481:108;:::i;:::-;17473:116;;17223:373;;;;:::o;17602:117::-;17711:1;17708;17701:12;17739:553;17797:8;17807:6;17857:3;17850:4;17842:6;17838:17;17834:27;17824:122;;17865:79;;:::i;:::-;17824:122;17978:6;17965:20;17955:30;;18008:18;18000:6;17997:30;17994:117;;;18030:79;;:::i;:::-;17994:117;18144:4;18136:6;18132:17;18120:29;;18198:3;18190:4;18182:6;18178:17;18168:8;18164:32;18161:41;18158:128;;;18205:79;;:::i;:::-;18158:128;17739:553;;;;;:::o;18298:1019::-;18399:6;18407;18415;18423;18431;18480:2;18468:9;18459:7;18455:23;18451:32;18448:119;;;18486:79;;:::i;:::-;18448:119;18606:1;18631:53;18676:7;18667:6;18656:9;18652:22;18631:53;:::i;:::-;18621:63;;18577:117;18761:2;18750:9;18746:18;18733:32;18792:18;18784:6;18781:30;18778:117;;;18814:79;;:::i;:::-;18778:117;18927:65;18984:7;18975:6;18964:9;18960:22;18927:65;:::i;:::-;18909:83;;;;18704:298;19069:2;19058:9;19054:18;19041:32;19100:18;19092:6;19089:30;19086:117;;;19122:79;;:::i;:::-;19086:117;19235:65;19292:7;19283:6;19272:9;19268:22;19235:65;:::i;:::-;19217:83;;;;19012:298;18298:1019;;;;;;;;:::o;19323:474::-;19391:6;19399;19448:2;19436:9;19427:7;19423:23;19419:32;19416:119;;;19454:79;;:::i;:::-;19416:119;19574:1;19599:53;19644:7;19635:6;19624:9;19620:22;19599:53;:::i;:::-;19589:63;;19545:117;19701:2;19727:53;19772:7;19763:6;19752:9;19748:22;19727:53;:::i;:::-;19717:63;;19672:118;19323:474;;;;;:::o;19820:568::-;19893:8;19903:6;19953:3;19946:4;19938:6;19934:17;19930:27;19920:122;;19961:79;;:::i;:::-;19920:122;20074:6;20061:20;20051:30;;20104:18;20096:6;20093:30;20090:117;;;20126:79;;:::i;:::-;20090:117;20240:4;20232:6;20228:17;20216:29;;20294:3;20286:4;20278:6;20274:17;20264:8;20260:32;20257:41;20254:128;;;20301:79;;:::i;:::-;20254:128;19820:568;;;;;:::o;20411:::-;20484:8;20494:6;20544:3;20537:4;20529:6;20525:17;20521:27;20511:122;;20552:79;;:::i;:::-;20511:122;20665:6;20652:20;20642:30;;20695:18;20687:6;20684:30;20681:117;;;20717:79;;:::i;:::-;20681:117;20831:4;20823:6;20819:17;20807:29;;20885:3;20877:4;20869:6;20865:17;20855:8;20851:32;20848:41;20845:128;;;20892:79;;:::i;:::-;20845:128;20411:568;;;;;:::o;20985:1079::-;21116:6;21124;21132;21140;21148;21197:2;21185:9;21176:7;21172:23;21168:32;21165:119;;;21203:79;;:::i;:::-;21165:119;21351:1;21340:9;21336:17;21323:31;21381:18;21373:6;21370:30;21367:117;;;21403:79;;:::i;:::-;21367:117;21516:80;21588:7;21579:6;21568:9;21564:22;21516:80;:::i;:::-;21498:98;;;;21294:312;21645:2;21671:53;21716:7;21707:6;21696:9;21692:22;21671:53;:::i;:::-;21661:63;;21616:118;21801:2;21790:9;21786:18;21773:32;21832:18;21824:6;21821:30;21818:117;;;21854:79;;:::i;:::-;21818:117;21967:80;22039:7;22030:6;22019:9;22015:22;21967:80;:::i;:::-;21949:98;;;;21744:313;20985:1079;;;;;;;;:::o;22070:116::-;22140:21;22155:5;22140:21;:::i;:::-;22133:5;22130:32;22120:60;;22176:1;22173;22166:12;22120:60;22070:116;:::o;22192:133::-;22235:5;22273:6;22260:20;22251:29;;22289:30;22313:5;22289:30;:::i;:::-;22192:133;;;;:::o;22331:468::-;22396:6;22404;22453:2;22441:9;22432:7;22428:23;22424:32;22421:119;;;22459:79;;:::i;:::-;22421:119;22579:1;22604:53;22649:7;22640:6;22629:9;22625:22;22604:53;:::i;:::-;22594:63;;22550:117;22706:2;22732:50;22774:7;22765:6;22754:9;22750:22;22732:50;:::i;:::-;22722:60;;22677:115;22331:468;;;;;:::o;22805:874::-;22897:6;22905;22913;22921;22970:2;22958:9;22949:7;22945:23;22941:32;22938:119;;;22976:79;;:::i;:::-;22938:119;23124:1;23113:9;23109:17;23096:31;23154:18;23146:6;23143:30;23140:117;;;23176:79;;:::i;:::-;23140:117;23289:65;23346:7;23337:6;23326:9;23322:22;23289:65;:::i;:::-;23271:83;;;;23067:297;23431:2;23420:9;23416:18;23403:32;23462:18;23454:6;23451:30;23448:117;;;23484:79;;:::i;:::-;23448:117;23597:65;23654:7;23645:6;23634:9;23630:22;23597:65;:::i;:::-;23579:83;;;;23374:298;22805:874;;;;;;;:::o;23685:329::-;23744:6;23793:2;23781:9;23772:7;23768:23;23764:32;23761:119;;;23799:79;;:::i;:::-;23761:119;23919:1;23944:53;23989:7;23980:6;23969:9;23965:22;23944:53;:::i;:::-;23934:63;;23890:117;23685:329;;;;:::o;24020:474::-;24088:6;24096;24145:2;24133:9;24124:7;24120:23;24116:32;24113:119;;;24151:79;;:::i;:::-;24113:119;24271:1;24296:53;24341:7;24332:6;24321:9;24317:22;24296:53;:::i;:::-;24286:63;;24242:117;24398:2;24424:53;24469:7;24460:6;24449:9;24445:22;24424:53;:::i;:::-;24414:63;;24369:118;24020:474;;;;;:::o;24500:1089::-;24604:6;24612;24620;24628;24636;24685:3;24673:9;24664:7;24660:23;24656:33;24653:120;;;24692:79;;:::i;:::-;24653:120;24812:1;24837:53;24882:7;24873:6;24862:9;24858:22;24837:53;:::i;:::-;24827:63;;24783:117;24939:2;24965:53;25010:7;25001:6;24990:9;24986:22;24965:53;:::i;:::-;24955:63;;24910:118;25067:2;25093:53;25138:7;25129:6;25118:9;25114:22;25093:53;:::i;:::-;25083:63;;25038:118;25195:2;25221:53;25266:7;25257:6;25246:9;25242:22;25221:53;:::i;:::-;25211:63;;25166:118;25351:3;25340:9;25336:19;25323:33;25383:18;25375:6;25372:30;25369:117;;;25405:79;;:::i;:::-;25369:117;25510:62;25564:7;25555:6;25544:9;25540:22;25510:62;:::i;:::-;25500:72;;25294:288;24500:1089;;;;;;;;:::o;25595:229::-;25735:34;25731:1;25723:6;25719:14;25712:58;25804:12;25799:2;25791:6;25787:15;25780:37;25595:229;:::o;25830:366::-;25972:3;25993:67;26057:2;26052:3;25993:67;:::i;:::-;25986:74;;26069:93;26158:3;26069:93;:::i;:::-;26187:2;26182:3;26178:12;26171:19;;25830:366;;;:::o;26202:419::-;26368:4;26406:2;26395:9;26391:18;26383:26;;26455:9;26449:4;26445:20;26441:1;26430:9;26426:17;26419:47;26483:131;26609:4;26483:131;:::i;:::-;26475:139;;26202:419;;;:::o;26627:308::-;26689:4;26779:18;26771:6;26768:30;26765:56;;;26801:18;;:::i;:::-;26765:56;26839:29;26861:6;26839:29;:::i;:::-;26831:37;;26923:4;26917;26913:15;26905:23;;26627:308;;;:::o;26941:421::-;27030:5;27055:66;27071:49;27113:6;27071:49;:::i;:::-;27055:66;:::i;:::-;27046:75;;27144:6;27137:5;27130:21;27182:4;27175:5;27171:16;27220:3;27211:6;27206:3;27202:16;27199:25;27196:112;;;27227:79;;:::i;:::-;27196:112;27317:39;27349:6;27344:3;27339;27317:39;:::i;:::-;27036:326;26941:421;;;;;:::o;27382:355::-;27449:5;27498:3;27491:4;27483:6;27479:17;27475:27;27465:122;;27506:79;;:::i;:::-;27465:122;27616:6;27610:13;27641:90;27727:3;27719:6;27712:4;27704:6;27700:17;27641:90;:::i;:::-;27632:99;;27455:282;27382:355;;;;:::o;27743:524::-;27823:6;27872:2;27860:9;27851:7;27847:23;27843:32;27840:119;;;27878:79;;:::i;:::-;27840:119;28019:1;28008:9;28004:17;27998:24;28049:18;28041:6;28038:30;28035:117;;;28071:79;;:::i;:::-;28035:117;28176:74;28242:7;28233:6;28222:9;28218:22;28176:74;:::i;:::-;28166:84;;27969:291;27743:524;;;;:::o;28273:174::-;28413:26;28409:1;28401:6;28397:14;28390:50;28273:174;:::o;28453:366::-;28595:3;28616:67;28680:2;28675:3;28616:67;:::i;:::-;28609:74;;28692:93;28781:3;28692:93;:::i;:::-;28810:2;28805:3;28801:12;28794:19;;28453:366;;;:::o;28825:419::-;28991:4;29029:2;29018:9;29014:18;29006:26;;29078:9;29072:4;29068:20;29064:1;29053:9;29049:17;29042:47;29106:131;29232:4;29106:131;:::i;:::-;29098:139;;28825:419;;;:::o;29250:180::-;29298:77;29295:1;29288:88;29395:4;29392:1;29385:15;29419:4;29416:1;29409:15;29436:348;29476:7;29499:20;29517:1;29499:20;:::i;:::-;29494:25;;29533:20;29551:1;29533:20;:::i;:::-;29528:25;;29721:1;29653:66;29649:74;29646:1;29643:81;29638:1;29631:9;29624:17;29620:105;29617:131;;;29728:18;;:::i;:::-;29617:131;29776:1;29773;29769:9;29758:20;;29436:348;;;;:::o;29790:180::-;29838:77;29835:1;29828:88;29935:4;29932:1;29925:15;29959:4;29956:1;29949:15;29976:185;30016:1;30033:20;30051:1;30033:20;:::i;:::-;30028:25;;30067:20;30085:1;30067:20;:::i;:::-;30062:25;;30106:1;30096:35;;30111:18;;:::i;:::-;30096:35;30153:1;30150;30146:9;30141:14;;29976:185;;;;:::o;30167:234::-;30307:34;30303:1;30295:6;30291:14;30284:58;30376:17;30371:2;30363:6;30359:15;30352:42;30167:234;:::o;30407:366::-;30549:3;30570:67;30634:2;30629:3;30570:67;:::i;:::-;30563:74;;30646:93;30735:3;30646:93;:::i;:::-;30764:2;30759:3;30755:12;30748:19;;30407:366;;;:::o;30779:419::-;30945:4;30983:2;30972:9;30968:18;30960:26;;31032:9;31026:4;31022:20;31018:1;31007:9;31003:17;30996:47;31060:131;31186:4;31060:131;:::i;:::-;31052:139;;30779:419;;;:::o;31204:228::-;31344:34;31340:1;31332:6;31328:14;31321:58;31413:11;31408:2;31400:6;31396:15;31389:36;31204:228;:::o;31438:366::-;31580:3;31601:67;31665:2;31660:3;31601:67;:::i;:::-;31594:74;;31677:93;31766:3;31677:93;:::i;:::-;31795:2;31790:3;31786:12;31779:19;;31438:366;;;:::o;31810:419::-;31976:4;32014:2;32003:9;31999:18;31991:26;;32063:9;32057:4;32053:20;32049:1;32038:9;32034:17;32027:47;32091:131;32217:4;32091:131;:::i;:::-;32083:139;;31810:419;;;:::o;32235:180::-;32283:77;32280:1;32273:88;32380:4;32377:1;32370:15;32404:4;32401:1;32394:15;32421:233;32460:3;32483:24;32501:5;32483:24;:::i;:::-;32474:33;;32529:66;32522:5;32519:77;32516:103;;;32599:18;;:::i;:::-;32516:103;32646:1;32639:5;32635:13;32628:20;;32421:233;;;:::o;32660:235::-;32800:34;32796:1;32788:6;32784:14;32777:58;32869:18;32864:2;32856:6;32852:15;32845:43;32660:235;:::o;32901:366::-;33043:3;33064:67;33128:2;33123:3;33064:67;:::i;:::-;33057:74;;33140:93;33229:3;33140:93;:::i;:::-;33258:2;33253:3;33249:12;33242:19;;32901:366;;;:::o;33273:419::-;33439:4;33477:2;33466:9;33462:18;33454:26;;33526:9;33520:4;33516:20;33512:1;33501:9;33497:17;33490:47;33554:131;33680:4;33554:131;:::i;:::-;33546:139;;33273:419;;;:::o;33698:148::-;33800:11;33837:3;33822:18;;33698:148;;;;:::o;33876:317::-;33992:3;34013:89;34095:6;34090:3;34013:89;:::i;:::-;34006:96;;34112:43;34148:6;34143:3;34136:5;34112:43;:::i;:::-;34180:6;34175:3;34171:16;34164:23;;33876:317;;;;;:::o;34199:295::-;34341:3;34363:105;34464:3;34455:6;34447;34363:105;:::i;:::-;34356:112;;34485:3;34478:10;;34199:295;;;;;:::o;34524:304::-;34622:3;34643:71;34707:6;34702:3;34643:71;:::i;:::-;34636:78;;34724:43;34760:6;34755:3;34748:5;34724:43;:::i;:::-;34792:29;34814:6;34792:29;:::i;:::-;34787:3;34783:39;34776:46;;34524:304;;;;;:::o;34834:333::-;34957:4;34995:2;34984:9;34980:18;34972:26;;35044:9;35038:4;35034:20;35030:1;35019:9;35015:17;35008:47;35072:88;35155:4;35146:6;35138;35072:88;:::i;:::-;35064:96;;34834:333;;;;;:::o;35173:235::-;35313:34;35309:1;35301:6;35297:14;35290:58;35382:18;35377:2;35369:6;35365:15;35358:43;35173:235;:::o;35414:366::-;35556:3;35577:67;35641:2;35636:3;35577:67;:::i;:::-;35570:74;;35653:93;35742:3;35653:93;:::i;:::-;35771:2;35766:3;35762:12;35755:19;;35414:366;;;:::o;35786:419::-;35952:4;35990:2;35979:9;35975:18;35967:26;;36039:9;36033:4;36029:20;36025:1;36014:9;36010:17;36003:47;36067:131;36193:4;36067:131;:::i;:::-;36059:139;;35786:419;;;:::o;36211:225::-;36351:34;36347:1;36339:6;36335:14;36328:58;36420:8;36415:2;36407:6;36403:15;36396:33;36211:225;:::o;36442:366::-;36584:3;36605:67;36669:2;36664:3;36605:67;:::i;:::-;36598:74;;36681:93;36770:3;36681:93;:::i;:::-;36799:2;36794:3;36790:12;36783:19;;36442:366;;;:::o;36814:419::-;36980:4;37018:2;37007:9;37003:18;36995:26;;37067:9;37061:4;37057:20;37053:1;37042:9;37038:17;37031:47;37095:131;37221:4;37095:131;:::i;:::-;37087:139;;36814:419;;;:::o;37239:220::-;37379:34;37375:1;37367:6;37363:14;37356:58;37448:3;37443:2;37435:6;37431:15;37424:28;37239:220;:::o;37465:366::-;37607:3;37628:67;37692:2;37687:3;37628:67;:::i;:::-;37621:74;;37704:93;37793:3;37704:93;:::i;:::-;37822:2;37817:3;37813:12;37806:19;;37465:366;;;:::o;37837:419::-;38003:4;38041:2;38030:9;38026:18;38018:26;;38090:9;38084:4;38080:20;38076:1;38065:9;38061:17;38054:47;38118:131;38244:4;38118:131;:::i;:::-;38110:139;;37837:419;;;:::o;38262:305::-;38302:3;38321:20;38339:1;38321:20;:::i;:::-;38316:25;;38355:20;38373:1;38355:20;:::i;:::-;38350:25;;38509:1;38441:66;38437:74;38434:1;38431:81;38428:107;;;38515:18;;:::i;:::-;38428:107;38559:1;38556;38552:9;38545:16;;38262:305;;;;:::o;38573:332::-;38694:4;38732:2;38721:9;38717:18;38709:26;;38745:71;38813:1;38802:9;38798:17;38789:6;38745:71;:::i;:::-;38826:72;38894:2;38883:9;38879:18;38870:6;38826:72;:::i;:::-;38573:332;;;;;:::o;38911:227::-;39051:34;39047:1;39039:6;39035:14;39028:58;39120:10;39115:2;39107:6;39103:15;39096:35;38911:227;:::o;39144:366::-;39286:3;39307:67;39371:2;39366:3;39307:67;:::i;:::-;39300:74;;39383:93;39472:3;39383:93;:::i;:::-;39501:2;39496:3;39492:12;39485:19;;39144:366;;;:::o;39516:419::-;39682:4;39720:2;39709:9;39705:18;39697:26;;39769:9;39763:4;39759:20;39755:1;39744:9;39740:17;39733:47;39797:131;39923:4;39797:131;:::i;:::-;39789:139;;39516:419;;;:::o;39941:224::-;40081:34;40077:1;40069:6;40065:14;40058:58;40150:7;40145:2;40137:6;40133:15;40126:32;39941:224;:::o;40171:366::-;40313:3;40334:67;40398:2;40393:3;40334:67;:::i;:::-;40327:74;;40410:93;40499:3;40410:93;:::i;:::-;40528:2;40523:3;40519:12;40512:19;;40171:366;;;:::o;40543:419::-;40709:4;40747:2;40736:9;40732:18;40724:26;;40796:9;40790:4;40786:20;40782:1;40771:9;40767:17;40760:47;40824:131;40950:4;40824:131;:::i;:::-;40816:139;;40543:419;;;:::o;40968:229::-;41108:34;41104:1;41096:6;41092:14;41085:58;41177:12;41172:2;41164:6;41160:15;41153:37;40968:229;:::o;41203:366::-;41345:3;41366:67;41430:2;41425:3;41366:67;:::i;:::-;41359:74;;41442:93;41531:3;41442:93;:::i;:::-;41560:2;41555:3;41551:12;41544:19;;41203:366;;;:::o;41575:419::-;41741:4;41779:2;41768:9;41764:18;41756:26;;41828:9;41822:4;41818:20;41814:1;41803:9;41799:17;41792:47;41856:131;41982:4;41856:131;:::i;:::-;41848:139;;41575:419;;;:::o;42000:634::-;42221:4;42259:2;42248:9;42244:18;42236:26;;42308:9;42302:4;42298:20;42294:1;42283:9;42279:17;42272:47;42336:108;42439:4;42430:6;42336:108;:::i;:::-;42328:116;;42491:9;42485:4;42481:20;42476:2;42465:9;42461:18;42454:48;42519:108;42622:4;42613:6;42519:108;:::i;:::-;42511:116;;42000:634;;;;;:::o;42640:182::-;42780:34;42776:1;42768:6;42764:14;42757:58;42640:182;:::o;42828:366::-;42970:3;42991:67;43055:2;43050:3;42991:67;:::i;:::-;42984:74;;43067:93;43156:3;43067:93;:::i;:::-;43185:2;43180:3;43176:12;43169:19;;42828:366;;;:::o;43200:419::-;43366:4;43404:2;43393:9;43389:18;43381:26;;43453:9;43447:4;43443:20;43439:1;43428:9;43424:17;43417:47;43481:131;43607:4;43481:131;:::i;:::-;43473:139;;43200:419;;;:::o;43625:228::-;43765:34;43761:1;43753:6;43749:14;43742:58;43834:11;43829:2;43821:6;43817:15;43810:36;43625:228;:::o;43859:366::-;44001:3;44022:67;44086:2;44081:3;44022:67;:::i;:::-;44015:74;;44098:93;44187:3;44098:93;:::i;:::-;44216:2;44211:3;44207:12;44200:19;;43859:366;;;:::o;44231:419::-;44397:4;44435:2;44424:9;44420:18;44412:26;;44484:9;44478:4;44474:20;44470:1;44459:9;44455:17;44448:47;44512:131;44638:4;44512:131;:::i;:::-;44504:139;;44231:419;;;:::o;44656:98::-;44707:6;44741:5;44735:12;44725:22;;44656:98;;;:::o;44760:168::-;44843:11;44877:6;44872:3;44865:19;44917:4;44912:3;44908:14;44893:29;;44760:168;;;;:::o;44934:360::-;45020:3;45048:38;45080:5;45048:38;:::i;:::-;45102:70;45165:6;45160:3;45102:70;:::i;:::-;45095:77;;45181:52;45226:6;45221:3;45214:4;45207:5;45203:16;45181:52;:::i;:::-;45258:29;45280:6;45258:29;:::i;:::-;45253:3;45249:39;45242:46;;45024:270;44934:360;;;;:::o;45300:751::-;45523:4;45561:3;45550:9;45546:19;45538:27;;45575:71;45643:1;45632:9;45628:17;45619:6;45575:71;:::i;:::-;45656:72;45724:2;45713:9;45709:18;45700:6;45656:72;:::i;:::-;45738;45806:2;45795:9;45791:18;45782:6;45738:72;:::i;:::-;45820;45888:2;45877:9;45873:18;45864:6;45820:72;:::i;:::-;45940:9;45934:4;45930:20;45924:3;45913:9;45909:19;45902:49;45968:76;46039:4;46030:6;45968:76;:::i;:::-;45960:84;;45300:751;;;;;;;;:::o;46057:141::-;46113:5;46144:6;46138:13;46129:22;;46160:32;46186:5;46160:32;:::i;:::-;46057:141;;;;:::o;46204:349::-;46273:6;46322:2;46310:9;46301:7;46297:23;46293:32;46290:119;;;46328:79;;:::i;:::-;46290:119;46448:1;46473:63;46528:7;46519:6;46508:9;46504:22;46473:63;:::i;:::-;46463:73;;46419:127;46204:349;;;;:::o;46559:106::-;46603:8;46652:5;46647:3;46643:15;46622:36;;46559:106;;;:::o;46671:183::-;46706:3;46744:1;46726:16;46723:23;46720:128;;;46782:1;46779;46776;46761:23;46804:34;46835:1;46829:8;46804:34;:::i;:::-;46797:41;;46720:128;46671:183;:::o;46860:711::-;46899:3;46937:4;46919:16;46916:26;46913:39;;;46945:5;;46913:39;46974:20;;:::i;:::-;47049:1;47031:16;47027:24;47024:1;47018:4;47003:49;47082:4;47076:11;47181:16;47174:4;47166:6;47162:17;47159:39;47126:18;47118:6;47115:30;47099:113;47096:146;;;47227:5;;;;47096:146;47273:6;47267:4;47263:17;47309:3;47303:10;47336:18;47328:6;47325:30;47322:43;;;47358:5;;;;;;47322:43;47406:6;47399:4;47394:3;47390:14;47386:27;47465:1;47447:16;47443:24;47437:4;47433:35;47428:3;47425:44;47422:57;;;47472:5;;;;;;;47422:57;47489;47537:6;47531:4;47527:17;47519:6;47515:30;47509:4;47489:57;:::i;:::-;47562:3;47555:10;;46903:668;;;;;46860:711;;:::o;47577:239::-;47717:34;47713:1;47705:6;47701:14;47694:58;47786:22;47781:2;47773:6;47769:15;47762:47;47577:239;:::o;47822:366::-;47964:3;47985:67;48049:2;48044:3;47985:67;:::i;:::-;47978:74;;48061:93;48150:3;48061:93;:::i;:::-;48179:2;48174:3;48170:12;48163:19;;47822:366;;;:::o;48194:419::-;48360:4;48398:2;48387:9;48383:18;48375:26;;48447:9;48441:4;48437:20;48433:1;48422:9;48418:17;48411:47;48475:131;48601:4;48475:131;:::i;:::-;48467:139;;48194:419;;;:::o;48619:227::-;48759:34;48755:1;48747:6;48743:14;48736:58;48828:10;48823:2;48815:6;48811:15;48804:35;48619:227;:::o;48852:366::-;48994:3;49015:67;49079:2;49074:3;49015:67;:::i;:::-;49008:74;;49091:93;49180:3;49091:93;:::i;:::-;49209:2;49204:3;49200:12;49193:19;;48852:366;;;:::o;49224:419::-;49390:4;49428:2;49417:9;49413:18;49405:26;;49477:9;49471:4;49467:20;49463:1;49452:9;49448:17;49441:47;49505:131;49631:4;49505:131;:::i;:::-;49497:139;;49224:419;;;:::o;49649:1053::-;49972:4;50010:3;49999:9;49995:19;49987:27;;50024:71;50092:1;50081:9;50077:17;50068:6;50024:71;:::i;:::-;50105:72;50173:2;50162:9;50158:18;50149:6;50105:72;:::i;:::-;50224:9;50218:4;50214:20;50209:2;50198:9;50194:18;50187:48;50252:108;50355:4;50346:6;50252:108;:::i;:::-;50244:116;;50407:9;50401:4;50397:20;50392:2;50381:9;50377:18;50370:48;50435:108;50538:4;50529:6;50435:108;:::i;:::-;50427:116;;50591:9;50585:4;50581:20;50575:3;50564:9;50560:19;50553:49;50619:76;50690:4;50681:6;50619:76;:::i;:::-;50611:84;;49649:1053;;;;;;;;:::o

Swarm Source

ipfs://5854a206491868eec6d979fb470be1886e12c5af87e40a870971964b085217ba
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.