Overview
POL Balance
0 POL
POL Value
$0.00Token Holdings
Latest 7 from a total of 7 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Renounce Ownersh... | 38549972 | 680 days ago | IN | 0 POL | 0.00318494 | ||||
Pause Unpause | 38548948 | 680 days ago | IN | 0 POL | 0.00245725 | ||||
Pause Unpause | 38483084 | 682 days ago | IN | 0 POL | 0.00120532 | ||||
Pause Unpause | 38482143 | 682 days ago | IN | 0 POL | 0.00047838 | ||||
Claim By Owner | 38482106 | 682 days ago | IN | 0 POL | 0.00370057 | ||||
Pause Unpause | 38482096 | 682 days ago | IN | 0 POL | 0.00044575 | ||||
Set Logo | 38481546 | 682 days ago | IN | 0 POL | 0.29665271 |
Loading...
Loading
Contract Name:
Web3InTravelNFTTicket
Compiler Version
v0.8.15+commit.e14f2714
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2023-01-24 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.15; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } /* * @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 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() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(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"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (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); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @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 Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } //// NFT Ticket Conference by Trips Community //developed by @jacmos3 contract Web3InTravelNFTTicket is ERC721Enumerable, ReentrancyGuard, Ownable { bool public paused; uint16 public constant MAX_ID = 500; uint256 public constant INITIAL_PRICE = 79000000000000000000 wei; uint256 public constant END_PRICE = 169000000000000000000 wei; uint256 public constant INITIAL_SPONSOR_PRICE = 500000000000000000000 wei; uint256 private sumIncrement = 0; uint256 private dateTime; uint256 public lTPercentageDiscount; uint256 public price; uint256 public sponsorshipPrice; uint256 public oldSponsorPayment; uint256 public sponsorPayment; address public oldSponsorAddress; address public sponsorAddress; address public treasurer; address public littleTravelerAddress; string constant private DET_LOGO = "Logo"; string constant private DET_TITLE = "Title"; string constant private DET_SUBTITLE = "Subtitle"; string constant private DET_TICKET_NUMBER = "#"; string constant private DET_CITY = "City"; string constant private DET_ADDRESS_LOCATION = "Location"; string constant private DET_DATE = "Date"; string constant private DET_DATE_LONG = "Date_long"; string constant private DET_TIME = "Time"; string constant private DET_TIME_LONG = "Time_long"; string constant private SPONSOR = "SPONSOR: "; string constant private DET_SPONSOR_QUOTE = "Sponsor"; string constant private DET_SPONSOR_QUOTE_LONG = "Sponsor_long"; string constant private DET_TYPE = "Type"; string constant private DET_CREDITS = "credits"; string constant private TYPE_STANDARD = "Standard"; string constant private TYPE_AIRDROP = "Airdrop"; string constant private ERR_SOLD_OUT = "Sold out"; string constant private ERR_MINTING_PAUSED = "Minting paused"; string constant private ERR_INSERT_EXACT = "Exact value required"; string constant private ERR_TOO_MANY_CHARS = "Too many chars, or empty string"; string constant private ERR_SENT_FAIL = "Failure"; string constant private ERR_NOT_EXISTS = "Selected tokenId does not exist"; string constant private ERR_INPUT_NOT_VALID = "Input not valid. Remove not valid chars"; string constant private ERR_NO_HACKS_PLS = "Hack failed! Try again!"; string constant private ERR_TIME_EXPIRED = "Time expired"; string constant private ERR_INSERT_1_100_VALUE = "Insert value between 1-100"; mapping(string => string) private details; mapping(uint256 => uint256) public prices; mapping(uint256 => address) public mintedBy; mapping(uint256 => bool) public airdrop; event Refunded(address indexed oldSponsorAddress, uint256 oldSponsorPayment); event NewSponsorship(address indexed sender, uint256 indexed amount, string _quote); event Minting(address indexed sender, uint256 indexed tokenId, uint256 msgValue, bool indexed airdrop); event MintingByOwner(address indexed sender, uint256 indexed tokenId); event DetailChanged(string indexed detail, string oldValue, string newValue); event ExpirationChanged(uint256 dateTime, uint256 _dateTime); event Withdraw(address indexed owner, address indexed trasurer, uint256 amount); event NewTreasurer(address indexed oldTreasurer, address indexed newTreasurer); event NewLittleTravelerAddress(address indexed oldLittleTravelerAddress, address indexed newLittleTravelerAddress); event Paused(bool paused); event LittleTravelerDiscountChanged(uint256 value); constructor() ERC721("Web3 In Travel NFT Ticket - BCN 2023", "WEB3INTRAVEL") Ownable(){ details[DET_TITLE] = "WEB3 IN TRAVEL - II Edition"; details[DET_SUBTITLE] = "Helping the travel industry's transition to Web3"; details[DET_CITY] = "Barcelona, Spain"; details[DET_DATE] = "15 MAY 2023"; details[DET_DATE_LONG] = "15th of May 2023"; details[DET_TIME] = "10 am - 6 pm"; details[DET_TIME_LONG] = "From 10 am to 6 pm"; details[DET_SPONSOR_QUOTE] = ""; details[DET_SPONSOR_QUOTE_LONG] = ""; details[DET_ADDRESS_LOCATION] = "World Trade Center, Barcelona"; details[DET_CREDITS] = "Web3InTravel.com by TripsCommunity in partnership with VRWS"; details[DET_TYPE] = TYPE_STANDARD; sponsorshipPrice = INITIAL_SPONSOR_PRICE; price = INITIAL_PRICE; treasurer = 0xce73904422880604e78591fD6c758B0D5106dD50; //TripsCommunity address littleTravelerAddress = 0x37CAB9F09a2FfA8C8650DD3De3594e1Cf2F38A84; //little traveler address on polygon. Holders get a discount paused = true; dateTime = 1693432800; //31 august 2023 lTPercentageDiscount = 50; // it's 50% } function claimByOwner() external onlyOwner { require(!paused, ERR_MINTING_PAUSED); uint256 _tokenId = totalSupply() +1; require(_tokenId <= MAX_ID, ERR_SOLD_OUT); require(block.timestamp <= dateTime, ERR_TIME_EXPIRED); address _sender = _msgSender(); mintedBy[_tokenId] = _sender; emit MintingByOwner(_sender, _tokenId); _safeMint(_sender, _tokenId); } function claimByPatrons(bool _airdrop) external payable nonReentrant { require(!paused, ERR_MINTING_PAUSED); uint256 _tokenId = totalSupply() + 1; require(_tokenId <= MAX_ID, ERR_SOLD_OUT); require(block.timestamp <= dateTime, ERR_TIME_EXPIRED); address _sender = _msgSender(); require(tx.origin == _sender, ERR_NO_HACKS_PLS); uint256 _msgValue = msg.value; require(_msgValue == expectedAmount(_airdrop), ERR_INSERT_EXACT); prices[_tokenId] = _msgValue; mintedBy[_tokenId] = _sender; airdrop[_tokenId] = _airdrop; sumIncrement += ((END_PRICE - INITIAL_PRICE) - sumIncrement) / 10; price = INITIAL_PRICE + sumIncrement; emit Minting(_sender, _tokenId, _msgValue, _airdrop); _safeMint(_sender, _tokenId); } //frontend and users can call it to check how much they should pay for the next ticket. //Notice: this is only informal, since value may change if other users mint in the meanwhile function expectedAmount(bool _airdrop) view public returns (uint256){ uint256 lTDiscount = 0; if (userOwnsLittleTraveler()){ lTDiscount = lTPercentageDiscount; } return _airdrop ? (price + price / 5) - ((price + price / 5) * lTDiscount) / 100 : price - (price * lTDiscount) / 100; } function sponsorship(string memory _quote) external payable nonReentrant { require(!paused, ERR_MINTING_PAUSED); require(block.timestamp <= dateTime, ERR_TIME_EXPIRED); address _sender = _msgSender(); require(tx.origin == _sender, ERR_NO_HACKS_PLS); require(msg.value == sponsorshipPrice, ERR_INSERT_EXACT); uint256 len = bytes(_quote).length; require(len > 0 && len <= 32, ERR_TOO_MANY_CHARS); require(sanitize(_quote), ERR_INPUT_NOT_VALID); details[DET_SPONSOR_QUOTE] = _quote; details[DET_SPONSOR_QUOTE_LONG] = string(abi.encodePacked(SPONSOR, _quote)); oldSponsorAddress = sponsorAddress; oldSponsorPayment = sponsorPayment; sponsorAddress = _sender; sponsorPayment = sponsorshipPrice; sponsorshipPrice = (sponsorshipPrice * 12) / 10; if (oldSponsorPayment > 0){ (bool sent,) = payable(oldSponsorAddress).call{value:oldSponsorPayment}(""); require(sent, ERR_SENT_FAIL); emit Refunded(oldSponsorAddress, oldSponsorPayment); } emit NewSponsorship(_sender, sponsorPayment, _quote); } function getSlice(uint end, string memory inputString) public pure returns (string memory) { bytes memory myBytes = bytes(inputString); bytes memory extractedBytes = new bytes(end + 1); uint index = 0; for (uint i = 0; i < end; i++) { if (myBytes[i] != 0x00){ extractedBytes[index] = myBytes[i]; } else{ extractedBytes[index] = 0x30; } index++; } extractedBytes[end] = 0x30; return string(extractedBytes); } function countTrailingZeros(string memory inputString) internal pure returns (uint) { bytes memory myBytes = bytes(inputString); uint count = 0; for (uint256 i = myBytes.length - 1; i >= 0; i--) { if (myBytes[i] == 0x30) { count++; } else { break; } } return count; } function trim(string memory priceRight) internal pure returns (string memory){ uint index = 18 - countTrailingZeros(priceRight); if(index > bytes(priceRight).length) { return priceRight; } return getSlice(index, priceRight); } function composePriceToDisplay(uint256 _price) public pure returns (string memory){ if (_price == 0) return "0.0"; string memory priceLeft = string(abi.encodePacked(toString(_price / 1 ether))); string memory priceRight = string(abi.encodePacked(toString(_price % 1 ether))); uint256 len = 18 - bytes(priceRight).length; uint256 l = 0; while (l < len) { priceRight = string(abi.encodePacked("0",priceRight)); l++; } return string(abi.encodePacked(priceLeft,'.',trim(priceRight))); } function tokenURI(uint256 _tokenId) override public view returns (string memory) { require(_tokenId <= totalSupply(), ERR_NOT_EXISTS); string memory _details_ticket_number = string(abi.encodePacked(DET_TICKET_NUMBER,toString(_tokenId))); string[5] memory parts; parts[0] = string(abi.encodePacked('<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 350 350"><style>.a { fill:white; font: bold 20px sans-serif; } .b { fill:white; font: 12px sans-serif; } .c { fill:white; font: bold 16px sans-serif; } .d { fill:white; font: bold 14px sans-serif; } .e { fill:white; font: 12px sans-serif; } .f { fill:white; font: 8px sans-serif; }</style> <rect width="100%" height="100%" fill="#4285f4" />')); parts[1] = string(abi.encodePacked('<text class="a" x="175" y="40" text-anchor="middle" >',details[DET_TITLE],'</text><text class="b" x="175" y="60" text-anchor="middle" >',details[DET_SUBTITLE],'</text><text x="175" y="90" text-anchor="middle" class="c">NFT TICKET ',_details_ticket_number,'</text>')); parts[2] = string(abi.encodePacked('<text x="175" y="130" text-anchor="middle" class="d">',details[DET_ADDRESS_LOCATION],'</text><text x="175" y="150" text-anchor="middle" class="d">',details[DET_DATE_LONG],' (',details[DET_TIME],')</text><text x="175" y="190" class="d" text-anchor="middle" >',details[DET_SPONSOR_QUOTE_LONG],'</text>')); parts[3] = string(abi.encodePacked('<text x="175" y="230" text-anchor="middle" class="d">Dynamic price: $ETH ',composePriceToDisplay(prices[_tokenId]),'</text><text x="175" y="305" text-anchor="middle" class="e">minted by:</text><text x="175" y="320" text-anchor="middle" class="e">0x',toAsciiString(mintedBy[_tokenId]),'</text>')); parts[4] = string(abi.encodePacked('<text x="175" y="340" text-anchor="middle" class="f">',details[DET_CREDITS],'</text>',details[DET_LOGO],'</svg>')); string memory compact = string(abi.encodePacked(parts[0],parts[1],parts[2],parts[3],parts[4])); string memory json = Base64.encode(bytes(string(abi.encodePacked('{"name": "Ticket #', toString(_tokenId), '", "description": "NFT ticket for -WEB3 IN TRAVEL- Barcelona, 15th of May 2023. The first travel conference dedicated to the transition to Web3, 2nd edition. Speeches, panels and networking to help the industry upgrade to the new Web. https://web3intravel.com", "image": "data:image/svg+xml;base64,', Base64.encode(bytes(compact)), '","attributes":[',metadata(_tokenId),']}')))); return string(abi.encodePacked('data:application/json;base64,', json)); } function metadata(uint256 _tokenId) internal view returns (string memory){ string memory _details_type = airdrop[_tokenId] ? TYPE_AIRDROP : TYPE_STANDARD; string[3] memory _parts; _parts[0] = string(abi.encodePacked( '{"trait_type":"id","value":"',toString(_tokenId),'"},' ,'{"trait_type":"',DET_TITLE,'","value":"',details[DET_TITLE],'"},' ,'{"trait_type":"',DET_SUBTITLE,'","value":"',details[DET_SUBTITLE],'"},' ,'{"trait_type":"',DET_CITY,'","value":"',details[DET_CITY],'"},' )); _parts[1] = string(abi.encodePacked( '{"trait_type":"',DET_ADDRESS_LOCATION,'","value":"',details[DET_ADDRESS_LOCATION],'"},' ,'{"trait_type":"',DET_DATE,'","value":"',details[DET_DATE],'"},' ,'{"trait_type":"',DET_TIME,'","value":"',details[DET_TIME],'"},' ,'{"trait_type":"',DET_TYPE,'","value":"',_details_type,'"},' )); _parts[2] = string(abi.encodePacked( '{"trait_type":"Minted by","value":"',toAsciiString(mintedBy[_tokenId]),'"},' ,'{"trait_type":"',DET_SPONSOR_QUOTE,'","value":"',details[DET_SPONSOR_QUOTE],'"},' ,'{"trait_type":"Price","value":"',toString(prices[_tokenId]),'"},' ,'{"trait_type":"',DET_CREDITS,'","value":"',details[DET_CREDITS],'"}' )); return string(abi.encodePacked(_parts[0],_parts[1], _parts[2])); } function withdraw() external onlyOwner { uint256 amount = address(this).balance; payable(treasurer).transfer(amount); emit Withdraw(msg.sender, treasurer, amount); } function setTreasurer(address _newAddress) external onlyOwner{ emit NewTreasurer(treasurer, _newAddress); treasurer = _newAddress; } function setLittleTravelerAddress(address _newAddress) external onlyOwner{ emit NewLittleTravelerAddress(littleTravelerAddress, _newAddress); littleTravelerAddress = _newAddress; } function setSponsorQuote(string memory _quote) external onlyOwner{ emit DetailChanged(DET_SPONSOR_QUOTE, details[DET_SPONSOR_QUOTE], _quote); emit DetailChanged(DET_SPONSOR_QUOTE_LONG, details[DET_SPONSOR_QUOTE_LONG], _quote); details[DET_SPONSOR_QUOTE] = _quote; details[DET_SPONSOR_QUOTE_LONG] = string(abi.encodePacked(SPONSOR,_quote)); } function pauseUnpause() external onlyOwner{ paused = !paused; emit Paused(paused); } function setLTPercentageDiscount(uint256 value) external onlyOwner{ require(value > 0 && value <= 100, ERR_INSERT_1_100_VALUE); emit LittleTravelerDiscountChanged(value); lTPercentageDiscount = value; } function setDateTime(string memory _newDate, string memory _newDateLong, string memory _newTime, string memory _newTimeLong, uint256 _dateTime) external onlyOwner{ if (bytes(_newDate).length > 0) { emit DetailChanged(DET_DATE, details[DET_DATE], _newDate); details[DET_DATE] = _newDate; } if (bytes(_newDateLong).length > 0) { emit DetailChanged(DET_DATE_LONG, details[DET_DATE_LONG], _newDateLong); details[DET_DATE_LONG] = _newDateLong; } if (bytes(_newTime).length > 0) { emit DetailChanged(DET_TIME, details[DET_TIME], _newTime); details[DET_TIME] = _newTime; } if (bytes(_newTimeLong).length > 0) { emit DetailChanged(DET_TIME_LONG, details[DET_TIME_LONG], _newTimeLong); details[DET_TIME_LONG] = _newTimeLong; } if (_dateTime > 0){ emit ExpirationChanged(dateTime, _dateTime); dateTime = _dateTime; } } function setAddressLocation(string memory _newAddressLocation) external onlyOwner{ emit DetailChanged(DET_ADDRESS_LOCATION, details[DET_ADDRESS_LOCATION], _newAddressLocation); details[DET_ADDRESS_LOCATION] = _newAddressLocation; } function setCity(string memory _newCity) external onlyOwner{ emit DetailChanged(DET_CITY, details[DET_CITY], _newCity); details[DET_CITY] = _newCity; } function setLogo(string memory _newLogo) external onlyOwner{ emit DetailChanged(DET_LOGO, details[DET_LOGO], _newLogo); details[DET_LOGO] = _newLogo; } function setTitle(string memory _newTitle) external onlyOwner{ emit DetailChanged(DET_TITLE, details[DET_TITLE], _newTitle); details[DET_TITLE] = _newTitle; } function setSubtitle(string memory _newSubtitle) external onlyOwner{ emit DetailChanged(DET_SUBTITLE, details[DET_SUBTITLE], _newSubtitle); details[DET_SUBTITLE] = _newSubtitle; } function userOwnsLittleTraveler() view public returns (bool) { return littleTravelerAddress != address(0) && IERC721(littleTravelerAddress).balanceOf(_msgSender()) > 0; } function sanitize(string memory input) internal pure returns(bool){ uint8 allowedChars = 0; bytes memory byteString = bytes(input); bytes memory allowed = bytes("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_ .,:;()[]{}+-*$!?"); bool exit = false; for(uint8 i=0; i < byteString.length; i++){ exit = false; for(uint8 j=0; j < allowed.length && !exit; j++){ if(byteString[i] == allowed[j]){ allowedChars++; exit = true; } } } return allowedChars >= byteString.length; } function detailCheck(string memory _detail) external view returns (string memory){ return details[_detail]; } function toAsciiString(address x) internal pure returns (string memory) { bytes memory s = new bytes(40); for (uint i = 0; i < 20; i++) { bytes1 b = bytes1(uint8(uint(uint160(x)) / (2**(8*(19 - i))))); bytes1 hi = bytes1(uint8(b) / 16); bytes1 lo = bytes1(uint8(b) - 16 * uint8(hi)); s[2*i] = char(hi); s[2*i+1] = char(lo); } return string(s); } function char(bytes1 b) internal pure returns (bytes1 c) { if (uint8(b) < 10) return bytes1(uint8(b) + 0x30); else return bytes1(uint8(b) + 0x57); } function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT license // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } } /// [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
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","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":true,"internalType":"string","name":"detail","type":"string"},{"indexed":false,"internalType":"string","name":"oldValue","type":"string"},{"indexed":false,"internalType":"string","name":"newValue","type":"string"}],"name":"DetailChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"dateTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_dateTime","type":"uint256"}],"name":"ExpirationChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"LittleTravelerDiscountChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"msgValue","type":"uint256"},{"indexed":true,"internalType":"bool","name":"airdrop","type":"bool"}],"name":"Minting","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"MintingByOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldLittleTravelerAddress","type":"address"},{"indexed":true,"internalType":"address","name":"newLittleTravelerAddress","type":"address"}],"name":"NewLittleTravelerAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"string","name":"_quote","type":"string"}],"name":"NewSponsorship","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldTreasurer","type":"address"},{"indexed":true,"internalType":"address","name":"newTreasurer","type":"address"}],"name":"NewTreasurer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"paused","type":"bool"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldSponsorAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"oldSponsorPayment","type":"uint256"}],"name":"Refunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"trasurer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"END_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INITIAL_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INITIAL_SPONSOR_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_ID","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"airdrop","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimByOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_airdrop","type":"bool"}],"name":"claimByPatrons","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"composePriceToDisplay","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"string","name":"_detail","type":"string"}],"name":"detailCheck","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_airdrop","type":"bool"}],"name":"expectedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"end","type":"uint256"},{"internalType":"string","name":"inputString","type":"string"}],"name":"getSlice","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lTPercentageDiscount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"littleTravelerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintedBy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oldSponsorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oldSponsorPayment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseUnpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"prices","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newAddressLocation","type":"string"}],"name":"setAddressLocation","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":"string","name":"_newCity","type":"string"}],"name":"setCity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newDate","type":"string"},{"internalType":"string","name":"_newDateLong","type":"string"},{"internalType":"string","name":"_newTime","type":"string"},{"internalType":"string","name":"_newTimeLong","type":"string"},{"internalType":"uint256","name":"_dateTime","type":"uint256"}],"name":"setDateTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setLTPercentageDiscount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newAddress","type":"address"}],"name":"setLittleTravelerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newLogo","type":"string"}],"name":"setLogo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_quote","type":"string"}],"name":"setSponsorQuote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newSubtitle","type":"string"}],"name":"setSubtitle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newTitle","type":"string"}],"name":"setTitle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newAddress","type":"address"}],"name":"setTreasurer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sponsorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sponsorPayment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_quote","type":"string"}],"name":"sponsorship","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"sponsorshipPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"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":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasurer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"userOwnsLittleTraveler","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600c553480156200001657600080fd5b50604051806060016040528060248152602001620064956024913960408051808201909152600c81526b15d1508cd25395149055915360a21b6020820152600062000062838262000747565b50600162000071828262000747565b50506001600a5550620000843362000650565b6040518060400160405280601b81526020017f5745423320494e2054524156454c202d2049492045646974696f6e00000000008152506017604051806040016040528060058152602001645469746c6560d81b815250604051620000e9919062000813565b9081526020016040518091039020908162000105919062000747565b50604051806060016040528060308152602001620064b96030913960408051808201825260088152675375627469746c6560c01b602082015290516017916200014e9162000813565b908152602001604051809103902090816200016a919062000747565b506040518060400160405280601081526020016f2130b931b2b637b730961029b830b4b760811b8152506017604051806040016040528060048152602001634369747960e01b815250604051620001c2919062000813565b90815260200160405180910390209081620001de919062000747565b506040518060400160405280600b81526020016a3135204d4159203230323360a81b8152506017604051806040016040528060048152602001634461746560e01b81525060405162000231919062000813565b908152602001604051809103902090816200024d919062000747565b506040518060400160405280601081526020016f31357468206f66204d6179203230323360801b815250601760405180604001604052806009815260200168446174655f6c6f6e6760b81b815250604051620002aa919062000813565b90815260200160405180910390209081620002c6919062000747565b506040518060400160405280600c81526020016b313020616d202d203620706d60a01b81525060176040518060400160405280600481526020016354696d6560e01b8152506040516200031a919062000813565b9081526020016040518091039020908162000336919062000747565b506040518060400160405280601281526020017146726f6d20313020616d20746f203620706d60701b81525060176040518060400160405280600981526020016854696d655f6c6f6e6760b81b81525060405162000395919062000813565b90815260200160405180910390209081620003b1919062000747565b506040518060200160405280600081525060176040518060400160405280600781526020016629b837b739b7b960c91b815250604051620003f3919062000813565b908152602001604051809103902090816200040f919062000747565b506040518060200160405280600081525060176040518060400160405280600c81526020016b53706f6e736f725f6c6f6e6760a01b81525060405162000456919062000813565b9081526020016040518091039020908162000472919062000747565b506040518060400160405280601d81526020017f576f726c642054726164652043656e7465722c2042617263656c6f6e610000008152506017604051806040016040528060088152602001672637b1b0ba34b7b760c11b815250604051620004db919062000813565b90815260200160405180910390209081620004f7919062000747565b506040518060600160405280603b8152602001620064e9603b913960408051808201825260078152666372656469747360c81b602082015290516017916200053f9162000813565b908152602001604051809103902090816200055b919062000747565b506040518060400160405280600881526020016714dd185b99185c9960c21b8152506017604051806040016040528060048152602001635479706560e01b815250604051620005ab919062000813565b90815260200160405180910390209081620005c7919062000747565b50681b1ae4d6e2ef500000601055680448586170a7dc0000600f55601580546001600160a01b031990811673ce73904422880604e78591fd6c758b0d5106dd5017909155601680549091167337cab9f09a2ffa8c8650dd3de3594e1cf2f38a84179055600b805460ff60a01b1916600160a01b1790556364efbbe0600d556032600e5562000851565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620006cd57607f821691505b602082108103620006ee57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200074257600081815260208120601f850160051c810160208610156200071d5750805b601f850160051c820191505b818110156200073e5782815560010162000729565b5050505b505050565b81516001600160401b03811115620007635762000763620006a2565b6200077b81620007748454620006b8565b84620006f4565b602080601f831160018114620007b357600084156200079a5750858301515b600019600386901b1c1916600185901b1785556200073e565b600085815260208120601f198616915b82811015620007e457888601518255948401946001909101908401620007c3565b5085821015620008035787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000825160005b818110156200083657602081860181015185830152016200081a565b8181111562000846576000828501525b509190910192915050565b615c3480620008616000396000f3fe60806040526004361061036a5760003560e01c80637c5e2795116101c6578063c720d53b116100f7578063e985e9c511610095578063f2fde38b1161006f578063f2fde38b146109fd578063fa785e2414610a1d578063fafaf70014610a3a578063fda49eb414610a5057600080fd5b8063e985e9c51461097f578063f07513eb146109c8578063f0d04516146109e857600080fd5b8063d714ff36116100d1578063d714ff361461090f578063d893806514610922578063da46097714610942578063e75d58bc1461095f57600080fd5b8063c720d53b146108bc578063c87b56dd146108cf578063ca2ed869146108ef57600080fd5b8063a035b1fe11610164578063b88d4fde1161013e578063b88d4fde1461083a578063bbf986ef1461085a578063bc31c1c11461087a578063c5f12b85146108a757600080fd5b8063a035b1fe146107e4578063a22cb465146107fa578063a75003b21461081a57600080fd5b806395d89b41116101a057806395d89b411461074957806397dc4a131461075e5780639870909c1461078e5780639c2b4daa146107ae57600080fd5b80637c5e2795146106ee5780638da5cb5b1461070b578063953f5d011461072957600080fd5b80632fe31962116102a05780635f4744191161023e5780636aeefe10116102185780636aeefe101461067957806370a0823114610699578063715018a6146106b957806372910be0146106ce57600080fd5b80635f474419146106195780636352211e14610639578063671d64291461065957600080fd5b80634b8e377d1161027a5780634b8e377d146105ad5780634f6ccce7146105c2578063566db7fd146105e25780635c975abb146105f857600080fd5b80632fe31962146105585780633ccfd60b1461057857806342842e0e1461058d57600080fd5b806314f24f781161030d57806318160ddd116102e757806318160ddd146104e357806323b872dd146104f857806326f4a2d5146105185780632f745c591461053857600080fd5b806314f24f7814610484578063153891851461049a57806317bac052146104ba57600080fd5b8063081812fc11610349578063081812fc146103ea578063095ea7b3146104225780630de3365814610444578063107ff5701461046457600080fd5b80622621a01461036f57806301ffc9a71461039857806306fdde03146103c8575b600080fd5b34801561037b57600080fd5b50610385600e5481565b6040519081526020015b60405180910390f35b3480156103a457600080fd5b506103b86103b3366004614579565b610a70565b604051901515815260200161038f565b3480156103d457600080fd5b506103dd610a9b565b60405161038f91906145ee565b3480156103f657600080fd5b5061040a610405366004614601565b610b2d565b6040516001600160a01b03909116815260200161038f565b34801561042e57600080fd5b5061044261043d366004614631565b610bc7565b005b34801561045057600080fd5b5061044261045f36600461465b565b610cdc565b34801561047057600080fd5b506103dd61047f366004614722565b610d62565b34801561049057600080fd5b5061038560125481565b3480156104a657600080fd5b506104426104b5366004614722565b610e12565b3480156104c657600080fd5b506104d06101f481565b60405161ffff909116815260200161038f565b3480156104ef57600080fd5b50600854610385565b34801561050457600080fd5b50610442610513366004614757565b610f1e565b34801561052457600080fd5b506103856105333660046147a3565b610f4f565b34801561054457600080fd5b50610385610553366004614631565b610ff5565b34801561056457600080fd5b50610442610573366004614722565b61108b565b34801561058457600080fd5b5061044261116d565b34801561059957600080fd5b506104426105a8366004614757565b611219565b3480156105b957600080fd5b50610442611234565b3480156105ce57600080fd5b506103856105dd366004614601565b6113ad565b3480156105ee57600080fd5b5061038560105481565b34801561060457600080fd5b50600b546103b890600160a01b900460ff1681565b34801561062557600080fd5b5060165461040a906001600160a01b031681565b34801561064557600080fd5b5061040a610654366004614601565b611440565b34801561066557600080fd5b5061044261067436600461465b565b6114b7565b34801561068557600080fd5b5060145461040a906001600160a01b031681565b3480156106a557600080fd5b506103856106b436600461465b565b61153d565b3480156106c557600080fd5b506104426115c4565b3480156106da57600080fd5b506104426106e9366004614722565b6115fa565b3480156106fa57600080fd5b50610385680448586170a7dc000081565b34801561071757600080fd5b50600b546001600160a01b031661040a565b34801561073557600080fd5b50610442610744366004614601565b6116df565b34801561075557600080fd5b506103dd6117a7565b34801561076a57600080fd5b506103b8610779366004614601565b601a6020526000908152604090205460ff1681565b34801561079a57600080fd5b506103dd6107a9366004614601565b6117b6565b3480156107ba57600080fd5b5061040a6107c9366004614601565b6019602052600090815260409020546001600160a01b031681565b3480156107f057600080fd5b50610385600f5481565b34801561080657600080fd5b506104426108153660046147be565b6118dc565b34801561082657600080fd5b506103dd6108353660046147f1565b6119a0565b34801561084657600080fd5b50610442610855366004614838565b611afa565b34801561086657600080fd5b5060135461040a906001600160a01b031681565b34801561088657600080fd5b50610385610895366004614601565b60186020526000908152604090205481565b3480156108b357600080fd5b50610442611b32565b6104426108ca3660046147a3565b611bc2565b3480156108db57600080fd5b506103dd6108ea366004614601565b611ebf565b3480156108fb57600080fd5b5061044261090a3660046148b4565b6124e2565b61044261091d366004614722565b6128e5565b34801561092e57600080fd5b5061044261093d366004614722565b612d82565b34801561094e57600080fd5b50610385680929589c998104000081565b34801561096b57600080fd5b5061044261097a366004614722565b612e70565b34801561098b57600080fd5b506103b861099a366004614969565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156109d457600080fd5b506104426109e3366004614722565b613081565b3480156109f457600080fd5b506103b8613163565b348015610a0957600080fd5b50610442610a1836600461465b565b6131ff565b348015610a2957600080fd5b50610385681b1ae4d6e2ef50000081565b348015610a4657600080fd5b5061038560115481565b348015610a5c57600080fd5b5060155461040a906001600160a01b031681565b60006001600160e01b0319821663780e9d6360e01b1480610a955750610a958261329a565b92915050565b606060008054610aaa90614993565b80601f0160208091040260200160405190810160405280929190818152602001828054610ad690614993565b8015610b235780601f10610af857610100808354040283529160200191610b23565b820191906000526020600020905b815481529060010190602001808311610b0657829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610bab5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610bd282611440565b9050806001600160a01b0316836001600160a01b031603610c3f5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610ba2565b336001600160a01b0382161480610c5b5750610c5b813361099a565b610ccd5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610ba2565b610cd783836132ea565b505050565b600b546001600160a01b03163314610d065760405162461bcd60e51b8152600401610ba2906149cd565b6016546040516001600160a01b038084169216907fb1cfb37880abd83374e9d3ae318271de8c8cb504dc4a1e73942181bd8545ff8490600090a3601680546001600160a01b0319166001600160a01b0392909216919091179055565b6060601782604051610d749190614a1e565b90815260200160405180910390208054610d8d90614993565b80601f0160208091040260200160405190810160405280929190818152602001828054610db990614993565b8015610e065780601f10610ddb57610100808354040283529160200191610e06565b820191906000526020600020905b815481529060010190602001808311610de957829003601f168201915b50505050509050919050565b600b546001600160a01b03163314610e3c5760405162461bcd60e51b8152600401610ba2906149cd565b60408051808201825260088152675375627469746c6560c01b60208201529051610e669190614a1e565b6040518091039020600080516020615bdf8339815191526017604051806040016040528060088152602001675375627469746c6560c01b815250604051610ead9190614a1e565b908152604051908190036020018120610ec7918590614a3a565b60405180910390a2806017604051806040016040528060088152602001675375627469746c6560c01b815250604051610f009190614a1e565b90815260200160405180910390209081610f1a9190614b27565b5050565b610f283382613358565b610f445760405162461bcd60e51b8152600401610ba290614be7565b610cd783838361344f565b600080610f5a613163565b15610f645750600e545b82610f9557606481600f54610f799190614c4e565b610f839190614c83565b600f54610f909190614c97565b610fee565b6064816005600f54610fa79190614c83565b600f54610fb49190614cae565b610fbe9190614c4e565b610fc89190614c83565b6005600f54610fd79190614c83565b600f54610fe49190614cae565b610fee9190614c97565b9392505050565b60006110008361153d565b82106110625760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610ba2565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600b546001600160a01b031633146110b55760405162461bcd60e51b8152600401610ba2906149cd565b60408051808201825260048152634c6f676f60e01b602082015290516110db9190614a1e565b6040518091039020600080516020615bdf8339815191526017604051806040016040528060048152602001634c6f676f60e01b81525060405161111e9190614a1e565b908152604051908190036020018120611138918590614a3a565b60405180910390a2806017604051806040016040528060048152602001634c6f676f60e01b815250604051610f009190614a1e565b600b546001600160a01b031633146111975760405162461bcd60e51b8152600401610ba2906149cd565b60155460405147916001600160a01b03169082156108fc029083906000818181858888f193505050501580156111d1573d6000803e3d6000fd5b506015546040518281526001600160a01b039091169033907f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb9060200160405180910390a350565b610cd783838360405180602001604052806000815250611afa565b600b546001600160a01b0316331461125e5760405162461bcd60e51b8152600401610ba2906149cd565b600b5460408051808201909152600e81526d135a5b9d1a5b99c81c185d5cd95960921b602082015290600160a01b900460ff16156112af5760405162461bcd60e51b8152600401610ba291906145ee565b5060006112bb60085490565b6112c6906001614cae565b60408051808201909152600881526714dbdb19081bdd5d60c21b60208201529091506101f482111561130b5760405162461bcd60e51b8152600401610ba291906145ee565b50600d544211156040518060400160405280600c81526020016b151a5b5948195e1c1a5c995960a21b815250906113555760405162461bcd60e51b8152600401610ba291906145ee565b5060008181526019602052604080822080546001600160a01b0319163390811790915590519091839183917f32214b91e284b04168d3ae3a57732379781ef5d7f58f389dfb597eaf875ae71391a3610f1a81836135fa565b60006113b860085490565b821061141b5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610ba2565b6008828154811061142e5761142e614cc6565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b031680610a955760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610ba2565b600b546001600160a01b031633146114e15760405162461bcd60e51b8152600401610ba2906149cd565b6015546040516001600160a01b038084169216907f44480e2c785a901cfd7e220e53f3940931d9f14c088297d4316bd5b3c8ae216f90600090a3601580546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b0382166115a85760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610ba2565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b031633146115ee5760405162461bcd60e51b8152600401610ba2906149cd565b6115f86000613614565b565b600b546001600160a01b031633146116245760405162461bcd60e51b8152600401610ba2906149cd565b60408051808201825260058152645469746c6560d81b6020820152905161164b9190614a1e565b6040518091039020600080516020615bdf8339815191526017604051806040016040528060058152602001645469746c6560d81b81525060405161168f9190614a1e565b9081526040519081900360200181206116a9918590614a3a565b60405180910390a2806017604051806040016040528060058152602001645469746c6560d81b815250604051610f009190614a1e565b600b546001600160a01b031633146117095760405162461bcd60e51b8152600401610ba2906149cd565b60008111801561171a575060648111155b6040518060400160405280601a81526020017f496e736572742076616c7565206265747765656e20312d3130300000000000008152509061176e5760405162461bcd60e51b8152600401610ba291906145ee565b506040518181527f45371c66fc311cc069e45674ea6b242593b9e0ae2f1ede40fa07c44f7dc499059060200160405180910390a1600e55565b606060018054610aaa90614993565b6060816000036117df5750506040805180820190915260038152620302e360ec1b602082015290565b60006117fb6117f6670de0b6b3a764000085614c83565b613666565b60405160200161180b9190614a1e565b60408051601f19818403018152919052905060006118346117f6670de0b6b3a764000086614cdc565b6040516020016118449190614a1e565b60405160208183030381529060405290506000815160126118659190614c97565b905060005b818110156118a757826040516020016118839190614cf0565b6040516020818303038152906040529250808061189f90614d19565b91505061186a565b836118b184613767565b6040516020016118c2929190614d32565b604051602081830303815290604052945050505050919050565b336001600160a01b038316036119345760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610ba2565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60608160006119b0856001614cae565b67ffffffffffffffff8111156119c8576119c8614676565b6040519080825280601f01601f1916602001820160405280156119f2576020820181803683370190505b5090506000805b86811015611ac157838181518110611a1357611a13614cc6565b01602001516001600160f81b03191615611a7257838181518110611a3957611a39614cc6565b602001015160f81c60f81b838381518110611a5657611a56614cc6565b60200101906001600160f81b031916908160001a905350611aa1565b603060f81b838381518110611a8957611a89614cc6565b60200101906001600160f81b031916908160001a9053505b81611aab81614d19565b9250508080611ab990614d19565b9150506119f9565b50603060f81b828781518110611ad957611ad9614cc6565b60200101906001600160f81b031916908160001a9053509095945050505050565b611b043383613358565b611b205760405162461bcd60e51b8152600401610ba290614be7565b611b2c8484848461379b565b50505050565b600b546001600160a01b03163314611b5c5760405162461bcd60e51b8152600401610ba2906149cd565b600b805460ff600160a01b808304821615810260ff60a01b1990931692909217928390556040517f0e2fb031ee032dc02d8011dc50b816eb450cf856abd8261680dac74f72165bd293611bb89390049091161515815260200190565b60405180910390a1565b6002600a5403611c145760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610ba2565b6002600a55600b5460408051808201909152600e81526d135a5b9d1a5b99c81c185d5cd95960921b602082015290600160a01b900460ff1615611c6a5760405162461bcd60e51b8152600401610ba291906145ee565b506000611c7660085490565b611c81906001614cae565b60408051808201909152600881526714dbdb19081bdd5d60c21b60208201529091506101f4821115611cc65760405162461bcd60e51b8152600401610ba291906145ee565b50600d544211156040518060400160405280600c81526020016b151a5b5948195e1c1a5c995960a21b81525090611d105760405162461bcd60e51b8152600401610ba291906145ee565b506040805180820190915260178152764861636b206661696c6564212054727920616761696e2160481b60208201523390328214611d615760405162461bcd60e51b8152600401610ba291906145ee565b5034611d6c84610f4f565b811460405180604001604052806014815260200173115e1858dd081d985b1d59481c995c5d5a5c995960621b81525090611db95760405162461bcd60e51b8152600401610ba291906145ee565b5060008381526018602090815260408083208490556019825280832080546001600160a01b0319166001600160a01b038716179055601a9091529020805460ff1916851515179055600c54600a90611e23680448586170a7dc0000680929589c9981040000614c97565b611e2d9190614c97565b611e379190614c83565b600c6000828254611e489190614cae565b9091555050600c54611e6390680448586170a7dc0000614cae565b600f556040518181528415159084906001600160a01b038516907f4eb8dd6030fc6472539f7a048646b8b2c1887684c1d6899752bfc95e024880b19060200160405180910390a4611eb482846135fa565b50506001600a555050565b6060611eca60085490565b8211156040518060400160405280601f81526020017f53656c656374656420746f6b656e496420646f6573206e6f742065786973740081525090611f215760405162461bcd60e51b8152600401610ba291906145ee565b506000604051806040016040528060018152602001602360f81b815250611f4784613666565b604051602001611f58929190614d6e565b6040516020818303038152906040529050611f71614522565b604051602001612189907f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323081527f30302f73766722207072657365727665417370656374526174696f3d22784d6960208201527f6e594d696e206d656574222076696577426f783d22302030203335302033353060408201527f223e3c7374796c653e2e61207b2066696c6c3a77686974653b20666f6e743a2060608201527f626f6c6420323070782073616e732d73657269663b207d202e62207b2066696c60808201527f6c3a77686974653b20666f6e743a20313270782073616e732d73657269663b2060a08201527f7d202e63207b2066696c6c3a77686974653b20666f6e743a20626f6c6420313660c08201527f70782073616e732d73657269663b207d202e64207b2066696c6c3a776869746560e08201527f3b20666f6e743a20626f6c6420313470782073616e732d73657269663b207d206101008201527f2e65207b2066696c6c3a77686974653b20666f6e743a20313270782073616e736101208201527f2d73657269663b207d202e66207b2066696c6c3a77686974653b20666f6e743a6101408201527f203870782073616e732d73657269663b207d3c2f7374796c653e203c726563746101608201527f2077696474683d223130302522206865696768743d2231303025222066696c6c6101808201526c1e91119a191c1ab31a1110179f60991b6101a08201526101ad0190565b60408051808303601f190181529181529082528051808201825260058152645469746c6560d81b602082015290516017916121c391614a1e565b90815260200160405180910390206017604051806040016040528060088152602001675375627469746c6560c01b8152506040516122019190614a1e565b90815260200160405180910390208360405160200161222293929190614e10565b60408051808303601f190181529181526020808401929092528051808201825260088152672637b1b0ba34b7b760c11b928101929092525160179161226691614a1e565b9081526020016040518091039020601760405180604001604052806009815260200168446174655f6c6f6e6760b81b8152506040516122a59190614a1e565b908152602001604051809103902060176040518060400160405280600481526020016354696d6560e01b8152506040516122df9190614a1e565b908152602001604051809103902060176040518060400160405280600c81526020016b53706f6e736f725f6c6f6e6760a01b8152506040516123219190614a1e565b90815260200160405180910390206040516020016123429493929190614f45565b60408051808303601f190181529181528281019190915260008581526018602052205461236e906117b6565b60008581526019602052604090205461238f906001600160a01b03166137ce565b6040516020016123a0929190615075565b60408051808303601f1901815291815260608301919091528051808201825260078152666372656469747360c81b602082015290516017916123e191614a1e565b90815260200160405180910390206017604051806040016040528060048152602001634c6f676f60e01b81525060405161241b9190614a1e565b908152602001604051809103902060405160200161243a9291906151c1565b60408051808303601f190181529181526080830182905282516020808501518584015160608701519451600096612478969394929392909101615243565b604051602081830303815290604052905060006124cf61249787613666565b6124a084613915565b6124a989613a7f565b6040516020016124bb939291906152ae565b604051602081830303815290604052613915565b9050806040516020016118c2919061549c565b600b546001600160a01b0316331461250c5760405162461bcd60e51b8152600401610ba2906149cd565b8451156125e75760408051808201825260048152634461746560e01b602082015290516125399190614a1e565b6040518091039020600080516020615bdf8339815191526017604051806040016040528060048152602001634461746560e01b81525060405161257c9190614a1e565b908152604051908190036020018120612596918990614a3a565b60405180910390a2846017604051806040016040528060048152602001634461746560e01b8152506040516125cb9190614a1e565b908152602001604051809103902090816125e59190614b27565b505b8351156126d1576040805180820182526009815268446174655f6c6f6e6760b81b602082015290516126199190614a1e565b6040518091039020600080516020615bdf833981519152601760405180604001604052806009815260200168446174655f6c6f6e6760b81b8152506040516126619190614a1e565b90815260405190819003602001812061267b918890614a3a565b60405180910390a283601760405180604001604052806009815260200168446174655f6c6f6e6760b81b8152506040516126b59190614a1e565b908152602001604051809103902090816126cf9190614b27565b505b8251156127ac57604080518082018252600481526354696d6560e01b602082015290516126fe9190614a1e565b6040518091039020600080516020615bdf83398151915260176040518060400160405280600481526020016354696d6560e01b8152506040516127419190614a1e565b90815260405190819003602001812061275b918790614a3a565b60405180910390a28260176040518060400160405280600481526020016354696d6560e01b8152506040516127909190614a1e565b908152602001604051809103902090816127aa9190614b27565b505b81511561289657604080518082018252600981526854696d655f6c6f6e6760b81b602082015290516127de9190614a1e565b6040518091039020600080516020615bdf83398151915260176040518060400160405280600981526020016854696d655f6c6f6e6760b81b8152506040516128269190614a1e565b908152604051908190036020018120612840918690614a3a565b60405180910390a28160176040518060400160405280600981526020016854696d655f6c6f6e6760b81b81525060405161287a9190614a1e565b908152602001604051809103902090816128949190614b27565b505b80156128de57600d5460408051918252602082018390527f9aa6fad74a092697838e399f30ea908478bb2747b84bedf64798609770f44587910160405180910390a1600d8190555b5050505050565b6002600a54036129375760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610ba2565b6002600a55600b5460408051808201909152600e81526d135a5b9d1a5b99c81c185d5cd95960921b602082015290600160a01b900460ff161561298d5760405162461bcd60e51b8152600401610ba291906145ee565b50600d544211156040518060400160405280600c81526020016b151a5b5948195e1c1a5c995960a21b815250906129d75760405162461bcd60e51b8152600401610ba291906145ee565b506040805180820190915260178152764861636b206661696c6564212054727920616761696e2160481b60208201523390328214612a285760405162461bcd60e51b8152600401610ba291906145ee565b50601054341460405180604001604052806014815260200173115e1858dd081d985b1d59481c995c5d5a5c995960621b81525090612a795760405162461bcd60e51b8152600401610ba291906145ee565b5081518015801590612a8c575060208111155b6040518060400160405280601f81526020017f546f6f206d616e792063686172732c206f7220656d70747920737472696e670081525090612ae05760405162461bcd60e51b8152600401610ba291906145ee565b50612aea83613eb9565b604051806060016040528060278152602001615b286027913990612b215760405162461bcd60e51b8152600401610ba291906145ee565b508260176040518060400160405280600781526020016629b837b739b7b960c91b815250604051612b529190614a1e565b90815260200160405180910390209081612b6c9190614b27565b5060405180604001604052806009815260200168029a827a729a7a91d160bd1b81525083604051602001612ba1929190614d6e565b60408051601f198184030181528282018252600c83526b53706f6e736f725f6c6f6e6760a01b602084015290519091601791612bdd9190614a1e565b90815260200160405180910390209081612bf79190614b27565b5060148054601380546001600160a01b038084166001600160a01b0319928316179092556012805460115592169085161790915560105490819055600a90612c4090600c614c4e565b612c4a9190614c83565b60105560115415612d34576013546011546040516000926001600160a01b031691908381818185875af1925050503d8060008114612ca4576040519150601f19603f3d011682016040523d82523d6000602084013e612ca9565b606091505b5050905080604051806040016040528060078152602001664661696c75726560c81b81525090612cec5760405162461bcd60e51b8152600401610ba291906145ee565b506013546011546040519081526001600160a01b03909116907fd7dee2702d63ad89917b6a4da9981c90c4d24f8c2bdfd64c604ecae57d8d06519060200160405180910390a2505b601254826001600160a01b03167f713c4f871914d861d411c51e368db4ea6817f8dac2bcc26949e3576fc2550b8785604051612d7091906145ee565b60405180910390a350506001600a5550565b600b546001600160a01b03163314612dac5760405162461bcd60e51b8152600401610ba2906149cd565b60408051808201825260088152672637b1b0ba34b7b760c11b60208201529051612dd69190614a1e565b6040518091039020600080516020615bdf8339815191526017604051806040016040528060088152602001672637b1b0ba34b7b760c11b815250604051612e1d9190614a1e565b908152604051908190036020018120612e37918590614a3a565b60405180910390a2806017604051806040016040528060088152602001672637b1b0ba34b7b760c11b815250604051610f009190614a1e565b600b546001600160a01b03163314612e9a5760405162461bcd60e51b8152600401610ba2906149cd565b604080518082018252600781526629b837b739b7b960c91b60208201529051612ec39190614a1e565b6040518091039020600080516020615bdf83398151915260176040518060400160405280600781526020016629b837b739b7b960c91b815250604051612f099190614a1e565b908152604051908190036020018120612f23918590614a3a565b60405180910390a2604080518082018252600c81526b53706f6e736f725f6c6f6e6760a01b60208201529051612f599190614a1e565b6040518091039020600080516020615bdf83398151915260176040518060400160405280600c81526020016b53706f6e736f725f6c6f6e6760a01b815250604051612fa49190614a1e565b908152604051908190036020018120612fbe918590614a3a565b60405180910390a28060176040518060400160405280600781526020016629b837b739b7b960c91b815250604051612ff69190614a1e565b908152602001604051809103902090816130109190614b27565b5060405180604001604052806009815260200168029a827a729a7a91d160bd1b81525081604051602001613045929190614d6e565b60408051601f198184030181528282018252600c83526b53706f6e736f725f6c6f6e6760a01b602084015290519091601791610f009190614a1e565b600b546001600160a01b031633146130ab5760405162461bcd60e51b8152600401610ba2906149cd565b60408051808201825260048152634369747960e01b602082015290516130d19190614a1e565b6040518091039020600080516020615bdf8339815191526017604051806040016040528060048152602001634369747960e01b8152506040516131149190614a1e565b90815260405190819003602001812061312e918590614a3a565b60405180910390a2806017604051806040016040528060048152602001634369747960e01b815250604051610f009190614a1e565b6016546000906001600160a01b0316158015906131fa57506016546000906001600160a01b03166370a08231336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa1580156131d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131f891906154e1565b115b905090565b600b546001600160a01b031633146132295760405162461bcd60e51b8152600401610ba2906149cd565b6001600160a01b03811661328e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ba2565b61329781613614565b50565b60006001600160e01b031982166380ac58cd60e01b14806132cb57506001600160e01b03198216635b5e139f60e01b145b80610a9557506301ffc9a760e01b6001600160e01b0319831614610a95565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061331f82611440565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166133d15760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610ba2565b60006133dc83611440565b9050806001600160a01b0316846001600160a01b031614806134175750836001600160a01b031661340c84610b2d565b6001600160a01b0316145b8061344757506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661346282611440565b6001600160a01b0316146134ca5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610ba2565b6001600160a01b03821661352c5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610ba2565b613537838383613fa7565b6135426000826132ea565b6001600160a01b038316600090815260036020526040812080546001929061356b908490614c97565b90915550506001600160a01b0382166000908152600360205260408120805460019290613599908490614cae565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610f1a82826040518060200160405280600081525061405f565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60608160000361368d5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156136b757806136a181614d19565b91506136b09050600a83614c83565b9150613691565b60008167ffffffffffffffff8111156136d2576136d2614676565b6040519080825280601f01601f1916602001820160405280156136fc576020820181803683370190505b5090505b841561344757613711600183614c97565b915061371e600a86614cdc565b613729906030614cae565b60f81b81838151811061373e5761373e614cc6565b60200101906001600160f81b031916908160001a905350613760600a86614c83565b9450613700565b6060600061377483614092565b61377f906012614c97565b90508251811115613791575090919050565b610fee81846119a0565b6137a684848461344f565b6137b284848484614108565b611b2c5760405162461bcd60e51b8152600401610ba2906154fa565b60408051602880825260608281019093526000919060208201818036833701905050905060005b601481101561390e57600061380b826013614c97565b613816906008614c4e565b613821906002615630565b613834906001600160a01b038716614c83565b60f81b9050600060108260f81c61384b919061563c565b60f81b905060008160f81c6010613862919061565e565b8360f81c613870919061567f565b60f81b905061387e82614209565b8561388a866002614c4e565b8151811061389a5761389a614cc6565b60200101906001600160f81b031916908160001a9053506138ba81614209565b856138c6866002614c4e565b6138d1906001614cae565b815181106138e1576138e1614cc6565b60200101906001600160f81b031916908160001a905350505050808061390690614d19565b9150506137f5565b5092915050565b80516060906000819003613939575050604080516020810190915260008152919050565b60006003613948836002614cae565b6139529190614c83565b61395d906004614c4e565b9050600061396c826020614cae565b67ffffffffffffffff81111561398457613984614676565b6040519080825280601f01601f1916602001820160405280156139ae576020820181803683370190505b5090506000604051806060016040528060408152602001615b9f604091399050600181016020830160005b86811015613a3a576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b8352600490920191016139d9565b506003860660018114613a545760028114613a6557613a71565b613d3d60f01b600119830152613a71565b603d60f81b6000198301525b505050918152949350505050565b6000818152601a60205260408120546060919060ff16613abf576040518060400160405280600881526020016714dd185b99185c9960c21b815250613ae0565b60405180604001604052806007815260200166041697264726f760cc1b8152505b9050613aea614549565b613af384613666565b604051806040016040528060058152602001645469746c6560d81b8152506017604051806040016040528060058152602001645469746c6560d81b815250604051613b3e9190614a1e565b9081526020016040518091039020604051806040016040528060088152602001675375627469746c6560c01b8152506017604051806040016040528060088152602001675375627469746c6560c01b815250604051613b9d9190614a1e565b9081526020016040518091039020604051806040016040528060048152602001634369747960e01b8152506017604051806040016040528060048152602001634369747960e01b815250604051613bf49190614a1e565b9081526020016040518091039020604051602001613c1897969594939291906156a2565b60408051808303601f19018152918152908252805180820182526008808252672637b1b0ba34b7b760c11b60208381018290528451808601865292835282015291519091601791613c699190614a1e565b9081526020016040518091039020604051806040016040528060048152602001634461746560e01b8152506017604051806040016040528060048152602001634461746560e01b815250604051613cc09190614a1e565b90815260200160405180910390206040518060400160405280600481526020016354696d6560e01b81525060176040518060400160405280600481526020016354696d6560e01b815250604051613d179190614a1e565b9081526040805160209281900383018120818301835260048252635479706560e01b848301529151613d509897969594938b91016157f4565b60408051808303601f1901815291815260208084019290925260008681526019909252902054613d88906001600160a01b03166137ce565b6040518060400160405280600781526020016629b837b739b7b960c91b81525060176040518060400160405280600781526020016629b837b739b7b960c91b815250604051613dd79190614a1e565b9081526020016040518091039020613e016018600089815260200190815260200160002054613666565b604051806040016040528060078152602001666372656469747360c81b8152506017604051806040016040528060078152602001666372656469747360c81b815250604051613e509190614a1e565b9081526020016040518091039020604051602001613e73969594939291906158fa565b60408051808303601f1901815291815282810182905282516020808501519251613ea1949293929101615a23565b60405160208183030381529060405292505050919050565b60408051608081019091526050808252600091829184918391615b4f602083013990506000805b83518160ff161015613f93576000915060005b83518160ff16108015613f04575082155b15613f8057838160ff1681518110613f1e57613f1e614cc6565b602001015160f81c60f81b6001600160f81b031916858360ff1681518110613f4857613f48614cc6565b01602001516001600160f81b03191603613f6e5785613f6681615a66565b965050600192505b80613f7881615a66565b915050613ef3565b5080613f8b81615a66565b915050613ee0565b5082518460ff161015945050505050919050565b6001600160a01b03831661400257613ffd81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b614025565b816001600160a01b0316836001600160a01b031614614025576140258382614244565b6001600160a01b03821661403c57610cd7816142e1565b826001600160a01b0316826001600160a01b031614610cd757610cd78282614390565b61406983836143d4565b6140766000848484614108565b610cd75760405162461bcd60e51b8152600401610ba2906154fa565b600080829050600080600183516140a99190614c97565b90505b8281815181106140be576140be614cc6565b01602001516001600160f81b031916600360fc1b036140e957816140e181614d19565b9250506140ee565b614100565b806140f881615a85565b9150506140ac565b509392505050565b60006001600160a01b0384163b156141fe57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061414c903390899088908890600401615a9c565b6020604051808303816000875af1925050508015614187575060408051601f3d908101601f1916820190925261418491810190615acf565b60015b6141e4573d8080156141b5576040519150601f19603f3d011682016040523d82523d6000602084013e6141ba565b606091505b5080516000036141dc5760405162461bcd60e51b8152600401610ba2906154fa565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050613447565b506001949350505050565b6000600a60f883901c10156142305761422760f883901c6030615aec565b60f81b92915050565b61422760f883901c6057615aec565b919050565b600060016142518461153d565b61425b9190614c97565b6000838152600760205260409020549091508082146142ae576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906142f390600190614c97565b6000838152600960205260408120546008805493945090928490811061431b5761431b614cc6565b90600052602060002001549050806008838154811061433c5761433c614cc6565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061437457614374615b11565b6001900381819060005260206000200160009055905550505050565b600061439b8361153d565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b03821661442a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610ba2565b6000818152600260205260409020546001600160a01b03161561448f5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610ba2565b61449b60008383613fa7565b6001600160a01b03821660009081526003602052604081208054600192906144c4908490614cae565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6040518060a001604052806005905b60608152602001906001900390816145315790505090565b604080516060808201909252908152600260208201614531565b6001600160e01b03198116811461329757600080fd5b60006020828403121561458b57600080fd5b8135610fee81614563565b60005b838110156145b1578181015183820152602001614599565b83811115611b2c5750506000910152565b600081518084526145da816020860160208601614596565b601f01601f19169290920160200192915050565b602081526000610fee60208301846145c2565b60006020828403121561461357600080fd5b5035919050565b80356001600160a01b038116811461423f57600080fd5b6000806040838503121561464457600080fd5b61464d8361461a565b946020939093013593505050565b60006020828403121561466d57600080fd5b610fee8261461a565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156146a7576146a7614676565b604051601f8501601f19908116603f011681019082821181831017156146cf576146cf614676565b816040528093508581528686860111156146e857600080fd5b858560208301376000602087830101525050509392505050565b600082601f83011261471357600080fd5b610fee8383356020850161468c565b60006020828403121561473457600080fd5b813567ffffffffffffffff81111561474b57600080fd5b61344784828501614702565b60008060006060848603121561476c57600080fd5b6147758461461a565b92506147836020850161461a565b9150604084013590509250925092565b8035801515811461423f57600080fd5b6000602082840312156147b557600080fd5b610fee82614793565b600080604083850312156147d157600080fd5b6147da8361461a565b91506147e860208401614793565b90509250929050565b6000806040838503121561480457600080fd5b82359150602083013567ffffffffffffffff81111561482257600080fd5b61482e85828601614702565b9150509250929050565b6000806000806080858703121561484e57600080fd5b6148578561461a565b93506148656020860161461a565b925060408501359150606085013567ffffffffffffffff81111561488857600080fd5b8501601f8101871361489957600080fd5b6148a88782356020840161468c565b91505092959194509250565b600080600080600060a086880312156148cc57600080fd5b853567ffffffffffffffff808211156148e457600080fd5b6148f089838a01614702565b9650602088013591508082111561490657600080fd5b61491289838a01614702565b9550604088013591508082111561492857600080fd5b61493489838a01614702565b9450606088013591508082111561494a57600080fd5b5061495788828901614702565b95989497509295608001359392505050565b6000806040838503121561497c57600080fd5b6149858361461a565b91506147e86020840161461a565b600181811c908216806149a757607f821691505b6020821081036149c757634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008151614a14818560208601614596565b9290920192915050565b60008251614a30818460208701614596565b9190910192915050565b604081526000808454614a4c81614993565b8060408601526060600180841660008114614a6e5760018114614a8857614ab9565b60ff1985168884015283151560051b880183019550614ab9565b8960005260208060002060005b86811015614ab05781548b8201870152908401908201614a95565b8a018501975050505b50505050508281036020840152614ad081856145c2565b95945050505050565b601f821115610cd757600081815260208120601f850160051c81016020861015614b005750805b601f850160051c820191505b81811015614b1f57828155600101614b0c565b505050505050565b815167ffffffffffffffff811115614b4157614b41614676565b614b5581614b4f8454614993565b84614ad9565b602080601f831160018114614b8a5760008415614b725750858301515b600019600386901b1c1916600185901b178555614b1f565b600085815260208120601f198616915b82811015614bb957888601518255948401946001909101908401614b9a565b5085821015614bd75787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615614c6857614c68614c38565b500290565b634e487b7160e01b600052601260045260246000fd5b600082614c9257614c92614c6d565b500490565b600082821015614ca957614ca9614c38565b500390565b60008219821115614cc157614cc1614c38565b500190565b634e487b7160e01b600052603260045260246000fd5b600082614ceb57614ceb614c6d565b500690565b600360fc1b815260008251614d0c816001850160208701614596565b9190910160010192915050565b600060018201614d2b57614d2b614c38565b5060010190565b60008351614d44818460208801614596565b601760f91b9083019081528351614d62816001840160208801614596565b01600101949350505050565b60008351614d80818460208801614596565b835190830190614d94818360208801614596565b01949350505050565b60008154614daa81614993565b60018281168015614dc25760018114614dd757614e06565b60ff1984168752821515830287019450614e06565b8560005260208060002060005b85811015614dfd5781548a820152908401908201614de4565b50505082870194505b5050505092915050565b7f3c7465787420636c6173733d22612220783d223137352220793d2234302220208152753a32bc3a16b0b731b437b91e9136b4b232363291101f60511b60208201526000614e616036830186614d9d565b7f3c2f746578743e3c7465787420636c6173733d22622220783d2231373522207981527f3d223630222020746578742d616e63686f723d226d6964646c6522203e0000006020820152614eb7603d820186614d9d565b90507f3c2f746578743e3c7465787420783d223137352220793d22393022207465787481527f2d616e63686f723d226d6964646c652220636c6173733d2263223e4e46542054602082015265024a1a5a2aa160d51b60408201528351614f24816046840160208801614596565b661e17ba32bc3a1f60c91b60469290910191820152604d0195945050505050565b7f3c7465787420783d223137352220793d223133302220746578742d616e63686f815274391e9136b4b2323632911031b630b9b99e9132111f60591b60208201526000614f956035830187614d9d565b7f3c2f746578743e3c7465787420783d223137352220793d22313530222074657881527f742d616e63686f723d226d6964646c652220636c6173733d2264223e000000006020820152614feb603c820187614d9d565b905061040560f31b81526150026002820186614d9d565b90507f293c2f746578743e3c7465787420783d223137352220793d223139302220636c81527f6173733d22642220746578742d616e63686f723d226d6964646c6522203e0000602082015261505a603e820185614d9d565b661e17ba32bc3a1f60c91b8152600701979650505050505050565b7f3c7465787420783d223137352220793d223233302220746578742d616e63686f81527f723d226d6964646c652220636c6173733d2264223e44796e616d696320707269602082015268031b29d101222aa24160bd1b6040820152600083516150e5816049850160208801614596565b7f3c2f746578743e3c7465787420783d223137352220793d2233303522207465786049918401918201527f742d616e63686f723d226d6964646c652220636c6173733d2265223e6d696e7460698201527f65642062793a3c2f746578743e3c7465787420783d223137352220793d22333260898201527f302220746578742d616e63686f723d226d6964646c652220636c6173733d226560a9820152630447c60f60e31b60c982015283516151a18160cd840160208801614596565b661e17ba32bc3a1f60c91b60cd929091019182015260d401949350505050565b7f3c7465787420783d223137352220793d223334302220746578742d616e63686f815274391e9136b4b2323632911031b630b9b99e9133111f60591b602082015260006152116035830185614d9d565b661e17ba32bc3a1f60c91b815261522b6007820185614d9d565b651e17b9bb339f60d11b815260060195945050505050565b60008651615255818460208b01614596565b865190830190615269818360208b01614596565b865191019061527c818360208a01614596565b855191019061528f818360208901614596565b84519101906152a2818360208801614596565b01979650505050505050565b717b226e616d65223a20225469636b6574202360701b815283516000906152dc816012850160208901614596565b7f222c20226465736372697074696f6e223a20224e4654207469636b657420666f6012918401918201527f72202d5745423320494e2054524156454c2d2042617263656c6f6e612c20313560328201527f7468206f66204d617920323032332e205468652066697273742074726176656c60528201527f20636f6e666572656e63652064656469636174656420746f207468652074726160728201527f6e736974696f6e20746f20576562332c20326e642065646974696f6e2e20537060928201527f6565636865732c2070616e656c7320616e64206e6574776f726b696e6720746f60b28201527f2068656c702074686520696e647573747279207570677261646520746f20746860d28201527f65206e6577205765622e2068747470733a2f2f77656233696e74726176656c2e60f28201527f636f6d222c2022696d616765223a2022646174613a696d6167652f7376672b78610112820152691b5b0ed8985cd94d8d0b60b21b61013282015261549261548461547e61546261013c850189614a02565b6f222c2261747472696275746573223a5b60801b815260100190565b86614a02565b615d7d60f01b815260020190565b9695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516154d481601d850160208701614596565b91909101601d0192915050565b6000602082840312156154f357600080fd5b5051919050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600181815b8085111561558757816000190482111561556d5761556d614c38565b8085161561557a57918102915b93841c9390800290615551565b509250929050565b60008261559e57506001610a95565b816155ab57506000610a95565b81600181146155c157600281146155cb576155e7565b6001915050610a95565b60ff8411156155dc576155dc614c38565b50506001821b610a95565b5060208310610133831016604e8410600b841016171561560a575081810a610a95565b615614838361554c565b806000190482111561562857615628614c38565b029392505050565b6000610fee838361558f565b600060ff83168061564f5761564f614c6d565b8060ff84160491505092915050565b600060ff821660ff84168160ff048111821515161561562857615628614c38565b600060ff821660ff84168082101561569957615699614c38565b90039392505050565b7f7b2274726169745f74797065223a226964222c2276616c7565223a22000000008152600088516156da81601c850160208d01614596565b62089f4b60ea1b601c9184019182018190526e3d913a3930b4ba2fba3cb832911d1160891b601f83018190528a5161571981602e860160208f01614596565b6a1116113b30b63ab2911d1160a91b602e949091019384015261573f603984018b614d9d565b9182526003820152875190915061575d816012840160208b01614596565b6157e56157986157df6157c86157c26157a76157986157926012898b01016a1116113b30b63ab2911d1160a91b8152600b0190565b8e614d9d565b62089f4b60ea1b815260030190565b6e3d913a3930b4ba2fba3cb832911d1160891b8152600f0190565b8a614a02565b6a1116113b30b63ab2911d1160a91b8152600b0190565b87614d9d565b9b9a5050505050505050505050565b60006e3d913a3930b4ba2fba3cb832911d1160891b8083528a5161581f81600f860160208f01614596565b6a1116113b30b63ab2911d1160a91b600f8286010152615844601a828601018c614d9d565b905062089f4b60ea1b8082528260038301528a51615869816012850160208f01614596565b6a1116113b30b63ab2911d1160a91b6012828501015261588e601d828501018c614d9d565b918252506003810192909252508651906158af826012830160208b01614596565b6158ea6157986158e46157c86157c26157a761579861579260128a8a01016a1116113b30b63ab2911d1160a91b8152600b0190565b87614a02565b9c9b505050505050505050505050565b7f7b2274726169745f74797065223a224d696e746564206279222c2276616c7565815262111d1160e91b60208201526000875161593e816023850160208c01614596565b62089f4b60ea1b60239184019182018190526e3d913a3930b4ba2fba3cb832911d1160891b6026830152885161597b816035850160208d01614596565b6a1116113b30b63ab2911d1160a91b603593909101928301526159a16040830189614d9d565b9150808252507f7b2274726169745f74797065223a225072696365222c2276616c7565223a2200600382015285516159e0816022840160208a01614596565b615a15615a076157df6157c86157c26157a760228789010162089f4b60ea1b815260030190565b61227d60f01b815260020190565b9a9950505050505050505050565b60008451615a35818460208901614596565b845190830190615a49818360208901614596565b8451910190615a5c818360208801614596565b0195945050505050565b600060ff821660ff8103615a7c57615a7c614c38565b60010192915050565b600081615a9457615a94614c38565b506000190190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090615492908301846145c2565b600060208284031215615ae157600080fd5b8151610fee81614563565b600060ff821660ff84168060ff03821115615b0957615b09614c38565b019392505050565b634e487b7160e01b600052603160045260246000fdfe496e707574206e6f742076616c69642e2052656d6f7665206e6f742076616c69642063686172736162636465666768696a6b6c6d6e6f707172737475767778797a4142434445464748494a4b4c4d4e4f505152535455565758595a303132333435363738395f202e2c3a3b28295b5d7b7d2b2d2a24213f4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f1672b4b5288a80dc27ff066863e214ea755e8fb6b1ac03303442bad815c0ee9ba26469706673582212205cf1494e2388360f7d0cc2de4f2bd311827ca0de92184e9ab26ebd0305c781f364736f6c634300080f00335765623320496e2054726176656c204e4654205469636b6574202d2042434e203230323348656c70696e67207468652074726176656c20696e6475737472792773207472616e736974696f6e20746f205765623357656233496e54726176656c2e636f6d206279205472697073436f6d6d756e69747920696e20706172746e65727368697020776974682056525753
Deployed Bytecode
0x60806040526004361061036a5760003560e01c80637c5e2795116101c6578063c720d53b116100f7578063e985e9c511610095578063f2fde38b1161006f578063f2fde38b146109fd578063fa785e2414610a1d578063fafaf70014610a3a578063fda49eb414610a5057600080fd5b8063e985e9c51461097f578063f07513eb146109c8578063f0d04516146109e857600080fd5b8063d714ff36116100d1578063d714ff361461090f578063d893806514610922578063da46097714610942578063e75d58bc1461095f57600080fd5b8063c720d53b146108bc578063c87b56dd146108cf578063ca2ed869146108ef57600080fd5b8063a035b1fe11610164578063b88d4fde1161013e578063b88d4fde1461083a578063bbf986ef1461085a578063bc31c1c11461087a578063c5f12b85146108a757600080fd5b8063a035b1fe146107e4578063a22cb465146107fa578063a75003b21461081a57600080fd5b806395d89b41116101a057806395d89b411461074957806397dc4a131461075e5780639870909c1461078e5780639c2b4daa146107ae57600080fd5b80637c5e2795146106ee5780638da5cb5b1461070b578063953f5d011461072957600080fd5b80632fe31962116102a05780635f4744191161023e5780636aeefe10116102185780636aeefe101461067957806370a0823114610699578063715018a6146106b957806372910be0146106ce57600080fd5b80635f474419146106195780636352211e14610639578063671d64291461065957600080fd5b80634b8e377d1161027a5780634b8e377d146105ad5780634f6ccce7146105c2578063566db7fd146105e25780635c975abb146105f857600080fd5b80632fe31962146105585780633ccfd60b1461057857806342842e0e1461058d57600080fd5b806314f24f781161030d57806318160ddd116102e757806318160ddd146104e357806323b872dd146104f857806326f4a2d5146105185780632f745c591461053857600080fd5b806314f24f7814610484578063153891851461049a57806317bac052146104ba57600080fd5b8063081812fc11610349578063081812fc146103ea578063095ea7b3146104225780630de3365814610444578063107ff5701461046457600080fd5b80622621a01461036f57806301ffc9a71461039857806306fdde03146103c8575b600080fd5b34801561037b57600080fd5b50610385600e5481565b6040519081526020015b60405180910390f35b3480156103a457600080fd5b506103b86103b3366004614579565b610a70565b604051901515815260200161038f565b3480156103d457600080fd5b506103dd610a9b565b60405161038f91906145ee565b3480156103f657600080fd5b5061040a610405366004614601565b610b2d565b6040516001600160a01b03909116815260200161038f565b34801561042e57600080fd5b5061044261043d366004614631565b610bc7565b005b34801561045057600080fd5b5061044261045f36600461465b565b610cdc565b34801561047057600080fd5b506103dd61047f366004614722565b610d62565b34801561049057600080fd5b5061038560125481565b3480156104a657600080fd5b506104426104b5366004614722565b610e12565b3480156104c657600080fd5b506104d06101f481565b60405161ffff909116815260200161038f565b3480156104ef57600080fd5b50600854610385565b34801561050457600080fd5b50610442610513366004614757565b610f1e565b34801561052457600080fd5b506103856105333660046147a3565b610f4f565b34801561054457600080fd5b50610385610553366004614631565b610ff5565b34801561056457600080fd5b50610442610573366004614722565b61108b565b34801561058457600080fd5b5061044261116d565b34801561059957600080fd5b506104426105a8366004614757565b611219565b3480156105b957600080fd5b50610442611234565b3480156105ce57600080fd5b506103856105dd366004614601565b6113ad565b3480156105ee57600080fd5b5061038560105481565b34801561060457600080fd5b50600b546103b890600160a01b900460ff1681565b34801561062557600080fd5b5060165461040a906001600160a01b031681565b34801561064557600080fd5b5061040a610654366004614601565b611440565b34801561066557600080fd5b5061044261067436600461465b565b6114b7565b34801561068557600080fd5b5060145461040a906001600160a01b031681565b3480156106a557600080fd5b506103856106b436600461465b565b61153d565b3480156106c557600080fd5b506104426115c4565b3480156106da57600080fd5b506104426106e9366004614722565b6115fa565b3480156106fa57600080fd5b50610385680448586170a7dc000081565b34801561071757600080fd5b50600b546001600160a01b031661040a565b34801561073557600080fd5b50610442610744366004614601565b6116df565b34801561075557600080fd5b506103dd6117a7565b34801561076a57600080fd5b506103b8610779366004614601565b601a6020526000908152604090205460ff1681565b34801561079a57600080fd5b506103dd6107a9366004614601565b6117b6565b3480156107ba57600080fd5b5061040a6107c9366004614601565b6019602052600090815260409020546001600160a01b031681565b3480156107f057600080fd5b50610385600f5481565b34801561080657600080fd5b506104426108153660046147be565b6118dc565b34801561082657600080fd5b506103dd6108353660046147f1565b6119a0565b34801561084657600080fd5b50610442610855366004614838565b611afa565b34801561086657600080fd5b5060135461040a906001600160a01b031681565b34801561088657600080fd5b50610385610895366004614601565b60186020526000908152604090205481565b3480156108b357600080fd5b50610442611b32565b6104426108ca3660046147a3565b611bc2565b3480156108db57600080fd5b506103dd6108ea366004614601565b611ebf565b3480156108fb57600080fd5b5061044261090a3660046148b4565b6124e2565b61044261091d366004614722565b6128e5565b34801561092e57600080fd5b5061044261093d366004614722565b612d82565b34801561094e57600080fd5b50610385680929589c998104000081565b34801561096b57600080fd5b5061044261097a366004614722565b612e70565b34801561098b57600080fd5b506103b861099a366004614969565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156109d457600080fd5b506104426109e3366004614722565b613081565b3480156109f457600080fd5b506103b8613163565b348015610a0957600080fd5b50610442610a1836600461465b565b6131ff565b348015610a2957600080fd5b50610385681b1ae4d6e2ef50000081565b348015610a4657600080fd5b5061038560115481565b348015610a5c57600080fd5b5060155461040a906001600160a01b031681565b60006001600160e01b0319821663780e9d6360e01b1480610a955750610a958261329a565b92915050565b606060008054610aaa90614993565b80601f0160208091040260200160405190810160405280929190818152602001828054610ad690614993565b8015610b235780601f10610af857610100808354040283529160200191610b23565b820191906000526020600020905b815481529060010190602001808311610b0657829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610bab5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610bd282611440565b9050806001600160a01b0316836001600160a01b031603610c3f5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610ba2565b336001600160a01b0382161480610c5b5750610c5b813361099a565b610ccd5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610ba2565b610cd783836132ea565b505050565b600b546001600160a01b03163314610d065760405162461bcd60e51b8152600401610ba2906149cd565b6016546040516001600160a01b038084169216907fb1cfb37880abd83374e9d3ae318271de8c8cb504dc4a1e73942181bd8545ff8490600090a3601680546001600160a01b0319166001600160a01b0392909216919091179055565b6060601782604051610d749190614a1e565b90815260200160405180910390208054610d8d90614993565b80601f0160208091040260200160405190810160405280929190818152602001828054610db990614993565b8015610e065780601f10610ddb57610100808354040283529160200191610e06565b820191906000526020600020905b815481529060010190602001808311610de957829003601f168201915b50505050509050919050565b600b546001600160a01b03163314610e3c5760405162461bcd60e51b8152600401610ba2906149cd565b60408051808201825260088152675375627469746c6560c01b60208201529051610e669190614a1e565b6040518091039020600080516020615bdf8339815191526017604051806040016040528060088152602001675375627469746c6560c01b815250604051610ead9190614a1e565b908152604051908190036020018120610ec7918590614a3a565b60405180910390a2806017604051806040016040528060088152602001675375627469746c6560c01b815250604051610f009190614a1e565b90815260200160405180910390209081610f1a9190614b27565b5050565b610f283382613358565b610f445760405162461bcd60e51b8152600401610ba290614be7565b610cd783838361344f565b600080610f5a613163565b15610f645750600e545b82610f9557606481600f54610f799190614c4e565b610f839190614c83565b600f54610f909190614c97565b610fee565b6064816005600f54610fa79190614c83565b600f54610fb49190614cae565b610fbe9190614c4e565b610fc89190614c83565b6005600f54610fd79190614c83565b600f54610fe49190614cae565b610fee9190614c97565b9392505050565b60006110008361153d565b82106110625760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610ba2565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600b546001600160a01b031633146110b55760405162461bcd60e51b8152600401610ba2906149cd565b60408051808201825260048152634c6f676f60e01b602082015290516110db9190614a1e565b6040518091039020600080516020615bdf8339815191526017604051806040016040528060048152602001634c6f676f60e01b81525060405161111e9190614a1e565b908152604051908190036020018120611138918590614a3a565b60405180910390a2806017604051806040016040528060048152602001634c6f676f60e01b815250604051610f009190614a1e565b600b546001600160a01b031633146111975760405162461bcd60e51b8152600401610ba2906149cd565b60155460405147916001600160a01b03169082156108fc029083906000818181858888f193505050501580156111d1573d6000803e3d6000fd5b506015546040518281526001600160a01b039091169033907f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb9060200160405180910390a350565b610cd783838360405180602001604052806000815250611afa565b600b546001600160a01b0316331461125e5760405162461bcd60e51b8152600401610ba2906149cd565b600b5460408051808201909152600e81526d135a5b9d1a5b99c81c185d5cd95960921b602082015290600160a01b900460ff16156112af5760405162461bcd60e51b8152600401610ba291906145ee565b5060006112bb60085490565b6112c6906001614cae565b60408051808201909152600881526714dbdb19081bdd5d60c21b60208201529091506101f482111561130b5760405162461bcd60e51b8152600401610ba291906145ee565b50600d544211156040518060400160405280600c81526020016b151a5b5948195e1c1a5c995960a21b815250906113555760405162461bcd60e51b8152600401610ba291906145ee565b5060008181526019602052604080822080546001600160a01b0319163390811790915590519091839183917f32214b91e284b04168d3ae3a57732379781ef5d7f58f389dfb597eaf875ae71391a3610f1a81836135fa565b60006113b860085490565b821061141b5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610ba2565b6008828154811061142e5761142e614cc6565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b031680610a955760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610ba2565b600b546001600160a01b031633146114e15760405162461bcd60e51b8152600401610ba2906149cd565b6015546040516001600160a01b038084169216907f44480e2c785a901cfd7e220e53f3940931d9f14c088297d4316bd5b3c8ae216f90600090a3601580546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b0382166115a85760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610ba2565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b031633146115ee5760405162461bcd60e51b8152600401610ba2906149cd565b6115f86000613614565b565b600b546001600160a01b031633146116245760405162461bcd60e51b8152600401610ba2906149cd565b60408051808201825260058152645469746c6560d81b6020820152905161164b9190614a1e565b6040518091039020600080516020615bdf8339815191526017604051806040016040528060058152602001645469746c6560d81b81525060405161168f9190614a1e565b9081526040519081900360200181206116a9918590614a3a565b60405180910390a2806017604051806040016040528060058152602001645469746c6560d81b815250604051610f009190614a1e565b600b546001600160a01b031633146117095760405162461bcd60e51b8152600401610ba2906149cd565b60008111801561171a575060648111155b6040518060400160405280601a81526020017f496e736572742076616c7565206265747765656e20312d3130300000000000008152509061176e5760405162461bcd60e51b8152600401610ba291906145ee565b506040518181527f45371c66fc311cc069e45674ea6b242593b9e0ae2f1ede40fa07c44f7dc499059060200160405180910390a1600e55565b606060018054610aaa90614993565b6060816000036117df5750506040805180820190915260038152620302e360ec1b602082015290565b60006117fb6117f6670de0b6b3a764000085614c83565b613666565b60405160200161180b9190614a1e565b60408051601f19818403018152919052905060006118346117f6670de0b6b3a764000086614cdc565b6040516020016118449190614a1e565b60405160208183030381529060405290506000815160126118659190614c97565b905060005b818110156118a757826040516020016118839190614cf0565b6040516020818303038152906040529250808061189f90614d19565b91505061186a565b836118b184613767565b6040516020016118c2929190614d32565b604051602081830303815290604052945050505050919050565b336001600160a01b038316036119345760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610ba2565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60608160006119b0856001614cae565b67ffffffffffffffff8111156119c8576119c8614676565b6040519080825280601f01601f1916602001820160405280156119f2576020820181803683370190505b5090506000805b86811015611ac157838181518110611a1357611a13614cc6565b01602001516001600160f81b03191615611a7257838181518110611a3957611a39614cc6565b602001015160f81c60f81b838381518110611a5657611a56614cc6565b60200101906001600160f81b031916908160001a905350611aa1565b603060f81b838381518110611a8957611a89614cc6565b60200101906001600160f81b031916908160001a9053505b81611aab81614d19565b9250508080611ab990614d19565b9150506119f9565b50603060f81b828781518110611ad957611ad9614cc6565b60200101906001600160f81b031916908160001a9053509095945050505050565b611b043383613358565b611b205760405162461bcd60e51b8152600401610ba290614be7565b611b2c8484848461379b565b50505050565b600b546001600160a01b03163314611b5c5760405162461bcd60e51b8152600401610ba2906149cd565b600b805460ff600160a01b808304821615810260ff60a01b1990931692909217928390556040517f0e2fb031ee032dc02d8011dc50b816eb450cf856abd8261680dac74f72165bd293611bb89390049091161515815260200190565b60405180910390a1565b6002600a5403611c145760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610ba2565b6002600a55600b5460408051808201909152600e81526d135a5b9d1a5b99c81c185d5cd95960921b602082015290600160a01b900460ff1615611c6a5760405162461bcd60e51b8152600401610ba291906145ee565b506000611c7660085490565b611c81906001614cae565b60408051808201909152600881526714dbdb19081bdd5d60c21b60208201529091506101f4821115611cc65760405162461bcd60e51b8152600401610ba291906145ee565b50600d544211156040518060400160405280600c81526020016b151a5b5948195e1c1a5c995960a21b81525090611d105760405162461bcd60e51b8152600401610ba291906145ee565b506040805180820190915260178152764861636b206661696c6564212054727920616761696e2160481b60208201523390328214611d615760405162461bcd60e51b8152600401610ba291906145ee565b5034611d6c84610f4f565b811460405180604001604052806014815260200173115e1858dd081d985b1d59481c995c5d5a5c995960621b81525090611db95760405162461bcd60e51b8152600401610ba291906145ee565b5060008381526018602090815260408083208490556019825280832080546001600160a01b0319166001600160a01b038716179055601a9091529020805460ff1916851515179055600c54600a90611e23680448586170a7dc0000680929589c9981040000614c97565b611e2d9190614c97565b611e379190614c83565b600c6000828254611e489190614cae565b9091555050600c54611e6390680448586170a7dc0000614cae565b600f556040518181528415159084906001600160a01b038516907f4eb8dd6030fc6472539f7a048646b8b2c1887684c1d6899752bfc95e024880b19060200160405180910390a4611eb482846135fa565b50506001600a555050565b6060611eca60085490565b8211156040518060400160405280601f81526020017f53656c656374656420746f6b656e496420646f6573206e6f742065786973740081525090611f215760405162461bcd60e51b8152600401610ba291906145ee565b506000604051806040016040528060018152602001602360f81b815250611f4784613666565b604051602001611f58929190614d6e565b6040516020818303038152906040529050611f71614522565b604051602001612189907f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323081527f30302f73766722207072657365727665417370656374526174696f3d22784d6960208201527f6e594d696e206d656574222076696577426f783d22302030203335302033353060408201527f223e3c7374796c653e2e61207b2066696c6c3a77686974653b20666f6e743a2060608201527f626f6c6420323070782073616e732d73657269663b207d202e62207b2066696c60808201527f6c3a77686974653b20666f6e743a20313270782073616e732d73657269663b2060a08201527f7d202e63207b2066696c6c3a77686974653b20666f6e743a20626f6c6420313660c08201527f70782073616e732d73657269663b207d202e64207b2066696c6c3a776869746560e08201527f3b20666f6e743a20626f6c6420313470782073616e732d73657269663b207d206101008201527f2e65207b2066696c6c3a77686974653b20666f6e743a20313270782073616e736101208201527f2d73657269663b207d202e66207b2066696c6c3a77686974653b20666f6e743a6101408201527f203870782073616e732d73657269663b207d3c2f7374796c653e203c726563746101608201527f2077696474683d223130302522206865696768743d2231303025222066696c6c6101808201526c1e91119a191c1ab31a1110179f60991b6101a08201526101ad0190565b60408051808303601f190181529181529082528051808201825260058152645469746c6560d81b602082015290516017916121c391614a1e565b90815260200160405180910390206017604051806040016040528060088152602001675375627469746c6560c01b8152506040516122019190614a1e565b90815260200160405180910390208360405160200161222293929190614e10565b60408051808303601f190181529181526020808401929092528051808201825260088152672637b1b0ba34b7b760c11b928101929092525160179161226691614a1e565b9081526020016040518091039020601760405180604001604052806009815260200168446174655f6c6f6e6760b81b8152506040516122a59190614a1e565b908152602001604051809103902060176040518060400160405280600481526020016354696d6560e01b8152506040516122df9190614a1e565b908152602001604051809103902060176040518060400160405280600c81526020016b53706f6e736f725f6c6f6e6760a01b8152506040516123219190614a1e565b90815260200160405180910390206040516020016123429493929190614f45565b60408051808303601f190181529181528281019190915260008581526018602052205461236e906117b6565b60008581526019602052604090205461238f906001600160a01b03166137ce565b6040516020016123a0929190615075565b60408051808303601f1901815291815260608301919091528051808201825260078152666372656469747360c81b602082015290516017916123e191614a1e565b90815260200160405180910390206017604051806040016040528060048152602001634c6f676f60e01b81525060405161241b9190614a1e565b908152602001604051809103902060405160200161243a9291906151c1565b60408051808303601f190181529181526080830182905282516020808501518584015160608701519451600096612478969394929392909101615243565b604051602081830303815290604052905060006124cf61249787613666565b6124a084613915565b6124a989613a7f565b6040516020016124bb939291906152ae565b604051602081830303815290604052613915565b9050806040516020016118c2919061549c565b600b546001600160a01b0316331461250c5760405162461bcd60e51b8152600401610ba2906149cd565b8451156125e75760408051808201825260048152634461746560e01b602082015290516125399190614a1e565b6040518091039020600080516020615bdf8339815191526017604051806040016040528060048152602001634461746560e01b81525060405161257c9190614a1e565b908152604051908190036020018120612596918990614a3a565b60405180910390a2846017604051806040016040528060048152602001634461746560e01b8152506040516125cb9190614a1e565b908152602001604051809103902090816125e59190614b27565b505b8351156126d1576040805180820182526009815268446174655f6c6f6e6760b81b602082015290516126199190614a1e565b6040518091039020600080516020615bdf833981519152601760405180604001604052806009815260200168446174655f6c6f6e6760b81b8152506040516126619190614a1e565b90815260405190819003602001812061267b918890614a3a565b60405180910390a283601760405180604001604052806009815260200168446174655f6c6f6e6760b81b8152506040516126b59190614a1e565b908152602001604051809103902090816126cf9190614b27565b505b8251156127ac57604080518082018252600481526354696d6560e01b602082015290516126fe9190614a1e565b6040518091039020600080516020615bdf83398151915260176040518060400160405280600481526020016354696d6560e01b8152506040516127419190614a1e565b90815260405190819003602001812061275b918790614a3a565b60405180910390a28260176040518060400160405280600481526020016354696d6560e01b8152506040516127909190614a1e565b908152602001604051809103902090816127aa9190614b27565b505b81511561289657604080518082018252600981526854696d655f6c6f6e6760b81b602082015290516127de9190614a1e565b6040518091039020600080516020615bdf83398151915260176040518060400160405280600981526020016854696d655f6c6f6e6760b81b8152506040516128269190614a1e565b908152604051908190036020018120612840918690614a3a565b60405180910390a28160176040518060400160405280600981526020016854696d655f6c6f6e6760b81b81525060405161287a9190614a1e565b908152602001604051809103902090816128949190614b27565b505b80156128de57600d5460408051918252602082018390527f9aa6fad74a092697838e399f30ea908478bb2747b84bedf64798609770f44587910160405180910390a1600d8190555b5050505050565b6002600a54036129375760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610ba2565b6002600a55600b5460408051808201909152600e81526d135a5b9d1a5b99c81c185d5cd95960921b602082015290600160a01b900460ff161561298d5760405162461bcd60e51b8152600401610ba291906145ee565b50600d544211156040518060400160405280600c81526020016b151a5b5948195e1c1a5c995960a21b815250906129d75760405162461bcd60e51b8152600401610ba291906145ee565b506040805180820190915260178152764861636b206661696c6564212054727920616761696e2160481b60208201523390328214612a285760405162461bcd60e51b8152600401610ba291906145ee565b50601054341460405180604001604052806014815260200173115e1858dd081d985b1d59481c995c5d5a5c995960621b81525090612a795760405162461bcd60e51b8152600401610ba291906145ee565b5081518015801590612a8c575060208111155b6040518060400160405280601f81526020017f546f6f206d616e792063686172732c206f7220656d70747920737472696e670081525090612ae05760405162461bcd60e51b8152600401610ba291906145ee565b50612aea83613eb9565b604051806060016040528060278152602001615b286027913990612b215760405162461bcd60e51b8152600401610ba291906145ee565b508260176040518060400160405280600781526020016629b837b739b7b960c91b815250604051612b529190614a1e565b90815260200160405180910390209081612b6c9190614b27565b5060405180604001604052806009815260200168029a827a729a7a91d160bd1b81525083604051602001612ba1929190614d6e565b60408051601f198184030181528282018252600c83526b53706f6e736f725f6c6f6e6760a01b602084015290519091601791612bdd9190614a1e565b90815260200160405180910390209081612bf79190614b27565b5060148054601380546001600160a01b038084166001600160a01b0319928316179092556012805460115592169085161790915560105490819055600a90612c4090600c614c4e565b612c4a9190614c83565b60105560115415612d34576013546011546040516000926001600160a01b031691908381818185875af1925050503d8060008114612ca4576040519150601f19603f3d011682016040523d82523d6000602084013e612ca9565b606091505b5050905080604051806040016040528060078152602001664661696c75726560c81b81525090612cec5760405162461bcd60e51b8152600401610ba291906145ee565b506013546011546040519081526001600160a01b03909116907fd7dee2702d63ad89917b6a4da9981c90c4d24f8c2bdfd64c604ecae57d8d06519060200160405180910390a2505b601254826001600160a01b03167f713c4f871914d861d411c51e368db4ea6817f8dac2bcc26949e3576fc2550b8785604051612d7091906145ee565b60405180910390a350506001600a5550565b600b546001600160a01b03163314612dac5760405162461bcd60e51b8152600401610ba2906149cd565b60408051808201825260088152672637b1b0ba34b7b760c11b60208201529051612dd69190614a1e565b6040518091039020600080516020615bdf8339815191526017604051806040016040528060088152602001672637b1b0ba34b7b760c11b815250604051612e1d9190614a1e565b908152604051908190036020018120612e37918590614a3a565b60405180910390a2806017604051806040016040528060088152602001672637b1b0ba34b7b760c11b815250604051610f009190614a1e565b600b546001600160a01b03163314612e9a5760405162461bcd60e51b8152600401610ba2906149cd565b604080518082018252600781526629b837b739b7b960c91b60208201529051612ec39190614a1e565b6040518091039020600080516020615bdf83398151915260176040518060400160405280600781526020016629b837b739b7b960c91b815250604051612f099190614a1e565b908152604051908190036020018120612f23918590614a3a565b60405180910390a2604080518082018252600c81526b53706f6e736f725f6c6f6e6760a01b60208201529051612f599190614a1e565b6040518091039020600080516020615bdf83398151915260176040518060400160405280600c81526020016b53706f6e736f725f6c6f6e6760a01b815250604051612fa49190614a1e565b908152604051908190036020018120612fbe918590614a3a565b60405180910390a28060176040518060400160405280600781526020016629b837b739b7b960c91b815250604051612ff69190614a1e565b908152602001604051809103902090816130109190614b27565b5060405180604001604052806009815260200168029a827a729a7a91d160bd1b81525081604051602001613045929190614d6e565b60408051601f198184030181528282018252600c83526b53706f6e736f725f6c6f6e6760a01b602084015290519091601791610f009190614a1e565b600b546001600160a01b031633146130ab5760405162461bcd60e51b8152600401610ba2906149cd565b60408051808201825260048152634369747960e01b602082015290516130d19190614a1e565b6040518091039020600080516020615bdf8339815191526017604051806040016040528060048152602001634369747960e01b8152506040516131149190614a1e565b90815260405190819003602001812061312e918590614a3a565b60405180910390a2806017604051806040016040528060048152602001634369747960e01b815250604051610f009190614a1e565b6016546000906001600160a01b0316158015906131fa57506016546000906001600160a01b03166370a08231336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa1580156131d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131f891906154e1565b115b905090565b600b546001600160a01b031633146132295760405162461bcd60e51b8152600401610ba2906149cd565b6001600160a01b03811661328e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ba2565b61329781613614565b50565b60006001600160e01b031982166380ac58cd60e01b14806132cb57506001600160e01b03198216635b5e139f60e01b145b80610a9557506301ffc9a760e01b6001600160e01b0319831614610a95565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061331f82611440565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166133d15760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610ba2565b60006133dc83611440565b9050806001600160a01b0316846001600160a01b031614806134175750836001600160a01b031661340c84610b2d565b6001600160a01b0316145b8061344757506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661346282611440565b6001600160a01b0316146134ca5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610ba2565b6001600160a01b03821661352c5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610ba2565b613537838383613fa7565b6135426000826132ea565b6001600160a01b038316600090815260036020526040812080546001929061356b908490614c97565b90915550506001600160a01b0382166000908152600360205260408120805460019290613599908490614cae565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610f1a82826040518060200160405280600081525061405f565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60608160000361368d5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156136b757806136a181614d19565b91506136b09050600a83614c83565b9150613691565b60008167ffffffffffffffff8111156136d2576136d2614676565b6040519080825280601f01601f1916602001820160405280156136fc576020820181803683370190505b5090505b841561344757613711600183614c97565b915061371e600a86614cdc565b613729906030614cae565b60f81b81838151811061373e5761373e614cc6565b60200101906001600160f81b031916908160001a905350613760600a86614c83565b9450613700565b6060600061377483614092565b61377f906012614c97565b90508251811115613791575090919050565b610fee81846119a0565b6137a684848461344f565b6137b284848484614108565b611b2c5760405162461bcd60e51b8152600401610ba2906154fa565b60408051602880825260608281019093526000919060208201818036833701905050905060005b601481101561390e57600061380b826013614c97565b613816906008614c4e565b613821906002615630565b613834906001600160a01b038716614c83565b60f81b9050600060108260f81c61384b919061563c565b60f81b905060008160f81c6010613862919061565e565b8360f81c613870919061567f565b60f81b905061387e82614209565b8561388a866002614c4e565b8151811061389a5761389a614cc6565b60200101906001600160f81b031916908160001a9053506138ba81614209565b856138c6866002614c4e565b6138d1906001614cae565b815181106138e1576138e1614cc6565b60200101906001600160f81b031916908160001a905350505050808061390690614d19565b9150506137f5565b5092915050565b80516060906000819003613939575050604080516020810190915260008152919050565b60006003613948836002614cae565b6139529190614c83565b61395d906004614c4e565b9050600061396c826020614cae565b67ffffffffffffffff81111561398457613984614676565b6040519080825280601f01601f1916602001820160405280156139ae576020820181803683370190505b5090506000604051806060016040528060408152602001615b9f604091399050600181016020830160005b86811015613a3a576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b8352600490920191016139d9565b506003860660018114613a545760028114613a6557613a71565b613d3d60f01b600119830152613a71565b603d60f81b6000198301525b505050918152949350505050565b6000818152601a60205260408120546060919060ff16613abf576040518060400160405280600881526020016714dd185b99185c9960c21b815250613ae0565b60405180604001604052806007815260200166041697264726f760cc1b8152505b9050613aea614549565b613af384613666565b604051806040016040528060058152602001645469746c6560d81b8152506017604051806040016040528060058152602001645469746c6560d81b815250604051613b3e9190614a1e565b9081526020016040518091039020604051806040016040528060088152602001675375627469746c6560c01b8152506017604051806040016040528060088152602001675375627469746c6560c01b815250604051613b9d9190614a1e565b9081526020016040518091039020604051806040016040528060048152602001634369747960e01b8152506017604051806040016040528060048152602001634369747960e01b815250604051613bf49190614a1e565b9081526020016040518091039020604051602001613c1897969594939291906156a2565b60408051808303601f19018152918152908252805180820182526008808252672637b1b0ba34b7b760c11b60208381018290528451808601865292835282015291519091601791613c699190614a1e565b9081526020016040518091039020604051806040016040528060048152602001634461746560e01b8152506017604051806040016040528060048152602001634461746560e01b815250604051613cc09190614a1e565b90815260200160405180910390206040518060400160405280600481526020016354696d6560e01b81525060176040518060400160405280600481526020016354696d6560e01b815250604051613d179190614a1e565b9081526040805160209281900383018120818301835260048252635479706560e01b848301529151613d509897969594938b91016157f4565b60408051808303601f1901815291815260208084019290925260008681526019909252902054613d88906001600160a01b03166137ce565b6040518060400160405280600781526020016629b837b739b7b960c91b81525060176040518060400160405280600781526020016629b837b739b7b960c91b815250604051613dd79190614a1e565b9081526020016040518091039020613e016018600089815260200190815260200160002054613666565b604051806040016040528060078152602001666372656469747360c81b8152506017604051806040016040528060078152602001666372656469747360c81b815250604051613e509190614a1e565b9081526020016040518091039020604051602001613e73969594939291906158fa565b60408051808303601f1901815291815282810182905282516020808501519251613ea1949293929101615a23565b60405160208183030381529060405292505050919050565b60408051608081019091526050808252600091829184918391615b4f602083013990506000805b83518160ff161015613f93576000915060005b83518160ff16108015613f04575082155b15613f8057838160ff1681518110613f1e57613f1e614cc6565b602001015160f81c60f81b6001600160f81b031916858360ff1681518110613f4857613f48614cc6565b01602001516001600160f81b03191603613f6e5785613f6681615a66565b965050600192505b80613f7881615a66565b915050613ef3565b5080613f8b81615a66565b915050613ee0565b5082518460ff161015945050505050919050565b6001600160a01b03831661400257613ffd81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b614025565b816001600160a01b0316836001600160a01b031614614025576140258382614244565b6001600160a01b03821661403c57610cd7816142e1565b826001600160a01b0316826001600160a01b031614610cd757610cd78282614390565b61406983836143d4565b6140766000848484614108565b610cd75760405162461bcd60e51b8152600401610ba2906154fa565b600080829050600080600183516140a99190614c97565b90505b8281815181106140be576140be614cc6565b01602001516001600160f81b031916600360fc1b036140e957816140e181614d19565b9250506140ee565b614100565b806140f881615a85565b9150506140ac565b509392505050565b60006001600160a01b0384163b156141fe57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061414c903390899088908890600401615a9c565b6020604051808303816000875af1925050508015614187575060408051601f3d908101601f1916820190925261418491810190615acf565b60015b6141e4573d8080156141b5576040519150601f19603f3d011682016040523d82523d6000602084013e6141ba565b606091505b5080516000036141dc5760405162461bcd60e51b8152600401610ba2906154fa565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050613447565b506001949350505050565b6000600a60f883901c10156142305761422760f883901c6030615aec565b60f81b92915050565b61422760f883901c6057615aec565b919050565b600060016142518461153d565b61425b9190614c97565b6000838152600760205260409020549091508082146142ae576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906142f390600190614c97565b6000838152600960205260408120546008805493945090928490811061431b5761431b614cc6565b90600052602060002001549050806008838154811061433c5761433c614cc6565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061437457614374615b11565b6001900381819060005260206000200160009055905550505050565b600061439b8361153d565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b03821661442a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610ba2565b6000818152600260205260409020546001600160a01b03161561448f5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610ba2565b61449b60008383613fa7565b6001600160a01b03821660009081526003602052604081208054600192906144c4908490614cae565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6040518060a001604052806005905b60608152602001906001900390816145315790505090565b604080516060808201909252908152600260208201614531565b6001600160e01b03198116811461329757600080fd5b60006020828403121561458b57600080fd5b8135610fee81614563565b60005b838110156145b1578181015183820152602001614599565b83811115611b2c5750506000910152565b600081518084526145da816020860160208601614596565b601f01601f19169290920160200192915050565b602081526000610fee60208301846145c2565b60006020828403121561461357600080fd5b5035919050565b80356001600160a01b038116811461423f57600080fd5b6000806040838503121561464457600080fd5b61464d8361461a565b946020939093013593505050565b60006020828403121561466d57600080fd5b610fee8261461a565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156146a7576146a7614676565b604051601f8501601f19908116603f011681019082821181831017156146cf576146cf614676565b816040528093508581528686860111156146e857600080fd5b858560208301376000602087830101525050509392505050565b600082601f83011261471357600080fd5b610fee8383356020850161468c565b60006020828403121561473457600080fd5b813567ffffffffffffffff81111561474b57600080fd5b61344784828501614702565b60008060006060848603121561476c57600080fd5b6147758461461a565b92506147836020850161461a565b9150604084013590509250925092565b8035801515811461423f57600080fd5b6000602082840312156147b557600080fd5b610fee82614793565b600080604083850312156147d157600080fd5b6147da8361461a565b91506147e860208401614793565b90509250929050565b6000806040838503121561480457600080fd5b82359150602083013567ffffffffffffffff81111561482257600080fd5b61482e85828601614702565b9150509250929050565b6000806000806080858703121561484e57600080fd5b6148578561461a565b93506148656020860161461a565b925060408501359150606085013567ffffffffffffffff81111561488857600080fd5b8501601f8101871361489957600080fd5b6148a88782356020840161468c565b91505092959194509250565b600080600080600060a086880312156148cc57600080fd5b853567ffffffffffffffff808211156148e457600080fd5b6148f089838a01614702565b9650602088013591508082111561490657600080fd5b61491289838a01614702565b9550604088013591508082111561492857600080fd5b61493489838a01614702565b9450606088013591508082111561494a57600080fd5b5061495788828901614702565b95989497509295608001359392505050565b6000806040838503121561497c57600080fd5b6149858361461a565b91506147e86020840161461a565b600181811c908216806149a757607f821691505b6020821081036149c757634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008151614a14818560208601614596565b9290920192915050565b60008251614a30818460208701614596565b9190910192915050565b604081526000808454614a4c81614993565b8060408601526060600180841660008114614a6e5760018114614a8857614ab9565b60ff1985168884015283151560051b880183019550614ab9565b8960005260208060002060005b86811015614ab05781548b8201870152908401908201614a95565b8a018501975050505b50505050508281036020840152614ad081856145c2565b95945050505050565b601f821115610cd757600081815260208120601f850160051c81016020861015614b005750805b601f850160051c820191505b81811015614b1f57828155600101614b0c565b505050505050565b815167ffffffffffffffff811115614b4157614b41614676565b614b5581614b4f8454614993565b84614ad9565b602080601f831160018114614b8a5760008415614b725750858301515b600019600386901b1c1916600185901b178555614b1f565b600085815260208120601f198616915b82811015614bb957888601518255948401946001909101908401614b9a565b5085821015614bd75787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615614c6857614c68614c38565b500290565b634e487b7160e01b600052601260045260246000fd5b600082614c9257614c92614c6d565b500490565b600082821015614ca957614ca9614c38565b500390565b60008219821115614cc157614cc1614c38565b500190565b634e487b7160e01b600052603260045260246000fd5b600082614ceb57614ceb614c6d565b500690565b600360fc1b815260008251614d0c816001850160208701614596565b9190910160010192915050565b600060018201614d2b57614d2b614c38565b5060010190565b60008351614d44818460208801614596565b601760f91b9083019081528351614d62816001840160208801614596565b01600101949350505050565b60008351614d80818460208801614596565b835190830190614d94818360208801614596565b01949350505050565b60008154614daa81614993565b60018281168015614dc25760018114614dd757614e06565b60ff1984168752821515830287019450614e06565b8560005260208060002060005b85811015614dfd5781548a820152908401908201614de4565b50505082870194505b5050505092915050565b7f3c7465787420636c6173733d22612220783d223137352220793d2234302220208152753a32bc3a16b0b731b437b91e9136b4b232363291101f60511b60208201526000614e616036830186614d9d565b7f3c2f746578743e3c7465787420636c6173733d22622220783d2231373522207981527f3d223630222020746578742d616e63686f723d226d6964646c6522203e0000006020820152614eb7603d820186614d9d565b90507f3c2f746578743e3c7465787420783d223137352220793d22393022207465787481527f2d616e63686f723d226d6964646c652220636c6173733d2263223e4e46542054602082015265024a1a5a2aa160d51b60408201528351614f24816046840160208801614596565b661e17ba32bc3a1f60c91b60469290910191820152604d0195945050505050565b7f3c7465787420783d223137352220793d223133302220746578742d616e63686f815274391e9136b4b2323632911031b630b9b99e9132111f60591b60208201526000614f956035830187614d9d565b7f3c2f746578743e3c7465787420783d223137352220793d22313530222074657881527f742d616e63686f723d226d6964646c652220636c6173733d2264223e000000006020820152614feb603c820187614d9d565b905061040560f31b81526150026002820186614d9d565b90507f293c2f746578743e3c7465787420783d223137352220793d223139302220636c81527f6173733d22642220746578742d616e63686f723d226d6964646c6522203e0000602082015261505a603e820185614d9d565b661e17ba32bc3a1f60c91b8152600701979650505050505050565b7f3c7465787420783d223137352220793d223233302220746578742d616e63686f81527f723d226d6964646c652220636c6173733d2264223e44796e616d696320707269602082015268031b29d101222aa24160bd1b6040820152600083516150e5816049850160208801614596565b7f3c2f746578743e3c7465787420783d223137352220793d2233303522207465786049918401918201527f742d616e63686f723d226d6964646c652220636c6173733d2265223e6d696e7460698201527f65642062793a3c2f746578743e3c7465787420783d223137352220793d22333260898201527f302220746578742d616e63686f723d226d6964646c652220636c6173733d226560a9820152630447c60f60e31b60c982015283516151a18160cd840160208801614596565b661e17ba32bc3a1f60c91b60cd929091019182015260d401949350505050565b7f3c7465787420783d223137352220793d223334302220746578742d616e63686f815274391e9136b4b2323632911031b630b9b99e9133111f60591b602082015260006152116035830185614d9d565b661e17ba32bc3a1f60c91b815261522b6007820185614d9d565b651e17b9bb339f60d11b815260060195945050505050565b60008651615255818460208b01614596565b865190830190615269818360208b01614596565b865191019061527c818360208a01614596565b855191019061528f818360208901614596565b84519101906152a2818360208801614596565b01979650505050505050565b717b226e616d65223a20225469636b6574202360701b815283516000906152dc816012850160208901614596565b7f222c20226465736372697074696f6e223a20224e4654207469636b657420666f6012918401918201527f72202d5745423320494e2054524156454c2d2042617263656c6f6e612c20313560328201527f7468206f66204d617920323032332e205468652066697273742074726176656c60528201527f20636f6e666572656e63652064656469636174656420746f207468652074726160728201527f6e736974696f6e20746f20576562332c20326e642065646974696f6e2e20537060928201527f6565636865732c2070616e656c7320616e64206e6574776f726b696e6720746f60b28201527f2068656c702074686520696e647573747279207570677261646520746f20746860d28201527f65206e6577205765622e2068747470733a2f2f77656233696e74726176656c2e60f28201527f636f6d222c2022696d616765223a2022646174613a696d6167652f7376672b78610112820152691b5b0ed8985cd94d8d0b60b21b61013282015261549261548461547e61546261013c850189614a02565b6f222c2261747472696275746573223a5b60801b815260100190565b86614a02565b615d7d60f01b815260020190565b9695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516154d481601d850160208701614596565b91909101601d0192915050565b6000602082840312156154f357600080fd5b5051919050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600181815b8085111561558757816000190482111561556d5761556d614c38565b8085161561557a57918102915b93841c9390800290615551565b509250929050565b60008261559e57506001610a95565b816155ab57506000610a95565b81600181146155c157600281146155cb576155e7565b6001915050610a95565b60ff8411156155dc576155dc614c38565b50506001821b610a95565b5060208310610133831016604e8410600b841016171561560a575081810a610a95565b615614838361554c565b806000190482111561562857615628614c38565b029392505050565b6000610fee838361558f565b600060ff83168061564f5761564f614c6d565b8060ff84160491505092915050565b600060ff821660ff84168160ff048111821515161561562857615628614c38565b600060ff821660ff84168082101561569957615699614c38565b90039392505050565b7f7b2274726169745f74797065223a226964222c2276616c7565223a22000000008152600088516156da81601c850160208d01614596565b62089f4b60ea1b601c9184019182018190526e3d913a3930b4ba2fba3cb832911d1160891b601f83018190528a5161571981602e860160208f01614596565b6a1116113b30b63ab2911d1160a91b602e949091019384015261573f603984018b614d9d565b9182526003820152875190915061575d816012840160208b01614596565b6157e56157986157df6157c86157c26157a76157986157926012898b01016a1116113b30b63ab2911d1160a91b8152600b0190565b8e614d9d565b62089f4b60ea1b815260030190565b6e3d913a3930b4ba2fba3cb832911d1160891b8152600f0190565b8a614a02565b6a1116113b30b63ab2911d1160a91b8152600b0190565b87614d9d565b9b9a5050505050505050505050565b60006e3d913a3930b4ba2fba3cb832911d1160891b8083528a5161581f81600f860160208f01614596565b6a1116113b30b63ab2911d1160a91b600f8286010152615844601a828601018c614d9d565b905062089f4b60ea1b8082528260038301528a51615869816012850160208f01614596565b6a1116113b30b63ab2911d1160a91b6012828501015261588e601d828501018c614d9d565b918252506003810192909252508651906158af826012830160208b01614596565b6158ea6157986158e46157c86157c26157a761579861579260128a8a01016a1116113b30b63ab2911d1160a91b8152600b0190565b87614a02565b9c9b505050505050505050505050565b7f7b2274726169745f74797065223a224d696e746564206279222c2276616c7565815262111d1160e91b60208201526000875161593e816023850160208c01614596565b62089f4b60ea1b60239184019182018190526e3d913a3930b4ba2fba3cb832911d1160891b6026830152885161597b816035850160208d01614596565b6a1116113b30b63ab2911d1160a91b603593909101928301526159a16040830189614d9d565b9150808252507f7b2274726169745f74797065223a225072696365222c2276616c7565223a2200600382015285516159e0816022840160208a01614596565b615a15615a076157df6157c86157c26157a760228789010162089f4b60ea1b815260030190565b61227d60f01b815260020190565b9a9950505050505050505050565b60008451615a35818460208901614596565b845190830190615a49818360208901614596565b8451910190615a5c818360208801614596565b0195945050505050565b600060ff821660ff8103615a7c57615a7c614c38565b60010192915050565b600081615a9457615a94614c38565b506000190190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090615492908301846145c2565b600060208284031215615ae157600080fd5b8151610fee81614563565b600060ff821660ff84168060ff03821115615b0957615b09614c38565b019392505050565b634e487b7160e01b600052603160045260246000fdfe496e707574206e6f742076616c69642e2052656d6f7665206e6f742076616c69642063686172736162636465666768696a6b6c6d6e6f707172737475767778797a4142434445464748494a4b4c4d4e4f505152535455565758595a303132333435363738395f202e2c3a3b28295b5d7b7d2b2d2a24213f4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f1672b4b5288a80dc27ff066863e214ea755e8fb6b1ac03303442bad815c0ee9ba26469706673582212205cf1494e2388360f7d0cc2de4f2bd311827ca0de92184e9ab26ebd0305c781f364736f6c634300080f0033
Deployed Bytecode Sourcemap
44569:19467:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45010:35;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;45010:35:0;;;;;;;;38351:224;;;;;;;;;;-1:-1:-1;38351:224:0;;;;;:::i;:::-;;:::i;:::-;;;747:14:1;;740:22;722:41;;710:2;695:18;38351:224:0;582:187:1;25465:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;27024:221::-;;;;;;;;;;-1:-1:-1;27024:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1896:32:1;;;1878:51;;1866:2;1851:18;27024:221:0;1732:203:1;26547:411:0;;;;;;;;;;-1:-1:-1;26547:411:0;;;;;:::i;:::-;;:::i;:::-;;58710:203;;;;;;;;;;-1:-1:-1;58710:203:0;;;;;:::i;:::-;;:::i;62551:121::-;;;;;;;;;;-1:-1:-1;62551:121:0;;;;;:::i;:::-;;:::i;45156:29::-;;;;;;;;;;;;;;;;61490:202;;;;;;;;;;-1:-1:-1;61490:202:0;;;;;:::i;:::-;;:::i;44678:35::-;;;;;;;;;;;;44710:3;44678:35;;;;;4065:6:1;4053:19;;;4035:38;;4023:2;4008:18;44678:35:0;3891:188:1;38991:113:0;;;;;;;;;;-1:-1:-1;39079:10:0;:17;38991:113;;27914:339;;;;;;;;;;-1:-1:-1;27914:339:0;;;;;:::i;:::-;;:::i;50797:334::-;;;;;;;;;;-1:-1:-1;50797:334:0;;;;;:::i;:::-;;:::i;38659:256::-;;;;;;;;;;-1:-1:-1;38659:256:0;;;;;:::i;:::-;;:::i;61119:174::-;;;;;;;;;;-1:-1:-1;61119:174:0;;;;;:::i;:::-;;:::i;58342:197::-;;;;;;;;;;;;;:::i;28324:185::-;;;;;;;;;;-1:-1:-1;28324:185:0;;;;;:::i;:::-;;:::i;49317:429::-;;;;;;;;;;;;;:::i;39181:233::-;;;;;;;;;;-1:-1:-1;39181:233:0;;;;;:::i;:::-;;:::i;45079:31::-;;;;;;;;;;;;;;;;44653:18;;;;;;;;;;-1:-1:-1;44653:18:0;;;;-1:-1:-1;;;44653:18:0;;;;;;45298:36;;;;;;;;;;-1:-1:-1;45298:36:0;;;;-1:-1:-1;;;;;45298:36:0;;;25159:239;;;;;;;;;;-1:-1:-1;25159:239:0;;;;;:::i;:::-;;:::i;58547:155::-;;;;;;;;;;-1:-1:-1;58547:155:0;;;;;:::i;:::-;;:::i;45231:29::-;;;;;;;;;;-1:-1:-1;45231:29:0;;;;-1:-1:-1;;;;;45231:29:0;;;24889:208;;;;;;;;;;-1:-1:-1;24889:208:0;;;;;:::i;:::-;;:::i;9857:94::-;;;;;;;;;;;;;:::i;61301:181::-;;;;;;;;;;-1:-1:-1;61301:181:0;;;;;:::i;:::-;;:::i;44720:65::-;;;;;;;;;;;;44761:24;44720:65;;9206:87;;;;;;;;;;-1:-1:-1;9279:6:0;;-1:-1:-1;;;;;9279:6:0;9206:87;;59418:228;;;;;;;;;;-1:-1:-1;59418:228:0;;;;;:::i;:::-;;:::i;25634:104::-;;;;;;;;;;;;;:::i;47150:39::-;;;;;;;;;;-1:-1:-1;47150:39:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;53609:603;;;;;;;;;;-1:-1:-1;53609:603:0;;;;;:::i;:::-;;:::i;47100:43::-;;;;;;;;;;-1:-1:-1;47100:43:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;47100:43:0;;;45052:20;;;;;;;;;;;;;;;;27317:295;;;;;;;;;;-1:-1:-1;27317:295:0;;;;;:::i;:::-;;:::i;52337:576::-;;;;;;;;;;-1:-1:-1;52337:576:0;;;;;:::i;:::-;;:::i;28580:328::-;;;;;;;;;;-1:-1:-1;28580:328:0;;;;;:::i;:::-;;:::i;45192:32::-;;;;;;;;;;-1:-1:-1;45192:32:0;;;;-1:-1:-1;;;;;45192:32:0;;;47052:41;;;;;;;;;;-1:-1:-1;47052:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;59303:107;;;;;;;;;;;;;:::i;49754:844::-;;;;;;:::i;:::-;;:::i;54220:2630::-;;;;;;;;;;-1:-1:-1;54220:2630:0;;;;;:::i;:::-;;:::i;59654:1013::-;;;;;;;;;;-1:-1:-1;59654:1013:0;;;;;:::i;:::-;;:::i;51139:1190::-;;;;;;:::i;:::-;;:::i;60675:254::-;;;;;;;;;;-1:-1:-1;60675:254:0;;;;;:::i;:::-;;:::i;44792:61::-;;;;;;;;;;;;44828:25;44792:61;;58921:374;;;;;;;;;;-1:-1:-1;58921:374:0;;;;;:::i;:::-;;:::i;27683:164::-;;;;;;;;;;-1:-1:-1;27683:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;27804:25:0;;;27780:4;27804:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;27683:164;60937:174;;;;;;;;;;-1:-1:-1;60937:174:0;;;;;:::i;:::-;;:::i;61700:184::-;;;;;;;;;;;;;:::i;10106:192::-;;;;;;;;;;-1:-1:-1;10106:192:0;;;;;:::i;:::-;;:::i;44860:73::-;;;;;;;;;;;;44908:25;44860:73;;45117:32;;;;;;;;;;;;;;;;45267:24;;;;;;;;;;-1:-1:-1;45267:24:0;;;;-1:-1:-1;;;;;45267:24:0;;;38351:224;38453:4;-1:-1:-1;;;;;;38477:50:0;;-1:-1:-1;;;38477:50:0;;:90;;;38531:36;38555:11;38531:23;:36::i;:::-;38470:97;38351:224;-1:-1:-1;;38351:224:0:o;25465:100::-;25519:13;25552:5;25545:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25465:100;:::o;27024:221::-;27100:7;30507:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30507:16:0;27120:73;;;;-1:-1:-1;;;27120:73:0;;7963:2:1;27120:73:0;;;7945:21:1;8002:2;7982:18;;;7975:30;8041:34;8021:18;;;8014:62;-1:-1:-1;;;8092:18:1;;;8085:42;8144:19;;27120:73:0;;;;;;;;;-1:-1:-1;27213:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;27213:24:0;;27024:221::o;26547:411::-;26628:13;26644:23;26659:7;26644:14;:23::i;:::-;26628:39;;26692:5;-1:-1:-1;;;;;26686:11:0;:2;-1:-1:-1;;;;;26686:11:0;;26678:57;;;;-1:-1:-1;;;26678:57:0;;8376:2:1;26678:57:0;;;8358:21:1;8415:2;8395:18;;;8388:30;8454:34;8434:18;;;8427:62;-1:-1:-1;;;8505:18:1;;;8498:31;8546:19;;26678:57:0;8174:397:1;26678:57:0;8146:10;-1:-1:-1;;;;;26770:21:0;;;;:62;;-1:-1:-1;26795:37:0;26812:5;8146:10;27683:164;:::i;26795:37::-;26748:168;;;;-1:-1:-1;;;26748:168:0;;8778:2:1;26748:168:0;;;8760:21:1;8817:2;8797:18;;;8790:30;8856:34;8836:18;;;8829:62;8927:26;8907:18;;;8900:54;8971:19;;26748:168:0;8576:420:1;26748:168:0;26929:21;26938:2;26942:7;26929:8;:21::i;:::-;26617:341;26547:411;;:::o;58710:203::-;9279:6;;-1:-1:-1;;;;;9279:6:0;8146:10;9426:23;9418:68;;;;-1:-1:-1;;;9418:68:0;;;;;;;:::i;:::-;58824:21:::1;::::0;58799:60:::1;::::0;-1:-1:-1;;;;;58799:60:0;;::::1;::::0;58824:21:::1;::::0;58799:60:::1;::::0;58824:21:::1;::::0;58799:60:::1;58870:21;:35:::0;;-1:-1:-1;;;;;;58870:35:0::1;-1:-1:-1::0;;;;;58870:35:0;;;::::1;::::0;;;::::1;::::0;;58710:203::o;62551:121::-;62618:13;62648:7;62656;62648:16;;;;;;:::i;:::-;;;;;;;;;;;;;62641:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62551:121;;;:::o;61490:202::-;9279:6;;-1:-1:-1;;;;;9279:6:0;8146:10;9426:23;9418:68;;;;-1:-1:-1;;;9418:68:0;;;;;;;:::i;:::-;61587:12:::1;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;61587:12:0::1;::::0;::::1;::::0;61573:64;;::::1;::::0;61587:12;61573:64:::1;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;;;;;;;61601:7:0::1;61609:12;;;;;;;;;;;;;-1:-1:-1::0;;;61609:12:0::1;;::::0;61601:21:::1;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;61573:64:::1;::::0;61624:12;;61573:64:::1;:::i;:::-;;;;;;;;61672:12;61648:7;61656:12;;;;;;;;;;;;;-1:-1:-1::0;;;61656:12:0::1;;::::0;61648:21:::1;;;;;;:::i;:::-;;;;;;;;;;;;;:36;;;;;;:::i;:::-;;61490:202:::0;:::o;27914:339::-;28109:41;8146:10;28142:7;28109:18;:41::i;:::-;28101:103;;;;-1:-1:-1;;;28101:103:0;;;;;;;:::i;:::-;28217:28;28227:4;28233:2;28237:7;28217:9;:28::i;50797:334::-;50857:7;;50913:24;:22;:24::i;:::-;50909:87;;;-1:-1:-1;50964:20:0;;50909:87;51013:8;:110;;51120:3;51106:10;51098:5;;:18;;;;:::i;:::-;51097:26;;;;:::i;:::-;51089:5;;:34;;;;:::i;:::-;51013:110;;;51083:3;51069:10;51064:1;51056:5;;:9;;;;:::i;:::-;51048:5;;:17;;;;:::i;:::-;51047:32;;;;:::i;:::-;51046:40;;;;:::i;:::-;51041:1;51033:5;;:9;;;;:::i;:::-;51025:5;;:17;;;;:::i;:::-;51024:62;;;;:::i;:::-;51006:117;50797:334;-1:-1:-1;;;50797:334:0:o;38659:256::-;38756:7;38792:23;38809:5;38792:16;:23::i;:::-;38784:5;:31;38776:87;;;;-1:-1:-1;;;38776:87:0;;14600:2:1;38776:87:0;;;14582:21:1;14639:2;14619:18;;;14612:30;14678:34;14658:18;;;14651:62;-1:-1:-1;;;14729:18:1;;;14722:41;14780:19;;38776:87:0;14398:407:1;38776:87:0;-1:-1:-1;;;;;;38881:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;38659:256::o;61119:174::-;9279:6;;-1:-1:-1;;;;;9279:6:0;8146:10;9426:23;9418:68;;;;-1:-1:-1;;;9418:68:0;;;;;;;:::i;:::-;61208:8:::1;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;61208:8:0::1;::::0;::::1;::::0;61194:52;;::::1;::::0;61208:8;61194:52:::1;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;;;;;;;61218:7:0::1;61226:8;;;;;;;;;;;;;-1:-1:-1::0;;;61226:8:0::1;;::::0;61218:17:::1;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;61194:52:::1;::::0;61237:8;;61194:52:::1;:::i;:::-;;;;;;;;61277:8;61257:7;61265:8;;;;;;;;;;;;;-1:-1:-1::0;;;61265:8:0::1;;::::0;61257:17:::1;;;;;;:::i;58342:197::-:0;9279:6;;-1:-1:-1;;;;;9279:6:0;8146:10;9426:23;9418:68;;;;-1:-1:-1;;;9418:68:0;;;;;;;:::i;:::-;58449:9:::1;::::0;58441:35:::1;::::0;58409:21:::1;::::0;-1:-1:-1;;;;;58449:9:0::1;::::0;58441:35;::::1;;;::::0;58409:21;;58392:14:::1;58441:35:::0;58392:14;58441:35;58409:21;58449:9;58441:35;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;58513:9:0::1;::::0;58492:39:::1;::::0;160:25:1;;;-1:-1:-1;;;;;58513:9:0;;::::1;::::0;58501:10:::1;::::0;58492:39:::1;::::0;148:2:1;133:18;58492:39:0::1;;;;;;;58381:158;58342:197::o:0;28324:185::-;28462:39;28479:4;28485:2;28489:7;28462:39;;;;;;;;;;;;:16;:39::i;49317:429::-;9279:6;;-1:-1:-1;;;;;9279:6:0;8146:10;9426:23;9418:68;;;;-1:-1:-1;;;9418:68:0;;;;;;;:::i;:::-;49380:6:::1;::::0;49388:18:::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;49388:18:0::1;::::0;::::1;::::0;;-1:-1:-1;;;49380:6:0;::::1;;;49379:7;49371:36;;;;-1:-1:-1::0;;;49371:36:0::1;;;;;;;;:::i;:::-;;49418:16;49437:13;39079:10:::0;:17;;38991:113;49437:13:::1;:16;::::0;49452:1:::1;49437:16;:::i;:::-;49492:12;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;49492:12:0::1;::::0;::::1;::::0;49418:35;;-1:-1:-1;44710:3:0::1;49472:18:::0;::::1;;49464:41;;;;-1:-1:-1::0;;;49464:41:0::1;;;;;;;;:::i;:::-;;49543:8;;49524:15;:27;;49553:16;;;;;;;;;;;;;-1:-1:-1::0;;;49553:16:0::1;;::::0;49516:54:::1;;;;;-1:-1:-1::0;;;49516:54:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;49581:15:0::1;49622:18:::0;;;:8:::1;:18;::::0;;;;;:28;;-1:-1:-1;;;;;;49622:28:0::1;8146:10:::0;49622:28;;::::1;::::0;;;49666:33;;8146:10;;49622:18;;8146:10;;49666:33:::1;::::0;::::1;49710:28;49720:7;49729:8;49710:9;:28::i;39181:233::-:0;39256:7;39292:30;39079:10;:17;;38991:113;39292:30;39284:5;:38;39276:95;;;;-1:-1:-1;;;39276:95:0;;15012:2:1;39276:95:0;;;14994:21:1;15051:2;15031:18;;;15024:30;15090:34;15070:18;;;15063:62;-1:-1:-1;;;15141:18:1;;;15134:42;15193:19;;39276:95:0;14810:408:1;39276:95:0;39389:10;39400:5;39389:17;;;;;;;;:::i;:::-;;;;;;;;;39382:24;;39181:233;;;:::o;25159:239::-;25231:7;25267:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25267:16:0;;25294:73;;;;-1:-1:-1;;;25294:73:0;;15557:2:1;25294:73:0;;;15539:21:1;15596:2;15576:18;;;15569:30;15635:34;15615:18;;;15608:62;-1:-1:-1;;;15686:18:1;;;15679:39;15735:19;;25294:73:0;15355:405:1;58547:155:0;9279:6;;-1:-1:-1;;;;;9279:6:0;8146:10;9426:23;9418:68;;;;-1:-1:-1;;;9418:68:0;;;;;;;:::i;:::-;58637:9:::1;::::0;58624:36:::1;::::0;-1:-1:-1;;;;;58624:36:0;;::::1;::::0;58637:9:::1;::::0;58624:36:::1;::::0;58637:9:::1;::::0;58624:36:::1;58671:9;:23:::0;;-1:-1:-1;;;;;;58671:23:0::1;-1:-1:-1::0;;;;;58671:23:0;;;::::1;::::0;;;::::1;::::0;;58547:155::o;24889:208::-;24961:7;-1:-1:-1;;;;;24989:19:0;;24981:74;;;;-1:-1:-1;;;24981:74:0;;15967:2:1;24981:74:0;;;15949:21:1;16006:2;15986:18;;;15979:30;16045:34;16025:18;;;16018:62;-1:-1:-1;;;16096:18:1;;;16089:40;16146:19;;24981:74:0;15765:406:1;24981:74:0;-1:-1:-1;;;;;;25073:16:0;;;;;:9;:16;;;;;;;24889:208::o;9857:94::-;9279:6;;-1:-1:-1;;;;;9279:6:0;8146:10;9426:23;9418:68;;;;-1:-1:-1;;;9418:68:0;;;;;;;:::i;:::-;9922:21:::1;9940:1;9922:9;:21::i;:::-;9857:94::o:0;61301:181::-;9279:6;;-1:-1:-1;;;;;9279:6:0;8146:10;9426:23;9418:68;;;;-1:-1:-1;;;9418:68:0;;;;;;;:::i;:::-;61392:9:::1;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;61392:9:0::1;::::0;::::1;::::0;61378:55;;::::1;::::0;61392:9;61378:55:::1;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;;;;;;;61403:7:0::1;61411:9;;;;;;;;;;;;;-1:-1:-1::0;;;61411:9:0::1;;::::0;61403:18:::1;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;61378:55:::1;::::0;61423:9;;61378:55:::1;:::i;:::-;;;;;;;;61465:9;61444:7;61452:9;;;;;;;;;;;;;-1:-1:-1::0;;;61452:9:0::1;;::::0;61444:18:::1;;;;;;:::i;59418:228::-:0;9279:6;;-1:-1:-1;;;;;9279:6:0;8146:10;9426:23;9418:68;;;;-1:-1:-1;;;9418:68:0;;;;;;;:::i;:::-;59509:1:::1;59501:5;:9;:25;;;;;59523:3;59514:5;:12;;59501:25;59528:22;;;;;;;;;;;;;;;;::::0;59493:58:::1;;;;;-1:-1:-1::0;;;59493:58:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;59565:36:0::1;::::0;160:25:1;;;59565:36:0::1;::::0;148:2:1;133:18;59565:36:0::1;;;;;;;59610:20;:28:::0;59418:228::o;25634:104::-;25690:13;25723:7;25716:14;;;;;:::i;53609:603::-;53677:13;53706:6;53716:1;53706:11;53702:42;;-1:-1:-1;;53732:12:0;;;;;;;;;;;;-1:-1:-1;;;53732:12:0;;;;;53609:603::o;53702:42::-;53757:23;53807:26;53816:16;53825:7;53816:6;:16;:::i;:::-;53807:8;:26::i;:::-;53790:44;;;;;;;;:::i;:::-;;;;-1:-1:-1;;53790:44:0;;;;;;;;;;-1:-1:-1;53846:24:0;53897:26;53906:16;53915:7;53906:6;:16;:::i;53897:26::-;53880:44;;;;;;;;:::i;:::-;;;;;;;;;;;;;53846:79;;53936:11;53961:10;53955:24;53950:2;:29;;;;:::i;:::-;53936:43;;53990:9;54015:114;54026:3;54022:1;:7;54015:114;;;54087:10;54066:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;54046:53;;54114:3;;;;;:::i;:::-;;;;54015:114;;;54172:9;54186:16;54191:10;54186:4;:16::i;:::-;54155:48;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54141:63;;;;;;53609:603;;;:::o;27317:295::-;8146:10;-1:-1:-1;;;;;27420:24:0;;;27412:62;;;;-1:-1:-1;;;27412:62:0;;17677:2:1;27412:62:0;;;17659:21:1;17716:2;17696:18;;;17689:30;17755:27;17735:18;;;17728:55;17800:18;;27412:62:0;17475:349:1;27412:62:0;8146:10;27487:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;27487:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;27487:53:0;;;;;;;;;;27556:48;;722:41:1;;;27487:42:0;;8146:10;27556:48;;695:18:1;27556:48:0;;;;;;;27317:295;;:::o;52337:576::-;52413:13;52468:11;52439:20;52531:7;:3;52537:1;52531:7;:::i;:::-;52521:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52521:18:0;;52491:48;;52550:10;52582:6;52577:252;52598:3;52594:1;:7;52577:252;;;52627:7;52635:1;52627:10;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;52627:10:0;:18;52623:173;;52689:7;52697:1;52689:10;;;;;;;;:::i;:::-;;;;;;;;;52665:14;52680:5;52665:21;;;;;;;;:::i;:::-;;;;:34;-1:-1:-1;;;;;52665:34:0;;;;;;;;;52623:173;;;52776:4;52752:28;;:14;52767:5;52752:21;;;;;;;;:::i;:::-;;;;:28;-1:-1:-1;;;;;52752:28:0;;;;;;;;;52623:173;52810:7;;;;:::i;:::-;;;;52603:3;;;;;:::i;:::-;;;;52577:252;;;;52861:4;52839:26;;:14;52854:3;52839:19;;;;;;;;:::i;:::-;;;;:26;-1:-1:-1;;;;;52839:26:0;;;;;;;;-1:-1:-1;52890:14:0;;52337:576;-1:-1:-1;;;;;52337:576:0:o;28580:328::-;28755:41;8146:10;28788:7;28755:18;:41::i;:::-;28747:103;;;;-1:-1:-1;;;28747:103:0;;;;;;;:::i;:::-;28861:39;28875:4;28881:2;28885:7;28894:5;28861:13;:39::i;:::-;28580:328;;;;:::o;59303:107::-;9279:6;;-1:-1:-1;;;;;9279:6:0;8146:10;9426:23;9418:68;;;;-1:-1:-1;;;9418:68:0;;;;;;;:::i;:::-;59366:6:::1;::::0;;::::1;-1:-1:-1::0;;;59366:6:0;;::::1;::::0;::::1;59365:7;59356:16:::0;::::1;-1:-1:-1::0;;;;59356:16:0;;::::1;::::0;;;::::1;::::0;;;;59388:14:::1;::::0;::::1;::::0;::::1;::::0;59395:6;::::1;::::0;;::::1;747:14:1::0;740:22;722:41;;710:2;695:18;;582:187;59388:14:0::1;;;;;;;;59303:107::o:0;49754:844::-;12145:1;12741:7;;:19;12733:63;;;;-1:-1:-1;;;12733:63:0;;18031:2:1;12733:63:0;;;18013:21:1;18070:2;18050:18;;;18043:30;18109:33;18089:18;;;18082:61;18160:18;;12733:63:0;17829:355:1;12733:63:0;12145:1;12874:7;:18;49843:6:::1;::::0;49851:18:::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;49851:18:0::1;::::0;::::1;::::0;;-1:-1:-1;;;49843:6:0;::::1;;;49842:7;49834:36;;;;-1:-1:-1::0;;;49834:36:0::1;;;;;;;;:::i;:::-;;49881:16;49900:13;39079:10:::0;:17;;38991:113;49900:13:::1;:17;::::0;49916:1:::1;49900:17;:::i;:::-;49956:12;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;49956:12:0::1;::::0;::::1;::::0;49881:36;;-1:-1:-1;44710:3:0::1;49936:18:::0;::::1;;49928:41;;;;-1:-1:-1::0;;;49928:41:0::1;;;;;;;;:::i;:::-;;50007:8;;49988:15;:27;;50017:16;;;;;;;;;;;;;-1:-1:-1::0;;;50017:16:0::1;;::::0;49980:54:::1;;;;;-1:-1:-1::0;;;49980:54:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;50116:16:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;50116:16:0::1;::::0;::::1;::::0;8146:10;;50094:9:::1;:20:::0;::::1;50086:47;;;;-1:-1:-1::0;;;50086:47:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;50164:9:0::1;50205:24;50220:8:::0;50205:14:::1;:24::i;:::-;50192:9;:37;50231:16;;;;;;;;;;;;;-1:-1:-1::0;;;50231:16:0::1;;::::0;50184:64:::1;;;;;-1:-1:-1::0;;;50184:64:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;50259:16:0::1;::::0;;;:6:::1;:16;::::0;;;;;;;:28;;;50298:8:::1;:18:::0;;;;;:28;;-1:-1:-1;;;;;;50298:28:0::1;-1:-1:-1::0;;;;;50298:28:0;::::1;;::::0;;50337:7:::1;:17:::0;;;;;:28;;-1:-1:-1;;50337:28:0::1;::::0;::::1;;;::::0;;50423:12:::1;::::0;50439:2:::1;::::0;50394:25:::1;44761:24;44828:25;50394;:::i;:::-;50393:42;;;;:::i;:::-;50392:49;;;;:::i;:::-;50376:12;;:65;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;50476:12:0::1;::::0;50460:28:::1;::::0;44761:24:::1;50460:28;:::i;:::-;50452:5;:36:::0;50504:47:::1;::::0;160:25:1;;;50504:47:0;::::1;;::::0;50521:8;;-1:-1:-1;;;;;50504:47:0;::::1;::::0;::::1;::::0;148:2:1;133:18;50504:47:0::1;;;;;;;50562:28;50572:7;50581:8;50562:9;:28::i;:::-;-1:-1:-1::0;;12101:1:0;13053:7;:22;-1:-1:-1;;49754:844:0:o;54220:2630::-;54286:13;54332;39079:10;:17;;38991:113;54332:13;54320:8;:25;;54347:14;;;;;;;;;;;;;;;;;54312:50;;;;;-1:-1:-1;;;54312:50:0;;;;;;;;:::i;:::-;;54373:36;54436:17;;;;;;;;;;;;;-1:-1:-1;;;54436:17:0;;;54454:18;54463:8;54454;:18::i;:::-;54419:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54373:101;;54487:22;;:::i;:::-;54538:449;;;;;;18878:66:1;18866:79;;18975:66;18970:2;18961:12;;18954:88;19072:66;19067:2;19058:12;;19051:88;19169:66;19164:2;19155:12;;19148:88;19267:34;19261:3;19252:13;;19245:57;19333:34;19327:3;19318:13;;19311:57;19399:34;19393:3;19384:13;;19377:57;19465:34;19459:3;19450:13;;19443:57;19531:34;19525:3;19516:13;;19509:57;19597:34;19591:3;19582:13;;19575:57;19663:34;19657:3;19648:13;;19641:57;19729:34;19723:3;19714:13;;19707:57;19795:66;19789:3;19780:13;;19773:89;-1:-1:-1;;;19887:3:1;19878:13;;19871:61;19957:3;19948:13;;18664:1303;54538:449:0;;;;;;;-1:-1:-1;;54538:449:0;;;;;;54520:468;;;55099:9;;;;;;;;;;-1:-1:-1;;;54520:8:0;55099:9;;;55091:18;;:7;;:18;;;:::i;:::-;;;;;;;;;;;;;55174:7;55182:12;;;;;;;;;;;;;-1:-1:-1;;;55182:12:0;;;55174:21;;;;;;:::i;:::-;;;;;;;;;;;;;55269:22;55017:285;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;55017:285:0;;;;;;54999:8;;;;:304;;;;55413:20;;;;;;;;;;-1:-1:-1;;;55413:20:0;;;;;;;55405:29;:7;;:29;;;:::i;:::-;;;;;;;;;;;;;55498:7;55506:13;;;;;;;;;;;;;-1:-1:-1;;;55506:13:0;;;55498:22;;;;;;:::i;:::-;;;;;;;;;;;;;55526:7;55534:8;;;;;;;;;;;;;-1:-1:-1;;;55534:8:0;;;55526:17;;;;;;:::i;:::-;;;;;;;;;;;;;55609:7;55617:22;;;;;;;;;;;;;-1:-1:-1;;;55617:22:0;;;55609:31;;;;;;:::i;:::-;;;;;;;;;;;;;55332:319;;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;55332:319:0;;;;;;55314:8;;;:338;;;;55796:16;;;;:6;55314:8;55796:16;;;55774:39;;:21;:39::i;:::-;55963:18;;;;:8;:18;;;;;;55949:33;;-1:-1:-1;;;;;55963:18:0;55949:13;:33::i;:::-;55681:312;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;55681:312:0;;;;;;55663:8;;;:331;;;;56104:11;;;;;;;;;;-1:-1:-1;;;55663:8:0;56104:11;;;56096:20;;:7;;:20;;;:::i;:::-;;;;;;;;;;;;;56127:7;56135:8;;;;;;;;;;;;;-1:-1:-1;;;56135:8:0;;;56127:17;;;;;;:::i;:::-;;;;;;;;;;;;;56023:131;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;56023:131:0;;;;;;56005:8;;;:150;;;56216:8;;56005;56225;;;;56234;;;;56243;;;;56199:62;;56168:21;;56199:62;;56225:8;;56234;;56243;56023:131;;56199:62;;:::i;:::-;;;;;;;;;;;;;56168:94;;56273:18;56294:465;56360:18;56369:8;56360;:18::i;:::-;56682:29;56702:7;56682:13;:29::i;:::-;56732:18;56741:8;56732;:18::i;:::-;56321:435;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56294:13;:465::i;:::-;56273:486;;56836:4;56786:55;;;;;;;;:::i;59654:1013::-;9279:6;;-1:-1:-1;;;;;9279:6:0;8146:10;9426:23;9418:68;;;;-1:-1:-1;;;9418:68:0;;;;;;;:::i;:::-;59831:22;;:26;59827:155:::1;;59891:8;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;59891:8:0::1;::::0;::::1;::::0;59877:52;;::::1;::::0;59891:8;59877:52:::1;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;;;;;;;59901:7:0::1;59909:8;;;;;;;;;;;;;-1:-1:-1::0;;;59909:8:0::1;;::::0;59901:17:::1;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;59877:52:::1;::::0;59920:8;;59877:52:::1;:::i;:::-;;;;;;;;59962:8;59942:7;59950:8;;;;;;;;;;;;;-1:-1:-1::0;;;59950:8:0::1;;::::0;59942:17:::1;;;;;;:::i;:::-;;;;;;;;;;;;;:28;;;;;;:::i;:::-;;59827:155;59996:26:::0;;:30;59992:182:::1;;60060:13;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;60060:13:0::1;::::0;::::1;::::0;60046:66;;::::1;::::0;60060:13;60046:66:::1;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;;;;;;;60075:7:0::1;60083:13;;;;;;;;;;;;;-1:-1:-1::0;;;60083:13:0::1;;::::0;60075:22:::1;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;60046:66:::1;::::0;60099:12;;60046:66:::1;:::i;:::-;;;;;;;;60150:12;60125:7;60133:13;;;;;;;;;;;;;-1:-1:-1::0;;;60133:13:0::1;;::::0;60125:22:::1;;;;;;:::i;:::-;;;;;;;;;;;;;:37;;;;;;:::i;:::-;;59992:182;60188:22:::0;;:26;60184:155:::1;;60248:8;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;60248:8:0::1;::::0;::::1;::::0;60234:52;;::::1;::::0;60248:8;60234:52:::1;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;;;;;;;60258:7:0::1;60266:8;;;;;;;;;;;;;-1:-1:-1::0;;;60266:8:0::1;;::::0;60258:17:::1;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;60234:52:::1;::::0;60277:8;;60234:52:::1;:::i;:::-;;;;;;;;60319:8;60299:7;60307:8;;;;;;;;;;;;;-1:-1:-1::0;;;60307:8:0::1;;::::0;60299:17:::1;;;;;;:::i;:::-;;;;;;;;;;;;;:28;;;;;;:::i;:::-;;60184:155;60353:26:::0;;:30;60349:182:::1;;60417:13;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;60417:13:0::1;::::0;::::1;::::0;60403:66;;::::1;::::0;60417:13;60403:66:::1;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;;;;;;;60432:7:0::1;60440:13;;;;;;;;;;;;;-1:-1:-1::0;;;60440:13:0::1;;::::0;60432:22:::1;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;60403:66:::1;::::0;60456:12;;60403:66:::1;:::i;:::-;;;;;;;;60507:12;60482:7;60490:13;;;;;;;;;;;;;-1:-1:-1::0;;;60490:13:0::1;;::::0;60482:22:::1;;;;;;:::i;:::-;;;;;;;;;;;;;:37;;;;;;:::i;:::-;;60349:182;60545:13:::0;;60541:119:::1;;60595:8;::::0;60577:38:::1;::::0;;29978:25:1;;;30034:2;30019:18;;30012:34;;;60577:38:0::1;::::0;29951:18:1;60577:38:0::1;;;;;;;60628:8;:20:::0;;;60541:119:::1;59654:1013:::0;;;;;:::o;51139:1190::-;12145:1;12741:7;;:19;12733:63;;;;-1:-1:-1;;;12733:63:0;;18031:2:1;12733:63:0;;;18013:21:1;18070:2;18050:18;;;18043:30;18109:33;18089:18;;;18082:61;18160:18;;12733:63:0;17829:355:1;12733:63:0;12145:1;12874:7;:18;51232:6:::1;::::0;51240:18:::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;51240:18:0::1;::::0;::::1;::::0;;-1:-1:-1;;;51232:6:0;::::1;;;51231:7;51223:36;;;;-1:-1:-1::0;;;51223:36:0::1;;;;;;;;:::i;:::-;;51297:8;;51278:15;:27;;51307:16;;;;;;;;;;;;;-1:-1:-1::0;;;51307:16:0::1;;::::0;51270:54:::1;;;;;-1:-1:-1::0;;;51270:54:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;51406:16:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;51406:16:0::1;::::0;::::1;::::0;8146:10;;51384:9:::1;:20:::0;::::1;51376:47;;;;-1:-1:-1::0;;;51376:47:0::1;;;;;;;;:::i;:::-;;51455:16;;51442:9;:29;51473:16;;;;;;;;;;;;;-1:-1:-1::0;;;51473:16:0::1;;::::0;51434:56:::1;;;;;-1:-1:-1::0;;;51434:56:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;51515:20:0;;51554:7;;;;;:20:::1;;;51572:2;51565:3;:9;;51554:20;51576:18;;;;;;;;;;;;;;;;::::0;51546:49:::1;;;;;-1:-1:-1::0;;;51546:49:0::1;;;;;;;;:::i;:::-;;51614:16;51623:6;51614:8;:16::i;:::-;51632:19;;;;;;;;;;;;;;;;;51606:46;;;;;-1:-1:-1::0;;;51606:46:0::1;;;;;;;;:::i;:::-;;51692:6;51663:7;51671:17;;;;;;;;;;;;;-1:-1:-1::0;;;51671:17:0::1;;::::0;51663:26:::1;;;;;;:::i;:::-;;;;;;;;;;;;;:35;;;;;;:::i;:::-;;51767:7;;;;;;;;;;;;;-1:-1:-1::0;;;51767:7:0::1;;::::0;51776:6:::1;51750:33;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;51750:33:0;;::::1;::::0;;;51717:22;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;51750:33:0::1;51717:22:::0;::::1;::::0;51709:31;;51750:33;;51709:7:::1;::::0;:31:::1;::::0;51750:33;51709:31:::1;:::i;:::-;;;;;;;;;;;;;:75;;;;;;:::i;:::-;-1:-1:-1::0;51815:14:0::1;::::0;;51795:17:::1;:34:::0;;-1:-1:-1;;;;;51815:14:0;;::::1;-1:-1:-1::0;;;;;;51795:34:0;;::::1;;::::0;;;51860:14:::1;::::0;;51840:17:::1;:34:::0;51885:24;::::1;::::0;;::::1;;::::0;;;51937:16:::1;::::0;51920:33;;;;52009:2:::1;::::0;51984:21:::1;::::0;52003:2:::1;51984:21;:::i;:::-;51983:28;;;;:::i;:::-;51964:16;:47:::0;52026:17:::1;::::0;:21;52022:237:::1;;52086:17;::::0;52116::::1;::::0;52078:60:::1;::::0;52064:9:::1;::::0;-1:-1:-1;;;;;52086:17:0::1;::::0;52116;52064:9;52078:60;52064:9;52078:60;52116:17;52086;52078:60:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52063:75;;;52161:4;52167:13;;;;;;;;;;;;;-1:-1:-1::0;;;52167:13:0::1;;::::0;52153:28:::1;;;;;-1:-1:-1::0;;;52153:28:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;52210:17:0::1;::::0;52229::::1;::::0;52201:46:::1;::::0;160:25:1;;;-1:-1:-1;;;;;52210:17:0;;::::1;::::0;52201:46:::1;::::0;148:2:1;133:18;52201:46:0::1;;;;;;;52048:211;52022:237;52298:14;;52289:7;-1:-1:-1::0;;;;;52274:47:0::1;;52314:6;52274:47;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;12101:1:0;13053:7;:22;-1:-1:-1;51139:1190:0:o;60675:254::-;9279:6;;-1:-1:-1;;;;;9279:6:0;8146:10;9426:23;9418:68;;;;-1:-1:-1;;;9418:68:0;;;;;;;:::i;:::-;60786:20:::1;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;60786:20:0::1;::::0;::::1;::::0;60772:87;;::::1;::::0;60786:20;60772:87:::1;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;;;;;;;60808:7:0::1;60816:20;;;;;;;;;;;;;-1:-1:-1::0;;;60816:20:0::1;;::::0;60808:29:::1;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;60772:87:::1;::::0;60839:19;;60772:87:::1;:::i;:::-;;;;;;;;60902:19;60870:7;60878:20;;;;;;;;;;;;;-1:-1:-1::0;;;60878:20:0::1;;::::0;60870:29:::1;;;;;;:::i;58921:374::-:0;9279:6;;-1:-1:-1;;;;;9279:6:0;8146:10;9426:23;9418:68;;;;-1:-1:-1;;;9418:68:0;;;;;;;:::i;:::-;59014:17:::1;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;59014:17:0::1;::::0;::::1;::::0;59000:68;;::::1;::::0;59014:17;59000:68:::1;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;;;;;;;59033:7:0::1;59041:17;;;;;;;;;;;;;-1:-1:-1::0;;;59041:17:0::1;;::::0;59033:26:::1;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;59000:68:::1;::::0;59061:6;;59000:68:::1;:::i;:::-;;;;;;;;59096:22;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;59096:22:0::1;::::0;::::1;::::0;59082:78;;::::1;::::0;59096:22;59082:78:::1;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;;;;;;;59120:7:0::1;59128:22;;;;;;;;;;;;;-1:-1:-1::0;;;59128:22:0::1;;::::0;59120:31:::1;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;59082:78:::1;::::0;59153:6;;59082:78:::1;:::i;:::-;;;;;;;;59198:6;59169:7;59177:17;;;;;;;;;;;;;-1:-1:-1::0;;;59177:17:0::1;;::::0;59169:26:::1;;;;;;:::i;:::-;;;;;;;;;;;;;:35;;;;;;:::i;:::-;;59271:7;;;;;;;;;;;;;-1:-1:-1::0;;;59271:7:0::1;;::::0;59279:6:::1;59254:32;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;59254:32:0;;::::1;::::0;;;59221:22;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;59254:32:0::1;59221:22:::0;::::1;::::0;59213:31;;59254:32;;59213:7:::1;::::0;:31:::1;::::0;59254:32;59213:31:::1;:::i;60937:174::-:0;9279:6;;-1:-1:-1;;;;;9279:6:0;8146:10;9426:23;9418:68;;;;-1:-1:-1;;;9418:68:0;;;;;;;:::i;:::-;61026:8:::1;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;61026:8:0::1;::::0;::::1;::::0;61012:52;;::::1;::::0;61026:8;61012:52:::1;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;;;;;;;61036:7:0::1;61044:8;;;;;;;;;;;;;-1:-1:-1::0;;;61044:8:0::1;;::::0;61036:17:::1;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;61012:52:::1;::::0;61055:8;;61012:52:::1;:::i;:::-;;;;;;;;61095:8;61075:7;61083:8;;;;;;;;;;;;;-1:-1:-1::0;;;61083:8:0::1;;::::0;61075:17:::1;;;;;;:::i;61700:184::-:0;61779:21;;61755:4;;-1:-1:-1;;;;;61779:21:0;:35;;;;:97;;-1:-1:-1;61826:21:0;;61875:1;;-1:-1:-1;;;;;61826:21:0;61818:40;8146:10;61818:54;;-1:-1:-1;;;;;;61818:54:0;;;;;;;-1:-1:-1;;;;;1896:32:1;;;61818:54:0;;;1878:51:1;1851:18;;61818:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:58;61779:97;61772:104;;61700:184;:::o;10106:192::-;9279:6;;-1:-1:-1;;;;;9279:6:0;8146:10;9426:23;9418:68;;;;-1:-1:-1;;;9418:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10195:22:0;::::1;10187:73;;;::::0;-1:-1:-1;;;10187:73:0;;30658:2:1;10187:73:0::1;::::0;::::1;30640:21:1::0;30697:2;30677:18;;;30670:30;30736:34;30716:18;;;30709:62;-1:-1:-1;;;30787:18:1;;;30780:36;30833:19;;10187:73:0::1;30456:402:1::0;10187:73:0::1;10271:19;10281:8;10271:9;:19::i;:::-;10106:192:::0;:::o;24520:305::-;24622:4;-1:-1:-1;;;;;;24659:40:0;;-1:-1:-1;;;24659:40:0;;:105;;-1:-1:-1;;;;;;;24716:48:0;;-1:-1:-1;;;24716:48:0;24659:105;:158;;;-1:-1:-1;;;;;;;;;;23236:40:0;;;24781:36;23127:157;34400:174;34475:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;34475:29:0;-1:-1:-1;;;;;34475:29:0;;;;;;;;:24;;34529:23;34475:24;34529:14;:23::i;:::-;-1:-1:-1;;;;;34520:46:0;;;;;;;;;;;34400:174;;:::o;30712:348::-;30805:4;30507:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30507:16:0;30822:73;;;;-1:-1:-1;;;30822:73:0;;31065:2:1;30822:73:0;;;31047:21:1;31104:2;31084:18;;;31077:30;31143:34;31123:18;;;31116:62;-1:-1:-1;;;31194:18:1;;;31187:42;31246:19;;30822:73:0;30863:408:1;30822:73:0;30906:13;30922:23;30937:7;30922:14;:23::i;:::-;30906:39;;30975:5;-1:-1:-1;;;;;30964:16:0;:7;-1:-1:-1;;;;;30964:16:0;;:51;;;;31008:7;-1:-1:-1;;;;;30984:31:0;:20;30996:7;30984:11;:20::i;:::-;-1:-1:-1;;;;;30984:31:0;;30964:51;:87;;;-1:-1:-1;;;;;;27804:25:0;;;27780:4;27804:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;31019:32;30956:96;30712:348;-1:-1:-1;;;;30712:348:0:o;33704:578::-;33863:4;-1:-1:-1;;;;;33836:31:0;:23;33851:7;33836:14;:23::i;:::-;-1:-1:-1;;;;;33836:31:0;;33828:85;;;;-1:-1:-1;;;33828:85:0;;31478:2:1;33828:85:0;;;31460:21:1;31517:2;31497:18;;;31490:30;31556:34;31536:18;;;31529:62;-1:-1:-1;;;31607:18:1;;;31600:39;31656:19;;33828:85:0;31276:405:1;33828:85:0;-1:-1:-1;;;;;33932:16:0;;33924:65;;;;-1:-1:-1;;;33924:65:0;;31888:2:1;33924:65:0;;;31870:21:1;31927:2;31907:18;;;31900:30;31966:34;31946:18;;;31939:62;-1:-1:-1;;;32017:18:1;;;32010:34;32061:19;;33924:65:0;31686:400:1;33924:65:0;34002:39;34023:4;34029:2;34033:7;34002:20;:39::i;:::-;34106:29;34123:1;34127:7;34106:8;:29::i;:::-;-1:-1:-1;;;;;34148:15:0;;;;;;:9;:15;;;;;:20;;34167:1;;34148:15;:20;;34167:1;;34148:20;:::i;:::-;;;;-1:-1:-1;;;;;;;34179:13:0;;;;;;:9;:13;;;;;:18;;34196:1;;34179:13;:18;;34196:1;;34179:18;:::i;:::-;;;;-1:-1:-1;;34208:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;34208:21:0;-1:-1:-1;;;;;34208:21:0;;;;;;;;;34247:27;;34208:16;;34247:27;;;;;;;33704:578;;;:::o;31402:110::-;31478:26;31488:2;31492:7;31478:26;;;;;;;;;;;;:9;:26::i;10306:173::-;10381:6;;;-1:-1:-1;;;;;10398:17:0;;;-1:-1:-1;;;;;;10398:17:0;;;;;;;10431:40;;10381:6;;;10398:17;10381:6;;10431:40;;10362:16;;10431:40;10351:128;10306:173;:::o;63318:715::-;63374:13;63587:5;63596:1;63587:10;63583:53;;-1:-1:-1;;63614:10:0;;;;;;;;;;;;-1:-1:-1;;;63614:10:0;;;;;63318:715::o;63583:53::-;63661:5;63646:12;63702:78;63709:9;;63702:78;;63735:8;;;;:::i;:::-;;-1:-1:-1;63758:10:0;;-1:-1:-1;63766:2:0;63758:10;;:::i;:::-;;;63702:78;;;63790:19;63822:6;63812:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63812:17:0;;63790:39;;63840:154;63847:10;;63840:154;;63874:11;63884:1;63874:11;;:::i;:::-;;-1:-1:-1;63943:10:0;63951:2;63943:5;:10;:::i;:::-;63930:24;;:2;:24;:::i;:::-;63917:39;;63900:6;63907;63900:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;63900:56:0;;;;;;;;-1:-1:-1;63971:11:0;63980:2;63971:11;;:::i;:::-;;;63840:154;;53321:280;53384:13;53409:10;53427:30;53446:10;53427:18;:30::i;:::-;53422:35;;:2;:35;:::i;:::-;53409:48;;53485:10;53479:24;53471:5;:32;53468:81;;;-1:-1:-1;53527:10:0;;53321:280;-1:-1:-1;53321:280:0:o;53468:81::-;53566:27;53575:5;53582:10;53566:8;:27::i;29790:315::-;29947:28;29957:4;29963:2;29967:7;29947:9;:28::i;:::-;29994:48;30017:4;30023:2;30027:7;30036:5;29994:22;:48::i;:::-;29986:111;;;;-1:-1:-1;;;29986:111:0;;;;;;;:::i;62680:451::-;62780:13;;;62790:2;62780:13;;;62737;62780;;;;;;62763:14;;62780:13;;;;;;;;;;;-1:-1:-1;62780:13:0;62763:30;;62809:6;62804:293;62825:2;62821:1;:6;62804:293;;;62849:8;62900:6;62905:1;62900:2;:6;:::i;:::-;62897:10;;:1;:10;:::i;:::-;62893:15;;:1;:15;:::i;:::-;62873:36;;-1:-1:-1;;;;;62873:16:0;;:36;:::i;:::-;62860:51;;62849:62;;62926:9;62956:2;62951:1;62945:8;;:13;;;;:::i;:::-;62938:21;;62926:33;;62974:9;63015:2;63009:9;;63004:2;:14;;;;:::i;:::-;62999:1;62993:8;;:25;;;;:::i;:::-;62986:33;;62974:45;;63043:8;63048:2;63043:4;:8::i;:::-;63034:1;63036:3;63038:1;63036;:3;:::i;:::-;63034:6;;;;;;;;:::i;:::-;;;;:17;-1:-1:-1;;;;;63034:17:0;;;;;;;;;63077:8;63082:2;63077:4;:8::i;:::-;63066:1;63068:3;63070:1;63068;:3;:::i;:::-;:5;;63072:1;63068:5;:::i;:::-;63066:8;;;;;;;;:::i;:::-;;;;:19;-1:-1:-1;;;;;63066:19:0;;;;;;;;;62834:263;;;62829:3;;;;;:::i;:::-;;;;62804:293;;;-1:-1:-1;63121:1:0;62680:451;-1:-1:-1;;62680:451:0:o;64391:1607::-;64489:11;;64449:13;;64475:11;64515:8;;;64511:23;;-1:-1:-1;;64525:9:0;;;;;;;;;-1:-1:-1;64525:9:0;;;64391:1607;-1:-1:-1;64391:1607:0:o;64511:23::-;64586:18;64624:1;64613:7;:3;64619:1;64613:7;:::i;:::-;64612:13;;;;:::i;:::-;64607:19;;:1;:19;:::i;:::-;64586:40;-1:-1:-1;64684:19:0;64716:15;64586:40;64729:2;64716:15;:::i;:::-;64706:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64706:26:0;;64684:48;;64745:18;64766:5;;;;;;;;;;;;;;;;;64745:26;;64835:1;64828:5;64824:13;64880:2;64872:6;64868:15;64931:1;64899:777;64954:3;64951:1;64948:10;64899:777;;;65009:1;65052:12;;;;;65046:19;65147:4;65135:2;65131:14;;;;;65113:40;;65107:47;65256:2;65252:14;;;65248:25;;65234:40;;65228:47;65385:1;65381:13;;;65377:24;;65363:39;;65357:46;65505:16;;;;65491:31;;65485:38;65183:1;65179:11;;;65277:4;65224:58;;;65215:68;65308:11;;65353:57;;;65344:67;;;;65436:11;;65481:49;;65472:59;65560:3;65556:13;65589:22;;65659:1;65644:17;;;;65002:9;64899:777;;;64903:44;65708:1;65703:3;65699:11;65729:1;65724:84;;;;65827:1;65822:82;;;;65692:212;;65724:84;-1:-1:-1;;;;;65757:17:0;;65750:43;65724:84;;65822:82;-1:-1:-1;;;;;65855:17:0;;65848:41;65692:212;-1:-1:-1;;;65920:26:0;;;65927:6;64391:1607;-1:-1:-1;;;;64391:1607:0:o;56858:1474::-;56942:27;56972:17;;;:7;:17;;;;;;56917:13;;56942:27;56972:17;;:48;;57007:13;;;;;;;;;;;;;-1:-1:-1;;;57007:13:0;;;56972:48;;;56992:12;;;;;;;;;;;;;-1:-1:-1;;;56992:12:0;;;56972:48;56942:78;;57031:23;;:::i;:::-;57147:18;57156:8;57147;:18::i;:::-;57204:9;;;;;;;;;;;;;-1:-1:-1;;;57204:9:0;;;57228:7;57236:9;;;;;;;;;;;;;-1:-1:-1;;;57236:9:0;;;57228:18;;;;;;:::i;:::-;;;;;;;;;;;;;57285:12;;;;;;;;;;;;;-1:-1:-1;;;57285:12:0;;;57312:7;57320:12;;;;;;;;;;;;;-1:-1:-1;;;57320:12:0;;;57312:21;;;;;;:::i;:::-;;;;;;;;;;;;;57372:8;;;;;;;;;;;;;-1:-1:-1;;;57372:8:0;;;57395:7;57403:8;;;;;;;;;;;;;-1:-1:-1;;;57403:8:0;;;57395:17;;;;;;:::i;:::-;;;;;;;;;;;;;57084:349;;;;;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;57084:349:0;;;;;;57065:369;;;57515:20;;;;;;;;;;;-1:-1:-1;;;57065:9:0;57515:20;;;;;;57558;;;;;;;;;;;;;57550:29;;57515:20;;57550:7;;:29;;57558:20;57550:29;:::i;:::-;;;;;;;;;;;;;57618:8;;;;;;;;;;;;;-1:-1:-1;;;57618:8:0;;;57641:7;57649:8;;;;;;;;;;;;;-1:-1:-1;;;57649:8:0;;;57641:17;;;;;;:::i;:::-;;;;;;;;;;;;;57697:8;;;;;;;;;;;;;-1:-1:-1;;;57697:8:0;;;57720:7;57728:8;;;;;;;;;;;;;-1:-1:-1;;;57728:8:0;;;57720:17;;;;;;:::i;:::-;;;;;;;;;;;;;;;;57776:8;;;;;;;;-1:-1:-1;;;57776:8:0;;;;57466:367;;;;;;;;;57799:13;;57466:367;;:::i;:::-;;;;;;;-1:-1:-1;;57466:367:0;;;;;;57447:9;;;;:387;;;;57949:18;;;;:8;:18;;;;;;57935:33;;-1:-1:-1;;;;;57949:18:0;57935:13;:33::i;:::-;58007:17;;;;;;;;;;;;;-1:-1:-1;;;58007:17:0;;;58039:7;58047:17;;;;;;;;;;;;;-1:-1:-1;;;58047:17:0;;;58039:26;;;;;;:::i;:::-;;;;;;;;;;;;;58121;58130:6;:16;58137:8;58130:16;;;;;;;;;;;;58121:8;:26::i;:::-;58186:11;;;;;;;;;;;;;-1:-1:-1;;;58186:11:0;;;58212:7;58220:11;;;;;;;;;;;;;-1:-1:-1;;;58220:11:0;;;58212:20;;;;;;:::i;:::-;;;;;;;;;;;;;57866:382;;;;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;57866:382:0;;;;;;57847:9;;;:402;;;58293:9;;57847;58303;;;;58276:48;;;;58293:9;;58303;57866:382;58276:48;;:::i;:::-;;;;;;;;;;;;;58262:63;;;;56858:1474;;;:::o;61892:651::-;62074:89;;;;;;;;;;;;;61953:4;;;;62034:5;;61953:4;;62074:89;;;;;62051:112;;62174:9;62206:7;62202:283;62221:10;:17;62217:1;:21;;;62202:283;;;62264:5;62257:12;;62287:7;62283:191;62302:7;:14;62298:1;:18;;;:27;;;;;62321:4;62320:5;62298:27;62283:191;;;62368:7;62376:1;62368:10;;;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;62351:27:0;;:10;62362:1;62351:13;;;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;62351:13:0;:27;62348:112;;62398:14;;;;:::i;:::-;;;;62438:4;62431:11;;62348:112;62327:3;;;;:::i;:::-;;;;62283:191;;;-1:-1:-1;62240:3:0;;;;:::i;:::-;;;;62202:283;;;;62518:10;:17;62502:12;:33;;;;62495:40;;;;;;61892:651;;;:::o;40027:589::-;-1:-1:-1;;;;;40233:18:0;;40229:187;;40268:40;40300:7;41443:10;:17;;41416:24;;;;:15;:24;;;;;:44;;;41471:24;;;;;;;;;;;;41339:164;40268:40;40229:187;;;40338:2;-1:-1:-1;;;;;40330:10:0;:4;-1:-1:-1;;;;;40330:10:0;;40326:90;;40357:47;40390:4;40396:7;40357:32;:47::i;:::-;-1:-1:-1;;;;;40430:16:0;;40426:183;;40463:45;40500:7;40463:36;:45::i;40426:183::-;40536:4;-1:-1:-1;;;;;40530:10:0;:2;-1:-1:-1;;;;;40530:10:0;;40526:83;;40557:40;40585:2;40589:7;40557:27;:40::i;31739:321::-;31869:18;31875:2;31879:7;31869:5;:18::i;:::-;31920:54;31951:1;31955:2;31959:7;31968:5;31920:22;:54::i;:::-;31898:154;;;;-1:-1:-1;;;31898:154:0;;;;;;;:::i;52923:390::-;53001:4;53018:20;53047:11;53018:41;;53070:10;53100:9;53129:1;53112:7;:14;:18;;;;:::i;:::-;53100:30;;53095:188;53164:7;53172:1;53164:10;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;53164:10:0;-1:-1:-1;;;53164:18:0;53160:112;;53203:7;;;;:::i;:::-;;;;53160:112;;;53251:5;;53160:112;53140:3;;;;:::i;:::-;;;;53095:188;;;-1:-1:-1;53300:5:0;52923:390;-1:-1:-1;;;52923:390:0:o;35139:803::-;35294:4;-1:-1:-1;;;;;35315:13:0;;15622:20;15670:8;35311:624;;35351:72;;-1:-1:-1;;;35351:72:0;;-1:-1:-1;;;;;35351:36:0;;;;;:72;;8146:10;;35402:4;;35408:7;;35417:5;;35351:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35351:72:0;;;;;;;;-1:-1:-1;;35351:72:0;;;;;;;;;;;;:::i;:::-;;;35347:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35597:6;:13;35614:1;35597:18;35593:272;;35640:60;;-1:-1:-1;;;35640:60:0;;;;;;;:::i;35593:272::-;35815:6;35809:13;35800:6;35796:2;35792:15;35785:38;35347:533;-1:-1:-1;;;;;;35474:55:0;-1:-1:-1;;;35474:55:0;;-1:-1:-1;35467:62:0;;35311:624;-1:-1:-1;35919:4:0;35139:803;;;;;;:::o;63139:171::-;63186:8;63222:2;63211:8;;;;:13;63207:95;;;63240:15;:8;;;;63251:4;63240:15;:::i;:::-;63233:23;;;63139:171;-1:-1:-1;;63139:171:0:o;63207:95::-;63286:15;:8;;;;63297:4;63286:15;:::i;63207:95::-;63139:171;;;:::o;42130:988::-;42396:22;42446:1;42421:22;42438:4;42421:16;:22::i;:::-;:26;;;;:::i;:::-;42458:18;42479:26;;;:17;:26;;;;;;42396:51;;-1:-1:-1;42612:28:0;;;42608:328;;-1:-1:-1;;;;;42679:18:0;;42657:19;42679:18;;;:12;:18;;;;;;;;:34;;;;;;;;;42730:30;;;;;;:44;;;42847:30;;:17;:30;;;;;:43;;;42608:328;-1:-1:-1;43032:26:0;;;;:17;:26;;;;;;;;43025:33;;;-1:-1:-1;;;;;43076:18:0;;;;;:12;:18;;;;;:34;;;;;;;43069:41;42130:988::o;43413:1079::-;43691:10;:17;43666:22;;43691:21;;43711:1;;43691:21;:::i;:::-;43723:18;43744:24;;;:15;:24;;;;;;44117:10;:26;;43666:46;;-1:-1:-1;43744:24:0;;43666:46;;44117:26;;;;;;:::i;:::-;;;;;;;;;44095:48;;44181:11;44156:10;44167;44156:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;44261:28;;;:15;:28;;;;;;;:41;;;44433:24;;;;;44426:31;44468:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;43484:1008;;;43413:1079;:::o;40917:221::-;41002:14;41019:20;41036:2;41019:16;:20::i;:::-;-1:-1:-1;;;;;41050:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;41095:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;40917:221:0:o;32396:382::-;-1:-1:-1;;;;;32476:16:0;;32468:61;;;;-1:-1:-1;;;32468:61:0;;45409:2:1;32468:61:0;;;45391:21:1;;;45428:18;;;45421:30;45487:34;45467:18;;;45460:62;45539:18;;32468:61:0;45207:356:1;32468:61:0;30483:4;30507:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30507:16:0;:30;32540:58;;;;-1:-1:-1;;;32540:58:0;;45770:2:1;32540:58:0;;;45752:21:1;45809:2;45789:18;;;45782:30;45848;45828:18;;;45821:58;45896:18;;32540:58:0;45568:352:1;32540:58:0;32611:45;32640:1;32644:2;32648:7;32611:20;:45::i;:::-;-1:-1:-1;;;;;32669:13:0;;;;;;:9;:13;;;;;:18;;32686:1;;32669:13;:18;;32686:1;;32669:18;:::i;:::-;;;;-1:-1:-1;;32698:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32698:21:0;-1:-1:-1;;;;;32698:21:0;;;;;;;;32737:33;;32698:16;;;32737:33;;32698:16;;32737:33;32396:382;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;196:131:1;-1:-1:-1;;;;;;270:32:1;;260:43;;250:71;;317:1;314;307:12;332:245;390:6;443:2;431:9;422:7;418:23;414:32;411:52;;;459:1;456;449:12;411:52;498:9;485:23;517:30;541:5;517:30;:::i;774:258::-;846:1;856:113;870:6;867:1;864:13;856:113;;;946:11;;;940:18;927:11;;;920:39;892:2;885:10;856:113;;;987:6;984:1;981:13;978:48;;;-1:-1:-1;;1022:1:1;1004:16;;997:27;774:258::o;1037:269::-;1090:3;1128:5;1122:12;1155:6;1150:3;1143:19;1171:63;1227:6;1220:4;1215:3;1211:14;1204:4;1197:5;1193:16;1171:63;:::i;:::-;1288:2;1267:15;-1:-1:-1;;1263:29:1;1254:39;;;;1295:4;1250:50;;1037:269;-1:-1:-1;;1037:269:1:o;1311:231::-;1460:2;1449:9;1442:21;1423:4;1480:56;1532:2;1521:9;1517:18;1509:6;1480:56;:::i;1547:180::-;1606:6;1659:2;1647:9;1638:7;1634:23;1630:32;1627:52;;;1675:1;1672;1665:12;1627:52;-1:-1:-1;1698:23:1;;1547:180;-1:-1:-1;1547:180:1:o;1940:173::-;2008:20;;-1:-1:-1;;;;;2057:31:1;;2047:42;;2037:70;;2103:1;2100;2093:12;2118:254;2186:6;2194;2247:2;2235:9;2226:7;2222:23;2218:32;2215:52;;;2263:1;2260;2253:12;2215:52;2286:29;2305:9;2286:29;:::i;:::-;2276:39;2362:2;2347:18;;;;2334:32;;-1:-1:-1;;;2118:254:1:o;2377:186::-;2436:6;2489:2;2477:9;2468:7;2464:23;2460:32;2457:52;;;2505:1;2502;2495:12;2457:52;2528:29;2547:9;2528:29;:::i;2568:127::-;2629:10;2624:3;2620:20;2617:1;2610:31;2660:4;2657:1;2650:15;2684:4;2681:1;2674:15;2700:632;2765:5;2795:18;2836:2;2828:6;2825:14;2822:40;;;2842:18;;:::i;:::-;2917:2;2911:9;2885:2;2971:15;;-1:-1:-1;;2967:24:1;;;2993:2;2963:33;2959:42;2947:55;;;3017:18;;;3037:22;;;3014:46;3011:72;;;3063:18;;:::i;:::-;3103:10;3099:2;3092:22;3132:6;3123:15;;3162:6;3154;3147:22;3202:3;3193:6;3188:3;3184:16;3181:25;3178:45;;;3219:1;3216;3209:12;3178:45;3269:6;3264:3;3257:4;3249:6;3245:17;3232:44;3324:1;3317:4;3308:6;3300;3296:19;3292:30;3285:41;;;;2700:632;;;;;:::o;3337:222::-;3380:5;3433:3;3426:4;3418:6;3414:17;3410:27;3400:55;;3451:1;3448;3441:12;3400:55;3473:80;3549:3;3540:6;3527:20;3520:4;3512:6;3508:17;3473:80;:::i;3564:322::-;3633:6;3686:2;3674:9;3665:7;3661:23;3657:32;3654:52;;;3702:1;3699;3692:12;3654:52;3742:9;3729:23;3775:18;3767:6;3764:30;3761:50;;;3807:1;3804;3797:12;3761:50;3830;3872:7;3863:6;3852:9;3848:22;3830:50;:::i;4084:328::-;4161:6;4169;4177;4230:2;4218:9;4209:7;4205:23;4201:32;4198:52;;;4246:1;4243;4236:12;4198:52;4269:29;4288:9;4269:29;:::i;:::-;4259:39;;4317:38;4351:2;4340:9;4336:18;4317:38;:::i;:::-;4307:48;;4402:2;4391:9;4387:18;4374:32;4364:42;;4084:328;;;;;:::o;4417:160::-;4482:20;;4538:13;;4531:21;4521:32;;4511:60;;4567:1;4564;4557:12;4582:180;4638:6;4691:2;4679:9;4670:7;4666:23;4662:32;4659:52;;;4707:1;4704;4697:12;4659:52;4730:26;4746:9;4730:26;:::i;4767:254::-;4832:6;4840;4893:2;4881:9;4872:7;4868:23;4864:32;4861:52;;;4909:1;4906;4899:12;4861:52;4932:29;4951:9;4932:29;:::i;:::-;4922:39;;4980:35;5011:2;5000:9;4996:18;4980:35;:::i;:::-;4970:45;;4767:254;;;;;:::o;5026:390::-;5104:6;5112;5165:2;5153:9;5144:7;5140:23;5136:32;5133:52;;;5181:1;5178;5171:12;5133:52;5217:9;5204:23;5194:33;;5278:2;5267:9;5263:18;5250:32;5305:18;5297:6;5294:30;5291:50;;;5337:1;5334;5327:12;5291:50;5360;5402:7;5393:6;5382:9;5378:22;5360:50;:::i;:::-;5350:60;;;5026:390;;;;;:::o;5421:667::-;5516:6;5524;5532;5540;5593:3;5581:9;5572:7;5568:23;5564:33;5561:53;;;5610:1;5607;5600:12;5561:53;5633:29;5652:9;5633:29;:::i;:::-;5623:39;;5681:38;5715:2;5704:9;5700:18;5681:38;:::i;:::-;5671:48;;5766:2;5755:9;5751:18;5738:32;5728:42;;5821:2;5810:9;5806:18;5793:32;5848:18;5840:6;5837:30;5834:50;;;5880:1;5877;5870:12;5834:50;5903:22;;5956:4;5948:13;;5944:27;-1:-1:-1;5934:55:1;;5985:1;5982;5975:12;5934:55;6008:74;6074:7;6069:2;6056:16;6051:2;6047;6043:11;6008:74;:::i;:::-;5998:84;;;5421:667;;;;;;;:::o;6093:1013::-;6228:6;6236;6244;6252;6260;6313:3;6301:9;6292:7;6288:23;6284:33;6281:53;;;6330:1;6327;6320:12;6281:53;6370:9;6357:23;6399:18;6440:2;6432:6;6429:14;6426:34;;;6456:1;6453;6446:12;6426:34;6479:50;6521:7;6512:6;6501:9;6497:22;6479:50;:::i;:::-;6469:60;;6582:2;6571:9;6567:18;6554:32;6538:48;;6611:2;6601:8;6598:16;6595:36;;;6627:1;6624;6617:12;6595:36;6650:52;6694:7;6683:8;6672:9;6668:24;6650:52;:::i;:::-;6640:62;;6755:2;6744:9;6740:18;6727:32;6711:48;;6784:2;6774:8;6771:16;6768:36;;;6800:1;6797;6790:12;6768:36;6823:52;6867:7;6856:8;6845:9;6841:24;6823:52;:::i;:::-;6813:62;;6928:2;6917:9;6913:18;6900:32;6884:48;;6957:2;6947:8;6944:16;6941:36;;;6973:1;6970;6963:12;6941:36;;6996:52;7040:7;7029:8;7018:9;7014:24;6996:52;:::i;:::-;6093:1013;;;;-1:-1:-1;6093:1013:1;;7095:3;7080:19;7067:33;;6093:1013;-1:-1:-1;;;6093:1013:1:o;7111:260::-;7179:6;7187;7240:2;7228:9;7219:7;7215:23;7211:32;7208:52;;;7256:1;7253;7246:12;7208:52;7279:29;7298:9;7279:29;:::i;:::-;7269:39;;7327:38;7361:2;7350:9;7346:18;7327:38;:::i;7376:380::-;7455:1;7451:12;;;;7498;;;7519:61;;7573:4;7565:6;7561:17;7551:27;;7519:61;7626:2;7618:6;7615:14;7595:18;7592:38;7589:161;;7672:10;7667:3;7663:20;7660:1;7653:31;7707:4;7704:1;7697:15;7735:4;7732:1;7725:15;7589:161;;7376:380;;;:::o;9001:356::-;9203:2;9185:21;;;9222:18;;;9215:30;9281:34;9276:2;9261:18;;9254:62;9348:2;9333:18;;9001:356::o;9362:185::-;9404:3;9442:5;9436:12;9457:52;9502:6;9497:3;9490:4;9483:5;9479:16;9457:52;:::i;:::-;9525:16;;;;;9362:185;-1:-1:-1;;9362:185:1:o;9552:276::-;9683:3;9721:6;9715:13;9737:53;9783:6;9778:3;9771:4;9763:6;9759:17;9737:53;:::i;:::-;9806:16;;;;;9552:276;-1:-1:-1;;9552:276:1:o;9959:1113::-;10153:2;10142:9;10135:21;10116:4;10176:1;10209:6;10203:13;10239:36;10265:9;10239:36;:::i;:::-;10311:6;10306:2;10295:9;10291:18;10284:34;10337:2;10358:1;10390:2;10379:9;10375:18;10407:1;10402:158;;;;10574:1;10569:381;;;;10368:582;;10402:158;-1:-1:-1;;10450:24:1;;10430:18;;;10423:52;10528:14;;10521:22;10518:1;10514:30;10499:46;;10495:55;;;-1:-1:-1;10402:158:1;;10569:381;10600:6;10597:1;10590:17;10630:4;10675:2;10672:1;10662:16;10700:1;10714:180;10728:6;10725:1;10722:13;10714:180;;;10821:14;;10797:17;;;10793:26;;10786:50;10864:16;;;;10743:10;;10714:180;;;10918:17;;10914:26;;;-1:-1:-1;;;10368:582:1;;;;;;10997:9;10992:3;10988:19;10981:4;10970:9;10966:20;10959:49;11025:41;11062:3;11054:6;11025:41;:::i;:::-;11017:49;9959:1113;-1:-1:-1;;;;;9959:1113:1:o;11077:545::-;11179:2;11174:3;11171:11;11168:448;;;11215:1;11240:5;11236:2;11229:17;11285:4;11281:2;11271:19;11355:2;11343:10;11339:19;11336:1;11332:27;11326:4;11322:38;11391:4;11379:10;11376:20;11373:47;;;-1:-1:-1;11414:4:1;11373:47;11469:2;11464:3;11460:12;11457:1;11453:20;11447:4;11443:31;11433:41;;11524:82;11542:2;11535:5;11532:13;11524:82;;;11587:17;;;11568:1;11557:13;11524:82;;;11528:3;;;11077:545;;;:::o;11798:1352::-;11924:3;11918:10;11951:18;11943:6;11940:30;11937:56;;;11973:18;;:::i;:::-;12002:97;12092:6;12052:38;12084:4;12078:11;12052:38;:::i;:::-;12046:4;12002:97;:::i;:::-;12154:4;;12218:2;12207:14;;12235:1;12230:663;;;;12937:1;12954:6;12951:89;;;-1:-1:-1;13006:19:1;;;13000:26;12951:89;-1:-1:-1;;11755:1:1;11751:11;;;11747:24;11743:29;11733:40;11779:1;11775:11;;;11730:57;13053:81;;12200:944;;12230:663;9906:1;9899:14;;;9943:4;9930:18;;-1:-1:-1;;12266:20:1;;;12384:236;12398:7;12395:1;12392:14;12384:236;;;12487:19;;;12481:26;12466:42;;12579:27;;;;12547:1;12535:14;;;;12414:19;;12384:236;;;12388:3;12648:6;12639:7;12636:19;12633:201;;;12709:19;;;12703:26;-1:-1:-1;;12792:1:1;12788:14;;;12804:3;12784:24;12780:37;12776:42;12761:58;12746:74;;12633:201;-1:-1:-1;;;;;12880:1:1;12864:14;;;12860:22;12847:36;;-1:-1:-1;11798:1352:1:o;13155:413::-;13357:2;13339:21;;;13396:2;13376:18;;;13369:30;13435:34;13430:2;13415:18;;13408:62;-1:-1:-1;;;13501:2:1;13486:18;;13479:47;13558:3;13543:19;;13155:413::o;13573:127::-;13634:10;13629:3;13625:20;13622:1;13615:31;13665:4;13662:1;13655:15;13689:4;13686:1;13679:15;13705:168;13745:7;13811:1;13807;13803:6;13799:14;13796:1;13793:21;13788:1;13781:9;13774:17;13770:45;13767:71;;;13818:18;;:::i;:::-;-1:-1:-1;13858:9:1;;13705:168::o;13878:127::-;13939:10;13934:3;13930:20;13927:1;13920:31;13970:4;13967:1;13960:15;13994:4;13991:1;13984:15;14010:120;14050:1;14076;14066:35;;14081:18;;:::i;:::-;-1:-1:-1;14115:9:1;;14010:120::o;14135:125::-;14175:4;14203:1;14200;14197:8;14194:34;;;14208:18;;:::i;:::-;-1:-1:-1;14245:9:1;;14135:125::o;14265:128::-;14305:3;14336:1;14332:6;14329:1;14326:13;14323:39;;;14342:18;;:::i;:::-;-1:-1:-1;14378:9:1;;14265:128::o;15223:127::-;15284:10;15279:3;15275:20;15272:1;15265:31;15315:4;15312:1;15305:15;15339:4;15336:1;15329:15;16176:112;16208:1;16234;16224:35;;16239:18;;:::i;:::-;-1:-1:-1;16273:9:1;;16176:112::o;16293:418::-;-1:-1:-1;;;16550:3:1;16543:16;16525:3;16588:6;16582:13;16604:61;16658:6;16654:1;16649:3;16645:11;16638:4;16630:6;16626:17;16604:61;:::i;:::-;16685:16;;;;16703:1;16681:24;;16293:418;-1:-1:-1;;16293:418:1:o;16716:135::-;16755:3;16776:17;;;16773:43;;16796:18;;:::i;:::-;-1:-1:-1;16843:1:1;16832:13;;16716:135::o;16856:614::-;17136:3;17174:6;17168:13;17190:53;17236:6;17231:3;17224:4;17216:6;17212:17;17190:53;:::i;:::-;-1:-1:-1;;;17265:16:1;;;17290:18;;;17333:13;;17355:65;17333:13;17407:1;17396:13;;17389:4;17377:17;;17355:65;:::i;:::-;17440:20;17462:1;17436:28;;16856:614;-1:-1:-1;;;;16856:614:1:o;18189:470::-;18368:3;18406:6;18400:13;18422:53;18468:6;18463:3;18456:4;18448:6;18444:17;18422:53;:::i;:::-;18538:13;;18497:16;;;;18560:57;18538:13;18497:16;18594:4;18582:17;;18560:57;:::i;:::-;18633:20;;18189:470;-1:-1:-1;;;;18189:470:1:o;19972:722::-;20022:3;20063:5;20057:12;20092:36;20118:9;20092:36;:::i;:::-;20147:1;20164:18;;;20191:133;;;;20338:1;20333:355;;;;20157:531;;20191:133;-1:-1:-1;;20224:24:1;;20212:37;;20297:14;;20290:22;20278:35;;20269:45;;;-1:-1:-1;20191:133:1;;20333:355;20364:5;20361:1;20354:16;20393:4;20438:2;20435:1;20425:16;20463:1;20477:165;20491:6;20488:1;20485:13;20477:165;;;20569:14;;20556:11;;;20549:35;20612:16;;;;20506:10;;20477:165;;;20481:3;;;20671:6;20666:3;20662:16;20655:23;;20157:531;;;;;19972:722;;;;:::o;20699:1553::-;21354:66;21342:79;;-1:-1:-1;;;21446:2:1;21437:12;;21430:77;-1:-1:-1;21526:47:1;21569:2;21560:12;;21552:6;21526:47;:::i;:::-;21593:66;21589:2;21582:78;21689:66;21684:2;21680;21676:11;21669:87;21775:46;21817:2;21813;21809:11;21801:6;21775:46;:::i;:::-;21765:56;;21841:66;21837:2;21830:78;21937:66;21932:2;21928;21924:11;21917:87;-1:-1:-1;;;22028:2:1;22024;22020:11;22013:29;22071:6;22065:13;22087:59;22139:6;22134:2;22130;22126:11;22121:2;22113:6;22109:15;22087:59;:::i;:::-;-1:-1:-1;;;22204:2:1;22165:15;;;;22196:11;;;22189:30;22243:2;22235:11;;20699:1553;-1:-1:-1;;;;;20699:1553:1:o;22257:1662::-;23055:66;23043:79;;-1:-1:-1;;;23147:2:1;23138:12;;23131:75;-1:-1:-1;23225:47:1;23268:2;23259:12;;23251:6;23225:47;:::i;:::-;23292:66;23288:2;23281:78;23388:66;23383:2;23379;23375:11;23368:87;23474:46;23516:2;23512;23508:11;23500:6;23474:46;:::i;:::-;23464:56;;-1:-1:-1;;;23536:2:1;23529:16;23564:45;23606:1;23602:2;23598:10;23590:6;23564:45;:::i;:::-;23554:55;;23629:66;23625:2;23618:78;23725:66;23720:2;23716;23712:11;23705:87;23811:46;23853:2;23849;23845:11;23837:6;23811:46;:::i;:::-;-1:-1:-1;;;23866:21:1;;23911:1;23903:10;;22257:1662;-1:-1:-1;;;;;;;22257:1662:1:o;23924:1515::-;24436:66;24431:3;24424:79;24533:66;24528:2;24523:3;24519:12;24512:88;-1:-1:-1;;;24625:2:1;24620:3;24616:12;24609:33;24406:3;24671:6;24665:13;24687:60;24740:6;24735:2;24730:3;24726:12;24721:2;24713:6;24709:15;24687:60;:::i;:::-;24811:66;24806:2;24766:16;;;24798:11;;;24791:87;24908:66;24902:3;24894:12;;24887:88;25005:66;24999:3;24991:12;;24984:88;25102:66;25096:3;25088:12;;25081:88;-1:-1:-1;;;25193:3:1;25185:12;;25178:42;25245:13;;25267:62;25245:13;25314:3;25306:12;;25301:2;25289:15;;25267:62;:::i;:::-;-1:-1:-1;;;25389:3:1;25348:17;;;;25381:12;;;25374:31;25429:3;25421:12;;23924:1515;-1:-1:-1;;;;23924:1515:1:o;25444:878::-;25950:66;25938:79;;-1:-1:-1;;;26042:2:1;26033:12;;26026:75;-1:-1:-1;26120:47:1;26163:2;26154:12;;26146:6;26120:47;:::i;:::-;-1:-1:-1;;;26183:2:1;26176:21;26216:45;26258:1;26254:2;26250:10;26242:6;26216:45;:::i;:::-;-1:-1:-1;;;26270:20:1;;26314:1;26306:10;;25444:878;-1:-1:-1;;;;;25444:878:1:o;26327:1052::-;26650:3;26688:6;26682:13;26704:53;26750:6;26745:3;26738:4;26730:6;26726:17;26704:53;:::i;:::-;26820:13;;26779:16;;;;26842:57;26820:13;26779:16;26876:4;26864:17;;26842:57;:::i;:::-;26966:13;;26921:20;;;26988:57;26966:13;26921:20;27022:4;27010:17;;26988:57;:::i;:::-;27112:13;;27067:20;;;27134:57;27112:13;27067:20;27168:4;27156:17;;27134:57;:::i;:::-;27258:13;;27213:20;;;27280:57;27258:13;27213:20;27314:4;27302:17;;27280:57;:::i;:::-;27353:20;;26327:1052;-1:-1:-1;;;;;;;26327:1052:1:o;27660:1686::-;-1:-1:-1;;;28309:61:1;;28393:13;;28291:3;;28415:62;28393:13;28465:2;28456:12;;28449:4;28437:17;;28415:62;:::i;:::-;28541:66;28536:2;28496:16;;;28528:11;;;28521:87;28637:34;28632:2;28624:11;;28617:55;28701:34;28696:2;28688:11;;28681:55;28766:34;28760:3;28752:12;;28745:56;28831:34;28825:3;28817:12;;28810:56;28896:34;28890:3;28882:12;;28875:56;28961:34;28955:3;28947:12;;28940:56;29026:34;29020:3;29012:12;;29005:56;29091:66;29085:3;29077:12;;29070:88;-1:-1:-1;;;29182:3:1;29174:12;;29167:34;29217:123;29247:92;29273:65;29298:39;29332:3;29324:12;;29316:6;29298:39;:::i;:::-;-1:-1:-1;;;27444:57:1;;27526:2;27517:12;;27384:151;29273:65;29265:6;29247:92;:::i;:::-;-1:-1:-1;;;27605:17:1;;27647:1;27638:11;;27540:115;29217:123;29210:130;27660:1686;-1:-1:-1;;;;;;27660:1686:1:o;29351:448::-;29613:31;29608:3;29601:44;29583:3;29674:6;29668:13;29690:62;29745:6;29740:2;29735:3;29731:12;29724:4;29716:6;29712:17;29690:62;:::i;:::-;29772:16;;;;29790:2;29768:25;;29351:448;-1:-1:-1;;29351:448:1:o;30267:184::-;30337:6;30390:2;30378:9;30369:7;30365:23;30361:32;30358:52;;;30406:1;30403;30396:12;30358:52;-1:-1:-1;30429:16:1;;30267:184;-1:-1:-1;30267:184:1:o;32091:414::-;32293:2;32275:21;;;32332:2;32312:18;;;32305:30;32371:34;32366:2;32351:18;;32344:62;-1:-1:-1;;;32437:2:1;32422:18;;32415:48;32495:3;32480:19;;32091:414::o;32510:422::-;32599:1;32642:5;32599:1;32656:270;32677:7;32667:8;32664:21;32656:270;;;32736:4;32732:1;32728:6;32724:17;32718:4;32715:27;32712:53;;;32745:18;;:::i;:::-;32795:7;32785:8;32781:22;32778:55;;;32815:16;;;;32778:55;32894:22;;;;32854:15;;;;32656:270;;;32660:3;32510:422;;;;;:::o;32937:806::-;32986:5;33016:8;33006:80;;-1:-1:-1;33057:1:1;33071:5;;33006:80;33105:4;33095:76;;-1:-1:-1;33142:1:1;33156:5;;33095:76;33187:4;33205:1;33200:59;;;;33273:1;33268:130;;;;33180:218;;33200:59;33230:1;33221:10;;33244:5;;;33268:130;33305:3;33295:8;33292:17;33289:43;;;33312:18;;:::i;:::-;-1:-1:-1;;33368:1:1;33354:16;;33383:5;;33180:218;;33482:2;33472:8;33469:16;33463:3;33457:4;33454:13;33450:36;33444:2;33434:8;33431:16;33426:2;33420:4;33417:12;33413:35;33410:77;33407:159;;;-1:-1:-1;33519:19:1;;;33551:5;;33407:159;33598:34;33623:8;33617:4;33598:34;:::i;:::-;33668:6;33664:1;33660:6;33656:19;33647:7;33644:32;33641:58;;;33679:18;;:::i;:::-;33717:20;;32937:806;-1:-1:-1;;;32937:806:1:o;33748:131::-;33808:5;33837:36;33864:8;33858:4;33837:36;:::i;33884:165::-;33922:1;33956:4;33953:1;33949:12;33980:3;33970:37;;33987:18;;:::i;:::-;34039:3;34032:4;34029:1;34025:12;34021:22;34016:27;;;33884:165;;;;:::o;34054:238::-;34092:7;34132:4;34129:1;34125:12;34164:4;34161:1;34157:12;34224:3;34218:4;34214:14;34209:3;34206:23;34199:3;34192:11;34185:19;34181:49;34178:75;;;34233:18;;:::i;34297:195::-;34335:4;34372;34369:1;34365:12;34404:4;34401:1;34397:12;34429:3;34424;34421:12;34418:38;;;34436:18;;:::i;:::-;34473:13;;;34297:195;-1:-1:-1;;;34297:195:1:o;34939:2659::-;36490:66;36485:3;36478:79;36460:3;36586:6;36580:13;36602:62;36657:6;36652:2;36647:3;36643:12;36636:4;36628:6;36624:17;36602:62;:::i;:::-;-1:-1:-1;;;36758:2:1;36683:16;;;36750:11;;;36743:23;;;-1:-1:-1;;;36851:2:1;36843:11;;36836:23;;;36884:13;;36906:63;36884:13;36955:2;36947:11;;36940:4;36928:17;;36906:63;:::i;:::-;-1:-1:-1;;;37029:2:1;36988:17;;;;37021:11;;;37014:55;37088:46;37130:2;37122:11;;37114:6;37088:46;:::i;:::-;37143:14;;;37181:1;37173:10;;37166:22;37213:13;;37078:56;;-1:-1:-1;37235:63:1;37213:13;37284:2;37276:11;;37269:4;37257:17;;37235:63;:::i;:::-;37314:278;37344:247;37378:212;37408:181;37434:154;37464:123;37494:92;37528:57;37581:2;37570:8;37566:2;37562:17;37558:26;-1:-1:-1;;;34853:47:1;;34925:2;34916:12;;34788:146;37528:57;37520:6;37494:92;:::i;:::-;-1:-1:-1;;;34562:29:1;;34616:1;34607:11;;34497:127;37464:123;-1:-1:-1;;;34694:55:1;;34774:2;34765:12;;34629:154;37434;37426:6;37408:181;:::i;:::-;-1:-1:-1;;;34853:47:1;;34925:2;34916:12;;34788:146;37378:212;37370:6;37344:247;:::i;37314:278::-;37307:285;34939:2659;-1:-1:-1;;;;;;;;;;;34939:2659:1:o;37603:2842::-;39273:3;39310:32;39305:3;39301:42;39364:2;39359:3;39352:15;39396:6;39390:13;39412:62;39467:6;39462:2;39457:3;39453:12;39446:4;39438:6;39434:17;39412:62;:::i;:::-;39526:24;39521:3;39517:34;39512:2;39503:6;39498:3;39494:16;39490:25;39483:69;39571:60;39627:2;39618:6;39613:3;39609:16;39605:25;39597:6;39571:60;:::i;:::-;39561:70;;39659:6;39654:3;39650:16;39686:2;39682;39675:14;39717:2;39713:1;39709:2;39705:10;39698:22;39751:6;39745:13;39767:63;39821:8;39816:2;39812;39808:11;39801:4;39793:6;39789:17;39767:63;:::i;:::-;39883:24;39878:3;39874:34;39869:2;39858:8;39854:2;39850:17;39846:26;39839:70;39928:61;39985:2;39974:8;39970:2;39966:17;39962:26;39954:6;39928:61;:::i;:::-;39998:14;;;-1:-1:-1;40036:1:1;40028:10;;40021:22;;;;-1:-1:-1;40068:13:1;;;40090:63;40068:13;40139:2;40131:11;;40124:4;40112:17;;40090:63;:::i;:::-;40169:270;40199:239;40225:212;40255:181;40281:154;40311:123;40341:92;40375:57;40428:2;40417:8;40413:2;40409:17;40405:26;-1:-1:-1;;;34853:47:1;;34925:2;34916:12;;34788:146;40225:212;40217:6;40199:239;:::i;40169:270::-;40162:277;37603:2842;-1:-1:-1;;;;;;;;;;;;37603:2842:1:o;40580:2532::-;41985:66;41980:3;41973:79;42091:7;42086:3;42082:17;42077:2;42072:3;42068:12;42061:39;41955:3;42129:6;42123:13;42145:60;42198:6;42193:2;42188:3;42184:12;42179:2;42171:6;42167:15;42145:60;:::i;:::-;-1:-1:-1;;;42299:2:1;42224:16;;;42291:11;;;42284:23;;;-1:-1:-1;;;42331:2:1;42323:11;;42316:63;42404:13;;42426:61;42404:13;42473:2;42465:11;;42460:2;42448:15;;42426:61;:::i;:::-;-1:-1:-1;;;42547:2:1;42506:17;;;;42539:11;;;42532:55;42606:46;42648:2;42640:11;;42632:6;42606:46;:::i;:::-;42596:56;;42672:2;42668;42661:14;;42703:66;42699:1;42695:2;42691:10;42684:86;42801:6;42795:13;42817:61;42869:8;42864:2;42860;42856:11;42851:2;42843:6;42839:15;42817:61;:::i;:::-;42894:212;42924:181;42958:146;42988:115;43014:88;43044:57;43097:2;43086:8;43082:2;43078:17;43074:26;-1:-1:-1;;;34562:29:1;;34616:1;34607:11;;34497:127;42924:181;-1:-1:-1;;;40515:27:1;;40567:1;40558:11;;40450:125;42894:212;42887:219;40580:2532;-1:-1:-1;;;;;;;;;;40580:2532:1:o;43117:664::-;43344:3;43382:6;43376:13;43398:53;43444:6;43439:3;43432:4;43424:6;43420:17;43398:53;:::i;:::-;43514:13;;43473:16;;;;43536:57;43514:13;43473:16;43570:4;43558:17;;43536:57;:::i;:::-;43660:13;;43615:20;;;43682:57;43660:13;43615:20;43716:4;43704:17;;43682:57;:::i;:::-;43755:20;;43117:664;-1:-1:-1;;;;;43117:664:1:o;43786:175::-;43823:3;43867:4;43860:5;43856:16;43896:4;43887:7;43884:17;43881:43;;43904:18;;:::i;:::-;43953:1;43940:15;;43786:175;-1:-1:-1;;43786:175:1:o;43966:136::-;44005:3;44033:5;44023:39;;44042:18;;:::i;:::-;-1:-1:-1;;;44078:18:1;;43966:136::o;44107:500::-;-1:-1:-1;;;;;44376:15:1;;;44358:34;;44428:15;;44423:2;44408:18;;44401:43;44475:2;44460:18;;44453:34;;;44523:3;44518:2;44503:18;;44496:31;;;44301:4;;44544:57;;44581:19;;44573:6;44544:57;:::i;44612:249::-;44681:6;44734:2;44722:9;44713:7;44709:23;44705:32;44702:52;;;44750:1;44747;44740:12;44702:52;44782:9;44776:16;44801:30;44825:5;44801:30;:::i;44866:204::-;44904:3;44940:4;44937:1;44933:12;44972:4;44969:1;44965:12;45007:3;45001:4;44997:14;44992:3;44989:23;44986:49;;;45015:18;;:::i;:::-;45051:13;;44866:204;-1:-1:-1;;;44866:204:1:o;45075:127::-;45136:10;45131:3;45127:20;45124:1;45117:31;45167:4;45164:1;45157:15;45191:4;45188:1;45181:15
Swarm Source
ipfs://5cf1494e2388360f7d0cc2de4f2bd311827ca0de92184e9ab26ebd0305c781f3
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $3,991.96 | 0.00557694 | $22.26 |
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.