ETH Price: $3,481.34 (+0.94%)

Token

 

Overview

Max Total Supply

96

Holders

95

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
rodortega.eth
0x38d6C6074A667379ce2F6107aaD93584Fa3cA61A
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Trust

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-03
*/

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/Strings.sol


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @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);
    }
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

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);
}

// File: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

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

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

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

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

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

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/contracts/utils/structs/EnumerableSet.sol


// OpenZeppelin Contracts v4.4.1 (utils/structs/EnumerableSet.sol)

pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastvalue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastvalue;
                // Update the index for the moved value
                set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        return _values(set._inner);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        assembly {
            result := store
        }

        return result;
    }
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;


/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
        @dev Handles the receipt of a single ERC1155 token type. This function is
        called at the end of a `safeTransferFrom` after the balance has been updated.
        To accept the transfer, this must return
        `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
        (i.e. 0xf23a6e61, or its own function selector).
        @param operator The address which initiated the transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param id The ID of the token being transferred
        @param value The amount of tokens being transferred
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
    */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
        @dev Handles the receipt of a multiple ERC1155 token types. This function
        is called at the end of a `safeBatchTransferFrom` after the balances have
        been updated. To accept the transfer(s), this must return
        `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
        (i.e. 0xbc197c81, or its own function selector).
        @param operator The address which initiated the batch transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param ids An array containing ids of each token being transferred (order and length must match values array)
        @param values An array containing amounts of each token being transferred (order and length must match ids array)
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
    */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

// File: @manifoldxyz/libraries-solidity/contracts/access/IAdminControl.sol



pragma solidity ^0.8.0;




/**
 * @dev Interface for admin control
 */
interface IAdminControl is IERC165 {

    event AdminApproved(address indexed account, address indexed sender);
    event AdminRevoked(address indexed account, address indexed sender);

    /**
     * @dev gets address of all admins
     */
    function getAdmins() external view returns (address[] memory);

    /**
     * @dev add an admin.  Can only be called by contract owner.
     */
    function approveAdmin(address admin) external;

    /**
     * @dev remove an admin.  Can only be called by contract owner.
     */
    function revokeAdmin(address admin) external;

    /**
     * @dev checks whether or not given address is an admin
     * Returns True if they are
     */
    function isAdmin(address admin) external view returns (bool);

}
// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC1155/ERC1155.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/ERC1155.sol)

pragma solidity ^0.8.0;







/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

    // Mapping from account to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

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

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: balance query for the zero address");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC1155-isApprovedForAll}.
     */
    function isApprovedForAll(address account, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[account][operator];
    }

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: transfer caller is not owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, _asSingletonArray(id), _asSingletonArray(amount), data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), _asSingletonArray(id), _asSingletonArray(amount), "");

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC1155: setting approval status for self");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

// File: @manifoldxyz/libraries-solidity/contracts/access/AdminControl.sol



pragma solidity ^0.8.0;






abstract contract AdminControl is Ownable, IAdminControl, ERC165 {
    using EnumerableSet for EnumerableSet.AddressSet;

    // Track registered admins
    EnumerableSet.AddressSet private _admins;

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

    /**
     * @dev Only allows approved admins to call the specified function
     */
    modifier adminRequired() {
        require(owner() == msg.sender || _admins.contains(msg.sender), "AdminControl: Must be owner or admin");
        _;
    }   

    /**
     * @dev See {IAdminControl-getAdmins}.
     */
    function getAdmins() external view override returns (address[] memory admins) {
        admins = new address[](_admins.length());
        for (uint i = 0; i < _admins.length(); i++) {
            admins[i] = _admins.at(i);
        }
        return admins;
    }

    /**
     * @dev See {IAdminControl-approveAdmin}.
     */
    function approveAdmin(address admin) external override onlyOwner {
        if (!_admins.contains(admin)) {
            emit AdminApproved(admin, msg.sender);
            _admins.add(admin);
        }
    }

    /**
     * @dev See {IAdminControl-revokeAdmin}.
     */
    function revokeAdmin(address admin) external override onlyOwner {
        if (_admins.contains(admin)) {
            emit AdminRevoked(admin, msg.sender);
            _admins.remove(admin);
        }
    }

    /**
     * @dev See {IAdminControl-isAdmin}.
     */
    function isAdmin(address admin) public override view returns (bool) {
        return (owner() == admin || _admins.contains(admin));
    }

}
// File: contracts/TrustDK.sol



pragma solidity >=0.7.0 <0.9.0;


// @developer: CardoLove.eth
// @artist: danielko.eth

