Source Code
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 208 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Set Approval For... | 23790601 | 118 days ago | IN | 0 ETH | 0.0001222 | ||||
| Set Approval For... | 23039989 | 223 days ago | IN | 0 ETH | 0.00034839 | ||||
| Set Approval For... | 20746496 | 543 days ago | IN | 0 ETH | 0.00006013 | ||||
| Set Approval For... | 19894775 | 662 days ago | IN | 0 ETH | 0.00013299 | ||||
| Set Approval For... | 19690606 | 691 days ago | IN | 0 ETH | 0.00081024 | ||||
| Set Approval For... | 17758082 | 962 days ago | IN | 0 ETH | 0.0015125 | ||||
| Set Approval For... | 16842727 | 1091 days ago | IN | 0 ETH | 0.00135041 | ||||
| Set Approval For... | 15899647 | 1223 days ago | IN | 0 ETH | 0.00069063 | ||||
| Set Approval For... | 15810720 | 1235 days ago | IN | 0 ETH | 0.00063406 | ||||
| Set Approval For... | 15394233 | 1296 days ago | IN | 0 ETH | 0.00037775 | ||||
| Set Approval For... | 15345535 | 1304 days ago | IN | 0 ETH | 0.00055952 | ||||
| Safe Transfer Fr... | 15239820 | 1321 days ago | IN | 0 ETH | 0.00066289 | ||||
| Safe Transfer Fr... | 15239790 | 1321 days ago | IN | 0 ETH | 0.00075454 | ||||
| Safe Transfer Fr... | 15239778 | 1321 days ago | IN | 0 ETH | 0.00061547 | ||||
| Safe Transfer Fr... | 15239768 | 1321 days ago | IN | 0 ETH | 0.00058748 | ||||
| Safe Transfer Fr... | 15239763 | 1321 days ago | IN | 0 ETH | 0.00067137 | ||||
| Set Approval For... | 14999444 | 1360 days ago | IN | 0 ETH | 0.00086378 | ||||
| Set Approval For... | 14692940 | 1410 days ago | IN | 0 ETH | 0.00329075 | ||||
| Grant Role | 14664106 | 1414 days ago | IN | 0 ETH | 0.00242407 | ||||
| Safe Transfer Fr... | 14427683 | 1451 days ago | IN | 0 ETH | 0.00096995 | ||||
| Set Approval For... | 14351010 | 1463 days ago | IN | 0 ETH | 0.00181227 | ||||
| Set Approval For... | 14242666 | 1480 days ago | IN | 0 ETH | 0.00085095 | ||||
| Set Approval For... | 14237233 | 1481 days ago | IN | 0 ETH | 0.0030214 | ||||
| Safe Transfer Fr... | 14069887 | 1507 days ago | IN | 0 ETH | 0.00710332 | ||||
| Set Approval For... | 14044754 | 1511 days ago | IN | 0 ETH | 0.00699734 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
VenlyERC1155
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2021-11-15
*/
/**
/**
* \\ //
* \\\\\\\\ ////////
* \\\\\\\\\\\\\\ ///////////////
* \\\\\\\\\\\\\\\\ ////////////////
* \\\\\\\\\\\\\\\\ ////////////////
* \\\\\\\\\\\\\\\\ ////////////////
* \\\\\\\\\\\\\\\\ ////////////////
* \\\\\\\\\\\\\\\\ ////////////////
* \\\ \\\\\\\\\\\\\\\\ //////////////// ///
* \\\\\\\\\\\\\\\\\\\\\\\\ ////////////////////////
* \\\\\\\\\\\\\\\\\\\\\\\\ ////////////////////////
* \\\\\\\\\\\\\\\\\\\\\\\ ///////////////////////
* \\\\\\\\\\\\\\\\\\\\\\\ ///////////////////////
* \\\\\\\\\\\\\\\\\\\\\\ //////////////////////
* \\\\\\\\\\\\\\ \\\\ //// //////////////
* \\\\\\\\\\\\\ /////////////
* \\\\\\\\\\\\\\ //////////////
* \\\\\\\\\\\\\ /////////////
* \\\\\\\\\\\\\\ //////////////
* \\\\\\\\\\\\\ /////////////
* \\\\\\\\\\\\\ //////////////
* \\\\\\\\\\\\\\/////////////
* \\\\\\\\\\\\\////////////
* \\\\\\\\\\\//////////
* \\\\\\\\\\/////////
*
*
* ██╗ ██╗███████╗███╗ ██╗██╗ ██╗ ██╗
* ██║ ██║██╔════╝████╗ ██║██║ ╚██╗ ██╔╝
* ██║ ██║█████╗ ██╔██╗ ██║██║ ╚████╔╝
* ╚██╗ ██╔╝██╔══╝ ██║╚██╗██║██║ ╚██╔╝
* ╚████╔╝ ███████╗██║ ╚████║███████╗██║
* ╚═══╝ ╚══════╝╚═╝ ╚═══╝╚══════╝╚═╝
*
*
* Copyright (C) 2020 Arkane BV (https://kbopub.economie.fgov.be/kbopub/toonondernemingps.html?lang=en&ondernemingsnummer=704738355)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* SPDX-License-Identifier: Apache-2.0
*
*/
pragma solidity ^0.8.4;
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the substraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
return a + b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return a - b;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
return a * b;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator.
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return a % b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {trySub}.
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
unchecked {
require(b <= a, errorMessage);
return a - b;
}
}
/**
* @dev Returns the integer division of two unsigned integers, reverting with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a / b;
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting with custom message when dividing by zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryMod}.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a % b;
}
}
}
library Strings {
bytes16 private constant alphabet = "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] = alphabet[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
}
abstract contract Context {
function _msgSender() internal view virtual returns (address payable) {
return payable(msg.sender);
}
function _msgData() internal view virtual returns (bytes calldata) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
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);
}
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
interface IAccessControl {
function hasRole(bytes32 role, address account) external view returns (bool);
function getRoleAdmin(bytes32 role) external view returns (bytes32);
function grantRole(bytes32 role, address account) external;
function revokeRole(bytes32 role, address account) external;
function renounceRole(bytes32 role, address account) external;
}
abstract contract AccessControl is Context, IAccessControl, ERC165 {
struct RoleData {
mapping (address => bool) members;
bytes32 adminRole;
}
mapping (bytes32 => RoleData) private _roles;
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
/**
* @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
*
* `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
* {RoleAdminChanged} not being emitted signaling this.
*
* _Available since v3.1._
*/
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
/**
* @dev Emitted when `account` is granted `role`.
*
* `sender` is the account that originated the contract call, an admin role
* bearer except when using {_setupRole}.
*/
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Emitted when `account` is revoked `role`.
*
* `sender` is the account that originated the contract call:
* - if using `revokeRole`, it is the admin role bearer
* - if using `renounceRole`, it is the role bearer (i.e. `account`)
*/
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Modifier that checks that an account has a specific role. Reverts
* with a standardized message including the required role.
*
* The format of the revert reason is given by the following regular expression:
*
* /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/
*
* _Available since v4.1._
*/
modifier onlyRole(bytes32 role) {
_checkRole(role, _msgSender());
_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IAccessControl).interfaceId
|| super.supportsInterface(interfaceId);
}
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) public view override returns (bool) {
return _roles[role].members[account];
}
/**
* @dev Revert with a standard message if `account` is missing `role`.
*
* The format of the revert reason is given by the following regular expression:
*
* /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/
*/
function _checkRole(bytes32 role, address account) internal view {
if(!hasRole(role, account)) {
revert(string(abi.encodePacked(
"AccessControl: account ",
Strings.toHexString(uint160(account), 20),
" is missing role ",
Strings.toHexString(uint256(role), 32)
)));
}
}
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) public view override returns (bytes32) {
return _roles[role].adminRole;
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
_grantRole(role, account);
}
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
_revokeRole(role, account);
}
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been granted `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `account`.
*/
function renounceRole(bytes32 role, address account) public virtual override {
require(account == _msgSender(), "AccessControl: can only renounce roles for self");
_revokeRole(role, account);
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event. Note that unlike {grantRole}, this function doesn't perform any
* checks on the calling account.
*
* [WARNING]
* ====
* This function should only be called from the constructor when setting
* up the initial roles for the system.
*
* Using this function in any other way is effectively circumventing the admin
* system imposed by {AccessControl}.
* ====
*/
function _setupRole(bytes32 role, address account) internal virtual {
_grantRole(role, account);
}
/**
* @dev Sets `adminRole` as ``role``'s admin role.
*
* Emits a {RoleAdminChanged} event.
*/
function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
emit RoleAdminChanged(role, getRoleAdmin(role), adminRole);
_roles[role].adminRole = adminRole;
}
function _grantRole(bytes32 role, address account) private {
if (!hasRole(role, account)) {
_roles[role].members[account] = true;
emit RoleGranted(role, account, _msgSender());
}
}
function _revokeRole(bytes32 role, address account) private {
if (hasRole(role, account)) {
_roles[role].members[account] = false;
emit RoleRevoked(role, account, _msgSender());
}
}
}
/**
* @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
* behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an
* external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
* function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
*
* TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
* possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
*
* CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
* that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
*/
abstract contract Initializable {
/**
* @dev Indicates that the contract has been initialized.
*/
bool private _initialized;
/**
* @dev Indicates that the contract is in the process of being initialized.
*/
bool private _initializing;
/**
* @dev Modifier to protect an initializer function from being invoked twice.
*/
modifier initializer() {
require(_initializing || !_initialized, "Initializable: contract is already initialized");
bool isTopLevelCall = !_initializing;
if (isTopLevelCall) {
_initializing = true;
_initialized = true;
}
_;
if (isTopLevelCall) {
_initializing = false;
}
}
}
contract EIP712Base is Initializable {
struct EIP712Domain {
string name;
string version;
address verifyingContract;
bytes32 salt;
}
string constant public ERC712_VERSION = "1";
bytes32 internal constant EIP712_DOMAIN_TYPEHASH = keccak256(
bytes(
"EIP712Domain(string name,string version,address verifyingContract,bytes32 salt)"
)
);
bytes32 internal domainSeperator;
// supposed to be called once while initializing.
// one of the contractsa that inherits this contract follows proxy pattern
// so it is not possible to do this in a constructor
function _initializeEIP712(
string memory name
)
internal
initializer
{
_setDomainSeperator(name);
}
function _setDomainSeperator(string memory name) internal {
domainSeperator = keccak256(
abi.encode(
EIP712_DOMAIN_TYPEHASH,
keccak256(bytes(name)),
keccak256(bytes(ERC712_VERSION)),
address(this),
bytes32(getChainId())
)
);
}
function getDomainSeperator() public view returns (bytes32) {
return domainSeperator;
}
function getChainId() public view returns (uint256) {
uint256 id;
assembly {
id := chainid()
}
return id;
}
/**
* Accept message hash and returns hash message in EIP712 compatible form
* So that it can be used to recover signer from signature signed using EIP712 formatted data
* https://eips.ethereum.org/EIPS/eip-712
* "\\x19" makes the encoding deterministic
* "\\x01" is the version byte to make it compatible to EIP-191
*/
function toTypedMessageHash(bytes32 messageHash)
internal
view
returns (bytes32)
{
return
keccak256(
abi.encodePacked("\x19\x01", getDomainSeperator(), messageHash)
);
}
}
/**
* @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 AccessControl {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @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(hasRole(DEFAULT_ADMIN_ROLE, _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 onlyRole(DEFAULT_ADMIN_ROLE) {
_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 onlyRole(DEFAULT_ADMIN_ROLE) {
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);
}
}
contract NativeMetaTransaction is EIP712Base {
using SafeMath for uint256;
bytes32 private constant META_TRANSACTION_TYPEHASH = keccak256(
bytes(
"MetaTransaction(uint256 nonce,address from,bytes functionSignature)"
)
);
event MetaTransactionExecuted(
address userAddress,
address payable relayerAddress,
bytes functionSignature
);
mapping(address => uint256) nonces;
/*
* Meta transaction structure.
* No point of including value field here as if user is doing value transfer then he has the funds to pay for gas
* He should call the desired function directly in that case.
*/
struct MetaTransaction {
uint256 nonce;
address from;
bytes functionSignature;
}
function executeMetaTransaction(
address userAddress,
bytes memory functionSignature,
bytes32 sigR,
bytes32 sigS,
uint8 sigV
) public payable returns (bytes memory) {
MetaTransaction memory metaTx = MetaTransaction({
nonce: nonces[userAddress],
from: userAddress,
functionSignature: functionSignature
});
require(
verify(userAddress, metaTx, sigR, sigS, sigV),
"Signer and signature do not match"
);
// increase nonce for user (to avoid re-use)
nonces[userAddress] = nonces[userAddress].add(1);
emit MetaTransactionExecuted(
userAddress,
payable(msg.sender),
functionSignature
);
// Append userAddress and relayer address at the end to extract it from calling context
(bool success, bytes memory returnData) = address(this).call(
abi.encodePacked(functionSignature, userAddress)
);
require(success, "Function call not successful");
return returnData;
}
function hashMetaTransaction(MetaTransaction memory metaTx)
internal
pure
returns (bytes32)
{
return
keccak256(
abi.encode(
META_TRANSACTION_TYPEHASH,
metaTx.nonce,
metaTx.from,
keccak256(metaTx.functionSignature)
)
);
}
function getNonce(address user) public view returns (uint256 nonce) {
nonce = nonces[user];
}
function verify(
address signer,
MetaTransaction memory metaTx,
bytes32 sigR,
bytes32 sigS,
uint8 sigV
) internal view returns (bool) {
require(signer != address(0), "NativeMetaTransaction: INVALID_SIGNER");
return
signer ==
ecrecover(
toTypedMessageHash(hashMetaTransaction(metaTx)),
sigV,
sigR,
sigS
);
}
}
/**
* @dev Required interface of an ERC1155 compliant contract, as defined in the
* https://eips.ethereum.org/EIPS/eip-1155[EIP].
*
* _Available since v3.1._
*/
interface IERC1155 is IERC165 {
/**
* @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
*/
event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);
/**
* @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
* transfers.
*/
event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);
/**
* @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
* `approved`.
*/
event ApprovalForAll(address indexed account, address indexed operator, bool approved);
/**
* @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
*
* If an {URI} event was emitted for `id`, the standard
* https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
* returned by {IERC1155MetadataURI-uri}.
*/
event URI(string value, uint256 indexed id);
/**
* @dev Returns the amount of tokens of token type `id` owned by `account`.
*
* Requirements:
*
* - `account` cannot be the zero address.
*/
function balanceOf(address account, uint256 id) external view returns (uint256);
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
*
* Requirements:
*
* - `accounts` and `ids` must have the same length.
*/
function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory);
/**
* @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
*
* Emits an {ApprovalForAll} event.
*
* Requirements:
*
* - `operator` cannot be the caller.
*/
function setApprovalForAll(address operator, bool approved) external;
/**
* @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
*
* See {setApprovalForAll}.
*/
function isApprovedForAll(address account, address operator) external view returns (bool);
/**
* @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
*
* Emits a {TransferSingle} event.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
* - `from` must have a balance of tokens of type `id` of at least `amount`.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
* acceptance magic value.
*/
function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external;
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
*
* Emits a {TransferBatch} event.
*
* Requirements:
*
* - `ids` and `amounts` must have the same length.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
* acceptance magic value.
*/
function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data) external;
}
interface IERC1155Receiver is IERC165 {
/**
@dev Handles the receipt of a single ERC1155 token type. This function is
called at the end of a `safeTransferFrom` after the balance has been updated.
To accept the transfer, this must return
`bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
(i.e. 0xf23a6e61, or its own function selector).
@param operator The address which initiated the transfer (i.e. msg.sender)
@param from The address which previously owned the token
@param id The ID of the token being transferred
@param value The amount of tokens being transferred
@param data Additional data with no specified format
@return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
*/
function onERC1155Received(
address operator,
address from,
uint256 id,
uint256 value,
bytes calldata data
)
external
returns(bytes4);
/**
@dev Handles the receipt of a multiple ERC1155 token types. This function
is called at the end of a `safeBatchTransferFrom` after the balances have
been updated. To accept the transfer(s), this must return
`bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
(i.e. 0xbc197c81, or its own function selector).
@param operator The address which initiated the batch transfer (i.e. msg.sender)
@param from The address which previously owned the token
@param ids An array containing ids of each token being transferred (order and length must match values array)
@param values An array containing amounts of each token being transferred (order and length must match ids array)
@param data Additional data with no specified format
@return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
*/
function onERC1155BatchReceived(
address operator,
address from,
uint256[] calldata ids,
uint256[] calldata values,
bytes calldata data
)
external
returns(bytes4);
}
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
// solhint-disable-next-line no-inline-assembly
assembly { size := extcodesize(account) }
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
// solhint-disable-next-line avoid-low-level-calls, avoid-call-value
(bool success, ) = recipient.call{ value: amount }("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain`call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{ value: value }(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.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");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.delegatecall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
interface IERC1155MetadataURI is IERC1155 {
/**
* @dev Returns the URI for token type `id`.
*
* If the `\{id\}` substring is present in the URI, it must be replaced by
* clients with the actual token type ID.
*/
function uri(uint256 id) external view returns (string memory);
}
abstract contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
using Address for address;
// Mapping from token ID to account balances
mapping(uint256 => mapping(address => uint256)) private _balances;
// Mapping from account to operator approvals
mapping(address => mapping(address => bool)) private _operatorApprovals;
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return interfaceId == type(IERC1155).interfaceId
|| interfaceId == type(IERC1155MetadataURI).interfaceId;
}
/**
* @dev See {IERC1155-balanceOf}.
*
* Requirements:
*
* - `account` cannot be the zero address.
*/
function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
require(account != address(0), "ERC1155: balance query for the zero address");
return _balances[id][account];
}
/**
* @dev See {IERC1155-balanceOfBatch}.
*
* Requirements:
*
* - `accounts` and `ids` must have the same length.
*/
function balanceOfBatch(
address[] memory accounts,
uint256[] memory ids
)
public
view
virtual
override
returns (uint256[] memory)
{
require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");
uint256[] memory batchBalances = new uint256[](accounts.length);
for (uint256 i = 0; i < accounts.length; ++i) {
batchBalances[i] = balanceOf(accounts[i], ids[i]);
}
return batchBalances;
}
/**
* @dev See {IERC1155-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved) public virtual override {
require(_msgSender() != operator, "ERC1155: setting approval status for self");
_operatorApprovals[_msgSender()][operator] = approved;
emit ApprovalForAll(_msgSender(), operator, approved);
}
/**
* @dev See {IERC1155-isApprovedForAll}.
*/
function isApprovedForAll(address account, address operator) public view virtual override returns (bool) {
return _operatorApprovals[account][operator];
}
/**
* @dev See {IERC1155-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 id,
uint256 amount,
bytes memory data
)
public
virtual
override
{
require(to != address(0), "ERC1155: transfer to the zero address");
require(
from == _msgSender() || isApprovedForAll(from, _msgSender()),
"ERC1155: caller is not owner nor approved"
);
address operator = _msgSender();
_beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data);
uint256 fromBalance = _balances[id][from];
require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
_balances[id][from] = fromBalance - amount;
_balances[id][to] += amount;
emit TransferSingle(operator, from, to, id, amount);
_doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
}
/**
* @dev See {IERC1155-safeBatchTransferFrom}.
*/
function safeBatchTransferFrom(
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
)
public
virtual
override
{
require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
require(to != address(0), "ERC1155: transfer to the zero address");
require(
from == _msgSender() || isApprovedForAll(from, _msgSender()),
"ERC1155: transfer caller is not owner nor approved"
);
address operator = _msgSender();
_beforeTokenTransfer(operator, from, to, ids, amounts, data);
for (uint256 i = 0; i < ids.length; ++i) {
uint256 id = ids[i];
uint256 amount = amounts[i];
uint256 fromBalance = _balances[id][from];
require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
_balances[id][from] = fromBalance - amount;
_balances[id][to] += amount;
}
emit TransferBatch(operator, from, to, ids, amounts);
_doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
}
/**
* @dev Creates `amount` tokens of token type `id`, and assigns them to `account`.
*
* Emits a {TransferSingle} event.
*
* Requirements:
*
* - `account` cannot be the zero address.
* - If `account` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
* acceptance magic value.
*/
function _mint(address account, uint256 id, uint256 amount, bytes memory data) internal virtual {
require(account != address(0), "ERC1155: mint to the zero address");
address operator = _msgSender();
_beforeTokenTransfer(operator, address(0), account, _asSingletonArray(id), _asSingletonArray(amount), data);
_balances[id][account] += amount;
emit TransferSingle(operator, address(0), account, id, amount);
_doSafeTransferAcceptanceCheck(operator, address(0), account, id, amount, data);
}
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
*
* Requirements:
*
* - `ids` and `amounts` must have the same length.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
* acceptance magic value.
*/
function _mintBatch(address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data) internal virtual {
require(to != address(0), "ERC1155: mint to the zero address");
require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
address operator = _msgSender();
_beforeTokenTransfer(operator, address(0), to, ids, amounts, data);
for (uint i = 0; i < ids.length; i++) {
_balances[ids[i]][to] += amounts[i];
}
emit TransferBatch(operator, address(0), to, ids, amounts);
_doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
}
/**
* @dev Destroys `amount` tokens of token type `id` from `account`
*
* Requirements:
*
* - `account` cannot be the zero address.
* - `account` must have at least `amount` tokens of token type `id`.
*/
function _burn(address account, uint256 id, uint256 amount) internal virtual {
require(account != address(0), "ERC1155: burn from the zero address");
address operator = _msgSender();
_beforeTokenTransfer(operator, account, address(0), _asSingletonArray(id), _asSingletonArray(amount), "");
uint256 accountBalance = _balances[id][account];
require(accountBalance >= amount, "ERC1155: burn amount exceeds balance");
_balances[id][account] = accountBalance - amount;
emit TransferSingle(operator, account, address(0), id, amount);
}
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
*
* Requirements:
*
* - `ids` and `amounts` must have the same length.
*/
function _burnBatch(address account, uint256[] memory ids, uint256[] memory amounts) internal virtual {
require(account != address(0), "ERC1155: burn from the zero address");
require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
address operator = _msgSender();
_beforeTokenTransfer(operator, account, address(0), ids, amounts, "");
for (uint i = 0; i < ids.length; i++) {
uint256 id = ids[i];
uint256 amount = amounts[i];
uint256 accountBalance = _balances[id][account];
require(accountBalance >= amount, "ERC1155: burn amount exceeds balance");
_balances[id][account] = accountBalance - amount;
}
emit TransferBatch(operator, account, address(0), ids, amounts);
}
/**
* @dev Hook that is called before any token transfer. This includes minting
* and burning, as well as batched variants.
*
* The same hook is called on both single and batched variants. For single
* transfers, the length of the `id` and `amount` arrays will be 1.
*
* Calling conditions (for each `id` and `amount` pair):
*
* - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* of token type `id` will be transferred to `to`.
* - When `from` is zero, `amount` tokens of token type `id` will be minted
* for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
* will be burned.
* - `from` and `to` are never both zero.
* - `ids` and `amounts` have the same, non-zero length.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address operator,
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
)
internal
virtual
{ }
function _doSafeTransferAcceptanceCheck(
address operator,
address from,
address to,
uint256 id,
uint256 amount,
bytes memory data
)
private
{
if (to.isContract()) {
try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
if (response != IERC1155Receiver(to).onERC1155Received.selector) {
revert("ERC1155: ERC1155Receiver rejected tokens");
}
} catch Error(string memory reason) {
revert(reason);
} catch {
revert("ERC1155: transfer to non ERC1155Receiver implementer");
}
}
}
function _doSafeBatchTransferAcceptanceCheck(
address operator,
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
)
private
{
if (to.isContract()) {
try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (bytes4 response) {
if (response != IERC1155Receiver(to).onERC1155BatchReceived.selector) {
revert("ERC1155: ERC1155Receiver rejected tokens");
}
} catch Error(string memory reason) {
revert(reason);
} catch {
revert("ERC1155: transfer to non ERC1155Receiver implementer");
}
}
}
function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
uint256[] memory array = new uint256[](1);
array[0] = element;
return array;
}
}
interface IChildToken {
function deposit(address user, bytes calldata depositData) external;
}
abstract contract ContextMixin {
function msgSender()
internal
view
returns (address payable sender)
{
if (msg.sender == address(this)) {
bytes memory array = msg.data;
uint256 index = msg.data.length;
assembly {
// Load the 32 bytes word from memory with the address on the lower 20 bytes, and mask those.
sender := and(
mload(add(array, index)),
0xffffffffffffffffffffffffffffffffffffffff
)
}
} else {
sender = payable(msg.sender);
}
return sender;
}
}
abstract contract ChildMintableERC1155 is
ERC1155,
IChildToken,
AccessControl,
Ownable,
NativeMetaTransaction,
ContextMixin
{
bytes32 public constant DEPOSITOR_ROLE = keccak256("DEPOSITOR_ROLE");
constructor(string memory name, address childChainManager)
{
_setupRole(DEFAULT_ADMIN_ROLE, _msgSender());
_setupRole(DEPOSITOR_ROLE, childChainManager);
_initializeEIP712(name);
}
function supportsInterface(bytes4 interfaceId) override(AccessControl, ERC1155) virtual public pure returns (bool) {
return interfaceId == type(IAccessControl).interfaceId
|| interfaceId == type(IERC165).interfaceId
|| interfaceId == type(IERC1155).interfaceId
|| interfaceId == type(IERC1155MetadataURI).interfaceId;
}
// This is to support Native meta transactions
// never use msg.sender directly, use _msgSender() instead
function _msgSender()
internal
override
view
returns (address payable sender)
{
return ContextMixin.msgSender();
}
/**
* @notice called when tokens are deposited on root chain
* @dev Should be callable only by ChildChainManager
* Should handle deposit by minting the required tokens for user
* Make sure minting is done only by this function
* @param user user address for whom deposit is being done
* @param depositData abi encoded ids array and amounts array
*/
function deposit(address user, bytes calldata depositData)
external
override
onlyRole(DEPOSITOR_ROLE)
{
(
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) = abi.decode(depositData, (uint256[], uint256[], bytes));
require(
user != address(0),
"ChildMintableERC1155: INVALID_DEPOSIT_USER"
);
_mintBatch(user, ids, amounts, data);
}
/**
* @notice called when user wants to withdraw single token back to root chain
* @dev Should burn user's tokens. This transaction will be verified when exiting on root chain
* @param id id to withdraw
* @param amount amount to withdraw
*/
function withdrawSingle(uint256 id, uint256 amount) external {
_burn(_msgSender(), id, amount);
}
/**
* @notice called when user wants to batch withdraw tokens back to root chain
* @dev Should burn user's tokens. This transaction will be verified when exiting on root chain
* @param ids ids to withdraw
* @param amounts amounts to withdraw
*/
function withdrawBatch(uint256[] calldata ids, uint256[] calldata amounts)
external
{
_burnBatch(_msgSender(), ids, amounts);
}
}
/**
* Interface for marking support for sequence based minting
* Interface id: 0xf79f20b5
*/
interface SequencedMinting {
/**
* @dev return the mint number of the given id
*/
function mintNumber(uint256 id) external view returns (uint256);
}
abstract contract AutoApprovedERC1155 is ChildMintableERC1155 {
mapping(address => bool) private autoApprovedAddresses;
bool public autoApprovedAddressesLocked = false;
event AutoApprove(address operator, bool allowed);
constructor(bool _autoApprovedAddressesLocked) {
autoApprovedAddressesLocked = _autoApprovedAddressesLocked;
}
function isApprovedForAll(address account, address operator) public view virtual override returns (bool) {
return super.isApprovedForAll(account, operator) || autoApprovedAddresses[operator] == true;
}
function setAutoApprovedAddress(address operator, bool allowed) public onlyRole(DEFAULT_ADMIN_ROLE) {
require(autoApprovedAddressesLocked == false, "Auto-approved addresses are locked");
autoApprovedAddresses[operator] = allowed;
emit AutoApprove(operator, allowed);
}
function setAutoApprovedAddressesLocked(bool locked) public onlyRole(DEFAULT_ADMIN_ROLE) {
require(autoApprovedAddressesLocked == false, "Auto-approved addresses are locked");
autoApprovedAddressesLocked = locked;
}
function isAutoApproved(address operator) public view returns (bool) {
return autoApprovedAddresses[operator];
}
}
/**
*
* @dev Implementation that adds type definations to token ids
* Each token will be associtated with a token type, on this token type
* extra restrictions can be provided (ex. fungible, burnable, max amount).
* Tokens are logically grouped together based on their
*
*/
abstract contract TypedERC1155 is AutoApprovedERC1155, SequencedMinting {
using SafeMath for uint256;
mapping(uint256 => uint256) public maxSupplyForType;
mapping(uint256 => uint256) public noTokensForType;
mapping(uint256 => uint256) public typeForToken;
mapping(uint256 => bool) public typeIsBurnable;
mapping(uint256 => bool) public typeIsFungible;
mapping(uint256 => bool) public usedIds;
mapping(uint256 => uint256) private mintNumbers;
mapping(uint256 => string) private uris;
/**
* @dev Emitted when tokens are burned
*/
event TypeCreation(uint256 typeId, uint256 maxSupply, bool fungible, bool burnable, string uri);
event BatchTypeCreation(uint256[] typeIds, uint256[] maxSupplies, bool[] fungible, bool[] burnable, string[] uri);
event NonFungibleMinted(uint256 typeId, uint256 id, address account);
event NonFungibleBatchMinted(uint256 typeId, uint256[] ids, address[] accounts);
event FungibleMinted(uint256 typeId, address account, uint256 amount);
event FungibleBatchMinted(uint256 typeId, address[] accounts, uint256[] amounts);
struct CreateTypeAndMintCommand {
uint256 typeId;
uint256 maxSupply;
bool fungible;
bool burnable;
string uri;
uint256[] ids; //ignored when fungible is true
address[] accounts;
uint256[] amounts; //ignored when fungible is false
}
struct MintCommand {
uint256 typeId;
uint256[] ids; //ignored when fungible is true
address[] accounts;
uint256[] amounts; //ignored when fungible is false
}
constructor(string memory name, address childChainManager, bool _autoApprovedAddressesLocked) ChildMintableERC1155(name, childChainManager) AutoApprovedERC1155(_autoApprovedAddressesLocked) {}
function _createType(uint256 typeId, uint256 maxSupply, bool fungible, bool burnable, string memory uri_) internal onlyRole(DEFAULT_ADMIN_ROLE) {
require(usedIds[typeId] == false, "Supplied typeId is already used");
require(maxSupply > 0, "max supply must be > 0");
maxSupplyForType[typeId] = maxSupply;
typeIsFungible[typeId] = fungible;
typeIsBurnable[typeId] = burnable;
usedIds[typeId] = true;
if (fungible) {
typeForToken[typeId] = typeId;
}
uris[typeId] = uri_;
}
function createType(uint256 typeId, uint256 maxSupply, bool fungible, bool burnable, string memory uri_) public onlyRole(DEFAULT_ADMIN_ROLE) {
_createType(typeId, maxSupply, fungible, burnable, uri_);
emit TypeCreation(typeId, maxSupply, fungible, burnable, uri_);
}
function createTypes(uint256[] calldata typeIds, uint256[] calldata maxSupplies, bool[] calldata fungible, bool[] calldata burnable, string[] calldata uris_) public onlyRole(DEFAULT_ADMIN_ROLE) {
require(
typeIds.length == maxSupplies.length
&& typeIds.length == fungible.length
&& typeIds.length == burnable.length
&& typeIds.length == uris_.length
, "Array arguments must have same length");
for (uint256 i = 0; i < typeIds.length; ++i) {
_createType(typeIds[i], maxSupplies[i], fungible[i], burnable[i], uris_[i]);
}
emit BatchTypeCreation(typeIds, maxSupplies, fungible, burnable, uris_);
}
function _mintNonFungible(uint256 typeId, uint256 id, address account) internal onlyRole(DEFAULT_ADMIN_ROLE) {
require(id > 0);
require(noTokensForType[typeId].add(1) <= maxSupplyForType[typeId], "Minting would exceed the max number of items for given type");
require(usedIds[id] == false, "Supplied id is already used");
require(typeIsFungible[typeId] == false, "Given type is fungible");
usedIds[id] = true;
noTokensForType[typeId] = noTokensForType[typeId].add(1);
typeForToken[id] = typeId;
mintNumbers[id] = noTokensForType[typeId];
_mint(account, id, 1, new bytes(0));
}
function mintNonFungible(uint256 typeId, uint256 id, address account) public onlyRole(DEFAULT_ADMIN_ROLE) {
_mintNonFungible(typeId, id, account);
emit NonFungibleMinted(typeId, id, account);
}
function _mintFungible(uint256 typeId, address account, uint256 amount) internal onlyRole(DEFAULT_ADMIN_ROLE) {
require(typeId > 0);
require(amount > 0, "Amount should be > 0");
require(noTokensForType[typeId].add(amount) <= maxSupplyForType[typeId], "Minting would exceed the max number of items for given type");
require(typeIsFungible[typeId] == true, "typeId is not fungible.");
noTokensForType[typeId] = noTokensForType[typeId].add(amount);
_mint(account, typeId, amount, new bytes(0));
}
function mintFungible(uint256 typeId, address account, uint256 amount) public onlyRole(DEFAULT_ADMIN_ROLE) {
_mintFungible(typeId, account, amount);
emit FungibleMinted(typeId, account, amount);
}
function mintNonFungibleBatch(uint256 typeId, uint256[] calldata ids, address[] calldata accounts) public onlyRole(DEFAULT_ADMIN_ROLE) {
require(ids.length == accounts.length, "number of ids must equal number of accounts");
for (uint256 i = 0; i < ids.length; i++) {
_mintNonFungible(typeId, ids[i], accounts[i]);
}
emit NonFungibleBatchMinted(typeId, ids, accounts);
}
function mintFungibleBatch(uint256 typeId, address[] calldata accounts, uint256[] calldata amounts) public onlyRole(DEFAULT_ADMIN_ROLE) {
require(accounts.length == amounts.length, "number of accounts must equal number of amounts");
for (uint256 i = 0; i < accounts.length; ++i) {
_mintFungible(typeId, accounts[i], amounts[i]);
}
emit FungibleBatchMinted(typeId, accounts, amounts);
}
function createTypeAndMintNonFungibleBatch(uint256 typeId, uint256 maxSupply, bool burnable, string memory uri_, uint256[] calldata ids, address[] calldata accounts) public onlyRole(DEFAULT_ADMIN_ROLE) {
createType(typeId, maxSupply, false, burnable, uri_);
if (accounts.length > 0) {
mintNonFungibleBatch(typeId, ids, accounts);
}
}
function createTypeAndMintFungibleBatch(uint256 typeId, uint256 maxSupply, bool burnable, string memory uri_, address[] calldata accounts, uint256[] calldata amounts) public onlyRole(DEFAULT_ADMIN_ROLE) {
createType(typeId, maxSupply, true, burnable, uri_);
if (accounts.length > 0) {
mintFungibleBatch(typeId, accounts, amounts);
}
}
function createTypesAndMint(CreateTypeAndMintCommand[] calldata commands) public onlyRole(DEFAULT_ADMIN_ROLE) {
uint256[] memory typeIds;
uint256[] memory maxSupplies;
bool[] memory fungible;
bool[] memory burnable;
string[] memory uris_;
for (uint256 i = 0; i < commands.length; ++i) {
CreateTypeAndMintCommand calldata command = commands[i];
typeIds[i] = command.typeId;
maxSupplies[i] = command.maxSupply;
fungible[i] = command.fungible;
burnable[i] = command.burnable;
uris_[i] = command.uri;
_createType(command.typeId, command.maxSupply, command.fungible, command.burnable, command.uri);
if (command.fungible) {
mintFungibleBatch(command.typeId, command.accounts, command.amounts);
} else {
mintNonFungibleBatch(command.typeId, command.ids, command.accounts);
}
}
emit BatchTypeCreation(typeIds, maxSupplies, fungible, burnable, uris_);
}
function mintBatch(MintCommand[] calldata commands) public onlyRole(DEFAULT_ADMIN_ROLE) {
for (uint256 i = 0; i < commands.length; ++i) {
MintCommand calldata command = commands[i];
if (typeIsFungible[command.typeId] == true) {
mintFungibleBatch(command.typeId, command.accounts, command.amounts);
} else {
mintNonFungibleBatch(command.typeId, command.ids, command.accounts);
}
}
}
function mintNumber(uint256 id) override public view returns (uint256) {
return mintNumbers[id];
}
/**
* @dev Destroys `amount` tokens of token type `id` from `account`
*
* Requirements:
*
* - `account` cannot be the zero address.
* - `account` must have at least `amount` tokens of token type `id`.
* - `type` of token with `id` must be burnable
*/
function burn(uint256 id, address account, uint256 amount) public {
require(typeIsBurnable[typeForToken[id]] == true, "Type of token must be burnable");
require(
account == _msgSender() || isApprovedForAll(account, _msgSender()),
"Caller is not owner nor approved"
);
_burn(account, id, amount);
}
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
*
* Requirements:
*
* - `ids` and `amounts` must have the same length.
*/
function burnBatch(uint256[] memory ids, address account, uint256[] memory amounts) public {
require(
account == _msgSender() || isApprovedForAll(account, _msgSender()),
"Caller is not owner nor approved"
);
for (uint256 i = 0; i < ids.length; ++i) {
require(typeIsBurnable[typeForToken[ids[i]]] == true, "Type of token must be burnable");
}
_burnBatch(account, ids, amounts);
}
/**
* @dev See {IERC1155MetadataURI-uri}.
*
* This implementation returns the same URI for *all* token types. It relies
* on the token type ID substitution mechanism
* https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
*
* Clients calling this function must replace the `\{id\}` substring with the
* actual token type ID.
*/
function uri(uint256 id) external view virtual override returns (string memory) {
return uris[typeForToken[id]];
}
function setUriForTokenType(uint256 typeId, string memory uri_) public onlyRole(DEFAULT_ADMIN_ROLE) {
uris[typeId] = uri_;
}
}
contract VenlyERC1155 is TypedERC1155 {
string public name;
string public symbol;
string internal cUri;
constructor(string memory name_, string memory symbol_, string memory contractURI_, address childChainManager, address secondaryOwner, bool _autoApprovedAddressesLocked) TypedERC1155(name_, childChainManager, _autoApprovedAddressesLocked) {
name = name_;
symbol = symbol_;
cUri = contractURI_;
transferOwnership(secondaryOwner == address(0x0) ? _msgSender() : secondaryOwner);
if (secondaryOwner != address(0x0)) {
grantRole(DEFAULT_ADMIN_ROLE, secondaryOwner);
}
}
function supportsInterface(bytes4 interfaceId) override(ChildMintableERC1155) public pure returns (bool) {
return interfaceId == type(IAccessControl).interfaceId
|| interfaceId == type(IERC165).interfaceId
|| interfaceId == type(IERC1155).interfaceId
|| interfaceId == type(IERC1155MetadataURI).interfaceId
|| interfaceId == type(SequencedMinting).interfaceId;
}
function setContractURI(string memory _contractURI) public onlyRole(DEFAULT_ADMIN_ROLE) {
cUri = _contractURI;
}
function contractURI() public view returns (string memory) {
return cUri;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"string","name":"contractURI_","type":"string"},{"internalType":"address","name":"childChainManager","type":"address"},{"internalType":"address","name":"secondaryOwner","type":"address"},{"internalType":"bool","name":"_autoApprovedAddressesLocked","type":"bool"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"allowed","type":"bool"}],"name":"AutoApprove","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"typeIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"maxSupplies","type":"uint256[]"},{"indexed":false,"internalType":"bool[]","name":"fungible","type":"bool[]"},{"indexed":false,"internalType":"bool[]","name":"burnable","type":"bool[]"},{"indexed":false,"internalType":"string[]","name":"uri","type":"string[]"}],"name":"BatchTypeCreation","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"typeId","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"accounts","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"FungibleBatchMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"typeId","type":"uint256"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"FungibleMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address payable","name":"relayerAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"functionSignature","type":"bytes"}],"name":"MetaTransactionExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"typeId","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"NonFungibleBatchMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"typeId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"NonFungibleMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"typeId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxSupply","type":"uint256"},{"indexed":false,"internalType":"bool","name":"fungible","type":"bool"},{"indexed":false,"internalType":"bool","name":"burnable","type":"bool"},{"indexed":false,"internalType":"string","name":"uri","type":"string"}],"name":"TypeCreation","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSITOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ERC712_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"autoApprovedAddressesLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"bool","name":"fungible","type":"bool"},{"internalType":"bool","name":"burnable","type":"bool"},{"internalType":"string","name":"uri_","type":"string"}],"name":"createType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"bool","name":"burnable","type":"bool"},{"internalType":"string","name":"uri_","type":"string"},{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"createTypeAndMintFungibleBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"bool","name":"burnable","type":"bool"},{"internalType":"string","name":"uri_","type":"string"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"createTypeAndMintNonFungibleBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"typeIds","type":"uint256[]"},{"internalType":"uint256[]","name":"maxSupplies","type":"uint256[]"},{"internalType":"bool[]","name":"fungible","type":"bool[]"},{"internalType":"bool[]","name":"burnable","type":"bool[]"},{"internalType":"string[]","name":"uris_","type":"string[]"}],"name":"createTypes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"typeId","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"bool","name":"fungible","type":"bool"},{"internalType":"bool","name":"burnable","type":"bool"},{"internalType":"string","name":"uri","type":"string"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"internalType":"struct TypedERC1155.CreateTypeAndMintCommand[]","name":"commands","type":"tuple[]"}],"name":"createTypesAndMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bytes","name":"depositData","type":"bytes"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"executeMetaTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDomainSeperator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"isAutoApproved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"maxSupplyForType","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"typeId","type":"uint256"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"internalType":"struct TypedERC1155.MintCommand[]","name":"commands","type":"tuple[]"}],"name":"mintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintFungible","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"},{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"mintFungibleBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"mintNonFungible","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"mintNonFungibleBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"mintNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"noTokensForType","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"allowed","type":"bool"}],"name":"setAutoApprovedAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"locked","type":"bool"}],"name":"setAutoApprovedAddressesLocked","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_contractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"},{"internalType":"string","name":"uri_","type":"string"}],"name":"setUriForTokenType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"typeForToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"typeIsBurnable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"typeIsFungible","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"usedIds","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"withdrawBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawSingle","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040526007805460ff191690553480156200001b57600080fd5b5060405162005840380380620058408339810160408190526200003e91620008f1565b8583828083836200005a6000620000546200013d565b62000159565b620000867f8f4f2da22e8ac8f11e15f9fc141cddbb5deea8800186560abb6e68c5496619a98262000159565b620000918262000169565b50506007805460ff191691151591909117905550508651620000bc9150601090602089019062000754565b508451620000d290601190602088019062000754565b508351620000e890601290602087019062000754565b50620001146001600160a01b0383161562000104578262000243565b6200010e6200013d565b62000243565b6001600160a01b03821615620001315762000131600083620002cc565b50505050505062000b2f565b600062000154620002fe60201b6200254a1760201c565b905090565b6200016582826200035d565b5050565b600354600160a81b900460ff16806200018c5750600354600160a01b900460ff16155b620001f55760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b600354600160a81b900460ff1615801562000220576003805461ffff60a01b191661010160a01b1790555b6200022b8262000403565b801562000165576003805460ff60a81b191690555050565b60006200025a81620002546200013d565b620004a5565b6001600160a01b038216620002c15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401620001ec565b620001658262000542565b600082815260026020526040902060010154620002ed81620002546200013d565b620002f983836200035d565b505050565b6000333014156200035757600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b031691506200035a9050565b50335b90565b60008281526002602090815260408083206001600160a01b038516845290915290205460ff16620001655760008281526002602090815260408083206001600160a01b03851684529091529020805460ff19166001179055620003bf6200013d565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6040518060800160405280604f8152602001620057f1604f9139805160209182012082519282019290922060408051808201825260018152603160f81b90840152805180840194909452838101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608401523060808401524660a0808501919091528151808503909101815260c090930190528151910120600455565b60008281526002602090815260408083206001600160a01b038516845290915290205460ff166200016557620004f1816001600160a01b031660146200059460201b620025a71760201c565b62000507836020620025a762000594821b17811c565b6040516020016200051a929190620009c1565b60408051601f198184030181529082905262461bcd60e51b8252620001ec9160040162000a3a565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60606000620005a583600262000a85565b620005b290600262000aa7565b6001600160401b03811115620005cc57620005cc620007fa565b6040519080825280601f01601f191660200182016040528015620005f7576020820181803683370190505b509050600360fc1b8160008151811062000615576200061562000ac2565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811062000647576200064762000ac2565b60200101906001600160f81b031916908160001a90535060006200066d84600262000a85565b6200067a90600162000aa7565b90505b6001811115620006fc576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110620006b257620006b262000ac2565b1a60f81b828281518110620006cb57620006cb62000ac2565b60200101906001600160f81b031916908160001a90535060049490941c93620006f48162000ad8565b90506200067d565b5083156200074d5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401620001ec565b9392505050565b828054620007629062000af2565b90600052602060002090601f016020900481019282620007865760008555620007d1565b82601f10620007a157805160ff1916838001178555620007d1565b82800160010185558215620007d1579182015b82811115620007d1578251825591602001919060010190620007b4565b50620007df929150620007e3565b5090565b5b80821115620007df5760008155600101620007e4565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200082d57818101518382015260200162000813565b838111156200083d576000848401525b50505050565b600082601f8301126200085557600080fd5b81516001600160401b0380821115620008725762000872620007fa565b604051601f8301601f19908116603f011681019082821181831017156200089d576200089d620007fa565b81604052838152866020858801011115620008b757600080fd5b620008ca84602083016020890162000810565b9695505050505050565b80516001600160a01b0381168114620008ec57600080fd5b919050565b60008060008060008060c087890312156200090b57600080fd5b86516001600160401b03808211156200092357600080fd5b620009318a838b0162000843565b975060208901519150808211156200094857600080fd5b620009568a838b0162000843565b965060408901519150808211156200096d57600080fd5b506200097c89828a0162000843565b9450506200098d60608801620008d4565b92506200099d60808801620008d4565b915060a08701518015158114620009b357600080fd5b809150509295509295509295565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351620009fb81601785016020880162000810565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835162000a2e81602884016020880162000810565b01602801949350505050565b602081526000825180602084015262000a5b81604085016020870162000810565b601f01601f19169190910160400192915050565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161562000aa25762000aa262000a6f565b500290565b6000821982111562000abd5762000abd62000a6f565b500190565b634e487b7160e01b600052603260045260246000fd5b60008162000aea5762000aea62000a6f565b506000190190565b600181811c9082168062000b0757607f821691505b6020821081141562000b2957634e487b7160e01b600052602260045260246000fd5b50919050565b614cb28062000b3f6000396000f3fe6080604052600436106103345760003560e01c806391d14854116101ab578063cf2c52cb116100f7578063f2fde38b11610095578063f807393a1161006f578063f807393a14610a15578063fc86b66214610a35578063fcb440b614610a62578063fea6b5d214610a8257600080fd5b8063f2fde38b146109a8578063f44b8158146109c8578063f79f20b5146109e857600080fd5b8063e8a3d485116100d1578063e8a3d48514610933578063e985e9c514610948578063f09d4db014610968578063f242432a1461098857600080fd5b8063cf2c52cb146108c3578063d3d57d89146108e3578063d547741f1461091357600080fd5b8063a22cb46511610164578063aed0ddf21161013e578063aed0ddf214610823578063b88cbbd214610853578063bb72018814610873578063bd378c71146108a357600080fd5b8063a22cb465146107af578063a3b0b5a3146107cf578063a582e8f81461080357600080fd5b806391d1485414610705578063938e3d7b1461072557806393f7d6c71461074557806395d89b41146107655780639eea5f661461077a578063a217fddf1461079a57600080fd5b8063248a9ca3116102855780634e1273f411610223578063715018a6116101fd578063715018a61461068157806379920951146106965780637c638212146106c35780638da5cb5b146106dd57600080fd5b80634e1273f4146106145780635c5fb5211461064157806364c589941461066157600080fd5b80632f2ff15d1161025f5780632f2ff15d146105885780633199da02146105a85780633408e470146105e157806336568abe146105f457600080fd5b8063248a9ca3146105025780632d0335ab146105325780632eb2c2d61461056857600080fd5b80630f7e5970116102f25780631f55a2bc116102cc5780631f55a2bc1461048d57806320379ee5146104ad5780632262f53f146104c257806323a28325146104e257600080fd5b80630f7e59701461041e57806314564cfb1461044b5780631aeab0581461046d57600080fd5b8062fdd58e1461033957806301ffc9a71461036c57806306fdde031461039c5780630c53c51c146103be5780630e89341c146103d15780630f699e80146103f1575b600080fd5b34801561034557600080fd5b506103596103543660046136f1565b610aa2565b6040519081526020015b60405180910390f35b34801561037857600080fd5b5061038c610387366004613731565b610b39565b6040519015158152602001610363565b3480156103a857600080fd5b506103b1610bc1565b60405161036391906137a6565b6103b16103cc36600461386e565b610c4f565b3480156103dd57600080fd5b506103b16103ec3660046138e9565b610e39565b3480156103fd57600080fd5b5061035961040c3660046138e9565b600a6020526000908152604090205481565b34801561042a57600080fd5b506103b1604051806040016040528060018152602001603160f81b81525081565b34801561045757600080fd5b5061046b61046636600461394d565b610ee8565b005b34801561047957600080fd5b5061046b6104883660046139d6565b61100e565b34801561049957600080fd5b5061046b6104a8366004613a8d565b611048565b3480156104b957600080fd5b50600454610359565b3480156104ce57600080fd5b5061046b6104dd366004613afe565b61109a565b3480156104ee57600080fd5b5061046b6104fd366004613b20565b6110b0565b34801561050e57600080fd5b5061035961051d3660046138e9565b60009081526002602052604090206001015490565b34801561053e57600080fd5b5061035961054d366004613b61565b6001600160a01b031660009081526005602052604090205490565b34801561057457600080fd5b5061046b610583366004613c10565b61132b565b34801561059457600080fd5b5061046b6105a3366004613cac565b6115b2565b3480156105b457600080fd5b5061038c6105c3366004613b61565b6001600160a01b031660009081526006602052604090205460ff1690565b3480156105ed57600080fd5b5046610359565b34801561060057600080fd5b5061046b61060f366004613cac565b6115df565b34801561062057600080fd5b5061063461062f366004613cd8565b611669565b6040516103639190613ddd565b34801561064d57600080fd5b5061046b61065c366004613df0565b611792565b34801561066d57600080fd5b5061046b61067c366004613e5b565b61180d565b34801561068d57600080fd5b5061046b6118a2565b3480156106a257600080fd5b506103596106b13660046138e9565b60096020526000908152604090205481565b3480156106cf57600080fd5b5060075461038c9060ff1681565b3480156106e957600080fd5b506003546040516001600160a01b039091168152602001610363565b34801561071157600080fd5b5061038c610720366004613cac565b6118bd565b34801561073157600080fd5b5061046b610740366004613e85565b6118e8565b34801561075157600080fd5b5061046b610760366004613ec1565b611909565b34801561077157600080fd5b506103b1611a4b565b34801561078657600080fd5b5061046b610795366004613f34565b611a58565b3480156107a657600080fd5b50610359600081565b3480156107bb57600080fd5b5061046b6107ca366004613e5b565b611b4d565b3480156107db57600080fd5b506103597f8f4f2da22e8ac8f11e15f9fc141cddbb5deea8800186560abb6e68c5496619a981565b34801561080f57600080fd5b5061046b61081e366004613f69565b611c61565b34801561082f57600080fd5b5061038c61083e3660046138e9565b600c6020526000908152604090205460ff1681565b34801561085f57600080fd5b5061046b61086e366004613fa5565b611c8e565b34801561087f57600080fd5b5061038c61088e3660046138e9565b600b6020526000908152604090205460ff1681565b3480156108af57600080fd5b5061046b6108be36600461394d565b611cfa565b3480156108cf57600080fd5b5061046b6108de366004613fda565b611e09565b3480156108ef57600080fd5b5061038c6108fe3660046138e9565b600d6020526000908152604090205460ff1681565b34801561091f57600080fd5b5061046b61092e366004613cac565b611ecb565b34801561093f57600080fd5b506103b1611ef3565b34801561095457600080fd5b5061038c61096336600461405c565b611f85565b34801561097457600080fd5b5061046b610983366004613b20565b611fdf565b34801561099457600080fd5b5061046b6109a3366004614086565b612092565b3480156109b457600080fd5b5061046b6109c3366004613b61565b612256565b3480156109d457600080fd5b5061046b6109e33660046140de565b6122d2565b3480156109f457600080fd5b50610359610a033660046138e9565b6000908152600e602052604090205490565b348015610a2157600080fd5b5061046b610a30366004613f34565b612477565b348015610a4157600080fd5b50610359610a503660046138e9565b60086020526000908152604090205481565b348015610a6e57600080fd5b5061046b610a7d3660046141ce565b6124d6565b348015610a8e57600080fd5b5061046b610a9d3660046139d6565b61251b565b60006001600160a01b038316610b135760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216637965db0b60e01b1480610b6a57506001600160e01b031982166301ffc9a760e01b145b80610b8557506001600160e01b03198216636cdb3d1360e11b145b80610ba057506001600160e01b031982166303a24d0760e21b145b80610bbb57506001600160e01b0319821663f79f20b560e01b145b92915050565b60108054610bce906141e9565b80601f0160208091040260200160405190810160405280929190818152602001828054610bfa906141e9565b8015610c475780601f10610c1c57610100808354040283529160200191610c47565b820191906000526020600020905b815481529060010190602001808311610c2a57829003601f168201915b505050505081565b60408051606081810183526001600160a01b03881660008181526005602090815290859020548452830152918101869052610c8d8782878787612742565b610ce35760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b6064820152608401610b0a565b6001600160a01b038716600090815260056020526040902054610d07906001612832565b6001600160a01b0388166000908152600560205260409081902091909155517f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b90610d5790899033908a90614224565b60405180910390a1600080306001600160a01b0316888a604051602001610d7f929190614259565b60408051601f1981840301815290829052610d9991614290565b6000604051808303816000865af19150503d8060008114610dd6576040519150601f19603f3d011682016040523d82523d6000602084013e610ddb565b606091505b509150915081610e2d5760405162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c000000006044820152606401610b0a565b98975050505050505050565b6000818152600a60209081526040808320548352600f9091529020805460609190610e63906141e9565b80601f0160208091040260200160405190810160405280929190818152602001828054610e8f906141e9565b8015610edc5780601f10610eb157610100808354040283529160200191610edc565b820191906000526020600020905b815481529060010190602001808311610ebf57829003601f168201915b50505050509050919050565b6000610efb81610ef661283e565b61284d565b838214610f625760405162461bcd60e51b815260206004820152602f60248201527f6e756d626572206f66206163636f756e7473206d75737420657175616c206e7560448201526e6d626572206f6620616d6f756e747360881b6064820152608401610b0a565b60005b84811015610fc657610fb687878784818110610f8357610f836142ac565b9050602002016020810190610f989190613b61565b868685818110610faa57610faa6142ac565b905060200201356128b1565b610fbf816142d8565b9050610f65565b507fbc11d48c1996f53e33584d90e8717cf38a41a8b337a2a6cebffea04c02c18fbf8686868686604051610ffe959493929190614365565b60405180910390a1505050505050565b600061101c81610ef661283e565b61102a898960008a8a611048565b811561103d5761103d8986868686611cfa565b505050505050505050565b600061105681610ef661283e565b6110638686868686612a1f565b7fdd645363ea6a3195510fb1e3a13913d327810ec8b23034aa40445504879df82b8686868686604051610ffe959493929190614392565b6110ac6110a561283e565b8383612b58565b5050565b60006110be81610ef661283e565b606080606080606060005b878110156112e157368989838181106110e4576110e46142ac565b90506020028101906110f691906143cc565b9050806000013587838151811061110f5761110f6142ac565b6020026020010181815250508060200135868381518110611132576111326142ac565b602090810291909101015261114d60608201604083016141ce565b85838151811061115f5761115f6142ac565b9115156020928302919091019091015261117f60808201606083016141ce565b848381518110611191576111916142ac565b911515602092830291909101909101526111ae60808201826143e2565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050855186925085915081106111f6576111f66142ac565b60200260200101819052506112788160000135826020013583604001602081019061122191906141ce565b61123160808601606087016141ce565b61123e60808701876143e2565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612a1f92505050565b61128860608201604083016141ce565b156112b1576112ac813561129f60c0840184614428565b61046660e0860186614428565b6112d0565b6112d081356112c360a0840184614428565b6108be60c0860186614428565b506112da816142d8565b90506110c9565b507f033bdc44ed09ce27d875236b5e356eb738c886bcbe86b77335f35f199230c47485858585856040516113199594939291906144a3565b60405180910390a15050505050505050565b815183511461134c5760405162461bcd60e51b8152600401610b0a90614554565b6001600160a01b0384166113725760405162461bcd60e51b8152600401610b0a9061459c565b61137a61283e565b6001600160a01b0316856001600160a01b031614806113a057506113a08561096361283e565b6114075760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610b0a565b600061141161283e565b905060005b8451811015611544576000858281518110611433576114336142ac565b602002602001015190506000858381518110611451576114516142ac565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156114a15760405162461bcd60e51b8152600401610b0a906145e1565b6114ab828261462b565b60008085815260200190815260200160002060008c6001600160a01b03166001600160a01b03168152602001908152602001600020819055508160008085815260200190815260200160002060008b6001600160a01b03166001600160a01b0316815260200190815260200160002060008282546115299190614642565b925050819055505050508061153d906142d8565b9050611416565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161159492919061465a565b60405180910390a46115aa818787878787612c6d565b505050505050565b6000828152600260205260409020600101546115d081610ef661283e565b6115da8383612dd8565b505050565b6115e761283e565b6001600160a01b0316816001600160a01b03161461165f5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610b0a565b6110ac8282612e5f565b606081518351146116ce5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610b0a565b600083516001600160401b038111156116e9576116e96137b9565b604051908082528060200260200182016040528015611712578160200160208202803683370190505b50905060005b845181101561178a5761175d858281518110611736576117366142ac565b6020026020010151858381518110611750576117506142ac565b6020026020010151610aa2565b82828151811061176f5761176f6142ac565b6020908102919091010152611783816142d8565b9050611718565b509392505050565b61180761179d61283e565b85858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808902828101820190935288825290935088925087918291850190849080828437600092019190915250612ee492505050565b50505050565b600061181b81610ef661283e565b60075460ff161561183e5760405162461bcd60e51b8152600401610b0a9061467f565b6001600160a01b038316600081815260066020908152604091829020805460ff19168615159081179091558251938452908301527ff945d041acd49baaff5c00a7e747c411751a1eb0d0b3e77d4c147eb27feb1183910160405180910390a1505050565b60006118b081610ef661283e565b6118ba6000613077565b50565b60009182526002602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60006118f681610ef661283e565b81516115da90601290602085019061363c565b61191161283e565b6001600160a01b0316826001600160a01b0316148061193757506119378261096361283e565b6119835760405162461bcd60e51b815260206004820181905260248201527f43616c6c6572206973206e6f74206f776e6572206e6f7220617070726f7665646044820152606401610b0a565b60005b8351811015611a3f57600b6000600a60008785815181106119a9576119a96142ac565b6020026020010151815260200190815260200160002054815260200190815260200160002060009054906101000a900460ff1615156001151514611a2f5760405162461bcd60e51b815260206004820152601e60248201527f54797065206f6620746f6b656e206d757374206265206275726e61626c6500006044820152606401610b0a565b611a38816142d8565b9050611986565b506115da828483612ee4565b60118054610bce906141e9565b6000838152600a60209081526040808320548352600b90915290205460ff161515600114611ac85760405162461bcd60e51b815260206004820152601e60248201527f54797065206f6620746f6b656e206d757374206265206275726e61626c6500006044820152606401610b0a565b611ad061283e565b6001600160a01b0316826001600160a01b03161480611af65750611af68261096361283e565b611b425760405162461bcd60e51b815260206004820181905260248201527f43616c6c6572206973206e6f74206f776e6572206e6f7220617070726f7665646044820152606401610b0a565b6115da828483612b58565b816001600160a01b0316611b5f61283e565b6001600160a01b03161415611bc85760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610b0a565b8060016000611bd561283e565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155611c1961283e565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c55911515815260200190565b60405180910390a35050565b6000611c6f81610ef661283e565b6000838152600f6020908152604090912083516118079285019061363c565b6000611c9c81610ef661283e565b611ca78484846130c9565b60408051858152602081018590526001600160a01b038416918101919091527faa31d15dd62975f7f98b676018f8787ef55d604ec8c765132c34e398919afb74906060015b60405180910390a150505050565b6000611d0881610ef661283e565b838214611d6b5760405162461bcd60e51b815260206004820152602b60248201527f6e756d626572206f6620696473206d75737420657175616c206e756d6265722060448201526a6f66206163636f756e747360a81b6064820152608401610b0a565b60005b84811015611dd157611dbf87878784818110611d8c57611d8c6142ac565b90506020020135868685818110611da557611da56142ac565b9050602002016020810190611dba9190613b61565b6130c9565b80611dc9816142d8565b915050611d6e565b507f16a6af95050d3c05c617a7c59f4ab66345c532ef8bf5575e13b8b25cb7ed13c18686868686604051610ffe9594939291906146c1565b7f8f4f2da22e8ac8f11e15f9fc141cddbb5deea8800186560abb6e68c5496619a9611e3681610ef661283e565b60008080611e46858701876146ee565b919450925090506001600160a01b038716611eb65760405162461bcd60e51b815260206004820152602a60248201527f4368696c644d696e7461626c65455243313135353a20494e56414c49445f44456044820152692827a9a4aa2faaa9a2a960b11b6064820152608401610b0a565b611ec287848484613252565b50505050505050565b600082815260026020526040902060010154611ee981610ef661283e565b6115da8383612e5f565b606060128054611f02906141e9565b80601f0160208091040260200160405190810160405280929190818152602001828054611f2e906141e9565b8015611f7b5780601f10611f5057610100808354040283529160200191611f7b565b820191906000526020600020905b815481529060010190602001808311611f5e57829003601f168201915b5050505050905090565b6001600160a01b03808316600090815260016020908152604080832093851683529290529081205460ff1680611fd857506001600160a01b03821660009081526006602052604090205460ff1615156001145b9392505050565b6000611fed81610ef661283e565b60005b82811015611807573684848381811061200b5761200b6142ac565b905060200281019061201d919061476b565b80356000908152600c602052604090205490915060ff161515600114156120625761205d81356120506040840184614428565b6104666060860186614428565b612081565b61208181356120746020840184614428565b6108be6040860186614428565b5061208b816142d8565b9050611ff0565b6001600160a01b0384166120b85760405162461bcd60e51b8152600401610b0a9061459c565b6120c061283e565b6001600160a01b0316856001600160a01b031614806120e657506120e68561096361283e565b6121445760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b6064820152608401610b0a565b600061214e61283e565b905061216f81878761215f886133a8565b612168886133a8565b5050505050565b6000848152602081815260408083206001600160a01b038a168452909152902054838110156121b05760405162461bcd60e51b8152600401610b0a906145e1565b6121ba848261462b565b6000868152602081815260408083206001600160a01b038c811685529252808320939093558816815290812080548692906121f6908490614642565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611ec28288888888886133f3565b600061226481610ef661283e565b6001600160a01b0382166122c95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b0a565b6110ac82613077565b60006122e081610ef661283e565b89881480156122ee57508986145b80156122f957508984145b801561230457508982145b61235e5760405162461bcd60e51b815260206004820152602560248201527f417272617920617267756d656e7473206d75737420686176652073616d65206c6044820152640cadccee8d60db1b6064820152608401610b0a565b60005b8a811015612420576124108c8c8381811061237e5761237e6142ac565b905060200201358b8b84818110612397576123976142ac565b905060200201358a8a858181106123b0576123b06142ac565b90506020020160208101906123c591906141ce565b8989868181106123d7576123d76142ac565b90506020020160208101906123ec91906141ce565b8888878181106123fe576123fe6142ac565b905060200281019061123e91906143e2565b612419816142d8565b9050612361565b507f033bdc44ed09ce27d875236b5e356eb738c886bcbe86b77335f35f199230c4748b8b8b8b8b8b8b8b8b8b6040516124629a999897969594939291906147df565b60405180910390a15050505050505050505050565b600061248581610ef661283e565b6124908484846128b1565b604080518581526001600160a01b03851660208201529081018390527f6a47e9a7fdc397ac645d72459fcca69dbb90f878280bf1fc79d95889ab51c19890606001611cec565b60006124e481610ef661283e565b60075460ff16156125075760405162461bcd60e51b8152600401610b0a9061467f565b506007805460ff1916911515919091179055565b600061252981610ef661283e565b612537898960018a8a611048565b831561103d5761103d8986868686610ee8565b6000333014156125a157600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b031691506125a49050565b50335b90565b606060006125b68360026148d4565b6125c1906002614642565b6001600160401b038111156125d8576125d86137b9565b6040519080825280601f01601f191660200182016040528015612602576020820181803683370190505b509050600360fc1b8160008151811061261d5761261d6142ac565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061264c5761264c6142ac565b60200101906001600160f81b031916908160001a90535060006126708460026148d4565b61267b906001614642565b90505b60018111156126f3576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106126af576126af6142ac565b1a60f81b8282815181106126c5576126c56142ac565b60200101906001600160f81b031916908160001a90535060049490941c936126ec816148f3565b905061267e565b508315611fd85760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610b0a565b60006001600160a01b0386166127a85760405162461bcd60e51b815260206004820152602560248201527f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360448201526424a3a722a960d91b6064820152608401610b0a565b60016127bb6127b6876134bd565b61353a565b6040805160008152602081018083529290925260ff851690820152606081018690526080810185905260a0016020604051602081039080840390855afa158015612809573d6000803e3d6000fd5b505050602060405103516001600160a01b0316866001600160a01b031614905095945050505050565b6000611fd88284614642565b600061284861254a565b905090565b61285782826118bd565b6110ac5761286f816001600160a01b031660146125a7565b61287a8360206125a7565b60405160200161288b92919061490a565b60408051601f198184030181529082905262461bcd60e51b8252610b0a916004016137a6565b60006128bf81610ef661283e565b600084116128cc57600080fd5b600082116129135760405162461bcd60e51b81526020600482015260146024820152730416d6f756e742073686f756c64206265203e20360641b6044820152606401610b0a565b6000848152600860209081526040808320546009909252909120546129389084612832565b11156129565760405162461bcd60e51b8152600401610b0a9061497f565b6000848152600c602052604090205460ff1615156001146129b95760405162461bcd60e51b815260206004820152601760248201527f747970654964206973206e6f742066756e6769626c652e0000000000000000006044820152606401610b0a565b6000848152600960205260409020546129d29083612832565b600085815260096020526040812091909155611807908490869085905b6040519080825280601f01601f191660200182016040528015612a19576020820181803683370190505b5061356a565b6000612a2d81610ef661283e565b6000868152600d602052604090205460ff1615612a8c5760405162461bcd60e51b815260206004820152601f60248201527f537570706c6965642074797065496420697320616c72656164792075736564006044820152606401610b0a565b60008511612ad55760405162461bcd60e51b815260206004820152601660248201527506d617820737570706c79206d757374206265203e20360541b6044820152606401610b0a565b6000868152600860209081526040808320889055600c825280832080548815801560ff1992831617909255600b84528285208054891515908316179055600d909352922080549091166001179055612b39576000868152600a602052604090208690555b6000868152600f602090815260409091208351611ec29285019061363c565b6001600160a01b038316612b7e5760405162461bcd60e51b8152600401610b0a906149dc565b6000612b8861283e565b9050612bb981856000612b9a876133a8565b612ba3876133a8565b5050604080516020810190915260009052505050565b6000838152602081815260408083206001600160a01b038816845290915290205482811015612bfa5760405162461bcd60e51b8152600401610b0a90614a1f565b612c04838261462b565b6000858152602081815260408083206001600160a01b038a811680865291845282852095909555815189815292830188905292938616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b6001600160a01b0384163b156115aa5760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190612cb19089908990889088908890600401614a63565b602060405180830381600087803b158015612ccb57600080fd5b505af1925050508015612cfb575060408051601f3d908101601f19168201909252612cf891810190614ab5565b60015b612da857612d07614ad2565b806308c379a01415612d415750612d1c614aed565b80612d275750612d43565b8060405162461bcd60e51b8152600401610b0a91906137a6565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610b0a565b6001600160e01b0319811663bc197c8160e01b14611ec25760405162461bcd60e51b8152600401610b0a90614b76565b612de282826118bd565b6110ac5760008281526002602090815260408083206001600160a01b03851684529091529020805460ff19166001179055612e1b61283e565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b612e6982826118bd565b156110ac5760008281526002602090815260408083206001600160a01b03851684529091529020805460ff19169055612ea061283e565b6001600160a01b0316816001600160a01b0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b6001600160a01b038316612f0a5760405162461bcd60e51b8152600401610b0a906149dc565b8051825114612f2b5760405162461bcd60e51b8152600401610b0a90614554565b6000612f3561283e565b604080516020810190915260009052905060005b8351811015613018576000848281518110612f6657612f666142ac565b602002602001015190506000848381518110612f8457612f846142ac565b602090810291909101810151600084815280835260408082206001600160a01b038c168352909352919091205490915081811015612fd45760405162461bcd60e51b8152600401610b0a90614a1f565b612fde828261462b565b6000938452602084815260408086206001600160a01b038c1687529091529093209290925550819050613010816142d8565b915050612f49565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb868660405161306992919061465a565b60405180910390a450505050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006130d781610ef661283e565b600083116130e457600080fd5b60008481526008602090815260408083205460099092529091205461310a906001612832565b11156131285760405162461bcd60e51b8152600401610b0a9061497f565b6000838152600d602052604090205460ff16156131875760405162461bcd60e51b815260206004820152601b60248201527f537570706c69656420696420697320616c7265616479207573656400000000006044820152606401610b0a565b6000848152600c602052604090205460ff16156131df5760405162461bcd60e51b8152602060048201526016602482015275476976656e20747970652069732066756e6769626c6560501b6044820152606401610b0a565b6000838152600d60209081526040808320805460ff1916600190811790915587845260099092529091205461321391612832565b6000858152600960209081526040808320938455868352600a82528083208890559254600e9091529181209190915561180790839085906001906129ef565b6001600160a01b0384166132785760405162461bcd60e51b8152600401610b0a90614bbe565b81518351146132995760405162461bcd60e51b8152600401610b0a90614554565b60006132a361283e565b905060005b8451811015613340578381815181106132c3576132c36142ac565b60200260200101516000808784815181106132e0576132e06142ac565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b0316815260200190815260200160002060008282546133289190614642565b90915550819050613338816142d8565b9150506132a8565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161339192919061465a565b60405180910390a461216881600087878787612c6d565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106133e2576133e26142ac565b602090810291909101015292915050565b6001600160a01b0384163b156115aa5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906134379089908990889088908890600401614bff565b602060405180830381600087803b15801561345157600080fd5b505af1925050508015613481575060408051601f3d908101601f1916820190925261347e91810190614ab5565b60015b61348d57612d07614ad2565b6001600160e01b0319811663f23a6e6160e01b14611ec25760405162461bcd60e51b8152600401610b0a90614b76565b6000604051806080016040528060438152602001614c3a604391398051602091820120835184830151604080870151805190860120905161351d950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b600061354560045490565b60405161190160f01b602082015260228101919091526042810183905260620161351d565b6001600160a01b0384166135905760405162461bcd60e51b8152600401610b0a90614bbe565b600061359a61283e565b90506135ac8160008761215f886133a8565b6000848152602081815260408083206001600160a01b0389168452909152812080548592906135dc908490614642565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612168816000878787876133f3565b828054613648906141e9565b90600052602060002090601f01602090048101928261366a57600085556136b0565b82601f1061368357805160ff19168380011785556136b0565b828001600101855582156136b0579182015b828111156136b0578251825591602001919060010190613695565b506136bc9291506136c0565b5090565b5b808211156136bc57600081556001016136c1565b80356001600160a01b03811681146136ec57600080fd5b919050565b6000806040838503121561370457600080fd5b61370d836136d5565b946020939093013593505050565b6001600160e01b0319811681146118ba57600080fd5b60006020828403121561374357600080fd5b8135611fd88161371b565b60005b83811015613769578181015183820152602001613751565b838111156118075750506000910152565b6000815180845261379281602086016020860161374e565b601f01601f19169290920160200192915050565b602081526000611fd8602083018461377a565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b03811182821017156137f4576137f46137b9565b6040525050565b600082601f83011261380c57600080fd5b81356001600160401b03811115613825576138256137b9565b60405161383c601f8301601f1916602001826137cf565b81815284602083860101111561385157600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a0868803121561388657600080fd5b61388f866136d5565b945060208601356001600160401b038111156138aa57600080fd5b6138b6888289016137fb565b9450506040860135925060608601359150608086013560ff811681146138db57600080fd5b809150509295509295909350565b6000602082840312156138fb57600080fd5b5035919050565b60008083601f84011261391457600080fd5b5081356001600160401b0381111561392b57600080fd5b6020830191508360208260051b850101111561394657600080fd5b9250929050565b60008060008060006060868803121561396557600080fd5b8535945060208601356001600160401b038082111561398357600080fd5b61398f89838a01613902565b909650945060408801359150808211156139a857600080fd5b506139b588828901613902565b969995985093965092949392505050565b803580151581146136ec57600080fd5b60008060008060008060008060c0898b0312156139f257600080fd5b8835975060208901359650613a0960408a016139c6565b955060608901356001600160401b0380821115613a2557600080fd5b613a318c838d016137fb565b965060808b0135915080821115613a4757600080fd5b613a538c838d01613902565b909650945060a08b0135915080821115613a6c57600080fd5b50613a798b828c01613902565b999c989b5096995094979396929594505050565b600080600080600060a08688031215613aa557600080fd5b8535945060208601359350613abc604087016139c6565b9250613aca606087016139c6565b915060808601356001600160401b03811115613ae557600080fd5b613af1888289016137fb565b9150509295509295909350565b60008060408385031215613b1157600080fd5b50508035926020909101359150565b60008060208385031215613b3357600080fd5b82356001600160401b03811115613b4957600080fd5b613b5585828601613902565b90969095509350505050565b600060208284031215613b7357600080fd5b611fd8826136d5565b60006001600160401b03821115613b9557613b956137b9565b5060051b60200190565b600082601f830112613bb057600080fd5b81356020613bbd82613b7c565b604051613bca82826137cf565b83815260059390931b8501820192828101915086841115613bea57600080fd5b8286015b84811015613c055780358352918301918301613bee565b509695505050505050565b600080600080600060a08688031215613c2857600080fd5b613c31866136d5565b9450613c3f602087016136d5565b935060408601356001600160401b0380821115613c5b57600080fd5b613c6789838a01613b9f565b94506060880135915080821115613c7d57600080fd5b613c8989838a01613b9f565b93506080880135915080821115613c9f57600080fd5b50613af1888289016137fb565b60008060408385031215613cbf57600080fd5b82359150613ccf602084016136d5565b90509250929050565b60008060408385031215613ceb57600080fd5b82356001600160401b0380821115613d0257600080fd5b818501915085601f830112613d1657600080fd5b81356020613d2382613b7c565b604051613d3082826137cf565b83815260059390931b8501820192828101915089841115613d5057600080fd5b948201945b83861015613d7557613d66866136d5565b82529482019490820190613d55565b96505086013592505080821115613d8b57600080fd5b50613d9885828601613b9f565b9150509250929050565b600081518084526020808501945080840160005b83811015613dd257815187529582019590820190600101613db6565b509495945050505050565b602081526000611fd86020830184613da2565b60008060008060408587031215613e0657600080fd5b84356001600160401b0380821115613e1d57600080fd5b613e2988838901613902565b90965094506020870135915080821115613e4257600080fd5b50613e4f87828801613902565b95989497509550505050565b60008060408385031215613e6e57600080fd5b613e77836136d5565b9150613ccf602084016139c6565b600060208284031215613e9757600080fd5b81356001600160401b03811115613ead57600080fd5b613eb9848285016137fb565b949350505050565b600080600060608486031215613ed657600080fd5b83356001600160401b0380821115613eed57600080fd5b613ef987838801613b9f565b9450613f07602087016136d5565b93506040860135915080821115613f1d57600080fd5b50613f2a86828701613b9f565b9150509250925092565b600080600060608486031215613f4957600080fd5b83359250613f59602085016136d5565b9150604084013590509250925092565b60008060408385031215613f7c57600080fd5b8235915060208301356001600160401b03811115613f9957600080fd5b613d98858286016137fb565b600080600060608486031215613fba57600080fd5b8335925060208401359150613fd1604085016136d5565b90509250925092565b600080600060408486031215613fef57600080fd5b613ff8846136d5565b925060208401356001600160401b038082111561401457600080fd5b818601915086601f83011261402857600080fd5b81358181111561403757600080fd5b87602082850101111561404957600080fd5b6020830194508093505050509250925092565b6000806040838503121561406f57600080fd5b614078836136d5565b9150613ccf602084016136d5565b600080600080600060a0868803121561409e57600080fd5b6140a7866136d5565b94506140b5602087016136d5565b9350604086013592506060860135915060808601356001600160401b03811115613ae557600080fd5b60008060008060008060008060008060a08b8d0312156140fd57600080fd5b8a356001600160401b038082111561411457600080fd5b6141208e838f01613902565b909c509a5060208d013591508082111561413957600080fd5b6141458e838f01613902565b909a50985060408d013591508082111561415e57600080fd5b61416a8e838f01613902565b909850965060608d013591508082111561418357600080fd5b61418f8e838f01613902565b909650945060808d01359150808211156141a857600080fd5b506141b58d828e01613902565b915080935050809150509295989b9194979a5092959850565b6000602082840312156141e057600080fd5b611fd8826139c6565b600181811c908216806141fd57607f821691505b6020821081141561421e57634e487b7160e01b600052602260045260246000fd5b50919050565b6001600160a01b038481168252831660208201526060604082018190526000906142509083018461377a565b95945050505050565b6000835161426b81846020880161374e565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b600082516142a281846020870161374e565b9190910192915050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156142ec576142ec6142c2565b5060010190565b8183526000602080850194508260005b85811015613dd2576001600160a01b0361431c836136d5565b1687529582019590820190600101614303565b81835260006001600160fb1b0383111561434857600080fd5b8260051b8083602087013760009401602001938452509192915050565b85815260606020820152600061437f6060830186886142f3565b8281036040840152610e2d81858761432f565b8581528460208201528315156040820152821515606082015260a0608082015260006143c160a083018461377a565b979650505050505050565b6000823560fe198336030181126142a257600080fd5b6000808335601e198436030181126143f957600080fd5b8301803591506001600160401b0382111561441357600080fd5b60200191503681900382131561394657600080fd5b6000808335601e1984360301811261443f57600080fd5b8301803591506001600160401b0382111561445957600080fd5b6020019150600581901b360382131561394657600080fd5b600081518084526020808501945080840160005b83811015613dd2578151151587529582019590820190600101614485565b60a0815260006144b660a0830188613da2565b6020838203818501526144c98289613da2565b915083820360408501526144dd8288614471565b915083820360608501526144f18287614471565b915083820360808501528185518084528284019150828160051b85010183880160005b8381101561454257601f1987840301855261453083835161377a565b94860194925090850190600101614514565b50909c9b505050505050505050505050565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60008282101561463d5761463d6142c2565b500390565b60008219821115614655576146556142c2565b500190565b60408152600061466d6040830185613da2565b82810360208401526142508185613da2565b60208082526022908201527f4175746f2d617070726f7665642061646472657373657320617265206c6f636b604082015261195960f21b606082015260800190565b8581526060602082015260006146db60608301868861432f565b8281036040840152610e2d8185876142f3565b60008060006060848603121561470357600080fd5b83356001600160401b038082111561471a57600080fd5b61472687838801613b9f565b9450602086013591508082111561473c57600080fd5b61474887838801613b9f565b9350604086013591508082111561475e57600080fd5b50613f2a868287016137fb565b60008235607e198336030181126142a257600080fd5b8183526000602080850194508260005b85811015613dd2576147a2826139c6565b151587529582019590820190600101614791565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60a0815260006147f360a083018c8e61432f565b602083820381850152614807828c8e61432f565b9150838203604085015261481c828a8c614781565b9150838203606085015261483182888a614781565b84810360808601528581529150808201600586901b830182018760005b888110156148bc57858303601f190184528135368b9003601e1901811261487457600080fd5b8a0180356001600160401b0381111561488c57600080fd5b8036038c131561489b57600080fd5b6148a885828985016147b6565b95870195945050509084019060010161484e565b5050809450505050509b9a5050505050505050505050565b60008160001904831182151516156148ee576148ee6142c2565b500290565b600081614902576149026142c2565b506000190190565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161494281601785016020880161374e565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835161497381602884016020880161374e565b01602801949350505050565b6020808252603b908201527f4d696e74696e6720776f756c642065786365656420746865206d6178206e756d60408201527f626572206f66206974656d7320666f7220676976656e20747970650000000000606082015260800190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b6001600160a01b0386811682528516602082015260a060408201819052600090614a8f90830186613da2565b8281036060840152614aa18186613da2565b90508281036080840152610e2d818561377a565b600060208284031215614ac757600080fd5b8151611fd88161371b565b600060033d11156125a45760046000803e5060005160e01c90565b600060443d1015614afb5790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715614b2a57505050505090565b8285019150815181811115614b425750505050505090565b843d8701016020828501011115614b5c5750505050505090565b614b6b602082860101876137cf565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906143c19083018461377a56fe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529a26469706673582212201c2210155ebf273a7ace937f46138c351764af94d707be3c4d2d51fd46d8b35b64736f6c63430008090033454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c6164647265737320766572696679696e67436f6e74726163742c627974657333322073616c742900000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000001c416c7068615665727365202f204265617420416c70686156657273650000000000000000000000000000000000000000000000000000000000000000000000044245415400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006468747470733a2f2f6d657461646174612e61726b616e652e6e6574776f726b2f6170692f617070732f61326431396364622d333039322d343565632d623731352d6161383433303939336438622f636f6e7472616374732f3130322f6d6574616461746100000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106103345760003560e01c806391d14854116101ab578063cf2c52cb116100f7578063f2fde38b11610095578063f807393a1161006f578063f807393a14610a15578063fc86b66214610a35578063fcb440b614610a62578063fea6b5d214610a8257600080fd5b8063f2fde38b146109a8578063f44b8158146109c8578063f79f20b5146109e857600080fd5b8063e8a3d485116100d1578063e8a3d48514610933578063e985e9c514610948578063f09d4db014610968578063f242432a1461098857600080fd5b8063cf2c52cb146108c3578063d3d57d89146108e3578063d547741f1461091357600080fd5b8063a22cb46511610164578063aed0ddf21161013e578063aed0ddf214610823578063b88cbbd214610853578063bb72018814610873578063bd378c71146108a357600080fd5b8063a22cb465146107af578063a3b0b5a3146107cf578063a582e8f81461080357600080fd5b806391d1485414610705578063938e3d7b1461072557806393f7d6c71461074557806395d89b41146107655780639eea5f661461077a578063a217fddf1461079a57600080fd5b8063248a9ca3116102855780634e1273f411610223578063715018a6116101fd578063715018a61461068157806379920951146106965780637c638212146106c35780638da5cb5b146106dd57600080fd5b80634e1273f4146106145780635c5fb5211461064157806364c589941461066157600080fd5b80632f2ff15d1161025f5780632f2ff15d146105885780633199da02146105a85780633408e470146105e157806336568abe146105f457600080fd5b8063248a9ca3146105025780632d0335ab146105325780632eb2c2d61461056857600080fd5b80630f7e5970116102f25780631f55a2bc116102cc5780631f55a2bc1461048d57806320379ee5146104ad5780632262f53f146104c257806323a28325146104e257600080fd5b80630f7e59701461041e57806314564cfb1461044b5780631aeab0581461046d57600080fd5b8062fdd58e1461033957806301ffc9a71461036c57806306fdde031461039c5780630c53c51c146103be5780630e89341c146103d15780630f699e80146103f1575b600080fd5b34801561034557600080fd5b506103596103543660046136f1565b610aa2565b6040519081526020015b60405180910390f35b34801561037857600080fd5b5061038c610387366004613731565b610b39565b6040519015158152602001610363565b3480156103a857600080fd5b506103b1610bc1565b60405161036391906137a6565b6103b16103cc36600461386e565b610c4f565b3480156103dd57600080fd5b506103b16103ec3660046138e9565b610e39565b3480156103fd57600080fd5b5061035961040c3660046138e9565b600a6020526000908152604090205481565b34801561042a57600080fd5b506103b1604051806040016040528060018152602001603160f81b81525081565b34801561045757600080fd5b5061046b61046636600461394d565b610ee8565b005b34801561047957600080fd5b5061046b6104883660046139d6565b61100e565b34801561049957600080fd5b5061046b6104a8366004613a8d565b611048565b3480156104b957600080fd5b50600454610359565b3480156104ce57600080fd5b5061046b6104dd366004613afe565b61109a565b3480156104ee57600080fd5b5061046b6104fd366004613b20565b6110b0565b34801561050e57600080fd5b5061035961051d3660046138e9565b60009081526002602052604090206001015490565b34801561053e57600080fd5b5061035961054d366004613b61565b6001600160a01b031660009081526005602052604090205490565b34801561057457600080fd5b5061046b610583366004613c10565b61132b565b34801561059457600080fd5b5061046b6105a3366004613cac565b6115b2565b3480156105b457600080fd5b5061038c6105c3366004613b61565b6001600160a01b031660009081526006602052604090205460ff1690565b3480156105ed57600080fd5b5046610359565b34801561060057600080fd5b5061046b61060f366004613cac565b6115df565b34801561062057600080fd5b5061063461062f366004613cd8565b611669565b6040516103639190613ddd565b34801561064d57600080fd5b5061046b61065c366004613df0565b611792565b34801561066d57600080fd5b5061046b61067c366004613e5b565b61180d565b34801561068d57600080fd5b5061046b6118a2565b3480156106a257600080fd5b506103596106b13660046138e9565b60096020526000908152604090205481565b3480156106cf57600080fd5b5060075461038c9060ff1681565b3480156106e957600080fd5b506003546040516001600160a01b039091168152602001610363565b34801561071157600080fd5b5061038c610720366004613cac565b6118bd565b34801561073157600080fd5b5061046b610740366004613e85565b6118e8565b34801561075157600080fd5b5061046b610760366004613ec1565b611909565b34801561077157600080fd5b506103b1611a4b565b34801561078657600080fd5b5061046b610795366004613f34565b611a58565b3480156107a657600080fd5b50610359600081565b3480156107bb57600080fd5b5061046b6107ca366004613e5b565b611b4d565b3480156107db57600080fd5b506103597f8f4f2da22e8ac8f11e15f9fc141cddbb5deea8800186560abb6e68c5496619a981565b34801561080f57600080fd5b5061046b61081e366004613f69565b611c61565b34801561082f57600080fd5b5061038c61083e3660046138e9565b600c6020526000908152604090205460ff1681565b34801561085f57600080fd5b5061046b61086e366004613fa5565b611c8e565b34801561087f57600080fd5b5061038c61088e3660046138e9565b600b6020526000908152604090205460ff1681565b3480156108af57600080fd5b5061046b6108be36600461394d565b611cfa565b3480156108cf57600080fd5b5061046b6108de366004613fda565b611e09565b3480156108ef57600080fd5b5061038c6108fe3660046138e9565b600d6020526000908152604090205460ff1681565b34801561091f57600080fd5b5061046b61092e366004613cac565b611ecb565b34801561093f57600080fd5b506103b1611ef3565b34801561095457600080fd5b5061038c61096336600461405c565b611f85565b34801561097457600080fd5b5061046b610983366004613b20565b611fdf565b34801561099457600080fd5b5061046b6109a3366004614086565b612092565b3480156109b457600080fd5b5061046b6109c3366004613b61565b612256565b3480156109d457600080fd5b5061046b6109e33660046140de565b6122d2565b3480156109f457600080fd5b50610359610a033660046138e9565b6000908152600e602052604090205490565b348015610a2157600080fd5b5061046b610a30366004613f34565b612477565b348015610a4157600080fd5b50610359610a503660046138e9565b60086020526000908152604090205481565b348015610a6e57600080fd5b5061046b610a7d3660046141ce565b6124d6565b348015610a8e57600080fd5b5061046b610a9d3660046139d6565b61251b565b60006001600160a01b038316610b135760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216637965db0b60e01b1480610b6a57506001600160e01b031982166301ffc9a760e01b145b80610b8557506001600160e01b03198216636cdb3d1360e11b145b80610ba057506001600160e01b031982166303a24d0760e21b145b80610bbb57506001600160e01b0319821663f79f20b560e01b145b92915050565b60108054610bce906141e9565b80601f0160208091040260200160405190810160405280929190818152602001828054610bfa906141e9565b8015610c475780601f10610c1c57610100808354040283529160200191610c47565b820191906000526020600020905b815481529060010190602001808311610c2a57829003601f168201915b505050505081565b60408051606081810183526001600160a01b03881660008181526005602090815290859020548452830152918101869052610c8d8782878787612742565b610ce35760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b6064820152608401610b0a565b6001600160a01b038716600090815260056020526040902054610d07906001612832565b6001600160a01b0388166000908152600560205260409081902091909155517f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b90610d5790899033908a90614224565b60405180910390a1600080306001600160a01b0316888a604051602001610d7f929190614259565b60408051601f1981840301815290829052610d9991614290565b6000604051808303816000865af19150503d8060008114610dd6576040519150601f19603f3d011682016040523d82523d6000602084013e610ddb565b606091505b509150915081610e2d5760405162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c000000006044820152606401610b0a565b98975050505050505050565b6000818152600a60209081526040808320548352600f9091529020805460609190610e63906141e9565b80601f0160208091040260200160405190810160405280929190818152602001828054610e8f906141e9565b8015610edc5780601f10610eb157610100808354040283529160200191610edc565b820191906000526020600020905b815481529060010190602001808311610ebf57829003601f168201915b50505050509050919050565b6000610efb81610ef661283e565b61284d565b838214610f625760405162461bcd60e51b815260206004820152602f60248201527f6e756d626572206f66206163636f756e7473206d75737420657175616c206e7560448201526e6d626572206f6620616d6f756e747360881b6064820152608401610b0a565b60005b84811015610fc657610fb687878784818110610f8357610f836142ac565b9050602002016020810190610f989190613b61565b868685818110610faa57610faa6142ac565b905060200201356128b1565b610fbf816142d8565b9050610f65565b507fbc11d48c1996f53e33584d90e8717cf38a41a8b337a2a6cebffea04c02c18fbf8686868686604051610ffe959493929190614365565b60405180910390a1505050505050565b600061101c81610ef661283e565b61102a898960008a8a611048565b811561103d5761103d8986868686611cfa565b505050505050505050565b600061105681610ef661283e565b6110638686868686612a1f565b7fdd645363ea6a3195510fb1e3a13913d327810ec8b23034aa40445504879df82b8686868686604051610ffe959493929190614392565b6110ac6110a561283e565b8383612b58565b5050565b60006110be81610ef661283e565b606080606080606060005b878110156112e157368989838181106110e4576110e46142ac565b90506020028101906110f691906143cc565b9050806000013587838151811061110f5761110f6142ac565b6020026020010181815250508060200135868381518110611132576111326142ac565b602090810291909101015261114d60608201604083016141ce565b85838151811061115f5761115f6142ac565b9115156020928302919091019091015261117f60808201606083016141ce565b848381518110611191576111916142ac565b911515602092830291909101909101526111ae60808201826143e2565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050855186925085915081106111f6576111f66142ac565b60200260200101819052506112788160000135826020013583604001602081019061122191906141ce565b61123160808601606087016141ce565b61123e60808701876143e2565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612a1f92505050565b61128860608201604083016141ce565b156112b1576112ac813561129f60c0840184614428565b61046660e0860186614428565b6112d0565b6112d081356112c360a0840184614428565b6108be60c0860186614428565b506112da816142d8565b90506110c9565b507f033bdc44ed09ce27d875236b5e356eb738c886bcbe86b77335f35f199230c47485858585856040516113199594939291906144a3565b60405180910390a15050505050505050565b815183511461134c5760405162461bcd60e51b8152600401610b0a90614554565b6001600160a01b0384166113725760405162461bcd60e51b8152600401610b0a9061459c565b61137a61283e565b6001600160a01b0316856001600160a01b031614806113a057506113a08561096361283e565b6114075760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610b0a565b600061141161283e565b905060005b8451811015611544576000858281518110611433576114336142ac565b602002602001015190506000858381518110611451576114516142ac565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156114a15760405162461bcd60e51b8152600401610b0a906145e1565b6114ab828261462b565b60008085815260200190815260200160002060008c6001600160a01b03166001600160a01b03168152602001908152602001600020819055508160008085815260200190815260200160002060008b6001600160a01b03166001600160a01b0316815260200190815260200160002060008282546115299190614642565b925050819055505050508061153d906142d8565b9050611416565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161159492919061465a565b60405180910390a46115aa818787878787612c6d565b505050505050565b6000828152600260205260409020600101546115d081610ef661283e565b6115da8383612dd8565b505050565b6115e761283e565b6001600160a01b0316816001600160a01b03161461165f5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610b0a565b6110ac8282612e5f565b606081518351146116ce5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610b0a565b600083516001600160401b038111156116e9576116e96137b9565b604051908082528060200260200182016040528015611712578160200160208202803683370190505b50905060005b845181101561178a5761175d858281518110611736576117366142ac565b6020026020010151858381518110611750576117506142ac565b6020026020010151610aa2565b82828151811061176f5761176f6142ac565b6020908102919091010152611783816142d8565b9050611718565b509392505050565b61180761179d61283e565b85858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808902828101820190935288825290935088925087918291850190849080828437600092019190915250612ee492505050565b50505050565b600061181b81610ef661283e565b60075460ff161561183e5760405162461bcd60e51b8152600401610b0a9061467f565b6001600160a01b038316600081815260066020908152604091829020805460ff19168615159081179091558251938452908301527ff945d041acd49baaff5c00a7e747c411751a1eb0d0b3e77d4c147eb27feb1183910160405180910390a1505050565b60006118b081610ef661283e565b6118ba6000613077565b50565b60009182526002602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60006118f681610ef661283e565b81516115da90601290602085019061363c565b61191161283e565b6001600160a01b0316826001600160a01b0316148061193757506119378261096361283e565b6119835760405162461bcd60e51b815260206004820181905260248201527f43616c6c6572206973206e6f74206f776e6572206e6f7220617070726f7665646044820152606401610b0a565b60005b8351811015611a3f57600b6000600a60008785815181106119a9576119a96142ac565b6020026020010151815260200190815260200160002054815260200190815260200160002060009054906101000a900460ff1615156001151514611a2f5760405162461bcd60e51b815260206004820152601e60248201527f54797065206f6620746f6b656e206d757374206265206275726e61626c6500006044820152606401610b0a565b611a38816142d8565b9050611986565b506115da828483612ee4565b60118054610bce906141e9565b6000838152600a60209081526040808320548352600b90915290205460ff161515600114611ac85760405162461bcd60e51b815260206004820152601e60248201527f54797065206f6620746f6b656e206d757374206265206275726e61626c6500006044820152606401610b0a565b611ad061283e565b6001600160a01b0316826001600160a01b03161480611af65750611af68261096361283e565b611b425760405162461bcd60e51b815260206004820181905260248201527f43616c6c6572206973206e6f74206f776e6572206e6f7220617070726f7665646044820152606401610b0a565b6115da828483612b58565b816001600160a01b0316611b5f61283e565b6001600160a01b03161415611bc85760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610b0a565b8060016000611bd561283e565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155611c1961283e565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c55911515815260200190565b60405180910390a35050565b6000611c6f81610ef661283e565b6000838152600f6020908152604090912083516118079285019061363c565b6000611c9c81610ef661283e565b611ca78484846130c9565b60408051858152602081018590526001600160a01b038416918101919091527faa31d15dd62975f7f98b676018f8787ef55d604ec8c765132c34e398919afb74906060015b60405180910390a150505050565b6000611d0881610ef661283e565b838214611d6b5760405162461bcd60e51b815260206004820152602b60248201527f6e756d626572206f6620696473206d75737420657175616c206e756d6265722060448201526a6f66206163636f756e747360a81b6064820152608401610b0a565b60005b84811015611dd157611dbf87878784818110611d8c57611d8c6142ac565b90506020020135868685818110611da557611da56142ac565b9050602002016020810190611dba9190613b61565b6130c9565b80611dc9816142d8565b915050611d6e565b507f16a6af95050d3c05c617a7c59f4ab66345c532ef8bf5575e13b8b25cb7ed13c18686868686604051610ffe9594939291906146c1565b7f8f4f2da22e8ac8f11e15f9fc141cddbb5deea8800186560abb6e68c5496619a9611e3681610ef661283e565b60008080611e46858701876146ee565b919450925090506001600160a01b038716611eb65760405162461bcd60e51b815260206004820152602a60248201527f4368696c644d696e7461626c65455243313135353a20494e56414c49445f44456044820152692827a9a4aa2faaa9a2a960b11b6064820152608401610b0a565b611ec287848484613252565b50505050505050565b600082815260026020526040902060010154611ee981610ef661283e565b6115da8383612e5f565b606060128054611f02906141e9565b80601f0160208091040260200160405190810160405280929190818152602001828054611f2e906141e9565b8015611f7b5780601f10611f5057610100808354040283529160200191611f7b565b820191906000526020600020905b815481529060010190602001808311611f5e57829003601f168201915b5050505050905090565b6001600160a01b03808316600090815260016020908152604080832093851683529290529081205460ff1680611fd857506001600160a01b03821660009081526006602052604090205460ff1615156001145b9392505050565b6000611fed81610ef661283e565b60005b82811015611807573684848381811061200b5761200b6142ac565b905060200281019061201d919061476b565b80356000908152600c602052604090205490915060ff161515600114156120625761205d81356120506040840184614428565b6104666060860186614428565b612081565b61208181356120746020840184614428565b6108be6040860186614428565b5061208b816142d8565b9050611ff0565b6001600160a01b0384166120b85760405162461bcd60e51b8152600401610b0a9061459c565b6120c061283e565b6001600160a01b0316856001600160a01b031614806120e657506120e68561096361283e565b6121445760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b6064820152608401610b0a565b600061214e61283e565b905061216f81878761215f886133a8565b612168886133a8565b5050505050565b6000848152602081815260408083206001600160a01b038a168452909152902054838110156121b05760405162461bcd60e51b8152600401610b0a906145e1565b6121ba848261462b565b6000868152602081815260408083206001600160a01b038c811685529252808320939093558816815290812080548692906121f6908490614642565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611ec28288888888886133f3565b600061226481610ef661283e565b6001600160a01b0382166122c95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b0a565b6110ac82613077565b60006122e081610ef661283e565b89881480156122ee57508986145b80156122f957508984145b801561230457508982145b61235e5760405162461bcd60e51b815260206004820152602560248201527f417272617920617267756d656e7473206d75737420686176652073616d65206c6044820152640cadccee8d60db1b6064820152608401610b0a565b60005b8a811015612420576124108c8c8381811061237e5761237e6142ac565b905060200201358b8b84818110612397576123976142ac565b905060200201358a8a858181106123b0576123b06142ac565b90506020020160208101906123c591906141ce565b8989868181106123d7576123d76142ac565b90506020020160208101906123ec91906141ce565b8888878181106123fe576123fe6142ac565b905060200281019061123e91906143e2565b612419816142d8565b9050612361565b507f033bdc44ed09ce27d875236b5e356eb738c886bcbe86b77335f35f199230c4748b8b8b8b8b8b8b8b8b8b6040516124629a999897969594939291906147df565b60405180910390a15050505050505050505050565b600061248581610ef661283e565b6124908484846128b1565b604080518581526001600160a01b03851660208201529081018390527f6a47e9a7fdc397ac645d72459fcca69dbb90f878280bf1fc79d95889ab51c19890606001611cec565b60006124e481610ef661283e565b60075460ff16156125075760405162461bcd60e51b8152600401610b0a9061467f565b506007805460ff1916911515919091179055565b600061252981610ef661283e565b612537898960018a8a611048565b831561103d5761103d8986868686610ee8565b6000333014156125a157600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b031691506125a49050565b50335b90565b606060006125b68360026148d4565b6125c1906002614642565b6001600160401b038111156125d8576125d86137b9565b6040519080825280601f01601f191660200182016040528015612602576020820181803683370190505b509050600360fc1b8160008151811061261d5761261d6142ac565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061264c5761264c6142ac565b60200101906001600160f81b031916908160001a90535060006126708460026148d4565b61267b906001614642565b90505b60018111156126f3576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106126af576126af6142ac565b1a60f81b8282815181106126c5576126c56142ac565b60200101906001600160f81b031916908160001a90535060049490941c936126ec816148f3565b905061267e565b508315611fd85760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610b0a565b60006001600160a01b0386166127a85760405162461bcd60e51b815260206004820152602560248201527f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360448201526424a3a722a960d91b6064820152608401610b0a565b60016127bb6127b6876134bd565b61353a565b6040805160008152602081018083529290925260ff851690820152606081018690526080810185905260a0016020604051602081039080840390855afa158015612809573d6000803e3d6000fd5b505050602060405103516001600160a01b0316866001600160a01b031614905095945050505050565b6000611fd88284614642565b600061284861254a565b905090565b61285782826118bd565b6110ac5761286f816001600160a01b031660146125a7565b61287a8360206125a7565b60405160200161288b92919061490a565b60408051601f198184030181529082905262461bcd60e51b8252610b0a916004016137a6565b60006128bf81610ef661283e565b600084116128cc57600080fd5b600082116129135760405162461bcd60e51b81526020600482015260146024820152730416d6f756e742073686f756c64206265203e20360641b6044820152606401610b0a565b6000848152600860209081526040808320546009909252909120546129389084612832565b11156129565760405162461bcd60e51b8152600401610b0a9061497f565b6000848152600c602052604090205460ff1615156001146129b95760405162461bcd60e51b815260206004820152601760248201527f747970654964206973206e6f742066756e6769626c652e0000000000000000006044820152606401610b0a565b6000848152600960205260409020546129d29083612832565b600085815260096020526040812091909155611807908490869085905b6040519080825280601f01601f191660200182016040528015612a19576020820181803683370190505b5061356a565b6000612a2d81610ef661283e565b6000868152600d602052604090205460ff1615612a8c5760405162461bcd60e51b815260206004820152601f60248201527f537570706c6965642074797065496420697320616c72656164792075736564006044820152606401610b0a565b60008511612ad55760405162461bcd60e51b815260206004820152601660248201527506d617820737570706c79206d757374206265203e20360541b6044820152606401610b0a565b6000868152600860209081526040808320889055600c825280832080548815801560ff1992831617909255600b84528285208054891515908316179055600d909352922080549091166001179055612b39576000868152600a602052604090208690555b6000868152600f602090815260409091208351611ec29285019061363c565b6001600160a01b038316612b7e5760405162461bcd60e51b8152600401610b0a906149dc565b6000612b8861283e565b9050612bb981856000612b9a876133a8565b612ba3876133a8565b5050604080516020810190915260009052505050565b6000838152602081815260408083206001600160a01b038816845290915290205482811015612bfa5760405162461bcd60e51b8152600401610b0a90614a1f565b612c04838261462b565b6000858152602081815260408083206001600160a01b038a811680865291845282852095909555815189815292830188905292938616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b6001600160a01b0384163b156115aa5760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190612cb19089908990889088908890600401614a63565b602060405180830381600087803b158015612ccb57600080fd5b505af1925050508015612cfb575060408051601f3d908101601f19168201909252612cf891810190614ab5565b60015b612da857612d07614ad2565b806308c379a01415612d415750612d1c614aed565b80612d275750612d43565b8060405162461bcd60e51b8152600401610b0a91906137a6565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610b0a565b6001600160e01b0319811663bc197c8160e01b14611ec25760405162461bcd60e51b8152600401610b0a90614b76565b612de282826118bd565b6110ac5760008281526002602090815260408083206001600160a01b03851684529091529020805460ff19166001179055612e1b61283e565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b612e6982826118bd565b156110ac5760008281526002602090815260408083206001600160a01b03851684529091529020805460ff19169055612ea061283e565b6001600160a01b0316816001600160a01b0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b6001600160a01b038316612f0a5760405162461bcd60e51b8152600401610b0a906149dc565b8051825114612f2b5760405162461bcd60e51b8152600401610b0a90614554565b6000612f3561283e565b604080516020810190915260009052905060005b8351811015613018576000848281518110612f6657612f666142ac565b602002602001015190506000848381518110612f8457612f846142ac565b602090810291909101810151600084815280835260408082206001600160a01b038c168352909352919091205490915081811015612fd45760405162461bcd60e51b8152600401610b0a90614a1f565b612fde828261462b565b6000938452602084815260408086206001600160a01b038c1687529091529093209290925550819050613010816142d8565b915050612f49565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb868660405161306992919061465a565b60405180910390a450505050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006130d781610ef661283e565b600083116130e457600080fd5b60008481526008602090815260408083205460099092529091205461310a906001612832565b11156131285760405162461bcd60e51b8152600401610b0a9061497f565b6000838152600d602052604090205460ff16156131875760405162461bcd60e51b815260206004820152601b60248201527f537570706c69656420696420697320616c7265616479207573656400000000006044820152606401610b0a565b6000848152600c602052604090205460ff16156131df5760405162461bcd60e51b8152602060048201526016602482015275476976656e20747970652069732066756e6769626c6560501b6044820152606401610b0a565b6000838152600d60209081526040808320805460ff1916600190811790915587845260099092529091205461321391612832565b6000858152600960209081526040808320938455868352600a82528083208890559254600e9091529181209190915561180790839085906001906129ef565b6001600160a01b0384166132785760405162461bcd60e51b8152600401610b0a90614bbe565b81518351146132995760405162461bcd60e51b8152600401610b0a90614554565b60006132a361283e565b905060005b8451811015613340578381815181106132c3576132c36142ac565b60200260200101516000808784815181106132e0576132e06142ac565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b0316815260200190815260200160002060008282546133289190614642565b90915550819050613338816142d8565b9150506132a8565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161339192919061465a565b60405180910390a461216881600087878787612c6d565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106133e2576133e26142ac565b602090810291909101015292915050565b6001600160a01b0384163b156115aa5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906134379089908990889088908890600401614bff565b602060405180830381600087803b15801561345157600080fd5b505af1925050508015613481575060408051601f3d908101601f1916820190925261347e91810190614ab5565b60015b61348d57612d07614ad2565b6001600160e01b0319811663f23a6e6160e01b14611ec25760405162461bcd60e51b8152600401610b0a90614b76565b6000604051806080016040528060438152602001614c3a604391398051602091820120835184830151604080870151805190860120905161351d950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b600061354560045490565b60405161190160f01b602082015260228101919091526042810183905260620161351d565b6001600160a01b0384166135905760405162461bcd60e51b8152600401610b0a90614bbe565b600061359a61283e565b90506135ac8160008761215f886133a8565b6000848152602081815260408083206001600160a01b0389168452909152812080548592906135dc908490614642565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612168816000878787876133f3565b828054613648906141e9565b90600052602060002090601f01602090048101928261366a57600085556136b0565b82601f1061368357805160ff19168380011785556136b0565b828001600101855582156136b0579182015b828111156136b0578251825591602001919060010190613695565b506136bc9291506136c0565b5090565b5b808211156136bc57600081556001016136c1565b80356001600160a01b03811681146136ec57600080fd5b919050565b6000806040838503121561370457600080fd5b61370d836136d5565b946020939093013593505050565b6001600160e01b0319811681146118ba57600080fd5b60006020828403121561374357600080fd5b8135611fd88161371b565b60005b83811015613769578181015183820152602001613751565b838111156118075750506000910152565b6000815180845261379281602086016020860161374e565b601f01601f19169290920160200192915050565b602081526000611fd8602083018461377a565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b03811182821017156137f4576137f46137b9565b6040525050565b600082601f83011261380c57600080fd5b81356001600160401b03811115613825576138256137b9565b60405161383c601f8301601f1916602001826137cf565b81815284602083860101111561385157600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a0868803121561388657600080fd5b61388f866136d5565b945060208601356001600160401b038111156138aa57600080fd5b6138b6888289016137fb565b9450506040860135925060608601359150608086013560ff811681146138db57600080fd5b809150509295509295909350565b6000602082840312156138fb57600080fd5b5035919050565b60008083601f84011261391457600080fd5b5081356001600160401b0381111561392b57600080fd5b6020830191508360208260051b850101111561394657600080fd5b9250929050565b60008060008060006060868803121561396557600080fd5b8535945060208601356001600160401b038082111561398357600080fd5b61398f89838a01613902565b909650945060408801359150808211156139a857600080fd5b506139b588828901613902565b969995985093965092949392505050565b803580151581146136ec57600080fd5b60008060008060008060008060c0898b0312156139f257600080fd5b8835975060208901359650613a0960408a016139c6565b955060608901356001600160401b0380821115613a2557600080fd5b613a318c838d016137fb565b965060808b0135915080821115613a4757600080fd5b613a538c838d01613902565b909650945060a08b0135915080821115613a6c57600080fd5b50613a798b828c01613902565b999c989b5096995094979396929594505050565b600080600080600060a08688031215613aa557600080fd5b8535945060208601359350613abc604087016139c6565b9250613aca606087016139c6565b915060808601356001600160401b03811115613ae557600080fd5b613af1888289016137fb565b9150509295509295909350565b60008060408385031215613b1157600080fd5b50508035926020909101359150565b60008060208385031215613b3357600080fd5b82356001600160401b03811115613b4957600080fd5b613b5585828601613902565b90969095509350505050565b600060208284031215613b7357600080fd5b611fd8826136d5565b60006001600160401b03821115613b9557613b956137b9565b5060051b60200190565b600082601f830112613bb057600080fd5b81356020613bbd82613b7c565b604051613bca82826137cf565b83815260059390931b8501820192828101915086841115613bea57600080fd5b8286015b84811015613c055780358352918301918301613bee565b509695505050505050565b600080600080600060a08688031215613c2857600080fd5b613c31866136d5565b9450613c3f602087016136d5565b935060408601356001600160401b0380821115613c5b57600080fd5b613c6789838a01613b9f565b94506060880135915080821115613c7d57600080fd5b613c8989838a01613b9f565b93506080880135915080821115613c9f57600080fd5b50613af1888289016137fb565b60008060408385031215613cbf57600080fd5b82359150613ccf602084016136d5565b90509250929050565b60008060408385031215613ceb57600080fd5b82356001600160401b0380821115613d0257600080fd5b818501915085601f830112613d1657600080fd5b81356020613d2382613b7c565b604051613d3082826137cf565b83815260059390931b8501820192828101915089841115613d5057600080fd5b948201945b83861015613d7557613d66866136d5565b82529482019490820190613d55565b96505086013592505080821115613d8b57600080fd5b50613d9885828601613b9f565b9150509250929050565b600081518084526020808501945080840160005b83811015613dd257815187529582019590820190600101613db6565b509495945050505050565b602081526000611fd86020830184613da2565b60008060008060408587031215613e0657600080fd5b84356001600160401b0380821115613e1d57600080fd5b613e2988838901613902565b90965094506020870135915080821115613e4257600080fd5b50613e4f87828801613902565b95989497509550505050565b60008060408385031215613e6e57600080fd5b613e77836136d5565b9150613ccf602084016139c6565b600060208284031215613e9757600080fd5b81356001600160401b03811115613ead57600080fd5b613eb9848285016137fb565b949350505050565b600080600060608486031215613ed657600080fd5b83356001600160401b0380821115613eed57600080fd5b613ef987838801613b9f565b9450613f07602087016136d5565b93506040860135915080821115613f1d57600080fd5b50613f2a86828701613b9f565b9150509250925092565b600080600060608486031215613f4957600080fd5b83359250613f59602085016136d5565b9150604084013590509250925092565b60008060408385031215613f7c57600080fd5b8235915060208301356001600160401b03811115613f9957600080fd5b613d98858286016137fb565b600080600060608486031215613fba57600080fd5b8335925060208401359150613fd1604085016136d5565b90509250925092565b600080600060408486031215613fef57600080fd5b613ff8846136d5565b925060208401356001600160401b038082111561401457600080fd5b818601915086601f83011261402857600080fd5b81358181111561403757600080fd5b87602082850101111561404957600080fd5b6020830194508093505050509250925092565b6000806040838503121561406f57600080fd5b614078836136d5565b9150613ccf602084016136d5565b600080600080600060a0868803121561409e57600080fd5b6140a7866136d5565b94506140b5602087016136d5565b9350604086013592506060860135915060808601356001600160401b03811115613ae557600080fd5b60008060008060008060008060008060a08b8d0312156140fd57600080fd5b8a356001600160401b038082111561411457600080fd5b6141208e838f01613902565b909c509a5060208d013591508082111561413957600080fd5b6141458e838f01613902565b909a50985060408d013591508082111561415e57600080fd5b61416a8e838f01613902565b909850965060608d013591508082111561418357600080fd5b61418f8e838f01613902565b909650945060808d01359150808211156141a857600080fd5b506141b58d828e01613902565b915080935050809150509295989b9194979a5092959850565b6000602082840312156141e057600080fd5b611fd8826139c6565b600181811c908216806141fd57607f821691505b6020821081141561421e57634e487b7160e01b600052602260045260246000fd5b50919050565b6001600160a01b038481168252831660208201526060604082018190526000906142509083018461377a565b95945050505050565b6000835161426b81846020880161374e565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b600082516142a281846020870161374e565b9190910192915050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156142ec576142ec6142c2565b5060010190565b8183526000602080850194508260005b85811015613dd2576001600160a01b0361431c836136d5565b1687529582019590820190600101614303565b81835260006001600160fb1b0383111561434857600080fd5b8260051b8083602087013760009401602001938452509192915050565b85815260606020820152600061437f6060830186886142f3565b8281036040840152610e2d81858761432f565b8581528460208201528315156040820152821515606082015260a0608082015260006143c160a083018461377a565b979650505050505050565b6000823560fe198336030181126142a257600080fd5b6000808335601e198436030181126143f957600080fd5b8301803591506001600160401b0382111561441357600080fd5b60200191503681900382131561394657600080fd5b6000808335601e1984360301811261443f57600080fd5b8301803591506001600160401b0382111561445957600080fd5b6020019150600581901b360382131561394657600080fd5b600081518084526020808501945080840160005b83811015613dd2578151151587529582019590820190600101614485565b60a0815260006144b660a0830188613da2565b6020838203818501526144c98289613da2565b915083820360408501526144dd8288614471565b915083820360608501526144f18287614471565b915083820360808501528185518084528284019150828160051b85010183880160005b8381101561454257601f1987840301855261453083835161377a565b94860194925090850190600101614514565b50909c9b505050505050505050505050565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60008282101561463d5761463d6142c2565b500390565b60008219821115614655576146556142c2565b500190565b60408152600061466d6040830185613da2565b82810360208401526142508185613da2565b60208082526022908201527f4175746f2d617070726f7665642061646472657373657320617265206c6f636b604082015261195960f21b606082015260800190565b8581526060602082015260006146db60608301868861432f565b8281036040840152610e2d8185876142f3565b60008060006060848603121561470357600080fd5b83356001600160401b038082111561471a57600080fd5b61472687838801613b9f565b9450602086013591508082111561473c57600080fd5b61474887838801613b9f565b9350604086013591508082111561475e57600080fd5b50613f2a868287016137fb565b60008235607e198336030181126142a257600080fd5b8183526000602080850194508260005b85811015613dd2576147a2826139c6565b151587529582019590820190600101614791565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60a0815260006147f360a083018c8e61432f565b602083820381850152614807828c8e61432f565b9150838203604085015261481c828a8c614781565b9150838203606085015261483182888a614781565b84810360808601528581529150808201600586901b830182018760005b888110156148bc57858303601f190184528135368b9003601e1901811261487457600080fd5b8a0180356001600160401b0381111561488c57600080fd5b8036038c131561489b57600080fd5b6148a885828985016147b6565b95870195945050509084019060010161484e565b5050809450505050509b9a5050505050505050505050565b60008160001904831182151516156148ee576148ee6142c2565b500290565b600081614902576149026142c2565b506000190190565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161494281601785016020880161374e565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835161497381602884016020880161374e565b01602801949350505050565b6020808252603b908201527f4d696e74696e6720776f756c642065786365656420746865206d6178206e756d60408201527f626572206f66206974656d7320666f7220676976656e20747970650000000000606082015260800190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b6001600160a01b0386811682528516602082015260a060408201819052600090614a8f90830186613da2565b8281036060840152614aa18186613da2565b90508281036080840152610e2d818561377a565b600060208284031215614ac757600080fd5b8151611fd88161371b565b600060033d11156125a45760046000803e5060005160e01c90565b600060443d1015614afb5790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715614b2a57505050505090565b8285019150815181811115614b425750505050505090565b843d8701016020828501011115614b5c5750505050505090565b614b6b602082860101876137cf565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906143c19083018461377a56fe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529a26469706673582212201c2210155ebf273a7ace937f46138c351764af94d707be3c4d2d51fd46d8b35b64736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000001c416c7068615665727365202f204265617420416c70686156657273650000000000000000000000000000000000000000000000000000000000000000000000044245415400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006468747470733a2f2f6d657461646174612e61726b616e652e6e6574776f726b2f6170692f617070732f61326431396364622d333039322d343565632d623731352d6161383433303939336438622f636f6e7472616374732f3130322f6d6574616461746100000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name_ (string): AlphaVerse / Beat AlphaVerse
Arg [1] : symbol_ (string): BEAT
Arg [2] : contractURI_ (string): https://metadata.arkane.network/api/apps/a2d19cdb-3092-45ec-b715-aa8430993d8b/contracts/102/metadata
Arg [3] : childChainManager (address): 0x0000000000000000000000000000000000000000
Arg [4] : secondaryOwner (address): 0x0000000000000000000000000000000000000000
Arg [5] : _autoApprovedAddressesLocked (bool): True
-----Encoded View---------------
15 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [6] : 000000000000000000000000000000000000000000000000000000000000001c
Arg [7] : 416c7068615665727365202f204265617420416c706861566572736500000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [9] : 4245415400000000000000000000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [11] : 68747470733a2f2f6d657461646174612e61726b616e652e6e6574776f726b2f
Arg [12] : 6170692f617070732f61326431396364622d333039322d343565632d62373135
Arg [13] : 2d6161383433303939336438622f636f6e7472616374732f3130322f6d657461
Arg [14] : 6461746100000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
70344:1321:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43602:231;;;;;;;;;;-1:-1:-1;43602:231:0;;;;;:::i;:::-;;:::i;:::-;;;597:25:1;;;585:2;570:18;43602:231:0;;;;;;;;71017:412;;;;;;;;;;-1:-1:-1;71017:412:0;;;;;:::i;:::-;;:::i;:::-;;;1184:14:1;;1177:22;1159:41;;1147:2;1132:18;71017:412:0;1019:187:1;70391:18:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;26343:1139::-;;;;;;:::i;:::-;;:::i;70061:128::-;;;;;;;;;;-1:-1:-1;70061:128:0;;;;;:::i;:::-;;:::i;60035:47::-;;;;;;;;;;-1:-1:-1;60035:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;21544:43;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;21544:43:0;;;;;65385:439;;;;;;;;;;-1:-1:-1;65385:439:0;;;;;:::i;:::-;;:::i;:::-;;65832:378;;;;;;;;;;-1:-1:-1;65832:378:0;;;;;:::i;:::-;;:::i;62255:289::-;;;;;;;;;;-1:-1:-1;62255:289:0;;;;;:::i;:::-;;:::i;22546:101::-;;;;;;;;;;-1:-1:-1;22624:15:0;;22546:101;;57400:111;;;;;;;;;;-1:-1:-1;57400:111:0;;;;;:::i;:::-;;:::i;66605:1089::-;;;;;;;;;;-1:-1:-1;66605:1089:0;;;;;:::i;:::-;;:::i;16473:123::-;;;;;;;;;;-1:-1:-1;16473:123:0;;;;;:::i;:::-;16539:7;16566:12;;;:6;:12;;;;;:22;;;;16473:123;27864:107;;;;;;;;;;-1:-1:-1;27864:107:0;;;;;:::i;:::-;-1:-1:-1;;;;;27951:12:0;27917:13;27951:12;;;:6;:12;;;;;;;27864:107;46273:1227;;;;;;;;;;-1:-1:-1;46273:1227:0;;;;;:::i;:::-;;:::i;16858:147::-;;;;;;;;;;-1:-1:-1;16858:147:0;;;;;:::i;:::-;;:::i;59386:126::-;;;;;;;;;;-1:-1:-1;59386:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;59473:31:0;59449:4;59473:31;;;:21;:31;;;;;;;;;59386:126;22655:161;;;;;;;;;;-1:-1:-1;22769:9:0;22655:161;;17906:218;;;;;;;;;;-1:-1:-1;17906:218:0;;;;;:::i;:::-;;:::i;43999:529::-;;;;;;;;;;-1:-1:-1;43999:529:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;57799:151::-;;;;;;;;;;-1:-1:-1;57799:151:0;;;;;:::i;:::-;;:::i;58832:300::-;;;;;;;;;;-1:-1:-1;58832:300:0;;;;;:::i;:::-;;:::i;24850:113::-;;;;;;;;;;;;;:::i;59978:50::-;;;;;;;;;;-1:-1:-1;59978:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;58363:47;;;;;;;;;;-1:-1:-1;58363:47:0;;;;;;;;24181:87;;;;;;;;;;-1:-1:-1;24254:6:0;;24181:87;;-1:-1:-1;;;;;24254:6:0;;;13700:51:1;;13688:2;13673:18;24181:87:0;13554:203:1;15451:139:0;;;;;;;;;;-1:-1:-1;15451:139:0;;;;;:::i;:::-;;:::i;71437:126::-;;;;;;;;;;-1:-1:-1;71437:126:0;;;;;:::i;:::-;;:::i;69183:467::-;;;;;;;;;;-1:-1:-1;69183:467:0;;;;;:::i;:::-;;:::i;70416:20::-;;;;;;;;;;;;;:::i;68616:364::-;;;;;;;;;;-1:-1:-1;68616:364:0;;;;;:::i;:::-;;:::i;13420:49::-;;;;;;;;;;-1:-1:-1;13420:49:0;13465:4;13420:49;;44601:311;;;;;;;;;;-1:-1:-1;44601:311:0;;;;;:::i;:::-;;:::i;55298:68::-;;;;;;;;;;;;55339:27;55298:68;;70197:138;;;;;;;;;;-1:-1:-1;70197:138:0;;;;;:::i;:::-;;:::i;60142:46::-;;;;;;;;;;-1:-1:-1;60142:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;63941:216;;;;;;;;;;-1:-1:-1;63941:216:0;;;;;:::i;:::-;;:::i;60089:46::-;;;;;;;;;;-1:-1:-1;60089:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;64952:423;;;;;;;;;;-1:-1:-1;64952:423:0;;;;;:::i;:::-;;:::i;56641:475::-;;;;;;;;;;-1:-1:-1;56641:475:0;;;;;:::i;:::-;;:::i;60195:39::-;;;;;;;;;;-1:-1:-1;60195:39:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;17250:149;;;;;;;;;;-1:-1:-1;17250:149:0;;;;;:::i;:::-;;:::i;71571:89::-;;;;;;;;;;;;;:::i;58609:215::-;;;;;;;;;;-1:-1:-1;58609:215:0;;;;;:::i;:::-;;:::i;67702:490::-;;;;;;;;;;-1:-1:-1;67702:490:0;;;;;:::i;:::-;;:::i;45224:972::-;;;;;;;;;;-1:-1:-1;45224:972:0;;;;;:::i;:::-;;:::i;25118:211::-;;;;;;;;;;-1:-1:-1;25118:211:0;;;;;:::i;:::-;;:::i;62554:709::-;;;;;;;;;;-1:-1:-1;62554:709:0;;;;;:::i;:::-;;:::i;68200:112::-;;;;;;;;;;-1:-1:-1;68200:112:0;;;;;:::i;:::-;68262:7;68289:15;;;:11;:15;;;;;;;68200:112;64725:219;;;;;;;;;;-1:-1:-1;64725:219:0;;;;;:::i;:::-;;:::i;59920:51::-;;;;;;;;;;-1:-1:-1;59920:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;59140:238;;;;;;;;;;-1:-1:-1;59140:238:0;;;;;:::i;:::-;;:::i;66218:379::-;;;;;;;;;;-1:-1:-1;66218:379:0;;;;;:::i;:::-;;:::i;43602:231::-;43688:7;-1:-1:-1;;;;;43716:21:0;;43708:77;;;;-1:-1:-1;;;43708:77:0;;21977:2:1;43708:77:0;;;21959:21:1;22016:2;21996:18;;;21989:30;22055:34;22035:18;;;22028:62;-1:-1:-1;;;22106:18:1;;;22099:41;22157:19;;43708:77:0;;;;;;;;;-1:-1:-1;43803:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;43803:22:0;;;;;;;;;;;;43602:231::o;71017:412::-;71116:4;-1:-1:-1;;;;;;71140:47:0;;-1:-1:-1;;;71140:47:0;;:100;;-1:-1:-1;;;;;;;71200:40:0;;-1:-1:-1;;;71200:40:0;71140:100;:154;;;-1:-1:-1;;;;;;;71253:41:0;;-1:-1:-1;;;71253:41:0;71140:154;:219;;;-1:-1:-1;;;;;;;71307:52:0;;-1:-1:-1;;;71307:52:0;71140:219;:281;;;-1:-1:-1;;;;;;;71372:49:0;;-1:-1:-1;;;71372:49:0;71140:281;71133:288;71017:412;-1:-1:-1;;71017:412:0:o;70391:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26343:1139::-;26601:140;;;26544:12;26601:140;;;;;-1:-1:-1;;;;;26635:19:0;;26569:29;26635:19;;;:6;:19;;;;;;;;;26601:140;;;;;;;;;;;26776:45;26642:11;26601:140;26804:4;26810;26816;26776:6;:45::i;:::-;26754:128;;;;-1:-1:-1;;;26754:128:0;;22774:2:1;26754:128:0;;;22756:21:1;22813:2;22793:18;;;22786:30;22852:34;22832:18;;;22825:62;-1:-1:-1;;;22903:18:1;;;22896:31;22944:19;;26754:128:0;22572:397:1;26754:128:0;-1:-1:-1;;;;;26971:19:0;;;;;;:6;:19;;;;;;:26;;26995:1;26971:23;:26::i;:::-;-1:-1:-1;;;;;26949:19:0;;;;;;:6;:19;;;;;;;:48;;;;27015:126;;;;;26956:11;;27087:10;;27113:17;;27015:126;:::i;:::-;;;;;;;;27252:12;27266:23;27301:4;-1:-1:-1;;;;;27293:18:0;27343:17;27362:11;27326:48;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;27326:48:0;;;;;;;;;;27293:92;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27251:134;;;;27404:7;27396:48;;;;-1:-1:-1;;;27396:48:0;;24312:2:1;27396:48:0;;;24294:21:1;24351:2;24331:18;;;24324:30;24390;24370:18;;;24363:58;24438:18;;27396:48:0;24110:352:1;27396:48:0;27464:10;26343:1139;-1:-1:-1;;;;;;;;26343:1139:0:o;70061:128::-;70159:22;70164:16;;;:12;:16;;;;;;;;;70159:22;;:4;:22;;;;;70152:29;;70126:13;;70159:22;70152:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70061:128;;;:::o;65385:439::-;13465:4;15024:30;13465:4;15041:12;:10;:12::i;:::-;15024:10;:30::i;:::-;65540:33;;::::1;65532:93;;;::::0;-1:-1:-1;;;65532:93:0;;24669:2:1;65532:93:0::1;::::0;::::1;24651:21:1::0;24708:2;24688:18;;;24681:30;24747:34;24727:18;;;24720:62;-1:-1:-1;;;24798:18:1;;;24791:45;24853:19;;65532:93:0::1;24467:411:1::0;65532:93:0::1;65641:9;65636:119;65656:19:::0;;::::1;65636:119;;;65697:46;65711:6;65719:8;;65728:1;65719:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;65732:7;;65740:1;65732:10;;;;;;;:::i;:::-;;;;;;;65697:13;:46::i;:::-;65677:3;::::0;::::1;:::i;:::-;;;65636:119;;;;65770:46;65790:6;65798:8;;65808:7;;65770:46;;;;;;;;;;:::i;:::-;;;;;;;;65385:439:::0;;;;;;:::o;65832:378::-;13465:4;15024:30;13465:4;15041:12;:10;:12::i;15024:30::-;66045:52:::1;66056:6;66064:9;66075:5;66082:8;66092:4;66045:10;:52::i;:::-;66112:19:::0;;66108:95:::1;;66148:43;66169:6;66177:3;;66182:8;;66148:20;:43::i;:::-;65832:378:::0;;;;;;;;;:::o;62255:289::-;13465:4;15024:30;13465:4;15041:12;:10;:12::i;15024:30::-;62407:56:::1;62419:6;62427:9;62438:8;62448;62458:4;62407:11;:56::i;:::-;62479:57;62492:6;62500:9;62511:8;62521;62531:4;62479:57;;;;;;;;;;:::i;57400:111::-:0;57472:31;57478:12;:10;:12::i;:::-;57492:2;57496:6;57472:5;:31::i;:::-;57400:111;;:::o;66605:1089::-;13465:4;15024:30;13465:4;15041:12;:10;:12::i;15024:30::-;66726:24:::1;66761:28:::0;66800:22:::1;66833::::0;66866:21:::1;66905:9;66900:703;66920:19:::0;;::::1;66900:703;;;66961:41;67005:8;;67014:1;67005:11;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;66961:55;;67044:7;:14;;;67031:7;67039:1;67031:10;;;;;;;;:::i;:::-;;;;;;:27;;;::::0;::::1;67090:7;:17;;;67073:11;67085:1;67073:14;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:34;67136:16:::1;::::0;;;::::1;::::0;::::1;;:::i;:::-;67122:8;67131:1;67122:11;;;;;;;;:::i;:::-;:30:::0;::::1;;:11;::::0;;::::1;::::0;;;;;;;:30;67181:16:::1;::::0;;;::::1;::::0;::::1;;:::i;:::-;67167:8;67176:1;67167:11;;;;;;;;:::i;:::-;:30:::0;::::1;;:11;::::0;;::::1;::::0;;;;;;;:30;67223:11:::1;;::::0;::::1;:7:::0;:11:::1;:::i;:::-;67212:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;67212:8:0;;:5;;-1:-1:-1;67218:1:0;;-1:-1:-1;67212:8:0;::::1;;;;;:::i;:::-;;;;;;:22;;;;67249:95;67261:7;:14;;;67277:7;:17;;;67296:7;:16;;;;;;;;;;:::i;:::-;67314;::::0;;;::::1;::::0;::::1;;:::i;:::-;67332:11;;::::0;::::1;:7:::0;:11:::1;:::i;:::-;67249:95;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;67249:11:0::1;::::0;-1:-1:-1;;;67249:95:0:i:1;:::-;67363:16;::::0;;;::::1;::::0;::::1;;:::i;:::-;67359:233;;;67400:68;67418:14:::0;::::1;67434:16;;::::0;::::1;67418:7:::0;67434:16:::1;:::i;:::-;67452:15;;::::0;::::1;:7:::0;:15:::1;:::i;67400:68::-;67359:233;;;67509:67;67530:14:::0;::::1;67546:11;;::::0;::::1;67530:7:::0;67546:11:::1;:::i;:::-;67559:16;;::::0;::::1;:7:::0;:16:::1;:::i;67509:67::-;-1:-1:-1::0;66941:3:0::1;::::0;::::1;:::i;:::-;;;66900:703;;;;67618:66;67636:7;67645:11;67658:8;67668;67678:5;67618:66;;;;;;;;;;:::i;:::-;;;;;;;;66715:979;;;;;66605:1089:::0;;;:::o;46273:1227::-;46526:7;:14;46512:3;:10;:28;46504:81;;;;-1:-1:-1;;;46504:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;46604:16:0;;46596:66;;;;-1:-1:-1;;;46596:66:0;;;;;;;:::i;:::-;46703:12;:10;:12::i;:::-;-1:-1:-1;;;;;46695:20:0;:4;-1:-1:-1;;;;;46695:20:0;;:60;;;;46719:36;46736:4;46742:12;:10;:12::i;46719:36::-;46673:160;;;;-1:-1:-1;;;46673:160:0;;32240:2:1;46673:160:0;;;32222:21:1;32279:2;32259:18;;;32252:30;32318:34;32298:18;;;32291:62;-1:-1:-1;;;32369:18:1;;;32362:48;32427:19;;46673:160:0;32038:414:1;46673:160:0;46846:16;46865:12;:10;:12::i;:::-;46846:31;;46968:9;46963:377;46987:3;:10;46983:1;:14;46963:377;;;47019:10;47032:3;47036:1;47032:6;;;;;;;;:::i;:::-;;;;;;;47019:19;;47053:14;47070:7;47078:1;47070:10;;;;;;;;:::i;:::-;;;;;;;;;;;;47097:19;47119:13;;;;;;;;;;-1:-1:-1;;;;;47119:19:0;;;;;;;;;;;;47070:10;;-1:-1:-1;47161:21:0;;;;47153:76;;;;-1:-1:-1;;;47153:76:0;;;;;;;:::i;:::-;47266:20;47280:6;47266:11;:20;:::i;:::-;47244:9;:13;47254:2;47244:13;;;;;;;;;;;:19;47258:4;-1:-1:-1;;;;;47244:19:0;-1:-1:-1;;;;;47244:19:0;;;;;;;;;;;;:42;;;;47322:6;47301:9;:13;47311:2;47301:13;;;;;;;;;;;:17;47315:2;-1:-1:-1;;;;;47301:17:0;-1:-1:-1;;;;;47301:17:0;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;47004:336;;;46999:3;;;;:::i;:::-;;;46963:377;;;;47387:2;-1:-1:-1;;;;;47357:47:0;47381:4;-1:-1:-1;;;;;47357:47:0;47371:8;-1:-1:-1;;;;;47357:47:0;;47391:3;47396:7;47357:47;;;;;;;:::i;:::-;;;;;;;;47417:75;47453:8;47463:4;47469:2;47473:3;47478:7;47487:4;47417:35;:75::i;:::-;46493:1007;46273:1227;;;;;:::o;16858:147::-;16539:7;16566:12;;;:6;:12;;;;;:22;;;15024:30;15035:4;15041:12;:10;:12::i;15024:30::-;16972:25:::1;16983:4;16989:7;16972:10;:25::i;:::-;16858:147:::0;;;:::o;17906:218::-;18013:12;:10;:12::i;:::-;-1:-1:-1;;;;;18002:23:0;:7;-1:-1:-1;;;;;18002:23:0;;17994:83;;;;-1:-1:-1;;;17994:83:0;;33803:2:1;17994:83:0;;;33785:21:1;33842:2;33822:18;;;33815:30;33881:34;33861:18;;;33854:62;-1:-1:-1;;;33932:18:1;;;33925:45;33987:19;;17994:83:0;33601:411:1;17994:83:0;18090:26;18102:4;18108:7;18090:11;:26::i;43999:529::-;44160:16;44221:3;:10;44202:8;:15;:29;44194:83;;;;-1:-1:-1;;;44194:83:0;;34219:2:1;44194:83:0;;;34201:21:1;34258:2;34238:18;;;34231:30;34297:34;34277:18;;;34270:62;-1:-1:-1;;;34348:18:1;;;34341:39;34397:19;;44194:83:0;34017:405:1;44194:83:0;44290:30;44337:8;:15;-1:-1:-1;;;;;44323:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44323:30:0;;44290:63;;44371:9;44366:122;44390:8;:15;44386:1;:19;44366:122;;;44446:30;44456:8;44465:1;44456:11;;;;;;;;:::i;:::-;;;;;;;44469:3;44473:1;44469:6;;;;;;;;:::i;:::-;;;;;;;44446:9;:30::i;:::-;44427:13;44441:1;44427:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;44407:3;;;:::i;:::-;;;44366:122;;;-1:-1:-1;44507:13:0;43999:529;-1:-1:-1;;;43999:529:0:o;57799:151::-;57904:38;57915:12;:10;:12::i;:::-;57929:3;;57904:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;57904:38:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57934:7:0;;-1:-1:-1;57934:7:0;;;;57904:38;;;57934:7;;57904:38;57934:7;57904:38;;;;;;;;;-1:-1:-1;57904:10:0;;-1:-1:-1;;;57904:38:0:i;:::-;57799:151;;;;:::o;58832:300::-;13465:4;15024:30;13465:4;15041:12;:10;:12::i;15024:30::-;58951:27:::1;::::0;::::1;;:36;58943:83;;;;-1:-1:-1::0;;;58943:83:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;59037:31:0;::::1;;::::0;;;:21:::1;:31;::::0;;;;;;;;:41;;-1:-1:-1;;59037:41:0::1;::::0;::::1;;::::0;;::::1;::::0;;;59094:30;;34998:51:1;;;35065:18;;;35058:50;59094:30:0::1;::::0;34971:18:1;59094:30:0::1;;;;;;;58832:300:::0;;;:::o;24850:113::-;13465:4;15024:30;13465:4;15041:12;:10;:12::i;15024:30::-;24934:21:::1;24952:1;24934:9;:21::i;:::-;24850:113:::0;:::o;15451:139::-;15529:4;15553:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;15553:29:0;;;;;;;;;;;;;;;15451:139::o;71437:126::-;13465:4;15024:30;13465:4;15041:12;:10;:12::i;15024:30::-;71536:19;;::::1;::::0;:4:::1;::::0;:19:::1;::::0;::::1;::::0;::::1;:::i;69183:467::-:0;69318:12;:10;:12::i;:::-;-1:-1:-1;;;;;69307:23:0;:7;-1:-1:-1;;;;;69307:23:0;;:66;;;;69334:39;69351:7;69360:12;:10;:12::i;69334:39::-;69285:148;;;;-1:-1:-1;;;69285:148:0;;35321:2:1;69285:148:0;;;35303:21:1;;;35340:18;;;35333:30;35399:34;35379:18;;;35372:62;35451:18;;69285:148:0;35119:356:1;69285:148:0;69449:9;69444:155;69468:3;:10;69464:1;:14;69444:155;;;69508:14;:36;69523:12;:20;69536:3;69540:1;69536:6;;;;;;;;:::i;:::-;;;;;;;69523:20;;;;;;;;;;;;69508:36;;;;;;;;;;;;;;;;;;;;;:44;;69548:4;69508:44;;;69500:87;;;;-1:-1:-1;;;69500:87:0;;35682:2:1;69500:87:0;;;35664:21:1;35721:2;35701:18;;;35694:30;35760:32;35740:18;;;35733:60;35810:18;;69500:87:0;35480:354:1;69500:87:0;69480:3;;;:::i;:::-;;;69444:155;;;;69609:33;69620:7;69629:3;69634:7;69609:10;:33::i;70416:20::-;;;;;;;:::i;68616:364::-;68701:32;68716:16;;;:12;:16;;;;;;;;;68701:32;;:14;:32;;;;;;;;:40;;:32;:40;68693:83;;;;-1:-1:-1;;;68693:83:0;;35682:2:1;68693:83:0;;;35664:21:1;35721:2;35701:18;;;35694:30;35760:32;35740:18;;;35733:60;35810:18;;68693:83:0;35480:354:1;68693:83:0;68820:12;:10;:12::i;:::-;-1:-1:-1;;;;;68809:23:0;:7;-1:-1:-1;;;;;68809:23:0;;:66;;;;68836:39;68853:7;68862:12;:10;:12::i;68836:39::-;68787:148;;;;-1:-1:-1;;;68787:148:0;;35321:2:1;68787:148:0;;;35303:21:1;;;35340:18;;;35333:30;35399:34;35379:18;;;35372:62;35451:18;;68787:148:0;35119:356:1;68787:148:0;68946:26;68952:7;68961:2;68965:6;68946:5;:26::i;44601:311::-;44720:8;-1:-1:-1;;;;;44704:24:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;44704:24:0;;;44696:78;;;;-1:-1:-1;;;44696:78:0;;36041:2:1;44696:78:0;;;36023:21:1;36080:2;36060:18;;;36053:30;36119:34;36099:18;;;36092:62;-1:-1:-1;;;36170:18:1;;;36163:39;36219:19;;44696:78:0;35839:405:1;44696:78:0;44832:8;44787:18;:32;44806:12;:10;:12::i;:::-;-1:-1:-1;;;;;44787:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;44787:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;44787:53:0;;;;;;;;;;;44871:12;:10;:12::i;:::-;-1:-1:-1;;;;;44856:48:0;;44895:8;44856:48;;;;1184:14:1;1177:22;1159:41;;1147:2;1132:18;;1019:187;44856:48:0;;;;;;;;44601:311;;:::o;70197:138::-;13465:4;15024:30;13465:4;15041:12;:10;:12::i;15024:30::-;70308:12:::1;::::0;;;:4:::1;:12;::::0;;;;;;;:19;;::::1;::::0;;::::1;::::0;::::1;:::i;63941:216::-:0;13465:4;15024:30;13465:4;15041:12;:10;:12::i;15024:30::-;64058:37:::1;64075:6;64083:2;64087:7;64058:16;:37::i;:::-;64111:38;::::0;;36451:25:1;;;36507:2;36492:18;;36485:34;;;-1:-1:-1;;;;;36555:32:1;;36535:18;;;36528:60;;;;64111:38:0::1;::::0;36439:2:1;36424:18;64111:38:0::1;;;;;;;;63941:216:::0;;;;:::o;64952:423::-;13465:4;15024:30;13465:4;15041:12;:10;:12::i;15024:30::-;65106:29;;::::1;65098:85;;;::::0;-1:-1:-1;;;65098:85:0;;36801:2:1;65098:85:0::1;::::0;::::1;36783:21:1::0;36840:2;36820:18;;;36813:30;36879:34;36859:18;;;36852:62;-1:-1:-1;;;36930:18:1;;;36923:41;36981:19;;65098:85:0::1;36599:407:1::0;65098:85:0::1;65199:9;65194:113;65214:14:::0;;::::1;65194:113;;;65250:45;65267:6;65275:3;;65279:1;65275:6;;;;;;;:::i;:::-;;;;;;;65283:8;;65292:1;65283:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;65250:16;:45::i;:::-;65230:3:::0;::::1;::::0;::::1;:::i;:::-;;;;65194:113;;;;65322:45;65345:6;65353:3;;65358:8;;65322:45;;;;;;;;;;:::i;56641:475::-:0;55339:27;15024:30;15035:4;15041:12;:10;:12::i;15024:30::-;56785:20:::1;::::0;;56882:54:::1;::::0;;::::1;56893:11:::0;56882:54:::1;:::i;:::-;56774:162:::0;;-1:-1:-1;56774:162:0;-1:-1:-1;56774:162:0;-1:-1:-1;;;;;;56971:18:0;::::1;56949:110;;;::::0;-1:-1:-1;;;56949:110:0;;38606:2:1;56949:110:0::1;::::0;::::1;38588:21:1::0;38645:2;38625:18;;;38618:30;38684:34;38664:18;;;38657:62;-1:-1:-1;;;38735:18:1;;;38728:40;38785:19;;56949:110:0::1;38404:406:1::0;56949:110:0::1;57072:36;57083:4;57089:3;57094:7;57103:4;57072:10;:36::i;:::-;56763:353;;;56641:475:::0;;;;:::o;17250:149::-;16539:7;16566:12;;;:6;:12;;;;;:22;;;15024:30;15035:4;15041:12;:10;:12::i;15024:30::-;17365:26:::1;17377:4;17383:7;17365:11;:26::i;71571:89::-:0;71615:13;71648:4;71641:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71571:89;:::o;58609:215::-;-1:-1:-1;;;;;45107:27:0;;;58708:4;45107:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;58732:84;;;-1:-1:-1;;;;;;58777:31:0;;;;;;:21;:31;;;;;;;;:39;;:31;:39;58732:84;58725:91;58609:215;-1:-1:-1;;;58609:215:0:o;67702:490::-;13465:4;15024:30;13465:4;15041:12;:10;:12::i;15024:30::-;67806:9:::1;67801:384;67821:19:::0;;::::1;67801:384;;;67862:28;67893:8;;67902:1;67893:11;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;67938:14:::0;::::1;67923:30;::::0;;;:14:::1;:30;::::0;;;;;67862:42;;-1:-1:-1;67923:30:0::1;;:38;;:30:::0;:38:::1;67919:255;;;67982:68;68000:14:::0;::::1;68016:16;;::::0;::::1;68000:7:::0;68016:16:::1;:::i;:::-;68034:15;;::::0;::::1;:7:::0;:15:::1;:::i;67982:68::-;67919:255;;;68091:67;68112:14:::0;::::1;68128:11;;::::0;::::1;68112:7:::0;68128:11:::1;:::i;:::-;68141:16;;::::0;::::1;:7:::0;:16:::1;:::i;68091:67::-;-1:-1:-1::0;67842:3:0::1;::::0;::::1;:::i;:::-;;;67801:384;;45224:972:::0;-1:-1:-1;;;;;45438:16:0;;45430:66;;;;-1:-1:-1;;;45430:66:0;;;;;;;:::i;:::-;45537:12;:10;:12::i;:::-;-1:-1:-1;;;;;45529:20:0;:4;-1:-1:-1;;;;;45529:20:0;;:60;;;;45553:36;45570:4;45576:12;:10;:12::i;45553:36::-;45507:151;;;;-1:-1:-1;;;45507:151:0;;39351:2:1;45507:151:0;;;39333:21:1;39390:2;39370:18;;;39363:30;39429:34;39409:18;;;39402:62;-1:-1:-1;;;39480:18:1;;;39473:39;39529:19;;45507:151:0;39149:405:1;45507:151:0;45671:16;45690:12;:10;:12::i;:::-;45671:31;;45715:96;45736:8;45746:4;45752:2;45756:21;45774:2;45756:17;:21::i;:::-;45779:25;45797:6;45779:17;:25::i;:::-;46273:1227;;;;;;45715:96;45824:19;45846:13;;;;;;;;;;;-1:-1:-1;;;;;45846:19:0;;;;;;;;;;45884:21;;;;45876:76;;;;-1:-1:-1;;;45876:76:0;;;;;;;:::i;:::-;45985:20;45999:6;45985:11;:20;:::i;:::-;45963:9;:13;;;;;;;;;;;-1:-1:-1;;;;;45963:19:0;;;;;;;;;;:42;;;;46016:17;;;;;;;:27;;46037:6;;45963:9;46016:27;;46037:6;;46016:27;:::i;:::-;;;;-1:-1:-1;;46061:46:0;;;39733:25:1;;;39789:2;39774:18;;39767:34;;;-1:-1:-1;;;;;46061:46:0;;;;;;;;;;;;;;39706:18:1;46061:46:0;;;;;;;46120:68;46151:8;46161:4;46167:2;46171;46175:6;46183:4;46120:30;:68::i;25118:211::-;13465:4;15024:30;13465:4;15041:12;:10;:12::i;15024:30::-;-1:-1:-1;;;;;25226:22:0;::::1;25218:73;;;::::0;-1:-1:-1;;;25218:73:0;;40014:2:1;25218:73:0::1;::::0;::::1;39996:21:1::0;40053:2;40033:18;;;40026:30;40092:34;40072:18;;;40065:62;-1:-1:-1;;;40143:18:1;;;40136:36;40189:19;;25218:73:0::1;39812:402:1::0;25218:73:0::1;25302:19;25312:8;25302:9;:19::i;62554:709::-:0;13465:4;15024:30;13465:4;15041:12;:10;:12::i;15024:30::-;62781:36;;::::1;:86:::0;::::1;;;-1:-1:-1::0;62834:33:0;;::::1;62781:86;:136;;;;-1:-1:-1::0;62884:33:0;;::::1;62781:136;:183;;;;-1:-1:-1::0;62934:30:0;;::::1;62781:183;62759:257;;;::::0;-1:-1:-1;;;62759:257:0;;40421:2:1;62759:257:0::1;::::0;::::1;40403:21:1::0;40460:2;40440:18;;;40433:30;40499:34;40479:18;;;40472:62;-1:-1:-1;;;40550:18:1;;;40543:35;40595:19;;62759:257:0::1;40219:401:1::0;62759:257:0::1;63032:9;63027:147;63047:18:::0;;::::1;63027:147;;;63087:75;63099:7;;63107:1;63099:10;;;;;;;:::i;:::-;;;;;;;63111:11;;63123:1;63111:14;;;;;;;:::i;:::-;;;;;;;63127:8;;63136:1;63127:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;63140:8;;63149:1;63140:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;63153:5;;63159:1;63153:8;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;63087:75::-;63067:3;::::0;::::1;:::i;:::-;;;63027:147;;;;63189:66;63207:7;;63216:11;;63229:8;;63239;;63249:5;;63189:66;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;62554:709:::0;;;;;;;;;;;:::o;64725:219::-;13465:4;15024:30;13465:4;15041:12;:10;:12::i;15024:30::-;64843:38:::1;64857:6;64865:7;64874:6;64843:13;:38::i;:::-;64897:39;::::0;;43604:25:1;;;-1:-1:-1;;;;;43665:32:1;;43660:2;43645:18;;43638:60;43714:18;;;43707:34;;;64897:39:0::1;::::0;43592:2:1;43577:18;64897:39:0::1;43402:345:1::0;59140:238:0;13465:4;15024:30;13465:4;15041:12;:10;:12::i;15024:30::-;59248:27:::1;::::0;::::1;;:36;59240:83;;;;-1:-1:-1::0;;;59240:83:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;59334:27:0::1;:36:::0;;-1:-1:-1;;59334:36:0::1;::::0;::::1;;::::0;;;::::1;::::0;;59140:238::o;66218:379::-;13465:4;15024:30;13465:4;15041:12;:10;:12::i;15024:30::-;66432:51:::1;66443:6;66451:9;66462:4;66468:8;66478:4;66432:10;:51::i;:::-;66498:19:::0;;66494:96:::1;;66534:44;66552:6;66560:8;;66570:7;;66534:17;:44::i;54527:626::-:0;54586:22;54630:10;54652:4;54630:27;54626:496;;;54674:18;54695:8;;54674:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;54734:8:0;54937:17;54931:24;-1:-1:-1;;;;;54909:126:0;;-1:-1:-1;54626:496:0;;-1:-1:-1;54626:496:0;;-1:-1:-1;55099:10:0;54626:496;54527:626;:::o;11214:447::-;11289:13;11315:19;11347:10;11351:6;11347:1;:10;:::i;:::-;:14;;11360:1;11347:14;:::i;:::-;-1:-1:-1;;;;;11337:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11337:25:0;;11315:47;;-1:-1:-1;;;11373:6:0;11380:1;11373:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;11373:15:0;;;;;;;;;-1:-1:-1;;;11399:6:0;11406:1;11399:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;11399:15:0;;;;;;;;-1:-1:-1;11430:9:0;11442:10;11446:6;11442:1;:10;:::i;:::-;:14;;11455:1;11442:14;:::i;:::-;11430:26;;11425:131;11462:1;11458;:5;11425:131;;;-1:-1:-1;;;11506:5:0;11514:3;11506:11;11497:21;;;;;;;:::i;:::-;;;;11485:6;11492:1;11485:9;;;;;;;;:::i;:::-;;;;:33;-1:-1:-1;;;;;11485:33:0;;;;;;;;-1:-1:-1;11543:1:0;11533:11;;;;;11465:3;;;:::i;:::-;;;11425:131;;;-1:-1:-1;11574:10:0;;11566:55;;;;-1:-1:-1;;;11566:55:0;;44268:2:1;11566:55:0;;;44250:21:1;;;44287:18;;;44280:30;44346:34;44326:18;;;44319:62;44398:18;;11566:55:0;44066:356:1;27979:458:0;28157:4;-1:-1:-1;;;;;28182:20:0;;28174:70;;;;-1:-1:-1;;;28174:70:0;;44629:2:1;28174:70:0;;;44611:21:1;44668:2;44648:18;;;44641:30;44707:34;44687:18;;;44680:62;-1:-1:-1;;;44758:18:1;;;44751:35;44803:19;;28174:70:0;44427:401:1;28174:70:0;28290:139;28314:47;28333:27;28353:6;28333:19;:27::i;:::-;28314:18;:47::i;:::-;28290:139;;;;;;;;;;;;45060:25:1;;;;45133:4;45121:17;;45101:18;;;45094:45;45155:18;;;45148:34;;;45198:18;;;45191:34;;;45032:19;;28290:139:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28271:158:0;:6;-1:-1:-1;;;;;28271:158:0;;28255:174;;27979:458;;;;;;;:::o;5487:98::-;5545:7;5572:5;5576:1;5572;:5;:::i;56084:153::-;56158:22;56205:24;:22;:24::i;:::-;56198:31;;56084:153;:::o;15880:404::-;15960:22;15968:4;15974:7;15960;:22::i;:::-;15956:321;;16100:41;16128:7;-1:-1:-1;;;;;16100:41:0;16138:2;16100:19;:41::i;:::-;16206:38;16234:4;16241:2;16206:19;:38::i;:::-;16013:250;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;16013:250:0;;;;;;;;;;-1:-1:-1;;;15999:266:0;;;;;;;:::i;64165:552::-;13465:4;15024:30;13465:4;15041:12;:10;:12::i;15024:30::-;64303:1:::1;64294:6;:10;64286:19;;;::::0;::::1;;64333:1;64324:6;:10;64316:43;;;::::0;-1:-1:-1;;;64316:43:0;;46229:2:1;64316:43:0::1;::::0;::::1;46211:21:1::0;46268:2;46248:18;;;46241:30;-1:-1:-1;;;46287:18:1;;;46280:50;46347:18;;64316:43:0::1;46027:344:1::0;64316:43:0::1;64417:24;::::0;;;:16:::1;:24;::::0;;;;;;;;64378:15:::1;:23:::0;;;;;;;:35:::1;::::0;64406:6;64378:27:::1;:35::i;:::-;:63;;64370:135;;;;-1:-1:-1::0;;;64370:135:0::1;;;;;;;:::i;:::-;64524:22;::::0;;;:14:::1;:22;::::0;;;;;::::1;;:30;;:22:::0;:30:::1;64516:66;;;::::0;-1:-1:-1;;;64516:66:0;;47006:2:1;64516:66:0::1;::::0;::::1;46988:21:1::0;47045:2;47025:18;;;47018:30;47084:25;47064:18;;;47057:53;47127:18;;64516:66:0::1;46804:347:1::0;64516:66:0::1;64619:23;::::0;;;:15:::1;:23;::::0;;;;;:35:::1;::::0;64647:6;64619:27:::1;:35::i;:::-;64593:23;::::0;;;:15:::1;:23;::::0;;;;:61;;;;64665:44:::1;::::0;64671:7;;64609:6;;64688;;64696:12:::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;64696:12:0::1;;64665:5;:44::i;61677:568::-:0;13465:4;15024:30;13465:4;15041:12;:10;:12::i;15024:30::-;61840:15:::1;::::0;;;:7:::1;:15;::::0;;;;;::::1;;:24;61832:68;;;::::0;-1:-1:-1;;;61832:68:0;;47358:2:1;61832:68:0::1;::::0;::::1;47340:21:1::0;47397:2;47377:18;;;47370:30;47436:33;47416:18;;;47409:61;47487:18;;61832:68:0::1;47156:355:1::0;61832:68:0::1;61931:1;61919:9;:13;61911:48;;;::::0;-1:-1:-1;;;61911:48:0;;47718:2:1;61911:48:0::1;::::0;::::1;47700:21:1::0;47757:2;47737:18;;;47730:30;-1:-1:-1;;;47776:18:1;;;47769:52;47838:18;;61911:48:0::1;47516:346:1::0;61911:48:0::1;61970:24;::::0;;;:16:::1;:24;::::0;;;;;;;:36;;;62017:14:::1;:22:::0;;;;;:33;;;::::1;::::0;::::1;-1:-1:-1::0;;62017:33:0;;::::1;;::::0;;;62061:14:::1;:22:::0;;;;;:33;;;::::1;;::::0;;::::1;;::::0;;62105:7:::1;:15:::0;;;;;:22;;;;::::1;62017:33:::0;62105:22:::1;::::0;;62138:70:::1;;62167:20;::::0;;;:12:::1;:20;::::0;;;;:29;;;62138:70:::1;62218:12;::::0;;;:4:::1;:12;::::0;;;;;;;:19;;::::1;::::0;;::::1;::::0;::::1;:::i;49763:605::-:0;-1:-1:-1;;;;;49859:21:0;;49851:69;;;;-1:-1:-1;;;49851:69:0;;;;;;;:::i;:::-;49933:16;49952:12;:10;:12::i;:::-;49933:31;;49977:105;49998:8;50008:7;50025:1;50029:21;50047:2;50029:17;:21::i;:::-;50052:25;50070:6;50052:17;:25::i;:::-;-1:-1:-1;;49977:105:0;;;;;;;;;-1:-1:-1;49977:105:0;;-1:-1:-1;;;46273:1227:0;49977:105;50095:22;50120:13;;;;;;;;;;;-1:-1:-1;;;;;50120:22:0;;;;;;;;;;50161:24;;;;50153:73;;;;-1:-1:-1;;;50153:73:0;;;;;;;:::i;:::-;50262:23;50279:6;50262:14;:23;:::i;:::-;50237:9;:13;;;;;;;;;;;-1:-1:-1;;;;;50237:22:0;;;;;;;;;;;;:48;;;;50303:57;;39733:25:1;;;39774:18;;;39767:34;;;50237:9:0;;50303:57;;;;;39706:18:1;50303:57:0;;;;;;;49840:528;;49763:605;;;:::o;53375:795::-;-1:-1:-1;;;;;53625:13:0;;35559:20;35598:8;53621:542;;53661:79;;-1:-1:-1;;;53661:79:0;;-1:-1:-1;;;;;53661:43:0;;;;;:79;;53705:8;;53715:4;;53721:3;;53726:7;;53735:4;;53661:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53661:79:0;;;;;;;;-1:-1:-1;;53661:79:0;;;;;;;;;;;;:::i;:::-;;;53657:495;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;54025:6;54018:14;;-1:-1:-1;;;54018:14:0;;;;;;;;:::i;53657:495::-;;;54074:62;;-1:-1:-1;;;54074:62:0;;50824:2:1;54074:62:0;;;50806:21:1;50863:2;50843:18;;;50836:30;50902:34;50882:18;;;50875:62;-1:-1:-1;;;50953:18:1;;;50946:50;51013:19;;54074:62:0;50622:416:1;53657:495:0;-1:-1:-1;;;;;;53790:64:0;;-1:-1:-1;;;53790:64:0;53786:163;;53879:50;;-1:-1:-1;;;53879:50:0;;;;;;;:::i;19154:229::-;19229:22;19237:4;19243:7;19229;:22::i;:::-;19224:152;;19268:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;19268:29:0;;;;;;;;;:36;;-1:-1:-1;;19268:36:0;19300:4;19268:36;;;19351:12;:10;:12::i;:::-;-1:-1:-1;;;;;19324:40:0;19342:7;-1:-1:-1;;;;;19324:40:0;19336:4;19324:40;;;;;;;;;;19154:229;;:::o;19391:230::-;19466:22;19474:4;19480:7;19466;:22::i;:::-;19462:152;;;19537:5;19505:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;19505:29:0;;;;;;;;;:37;;-1:-1:-1;;19505:37:0;;;19589:12;:10;:12::i;:::-;-1:-1:-1;;;;;19562:40:0;19580:7;-1:-1:-1;;;;;19562:40:0;19574:4;19562:40;;;;;;;;;;19391:230;;:::o;50571:837::-;-1:-1:-1;;;;;50692:21:0;;50684:69;;;;-1:-1:-1;;;50684:69:0;;;;;;;:::i;:::-;50786:7;:14;50772:3;:10;:28;50764:81;;;;-1:-1:-1;;;50764:81:0;;;;;;;:::i;:::-;50858:16;50877:12;:10;:12::i;:::-;50902:69;;;;;;;;;50950:1;50902:69;;50858:31;-1:-1:-1;50989:6:0;50984:341;51005:3;:10;51001:1;:14;50984:341;;;51037:10;51050:3;51054:1;51050:6;;;;;;;;:::i;:::-;;;;;;;51037:19;;51071:14;51088:7;51096:1;51088:10;;;;;;;;:::i;:::-;;;;;;;;;;;;51115:22;51140:13;;;;;;;;;;-1:-1:-1;;;;;51140:22:0;;;;;;;;;;;;51088:10;;-1:-1:-1;51185:24:0;;;;51177:73;;;;-1:-1:-1;;;51177:73:0;;;;;;;:::i;:::-;51290:23;51307:6;51290:14;:23;:::i;:::-;51265:9;:13;;;;;;;;;;;-1:-1:-1;;;;;51265:22:0;;;;;;;;;;:48;;;;-1:-1:-1;51017:3:0;;-1:-1:-1;51017:3:0;;;:::i;:::-;;;;50984:341;;;;51383:1;-1:-1:-1;;;;;51342:58:0;51366:7;-1:-1:-1;;;;;51342:58:0;51356:8;-1:-1:-1;;;;;51342:58:0;;51387:3;51392:7;51342:58;;;;;;;:::i;:::-;;;;;;;;50673:735;50571:837;;;:::o;25337:173::-;25412:6;;;-1:-1:-1;;;;;25429:17:0;;;-1:-1:-1;;;;;;25429:17:0;;;;;;;25462:40;;25412:6;;;25429:17;25412:6;;25462:40;;25393:16;;25462:40;25382:128;25337:173;:::o;63271:662::-;13465:4;15024:30;13465:4;15041:12;:10;:12::i;15024:30::-;63404:1:::1;63399:2;:6;63391:15;;;::::0;::::1;;63459:24;::::0;;;:16:::1;:24;::::0;;;;;;;;63425:15:::1;:23:::0;;;;;;;:30:::1;::::0;63453:1:::1;63425:27;:30::i;:::-;:58;;63417:130;;;;-1:-1:-1::0;;;63417:130:0::1;;;;;;;:::i;:::-;63566:11;::::0;;;:7:::1;:11;::::0;;;;;::::1;;:20;63558:60;;;::::0;-1:-1:-1;;;63558:60:0;;51654:2:1;63558:60:0::1;::::0;::::1;51636:21:1::0;51693:2;51673:18;;;51666:30;51732:29;51712:18;;;51705:57;51779:18;;63558:60:0::1;51452:351:1::0;63558:60:0::1;63637:22;::::0;;;:14:::1;:22;::::0;;;;;::::1;;:31;63629:66;;;::::0;-1:-1:-1;;;63629:66:0;;52010:2:1;63629:66:0::1;::::0;::::1;51992:21:1::0;52049:2;52029:18;;;52022:30;-1:-1:-1;;;52068:18:1;;;52061:52;52130:18;;63629:66:0::1;51808:346:1::0;63629:66:0::1;63706:11;::::0;;;:7:::1;:11;::::0;;;;;;;:18;;-1:-1:-1;;63706:18:0::1;63720:4;63706:18:::0;;::::1;::::0;;;63761:23;;;:15:::1;:23:::0;;;;;;;:30:::1;::::0;:27:::1;:30::i;:::-;63735:23;::::0;;;:15:::1;:23;::::0;;;;;;;:56;;;63802:16;;;:12:::1;:16:::0;;;;;:25;;;63856:23;;63838:11:::1;:15:::0;;;;;;:41;;;;63890:35:::1;::::0;63896:7;;63802:16;;63909:1:::1;::::0;63912:12:::1;::::0;48815:689;-1:-1:-1;;;;;48950:16:0;;48942:62;;;;-1:-1:-1;;;48942:62:0;;;;;;;:::i;:::-;49037:7;:14;49023:3;:10;:28;49015:81;;;;-1:-1:-1;;;49015:81:0;;;;;;;:::i;:::-;49109:16;49128:12;:10;:12::i;:::-;49109:31;;49237:6;49232:100;49253:3;:10;49249:1;:14;49232:100;;;49310:7;49318:1;49310:10;;;;;;;;:::i;:::-;;;;;;;49285:9;:17;49295:3;49299:1;49295:6;;;;;;;;:::i;:::-;;;;;;;49285:17;;;;;;;;;;;:21;49303:2;-1:-1:-1;;;;;49285:21:0;-1:-1:-1;;;;;49285:21:0;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;49265:3:0;;-1:-1:-1;49265:3:0;;;:::i;:::-;;;;49232:100;;;;49385:2;-1:-1:-1;;;;;49349:53:0;49381:1;-1:-1:-1;;;;;49349:53:0;49363:8;-1:-1:-1;;;;;49349:53:0;;49389:3;49394:7;49349:53;;;;;;;:::i;:::-;;;;;;;;49415:81;49451:8;49469:1;49473:2;49477:3;49482:7;49491:4;49415:35;:81::i;54178:198::-;54298:16;;;54312:1;54298:16;;;;;;;;;54244;;54273:22;;54298:16;;;;;;;;;;;;-1:-1:-1;54298:16:0;54273:41;;54336:7;54325:5;54331:1;54325:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;54363:5;54178:198;-1:-1:-1;;54178:198:0:o;52609:758::-;-1:-1:-1;;;;;52834:13:0;;35559:20;35598:8;52830:530;;52870:72;;-1:-1:-1;;;52870:72:0;;-1:-1:-1;;;;;52870:38:0;;;;;:72;;52909:8;;52919:4;;52925:2;;52929:6;;52937:4;;52870:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52870:72:0;;;;;;;;-1:-1:-1;;52870:72:0;;;;;;;;;;;;:::i;:::-;;;52866:483;;;;:::i;:::-;-1:-1:-1;;;;;;52992:59:0;;-1:-1:-1;;;52992:59:0;52988:158;;53076:50;;-1:-1:-1;;;53076:50:0;;;;;;;:::i;27490:366::-;27588:7;25677:100;;;;;;;;;;;;;;;;;25657:127;;;;;;;27726:12;;27757:11;;;;27797:24;;;;;27787:35;;;;;;27653:184;;;;;53358:25:1;;;53414:2;53399:18;;53392:34;;;;-1:-1:-1;;;;;53462:32:1;53457:2;53442:18;;53435:60;53526:2;53511:18;;53504:34;53345:3;53330:19;;53127:417;27653:184:0;;;;;;;;;;;;;27629:219;;;;;;27613:235;;27490:366;;;:::o;23185:234::-;23272:7;23366:20;22624:15;;;22546:101;23366:20;23337:63;;-1:-1:-1;;;23337:63:0;;;53807:27:1;53850:11;;;53843:27;;;;53886:12;;;53879:28;;;53923:12;;23337:63:0;53549:392:1;47903:556:0;-1:-1:-1;;;;;48018:21:0;;48010:67;;;;-1:-1:-1;;;48010:67:0;;;;;;;:::i;:::-;48090:16;48109:12;:10;:12::i;:::-;48090:31;;48134:107;48155:8;48173:1;48177:7;48186:21;48204:2;48186:17;:21::i;48134:107::-;48254:9;:13;;;;;;;;;;;-1:-1:-1;;;;;48254:22:0;;;;;;;;;:32;;48280:6;;48254:9;:32;;48280:6;;48254:32;:::i;:::-;;;;-1:-1:-1;;48302:57:0;;;39733:25:1;;;39789:2;39774:18;;39767:34;;;-1:-1:-1;;;;;48302:57:0;;;;48335:1;;48302:57;;;;;;39706:18:1;48302:57:0;;;;;;;48372:79;48403:8;48421:1;48425:7;48434:2;48438:6;48446:4;48372:30;:79::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:254::-;260:6;268;321:2;309:9;300:7;296:23;292:32;289:52;;;337:1;334;327:12;289:52;360:29;379:9;360:29;:::i;:::-;350:39;436:2;421:18;;;;408:32;;-1:-1:-1;;;192:254:1:o;633:131::-;-1:-1:-1;;;;;;707:32:1;;697:43;;687:71;;754:1;751;744:12;769:245;827:6;880:2;868:9;859:7;855:23;851:32;848:52;;;896:1;893;886:12;848:52;935:9;922:23;954:30;978:5;954:30;:::i;1211:258::-;1283:1;1293:113;1307:6;1304:1;1301:13;1293:113;;;1383:11;;;1377:18;1364:11;;;1357:39;1329:2;1322:10;1293:113;;;1424:6;1421:1;1418:13;1415:48;;;-1:-1:-1;;1459:1:1;1441:16;;1434:27;1211:258::o;1474:::-;1516:3;1554:5;1548:12;1581:6;1576:3;1569:19;1597:63;1653:6;1646:4;1641:3;1637:14;1630:4;1623:5;1619:16;1597:63;:::i;:::-;1714:2;1693:15;-1:-1:-1;;1689:29:1;1680:39;;;;1721:4;1676:50;;1474:258;-1:-1:-1;;1474:258:1:o;1737:220::-;1886:2;1875:9;1868:21;1849:4;1906:45;1947:2;1936:9;1932:18;1924:6;1906:45;:::i;1962:127::-;2023:10;2018:3;2014:20;2011:1;2004:31;2054:4;2051:1;2044:15;2078:4;2075:1;2068:15;2094:249;2204:2;2185:13;;-1:-1:-1;;2181:27:1;2169:40;;-1:-1:-1;;;;;2224:34:1;;2260:22;;;2221:62;2218:88;;;2286:18;;:::i;:::-;2322:2;2315:22;-1:-1:-1;;2094:249:1:o;2348:555::-;2390:5;2443:3;2436:4;2428:6;2424:17;2420:27;2410:55;;2461:1;2458;2451:12;2410:55;2497:6;2484:20;-1:-1:-1;;;;;2519:2:1;2516:26;2513:52;;;2545:18;;:::i;:::-;2594:2;2588:9;2606:67;2661:2;2642:13;;-1:-1:-1;;2638:27:1;2667:4;2634:38;2588:9;2606:67;:::i;:::-;2697:2;2689:6;2682:18;2743:3;2736:4;2731:2;2723:6;2719:15;2715:26;2712:35;2709:55;;;2760:1;2757;2750:12;2709:55;2824:2;2817:4;2809:6;2805:17;2798:4;2790:6;2786:17;2773:54;2871:1;2847:15;;;2864:4;2843:26;2836:37;;;;2851:6;2348:555;-1:-1:-1;;;2348:555:1:o;2908:689::-;3010:6;3018;3026;3034;3042;3095:3;3083:9;3074:7;3070:23;3066:33;3063:53;;;3112:1;3109;3102:12;3063:53;3135:29;3154:9;3135:29;:::i;:::-;3125:39;;3215:2;3204:9;3200:18;3187:32;-1:-1:-1;;;;;3234:6:1;3231:30;3228:50;;;3274:1;3271;3264:12;3228:50;3297:49;3338:7;3329:6;3318:9;3314:22;3297:49;:::i;:::-;3287:59;;;3393:2;3382:9;3378:18;3365:32;3355:42;;3444:2;3433:9;3429:18;3416:32;3406:42;;3498:3;3487:9;3483:19;3470:33;3543:4;3536:5;3532:16;3525:5;3522:27;3512:55;;3563:1;3560;3553:12;3512:55;3586:5;3576:15;;;2908:689;;;;;;;;:::o;3825:180::-;3884:6;3937:2;3925:9;3916:7;3912:23;3908:32;3905:52;;;3953:1;3950;3943:12;3905:52;-1:-1:-1;3976:23:1;;3825:180;-1:-1:-1;3825:180:1:o;4010:367::-;4073:8;4083:6;4137:3;4130:4;4122:6;4118:17;4114:27;4104:55;;4155:1;4152;4145:12;4104:55;-1:-1:-1;4178:20:1;;-1:-1:-1;;;;;4210:30:1;;4207:50;;;4253:1;4250;4243:12;4207:50;4290:4;4282:6;4278:17;4266:29;;4350:3;4343:4;4333:6;4330:1;4326:14;4318:6;4314:27;4310:38;4307:47;4304:67;;;4367:1;4364;4357:12;4304:67;4010:367;;;;;:::o;4382:841::-;4513:6;4521;4529;4537;4545;4598:2;4586:9;4577:7;4573:23;4569:32;4566:52;;;4614:1;4611;4604:12;4566:52;4650:9;4637:23;4627:33;;4711:2;4700:9;4696:18;4683:32;-1:-1:-1;;;;;4775:2:1;4767:6;4764:14;4761:34;;;4791:1;4788;4781:12;4761:34;4830:70;4892:7;4883:6;4872:9;4868:22;4830:70;:::i;:::-;4919:8;;-1:-1:-1;4804:96:1;-1:-1:-1;5007:2:1;4992:18;;4979:32;;-1:-1:-1;5023:16:1;;;5020:36;;;5052:1;5049;5042:12;5020:36;;5091:72;5155:7;5144:8;5133:9;5129:24;5091:72;:::i;:::-;4382:841;;;;-1:-1:-1;4382:841:1;;-1:-1:-1;5182:8:1;;5065:98;4382:841;-1:-1:-1;;;4382:841:1:o;5228:160::-;5293:20;;5349:13;;5342:21;5332:32;;5322:60;;5378:1;5375;5368:12;5393:1179;5558:6;5566;5574;5582;5590;5598;5606;5614;5667:3;5655:9;5646:7;5642:23;5638:33;5635:53;;;5684:1;5681;5674:12;5635:53;5720:9;5707:23;5697:33;;5777:2;5766:9;5762:18;5749:32;5739:42;;5800:35;5831:2;5820:9;5816:18;5800:35;:::i;:::-;5790:45;;5886:2;5875:9;5871:18;5858:32;-1:-1:-1;;;;;5950:2:1;5942:6;5939:14;5936:34;;;5966:1;5963;5956:12;5936:34;5989:49;6030:7;6021:6;6010:9;6006:22;5989:49;:::i;:::-;5979:59;;6091:3;6080:9;6076:19;6063:33;6047:49;;6121:2;6111:8;6108:16;6105:36;;;6137:1;6134;6127:12;6105:36;6176:72;6240:7;6229:8;6218:9;6214:24;6176:72;:::i;:::-;6267:8;;-1:-1:-1;6150:98:1;-1:-1:-1;6355:3:1;6340:19;;6327:33;;-1:-1:-1;6372:16:1;;;6369:36;;;6401:1;6398;6391:12;6369:36;;6440:72;6504:7;6493:8;6482:9;6478:24;6440:72;:::i;:::-;5393:1179;;;;-1:-1:-1;5393:1179:1;;-1:-1:-1;5393:1179:1;;;;;;6531:8;-1:-1:-1;;;5393:1179:1:o;6577:595::-;6676:6;6684;6692;6700;6708;6761:3;6749:9;6740:7;6736:23;6732:33;6729:53;;;6778:1;6775;6768:12;6729:53;6814:9;6801:23;6791:33;;6871:2;6860:9;6856:18;6843:32;6833:42;;6894:35;6925:2;6914:9;6910:18;6894:35;:::i;:::-;6884:45;;6948:35;6979:2;6968:9;6964:18;6948:35;:::i;:::-;6938:45;;7034:3;7023:9;7019:19;7006:33;-1:-1:-1;;;;;7054:6:1;7051:30;7048:50;;;7094:1;7091;7084:12;7048:50;7117:49;7158:7;7149:6;7138:9;7134:22;7117:49;:::i;:::-;7107:59;;;6577:595;;;;;;;;:::o;7359:248::-;7427:6;7435;7488:2;7476:9;7467:7;7463:23;7459:32;7456:52;;;7504:1;7501;7494:12;7456:52;-1:-1:-1;;7527:23:1;;;7597:2;7582:18;;;7569:32;;-1:-1:-1;7359:248:1:o;7612:481::-;7742:6;7750;7803:2;7791:9;7782:7;7778:23;7774:32;7771:52;;;7819:1;7816;7809:12;7771:52;7859:9;7846:23;-1:-1:-1;;;;;7884:6:1;7881:30;7878:50;;;7924:1;7921;7914:12;7878:50;7963:70;8025:7;8016:6;8005:9;8001:22;7963:70;:::i;:::-;8052:8;;7937:96;;-1:-1:-1;7612:481:1;-1:-1:-1;;;;7612:481:1:o;8283:186::-;8342:6;8395:2;8383:9;8374:7;8370:23;8366:32;8363:52;;;8411:1;8408;8401:12;8363:52;8434:29;8453:9;8434:29;:::i;8474:183::-;8534:4;-1:-1:-1;;;;;8559:6:1;8556:30;8553:56;;;8589:18;;:::i;:::-;-1:-1:-1;8634:1:1;8630:14;8646:4;8626:25;;8474:183::o;8662:724::-;8716:5;8769:3;8762:4;8754:6;8750:17;8746:27;8736:55;;8787:1;8784;8777:12;8736:55;8823:6;8810:20;8849:4;8872:43;8912:2;8872:43;:::i;:::-;8944:2;8938:9;8956:31;8984:2;8976:6;8956:31;:::i;:::-;9022:18;;;9114:1;9110:10;;;;9098:23;;9094:32;;;9056:15;;;;-1:-1:-1;9138:15:1;;;9135:35;;;9166:1;9163;9156:12;9135:35;9202:2;9194:6;9190:15;9214:142;9230:6;9225:3;9222:15;9214:142;;;9296:17;;9284:30;;9334:12;;;;9247;;9214:142;;;-1:-1:-1;9374:6:1;8662:724;-1:-1:-1;;;;;;8662:724:1:o;9391:943::-;9545:6;9553;9561;9569;9577;9630:3;9618:9;9609:7;9605:23;9601:33;9598:53;;;9647:1;9644;9637:12;9598:53;9670:29;9689:9;9670:29;:::i;:::-;9660:39;;9718:38;9752:2;9741:9;9737:18;9718:38;:::i;:::-;9708:48;;9807:2;9796:9;9792:18;9779:32;-1:-1:-1;;;;;9871:2:1;9863:6;9860:14;9857:34;;;9887:1;9884;9877:12;9857:34;9910:61;9963:7;9954:6;9943:9;9939:22;9910:61;:::i;:::-;9900:71;;10024:2;10013:9;10009:18;9996:32;9980:48;;10053:2;10043:8;10040:16;10037:36;;;10069:1;10066;10059:12;10037:36;10092:63;10147:7;10136:8;10125:9;10121:24;10092:63;:::i;:::-;10082:73;;10208:3;10197:9;10193:19;10180:33;10164:49;;10238:2;10228:8;10225:16;10222:36;;;10254:1;10251;10244:12;10222:36;;10277:51;10320:7;10309:8;10298:9;10294:24;10277:51;:::i;10339:254::-;10407:6;10415;10468:2;10456:9;10447:7;10443:23;10439:32;10436:52;;;10484:1;10481;10474:12;10436:52;10520:9;10507:23;10497:33;;10549:38;10583:2;10572:9;10568:18;10549:38;:::i;:::-;10539:48;;10339:254;;;;;:::o;10598:1208::-;10716:6;10724;10777:2;10765:9;10756:7;10752:23;10748:32;10745:52;;;10793:1;10790;10783:12;10745:52;10833:9;10820:23;-1:-1:-1;;;;;10903:2:1;10895:6;10892:14;10889:34;;;10919:1;10916;10909:12;10889:34;10957:6;10946:9;10942:22;10932:32;;11002:7;10995:4;10991:2;10987:13;10983:27;10973:55;;11024:1;11021;11014:12;10973:55;11060:2;11047:16;11082:4;11105:43;11145:2;11105:43;:::i;:::-;11177:2;11171:9;11189:31;11217:2;11209:6;11189:31;:::i;:::-;11255:18;;;11343:1;11339:10;;;;11331:19;;11327:28;;;11289:15;;;;-1:-1:-1;11367:19:1;;;11364:39;;;11399:1;11396;11389:12;11364:39;11423:11;;;;11443:148;11459:6;11454:3;11451:15;11443:148;;;11525:23;11544:3;11525:23;:::i;:::-;11513:36;;11476:12;;;;11569;;;;11443:148;;;11610:6;-1:-1:-1;;11654:18:1;;11641:32;;-1:-1:-1;;11685:16:1;;;11682:36;;;11714:1;11711;11704:12;11682:36;;11737:63;11792:7;11781:8;11770:9;11766:24;11737:63;:::i;:::-;11727:73;;;10598:1208;;;;;:::o;11811:435::-;11864:3;11902:5;11896:12;11929:6;11924:3;11917:19;11955:4;11984:2;11979:3;11975:12;11968:19;;12021:2;12014:5;12010:14;12042:1;12052:169;12066:6;12063:1;12060:13;12052:169;;;12127:13;;12115:26;;12161:12;;;;12196:15;;;;12088:1;12081:9;12052:169;;;-1:-1:-1;12237:3:1;;11811:435;-1:-1:-1;;;;;11811:435:1:o;12251:261::-;12430:2;12419:9;12412:21;12393:4;12450:56;12502:2;12491:9;12487:18;12479:6;12450:56;:::i;12517:773::-;12639:6;12647;12655;12663;12716:2;12704:9;12695:7;12691:23;12687:32;12684:52;;;12732:1;12729;12722:12;12684:52;12772:9;12759:23;-1:-1:-1;;;;;12842:2:1;12834:6;12831:14;12828:34;;;12858:1;12855;12848:12;12828:34;12897:70;12959:7;12950:6;12939:9;12935:22;12897:70;:::i;:::-;12986:8;;-1:-1:-1;12871:96:1;-1:-1:-1;13074:2:1;13059:18;;13046:32;;-1:-1:-1;13090:16:1;;;13087:36;;;13119:1;13116;13109:12;13087:36;;13158:72;13222:7;13211:8;13200:9;13196:24;13158:72;:::i;:::-;12517:773;;;;-1:-1:-1;13249:8:1;-1:-1:-1;;;;12517:773:1:o;13295:254::-;13360:6;13368;13421:2;13409:9;13400:7;13396:23;13392:32;13389:52;;;13437:1;13434;13427:12;13389:52;13460:29;13479:9;13460:29;:::i;:::-;13450:39;;13508:35;13539:2;13528:9;13524:18;13508:35;:::i;13762:321::-;13831:6;13884:2;13872:9;13863:7;13859:23;13855:32;13852:52;;;13900:1;13897;13890:12;13852:52;13940:9;13927:23;-1:-1:-1;;;;;13965:6:1;13962:30;13959:50;;;14005:1;14002;13995:12;13959:50;14028:49;14069:7;14060:6;14049:9;14045:22;14028:49;:::i;:::-;14018:59;13762:321;-1:-1:-1;;;;13762:321:1:o;14088:669::-;14215:6;14223;14231;14284:2;14272:9;14263:7;14259:23;14255:32;14252:52;;;14300:1;14297;14290:12;14252:52;14340:9;14327:23;-1:-1:-1;;;;;14410:2:1;14402:6;14399:14;14396:34;;;14426:1;14423;14416:12;14396:34;14449:61;14502:7;14493:6;14482:9;14478:22;14449:61;:::i;:::-;14439:71;;14529:38;14563:2;14552:9;14548:18;14529:38;:::i;:::-;14519:48;;14620:2;14609:9;14605:18;14592:32;14576:48;;14649:2;14639:8;14636:16;14633:36;;;14665:1;14662;14655:12;14633:36;;14688:63;14743:7;14732:8;14721:9;14717:24;14688:63;:::i;:::-;14678:73;;;14088:669;;;;;:::o;14762:322::-;14839:6;14847;14855;14908:2;14896:9;14887:7;14883:23;14879:32;14876:52;;;14924:1;14921;14914:12;14876:52;14960:9;14947:23;14937:33;;14989:38;15023:2;15012:9;15008:18;14989:38;:::i;:::-;14979:48;;15074:2;15063:9;15059:18;15046:32;15036:42;;14762:322;;;;;:::o;15089:389::-;15167:6;15175;15228:2;15216:9;15207:7;15203:23;15199:32;15196:52;;;15244:1;15241;15234:12;15196:52;15280:9;15267:23;15257:33;;15341:2;15330:9;15326:18;15313:32;-1:-1:-1;;;;;15360:6:1;15357:30;15354:50;;;15400:1;15397;15390:12;15354:50;15423:49;15464:7;15455:6;15444:9;15440:22;15423:49;:::i;15483:322::-;15560:6;15568;15576;15629:2;15617:9;15608:7;15604:23;15600:32;15597:52;;;15645:1;15642;15635:12;15597:52;15681:9;15668:23;15658:33;;15738:2;15727:9;15723:18;15710:32;15700:42;;15761:38;15795:2;15784:9;15780:18;15761:38;:::i;:::-;15751:48;;15483:322;;;;;:::o;16656:665::-;16735:6;16743;16751;16804:2;16792:9;16783:7;16779:23;16775:32;16772:52;;;16820:1;16817;16810:12;16772:52;16843:29;16862:9;16843:29;:::i;:::-;16833:39;;16923:2;16912:9;16908:18;16895:32;-1:-1:-1;;;;;16987:2:1;16979:6;16976:14;16973:34;;;17003:1;17000;16993:12;16973:34;17041:6;17030:9;17026:22;17016:32;;17086:7;17079:4;17075:2;17071:13;17067:27;17057:55;;17108:1;17105;17098:12;17057:55;17148:2;17135:16;17174:2;17166:6;17163:14;17160:34;;;17190:1;17187;17180:12;17160:34;17235:7;17230:2;17221:6;17217:2;17213:15;17209:24;17206:37;17203:57;;;17256:1;17253;17246:12;17203:57;17287:2;17283;17279:11;17269:21;;17309:6;17299:16;;;;;16656:665;;;;;:::o;17326:260::-;17394:6;17402;17455:2;17443:9;17434:7;17430:23;17426:32;17423:52;;;17471:1;17468;17461:12;17423:52;17494:29;17513:9;17494:29;:::i;:::-;17484:39;;17542:38;17576:2;17565:9;17561:18;17542:38;:::i;18064:606::-;18168:6;18176;18184;18192;18200;18253:3;18241:9;18232:7;18228:23;18224:33;18221:53;;;18270:1;18267;18260:12;18221:53;18293:29;18312:9;18293:29;:::i;:::-;18283:39;;18341:38;18375:2;18364:9;18360:18;18341:38;:::i;:::-;18331:48;;18426:2;18415:9;18411:18;18398:32;18388:42;;18477:2;18466:9;18462:18;18449:32;18439:42;;18532:3;18521:9;18517:19;18504:33;-1:-1:-1;;;;;18552:6:1;18549:30;18546:50;;;18592:1;18589;18582:12;18675:1726;18911:6;18919;18927;18935;18943;18951;18959;18967;18975;18983;19036:3;19024:9;19015:7;19011:23;19007:33;19004:53;;;19053:1;19050;19043:12;19004:53;19093:9;19080:23;-1:-1:-1;;;;;19163:2:1;19155:6;19152:14;19149:34;;;19179:1;19176;19169:12;19149:34;19218:70;19280:7;19271:6;19260:9;19256:22;19218:70;:::i;:::-;19307:8;;-1:-1:-1;19192:96:1;-1:-1:-1;19395:2:1;19380:18;;19367:32;;-1:-1:-1;19411:16:1;;;19408:36;;;19440:1;19437;19430:12;19408:36;19479:72;19543:7;19532:8;19521:9;19517:24;19479:72;:::i;:::-;19570:8;;-1:-1:-1;19453:98:1;-1:-1:-1;19658:2:1;19643:18;;19630:32;;-1:-1:-1;19674:16:1;;;19671:36;;;19703:1;19700;19693:12;19671:36;19742:72;19806:7;19795:8;19784:9;19780:24;19742:72;:::i;:::-;19833:8;;-1:-1:-1;19716:98:1;-1:-1:-1;19921:2:1;19906:18;;19893:32;;-1:-1:-1;19937:16:1;;;19934:36;;;19966:1;19963;19956:12;19934:36;20005:72;20069:7;20058:8;20047:9;20043:24;20005:72;:::i;:::-;20096:8;;-1:-1:-1;19979:98:1;-1:-1:-1;20184:3:1;20169:19;;20156:33;;-1:-1:-1;20201:16:1;;;20198:36;;;20230:1;20227;20220:12;20198:36;;20269:72;20333:7;20322:8;20311:9;20307:24;20269:72;:::i;:::-;20243:98;;20360:8;20350:18;;;20387:8;20377:18;;;18675:1726;;;;;;;;;;;;;:::o;20406:180::-;20462:6;20515:2;20503:9;20494:7;20490:23;20486:32;20483:52;;;20531:1;20528;20521:12;20483:52;20554:26;20570:9;20554:26;:::i;22187:380::-;22266:1;22262:12;;;;22309;;;22330:61;;22384:4;22376:6;22372:17;22362:27;;22330:61;22437:2;22429:6;22426:14;22406:18;22403:38;22400:161;;;22483:10;22478:3;22474:20;22471:1;22464:31;22518:4;22515:1;22508:15;22546:4;22543:1;22536:15;22400:161;;22187:380;;;:::o;22974:432::-;-1:-1:-1;;;;;23231:15:1;;;23213:34;;23283:15;;23278:2;23263:18;;23256:43;23335:2;23330;23315:18;;23308:30;;;23156:4;;23355:45;;23381:18;;23373:6;23355:45;:::i;:::-;23347:53;22974:432;-1:-1:-1;;;;;22974:432:1:o;23411:415::-;23568:3;23606:6;23600:13;23622:53;23668:6;23663:3;23656:4;23648:6;23644:17;23622:53;:::i;:::-;23744:2;23740:15;;;;-1:-1:-1;;23736:53:1;23697:16;;;;23722:68;;;23817:2;23806:14;;23411:415;-1:-1:-1;;23411:415:1:o;23831:274::-;23960:3;23998:6;23992:13;24014:53;24060:6;24055:3;24048:4;24040:6;24036:17;24014:53;:::i;:::-;24083:16;;;;;23831:274;-1:-1:-1;;23831:274:1:o;24883:127::-;24944:10;24939:3;24935:20;24932:1;24925:31;24975:4;24972:1;24965:15;24999:4;24996:1;24989:15;25015:127;25076:10;25071:3;25067:20;25064:1;25057:31;25107:4;25104:1;25097:15;25131:4;25128:1;25121:15;25147:135;25186:3;-1:-1:-1;;25207:17:1;;25204:43;;;25227:18;;:::i;:::-;-1:-1:-1;25274:1:1;25263:13;;25147:135::o;25287:447::-;25387:6;25382:3;25375:19;25357:3;25413:4;25442:2;25437:3;25433:12;25426:19;;25468:5;25491:1;25501:208;25515:6;25512:1;25509:13;25501:208;;;-1:-1:-1;;;;;25580:26:1;25599:6;25580:26;:::i;:::-;25576:52;25564:65;;25649:12;;;;25684:15;;;;25537:1;25530:9;25501:208;;25739:354;25827:19;;;25809:3;-1:-1:-1;;;;;25858:31:1;;25855:51;;;25902:1;25899;25892:12;25855:51;25938:6;25935:1;25931:14;25990:8;25983:5;25976:4;25971:3;25967:14;25954:45;26067:1;26022:18;;26042:4;26018:29;26056:13;;;-1:-1:-1;26018:29:1;;25739:354;-1:-1:-1;;25739:354:1:o;26098:590::-;26403:6;26392:9;26385:25;26446:2;26441;26430:9;26426:18;26419:30;26366:4;26472:73;26541:2;26530:9;26526:18;26518:6;26510;26472:73;:::i;:::-;26593:9;26585:6;26581:22;26576:2;26565:9;26561:18;26554:50;26621:61;26675:6;26667;26659;26621:61;:::i;26693:527::-;26942:6;26931:9;26924:25;26985:6;26980:2;26969:9;26965:18;26958:34;27042:6;27035:14;27028:22;27023:2;27012:9;27008:18;27001:50;27101:6;27094:14;27087:22;27082:2;27071:9;27067:18;27060:50;27147:3;27141;27130:9;27126:19;27119:32;26905:4;27168:46;27209:3;27198:9;27194:19;27186:6;27168:46;:::i;:::-;27160:54;26693:527;-1:-1:-1;;;;;;;26693:527:1:o;27225:342::-;27335:4;27393:11;27380:25;27487:3;27483:8;27472;27456:14;27452:29;27448:44;27428:18;27424:69;27414:97;;27507:1;27504;27497:12;27572:522;27650:4;27656:6;27716:11;27703:25;27810:2;27806:7;27795:8;27779:14;27775:29;27771:43;27751:18;27747:68;27737:96;;27829:1;27826;27819:12;27737:96;27856:33;;27908:20;;;-1:-1:-1;;;;;;27940:30:1;;27937:50;;;27983:1;27980;27973:12;27937:50;28016:4;28004:17;;-1:-1:-1;28047:14:1;28043:27;;;28033:38;;28030:58;;;28084:1;28081;28074:12;28099:545;28192:4;28198:6;28258:11;28245:25;28352:2;28348:7;28337:8;28321:14;28317:29;28313:43;28293:18;28289:68;28279:96;;28371:1;28368;28361:12;28279:96;28398:33;;28450:20;;;-1:-1:-1;;;;;;28482:30:1;;28479:50;;;28525:1;28522;28515:12;28479:50;28558:4;28546:17;;-1:-1:-1;28609:1:1;28605:14;;;28589;28585:35;28575:46;;28572:66;;;28634:1;28631;28624:12;29199:448;29249:3;29287:5;29281:12;29314:6;29309:3;29302:19;29340:4;29369:2;29364:3;29360:12;29353:19;;29406:2;29399:5;29395:14;29427:1;29437:185;29451:6;29448:1;29445:13;29437:185;;;29526:13;;29519:21;29512:29;29500:42;;29562:12;;;;29597:15;;;;29473:1;29466:9;29437:185;;29652:1566;30151:3;30140:9;30133:22;30114:4;30178:57;30230:3;30219:9;30215:19;30207:6;30178:57;:::i;:::-;30254:2;30304:9;30296:6;30292:22;30287:2;30276:9;30272:18;30265:50;30338:44;30375:6;30367;30338:44;:::i;:::-;30324:58;;30430:9;30422:6;30418:22;30413:2;30402:9;30398:18;30391:50;30464:41;30498:6;30490;30464:41;:::i;:::-;30450:55;;30553:9;30545:6;30541:22;30536:2;30525:9;30521:18;30514:50;30587:41;30621:6;30613;30587:41;:::i;:::-;30573:55;;30677:9;30669:6;30665:22;30659:3;30648:9;30644:19;30637:51;30708:6;30743;30737:13;30774:6;30766;30759:22;30809:2;30801:6;30797:15;30790:22;;30868:2;30858:6;30855:1;30851:14;30843:6;30839:27;30835:36;30906:2;30898:6;30894:15;30927:1;30937:252;30951:6;30948:1;30945:13;30937:252;;;31041:2;31037:7;31028:6;31020;31016:19;31012:33;31007:3;31000:46;31069:40;31102:6;31093;31087:13;31069:40;:::i;:::-;31167:12;;;;31059:50;-1:-1:-1;31132:15:1;;;;30973:1;30966:9;30937:252;;;-1:-1:-1;31206:6:1;;29652:1566;-1:-1:-1;;;;;;;;;;;;29652:1566:1:o;31223:404::-;31425:2;31407:21;;;31464:2;31444:18;;;31437:30;31503:34;31498:2;31483:18;;31476:62;-1:-1:-1;;;31569:2:1;31554:18;;31547:38;31617:3;31602:19;;31223:404::o;31632:401::-;31834:2;31816:21;;;31873:2;31853:18;;;31846:30;31912:34;31907:2;31892:18;;31885:62;-1:-1:-1;;;31978:2:1;31963:18;;31956:35;32023:3;32008:19;;31632:401::o;32457:406::-;32659:2;32641:21;;;32698:2;32678:18;;;32671:30;32737:34;32732:2;32717:18;;32710:62;-1:-1:-1;;;32803:2:1;32788:18;;32781:40;32853:3;32838:19;;32457:406::o;32868:125::-;32908:4;32936:1;32933;32930:8;32927:34;;;32941:18;;:::i;:::-;-1:-1:-1;32978:9:1;;32868:125::o;32998:128::-;33038:3;33069:1;33065:6;33062:1;33059:13;33056:39;;;33075:18;;:::i;:::-;-1:-1:-1;33111:9:1;;32998:128::o;33131:465::-;33388:2;33377:9;33370:21;33351:4;33414:56;33466:2;33455:9;33451:18;33443:6;33414:56;:::i;:::-;33518:9;33510:6;33506:22;33501:2;33490:9;33486:18;33479:50;33546:44;33583:6;33575;33546:44;:::i;34427:398::-;34629:2;34611:21;;;34668:2;34648:18;;;34641:30;34707:34;34702:2;34687:18;;34680:62;-1:-1:-1;;;34773:2:1;34758:18;;34751:32;34815:3;34800:19;;34427:398::o;37011:590::-;37316:6;37305:9;37298:25;37359:2;37354;37343:9;37339:18;37332:30;37279:4;37385:73;37454:2;37443:9;37439:18;37431:6;37423;37385:73;:::i;:::-;37506:9;37498:6;37494:22;37489:2;37478:9;37474:18;37467:50;37534:61;37588:6;37580;37572;37534:61;:::i;37606:793::-;37742:6;37750;37758;37811:2;37799:9;37790:7;37786:23;37782:32;37779:52;;;37827:1;37824;37817:12;37779:52;37867:9;37854:23;-1:-1:-1;;;;;37937:2:1;37929:6;37926:14;37923:34;;;37953:1;37950;37943:12;37923:34;37976:61;38029:7;38020:6;38009:9;38005:22;37976:61;:::i;:::-;37966:71;;38090:2;38079:9;38075:18;38062:32;38046:48;;38119:2;38109:8;38106:16;38103:36;;;38135:1;38132;38125:12;38103:36;38158:63;38213:7;38202:8;38191:9;38187:24;38158:63;:::i;:::-;38148:73;;38274:2;38263:9;38259:18;38246:32;38230:48;;38303:2;38293:8;38290:16;38287:36;;;38319:1;38316;38309:12;38287:36;;38342:51;38385:7;38374:8;38363:9;38359:24;38342:51;:::i;38815:329::-;38912:4;38970:11;38957:25;39064:3;39060:8;39049;39033:14;39029:29;39025:44;39005:18;39001:69;38991:97;;39084:1;39081;39074:12;40625:431;40722:6;40717:3;40710:19;40692:3;40748:4;40777:2;40772:3;40768:12;40761:19;;40803:5;40826:1;40836:195;40850:6;40847:1;40844:13;40836:195;;;40925:23;40941:6;40925:23;:::i;:::-;40918:31;40911:39;40899:52;;40971:12;;;;41006:15;;;;40872:1;40865:9;40836:195;;41061:267;41150:6;41145:3;41138:19;41202:6;41195:5;41188:4;41183:3;41179:14;41166:43;-1:-1:-1;41254:1:1;41229:16;;;41247:4;41225:27;;;41218:38;;;;41310:2;41289:15;;;-1:-1:-1;;41285:29:1;41276:39;;;41272:50;;41061:267::o;41333:2064::-;41884:3;41873:9;41866:22;41847:4;41911:74;41980:3;41969:9;41965:19;41957:6;41949;41911:74;:::i;:::-;42004:2;42054:9;42046:6;42042:22;42037:2;42026:9;42022:18;42015:50;42088:61;42142:6;42134;42126;42088:61;:::i;:::-;42074:75;;42197:9;42189:6;42185:22;42180:2;42169:9;42165:18;42158:50;42231:58;42282:6;42274;42266;42231:58;:::i;:::-;42217:72;;42337:9;42329:6;42325:22;42320:2;42309:9;42305:18;42298:50;42371:58;42422:6;42414;42406;42371:58;:::i;:::-;42466:22;;;42460:3;42445:19;;42438:51;42524:22;;;42357:72;-1:-1:-1;42562:15:1;;;42620:1;42616:14;;;42604:27;;42600:36;;42659:6;42683:1;42693:675;42707:6;42704:1;42701:13;42693:675;;;42772:19;;;-1:-1:-1;;42768:33:1;42756:46;;42841:20;;42916:14;42912:27;;;-1:-1:-1;;42908:41:1;42884:66;;42874:94;;42964:1;42961;42954:12;42874:94;42994:31;;43052:19;;-1:-1:-1;;;;;43087:30:1;;43084:50;;;43130:1;43127;43120:12;43084:50;43182:6;43166:14;43162:27;43154:6;43150:40;43147:60;;;43203:1;43200;43193:12;43147:60;43230:58;43281:6;43273;43268:2;43261:5;43257:14;43230:58;:::i;:::-;43346:12;;;;43220:68;-1:-1:-1;;;43311:15:1;;;;42729:1;42722:9;42693:675;;;42697:3;;43385:6;43377:14;;;;;;41333:2064;;;;;;;;;;;;;:::o;43752:168::-;43792:7;43858:1;43854;43850:6;43846:14;43843:1;43840:21;43835:1;43828:9;43821:17;43817:45;43814:71;;;43865:18;;:::i;:::-;-1:-1:-1;43905:9:1;;43752:168::o;43925:136::-;43964:3;43992:5;43982:39;;44001:18;;:::i;:::-;-1:-1:-1;;;44037:18:1;;43925:136::o;45236:786::-;45647:25;45642:3;45635:38;45617:3;45702:6;45696:13;45718:62;45773:6;45768:2;45763:3;45759:12;45752:4;45744:6;45740:17;45718:62;:::i;:::-;-1:-1:-1;;;45839:2:1;45799:16;;;45831:11;;;45824:40;45889:13;;45911:63;45889:13;45960:2;45952:11;;45945:4;45933:17;;45911:63;:::i;:::-;45994:17;46013:2;45990:26;;45236:786;-1:-1:-1;;;;45236:786:1:o;46376:423::-;46578:2;46560:21;;;46617:2;46597:18;;;46590:30;46656:34;46651:2;46636:18;;46629:62;46727:29;46722:2;46707:18;;46700:57;46789:3;46774:19;;46376:423::o;47867:399::-;48069:2;48051:21;;;48108:2;48088:18;;;48081:30;48147:34;48142:2;48127:18;;48120:62;-1:-1:-1;;;48213:2:1;48198:18;;48191:33;48256:3;48241:19;;47867:399::o;48271:400::-;48473:2;48455:21;;;48512:2;48492:18;;;48485:30;48551:34;48546:2;48531:18;;48524:62;-1:-1:-1;;;48617:2:1;48602:18;;48595:34;48661:3;48646:19;;48271:400::o;48676:827::-;-1:-1:-1;;;;;49073:15:1;;;49055:34;;49125:15;;49120:2;49105:18;;49098:43;49035:3;49172:2;49157:18;;49150:31;;;48998:4;;49204:57;;49241:19;;49233:6;49204:57;:::i;:::-;49309:9;49301:6;49297:22;49292:2;49281:9;49277:18;49270:50;49343:44;49380:6;49372;49343:44;:::i;:::-;49329:58;;49436:9;49428:6;49424:22;49418:3;49407:9;49403:19;49396:51;49464:33;49490:6;49482;49464:33;:::i;49508:249::-;49577:6;49630:2;49618:9;49609:7;49605:23;49601:32;49598:52;;;49646:1;49643;49636:12;49598:52;49678:9;49672:16;49697:30;49721:5;49697:30;:::i;49762:179::-;49797:3;49839:1;49821:16;49818:23;49815:120;;;49885:1;49882;49879;49864:23;-1:-1:-1;49922:1:1;49916:8;49911:3;49907:18;49762:179;:::o;49946:671::-;49985:3;50027:4;50009:16;50006:26;50003:39;;;49946:671;:::o;50003:39::-;50069:2;50063:9;-1:-1:-1;;50134:16:1;50130:25;;50127:1;50063:9;50106:50;50185:4;50179:11;50209:16;-1:-1:-1;;;;;50315:2:1;50308:4;50300:6;50296:17;50293:25;50288:2;50280:6;50277:14;50274:45;50271:58;;;50322:5;;;;;49946:671;:::o;50271:58::-;50359:6;50353:4;50349:17;50338:28;;50395:3;50389:10;50422:2;50414:6;50411:14;50408:27;;;50428:5;;;;;;49946:671;:::o;50408:27::-;50512:2;50493:16;50487:4;50483:27;50479:36;50472:4;50463:6;50458:3;50454:16;50450:27;50447:69;50444:82;;;50519:5;;;;;;49946:671;:::o;50444:82::-;50535:57;50586:4;50577:6;50569;50565:19;50561:30;50555:4;50535:57;:::i;:::-;-1:-1:-1;50608:3:1;;49946:671;-1:-1:-1;;;;;49946:671:1:o;51043:404::-;51245:2;51227:21;;;51284:2;51264:18;;;51257:30;51323:34;51318:2;51303:18;;51296:62;-1:-1:-1;;;51389:2:1;51374:18;;51367:38;51437:3;51422:19;;51043:404::o;52159:397::-;52361:2;52343:21;;;52400:2;52380:18;;;52373:30;52439:34;52434:2;52419:18;;52412:62;-1:-1:-1;;;52505:2:1;52490:18;;52483:31;52546:3;52531:19;;52159:397::o;52561:561::-;-1:-1:-1;;;;;52858:15:1;;;52840:34;;52910:15;;52905:2;52890:18;;52883:43;52957:2;52942:18;;52935:34;;;53000:2;52985:18;;52978:34;;;52820:3;53043;53028:19;;53021:32;;;52783:4;;53070:46;;53096:19;;53088:6;53070:46;:::i
Swarm Source
ipfs://1c2210155ebf273a7ace937f46138c351764af94d707be3c4d2d51fd46d8b35b
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.15
Net Worth in ETH
0.000072
Token Allocations
ATRI
100.00%
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ETH | 100.00% | $0.000186 | 800 | $0.1489 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.