Token Ojamu

 

Overview ERC-20

Price
$0.00 @ 0.000000 MATIC
Fully Diluted Market Cap
Total Supply:
11,613,008.768621 OJA

Holders:
1,117 addresses
Contract:
0x26373ec913876c9e6d38494dde458cb8649cb30c0x26373EC913876C9e6d38494dde458Cb8649cb30c

Decimals:
18

Social Profiles:
Not Available, Update ?

 
Balance
0 OJA

Value
$0.00
0x0e43245f7af3cfb1d4838e6704f27d09a8b4b072
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
OjamuChildToken

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-10-15
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
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);
}

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}


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

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

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

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

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

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `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);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        //unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        //}

        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        //unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        //}

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `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);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        //unchecked {
            _balances[sender] = senderBalance - amount;
        //}
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(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:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        //unchecked {
            _balances[account] = accountBalance - amount;
        //}
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow, so we distribute.
        return (a / 2) + (b / 2) + (((a % 2) + (b % 2)) / 2);
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a / b + (a % b == 0 ? 0 : 1);
    }
}


/**
 * @dev Collection of functions related to array types.
 */
library Arrays {
    /**
     * @dev Searches a sorted `array` and returns the first index that contains
     * a value greater or equal to `element`. If no such index exists (i.e. all
     * values in the array are strictly less than `element`), the array length is
     * returned. Time complexity O(log n).
     *
     * `array` is expected to be sorted in ascending order, and to contain no
     * repeated elements.
     */
    function findUpperBound(uint256[] storage array, uint256 element) internal view returns (uint256) {
        if (array.length == 0) {
            return 0;
        }

        uint256 low = 0;
        uint256 high = array.length;

        while (low < high) {
            uint256 mid = Math.average(low, high);

            // Note that mid will always be strictly less than high (i.e. it will be a valid array index)
            // because Math.average rounds down (it does integer division with truncation).
            if (array[mid] > element) {
                high = mid;
            } else {
                low = mid + 1;
            }
        }

        // At this point `low` is the exclusive upper bound. We will return the inclusive upper bound.
        if (low > 0 && array[low - 1] == element) {
            return low - 1;
        } else {
            return low;
        }
    }
}

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        //unchecked {
            counter._value += 1;
        //}
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        //unchecked {
            counter._value = value - 1;
        //}
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}


/**
 * @dev This contract extends an ERC20 token with a snapshot mechanism. When a snapshot is created, the balances and
 * total supply at the time are recorded for later access.
 *
 * This can be used to safely create mechanisms based on token balances such as trustless dividends or weighted voting.
 * In naive implementations it's possible to perform a "double spend" attack by reusing the same balance from different
 * accounts. By using snapshots to calculate dividends or voting power, those attacks no longer apply. It can also be
 * used to create an efficient ERC20 forking mechanism.
 *
 * Snapshots are created by the internal {_snapshot} function, which will emit the {Snapshot} event and return a
 * snapshot id. To get the total supply at the time of a snapshot, call the function {totalSupplyAt} with the snapshot
 * id. To get the balance of an account at the time of a snapshot, call the {balanceOfAt} function with the snapshot id
 * and the account address.
 *
 * NOTE: Snapshot policy can be customized by overriding the {_getCurrentSnapshotId} method. For example, having it
 * return `block.number` will trigger the creation of snapshot at the begining of each new block. When overridding this
 * function, be careful about the monotonicity of its result. Non-monotonic snapshot ids will break the contract.
 *
 * Implementing snapshots for every block using this method will incur significant gas costs. For a gas-efficient
 * alternative consider {ERC20Votes}.
 *
 * ==== Gas Costs
 *
 * Snapshots are efficient. Snapshot creation is _O(1)_. Retrieval of balances or total supply from a snapshot is _O(log
 * n)_ in the number of snapshots that have been created, although _n_ for a specific account will generally be much
 * smaller since identical balances in subsequent snapshots are stored as a single entry.
 *
 * There is a constant overhead for normal ERC20 transfers due to the additional snapshot bookkeeping. This overhead is
 * only significant for the first transfer that immediately follows a snapshot for a particular account. Subsequent
 * transfers will have normal cost until the next snapshot, and so on.
 */

abstract contract ERC20Snapshot is ERC20 {
    // Inspired by Jordi Baylina's MiniMeToken to record historical balances:
    // https://github.com/Giveth/minimd/blob/ea04d950eea153a04c51fa510b068b9dded390cb/contracts/MiniMeToken.sol

    using Arrays for uint256[];
    using Counters for Counters.Counter;

    // Snapshotted values have arrays of ids and the value corresponding to that id. These could be an array of a
    // Snapshot struct, but that would impede usage of functions that work on an array.
    struct Snapshots {
        uint256[] ids;
        uint256[] values;
    }

    mapping(address => Snapshots) private _accountBalanceSnapshots;
    Snapshots private _totalSupplySnapshots;

    // Snapshot ids increase monotonically, with the first value being 1. An id of 0 is invalid.
    Counters.Counter private _currentSnapshotId;

    /**
     * @dev Emitted by {_snapshot} when a snapshot identified by `id` is created.
     */
    event Snapshot(uint256 id);

    /**
     * @dev Creates a new snapshot and returns its snapshot id.
     *
     * Emits a {Snapshot} event that contains the same id.
     *
     * {_snapshot} is `internal` and you have to decide how to expose it externally. Its usage may be restricted to a
     * set of accounts, for example using {AccessControl}, or it may be open to the public.
     *
     * [WARNING]
     * ====
     * While an open way of calling {_snapshot} is required for certain trust minimization mechanisms such as forking,
     * you must consider that it can potentially be used by attackers in two ways.
     *
     * First, it can be used to increase the cost of retrieval of values from snapshots, although it will grow
     * logarithmically thus rendering this attack ineffective in the long term. Second, it can be used to target
     * specific accounts and increase the cost of ERC20 transfers for them, in the ways specified in the Gas Costs
     * section above.
     *
     * We haven't measured the actual numbers; if this is something you're interested in please reach out to us.
     * ====
     */
    function _snapshot() internal virtual returns (uint256) {
        _currentSnapshotId.increment();

        uint256 currentId = _getCurrentSnapshotId();
        emit Snapshot(currentId);
        return currentId;
    }

    /**
     * @dev Get the current snapshotId
     */
    function _getCurrentSnapshotId() internal view virtual returns (uint256) {
        return _currentSnapshotId.current();
    }

    /**
     * @dev Retrieves the balance of `account` at the time `snapshotId` was created.
     */
    function balanceOfAt(address account, uint256 snapshotId) public view virtual returns (uint256) {
        (bool snapshotted, uint256 value) = _valueAt(snapshotId, _accountBalanceSnapshots[account]);

        return snapshotted ? value : balanceOf(account);
    }

    /**
     * @dev Retrieves the total supply at the time `snapshotId` was created.
     */
    function totalSupplyAt(uint256 snapshotId) public view virtual returns (uint256) {
        (bool snapshotted, uint256 value) = _valueAt(snapshotId, _totalSupplySnapshots);

        return snapshotted ? value : totalSupply();
    }

    // Update balance and/or total supply snapshots before the values are modified. This is implemented
    // in the _beforeTokenTransfer hook, which is executed for _mint, _burn, and _transfer operations.
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, amount);

        if (from == address(0)) {
            // mint
            _updateAccountSnapshot(to);
            _updateTotalSupplySnapshot();
        } else if (to == address(0)) {
            // burn
            _updateAccountSnapshot(from);
            _updateTotalSupplySnapshot();
        } else {
            // transfer
            _updateAccountSnapshot(from);
            _updateAccountSnapshot(to);
        }
    }

    function _valueAt(uint256 snapshotId, Snapshots storage snapshots) private view returns (bool, uint256) {
        require(snapshotId > 0, "ERC20Snapshot: id is 0");
        require(snapshotId <= _getCurrentSnapshotId(), "ERC20Snapshot: nonexistent id");

        // When a valid snapshot is queried, there are three possibilities:
        //  a) The queried value was not modified after the snapshot was taken. Therefore, a snapshot entry was never
        //  created for this id, and all stored snapshot ids are smaller than the requested one. The value that corresponds
        //  to this id is the current one.
        //  b) The queried value was modified after the snapshot was taken. Therefore, there will be an entry with the
        //  requested id, and its value is the one to return.
        //  c) More snapshots were created after the requested one, and the queried value was later modified. There will be
        //  no entry for the requested id: the value that corresponds to it is that of the smallest snapshot id that is
        //  larger than the requested one.
        //
        // In summary, we need to find an element in an array, returning the index of the smallest value that is larger if
        // it is not found, unless said value doesn't exist (e.g. when all values are smaller). Arrays.findUpperBound does
        // exactly this.

        uint256 index = snapshots.ids.findUpperBound(snapshotId);

        if (index == snapshots.ids.length) {
            return (false, 0);
        } else {
            return (true, snapshots.values[index]);
        }
    }

    function _updateAccountSnapshot(address account) private {
        _updateSnapshot(_accountBalanceSnapshots[account], balanceOf(account));
    }

    function _updateTotalSupplySnapshot() private {
        _updateSnapshot(_totalSupplySnapshots, totalSupply());
    }

    function _updateSnapshot(Snapshots storage snapshots, uint256 currentValue) private {
        uint256 currentId = _getCurrentSnapshotId();
        if (_lastSnapshotId(snapshots.ids) < currentId) {
            snapshots.ids.push(currentId);
            snapshots.values.push(currentValue);
        }
    }

    function _lastSnapshotId(uint256[] storage ids) private view returns (uint256) {
        if (ids.length == 0) {
            return 0;
        } else {
            return ids[ids.length - 1];
        }
    }
}

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    function hasRole(bytes32 role, address account) external view returns (bool);

    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    function grantRole(bytes32 role, address account) external;

    function revokeRole(bytes32 role, address account) external;

    function renounceRole(bytes32 role, address account) external;
}

