Source Code
Overview
ETH Balance
0 ETH
More Info
ContractCreator
Multichain Info
N/A
Loading...
Loading
Loading...
Loading
Contract Name:
DynexasToken
Compiler Version
v0.8.30+commit.73712a01
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2025-08-03
*/
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/token/ERC20/IERC20.sol
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 amount) external returns (bool);
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/token/ERC20/extensions/IERC20Metadata.sol
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface for the optional metadata functions from the ERC20 standard.
*
* _Available since v4.1._
*/
interface IERC20Metadata is IERC20 {
/**
* @dev Returns the name of the token.
*/
function name() external view returns (string memory);
/**
* @dev Returns the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the decimals places of the token.
*/
function decimals() external view returns (uint8);
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/utils/Context.sol
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/token/ERC20/ERC20.sol
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
* For a generic mechanism see {ERC20PresetMinterPauser}.
*
* TIP: For a detailed writeup see our guide
* https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* The default value of {decimals} is 18. To change this, you should override
* this function so it returns a different value.
*
* We have followed general OpenZeppelin Contracts guidelines: functions revert
* instead returning `false` on failure. This behavior is nonetheless
* conventional and does not conflict with the expectations of ERC20
* applications.
*
* Additionally, an {Approval} event is emitted on calls to {transferFrom}.
* This allows applications to reconstruct the allowance for all accounts just
* by listening to said events. Other implementations of the EIP may not emit
* these events, as it isn't required by the specification.
*
* Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
* functions have been added to mitigate the well-known issues around setting
* allowances. See {IERC20-approve}.
*/
contract ERC20 is Context, IERC20, IERC20Metadata {
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
/**
* @dev Sets the values for {name} and {symbol}.
*
* All two of these values are immutable: they can only be set once during
* construction.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev Returns the name of the token.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5.05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the default value returned by this function, unless
* it's overridden.
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view virtual override returns (uint8) {
return 18;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view virtual override returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view virtual override returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - the caller must have a balance of at least `amount`.
*/
function transfer(address to, uint256 amount) public virtual override returns (bool) {
address owner = _msgSender();
_transfer(owner, to, amount);
return true;
}
/**
* @dev See {IERC20-allowance}.
*/
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
* `transferFrom`. This is semantically equivalent to an infinite approval.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 amount) public virtual override returns (bool) {
address owner = _msgSender();
_approve(owner, spender, amount);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Emits an {Approval} event indicating the updated allowance. This is not
* required by the EIP. See the note at the beginning of {ERC20}.
*
* NOTE: Does not update the allowance if the current allowance
* is the maximum `uint256`.
*
* Requirements:
*
* - `from` and `to` cannot be the zero address.
* - `from` must have a balance of at least `amount`.
* - the caller must have allowance for ``from``'s tokens of at least
* `amount`.
*/
function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {
address spender = _msgSender();
_spendAllowance(from, spender, amount);
_transfer(from, to, amount);
return true;
}
/**
* @dev Atomically increases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
address owner = _msgSender();
_approve(owner, spender, allowance(owner, spender) + addedValue);
return true;
}
/**
* @dev Atomically decreases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `spender` must have allowance for the caller of at least
* `subtractedValue`.
*/
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
address owner = _msgSender();
uint256 currentAllowance = allowance(owner, spender);
require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
unchecked {
_approve(owner, spender, currentAllowance - subtractedValue);
}
return true;
}
/**
* @dev Moves `amount` of tokens from `from` to `to`.
*
* This internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `from` must have a balance of at least `amount`.
*/
function _transfer(address from, address to, uint256 amount) internal virtual {
require(from != address(0), "ERC20: transfer from the zero address");
require(to != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(from, to, amount);
uint256 fromBalance = _balances[from];
require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
unchecked {
_balances[from] = fromBalance - amount;
// Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
// decrementing then incrementing.
_balances[to] += amount;
}
emit Transfer(from, to, amount);
_afterTokenTransfer(from, to, amount);
}
/** @dev Creates `amount` tokens and assigns them to `account`, increasing
* the total supply.
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
*/
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply += amount;
unchecked {
// Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
_balances[account] += amount;
}
emit Transfer(address(0), account, amount);
_afterTokenTransfer(address(0), account, amount);
}
/**
* @dev Destroys `amount` tokens from `account`, reducing the
* total supply.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
* - `account` must have at least `amount` tokens.
*/
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
_beforeTokenTransfer(account, address(0), amount);
uint256 accountBalance = _balances[account];
require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
unchecked {
_balances[account] = accountBalance - amount;
// Overflow not possible: amount <= accountBalance <= totalSupply.
_totalSupply -= amount;
}
emit Transfer(account, address(0), amount);
_afterTokenTransfer(account, address(0), amount);
}
/**
* @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*/
function _approve(address owner, address spender, uint256 amount) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
/**
* @dev Updates `owner` s allowance for `spender` based on spent `amount`.
*
* Does not update the allowance amount in case of infinite allowance.
* Revert if not enough allowance is available.
*
* Might emit an {Approval} event.
*/
function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance != type(uint256).max) {
require(currentAllowance >= amount, "ERC20: insufficient allowance");
unchecked {
_approve(owner, spender, currentAllowance - amount);
}
}
}
/**
* @dev Hook that is called before any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* will be transferred to `to`.
* - when `from` is zero, `amount` tokens will be minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}
/**
* @dev Hook that is called after any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* has been transferred to `to`.
* - when `from` is zero, `amount` tokens have been minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens have been burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/access/IAccessControl.sol
// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)
pragma solidity ^0.8.0;
/**
* @dev External interface of AccessControl declared to support ERC165 detection.
*/
interface IAccessControl {
/**
* @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 {AccessControl-_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 Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) external view returns (bool);
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {AccessControl-_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) external view returns (bytes32);
/**
* @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) external;
/**
* @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) external;
/**
* @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) external;
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/utils/math/Math.sol
// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)
pragma solidity ^0.8.0;
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library Math {
enum Rounding {
Down, // Toward negative infinity
Up, // Toward infinity
Zero // Toward zero
}
/**
* @dev Returns the largest of two numbers.
*/
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two numbers.
*/
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two numbers. The result is rounded towards
* zero.
*/
function average(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b) / 2 can overflow.
return (a & b) + (a ^ b) / 2;
}
/**
* @dev Returns the ceiling of the division of two numbers.
*
* This differs from standard division with `/` in that it rounds up instead
* of rounding down.
*/
function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b - 1) / b can overflow on addition, so we distribute.
return a == 0 ? 0 : (a - 1) / b + 1;
}
/**
* @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
* @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
* with further edits by Uniswap Labs also under MIT license.
*/
function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {
unchecked {
// 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
// use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
// variables such that product = prod1 * 2^256 + prod0.
uint256 prod0; // Least significant 256 bits of the product
uint256 prod1; // Most significant 256 bits of the product
assembly {
let mm := mulmod(x, y, not(0))
prod0 := mul(x, y)
prod1 := sub(sub(mm, prod0), lt(mm, prod0))
}
// Handle non-overflow cases, 256 by 256 division.
if (prod1 == 0) {
// Solidity will revert if denominator == 0, unlike the div opcode on its own.
// The surrounding unchecked block does not change this fact.
// See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
return prod0 / denominator;
}
// Make sure the result is less than 2^256. Also prevents denominator == 0.
require(denominator > prod1, "Math: mulDiv overflow");
///////////////////////////////////////////////
// 512 by 256 division.
///////////////////////////////////////////////
// Make division exact by subtracting the remainder from [prod1 prod0].
uint256 remainder;
assembly {
// Compute remainder using mulmod.
remainder := mulmod(x, y, denominator)
// Subtract 256 bit number from 512 bit number.
prod1 := sub(prod1, gt(remainder, prod0))
prod0 := sub(prod0, remainder)
}
// Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
// See https://cs.stackexchange.com/q/138556/92363.
// Does not overflow because the denominator cannot be zero at this stage in the function.
uint256 twos = denominator & (~denominator + 1);
assembly {
// Divide denominator by twos.
denominator := div(denominator, twos)
// Divide [prod1 prod0] by twos.
prod0 := div(prod0, twos)
// Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
twos := add(div(sub(0, twos), twos), 1)
}
// Shift in bits from prod1 into prod0.
prod0 |= prod1 * twos;
// Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
// that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
// four bits. That is, denominator * inv = 1 mod 2^4.
uint256 inverse = (3 * denominator) ^ 2;
// Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
// in modular arithmetic, doubling the correct bits in each step.
inverse *= 2 - denominator * inverse; // inverse mod 2^8
inverse *= 2 - denominator * inverse; // inverse mod 2^16
inverse *= 2 - denominator * inverse; // inverse mod 2^32
inverse *= 2 - denominator * inverse; // inverse mod 2^64
inverse *= 2 - denominator * inverse; // inverse mod 2^128
inverse *= 2 - denominator * inverse; // inverse mod 2^256
// Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
// This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
// less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
// is no longer required.
result = prod0 * inverse;
return result;
}
}
/**
* @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
*/
function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {
uint256 result = mulDiv(x, y, denominator);
if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
result += 1;
}
return result;
}
/**
* @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
*
* Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
*/
function sqrt(uint256 a) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
// For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
//
// We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
// `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
//
// This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
// → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
// → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
//
// Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
uint256 result = 1 << (log2(a) >> 1);
// At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
// since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
// every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
// into the expected uint128 result.
unchecked {
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
return min(result, a / result);
}
}
/**
* @notice Calculates sqrt(a), following the selected rounding direction.
*/
function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = sqrt(a);
return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
}
}
/**
* @dev Return the log in base 2, rounded down, of a positive value.
* Returns 0 if given 0.
*/
function log2(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 128;
}
if (value >> 64 > 0) {
value >>= 64;
result += 64;
}
if (value >> 32 > 0) {
value >>= 32;
result += 32;
}
if (value >> 16 > 0) {
value >>= 16;
result += 16;
}
if (value >> 8 > 0) {
value >>= 8;
result += 8;
}
if (value >> 4 > 0) {
value >>= 4;
result += 4;
}
if (value >> 2 > 0) {
value >>= 2;
result += 2;
}
if (value >> 1 > 0) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 2, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log2(value);
return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 10, rounded down, of a positive value.
* Returns 0 if given 0.
*/
function log10(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >= 10 ** 64) {
value /= 10 ** 64;
result += 64;
}
if (value >= 10 ** 32) {
value /= 10 ** 32;
result += 32;
}
if (value >= 10 ** 16) {
value /= 10 ** 16;
result += 16;
}
if (value >= 10 ** 8) {
value /= 10 ** 8;
result += 8;
}
if (value >= 10 ** 4) {
value /= 10 ** 4;
result += 4;
}
if (value >= 10 ** 2) {
value /= 10 ** 2;
result += 2;
}
if (value >= 10 ** 1) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 10, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log10(value);
return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 256, rounded down, of a positive value.
* Returns 0 if given 0.
*
* Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
*/
function log256(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 16;
}
if (value >> 64 > 0) {
value >>= 64;
result += 8;
}
if (value >> 32 > 0) {
value >>= 32;
result += 4;
}
if (value >> 16 > 0) {
value >>= 16;
result += 2;
}
if (value >> 8 > 0) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 256, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log256(value);
return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);
}
}
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/utils/math/SignedMath.sol
// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)
pragma solidity ^0.8.0;
/**
* @dev Standard signed math utilities missing in the Solidity language.
*/
library SignedMath {
/**
* @dev Returns the largest of two signed numbers.
*/
function max(int256 a, int256 b) internal pure returns (int256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two signed numbers.
*/
function min(int256 a, int256 b) internal pure returns (int256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two signed numbers without overflow.
* The result is rounded towards zero.
*/
function average(int256 a, int256 b) internal pure returns (int256) {
// Formula from the book "Hacker's Delight"
int256 x = (a & b) + ((a ^ b) >> 1);
return x + (int256(uint256(x) >> 255) & (a ^ b));
}
/**
* @dev Returns the absolute unsigned value of a signed value.
*/
function abs(int256 n) internal pure returns (uint256) {
unchecked {
// must be unchecked in order to support `n = type(int256).min`
return uint256(n >= 0 ? n : -n);
}
}
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/utils/Strings.sol
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)
pragma solidity ^0.8.0;
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _SYMBOLS = "0123456789abcdef";
uint8 private constant _ADDRESS_LENGTH = 20;
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
unchecked {
uint256 length = Math.log10(value) + 1;
string memory buffer = new string(length);
uint256 ptr;
/// @solidity memory-safe-assembly
assembly {
ptr := add(buffer, add(32, length))
}
while (true) {
ptr--;
/// @solidity memory-safe-assembly
assembly {
mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
}
value /= 10;
if (value == 0) break;
}
return buffer;
}
}
/**
* @dev Converts a `int256` to its ASCII `string` decimal representation.
*/
function toString(int256 value) internal pure returns (string memory) {
return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value))));
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
unchecked {
return toHexString(value, Math.log256(value) + 1);
}
}
/**
* @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] = _SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
/**
* @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
*/
function toHexString(address addr) internal pure returns (string memory) {
return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
}
/**
* @dev Returns true if the two strings are equal.
*/
function equal(string memory a, string memory b) internal pure returns (bool) {
return keccak256(bytes(a)) == keccak256(bytes(b));
}
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/utils/introspection/IERC165.sol
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/utils/introspection/ERC165.sol
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/access/AccessControl.sol
// OpenZeppelin Contracts (last updated v4.9.0) (access/AccessControl.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module that allows children to implement role-based access
* control mechanisms. This is a lightweight version that doesn't allow enumerating role
* members except through off-chain means by accessing the contract event logs. Some
* applications may benefit from on-chain enumerability, for those cases see
* {AccessControlEnumerable}.
*
* Roles are referred to by their `bytes32` identifier. These should be exposed
* in the external API and be unique. The best way to achieve this is by
* using `public constant` hash digests:
*
* ```solidity
* bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
* ```
*
* Roles can be used to represent a set of permissions. To restrict access to a
* function call, use {hasRole}:
*
* ```solidity
* function foo() public {
* require(hasRole(MY_ROLE, msg.sender));
* ...
* }
* ```
*
* Roles can be granted and revoked dynamically via the {grantRole} and
* {revokeRole} functions. Each role has an associated admin role, and only
* accounts that have a role's admin role can call {grantRole} and {revokeRole}.
*
* By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
* that only accounts with this role will be able to grant or revoke other
* roles. More complex role relationships can be created by using
* {_setRoleAdmin}.
*
* WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
* grant and revoke this role. Extra precautions should be taken to secure
* accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}
* to enforce additional security measures for this role.
*/
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 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]{40}) is missing role (0x[0-9a-f]{64})$/
*
* _Available since v4.1._
*/
modifier onlyRole(bytes32 role) {
_checkRole(role);
_;
}
/**
* @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 virtual override returns (bool) {
return _roles[role].members[account];
}
/**
* @dev Revert with a standard message if `_msgSender()` is missing `role`.
* Overriding this function changes the behavior of the {onlyRole} modifier.
*
* Format of the revert message is described in {_checkRole}.
*
* _Available since v4.6._
*/
function _checkRole(bytes32 role) internal view virtual {
_checkRole(role, _msgSender());
}
/**
* @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]{40}) is missing role (0x[0-9a-f]{64})$/
*/
function _checkRole(bytes32 role, address account) internal view virtual {
if (!hasRole(role, account)) {
revert(
string(
abi.encodePacked(
"AccessControl: account ",
Strings.toHexString(account),
" 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 virtual 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.
*
* May emit a {RoleGranted} event.
*/
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.
*
* May emit a {RoleRevoked} event.
*/
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 revoked `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `account`.
*
* May emit a {RoleRevoked} event.
*/
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.
*
* May emit a {RoleGranted} event.
*
* [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}.
* ====
*
* NOTE: This function is deprecated in favor of {_grantRole}.
*/
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 {
bytes32 previousAdminRole = getRoleAdmin(role);
_roles[role].adminRole = adminRole;
emit RoleAdminChanged(role, previousAdminRole, adminRole);
}
/**
* @dev Grants `role` to `account`.
*
* Internal function without access restriction.
*
* May emit a {RoleGranted} event.
*/
function _grantRole(bytes32 role, address account) internal virtual {
if (!hasRole(role, account)) {
_roles[role].members[account] = true;
emit RoleGranted(role, account, _msgSender());
}
}
/**
* @dev Revokes `role` from `account`.
*
* Internal function without access restriction.
*
* May emit a {RoleRevoked} event.
*/
function _revokeRole(bytes32 role, address account) internal virtual {
if (hasRole(role, account)) {
_roles[role].members[account] = false;
emit RoleRevoked(role, account, _msgSender());
}
}
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/security/Pausable.sol
// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module which allows children to implement an emergency stop
* mechanism that can be triggered by an authorized account.
*
* This module is used through inheritance. It will make available the
* modifiers `whenNotPaused` and `whenPaused`, which can be applied to
* the functions of your contract. Note that they will not be pausable by
* simply including this module, only once the modifiers are put in place.
*/
abstract contract Pausable is Context {
/**
* @dev Emitted when the pause is triggered by `account`.
*/
event Paused(address account);
/**
* @dev Emitted when the pause is lifted by `account`.
*/
event Unpaused(address account);
bool private _paused;
/**
* @dev Initializes the contract in unpaused state.
*/
constructor() {
_paused = false;
}
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*
* Requirements:
*
* - The contract must not be paused.
*/
modifier whenNotPaused() {
_requireNotPaused();
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*
* Requirements:
*
* - The contract must be paused.
*/
modifier whenPaused() {
_requirePaused();
_;
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/
function paused() public view virtual returns (bool) {
return _paused;
}
/**
* @dev Throws if the contract is paused.
*/
function _requireNotPaused() internal view virtual {
require(!paused(), "Pausable: paused");
}
/**
* @dev Throws if the contract is not paused.
*/
function _requirePaused() internal view virtual {
require(paused(), "Pausable: not paused");
}
/**
* @dev Triggers stopped state.
*
* Requirements:
*
* - The contract must not be paused.
*/
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
/**
* @dev Returns to normal state.
*
* Requirements:
*
* - The contract must be paused.
*/
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
}
// File: contracts/DynexasToken.sol
pragma solidity ^0.8.20;
// DYNEXA_01_AGU_2025
// OpenZeppelin imports
contract DynexasToken is ERC20, AccessControl, Pausable {
// Roles
bytes32 public constant ADMIN_ROLE = DEFAULT_ADMIN_ROLE;
bytes32 public constant COMPANY_ROLE = keccak256("COMPANY_ROLE");
// Events
event CompanyAdded(address indexed company);
event CompanyRemoved(address indexed company);
// Constructor: Asigna el admin
constructor(address admin_) ERC20("Dynexas Stable Token", "DYNA") {
require(admin_ != address(0), "Admin address cannot be zero");
_grantRole(ADMIN_ROLE, admin_);
// _grantRole(ADMIN_ROLE, msg.sender); // Opcional: también el deployer puede ser admin en test
}
// Modifiers
modifier onlyAdmin() {
require(hasRole(ADMIN_ROLE, msg.sender), "Only admin");
_;
}
modifier onlyCompany() {
require(hasRole(COMPANY_ROLE, msg.sender), "Only company");
_;
}
// Admin Functions
function addCompany(address company) external onlyAdmin {
require(company != address(0), "Zero address");
grantRole(COMPANY_ROLE, company);
emit CompanyAdded(company);
}
function removeCompany(address company) external onlyAdmin {
revokeRole(COMPANY_ROLE, company);
emit CompanyRemoved(company);
}
function pause() external onlyAdmin {
_pause();
}
function unpause() external onlyAdmin {
_unpause();
}
// Mint/Burn
function mint(address to, uint256 amount) external onlyCompany whenNotPaused {
require(to != address(0), "Mint to zero");
_mint(to, amount);
}
function burn(address from, uint256 amount) external onlyCompany whenNotPaused {
require(balanceOf(from) >= amount, "Burn exceeds balance");
_burn(from, amount);
}
// Hooks: Override con ambas clases base
function _beforeTokenTransfer(
address from,
address to,
uint256 amount
) internal override(ERC20) {
require(!paused(), "Token is paused");
super._beforeTokenTransfer(from, to, amount);
}
// View Functions
function isCompany(address account) public view returns (bool) {
return hasRole(COMPANY_ROLE, account);
}
function isAdmin(address account) public view returns (bool) {
return hasRole(ADMIN_ROLE, account);
}
}Contract ABI
API[{"inputs":[{"internalType":"address","name":"admin_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"company","type":"address"}],"name":"CompanyAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"company","type":"address"}],"name":"CompanyRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"COMPANY_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"company","type":"address"}],"name":"addCompany","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","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":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isCompany","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"company","type":"address"}],"name":"removeCompany","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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405234801561000f575f5ffd5b5060405161352f38038061352f8339818101604052810190610031919061030e565b6040518060400160405280601481526020017f44796e6578617320537461626c6520546f6b656e0000000000000000000000008152506040518060400160405280600481526020017f44594e410000000000000000000000000000000000000000000000000000000081525081600390816100ac9190610576565b5080600490816100bc9190610576565b5050505f60065f6101000a81548160ff0219169083151502179055505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610146576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161013d9061069f565b60405180910390fd5b6101585f5f1b8261015e60201b60201c565b506106bd565b61016e828261024560201b60201c565b61024157600160055f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506101e66102a960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b5f60055f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f33905090565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6102dd826102b4565b9050919050565b6102ed816102d3565b81146102f7575f5ffd5b50565b5f81519050610308816102e4565b92915050565b5f60208284031215610323576103226102b0565b5b5f610330848285016102fa565b91505092915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806103b457607f821691505b6020821081036103c7576103c6610370565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026104297fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826103ee565b61043386836103ee565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61047761047261046d8461044b565b610454565b61044b565b9050919050565b5f819050919050565b6104908361045d565b6104a461049c8261047e565b8484546103fa565b825550505050565b5f5f905090565b6104bb6104ac565b6104c6818484610487565b505050565b5b818110156104e9576104de5f826104b3565b6001810190506104cc565b5050565b601f82111561052e576104ff816103cd565b610508846103df565b81016020851015610517578190505b61052b610523856103df565b8301826104cb565b50505b505050565b5f82821c905092915050565b5f61054e5f1984600802610533565b1980831691505092915050565b5f610566838361053f565b9150826002028217905092915050565b61057f82610339565b67ffffffffffffffff81111561059857610597610343565b5b6105a2825461039d565b6105ad8282856104ed565b5f60209050601f8311600181146105de575f84156105cc578287015190505b6105d6858261055b565b86555061063d565b601f1984166105ec866103cd565b5f5b82811015610613578489015182556001820191506020850194506020810190506105ee565b86831015610630578489015161062c601f89168261053f565b8355505b6001600288020188555050505b505050505050565b5f82825260208201905092915050565b7f41646d696e20616464726573732063616e6e6f74206265207a65726f000000005f82015250565b5f610689601c83610645565b915061069482610655565b602082019050919050565b5f6020820190508181035f8301526106b68161067d565b9050919050565b612e65806106ca5f395ff3fe608060405234801561000f575f5ffd5b50600436106101cd575f3560e01c806340c10f191161010257806395d89b41116100a0578063a457c2d71161006f578063a457c2d71461052d578063a9059cbb1461055d578063d547741f1461058d578063dd62ed3e146105a9576101cd565b806395d89b41146104a55780639dc29fac146104c3578063a0406ce2146104df578063a217fddf1461050f576101cd565b806370a08231116100dc57806370a082311461041d57806375b238fc1461044d5780638456cb591461046b57806391d1485414610475576101cd565b806340c10f19146103c75780635c975abb146103e3578063634513ca14610401576101cd565b8063248a9ca31161016f578063313ce56711610149578063313ce5671461035357806336568abe14610371578063395093511461038d5780633f4ba83a146103bd576101cd565b8063248a9ca3146102d757806324d7806c146103075780632f2ff15d14610337576101cd565b806318160ddd116101ab57806318160ddd1461024f5780631c9ee11a1461026d57806320ee2dcc1461028b57806323b872dd146102a7576101cd565b806301ffc9a7146101d157806306fdde0314610201578063095ea7b31461021f575b5f5ffd5b6101eb60048036038101906101e69190611e79565b6105d9565b6040516101f89190611ebe565b60405180910390f35b610209610652565b6040516102169190611f47565b60405180910390f35b61023960048036038101906102349190611ff4565b6106e2565b6040516102469190611ebe565b60405180910390f35b610257610704565b6040516102649190612041565b60405180910390f35b61027561070d565b6040516102829190612072565b60405180910390f35b6102a560048036038101906102a0919061208b565b610731565b005b6102c160048036038101906102bc91906120b6565b6107ec565b6040516102ce9190611ebe565b60405180910390f35b6102f160048036038101906102ec9190612130565b61081a565b6040516102fe9190612072565b60405180910390f35b610321600480360381019061031c919061208b565b610837565b60405161032e9190611ebe565b60405180910390f35b610351600480360381019061034c919061215b565b61084b565b005b61035b61086c565b60405161036891906121b4565b60405180910390f35b61038b6004803603810190610386919061215b565b610874565b005b6103a760048036038101906103a29190611ff4565b6108f7565b6040516103b49190611ebe565b60405180910390f35b6103c561092d565b005b6103e160048036038101906103dc9190611ff4565b610982565b005b6103eb610a6f565b6040516103f89190611ebe565b60405180910390f35b61041b6004803603810190610416919061208b565b610a84565b005b6104376004803603810190610432919061208b565b610bad565b6040516104449190612041565b60405180910390f35b610455610bf2565b6040516104629190612072565b60405180910390f35b610473610bf8565b005b61048f600480360381019061048a919061215b565b610c4d565b60405161049c9190611ebe565b60405180910390f35b6104ad610cb1565b6040516104ba9190611f47565b60405180910390f35b6104dd60048036038101906104d89190611ff4565b610d41565b005b6104f960048036038101906104f4919061208b565b610e0b565b6040516105069190611ebe565b60405180910390f35b610517610e3d565b6040516105249190612072565b60405180910390f35b61054760048036038101906105429190611ff4565b610e43565b6040516105549190611ebe565b60405180910390f35b61057760048036038101906105729190611ff4565b610eb8565b6040516105849190611ebe565b60405180910390f35b6105a760048036038101906105a2919061215b565b610eda565b005b6105c360048036038101906105be91906121cd565b610efb565b6040516105d09190612041565b60405180910390f35b5f7f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061064b575061064a82610f7d565b5b9050919050565b60606003805461066190612238565b80601f016020809104026020016040519081016040528092919081815260200182805461068d90612238565b80156106d85780601f106106af576101008083540402835291602001916106d8565b820191905f5260205f20905b8154815290600101906020018083116106bb57829003601f168201915b5050505050905090565b5f5f6106ec610fe6565b90506106f9818585610fed565b600191505092915050565b5f600254905090565b7f9e1688b53537f356172ce07f39e129155063957163c5f9462d4d9e55b228b06c81565b61073d5f5f1b33610c4d565b61077c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610773906122b2565b60405180910390fd5b6107a67f9e1688b53537f356172ce07f39e129155063957163c5f9462d4d9e55b228b06c82610eda565b8073ffffffffffffffffffffffffffffffffffffffff167f842a0c36aded642f477dfd0dc633355e99cc660741c20a3693f73b7a2b93760860405160405180910390a250565b5f5f6107f6610fe6565b90506108038582856111b0565b61080e85858561123b565b60019150509392505050565b5f60055f8381526020019081526020015f20600101549050919050565b5f6108445f5f1b83610c4d565b9050919050565b6108548261081a565b61085d816114a7565b61086783836114bb565b505050565b5f6012905090565b61087c610fe6565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146108e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e090612340565b60405180910390fd5b6108f38282611596565b5050565b5f5f610901610fe6565b90506109228185856109138589610efb565b61091d919061238b565b610fed565b600191505092915050565b6109395f5f1b33610c4d565b610978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096f906122b2565b60405180910390fd5b610980611671565b565b6109ac7f9e1688b53537f356172ce07f39e129155063957163c5f9462d4d9e55b228b06c33610c4d565b6109eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e290612408565b60405180910390fd5b6109f36116d2565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610a61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5890612470565b60405180910390fd5b610a6b828261171c565b5050565b5f60065f9054906101000a900460ff16905090565b610a905f5f1b33610c4d565b610acf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac6906122b2565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b34906124d8565b60405180910390fd5b610b677f9e1688b53537f356172ce07f39e129155063957163c5f9462d4d9e55b228b06c8261084b565b8073ffffffffffffffffffffffffffffffffffffffff167feaedad5bc5c69671b51a22cd12e2a8eb29d059d6872181c52a79073a38b1ba4960405160405180910390a250565b5f5f5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f5f1b81565b610c045f5f1b33610c4d565b610c43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3a906122b2565b60405180910390fd5b610c4b61186a565b565b5f60055f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b606060048054610cc090612238565b80601f0160208091040260200160405190810160405280929190818152602001828054610cec90612238565b8015610d375780601f10610d0e57610100808354040283529160200191610d37565b820191905f5260205f20905b815481529060010190602001808311610d1a57829003601f168201915b5050505050905090565b610d6b7f9e1688b53537f356172ce07f39e129155063957163c5f9462d4d9e55b228b06c33610c4d565b610daa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da190612408565b60405180910390fd5b610db26116d2565b80610dbc83610bad565b1015610dfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df490612540565b60405180910390fd5b610e0782826118cc565b5050565b5f610e367f9e1688b53537f356172ce07f39e129155063957163c5f9462d4d9e55b228b06c83610c4d565b9050919050565b5f5f1b81565b5f5f610e4d610fe6565b90505f610e5a8286610efb565b905083811015610e9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e96906125ce565b60405180910390fd5b610eac8286868403610fed565b60019250505092915050565b5f5f610ec2610fe6565b9050610ecf81858561123b565b600191505092915050565b610ee38261081a565b610eec816114a7565b610ef68383611596565b505050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361105b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110529061265c565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c0906126ea565b60405180910390fd5b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516111a39190612041565b60405180910390a3505050565b5f6111bb8484610efb565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146112355781811015611227576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121e90612752565b60405180910390fd5b6112348484848403610fed565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036112a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a0906127e0565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611317576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130e9061286e565b60405180910390fd5b611322838383611a8f565b5f5f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156113a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139c906128fc565b60405180910390fd5b8181035f5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550815f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161148e9190612041565b60405180910390a36114a1848484611ae7565b50505050565b6114b8816114b3610fe6565b611aec565b50565b6114c58282610c4d565b61159257600160055f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550611537610fe6565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6115a08282610c4d565b1561166d575f60055f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550611612610fe6565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b611679611b70565b5f60065f6101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6116bb610fe6565b6040516116c89190612929565b60405180910390a1565b6116da610a6f565b1561171a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117119061298c565b60405180910390fd5b565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361178a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611781906129f4565b60405180910390fd5b6117955f8383611a8f565b8060025f8282546117a6919061238b565b92505081905550805f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516118539190612041565b60405180910390a36118665f8383611ae7565b5050565b6118726116d2565b600160065f6101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586118b5610fe6565b6040516118c29190612929565b60405180910390a1565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361193a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193190612a82565b60405180910390fd5b611945825f83611a8f565b5f5f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156119c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bf90612b10565b60405180910390fd5b8181035f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160025f82825403925050819055505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611a779190612041565b60405180910390a3611a8a835f84611ae7565b505050565b611a97610a6f565b15611ad7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ace90612b78565b60405180910390fd5b611ae2838383611bb9565b505050565b505050565b611af68282610c4d565b611b6c57611b0381611bbe565b611b10835f1c6020611beb565b604051602001611b21929190612c64565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b639190611f47565b60405180910390fd5b5050565b611b78610a6f565b611bb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bae90612ce7565b60405180910390fd5b565b505050565b6060611be48273ffffffffffffffffffffffffffffffffffffffff16601460ff16611beb565b9050919050565b60605f6002836002611bfd9190612d05565b611c07919061238b565b67ffffffffffffffff811115611c2057611c1f612d46565b5b6040519080825280601f01601f191660200182016040528015611c525781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f81518110611c8957611c88612d73565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611cec57611ceb612d73565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f6001846002611d2a9190612d05565b611d34919061238b565b90505b6001811115611dd3577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611d7657611d75612d73565b5b1a60f81b828281518110611d8d57611d8c612d73565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600485901c945080611dcc90612da0565b9050611d37565b505f8414611e16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0d90612e11565b60405180910390fd5b8091505092915050565b5f5ffd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611e5881611e24565b8114611e62575f5ffd5b50565b5f81359050611e7381611e4f565b92915050565b5f60208284031215611e8e57611e8d611e20565b5b5f611e9b84828501611e65565b91505092915050565b5f8115159050919050565b611eb881611ea4565b82525050565b5f602082019050611ed15f830184611eaf565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f611f1982611ed7565b611f238185611ee1565b9350611f33818560208601611ef1565b611f3c81611eff565b840191505092915050565b5f6020820190508181035f830152611f5f8184611f0f565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611f9082611f67565b9050919050565b611fa081611f86565b8114611faa575f5ffd5b50565b5f81359050611fbb81611f97565b92915050565b5f819050919050565b611fd381611fc1565b8114611fdd575f5ffd5b50565b5f81359050611fee81611fca565b92915050565b5f5f6040838503121561200a57612009611e20565b5b5f61201785828601611fad565b925050602061202885828601611fe0565b9150509250929050565b61203b81611fc1565b82525050565b5f6020820190506120545f830184612032565b92915050565b5f819050919050565b61206c8161205a565b82525050565b5f6020820190506120855f830184612063565b92915050565b5f602082840312156120a05761209f611e20565b5b5f6120ad84828501611fad565b91505092915050565b5f5f5f606084860312156120cd576120cc611e20565b5b5f6120da86828701611fad565b93505060206120eb86828701611fad565b92505060406120fc86828701611fe0565b9150509250925092565b61210f8161205a565b8114612119575f5ffd5b50565b5f8135905061212a81612106565b92915050565b5f6020828403121561214557612144611e20565b5b5f6121528482850161211c565b91505092915050565b5f5f6040838503121561217157612170611e20565b5b5f61217e8582860161211c565b925050602061218f85828601611fad565b9150509250929050565b5f60ff82169050919050565b6121ae81612199565b82525050565b5f6020820190506121c75f8301846121a5565b92915050565b5f5f604083850312156121e3576121e2611e20565b5b5f6121f085828601611fad565b925050602061220185828601611fad565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061224f57607f821691505b6020821081036122625761226161220b565b5b50919050565b7f4f6e6c792061646d696e000000000000000000000000000000000000000000005f82015250565b5f61229c600a83611ee1565b91506122a782612268565b602082019050919050565b5f6020820190508181035f8301526122c981612290565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e63655f8201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b5f61232a602f83611ee1565b9150612335826122d0565b604082019050919050565b5f6020820190508181035f8301526123578161231e565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61239582611fc1565b91506123a083611fc1565b92508282019050808211156123b8576123b761235e565b5b92915050565b7f4f6e6c7920636f6d70616e7900000000000000000000000000000000000000005f82015250565b5f6123f2600c83611ee1565b91506123fd826123be565b602082019050919050565b5f6020820190508181035f83015261241f816123e6565b9050919050565b7f4d696e7420746f207a65726f00000000000000000000000000000000000000005f82015250565b5f61245a600c83611ee1565b915061246582612426565b602082019050919050565b5f6020820190508181035f8301526124878161244e565b9050919050565b7f5a65726f206164647265737300000000000000000000000000000000000000005f82015250565b5f6124c2600c83611ee1565b91506124cd8261248e565b602082019050919050565b5f6020820190508181035f8301526124ef816124b6565b9050919050565b7f4275726e20657863656564732062616c616e63650000000000000000000000005f82015250565b5f61252a601483611ee1565b9150612535826124f6565b602082019050919050565b5f6020820190508181035f8301526125578161251e565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f6125b8602583611ee1565b91506125c38261255e565b604082019050919050565b5f6020820190508181035f8301526125e5816125ac565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f612646602483611ee1565b9150612651826125ec565b604082019050919050565b5f6020820190508181035f8301526126738161263a565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f6126d4602283611ee1565b91506126df8261267a565b604082019050919050565b5f6020820190508181035f830152612701816126c8565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000005f82015250565b5f61273c601d83611ee1565b915061274782612708565b602082019050919050565b5f6020820190508181035f83015261276981612730565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f6127ca602583611ee1565b91506127d582612770565b604082019050919050565b5f6020820190508181035f8301526127f7816127be565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f612858602383611ee1565b9150612863826127fe565b604082019050919050565b5f6020820190508181035f8301526128858161284c565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f6128e6602683611ee1565b91506128f18261288c565b604082019050919050565b5f6020820190508181035f830152612913816128da565b9050919050565b61292381611f86565b82525050565b5f60208201905061293c5f83018461291a565b92915050565b7f5061757361626c653a20706175736564000000000000000000000000000000005f82015250565b5f612976601083611ee1565b915061298182612942565b602082019050919050565b5f6020820190508181035f8301526129a38161296a565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f6129de601f83611ee1565b91506129e9826129aa565b602082019050919050565b5f6020820190508181035f830152612a0b816129d2565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f206164647265735f8201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b5f612a6c602183611ee1565b9150612a7782612a12565b604082019050919050565b5f6020820190508181035f830152612a9981612a60565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f612afa602283611ee1565b9150612b0582612aa0565b604082019050919050565b5f6020820190508181035f830152612b2781612aee565b9050919050565b7f546f6b656e2069732070617573656400000000000000000000000000000000005f82015250565b5f612b62600f83611ee1565b9150612b6d82612b2e565b602082019050919050565b5f6020820190508181035f830152612b8f81612b56565b9050919050565b5f81905092915050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000005f82015250565b5f612bd4601783612b96565b9150612bdf82612ba0565b601782019050919050565b5f612bf482611ed7565b612bfe8185612b96565b9350612c0e818560208601611ef1565b80840191505092915050565b7f206973206d697373696e6720726f6c65200000000000000000000000000000005f82015250565b5f612c4e601183612b96565b9150612c5982612c1a565b601182019050919050565b5f612c6e82612bc8565b9150612c7a8285612bea565b9150612c8582612c42565b9150612c918284612bea565b91508190509392505050565b7f5061757361626c653a206e6f74207061757365640000000000000000000000005f82015250565b5f612cd1601483611ee1565b9150612cdc82612c9d565b602082019050919050565b5f6020820190508181035f830152612cfe81612cc5565b9050919050565b5f612d0f82611fc1565b9150612d1a83611fc1565b9250828202612d2881611fc1565b91508282048414831517612d3f57612d3e61235e565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f612daa82611fc1565b91505f8203612dbc57612dbb61235e565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e745f82015250565b5f612dfb602083611ee1565b9150612e0682612dc7565b602082019050919050565b5f6020820190508181035f830152612e2881612def565b905091905056fea2646970667358221220c8bcd1840248e19b8ad7c0cfb2cc982d42433a950e070f0fa2554406c4807e0264736f6c634300081e00330000000000000000000000005bfd37ea9a63a3105a84f73863576293c63f4297
Deployed Bytecode
0x608060405234801561000f575f5ffd5b50600436106101cd575f3560e01c806340c10f191161010257806395d89b41116100a0578063a457c2d71161006f578063a457c2d71461052d578063a9059cbb1461055d578063d547741f1461058d578063dd62ed3e146105a9576101cd565b806395d89b41146104a55780639dc29fac146104c3578063a0406ce2146104df578063a217fddf1461050f576101cd565b806370a08231116100dc57806370a082311461041d57806375b238fc1461044d5780638456cb591461046b57806391d1485414610475576101cd565b806340c10f19146103c75780635c975abb146103e3578063634513ca14610401576101cd565b8063248a9ca31161016f578063313ce56711610149578063313ce5671461035357806336568abe14610371578063395093511461038d5780633f4ba83a146103bd576101cd565b8063248a9ca3146102d757806324d7806c146103075780632f2ff15d14610337576101cd565b806318160ddd116101ab57806318160ddd1461024f5780631c9ee11a1461026d57806320ee2dcc1461028b57806323b872dd146102a7576101cd565b806301ffc9a7146101d157806306fdde0314610201578063095ea7b31461021f575b5f5ffd5b6101eb60048036038101906101e69190611e79565b6105d9565b6040516101f89190611ebe565b60405180910390f35b610209610652565b6040516102169190611f47565b60405180910390f35b61023960048036038101906102349190611ff4565b6106e2565b6040516102469190611ebe565b60405180910390f35b610257610704565b6040516102649190612041565b60405180910390f35b61027561070d565b6040516102829190612072565b60405180910390f35b6102a560048036038101906102a0919061208b565b610731565b005b6102c160048036038101906102bc91906120b6565b6107ec565b6040516102ce9190611ebe565b60405180910390f35b6102f160048036038101906102ec9190612130565b61081a565b6040516102fe9190612072565b60405180910390f35b610321600480360381019061031c919061208b565b610837565b60405161032e9190611ebe565b60405180910390f35b610351600480360381019061034c919061215b565b61084b565b005b61035b61086c565b60405161036891906121b4565b60405180910390f35b61038b6004803603810190610386919061215b565b610874565b005b6103a760048036038101906103a29190611ff4565b6108f7565b6040516103b49190611ebe565b60405180910390f35b6103c561092d565b005b6103e160048036038101906103dc9190611ff4565b610982565b005b6103eb610a6f565b6040516103f89190611ebe565b60405180910390f35b61041b6004803603810190610416919061208b565b610a84565b005b6104376004803603810190610432919061208b565b610bad565b6040516104449190612041565b60405180910390f35b610455610bf2565b6040516104629190612072565b60405180910390f35b610473610bf8565b005b61048f600480360381019061048a919061215b565b610c4d565b60405161049c9190611ebe565b60405180910390f35b6104ad610cb1565b6040516104ba9190611f47565b60405180910390f35b6104dd60048036038101906104d89190611ff4565b610d41565b005b6104f960048036038101906104f4919061208b565b610e0b565b6040516105069190611ebe565b60405180910390f35b610517610e3d565b6040516105249190612072565b60405180910390f35b61054760048036038101906105429190611ff4565b610e43565b6040516105549190611ebe565b60405180910390f35b61057760048036038101906105729190611ff4565b610eb8565b6040516105849190611ebe565b60405180910390f35b6105a760048036038101906105a2919061215b565b610eda565b005b6105c360048036038101906105be91906121cd565b610efb565b6040516105d09190612041565b60405180910390f35b5f7f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061064b575061064a82610f7d565b5b9050919050565b60606003805461066190612238565b80601f016020809104026020016040519081016040528092919081815260200182805461068d90612238565b80156106d85780601f106106af576101008083540402835291602001916106d8565b820191905f5260205f20905b8154815290600101906020018083116106bb57829003601f168201915b5050505050905090565b5f5f6106ec610fe6565b90506106f9818585610fed565b600191505092915050565b5f600254905090565b7f9e1688b53537f356172ce07f39e129155063957163c5f9462d4d9e55b228b06c81565b61073d5f5f1b33610c4d565b61077c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610773906122b2565b60405180910390fd5b6107a67f9e1688b53537f356172ce07f39e129155063957163c5f9462d4d9e55b228b06c82610eda565b8073ffffffffffffffffffffffffffffffffffffffff167f842a0c36aded642f477dfd0dc633355e99cc660741c20a3693f73b7a2b93760860405160405180910390a250565b5f5f6107f6610fe6565b90506108038582856111b0565b61080e85858561123b565b60019150509392505050565b5f60055f8381526020019081526020015f20600101549050919050565b5f6108445f5f1b83610c4d565b9050919050565b6108548261081a565b61085d816114a7565b61086783836114bb565b505050565b5f6012905090565b61087c610fe6565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146108e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e090612340565b60405180910390fd5b6108f38282611596565b5050565b5f5f610901610fe6565b90506109228185856109138589610efb565b61091d919061238b565b610fed565b600191505092915050565b6109395f5f1b33610c4d565b610978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096f906122b2565b60405180910390fd5b610980611671565b565b6109ac7f9e1688b53537f356172ce07f39e129155063957163c5f9462d4d9e55b228b06c33610c4d565b6109eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e290612408565b60405180910390fd5b6109f36116d2565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610a61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5890612470565b60405180910390fd5b610a6b828261171c565b5050565b5f60065f9054906101000a900460ff16905090565b610a905f5f1b33610c4d565b610acf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac6906122b2565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b34906124d8565b60405180910390fd5b610b677f9e1688b53537f356172ce07f39e129155063957163c5f9462d4d9e55b228b06c8261084b565b8073ffffffffffffffffffffffffffffffffffffffff167feaedad5bc5c69671b51a22cd12e2a8eb29d059d6872181c52a79073a38b1ba4960405160405180910390a250565b5f5f5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f5f1b81565b610c045f5f1b33610c4d565b610c43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3a906122b2565b60405180910390fd5b610c4b61186a565b565b5f60055f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b606060048054610cc090612238565b80601f0160208091040260200160405190810160405280929190818152602001828054610cec90612238565b8015610d375780601f10610d0e57610100808354040283529160200191610d37565b820191905f5260205f20905b815481529060010190602001808311610d1a57829003601f168201915b5050505050905090565b610d6b7f9e1688b53537f356172ce07f39e129155063957163c5f9462d4d9e55b228b06c33610c4d565b610daa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da190612408565b60405180910390fd5b610db26116d2565b80610dbc83610bad565b1015610dfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df490612540565b60405180910390fd5b610e0782826118cc565b5050565b5f610e367f9e1688b53537f356172ce07f39e129155063957163c5f9462d4d9e55b228b06c83610c4d565b9050919050565b5f5f1b81565b5f5f610e4d610fe6565b90505f610e5a8286610efb565b905083811015610e9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e96906125ce565b60405180910390fd5b610eac8286868403610fed565b60019250505092915050565b5f5f610ec2610fe6565b9050610ecf81858561123b565b600191505092915050565b610ee38261081a565b610eec816114a7565b610ef68383611596565b505050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361105b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110529061265c565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c0906126ea565b60405180910390fd5b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516111a39190612041565b60405180910390a3505050565b5f6111bb8484610efb565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146112355781811015611227576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121e90612752565b60405180910390fd5b6112348484848403610fed565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036112a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a0906127e0565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611317576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130e9061286e565b60405180910390fd5b611322838383611a8f565b5f5f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156113a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139c906128fc565b60405180910390fd5b8181035f5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550815f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161148e9190612041565b60405180910390a36114a1848484611ae7565b50505050565b6114b8816114b3610fe6565b611aec565b50565b6114c58282610c4d565b61159257600160055f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550611537610fe6565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6115a08282610c4d565b1561166d575f60055f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550611612610fe6565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b611679611b70565b5f60065f6101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6116bb610fe6565b6040516116c89190612929565b60405180910390a1565b6116da610a6f565b1561171a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117119061298c565b60405180910390fd5b565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361178a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611781906129f4565b60405180910390fd5b6117955f8383611a8f565b8060025f8282546117a6919061238b565b92505081905550805f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516118539190612041565b60405180910390a36118665f8383611ae7565b5050565b6118726116d2565b600160065f6101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586118b5610fe6565b6040516118c29190612929565b60405180910390a1565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361193a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193190612a82565b60405180910390fd5b611945825f83611a8f565b5f5f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156119c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bf90612b10565b60405180910390fd5b8181035f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160025f82825403925050819055505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611a779190612041565b60405180910390a3611a8a835f84611ae7565b505050565b611a97610a6f565b15611ad7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ace90612b78565b60405180910390fd5b611ae2838383611bb9565b505050565b505050565b611af68282610c4d565b611b6c57611b0381611bbe565b611b10835f1c6020611beb565b604051602001611b21929190612c64565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b639190611f47565b60405180910390fd5b5050565b611b78610a6f565b611bb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bae90612ce7565b60405180910390fd5b565b505050565b6060611be48273ffffffffffffffffffffffffffffffffffffffff16601460ff16611beb565b9050919050565b60605f6002836002611bfd9190612d05565b611c07919061238b565b67ffffffffffffffff811115611c2057611c1f612d46565b5b6040519080825280601f01601f191660200182016040528015611c525781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f81518110611c8957611c88612d73565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611cec57611ceb612d73565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f6001846002611d2a9190612d05565b611d34919061238b565b90505b6001811115611dd3577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611d7657611d75612d73565b5b1a60f81b828281518110611d8d57611d8c612d73565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600485901c945080611dcc90612da0565b9050611d37565b505f8414611e16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0d90612e11565b60405180910390fd5b8091505092915050565b5f5ffd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611e5881611e24565b8114611e62575f5ffd5b50565b5f81359050611e7381611e4f565b92915050565b5f60208284031215611e8e57611e8d611e20565b5b5f611e9b84828501611e65565b91505092915050565b5f8115159050919050565b611eb881611ea4565b82525050565b5f602082019050611ed15f830184611eaf565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f611f1982611ed7565b611f238185611ee1565b9350611f33818560208601611ef1565b611f3c81611eff565b840191505092915050565b5f6020820190508181035f830152611f5f8184611f0f565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611f9082611f67565b9050919050565b611fa081611f86565b8114611faa575f5ffd5b50565b5f81359050611fbb81611f97565b92915050565b5f819050919050565b611fd381611fc1565b8114611fdd575f5ffd5b50565b5f81359050611fee81611fca565b92915050565b5f5f6040838503121561200a57612009611e20565b5b5f61201785828601611fad565b925050602061202885828601611fe0565b9150509250929050565b61203b81611fc1565b82525050565b5f6020820190506120545f830184612032565b92915050565b5f819050919050565b61206c8161205a565b82525050565b5f6020820190506120855f830184612063565b92915050565b5f602082840312156120a05761209f611e20565b5b5f6120ad84828501611fad565b91505092915050565b5f5f5f606084860312156120cd576120cc611e20565b5b5f6120da86828701611fad565b93505060206120eb86828701611fad565b92505060406120fc86828701611fe0565b9150509250925092565b61210f8161205a565b8114612119575f5ffd5b50565b5f8135905061212a81612106565b92915050565b5f6020828403121561214557612144611e20565b5b5f6121528482850161211c565b91505092915050565b5f5f6040838503121561217157612170611e20565b5b5f61217e8582860161211c565b925050602061218f85828601611fad565b9150509250929050565b5f60ff82169050919050565b6121ae81612199565b82525050565b5f6020820190506121c75f8301846121a5565b92915050565b5f5f604083850312156121e3576121e2611e20565b5b5f6121f085828601611fad565b925050602061220185828601611fad565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061224f57607f821691505b6020821081036122625761226161220b565b5b50919050565b7f4f6e6c792061646d696e000000000000000000000000000000000000000000005f82015250565b5f61229c600a83611ee1565b91506122a782612268565b602082019050919050565b5f6020820190508181035f8301526122c981612290565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e63655f8201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b5f61232a602f83611ee1565b9150612335826122d0565b604082019050919050565b5f6020820190508181035f8301526123578161231e565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61239582611fc1565b91506123a083611fc1565b92508282019050808211156123b8576123b761235e565b5b92915050565b7f4f6e6c7920636f6d70616e7900000000000000000000000000000000000000005f82015250565b5f6123f2600c83611ee1565b91506123fd826123be565b602082019050919050565b5f6020820190508181035f83015261241f816123e6565b9050919050565b7f4d696e7420746f207a65726f00000000000000000000000000000000000000005f82015250565b5f61245a600c83611ee1565b915061246582612426565b602082019050919050565b5f6020820190508181035f8301526124878161244e565b9050919050565b7f5a65726f206164647265737300000000000000000000000000000000000000005f82015250565b5f6124c2600c83611ee1565b91506124cd8261248e565b602082019050919050565b5f6020820190508181035f8301526124ef816124b6565b9050919050565b7f4275726e20657863656564732062616c616e63650000000000000000000000005f82015250565b5f61252a601483611ee1565b9150612535826124f6565b602082019050919050565b5f6020820190508181035f8301526125578161251e565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f6125b8602583611ee1565b91506125c38261255e565b604082019050919050565b5f6020820190508181035f8301526125e5816125ac565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f612646602483611ee1565b9150612651826125ec565b604082019050919050565b5f6020820190508181035f8301526126738161263a565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f6126d4602283611ee1565b91506126df8261267a565b604082019050919050565b5f6020820190508181035f830152612701816126c8565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000005f82015250565b5f61273c601d83611ee1565b915061274782612708565b602082019050919050565b5f6020820190508181035f83015261276981612730565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f6127ca602583611ee1565b91506127d582612770565b604082019050919050565b5f6020820190508181035f8301526127f7816127be565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f612858602383611ee1565b9150612863826127fe565b604082019050919050565b5f6020820190508181035f8301526128858161284c565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f6128e6602683611ee1565b91506128f18261288c565b604082019050919050565b5f6020820190508181035f830152612913816128da565b9050919050565b61292381611f86565b82525050565b5f60208201905061293c5f83018461291a565b92915050565b7f5061757361626c653a20706175736564000000000000000000000000000000005f82015250565b5f612976601083611ee1565b915061298182612942565b602082019050919050565b5f6020820190508181035f8301526129a38161296a565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f6129de601f83611ee1565b91506129e9826129aa565b602082019050919050565b5f6020820190508181035f830152612a0b816129d2565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f206164647265735f8201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b5f612a6c602183611ee1565b9150612a7782612a12565b604082019050919050565b5f6020820190508181035f830152612a9981612a60565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f612afa602283611ee1565b9150612b0582612aa0565b604082019050919050565b5f6020820190508181035f830152612b2781612aee565b9050919050565b7f546f6b656e2069732070617573656400000000000000000000000000000000005f82015250565b5f612b62600f83611ee1565b9150612b6d82612b2e565b602082019050919050565b5f6020820190508181035f830152612b8f81612b56565b9050919050565b5f81905092915050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000005f82015250565b5f612bd4601783612b96565b9150612bdf82612ba0565b601782019050919050565b5f612bf482611ed7565b612bfe8185612b96565b9350612c0e818560208601611ef1565b80840191505092915050565b7f206973206d697373696e6720726f6c65200000000000000000000000000000005f82015250565b5f612c4e601183612b96565b9150612c5982612c1a565b601182019050919050565b5f612c6e82612bc8565b9150612c7a8285612bea565b9150612c8582612c42565b9150612c918284612bea565b91508190509392505050565b7f5061757361626c653a206e6f74207061757365640000000000000000000000005f82015250565b5f612cd1601483611ee1565b9150612cdc82612c9d565b602082019050919050565b5f6020820190508181035f830152612cfe81612cc5565b9050919050565b5f612d0f82611fc1565b9150612d1a83611fc1565b9250828202612d2881611fc1565b91508282048414831517612d3f57612d3e61235e565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f612daa82611fc1565b91505f8203612dbc57612dbb61235e565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e745f82015250565b5f612dfb602083611ee1565b9150612e0682612dc7565b602082019050919050565b5f6020820190508181035f830152612e2881612def565b905091905056fea2646970667358221220c8bcd1840248e19b8ad7c0cfb2cc982d42433a950e070f0fa2554406c4807e0264736f6c634300081e0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000005bfd37ea9a63a3105a84f73863576293c63f4297
-----Decoded View---------------
Arg [0] : admin_ (address): 0x5bFD37ea9a63A3105a84f73863576293C63f4297
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000005bfd37ea9a63a3105a84f73863576293c63f4297
Deployed Bytecode Sourcemap
51710:2407:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43210:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6833:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9193:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7962:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51849:64;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52864:150;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9974:261;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45033:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53999:115;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45474:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7804:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46618:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10644:238;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53093:67;;;:::i;:::-;;53186:165;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50605:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52655:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8133:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51787:55;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53022:63;;;:::i;:::-;;43506:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7052:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53359:186;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53872:119;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42611:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11385:436;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8466:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45914:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8722:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43210:204;43295:4;43334:32;43319:47;;;:11;:47;;;;:87;;;;43370:36;43394:11;43370:23;:36::i;:::-;43319:87;43312:94;;43210:204;;;:::o;6833:100::-;6887:13;6920:5;6913:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6833:100;:::o;9193:201::-;9276:4;9293:13;9309:12;:10;:12::i;:::-;9293:28;;9332:32;9341:5;9348:7;9357:6;9332:8;:32::i;:::-;9382:4;9375:11;;;9193:201;;;;:::o;7962:108::-;8023:7;8050:12;;8043:19;;7962:108;:::o;51849:64::-;51888:25;51849:64;:::o;52864:150::-;52437:31;42656:4;51824:18;;52457:10;52437:7;:31::i;:::-;52429:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;52934:33:::1;51888:25;52959:7;52934:10;:33::i;:::-;52998:7;52983:23;;;;;;;;;;;;52864:150:::0;:::o;9974:261::-;10071:4;10088:15;10106:12;:10;:12::i;:::-;10088:30;;10129:38;10145:4;10151:7;10160:6;10129:15;:38::i;:::-;10178:27;10188:4;10194:2;10198:6;10178:9;:27::i;:::-;10223:4;10216:11;;;9974:261;;;;;:::o;45033:131::-;45107:7;45134:6;:12;45141:4;45134:12;;;;;;;;;;;:22;;;45127:29;;45033:131;;;:::o;53999:115::-;54054:4;54078:28;42656:4;51824:18;;54098:7;54078;:28::i;:::-;54071:35;;53999:115;;;:::o;45474:147::-;45557:18;45570:4;45557:12;:18::i;:::-;43102:16;43113:4;43102:10;:16::i;:::-;45588:25:::1;45599:4;45605:7;45588:10;:25::i;:::-;45474:147:::0;;;:::o;7804:93::-;7862:5;7887:2;7880:9;;7804:93;:::o;46618:218::-;46725:12;:10;:12::i;:::-;46714:23;;:7;:23;;;46706:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;46802:26;46814:4;46820:7;46802:11;:26::i;:::-;46618:218;;:::o;10644:238::-;10732:4;10749:13;10765:12;:10;:12::i;:::-;10749:28;;10788:64;10797:5;10804:7;10841:10;10813:25;10823:5;10830:7;10813:9;:25::i;:::-;:38;;;;:::i;:::-;10788:8;:64::i;:::-;10870:4;10863:11;;;10644:238;;;;:::o;53093:67::-;52437:31;42656:4;51824:18;;52457:10;52437:7;:31::i;:::-;52429:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;53142:10:::1;:8;:10::i;:::-;53093:67::o:0;53186:165::-;52553:33;51888:25;52575:10;52553:7;:33::i;:::-;52545:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;50210:19:::1;:17;:19::i;:::-;53296:1:::2;53282:16;;:2;:16;;::::0;53274:41:::2;;;;;;;;;;;;:::i;:::-;;;;;;;;;53326:17;53332:2;53336:6;53326:5;:17::i;:::-;53186:165:::0;;:::o;50605:86::-;50652:4;50676:7;;;;;;;;;;;50669:14;;50605:86;:::o;52655:201::-;52437:31;42656:4;51824:18;;52457:10;52437:7;:31::i;:::-;52429:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;52749:1:::1;52730:21;;:7;:21;;::::0;52722:46:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;52779:32;51888:25;52803:7;52779:9;:32::i;:::-;52840:7;52827:21;;;;;;;;;;;;52655:201:::0;:::o;8133:127::-;8207:7;8234:9;:18;8244:7;8234:18;;;;;;;;;;;;;;;;8227:25;;8133:127;;;:::o;51787:55::-;42656:4;51824:18;;51787:55;:::o;53022:63::-;52437:31;42656:4;51824:18;;52457:10;52437:7;:31::i;:::-;52429:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;53069:8:::1;:6;:8::i;:::-;53022:63::o:0;43506:147::-;43592:4;43616:6;:12;43623:4;43616:12;;;;;;;;;;;:20;;:29;43637:7;43616:29;;;;;;;;;;;;;;;;;;;;;;;;;43609:36;;43506:147;;;;:::o;7052:104::-;7108:13;7141:7;7134:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7052:104;:::o;53359:186::-;52553:33;51888:25;52575:10;52553:7;:33::i;:::-;52545:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;50210:19:::1;:17;:19::i;:::-;53476:6:::2;53457:15;53467:4;53457:9;:15::i;:::-;:25;;53449:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;53518:19;53524:4;53530:6;53518:5;:19::i;:::-;53359:186:::0;;:::o;53872:119::-;53929:4;53953:30;51888:25;53975:7;53953;:30::i;:::-;53946:37;;53872:119;;;:::o;42611:49::-;42656:4;42611:49;;;:::o;11385:436::-;11478:4;11495:13;11511:12;:10;:12::i;:::-;11495:28;;11534:24;11561:25;11571:5;11578:7;11561:9;:25::i;:::-;11534:52;;11625:15;11605:16;:35;;11597:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;11718:60;11727:5;11734:7;11762:15;11743:16;:34;11718:8;:60::i;:::-;11809:4;11802:11;;;;11385:436;;;;:::o;8466:193::-;8545:4;8562:13;8578:12;:10;:12::i;:::-;8562:28;;8601;8611:5;8618:2;8622:6;8601:9;:28::i;:::-;8647:4;8640:11;;;8466:193;;;;:::o;45914:149::-;45998:18;46011:4;45998:12;:18::i;:::-;43102:16;43113:4;43102:10;:16::i;:::-;46029:26:::1;46041:4;46047:7;46029:11;:26::i;:::-;45914:149:::0;;;:::o;8722:151::-;8811:7;8838:11;:18;8850:5;8838:18;;;;;;;;;;;;;;;:27;8857:7;8838:27;;;;;;;;;;;;;;;;8831:34;;8722:151;;;;:::o;40289:157::-;40374:4;40413:25;40398:40;;;:11;:40;;;;40391:47;;40289:157;;;:::o;4418:98::-;4471:7;4498:10;4491:17;;4418:98;:::o;15378:346::-;15497:1;15480:19;;:5;:19;;;15472:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15578:1;15559:21;;:7;:21;;;15551:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15662:6;15632:11;:18;15644:5;15632:18;;;;;;;;;;;;;;;:27;15651:7;15632:27;;;;;;;;;;;;;;;:36;;;;15700:7;15684:32;;15693:5;15684:32;;;15709:6;15684:32;;;;;;:::i;:::-;;;;;;;;15378:346;;;:::o;16015:419::-;16116:24;16143:25;16153:5;16160:7;16143:9;:25::i;:::-;16116:52;;16203:17;16183:16;:37;16179:248;;16265:6;16245:16;:26;;16237:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;16349:51;16358:5;16365:7;16393:6;16374:16;:25;16349:8;:51::i;:::-;16179:248;16105:329;16015:419;;;:::o;12291:806::-;12404:1;12388:18;;:4;:18;;;12380:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12481:1;12467:16;;:2;:16;;;12459:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;12536:38;12557:4;12563:2;12567:6;12536:20;:38::i;:::-;12587:19;12609:9;:15;12619:4;12609:15;;;;;;;;;;;;;;;;12587:37;;12658:6;12643:11;:21;;12635:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;12775:6;12761:11;:20;12743:9;:15;12753:4;12743:15;;;;;;;;;;;;;;;:38;;;;12978:6;12961:9;:13;12971:2;12961:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;13028:2;13013:26;;13022:4;13013:26;;;13032:6;13013:26;;;;;;:::i;:::-;;;;;;;;13052:37;13072:4;13078:2;13082:6;13052:19;:37::i;:::-;12369:728;12291:806;;;:::o;43957:105::-;44024:30;44035:4;44041:12;:10;:12::i;:::-;44024:10;:30::i;:::-;43957:105;:::o;48215:238::-;48299:22;48307:4;48313:7;48299;:22::i;:::-;48294:152;;48370:4;48338:6;:12;48345:4;48338:12;;;;;;;;;;;:20;;:29;48359:7;48338:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;48421:12;:10;:12::i;:::-;48394:40;;48412:7;48394:40;;48406:4;48394:40;;;;;;;;;;48294:152;48215:238;;:::o;48633:239::-;48717:22;48725:4;48731:7;48717;:22::i;:::-;48713:152;;;48788:5;48756:6;:12;48763:4;48756:12;;;;;;;;;;;:20;;:29;48777:7;48756:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;48840:12;:10;:12::i;:::-;48813:40;;48831:7;48813:40;;48825:4;48813:40;;;;;;;;;;48713:152;48633:239;;:::o;51460:120::-;50469:16;:14;:16::i;:::-;51529:5:::1;51519:7;;:15;;;;;;;;;;;;;;;;;;51550:22;51559:12;:10;:12::i;:::-;51550:22;;;;;;:::i;:::-;;;;;;;;51460:120::o:0;50764:108::-;50835:8;:6;:8::i;:::-;50834:9;50826:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;50764:108::o;13384:548::-;13487:1;13468:21;;:7;:21;;;13460:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;13538:49;13567:1;13571:7;13580:6;13538:20;:49::i;:::-;13616:6;13600:12;;:22;;;;;;;:::i;:::-;;;;;;;;13793:6;13771:9;:18;13781:7;13771:18;;;;;;;;;;;;;;;;:28;;;;;;;;;;;13847:7;13826:37;;13843:1;13826:37;;;13856:6;13826:37;;;;;;:::i;:::-;;;;;;;;13876:48;13904:1;13908:7;13917:6;13876:19;:48::i;:::-;13384:548;;:::o;51201:118::-;50210:19;:17;:19::i;:::-;51271:4:::1;51261:7;;:14;;;;;;;;;;;;;;;;;;51291:20;51298:12;:10;:12::i;:::-;51291:20;;;;;;:::i;:::-;;;;;;;;51201:118::o:0;14265:675::-;14368:1;14349:21;;:7;:21;;;14341:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;14421:49;14442:7;14459:1;14463:6;14421:20;:49::i;:::-;14483:22;14508:9;:18;14518:7;14508:18;;;;;;;;;;;;;;;;14483:43;;14563:6;14545:14;:24;;14537:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;14682:6;14665:14;:23;14644:9;:18;14654:7;14644:18;;;;;;;;;;;;;;;:44;;;;14799:6;14783:12;;:22;;;;;;;;;;;14860:1;14834:37;;14843:7;14834:37;;;14864:6;14834:37;;;;;;:::i;:::-;;;;;;;;14884:48;14904:7;14921:1;14925:6;14884:19;:48::i;:::-;14330:610;14265:675;;:::o;53599:242::-;53750:8;:6;:8::i;:::-;53749:9;53741:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;53789:44;53816:4;53822:2;53826:6;53789:26;:44::i;:::-;53599:242;;;:::o;17729:90::-;;;;:::o;44352:492::-;44441:22;44449:4;44455:7;44441;:22::i;:::-;44436:401;;44629:28;44649:7;44629:19;:28::i;:::-;44730:38;44758:4;44750:13;;44765:2;44730:19;:38::i;:::-;44534:257;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44480:345;;;;;;;;;;;:::i;:::-;;;;;;;;44436:401;44352:492;;:::o;50949:108::-;51016:8;:6;:8::i;:::-;51008:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;50949:108::o;17034:91::-;;;;:::o;38015:151::-;38073:13;38106:52;38134:4;38118:22;;35890:2;38106:52;;:11;:52::i;:::-;38099:59;;38015:151;;;:::o;37411:447::-;37486:13;37512:19;37557:1;37548:6;37544:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;37534:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37512:47;;37570:15;:6;37577:1;37570:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;37596;:6;37603:1;37596:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;37627:9;37652:1;37643:6;37639:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;37627:26;;37622:131;37659:1;37655;:5;37622:131;;;37694:8;37711:3;37703:5;:11;37694:21;;;;;;;:::i;:::-;;;;;37682:6;37689:1;37682:9;;;;;;;;:::i;:::-;;;;;:33;;;;;;;;;;;37740:1;37730:11;;;;;37662:3;;;;:::i;:::-;;;37622:131;;;;37780:1;37771:5;:10;37763:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;37843:6;37829:21;;;37411:447;;;;:::o;88:117:1:-;197:1;194;187:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:139::-;1887:6;1882:3;1877;1871:23;1928:1;1919:6;1914:3;1910:16;1903:27;1798:139;;;:::o;1943:102::-;1984:6;2035:2;2031:7;2026:2;2019:5;2015:14;2011:28;2001:38;;1943:102;;;:::o;2051:377::-;2139:3;2167:39;2200:5;2167:39;:::i;:::-;2222:71;2286:6;2281:3;2222:71;:::i;:::-;2215:78;;2302:65;2360:6;2355:3;2348:4;2341:5;2337:16;2302:65;:::i;:::-;2392:29;2414:6;2392:29;:::i;:::-;2387:3;2383:39;2376:46;;2143:285;2051:377;;;;:::o;2434:313::-;2547:4;2585:2;2574:9;2570:18;2562:26;;2634:9;2628:4;2624:20;2620:1;2609:9;2605:17;2598:47;2662:78;2735:4;2726:6;2662:78;:::i;:::-;2654:86;;2434:313;;;;:::o;2753:126::-;2790:7;2830:42;2823:5;2819:54;2808:65;;2753:126;;;:::o;2885:96::-;2922:7;2951:24;2969:5;2951:24;:::i;:::-;2940:35;;2885:96;;;:::o;2987:122::-;3060:24;3078:5;3060:24;:::i;:::-;3053:5;3050:35;3040:63;;3099:1;3096;3089:12;3040:63;2987:122;:::o;3115:139::-;3161:5;3199:6;3186:20;3177:29;;3215:33;3242:5;3215:33;:::i;:::-;3115:139;;;;:::o;3260:77::-;3297:7;3326:5;3315:16;;3260:77;;;:::o;3343:122::-;3416:24;3434:5;3416:24;:::i;:::-;3409:5;3406:35;3396:63;;3455:1;3452;3445:12;3396:63;3343:122;:::o;3471:139::-;3517:5;3555:6;3542:20;3533:29;;3571:33;3598:5;3571:33;:::i;:::-;3471:139;;;;:::o;3616:474::-;3684:6;3692;3741:2;3729:9;3720:7;3716:23;3712:32;3709:119;;;3747:79;;:::i;:::-;3709:119;3867:1;3892:53;3937:7;3928:6;3917:9;3913:22;3892:53;:::i;:::-;3882:63;;3838:117;3994:2;4020:53;4065:7;4056:6;4045:9;4041:22;4020:53;:::i;:::-;4010:63;;3965:118;3616:474;;;;;:::o;4096:118::-;4183:24;4201:5;4183:24;:::i;:::-;4178:3;4171:37;4096:118;;:::o;4220:222::-;4313:4;4351:2;4340:9;4336:18;4328:26;;4364:71;4432:1;4421:9;4417:17;4408:6;4364:71;:::i;:::-;4220:222;;;;:::o;4448:77::-;4485:7;4514:5;4503:16;;4448:77;;;:::o;4531:118::-;4618:24;4636:5;4618:24;:::i;:::-;4613:3;4606:37;4531:118;;:::o;4655:222::-;4748:4;4786:2;4775:9;4771:18;4763:26;;4799:71;4867:1;4856:9;4852:17;4843:6;4799:71;:::i;:::-;4655:222;;;;:::o;4883:329::-;4942:6;4991:2;4979:9;4970:7;4966:23;4962:32;4959:119;;;4997:79;;:::i;:::-;4959:119;5117:1;5142:53;5187:7;5178:6;5167:9;5163:22;5142:53;:::i;:::-;5132:63;;5088:117;4883:329;;;;:::o;5218:619::-;5295:6;5303;5311;5360:2;5348:9;5339:7;5335:23;5331:32;5328:119;;;5366:79;;:::i;:::-;5328:119;5486:1;5511:53;5556:7;5547:6;5536:9;5532:22;5511:53;:::i;:::-;5501:63;;5457:117;5613:2;5639:53;5684:7;5675:6;5664:9;5660:22;5639:53;:::i;:::-;5629:63;;5584:118;5741:2;5767:53;5812:7;5803:6;5792:9;5788:22;5767:53;:::i;:::-;5757:63;;5712:118;5218:619;;;;;:::o;5843:122::-;5916:24;5934:5;5916:24;:::i;:::-;5909:5;5906:35;5896:63;;5955:1;5952;5945:12;5896:63;5843:122;:::o;5971:139::-;6017:5;6055:6;6042:20;6033:29;;6071:33;6098:5;6071:33;:::i;:::-;5971:139;;;;:::o;6116:329::-;6175:6;6224:2;6212:9;6203:7;6199:23;6195:32;6192:119;;;6230:79;;:::i;:::-;6192:119;6350:1;6375:53;6420:7;6411:6;6400:9;6396:22;6375:53;:::i;:::-;6365:63;;6321:117;6116:329;;;;:::o;6451:474::-;6519:6;6527;6576:2;6564:9;6555:7;6551:23;6547:32;6544:119;;;6582:79;;:::i;:::-;6544:119;6702:1;6727:53;6772:7;6763:6;6752:9;6748:22;6727:53;:::i;:::-;6717:63;;6673:117;6829:2;6855:53;6900:7;6891:6;6880:9;6876:22;6855:53;:::i;:::-;6845:63;;6800:118;6451:474;;;;;:::o;6931:86::-;6966:7;7006:4;6999:5;6995:16;6984:27;;6931:86;;;:::o;7023:112::-;7106:22;7122:5;7106:22;:::i;:::-;7101:3;7094:35;7023:112;;:::o;7141:214::-;7230:4;7268:2;7257:9;7253:18;7245:26;;7281:67;7345:1;7334:9;7330:17;7321:6;7281:67;:::i;:::-;7141:214;;;;:::o;7361:474::-;7429:6;7437;7486:2;7474:9;7465:7;7461:23;7457:32;7454:119;;;7492:79;;:::i;:::-;7454:119;7612:1;7637:53;7682:7;7673:6;7662:9;7658:22;7637:53;:::i;:::-;7627:63;;7583:117;7739:2;7765:53;7810:7;7801:6;7790:9;7786:22;7765:53;:::i;:::-;7755:63;;7710:118;7361:474;;;;;:::o;7841:180::-;7889:77;7886:1;7879:88;7986:4;7983:1;7976:15;8010:4;8007:1;8000:15;8027:320;8071:6;8108:1;8102:4;8098:12;8088:22;;8155:1;8149:4;8145:12;8176:18;8166:81;;8232:4;8224:6;8220:17;8210:27;;8166:81;8294:2;8286:6;8283:14;8263:18;8260:38;8257:84;;8313:18;;:::i;:::-;8257:84;8078:269;8027:320;;;:::o;8353:160::-;8493:12;8489:1;8481:6;8477:14;8470:36;8353:160;:::o;8519:366::-;8661:3;8682:67;8746:2;8741:3;8682:67;:::i;:::-;8675:74;;8758:93;8847:3;8758:93;:::i;:::-;8876:2;8871:3;8867:12;8860:19;;8519:366;;;:::o;8891:419::-;9057:4;9095:2;9084:9;9080:18;9072:26;;9144:9;9138:4;9134:20;9130:1;9119:9;9115:17;9108:47;9172:131;9298:4;9172:131;:::i;:::-;9164:139;;8891:419;;;:::o;9316:234::-;9456:34;9452:1;9444:6;9440:14;9433:58;9525:17;9520:2;9512:6;9508:15;9501:42;9316:234;:::o;9556:366::-;9698:3;9719:67;9783:2;9778:3;9719:67;:::i;:::-;9712:74;;9795:93;9884:3;9795:93;:::i;:::-;9913:2;9908:3;9904:12;9897:19;;9556:366;;;:::o;9928:419::-;10094:4;10132:2;10121:9;10117:18;10109:26;;10181:9;10175:4;10171:20;10167:1;10156:9;10152:17;10145:47;10209:131;10335:4;10209:131;:::i;:::-;10201:139;;9928:419;;;:::o;10353:180::-;10401:77;10398:1;10391:88;10498:4;10495:1;10488:15;10522:4;10519:1;10512:15;10539:191;10579:3;10598:20;10616:1;10598:20;:::i;:::-;10593:25;;10632:20;10650:1;10632:20;:::i;:::-;10627:25;;10675:1;10672;10668:9;10661:16;;10696:3;10693:1;10690:10;10687:36;;;10703:18;;:::i;:::-;10687:36;10539:191;;;;:::o;10736:162::-;10876:14;10872:1;10864:6;10860:14;10853:38;10736:162;:::o;10904:366::-;11046:3;11067:67;11131:2;11126:3;11067:67;:::i;:::-;11060:74;;11143:93;11232:3;11143:93;:::i;:::-;11261:2;11256:3;11252:12;11245:19;;10904:366;;;:::o;11276:419::-;11442:4;11480:2;11469:9;11465:18;11457:26;;11529:9;11523:4;11519:20;11515:1;11504:9;11500:17;11493:47;11557:131;11683:4;11557:131;:::i;:::-;11549:139;;11276:419;;;:::o;11701:162::-;11841:14;11837:1;11829:6;11825:14;11818:38;11701:162;:::o;11869:366::-;12011:3;12032:67;12096:2;12091:3;12032:67;:::i;:::-;12025:74;;12108:93;12197:3;12108:93;:::i;:::-;12226:2;12221:3;12217:12;12210:19;;11869:366;;;:::o;12241:419::-;12407:4;12445:2;12434:9;12430:18;12422:26;;12494:9;12488:4;12484:20;12480:1;12469:9;12465:17;12458:47;12522:131;12648:4;12522:131;:::i;:::-;12514:139;;12241:419;;;:::o;12666:162::-;12806:14;12802:1;12794:6;12790:14;12783:38;12666:162;:::o;12834:366::-;12976:3;12997:67;13061:2;13056:3;12997:67;:::i;:::-;12990:74;;13073:93;13162:3;13073:93;:::i;:::-;13191:2;13186:3;13182:12;13175:19;;12834:366;;;:::o;13206:419::-;13372:4;13410:2;13399:9;13395:18;13387:26;;13459:9;13453:4;13449:20;13445:1;13434:9;13430:17;13423:47;13487:131;13613:4;13487:131;:::i;:::-;13479:139;;13206:419;;;:::o;13631:170::-;13771:22;13767:1;13759:6;13755:14;13748:46;13631:170;:::o;13807:366::-;13949:3;13970:67;14034:2;14029:3;13970:67;:::i;:::-;13963:74;;14046:93;14135:3;14046:93;:::i;:::-;14164:2;14159:3;14155:12;14148:19;;13807:366;;;:::o;14179:419::-;14345:4;14383:2;14372:9;14368:18;14360:26;;14432:9;14426:4;14422:20;14418:1;14407:9;14403:17;14396:47;14460:131;14586:4;14460:131;:::i;:::-;14452:139;;14179:419;;;:::o;14604:224::-;14744:34;14740:1;14732:6;14728:14;14721:58;14813:7;14808:2;14800:6;14796:15;14789:32;14604:224;:::o;14834:366::-;14976:3;14997:67;15061:2;15056:3;14997:67;:::i;:::-;14990:74;;15073:93;15162:3;15073:93;:::i;:::-;15191:2;15186:3;15182:12;15175:19;;14834:366;;;:::o;15206:419::-;15372:4;15410:2;15399:9;15395:18;15387:26;;15459:9;15453:4;15449:20;15445:1;15434:9;15430:17;15423:47;15487:131;15613:4;15487:131;:::i;:::-;15479:139;;15206:419;;;:::o;15631:223::-;15771:34;15767:1;15759:6;15755:14;15748:58;15840:6;15835:2;15827:6;15823:15;15816:31;15631:223;:::o;15860:366::-;16002:3;16023:67;16087:2;16082:3;16023:67;:::i;:::-;16016:74;;16099:93;16188:3;16099:93;:::i;:::-;16217:2;16212:3;16208:12;16201:19;;15860:366;;;:::o;16232:419::-;16398:4;16436:2;16425:9;16421:18;16413:26;;16485:9;16479:4;16475:20;16471:1;16460:9;16456:17;16449:47;16513:131;16639:4;16513:131;:::i;:::-;16505:139;;16232:419;;;:::o;16657:221::-;16797:34;16793:1;16785:6;16781:14;16774:58;16866:4;16861:2;16853:6;16849:15;16842:29;16657:221;:::o;16884:366::-;17026:3;17047:67;17111:2;17106:3;17047:67;:::i;:::-;17040:74;;17123:93;17212:3;17123:93;:::i;:::-;17241:2;17236:3;17232:12;17225:19;;16884:366;;;:::o;17256:419::-;17422:4;17460:2;17449:9;17445:18;17437:26;;17509:9;17503:4;17499:20;17495:1;17484:9;17480:17;17473:47;17537:131;17663:4;17537:131;:::i;:::-;17529:139;;17256:419;;;:::o;17681:179::-;17821:31;17817:1;17809:6;17805:14;17798:55;17681:179;:::o;17866:366::-;18008:3;18029:67;18093:2;18088:3;18029:67;:::i;:::-;18022:74;;18105:93;18194:3;18105:93;:::i;:::-;18223:2;18218:3;18214:12;18207:19;;17866:366;;;:::o;18238:419::-;18404:4;18442:2;18431:9;18427:18;18419:26;;18491:9;18485:4;18481:20;18477:1;18466:9;18462:17;18455:47;18519:131;18645:4;18519:131;:::i;:::-;18511:139;;18238:419;;;:::o;18663:224::-;18803:34;18799:1;18791:6;18787:14;18780:58;18872:7;18867:2;18859:6;18855:15;18848:32;18663:224;:::o;18893:366::-;19035:3;19056:67;19120:2;19115:3;19056:67;:::i;:::-;19049:74;;19132:93;19221:3;19132:93;:::i;:::-;19250:2;19245:3;19241:12;19234:19;;18893:366;;;:::o;19265:419::-;19431:4;19469:2;19458:9;19454:18;19446:26;;19518:9;19512:4;19508:20;19504:1;19493:9;19489:17;19482:47;19546:131;19672:4;19546:131;:::i;:::-;19538:139;;19265:419;;;:::o;19690:222::-;19830:34;19826:1;19818:6;19814:14;19807:58;19899:5;19894:2;19886:6;19882:15;19875:30;19690:222;:::o;19918:366::-;20060:3;20081:67;20145:2;20140:3;20081:67;:::i;:::-;20074:74;;20157:93;20246:3;20157:93;:::i;:::-;20275:2;20270:3;20266:12;20259:19;;19918:366;;;:::o;20290:419::-;20456:4;20494:2;20483:9;20479:18;20471:26;;20543:9;20537:4;20533:20;20529:1;20518:9;20514:17;20507:47;20571:131;20697:4;20571:131;:::i;:::-;20563:139;;20290:419;;;:::o;20715:225::-;20855:34;20851:1;20843:6;20839:14;20832:58;20924:8;20919:2;20911:6;20907:15;20900:33;20715:225;:::o;20946:366::-;21088:3;21109:67;21173:2;21168:3;21109:67;:::i;:::-;21102:74;;21185:93;21274:3;21185:93;:::i;:::-;21303:2;21298:3;21294:12;21287:19;;20946:366;;;:::o;21318:419::-;21484:4;21522:2;21511:9;21507:18;21499:26;;21571:9;21565:4;21561:20;21557:1;21546:9;21542:17;21535:47;21599:131;21725:4;21599:131;:::i;:::-;21591:139;;21318:419;;;:::o;21743:118::-;21830:24;21848:5;21830:24;:::i;:::-;21825:3;21818:37;21743:118;;:::o;21867:222::-;21960:4;21998:2;21987:9;21983:18;21975:26;;22011:71;22079:1;22068:9;22064:17;22055:6;22011:71;:::i;:::-;21867:222;;;;:::o;22095:166::-;22235:18;22231:1;22223:6;22219:14;22212:42;22095:166;:::o;22267:366::-;22409:3;22430:67;22494:2;22489:3;22430:67;:::i;:::-;22423:74;;22506:93;22595:3;22506:93;:::i;:::-;22624:2;22619:3;22615:12;22608:19;;22267:366;;;:::o;22639:419::-;22805:4;22843:2;22832:9;22828:18;22820:26;;22892:9;22886:4;22882:20;22878:1;22867:9;22863:17;22856:47;22920:131;23046:4;22920:131;:::i;:::-;22912:139;;22639:419;;;:::o;23064:181::-;23204:33;23200:1;23192:6;23188:14;23181:57;23064:181;:::o;23251:366::-;23393:3;23414:67;23478:2;23473:3;23414:67;:::i;:::-;23407:74;;23490:93;23579:3;23490:93;:::i;:::-;23608:2;23603:3;23599:12;23592:19;;23251:366;;;:::o;23623:419::-;23789:4;23827:2;23816:9;23812:18;23804:26;;23876:9;23870:4;23866:20;23862:1;23851:9;23847:17;23840:47;23904:131;24030:4;23904:131;:::i;:::-;23896:139;;23623:419;;;:::o;24048:220::-;24188:34;24184:1;24176:6;24172:14;24165:58;24257:3;24252:2;24244:6;24240:15;24233:28;24048:220;:::o;24274:366::-;24416:3;24437:67;24501:2;24496:3;24437:67;:::i;:::-;24430:74;;24513:93;24602:3;24513:93;:::i;:::-;24631:2;24626:3;24622:12;24615:19;;24274:366;;;:::o;24646:419::-;24812:4;24850:2;24839:9;24835:18;24827:26;;24899:9;24893:4;24889:20;24885:1;24874:9;24870:17;24863:47;24927:131;25053:4;24927:131;:::i;:::-;24919:139;;24646:419;;;:::o;25071:221::-;25211:34;25207:1;25199:6;25195:14;25188:58;25280:4;25275:2;25267:6;25263:15;25256:29;25071:221;:::o;25298:366::-;25440:3;25461:67;25525:2;25520:3;25461:67;:::i;:::-;25454:74;;25537:93;25626:3;25537:93;:::i;:::-;25655:2;25650:3;25646:12;25639:19;;25298:366;;;:::o;25670:419::-;25836:4;25874:2;25863:9;25859:18;25851:26;;25923:9;25917:4;25913:20;25909:1;25898:9;25894:17;25887:47;25951:131;26077:4;25951:131;:::i;:::-;25943:139;;25670:419;;;:::o;26095:165::-;26235:17;26231:1;26223:6;26219:14;26212:41;26095:165;:::o;26266:366::-;26408:3;26429:67;26493:2;26488:3;26429:67;:::i;:::-;26422:74;;26505:93;26594:3;26505:93;:::i;:::-;26623:2;26618:3;26614:12;26607:19;;26266:366;;;:::o;26638:419::-;26804:4;26842:2;26831:9;26827:18;26819:26;;26891:9;26885:4;26881:20;26877:1;26866:9;26862:17;26855:47;26919:131;27045:4;26919:131;:::i;:::-;26911:139;;26638:419;;;:::o;27063:148::-;27165:11;27202:3;27187:18;;27063:148;;;;:::o;27217:173::-;27357:25;27353:1;27345:6;27341:14;27334:49;27217:173;:::o;27396:402::-;27556:3;27577:85;27659:2;27654:3;27577:85;:::i;:::-;27570:92;;27671:93;27760:3;27671:93;:::i;:::-;27789:2;27784:3;27780:12;27773:19;;27396:402;;;:::o;27804:390::-;27910:3;27938:39;27971:5;27938:39;:::i;:::-;27993:89;28075:6;28070:3;27993:89;:::i;:::-;27986:96;;28091:65;28149:6;28144:3;28137:4;28130:5;28126:16;28091:65;:::i;:::-;28181:6;28176:3;28172:16;28165:23;;27914:280;27804:390;;;;:::o;28200:167::-;28340:19;28336:1;28328:6;28324:14;28317:43;28200:167;:::o;28373:402::-;28533:3;28554:85;28636:2;28631:3;28554:85;:::i;:::-;28547:92;;28648:93;28737:3;28648:93;:::i;:::-;28766:2;28761:3;28757:12;28750:19;;28373:402;;;:::o;28781:967::-;29163:3;29185:148;29329:3;29185:148;:::i;:::-;29178:155;;29350:95;29441:3;29432:6;29350:95;:::i;:::-;29343:102;;29462:148;29606:3;29462:148;:::i;:::-;29455:155;;29627:95;29718:3;29709:6;29627:95;:::i;:::-;29620:102;;29739:3;29732:10;;28781:967;;;;;:::o;29754:170::-;29894:22;29890:1;29882:6;29878:14;29871:46;29754:170;:::o;29930:366::-;30072:3;30093:67;30157:2;30152:3;30093:67;:::i;:::-;30086:74;;30169:93;30258:3;30169:93;:::i;:::-;30287:2;30282:3;30278:12;30271:19;;29930:366;;;:::o;30302:419::-;30468:4;30506:2;30495:9;30491:18;30483:26;;30555:9;30549:4;30545:20;30541:1;30530:9;30526:17;30519:47;30583:131;30709:4;30583:131;:::i;:::-;30575:139;;30302:419;;;:::o;30727:410::-;30767:7;30790:20;30808:1;30790:20;:::i;:::-;30785:25;;30824:20;30842:1;30824:20;:::i;:::-;30819:25;;30879:1;30876;30872:9;30901:30;30919:11;30901:30;:::i;:::-;30890:41;;31080:1;31071:7;31067:15;31064:1;31061:22;31041:1;31034:9;31014:83;30991:139;;31110:18;;:::i;:::-;30991:139;30775:362;30727:410;;;;:::o;31143:180::-;31191:77;31188:1;31181:88;31288:4;31285:1;31278:15;31312:4;31309:1;31302:15;31329:180;31377:77;31374:1;31367:88;31474:4;31471:1;31464:15;31498:4;31495:1;31488:15;31515:171;31554:3;31577:24;31595:5;31577:24;:::i;:::-;31568:33;;31623:4;31616:5;31613:15;31610:41;;31631:18;;:::i;:::-;31610:41;31678:1;31671:5;31667:13;31660:20;;31515:171;;;:::o;31692:182::-;31832:34;31828:1;31820:6;31816:14;31809:58;31692:182;:::o;31880:366::-;32022:3;32043:67;32107:2;32102:3;32043:67;:::i;:::-;32036:74;;32119:93;32208:3;32119:93;:::i;:::-;32237:2;32232:3;32228:12;32221:19;;31880:366;;;:::o;32252:419::-;32418:4;32456:2;32445:9;32441:18;32433:26;;32505:9;32499:4;32495:20;32491:1;32480:9;32476:17;32469:47;32533:131;32659:4;32533:131;:::i;:::-;32525:139;;32252:419;;;:::o
Swarm Source
ipfs://c8bcd1840248e19b8ad7c0cfb2cc982d42433a950e070f0fa2554406c4807e02
Loading...
Loading
Loading...
Loading
Loading...
Loading
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.