contract Trust is AdminControl, ERC1155 {
    using Strings for uint256;

    address public ashContract = 0x64D91f12Ece7362F91A6f8E7940Cd55F05060b92;
    uint256 public ashPrice = 15000000000000000000; // 15 ASH
    uint256 public ashBalance;

    uint256 private _royaltyBps;
    address payable private _royaltyRecipient;
    bytes4 private constant _INTERFACE_ID_ROYALTIES_EIP2981 = 0x2a55205a;
    bytes4 private constant _INTERFACE_ID_ROYALTIES_RARIBLE = 0xb7799584;

    bool public isActive;

    uint256 public maxSupply = 99;
    uint256 public publicSupply = 21;
    uint256 public currSupply;

    struct Params {
        string[] uris; 
        uint256 startBlk;     
        uint256 interval;        
    }

    mapping(address => bool) public whitelisted;
    mapping(address => bool) public hasMinted;
    mapping(address => bool) public trusted;
    mapping(address => uint256) private bonusesMinted;
    mapping(uint256 => Params) private params;

    constructor() ERC1155("") {}

    //*** Internal ***
    function mint(uint value) internal {
        IERC20(ashContract).transferFrom(msg.sender, address(this), value);
        ashBalance += value;

        _mint(msg.sender, 0, 1, "");

        trusted[msg.sender] = true;
        hasMinted[msg.sender] = true;
        currSupply++;
    }

    // *** Public functions ***
    function privateMint(uint value) external payable {
        require(isActive, "Private minting is not active");
        require(value >= ashPrice, "You are trying to buy under mint price");
        require(!hasMinted[msg.sender], "You can only mint once");
        require(currSupply < maxSupply, "Sold out");

        if (whitelisted[msg.sender]) {
            mint(value);
            whitelisted[msg.sender] = false;
        } else {
            require(publicSupply > 0, "Public sale has sold out");
            mint(value);
            publicSupply--;
        }
    }

    function useTrust(uint256 tokenId) external {
        require(trusted[msg.sender], "You don't have trust or you've lost it");
        require(bonusesMinted[msg.sender] < 1, "You used your bonus mints");
        require(params[0].uris.length > 0, "You're too soon");
        require(tokenId > 0, "You can't mint more trust");

        _mint(msg.sender, tokenId, 1, "");
        bonusesMinted[msg.sender]++;
    }

    // *** View function ***
    function getCurrentBlock() public view returns (uint256) {
        return block.timestamp;
    }

    function getIteration(uint256 tokenId) public view returns (uint256) {
        return (block.timestamp - params[tokenId].startBlk / params[tokenId].interval) % params[tokenId].uris.length;
    }

    function getPublicSupply() public view returns (uint) {
        return publicSupply;
    }

    // *** URI ***
    function uri(uint256 tokenId) public view virtual override returns (string memory) {
        Params memory tokenParams = params[tokenId];
         if (tokenParams.uris.length == 1) {
            return tokenParams.uris[0];
        }
        return tokenParams.uris[getIteration(tokenId)];
    }

    // *** Admin Functions ***
    function adminMint(uint256 tokenId, address[] calldata addresses, uint256 amount) external adminRequired {
        for (uint256 i; i < addresses.length; i++) {
            _mint(addresses[i], tokenId, amount, "");
        }
    }

    function updateParams(uint256 tokenId, string[] calldata _uris, uint256 _startBlk, uint256 _interval) external adminRequired {
        Params memory newParam;
        newParam.uris = _uris;
        newParam.startBlk = _startBlk;
        newParam.interval = _interval;
        params[tokenId] = newParam;
    }

    function updateWhitelist(address[] calldata addresses) external adminRequired {
        for (uint256 i; i < addresses.length; i++) {
            whitelisted[addresses[i]] = true;
        }
    }

    function updatePublicSupply(uint256 amount) external adminRequired {
        publicSupply = amount;
    }

    function updateAshInfo(address _ashContract, uint256 _ashPrice) external adminRequired {
        ashContract = _ashContract;
        ashPrice = _ashPrice;
    }

    function activateMinting() external adminRequired {
        require(_royaltyRecipient != address(0x0), "Must set royalty recipient");
        require(params[0].uris.length > 0, "URI data has not been set");
        require(ashPrice > 0, "Minting price in ASH has not been set");

        isActive = true;
    }

    function deactivateMinting() external adminRequired {
        isActive = false;
    }

    function regainTrust(address[] calldata addresses) external adminRequired {
        for (uint256 i; i < addresses.length; i++) {
            trusted[addresses[i]] = true;
        }
    }

    // *** Override ***
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual override {
        super._safeTransferFrom(from, to, id, amount, data);
        trusted[from] = false;
    }

    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override {
        super._safeBatchTransferFrom(from, to, ids, amounts, data);
        trusted[from] = false;
    }

    // *** Interface ***
    function supportsInterface(bytes4 interfaceId) public view virtual override(AdminControl, ERC1155) returns (bool) {
        return 
            ERC1155.supportsInterface(interfaceId) || 
            AdminControl.supportsInterface(interfaceId) || 
            interfaceId == _INTERFACE_ID_ROYALTIES_EIP2981 || 
            interfaceId == _INTERFACE_ID_ROYALTIES_RARIBLE ||
            super.supportsInterface(interfaceId);
    }

    // *** Royalties ***
    function updateRoyalties(address payable recipient, uint256 bps) external adminRequired {
        _royaltyRecipient = recipient;
        _royaltyBps = bps;
    }

    function royaltyInfo(uint256, uint256 value) external view returns (address, uint256) {
        return (_royaltyRecipient, value*_royaltyBps/10000);
    }

    // *** Withdraw ***
    function withdraw() external adminRequired {
        IERC20(ashContract).transfer(msg.sender, ashBalance);
        ashBalance = 0;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"AdminApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"AdminRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"activateMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"adminMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"approveAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ashBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ashContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ashPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deactivateMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAdmins","outputs":[{"internalType":"address[]","name":"admins","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getIteration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPublicSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hasMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"isAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"privateMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"regainTrust","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"revokeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"trusted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_ashContract","type":"address"},{"internalType":"uint256","name":"_ashPrice","type":"uint256"}],"name":"updateAshInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string[]","name":"_uris","type":"string[]"},{"internalType":"uint256","name":"_startBlk","type":"uint256"},{"internalType":"uint256","name":"_interval","type":"uint256"}],"name":"updateParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"updatePublicSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"recipient","type":"address"},{"internalType":"uint256","name":"bps","type":"uint256"}],"name":"updateRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"updateWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"useTrust","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040527364d91f12ece7362f91a6f8e7940cd55f05060b92600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555067d02ab486cedc00006007556063600b556015600c553480156200007c57600080fd5b5060405180602001604052806000815250620000ad620000a1620000c560201b60201c565b620000cd60201b60201c565b620000be816200019160201b60201c565b50620002c2565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8060059080519060200190620001a9929190620001ad565b5050565b828054620001bb906200025d565b90600052602060002090601f016020900481019282620001df57600085556200022b565b82601f10620001fa57805160ff19168380011785556200022b565b828001600101855582156200022b579182015b828111156200022a5782518255916020019190600101906200020d565b5b5090506200023a91906200023e565b5090565b5b80821115620002595760008160009055506001016200023f565b5090565b600060028204905060018216806200027657607f821691505b602082108114156200028d576200028c62000293565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b615d6c80620002d26000396000f3fe6080604052600436106102455760003560e01c80636c2f5acd11610139578063ab7873fb116100b6578063f242432a1161007a578063f242432a14610881578063f2f29ae9146108aa578063f2fde38b146108c1578063fac6cbc2146108ea578063fbd9f00014610913578063fed42d1d1461095057610245565b8063ab7873fb146107a9578063abfe40a8146107c0578063d5abeb01146107dc578063d936547e14610807578063e985e9c51461084457610245565b806373cbd8ce116100fd57806373cbd8ce146106d45780638cf77604146106ff5780638da5cb5b1461072a578063a22cb46514610755578063a420ed3e1461077e57610245565b80636c2f5acd146106055780636d73e6691461062e5780636e9821c2146106575780637078273b14610694578063715018a6146106bd57610245565b806338e21cce116101c757806358d750e81161018b57806358d750e8146105345780635e84d7231461055d5780635f0b2b0c14610588578063672d5d3b146105b15780636904adb7146105dc57610245565b806338e21cce1461044d5780633ccfd60b1461048a57806340548dcb146104a15780634e1273f4146104cc5780635762ac591461050957610245565b80632a55205a1161020e5780632a55205a146103695780632d345670146103a75780632eb2c2d6146103d057806331ae450b146103f9578063353772141461042457610245565b8062fdd58e1461024a57806301ffc9a7146102875780630e89341c146102c457806322f3e2d41461030157806324d7806c1461032c575b600080fd5b34801561025657600080fd5b50610271600480360381019061026c91906141d8565b610979565b60405161027e9190614f39565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a9919061430a565b610a43565b6040516102bb9190614bbc565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e69190614364565b610b13565b6040516102f89190614bd7565b60405180910390f35b34801561030d57600080fd5b50610316610c8a565b6040516103239190614bbc565b60405180910390f35b34801561033857600080fd5b50610353600480360381019061034e9190613f85565b610c9d565b6040516103609190614bbc565b60405180910390f35b34801561037557600080fd5b50610390600480360381019061038b919061448d565b610cf7565b60405161039e929190614b18565b60405180910390f35b3480156103b357600080fd5b506103ce60048036038101906103c99190613f85565b610d43565b005b3480156103dc57600080fd5b506103f760048036038101906103f29190614032565b610e4b565b005b34801561040557600080fd5b5061040e610eec565b60405161041b9190614b41565b60405180910390f35b34801561043057600080fd5b5061044b60048036038101906104469190614218565b610fce565b005b34801561045957600080fd5b50610474600480360381019061046f9190613f85565b611103565b6040516104819190614bbc565b60405180910390f35b34801561049657600080fd5b5061049f611123565b005b3480156104ad57600080fd5b506104b661126f565b6040516104c39190614f39565b60405180910390f35b3480156104d857600080fd5b506104f360048036038101906104ee9190614265565b611275565b6040516105009190614b63565b60405180910390f35b34801561051557600080fd5b5061051e61138e565b60405161052b9190614f39565b60405180910390f35b34801561054057600080fd5b5061055b60048036038101906105569190614405565b611394565b005b34801561056957600080fd5b506105726114a5565b60405161057f9190614f39565b60405180910390f35b34801561059457600080fd5b506105af60048036038101906105aa91906141d8565b6114ab565b005b3480156105bd57600080fd5b506105c6611587565b6040516105d39190614f39565b60405180910390f35b3480156105e857600080fd5b5061060360048036038101906105fe9190614364565b61158f565b005b34801561061157600080fd5b5061062c60048036038101906106279190613fb2565b611629565b005b34801561063a57600080fd5b5061065560048036038101906106509190613f85565b611705565b005b34801561066357600080fd5b5061067e60048036038101906106799190613f85565b61180c565b60405161068b9190614bbc565b60405180910390f35b3480156106a057600080fd5b506106bb60048036038101906106b69190614391565b61182c565b005b3480156106c957600080fd5b506106d2611926565b005b3480156106e057600080fd5b506106e96119ae565b6040516106f69190614f39565b60405180910390f35b34801561070b57600080fd5b506107146119b8565b6040516107219190614f39565b60405180910390f35b34801561073657600080fd5b5061073f6119be565b60405161074c9190614a04565b60405180910390f35b34801561076157600080fd5b5061077c60048036038101906107779190614198565b6119e7565b005b34801561078a57600080fd5b506107936119fd565b6040516107a09190614a04565b60405180910390f35b3480156107b557600080fd5b506107be611a23565b005b6107da60048036038101906107d59190614364565b611c03565b005b3480156107e857600080fd5b506107f1611e8c565b6040516107fe9190614f39565b60405180910390f35b34801561081357600080fd5b5061082e60048036038101906108299190613f85565b611e92565b60405161083b9190614bbc565b60405180910390f35b34801561085057600080fd5b5061086b60048036038101906108669190613ff2565b611eb2565b6040516108789190614bbc565b60405180910390f35b34801561088d57600080fd5b506108a860048036038101906108a39190614101565b611f46565b005b3480156108b657600080fd5b506108bf611fe7565b005b3480156108cd57600080fd5b506108e860048036038101906108e39190613f85565b612094565b005b3480156108f657600080fd5b50610911600480360381019061090c9190614218565b61218c565b005b34801561091f57600080fd5b5061093a60048036038101906109359190614364565b6122c1565b6040516109479190614f39565b60405180910390f35b34801561095c57600080fd5b5061097760048036038101906109729190614364565b612331565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e190614c39565b60405180910390fd5b6003600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000610a4e82612552565b80610a5e5750610a5d82612634565b5b80610aad5750632a55205a60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610afc575063b779958460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b0c5750610b0b82612552565b5b9050919050565b606060006012600084815260200190815260200160002060405180606001604052908160008201805480602002602001604051908101604052809291908181526020016000905b82821015610c06578382906000526020600020018054610b799061534e565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba59061534e565b8015610bf25780601f10610bc757610100808354040283529160200191610bf2565b820191906000526020600020905b815481529060010190602001808311610bd557829003601f168201915b505050505081526020019060010190610b5a565b50505050815260200160018201548152602001600282015481525050905060018160000151511415610c5a578060000151600081518110610c4a57610c496154e7565b5b6020026020010151915050610c85565b8060000151610c68846122c1565b81518110610c7957610c786154e7565b5b60200260200101519150505b919050565b600a60149054906101000a900460ff1681565b60008173ffffffffffffffffffffffffffffffffffffffff16610cbe6119be565b73ffffffffffffffffffffffffffffffffffffffff161480610cf05750610cef8260016126ae90919063ffffffff16565b5b9050919050565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661271060095485610d2e91906151b9565b610d389190615188565b915091509250929050565b610d4b6126de565b73ffffffffffffffffffffffffffffffffffffffff16610d696119be565b73ffffffffffffffffffffffffffffffffffffffff1614610dbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db690614e19565b60405180910390fd5b610dd38160016126ae90919063ffffffff16565b15610e48573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f7c0c3c84c67c85fcac635147348bfe374c24a1a93d0366d1cfe9d8853cbf89d560405160405180910390a3610e468160016126e690919063ffffffff16565b505b50565b610e536126de565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610e995750610e9885610e936126de565b611eb2565b5b610ed8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecf90614d79565b60405180910390fd5b610ee58585858585612716565b5050505050565b6060610ef86001612782565b67ffffffffffffffff811115610f1157610f10615516565b5b604051908082528060200260200182016040528015610f3f5781602001602082028036833780820191505090505b50905060005b610f4f6001612782565b811015610fca57610f6a81600161279790919063ffffffff16565b828281518110610f7d57610f7c6154e7565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080610fc2906153b1565b915050610f45565b5090565b3373ffffffffffffffffffffffffffffffffffffffff16610fed6119be565b73ffffffffffffffffffffffffffffffffffffffff16148061101f575061101e3360016126ae90919063ffffffff16565b5b61105e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105590614e59565b60405180910390fd5b60005b828290508110156110fe576001600e6000858585818110611085576110846154e7565b5b905060200201602081019061109a9190613f85565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806110f6906153b1565b915050611061565b505050565b600f6020528060005260406000206000915054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff166111426119be565b73ffffffffffffffffffffffffffffffffffffffff16148061117457506111733360016126ae90919063ffffffff16565b5b6111b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111aa90614e59565b60405180910390fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb336008546040518363ffffffff1660e01b8152600401611212929190614b18565b602060405180830381600087803b15801561122c57600080fd5b505af1158015611240573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126491906142dd565b506000600881905550565b60085481565b606081518351146112bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b290614ed9565b60405180910390fd5b6000835167ffffffffffffffff8111156112d8576112d7615516565b5b6040519080825280602002602001820160405280156113065781602001602082028036833780820191505090505b50905060005b84518110156113835761135385828151811061132b5761132a6154e7565b5b6020026020010151858381518110611346576113456154e7565b5b6020026020010151610979565b828281518110611366576113656154e7565b5b6020026020010181815250508061137c906153b1565b905061130c565b508091505092915050565b600d5481565b3373ffffffffffffffffffffffffffffffffffffffff166113b36119be565b73ffffffffffffffffffffffffffffffffffffffff1614806113e557506113e43360016126ae90919063ffffffff16565b5b611424576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141b90614e59565b60405180910390fd5b61142c613a14565b84849061143991906152cd565b8160000181905250828160200181815250508181604001818152505080601260008881526020019081526020016000206000820151816000019080519060200190611485929190613a35565b506020820151816001015560408201518160020155905050505050505050565b600c5481565b3373ffffffffffffffffffffffffffffffffffffffff166114ca6119be565b73ffffffffffffffffffffffffffffffffffffffff1614806114fc57506114fb3360016126ae90919063ffffffff16565b5b61153b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153290614e59565b60405180910390fd5b81600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806007819055505050565b600042905090565b3373ffffffffffffffffffffffffffffffffffffffff166115ae6119be565b73ffffffffffffffffffffffffffffffffffffffff1614806115e057506115df3360016126ae90919063ffffffff16565b5b61161f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161690614e59565b60405180910390fd5b80600c8190555050565b3373ffffffffffffffffffffffffffffffffffffffff166116486119be565b73ffffffffffffffffffffffffffffffffffffffff16148061167a57506116793360016126ae90919063ffffffff16565b5b6116b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b090614e59565b60405180910390fd5b81600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806009819055505050565b61170d6126de565b73ffffffffffffffffffffffffffffffffffffffff1661172b6119be565b73ffffffffffffffffffffffffffffffffffffffff1614611781576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177890614e19565b60405180910390fd5b6117958160016126ae90919063ffffffff16565b611809573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f7e1a1a08d52e4ba0e21554733d66165fd5151f99460116223d9e3a608eec5cb160405160405180910390a36118078160016127b190919063ffffffff16565b505b50565b60106020528060005260406000206000915054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff1661184b6119be565b73ffffffffffffffffffffffffffffffffffffffff16148061187d575061187c3360016126ae90919063ffffffff16565b5b6118bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b390614e59565b60405180910390fd5b60005b8383905081101561191f5761190c8484838181106118e0576118df6154e7565b5b90506020020160208101906118f59190613f85565b8684604051806020016040528060008152506127e1565b8080611917906153b1565b9150506118bf565b5050505050565b61192e6126de565b73ffffffffffffffffffffffffffffffffffffffff1661194c6119be565b73ffffffffffffffffffffffffffffffffffffffff16146119a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199990614e19565b60405180910390fd5b6119ac6000612978565b565b6000600c54905090565b60075481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6119f96119f26126de565b8383612a3c565b5050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b3373ffffffffffffffffffffffffffffffffffffffff16611a426119be565b73ffffffffffffffffffffffffffffffffffffffff161480611a745750611a733360016126ae90919063ffffffff16565b5b611ab3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aaa90614e59565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611b45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3c90614d99565b60405180910390fd5b6000601260008081526020019081526020016000206000018054905011611ba1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9890614d39565b60405180910390fd5b600060075411611be6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdd90614dd9565b60405180910390fd5b6001600a60146101000a81548160ff021916908315150217905550565b600a60149054906101000a900460ff16611c52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4990614e99565b60405180910390fd5b600754811015611c97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8e90614d19565b60405180910390fd5b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611d24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1b90614e79565b60405180910390fd5b600b54600d5410611d6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6190614e39565b60405180910390fd5b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611e2257611dc581612ba9565b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611e89565b6000600c5411611e67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5e90614cf9565b60405180910390fd5b611e7081612ba9565b600c6000815480929190611e8390615324565b91905055505b50565b600b5481565b600e6020528060005260406000206000915054906101000a900460ff1681565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611f4e6126de565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611f945750611f9385611f8e6126de565b611eb2565b5b611fd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fca90614c99565b60405180910390fd5b611fe08585858585612d5c565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff166120066119be565b73ffffffffffffffffffffffffffffffffffffffff16148061203857506120373360016126ae90919063ffffffff16565b5b612077576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206e90614e59565b60405180910390fd5b6000600a60146101000a81548160ff021916908315150217905550565b61209c6126de565b73ffffffffffffffffffffffffffffffffffffffff166120ba6119be565b73ffffffffffffffffffffffffffffffffffffffff1614612110576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210790614e19565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612180576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217790614c59565b60405180910390fd5b61218981612978565b50565b3373ffffffffffffffffffffffffffffffffffffffff166121ab6119be565b73ffffffffffffffffffffffffffffffffffffffff1614806121dd57506121dc3360016126ae90919063ffffffff16565b5b61221c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221390614e59565b60405180910390fd5b60005b828290508110156122bc57600160106000858585818110612243576122426154e7565b5b90506020020160208101906122589190613f85565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806122b4906153b1565b91505061221f565b505050565b60006012600083815260200190815260200160002060000180549050601260008481526020019081526020016000206002015460126000858152602001908152602001600020600101546123159190615188565b426123209190615213565b61232a91906153fa565b9050919050565b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166123bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b490614c79565b60405180910390fd5b6001601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541061243f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243690614cb9565b60405180910390fd5b600060126000808152602001908152602001600020600001805490501161249b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249290614db9565b60405180910390fd5b600081116124de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d590614cd9565b60405180910390fd5b6124fa33826001604051806020016040528060008152506127e1565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061254a906153b1565b919050555050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061261d57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061262d575061262c82612634565b5b9050919050565b60007f553e757e000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806126a757506126a682612dc8565b5b9050919050565b60006126d6836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612e32565b905092915050565b600033905090565b600061270e836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612e55565b905092915050565b6127238585858585612f69565b6000601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050505050565b600061279082600001613280565b9050919050565b60006127a68360000183613291565b60001c905092915050565b60006127d9836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6132bc565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612851576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284890614f19565b60405180910390fd5b600061285b6126de565b905061287c8160008761286d8861332c565b6128768861332c565b876133a6565b826003600086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128dc9190615132565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62878760405161295a929190614f54565b60405180910390a4612971816000878787876133ae565b5050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612aab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aa290614eb9565b60405180910390fd5b80600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612b9c9190614bbc565b60405180910390a3505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b8152600401612c0893929190614a87565b602060405180830381600087803b158015612c2257600080fd5b505af1158015612c36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c5a91906142dd565b508060086000828254612c6d9190615132565b92505081905550612c913360006001604051806020016040528060008152506127e1565b6001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600d6000815480929190612d54906153b1565b919050555050565b612d698585858585613595565b6000601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600080836001016000848152602001908152602001600020541415905092915050565b60008083600101600084815260200190815260200160002054905060008114612f5d576000600182612e879190615213565b9050600060018660000180549050612e9f9190615213565b9050818114612f0e576000866000018281548110612ec057612ebf6154e7565b5b9060005260206000200154905080876000018481548110612ee457612ee36154e7565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480612f2257612f216154b8565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050612f63565b60009150505b92915050565b8151835114612fad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fa490614ef9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561301d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301490614d59565b60405180910390fd5b60006130276126de565b90506130378187878787876133a6565b60005b84518110156131eb576000858281518110613058576130576154e7565b5b602002602001015190506000858381518110613077576130766154e7565b5b6020026020010151905060006003600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613119576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161311090614df9565b60405180910390fd5b8181036003600085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816003600085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131d09190615132565b92505081905550505050806131e4906153b1565b905061303a565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051613262929190614b85565b60405180910390a461327881878787878761381a565b505050505050565b600081600001805490509050919050565b60008260000182815481106132a9576132a86154e7565b5b9060005260206000200154905092915050565b60006132c88383612e32565b613321578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050613326565b600090505b92915050565b60606000600167ffffffffffffffff81111561334b5761334a615516565b5b6040519080825280602002602001820160405280156133795781602001602082028036833780820191505090505b5090508281600081518110613391576133906154e7565b5b60200260200101818152505080915050919050565b505050505050565b6133cd8473ffffffffffffffffffffffffffffffffffffffff16613a01565b1561358d578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401613413959493929190614abe565b602060405180830381600087803b15801561342d57600080fd5b505af192505050801561345e57506040513d601f19601f8201168201806040525081019061345b9190614337565b60015b6135045761346a615545565b806308c379a014156134c7575061347f615c2d565b8061348a57506134c9565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134be9190614bd7565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134fb90614bf9565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461358b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161358290614c19565b60405180910390fd5b505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613605576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135fc90614d59565b60405180910390fd5b600061360f6126de565b905061362f8187876136208861332c565b6136298861332c565b876133a6565b60006003600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050838110156136c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136be90614df9565b60405180910390fd5b8381036003600087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550836003600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461377e9190615132565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6288886040516137fb929190614f54565b60405180910390a46138118288888888886133ae565b50505050505050565b6138398473ffffffffffffffffffffffffffffffffffffffff16613a01565b156139f9578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b815260040161387f959493929190614a1f565b602060405180830381600087803b15801561389957600080fd5b505af19250505080156138ca57506040513d601f19601f820116820180604052508101906138c79190614337565b60015b613970576138d6615545565b806308c379a0141561393357506138eb615c2d565b806138f65750613935565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161392a9190614bd7565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161396790614bf9565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146139f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139ee90614c19565b60405180910390fd5b505b505050505050565b600080823b905060008111915050919050565b60405180606001604052806060815260200160008152602001600081525090565b828054828255906000526020600020908101928215613a84579160200282015b82811115613a83578251829080519060200190613a73929190613a95565b5091602001919060010190613a55565b5b509050613a919190613b1b565b5090565b828054613aa19061534e565b90600052602060002090601f016020900481019282613ac35760008555613b0a565b82601f10613adc57805160ff1916838001178555613b0a565b82800160010185558215613b0a579182015b82811115613b09578251825591602001919060010190613aee565b5b509050613b179190613b3f565b5090565b5b80821115613b3b5760008181613b329190613b5c565b50600101613b1c565b5090565b5b80821115613b58576000816000905550600101613b40565b5090565b508054613b689061534e565b6000825580601f10613b7a5750613b99565b601f016020900490600052602060002090810190613b989190613b3f565b5b50565b6000613baf613baa84614fa2565b614f7d565b90508083825260208201905082856020860282011115613bd257613bd1615571565b5b60005b85811015613c025781613be88882613d8e565b845260208401935060208301925050600181019050613bd5565b5050509392505050565b6000613c1f613c1a84614fce565b614f7d565b90508083825260208201905082856020860282011115613c4257613c41615571565b5b60005b85811015613c9057813567ffffffffffffffff811115613c6857613c6761556c565b5b808601613c758982613f42565b85526020850194506020840193505050600181019050613c45565b5050509392505050565b6000613cad613ca884614ffa565b614f7d565b90508083825260208201905082856020860282011115613cd057613ccf615571565b5b60005b85811015613d005781613ce68882613f70565b845260208401935060208301925050600181019050613cd3565b5050509392505050565b6000613d1d613d1884615026565b614f7d565b905082815260208101848484011115613d3957613d38615576565b5b613d448482856152e2565b509392505050565b6000613d5f613d5a84615057565b614f7d565b905082815260208101848484011115613d7b57613d7a615576565b5b613d868482856152e2565b509392505050565b600081359050613d9d81615cc3565b92915050565b600081359050613db281615cda565b92915050565b60008083601f840112613dce57613dcd61556c565b5b8235905067ffffffffffffffff811115613deb57613dea615567565b5b602083019150836020820283011115613e0757613e06615571565b5b9250929050565b600082601f830112613e2357613e2261556c565b5b8135613e33848260208601613b9c565b91505092915050565b60008083601f840112613e5257613e5161556c565b5b8235905067ffffffffffffffff811115613e6f57613e6e615567565b5b602083019150836020820283011115613e8b57613e8a615571565b5b9250929050565b600082601f830112613ea757613ea661556c565b5b8135613eb7848260208601613c9a565b91505092915050565b600081359050613ecf81615cf1565b92915050565b600081519050613ee481615cf1565b92915050565b600081359050613ef981615d08565b92915050565b600081519050613f0e81615d08565b92915050565b600082601f830112613f2957613f2861556c565b5b8135613f39848260208601613d0a565b91505092915050565b600082601f830112613f5757613f5661556c565b5b8135613f67848260208601613d4c565b91505092915050565b600081359050613f7f81615d1f565b92915050565b600060208284031215613f9b57613f9a615580565b5b6000613fa984828501613d8e565b91505092915050565b60008060408385031215613fc957613fc8615580565b5b6000613fd785828601613da3565b9250506020613fe885828601613f70565b9150509250929050565b6000806040838503121561400957614008615580565b5b600061401785828601613d8e565b925050602061402885828601613d8e565b9150509250929050565b600080600080600060a0868803121561404e5761404d615580565b5b600061405c88828901613d8e565b955050602061406d88828901613d8e565b945050604086013567ffffffffffffffff81111561408e5761408d61557b565b5b61409a88828901613e92565b935050606086013567ffffffffffffffff8111156140bb576140ba61557b565b5b6140c788828901613e92565b925050608086013567ffffffffffffffff8111156140e8576140e761557b565b5b6140f488828901613f14565b9150509295509295909350565b600080600080600060a0868803121561411d5761411c615580565b5b600061412b88828901613d8e565b955050602061413c88828901613d8e565b945050604061414d88828901613f70565b935050606061415e88828901613f70565b925050608086013567ffffffffffffffff81111561417f5761417e61557b565b5b61418b88828901613f14565b9150509295509295909350565b600080604083850312156141af576141ae615580565b5b60006141bd85828601613d8e565b92505060206141ce85828601613ec0565b9150509250929050565b600080604083850312156141ef576141ee615580565b5b60006141fd85828601613d8e565b925050602061420e85828601613f70565b9150509250929050565b6000806020838503121561422f5761422e615580565b5b600083013567ffffffffffffffff81111561424d5761424c61557b565b5b61425985828601613db8565b92509250509250929050565b6000806040838503121561427c5761427b615580565b5b600083013567ffffffffffffffff81111561429a5761429961557b565b5b6142a685828601613e0e565b925050602083013567ffffffffffffffff8111156142c7576142c661557b565b5b6142d385828601613e92565b9150509250929050565b6000602082840312156142f3576142f2615580565b5b600061430184828501613ed5565b91505092915050565b6000602082840312156143205761431f615580565b5b600061432e84828501613eea565b91505092915050565b60006020828403121561434d5761434c615580565b5b600061435b84828501613eff565b91505092915050565b60006020828403121561437a57614379615580565b5b600061438884828501613f70565b91505092915050565b600080600080606085870312156143ab576143aa615580565b5b60006143b987828801613f70565b945050602085013567ffffffffffffffff8111156143da576143d961557b565b5b6143e687828801613db8565b935093505060406143f987828801613f70565b91505092959194509250565b60008060008060006080868803121561442157614420615580565b5b600061442f88828901613f70565b955050602086013567ffffffffffffffff8111156144505761444f61557b565b5b61445c88828901613e3c565b9450945050604061446f88828901613f70565b925050606061448088828901613f70565b9150509295509295909350565b600080604083850312156144a4576144a3615580565b5b60006144b285828601613f70565b92505060206144c385828601613f70565b9150509250929050565b60006144d983836144fd565b60208301905092915050565b60006144f183836149e6565b60208301905092915050565b61450681615247565b82525050565b61451581615247565b82525050565b6000614526826150a8565b61453081856150ee565b935061453b83615088565b8060005b8381101561456c57815161455388826144cd565b975061455e836150d4565b92505060018101905061453f565b5085935050505092915050565b6000614584826150b3565b61458e81856150ff565b935061459983615098565b8060005b838110156145ca5781516145b188826144e5565b97506145bc836150e1565b92505060018101905061459d565b5085935050505092915050565b6145e08161526b565b82525050565b60006145f1826150be565b6145fb8185615110565b935061460b8185602086016152f1565b61461481615585565b840191505092915050565b600061462a826150c9565b6146348185615121565b93506146448185602086016152f1565b61464d81615585565b840191505092915050565b6000614665603483615121565b9150614670826155a3565b604082019050919050565b6000614688602883615121565b9150614693826155f2565b604082019050919050565b60006146ab602b83615121565b91506146b682615641565b604082019050919050565b60006146ce602683615121565b91506146d982615690565b604082019050919050565b60006146f1602683615121565b91506146fc826156df565b604082019050919050565b6000614714602983615121565b915061471f8261572e565b604082019050919050565b6000614737601983615121565b91506147428261577d565b602082019050919050565b600061475a601983615121565b9150614765826157a6565b602082019050919050565b600061477d601883615121565b9150614788826157cf565b602082019050919050565b60006147a0602683615121565b91506147ab826157f8565b604082019050919050565b60006147c3601983615121565b91506147ce82615847565b602082019050919050565b60006147e6602583615121565b91506147f182615870565b604082019050919050565b6000614809603283615121565b9150614814826158bf565b604082019050919050565b600061482c601a83615121565b91506148378261590e565b602082019050919050565b600061484f600f83615121565b915061485a82615937565b602082019050919050565b6000614872602583615121565b915061487d82615960565b604082019050919050565b6000614895602a83615121565b91506148a0826159af565b604082019050919050565b60006148b8602083615121565b91506148c3826159fe565b602082019050919050565b60006148db600883615121565b91506148e682615a27565b602082019050919050565b60006148fe602483615121565b915061490982615a50565b604082019050919050565b6000614921601683615121565b915061492c82615a9f565b602082019050919050565b6000614944601d83615121565b915061494f82615ac8565b602082019050919050565b6000614967602983615121565b915061497282615af1565b604082019050919050565b600061498a602983615121565b915061499582615b40565b604082019050919050565b60006149ad602883615121565b91506149b882615b8f565b604082019050919050565b60006149d0602183615121565b91506149db82615bde565b604082019050919050565b6149ef816152c3565b82525050565b6149fe816152c3565b82525050565b6000602082019050614a19600083018461450c565b92915050565b600060a082019050614a34600083018861450c565b614a41602083018761450c565b8181036040830152614a538186614579565b90508181036060830152614a678185614579565b90508181036080830152614a7b81846145e6565b90509695505050505050565b6000606082019050614a9c600083018661450c565b614aa9602083018561450c565b614ab660408301846149f5565b949350505050565b600060a082019050614ad3600083018861450c565b614ae0602083018761450c565b614aed60408301866149f5565b614afa60608301856149f5565b8181036080830152614b0c81846145e6565b90509695505050505050565b6000604082019050614b2d600083018561450c565b614b3a60208301846149f5565b9392505050565b60006020820190508181036000830152614b5b818461451b565b905092915050565b60006020820190508181036000830152614b7d8184614579565b905092915050565b60006040820190508181036000830152614b9f8185614579565b90508181036020830152614bb38184614579565b90509392505050565b6000602082019050614bd160008301846145d7565b92915050565b60006020820190508181036000830152614bf1818461461f565b905092915050565b60006020820190508181036000830152614c1281614658565b9050919050565b60006020820190508181036000830152614c328161467b565b9050919050565b60006020820190508181036000830152614c528161469e565b9050919050565b60006020820190508181036000830152614c72816146c1565b9050919050565b60006020820190508181036000830152614c92816146e4565b9050919050565b60006020820190508181036000830152614cb281614707565b9050919050565b60006020820190508181036000830152614cd28161472a565b9050919050565b60006020820190508181036000830152614cf28161474d565b9050919050565b60006020820190508181036000830152614d1281614770565b9050919050565b60006020820190508181036000830152614d3281614793565b9050919050565b60006020820190508181036000830152614d52816147b6565b9050919050565b60006020820190508181036000830152614d72816147d9565b9050919050565b60006020820190508181036000830152614d92816147fc565b9050919050565b60006020820190508181036000830152614db28161481f565b9050919050565b60006020820190508181036000830152614dd281614842565b9050919050565b60006020820190508181036000830152614df281614865565b9050919050565b60006020820190508181036000830152614e1281614888565b9050919050565b60006020820190508181036000830152614e32816148ab565b9050919050565b60006020820190508181036000830152614e52816148ce565b9050919050565b60006020820190508181036000830152614e72816148f1565b9050919050565b60006020820190508181036000830152614e9281614914565b9050919050565b60006020820190508181036000830152614eb281614937565b9050919050565b60006020820190508181036000830152614ed28161495a565b9050919050565b60006020820190508181036000830152614ef28161497d565b9050919050565b60006020820190508181036000830152614f12816149a0565b9050919050565b60006020820190508181036000830152614f32816149c3565b9050919050565b6000602082019050614f4e60008301846149f5565b92915050565b6000604082019050614f6960008301856149f5565b614f7660208301846149f5565b9392505050565b6000614f87614f98565b9050614f938282615380565b919050565b6000604051905090565b600067ffffffffffffffff821115614fbd57614fbc615516565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614fe957614fe8615516565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561501557615014615516565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561504157615040615516565b5b61504a82615585565b9050602081019050919050565b600067ffffffffffffffff82111561507257615071615516565b5b61507b82615585565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600061513d826152c3565b9150615148836152c3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561517d5761517c61542b565b5b828201905092915050565b6000615193826152c3565b915061519e836152c3565b9250826151ae576151ad61545a565b5b828204905092915050565b60006151c4826152c3565b91506151cf836152c3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156152085761520761542b565b5b828202905092915050565b600061521e826152c3565b9150615229836152c3565b92508282101561523c5761523b61542b565b5b828203905092915050565b6000615252826152a3565b9050919050565b6000615264826152a3565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006152da368484613c0c565b905092915050565b82818337600083830152505050565b60005b8381101561530f5780820151818401526020810190506152f4565b8381111561531e576000848401525b50505050565b600061532f826152c3565b915060008214156153435761534261542b565b5b600182039050919050565b6000600282049050600182168061536657607f821691505b6020821081141561537a57615379615489565b5b50919050565b61538982615585565b810181811067ffffffffffffffff821117156153a8576153a7615516565b5b80604052505050565b60006153bc826152c3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156153ef576153ee61542b565b5b600182019050919050565b6000615405826152c3565b9150615410836152c3565b9250826154205761541f61545a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d11156155645760046000803e615561600051615596565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f596f7520646f6e27742068617665207472757374206f7220796f75277665206c60008201527f6f73742069740000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b7f596f75207573656420796f757220626f6e7573206d696e747300000000000000600082015250565b7f596f752063616e2774206d696e74206d6f726520747275737400000000000000600082015250565b7f5075626c69632073616c652068617320736f6c64206f75740000000000000000600082015250565b7f596f752061726520747279696e6720746f2062757920756e646572206d696e7460008201527f2070726963650000000000000000000000000000000000000000000000000000602082015250565b7f555249206461746120686173206e6f74206265656e2073657400000000000000600082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f4d7573742073657420726f79616c747920726563697069656e74000000000000600082015250565b7f596f7527726520746f6f20736f6f6e0000000000000000000000000000000000600082015250565b7f4d696e74696e6720707269636520696e2041534820686173206e6f742062656560008201527f6e20736574000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f536f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b7f41646d696e436f6e74726f6c3a204d757374206265206f776e6572206f72206160008201527f646d696e00000000000000000000000000000000000000000000000000000000602082015250565b7f596f752063616e206f6e6c79206d696e74206f6e636500000000000000000000600082015250565b7f50726976617465206d696e74696e67206973206e6f7420616374697665000000600082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600060443d1015615c3d57615cc0565b615c45614f98565b60043d036004823e80513d602482011167ffffffffffffffff82111715615c6d575050615cc0565b808201805167ffffffffffffffff811115615c8b5750505050615cc0565b80602083010160043d038501811115615ca8575050505050615cc0565b615cb782602001850186615380565b82955050505050505b90565b615ccc81615247565b8114615cd757600080fd5b50565b615ce381615259565b8114615cee57600080fd5b50565b615cfa8161526b565b8114615d0557600080fd5b50565b615d1181615277565b8114615d1c57600080fd5b50565b615d28816152c3565b8114615d3357600080fd5b5056fea2646970667358221220f3042d110786d34ff5a84976fb36843260edf7c9d5d1dfd4ecd39471bc3a3c9364736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102455760003560e01c80636c2f5acd11610139578063ab7873fb116100b6578063f242432a1161007a578063f242432a14610881578063f2f29ae9146108aa578063f2fde38b146108c1578063fac6cbc2146108ea578063fbd9f00014610913578063fed42d1d1461095057610245565b8063ab7873fb146107a9578063abfe40a8146107c0578063d5abeb01146107dc578063d936547e14610807578063e985e9c51461084457610245565b806373cbd8ce116100fd57806373cbd8ce146106d45780638cf77604146106ff5780638da5cb5b1461072a578063a22cb46514610755578063a420ed3e1461077e57610245565b80636c2f5acd146106055780636d73e6691461062e5780636e9821c2146106575780637078273b14610694578063715018a6146106bd57610245565b806338e21cce116101c757806358d750e81161018b57806358d750e8146105345780635e84d7231461055d5780635f0b2b0c14610588578063672d5d3b146105b15780636904adb7146105dc57610245565b806338e21cce1461044d5780633ccfd60b1461048a57806340548dcb146104a15780634e1273f4146104cc5780635762ac591461050957610245565b80632a55205a1161020e5780632a55205a146103695780632d345670146103a75780632eb2c2d6146103d057806331ae450b146103f9578063353772141461042457610245565b8062fdd58e1461024a57806301ffc9a7146102875780630e89341c146102c457806322f3e2d41461030157806324d7806c1461032c575b600080fd5b34801561025657600080fd5b50610271600480360381019061026c91906141d8565b610979565b60405161027e9190614f39565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a9919061430a565b610a43565b6040516102bb9190614bbc565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e69190614364565b610b13565b6040516102f89190614bd7565b60405180910390f35b34801561030d57600080fd5b50610316610c8a565b6040516103239190614bbc565b60405180910390f35b34801561033857600080fd5b50610353600480360381019061034e9190613f85565b610c9d565b6040516103609190614bbc565b60405180910390f35b34801561037557600080fd5b50610390600480360381019061038b919061448d565b610cf7565b60405161039e929190614b18565b60405180910390f35b3480156103b357600080fd5b506103ce60048036038101906103c99190613f85565b610d43565b005b3480156103dc57600080fd5b506103f760048036038101906103f29190614032565b610e4b565b005b34801561040557600080fd5b5061040e610eec565b60405161041b9190614b41565b60405180910390f35b34801561043057600080fd5b5061044b60048036038101906104469190614218565b610fce565b005b34801561045957600080fd5b50610474600480360381019061046f9190613f85565b611103565b6040516104819190614bbc565b60405180910390f35b34801561049657600080fd5b5061049f611123565b005b3480156104ad57600080fd5b506104b661126f565b6040516104c39190614f39565b60405180910390f35b3480156104d857600080fd5b506104f360048036038101906104ee9190614265565b611275565b6040516105009190614b63565b60405180910390f35b34801561051557600080fd5b5061051e61138e565b60405161052b9190614f39565b60405180910390f35b34801561054057600080fd5b5061055b60048036038101906105569190614405565b611394565b005b34801561056957600080fd5b506105726114a5565b60405161057f9190614f39565b60405180910390f35b34801561059457600080fd5b506105af60048036038101906105aa91906141d8565b6114ab565b005b3480156105bd57600080fd5b506105c6611587565b6040516105d39190614f39565b60405180910390f35b3480156105e857600080fd5b5061060360048036038101906105fe9190614364565b61158f565b005b34801561061157600080fd5b5061062c60048036038101906106279190613fb2565b611629565b005b34801561063a57600080fd5b5061065560048036038101906106509190613f85565b611705565b005b34801561066357600080fd5b5061067e60048036038101906106799190613f85565b61180c565b60405161068b9190614bbc565b60405180910390f35b3480156106a057600080fd5b506106bb60048036038101906106b69190614391565b61182c565b005b3480156106c957600080fd5b506106d2611926565b005b3480156106e057600080fd5b506106e96119ae565b6040516106f69190614f39565b60405180910390f35b34801561070b57600080fd5b506107146119b8565b6040516107219190614f39565b60405180910390f35b34801561073657600080fd5b5061073f6119be565b60405161074c9190614a04565b60405180910390f35b34801561076157600080fd5b5061077c60048036038101906107779190614198565b6119e7565b005b34801561078a57600080fd5b506107936119fd565b6040516107a09190614a04565b60405180910390f35b3480156107b557600080fd5b506107be611a23565b005b6107da60048036038101906107d59190614364565b611c03565b005b3480156107e857600080fd5b506107f1611e8c565b6040516107fe9190614f39565b60405180910390f35b34801561081357600080fd5b5061082e60048036038101906108299190613f85565b611e92565b60405161083b9190614bbc565b60405180910390f35b34801561085057600080fd5b5061086b60048036038101906108669190613ff2565b611eb2565b6040516108789190614bbc565b60405180910390f35b34801561088d57600080fd5b506108a860048036038101906108a39190614101565b611f46565b005b3480156108b657600080fd5b506108bf611fe7565b005b3480156108cd57600080fd5b506108e860048036038101906108e39190613f85565b612094565b005b3480156108f657600080fd5b50610911600480360381019061090c9190614218565b61218c565b005b34801561091f57600080fd5b5061093a60048036038101906109359190614364565b6122c1565b6040516109479190614f39565b60405180910390f35b34801561095c57600080fd5b5061097760048036038101906109729190614364565b612331565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e190614c39565b60405180910390fd5b6003600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000610a4e82612552565b80610a5e5750610a5d82612634565b5b80610aad5750632a55205a60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610afc575063b779958460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b0c5750610b0b82612552565b5b9050919050565b606060006012600084815260200190815260200160002060405180606001604052908160008201805480602002602001604051908101604052809291908181526020016000905b82821015610c06578382906000526020600020018054610b799061534e565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba59061534e565b8015610bf25780601f10610bc757610100808354040283529160200191610bf2565b820191906000526020600020905b815481529060010190602001808311610bd557829003601f168201915b505050505081526020019060010190610b5a565b50505050815260200160018201548152602001600282015481525050905060018160000151511415610c5a578060000151600081518110610c4a57610c496154e7565b5b6020026020010151915050610c85565b8060000151610c68846122c1565b81518110610c7957610c786154e7565b5b60200260200101519150505b919050565b600a60149054906101000a900460ff1681565b60008173ffffffffffffffffffffffffffffffffffffffff16610cbe6119be565b73ffffffffffffffffffffffffffffffffffffffff161480610cf05750610cef8260016126ae90919063ffffffff16565b5b9050919050565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661271060095485610d2e91906151b9565b610d389190615188565b915091509250929050565b610d4b6126de565b73ffffffffffffffffffffffffffffffffffffffff16610d696119be565b73ffffffffffffffffffffffffffffffffffffffff1614610dbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db690614e19565b60405180910390fd5b610dd38160016126ae90919063ffffffff16565b15610e48573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f7c0c3c84c67c85fcac635147348bfe374c24a1a93d0366d1cfe9d8853cbf89d560405160405180910390a3610e468160016126e690919063ffffffff16565b505b50565b610e536126de565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610e995750610e9885610e936126de565b611eb2565b5b610ed8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecf90614d79565b60405180910390fd5b610ee58585858585612716565b5050505050565b6060610ef86001612782565b67ffffffffffffffff811115610f1157610f10615516565b5b604051908082528060200260200182016040528015610f3f5781602001602082028036833780820191505090505b50905060005b610f4f6001612782565b811015610fca57610f6a81600161279790919063ffffffff16565b828281518110610f7d57610f7c6154e7565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080610fc2906153b1565b915050610f45565b5090565b3373ffffffffffffffffffffffffffffffffffffffff16610fed6119be565b73ffffffffffffffffffffffffffffffffffffffff16148061101f575061101e3360016126ae90919063ffffffff16565b5b61105e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105590614e59565b60405180910390fd5b60005b828290508110156110fe576001600e6000858585818110611085576110846154e7565b5b905060200201602081019061109a9190613f85565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806110f6906153b1565b915050611061565b505050565b600f6020528060005260406000206000915054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff166111426119be565b73ffffffffffffffffffffffffffffffffffffffff16148061117457506111733360016126ae90919063ffffffff16565b5b6111b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111aa90614e59565b60405180910390fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb336008546040518363ffffffff1660e01b8152600401611212929190614b18565b602060405180830381600087803b15801561122c57600080fd5b505af1158015611240573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126491906142dd565b506000600881905550565b60085481565b606081518351146112bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b290614ed9565b60405180910390fd5b6000835167ffffffffffffffff8111156112d8576112d7615516565b5b6040519080825280602002602001820160405280156113065781602001602082028036833780820191505090505b50905060005b84518110156113835761135385828151811061132b5761132a6154e7565b5b6020026020010151858381518110611346576113456154e7565b5b6020026020010151610979565b828281518110611366576113656154e7565b5b6020026020010181815250508061137c906153b1565b905061130c565b508091505092915050565b600d5481565b3373ffffffffffffffffffffffffffffffffffffffff166113b36119be565b73ffffffffffffffffffffffffffffffffffffffff1614806113e557506113e43360016126ae90919063ffffffff16565b5b611424576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141b90614e59565b60405180910390fd5b61142c613a14565b84849061143991906152cd565b8160000181905250828160200181815250508181604001818152505080601260008881526020019081526020016000206000820151816000019080519060200190611485929190613a35565b506020820151816001015560408201518160020155905050505050505050565b600c5481565b3373ffffffffffffffffffffffffffffffffffffffff166114ca6119be565b73ffffffffffffffffffffffffffffffffffffffff1614806114fc57506114fb3360016126ae90919063ffffffff16565b5b61153b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153290614e59565b60405180910390fd5b81600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806007819055505050565b600042905090565b3373ffffffffffffffffffffffffffffffffffffffff166115ae6119be565b73ffffffffffffffffffffffffffffffffffffffff1614806115e057506115df3360016126ae90919063ffffffff16565b5b61161f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161690614e59565b60405180910390fd5b80600c8190555050565b3373ffffffffffffffffffffffffffffffffffffffff166116486119be565b73ffffffffffffffffffffffffffffffffffffffff16148061167a57506116793360016126ae90919063ffffffff16565b5b6116b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b090614e59565b60405180910390fd5b81600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806009819055505050565b61170d6126de565b73ffffffffffffffffffffffffffffffffffffffff1661172b6119be565b73ffffffffffffffffffffffffffffffffffffffff1614611781576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177890614e19565b60405180910390fd5b6117958160016126ae90919063ffffffff16565b611809573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f7e1a1a08d52e4ba0e21554733d66165fd5151f99460116223d9e3a608eec5cb160405160405180910390a36118078160016127b190919063ffffffff16565b505b50565b60106020528060005260406000206000915054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff1661184b6119be565b73ffffffffffffffffffffffffffffffffffffffff16148061187d575061187c3360016126ae90919063ffffffff16565b5b6118bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b390614e59565b60405180910390fd5b60005b8383905081101561191f5761190c8484838181106118e0576118df6154e7565b5b90506020020160208101906118f59190613f85565b8684604051806020016040528060008152506127e1565b8080611917906153b1565b9150506118bf565b5050505050565b61192e6126de565b73ffffffffffffffffffffffffffffffffffffffff1661194c6119be565b73ffffffffffffffffffffffffffffffffffffffff16146119a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199990614e19565b60405180910390fd5b6119ac6000612978565b565b6000600c54905090565b60075481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6119f96119f26126de565b8383612a3c565b5050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b3373ffffffffffffffffffffffffffffffffffffffff16611a426119be565b73ffffffffffffffffffffffffffffffffffffffff161480611a745750611a733360016126ae90919063ffffffff16565b5b611ab3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aaa90614e59565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611b45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3c90614d99565b60405180910390fd5b6000601260008081526020019081526020016000206000018054905011611ba1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9890614d39565b60405180910390fd5b600060075411611be6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdd90614dd9565b60405180910390fd5b6001600a60146101000a81548160ff021916908315150217905550565b600a60149054906101000a900460ff16611c52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4990614e99565b60405180910390fd5b600754811015611c97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8e90614d19565b60405180910390fd5b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611d24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1b90614e79565b60405180910390fd5b600b54600d5410611d6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6190614e39565b60405180910390fd5b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611e2257611dc581612ba9565b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611e89565b6000600c5411611e67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5e90614cf9565b60405180910390fd5b611e7081612ba9565b600c6000815480929190611e8390615324565b91905055505b50565b600b5481565b600e6020528060005260406000206000915054906101000a900460ff1681565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611f4e6126de565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611f945750611f9385611f8e6126de565b611eb2565b5b611fd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fca90614c99565b60405180910390fd5b611fe08585858585612d5c565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff166120066119be565b73ffffffffffffffffffffffffffffffffffffffff16148061203857506120373360016126ae90919063ffffffff16565b5b612077576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206e90614e59565b60405180910390fd5b6000600a60146101000a81548160ff021916908315150217905550565b61209c6126de565b73ffffffffffffffffffffffffffffffffffffffff166120ba6119be565b73ffffffffffffffffffffffffffffffffffffffff1614612110576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210790614e19565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612180576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217790614c59565b60405180910390fd5b61218981612978565b50565b3373ffffffffffffffffffffffffffffffffffffffff166121ab6119be565b73ffffffffffffffffffffffffffffffffffffffff1614806121dd57506121dc3360016126ae90919063ffffffff16565b5b61221c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221390614e59565b60405180910390fd5b60005b828290508110156122bc57600160106000858585818110612243576122426154e7565b5b90506020020160208101906122589190613f85565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806122b4906153b1565b91505061221f565b505050565b60006012600083815260200190815260200160002060000180549050601260008481526020019081526020016000206002015460126000858152602001908152602001600020600101546123159190615188565b426123209190615213565b61232a91906153fa565b9050919050565b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166123bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b490614c79565b60405180910390fd5b6001601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541061243f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243690614cb9565b60405180910390fd5b600060126000808152602001908152602001600020600001805490501161249b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249290614db9565b60405180910390fd5b600081116124de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d590614cd9565b60405180910390fd5b6124fa33826001604051806020016040528060008152506127e1565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061254a906153b1565b919050555050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061261d57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061262d575061262c82612634565b5b9050919050565b60007f553e757e000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806126a757506126a682612dc8565b5b9050919050565b60006126d6836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612e32565b905092915050565b600033905090565b600061270e836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612e55565b905092915050565b6127238585858585612f69565b6000601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050505050565b600061279082600001613280565b9050919050565b60006127a68360000183613291565b60001c905092915050565b60006127d9836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6132bc565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612851576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284890614f19565b60405180910390fd5b600061285b6126de565b905061287c8160008761286d8861332c565b6128768861332c565b876133a6565b826003600086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128dc9190615132565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62878760405161295a929190614f54565b60405180910390a4612971816000878787876133ae565b5050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612aab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aa290614eb9565b60405180910390fd5b80600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612b9c9190614bbc565b60405180910390a3505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b8152600401612c0893929190614a87565b602060405180830381600087803b158015612c2257600080fd5b505af1158015612c36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c5a91906142dd565b508060086000828254612c6d9190615132565b92505081905550612c913360006001604051806020016040528060008152506127e1565b6001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600d6000815480929190612d54906153b1565b919050555050565b612d698585858585613595565b6000601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600080836001016000848152602001908152602001600020541415905092915050565b60008083600101600084815260200190815260200160002054905060008114612f5d576000600182612e879190615213565b9050600060018660000180549050612e9f9190615213565b9050818114612f0e576000866000018281548110612ec057612ebf6154e7565b5b9060005260206000200154905080876000018481548110612ee457612ee36154e7565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480612f2257612f216154b8565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050612f63565b60009150505b92915050565b8151835114612fad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fa490614ef9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561301d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301490614d59565b60405180910390fd5b60006130276126de565b90506130378187878787876133a6565b60005b84518110156131eb576000858281518110613058576130576154e7565b5b602002602001015190506000858381518110613077576130766154e7565b5b6020026020010151905060006003600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613119576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161311090614df9565b60405180910390fd5b8181036003600085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816003600085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131d09190615132565b92505081905550505050806131e4906153b1565b905061303a565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051613262929190614b85565b60405180910390a461327881878787878761381a565b505050505050565b600081600001805490509050919050565b60008260000182815481106132a9576132a86154e7565b5b9060005260206000200154905092915050565b60006132c88383612e32565b613321578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050613326565b600090505b92915050565b60606000600167ffffffffffffffff81111561334b5761334a615516565b5b6040519080825280602002602001820160405280156133795781602001602082028036833780820191505090505b5090508281600081518110613391576133906154e7565b5b60200260200101818152505080915050919050565b505050505050565b6133cd8473ffffffffffffffffffffffffffffffffffffffff16613a01565b1561358d578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401613413959493929190614abe565b602060405180830381600087803b15801561342d57600080fd5b505af192505050801561345e57506040513d601f19601f8201168201806040525081019061345b9190614337565b60015b6135045761346a615545565b806308c379a014156134c7575061347f615c2d565b8061348a57506134c9565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134be9190614bd7565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134fb90614bf9565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461358b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161358290614c19565b60405180910390fd5b505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613605576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135fc90614d59565b60405180910390fd5b600061360f6126de565b905061362f8187876136208861332c565b6136298861332c565b876133a6565b60006003600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050838110156136c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136be90614df9565b60405180910390fd5b8381036003600087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550836003600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461377e9190615132565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6288886040516137fb929190614f54565b60405180910390a46138118288888888886133ae565b50505050505050565b6138398473ffffffffffffffffffffffffffffffffffffffff16613a01565b156139f9578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b815260040161387f959493929190614a1f565b602060405180830381600087803b15801561389957600080fd5b505af19250505080156138ca57506040513d601f19601f820116820180604052508101906138c79190614337565b60015b613970576138d6615545565b806308c379a0141561393357506138eb615c2d565b806138f65750613935565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161392a9190614bd7565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161396790614bf9565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146139f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139ee90614c19565b60405180910390fd5b505b505050505050565b600080823b905060008111915050919050565b60405180606001604052806060815260200160008152602001600081525090565b828054828255906000526020600020908101928215613a84579160200282015b82811115613a83578251829080519060200190613a73929190613a95565b5091602001919060010190613a55565b5b509050613a919190613b1b565b5090565b828054613aa19061534e565b90600052602060002090601f016020900481019282613ac35760008555613b0a565b82601f10613adc57805160ff1916838001178555613b0a565b82800160010185558215613b0a579182015b82811115613b09578251825591602001919060010190613aee565b5b509050613b179190613b3f565b5090565b5b80821115613b3b5760008181613b329190613b5c565b50600101613b1c565b5090565b5b80821115613b58576000816000905550600101613b40565b5090565b508054613b689061534e565b6000825580601f10613b7a5750613b99565b601f016020900490600052602060002090810190613b989190613b3f565b5b50565b6000613baf613baa84614fa2565b614f7d565b90508083825260208201905082856020860282011115613bd257613bd1615571565b5b60005b85811015613c025781613be88882613d8e565b845260208401935060208301925050600181019050613bd5565b5050509392505050565b6000613c1f613c1a84614fce565b614f7d565b90508083825260208201905082856020860282011115613c4257613c41615571565b5b60005b85811015613c9057813567ffffffffffffffff811115613c6857613c6761556c565b5b808601613c758982613f42565b85526020850194506020840193505050600181019050613c45565b5050509392505050565b6000613cad613ca884614ffa565b614f7d565b90508083825260208201905082856020860282011115613cd057613ccf615571565b5b60005b85811015613d005781613ce68882613f70565b845260208401935060208301925050600181019050613cd3565b5050509392505050565b6000613d1d613d1884615026565b614f7d565b905082815260208101848484011115613d3957613d38615576565b5b613d448482856152e2565b509392505050565b6000613d5f613d5a84615057565b614f7d565b905082815260208101848484011115613d7b57613d7a615576565b5b613d868482856152e2565b509392505050565b600081359050613d9d81615cc3565b92915050565b600081359050613db281615cda565b92915050565b60008083601f840112613dce57613dcd61556c565b5b8235905067ffffffffffffffff811115613deb57613dea615567565b5b602083019150836020820283011115613e0757613e06615571565b5b9250929050565b600082601f830112613e2357613e2261556c565b5b8135613e33848260208601613b9c565b91505092915050565b60008083601f840112613e5257613e5161556c565b5b8235905067ffffffffffffffff811115613e6f57613e6e615567565b5b602083019150836020820283011115613e8b57613e8a615571565b5b9250929050565b600082601f830112613ea757613ea661556c565b5b8135613eb7848260208601613c9a565b91505092915050565b600081359050613ecf81615cf1565b92915050565b600081519050613ee481615cf1565b92915050565b600081359050613ef981615d08565b92915050565b600081519050613f0e81615d08565b92915050565b600082601f830112613f2957613f2861556c565b5b8135613f39848260208601613d0a565b91505092915050565b600082601f830112613f5757613f5661556c565b5b8135613f67848260208601613d4c565b91505092915050565b600081359050613f7f81615d1f565b92915050565b600060208284031215613f9b57613f9a615580565b5b6000613fa984828501613d8e565b91505092915050565b60008060408385031215613fc957613fc8615580565b5b6000613fd785828601613da3565b9250506020613fe885828601613f70565b9150509250929050565b6000806040838503121561400957614008615580565b5b600061401785828601613d8e565b925050602061402885828601613d8e565b9150509250929050565b600080600080600060a0868803121561404e5761404d615580565b5b600061405c88828901613d8e565b955050602061406d88828901613d8e565b945050604086013567ffffffffffffffff81111561408e5761408d61557b565b5b61409a88828901613e92565b935050606086013567ffffffffffffffff8111156140bb576140ba61557b565b5b6140c788828901613e92565b925050608086013567ffffffffffffffff8111156140e8576140e761557b565b5b6140f488828901613f14565b9150509295509295909350565b600080600080600060a0868803121561411d5761411c615580565b5b600061412b88828901613d8e565b955050602061413c88828901613d8e565b945050604061414d88828901613f70565b935050606061415e88828901613f70565b925050608086013567ffffffffffffffff81111561417f5761417e61557b565b5b61418b88828901613f14565b9150509295509295909350565b600080604083850312156141af576141ae615580565b5b60006141bd85828601613d8e565b92505060206141ce85828601613ec0565b9150509250929050565b600080604083850312156141ef576141ee615580565b5b60006141fd85828601613d8e565b925050602061420e85828601613f70565b9150509250929050565b6000806020838503121561422f5761422e615580565b5b600083013567ffffffffffffffff81111561424d5761424c61557b565b5b61425985828601613db8565b92509250509250929050565b6000806040838503121561427c5761427b615580565b5b600083013567ffffffffffffffff81111561429a5761429961557b565b5b6142a685828601613e0e565b925050602083013567ffffffffffffffff8111156142c7576142c661557b565b5b6142d385828601613e92565b9150509250929050565b6000602082840312156142f3576142f2615580565b5b600061430184828501613ed5565b91505092915050565b6000602082840312156143205761431f615580565b5b600061432e84828501613eea565b91505092915050565b60006020828403121561434d5761434c615580565b5b600061435b84828501613eff565b91505092915050565b60006020828403121561437a57614379615580565b5b600061438884828501613f70565b91505092915050565b600080600080606085870312156143ab576143aa615580565b5b60006143b987828801613f70565b945050602085013567ffffffffffffffff8111156143da576143d961557b565b5b6143e687828801613db8565b935093505060406143f987828801613f70565b91505092959194509250565b60008060008060006080868803121561442157614420615580565b5b600061442f88828901613f70565b955050602086013567ffffffffffffffff8111156144505761444f61557b565b5b61445c88828901613e3c565b9450945050604061446f88828901613f70565b925050606061448088828901613f70565b9150509295509295909350565b600080604083850312156144a4576144a3615580565b5b60006144b285828601613f70565b92505060206144c385828601613f70565b9150509250929050565b60006144d983836144fd565b60208301905092915050565b60006144f183836149e6565b60208301905092915050565b61450681615247565b82525050565b61451581615247565b82525050565b6000614526826150a8565b61453081856150ee565b935061453b83615088565b8060005b8381101561456c57815161455388826144cd565b975061455e836150d4565b92505060018101905061453f565b5085935050505092915050565b6000614584826150b3565b61458e81856150ff565b935061459983615098565b8060005b838110156145ca5781516145b188826144e5565b97506145bc836150e1565b92505060018101905061459d565b5085935050505092915050565b6145e08161526b565b82525050565b60006145f1826150be565b6145fb8185615110565b935061460b8185602086016152f1565b61461481615585565b840191505092915050565b600061462a826150c9565b6146348185615121565b93506146448185602086016152f1565b61464d81615585565b840191505092915050565b6000614665603483615121565b9150614670826155a3565b604082019050919050565b6000614688602883615121565b9150614693826155f2565b604082019050919050565b60006146ab602b83615121565b91506146b682615641565b604082019050919050565b60006146ce602683615121565b91506146d982615690565b604082019050919050565b60006146f1602683615121565b91506146fc826156df565b604082019050919050565b6000614714602983615121565b915061471f8261572e565b604082019050919050565b6000614737601983615121565b91506147428261577d565b602082019050919050565b600061475a601983615121565b9150614765826157a6565b602082019050919050565b600061477d601883615121565b9150614788826157cf565b602082019050919050565b60006147a0602683615121565b91506147ab826157f8565b604082019050919050565b60006147c3601983615121565b91506147ce82615847565b602082019050919050565b60006147e6602583615121565b91506147f182615870565b604082019050919050565b6000614809603283615121565b9150614814826158bf565b604082019050919050565b600061482c601a83615121565b91506148378261590e565b602082019050919050565b600061484f600f83615121565b915061485a82615937565b602082019050919050565b6000614872602583615121565b915061487d82615960565b604082019050919050565b6000614895602a83615121565b91506148a0826159af565b604082019050919050565b60006148b8602083615121565b91506148c3826159fe565b602082019050919050565b60006148db600883615121565b91506148e682615a27565b602082019050919050565b60006148fe602483615121565b915061490982615a50565b604082019050919050565b6000614921601683615121565b915061492c82615a9f565b602082019050919050565b6000614944601d83615121565b915061494f82615ac8565b602082019050919050565b6000614967602983615121565b915061497282615af1565b604082019050919050565b600061498a602983615121565b915061499582615b40565b604082019050919050565b60006149ad602883615121565b91506149b882615b8f565b604082019050919050565b60006149d0602183615121565b91506149db82615bde565b604082019050919050565b6149ef816152c3565b82525050565b6149fe816152c3565b82525050565b6000602082019050614a19600083018461450c565b92915050565b600060a082019050614a34600083018861450c565b614a41602083018761450c565b8181036040830152614a538186614579565b90508181036060830152614a678185614579565b90508181036080830152614a7b81846145e6565b90509695505050505050565b6000606082019050614a9c600083018661450c565b614aa9602083018561450c565b614ab660408301846149f5565b949350505050565b600060a082019050614ad3600083018861450c565b614ae0602083018761450c565b614aed60408301866149f5565b614afa60608301856149f5565b8181036080830152614b0c81846145e6565b90509695505050505050565b6000604082019050614b2d600083018561450c565b614b3a60208301846149f5565b9392505050565b60006020820190508181036000830152614b5b818461451b565b905092915050565b60006020820190508181036000830152614b7d8184614579565b905092915050565b60006040820190508181036000830152614b9f8185614579565b90508181036020830152614bb38184614579565b90509392505050565b6000602082019050614bd160008301846145d7565b92915050565b60006020820190508181036000830152614bf1818461461f565b905092915050565b60006020820190508181036000830152614c1281614658565b9050919050565b60006020820190508181036000830152614c328161467b565b9050919050565b60006020820190508181036000830152614c528161469e565b9050919050565b60006020820190508181036000830152614c72816146c1565b9050919050565b60006020820190508181036000830152614c92816146e4565b9050919050565b60006020820190508181036000830152614cb281614707565b9050919050565b60006020820190508181036000830152614cd28161472a565b9050919050565b60006020820190508181036000830152614cf28161474d565b9050919050565b60006020820190508181036000830152614d1281614770565b9050919050565b60006020820190508181036000830152614d3281614793565b9050919050565b60006020820190508181036000830152614d52816147b6565b9050919050565b60006020820190508181036000830152614d72816147d9565b9050919050565b60006020820190508181036000830152614d92816147fc565b9050919050565b60006020820190508181036000830152614db28161481f565b9050919050565b60006020820190508181036000830152614dd281614842565b9050919050565b60006020820190508181036000830152614df281614865565b9050919050565b60006020820190508181036000830152614e1281614888565b9050919050565b60006020820190508181036000830152614e32816148ab565b9050919050565b60006020820190508181036000830152614e52816148ce565b9050919050565b60006020820190508181036000830152614e72816148f1565b9050919050565b60006020820190508181036000830152614e9281614914565b9050919050565b60006020820190508181036000830152614eb281614937565b9050919050565b60006020820190508181036000830152614ed28161495a565b9050919050565b60006020820190508181036000830152614ef28161497d565b9050919050565b60006020820190508181036000830152614f12816149a0565b9050919050565b60006020820190508181036000830152614f32816149c3565b9050919050565b6000602082019050614f4e60008301846149f5565b92915050565b6000604082019050614f6960008301856149f5565b614f7660208301846149f5565b9392505050565b6000614f87614f98565b9050614f938282615380565b919050565b6000604051905090565b600067ffffffffffffffff821115614fbd57614fbc615516565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614fe957614fe8615516565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561501557615014615516565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561504157615040615516565b5b61504a82615585565b9050602081019050919050565b600067ffffffffffffffff82111561507257615071615516565b5b61507b82615585565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600061513d826152c3565b9150615148836152c3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561517d5761517c61542b565b5b828201905092915050565b6000615193826152c3565b915061519e836152c3565b9250826151ae576151ad61545a565b5b828204905092915050565b60006151c4826152c3565b91506151cf836152c3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156152085761520761542b565b5b828202905092915050565b600061521e826152c3565b9150615229836152c3565b92508282101561523c5761523b61542b565b5b828203905092915050565b6000615252826152a3565b9050919050565b6000615264826152a3565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006152da368484613c0c565b905092915050565b82818337600083830152505050565b60005b8381101561530f5780820151818401526020810190506152f4565b8381111561531e576000848401525b50505050565b600061532f826152c3565b915060008214156153435761534261542b565b5b600182039050919050565b6000600282049050600182168061536657607f821691505b6020821081141561537a57615379615489565b5b50919050565b61538982615585565b810181811067ffffffffffffffff821117156153a8576153a7615516565b5b80604052505050565b60006153bc826152c3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156153ef576153ee61542b565b5b600182019050919050565b6000615405826152c3565b9150615410836152c3565b9250826154205761541f61545a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d11156155645760046000803e615561600051615596565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f596f7520646f6e27742068617665207472757374206f7220796f75277665206c60008201527f6f73742069740000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b7f596f75207573656420796f757220626f6e7573206d696e747300000000000000600082015250565b7f596f752063616e2774206d696e74206d6f726520747275737400000000000000600082015250565b7f5075626c69632073616c652068617320736f6c64206f75740000000000000000600082015250565b7f596f752061726520747279696e6720746f2062757920756e646572206d696e7460008201527f2070726963650000000000000000000000000000000000000000000000000000602082015250565b7f555249206461746120686173206e6f74206265656e2073657400000000000000600082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f4d7573742073657420726f79616c747920726563697069656e74000000000000600082015250565b7f596f7527726520746f6f20736f6f6e0000000000000000000000000000000000600082015250565b7f4d696e74696e6720707269636520696e2041534820686173206e6f742062656560008201527f6e20736574000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f536f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b7f41646d696e436f6e74726f6c3a204d757374206265206f776e6572206f72206160008201527f646d696e00000000000000000000000000000000000000000000000000000000602082015250565b7f596f752063616e206f6e6c79206d696e74206f6e636500000000000000000000600082015250565b7f50726976617465206d696e74696e67206973206e6f7420616374697665000000600082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600060443d1015615c3d57615cc0565b615c45614f98565b60043d036004823e80513d602482011167ffffffffffffffff82111715615c6d575050615cc0565b808201805167ffffffffffffffff811115615c8b5750505050615cc0565b80602083010160043d038501811115615ca8575050505050615cc0565b615cb782602001850186615380565b82955050505050505b90565b615ccc81615247565b8114615cd757600080fd5b50565b615ce381615259565b8114615cee57600080fd5b50565b615cfa8161526b565b8114615d0557600080fd5b50565b615d1181615277565b8114615d1c57600080fd5b50565b615d28816152c3565b8114615d3357600080fd5b5056fea2646970667358221220f3042d110786d34ff5a84976fb36843260edf7c9d5d1dfd4ecd39471bc3a3c9364736f6c63430008070033

Deployed Bytecode Sourcemap

57189:6516:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41552:231;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62734:434;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60062:300;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57679:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56910:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63374:156;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;56632:210;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43491:442;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56010:267;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60966:198;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57989:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63563:139;;;;;;;;;;;;;:::i;:::-;;57411:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41949:524;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57783:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60643:315;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57744:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61287:163;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59632:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61172:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63202:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56350:210;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58037:39;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60402:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15810:103;;;;;;;;;;;;;:::i;:::-;;59942:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57348:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15159:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42546:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57270:71;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61458:316;;;;;;;;;;;;;:::i;:::-;;58581:586;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57708:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57939:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42773:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43013:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61782:87;;;;;;;;;;;;;:::i;:::-;;16068:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61877:190;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59738:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59175:419;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41552:231;41638:7;41685:1;41666:21;;:7;:21;;;;41658:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;41753:9;:13;41763:2;41753:13;;;;;;;;;;;:22;41767:7;41753:22;;;;;;;;;;;;;;;;41746:29;;41552:231;;;;:::o;62734:434::-;62842:4;62880:38;62906:11;62880:25;:38::i;:::-;:99;;;;62936:43;62967:11;62936:30;:43::i;:::-;62880:99;:163;;;;57585:10;63012:31;;62997:46;;;:11;:46;;;;62880:163;:227;;;;57660:10;63076:31;;63061:46;;;:11;:46;;;;62880:227;:280;;;;63124:36;63148:11;63124:23;:36::i;:::-;62880:280;62859:301;;62734:434;;;:::o;60062:300::-;60130:13;60156:25;60184:6;:15;60191:7;60184:15;;;;;;;;;;;60156:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60242:1;60215:11;:16;;;:23;:28;60211:87;;;60267:11;:16;;;60284:1;60267:19;;;;;;;;:::i;:::-;;;;;;;;60260:26;;;;;60211:87;60315:11;:16;;;60332:21;60345:7;60332:12;:21::i;:::-;60315:39;;;;;;;;:::i;:::-;;;;;;;;60308:46;;;60062:300;;;;:::o;57679:20::-;;;;;;;;;;;;;:::o;56910:139::-;56972:4;57008:5;56997:16;;:7;:5;:7::i;:::-;:16;;;:43;;;;57017:23;57034:5;57017:7;:16;;:23;;;;:::i;:::-;56997:43;56989:52;;56910:139;;;:::o;63374:156::-;63442:7;63451;63479:17;;;;;;;;;;;63516:5;63504:11;;63498:5;:17;;;;:::i;:::-;:23;;;;:::i;:::-;63471:51;;;;63374:156;;;;;:::o;56632:210::-;15390:12;:10;:12::i;:::-;15379:23;;:7;:5;:7::i;:::-;:23;;;15371:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56711:23:::1;56728:5;56711:7;:16;;:23;;;;:::i;:::-;56707:128;;;56776:10;56756:31;;56769:5;56756:31;;;;;;;;;;;;56802:21;56817:5;56802:7;:14;;:21;;;;:::i;:::-;;56707:128;56632:210:::0;:::o;43491:442::-;43732:12;:10;:12::i;:::-;43724:20;;:4;:20;;;:60;;;;43748:36;43765:4;43771:12;:10;:12::i;:::-;43748:16;:36::i;:::-;43724:60;43702:160;;;;;;;;;;;;:::i;:::-;;;;;;;;;43873:52;43896:4;43902:2;43906:3;43911:7;43920:4;43873:22;:52::i;:::-;43491:442;;;;;:::o;56010:267::-;56063:23;56122:16;:7;:14;:16::i;:::-;56108:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56099:40;;56155:6;56150:96;56171:16;:7;:14;:16::i;:::-;56167:1;:20;56150:96;;;56221:13;56232:1;56221:7;:10;;:13;;;;:::i;:::-;56209:6;56216:1;56209:9;;;;;;;;:::i;:::-;;;;;;;:25;;;;;;;;;;;56189:3;;;;;:::i;:::-;;;;56150:96;;;;56010:267;:::o;60966:198::-;55834:10;55823:21;;:7;:5;:7::i;:::-;:21;;;:53;;;;55848:28;55865:10;55848:7;:16;;:28;;;;:::i;:::-;55823:53;55815:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;61060:9:::1;61055:102;61075:9;;:16;;61071:1;:20;61055:102;;;61141:4;61113:11;:25;61125:9;;61135:1;61125:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;61113:25;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;61093:3;;;;;:::i;:::-;;;;61055:102;;;;60966:198:::0;;:::o;57989:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;63563:139::-;55834:10;55823:21;;:7;:5;:7::i;:::-;:21;;;:53;;;;55848:28;55865:10;55848:7;:16;;:28;;;;:::i;:::-;55823:53;55815:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;63624:11:::1;;;;;;;;;;;63617:28;;;63646:10;63658;;63617:52;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;63693:1;63680:10;:14;;;;63563:139::o:0;57411:25::-;;;;:::o;41949:524::-;42105:16;42166:3;:10;42147:8;:15;:29;42139:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;42235:30;42282:8;:15;42268:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42235:63;;42316:9;42311:122;42335:8;:15;42331:1;:19;42311:122;;;42391:30;42401:8;42410:1;42401:11;;;;;;;;:::i;:::-;;;;;;;;42414:3;42418:1;42414:6;;;;;;;;:::i;:::-;;;;;;;;42391:9;:30::i;:::-;42372:13;42386:1;42372:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;42352:3;;;;:::i;:::-;;;42311:122;;;;42452:13;42445:20;;;41949:524;;;;:::o;57783:25::-;;;;:::o;60643:315::-;55834:10;55823:21;;:7;:5;:7::i;:::-;:21;;;:53;;;;55848:28;55865:10;55848:7;:16;;:28;;;;:::i;:::-;55823:53;55815:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;60779:22:::1;;:::i;:::-;60828:5;;60812:21;;;;;:::i;:::-;:8;:13;;:21;;;;60864:9;60844:8;:17;;:29;;;::::0;::::1;60904:9;60884:8;:17;;:29;;;::::0;::::1;60942:8;60924:6;:15;60931:7;60924:15;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;60768:190;60643:315:::0;;;;;:::o;57744:32::-;;;;:::o;61287:163::-;55834:10;55823:21;;:7;:5;:7::i;:::-;:21;;;:53;;;;55848:28;55865:10;55848:7;:16;;:28;;;;:::i;:::-;55823:53;55815:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;61399:12:::1;61385:11;;:26;;;;;;;;;;;;;;;;;;61433:9;61422:8;:20;;;;61287:163:::0;;:::o;59632:98::-;59680:7;59707:15;59700:22;;59632:98;:::o;61172:107::-;55834:10;55823:21;;:7;:5;:7::i;:::-;:21;;;:53;;;;55848:28;55865:10;55848:7;:16;;:28;;;;:::i;:::-;55823:53;55815:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;61265:6:::1;61250:12;:21;;;;61172:107:::0;:::o;63202:164::-;55834:10;55823:21;;:7;:5;:7::i;:::-;:21;;;:53;;;;55848:28;55865:10;55848:7;:16;;:28;;;;:::i;:::-;55823:53;55815:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;63321:9:::1;63301:17;;:29;;;;;;;;;;;;;;;;;;63355:3;63341:11;:17;;;;63202:164:::0;;:::o;56350:210::-;15390:12;:10;:12::i;:::-;15379:23;;:7;:5;:7::i;:::-;:23;;;15371:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56431:23:::1;56448:5;56431:7;:16;;:23;;;;:::i;:::-;56426:127;;56497:10;56476:32;;56490:5;56476:32;;;;;;;;;;;;56523:18;56535:5;56523:7;:11;;:18;;;;:::i;:::-;;56426:127;56350:210:::0;:::o;58037:39::-;;;;;;;;;;;;;;;;;;;;;;:::o;60402:233::-;55834:10;55823:21;;:7;:5;:7::i;:::-;:21;;;:53;;;;55848:28;55865:10;55848:7;:16;;:28;;;;:::i;:::-;55823:53;55815:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;60523:9:::1;60518:110;60538:9;;:16;;60534:1;:20;60518:110;;;60576:40;60582:9;;60592:1;60582:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;60596:7;60605:6;60576:40;;;;;;;;;;;::::0;:5:::1;:40::i;:::-;60556:3;;;;;:::i;:::-;;;;60518:110;;;;60402:233:::0;;;;:::o;15810:103::-;15390:12;:10;:12::i;:::-;15379:23;;:7;:5;:7::i;:::-;:23;;;15371:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15875:30:::1;15902:1;15875:18;:30::i;:::-;15810:103::o:0;59942:92::-;59990:4;60014:12;;60007:19;;59942:92;:::o;57348:46::-;;;;:::o;15159:87::-;15205:7;15232:6;;;;;;;;;;;15225:13;;15159:87;:::o;42546:155::-;42641:52;42660:12;:10;:12::i;:::-;42674:8;42684;42641:18;:52::i;:::-;42546:155;;:::o;57270:71::-;;;;;;;;;;;;;:::o;61458:316::-;55834:10;55823:21;;:7;:5;:7::i;:::-;:21;;;:53;;;;55848:28;55865:10;55848:7;:16;;:28;;;;:::i;:::-;55823:53;55815:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;61556:3:::1;61527:33;;:17;;;;;;;;;;;:33;;;;61519:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;61634:1;61610:6;:9;61617:1:::0;61610:9:::1;;;;;;;;;;;:14;;:21;;;;:25;61602:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;61695:1;61684:8;;:12;61676:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;61762:4;61751:8;;:15;;;;;;;;;;;;;;;;;;61458:316::o:0;58581:586::-;58650:8;;;;;;;;;;;58642:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;58720:8;;58711:5;:17;;58703:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58791:9;:21;58801:10;58791:21;;;;;;;;;;;;;;;;;;;;;;;;;58790:22;58782:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;58871:9;;58858:10;;:22;58850:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;58910:11;:23;58922:10;58910:23;;;;;;;;;;;;;;;;;;;;;;;;;58906:254;;;58950:11;58955:5;58950:4;:11::i;:::-;59002:5;58976:11;:23;58988:10;58976:23;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;58906:254;;;59063:1;59048:12;;:16;59040:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;59108:11;59113:5;59108:4;:11::i;:::-;59134:12;;:14;;;;;;;;;:::i;:::-;;;;;;58906:254;58581:586;:::o;57708:29::-;;;;:::o;57939:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;42773:168::-;42872:4;42896:18;:27;42915:7;42896:27;;;;;;;;;;;;;;;:37;42924:8;42896:37;;;;;;;;;;;;;;;;;;;;;;;;;42889:44;;42773:168;;;;:::o;43013:401::-;43229:12;:10;:12::i;:::-;43221:20;;:4;:20;;;:60;;;;43245:36;43262:4;43268:12;:10;:12::i;:::-;43245:16;:36::i;:::-;43221:60;43199:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;43361:45;43379:4;43385:2;43389;43393:6;43401:4;43361:17;:45::i;:::-;43013:401;;;;;:::o;61782:87::-;55834:10;55823:21;;:7;:5;:7::i;:::-;:21;;;:53;;;;55848:28;55865:10;55848:7;:16;;:28;;;;:::i;:::-;55823:53;55815:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;61856:5:::1;61845:8;;:16;;;;;;;;;;;;;;;;;;61782:87::o:0;16068:201::-;15390:12;:10;:12::i;:::-;15379:23;;:7;:5;:7::i;:::-;:23;;;15371:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;16177:1:::1;16157:22;;:8;:22;;;;16149:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;16233:28;16252:8;16233:18;:28::i;:::-;16068:201:::0;:::o;61877:190::-;55834:10;55823:21;;:7;:5;:7::i;:::-;:21;;;:53;;;;55848:28;55865:10;55848:7;:16;;:28;;;;:::i;:::-;55823:53;55815:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;61967:9:::1;61962:98;61982:9;;:16;;61978:1;:20;61962:98;;;62044:4;62020:7;:21;62028:9;;62038:1;62028:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;62020:21;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;62000:3;;;;;:::i;:::-;;;;61962:98;;;;61877:190:::0;;:::o;59738:196::-;59798:7;59899:6;:15;59906:7;59899:15;;;;;;;;;;;:20;;:27;;;;59871:6;:15;59878:7;59871:15;;;;;;;;;;;:24;;;59844:6;:15;59851:7;59844:15;;;;;;;;;;;:24;;;:51;;;;:::i;:::-;59826:15;:69;;;;:::i;:::-;59825:101;;;;:::i;:::-;59818:108;;59738:196;;;:::o;59175:419::-;59238:7;:19;59246:10;59238:19;;;;;;;;;;;;;;;;;;;;;;;;;59230:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;59347:1;59319:13;:25;59333:10;59319:25;;;;;;;;;;;;;;;;:29;59311:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;59421:1;59397:6;:9;59404:1;59397:9;;;;;;;;;;;:14;;:21;;;;:25;59389:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;59471:1;59461:7;:11;59453:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;59515:33;59521:10;59533:7;59542:1;59515:33;;;;;;;;;;;;:5;:33::i;:::-;59559:13;:25;59573:10;59559:25;;;;;;;;;;;;;;;;:27;;;;;;;;;:::i;:::-;;;;;;59175:419;:::o;40575:310::-;40677:4;40729:26;40714:41;;;:11;:41;;;;:110;;;;40787:37;40772:52;;;:11;:52;;;;40714:110;:163;;;;40841:36;40865:11;40841:23;:36::i;:::-;40714:163;40694:183;;40575:310;;;:::o;55448:233::-;55550:4;55589:31;55574:46;;;:11;:46;;;;:99;;;;55637:36;55661:11;55637:23;:36::i;:::-;55574:99;55567:106;;55448:233;;;:::o;25071:167::-;25151:4;25175:55;25185:3;:10;;25221:5;25205:23;;25197:32;;25175:9;:55::i;:::-;25168:62;;25071:167;;;;:::o;13883:98::-;13936:7;13963:10;13956:17;;13883:98;:::o;24827:158::-;24900:4;24924:53;24932:3;:10;;24968:5;24952:23;;24944:32;;24924:7;:53::i;:::-;24917:60;;24827:158;;;;:::o;62388:312::-;62602:58;62631:4;62637:2;62641:3;62646:7;62655:4;62602:28;:58::i;:::-;62687:5;62671:7;:13;62679:4;62671:13;;;;;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;62388:312;;;;;:::o;25324:117::-;25387:7;25414:19;25422:3;:10;;25414:7;:19::i;:::-;25407:26;;25324:117;;;:::o;25795:158::-;25869:7;25920:22;25924:3;:10;;25936:5;25920:3;:22::i;:::-;25912:31;;25889:56;;25795:158;;;;:::o;24499:152::-;24569:4;24593:50;24598:3;:10;;24634:5;24618:23;;24610:32;;24593:4;:50::i;:::-;24586:57;;24499:152;;;;:::o;47967:569::-;48134:1;48120:16;;:2;:16;;;;48112:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;48187:16;48206:12;:10;:12::i;:::-;48187:31;;48231:102;48252:8;48270:1;48274:2;48278:21;48296:2;48278:17;:21::i;:::-;48301:25;48319:6;48301:17;:25::i;:::-;48328:4;48231:20;:102::i;:::-;48367:6;48346:9;:13;48356:2;48346:13;;;;;;;;;;;:17;48360:2;48346:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;48426:2;48389:52;;48422:1;48389:52;;48404:8;48389:52;;;48430:2;48434:6;48389:52;;;;;;;:::i;:::-;;;;;;;;48454:74;48485:8;48503:1;48507:2;48511;48515:6;48523:4;48454:30;:74::i;:::-;48101:435;47967:569;;;;:::o;16429:191::-;16503:16;16522:6;;;;;;;;;;;16503:25;;16548:8;16539:6;;:17;;;;;;;;;;;;;;;;;;16603:8;16572:40;;16593:8;16572:40;;;;;;;;;;;;16492:128;16429:191;:::o;51761:331::-;51916:8;51907:17;;:5;:17;;;;51899:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;52019:8;51981:18;:25;52000:5;51981:25;;;;;;;;;;;;;;;:35;52007:8;51981:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;52065:8;52043:41;;52058:5;52043:41;;;52075:8;52043:41;;;;;;:::i;:::-;;;;;;;;51761:331;;;:::o;58249:291::-;58302:11;;;;;;;;;;;58295:32;;;58328:10;58348:4;58355:5;58295:66;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;58386:5;58372:10;;:19;;;;;;;:::i;:::-;;;;;;;;58404:27;58410:10;58422:1;58425;58404:27;;;;;;;;;;;;:5;:27::i;:::-;58466:4;58444:7;:19;58452:10;58444:19;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;58505:4;58481:9;:21;58491:10;58481:21;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;58520:10;;:12;;;;;;;;;:::i;:::-;;;;;;58249:291;:::o;62100:280::-;62289:51;62313:4;62319:2;62323;62327:6;62335:4;62289:23;:51::i;:::-;62367:5;62351:7;:13;62359:4;62351:13;;;;;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;62100:280;;;;;:::o;39334:157::-;39419:4;39458:25;39443:40;;;:11;:40;;;;39436:47;;39334:157;;;:::o;20510:129::-;20583:4;20630:1;20607:3;:12;;:19;20620:5;20607:19;;;;;;;;;;;;:24;;20600:31;;20510:129;;;;:::o;19004:1420::-;19070:4;19188:18;19209:3;:12;;:19;19222:5;19209:19;;;;;;;;;;;;19188:40;;19259:1;19245:10;:15;19241:1176;;19620:21;19657:1;19644:10;:14;;;;:::i;:::-;19620:38;;19673:17;19714:1;19693:3;:11;;:18;;;;:22;;;;:::i;:::-;19673:42;;19749:13;19736:9;:26;19732:405;;19783:17;19803:3;:11;;19815:9;19803:22;;;;;;;;:::i;:::-;;;;;;;;;;19783:42;;19957:9;19928:3;:11;;19940:13;19928:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;20068:10;20042:3;:12;;:23;20055:9;20042:23;;;;;;;;;;;:36;;;;19764:373;19732:405;20218:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20313:3;:12;;:19;20326:5;20313:19;;;;;;;;;;;20306:26;;;20356:4;20349:11;;;;;;;19241:1176;20400:5;20393:12;;;19004:1420;;;;;:::o;45575:1074::-;45802:7;:14;45788:3;:10;:28;45780:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;45894:1;45880:16;;:2;:16;;;;45872:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;45951:16;45970:12;:10;:12::i;:::-;45951:31;;45995:60;46016:8;46026:4;46032:2;46036:3;46041:7;46050:4;45995:20;:60::i;:::-;46073:9;46068:421;46092:3;:10;46088:1;:14;46068:421;;;46124:10;46137:3;46141:1;46137:6;;;;;;;;:::i;:::-;;;;;;;;46124:19;;46158:14;46175:7;46183:1;46175:10;;;;;;;;:::i;:::-;;;;;;;;46158:27;;46202:19;46224:9;:13;46234:2;46224:13;;;;;;;;;;;:19;46238:4;46224:19;;;;;;;;;;;;;;;;46202:41;;46281:6;46266:11;:21;;46258:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;46414:6;46400:11;:20;46378:9;:13;46388:2;46378:13;;;;;;;;;;;:19;46392:4;46378:19;;;;;;;;;;;;;;;:42;;;;46471:6;46450:9;:13;46460:2;46450:13;;;;;;;;;;;:17;46464:2;46450:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;46109:380;;;46104:3;;;;:::i;:::-;;;46068:421;;;;46536:2;46506:47;;46530:4;46506:47;;46520:8;46506:47;;;46540:3;46545:7;46506:47;;;;;;;:::i;:::-;;;;;;;;46566:75;46602:8;46612:4;46618:2;46622:3;46627:7;46636:4;46566:35;:75::i;:::-;45769:880;45575:1074;;;;;:::o;20725:109::-;20781:7;20808:3;:11;;:18;;;;20801:25;;20725:109;;;:::o;21188:120::-;21255:7;21282:3;:11;;21294:5;21282:18;;;;;;;;:::i;:::-;;;;;;;;;;21275:25;;21188:120;;;;:::o;18414:414::-;18477:4;18499:21;18509:3;18514:5;18499:9;:21::i;:::-;18494:327;;18537:3;:11;;18554:5;18537:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18720:3;:11;;:18;;;;18698:3;:12;;:19;18711:5;18698:19;;;;;;;;;;;:40;;;;18760:4;18753:11;;;;18494:327;18804:5;18797:12;;18414:414;;;;;:::o;54850:198::-;54916:16;54945:22;54984:1;54970:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54945:41;;55008:7;54997:5;55003:1;54997:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;55035:5;55028:12;;;54850:198;;;:::o;53048:221::-;;;;;;;:::o;53277:744::-;53492:15;:2;:13;;;:15::i;:::-;53488:526;;;53545:2;53528:38;;;53567:8;53577:4;53583:2;53587:6;53595:4;53528:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;53524:479;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;53876:6;53869:14;;;;;;;;;;;:::i;:::-;;;;;;;;53524:479;;;53925:62;;;;;;;;;;:::i;:::-;;;;;;;;53524:479;53662:43;;;53650:55;;;:8;:55;;;;53646:154;;53730:50;;;;;;;;;;:::i;:::-;;;;;;;;53646:154;53601:214;53488:526;53277:744;;;;;;:::o;44397:820::-;44599:1;44585:16;;:2;:16;;;;44577:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;44656:16;44675:12;:10;:12::i;:::-;44656:31;;44700:96;44721:8;44731:4;44737:2;44741:21;44759:2;44741:17;:21::i;:::-;44764:25;44782:6;44764:17;:25::i;:::-;44791:4;44700:20;:96::i;:::-;44809:19;44831:9;:13;44841:2;44831:13;;;;;;;;;;;:19;44845:4;44831:19;;;;;;;;;;;;;;;;44809:41;;44884:6;44869:11;:21;;44861:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;45009:6;44995:11;:20;44973:9;:13;44983:2;44973:13;;;;;;;;;;;:19;44987:4;44973:19;;;;;;;;;;;;;;;:42;;;;45058:6;45037:9;:13;45047:2;45037:13;;;;;;;;;;;:17;45051:2;45037:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;45113:2;45082:46;;45107:4;45082:46;;45097:8;45082:46;;;45117:2;45121:6;45082:46;;;;;;;:::i;:::-;;;;;;;;45141:68;45172:8;45182:4;45188:2;45192;45196:6;45204:4;45141:30;:68::i;:::-;44566:651;;44397:820;;;;;:::o;54029:813::-;54269:15;:2;:13;;;:15::i;:::-;54265:570;;;54322:2;54305:43;;;54349:8;54359:4;54365:3;54370:7;54379:4;54305:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;54301:523;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;54697:6;54690:14;;;;;;;;;;;:::i;:::-;;;;;;;;54301:523;;;54746:62;;;;;;;;;;:::i;:::-;;;;;;;;54301:523;54478:48;;;54466:60;;;:8;:60;;;;54462:159;;54551:50;;;;;;;;;;:::i;:::-;;;;;;;;54462:159;54385:251;54265:570;54029:813;;;;;;:::o;5873:387::-;5933:4;6141:12;6208:7;6196:20;6188:28;;6251:1;6244:4;:8;6237:15;;;5873:387;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;768:957::-;874:5;899:91;915:74;982:6;915:74;:::i;:::-;899:91;:::i;:::-;890:100;;1010:5;1039:6;1032:5;1025:21;1073:4;1066:5;1062:16;1055:23;;1099:6;1149:3;1141:4;1133:6;1129:17;1124:3;1120:27;1117:36;1114:143;;;1168:79;;:::i;:::-;1114:143;1281:1;1266:453;1291:6;1288:1;1285:13;1266:453;;;1373:3;1360:17;1409:18;1396:11;1393:35;1390:122;;;1431:79;;:::i;:::-;1390:122;1555:11;1547:6;1543:24;1593:47;1636:3;1624:10;1593:47;:::i;:::-;1588:3;1581:60;1670:4;1665:3;1661:14;1654:21;;1704:4;1699:3;1695:14;1688:21;;1326:393;;1313:1;1310;1306:9;1301:14;;1266:453;;;1270:14;880:845;;768:957;;;;;:::o;1748:722::-;1844:5;1869:81;1885:64;1942:6;1885:64;:::i;:::-;1869:81;:::i;:::-;1860:90;;1970:5;1999:6;1992:5;1985:21;2033:4;2026:5;2022:16;2015:23;;2059:6;2109:3;2101:4;2093:6;2089:17;2084:3;2080:27;2077:36;2074:143;;;2128:79;;:::i;:::-;2074:143;2241:1;2226:238;2251:6;2248:1;2245:13;2226:238;;;2319:3;2348:37;2381:3;2369:10;2348:37;:::i;:::-;2343:3;2336:50;2415:4;2410:3;2406:14;2399:21;;2449:4;2444:3;2440:14;2433:21;;2286:178;2273:1;2270;2266:9;2261:14;;2226:238;;;2230:14;1850:620;;1748:722;;;;;:::o;2476:410::-;2553:5;2578:65;2594:48;2635:6;2594:48;:::i;:::-;2578:65;:::i;:::-;2569:74;;2666:6;2659:5;2652:21;2704:4;2697:5;2693:16;2742:3;2733:6;2728:3;2724:16;2721:25;2718:112;;;2749:79;;:::i;:::-;2718:112;2839:41;2873:6;2868:3;2863;2839:41;:::i;:::-;2559:327;2476:410;;;;;:::o;2892:412::-;2970:5;2995:66;3011:49;3053:6;3011:49;:::i;:::-;2995:66;:::i;:::-;2986:75;;3084:6;3077:5;3070:21;3122:4;3115:5;3111:16;3160:3;3151:6;3146:3;3142:16;3139:25;3136:112;;;3167:79;;:::i;:::-;3136:112;3257:41;3291:6;3286:3;3281;3257:41;:::i;:::-;2976:328;2892:412;;;;;:::o;3310:139::-;3356:5;3394:6;3381:20;3372:29;;3410:33;3437:5;3410:33;:::i;:::-;3310:139;;;;:::o;3455:155::-;3509:5;3547:6;3534:20;3525:29;;3563:41;3598:5;3563:41;:::i;:::-;3455:155;;;;:::o;3633:568::-;3706:8;3716:6;3766:3;3759:4;3751:6;3747:17;3743:27;3733:122;;3774:79;;:::i;:::-;3733:122;3887:6;3874:20;3864:30;;3917:18;3909:6;3906:30;3903:117;;;3939:79;;:::i;:::-;3903:117;4053:4;4045:6;4041:17;4029:29;;4107:3;4099:4;4091:6;4087:17;4077:8;4073:32;4070:41;4067:128;;;4114:79;;:::i;:::-;4067:128;3633:568;;;;;:::o;4224:370::-;4295:5;4344:3;4337:4;4329:6;4325:17;4321:27;4311:122;;4352:79;;:::i;:::-;4311:122;4469:6;4456:20;4494:94;4584:3;4576:6;4569:4;4561:6;4557:17;4494:94;:::i;:::-;4485:103;;4301:293;4224:370;;;;:::o;4616:580::-;4701:8;4711:6;4761:3;4754:4;4746:6;4742:17;4738:27;4728:122;;4769:79;;:::i;:::-;4728:122;4882:6;4869:20;4859:30;;4912:18;4904:6;4901:30;4898:117;;;4934:79;;:::i;:::-;4898:117;5048:4;5040:6;5036:17;5024:29;;5102:3;5094:4;5086:6;5082:17;5072:8;5068:32;5065:41;5062:128;;;5109:79;;:::i;:::-;5062:128;4616:580;;;;;:::o;5219:370::-;5290:5;5339:3;5332:4;5324:6;5320:17;5316:27;5306:122;;5347:79;;:::i;:::-;5306:122;5464:6;5451:20;5489:94;5579:3;5571:6;5564:4;5556:6;5552:17;5489:94;:::i;:::-;5480:103;;5296:293;5219:370;;;;:::o;5595:133::-;5638:5;5676:6;5663:20;5654:29;;5692:30;5716:5;5692:30;:::i;:::-;5595:133;;;;:::o;5734:137::-;5788:5;5819:6;5813:13;5804:22;;5835:30;5859:5;5835:30;:::i;:::-;5734:137;;;;:::o;5877:::-;5922:5;5960:6;5947:20;5938:29;;5976:32;6002:5;5976:32;:::i;:::-;5877:137;;;;:::o;6020:141::-;6076:5;6107:6;6101:13;6092:22;;6123:32;6149:5;6123:32;:::i;:::-;6020:141;;;;:::o;6180:338::-;6235:5;6284:3;6277:4;6269:6;6265:17;6261:27;6251:122;;6292:79;;:::i;:::-;6251:122;6409:6;6396:20;6434:78;6508:3;6500:6;6493:4;6485:6;6481:17;6434:78;:::i;:::-;6425:87;;6241:277;6180:338;;;;:::o;6538:340::-;6594:5;6643:3;6636:4;6628:6;6624:17;6620:27;6610:122;;6651:79;;:::i;:::-;6610:122;6768:6;6755:20;6793:79;6868:3;6860:6;6853:4;6845:6;6841:17;6793:79;:::i;:::-;6784:88;;6600:278;6538:340;;;;:::o;6884:139::-;6930:5;6968:6;6955:20;6946:29;;6984:33;7011:5;6984:33;:::i;:::-;6884:139;;;;:::o;7029:329::-;7088:6;7137:2;7125:9;7116:7;7112:23;7108:32;7105:119;;;7143:79;;:::i;:::-;7105:119;7263:1;7288:53;7333:7;7324:6;7313:9;7309:22;7288:53;:::i;:::-;7278:63;;7234:117;7029:329;;;;:::o;7364:490::-;7440:6;7448;7497:2;7485:9;7476:7;7472:23;7468:32;7465:119;;;7503:79;;:::i;:::-;7465:119;7623:1;7648:61;7701:7;7692:6;7681:9;7677:22;7648:61;:::i;:::-;7638:71;;7594:125;7758:2;7784:53;7829:7;7820:6;7809:9;7805:22;7784:53;:::i;:::-;7774:63;;7729:118;7364:490;;;;;:::o;7860:474::-;7928:6;7936;7985:2;7973:9;7964:7;7960:23;7956:32;7953:119;;;7991:79;;:::i;:::-;7953:119;8111:1;8136:53;8181:7;8172:6;8161:9;8157:22;8136:53;:::i;:::-;8126:63;;8082:117;8238:2;8264:53;8309:7;8300:6;8289:9;8285:22;8264:53;:::i;:::-;8254:63;;8209:118;7860:474;;;;;:::o;8340:1509::-;8494:6;8502;8510;8518;8526;8575:3;8563:9;8554:7;8550:23;8546:33;8543:120;;;8582:79;;:::i;:::-;8543:120;8702:1;8727:53;8772:7;8763:6;8752:9;8748:22;8727:53;:::i;:::-;8717:63;;8673:117;8829:2;8855:53;8900:7;8891:6;8880:9;8876:22;8855:53;:::i;:::-;8845:63;;8800:118;8985:2;8974:9;8970:18;8957:32;9016:18;9008:6;9005:30;9002:117;;;9038:79;;:::i;:::-;9002:117;9143:78;9213:7;9204:6;9193:9;9189:22;9143:78;:::i;:::-;9133:88;;8928:303;9298:2;9287:9;9283:18;9270:32;9329:18;9321:6;9318:30;9315:117;;;9351:79;;:::i;:::-;9315:117;9456:78;9526:7;9517:6;9506:9;9502:22;9456:78;:::i;:::-;9446:88;;9241:303;9611:3;9600:9;9596:19;9583:33;9643:18;9635:6;9632:30;9629:117;;;9665:79;;:::i;:::-;9629:117;9770:62;9824:7;9815:6;9804:9;9800:22;9770:62;:::i;:::-;9760:72;;9554:288;8340:1509;;;;;;;;:::o;9855:1089::-;9959:6;9967;9975;9983;9991;10040:3;10028:9;10019:7;10015:23;10011:33;10008:120;;;10047:79;;:::i;:::-;10008:120;10167:1;10192:53;10237:7;10228:6;10217:9;10213:22;10192:53;:::i;:::-;10182:63;;10138:117;10294:2;10320:53;10365:7;10356:6;10345:9;10341:22;10320:53;:::i;:::-;10310:63;;10265:118;10422:2;10448:53;10493:7;10484:6;10473:9;10469:22;10448:53;:::i;:::-;10438:63;;10393:118;10550:2;10576:53;10621:7;10612:6;10601:9;10597:22;10576:53;:::i;:::-;10566:63;;10521:118;10706:3;10695:9;10691:19;10678:33;10738:18;10730:6;10727:30;10724:117;;;10760:79;;:::i;:::-;10724:117;10865:62;10919:7;10910:6;10899:9;10895:22;10865:62;:::i;:::-;10855:72;;10649:288;9855:1089;;;;;;;;:::o;10950:468::-;11015:6;11023;11072:2;11060:9;11051:7;11047:23;11043:32;11040:119;;;11078:79;;:::i;:::-;11040:119;11198:1;11223:53;11268:7;11259:6;11248:9;11244:22;11223:53;:::i;:::-;11213:63;;11169:117;11325:2;11351:50;11393:7;11384:6;11373:9;11369:22;11351:50;:::i;:::-;11341:60;;11296:115;10950:468;;;;;:::o;11424:474::-;11492:6;11500;11549:2;11537:9;11528:7;11524:23;11520:32;11517:119;;;11555:79;;:::i;:::-;11517:119;11675:1;11700:53;11745:7;11736:6;11725:9;11721:22;11700:53;:::i;:::-;11690:63;;11646:117;11802:2;11828:53;11873:7;11864:6;11853:9;11849:22;11828:53;:::i;:::-;11818:63;;11773:118;11424:474;;;;;:::o;11904:559::-;11990:6;11998;12047:2;12035:9;12026:7;12022:23;12018:32;12015:119;;;12053:79;;:::i;:::-;12015:119;12201:1;12190:9;12186:17;12173:31;12231:18;12223:6;12220:30;12217:117;;;12253:79;;:::i;:::-;12217:117;12366:80;12438:7;12429:6;12418:9;12414:22;12366:80;:::i;:::-;12348:98;;;;12144:312;11904:559;;;;;:::o;12469:894::-;12587:6;12595;12644:2;12632:9;12623:7;12619:23;12615:32;12612:119;;;12650:79;;:::i;:::-;12612:119;12798:1;12787:9;12783:17;12770:31;12828:18;12820:6;12817:30;12814:117;;;12850:79;;:::i;:::-;12814:117;12955:78;13025:7;13016:6;13005:9;13001:22;12955:78;:::i;:::-;12945:88;;12741:302;13110:2;13099:9;13095:18;13082:32;13141:18;13133:6;13130:30;13127:117;;;13163:79;;:::i;:::-;13127:117;13268:78;13338:7;13329:6;13318:9;13314:22;13268:78;:::i;:::-;13258:88;;13053:303;12469:894;;;;;:::o;13369:345::-;13436:6;13485:2;13473:9;13464:7;13460:23;13456:32;13453:119;;;13491:79;;:::i;:::-;13453:119;13611:1;13636:61;13689:7;13680:6;13669:9;13665:22;13636:61;:::i;:::-;13626:71;;13582:125;13369:345;;;;:::o;13720:327::-;13778:6;13827:2;13815:9;13806:7;13802:23;13798:32;13795:119;;;13833:79;;:::i;:::-;13795:119;13953:1;13978:52;14022:7;14013:6;14002:9;13998:22;13978:52;:::i;:::-;13968:62;;13924:116;13720:327;;;;:::o;14053:349::-;14122:6;14171:2;14159:9;14150:7;14146:23;14142:32;14139:119;;;14177:79;;:::i;:::-;14139:119;14297:1;14322:63;14377:7;14368:6;14357:9;14353:22;14322:63;:::i;:::-;14312:73;;14268:127;14053:349;;;;:::o;14408:329::-;14467:6;14516:2;14504:9;14495:7;14491:23;14487:32;14484:119;;;14522:79;;:::i;:::-;14484:119;14642:1;14667:53;14712:7;14703:6;14692:9;14688:22;14667:53;:::i;:::-;14657:63;;14613:117;14408:329;;;;:::o;14743:849::-;14847:6;14855;14863;14871;14920:2;14908:9;14899:7;14895:23;14891:32;14888:119;;;14926:79;;:::i;:::-;14888:119;15046:1;15071:53;15116:7;15107:6;15096:9;15092:22;15071:53;:::i;:::-;15061:63;;15017:117;15201:2;15190:9;15186:18;15173:32;15232:18;15224:6;15221:30;15218:117;;;15254:79;;:::i;:::-;15218:117;15367:80;15439:7;15430:6;15419:9;15415:22;15367:80;:::i;:::-;15349:98;;;;15144:313;15496:2;15522:53;15567:7;15558:6;15547:9;15543:22;15522:53;:::i;:::-;15512:63;;15467:118;14743:849;;;;;;;:::o;15598:1019::-;15723:6;15731;15739;15747;15755;15804:3;15792:9;15783:7;15779:23;15775:33;15772:120;;;15811:79;;:::i;:::-;15772:120;15931:1;15956:53;16001:7;15992:6;15981:9;15977:22;15956:53;:::i;:::-;15946:63;;15902:117;16086:2;16075:9;16071:18;16058:32;16117:18;16109:6;16106:30;16103:117;;;16139:79;;:::i;:::-;16103:117;16252:92;16336:7;16327:6;16316:9;16312:22;16252:92;:::i;:::-;16234:110;;;;16029:325;16393:2;16419:53;16464:7;16455:6;16444:9;16440:22;16419:53;:::i;:::-;16409:63;;16364:118;16521:2;16547:53;16592:7;16583:6;16572:9;16568:22;16547:53;:::i;:::-;16537:63;;16492:118;15598:1019;;;;;;;;:::o;16623:474::-;16691:6;16699;16748:2;16736:9;16727:7;16723:23;16719:32;16716:119;;;16754:79;;:::i;:::-;16716:119;16874:1;16899:53;16944:7;16935:6;16924:9;16920:22;16899:53;:::i;:::-;16889:63;;16845:117;17001:2;17027:53;17072:7;17063:6;17052:9;17048:22;17027:53;:::i;:::-;17017:63;;16972:118;16623:474;;;;;:::o;17103:179::-;17172:10;17193:46;17235:3;17227:6;17193:46;:::i;:::-;17271:4;17266:3;17262:14;17248:28;;17103:179;;;;:::o;17288:::-;17357:10;17378:46;17420:3;17412:6;17378:46;:::i;:::-;17456:4;17451:3;17447:14;17433:28;;17288:179;;;;:::o;17473:108::-;17550:24;17568:5;17550:24;:::i;:::-;17545:3;17538:37;17473:108;;:::o;17587:118::-;17674:24;17692:5;17674:24;:::i;:::-;17669:3;17662:37;17587:118;;:::o;17741:732::-;17860:3;17889:54;17937:5;17889:54;:::i;:::-;17959:86;18038:6;18033:3;17959:86;:::i;:::-;17952:93;;18069:56;18119:5;18069:56;:::i;:::-;18148:7;18179:1;18164:284;18189:6;18186:1;18183:13;18164:284;;;18265:6;18259:13;18292:63;18351:3;18336:13;18292:63;:::i;:::-;18285:70;;18378:60;18431:6;18378:60;:::i;:::-;18368:70;;18224:224;18211:1;18208;18204:9;18199:14;;18164:284;;;18168:14;18464:3;18457:10;;17865:608;;;17741:732;;;;:::o;18509:::-;18628:3;18657:54;18705:5;18657:54;:::i;:::-;18727:86;18806:6;18801:3;18727:86;:::i;:::-;18720:93;;18837:56;18887:5;18837:56;:::i;:::-;18916:7;18947:1;18932:284;18957:6;18954:1;18951:13;18932:284;;;19033:6;19027:13;19060:63;19119:3;19104:13;19060:63;:::i;:::-;19053:70;;19146:60;19199:6;19146:60;:::i;:::-;19136:70;;18992:224;18979:1;18976;18972:9;18967:14;;18932:284;;;18936:14;19232:3;19225:10;;18633:608;;;18509:732;;;;:::o;19247:109::-;19328:21;19343:5;19328:21;:::i;:::-;19323:3;19316:34;19247:109;;:::o;19362:360::-;19448:3;19476:38;19508:5;19476:38;:::i;:::-;19530:70;19593:6;19588:3;19530:70;:::i;:::-;19523:77;;19609:52;19654:6;19649:3;19642:4;19635:5;19631:16;19609:52;:::i;:::-;19686:29;19708:6;19686:29;:::i;:::-;19681:3;19677:39;19670:46;;19452:270;19362:360;;;;:::o;19728:364::-;19816:3;19844:39;19877:5;19844:39;:::i;:::-;19899:71;19963:6;19958:3;19899:71;:::i;:::-;19892:78;;19979:52;20024:6;20019:3;20012:4;20005:5;20001:16;19979:52;:::i;:::-;20056:29;20078:6;20056:29;:::i;:::-;20051:3;20047:39;20040:46;;19820:272;19728:364;;;;:::o;20098:366::-;20240:3;20261:67;20325:2;20320:3;20261:67;:::i;:::-;20254:74;;20337:93;20426:3;20337:93;:::i;:::-;20455:2;20450:3;20446:12;20439:19;;20098:366;;;:::o;20470:::-;20612:3;20633:67;20697:2;20692:3;20633:67;:::i;:::-;20626:74;;20709:93;20798:3;20709:93;:::i;:::-;20827:2;20822:3;20818:12;20811:19;;20470:366;;;:::o;20842:::-;20984:3;21005:67;21069:2;21064:3;21005:67;:::i;:::-;20998:74;;21081:93;21170:3;21081:93;:::i;:::-;21199:2;21194:3;21190:12;21183:19;;20842:366;;;:::o;21214:::-;21356:3;21377:67;21441:2;21436:3;21377:67;:::i;:::-;21370:74;;21453:93;21542:3;21453:93;:::i;:::-;21571:2;21566:3;21562:12;21555:19;;21214:366;;;:::o;21586:::-;21728:3;21749:67;21813:2;21808:3;21749:67;:::i;:::-;21742:74;;21825:93;21914:3;21825:93;:::i;:::-;21943:2;21938:3;21934:12;21927:19;;21586:366;;;:::o;21958:::-;22100:3;22121:67;22185:2;22180:3;22121:67;:::i;:::-;22114:74;;22197:93;22286:3;22197:93;:::i;:::-;22315:2;22310:3;22306:12;22299:19;;21958:366;;;:::o;22330:::-;22472:3;22493:67;22557:2;22552:3;22493:67;:::i;:::-;22486:74;;22569:93;22658:3;22569:93;:::i;:::-;22687:2;22682:3;22678:12;22671:19;;22330:366;;;:::o;22702:::-;22844:3;22865:67;22929:2;22924:3;22865:67;:::i;:::-;22858:74;;22941:93;23030:3;22941:93;:::i;:::-;23059:2;23054:3;23050:12;23043:19;;22702:366;;;:::o;23074:::-;23216:3;23237:67;23301:2;23296:3;23237:67;:::i;:::-;23230:74;;23313:93;23402:3;23313:93;:::i;:::-;23431:2;23426:3;23422:12;23415:19;;23074:366;;;:::o;23446:::-;23588:3;23609:67;23673:2;23668:3;23609:67;:::i;:::-;23602:74;;23685:93;23774:3;23685:93;:::i;:::-;23803:2;23798:3;23794:12;23787:19;;23446:366;;;:::o;23818:::-;23960:3;23981:67;24045:2;24040:3;23981:67;:::i;:::-;23974:74;;24057:93;24146:3;24057:93;:::i;:::-;24175:2;24170:3;24166:12;24159:19;;23818:366;;;:::o;24190:::-;24332:3;24353:67;24417:2;24412:3;24353:67;:::i;:::-;24346:74;;24429:93;24518:3;24429:93;:::i;:::-;24547:2;24542:3;24538:12;24531:19;;24190:366;;;:::o;24562:::-;24704:3;24725:67;24789:2;24784:3;24725:67;:::i;:::-;24718:74;;24801:93;24890:3;24801:93;:::i;:::-;24919:2;24914:3;24910:12;24903:19;;24562:366;;;:::o;24934:::-;25076:3;25097:67;25161:2;25156:3;25097:67;:::i;:::-;25090:74;;25173:93;25262:3;25173:93;:::i;:::-;25291:2;25286:3;25282:12;25275:19;;24934:366;;;:::o;25306:::-;25448:3;25469:67;25533:2;25528:3;25469:67;:::i;:::-;25462:74;;25545:93;25634:3;25545:93;:::i;:::-;25663:2;25658:3;25654:12;25647:19;;25306:366;;;:::o;25678:::-;25820:3;25841:67;25905:2;25900:3;25841:67;:::i;:::-;25834:74;;25917:93;26006:3;25917:93;:::i;:::-;26035:2;26030:3;26026:12;26019:19;;25678:366;;;:::o;26050:::-;26192:3;26213:67;26277:2;26272:3;26213:67;:::i;:::-;26206:74;;26289:93;26378:3;26289:93;:::i;:::-;26407:2;26402:3;26398:12;26391:19;;26050:366;;;:::o;26422:::-;26564:3;26585:67;26649:2;26644:3;26585:67;:::i;:::-;26578:74;;26661:93;26750:3;26661:93;:::i;:::-;26779:2;26774:3;26770:12;26763:19;;26422:366;;;:::o;26794:365::-;26936:3;26957:66;27021:1;27016:3;26957:66;:::i;:::-;26950:73;;27032:93;27121:3;27032:93;:::i;:::-;27150:2;27145:3;27141:12;27134:19;;26794:365;;;:::o;27165:366::-;27307:3;27328:67;27392:2;27387:3;27328:67;:::i;:::-;27321:74;;27404:93;27493:3;27404:93;:::i;:::-;27522:2;27517:3;27513:12;27506:19;;27165:366;;;:::o;27537:::-;27679:3;27700:67;27764:2;27759:3;27700:67;:::i;:::-;27693:74;;27776:93;27865:3;27776:93;:::i;:::-;27894:2;27889:3;27885:12;27878:19;;27537:366;;;:::o;27909:::-;28051:3;28072:67;28136:2;28131:3;28072:67;:::i;:::-;28065:74;;28148:93;28237:3;28148:93;:::i;:::-;28266:2;28261:3;28257:12;28250:19;;27909:366;;;:::o;28281:::-;28423:3;28444:67;28508:2;28503:3;28444:67;:::i;:::-;28437:74;;28520:93;28609:3;28520:93;:::i;:::-;28638:2;28633:3;28629:12;28622:19;;28281:366;;;:::o;28653:::-;28795:3;28816:67;28880:2;28875:3;28816:67;:::i;:::-;28809:74;;28892:93;28981:3;28892:93;:::i;:::-;29010:2;29005:3;29001:12;28994:19;;28653:366;;;:::o;29025:::-;29167:3;29188:67;29252:2;29247:3;29188:67;:::i;:::-;29181:74;;29264:93;29353:3;29264:93;:::i;:::-;29382:2;29377:3;29373:12;29366:19;;29025:366;;;:::o;29397:::-;29539:3;29560:67;29624:2;29619:3;29560:67;:::i;:::-;29553:74;;29636:93;29725:3;29636:93;:::i;:::-;29754:2;29749:3;29745:12;29738:19;;29397:366;;;:::o;29769:108::-;29846:24;29864:5;29846:24;:::i;:::-;29841:3;29834:37;29769:108;;:::o;29883:118::-;29970:24;29988:5;29970:24;:::i;:::-;29965:3;29958:37;29883:118;;:::o;30007:222::-;30100:4;30138:2;30127:9;30123:18;30115:26;;30151:71;30219:1;30208:9;30204:17;30195:6;30151:71;:::i;:::-;30007:222;;;;:::o;30235:1053::-;30558:4;30596:3;30585:9;30581:19;30573:27;;30610:71;30678:1;30667:9;30663:17;30654:6;30610:71;:::i;:::-;30691:72;30759:2;30748:9;30744:18;30735:6;30691:72;:::i;:::-;30810:9;30804:4;30800:20;30795:2;30784:9;30780:18;30773:48;30838:108;30941:4;30932:6;30838:108;:::i;:::-;30830:116;;30993:9;30987:4;30983:20;30978:2;30967:9;30963:18;30956:48;31021:108;31124:4;31115:6;31021:108;:::i;:::-;31013:116;;31177:9;31171:4;31167:20;31161:3;31150:9;31146:19;31139:49;31205:76;31276:4;31267:6;31205:76;:::i;:::-;31197:84;;30235:1053;;;;;;;;:::o;31294:442::-;31443:4;31481:2;31470:9;31466:18;31458:26;;31494:71;31562:1;31551:9;31547:17;31538:6;31494:71;:::i;:::-;31575:72;31643:2;31632:9;31628:18;31619:6;31575:72;:::i;:::-;31657;31725:2;31714:9;31710:18;31701:6;31657:72;:::i;:::-;31294:442;;;;;;:::o;31742:751::-;31965:4;32003:3;31992:9;31988:19;31980:27;;32017:71;32085:1;32074:9;32070:17;32061:6;32017:71;:::i;:::-;32098:72;32166:2;32155:9;32151:18;32142:6;32098:72;:::i;:::-;32180;32248:2;32237:9;32233:18;32224:6;32180:72;:::i;:::-;32262;32330:2;32319:9;32315:18;32306:6;32262:72;:::i;:::-;32382:9;32376:4;32372:20;32366:3;32355:9;32351:19;32344:49;32410:76;32481:4;32472:6;32410:76;:::i;:::-;32402:84;;31742:751;;;;;;;;:::o;32499:332::-;32620:4;32658:2;32647:9;32643:18;32635:26;;32671:71;32739:1;32728:9;32724:17;32715:6;32671:71;:::i;:::-;32752:72;32820:2;32809:9;32805:18;32796:6;32752:72;:::i;:::-;32499:332;;;;;:::o;32837:373::-;32980:4;33018:2;33007:9;33003:18;32995:26;;33067:9;33061:4;33057:20;33053:1;33042:9;33038:17;33031:47;33095:108;33198:4;33189:6;33095:108;:::i;:::-;33087:116;;32837:373;;;;:::o;33216:::-;33359:4;33397:2;33386:9;33382:18;33374:26;;33446:9;33440:4;33436:20;33432:1;33421:9;33417:17;33410:47;33474:108;33577:4;33568:6;33474:108;:::i;:::-;33466:116;;33216:373;;;;:::o;33595:634::-;33816:4;33854:2;33843:9;33839:18;33831:26;;33903:9;33897:4;33893:20;33889:1;33878:9;33874:17;33867:47;33931:108;34034:4;34025:6;33931:108;:::i;:::-;33923:116;;34086:9;34080:4;34076:20;34071:2;34060:9;34056:18;34049:48;34114:108;34217:4;34208:6;34114:108;:::i;:::-;34106:116;;33595:634;;;;;:::o;34235:210::-;34322:4;34360:2;34349:9;34345:18;34337:26;;34373:65;34435:1;34424:9;34420:17;34411:6;34373:65;:::i;:::-;34235:210;;;;:::o;34451:313::-;34564:4;34602:2;34591:9;34587:18;34579:26;;34651:9;34645:4;34641:20;34637:1;34626:9;34622:17;34615:47;34679:78;34752:4;34743:6;34679:78;:::i;:::-;34671:86;;34451:313;;;;:::o;34770:419::-;34936:4;34974:2;34963:9;34959:18;34951:26;;35023:9;35017:4;35013:20;35009:1;34998:9;34994:17;34987:47;35051:131;35177:4;35051:131;:::i;:::-;35043:139;;34770:419;;;:::o;35195:::-;35361:4;35399:2;35388:9;35384:18;35376:26;;35448:9;35442:4;35438:20;35434:1;35423:9;35419:17;35412:47;35476:131;35602:4;35476:131;:::i;:::-;35468:139;;35195:419;;;:::o;35620:::-;35786:4;35824:2;35813:9;35809:18;35801:26;;35873:9;35867:4;35863:20;35859:1;35848:9;35844:17;35837:47;35901:131;36027:4;35901:131;:::i;:::-;35893:139;;35620:419;;;:::o;36045:::-;36211:4;36249:2;36238:9;36234:18;36226:26;;36298:9;36292:4;36288:20;36284:1;36273:9;36269:17;36262:47;36326:131;36452:4;36326:131;:::i;:::-;36318:139;;36045:419;;;:::o;36470:::-;36636:4;36674:2;36663:9;36659:18;36651:26;;36723:9;36717:4;36713:20;36709:1;36698:9;36694:17;36687:47;36751:131;36877:4;36751:131;:::i;:::-;36743:139;;36470:419;;;:::o;36895:::-;37061:4;37099:2;37088:9;37084:18;37076:26;;37148:9;37142:4;37138:20;37134:1;37123:9;37119:17;37112:47;37176:131;37302:4;37176:131;:::i;:::-;37168:139;;36895:419;;;:::o;37320:::-;37486:4;37524:2;37513:9;37509:18;37501:26;;37573:9;37567:4;37563:20;37559:1;37548:9;37544:17;37537:47;37601:131;37727:4;37601:131;:::i;:::-;37593:139;;37320:419;;;:::o;37745:::-;37911:4;37949:2;37938:9;37934:18;37926:26;;37998:9;37992:4;37988:20;37984:1;37973:9;37969:17;37962:47;38026:131;38152:4;38026:131;:::i;:::-;38018:139;;37745:419;;;:::o;38170:::-;38336:4;38374:2;38363:9;38359:18;38351:26;;38423:9;38417:4;38413:20;38409:1;38398:9;38394:17;38387:47;38451:131;38577:4;38451:131;:::i;:::-;38443:139;;38170:419;;;:::o;38595:::-;38761:4;38799:2;38788:9;38784:18;38776:26;;38848:9;38842:4;38838:20;38834:1;38823:9;38819:17;38812:47;38876:131;39002:4;38876:131;:::i;:::-;38868:139;;38595:419;;;:::o;39020:::-;39186:4;39224:2;39213:9;39209:18;39201:26;;39273:9;39267:4;39263:20;39259:1;39248:9;39244:17;39237:47;39301:131;39427:4;39301:131;:::i;:::-;39293:139;;39020:419;;;:::o;39445:::-;39611:4;39649:2;39638:9;39634:18;39626:26;;39698:9;39692:4;39688:20;39684:1;39673:9;39669:17;39662:47;39726:131;39852:4;39726:131;:::i;:::-;39718:139;;39445:419;;;:::o;39870:::-;40036:4;40074:2;40063:9;40059:18;40051:26;;40123:9;40117:4;40113:20;40109:1;40098:9;40094:17;40087:47;40151:131;40277:4;40151:131;:::i;:::-;40143:139;;39870:419;;;:::o;40295:::-;40461:4;40499:2;40488:9;40484:18;40476:26;;40548:9;40542:4;40538:20;40534:1;40523:9;40519:17;40512:47;40576:131;40702:4;40576:131;:::i;:::-;40568:139;;40295:419;;;:::o;40720:::-;40886:4;40924:2;40913:9;40909:18;40901:26;;40973:9;40967:4;40963:20;40959:1;40948:9;40944:17;40937:47;41001:131;41127:4;41001:131;:::i;:::-;40993:139;;40720:419;;;:::o;41145:::-;41311:4;41349:2;41338:9;41334:18;41326:26;;41398:9;41392:4;41388:20;41384:1;41373:9;41369:17;41362:47;41426:131;41552:4;41426:131;:::i;:::-;41418:139;;41145:419;;;:::o;41570:::-;41736:4;41774:2;41763:9;41759:18;41751:26;;41823:9;41817:4;41813:20;41809:1;41798:9;41794:17;41787:47;41851:131;41977:4;41851:131;:::i;:::-;41843:139;;41570:419;;;:::o;41995:::-;42161:4;42199:2;42188:9;42184:18;42176:26;;42248:9;42242:4;42238:20;42234:1;42223:9;42219:17;42212:47;42276:131;42402:4;42276:131;:::i;:::-;42268:139;;41995:419;;;:::o;42420:::-;42586:4;42624:2;42613:9;42609:18;42601:26;;42673:9;42667:4;42663:20;42659:1;42648:9;42644:17;42637:47;42701:131;42827:4;42701:131;:::i;:::-;42693:139;;42420:419;;;:::o;42845:::-;43011:4;43049:2;43038:9;43034:18;43026:26;;43098:9;43092:4;43088:20;43084:1;43073:9;43069:17;43062:47;43126:131;43252:4;43126:131;:::i;:::-;43118:139;;42845:419;;;:::o;43270:::-;43436:4;43474:2;43463:9;43459:18;43451:26;;43523:9;43517:4;43513:20;43509:1;43498:9;43494:17;43487:47;43551:131;43677:4;43551:131;:::i;:::-;43543:139;;43270:419;;;:::o;43695:::-;43861:4;43899:2;43888:9;43884:18;43876:26;;43948:9;43942:4;43938:20;43934:1;43923:9;43919:17;43912:47;43976:131;44102:4;43976:131;:::i;:::-;43968:139;;43695:419;;;:::o;44120:::-;44286:4;44324:2;44313:9;44309:18;44301:26;;44373:9;44367:4;44363:20;44359:1;44348:9;44344:17;44337:47;44401:131;44527:4;44401:131;:::i;:::-;44393:139;;44120:419;;;:::o;44545:::-;44711:4;44749:2;44738:9;44734:18;44726:26;;44798:9;44792:4;44788:20;44784:1;44773:9;44769:17;44762:47;44826:131;44952:4;44826:131;:::i;:::-;44818:139;;44545:419;;;:::o;44970:::-;45136:4;45174:2;45163:9;45159:18;45151:26;;45223:9;45217:4;45213:20;45209:1;45198:9;45194:17;45187:47;45251:131;45377:4;45251:131;:::i;:::-;45243:139;;44970:419;;;:::o;45395:::-;45561:4;45599:2;45588:9;45584:18;45576:26;;45648:9;45642:4;45638:20;45634:1;45623:9;45619:17;45612:47;45676:131;45802:4;45676:131;:::i;:::-;45668:139;;45395:419;;;:::o;45820:222::-;45913:4;45951:2;45940:9;45936:18;45928:26;;45964:71;46032:1;46021:9;46017:17;46008:6;45964:71;:::i;:::-;45820:222;;;;:::o;46048:332::-;46169:4;46207:2;46196:9;46192:18;46184:26;;46220:71;46288:1;46277:9;46273:17;46264:6;46220:71;:::i;:::-;46301:72;46369:2;46358:9;46354:18;46345:6;46301:72;:::i;:::-;46048:332;;;;;:::o;46386:129::-;46420:6;46447:20;;:::i;:::-;46437:30;;46476:33;46504:4;46496:6;46476:33;:::i;:::-;46386:129;;;:::o;46521:75::-;46554:6;46587:2;46581:9;46571:19;;46521:75;:::o;46602:311::-;46679:4;46769:18;46761:6;46758:30;46755:56;;;46791:18;;:::i;:::-;46755:56;46841:4;46833:6;46829:17;46821:25;;46901:4;46895;46891:15;46883:23;;46602:311;;;:::o;46919:321::-;47006:4;47096:18;47088:6;47085:30;47082:56;;;47118:18;;:::i;:::-;47082:56;47168:4;47160:6;47156:17;47148:25;;47228:4;47222;47218:15;47210:23;;46919:321;;;:::o;47246:311::-;47323:4;47413:18;47405:6;47402:30;47399:56;;;47435:18;;:::i;:::-;47399:56;47485:4;47477:6;47473:17;47465:25;;47545:4;47539;47535:15;47527:23;;47246:311;;;:::o;47563:307::-;47624:4;47714:18;47706:6;47703:30;47700:56;;;47736:18;;:::i;:::-;47700:56;47774:29;47796:6;47774:29;:::i;:::-;47766:37;;47858:4;47852;47848:15;47840:23;;47563:307;;;:::o;47876:308::-;47938:4;48028:18;48020:6;48017:30;48014:56;;;48050:18;;:::i;:::-;48014:56;48088:29;48110:6;48088:29;:::i;:::-;48080:37;;48172:4;48166;48162:15;48154:23;;47876:308;;;:::o;48190:132::-;48257:4;48280:3;48272:11;;48310:4;48305:3;48301:14;48293:22;;48190:132;;;:::o;48328:::-;48395:4;48418:3;48410:11;;48448:4;48443:3;48439:14;48431:22;;48328:132;;;:::o;48466:114::-;48533:6;48567:5;48561:12;48551:22;;48466:114;;;:::o;48586:::-;48653:6;48687:5;48681:12;48671:22;;48586:114;;;:::o;48706:98::-;48757:6;48791:5;48785:12;48775:22;;48706:98;;;:::o;48810:99::-;48862:6;48896:5;48890:12;48880:22;;48810:99;;;:::o;48915:113::-;48985:4;49017;49012:3;49008:14;49000:22;;48915:113;;;:::o;49034:::-;49104:4;49136;49131:3;49127:14;49119:22;;49034:113;;;:::o;49153:184::-;49252:11;49286:6;49281:3;49274:19;49326:4;49321:3;49317:14;49302:29;;49153:184;;;;:::o;49343:::-;49442:11;49476:6;49471:3;49464:19;49516:4;49511:3;49507:14;49492:29;;49343:184;;;;:::o;49533:168::-;49616:11;49650:6;49645:3;49638:19;49690:4;49685:3;49681:14;49666:29;;49533:168;;;;:::o;49707:169::-;49791:11;49825:6;49820:3;49813:19;49865:4;49860:3;49856:14;49841:29;;49707:169;;;;:::o;49882:305::-;49922:3;49941:20;49959:1;49941:20;:::i;:::-;49936:25;;49975:20;49993:1;49975:20;:::i;:::-;49970:25;;50129:1;50061:66;50057:74;50054:1;50051:81;50048:107;;;50135:18;;:::i;:::-;50048:107;50179:1;50176;50172:9;50165:16;;49882:305;;;;:::o;50193:185::-;50233:1;50250:20;50268:1;50250:20;:::i;:::-;50245:25;;50284:20;50302:1;50284:20;:::i;:::-;50279:25;;50323:1;50313:35;;50328:18;;:::i;:::-;50313:35;50370:1;50367;50363:9;50358:14;;50193:185;;;;:::o;50384:348::-;50424:7;50447:20;50465:1;50447:20;:::i;:::-;50442:25;;50481:20;50499:1;50481:20;:::i;:::-;50476:25;;50669:1;50601:66;50597:74;50594:1;50591:81;50586:1;50579:9;50572:17;50568:105;50565:131;;;50676:18;;:::i;:::-;50565:131;50724:1;50721;50717:9;50706:20;;50384:348;;;;:::o;50738:191::-;50778:4;50798:20;50816:1;50798:20;:::i;:::-;50793:25;;50832:20;50850:1;50832:20;:::i;:::-;50827:25;;50871:1;50868;50865:8;50862:34;;;50876:18;;:::i;:::-;50862:34;50921:1;50918;50914:9;50906:17;;50738:191;;;;:::o;50935:96::-;50972:7;51001:24;51019:5;51001:24;:::i;:::-;50990:35;;50935:96;;;:::o;51037:104::-;51082:7;51111:24;51129:5;51111:24;:::i;:::-;51100:35;;51037:104;;;:::o;51147:90::-;51181:7;51224:5;51217:13;51210:21;51199:32;;51147:90;;;:::o;51243:149::-;51279:7;51319:66;51312:5;51308:78;51297:89;;51243:149;;;:::o;51398:126::-;51435:7;51475:42;51468:5;51464:54;51453:65;;51398:126;;;:::o;51530:77::-;51567:7;51596:5;51585:16;;51530:77;;;:::o;51613:347::-;51751:9;51850:103;51938:14;51930:6;51923:5;51850:103;:::i;:::-;51828:125;;51613:347;;;;:::o;51966:154::-;52050:6;52045:3;52040;52027:30;52112:1;52103:6;52098:3;52094:16;52087:27;51966:154;;;:::o;52126:307::-;52194:1;52204:113;52218:6;52215:1;52212:13;52204:113;;;52303:1;52298:3;52294:11;52288:18;52284:1;52279:3;52275:11;52268:39;52240:2;52237:1;52233:10;52228:15;;52204:113;;;52335:6;52332:1;52329:13;52326:101;;;52415:1;52406:6;52401:3;52397:16;52390:27;52326:101;52175:258;52126:307;;;:::o;52439:171::-;52478:3;52501:24;52519:5;52501:24;:::i;:::-;52492:33;;52547:4;52540:5;52537:15;52534:41;;;52555:18;;:::i;:::-;52534:41;52602:1;52595:5;52591:13;52584:20;;52439:171;;;:::o;52616:320::-;52660:6;52697:1;52691:4;52687:12;52677:22;;52744:1;52738:4;52734:12;52765:18;52755:81;;52821:4;52813:6;52809:17;52799:27;;52755:81;52883:2;52875:6;52872:14;52852:18;52849:38;52846:84;;;52902:18;;:::i;:::-;52846:84;52667:269;52616:320;;;:::o;52942:281::-;53025:27;53047:4;53025:27;:::i;:::-;53017:6;53013:40;53155:6;53143:10;53140:22;53119:18;53107:10;53104:34;53101:62;53098:88;;;53166:18;;:::i;:::-;53098:88;53206:10;53202:2;53195:22;52985:238;52942:281;;:::o;53229:233::-;53268:3;53291:24;53309:5;53291:24;:::i;:::-;53282:33;;53337:66;53330:5;53327:77;53324:103;;;53407:18;;:::i;:::-;53324:103;53454:1;53447:5;53443:13;53436:20;;53229:233;;;:::o;53468:176::-;53500:1;53517:20;53535:1;53517:20;:::i;:::-;53512:25;;53551:20;53569:1;53551:20;:::i;:::-;53546:25;;53590:1;53580:35;;53595:18;;:::i;:::-;53580:35;53636:1;53633;53629:9;53624:14;;53468:176;;;;:::o;53650:180::-;53698:77;53695:1;53688:88;53795:4;53792:1;53785:15;53819:4;53816:1;53809:15;53836:180;53884:77;53881:1;53874:88;53981:4;53978:1;53971:15;54005:4;54002:1;53995:15;54022:180;54070:77;54067:1;54060:88;54167:4;54164:1;54157:15;54191:4;54188:1;54181:15;54208:180;54256:77;54253:1;54246:88;54353:4;54350:1;54343:15;54377:4;54374:1;54367:15;54394:180;54442:77;54439:1;54432:88;54539:4;54536:1;54529:15;54563:4;54560:1;54553:15;54580:180;54628:77;54625:1;54618:88;54725:4;54722:1;54715:15;54749:4;54746:1;54739:15;54766:183;54801:3;54839:1;54821:16;54818:23;54815:128;;;54877:1;54874;54871;54856:23;54899:34;54930:1;54924:8;54899:34;:::i;:::-;54892:41;;54815:128;54766:183;:::o;54955:117::-;55064:1;55061;55054:12;55078:117;55187:1;55184;55177:12;55201:117;55310:1;55307;55300:12;55324:117;55433:1;55430;55423:12;55447:117;55556:1;55553;55546:12;55570:117;55679:1;55676;55669:12;55693:102;55734:6;55785:2;55781:7;55776:2;55769:5;55765:14;55761:28;55751:38;;55693:102;;;:::o;55801:106::-;55845:8;55894:5;55889:3;55885:15;55864:36;;55801:106;;;:::o;55913:239::-;56053:34;56049:1;56041:6;56037:14;56030:58;56122:22;56117:2;56109:6;56105:15;56098:47;55913:239;:::o;56158:227::-;56298:34;56294:1;56286:6;56282:14;56275:58;56367:10;56362:2;56354:6;56350:15;56343:35;56158:227;:::o;56391:230::-;56531:34;56527:1;56519:6;56515:14;56508:58;56600:13;56595:2;56587:6;56583:15;56576:38;56391:230;:::o;56627:225::-;56767:34;56763:1;56755:6;56751:14;56744:58;56836:8;56831:2;56823:6;56819:15;56812:33;56627:225;:::o;56858:::-;56998:34;56994:1;56986:6;56982:14;56975:58;57067:8;57062:2;57054:6;57050:15;57043:33;56858:225;:::o;57089:228::-;57229:34;57225:1;57217:6;57213:14;57206:58;57298:11;57293:2;57285:6;57281:15;57274:36;57089:228;:::o;57323:175::-;57463:27;57459:1;57451:6;57447:14;57440:51;57323:175;:::o;57504:::-;57644:27;57640:1;57632:6;57628:14;57621:51;57504:175;:::o;57685:174::-;57825:26;57821:1;57813:6;57809:14;57802:50;57685:174;:::o;57865:225::-;58005:34;58001:1;57993:6;57989:14;57982:58;58074:8;58069:2;58061:6;58057:15;58050:33;57865:225;:::o;58096:175::-;58236:27;58232:1;58224:6;58220:14;58213:51;58096:175;:::o;58277:224::-;58417:34;58413:1;58405:6;58401:14;58394:58;58486:7;58481:2;58473:6;58469:15;58462:32;58277:224;:::o;58507:237::-;58647:34;58643:1;58635:6;58631:14;58624:58;58716:20;58711:2;58703:6;58699:15;58692:45;58507:237;:::o;58750:176::-;58890:28;58886:1;58878:6;58874:14;58867:52;58750:176;:::o;58932:165::-;59072:17;59068:1;59060:6;59056:14;59049:41;58932:165;:::o;59103:224::-;59243:34;59239:1;59231:6;59227:14;59220:58;59312:7;59307:2;59299:6;59295:15;59288:32;59103:224;:::o;59333:229::-;59473:34;59469:1;59461:6;59457:14;59450:58;59542:12;59537:2;59529:6;59525:15;59518:37;59333:229;:::o;59568:182::-;59708:34;59704:1;59696:6;59692:14;59685:58;59568:182;:::o;59756:158::-;59896:10;59892:1;59884:6;59880:14;59873:34;59756:158;:::o;59920:223::-;60060:34;60056:1;60048:6;60044:14;60037:58;60129:6;60124:2;60116:6;60112:15;60105:31;59920:223;:::o;60149:172::-;60289:24;60285:1;60277:6;60273:14;60266:48;60149:172;:::o;60327:179::-;60467:31;60463:1;60455:6;60451:14;60444:55;60327:179;:::o;60512:228::-;60652:34;60648:1;60640:6;60636:14;60629:58;60721:11;60716:2;60708:6;60704:15;60697:36;60512:228;:::o;60746:::-;60886:34;60882:1;60874:6;60870:14;60863:58;60955:11;60950:2;60942:6;60938:15;60931:36;60746:228;:::o;60980:227::-;61120:34;61116:1;61108:6;61104:14;61097:58;61189:10;61184:2;61176:6;61172:15;61165:35;60980:227;:::o;61213:220::-;61353:34;61349:1;61341:6;61337:14;61330:58;61422:3;61417:2;61409:6;61405:15;61398:28;61213:220;:::o;61439:711::-;61478:3;61516:4;61498:16;61495:26;61492:39;;;61524:5;;61492:39;61553:20;;:::i;:::-;61628:1;61610:16;61606:24;61603:1;61597:4;61582:49;61661:4;61655:11;61760:16;61753:4;61745:6;61741:17;61738:39;61705:18;61697:6;61694:30;61678:113;61675:146;;;61806:5;;;;61675:146;61852:6;61846:4;61842:17;61888:3;61882:10;61915:18;61907:6;61904:30;61901:43;;;61937:5;;;;;;61901:43;61985:6;61978:4;61973:3;61969:14;61965:27;62044:1;62026:16;62022:24;62016:4;62012:35;62007:3;62004:44;62001:57;;;62051:5;;;;;;;62001:57;62068;62116:6;62110:4;62106:17;62098:6;62094:30;62088:4;62068:57;:::i;:::-;62141:3;62134:10;;61482:668;;;;;61439:711;;:::o;62156:122::-;62229:24;62247:5;62229:24;:::i;:::-;62222:5;62219:35;62209:63;;62268:1;62265;62258:12;62209:63;62156:122;:::o;62284:138::-;62365:32;62391:5;62365:32;:::i;:::-;62358:5;62355:43;62345:71;;62412:1;62409;62402:12;62345:71;62284:138;:::o;62428:116::-;62498:21;62513:5;62498:21;:::i;:::-;62491:5;62488:32;62478:60;;62534:1;62531;62524:12;62478:60;62428:116;:::o;62550:120::-;62622:23;62639:5;62622:23;:::i;:::-;62615:5;62612:34;62602:62;;62660:1;62657;62650:12;62602:62;62550:120;:::o;62676:122::-;62749:24;62767:5;62749:24;:::i;:::-;62742:5;62739:35;62729:63;;62788:1;62785;62778:12;62729:63;62676:122;:::o

Swarm Source

ipfs://f3042d110786d34ff5a84976fb36843260edf7c9d5d1dfd4ecd39471bc3a3c93
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.