/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role, _msgSender());
        _;
    }

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

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/
     */
    function _checkRole(bytes32 role, address account) internal view {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(uint160(account), 20),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        emit RoleAdminChanged(role, getRoleAdmin(role), adminRole);
        _roles[role].adminRole = adminRole;
    }

    function _grantRole(bytes32 role, address account) private {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    function _revokeRole(bytes32 role, address account) private {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}


contract OjamuChildToken is ERC20Snapshot, AccessControl {

    uint256 constant INITIAL_SUPPLY =  0; //100,000,000 OJA on mainchain

    address public childChainManagerProxy;

    constructor(address _childChainManagerProxy) ERC20("Ojamu", "OJA") {
        _setupRole(DEFAULT_ADMIN_ROLE, _msgSender());

        childChainManagerProxy = _childChainManagerProxy;
    }

    function updateChildChainManager(address newChildChainManagerProxy) external {
        require(newChildChainManagerProxy != address(0), "Bad ChildChainManagerProxy address");
        require(hasRole(DEFAULT_ADMIN_ROLE, msg.sender), "Caller is not DEFAULT_ADMIN_ROLE");

        childChainManagerProxy = newChildChainManagerProxy;
    }

    function deposit(address user, bytes calldata depositData) external {
        require(msg.sender == childChainManagerProxy, "You're not allowed to deposit");

        uint256 amount = abi.decode(depositData, (uint256));
        
        _mint(user, amount);
    }

    function withdraw(uint256 amount) external {
        _burn(msg.sender, amount);
    }

    /**
     * @dev Creates a new snapshot and returns its snapshot id.
     *
     * Emits a {Snapshot} event that contains the same id.
     */
    function snapshot() public {
        require(hasRole(DEFAULT_ADMIN_ROLE, msg.sender), "Caller is not DEFAULT_ADMIN_ROLE");

        _snapshot();
    }
    

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_childChainManagerProxy","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Snapshot","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":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"snapshotId","type":"uint256"}],"name":"balanceOfAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"childChainManagerProxy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"user","type":"address"},{"internalType":"bytes","name":"depositData","type":"bytes"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"snapshot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"snapshotId","type":"uint256"}],"name":"totalSupplyAt","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":"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":"newChildChainManagerProxy","type":"address"}],"name":"updateChildChainManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040516200369d3803806200369d833981810160405281019062000037919062000385565b6040518060400160405280600581526020017f4f6a616d750000000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f4f4a4100000000000000000000000000000000000000000000000000000000008152508160039080519060200190620000bb929190620002be565b508060049080519060200190620000d4929190620002be565b505050620000fb6000801b620000ef6200014360201b60201c565b6200014b60201b60201c565b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506200046f565b600033905090565b6200015d82826200016160201b60201c565b5050565b6200017382826200025360201b60201c565b6200024f5760016009600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620001f46200014360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006009600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b828054620002cc90620003eb565b90600052602060002090601f016020900481019282620002f057600085556200033c565b82601f106200030b57805160ff19168380011785556200033c565b828001600101855582156200033c579182015b828111156200033b5782518255916020019190600101906200031e565b5b5090506200034b91906200034f565b5090565b5b808211156200036a57600081600090555060010162000350565b5090565b6000815190506200037f8162000455565b92915050565b6000602082840312156200039e576200039d62000450565b5b6000620003ae848285016200036e565b91505092915050565b6000620003c482620003cb565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600060028204905060018216806200040457607f821691505b602082108114156200041b576200041a62000421565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b6200046081620003b7565b81146200046c57600080fd5b50565b61321e806200047f6000396000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c80634ee2cd7e116100de578063981b24d011610097578063a9059cbb11610071578063a9059cbb14610486578063cf2c52cb146104b6578063d547741f146104d2578063dd62ed3e146104ee57610173565b8063981b24d014610408578063a217fddf14610438578063a457c2d71461045657610173565b80634ee2cd7e1461033257806362f629e71461036257806370a082311461038057806391d14854146103b057806395d89b41146103e05780639711715a146103fe57610173565b80632e1a7d4d116101305780632e1a7d4d146102745780632f2ff15d14610290578063313ce567146102ac57806336568abe146102ca57806339509351146102e6578063445a67971461031657610173565b806301ffc9a71461017857806306fdde03146101a8578063095ea7b3146101c657806318160ddd146101f657806323b872dd14610214578063248a9ca314610244575b600080fd5b610192600480360381019061018d9190612298565b61051e565b60405161019f9190612695565b60405180910390f35b6101b0610598565b6040516101bd91906126cb565b60405180910390f35b6101e060048036038101906101db91906121eb565b61062a565b6040516101ed9190612695565b60405180910390f35b6101fe610648565b60405161020b919061290d565b60405180910390f35b61022e60048036038101906102299190612138565b610652565b60405161023b9190612695565b60405180910390f35b61025e6004803603810190610259919061222b565b610753565b60405161026b91906126b0565b60405180910390f35b61028e600480360381019061028991906122c5565b610773565b005b6102aa60048036038101906102a59190612258565b610780565b005b6102b46107a9565b6040516102c19190612928565b60405180910390f35b6102e460048036038101906102df9190612258565b6107b2565b005b61030060048036038101906102fb91906121eb565b610835565b60405161030d9190612695565b60405180910390f35b610330600480360381019061032b91906120cb565b6108e1565b005b61034c600480360381019061034791906121eb565b6109e1565b604051610359919061290d565b60405180910390f35b61036a610a51565b604051610377919061267a565b60405180910390f35b61039a600480360381019061039591906120cb565b610a77565b6040516103a7919061290d565b60405180910390f35b6103ca60048036038101906103c59190612258565b610abf565b6040516103d79190612695565b60405180910390f35b6103e8610b2a565b6040516103f591906126cb565b60405180910390f35b610406610bbc565b005b610422600480360381019061041d91906122c5565b610c13565b60405161042f919061290d565b60405180910390f35b610440610c44565b60405161044d91906126b0565b60405180910390f35b610470600480360381019061046b91906121eb565b610c4b565b60405161047d9190612695565b60405180910390f35b6104a0600480360381019061049b91906121eb565b610d3f565b6040516104ad9190612695565b60405180910390f35b6104d060048036038101906104cb919061218b565b610d5d565b005b6104ec60048036038101906104e79190612258565b610e10565b005b610508600480360381019061050391906120f8565b610e39565b604051610515919061290d565b60405180910390f35b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610591575061059082610ec0565b5b9050919050565b6060600380546105a790612b67565b80601f01602080910402602001604051908101604052809291908181526020018280546105d390612b67565b80156106205780601f106105f557610100808354040283529160200191610620565b820191906000526020600020905b81548152906001019060200180831161060357829003601f168201915b5050505050905090565b600061063e610637610f2a565b8484610f32565b6001905092915050565b6000600254905090565b600061065f8484846110fd565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006106aa610f2a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508281101561072a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610721906127ed565b60405180910390fd5b61074785610736610f2a565b85846107429190612a4b565b610f32565b60019150509392505050565b600060096000838152602001908152602001600020600101549050919050565b61077d3382611387565b50565b61078982610753565b61079a81610795610f2a565b611567565b6107a48383611604565b505050565b60006012905090565b6107ba610f2a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610827576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081e906128cd565b60405180910390fd5b61083182826116e5565b5050565b60006108d7610842610f2a565b848460016000610850610f2a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546108d2919061296a565b610f32565b6001905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610951576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109489061276d565b60405180910390fd5b61095e6000801b33610abf565b61099d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109949061288d565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806000610a2e84600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206117c7565b9150915081610a4557610a4085610a77565b610a47565b805b9250505092915050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006009600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060048054610b3990612b67565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6590612b67565b8015610bb25780601f10610b8757610100808354040283529160200191610bb2565b820191906000526020600020905b815481529060010190602001808311610b9557829003601f168201915b5050505050905090565b610bc96000801b33610abf565b610c08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bff9061288d565b60405180910390fd5b610c106118bd565b50565b6000806000610c238460066117c7565b9150915081610c3957610c34610648565b610c3b565b805b92505050919050565b6000801b81565b60008060016000610c5a610f2a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610d17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0e906128ad565b60405180910390fd5b610d34610d22610f2a565b858584610d2f9190612a4b565b610f32565b600191505092915050565b6000610d53610d4c610f2a565b84846110fd565b6001905092915050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ded576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de49061278d565b60405180910390fd5b60008282810190610dfe91906122c5565b9050610e0a8482611913565b50505050565b610e1982610753565b610e2a81610e25610f2a565b611567565b610e3483836116e5565b505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610fa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f999061284d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611012576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611009906127ad565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516110f0919061290d565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561116d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111649061282d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d49061272d565b60405180910390fd5b6111e8838383611a73565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561126e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611265906127cd565b60405180910390fd5b818161127a9190612a4b565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461130a919061296a565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161136e919061290d565b60405180910390a3611381848484611b2d565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ee9061280d565b60405180910390fd5b61140382600083611a73565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611489576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114809061274d565b60405180910390fd5b81816114959190612a4b565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546114e99190612a4b565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161154e919061290d565b60405180910390a361156283600084611b2d565b505050565b6115718282610abf565b611600576115968173ffffffffffffffffffffffffffffffffffffffff166014611b32565b6115a48360001c6020611b32565b6040516020016115b5929190612640565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f791906126cb565b60405180910390fd5b5050565b61160e8282610abf565b6116e15760016009600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611686610f2a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6116ef8282610abf565b156117c35760006009600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611768610f2a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000806000841161180d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118049061286d565b60405180910390fd5b611815611d6e565b841115611857576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184e906126ed565b60405180910390fd5b600061186f8585600001611d7f90919063ffffffff16565b9050836000018054905081141561188d5760008092509250506118b6565b60018460010182815481106118a5576118a4612c57565b5b906000526020600020015492509250505b9250929050565b60006118c96008611e59565b60006118d3611d6e565b90507f8030e83b04d87bef53480e26263266d6ca66863aa8506aca6f2559d18aa1cb6781604051611904919061290d565b60405180910390a18091505090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611983576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197a906128ed565b60405180910390fd5b61198f60008383611a73565b80600260008282546119a1919061296a565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119f6919061296a565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611a5b919061290d565b60405180910390a3611a6f60008383611b2d565b5050565b611a7e838383611e78565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611ac957611abc82611e7d565b611ac4611ed0565b611b28565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b1457611b0783611e7d565b611b0f611ed0565b611b27565b611b1d83611e7d565b611b2682611e7d565b5b5b505050565b505050565b606060006002836002611b4591906129f1565b611b4f919061296a565b67ffffffffffffffff811115611b6857611b67612c86565b5b6040519080825280601f01601f191660200182016040528015611b9a5781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611bd257611bd1612c57565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611c3657611c35612c57565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611c7691906129f1565b611c80919061296a565b90505b6001811115611d20577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611cc257611cc1612c57565b5b1a60f81b828281518110611cd957611cd8612c57565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611d1990612b3d565b9050611c83565b5060008414611d64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5b9061270d565b60405180910390fd5b8091505092915050565b6000611d7a6008611ee4565b905090565b60008083805490501415611d965760009050611e53565b600080848054905090505b80821015611dfa576000611db58383611ef2565b905084868281548110611dcb57611dca612c57565b5b90600052602060002001541115611de457809150611df4565b600181611df1919061296a565b92505b50611da1565b600082118015611e3257508385600184611e149190612a4b565b81548110611e2557611e24612c57565b5b9060005260206000200154145b15611e4d57600182611e449190612a4b565b92505050611e53565b81925050505b92915050565b6001816000016000828254611e6e919061296a565b9250508190555050565b505050565b611ecd600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611ec883610a77565b611f59565b50565b611ee26006611edd610648565b611f59565b565b600081600001549050919050565b600060028083611f029190612b99565b600285611f0f9190612b99565b611f19919061296a565b611f2391906129c0565b600283611f3091906129c0565b600285611f3d91906129c0565b611f47919061296a565b611f51919061296a565b905092915050565b6000611f63611d6e565b905080611f7284600001611fd4565b1015611fcf5782600001819080600181540180825580915050600190039060005260206000200160009091909190915055826001018290806001815401808255809150506001900390600052602060002001600090919091909150555b505050565b60008082805490501415611feb576000905061201c565b8160018380549050611ffd9190612a4b565b8154811061200e5761200d612c57565b5b906000526020600020015490505b919050565b6000813590506120308161318c565b92915050565b600081359050612045816131a3565b92915050565b60008135905061205a816131ba565b92915050565b60008083601f84011261207657612075612cba565b5b8235905067ffffffffffffffff81111561209357612092612cb5565b5b6020830191508360018202830111156120af576120ae612cbf565b5b9250929050565b6000813590506120c5816131d1565b92915050565b6000602082840312156120e1576120e0612cc9565b5b60006120ef84828501612021565b91505092915050565b6000806040838503121561210f5761210e612cc9565b5b600061211d85828601612021565b925050602061212e85828601612021565b9150509250929050565b60008060006060848603121561215157612150612cc9565b5b600061215f86828701612021565b935050602061217086828701612021565b9250506040612181868287016120b6565b9150509250925092565b6000806000604084860312156121a4576121a3612cc9565b5b60006121b286828701612021565b935050602084013567ffffffffffffffff8111156121d3576121d2612cc4565b5b6121df86828701612060565b92509250509250925092565b6000806040838503121561220257612201612cc9565b5b600061221085828601612021565b9250506020612221858286016120b6565b9150509250929050565b60006020828403121561224157612240612cc9565b5b600061224f84828501612036565b91505092915050565b6000806040838503121561226f5761226e612cc9565b5b600061227d85828601612036565b925050602061228e85828601612021565b9150509250929050565b6000602082840312156122ae576122ad612cc9565b5b60006122bc8482850161204b565b91505092915050565b6000602082840312156122db576122da612cc9565b5b60006122e9848285016120b6565b91505092915050565b6122fb81612a7f565b82525050565b61230a81612a91565b82525050565b61231981612a9d565b82525050565b600061232a82612943565b612334818561294e565b9350612344818560208601612b0a565b61234d81612cce565b840191505092915050565b600061236382612943565b61236d818561295f565b935061237d818560208601612b0a565b80840191505092915050565b6000612396601d8361294e565b91506123a182612cdf565b602082019050919050565b60006123b960208361294e565b91506123c482612d08565b602082019050919050565b60006123dc60238361294e565b91506123e782612d31565b604082019050919050565b60006123ff60228361294e565b915061240a82612d80565b604082019050919050565b600061242260228361294e565b915061242d82612dcf565b604082019050919050565b6000612445601d8361294e565b915061245082612e1e565b602082019050919050565b600061246860228361294e565b915061247382612e47565b604082019050919050565b600061248b60268361294e565b915061249682612e96565b604082019050919050565b60006124ae60288361294e565b91506124b982612ee5565b604082019050919050565b60006124d160218361294e565b91506124dc82612f34565b604082019050919050565b60006124f460258361294e565b91506124ff82612f83565b604082019050919050565b600061251760248361294e565b915061252282612fd2565b604082019050919050565b600061253a60168361294e565b915061254582613021565b602082019050919050565b600061255d60178361295f565b91506125688261304a565b601782019050919050565b600061258060208361294e565b915061258b82613073565b602082019050919050565b60006125a360258361294e565b91506125ae8261309c565b604082019050919050565b60006125c660118361295f565b91506125d1826130eb565b601182019050919050565b60006125e9602f8361294e565b91506125f482613114565b604082019050919050565b600061260c601f8361294e565b915061261782613163565b602082019050919050565b61262b81612af3565b82525050565b61263a81612afd565b82525050565b600061264b82612550565b91506126578285612358565b9150612662826125b9565b915061266e8284612358565b91508190509392505050565b600060208201905061268f60008301846122f2565b92915050565b60006020820190506126aa6000830184612301565b92915050565b60006020820190506126c56000830184612310565b92915050565b600060208201905081810360008301526126e5818461231f565b905092915050565b6000602082019050818103600083015261270681612389565b9050919050565b60006020820190508181036000830152612726816123ac565b9050919050565b60006020820190508181036000830152612746816123cf565b9050919050565b60006020820190508181036000830152612766816123f2565b9050919050565b6000602082019050818103600083015261278681612415565b9050919050565b600060208201905081810360008301526127a681612438565b9050919050565b600060208201905081810360008301526127c68161245b565b9050919050565b600060208201905081810360008301526127e68161247e565b9050919050565b60006020820190508181036000830152612806816124a1565b9050919050565b60006020820190508181036000830152612826816124c4565b9050919050565b60006020820190508181036000830152612846816124e7565b9050919050565b600060208201905081810360008301526128668161250a565b9050919050565b600060208201905081810360008301526128868161252d565b9050919050565b600060208201905081810360008301526128a681612573565b9050919050565b600060208201905081810360008301526128c681612596565b9050919050565b600060208201905081810360008301526128e6816125dc565b9050919050565b60006020820190508181036000830152612906816125ff565b9050919050565b60006020820190506129226000830184612622565b92915050565b600060208201905061293d6000830184612631565b92915050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600061297582612af3565b915061298083612af3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156129b5576129b4612bca565b5b828201905092915050565b60006129cb82612af3565b91506129d683612af3565b9250826129e6576129e5612bf9565b5b828204905092915050565b60006129fc82612af3565b9150612a0783612af3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612a4057612a3f612bca565b5b828202905092915050565b6000612a5682612af3565b9150612a6183612af3565b925082821015612a7457612a73612bca565b5b828203905092915050565b6000612a8a82612ad3565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015612b28578082015181840152602081019050612b0d565b83811115612b37576000848401525b50505050565b6000612b4882612af3565b91506000821415612b5c57612b5b612bca565b5b600182039050919050565b60006002820490506001821680612b7f57607f821691505b60208210811415612b9357612b92612c28565b5b50919050565b6000612ba482612af3565b9150612baf83612af3565b925082612bbf57612bbe612bf9565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433230536e617073686f743a206e6f6e6578697374656e74206964000000600082015250565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f426164204368696c64436861696e4d616e6167657250726f787920616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f596f75277265206e6f7420616c6c6f77656420746f206465706f736974000000600082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433230536e617073686f743a206964206973203000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f43616c6c6572206973206e6f742044454641554c545f41444d494e5f524f4c45600082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b61319581612a7f565b81146131a057600080fd5b50565b6131ac81612a9d565b81146131b757600080fd5b50565b6131c381612aa7565b81146131ce57600080fd5b50565b6131da81612af3565b81146131e557600080fd5b5056fea2646970667358221220f4293a733c9274a07826994d13da8c969e9216310e42a59aa54ab6813662a1ae64736f6c63430008060033000000000000000000000000a6fa4fb5f76172d178d61b04b0ecd319c5d1c0aa

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000a6fa4fb5f76172d178d61b04b0ecd319c5d1c0aa

