Contract 0x910524678C0B1B23FFB9285a81f99C29C11CBaEd 4

 
Ad
Crypto.com
Txn Hash Method
Block
From
To
Value
0x55147961e6bbff4e2baa1c001e71f2ba2161b1b2aeefbbd9d20d6d0178095b14Approve132457732021-09-17 21:55:131 hr 7 mins ago0x5d3c6bc0b0740d23ce83cbfd2a369adbe841b83b IN  Doki Doki Finance: AZUKI Token0 Ether0.00244326727 52.401391284
0x4621be0a63940fc155b40024edc23f640a28db17f215aafa2941a6ce52b1b628Approve132426232021-09-17 10:17:2412 hrs 44 mins ago0x952cba0395596eae0ce7767fe915586080e530f5 IN  Doki Doki Finance: AZUKI Token0 Ether0.002568646403 55.090430298
0xbc80875fe3180c87df09ed72db37993b76e275c8fd91d02b4dc1a0a6948b19e4Transfer132415392021-09-17 6:09:3516 hrs 52 mins ago0x26da21460541eaf66b6b7b254b2505539b544c44 IN  Doki Doki Finance: AZUKI Token0 Ether0.002227226156.1
0x5dda3fe10ec8b484fbf982482cabf6e3424814e24940a32853a0f9fd98e0487cTransfer132379972021-09-16 16:56:111 day 6 hrs ago0x26da21460541eaf66b6b7b254b2505539b544c44 IN  Doki Doki Finance: AZUKI Token0 Ether0.005148840483.6
0x6189757c106b41ce607d1dd62b6bb1392dc3df9d9b9c7817090c16de43d5e21fApprove132374052021-09-16 14:52:221 day 8 hrs ago0x86dcf74222d959796fdb23a05cebcc79b0a2a71e IN  Doki Doki Finance: AZUKI Token0 Ether0.004393634889 94.231435035
0x830425ed3bbb8d8dc199a9939961575cffa7765380c07f18d3e204eb25bd24d5Approve132373372021-09-16 14:35:091 day 8 hrs ago0x86dcf74222d959796fdb23a05cebcc79b0a2a71e IN  Doki Doki Finance: AZUKI Token0 Ether0.003276070695 70.26274387
0xa3e97ffa397593c2b4336ad1a77a99ecd90112de1589fa7917eaa71a18384381Approve132353052021-09-16 7:04:161 day 15 hrs ago0x26da21460541eaf66b6b7b254b2505539b544c44 IN  Doki Doki Finance: AZUKI Token0 Ether0.002702904658.3
0x391edfaae9d2a9e18b20becb7606d44667a28b7ac3672dc1d38e7b47843c29e8Approve132346032021-09-16 4:25:471 day 18 hrs ago0x9bf9a944613aa1b14f11edfb6ff1f9b27065c952 IN  Doki Doki Finance: AZUKI Token0 Ether0.00373008006880.000001459
0x3c296658a16ee069f9bf5cbee82a9bce7cce8e7c3b62b86af22d68991bdadeaeTransfer132345662021-09-16 4:16:361 day 18 hrs agoHotbit 3 IN  Doki Doki Finance: AZUKI Token0 Ether0.00480265501177.9943
0x97812112019e7e3377546c6a167a66ab622c413c31e1596dd756bcdd9090351dTransfer132296612021-09-15 10:04:002 days 12 hrs ago0xe642674348c4578f09a822dd79a9a96a58d85706 IN  Doki Doki Finance: AZUKI Token0 Ether0.002230937625 39.284678817
0x10d2d7982f9cfb87d100842ad620cde224d80bb88252279dcaca52deedd88e16Burn132279062021-09-15 3:34:392 days 19 hrs ago0x6dc9950905baca54ccc97e4a0d0f24d9611b46ef IN  Doki Doki Finance: AZUKI Token0 Ether0.001707661474 49.570712485
0xd26b3295ae12b56b27a4bc1196716818ab1f02ce4cdd9392cf71b3527e4d7338Burn132278972021-09-15 3:32:482 days 19 hrs ago0x6dc9950905baca54ccc97e4a0d0f24d9611b46ef IN  Doki Doki Finance: AZUKI Token0 Ether0.002258059292 65.662255164
0x5399848b62408843e78a31be3caa10c751ff3c10c8fbd4418a2e4125a0398d20Approve132278512021-09-15 3:19:452 days 19 hrs ago0x48cc7900a1fd29ad3d4b2bee805c70ba7ca0730f IN  Doki Doki Finance: AZUKI Token0 Ether0.001752402103 37.584225618
0xe297f5bfde3e9ab78a46c19977eb3ed0b48c700e5dd7e597461ac2381b3f0890Transfer132277792021-09-15 3:03:452 days 19 hrs agoHotbit 3 IN  Doki Doki Finance: AZUKI Token0 Ether0.00410276467166.6282
0x227f88e6f96609f6d2db547d54a2cccb9809195b49c403bbe1ab045daa4cb903Transfer132277482021-09-15 2:55:422 days 20 hrs ago0x53cf29336a0c4c3a2cb4d36f44a1a01da2c1080a IN  Doki Doki Finance: AZUKI Token0 Ether0.0018664219547.0404
0xa933e506967d5303f774e2ace71818879bce30cf349f06974d6ec25fad442283Transfer132277442021-09-15 2:54:372 days 20 hrs ago0xc32f713666f36b794912703bd037f3d92daf8b14 IN  Doki Doki Finance: AZUKI Token0 Ether0.00220085539149.483
0xb4d6dbf430773a029374f45d95df102946d3eea254dfc20bdc5181b4b966b101Transfer132277442021-09-15 2:54:372 days 20 hrs ago0xb46f1d9a30ac717e0546e086a300f19c014c54dd IN  Doki Doki Finance: AZUKI Token0 Ether0.00196333699149.483
0xb6830b8fd9c4ecc7394e44a5fd79116fcf262aff07725c2525f5a9509798a8abTransfer132277442021-09-15 2:54:372 days 20 hrs ago0xd21d38398445a93b029282ff277c3bc0a6843a9e IN  Doki Doki Finance: AZUKI Token0 Ether0.002007656250.6
0x8d60199f8d7f6bcf14e500e4ec6766429d4e7c90541d40685f4a1fcebe8a6c37Transfer132257192021-09-14 19:29:353 days 3 hrs ago0x9bf9a944613aa1b14f11edfb6ff1f9b27065c952 IN  Doki Doki Finance: AZUKI Token0 Ether0.00312615030455.060152953
0x837ea0137e8db4e5e5e82e976eab74eb790d6df7d20cc4750c13db2774648354Transfer132256552021-09-14 19:15:583 days 3 hrs ago0x48cc7900a1fd29ad3d4b2bee805c70ba7ca0730f IN  Doki Doki Finance: AZUKI Token0 Ether0.002404996722 60.577736642
0x9278d83c754a23bf0ecf08d4d6f1c1fa805173c51e88c538b91139dfbafb9395Transfer132256502021-09-14 19:15:223 days 3 hrs ago0x48cc7900a1fd29ad3d4b2bee805c70ba7ca0730f IN  Doki Doki Finance: AZUKI Token0 Ether0.004765642391 77.393221359
0x79f822223af793833ef5d7a29e2cf47386792d73ed0c5e803b07f30277d61915Transfer132256462021-09-14 19:14:193 days 3 hrs ago0xf27474cb9bb9419fcf80ca93ee01c449102ec4d1 IN  Doki Doki Finance: AZUKI Token0 Ether0.004559516063 80.322664725
0xb6c92f9522b7ec2b91ba7c885117fb5d2f35b76320f72300bf1655f56104e9bdApprove132246322021-09-14 15:21:393 days 7 hrs ago0x818dd71ef870705b67a4209606e9d6f05d3a5d79 IN  Doki Doki Finance: AZUKI Token0 Ether0.002862385415 61.390327622
0xe3460dbf7b89d29ab2c2ef9d4eb5cea807e54b250b4abb2bfda0fb5cc9dd8237Approve132236172021-09-14 11:35:413 days 11 hrs ago0x818dd71ef870705b67a4209606e9d6f05d3a5d79 IN  Doki Doki Finance: AZUKI Token0 Ether0.002222586777 47.915034225
0x38825ccab7fa8d52a8df22d67e3c89494f3de35dbe32e10ec2f37a2b9f732e1eApprove132236112021-09-14 11:33:453 days 11 hrs ago0xbd39945e1ad3b436e9c57a84004373efce3fd859 IN  Doki Doki Finance: AZUKI Token0 Ether0.001564599301 33.764929463
[ Download CSV Export 

OVERVIEW

$AZUKI is a secondary token created for up-coming Doki Doki NFT DaPP and full-service NFT platform.

View more zero value Internal Transactions in Advanced View mode
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
AzukiToken

Compiler Version
v0.7.4+commit.3f05b770

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-11-08
*/

pragma solidity ^0.7.0;

abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

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

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

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

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

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

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

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

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


library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

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

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

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

contract ERC20 is Context, IERC20 {
    using SafeMath for uint256;
    using Address for address;

    mapping (address => uint256) private _balances;

    mapping (address => mapping (address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;
    uint8 private _decimals;

    /**
     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with
     * a default value of 18.
     *
     * To select a different value for {decimals}, use {_setupDecimals}.
     *
     * All three of these values are immutable: they can only be set once during
     * construction.
     */
    constructor (string memory name, string memory symbol) {
        _name = name;
        _symbol = symbol;
        _decimals = 18;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view 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 value {ERC20} uses, unless {_setupDecimals} is
     * called.
     *
     * 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 returns (uint8) {
        return _decimals;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, 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}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), 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};
     *
     * Requirements:
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        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) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(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) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is 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:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, 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
     *
     * - `to` 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 = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(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);

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens.
     *
     * This is 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 Sets {decimals} to a value other than the default one of 18.
     *
     * WARNING: This function should only be called from the constructor. Most
     * applications that interact with token contracts will not expect
     * {decimals} to ever change, and may work incorrectly if it does.
     */
    function _setupDecimals(uint8 decimals_) internal {
        _decimals = decimals_;
    }

    /**
     * @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 to 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 { }
}


contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

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

contract AzukiToken is ERC20("DokiDokiAzuki", "AZUKI"), Ownable {
    using SafeMath for uint256;
    using Address for address;

    mapping(string => uint) public operationLockTime;
    mapping(string => bool) public operationTimelockEnabled;
    string private MINT = "mint";
    string private TRANSFER = "transfer";
    string private ADDMINTER = "add_minter";
    string private BURNRATE = "burn_rate";
    uint public unlockDuration = 2 days;

    // mint for Owner
    address public mintTo = address(0);
    uint public mintAmount = 0;
    // add mint for Owner
    address public newMinter = address(0);
    uint public newBurnRate = 0;

    mapping(address => bool) public minters;

    // transfer burn
    uint public burnRate = 5;
    mapping(address => bool) public transferBlacklist;
    mapping(address => bool) public transferFromBlacklist;

    event GonnaMint(address to, uint amount, uint releaseTime);
    event GonnaAddMinter(address newMinter, uint releaseTime);
    event GonnaLockTransfer(uint releaseTime);
    event GonnaChangeBurnRate(uint burnRate);

    modifier onlyMinter() {
        require(minters[msg.sender], "Restricted to minters.");
        _;
    }

    function mint(address to, uint amount) public onlyMinter {
        if (operationTimelockEnabled[MINT]) {
            require(msg.sender != owner(), "Sorry, this function has been locked for Owner.");
        }
        _mint(to, amount);
    }

    function burn(uint amount) public {
        require(amount > 0);
        require(balanceOf(msg.sender) >= amount);
        _burn(msg.sender, amount);
    }

    function addMinter(address account) public onlyOwner {
        require(!operationTimelockEnabled[ADDMINTER], "Sorry, this function has been locked for Owner.");
        minters[account] = true;
    }

    function removeMinter(address account) public onlyOwner {
        minters[account] = false;
    }

    function gonnaMint(address to, uint amount) public onlyOwner {
        mintTo = to;
        mintAmount = amount;
        operationLockTime[MINT] = block.timestamp + unlockDuration;

        emit GonnaMint(to, amount, operationLockTime[MINT]);
    }

    function releaseMint() public onlyOwner {
        require(mintAmount != 0, "mint amount can not be 0.");
        require(block.timestamp >= operationLockTime[MINT], "Mint operation is pending.");
        _mint(mintTo, mintAmount);
        mintTo = address(0);
        mintAmount = 0;
    }

    function gonnaAddMinter(address account) public onlyOwner {
        newMinter = account;
        operationLockTime[ADDMINTER] = block.timestamp + unlockDuration;

        emit GonnaAddMinter(account, operationLockTime[ADDMINTER]);
    }

    function releaseNewMinter() public onlyOwner {
        require(newMinter != address(0), "New minter can not be 0x000.");
        require(block.timestamp >= operationLockTime[ADDMINTER], "Add minter operation is pending.");
        minters[newMinter] = true;
        newMinter = address(0);
    }

    function gonnaLockTransfer() public onlyOwner {
        operationLockTime[TRANSFER] = block.timestamp + unlockDuration;

        emit GonnaLockTransfer(operationLockTime[TRANSFER]);
    }

    function releaseTransferLock() public onlyOwner {
        require(!operationTimelockEnabled[TRANSFER], "Transfer is being locked.");
        require(block.timestamp >= operationLockTime[TRANSFER], "Transfer lock operation is pending.");
        operationTimelockEnabled[TRANSFER] = true;
    }

    function unlockTransfer() public onlyOwner {
        operationTimelockEnabled[TRANSFER] = false;
    }

    function gonnaChangeBurnRate(uint newRate) public onlyOwner {
        newBurnRate = newRate;
        operationLockTime[BURNRATE] = block.timestamp + unlockDuration;
        emit GonnaChangeBurnRate(newRate);
    }

    function releaseNewBurnRate() public onlyOwner {
        require(block.timestamp >= operationLockTime[BURNRATE], "Changing to new burning rate is pending.");
        burnRate = newBurnRate;
    }

    function changeTimelockDuration(uint duration) public onlyOwner {
        require(duration >= 1 days, "Duration must be greater than 1 day.");
        unlockDuration = duration;
    }

    function lockMint() public onlyOwner {
        operationTimelockEnabled[MINT] = true;
    }

    function lockAddMinter() public onlyOwner {
        operationTimelockEnabled[ADDMINTER] = true;
    }

    function addToTransferBlacklist(address account) public onlyOwner {
        transferBlacklist[account] = true;
    }

    function removeFromTransferBlacklist(address account) public onlyOwner {
        transferBlacklist[account] = false;
    }

    function addToTransferFromBlacklist(address account) public onlyOwner {
        transferFromBlacklist[account] = true;
    }

    function removeFromTransferFromBlacklist(address account) public onlyOwner {
        transferFromBlacklist[account] = false;
    }

    function transfer(address recipient, uint256 amount) public override returns (bool) {
        require(msg.sender == owner() || !operationTimelockEnabled[TRANSFER], "Transfer is being locked.");
        uint256 burnAmount = 0;
        if (transferBlacklist[msg.sender]) {
            burnAmount = amount.mul(burnRate).div(100);
        }
        uint256 transferAmount = amount.sub(burnAmount);
        require(balanceOf(msg.sender) >= amount, "insufficient balance.");
        super.transfer(recipient, transferAmount);
        if (burnAmount != 0) {
            _burn(msg.sender, burnAmount);
        }
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        require(sender == owner() || !operationTimelockEnabled[TRANSFER], "TransferFrom is being locked.");
        uint256 burnAmount = 0;
        if (transferFromBlacklist[recipient]) {
            burnAmount = amount.mul(burnRate).div(100);
        }
        uint256 transferAmount = amount.sub(burnAmount);
        require(balanceOf(sender) >= amount, "insufficient balance.");
        super.transferFrom(sender, recipient, transferAmount);
        if (burnAmount != 0) {
            _burn(sender, burnAmount);
        }
        return true;
    }
}

Contract Security Audit

Contract ABI

[{"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":false,"internalType":"address","name":"newMinter","type":"address"},{"indexed":false,"internalType":"uint256","name":"releaseTime","type":"uint256"}],"name":"GonnaAddMinter","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"burnRate","type":"uint256"}],"name":"GonnaChangeBurnRate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"releaseTime","type":"uint256"}],"name":"GonnaLockTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"releaseTime","type":"uint256"}],"name":"GonnaMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addToTransferBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addToTransferFromBlacklist","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":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"changeTimelockDuration","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":"address","name":"account","type":"address"}],"name":"gonnaAddMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newRate","type":"uint256"}],"name":"gonnaChangeBurnRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gonnaLockTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"gonnaMint","outputs":[],"stateMutability":"nonpayable","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":[],"name":"lockAddMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintTo","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minters","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"newBurnRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"newMinter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"operationLockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"operationTimelockEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"releaseMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"releaseNewBurnRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"releaseNewMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"releaseTransferLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeFromTransferBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeFromTransferFromBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","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":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"transferBlacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"transferFromBlacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlockDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unlockTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060400160405280600481526020017f6d696e740000000000000000000000000000000000000000000000000000000081525060089080519060200190620000519291906200035f565b506040518060400160405280600881526020017f7472616e73666572000000000000000000000000000000000000000000000000815250600990805190602001906200009f9291906200035f565b506040518060400160405280600a81526020017f6164645f6d696e74657200000000000000000000000000000000000000000000815250600a9080519060200190620000ed9291906200035f565b506040518060400160405280600981526020017f6275726e5f726174650000000000000000000000000000000000000000000000815250600b90805190602001906200013b9291906200035f565b506202a300600c556000600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600e556000600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006010556005601255348015620001e357600080fd5b506040518060400160405280600d81526020017f446f6b69446f6b69417a756b69000000000000000000000000000000000000008152506040518060400160405280600581526020017f415a554b490000000000000000000000000000000000000000000000000000008152508160039080519060200190620002689291906200035f565b508060049080519060200190620002819291906200035f565b506012600560006101000a81548160ff021916908360ff16021790555050506000620002b26200035760201b60201c565b905080600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35062000415565b600033905090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620003975760008555620003e3565b82601f10620003b257805160ff1916838001178555620003e3565b82800160010185558215620003e3579182015b82811115620003e2578251825591602001919060010190620003c5565b5b509050620003f29190620003f6565b5090565b5b8082111562000411576000816000905550600101620003f7565b5090565b614c2a80620004256000396000f3fe608060405234801561001057600080fd5b506004361061027f5760003560e01c8063845ffac21161015c578063bed99850116100ce578063e0b6bb6711610087578063e0b6bb6714610c4a578063eab7e3f414610c54578063f1c6886014610c5e578063f2fde38b14610d2d578063f46eccc414610d71578063f92368f014610dcb5761027f565b8063bed9985014610b3e578063bf6d9abd14610b5c578063c62b754714610b66578063dc23ea0414610baa578063dd0d148914610bb4578063dd62ed3e14610bd25761027f565b8063983b2d5611610120578063983b2d5614610976578063a3e07108146109ba578063a457c2d7146109ee578063a9059cbb14610a52578063ab0f20c414610ab6578063bb8cdb3c14610b105761027f565b8063845ffac2146108635780638a1fcd601461086d5780638da5cb5b1461088b57806392123470146108bf57806395d89b41146108f35761027f565b806339509351116101f55780636614b24e116101b95780636614b24e1461070b5780636b7fef141461076557806370a08231146107a9578063715018a614610801578063789fe3551461080b5780637c2d93fb146108155761027f565b806339509351146105df57806340c10f191461064357806342966c68146106915780635a2bcc18146106bf5780635d17bfcd146106dd5761027f565b806323b872dd1161024757806323b872dd146103d757806328d748c41461045b5780633092afd51461049f578063313ce567146104e357806336daf90f14610504578063378f5b931461050e5761027f565b806306fdde0314610284578063095ea7b3146103075780630c2fc1971461036b57806318160ddd146103af5780631dfe90fc146103cd575b600080fd5b61028c610e0f565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102cc5780820151818401526020810190506102b1565b50505050905090810190601f1680156102f95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103536004803603604081101561031d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610eb1565b60405180821515815260200191505060405180910390f35b6103ad6004803603602081101561038157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610ecf565b005b6103b7610ff4565b6040518082815260200191505060405180910390f35b6103d5610ffe565b005b610443600480360360608110156103ed57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611155565b60405180821515815260200191505060405180910390f35b61049d6004803603602081101561047157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506113c7565b005b6104e1600480360360208110156104b557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506114ec565b005b6104eb611611565b604051808260ff16815260200191505060405180910390f35b61050c611628565b005b6105c76004803603602081101561052457600080fd5b810190808035906020019064010000000081111561054157600080fd5b82018360208201111561055357600080fd5b8035906020019184600183028401116401000000008311171561057557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611818565b60405180821515815260200191505060405180910390f35b61062b600480360360408110156105f557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061184e565b60405180821515815260200191505060405180910390f35b61068f6004803603604081101561065957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611901565b005b6106bd600480360360208110156106a757600080fd5b8101908080359060200190929190505050611ae0565b005b6106c7611b0f565b6040518082815260200191505060405180910390f35b610709600480360360208110156106f357600080fd5b8101908080359060200190929190505050611b15565b005b61074d6004803603602081101561072157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c45565b60405180821515815260200191505060405180910390f35b6107a76004803603602081101561077b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c65565b005b6107eb600480360360208110156107bf57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611d8a565b6040518082815260200191505060405180910390f35b610809611dd2565b005b610813611f5d565b005b6108616004803603604081101561082b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612202565b005b61086b612462565b005b610875612602565b6040518082815260200191505060405180910390f35b610893612608565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6108c7612632565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6108fb612658565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561093b578082015181840152602081019050610920565b50505050905090810190601f1680156109685780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6109b86004803603602081101561098c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506126fa565b005b6109c26128f5565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610a3a60048036036040811015610a0457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061291b565b60405180821515815260200191505060405180910390f35b610a9e60048036036040811015610a6857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506129e8565b60405180821515815260200191505060405180910390f35b610af860048036036020811015610acc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612c58565b60405180821515815260200191505060405180910390f35b610b3c60048036036020811015610b2657600080fd5b8101908080359060200190929190505050612c78565b005b610b46612dfe565b6040518082815260200191505060405180910390f35b610b64612e04565b005b610ba860048036036020811015610b7c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612f5b565b005b610bb2613080565b005b610bbc613395565b6040518082815260200191505060405180910390f35b610c3460048036036040811015610be857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061339b565b6040518082815260200191505060405180910390f35b610c52613422565b005b610c5c613579565b005b610d1760048036036020811015610c7457600080fd5b8101908080359060200190640100000000811115610c9157600080fd5b820183602082011115610ca357600080fd5b80359060200191846001830284011164010000000083111715610cc557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506138ae565b6040518082815260200191505060405180910390f35b610d6f60048036036020811015610d4357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506138dc565b005b610db360048036036020811015610d8757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613aec565b60405180821515815260200191505060405180910390f35b610e0d60048036036020811015610de157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613b0c565b005b606060038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ea75780601f10610e7c57610100808354040283529160200191610ea7565b820191906000526020600020905b815481529060010190602001808311610e8a57829003601f168201915b5050505050905090565b6000610ec5610ebe613d5c565b8484613d64565b6001905092915050565b610ed7613d5c565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f99576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600254905090565b611006613d5c565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60016007600a60405180828054600181600116156101000203166002900480156111295780601f10611107576101008083540402835291820191611129565b820191906000526020600020905b815481529060010190602001808311611115575b5050915050908152602001604051809103902060006101000a81548160ff021916908315150217905550565b600061115f612608565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061121557506007600960405180828054600181600116156101000203166002900480156111f25780601f106111d05761010080835404028352918201916111f2565b820191906000526020600020905b8154815290600101906020018083116111de575b5050915050908152602001604051809103902060009054906101000a900460ff16155b611287576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f5472616e7366657246726f6d206973206265696e67206c6f636b65642e00000081525060200191505060405180910390fd5b6000601460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156113065761130360646112f560125486613f5b90919063ffffffff16565b613fe190919063ffffffff16565b90505b600061131b828561402b90919063ffffffff16565b90508361132787611d8a565b101561139b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f696e73756666696369656e742062616c616e63652e000000000000000000000081525060200191505060405180910390fd5b6113a6868683614075565b50600082146113ba576113b9868361414e565b5b6001925050509392505050565b6113cf613d5c565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611491576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6114f4613d5c565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146115b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600560009054906101000a900460ff16905090565b611630613d5c565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146116f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600c5442016006600960405180828054600181600116156101000203166002900480156117565780601f10611734576101008083540402835291820191611756565b820191906000526020600020905b815481529060010190602001808311611742575b50509150509081526020016040518091039020819055507f55876d4d45126da385fe679337e59204e67de9f940cad7ee31fca23b586698ae6006600960405180828054600181600116156101000203166002900480156117ed5780601f106117cb5761010080835404028352918201916117ed565b820191906000526020600020905b8154815290600101906020018083116117d9575b50509150509081526020016040518091039020546040518082815260200191505060405180910390a1565b6007818051602081018201805184825260208301602085012081835280955050505050506000915054906101000a900460ff1681565b60006118f761185b613d5c565b846118f2856001600061186c613d5c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461431290919063ffffffff16565b613d64565b6001905092915050565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166119c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f5265737472696374656420746f206d696e746572732e0000000000000000000081525060200191505060405180910390fd5b600760086040518082805460018160011615610100020316600290048015611a1f5780601f106119fd576101008083540402835291820191611a1f565b820191906000526020600020905b815481529060010190602001808311611a0b575b5050915050908152602001604051809103902060009054906101000a900460ff1615611ad257611a4d612608565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415611ad1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180614aa2602f913960400191505060405180910390fd5b5b611adc828261439a565b5050565b60008111611aed57600080fd5b80611af733611d8a565b1015611b0257600080fd5b611b0c338261414e565b50565b600e5481565b611b1d613d5c565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611bdf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b62015180811015611c3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180614ad16024913960400191505060405180910390fd5b80600c8190555050565b60136020528060005260406000206000915054906101000a900460ff1681565b611c6d613d5c565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d2f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6001601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611dda613d5c565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611e9c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611f65613d5c565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612027576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000600e5414156120a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f6d696e7420616d6f756e742063616e206e6f7420626520302e0000000000000081525060200191505060405180910390fd5b6006600860405180828054600181600116156101000203166002900480156120ff5780601f106120dd5761010080835404028352918201916120ff565b820191906000526020600020905b8154815290600101906020018083116120eb575b5050915050908152602001604051809103902054421015612188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f4d696e74206f7065726174696f6e2069732070656e64696e672e00000000000081525060200191505060405180910390fd5b6121b6600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600e5461439a565b6000600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600e81905550565b61220a613d5c565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146122cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b81600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600e81905550600c5442016006600860405180828054600181600116156101000203166002900480156123785780601f10612356576101008083540402835291820191612378565b820191906000526020600020905b815481529060010190602001808311612364575b50509150509081526020016040518091039020819055507fa98185265754d2900747b6b8c10848dc79f4e12ee76feba2eaf9d4b8a67d60a182826006600860405180828054600181600116156101000203166002900480156124115780601f106123ef576101008083540402835291820191612411565b820191906000526020600020905b8154815290600101906020018083116123fd575b5050915050908152602001604051809103902054604051808473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a15050565b61246a613d5c565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461252c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6006600b604051808280546001816001161561010002031660029004801561258b5780601f1061256957610100808354040283529182019161258b565b820191906000526020600020905b815481529060010190602001808311612577575b50509150509081526020016040518091039020544210156125f7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180614b5f6028913960400191505060405180910390fd5b601054601281905550565b600c5481565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156126f05780601f106126c5576101008083540402835291602001916126f0565b820191906000526020600020905b8154815290600101906020018083116126d357829003601f168201915b5050505050905090565b612702613d5c565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146127c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6007600a60405180828054600181600116156101000203166002900480156128235780601f10612801576101008083540402835291820191612823565b820191906000526020600020905b81548152906001019060200180831161280f575b5050915050908152602001604051809103902060009054906101000a900460ff161561289a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180614aa2602f913960400191505060405180910390fd5b6001601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006129de612928613d5c565b846129d985604051806060016040528060258152602001614bd06025913960016000612952613d5c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546145619092919063ffffffff16565b613d64565b6001905092915050565b60006129f2612608565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612aa85750600760096040518082805460018160011615610100020316600290048015612a855780601f10612a63576101008083540402835291820191612a85565b820191906000526020600020905b815481529060010190602001808311612a71575b5050915050908152602001604051809103902060009054906101000a900460ff16155b612b1a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f5472616e73666572206973206265696e67206c6f636b65642e0000000000000081525060200191505060405180910390fd5b6000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612b9957612b966064612b8860125486613f5b90919063ffffffff16565b613fe190919063ffffffff16565b90505b6000612bae828561402b90919063ffffffff16565b905083612bba33611d8a565b1015612c2e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f696e73756666696369656e742062616c616e63652e000000000000000000000081525060200191505060405180910390fd5b612c388582614621565b5060008214612c4c57612c4b338361414e565b5b60019250505092915050565b60146020528060005260406000206000915054906101000a900460ff1681565b612c80613d5c565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612d42576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80601081905550600c5442016006600b6040518082805460018160011615610100020316600290048015612dad5780601f10612d8b576101008083540402835291820191612dad565b820191906000526020600020905b815481529060010190602001808311612d99575b50509150509081526020016040518091039020819055507f345a03d72d12b87ae23e1533d3d18656ab883faa8693c7bd66b77b01663f7181816040518082815260200191505060405180910390a150565b60125481565b612e0c613d5c565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612ece576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000600760096040518082805460018160011615610100020316600290048015612f2f5780601f10612f0d576101008083540402835291820191612f2f565b820191906000526020600020905b815481529060010190602001808311612f1b575b5050915050908152602001604051809103902060006101000a81548160ff021916908315150217905550565b612f63613d5c565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613025576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6001601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b613088613d5c565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461314a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6007600960405180828054600181600116156101000203166002900480156131a95780601f106131875761010080835404028352918201916131a9565b820191906000526020600020905b815481529060010190602001808311613195575b5050915050908152602001604051809103902060009054906101000a900460ff161561323d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f5472616e73666572206973206265696e67206c6f636b65642e0000000000000081525060200191505060405180910390fd5b60066009604051808280546001816001161561010002031660029004801561329c5780601f1061327a57610100808354040283529182019161329c565b820191906000526020600020905b815481529060010190602001808311613288575b5050915050908152602001604051809103902054421015613308576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180614a596023913960400191505060405180910390fd5b60016007600960405180828054600181600116156101000203166002900480156133695780601f10613347576101008083540402835291820191613369565b820191906000526020600020905b815481529060010190602001808311613355575b5050915050908152602001604051809103902060006101000a81548160ff021916908315150217905550565b60105481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61342a613d5c565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146134ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600160076008604051808280546001816001161561010002031660029004801561354d5780601f1061352b57610100808354040283529182019161354d565b820191906000526020600020905b815481529060010190602001808311613539575b5050915050908152602001604051809103902060006101000a81548160ff021916908315150217905550565b613581613d5c565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613643576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613708576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4e6577206d696e7465722063616e206e6f742062652030783030302e0000000081525060200191505060405180910390fd5b6006600a60405180828054600181600116156101000203166002900480156137675780601f10613745576101008083540402835291820191613767565b820191906000526020600020905b815481529060010190602001808311613753575b50509150509081526020016040518091039020544210156137f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f416464206d696e746572206f7065726174696f6e2069732070656e64696e672e81525060200191505060405180910390fd5b600160116000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6006818051602081018201805184825260208301602085012081835280955050505050506000915090505481565b6138e4613d5c565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146139a6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613a2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180614a116026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60116020528060005260406000206000915054906101000a900460ff1681565b613b14613d5c565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613bd6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600c5442016006600a6040518082805460018160011615610100020316600290048015613c7b5780601f10613c59576101008083540402835291820191613c7b565b820191906000526020600020905b815481529060010190602001808311613c67575b50509150509081526020016040518091039020819055507fa6f5763e6668bad747a51d5de2662e5a5a6c81b64ba87e3155cbf7cb4ecdf95a816006600a6040518082805460018160011615610100020316600290048015613d135780601f10613cf1576101008083540402835291820191613d13565b820191906000526020600020905b815481529060010190602001808311613cff575b5050915050908152602001604051809103902054604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a150565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613dea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180614bac6024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613e70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614a376022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600080831415613f6e5760009050613fdb565b6000828402905082848281613f7f57fe5b0414613fd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614af56021913960400191505060405180910390fd5b809150505b92915050565b600061402383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061463f565b905092915050565b600061406d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614561565b905092915050565b6000614082848484614705565b6141438461408e613d5c565b61413e85604051806060016040528060288152602001614b1660289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006140f4613d5c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546145619092919063ffffffff16565b613d64565b600190509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156141d4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614b3e6021913960400191505060405180910390fd5b6141e0826000836149c6565b61424b816040518060600160405280602281526020016149ef602291396000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546145619092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506142a28160025461402b90919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600080828401905083811015614390576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561443d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b614449600083836149c6565b61445e8160025461431290919063ffffffff16565b6002819055506144b5816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461431290919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600083831115829061460e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156145d35780820151818401526020810190506145b8565b50505050905090810190601f1680156146005780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600061463561462e613d5c565b8484614705565b6001905092915050565b600080831182906146eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156146b0578082015181840152602081019050614695565b50505050905090810190601f1680156146dd5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816146f757fe5b049050809150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561478b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180614b876025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614811576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806149cc6023913960400191505060405180910390fd5b61481c8383836149c6565b61488781604051806060016040528060268152602001614a7c602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546145619092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061491a816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461431290919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b50505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573735472616e73666572206c6f636b206f7065726174696f6e2069732070656e64696e672e45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365536f7272792c20746869732066756e6374696f6e20686173206265656e206c6f636b656420666f72204f776e65722e4475726174696f6e206d7573742062652067726561746572207468616e2031206461792e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f20616464726573734368616e67696e6720746f206e6577206275726e696e6720726174652069732070656e64696e672e45524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212201557ae18d9d08fd3139c4e6198e6165818bf30496dc6d2785adfebbb593f516864736f6c63430007040033

Deployed ByteCode Sourcemap

25274:6401:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14767:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16873:169;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;30211:132;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;15842:100;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29708:103;;;:::i;:::-;;31002:670;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;29945:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;27137:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;15694:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;28366:191;;;:::i;:::-;;25467:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;18246:218;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;26505:247;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26760:159;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;25805:26;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29413:186;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26046:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;30077:126;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;16005:119;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;24720:148;;;:::i;:::-;;27506:295;;;:::i;:::-;;27244:254;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29207:198;;;:::i;:::-;;25697:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;24078:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;25764:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;14969:87;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26927:202;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;25865:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;18967:269;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;30351:643;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;26102:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;28982:217;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26015:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28870:104;;;:::i;:::-;;29819:118;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28565:297;;;:::i;:::-;;25909:27;;;:::i;:::-;;;;;;;;;;;;;;;;;;;16575:151;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29607:93;;;:::i;:::-;;28058:300;;;:::i;:::-;;25412:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25023:244;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;25945:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;27809:241;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;14767:83;14804:13;14837:5;14830:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14767:83;:::o;16873:169::-;16956:4;16973:39;16982:12;:10;:12::i;:::-;16996:7;17005:6;16973:8;:39::i;:::-;17030:4;17023:11;;16873:169;;;;:::o;30211:132::-;24300:12;:10;:12::i;:::-;24290:22;;:6;;;;;;;;;;;:22;;;24282:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30330:5:::1;30297:21;:30;30319:7;30297:30;;;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;30211:132:::0;:::o;15842:100::-;15895:7;15922:12;;15915:19;;15842:100;:::o;29708:103::-;24300:12;:10;:12::i;:::-;24290:22;;:6;;;;;;;;;;;:22;;;24282:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29799:4:::1;29761:24;29786:9;29761:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;29708:103::o:0;31002:670::-;31100:4;31135:7;:5;:7::i;:::-;31125:17;;:6;:17;;;:56;;;;31147:24;31172:8;31147:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31146:35;31125:56;31117:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31226:18;31263:21;:32;31285:9;31263:32;;;;;;;;;;;;;;;;;;;;;;;;;31259:107;;;31325:29;31350:3;31325:20;31336:8;;31325:6;:10;;:20;;;;:::i;:::-;:24;;:29;;;;:::i;:::-;31312:42;;31259:107;31376:22;31401;31412:10;31401:6;:10;;:22;;;;:::i;:::-;31376:47;;31463:6;31442:17;31452:6;31442:9;:17::i;:::-;:27;;31434:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31506:53;31525:6;31533:9;31544:14;31506:18;:53::i;:::-;;31588:1;31574:10;:15;31570:73;;31606:25;31612:6;31620:10;31606:5;:25::i;:::-;31570:73;31660:4;31653:11;;;;31002:670;;;;;:::o;29945:124::-;24300:12;:10;:12::i;:::-;24290:22;;:6;;;;;;;;;;;:22;;;24282:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30056:5:::1;30027:17;:26;30045:7;30027:26;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;29945:124:::0;:::o;27137:99::-;24300:12;:10;:12::i;:::-;24290:22;;:6;;;;;;;;;;;:22;;;24282:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27223:5:::1;27204:7;:16;27212:7;27204:16;;;;;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;27137:99:::0;:::o;15694:83::-;15735:5;15760:9;;;;;;;;;;;15753:16;;15694:83;:::o;28366:191::-;24300:12;:10;:12::i;:::-;24290:22;;:6;;;;;;;;;;;:22;;;24282:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28471:14:::1;;28453:15;:32;28423:17;28441:8;28423:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:62;;;;28503:46;28521:17;28539:8;28521:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28503:46;;;;;;;;;;;;;;;;;;28366:191::o:0;25467:55::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;18246:218::-;18334:4;18351:83;18360:12;:10;:12::i;:::-;18374:7;18383:50;18422:10;18383:11;:25;18395:12;:10;:12::i;:::-;18383:25;;;;;;;;;;;;;;;:34;18409:7;18383:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;18351:8;:83::i;:::-;18452:4;18445:11;;18246:218;;;;:::o;26505:247::-;26431:7;:19;26439:10;26431:19;;;;;;;;;;;;;;;;;;;;;;;;;26423:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26577:24:::1;26602:4;26577:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26573:144;;;26646:7;:5;:7::i;:::-;26632:21;;:10;:21;;;;26624:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26573:144;26727:17;26733:2;26737:6;26727:5;:17::i;:::-;26505:247:::0;;:::o;26760:159::-;26822:1;26813:6;:10;26805:19;;;;;;26868:6;26843:21;26853:10;26843:9;:21::i;:::-;:31;;26835:40;;;;;;26886:25;26892:10;26904:6;26886:5;:25::i;:::-;26760:159;:::o;25805:26::-;;;;:::o;29413:186::-;24300:12;:10;:12::i;:::-;24290:22;;:6;;;;;;;;;;;:22;;;24282:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29508:6:::1;29496:8;:18;;29488:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29583:8;29566:14;:25;;;;29413:186:::0;:::o;26046:49::-;;;;;;;;;;;;;;;;;;;;;;:::o;30077:126::-;24300:12;:10;:12::i;:::-;24290:22;;:6;;;;;;;;;;;:22;;;24282:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30191:4:::1;30158:21;:30;30180:7;30158:30;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;30077:126:::0;:::o;16005:119::-;16071:7;16098:9;:18;16108:7;16098:18;;;;;;;;;;;;;;;;16091:25;;16005:119;;;:::o;24720:148::-;24300:12;:10;:12::i;:::-;24290:22;;:6;;;;;;;;;;;:22;;;24282:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24827:1:::1;24790:40;;24811:6;;;;;;;;;;;24790:40;;;;;;;;;;;;24858:1;24841:6;;:19;;;;;;;;;;;;;;;;;;24720:148::o:0;27506:295::-;24300:12;:10;:12::i;:::-;24290:22;;:6;;;;;;;;;;;:22;;;24282:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27579:1:::1;27565:10;;:15;;27557:53;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;27648:17;27666:4;27648:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27629:15;:42;;27621:81;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;27713:25;27719:6;;;;;;;;;;;27727:10;;27713:5;:25::i;:::-;27766:1;27749:6;;:19;;;;;;;;;;;;;;;;;;27792:1;27779:10;:14;;;;27506:295::o:0;27244:254::-;24300:12;:10;:12::i;:::-;24290:22;;:6;;;;;;;;;;;:22;;;24282:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27325:2:::1;27316:6;;:11;;;;;;;;;;;;;;;;;;27351:6;27338:10;:19;;;;27412:14;;27394:15;:32;27368:17;27386:4;27368:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:58;;;;27444:46;27454:2;27458:6;27466:17;27484:4;27466:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27444:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27244:254:::0;;:::o;29207:198::-;24300:12;:10;:12::i;:::-;24290:22;;:6;;;;;;;;;;;:22;;;24282:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29292:17:::1;29310:8;29292:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29273:15;:46;;29265:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29386:11;;29375:8;:22;;;;29207:198::o:0;25697:35::-;;;;:::o;24078:79::-;24116:7;24143:6;;;;;;;;;;;24136:13;;24078:79;:::o;25764:34::-;;;;;;;;;;;;;:::o;14969:87::-;15008:13;15041:7;15034:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14969:87;:::o;26927:202::-;24300:12;:10;:12::i;:::-;24290:22;;:6;;;;;;;;;;;:22;;;24282:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27000:24:::1;27025:9;27000:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26999:36;26991:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27117:4;27098:7;:16;27106:7;27098:16;;;;;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;26927:202:::0;:::o;25865:37::-;;;;;;;;;;;;;:::o;18967:269::-;19060:4;19077:129;19086:12;:10;:12::i;:::-;19100:7;19109:96;19148:15;19109:96;;;;;;;;;;;;;;;;;:11;:25;19121:12;:10;:12::i;:::-;19109:25;;;;;;;;;;;;;;;:34;19135:7;19109:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;19077:8;:129::i;:::-;19224:4;19217:11;;18967:269;;;;:::o;30351:643::-;30429:4;30468:7;:5;:7::i;:::-;30454:21;;:10;:21;;;:60;;;;30480:24;30505:8;30480:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30479:35;30454:60;30446:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30555:18;30592:17;:29;30610:10;30592:29;;;;;;;;;;;;;;;;;;;;;;;;;30588:104;;;30651:29;30676:3;30651:20;30662:8;;30651:6;:10;;:20;;;;:::i;:::-;:24;;:29;;;;:::i;:::-;30638:42;;30588:104;30702:22;30727;30738:10;30727:6;:10;;:22;;;;:::i;:::-;30702:47;;30793:6;30768:21;30778:10;30768:9;:21::i;:::-;:31;;30760:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30836:41;30851:9;30862:14;30836;:41::i;:::-;;30906:1;30892:10;:15;30888:77;;30924:29;30930:10;30942;30924:5;:29::i;:::-;30888:77;30982:4;30975:11;;;;30351:643;;;;:::o;26102:53::-;;;;;;;;;;;;;;;;;;;;;;:::o;28982:217::-;24300:12;:10;:12::i;:::-;24290:22;;:6;;;;;;;;;;;:22;;;24282:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29067:7:::1;29053:11;:21;;;;29133:14;;29115:15;:32;29085:17;29103:8;29085:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:62;;;;29163:28;29183:7;29163:28;;;;;;;;;;;;;;;;;;28982:217:::0;:::o;26015:24::-;;;;:::o;28870:104::-;24300:12;:10;:12::i;:::-;24290:22;;:6;;;;;;;;;;;:22;;;24282:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28961:5:::1;28924:24;28949:8;28924:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;28870:104::o:0;29819:118::-;24300:12;:10;:12::i;:::-;24290:22;;:6;;;;;;;;;;;:22;;;24282:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29925:4:::1;29896:17;:26;29914:7;29896:26;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;29819:118:::0;:::o;28565:297::-;24300:12;:10;:12::i;:::-;24290:22;;:6;;;;;;;;;;;:22;;;24282:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28633:24:::1;28658:8;28633:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28632:35;28624:73;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;28735:17;28753:8;28735:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28716:15;:46;;28708:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28850:4;28813:24;28838:8;28813:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:41;;;;;;;;;;;;;;;;;;28565:297::o:0;25909:27::-;;;;:::o;16575:151::-;16664:7;16691:11;:18;16703:5;16691:18;;;;;;;;;;;;;;;:27;16710:7;16691:27;;;;;;;;;;;;;;;;16684:34;;16575:151;;;;:::o;29607:93::-;24300:12;:10;:12::i;:::-;24290:22;;:6;;;;;;;;;;;:22;;;24282:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29688:4:::1;29655:24;29680:4;29655:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;29607:93::o:0;28058:300::-;24300:12;:10;:12::i;:::-;24290:22;;:6;;;;;;;;;;;:22;;;24282:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28143:1:::1;28122:23;;:9;;;;;;;;;;;:23;;;;28114:64;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;28216:17;28234:9;28216:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28197:15;:47;;28189:92;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;28313:4;28292:7;:18;28300:9;;;;;;;;;;;28292:18;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;28348:1;28328:9;;:22;;;;;;;;;;;;;;;;;;28058:300::o:0;25412:48::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25023:244::-;24300:12;:10;:12::i;:::-;24290:22;;:6;;;;;;;;;;;:22;;;24282:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25132:1:::1;25112:22;;:8;:22;;;;25104:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25222:8;25193:38;;25214:6;;;;;;;;;;;25193:38;;;;;;;;;;;;25251:8;25242:6;;:17;;;;;;;;;;;;;;;;;;25023:244:::0;:::o;25945:39::-;;;;;;;;;;;;;;;;;;;;;;:::o;27809:241::-;24300:12;:10;:12::i;:::-;24290:22;;:6;;;;;;;;;;;:22;;;24282:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27890:7:::1;27878:9;;:19;;;;;;;;;;;;;;;;;;27957:14;;27939:15;:32;27908:17;27926:9;27908:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:63;;;;27989:53;28004:7;28013:17;28031:9;28013:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27989:53;;;;;;;;;;;;;;;;;;;;;;;;;;27809:241:::0;:::o;60:106::-;113:15;148:10;141:17;;60:106;:::o;22114:346::-;22233:1;22216:19;;:5;:19;;;;22208:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22314:1;22295:21;;:7;:21;;;;22287:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22398:6;22368:11;:18;22380:5;22368:18;;;;;;;;;;;;;;;:27;22387:7;22368:27;;;;;;;;;;;;;;;:36;;;;22436:7;22420:32;;22429:5;22420:32;;;22445:6;22420:32;;;;;;;;;;;;;;;;;;22114:346;;;:::o;4672:471::-;4730:7;4980:1;4975;:6;4971:47;;;5005:1;4998:8;;;;4971:47;5030:9;5046:1;5042;:5;5030:17;;5075:1;5070;5066;:5;;;;;;:10;5058:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5134:1;5127:8;;;4672:471;;;;;:::o;5619:132::-;5677:7;5704:39;5708:1;5711;5704:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;5697:46;;5619:132;;;;:::o;3782:136::-;3840:7;3867:43;3871:1;3874;3867:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;3860:50;;3782:136;;;;:::o;17516:321::-;17622:4;17639:36;17649:6;17657:9;17668:6;17639:9;:36::i;:::-;17686:121;17695:6;17703:12;:10;:12::i;:::-;17717:89;17755:6;17717:89;;;;;;;;;;;;;;;;;:11;:19;17729:6;17717:19;;;;;;;;;;;;;;;:33;17737:12;:10;:12::i;:::-;17717:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;17686:8;:121::i;:::-;17825:4;17818:11;;17516:321;;;;;:::o;21256:418::-;21359:1;21340:21;;:7;:21;;;;21332:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21412:49;21433:7;21450:1;21454:6;21412:20;:49::i;:::-;21495:68;21518:6;21495:68;;;;;;;;;;;;;;;;;:9;:18;21505:7;21495:18;;;;;;;;;;;;;;;;:22;;:68;;;;;:::i;:::-;21474:9;:18;21484:7;21474:18;;;;;;;;;;;;;;;:89;;;;21589:24;21606:6;21589:12;;:16;;:24;;;;:::i;:::-;21574:12;:39;;;;21655:1;21629:37;;21638:7;21629:37;;;21659:6;21629:37;;;;;;;;;;;;;;;;;;21256:418;;:::o;3318:181::-;3376:7;3396:9;3412:1;3408;:5;3396:17;;3437:1;3432;:6;;3424:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3490:1;3483:8;;;3318:181;;;;:::o;20546:378::-;20649:1;20630:21;;:7;:21;;;;20622:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20700:49;20729:1;20733:7;20742:6;20700:20;:49::i;:::-;20777:24;20794:6;20777:12;;:16;;:24;;;;:::i;:::-;20762:12;:39;;;;20833:30;20856:6;20833:9;:18;20843:7;20833:18;;;;;;;;;;;;;;;;:22;;:30;;;;:::i;:::-;20812:9;:18;20822:7;20812:18;;;;;;;;;;;;;;;:51;;;;20900:7;20879:37;;20896:1;20879:37;;;20909:6;20879:37;;;;;;;;;;;;;;;;;;20546:378;;:::o;4221:192::-;4307:7;4340:1;4335;:6;;4343:12;4327:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4367:9;4383:1;4379;:5;4367:17;;4404:1;4397:8;;;4221:192;;;;;:::o;16337:175::-;16423:4;16440:42;16450:12;:10;:12::i;:::-;16464:9;16475:6;16440:9;:42::i;:::-;16500:4;16493:11;;16337:175;;;;:::o;6247:278::-;6333:7;6365:1;6361;:5;6368:12;6353:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6392:9;6408:1;6404;:5;;;;;;6392:17;;6516:1;6509:8;;;6247:278;;;;;:::o;19726:539::-;19850:1;19832:20;;:6;:20;;;;19824:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19934:1;19913:23;;:9;:23;;;;19905:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19989:47;20010:6;20018:9;20029:6;19989:20;:47::i;:::-;20069:71;20091:6;20069:71;;;;;;;;;;;;;;;;;:9;:17;20079:6;20069:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;20049:9;:17;20059:6;20049:17;;;;;;;;;;;;;;;:91;;;;20174:32;20199:6;20174:9;:20;20184:9;20174:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;20151:9;:20;20161:9;20151:20;;;;;;;;;;;;;;;:55;;;;20239:9;20222:35;;20231:6;20222:35;;;20250:6;20222:35;;;;;;;;;;;;;;;;;;19726:539;;;:::o;23485:92::-;;;;:::o

Swarm Source

ipfs://1557ae18d9d08fd3139c4e6198e6165818bf30496dc6d2785adfebbb593f5168
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.