-----Decoded View---------------
Arg [0] : _childChainManagerProxy (address): 0xa6fa4fb5f76172d178d61b04b0ecd319c5d1c0aa

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000a6fa4fb5f76172d178d61b04b0ecd319c5d1c0aa


Deployed ByteCode Sourcemap

40931:1423:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36363:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6077:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8244:169;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7197:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8895:496;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37774:123;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41943:87;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38159:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7039:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39207:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9800:215;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41318:340;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24853:266;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41073:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7368:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36659:139;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6296:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42189:154;;;:::i;:::-;;25223:234;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34637:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10518:417;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7708:175;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41666:269;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38551:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7946:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36363:204;36448:4;36487:32;36472:47;;;:11;:47;;;;:87;;;;36523:36;36547:11;36523:23;:36::i;:::-;36472:87;36465:94;;36363:204;;;:::o;6077:100::-;6131:13;6164:5;6157:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6077:100;:::o;8244:169::-;8327:4;8344:39;8353:12;:10;:12::i;:::-;8367:7;8376:6;8344:8;:39::i;:::-;8401:4;8394:11;;8244:169;;;;:::o;7197:108::-;7258:7;7285:12;;7278:19;;7197:108;:::o;8895:496::-;9035:4;9052:36;9062:6;9070:9;9081:6;9052:9;:36::i;:::-;9101:24;9128:11;:19;9140:6;9128:19;;;;;;;;;;;;;;;:33;9148:12;:10;:12::i;:::-;9128:33;;;;;;;;;;;;;;;;9101:60;;9200:6;9180:16;:26;;9172:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;9289:57;9298:6;9306:12;:10;:12::i;:::-;9339:6;9320:16;:25;;;;:::i;:::-;9289:8;:57::i;:::-;9379:4;9372:11;;;8895:496;;;;;:::o;37774:123::-;37840:7;37867:6;:12;37874:4;37867:12;;;;;;;;;;;:22;;;37860:29;;37774:123;;;:::o;41943:87::-;41997:25;42003:10;42015:6;41997:5;:25::i;:::-;41943:87;:::o;38159:147::-;38242:18;38255:4;38242:12;:18::i;:::-;36241:30;36252:4;36258:12;:10;:12::i;:::-;36241:10;:30::i;:::-;38273:25:::1;38284:4;38290:7;38273:10;:25::i;:::-;38159:147:::0;;;:::o;7039:93::-;7097:5;7122:2;7115:9;;7039:93;:::o;39207:218::-;39314:12;:10;:12::i;:::-;39303:23;;:7;:23;;;39295:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;39391:26;39403:4;39409:7;39391:11;:26::i;:::-;39207:218;;:::o;9800:215::-;9888:4;9905:80;9914:12;:10;:12::i;:::-;9928:7;9974:10;9937:11;:25;9949:12;:10;:12::i;:::-;9937:25;;;;;;;;;;;;;;;:34;9963:7;9937:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;9905:8;:80::i;:::-;10003:4;9996:11;;9800:215;;;;:::o;41318:340::-;41451:1;41414:39;;:25;:39;;;;41406:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;41511:39;34682:4;41519:18;;41539:10;41511:7;:39::i;:::-;41503:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;41625:25;41600:22;;:50;;;;;;;;;;;;;;;;;;41318:340;:::o;24853:266::-;24940:7;24961:16;24979:13;24996:55;25005:10;25017:24;:33;25042:7;25017:33;;;;;;;;;;;;;;;24996:8;:55::i;:::-;24960:91;;;;25071:11;:40;;25093:18;25103:7;25093:9;:18::i;:::-;25071:40;;;25085:5;25071:40;25064:47;;;;24853:266;;;;:::o;41073:37::-;;;;;;;;;;;;;:::o;7368:127::-;7442:7;7469:9;:18;7479:7;7469:18;;;;;;;;;;;;;;;;7462:25;;7368:127;;;:::o;36659:139::-;36737:4;36761:6;:12;36768:4;36761:12;;;;;;;;;;;:20;;:29;36782:7;36761:29;;;;;;;;;;;;;;;;;;;;;;;;;36754:36;;36659:139;;;;:::o;6296:104::-;6352:13;6385:7;6378:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6296:104;:::o;42189:154::-;42235:39;34682:4;42243:18;;42263:10;42235:7;:39::i;:::-;42227:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;42324:11;:9;:11::i;:::-;;42189:154::o;25223:234::-;25295:7;25316:16;25334:13;25351:43;25360:10;25372:21;25351:8;:43::i;:::-;25315:79;;;;25414:11;:35;;25436:13;:11;:13::i;:::-;25414:35;;;25428:5;25414:35;25407:42;;;;25223:234;;;:::o;34637:49::-;34682:4;34637:49;;;:::o;10518:417::-;10611:4;10628:24;10655:11;:25;10667:12;:10;:12::i;:::-;10655:25;;;;;;;;;;;;;;;:34;10681:7;10655:34;;;;;;;;;;;;;;;;10628:61;;10728:15;10708:16;:35;;10700:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10823:67;10832:12;:10;:12::i;:::-;10846:7;10874:15;10855:16;:34;;;;:::i;:::-;10823:8;:67::i;:::-;10923:4;10916:11;;;10518:417;;;;:::o;7708:175::-;7794:4;7811:42;7821:12;:10;:12::i;:::-;7835:9;7846:6;7811:9;:42::i;:::-;7871:4;7864:11;;7708:175;;;;:::o;41666:269::-;41767:22;;;;;;;;;;;41753:36;;:10;:36;;;41745:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;41836:14;41864:11;;41853:34;;;;;;;:::i;:::-;41836:51;;41908:19;41914:4;41920:6;41908:5;:19::i;:::-;41734:201;41666:269;;;:::o;38551:149::-;38635:18;38648:4;38635:12;:18::i;:::-;36241:30;36252:4;36258:12;:10;:12::i;:::-;36241:10;:30::i;:::-;38666:26:::1;38678:4;38684:7;38666:11;:26::i;:::-;38551:149:::0;;;:::o;7946:151::-;8035:7;8062:11;:18;8074:5;8062:18;;;;;;;;;;;;;;;:27;8081:7;8062:27;;;;;;;;;;;;;;;;8055:34;;7946:151;;;;:::o;32181:157::-;32266:4;32305:25;32290:40;;;:11;:40;;;;32283:47;;32181:157;;;:::o;3896:98::-;3949:7;3976:10;3969:17;;3896:98;:::o;14214:380::-;14367:1;14350:19;;:5;:19;;;;14342:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14448:1;14429:21;;:7;:21;;;;14421:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14532:6;14502:11;:18;14514:5;14502:18;;;;;;;;;;;;;;;:27;14521:7;14502:27;;;;;;;;;;;;;;;:36;;;;14570:7;14554:32;;14563:5;14554:32;;;14579:6;14554:32;;;;;;:::i;:::-;;;;;;;;14214:380;;;:::o;11425:737::-;11583:1;11565:20;;:6;:20;;;;11557:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;11667:1;11646:23;;:9;:23;;;;11638:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;11722:47;11743:6;11751:9;11762:6;11722:20;:47::i;:::-;11782:21;11806:9;:17;11816:6;11806:17;;;;;;;;;;;;;;;;11782:41;;11859:6;11842:13;:23;;11834:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;11982:6;11966:13;:22;;;;:::i;:::-;11946:9;:17;11956:6;11946:17;;;;;;;;;;;;;;;:42;;;;12036:6;12012:9;:20;12022:9;12012:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;12077:9;12060:35;;12069:6;12060:35;;;12088:6;12060:35;;;;;;:::i;:::-;;;;;;;;12108:46;12128:6;12136:9;12147:6;12108:19;:46::i;:::-;11546:616;11425:737;;;:::o;13181:595::-;13284:1;13265:21;;:7;:21;;;;13257:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;13337:49;13358:7;13375:1;13379:6;13337:20;:49::i;:::-;13399:22;13424:9;:18;13434:7;13424:18;;;;;;;;;;;;;;;;13399:43;;13479:6;13461:14;:24;;13453:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;13600:6;13583:14;:23;;;;:::i;:::-;13562:9;:18;13572:7;13562:18;;;;;;;;;;;;;;;:44;;;;13646:6;13630:12;;:22;;;;;;;:::i;:::-;;;;;;;;13696:1;13670:37;;13679:7;13670:37;;;13700:6;13670:37;;;;;;:::i;:::-;;;;;;;;13720:48;13740:7;13757:1;13761:6;13720:19;:48::i;:::-;13246:530;13181:595;;:::o;37088:497::-;37169:22;37177:4;37183:7;37169;:22::i;:::-;37164:414;;37357:41;37385:7;37357:41;;37395:2;37357:19;:41::i;:::-;37471:38;37499:4;37491:13;;37506:2;37471:19;:38::i;:::-;37262:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37208:358;;;;;;;;;;;:::i;:::-;;;;;;;;37164:414;37088:497;;:::o;40455:229::-;40530:22;40538:4;40544:7;40530;:22::i;:::-;40525:152;;40601:4;40569:6;:12;40576:4;40569:12;;;;;;;;;;;:20;;:29;40590:7;40569:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;40652:12;:10;:12::i;:::-;40625:40;;40643:7;40625:40;;40637:4;40625:40;;;;;;;;;;40525:152;40455:229;;:::o;40692:230::-;40767:22;40775:4;40781:7;40767;:22::i;:::-;40763:152;;;40838:5;40806:6;:12;40813:4;40806:12;;;;;;;;;;;:20;;:29;40827:7;40806:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;40890:12;:10;:12::i;:::-;40863:40;;40881:7;40863:40;;40875:4;40863:40;;;;;;;;;;40763:152;40692:230;;:::o;26304:1619::-;26393:4;26399:7;26440:1;26427:10;:14;26419:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;26501:23;:21;:23::i;:::-;26487:10;:37;;26479:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;27697:13;27713:40;27742:10;27713:9;:13;;:28;;:40;;;;:::i;:::-;27697:56;;27779:9;:13;;:20;;;;27770:5;:29;27766:150;;;27824:5;27831:1;27816:17;;;;;;;27766:150;27874:4;27880:9;:16;;27897:5;27880:23;;;;;;;;:::i;:::-;;;;;;;;;;27866:38;;;;;26304:1619;;;;;;:::o;24325:223::-;24372:7;24392:30;:18;:28;:30::i;:::-;24435:17;24455:23;:21;:23::i;:::-;24435:43;;24494:19;24503:9;24494:19;;;;;;:::i;:::-;;;;;;;;24531:9;24524:16;;;24325:223;:::o;12449:399::-;12552:1;12533:21;;:7;:21;;;;12525:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;12603:49;12632:1;12636:7;12645:6;12603:20;:49::i;:::-;12681:6;12665:12;;:22;;;;;;;:::i;:::-;;;;;;;;12720:6;12698:9;:18;12708:7;12698:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;12763:7;12742:37;;12759:1;12742:37;;;12772:6;12742:37;;;;;;:::i;:::-;;;;;;;;12792:48;12820:1;12824:7;12833:6;12792:19;:48::i;:::-;12449:399;;:::o;25674:622::-;25817:44;25844:4;25850:2;25854:6;25817:26;:44::i;:::-;25894:1;25878:18;;:4;:18;;;25874:415;;;25934:26;25957:2;25934:22;:26::i;:::-;25975:28;:26;:28::i;:::-;25874:415;;;26039:1;26025:16;;:2;:16;;;26021:268;;;26079:28;26102:4;26079:22;:28::i;:::-;26122;:26;:28::i;:::-;26021:268;;;26208:28;26231:4;26208:22;:28::i;:::-;26251:26;26274:2;26251:22;:26::i;:::-;26021:268;25874:415;25674:622;;;:::o;15923:124::-;;;;:::o;30275:451::-;30350:13;30376:19;30421:1;30412:6;30408:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;30398:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30376:47;;30434:15;:6;30441:1;30434:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;30460;:6;30467:1;30460:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;30491:9;30516:1;30507:6;30503:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;30491:26;;30486:135;30523:1;30519;:5;30486:135;;;30558:12;30579:3;30571:5;:11;30558:25;;;;;;;:::i;:::-;;;;;30546:6;30553:1;30546:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;30608:1;30598:11;;;;;30526:3;;;;:::i;:::-;;;30486:135;;;;30648:1;30639:5;:10;30631:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;30711:6;30697:21;;;30275:451;;;;:::o;24614:127::-;24678:7;24705:28;:18;:26;:28::i;:::-;24698:35;;24614:127;:::o;17747:918::-;17836:7;17876:1;17860:5;:12;;;;:17;17856:58;;;17901:1;17894:8;;;;17856:58;17926:11;17952:12;17967:5;:12;;;;17952:27;;17992:424;18005:4;17999:3;:10;17992:424;;;18026:11;18040:23;18053:3;18058:4;18040:12;:23::i;:::-;18026:37;;18297:7;18284:5;18290:3;18284:10;;;;;;;;:::i;:::-;;;;;;;;;;:20;18280:125;;;18332:3;18325:10;;18280:125;;;18388:1;18382:3;:7;;;;:::i;:::-;18376:13;;18280:125;18011:405;17992:424;;;18542:1;18536:3;:7;:36;;;;;18565:7;18547:5;18559:1;18553:3;:7;;;;:::i;:::-;18547:14;;;;;;;;:::i;:::-;;;;;;;;;;:25;18536:36;18532:126;;;18602:1;18596:3;:7;;;;:::i;:::-;18589:14;;;;;;18532:126;18643:3;18636:10;;;;17747:918;;;;;:::o;19525:131::-;19634:1;19616:7;:14;;;:19;;;;;;;:::i;:::-;;;;;;;;19525:131;:::o;15194:125::-;;;;:::o;27931:146::-;27999:70;28015:24;:33;28040:7;28015:33;;;;;;;;;;;;;;;28050:18;28060:7;28050:9;:18::i;:::-;27999:15;:70::i;:::-;27931:146;:::o;28085:118::-;28142:53;28158:21;28181:13;:11;:13::i;:::-;28142:15;:53::i;:::-;28085:118::o;19403:114::-;19468:7;19495;:14;;;19488:21;;19403:114;;;:::o;16626:198::-;16688:7;16814:1;16808;16804;:5;;;;:::i;:::-;16798:1;16794;:5;;;;:::i;:::-;16793:17;;;;:::i;:::-;16792:23;;;;:::i;:::-;16786:1;16782;:5;;;;:::i;:::-;16776:1;16772;:5;;;;:::i;:::-;16771:17;;;;:::i;:::-;:45;;;;:::i;:::-;16764:52;;16626:198;;;;:::o;28211:310::-;28306:17;28326:23;:21;:23::i;:::-;28306:43;;28397:9;28364:30;28380:9;:13;;28364:15;:30::i;:::-;:42;28360:154;;;28423:9;:13;;28442:9;28423:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28467:9;:16;;28489:12;28467:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28360:154;28295:226;28211:310;;:::o;28529:212::-;28599:7;28637:1;28623:3;:10;;;;:15;28619:115;;;28662:1;28655:8;;;;28619:115;28703:3;28720:1;28707:3;:10;;;;:14;;;;:::i;:::-;28703:19;;;;;;;;:::i;:::-;;;;;;;;;;28696:26;;28529:212;;;;:::o;7:139:1:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;59:87;;;;:::o;152:139::-;198:5;236:6;223:20;214:29;;252:33;279:5;252:33;:::i;:::-;204:87;;;;:::o;297:137::-;342:5;380:6;367:20;358:29;;396:32;422:5;396:32;:::i;:::-;348:86;;;;:::o;453:552::-;510:8;520:6;570:3;563:4;555:6;551:17;547:27;537:2;;578:79;;:::i;:::-;537:2;691:6;678:20;668:30;;721:18;713:6;710:30;707:2;;;743:79;;:::i;:::-;707:2;857:4;849:6;845:17;833:29;;911:3;903:4;895:6;891:17;881:8;877:32;874:41;871:2;;;918:79;;:::i;:::-;871:2;527:478;;;;;:::o;1011:139::-;1057:5;1095:6;1082:20;1073:29;;1111:33;1138:5;1111:33;:::i;:::-;1063:87;;;;:::o;1156:329::-;1215:6;1264:2;1252:9;1243:7;1239:23;1235:32;1232:2;;;1270:79;;:::i;:::-;1232:2;1390:1;1415:53;1460:7;1451:6;1440:9;1436:22;1415:53;:::i;:::-;1405:63;;1361:117;1222:263;;;;:::o;1491:474::-;1559:6;1567;1616:2;1604:9;1595:7;1591:23;1587:32;1584:2;;;1622:79;;:::i;:::-;1584:2;1742:1;1767:53;1812:7;1803:6;1792:9;1788:22;1767:53;:::i;:::-;1757:63;;1713:117;1869:2;1895:53;1940:7;1931:6;1920:9;1916:22;1895:53;:::i;:::-;1885:63;;1840:118;1574:391;;;;;:::o;1971:619::-;2048:6;2056;2064;2113:2;2101:9;2092:7;2088:23;2084:32;2081:2;;;2119:79;;:::i;:::-;2081:2;2239:1;2264:53;2309:7;2300:6;2289:9;2285:22;2264:53;:::i;:::-;2254:63;;2210:117;2366:2;2392:53;2437:7;2428:6;2417:9;2413:22;2392:53;:::i;:::-;2382:63;;2337:118;2494:2;2520:53;2565:7;2556:6;2545:9;2541:22;2520:53;:::i;:::-;2510:63;;2465:118;2071:519;;;;;:::o;2596:672::-;2675:6;2683;2691;2740:2;2728:9;2719:7;2715:23;2711:32;2708:2;;;2746:79;;:::i;:::-;2708:2;2866:1;2891:53;2936:7;2927:6;2916:9;2912:22;2891:53;:::i;:::-;2881:63;;2837:117;3021:2;3010:9;3006:18;2993:32;3052:18;3044:6;3041:30;3038:2;;;3074:79;;:::i;:::-;3038:2;3187:64;3243:7;3234:6;3223:9;3219:22;3187:64;:::i;:::-;3169:82;;;;2964:297;2698:570;;;;;:::o;3274:474::-;3342:6;3350;3399:2;3387:9;3378:7;3374:23;3370:32;3367:2;;;3405:79;;:::i;:::-;3367:2;3525:1;3550:53;3595:7;3586:6;3575:9;3571:22;3550:53;:::i;:::-;3540:63;;3496:117;3652:2;3678:53;3723:7;3714:6;3703:9;3699:22;3678:53;:::i;:::-;3668:63;;3623:118;3357:391;;;;;:::o;3754:329::-;3813:6;3862:2;3850:9;3841:7;3837:23;3833:32;3830:2;;;3868:79;;:::i;:::-;3830:2;3988:1;4013:53;4058:7;4049:6;4038:9;4034:22;4013:53;:::i;:::-;4003:63;;3959:117;3820:263;;;;:::o;4089:474::-;4157:6;4165;4214:2;4202:9;4193:7;4189:23;4185:32;4182:2;;;4220:79;;:::i;:::-;4182:2;4340:1;4365:53;4410:7;4401:6;4390:9;4386:22;4365:53;:::i;:::-;4355:63;;4311:117;4467:2;4493:53;4538:7;4529:6;4518:9;4514:22;4493:53;:::i;:::-;4483:63;;4438:118;4172:391;;;;;:::o;4569:327::-;4627:6;4676:2;4664:9;4655:7;4651:23;4647:32;4644:2;;;4682:79;;:::i;:::-;4644:2;4802:1;4827:52;4871:7;4862:6;4851:9;4847:22;4827:52;:::i;:::-;4817:62;;4773:116;4634:262;;;;:::o;4902:329::-;4961:6;5010:2;4998:9;4989:7;4985:23;4981:32;4978:2;;;5016:79;;:::i;:::-;4978:2;5136:1;5161:53;5206:7;5197:6;5186:9;5182:22;5161:53;:::i;:::-;5151:63;;5107:117;4968:263;;;;:::o;5237:118::-;5324:24;5342:5;5324:24;:::i;:::-;5319:3;5312:37;5302:53;;:::o;5361:109::-;5442:21;5457:5;5442:21;:::i;:::-;5437:3;5430:34;5420:50;;:::o;5476:118::-;5563:24;5581:5;5563:24;:::i;:::-;5558:3;5551:37;5541:53;;:::o;5600:364::-;5688:3;5716:39;5749:5;5716:39;:::i;:::-;5771:71;5835:6;5830:3;5771:71;:::i;:::-;5764:78;;5851:52;5896:6;5891:3;5884:4;5877:5;5873:16;5851:52;:::i;:::-;5928:29;5950:6;5928:29;:::i;:::-;5923:3;5919:39;5912:46;;5692:272;;;;;:::o;5970:377::-;6076:3;6104:39;6137:5;6104:39;:::i;:::-;6159:89;6241:6;6236:3;6159:89;:::i;:::-;6152:96;;6257:52;6302:6;6297:3;6290:4;6283:5;6279:16;6257:52;:::i;:::-;6334:6;6329:3;6325:16;6318:23;;6080:267;;;;;:::o;6353:366::-;6495:3;6516:67;6580:2;6575:3;6516:67;:::i;:::-;6509:74;;6592:93;6681:3;6592:93;:::i;:::-;6710:2;6705:3;6701:12;6694:19;;6499:220;;;:::o;6725:366::-;6867:3;6888:67;6952:2;6947:3;6888:67;:::i;:::-;6881:74;;6964:93;7053:3;6964:93;:::i;:::-;7082:2;7077:3;7073:12;7066:19;;6871:220;;;:::o;7097:366::-;7239:3;7260:67;7324:2;7319:3;7260:67;:::i;:::-;7253:74;;7336:93;7425:3;7336:93;:::i;:::-;7454:2;7449:3;7445:12;7438:19;;7243:220;;;:::o;7469:366::-;7611:3;7632:67;7696:2;7691:3;7632:67;:::i;:::-;7625:74;;7708:93;7797:3;7708:93;:::i;:::-;7826:2;7821:3;7817:12;7810:19;;7615:220;;;:::o;7841:366::-;7983:3;8004:67;8068:2;8063:3;8004:67;:::i;:::-;7997:74;;8080:93;8169:3;8080:93;:::i;:::-;8198:2;8193:3;8189:12;8182:19;;7987:220;;;:::o;8213:366::-;8355:3;8376:67;8440:2;8435:3;8376:67;:::i;:::-;8369:74;;8452:93;8541:3;8452:93;:::i;:::-;8570:2;8565:3;8561:12;8554:19;;8359:220;;;:::o;8585:366::-;8727:3;8748:67;8812:2;8807:3;8748:67;:::i;:::-;8741:74;;8824:93;8913:3;8824:93;:::i;:::-;8942:2;8937:3;8933:12;8926:19;;8731:220;;;:::o;8957:366::-;9099:3;9120:67;9184:2;9179:3;9120:67;:::i;:::-;9113:74;;9196:93;9285:3;9196:93;:::i;:::-;9314:2;9309:3;9305:12;9298:19;;9103:220;;;:::o;9329:366::-;9471:3;9492:67;9556:2;9551:3;9492:67;:::i;:::-;9485:74;;9568:93;9657:3;9568:93;:::i;:::-;9686:2;9681:3;9677:12;9670:19;;9475:220;;;:::o;9701:366::-;9843:3;9864:67;9928:2;9923:3;9864:67;:::i;:::-;9857:74;;9940:93;10029:3;9940:93;:::i;:::-;10058:2;10053:3;10049:12;10042:19;;9847:220;;;:::o;10073:366::-;10215:3;10236:67;10300:2;10295:3;10236:67;:::i;:::-;10229:74;;10312:93;10401:3;10312:93;:::i;:::-;10430:2;10425:3;10421:12;10414:19;;10219:220;;;:::o;10445:366::-;10587:3;10608:67;10672:2;10667:3;10608:67;:::i;:::-;10601:74;;10684:93;10773:3;10684:93;:::i;:::-;10802:2;10797:3;10793:12;10786:19;;10591:220;;;:::o;10817:366::-;10959:3;10980:67;11044:2;11039:3;10980:67;:::i;:::-;10973:74;;11056:93;11145:3;11056:93;:::i;:::-;11174:2;11169:3;11165:12;11158:19;;10963:220;;;:::o;11189:402::-;11349:3;11370:85;11452:2;11447:3;11370:85;:::i;:::-;11363:92;;11464:93;11553:3;11464:93;:::i;:::-;11582:2;11577:3;11573:12;11566:19;;11353:238;;;:::o;11597:366::-;11739:3;11760:67;11824:2;11819:3;11760:67;:::i;:::-;11753:74;;11836:93;11925:3;11836:93;:::i;:::-;11954:2;11949:3;11945:12;11938:19;;11743:220;;;:::o;11969:366::-;12111:3;12132:67;12196:2;12191:3;12132:67;:::i;:::-;12125:74;;12208:93;12297:3;12208:93;:::i;:::-;12326:2;12321:3;12317:12;12310:19;;12115:220;;;:::o;12341:402::-;12501:3;12522:85;12604:2;12599:3;12522:85;:::i;:::-;12515:92;;12616:93;12705:3;12616:93;:::i;:::-;12734:2;12729:3;12725:12;12718:19;;12505:238;;;:::o;12749:366::-;12891:3;12912:67;12976:2;12971:3;12912:67;:::i;:::-;12905:74;;12988:93;13077:3;12988:93;:::i;:::-;13106:2;13101:3;13097:12;13090:19;;12895:220;;;:::o;13121:366::-;13263:3;13284:67;13348:2;13343:3;13284:67;:::i;:::-;13277:74;;13360:93;13449:3;13360:93;:::i;:::-;13478:2;13473:3;13469:12;13462:19;;13267:220;;;:::o;13493:118::-;13580:24;13598:5;13580:24;:::i;:::-;13575:3;13568:37;13558:53;;:::o;13617:112::-;13700:22;13716:5;13700:22;:::i;:::-;13695:3;13688:35;13678:51;;:::o;13735:967::-;14117:3;14139:148;14283:3;14139:148;:::i;:::-;14132:155;;14304:95;14395:3;14386:6;14304:95;:::i;:::-;14297:102;;14416:148;14560:3;14416:148;:::i;:::-;14409:155;;14581:95;14672:3;14663:6;14581:95;:::i;:::-;14574:102;;14693:3;14686:10;;14121:581;;;;;:::o;14708:222::-;14801:4;14839:2;14828:9;14824:18;14816:26;;14852:71;14920:1;14909:9;14905:17;14896:6;14852:71;:::i;:::-;14806:124;;;;:::o;14936:210::-;15023:4;15061:2;15050:9;15046:18;15038:26;;15074:65;15136:1;15125:9;15121:17;15112:6;15074:65;:::i;:::-;15028:118;;;;:::o;15152:222::-;15245:4;15283:2;15272:9;15268:18;15260:26;;15296:71;15364:1;15353:9;15349:17;15340:6;15296:71;:::i;:::-;15250:124;;;;:::o;15380:313::-;15493:4;15531:2;15520:9;15516:18;15508:26;;15580:9;15574:4;15570:20;15566:1;15555:9;15551:17;15544:47;15608:78;15681:4;15672:6;15608:78;:::i;:::-;15600:86;;15498:195;;;;:::o;15699:419::-;15865:4;15903:2;15892:9;15888:18;15880:26;;15952:9;15946:4;15942:20;15938:1;15927:9;15923:17;15916:47;15980:131;16106:4;15980:131;:::i;:::-;15972:139;;15870:248;;;:::o;16124:419::-;16290:4;16328:2;16317:9;16313:18;16305:26;;16377:9;16371:4;16367:20;16363:1;16352:9;16348:17;16341:47;16405:131;16531:4;16405:131;:::i;:::-;16397:139;;16295:248;;;:::o;16549:419::-;16715:4;16753:2;16742:9;16738:18;16730:26;;16802:9;16796:4;16792:20;16788:1;16777:9;16773:17;16766:47;16830:131;16956:4;16830:131;:::i;:::-;16822:139;;16720:248;;;:::o;16974:419::-;17140:4;17178:2;17167:9;17163:18;17155:26;;17227:9;17221:4;17217:20;17213:1;17202:9;17198:17;17191:47;17255:131;17381:4;17255:131;:::i;:::-;17247:139;;17145:248;;;:::o;17399:419::-;17565:4;17603:2;17592:9;17588:18;17580:26;;17652:9;17646:4;17642:20;17638:1;17627:9;17623:17;17616:47;17680:131;17806:4;17680:131;:::i;:::-;17672:139;;17570:248;;;:::o;17824:419::-;17990:4;18028:2;18017:9;18013:18;18005:26;;18077:9;18071:4;18067:20;18063:1;18052:9;18048:17;18041:47;18105:131;18231:4;18105:131;:::i;:::-;18097:139;;17995:248;;;:::o;18249:419::-;18415:4;18453:2;18442:9;18438:18;18430:26;;18502:9;18496:4;18492:20;18488:1;18477:9;18473:17;18466:47;18530:131;18656:4;18530:131;:::i;:::-;18522:139;;18420:248;;;:::o;18674:419::-;18840:4;18878:2;18867:9;18863:18;18855:26;;18927:9;18921:4;18917:20;18913:1;18902:9;18898:17;18891:47;18955:131;19081:4;18955:131;:::i;:::-;18947:139;;18845:248;;;:::o;19099:419::-;19265:4;19303:2;19292:9;19288:18;19280:26;;19352:9;19346:4;19342:20;19338:1;19327:9;19323:17;19316:47;19380:131;19506:4;19380:131;:::i;:::-;19372:139;;19270:248;;;:::o;19524:419::-;19690:4;19728:2;19717:9;19713:18;19705:26;;19777:9;19771:4;19767:20;19763:1;19752:9;19748:17;19741:47;19805:131;19931:4;19805:131;:::i;:::-;19797:139;;19695:248;;;:::o;19949:419::-;20115:4;20153:2;20142:9;20138:18;20130:26;;20202:9;20196:4;20192:20;20188:1;20177:9;20173:17;20166:47;20230:131;20356:4;20230:131;:::i;:::-;20222:139;;20120:248;;;:::o;20374:419::-;20540:4;20578:2;20567:9;20563:18;20555:26;;20627:9;20621:4;20617:20;20613:1;20602:9;20598:17;20591:47;20655:131;20781:4;20655:131;:::i;:::-;20647:139;;20545:248;;;:::o;20799:419::-;20965:4;21003:2;20992:9;20988:18;20980:26;;21052:9;21046:4;21042:20;21038:1;21027:9;21023:17;21016:47;21080:131;21206:4;21080:131;:::i;:::-;21072:139;;20970:248;;;:::o;21224:419::-;21390:4;21428:2;21417:9;21413:18;21405:26;;21477:9;21471:4;21467:20;21463:1;21452:9;21448:17;21441:47;21505:131;21631:4;21505:131;:::i;:::-;21497:139;;21395:248;;;:::o;21649:419::-;21815:4;21853:2;21842:9;21838:18;21830:26;;21902:9;21896:4;21892:20;21888:1;21877:9;21873:17;21866:47;21930:131;22056:4;21930:131;:::i;:::-;21922:139;;21820:248;;;:::o;22074:419::-;22240:4;22278:2;22267:9;22263:18;22255:26;;22327:9;22321:4;22317:20;22313:1;22302:9;22298:17;22291:47;22355:131;22481:4;22355:131;:::i;:::-;22347:139;;22245:248;;;:::o;22499:419::-;22665:4;22703:2;22692:9;22688:18;22680:26;;22752:9;22746:4;22742:20;22738:1;22727:9;22723:17;22716:47;22780:131;22906:4;22780:131;:::i;:::-;22772:139;;22670:248;;;:::o;22924:222::-;23017:4;23055:2;23044:9;23040:18;23032:26;;23068:71;23136:1;23125:9;23121:17;23112:6;23068:71;:::i;:::-;23022:124;;;;:::o;23152:214::-;23241:4;23279:2;23268:9;23264:18;23256:26;;23292:67;23356:1;23345:9;23341:17;23332:6;23292:67;:::i;:::-;23246:120;;;;:::o;23453:99::-;23505:6;23539:5;23533:12;23523:22;;23512:40;;;:::o;23558:169::-;23642:11;23676:6;23671:3;23664:19;23716:4;23711:3;23707:14;23692:29;;23654:73;;;;:::o;23733:148::-;23835:11;23872:3;23857:18;;23847:34;;;;:::o;23887:305::-;23927:3;23946:20;23964:1;23946:20;:::i;:::-;23941:25;;23980:20;23998:1;23980:20;:::i;:::-;23975:25;;24134:1;24066:66;24062:74;24059:1;24056:81;24053:2;;;24140:18;;:::i;:::-;24053:2;24184:1;24181;24177:9;24170:16;;23931:261;;;;:::o;24198:185::-;24238:1;24255:20;24273:1;24255:20;:::i;:::-;24250:25;;24289:20;24307:1;24289:20;:::i;:::-;24284:25;;24328:1;24318:2;;24333:18;;:::i;:::-;24318:2;24375:1;24372;24368:9;24363:14;;24240:143;;;;:::o;24389:348::-;24429:7;24452:20;24470:1;24452:20;:::i;:::-;24447:25;;24486:20;24504:1;24486:20;:::i;:::-;24481:25;;24674:1;24606:66;24602:74;24599:1;24596:81;24591:1;24584:9;24577:17;24573:105;24570:2;;;24681:18;;:::i;:::-;24570:2;24729:1;24726;24722:9;24711:20;;24437:300;;;;:::o;24743:191::-;24783:4;24803:20;24821:1;24803:20;:::i;:::-;24798:25;;24837:20;24855:1;24837:20;:::i;:::-;24832:25;;24876:1;24873;24870:8;24867:2;;;24881:18;;:::i;:::-;24867:2;24926:1;24923;24919:9;24911:17;;24788:146;;;;:::o;24940:96::-;24977:7;25006:24;25024:5;25006:24;:::i;:::-;24995:35;;24985:51;;;:::o;25042:90::-;25076:7;25119:5;25112:13;25105:21;25094:32;;25084:48;;;:::o;25138:77::-;25175:7;25204:5;25193:16;;25183:32;;;:::o;25221:149::-;25257:7;25297:66;25290:5;25286:78;25275:89;;25265:105;;;:::o;25376:126::-;25413:7;25453:42;25446:5;25442:54;25431:65;;25421:81;;;:::o;25508:77::-;25545:7;25574:5;25563:16;;25553:32;;;:::o;25591:86::-;25626:7;25666:4;25659:5;25655:16;25644:27;;25634:43;;;:::o;25683:307::-;25751:1;25761:113;25775:6;25772:1;25769:13;25761:113;;;25860:1;25855:3;25851:11;25845:18;25841:1;25836:3;25832:11;25825:39;25797:2;25794:1;25790:10;25785:15;;25761:113;;;25892:6;25889:1;25886:13;25883:2;;;25972:1;25963:6;25958:3;25954:16;25947:27;25883:2;25732:258;;;;:::o;25996:171::-;26035:3;26058:24;26076:5;26058:24;:::i;:::-;26049:33;;26104:4;26097:5;26094:15;26091:2;;;26112:18;;:::i;:::-;26091:2;26159:1;26152:5;26148:13;26141:20;;26039:128;;;:::o;26173:320::-;26217:6;26254:1;26248:4;26244:12;26234:22;;26301:1;26295:4;26291:12;26322:18;26312:2;;26378:4;26370:6;26366:17;26356:27;;26312:2;26440;26432:6;26429:14;26409:18;26406:38;26403:2;;;26459:18;;:::i;:::-;26403:2;26224:269;;;;:::o;26499:176::-;26531:1;26548:20;26566:1;26548:20;:::i;:::-;26543:25;;26582:20;26600:1;26582:20;:::i;:::-;26577:25;;26621:1;26611:2;;26626:18;;:::i;:::-;26611:2;26667:1;26664;26660:9;26655:14;;26533:142;;;;:::o;26681:180::-;26729:77;26726:1;26719:88;26826:4;26823:1;26816:15;26850:4;26847:1;26840:15;26867:180;26915:77;26912:1;26905:88;27012:4;27009:1;27002:15;27036:4;27033:1;27026:15;27053:180;27101:77;27098:1;27091:88;27198:4;27195:1;27188:15;27222:4;27219:1;27212:15;27239:180;27287:77;27284:1;27277:88;27384:4;27381:1;27374:15;27408:4;27405:1;27398:15;27425:180;27473:77;27470:1;27463:88;27570:4;27567:1;27560:15;27594:4;27591:1;27584:15;27611:117;27720:1;27717;27710:12;27734:117;27843:1;27840;27833:12;27857:117;27966:1;27963;27956:12;27980:117;28089:1;28086;28079:12;28103:117;28212:1;28209;28202:12;28226:102;28267:6;28318:2;28314:7;28309:2;28302:5;28298:14;28294:28;28284:38;;28274:54;;;:::o;28334:179::-;28474:31;28470:1;28462:6;28458:14;28451:55;28440:73;:::o;28519:182::-;28659:34;28655:1;28647:6;28643:14;28636:58;28625:76;:::o;28707:222::-;28847:34;28843:1;28835:6;28831:14;28824:58;28916:5;28911:2;28903:6;28899:15;28892:30;28813:116;:::o;28935:221::-;29075:34;29071:1;29063:6;29059:14;29052:58;29144:4;29139:2;29131:6;29127:15;29120:29;29041:115;:::o;29162:221::-;29302:34;29298:1;29290:6;29286:14;29279:58;29371:4;29366:2;29358:6;29354:15;29347:29;29268:115;:::o;29389:179::-;29529:31;29525:1;29517:6;29513:14;29506:55;29495:73;:::o;29574:221::-;29714:34;29710:1;29702:6;29698:14;29691:58;29783:4;29778:2;29770:6;29766:15;29759:29;29680:115;:::o;29801:225::-;29941:34;29937:1;29929:6;29925:14;29918:58;30010:8;30005:2;29997:6;29993:15;29986:33;29907:119;:::o;30032:227::-;30172:34;30168:1;30160:6;30156:14;30149:58;30241:10;30236:2;30228:6;30224:15;30217:35;30138:121;:::o;30265:220::-;30405:34;30401:1;30393:6;30389:14;30382:58;30474:3;30469:2;30461:6;30457:15;30450:28;30371:114;:::o;30491:224::-;30631:34;30627:1;30619:6;30615:14;30608:58;30700:7;30695:2;30687:6;30683:15;30676:32;30597:118;:::o;30721:223::-;30861:34;30857:1;30849:6;30845:14;30838:58;30930:6;30925:2;30917:6;30913:15;30906:31;30827:117;:::o;30950:172::-;31090:24;31086:1;31078:6;31074:14;31067:48;31056:66;:::o;31128:173::-;31268:25;31264:1;31256:6;31252:14;31245:49;31234:67;:::o;31307:182::-;31447:34;31443:1;31435:6;31431:14;31424:58;31413:76;:::o;31495:224::-;31635:34;31631:1;31623:6;31619:14;31612:58;31704:7;31699:2;31691:6;31687:15;31680:32;31601:118;:::o;31725:167::-;31865:19;31861:1;31853:6;31849:14;31842:43;31831:61;:::o;31898:234::-;32038:34;32034:1;32026:6;32022:14;32015:58;32107:17;32102:2;32094:6;32090:15;32083:42;32004:128;:::o;32138:181::-;32278:33;32274:1;32266:6;32262:14;32255:57;32244:75;:::o;32325:122::-;32398:24;32416:5;32398:24;:::i;:::-;32391:5;32388:35;32378:2;;32437:1;32434;32427:12;32378:2;32368:79;:::o;32453:122::-;32526:24;32544:5;32526:24;:::i;:::-;32519:5;32516:35;32506:2;;32565:1;32562;32555:12;32506:2;32496:79;:::o;32581:120::-;32653:23;32670:5;32653:23;:::i;:::-;32646:5;32643:34;32633:2;;32691:1;32688;32681:12;32633:2;32623:78;:::o;32707:122::-;32780:24;32798:5;32780:24;:::i;:::-;32773:5;32770:35;32760:2;;32819:1;32816;32809:12;32760:2;32750:79;:::o

Swarm Source

ipfs://f4293a733c9274a07826994d13da8c969e9216310e42a59aa54ab6813662a1ae
Loading