ETH Price: $3,104.17 (+1.23%)
Gas: 3 Gwei

Token

Lockable (LC)
 

Overview

Max Total Supply

10,000,000 LC

Holders

62 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.00025 LC

Value
$0.00
0xf408Bee3443D0397e2c1cdE588Fb060AC657006F
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Ownable and tradable smart contracts for pure blockchain social applications

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Lockable

Compiler Version
v0.8.12+commit.f00d7308

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity Multiple files format)

File 9 of 9: Lockable.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.12;

import "./ERC777.sol";

//----------------------------------------------------------------------------------

contract LockedCoin is ERC777 {

    Lockable public coin; //MASTER COIN
    string public uri="https://www.epigeon.org/lockable";
    
    mapping(address => mapping(bytes32 => uint256)) private _lockedAmmountByHash;
    mapping(address => mapping(bytes32 => uint256)) private _lockedAmmountByHashOfSender;
    mapping(address => mapping(bytes32 => address)) private _holderToLockerByHash;

    constructor () ERC777("LockedCoin", "LdC", new address[](0)) {
        coin = Lockable(msg.sender);
    }
    
    function balanceByHash(address to, bytes32 hash) public view returns (uint256 amount){
        return _lockedAmmountByHash[to][hash];
    }
    
    function burnByHash(address to, bytes32 hash) public returns (uint256 amount){
        require(msg.sender == address(coin), "Only available for master coin");
        require(_lockedAmmountByHash[to][hash] > 0, "No amount locked with given hash");
        uint256 lockedValue = _lockedAmmountByHash[to][hash];
        _burn(to, lockedValue, "", "");
        _lockedAmmountByHash[to][hash] = 0;
        _lockedAmmountByHashOfSender[_holderToLockerByHash[to][hash]][hash] = 0;
        _holderToLockerByHash[to][hash] = address(0);
        
        return lockedValue;
    }
    
    function burnByHash(address from, address to, bytes32 hash) public returns (uint256 amount){
        require(msg.sender == address(coin), "Only available for master coin");
        require(_lockedAmmountByHash[to][hash] > 0, "No amount locked with given hash");
        require(_holderToLockerByHash[to][hash] == from, "Not locked by this address");
        uint256 lockedValue = _lockedAmmountByHash[to][hash];
        _burn(to, lockedValue, "", "");
        _lockedAmmountByHash[to][hash] = 0;
        _lockedAmmountByHashOfSender[from][hash] = 0;
        _holderToLockerByHash[to][hash] = address(0); 
        
        return lockedValue;
    }
    
    function getOwner() public view returns (address owner) {
        return coin.getOwner();
    }
    
    function lockerOf(address to, bytes32 hash) public view returns (address from){
        return _holderToLockerByHash[to][hash];
    }
    
    function lockedAmount(address from, bytes32 hash) public view returns (uint256 amount){
        return _lockedAmmountByHashOfSender[from][hash];
    }
    
    function mintByHash(address to, uint256 amount, bytes32 hash, address from) public {
        require(msg.sender == address(coin), "Only available for master coin");
        require(_lockedAmmountByHash[to][hash] == 0, "Amount locked with the same hash");
        _mint(to, amount, "", "");
        _lockedAmmountByHash[to][hash] = amount;
        _lockedAmmountByHashOfSender[from][hash] = amount;
        _holderToLockerByHash[to][hash] = from;
    }
    
    function reclaim(address to, string memory unlockerPhrase) public {
        bytes32 hash = keccak256(bytes(unlockerPhrase));
        require(_holderToLockerByHash[to][hash] == msg.sender, "Not locked by this address");
        burnByHash(msg.sender, to, hash);
        coin.reclaimByLockedCoinContract(msg.sender, to, hash);
    }
    
    function setUri(string memory url) public {
        require(msg.sender == coin.getOwner());
        uri = url;
    }
    
    function unlock(string memory unlockerPhrase) public {
        bytes32 hash = keccak256(bytes(unlockerPhrase));
        coin.unlockByLockedCoinContract(msg.sender, hash);
    }
    
    //TRANSFERS ONLY ALLOWED FROM MASTER COIN
    function _beforeTokenTransfer(address operator, address from, address to, uint256 amount) internal override {
        require(msg.sender == address(coin), "Unlock to transferable coin");
        super._beforeTokenTransfer(operator, from, to, amount);
    }
}

//----------------------------------------------------------------------------------

contract Lockable is ERC777 {

    LockedCoin public lockedCoin;
    address private _owner;
    
    uint256 public lockedSupply;
    mapping(address => uint256) private _lockedBalances;

    constructor () ERC777("Lockable", "LC", new address[](0)) {
        _owner = msg.sender;
        _mint(msg.sender, 10000000 * 10 ** 18, "", "");
        lockedCoin = new LockedCoin();
    }
    
    function getOwner() public view returns (address owner) {
        return _owner;
    }
    
    function lock(address to, uint256 amount, bytes32 hash) public {
        uint256 fromBalance = balanceOf(msg.sender);
        require(fromBalance >= amount, "ERC777: amount exceeds balance");
        lockedCoin.mintByHash(to, amount, hash, msg.sender);
        _send(msg.sender, address(this), amount, "", "", false);
        lockedSupply += amount;
        _lockedBalances[to] += amount;
        require(lockedSupply >= amount, "Math is not ok");
        require(_lockedBalances[to] == lockedCoin.balanceOf(to), "Balances did not sync");
    }
    
    function lockedAmount(address from, bytes32 hash) public view returns (uint256 amount){
        return lockedCoin.lockedAmount(from, hash);
    }
    
    function lockedBalanceOf(address account) public view returns (uint256){
        return _lockedBalances[account];
    }
    
    function operatorLock(address from, address to, uint256 amount, bytes32 hash, bytes memory data, bytes memory operatorData) external {
        require(isOperatorFor(_msgSender(), from), "ERC777: caller is not an operator for holder");
        uint256 fromBalance = balanceOf(from);
        require(fromBalance >= amount, "ERC777: amount exceeds balance");
        lockedCoin.mintByHash(to, amount, hash, from);
        _send(from, address(this), amount, data, operatorData, true);
        lockedSupply += amount;
        _lockedBalances[to] += amount;
        require(lockedSupply >= amount, "Math is not ok");
        require(_lockedBalances[to] == lockedCoin.balanceOf(to), "Balances did not sync");
    }
    
    function operatorReclaim(address from, address to, string memory unlockerPhrase, bytes memory data, bytes memory operatorData) external {
        bytes32 hash = keccak256(bytes(unlockerPhrase));
        require(isOperatorFor(_msgSender(), from), "ERC777: caller is not an operator for holder");
        require(msg.sender != from);
        uint256 amount = lockedCoin.burnByHash(from, to, hash);
        require(lockedSupply >= amount, "Balances are not in sync");
        require(_lockedBalances[to] >= amount, "Balances are not in sync");
        _send(address(this), from, amount, data, operatorData, true);
        lockedSupply -= amount;
        _lockedBalances[to] -= amount;
        require(_lockedBalances[to] == lockedCoin.balanceOf(to), "Balances did not sync");
    }
    
    function operatorUnlock(address to, string memory unlockerPhrase, bytes memory data, bytes memory operatorData) external {
        bytes32 hash = keccak256(bytes(unlockerPhrase));
        require(isOperatorFor(_msgSender(), lockedCoin.lockerOf(to, hash)), "ERC777: caller is not an operator for holder");
        uint256 amount = lockedCoin.burnByHash(to, hash);
        require(lockedSupply >= amount, "Balances are not in sync");
        require(_lockedBalances[to] >= amount, "Balances are not in sync");
        _send(address(this), to, amount, data, operatorData, true);
        lockedSupply -= amount; 
        _lockedBalances[to] -= amount;
        require(_lockedBalances[to] == lockedCoin.balanceOf(to), "Balances did not sync");
    }
    
    function reclaim(address to, string memory unlockerPhrase) public {
        bytes32 hash = keccak256(bytes(unlockerPhrase));
        uint256 amount = lockedCoin.burnByHash(msg.sender, to, hash);
        require(lockedSupply >= amount, "Balances are not in sync");
        require(_lockedBalances[to] >= amount, "Balances are not in sync");
        _send(address(this), msg.sender, amount, "", "", false);
        lockedSupply -= amount;
        _lockedBalances[to] -= amount;
        require(_lockedBalances[to] == lockedCoin.balanceOf(to), "Balances did not sync");        
    }
    
    function reclaimByLockedCoinContract(address from, address to, bytes32 hash) public {
        require(msg.sender == address(lockedCoin), "Only avaliable for the locked coin contract");
        uint256 amount = lockedCoin.burnByHash(from, to, hash);
        require(lockedSupply >= amount, "Balances are not in sync");
        require(_lockedBalances[to] >= amount, "Balances are not in sync");
        _send(address(this), from, amount, "", "", false);
        lockedSupply -= amount;
        _lockedBalances[to] -= amount;
        require(_lockedBalances[to] == lockedCoin.balanceOf(to), "Balances did not sync");    
    }
    
    function unlock(string memory unlockerPhrase) public {
        bytes32 hash = keccak256(bytes(unlockerPhrase));
        uint256 amount = lockedCoin.burnByHash(msg.sender, hash);
        require(lockedSupply >= amount, "Balances are not in sync");
        require(_lockedBalances[msg.sender] >= amount, "Balances are not in sync");
        _send(address(this), msg.sender, amount, "", "", false);
        lockedSupply -= amount; 
        _lockedBalances[msg.sender] -= amount;
        require(_lockedBalances[msg.sender] == lockedCoin.balanceOf(msg.sender), "Balances did not sync");
    }
    
    function unlockByLockedCoinContract(address to, bytes32 hash) public {
        require(msg.sender == address(lockedCoin), "Only avaliable for the locked coin contract");
        uint256 amount = lockedCoin.burnByHash(to, hash);
        require(lockedSupply >= amount, "Balances are not in sync");
        require(_lockedBalances[to] >= amount, "Balances are not in sync");
        _send(address(this), to, amount, "", "", false);
        lockedSupply -= amount; 
        _lockedBalances[to] -= amount;
        require(_lockedBalances[to] == lockedCoin.balanceOf(to), "Balances did not sync");
    }
}

File 1 of 9: Address.sol
// SPDX-License-Identifier: MIT
// 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 2 of 9: Context.sol
// SPDX-License-Identifier: MIT
// 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 3 of 9: ERC777.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC777/ERC777.sol)

pragma solidity ^0.8.0;

import "./IERC777.sol";
import "./IERC777Recipient.sol";
import "./IERC777Sender.sol";
import "./IERC20.sol";
import "./Address.sol";
import "./Context.sol";
import "./IERC1820Registry.sol";

/**
 * @dev Implementation of the {IERC777} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 *
 * Support for ERC20 is included in this contract, as specified by the EIP: both
 * the ERC777 and ERC20 interfaces can be safely used when interacting with it.
 * Both {IERC777-Sent} and {IERC20-Transfer} events are emitted on token
 * movements.
 *
 * Additionally, the {IERC777-granularity} value is hard-coded to `1`, meaning that there
 * are no special restrictions in the amount of tokens that created, moved, or
 * destroyed. This makes integration with ERC20 applications seamless.
 */
contract ERC777 is Context, IERC777, IERC20 {
    using Address for address;

    IERC1820Registry internal constant _ERC1820_REGISTRY = IERC1820Registry(0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24);

    mapping(address => uint256) private _balances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    bytes32 private constant _TOKENS_SENDER_INTERFACE_HASH = keccak256("ERC777TokensSender");
    bytes32 private constant _TOKENS_RECIPIENT_INTERFACE_HASH = keccak256("ERC777TokensRecipient");

    // This isn't ever read from - it's only used to respond to the defaultOperators query.
    address[] private _defaultOperatorsArray;

    // Immutable, but accounts may revoke them (tracked in __revokedDefaultOperators).
    mapping(address => bool) private _defaultOperators;

    // For each account, a mapping of its operators and revoked default operators.
    mapping(address => mapping(address => bool)) private _operators;
    mapping(address => mapping(address => bool)) private _revokedDefaultOperators;

    // ERC20-allowances
    mapping(address => mapping(address => uint256)) private _allowances;

    /**
     * @dev `defaultOperators` may be an empty array.
     */
    constructor(
        string memory name_,
        string memory symbol_,
        address[] memory defaultOperators_
    ) {
        _name = name_;
        _symbol = symbol_;

        _defaultOperatorsArray = defaultOperators_;
        for (uint256 i = 0; i < defaultOperators_.length; i++) {
            _defaultOperators[defaultOperators_[i]] = true;
        }

        // register interfaces
        _ERC1820_REGISTRY.setInterfaceImplementer(address(this), keccak256("ERC777Token"), address(this));
        _ERC1820_REGISTRY.setInterfaceImplementer(address(this), keccak256("ERC20Token"), address(this));
    }

    /**
     * @dev See {IERC777-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC777-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {ERC20-decimals}.
     *
     * Always returns 18, as per the
     * [ERC777 EIP](https://eips.ethereum.org/EIPS/eip-777#backward-compatibility).
     */
    function decimals() public pure virtual returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC777-granularity}.
     *
     * This implementation always returns `1`.
     */
    function granularity() public view virtual override returns (uint256) {
        return 1;
    }

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

    /**
     * @dev Returns the amount of tokens owned by an account (`tokenHolder`).
     */
    function balanceOf(address tokenHolder) public view virtual override(IERC20, IERC777) returns (uint256) {
        return _balances[tokenHolder];
    }

    /**
     * @dev See {IERC777-send}.
     *
     * Also emits a {IERC20-Transfer} event for ERC20 compatibility.
     */
    function send(
        address recipient,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        _send(_msgSender(), recipient, amount, data, "", true);
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Unlike `send`, `recipient` is _not_ required to implement the {IERC777Recipient}
     * interface if it is a contract.
     *
     * Also emits a {Sent} event.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        require(recipient != address(0), "ERC777: transfer to the zero address");

        address from = _msgSender();

        _callTokensToSend(from, from, recipient, amount, "", "");

        _move(from, from, recipient, amount, "", "");

        _callTokensReceived(from, from, recipient, amount, "", "", false);

        return true;
    }

    /**
     * @dev See {IERC777-burn}.
     *
     * Also emits a {IERC20-Transfer} event for ERC20 compatibility.
     */
    function burn(uint256 amount, bytes memory data) public virtual override {
        _burn(_msgSender(), amount, data, "");
    }

    /**
     * @dev See {IERC777-isOperatorFor}.
     */
    function isOperatorFor(address operator, address tokenHolder) public view virtual override returns (bool) {
        return
            operator == tokenHolder ||
            (_defaultOperators[operator] && !_revokedDefaultOperators[tokenHolder][operator]) ||
            _operators[tokenHolder][operator];
    }

    /**
     * @dev See {IERC777-authorizeOperator}.
     */
    function authorizeOperator(address operator) public virtual override {
        require(_msgSender() != operator, "ERC777: authorizing self as operator");

        if (_defaultOperators[operator]) {
            delete _revokedDefaultOperators[_msgSender()][operator];
        } else {
            _operators[_msgSender()][operator] = true;
        }

        emit AuthorizedOperator(operator, _msgSender());
    }

    /**
     * @dev See {IERC777-revokeOperator}.
     */
    function revokeOperator(address operator) public virtual override {
        require(operator != _msgSender(), "ERC777: revoking self as operator");

        if (_defaultOperators[operator]) {
            _revokedDefaultOperators[_msgSender()][operator] = true;
        } else {
            delete _operators[_msgSender()][operator];
        }

        emit RevokedOperator(operator, _msgSender());
    }

    /**
     * @dev See {IERC777-defaultOperators}.
     */
    function defaultOperators() public view virtual override returns (address[] memory) {
        return _defaultOperatorsArray;
    }

    /**
     * @dev See {IERC777-operatorSend}.
     *
     * Emits {Sent} and {IERC20-Transfer} events.
     */
    function operatorSend(
        address sender,
        address recipient,
        uint256 amount,
        bytes memory data,
        bytes memory operatorData
    ) public virtual override {
        require(isOperatorFor(_msgSender(), sender), "ERC777: caller is not an operator for holder");
        _send(sender, recipient, amount, data, operatorData, true);
    }

    /**
     * @dev See {IERC777-operatorBurn}.
     *
     * Emits {Burned} and {IERC20-Transfer} events.
     */
    function operatorBurn(
        address account,
        uint256 amount,
        bytes memory data,
        bytes memory operatorData
    ) public virtual override {
        require(isOperatorFor(_msgSender(), account), "ERC777: caller is not an operator for holder");
        _burn(account, amount, data, operatorData);
    }

    /**
     * @dev See {IERC20-allowance}.
     *
     * Note that operator and allowance concepts are orthogonal: operators may
     * not have allowance, and accounts with allowance may not be operators
     * themselves.
     */
    function allowance(address holder, address spender) public view virtual override returns (uint256) {
        return _allowances[holder][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Note that accounts cannot have allowance issued by their operators.
     */
    function approve(address spender, uint256 value) public virtual override returns (bool) {
        address holder = _msgSender();
        _approve(holder, spender, value);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Note that operator and allowance concepts are orthogonal: operators cannot
     * call `transferFrom` (unless they have allowance), and accounts with
     * allowance cannot call `operatorSend` (unless they are operators).
     *
     * Emits {Sent}, {IERC20-Transfer} and {IERC20-Approval} events.
     */
    function transferFrom(
        address holder,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        require(recipient != address(0), "ERC777: transfer to the zero address");
        require(holder != address(0), "ERC777: transfer from the zero address");

        address spender = _msgSender();

        _callTokensToSend(spender, holder, recipient, amount, "", "");

        _move(spender, holder, recipient, amount, "", "");

        uint256 currentAllowance = _allowances[holder][spender];
        require(currentAllowance >= amount, "ERC777: transfer amount exceeds allowance");
        _approve(holder, spender, currentAllowance - amount);

        _callTokensReceived(spender, holder, recipient, amount, "", "", false);

        return true;
    }

    /**
     * @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * If a send hook is registered for `account`, the corresponding function
     * will be called with `operator`, `data` and `operatorData`.
     *
     * See {IERC777Sender} and {IERC777Recipient}.
     *
     * Emits {Minted} and {IERC20-Transfer} events.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - if `account` is a contract, it must implement the {IERC777Recipient}
     * interface.
     */
    function _mint(
        address account,
        uint256 amount,
        bytes memory userData,
        bytes memory operatorData
    ) internal virtual {
        _mint(account, amount, userData, operatorData, true);
    }

    /**
     * @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * If `requireReceptionAck` is set to true, and if a send hook is
     * registered for `account`, the corresponding function will be called with
     * `operator`, `data` and `operatorData`.
     *
     * See {IERC777Sender} and {IERC777Recipient}.
     *
     * Emits {Minted} and {IERC20-Transfer} events.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - if `account` is a contract, it must implement the {IERC777Recipient}
     * interface.
     */
    function _mint(
        address account,
        uint256 amount,
        bytes memory userData,
        bytes memory operatorData,
        bool requireReceptionAck
    ) internal virtual {
        require(account != address(0), "ERC777: mint to the zero address");

        address operator = _msgSender();

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

        // Update state variables
        _totalSupply += amount;
        _balances[account] += amount;

        _callTokensReceived(operator, address(0), account, amount, userData, operatorData, requireReceptionAck);

        emit Minted(operator, account, amount, userData, operatorData);
        emit Transfer(address(0), account, amount);
    }

    /**
     * @dev Send tokens
     * @param from address token holder address
     * @param to address recipient address
     * @param amount uint256 amount of tokens to transfer
     * @param userData bytes extra information provided by the token holder (if any)
     * @param operatorData bytes extra information provided by the operator (if any)
     * @param requireReceptionAck if true, contract recipients are required to implement ERC777TokensRecipient
     */
    function _send(
        address from,
        address to,
        uint256 amount,
        bytes memory userData,
        bytes memory operatorData,
        bool requireReceptionAck
    ) internal virtual {
        require(from != address(0), "ERC777: send from the zero address");
        require(to != address(0), "ERC777: send to the zero address");

        address operator = _msgSender();

        _callTokensToSend(operator, from, to, amount, userData, operatorData);

        _move(operator, from, to, amount, userData, operatorData);

        _callTokensReceived(operator, from, to, amount, userData, operatorData, requireReceptionAck);
    }

    /**
     * @dev Burn tokens
     * @param from address token holder address
     * @param amount uint256 amount of tokens to burn
     * @param data bytes extra information provided by the token holder
     * @param operatorData bytes extra information provided by the operator (if any)
     */
    function _burn(
        address from,
        uint256 amount,
        bytes memory data,
        bytes memory operatorData
    ) internal virtual {
        require(from != address(0), "ERC777: burn from the zero address");

        address operator = _msgSender();

        _callTokensToSend(operator, from, address(0), amount, data, operatorData);

        _beforeTokenTransfer(operator, from, address(0), amount);

        // Update state variables
        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC777: burn amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _totalSupply -= amount;

        emit Burned(operator, from, amount, data, operatorData);
        emit Transfer(from, address(0), amount);
    }

    function _move(
        address operator,
        address from,
        address to,
        uint256 amount,
        bytes memory userData,
        bytes memory operatorData
    ) private {
        _beforeTokenTransfer(operator, from, to, amount);

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

        emit Sent(operator, from, to, amount, userData, operatorData);
        emit Transfer(from, to, amount);
    }

    /**
     * @dev See {ERC20-_approve}.
     *
     * Note that accounts cannot have allowance issued by their operators.
     */
    function _approve(
        address holder,
        address spender,
        uint256 value
    ) internal {
        require(holder != address(0), "ERC777: approve from the zero address");
        require(spender != address(0), "ERC777: approve to the zero address");

        _allowances[holder][spender] = value;
        emit Approval(holder, spender, value);
    }

    /**
     * @dev Call from.tokensToSend() if the interface is registered
     * @param operator address operator requesting the transfer
     * @param from address token holder address
     * @param to address recipient address
     * @param amount uint256 amount of tokens to transfer
     * @param userData bytes extra information provided by the token holder (if any)
     * @param operatorData bytes extra information provided by the operator (if any)
     */
    function _callTokensToSend(
        address operator,
        address from,
        address to,
        uint256 amount,
        bytes memory userData,
        bytes memory operatorData
    ) private {
        address implementer = _ERC1820_REGISTRY.getInterfaceImplementer(from, _TOKENS_SENDER_INTERFACE_HASH);
        if (implementer != address(0)) {
            IERC777Sender(implementer).tokensToSend(operator, from, to, amount, userData, operatorData);
        }
    }

    /**
     * @dev Call to.tokensReceived() if the interface is registered. Reverts if the recipient is a contract but
     * tokensReceived() was not registered for the recipient
     * @param operator address operator requesting the transfer
     * @param from address token holder address
     * @param to address recipient address
     * @param amount uint256 amount of tokens to transfer
     * @param userData bytes extra information provided by the token holder (if any)
     * @param operatorData bytes extra information provided by the operator (if any)
     * @param requireReceptionAck if true, contract recipients are required to implement ERC777TokensRecipient
     */
    function _callTokensReceived(
        address operator,
        address from,
        address to,
        uint256 amount,
        bytes memory userData,
        bytes memory operatorData,
        bool requireReceptionAck
    ) private {
        address implementer = _ERC1820_REGISTRY.getInterfaceImplementer(to, _TOKENS_RECIPIENT_INTERFACE_HASH);
        if (implementer != address(0)) {
            IERC777Recipient(implementer).tokensReceived(operator, from, to, amount, userData, operatorData);
        } else if (requireReceptionAck) {
            require((!to.isContract() || to==address(this)), "ERC777: token recipient contract has no implementer for ERC777TokensRecipient");
        }
    }

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

File 4 of 9: IERC1820Registry.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC1820Registry.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the global ERC1820 Registry, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1820[EIP]. Accounts may register
 * implementers for interfaces in this registry, as well as query support.
 *
 * Implementers may be shared by multiple accounts, and can also implement more
 * than a single interface for each account. Contracts can implement interfaces
 * for themselves, but externally-owned accounts (EOA) must delegate this to a
 * contract.
 *
 * {IERC165} interfaces can also be queried via the registry.
 *
 * For an in-depth explanation and source code analysis, see the EIP text.
 */
interface IERC1820Registry {
    /**
     * @dev Sets `newManager` as the manager for `account`. A manager of an
     * account is able to set interface implementers for it.
     *
     * By default, each account is its own manager. Passing a value of `0x0` in
     * `newManager` will reset the manager to this initial state.
     *
     * Emits a {ManagerChanged} event.
     *
     * Requirements:
     *
     * - the caller must be the current manager for `account`.
     */
    function setManager(address account, address newManager) external;

    /**
     * @dev Returns the manager for `account`.
     *
     * See {setManager}.
     */
    function getManager(address account) external view returns (address);

    /**
     * @dev Sets the `implementer` contract as ``account``'s implementer for
     * `interfaceHash`.
     *
     * `account` being the zero address is an alias for the caller's address.
     * The zero address can also be used in `implementer` to remove an old one.
     *
     * See {interfaceHash} to learn how these are created.
     *
     * Emits an {InterfaceImplementerSet} event.
     *
     * Requirements:
     *
     * - the caller must be the current manager for `account`.
     * - `interfaceHash` must not be an {IERC165} interface id (i.e. it must not
     * end in 28 zeroes).
     * - `implementer` must implement {IERC1820Implementer} and return true when
     * queried for support, unless `implementer` is the caller. See
     * {IERC1820Implementer-canImplementInterfaceForAddress}.
     */
    function setInterfaceImplementer(
        address account,
        bytes32 _interfaceHash,
        address implementer
    ) external;

    /**
     * @dev Returns the implementer of `interfaceHash` for `account`. If no such
     * implementer is registered, returns the zero address.
     *
     * If `interfaceHash` is an {IERC165} interface id (i.e. it ends with 28
     * zeroes), `account` will be queried for support of it.
     *
     * `account` being the zero address is an alias for the caller's address.
     */
    function getInterfaceImplementer(address account, bytes32 _interfaceHash) external view returns (address);

    /**
     * @dev Returns the interface hash for an `interfaceName`, as defined in the
     * corresponding
     * https://eips.ethereum.org/EIPS/eip-1820#interface-name[section of the EIP].
     */
    function interfaceHash(string calldata interfaceName) external pure returns (bytes32);

    /**
     * @notice Updates the cache with whether the contract implements an ERC165 interface or not.
     * @param account Address of the contract for which to update the cache.
     * @param interfaceId ERC165 interface for which to update the cache.
     */
    function updateERC165Cache(address account, bytes4 interfaceId) external;

    /**
     * @notice Checks whether a contract implements an ERC165 interface or not.
     * If the result is not cached a direct lookup on the contract address is performed.
     * If the result is not cached or the cached value is out-of-date, the cache MUST be updated manually by calling
     * {updateERC165Cache} with the contract address.
     * @param account Address of the contract to check.
     * @param interfaceId ERC165 interface to check.
     * @return True if `account` implements `interfaceId`, false otherwise.
     */
    function implementsERC165Interface(address account, bytes4 interfaceId) external view returns (bool);

    /**
     * @notice Checks whether a contract implements an ERC165 interface or not without using nor updating the cache.
     * @param account Address of the contract to check.
     * @param interfaceId ERC165 interface to check.
     * @return True if `account` implements `interfaceId`, false otherwise.
     */
    function implementsERC165InterfaceNoCache(address account, bytes4 interfaceId) external view returns (bool);

    event InterfaceImplementerSet(address indexed account, bytes32 indexed interfaceHash, address indexed implementer);

    event ManagerChanged(address indexed account, address indexed newManager);
}

File 5 of 9: IERC20.sol
// SPDX-License-Identifier: MIT
// 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 6 of 9: IERC777.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC777/IERC777.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC777Token standard as defined in the EIP.
 *
 * This contract uses the
 * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 registry standard] to let
 * token holders and recipients react to token movements by using setting implementers
 * for the associated interfaces in said registry. See {IERC1820Registry} and
 * {ERC1820Implementer}.
 */
interface IERC777 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the smallest part of the token that is not divisible. This
     * means all token operations (creation, movement and destruction) must have
     * amounts that are a multiple of this number.
     *
     * For most token contracts, this value will equal 1.
     */
    function granularity() external view returns (uint256);

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

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

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * If send or receive hooks are registered for the caller and `recipient`,
     * the corresponding functions will be called with `data` and empty
     * `operatorData`. See {IERC777Sender} and {IERC777Recipient}.
     *
     * Emits a {Sent} event.
     *
     * Requirements
     *
     * - the caller must have at least `amount` tokens.
     * - `recipient` cannot be the zero address.
     * - if `recipient` is a contract, it must implement the {IERC777Recipient}
     * interface.
     */
    function send(
        address recipient,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev Destroys `amount` tokens from the caller's account, reducing the
     * total supply.
     *
     * If a send hook is registered for the caller, the corresponding function
     * will be called with `data` and empty `operatorData`. See {IERC777Sender}.
     *
     * Emits a {Burned} event.
     *
     * Requirements
     *
     * - the caller must have at least `amount` tokens.
     */
    function burn(uint256 amount, bytes calldata data) external;

    /**
     * @dev Returns true if an account is an operator of `tokenHolder`.
     * Operators can send and burn tokens on behalf of their owners. All
     * accounts are their own operator.
     *
     * See {operatorSend} and {operatorBurn}.
     */
    function isOperatorFor(address operator, address tokenHolder) external view returns (bool);

    /**
     * @dev Make an account an operator of the caller.
     *
     * See {isOperatorFor}.
     *
     * Emits an {AuthorizedOperator} event.
     *
     * Requirements
     *
     * - `operator` cannot be calling address.
     */
    function authorizeOperator(address operator) external;

    /**
     * @dev Revoke an account's operator status for the caller.
     *
     * See {isOperatorFor} and {defaultOperators}.
     *
     * Emits a {RevokedOperator} event.
     *
     * Requirements
     *
     * - `operator` cannot be calling address.
     */
    function revokeOperator(address operator) external;

    /**
     * @dev Returns the list of default operators. These accounts are operators
     * for all token holders, even if {authorizeOperator} was never called on
     * them.
     *
     * This list is immutable, but individual holders may revoke these via
     * {revokeOperator}, in which case {isOperatorFor} will return false.
     */
    function defaultOperators() external view returns (address[] memory);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient`. The caller must
     * be an operator of `sender`.
     *
     * If send or receive hooks are registered for `sender` and `recipient`,
     * the corresponding functions will be called with `data` and
     * `operatorData`. See {IERC777Sender} and {IERC777Recipient}.
     *
     * Emits a {Sent} event.
     *
     * Requirements
     *
     * - `sender` cannot be the zero address.
     * - `sender` must have at least `amount` tokens.
     * - the caller must be an operator for `sender`.
     * - `recipient` cannot be the zero address.
     * - if `recipient` is a contract, it must implement the {IERC777Recipient}
     * interface.
     */
    function operatorSend(
        address sender,
        address recipient,
        uint256 amount,
        bytes calldata data,
        bytes calldata operatorData
    ) external;

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the total supply.
     * The caller must be an operator of `account`.
     *
     * If a send hook is registered for `account`, the corresponding function
     * will be called with `data` and `operatorData`. See {IERC777Sender}.
     *
     * Emits a {Burned} event.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     * - the caller must be an operator for `account`.
     */
    function operatorBurn(
        address account,
        uint256 amount,
        bytes calldata data,
        bytes calldata operatorData
    ) external;

    event Sent(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256 amount,
        bytes data,
        bytes operatorData
    );

    event Minted(address indexed operator, address indexed to, uint256 amount, bytes data, bytes operatorData);

    event Burned(address indexed operator, address indexed from, uint256 amount, bytes data, bytes operatorData);

    event AuthorizedOperator(address indexed operator, address indexed tokenHolder);

    event RevokedOperator(address indexed operator, address indexed tokenHolder);
}

File 7 of 9: IERC777Recipient.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC777/IERC777Recipient.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC777TokensRecipient standard as defined in the EIP.
 *
 * Accounts can be notified of {IERC777} tokens being sent to them by having a
 * contract implement this interface (contract holders can be their own
 * implementer) and registering it on the
 * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 global registry].
 *
 * See {IERC1820Registry} and {ERC1820Implementer}.
 */
interface IERC777Recipient {
    /**
     * @dev Called by an {IERC777} token contract whenever tokens are being
     * moved or created into a registered account (`to`). The type of operation
     * is conveyed by `from` being the zero address or not.
     *
     * This call occurs _after_ the token contract's state is updated, so
     * {IERC777-balanceOf}, etc., can be used to query the post-operation state.
     *
     * This function may revert to prevent the operation from being executed.
     */
    function tokensReceived(
        address operator,
        address from,
        address to,
        uint256 amount,
        bytes calldata userData,
        bytes calldata operatorData
    ) external;
}

File 8 of 9: IERC777Sender.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC777/IERC777Sender.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC777TokensSender standard as defined in the EIP.
 *
 * {IERC777} Token holders can be notified of operations performed on their
 * tokens by having a contract implement this interface (contract holders can be
 * their own implementer) and registering it on the
 * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 global registry].
 *
 * See {IERC1820Registry} and {ERC1820Implementer}.
 */
interface IERC777Sender {
    /**
     * @dev Called by an {IERC777} token contract whenever a registered holder's
     * (`from`) tokens are about to be moved or destroyed. The type of operation
     * is conveyed by `to` being the zero address or not.
     *
     * This call occurs _before_ the token contract's state is updated, so
     * {IERC777-balanceOf}, etc., can be used to query the pre-operation state.
     *
     * This function may revert to prevent the operation from being executed.
     */
    function tokensToSend(
        address operator,
        address from,
        address to,
        uint256 amount,
        bytes calldata userData,
        bytes calldata operatorData
    ) external;
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"tokenHolder","type":"address"}],"name":"AuthorizedOperator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"Burned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"tokenHolder","type":"address"}],"name":"RevokedOperator","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":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"Sent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"authorizeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenHolder","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"defaultOperators","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"granularity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"tokenHolder","type":"address"}],"name":"isOperatorFor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"lockedAmount","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"lockedBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockedCoin","outputs":[{"internalType":"contract LockedCoin","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"operatorBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"operatorLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"unlockerPhrase","type":"string"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"operatorReclaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"operatorSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"unlockerPhrase","type":"string"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"operatorUnlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"unlockerPhrase","type":"string"}],"name":"reclaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"reclaimByLockedCoinContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"revokeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"send","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"unlockerPhrase","type":"string"}],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"unlockByLockedCoinContract","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040518060400160405280600881526020017f4c6f636b61626c650000000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f4c43000000000000000000000000000000000000000000000000000000000000815250600067ffffffffffffffff8111156200009c576200009b620009a1565b5b604051908082528060200260200182016040528015620000cb5781602001602082028036833780820191505090505b508260029080519060200190620000e492919062000854565b508160039080519060200190620000fd92919062000854565b50806004908051906020019062000116929190620008e5565b5060005b8151811015620001af5760016005600084848151811062000140576200013f620009d0565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080620001a69062000a38565b9150506200011a565b50731820a4b7618bde71dce8cdc73aab6c95905fad2473ffffffffffffffffffffffffffffffffffffffff166329965a1d307fac7fbab5f54a3ca8194167523c6753bfeb96a445279294b6125b68cce2177054306040518463ffffffff1660e01b8152600401620002239392919062000ae6565b600060405180830381600087803b1580156200023e57600080fd5b505af115801562000253573d6000803e3d6000fd5b50505050731820a4b7618bde71dce8cdc73aab6c95905fad2473ffffffffffffffffffffffffffffffffffffffff166329965a1d307faea199e31a596269b42cdafd93407f14436db6e4cad65417994c2eb37381e05a306040518463ffffffff1660e01b8152600401620002ca9392919062000ae6565b600060405180830381600087803b158015620002e557600080fd5b505af1158015620002fa573d6000803e3d6000fd5b5050505050505033600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200037f336a084595161401484a0000006040518060200160405280600081525060405180602001604052806000815250620003f160201b60201c565b6040516200038d9062000974565b604051809103906000f080158015620003aa573d6000803e3d6000fd5b50600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000f53565b620004078484848460016200040d60201b60201c565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141562000480576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004779062000b84565b60405180910390fd5b6000620004926200060e60201b60201c565b9050620004a981600088886200061660201b60201c565b8460016000828254620004bd919062000ba6565b92505081905550846000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462000514919062000ba6565b925050819055506200053381600088888888886200061c60201b60201c565b8573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f2fe5be0146f74c5bce36c0b80911af6c7d86ff27e89d5cfa61fc681327954e5d878787604051620005969392919062000cb8565b60405180910390a38573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef87604051620005fe919062000d03565b60405180910390a3505050505050565b600033905090565b50505050565b6000731820a4b7618bde71dce8cdc73aab6c95905fad2473ffffffffffffffffffffffffffffffffffffffff1663aabbb8ca877fb281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b6040518363ffffffff1660e01b81526004016200068f92919062000d20565b602060405180830381865afa158015620006ad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620006d3919062000d83565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161462000788578073ffffffffffffffffffffffffffffffffffffffff166223de298989898989896040518763ffffffff1660e01b81526004016200074e9695949392919062000db5565b600060405180830381600087803b1580156200076957600080fd5b505af11580156200077e573d6000803e3d6000fd5b5050505062000837565b81156200083657620007bb8673ffffffffffffffffffffffffffffffffffffffff166200084160201b620030841760201c565b1580620007f357503073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b62000835576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200082c9062000ecc565b60405180910390fd5b5b5b5050505050505050565b600080823b905060008111915050919050565b828054620008629062000f1d565b90600052602060002090601f016020900481019282620008865760008555620008d2565b82601f10620008a157805160ff1916838001178555620008d2565b82800160010185558215620008d2579182015b82811115620008d1578251825591602001919060010190620008b4565b5b509050620008e1919062000982565b5090565b82805482825590600052602060002090810192821562000961579160200282015b82811115620009605782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019062000906565b5b50905062000970919062000982565b5090565b614fc0806200651f83390190565b5b808211156200099d57600081600090555060010162000983565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000819050919050565b600062000a458262000a2e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562000a7b5762000a7a620009ff565b5b600182019050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000ab38262000a86565b9050919050565b62000ac58162000aa6565b82525050565b6000819050919050565b62000ae08162000acb565b82525050565b600060608201905062000afd600083018662000aba565b62000b0c602083018562000ad5565b62000b1b604083018462000aba565b949350505050565b600082825260208201905092915050565b7f4552433737373a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600062000b6c60208362000b23565b915062000b798262000b34565b602082019050919050565b6000602082019050818103600083015262000b9f8162000b5d565b9050919050565b600062000bb38262000a2e565b915062000bc08362000a2e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000bf85762000bf7620009ff565b5b828201905092915050565b62000c0e8162000a2e565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b8381101562000c5057808201518184015260208101905062000c33565b8381111562000c60576000848401525b50505050565b6000601f19601f8301169050919050565b600062000c848262000c14565b62000c90818562000c1f565b935062000ca281856020860162000c30565b62000cad8162000c66565b840191505092915050565b600060608201905062000ccf600083018662000c03565b818103602083015262000ce3818562000c77565b9050818103604083015262000cf9818462000c77565b9050949350505050565b600060208201905062000d1a600083018462000c03565b92915050565b600060408201905062000d37600083018562000aba565b62000d46602083018462000ad5565b9392505050565b600080fd5b62000d5d8162000aa6565b811462000d6957600080fd5b50565b60008151905062000d7d8162000d52565b92915050565b60006020828403121562000d9c5762000d9b62000d4d565b5b600062000dac8482850162000d6c565b91505092915050565b600060c08201905062000dcc600083018962000aba565b62000ddb602083018862000aba565b62000dea604083018762000aba565b62000df9606083018662000c03565b818103608083015262000e0d818562000c77565b905081810360a083015262000e23818462000c77565b9050979650505050505050565b7f4552433737373a20746f6b656e20726563697069656e7420636f6e747261637460008201527f20686173206e6f20696d706c656d656e74657220666f7220455243373737546f60208201527f6b656e73526563697069656e7400000000000000000000000000000000000000604082015250565b600062000eb4604d8362000b23565b915062000ec18262000e30565b606082019050919050565b6000602082019050818103600083015262000ee78162000ea5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000f3657607f821691505b6020821081141562000f4d5762000f4c62000eee565b5b50919050565b6155bc8062000f636000396000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c8063896b9ad01161010f578063c92b4b5a116100a2578063dd62ed3e11610071578063dd62ed3e1461057c578063fad8b32a146105ac578063fc673c4f146105c8578063fe9d9303146105e4576101e5565b8063c92b4b5a146104f4578063ca3369c614610512578063ca5c7b911461052e578063d95b63711461054c576101e5565b80639bd9bbc6116100de5780639bd9bbc61461045c578063a9059cbb14610478578063a96ce7aa146104a8578063bc101571146104c4576101e5565b8063896b9ad0146103ea578063931fe6ee14610406578063959b8c3f1461042257806395d89b411461043e576101e5565b8063449b97161161018757806370a082311161015657806370a082311461036457806378d28bd7146103945780638078f338146103b0578063893d20e8146103cc576101e5565b8063449b9716146102de578063556f0dc7146102fa578063593557361461031857806362ad1b8314610348576101e5565b806318160ddd116101c357806318160ddd1461025657806323b872dd14610274578063313ce567146102a45780633e48eba9146102c2576101e5565b806306e48538146101ea57806306fdde0314610208578063095ea7b314610226575b600080fd5b6101f2610600565b6040516101ff9190613c5c565b60405180910390f35b61021061068e565b60405161021d9190613d17565b60405180910390f35b610240600480360381019061023b9190613daf565b610720565b60405161024d9190613e0a565b60405180910390f35b61025e610743565b60405161026b9190613e34565b60405180910390f35b61028e60048036038101906102899190613e4f565b61074d565b60405161029b9190613e0a565b60405180910390f35b6102ac6109a7565b6040516102b99190613ebe565b60405180910390f35b6102dc60048036038101906102d791906140af565b6109b0565b005b6102f860048036038101906102f391906141a0565b610db6565b005b6103026110d1565b60405161030f9190613e34565b60405180910390f35b610332600480360381019061032d9190614265565b6110da565b60405161033f9190613e34565b60405180910390f35b610362600480360381019061035d9190614292565b611123565b005b61037e60048036038101906103799190614265565b611189565b60405161038b9190613e34565b60405180910390f35b6103ae60048036038101906103a99190614345565b6111d1565b005b6103ca60048036038101906103c59190614385565b611589565b005b6103d461192e565b6040516103e19190614463565b60405180910390f35b61040460048036038101906103ff919061447e565b611958565b005b610420600480360381019061041b91906144d1565b611d13565b005b61043c60048036038101906104379190614265565b61204a565b005b6104466122ab565b6040516104539190613d17565b60405180910390f35b6104766004803603810190610471919061452d565b61233d565b005b610492600480360381019061048d9190613daf565b612367565b60405161049f9190613e0a565b60405180910390f35b6104c260048036038101906104bd919061459c565b612475565b005b6104de60048036038101906104d99190614345565b6127a9565b6040516104eb9190613e34565b60405180910390f35b6104fc612851565b6040516105099190614644565b60405180910390f35b61052c6004803603810190610527919061465f565b612877565b005b610536612b5d565b6040516105439190613e34565b60405180910390f35b610566600480360381019061056191906146b2565b612b63565b6040516105739190613e0a565b60405180910390f35b610596600480360381019061059191906146b2565b612d14565b6040516105a39190613e34565b60405180910390f35b6105c660048036038101906105c19190614265565b612d9b565b005b6105e260048036038101906105dd91906146f2565b612ffc565b005b6105fe60048036038101906105f99190614791565b61305e565b005b6060600480548060200260200160405190810160405280929190818152602001828054801561068457602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161063a575b5050505050905090565b60606002805461069d9061481c565b80601f01602080910402602001604051908101604052809291908181526020018280546106c99061481c565b80156107165780601f106106eb57610100808354040283529160200191610716565b820191906000526020600020905b8154815290600101906020018083116106f957829003601f168201915b5050505050905090565b60008061072b613097565b905061073881858561309f565b600191505092915050565b6000600154905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b5906148c0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561082e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082590614952565b60405180910390fd5b6000610838613097565b905061086681868686604051806020016040528060008152506040518060200160405280600081525061326a565b6108928186868660405180602001604052806000815250604051806020016040528060008152506133d1565b6000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015610956576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094d906149e4565b60405180910390fd5b61096c868386846109679190614a33565b61309f565b61099a82878787604051806020016040528060008152506040518060200160405280600081525060006135eb565b6001925050509392505050565b60006012905090565b600083805190602001209050610a6a6109c7613097565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b68f53a788856040518363ffffffff1660e01b8152600401610a24929190614a76565b602060405180830381865afa158015610a41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a659190614ab4565b612b63565b610aa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa090614b53565b60405180910390fd5b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bb82753e87846040518363ffffffff1660e01b8152600401610b08929190614a76565b6020604051808303816000875af1158015610b27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4b9190614b88565b905080600b541015610b92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8990614c01565b60405180910390fd5b80600c60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610c14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0b90614c01565b60405180910390fd5b610c23308783878760016137f3565b80600b6000828254610c359190614a33565b9250508190555080600c60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c8b9190614a33565b92505081905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231876040518263ffffffff1660e01b8152600401610ced9190614463565b602060405180830381865afa158015610d0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2e9190614b88565b600c60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610dae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da590614c6d565b60405180910390fd5b505050505050565b610dc7610dc1613097565b87612b63565b610e06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfd90614b53565b60405180910390fd5b6000610e1187611189565b905084811015610e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4d90614cd9565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639eb4b70e8787878b6040518563ffffffff1660e01b8152600401610eb79493929190614cf9565b600060405180830381600087803b158015610ed157600080fd5b505af1158015610ee5573d6000803e3d6000fd5b50505050610ef8873087868660016137f3565b84600b6000828254610f0a9190614d3e565b9250508190555084600c60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610f609190614d3e565b9250508190555084600b541015610fac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa390614de0565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231876040518263ffffffff1660e01b81526004016110079190614463565b602060405180830381865afa158015611024573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110489190614b88565b600c60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146110c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bf90614c6d565b60405180910390fd5b50505050505050565b60006001905090565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61113461112e613097565b86612b63565b611173576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116a90614b53565b60405180910390fd5b611182858585858560016137f3565b5050505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611261576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125890614e72565b60405180910390fd5b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bb82753e84846040518363ffffffff1660e01b81526004016112c0929190614a76565b6020604051808303816000875af11580156112df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113039190614b88565b905080600b54101561134a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134190614c01565b60405180910390fd5b80600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156113cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c390614c01565b60405180910390fd5b6113f9308483604051806020016040528060008152506040518060200160405280600081525060006137f3565b80600b600082825461140b9190614a33565b9250508190555080600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114619190614a33565b92505081905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b81526004016114c39190614463565b602060405180830381865afa1580156114e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115049190614b88565b600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611584576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157b90614c6d565b60405180910390fd5b505050565b6000838051906020012090506115a66115a0613097565b87612b63565b6115e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115dc90614b53565b60405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561161e57600080fd5b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663496b73db8888856040518463ffffffff1660e01b815260040161167f93929190614e92565b6020604051808303816000875af115801561169e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116c29190614b88565b905080600b541015611709576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170090614c01565b60405180910390fd5b80600c60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561178b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178290614c01565b60405180910390fd5b61179a308883878760016137f3565b80600b60008282546117ac9190614a33565b9250508190555080600c60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118029190614a33565b92505081905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231876040518263ffffffff1660e01b81526004016118649190614463565b602060405180830381865afa158015611881573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a59190614b88565b600c60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611925576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191c90614c6d565b60405180910390fd5b50505050505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119df90614e72565b60405180910390fd5b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663496b73db8585856040518463ffffffff1660e01b8152600401611a4993929190614e92565b6020604051808303816000875af1158015611a68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a8c9190614b88565b905080600b541015611ad3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aca90614c01565b60405180910390fd5b80600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015611b55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4c90614c01565b60405180910390fd5b611b82308583604051806020016040528060008152506040518060200160405280600081525060006137f3565b80600b6000828254611b949190614a33565b9250508190555080600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611bea9190614a33565b92505081905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401611c4c9190614463565b602060405180830381865afa158015611c69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c8d9190614b88565b600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611d0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0490614c6d565b60405180910390fd5b50505050565b6000818051906020012090506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663496b73db3386856040518463ffffffff1660e01b8152600401611d8093929190614e92565b6020604051808303816000875af1158015611d9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc39190614b88565b905080600b541015611e0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0190614c01565b60405180910390fd5b80600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015611e8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8390614c01565b60405180910390fd5b611eb9303383604051806020016040528060008152506040518060200160405280600081525060006137f3565b80600b6000828254611ecb9190614a33565b9250508190555080600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f219190614a33565b92505081905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401611f839190614463565b602060405180830381865afa158015611fa0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fc49190614b88565b600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414612044576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203b90614c6d565b60405180910390fd5b50505050565b8073ffffffffffffffffffffffffffffffffffffffff16612069613097565b73ffffffffffffffffffffffffffffffffffffffff1614156120c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b790614f3b565b60405180910390fd5b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156121aa576007600061211e613097565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055612247565b6001600660006121b8613097565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b61224f613097565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167ff4caeb2d6ca8932a215a353d0703c326ec2d81fc68170f320eb2ab49e9df61f960405160405180910390a350565b6060600380546122ba9061481c565b80601f01602080910402602001604051908101604052809291908181526020018280546122e69061481c565b80156123335780601f1061230857610100808354040283529160200191612333565b820191906000526020600020905b81548152906001019060200180831161231657829003601f168201915b5050505050905090565b612362612348613097565b8484846040518060200160405280600081525060016137f3565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156123d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cf906148c0565b60405180910390fd5b60006123e2613097565b905061241081828686604051806020016040528060008152506040518060200160405280600081525061326a565b61243c8182868660405180602001604052806000815250604051806020016040528060008152506133d1565b61246a81828686604051806020016040528060008152506040518060200160405280600081525060006135eb565b600191505092915050565b6000818051906020012090506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bb82753e33846040518363ffffffff1660e01b81526004016124e0929190614a76565b6020604051808303816000875af11580156124ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125239190614b88565b905080600b54101561256a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256190614c01565b60405180910390fd5b80600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156125ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e390614c01565b60405180910390fd5b612619303383604051806020016040528060008152506040518060200160405280600081525060006137f3565b80600b600082825461262b9190614a33565b9250508190555080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126819190614a33565b92505081905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016126e39190614463565b602060405180830381865afa158015612700573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127249190614b88565b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146127a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279b90614c6d565b60405180910390fd5b505050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bc10157184846040518363ffffffff1660e01b8152600401612808929190614a76565b602060405180830381865afa158015612825573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128499190614b88565b905092915050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061288233611189565b9050828110156128c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128be90614cd9565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639eb4b70e858585336040518563ffffffff1660e01b81526004016129289493929190614cf9565b600060405180830381600087803b15801561294257600080fd5b505af1158015612956573d6000803e3d6000fd5b50505050612987333085604051806020016040528060008152506040518060200160405280600081525060006137f3565b82600b60008282546129999190614d3e565b9250508190555082600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129ef9190614d3e565b9250508190555082600b541015612a3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3290614de0565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401612a969190614463565b602060405180830381865afa158015612ab3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ad79190614b88565b600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414612b57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4e90614c6d565b60405180910390fd5b50505050565b600b5481565b60008173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480612c7b5750600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612c7a5750600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b5b80612d0c5750600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b905092915050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b612da3613097565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612e11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0890614fcd565b60405180910390fd5b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612f0457600160076000612e71613097565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612f98565b60066000612f10613097565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690555b612fa0613097565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f50546e66e5f44d728365dc3908c63bc5cfeeab470722c1677e3073a6ac294aa160405160405180910390a350565b61300d613007613097565b85612b63565b61304c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161304390614b53565b60405180910390fd5b61305884848484613913565b50505050565b613080613069613097565b838360405180602001604052806000815250613913565b5050565b600080823b905060008111915050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561310f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131069061505f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561317f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613176906150f1565b60405180910390fd5b80600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161325d9190613e34565b60405180910390a3505050565b6000731820a4b7618bde71dce8cdc73aab6c95905fad2473ffffffffffffffffffffffffffffffffffffffff1663aabbb8ca877f29ddb589b1fb5fc7cf394961c1adf5f8c6454761adf795e67fe149f658abe8956040518363ffffffff1660e01b81526004016132db929190614a76565b602060405180830381865afa1580156132f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061331c9190614ab4565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146133c8578073ffffffffffffffffffffffffffffffffffffffff166375ab97828888888888886040518763ffffffff1660e01b815260040161339596959493929190615166565b600060405180830381600087803b1580156133af57600080fd5b505af11580156133c3573d6000803e3d6000fd5b505050505b50505050505050565b6133dd86868686613b66565b60008060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015613463576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161345a90615247565b60405180910390fd5b8381036000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550836000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134f69190614d3e565b925050819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f06b541ddaa720db2b10a4d0cdac39b8d360425fc073085fac19bc8261467798787878760405161357593929190615267565b60405180910390a48473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516135da9190613e34565b60405180910390a350505050505050565b6000731820a4b7618bde71dce8cdc73aab6c95905fad2473ffffffffffffffffffffffffffffffffffffffff1663aabbb8ca877fb281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b6040518363ffffffff1660e01b815260040161365c929190614a76565b602060405180830381865afa158015613679573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061369d9190614ab4565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461374c578073ffffffffffffffffffffffffffffffffffffffff166223de298989898989896040518763ffffffff1660e01b815260040161371596959493929190615166565b600060405180830381600087803b15801561372f57600080fd5b505af1158015613743573d6000803e3d6000fd5b505050506137e9565b81156137e8576137718673ffffffffffffffffffffffffffffffffffffffff16613084565b15806137a857503073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b6137e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137de90615344565b60405180910390fd5b5b5b5050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415613863576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161385a906153d6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156138d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138ca90615442565b60405180910390fd5b60006138dd613097565b90506138ed81888888888861326a565b6138fb8188888888886133d1565b61390a818888888888886135eb565b50505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613983576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161397a906154d4565b60405180910390fd5b600061398d613097565b905061399e8186600087878761326a565b6139ab8186600087613b66565b60008060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905084811015613a31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a2890615566565b60405180910390fd5b8481036000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508460016000828254613a889190614a33565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fa78a9be3a7b862d26933ad85fb11d80ef66b8f972d7cbba06621d583943a4098878787604051613af093929190615267565b60405180910390a3600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef87604051613b569190613e34565b60405180910390a3505050505050565b50505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613bc382613b98565b9050919050565b613bd381613bb8565b82525050565b6000613be58383613bca565b60208301905092915050565b6000602082019050919050565b6000613c0982613b6c565b613c138185613b77565b9350613c1e83613b88565b8060005b83811015613c4f578151613c368882613bd9565b9750613c4183613bf1565b925050600181019050613c22565b5085935050505092915050565b60006020820190508181036000830152613c768184613bfe565b905092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613cb8578082015181840152602081019050613c9d565b83811115613cc7576000848401525b50505050565b6000601f19601f8301169050919050565b6000613ce982613c7e565b613cf38185613c89565b9350613d03818560208601613c9a565b613d0c81613ccd565b840191505092915050565b60006020820190508181036000830152613d318184613cde565b905092915050565b6000604051905090565b600080fd5b600080fd5b613d5681613bb8565b8114613d6157600080fd5b50565b600081359050613d7381613d4d565b92915050565b6000819050919050565b613d8c81613d79565b8114613d9757600080fd5b50565b600081359050613da981613d83565b92915050565b60008060408385031215613dc657613dc5613d43565b5b6000613dd485828601613d64565b9250506020613de585828601613d9a565b9150509250929050565b60008115159050919050565b613e0481613def565b82525050565b6000602082019050613e1f6000830184613dfb565b92915050565b613e2e81613d79565b82525050565b6000602082019050613e496000830184613e25565b92915050565b600080600060608486031215613e6857613e67613d43565b5b6000613e7686828701613d64565b9350506020613e8786828701613d64565b9250506040613e9886828701613d9a565b9150509250925092565b600060ff82169050919050565b613eb881613ea2565b82525050565b6000602082019050613ed36000830184613eaf565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613f1b82613ccd565b810181811067ffffffffffffffff82111715613f3a57613f39613ee3565b5b80604052505050565b6000613f4d613d39565b9050613f598282613f12565b919050565b600067ffffffffffffffff821115613f7957613f78613ee3565b5b613f8282613ccd565b9050602081019050919050565b82818337600083830152505050565b6000613fb1613fac84613f5e565b613f43565b905082815260208101848484011115613fcd57613fcc613ede565b5b613fd8848285613f8f565b509392505050565b600082601f830112613ff557613ff4613ed9565b5b8135614005848260208601613f9e565b91505092915050565b600067ffffffffffffffff82111561402957614028613ee3565b5b61403282613ccd565b9050602081019050919050565b600061405261404d8461400e565b613f43565b90508281526020810184848401111561406e5761406d613ede565b5b614079848285613f8f565b509392505050565b600082601f83011261409657614095613ed9565b5b81356140a684826020860161403f565b91505092915050565b600080600080608085870312156140c9576140c8613d43565b5b60006140d787828801613d64565b945050602085013567ffffffffffffffff8111156140f8576140f7613d48565b5b61410487828801613fe0565b935050604085013567ffffffffffffffff81111561412557614124613d48565b5b61413187828801614081565b925050606085013567ffffffffffffffff81111561415257614151613d48565b5b61415e87828801614081565b91505092959194509250565b6000819050919050565b61417d8161416a565b811461418857600080fd5b50565b60008135905061419a81614174565b92915050565b60008060008060008060c087890312156141bd576141bc613d43565b5b60006141cb89828a01613d64565b96505060206141dc89828a01613d64565b95505060406141ed89828a01613d9a565b94505060606141fe89828a0161418b565b935050608087013567ffffffffffffffff81111561421f5761421e613d48565b5b61422b89828a01614081565b92505060a087013567ffffffffffffffff81111561424c5761424b613d48565b5b61425889828a01614081565b9150509295509295509295565b60006020828403121561427b5761427a613d43565b5b600061428984828501613d64565b91505092915050565b600080600080600060a086880312156142ae576142ad613d43565b5b60006142bc88828901613d64565b95505060206142cd88828901613d64565b94505060406142de88828901613d9a565b935050606086013567ffffffffffffffff8111156142ff576142fe613d48565b5b61430b88828901614081565b925050608086013567ffffffffffffffff81111561432c5761432b613d48565b5b61433888828901614081565b9150509295509295909350565b6000806040838503121561435c5761435b613d43565b5b600061436a85828601613d64565b925050602061437b8582860161418b565b9150509250929050565b600080600080600060a086880312156143a1576143a0613d43565b5b60006143af88828901613d64565b95505060206143c088828901613d64565b945050604086013567ffffffffffffffff8111156143e1576143e0613d48565b5b6143ed88828901613fe0565b935050606086013567ffffffffffffffff81111561440e5761440d613d48565b5b61441a88828901614081565b925050608086013567ffffffffffffffff81111561443b5761443a613d48565b5b61444788828901614081565b9150509295509295909350565b61445d81613bb8565b82525050565b60006020820190506144786000830184614454565b92915050565b60008060006060848603121561449757614496613d43565b5b60006144a586828701613d64565b93505060206144b686828701613d64565b92505060406144c78682870161418b565b9150509250925092565b600080604083850312156144e8576144e7613d43565b5b60006144f685828601613d64565b925050602083013567ffffffffffffffff81111561451757614516613d48565b5b61452385828601613fe0565b9150509250929050565b60008060006060848603121561454657614545613d43565b5b600061455486828701613d64565b935050602061456586828701613d9a565b925050604084013567ffffffffffffffff81111561458657614585613d48565b5b61459286828701614081565b9150509250925092565b6000602082840312156145b2576145b1613d43565b5b600082013567ffffffffffffffff8111156145d0576145cf613d48565b5b6145dc84828501613fe0565b91505092915050565b6000819050919050565b600061460a61460561460084613b98565b6145e5565b613b98565b9050919050565b600061461c826145ef565b9050919050565b600061462e82614611565b9050919050565b61463e81614623565b82525050565b60006020820190506146596000830184614635565b92915050565b60008060006060848603121561467857614677613d43565b5b600061468686828701613d64565b935050602061469786828701613d9a565b92505060406146a88682870161418b565b9150509250925092565b600080604083850312156146c9576146c8613d43565b5b60006146d785828601613d64565b92505060206146e885828601613d64565b9150509250929050565b6000806000806080858703121561470c5761470b613d43565b5b600061471a87828801613d64565b945050602061472b87828801613d9a565b935050604085013567ffffffffffffffff81111561474c5761474b613d48565b5b61475887828801614081565b925050606085013567ffffffffffffffff81111561477957614778613d48565b5b61478587828801614081565b91505092959194509250565b600080604083850312156147a8576147a7613d43565b5b60006147b685828601613d9a565b925050602083013567ffffffffffffffff8111156147d7576147d6613d48565b5b6147e385828601614081565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061483457607f821691505b60208210811415614848576148476147ed565b5b50919050565b7f4552433737373a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006148aa602483613c89565b91506148b58261484e565b604082019050919050565b600060208201905081810360008301526148d98161489d565b9050919050565b7f4552433737373a207472616e736665722066726f6d20746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061493c602683613c89565b9150614947826148e0565b604082019050919050565b6000602082019050818103600083015261496b8161492f565b9050919050565b7f4552433737373a207472616e7366657220616d6f756e7420657863656564732060008201527f616c6c6f77616e63650000000000000000000000000000000000000000000000602082015250565b60006149ce602983613c89565b91506149d982614972565b604082019050919050565b600060208201905081810360008301526149fd816149c1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614a3e82613d79565b9150614a4983613d79565b925082821015614a5c57614a5b614a04565b5b828203905092915050565b614a708161416a565b82525050565b6000604082019050614a8b6000830185614454565b614a986020830184614a67565b9392505050565b600081519050614aae81613d4d565b92915050565b600060208284031215614aca57614ac9613d43565b5b6000614ad884828501614a9f565b91505092915050565b7f4552433737373a2063616c6c6572206973206e6f7420616e206f70657261746f60008201527f7220666f7220686f6c6465720000000000000000000000000000000000000000602082015250565b6000614b3d602c83613c89565b9150614b4882614ae1565b604082019050919050565b60006020820190508181036000830152614b6c81614b30565b9050919050565b600081519050614b8281613d83565b92915050565b600060208284031215614b9e57614b9d613d43565b5b6000614bac84828501614b73565b91505092915050565b7f42616c616e63657320617265206e6f7420696e2073796e630000000000000000600082015250565b6000614beb601883613c89565b9150614bf682614bb5565b602082019050919050565b60006020820190508181036000830152614c1a81614bde565b9050919050565b7f42616c616e63657320646964206e6f742073796e630000000000000000000000600082015250565b6000614c57601583613c89565b9150614c6282614c21565b602082019050919050565b60006020820190508181036000830152614c8681614c4a565b9050919050565b7f4552433737373a20616d6f756e7420657863656564732062616c616e63650000600082015250565b6000614cc3601e83613c89565b9150614cce82614c8d565b602082019050919050565b60006020820190508181036000830152614cf281614cb6565b9050919050565b6000608082019050614d0e6000830187614454565b614d1b6020830186613e25565b614d286040830185614a67565b614d356060830184614454565b95945050505050565b6000614d4982613d79565b9150614d5483613d79565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614d8957614d88614a04565b5b828201905092915050565b7f4d617468206973206e6f74206f6b000000000000000000000000000000000000600082015250565b6000614dca600e83613c89565b9150614dd582614d94565b602082019050919050565b60006020820190508181036000830152614df981614dbd565b9050919050565b7f4f6e6c79206176616c6961626c6520666f7220746865206c6f636b656420636f60008201527f696e20636f6e7472616374000000000000000000000000000000000000000000602082015250565b6000614e5c602b83613c89565b9150614e6782614e00565b604082019050919050565b60006020820190508181036000830152614e8b81614e4f565b9050919050565b6000606082019050614ea76000830186614454565b614eb46020830185614454565b614ec16040830184614a67565b949350505050565b7f4552433737373a20617574686f72697a696e672073656c66206173206f70657260008201527f61746f7200000000000000000000000000000000000000000000000000000000602082015250565b6000614f25602483613c89565b9150614f3082614ec9565b604082019050919050565b60006020820190508181036000830152614f5481614f18565b9050919050565b7f4552433737373a207265766f6b696e672073656c66206173206f70657261746f60008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000614fb7602183613c89565b9150614fc282614f5b565b604082019050919050565b60006020820190508181036000830152614fe681614faa565b9050919050565b7f4552433737373a20617070726f76652066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000615049602583613c89565b915061505482614fed565b604082019050919050565b600060208201905081810360008301526150788161503c565b9050919050565b7f4552433737373a20617070726f766520746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006150db602383613c89565b91506150e68261507f565b604082019050919050565b6000602082019050818103600083015261510a816150ce565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061513882615111565b615142818561511c565b9350615152818560208601613c9a565b61515b81613ccd565b840191505092915050565b600060c08201905061517b6000830189614454565b6151886020830188614454565b6151956040830187614454565b6151a26060830186613e25565b81810360808301526151b4818561512d565b905081810360a08301526151c8818461512d565b9050979650505050505050565b7f4552433737373a207472616e7366657220616d6f756e7420657863656564732060008201527f62616c616e636500000000000000000000000000000000000000000000000000602082015250565b6000615231602783613c89565b915061523c826151d5565b604082019050919050565b6000602082019050818103600083015261526081615224565b9050919050565b600060608201905061527c6000830186613e25565b818103602083015261528e818561512d565b905081810360408301526152a2818461512d565b9050949350505050565b7f4552433737373a20746f6b656e20726563697069656e7420636f6e747261637460008201527f20686173206e6f20696d706c656d656e74657220666f7220455243373737546f60208201527f6b656e73526563697069656e7400000000000000000000000000000000000000604082015250565b600061532e604d83613c89565b9150615339826152ac565b606082019050919050565b6000602082019050818103600083015261535d81615321565b9050919050565b7f4552433737373a2073656e642066726f6d20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006153c0602283613c89565b91506153cb82615364565b604082019050919050565b600060208201905081810360008301526153ef816153b3565b9050919050565b7f4552433737373a2073656e6420746f20746865207a65726f2061646472657373600082015250565b600061542c602083613c89565b9150615437826153f6565b602082019050919050565b6000602082019050818103600083015261545b8161541f565b9050919050565b7f4552433737373a206275726e2066726f6d20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006154be602283613c89565b91506154c982615462565b604082019050919050565b600060208201905081810360008301526154ed816154b1565b9050919050565b7f4552433737373a206275726e20616d6f756e7420657863656564732062616c6160008201527f6e63650000000000000000000000000000000000000000000000000000000000602082015250565b6000615550602383613c89565b915061555b826154f4565b604082019050919050565b6000602082019050818103600083015261557f81615543565b905091905056fea2646970667358221220799d205c940f729190a92fd02fdb68307d97c741aa4b11cec0de40e3406545fb64736f6c634300080c003360806040526040518060400160405280602081526020017f68747470733a2f2f7777772e65706967656f6e2e6f72672f6c6f636b61626c65815250600a90805190602001906200005192919062000396565b503480156200005f57600080fd5b506040518060400160405280600a81526020017f4c6f636b6564436f696e000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f4c64430000000000000000000000000000000000000000000000000000000000815250600067ffffffffffffffff811115620000ea57620000e9620004d5565b5b604051908082528060200260200182016040528015620001195781602001602082028036833780820191505090505b5082600290805190602001906200013292919062000396565b5081600390805190602001906200014b92919062000396565b5080600490805190602001906200016492919062000427565b5060005b8151811015620001fd576001600560008484815181106200018e576200018d62000504565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080620001f4906200056c565b91505062000168565b50731820a4b7618bde71dce8cdc73aab6c95905fad2473ffffffffffffffffffffffffffffffffffffffff166329965a1d307fac7fbab5f54a3ca8194167523c6753bfeb96a445279294b6125b68cce2177054306040518463ffffffff1660e01b815260040162000271939291906200061a565b600060405180830381600087803b1580156200028c57600080fd5b505af1158015620002a1573d6000803e3d6000fd5b50505050731820a4b7618bde71dce8cdc73aab6c95905fad2473ffffffffffffffffffffffffffffffffffffffff166329965a1d307faea199e31a596269b42cdafd93407f14436db6e4cad65417994c2eb37381e05a306040518463ffffffff1660e01b815260040162000318939291906200061a565b600060405180830381600087803b1580156200033357600080fd5b505af115801562000348573d6000803e3d6000fd5b5050505050505033600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620006bc565b828054620003a49062000686565b90600052602060002090601f016020900481019282620003c8576000855562000414565b82601f10620003e357805160ff191683800117855562000414565b8280016001018555821562000414579182015b8281111562000413578251825591602001919060010190620003f6565b5b509050620004239190620004b6565b5090565b828054828255906000526020600020908101928215620004a3579160200282015b82811115620004a25782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019062000448565b5b509050620004b29190620004b6565b5090565b5b80821115620004d1576000816000905550600101620004b7565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000819050919050565b6000620005798262000562565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415620005af57620005ae62000533565b5b600182019050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620005e782620005ba565b9050919050565b620005f981620005da565b82525050565b6000819050919050565b6200061481620005ff565b82525050565b6000606082019050620006316000830186620005ee565b62000640602083018562000609565b6200064f6040830184620005ee565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200069f57607f821691505b60208210811415620006b657620006b562000657565b5b50919050565b6148f480620006cc6000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c806395d89b4111610104578063bb82753e116100a2578063eac989f811610071578063eac989f8146105a3578063fad8b32a146105c1578063fc673c4f146105dd578063fe9d9303146105f9576101da565b8063bb82753e146104e3578063bc10157114610513578063d95b637114610543578063dd62ed3e14610573576101da565b80639eb4b70e116100de5780639eb4b70e1461044b578063a9059cbb14610467578063a96ce7aa14610497578063b68f53a7146104b3576101da565b806395d89b41146103f55780639b642de1146104135780639bd9bbc61461042f576101da565b8063313ce5671161017c57806370a082311161014b57806370a082311461036f578063893d20e81461039f578063931fe6ee146103bd578063959b8c3f146103d9576101da565b8063313ce567146102e7578063496b73db14610305578063556f0dc71461033557806362ad1b8314610353576101da565b806311df9995116101b857806311df99951461024b57806312e550b81461026957806318160ddd1461029957806323b872dd146102b7576101da565b806306e48538146101df57806306fdde03146101fd578063095ea7b31461021b575b600080fd5b6101e7610615565b6040516101f49190613210565b60405180910390f35b6102056106a3565b60405161021291906132cb565b60405180910390f35b61023560048036038101906102309190613363565b610735565b60405161024291906133be565b60405180910390f35b610253610758565b6040516102609190613438565b60405180910390f35b610283600480360381019061027e9190613489565b61077e565b60405161029091906134d8565b60405180910390f35b6102a16107d9565b6040516102ae91906134d8565b60405180910390f35b6102d160048036038101906102cc91906134f3565b6107e3565b6040516102de91906133be565b60405180910390f35b6102ef610a3d565b6040516102fc9190613562565b60405180910390f35b61031f600480360381019061031a919061357d565b610a46565b60405161032c91906134d8565b60405180910390f35b61033d610e0f565b60405161034a91906134d8565b60405180910390f35b61036d60048036038101906103689190613705565b610e18565b005b610389600480360381019061038491906137b8565b610e7e565b60405161039691906134d8565b60405180910390f35b6103a7610ec6565b6040516103b491906137f4565b60405180910390f35b6103d760048036038101906103d291906138b0565b610f5e565b005b6103f360048036038101906103ee91906137b8565b6110ea565b005b6103fd61134b565b60405161040a91906132cb565b60405180910390f35b61042d6004803603810190610428919061390c565b6113dd565b005b61044960048036038101906104449190613955565b6114bf565b005b610465600480360381019061046091906139c4565b6114e9565b005b610481600480360381019061047c9190613363565b611775565b60405161048e91906133be565b60405180910390f35b6104b160048036038101906104ac919061390c565b611883565b005b6104cd60048036038101906104c89190613489565b611922565b6040516104da91906137f4565b60405180910390f35b6104fd60048036038101906104f89190613489565b61199d565b60405161050a91906134d8565b60405180910390f35b61052d60048036038101906105289190613489565b611cf7565b60405161053a91906134d8565b60405180910390f35b61055d60048036038101906105589190613a2b565b611d52565b60405161056a91906133be565b60405180910390f35b61058d60048036038101906105889190613a2b565b611f03565b60405161059a91906134d8565b60405180910390f35b6105ab611f8a565b6040516105b891906132cb565b60405180910390f35b6105db60048036038101906105d691906137b8565b612018565b005b6105f760048036038101906105f29190613a6b565b612279565b005b610613600480360381019061060e9190613b0a565b6122db565b005b6060600480548060200260200160405190810160405280929190818152602001828054801561069957602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161064f575b5050505050905090565b6060600280546106b290613b95565b80601f01602080910402602001604051908101604052809291908181526020018280546106de90613b95565b801561072b5780601f106107005761010080835404028352916020019161072b565b820191906000526020600020905b81548152906001019060200180831161070e57829003601f168201915b5050505050905090565b600080610740612301565b905061074d818585612309565b600191505092915050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000600154905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610854576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084b90613c39565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156108c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108bb90613ccb565b60405180910390fd5b60006108ce612301565b90506108fc8186868660405180602001604052806000815250604051806020016040528060008152506124d4565b61092881868686604051806020016040528060008152506040518060200160405280600081525061263b565b6000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050838110156109ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e390613d5d565b60405180910390fd5b610a02868386846109fd9190613dac565b612309565b610a308287878760405180602001604052806000815250604051806020016040528060008152506000612855565b6001925050509392505050565b60006012905090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acf90613e2c565b60405180910390fd5b6000600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000205411610b6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6290613e98565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff16600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4090613f04565b60405180910390fd5b6000600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020549050610cc884826040518060200160405280600081525060405180602001604052806000815250612a5d565b6000600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858152602001908152602001600020819055506000600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858152602001908152602001600020819055506000600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550809150509392505050565b60006001905090565b610e29610e23612301565b86611d52565b610e68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5f90613f96565b60405180910390fd5b610e7785858585856001612cb0565b5050505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663893d20e86040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f599190613fcb565b905090565b6000818051906020012090503373ffffffffffffffffffffffffffffffffffffffff16600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611048576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103f90613f04565b60405180910390fd5b611053338483610a46565b50600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663896b9ad03385846040518463ffffffff1660e01b81526004016110b393929190614007565b600060405180830381600087803b1580156110cd57600080fd5b505af11580156110e1573d6000803e3d6000fd5b50505050505050565b8073ffffffffffffffffffffffffffffffffffffffff16611109612301565b73ffffffffffffffffffffffffffffffffffffffff161415611160576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611157906140b0565b60405180910390fd5b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561124a57600760006111be612301565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690556112e7565b600160066000611258612301565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b6112ef612301565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167ff4caeb2d6ca8932a215a353d0703c326ec2d81fc68170f320eb2ab49e9df61f960405160405180910390a350565b60606003805461135a90613b95565b80601f016020809104026020016040519081016040528092919081815260200182805461138690613b95565b80156113d35780601f106113a8576101008083540402835291602001916113d3565b820191906000526020600020905b8154815290600101906020018083116113b657829003601f168201915b5050505050905090565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663893d20e86040518163ffffffff1660e01b8152600401602060405180830381865afa15801561144a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146e9190613fcb565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114a557600080fd5b80600a90805190602001906114bb92919061307d565b5050565b6114e46114ca612301565b848484604051806020016040528060008152506001612cb0565b505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611579576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157090613e2c565b60405180910390fd5b6000600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020541461160c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116039061411c565b60405180910390fd5b61163684846040518060200160405280600081525060405180602001604052806000815250612dd0565b82600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000208190555082600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000208190555080600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156117e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117dd90613c39565b60405180910390fd5b60006117f0612301565b905061181e8182868660405180602001604052806000815250604051806020016040528060008152506124d4565b61184a81828686604051806020016040528060008152506040518060200160405280600081525061263b565b6118788182868660405180602001604052806000815250604051806020016040528060008152506000612855565b600191505092915050565b600081805190602001209050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166378d28bd733836040518363ffffffff1660e01b81526004016118ec92919061413c565b600060405180830381600087803b15801561190657600080fd5b505af115801561191a573d6000803e3d6000fd5b505050505050565b6000600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905092915050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2690613e2c565b60405180910390fd5b6000600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000205411611ac2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab990613e98565b60405180910390fd5b6000600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020549050611b4184826040518060200160405280600081525060405180602001604052806000815250612a5d565b6000600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858152602001908152602001600020819055506000600c6000600d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858152602001908152602001600020819055506000600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508091505092915050565b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60008173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480611e6a5750600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015611e695750600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b5b80611efb5750600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b905092915050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600a8054611f9790613b95565b80601f0160208091040260200160405190810160405280929190818152602001828054611fc390613b95565b80156120105780601f10611fe557610100808354040283529160200191612010565b820191906000526020600020905b815481529060010190602001808311611ff357829003601f168201915b505050505081565b612020612301565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561208e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612085906141d7565b60405180910390fd5b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612181576001600760006120ee612301565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612215565b6006600061218d612301565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690555b61221d612301565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f50546e66e5f44d728365dc3908c63bc5cfeeab470722c1677e3073a6ac294aa160405160405180910390a350565b61228a612284612301565b85611d52565b6122c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c090613f96565b60405180910390fd5b6122d584848484612a5d565b50505050565b6122fd6122e6612301565b838360405180602001604052806000815250612a5d565b5050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612379576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237090614269565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e0906142fb565b60405180910390fd5b80600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516124c791906134d8565b60405180910390a3505050565b6000731820a4b7618bde71dce8cdc73aab6c95905fad2473ffffffffffffffffffffffffffffffffffffffff1663aabbb8ca877f29ddb589b1fb5fc7cf394961c1adf5f8c6454761adf795e67fe149f658abe8956040518363ffffffff1660e01b815260040161254592919061413c565b602060405180830381865afa158015612562573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125869190613fcb565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612632578073ffffffffffffffffffffffffffffffffffffffff166375ab97828888888888886040518763ffffffff1660e01b81526004016125ff96959493929190614370565b600060405180830381600087803b15801561261957600080fd5b505af115801561262d573d6000803e3d6000fd5b505050505b50505050505050565b61264786868686612de4565b60008060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050838110156126cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c490614451565b60405180910390fd5b8381036000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550836000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127609190614471565b925050819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f06b541ddaa720db2b10a4d0cdac39b8d360425fc073085fac19bc826146779878787876040516127df939291906144c7565b60405180910390a48473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8660405161284491906134d8565b60405180910390a350505050505050565b6000731820a4b7618bde71dce8cdc73aab6c95905fad2473ffffffffffffffffffffffffffffffffffffffff1663aabbb8ca877fb281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b6040518363ffffffff1660e01b81526004016128c692919061413c565b602060405180830381865afa1580156128e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129079190613fcb565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146129b6578073ffffffffffffffffffffffffffffffffffffffff166223de298989898989896040518763ffffffff1660e01b815260040161297f96959493929190614370565b600060405180830381600087803b15801561299957600080fd5b505af11580156129ad573d6000803e3d6000fd5b50505050612a53565b8115612a52576129db8673ffffffffffffffffffffffffffffffffffffffff16612e86565b1580612a1257503073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b612a51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a48906145a4565b60405180910390fd5b5b5b5050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612acd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac490614636565b60405180910390fd5b6000612ad7612301565b9050612ae8818660008787876124d4565b612af58186600087612de4565b60008060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905084811015612b7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b72906146c8565b60405180910390fd5b8481036000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508460016000828254612bd29190613dac565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fa78a9be3a7b862d26933ad85fb11d80ef66b8f972d7cbba06621d583943a4098878787604051612c3a939291906144c7565b60405180910390a3600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef87604051612ca091906134d8565b60405180910390a3505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415612d20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d179061475a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612d90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d87906147c6565b60405180910390fd5b6000612d9a612301565b9050612daa8188888888886124d4565b612db881888888888861263b565b612dc781888888888888612855565b50505050505050565b612dde848484846001612e99565b50505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612e74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6b90614832565b60405180910390fd5b612e8084848484613077565b50505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612f09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f009061489e565b60405180910390fd5b6000612f13612301565b9050612f228160008888612de4565b8460016000828254612f349190614471565b92505081905550846000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f899190614471565b92505081905550612fa08160008888888888612855565b8573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f2fe5be0146f74c5bce36c0b80911af6c7d86ff27e89d5cfa61fc681327954e5d878787604051613001939291906144c7565b60405180910390a38573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8760405161306791906134d8565b60405180910390a3505050505050565b50505050565b82805461308990613b95565b90600052602060002090601f0160209004810192826130ab57600085556130f2565b82601f106130c457805160ff19168380011785556130f2565b828001600101855582156130f2579182015b828111156130f15782518255916020019190600101906130d6565b5b5090506130ff9190613103565b5090565b5b8082111561311c576000816000905550600101613104565b5090565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006131778261314c565b9050919050565b6131878161316c565b82525050565b6000613199838361317e565b60208301905092915050565b6000602082019050919050565b60006131bd82613120565b6131c7818561312b565b93506131d28361313c565b8060005b838110156132035781516131ea888261318d565b97506131f5836131a5565b9250506001810190506131d6565b5085935050505092915050565b6000602082019050818103600083015261322a81846131b2565b905092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561326c578082015181840152602081019050613251565b8381111561327b576000848401525b50505050565b6000601f19601f8301169050919050565b600061329d82613232565b6132a7818561323d565b93506132b781856020860161324e565b6132c081613281565b840191505092915050565b600060208201905081810360008301526132e58184613292565b905092915050565b6000604051905090565b600080fd5b600080fd5b61330a8161316c565b811461331557600080fd5b50565b60008135905061332781613301565b92915050565b6000819050919050565b6133408161332d565b811461334b57600080fd5b50565b60008135905061335d81613337565b92915050565b6000806040838503121561337a576133796132f7565b5b600061338885828601613318565b92505060206133998582860161334e565b9150509250929050565b60008115159050919050565b6133b8816133a3565b82525050565b60006020820190506133d360008301846133af565b92915050565b6000819050919050565b60006133fe6133f96133f48461314c565b6133d9565b61314c565b9050919050565b6000613410826133e3565b9050919050565b600061342282613405565b9050919050565b61343281613417565b82525050565b600060208201905061344d6000830184613429565b92915050565b6000819050919050565b61346681613453565b811461347157600080fd5b50565b6000813590506134838161345d565b92915050565b600080604083850312156134a05761349f6132f7565b5b60006134ae85828601613318565b92505060206134bf85828601613474565b9150509250929050565b6134d28161332d565b82525050565b60006020820190506134ed60008301846134c9565b92915050565b60008060006060848603121561350c5761350b6132f7565b5b600061351a86828701613318565b935050602061352b86828701613318565b925050604061353c8682870161334e565b9150509250925092565b600060ff82169050919050565b61355c81613546565b82525050565b60006020820190506135776000830184613553565b92915050565b600080600060608486031215613596576135956132f7565b5b60006135a486828701613318565b93505060206135b586828701613318565b92505060406135c686828701613474565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61361282613281565b810181811067ffffffffffffffff82111715613631576136306135da565b5b80604052505050565b60006136446132ed565b90506136508282613609565b919050565b600067ffffffffffffffff8211156136705761366f6135da565b5b61367982613281565b9050602081019050919050565b82818337600083830152505050565b60006136a86136a384613655565b61363a565b9050828152602081018484840111156136c4576136c36135d5565b5b6136cf848285613686565b509392505050565b600082601f8301126136ec576136eb6135d0565b5b81356136fc848260208601613695565b91505092915050565b600080600080600060a08688031215613721576137206132f7565b5b600061372f88828901613318565b955050602061374088828901613318565b94505060406137518882890161334e565b935050606086013567ffffffffffffffff811115613772576137716132fc565b5b61377e888289016136d7565b925050608086013567ffffffffffffffff81111561379f5761379e6132fc565b5b6137ab888289016136d7565b9150509295509295909350565b6000602082840312156137ce576137cd6132f7565b5b60006137dc84828501613318565b91505092915050565b6137ee8161316c565b82525050565b600060208201905061380960008301846137e5565b92915050565b600067ffffffffffffffff82111561382a576138296135da565b5b61383382613281565b9050602081019050919050565b600061385361384e8461380f565b61363a565b90508281526020810184848401111561386f5761386e6135d5565b5b61387a848285613686565b509392505050565b600082601f830112613897576138966135d0565b5b81356138a7848260208601613840565b91505092915050565b600080604083850312156138c7576138c66132f7565b5b60006138d585828601613318565b925050602083013567ffffffffffffffff8111156138f6576138f56132fc565b5b61390285828601613882565b9150509250929050565b600060208284031215613922576139216132f7565b5b600082013567ffffffffffffffff8111156139405761393f6132fc565b5b61394c84828501613882565b91505092915050565b60008060006060848603121561396e5761396d6132f7565b5b600061397c86828701613318565b935050602061398d8682870161334e565b925050604084013567ffffffffffffffff8111156139ae576139ad6132fc565b5b6139ba868287016136d7565b9150509250925092565b600080600080608085870312156139de576139dd6132f7565b5b60006139ec87828801613318565b94505060206139fd8782880161334e565b9350506040613a0e87828801613474565b9250506060613a1f87828801613318565b91505092959194509250565b60008060408385031215613a4257613a416132f7565b5b6000613a5085828601613318565b9250506020613a6185828601613318565b9150509250929050565b60008060008060808587031215613a8557613a846132f7565b5b6000613a9387828801613318565b9450506020613aa48782880161334e565b935050604085013567ffffffffffffffff811115613ac557613ac46132fc565b5b613ad1878288016136d7565b925050606085013567ffffffffffffffff811115613af257613af16132fc565b5b613afe878288016136d7565b91505092959194509250565b60008060408385031215613b2157613b206132f7565b5b6000613b2f8582860161334e565b925050602083013567ffffffffffffffff811115613b5057613b4f6132fc565b5b613b5c858286016136d7565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613bad57607f821691505b60208210811415613bc157613bc0613b66565b5b50919050565b7f4552433737373a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613c2360248361323d565b9150613c2e82613bc7565b604082019050919050565b60006020820190508181036000830152613c5281613c16565b9050919050565b7f4552433737373a207472616e736665722066726f6d20746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613cb560268361323d565b9150613cc082613c59565b604082019050919050565b60006020820190508181036000830152613ce481613ca8565b9050919050565b7f4552433737373a207472616e7366657220616d6f756e7420657863656564732060008201527f616c6c6f77616e63650000000000000000000000000000000000000000000000602082015250565b6000613d4760298361323d565b9150613d5282613ceb565b604082019050919050565b60006020820190508181036000830152613d7681613d3a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613db78261332d565b9150613dc28361332d565b925082821015613dd557613dd4613d7d565b5b828203905092915050565b7f4f6e6c7920617661696c61626c6520666f72206d617374657220636f696e0000600082015250565b6000613e16601e8361323d565b9150613e2182613de0565b602082019050919050565b60006020820190508181036000830152613e4581613e09565b9050919050565b7f4e6f20616d6f756e74206c6f636b6564207769746820676976656e2068617368600082015250565b6000613e8260208361323d565b9150613e8d82613e4c565b602082019050919050565b60006020820190508181036000830152613eb181613e75565b9050919050565b7f4e6f74206c6f636b656420627920746869732061646472657373000000000000600082015250565b6000613eee601a8361323d565b9150613ef982613eb8565b602082019050919050565b60006020820190508181036000830152613f1d81613ee1565b9050919050565b7f4552433737373a2063616c6c6572206973206e6f7420616e206f70657261746f60008201527f7220666f7220686f6c6465720000000000000000000000000000000000000000602082015250565b6000613f80602c8361323d565b9150613f8b82613f24565b604082019050919050565b60006020820190508181036000830152613faf81613f73565b9050919050565b600081519050613fc581613301565b92915050565b600060208284031215613fe157613fe06132f7565b5b6000613fef84828501613fb6565b91505092915050565b61400181613453565b82525050565b600060608201905061401c60008301866137e5565b61402960208301856137e5565b6140366040830184613ff8565b949350505050565b7f4552433737373a20617574686f72697a696e672073656c66206173206f70657260008201527f61746f7200000000000000000000000000000000000000000000000000000000602082015250565b600061409a60248361323d565b91506140a58261403e565b604082019050919050565b600060208201905081810360008301526140c98161408d565b9050919050565b7f416d6f756e74206c6f636b65642077697468207468652073616d652068617368600082015250565b600061410660208361323d565b9150614111826140d0565b602082019050919050565b60006020820190508181036000830152614135816140f9565b9050919050565b600060408201905061415160008301856137e5565b61415e6020830184613ff8565b9392505050565b7f4552433737373a207265766f6b696e672073656c66206173206f70657261746f60008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006141c160218361323d565b91506141cc82614165565b604082019050919050565b600060208201905081810360008301526141f0816141b4565b9050919050565b7f4552433737373a20617070726f76652066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061425360258361323d565b915061425e826141f7565b604082019050919050565b6000602082019050818103600083015261428281614246565b9050919050565b7f4552433737373a20617070726f766520746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006142e560238361323d565b91506142f082614289565b604082019050919050565b60006020820190508181036000830152614314816142d8565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006143428261431b565b61434c8185614326565b935061435c81856020860161324e565b61436581613281565b840191505092915050565b600060c08201905061438560008301896137e5565b61439260208301886137e5565b61439f60408301876137e5565b6143ac60608301866134c9565b81810360808301526143be8185614337565b905081810360a08301526143d28184614337565b9050979650505050505050565b7f4552433737373a207472616e7366657220616d6f756e7420657863656564732060008201527f62616c616e636500000000000000000000000000000000000000000000000000602082015250565b600061443b60278361323d565b9150614446826143df565b604082019050919050565b6000602082019050818103600083015261446a8161442e565b9050919050565b600061447c8261332d565b91506144878361332d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156144bc576144bb613d7d565b5b828201905092915050565b60006060820190506144dc60008301866134c9565b81810360208301526144ee8185614337565b905081810360408301526145028184614337565b9050949350505050565b7f4552433737373a20746f6b656e20726563697069656e7420636f6e747261637460008201527f20686173206e6f20696d706c656d656e74657220666f7220455243373737546f60208201527f6b656e73526563697069656e7400000000000000000000000000000000000000604082015250565b600061458e604d8361323d565b91506145998261450c565b606082019050919050565b600060208201905081810360008301526145bd81614581565b9050919050565b7f4552433737373a206275726e2066726f6d20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061462060228361323d565b915061462b826145c4565b604082019050919050565b6000602082019050818103600083015261464f81614613565b9050919050565b7f4552433737373a206275726e20616d6f756e7420657863656564732062616c6160008201527f6e63650000000000000000000000000000000000000000000000000000000000602082015250565b60006146b260238361323d565b91506146bd82614656565b604082019050919050565b600060208201905081810360008301526146e1816146a5565b9050919050565b7f4552433737373a2073656e642066726f6d20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061474460228361323d565b915061474f826146e8565b604082019050919050565b6000602082019050818103600083015261477381614737565b9050919050565b7f4552433737373a2073656e6420746f20746865207a65726f2061646472657373600082015250565b60006147b060208361323d565b91506147bb8261477a565b602082019050919050565b600060208201905081810360008301526147df816147a3565b9050919050565b7f556e6c6f636b20746f207472616e7366657261626c6520636f696e0000000000600082015250565b600061481c601b8361323d565b9150614827826147e6565b602082019050919050565b6000602082019050818103600083015261484b8161480f565b9050919050565b7f4552433737373a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061488860208361323d565b915061489382614852565b602082019050919050565b600060208201905081810360008301526148b78161487b565b905091905056fea2646970667358221220d8b96515f9fb0bfe3d9751968ebb1c42a45d8245099fd8e714ef170f6f70d32864736f6c634300080c0033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101e55760003560e01c8063896b9ad01161010f578063c92b4b5a116100a2578063dd62ed3e11610071578063dd62ed3e1461057c578063fad8b32a146105ac578063fc673c4f146105c8578063fe9d9303146105e4576101e5565b8063c92b4b5a146104f4578063ca3369c614610512578063ca5c7b911461052e578063d95b63711461054c576101e5565b80639bd9bbc6116100de5780639bd9bbc61461045c578063a9059cbb14610478578063a96ce7aa146104a8578063bc101571146104c4576101e5565b8063896b9ad0146103ea578063931fe6ee14610406578063959b8c3f1461042257806395d89b411461043e576101e5565b8063449b97161161018757806370a082311161015657806370a082311461036457806378d28bd7146103945780638078f338146103b0578063893d20e8146103cc576101e5565b8063449b9716146102de578063556f0dc7146102fa578063593557361461031857806362ad1b8314610348576101e5565b806318160ddd116101c357806318160ddd1461025657806323b872dd14610274578063313ce567146102a45780633e48eba9146102c2576101e5565b806306e48538146101ea57806306fdde0314610208578063095ea7b314610226575b600080fd5b6101f2610600565b6040516101ff9190613c5c565b60405180910390f35b61021061068e565b60405161021d9190613d17565b60405180910390f35b610240600480360381019061023b9190613daf565b610720565b60405161024d9190613e0a565b60405180910390f35b61025e610743565b60405161026b9190613e34565b60405180910390f35b61028e60048036038101906102899190613e4f565b61074d565b60405161029b9190613e0a565b60405180910390f35b6102ac6109a7565b6040516102b99190613ebe565b60405180910390f35b6102dc60048036038101906102d791906140af565b6109b0565b005b6102f860048036038101906102f391906141a0565b610db6565b005b6103026110d1565b60405161030f9190613e34565b60405180910390f35b610332600480360381019061032d9190614265565b6110da565b60405161033f9190613e34565b60405180910390f35b610362600480360381019061035d9190614292565b611123565b005b61037e60048036038101906103799190614265565b611189565b60405161038b9190613e34565b60405180910390f35b6103ae60048036038101906103a99190614345565b6111d1565b005b6103ca60048036038101906103c59190614385565b611589565b005b6103d461192e565b6040516103e19190614463565b60405180910390f35b61040460048036038101906103ff919061447e565b611958565b005b610420600480360381019061041b91906144d1565b611d13565b005b61043c60048036038101906104379190614265565b61204a565b005b6104466122ab565b6040516104539190613d17565b60405180910390f35b6104766004803603810190610471919061452d565b61233d565b005b610492600480360381019061048d9190613daf565b612367565b60405161049f9190613e0a565b60405180910390f35b6104c260048036038101906104bd919061459c565b612475565b005b6104de60048036038101906104d99190614345565b6127a9565b6040516104eb9190613e34565b60405180910390f35b6104fc612851565b6040516105099190614644565b60405180910390f35b61052c6004803603810190610527919061465f565b612877565b005b610536612b5d565b6040516105439190613e34565b60405180910390f35b610566600480360381019061056191906146b2565b612b63565b6040516105739190613e0a565b60405180910390f35b610596600480360381019061059191906146b2565b612d14565b6040516105a39190613e34565b60405180910390f35b6105c660048036038101906105c19190614265565b612d9b565b005b6105e260048036038101906105dd91906146f2565b612ffc565b005b6105fe60048036038101906105f99190614791565b61305e565b005b6060600480548060200260200160405190810160405280929190818152602001828054801561068457602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161063a575b5050505050905090565b60606002805461069d9061481c565b80601f01602080910402602001604051908101604052809291908181526020018280546106c99061481c565b80156107165780601f106106eb57610100808354040283529160200191610716565b820191906000526020600020905b8154815290600101906020018083116106f957829003601f168201915b5050505050905090565b60008061072b613097565b905061073881858561309f565b600191505092915050565b6000600154905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b5906148c0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561082e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082590614952565b60405180910390fd5b6000610838613097565b905061086681868686604051806020016040528060008152506040518060200160405280600081525061326a565b6108928186868660405180602001604052806000815250604051806020016040528060008152506133d1565b6000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015610956576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094d906149e4565b60405180910390fd5b61096c868386846109679190614a33565b61309f565b61099a82878787604051806020016040528060008152506040518060200160405280600081525060006135eb565b6001925050509392505050565b60006012905090565b600083805190602001209050610a6a6109c7613097565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b68f53a788856040518363ffffffff1660e01b8152600401610a24929190614a76565b602060405180830381865afa158015610a41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a659190614ab4565b612b63565b610aa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa090614b53565b60405180910390fd5b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bb82753e87846040518363ffffffff1660e01b8152600401610b08929190614a76565b6020604051808303816000875af1158015610b27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4b9190614b88565b905080600b541015610b92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8990614c01565b60405180910390fd5b80600c60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610c14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0b90614c01565b60405180910390fd5b610c23308783878760016137f3565b80600b6000828254610c359190614a33565b9250508190555080600c60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c8b9190614a33565b92505081905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231876040518263ffffffff1660e01b8152600401610ced9190614463565b602060405180830381865afa158015610d0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2e9190614b88565b600c60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610dae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da590614c6d565b60405180910390fd5b505050505050565b610dc7610dc1613097565b87612b63565b610e06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfd90614b53565b60405180910390fd5b6000610e1187611189565b905084811015610e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4d90614cd9565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639eb4b70e8787878b6040518563ffffffff1660e01b8152600401610eb79493929190614cf9565b600060405180830381600087803b158015610ed157600080fd5b505af1158015610ee5573d6000803e3d6000fd5b50505050610ef8873087868660016137f3565b84600b6000828254610f0a9190614d3e565b9250508190555084600c60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610f609190614d3e565b9250508190555084600b541015610fac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa390614de0565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231876040518263ffffffff1660e01b81526004016110079190614463565b602060405180830381865afa158015611024573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110489190614b88565b600c60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146110c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bf90614c6d565b60405180910390fd5b50505050505050565b60006001905090565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61113461112e613097565b86612b63565b611173576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116a90614b53565b60405180910390fd5b611182858585858560016137f3565b5050505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611261576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125890614e72565b60405180910390fd5b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bb82753e84846040518363ffffffff1660e01b81526004016112c0929190614a76565b6020604051808303816000875af11580156112df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113039190614b88565b905080600b54101561134a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134190614c01565b60405180910390fd5b80600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156113cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c390614c01565b60405180910390fd5b6113f9308483604051806020016040528060008152506040518060200160405280600081525060006137f3565b80600b600082825461140b9190614a33565b9250508190555080600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114619190614a33565b92505081905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b81526004016114c39190614463565b602060405180830381865afa1580156114e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115049190614b88565b600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611584576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157b90614c6d565b60405180910390fd5b505050565b6000838051906020012090506115a66115a0613097565b87612b63565b6115e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115dc90614b53565b60405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561161e57600080fd5b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663496b73db8888856040518463ffffffff1660e01b815260040161167f93929190614e92565b6020604051808303816000875af115801561169e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116c29190614b88565b905080600b541015611709576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170090614c01565b60405180910390fd5b80600c60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561178b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178290614c01565b60405180910390fd5b61179a308883878760016137f3565b80600b60008282546117ac9190614a33565b9250508190555080600c60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118029190614a33565b92505081905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231876040518263ffffffff1660e01b81526004016118649190614463565b602060405180830381865afa158015611881573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a59190614b88565b600c60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611925576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191c90614c6d565b60405180910390fd5b50505050505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119df90614e72565b60405180910390fd5b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663496b73db8585856040518463ffffffff1660e01b8152600401611a4993929190614e92565b6020604051808303816000875af1158015611a68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a8c9190614b88565b905080600b541015611ad3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aca90614c01565b60405180910390fd5b80600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015611b55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4c90614c01565b60405180910390fd5b611b82308583604051806020016040528060008152506040518060200160405280600081525060006137f3565b80600b6000828254611b949190614a33565b9250508190555080600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611bea9190614a33565b92505081905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401611c4c9190614463565b602060405180830381865afa158015611c69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c8d9190614b88565b600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611d0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0490614c6d565b60405180910390fd5b50505050565b6000818051906020012090506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663496b73db3386856040518463ffffffff1660e01b8152600401611d8093929190614e92565b6020604051808303816000875af1158015611d9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc39190614b88565b905080600b541015611e0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0190614c01565b60405180910390fd5b80600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015611e8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8390614c01565b60405180910390fd5b611eb9303383604051806020016040528060008152506040518060200160405280600081525060006137f3565b80600b6000828254611ecb9190614a33565b9250508190555080600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f219190614a33565b92505081905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401611f839190614463565b602060405180830381865afa158015611fa0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fc49190614b88565b600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414612044576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203b90614c6d565b60405180910390fd5b50505050565b8073ffffffffffffffffffffffffffffffffffffffff16612069613097565b73ffffffffffffffffffffffffffffffffffffffff1614156120c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b790614f3b565b60405180910390fd5b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156121aa576007600061211e613097565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055612247565b6001600660006121b8613097565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b61224f613097565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167ff4caeb2d6ca8932a215a353d0703c326ec2d81fc68170f320eb2ab49e9df61f960405160405180910390a350565b6060600380546122ba9061481c565b80601f01602080910402602001604051908101604052809291908181526020018280546122e69061481c565b80156123335780601f1061230857610100808354040283529160200191612333565b820191906000526020600020905b81548152906001019060200180831161231657829003601f168201915b5050505050905090565b612362612348613097565b8484846040518060200160405280600081525060016137f3565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156123d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cf906148c0565b60405180910390fd5b60006123e2613097565b905061241081828686604051806020016040528060008152506040518060200160405280600081525061326a565b61243c8182868660405180602001604052806000815250604051806020016040528060008152506133d1565b61246a81828686604051806020016040528060008152506040518060200160405280600081525060006135eb565b600191505092915050565b6000818051906020012090506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bb82753e33846040518363ffffffff1660e01b81526004016124e0929190614a76565b6020604051808303816000875af11580156124ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125239190614b88565b905080600b54101561256a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256190614c01565b60405180910390fd5b80600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156125ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e390614c01565b60405180910390fd5b612619303383604051806020016040528060008152506040518060200160405280600081525060006137f3565b80600b600082825461262b9190614a33565b9250508190555080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126819190614a33565b92505081905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016126e39190614463565b602060405180830381865afa158015612700573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127249190614b88565b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146127a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279b90614c6d565b60405180910390fd5b505050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bc10157184846040518363ffffffff1660e01b8152600401612808929190614a76565b602060405180830381865afa158015612825573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128499190614b88565b905092915050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061288233611189565b9050828110156128c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128be90614cd9565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639eb4b70e858585336040518563ffffffff1660e01b81526004016129289493929190614cf9565b600060405180830381600087803b15801561294257600080fd5b505af1158015612956573d6000803e3d6000fd5b50505050612987333085604051806020016040528060008152506040518060200160405280600081525060006137f3565b82600b60008282546129999190614d3e565b9250508190555082600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129ef9190614d3e565b9250508190555082600b541015612a3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3290614de0565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401612a969190614463565b602060405180830381865afa158015612ab3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ad79190614b88565b600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414612b57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4e90614c6d565b60405180910390fd5b50505050565b600b5481565b60008173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480612c7b5750600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612c7a5750600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b5b80612d0c5750600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b905092915050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b612da3613097565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612e11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0890614fcd565b60405180910390fd5b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612f0457600160076000612e71613097565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612f98565b60066000612f10613097565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690555b612fa0613097565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f50546e66e5f44d728365dc3908c63bc5cfeeab470722c1677e3073a6ac294aa160405160405180910390a350565b61300d613007613097565b85612b63565b61304c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161304390614b53565b60405180910390fd5b61305884848484613913565b50505050565b613080613069613097565b838360405180602001604052806000815250613913565b5050565b600080823b905060008111915050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561310f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131069061505f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561317f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613176906150f1565b60405180910390fd5b80600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161325d9190613e34565b60405180910390a3505050565b6000731820a4b7618bde71dce8cdc73aab6c95905fad2473ffffffffffffffffffffffffffffffffffffffff1663aabbb8ca877f29ddb589b1fb5fc7cf394961c1adf5f8c6454761adf795e67fe149f658abe8956040518363ffffffff1660e01b81526004016132db929190614a76565b602060405180830381865afa1580156132f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061331c9190614ab4565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146133c8578073ffffffffffffffffffffffffffffffffffffffff166375ab97828888888888886040518763ffffffff1660e01b815260040161339596959493929190615166565b600060405180830381600087803b1580156133af57600080fd5b505af11580156133c3573d6000803e3d6000fd5b505050505b50505050505050565b6133dd86868686613b66565b60008060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015613463576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161345a90615247565b60405180910390fd5b8381036000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550836000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134f69190614d3e565b925050819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f06b541ddaa720db2b10a4d0cdac39b8d360425fc073085fac19bc8261467798787878760405161357593929190615267565b60405180910390a48473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516135da9190613e34565b60405180910390a350505050505050565b6000731820a4b7618bde71dce8cdc73aab6c95905fad2473ffffffffffffffffffffffffffffffffffffffff1663aabbb8ca877fb281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b6040518363ffffffff1660e01b815260040161365c929190614a76565b602060405180830381865afa158015613679573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061369d9190614ab4565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461374c578073ffffffffffffffffffffffffffffffffffffffff166223de298989898989896040518763ffffffff1660e01b815260040161371596959493929190615166565b600060405180830381600087803b15801561372f57600080fd5b505af1158015613743573d6000803e3d6000fd5b505050506137e9565b81156137e8576137718673ffffffffffffffffffffffffffffffffffffffff16613084565b15806137a857503073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b6137e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137de90615344565b60405180910390fd5b5b5b5050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415613863576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161385a906153d6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156138d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138ca90615442565b60405180910390fd5b60006138dd613097565b90506138ed81888888888861326a565b6138fb8188888888886133d1565b61390a818888888888886135eb565b50505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613983576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161397a906154d4565b60405180910390fd5b600061398d613097565b905061399e8186600087878761326a565b6139ab8186600087613b66565b60008060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905084811015613a31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a2890615566565b60405180910390fd5b8481036000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508460016000828254613a889190614a33565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fa78a9be3a7b862d26933ad85fb11d80ef66b8f972d7cbba06621d583943a4098878787604051613af093929190615267565b60405180910390a3600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef87604051613b569190613e34565b60405180910390a3505050505050565b50505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613bc382613b98565b9050919050565b613bd381613bb8565b82525050565b6000613be58383613bca565b60208301905092915050565b6000602082019050919050565b6000613c0982613b6c565b613c138185613b77565b9350613c1e83613b88565b8060005b83811015613c4f578151613c368882613bd9565b9750613c4183613bf1565b925050600181019050613c22565b5085935050505092915050565b60006020820190508181036000830152613c768184613bfe565b905092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613cb8578082015181840152602081019050613c9d565b83811115613cc7576000848401525b50505050565b6000601f19601f8301169050919050565b6000613ce982613c7e565b613cf38185613c89565b9350613d03818560208601613c9a565b613d0c81613ccd565b840191505092915050565b60006020820190508181036000830152613d318184613cde565b905092915050565b6000604051905090565b600080fd5b600080fd5b613d5681613bb8565b8114613d6157600080fd5b50565b600081359050613d7381613d4d565b92915050565b6000819050919050565b613d8c81613d79565b8114613d9757600080fd5b50565b600081359050613da981613d83565b92915050565b60008060408385031215613dc657613dc5613d43565b5b6000613dd485828601613d64565b9250506020613de585828601613d9a565b9150509250929050565b60008115159050919050565b613e0481613def565b82525050565b6000602082019050613e1f6000830184613dfb565b92915050565b613e2e81613d79565b82525050565b6000602082019050613e496000830184613e25565b92915050565b600080600060608486031215613e6857613e67613d43565b5b6000613e7686828701613d64565b9350506020613e8786828701613d64565b9250506040613e9886828701613d9a565b9150509250925092565b600060ff82169050919050565b613eb881613ea2565b82525050565b6000602082019050613ed36000830184613eaf565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613f1b82613ccd565b810181811067ffffffffffffffff82111715613f3a57613f39613ee3565b5b80604052505050565b6000613f4d613d39565b9050613f598282613f12565b919050565b600067ffffffffffffffff821115613f7957613f78613ee3565b5b613f8282613ccd565b9050602081019050919050565b82818337600083830152505050565b6000613fb1613fac84613f5e565b613f43565b905082815260208101848484011115613fcd57613fcc613ede565b5b613fd8848285613f8f565b509392505050565b600082601f830112613ff557613ff4613ed9565b5b8135614005848260208601613f9e565b91505092915050565b600067ffffffffffffffff82111561402957614028613ee3565b5b61403282613ccd565b9050602081019050919050565b600061405261404d8461400e565b613f43565b90508281526020810184848401111561406e5761406d613ede565b5b614079848285613f8f565b509392505050565b600082601f83011261409657614095613ed9565b5b81356140a684826020860161403f565b91505092915050565b600080600080608085870312156140c9576140c8613d43565b5b60006140d787828801613d64565b945050602085013567ffffffffffffffff8111156140f8576140f7613d48565b5b61410487828801613fe0565b935050604085013567ffffffffffffffff81111561412557614124613d48565b5b61413187828801614081565b925050606085013567ffffffffffffffff81111561415257614151613d48565b5b61415e87828801614081565b91505092959194509250565b6000819050919050565b61417d8161416a565b811461418857600080fd5b50565b60008135905061419a81614174565b92915050565b60008060008060008060c087890312156141bd576141bc613d43565b5b60006141cb89828a01613d64565b96505060206141dc89828a01613d64565b95505060406141ed89828a01613d9a565b94505060606141fe89828a0161418b565b935050608087013567ffffffffffffffff81111561421f5761421e613d48565b5b61422b89828a01614081565b92505060a087013567ffffffffffffffff81111561424c5761424b613d48565b5b61425889828a01614081565b9150509295509295509295565b60006020828403121561427b5761427a613d43565b5b600061428984828501613d64565b91505092915050565b600080600080600060a086880312156142ae576142ad613d43565b5b60006142bc88828901613d64565b95505060206142cd88828901613d64565b94505060406142de88828901613d9a565b935050606086013567ffffffffffffffff8111156142ff576142fe613d48565b5b61430b88828901614081565b925050608086013567ffffffffffffffff81111561432c5761432b613d48565b5b61433888828901614081565b9150509295509295909350565b6000806040838503121561435c5761435b613d43565b5b600061436a85828601613d64565b925050602061437b8582860161418b565b9150509250929050565b600080600080600060a086880312156143a1576143a0613d43565b5b60006143af88828901613d64565b95505060206143c088828901613d64565b945050604086013567ffffffffffffffff8111156143e1576143e0613d48565b5b6143ed88828901613fe0565b935050606086013567ffffffffffffffff81111561440e5761440d613d48565b5b61441a88828901614081565b925050608086013567ffffffffffffffff81111561443b5761443a613d48565b5b61444788828901614081565b9150509295509295909350565b61445d81613bb8565b82525050565b60006020820190506144786000830184614454565b92915050565b60008060006060848603121561449757614496613d43565b5b60006144a586828701613d64565b93505060206144b686828701613d64565b92505060406144c78682870161418b565b9150509250925092565b600080604083850312156144e8576144e7613d43565b5b60006144f685828601613d64565b925050602083013567ffffffffffffffff81111561451757614516613d48565b5b61452385828601613fe0565b9150509250929050565b60008060006060848603121561454657614545613d43565b5b600061455486828701613d64565b935050602061456586828701613d9a565b925050604084013567ffffffffffffffff81111561458657614585613d48565b5b61459286828701614081565b9150509250925092565b6000602082840312156145b2576145b1613d43565b5b600082013567ffffffffffffffff8111156145d0576145cf613d48565b5b6145dc84828501613fe0565b91505092915050565b6000819050919050565b600061460a61460561460084613b98565b6145e5565b613b98565b9050919050565b600061461c826145ef565b9050919050565b600061462e82614611565b9050919050565b61463e81614623565b82525050565b60006020820190506146596000830184614635565b92915050565b60008060006060848603121561467857614677613d43565b5b600061468686828701613d64565b935050602061469786828701613d9a565b92505060406146a88682870161418b565b9150509250925092565b600080604083850312156146c9576146c8613d43565b5b60006146d785828601613d64565b92505060206146e885828601613d64565b9150509250929050565b6000806000806080858703121561470c5761470b613d43565b5b600061471a87828801613d64565b945050602061472b87828801613d9a565b935050604085013567ffffffffffffffff81111561474c5761474b613d48565b5b61475887828801614081565b925050606085013567ffffffffffffffff81111561477957614778613d48565b5b61478587828801614081565b91505092959194509250565b600080604083850312156147a8576147a7613d43565b5b60006147b685828601613d9a565b925050602083013567ffffffffffffffff8111156147d7576147d6613d48565b5b6147e385828601614081565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061483457607f821691505b60208210811415614848576148476147ed565b5b50919050565b7f4552433737373a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006148aa602483613c89565b91506148b58261484e565b604082019050919050565b600060208201905081810360008301526148d98161489d565b9050919050565b7f4552433737373a207472616e736665722066726f6d20746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061493c602683613c89565b9150614947826148e0565b604082019050919050565b6000602082019050818103600083015261496b8161492f565b9050919050565b7f4552433737373a207472616e7366657220616d6f756e7420657863656564732060008201527f616c6c6f77616e63650000000000000000000000000000000000000000000000602082015250565b60006149ce602983613c89565b91506149d982614972565b604082019050919050565b600060208201905081810360008301526149fd816149c1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614a3e82613d79565b9150614a4983613d79565b925082821015614a5c57614a5b614a04565b5b828203905092915050565b614a708161416a565b82525050565b6000604082019050614a8b6000830185614454565b614a986020830184614a67565b9392505050565b600081519050614aae81613d4d565b92915050565b600060208284031215614aca57614ac9613d43565b5b6000614ad884828501614a9f565b91505092915050565b7f4552433737373a2063616c6c6572206973206e6f7420616e206f70657261746f60008201527f7220666f7220686f6c6465720000000000000000000000000000000000000000602082015250565b6000614b3d602c83613c89565b9150614b4882614ae1565b604082019050919050565b60006020820190508181036000830152614b6c81614b30565b9050919050565b600081519050614b8281613d83565b92915050565b600060208284031215614b9e57614b9d613d43565b5b6000614bac84828501614b73565b91505092915050565b7f42616c616e63657320617265206e6f7420696e2073796e630000000000000000600082015250565b6000614beb601883613c89565b9150614bf682614bb5565b602082019050919050565b60006020820190508181036000830152614c1a81614bde565b9050919050565b7f42616c616e63657320646964206e6f742073796e630000000000000000000000600082015250565b6000614c57601583613c89565b9150614c6282614c21565b602082019050919050565b60006020820190508181036000830152614c8681614c4a565b9050919050565b7f4552433737373a20616d6f756e7420657863656564732062616c616e63650000600082015250565b6000614cc3601e83613c89565b9150614cce82614c8d565b602082019050919050565b60006020820190508181036000830152614cf281614cb6565b9050919050565b6000608082019050614d0e6000830187614454565b614d1b6020830186613e25565b614d286040830185614a67565b614d356060830184614454565b95945050505050565b6000614d4982613d79565b9150614d5483613d79565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614d8957614d88614a04565b5b828201905092915050565b7f4d617468206973206e6f74206f6b000000000000000000000000000000000000600082015250565b6000614dca600e83613c89565b9150614dd582614d94565b602082019050919050565b60006020820190508181036000830152614df981614dbd565b9050919050565b7f4f6e6c79206176616c6961626c6520666f7220746865206c6f636b656420636f60008201527f696e20636f6e7472616374000000000000000000000000000000000000000000602082015250565b6000614e5c602b83613c89565b9150614e6782614e00565b604082019050919050565b60006020820190508181036000830152614e8b81614e4f565b9050919050565b6000606082019050614ea76000830186614454565b614eb46020830185614454565b614ec16040830184614a67565b949350505050565b7f4552433737373a20617574686f72697a696e672073656c66206173206f70657260008201527f61746f7200000000000000000000000000000000000000000000000000000000602082015250565b6000614f25602483613c89565b9150614f3082614ec9565b604082019050919050565b60006020820190508181036000830152614f5481614f18565b9050919050565b7f4552433737373a207265766f6b696e672073656c66206173206f70657261746f60008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000614fb7602183613c89565b9150614fc282614f5b565b604082019050919050565b60006020820190508181036000830152614fe681614faa565b9050919050565b7f4552433737373a20617070726f76652066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000615049602583613c89565b915061505482614fed565b604082019050919050565b600060208201905081810360008301526150788161503c565b9050919050565b7f4552433737373a20617070726f766520746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006150db602383613c89565b91506150e68261507f565b604082019050919050565b6000602082019050818103600083015261510a816150ce565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061513882615111565b615142818561511c565b9350615152818560208601613c9a565b61515b81613ccd565b840191505092915050565b600060c08201905061517b6000830189614454565b6151886020830188614454565b6151956040830187614454565b6151a26060830186613e25565b81810360808301526151b4818561512d565b905081810360a08301526151c8818461512d565b9050979650505050505050565b7f4552433737373a207472616e7366657220616d6f756e7420657863656564732060008201527f62616c616e636500000000000000000000000000000000000000000000000000602082015250565b6000615231602783613c89565b915061523c826151d5565b604082019050919050565b6000602082019050818103600083015261526081615224565b9050919050565b600060608201905061527c6000830186613e25565b818103602083015261528e818561512d565b905081810360408301526152a2818461512d565b9050949350505050565b7f4552433737373a20746f6b656e20726563697069656e7420636f6e747261637460008201527f20686173206e6f20696d706c656d656e74657220666f7220455243373737546f60208201527f6b656e73526563697069656e7400000000000000000000000000000000000000604082015250565b600061532e604d83613c89565b9150615339826152ac565b606082019050919050565b6000602082019050818103600083015261535d81615321565b9050919050565b7f4552433737373a2073656e642066726f6d20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006153c0602283613c89565b91506153cb82615364565b604082019050919050565b600060208201905081810360008301526153ef816153b3565b9050919050565b7f4552433737373a2073656e6420746f20746865207a65726f2061646472657373600082015250565b600061542c602083613c89565b9150615437826153f6565b602082019050919050565b6000602082019050818103600083015261545b8161541f565b9050919050565b7f4552433737373a206275726e2066726f6d20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006154be602283613c89565b91506154c982615462565b604082019050919050565b600060208201905081810360008301526154ed816154b1565b9050919050565b7f4552433737373a206275726e20616d6f756e7420657863656564732062616c6160008201527f6e63650000000000000000000000000000000000000000000000000000000000602082015250565b6000615550602383613c89565b915061555b826154f4565b604082019050919050565b6000602082019050818103600083015261557f81615543565b905091905056fea2646970667358221220799d205c940f729190a92fd02fdb68307d97c741aa4b11cec0de40e3406545fb64736f6c634300080c0033

Deployed Bytecode Sourcemap

4082:6124:8:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6718:130:2;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2916:98;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8307:197;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3709:123;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8878:806;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3356:82;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6975:754:8;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5445:717;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3553:95:2;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5312:121:8;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6967:366:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3932:150;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9596:607:8;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6174:789;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4488:88;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8342:633;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7741:589;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5773:412:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3070:102;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4212:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4636:439;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8987:597:8;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5153:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4119:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4588:553;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4189:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5395:311:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8018:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6249:403;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7454:325;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5205:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6718:130;6784:16;6819:22;6812:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6718:130;:::o;2916:98::-;2970:13;3002:5;2995:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2916:98;:::o;8307:197::-;8389:4;8405:14;8422:12;:10;:12::i;:::-;8405:29;;8444:32;8453:6;8461:7;8470:5;8444:8;:32::i;:::-;8493:4;8486:11;;;8307:197;;;;:::o;3709:123::-;3787:7;3813:12;;3806:19;;3709:123;:::o;8878:806::-;9014:4;9059:1;9038:23;;:9;:23;;;;9030:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;9138:1;9120:20;;:6;:20;;;;9112:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;9194:15;9212:12;:10;:12::i;:::-;9194:30;;9235:61;9253:7;9262:6;9270:9;9281:6;9235:61;;;;;;;;;;;;;;;;;;;;;;;;:17;:61::i;:::-;9307:49;9313:7;9322:6;9330:9;9341:6;9307:49;;;;;;;;;;;;;;;;;;;;;;;;:5;:49::i;:::-;9367:24;9394:11;:19;9406:6;9394:19;;;;;;;;;;;;;;;:28;9414:7;9394:28;;;;;;;;;;;;;;;;9367:55;;9460:6;9440:16;:26;;9432:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;9522:52;9531:6;9539:7;9567:6;9548:16;:25;;;;:::i;:::-;9522:8;:52::i;:::-;9585:70;9605:7;9614:6;9622:9;9633:6;9585:70;;;;;;;;;;;;;;;;;;;;;;;;9649:5;9585:19;:70::i;:::-;9673:4;9666:11;;;;8878:806;;;;;:::o;3356:82::-;3405:5;3429:2;3422:9;;3356:82;:::o;6975:754:8:-;7107:12;7138:14;7122:32;;;;;;7107:47;;7173:58;7187:12;:10;:12::i;:::-;7201:10;;;;;;;;;;;:19;;;7221:2;7225:4;7201:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7173:13;:58::i;:::-;7165:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;7291:14;7308:10;;;;;;;;;;;:21;;;7330:2;7334:4;7308:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7291:48;;7374:6;7358:12;;:22;;7350:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;7451:6;7428:15;:19;7444:2;7428:19;;;;;;;;;;;;;;;;:29;;7420:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;7497:58;7511:4;7518:2;7522:6;7530:4;7536:12;7550:4;7497:5;:58::i;:::-;7582:6;7566:12;;:22;;;;;;;:::i;:::-;;;;;;;;7623:6;7600:15;:19;7616:2;7600:19;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;7671:10;;;;;;;;;;;:20;;;7692:2;7671:24;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7648:15;:19;7664:2;7648:19;;;;;;;;;;;;;;;;:47;7640:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;7096:633;;6975:754;;;;:::o;5445:717::-;5597:33;5611:12;:10;:12::i;:::-;5625:4;5597:13;:33::i;:::-;5589:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;5690:19;5712:15;5722:4;5712:9;:15::i;:::-;5690:37;;5761:6;5746:11;:21;;5738:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;5813:10;;;;;;;;;;;:21;;;5835:2;5839:6;5847:4;5853;5813:45;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5869:60;5875:4;5889;5896:6;5904:4;5910:12;5924:4;5869:5;:60::i;:::-;5956:6;5940:12;;:22;;;;;;;:::i;:::-;;;;;;;;5996:6;5973:15;:19;5989:2;5973:19;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;6037:6;6021:12;;:22;;6013:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;6104:10;;;;;;;;;;;:20;;;6125:2;6104:24;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6081:15;:19;6097:2;6081:19;;;;;;;;;;;;;;;;:47;6073:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;5578:584;5445:717;;;;;;:::o;3553:95:2:-;3614:7;3640:1;3633:8;;3553:95;:::o;5312:121:8:-;5375:7;5401:15;:24;5417:7;5401:24;;;;;;;;;;;;;;;;5394:31;;5312:121;;;:::o;6967:366:2:-;7174:35;7188:12;:10;:12::i;:::-;7202:6;7174:13;:35::i;:::-;7166:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;7268:58;7274:6;7282:9;7293:6;7301:4;7307:12;7321:4;7268:5;:58::i;:::-;6967:366;;;;;:::o;3932:150::-;4027:7;4053:9;:22;4063:11;4053:22;;;;;;;;;;;;;;;;4046:29;;3932:150;;;:::o;9596:607:8:-;9706:10;;;;;;;;;;;9684:33;;:10;:33;;;9676:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;9776:14;9793:10;;;;;;;;;;;:21;;;9815:2;9819:4;9793:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9776:48;;9859:6;9843:12;;:22;;9835:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;9936:6;9913:15;:19;9929:2;9913:19;;;;;;;;;;;;;;;;:29;;9905:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;9982:47;9996:4;10003:2;10007:6;9982:47;;;;;;;;;;;;;;;;;;;;;;;;10023:5;9982;:47::i;:::-;10056:6;10040:12;;:22;;;;;;;:::i;:::-;;;;;;;;10097:6;10074:15;:19;10090:2;10074:19;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;10145:10;;;;;;;;;;;:20;;;10166:2;10145:24;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10122:15;:19;10138:2;10122:19;;;;;;;;;;;;;;;;:47;10114:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;9665:538;9596:607;;:::o;6174:789::-;6321:12;6352:14;6336:32;;;;;;6321:47;;6387:33;6401:12;:10;:12::i;:::-;6415:4;6387:13;:33::i;:::-;6379:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;6502:4;6488:18;;:10;:18;;;;6480:27;;;;;;6518:14;6535:10;;;;;;;;;;;:21;;;6557:4;6563:2;6567:4;6535:37;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6518:54;;6607:6;6591:12;;:22;;6583:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;6684:6;6661:15;:19;6677:2;6661:19;;;;;;;;;;;;;;;;:29;;6653:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;6730:60;6744:4;6751;6757:6;6765:4;6771:12;6785:4;6730:5;:60::i;:::-;6817:6;6801:12;;:22;;;;;;;:::i;:::-;;;;;;;;6857:6;6834:15;:19;6850:2;6834:19;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;6905:10;;;;;;;;;;;:20;;;6926:2;6905:24;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6882:15;:19;6898:2;6882:19;;;;;;;;;;;;;;;;:47;6874:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;6310:653;;6174:789;;;;;:::o;4488:88::-;4529:13;4562:6;;;;;;;;;;;4555:13;;4488:88;:::o;8342:633::-;8467:10;;;;;;;;;;;8445:33;;:10;:33;;;8437:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;8537:14;8554:10;;;;;;;;;;;:21;;;8576:4;8582:2;8586:4;8554:37;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8537:54;;8626:6;8610:12;;:22;;8602:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;8703:6;8680:15;:19;8696:2;8680:19;;;;;;;;;;;;;;;;:29;;8672:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;8749:49;8763:4;8770;8776:6;8749:49;;;;;;;;;;;;;;;;;;;;;;;;8792:5;8749;:49::i;:::-;8825:6;8809:12;;:22;;;;;;;:::i;:::-;;;;;;;;8865:6;8842:15;:19;8858:2;8842:19;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;8913:10;;;;;;;;;;;:20;;;8934:2;8913:24;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8890:15;:19;8906:2;8890:19;;;;;;;;;;;;;;;;:47;8882:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;8426:549;8342:633;;;:::o;7741:589::-;7818:12;7849:14;7833:32;;;;;;7818:47;;7876:14;7893:10;;;;;;;;;;;:21;;;7915:10;7927:2;7931:4;7893:43;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7876:60;;7971:6;7955:12;;:22;;7947:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;8048:6;8025:15;:19;8041:2;8025:19;;;;;;;;;;;;;;;;:29;;8017:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;8094:55;8108:4;8115:10;8127:6;8094:55;;;;;;;;;;;;;;;;;;;;;;;;8143:5;8094;:55::i;:::-;8176:6;8160:12;;:22;;;;;;;:::i;:::-;;;;;;;;8216:6;8193:15;:19;8209:2;8193:19;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;8264:10;;;;;;;;;;;:20;;;8285:2;8264:24;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8241:15;:19;8257:2;8241:19;;;;;;;;;;;;;;;;:47;8233:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;7807:523;;7741:589;;:::o;5773:412:2:-;5876:8;5860:24;;:12;:10;:12::i;:::-;:24;;;;5852:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5940:17;:27;5958:8;5940:27;;;;;;;;;;;;;;;;;;;;;;;;;5936:185;;;5990:24;:38;6015:12;:10;:12::i;:::-;5990:38;;;;;;;;;;;;;;;:48;6029:8;5990:48;;;;;;;;;;;;;;;;5983:55;;;;;;;;;;;5936:185;;;6106:4;6069:10;:24;6080:12;:10;:12::i;:::-;6069:24;;;;;;;;;;;;;;;:34;6094:8;6069:34;;;;;;;;;;;;;;;;:41;;;;;;;;;;;;;;;;;;5936:185;6165:12;:10;:12::i;:::-;6136:42;;6155:8;6136:42;;;;;;;;;;;;5773:412;:::o;3070:102::-;3126:13;3158:7;3151:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3070:102;:::o;4212:193::-;4344:54;4350:12;:10;:12::i;:::-;4364:9;4375:6;4383:4;4344:54;;;;;;;;;;;;4393:4;4344:5;:54::i;:::-;4212:193;;;:::o;4636:439::-;4722:4;4767:1;4746:23;;:9;:23;;;;4738:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;4821:12;4836;:10;:12::i;:::-;4821:27;;4859:56;4877:4;4883;4889:9;4900:6;4859:56;;;;;;;;;;;;;;;;;;;;;;;;:17;:56::i;:::-;4926:44;4932:4;4938;4944:9;4955:6;4926:44;;;;;;;;;;;;;;;;;;;;;;;;:5;:44::i;:::-;4981:65;5001:4;5007;5013:9;5024:6;4981:65;;;;;;;;;;;;;;;;;;;;;;;;5040:5;4981:19;:65::i;:::-;5064:4;5057:11;;;4636:439;;;;:::o;8987:597:8:-;9051:12;9082:14;9066:32;;;;;;9051:47;;9109:14;9126:10;;;;;;;;;;;:21;;;9148:10;9160:4;9126:39;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9109:56;;9200:6;9184:12;;:22;;9176:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;9285:6;9254:15;:27;9270:10;9254:27;;;;;;;;;;;;;;;;:37;;9246:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;9331:55;9345:4;9352:10;9364:6;9331:55;;;;;;;;;;;;;;;;;;;;;;;;9380:5;9331;:55::i;:::-;9413:6;9397:12;;:22;;;;;;;:::i;:::-;;;;;;;;9462:6;9431:15;:27;9447:10;9431:27;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;9518:10;;;;;;;;;;;:20;;;9539:10;9518:32;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9487:15;:27;9503:10;9487:27;;;;;;;;;;;;;;;;:63;9479:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;9040:544;;8987:597;:::o;5153:147::-;5224:14;5257:10;;;;;;;;;;;:23;;;5281:4;5287;5257:35;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5250:42;;5153:147;;;;:::o;4119:28::-;;;;;;;;;;;;;:::o;4588:553::-;4662:19;4684:21;4694:10;4684:9;:21::i;:::-;4662:43;;4739:6;4724:11;:21;;4716:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;4791:10;;;;;;;;;;;:21;;;4813:2;4817:6;4825:4;4831:10;4791:51;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4853:55;4859:10;4879:4;4886:6;4853:55;;;;;;;;;;;;;;;;;;;;;;;;4902:5;4853;:55::i;:::-;4935:6;4919:12;;:22;;;;;;;:::i;:::-;;;;;;;;4975:6;4952:15;:19;4968:2;4952:19;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;5016:6;5000:12;;:22;;4992:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;5083:10;;;;;;;;;;;:20;;;5104:2;5083:24;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5060:15;:19;5076:2;5060:19;;;;;;;;;;;;;;;;:47;5052:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;4651:490;4588:553;;;:::o;4189:27::-;;;;:::o;5395:311:2:-;5495:4;5542:11;5530:23;;:8;:23;;;:120;;;;5570:17;:27;5588:8;5570:27;;;;;;;;;;;;;;;;;;;;;;;;;:79;;;;;5602:24;:37;5627:11;5602:37;;;;;;;;;;;;;;;:47;5640:8;5602:47;;;;;;;;;;;;;;;;;;;;;;;;;5601:48;5570:79;5530:120;:169;;;;5666:10;:23;5677:11;5666:23;;;;;;;;;;;;;;;:33;5690:8;5666:33;;;;;;;;;;;;;;;;;;;;;;;;;5530:169;5511:188;;5395:311;;;;:::o;8018:151::-;8108:7;8134:11;:19;8146:6;8134:19;;;;;;;;;;;;;;;:28;8154:7;8134:28;;;;;;;;;;;;;;;;8127:35;;8018:151;;;;:::o;6249:403::-;6345:12;:10;:12::i;:::-;6333:24;;:8;:24;;;;6325:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;6410:17;:27;6428:8;6410:27;;;;;;;;;;;;;;;;;;;;;;;;;6406:185;;;6504:4;6453:24;:38;6478:12;:10;:12::i;:::-;6453:38;;;;;;;;;;;;;;;:48;6492:8;6453:48;;;;;;;;;;;;;;;;:55;;;;;;;;;;;;;;;;;;6406:185;;;6546:10;:24;6557:12;:10;:12::i;:::-;6546:24;;;;;;;;;;;;;;;:34;6571:8;6546:34;;;;;;;;;;;;;;;;6539:41;;;;;;;;;;;6406:185;6632:12;:10;:12::i;:::-;6606:39;;6622:8;6606:39;;;;;;;;;;;;6249:403;:::o;7454:325::-;7635:36;7649:12;:10;:12::i;:::-;7663:7;7635:13;:36::i;:::-;7627:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;7730:42;7736:7;7745:6;7753:4;7759:12;7730:5;:42::i;:::-;7454:325;;;;:::o;5205:127::-;5288:37;5294:12;:10;:12::i;:::-;5308:6;5316:4;5288:37;;;;;;;;;;;;:5;:37::i;:::-;5205:127;;:::o;771:377:0:-;831:4;1034:12;1099:7;1087:20;1079:28;;1140:1;1133:4;:8;1126:15;;;771:377;;;:::o;640:96:1:-;693:7;719:10;712:17;;640:96;:::o;14821:365:2:-;14962:1;14944:20;;:6;:20;;;;14936:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;15043:1;15024:21;;:7;:21;;;;15016:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;15127:5;15096:11;:19;15108:6;15096:19;;;;;;;;;;;;;;;:28;15116:7;15096:28;;;;;;;;;;;;;;;:36;;;;15164:7;15147:32;;15156:6;15147:32;;;15173:5;15147:32;;;;;;:::i;:::-;;;;;;;;14821:365;;;:::o;15659:472::-;15868:19;1176:42;15890:41;;;15932:4;1425:31;15890:78;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15868:100;;16005:1;15982:25;;:11;:25;;;15978:147;;16037:11;16023:39;;;16063:8;16073:4;16079:2;16083:6;16091:8;16101:12;16023:91;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15978:147;15858:273;15659:472;;;;;;:::o;14072:611::-;14269:48;14290:8;14300:4;14306:2;14310:6;14269:20;:48::i;:::-;14328:19;14350:9;:15;14360:4;14350:15;;;;;;;;;;;;;;;;14328:37;;14398:6;14383:11;:21;;14375:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;14514:6;14500:11;:20;14482:9;:15;14492:4;14482:15;;;;;;;;;;;;;;;:38;;;;14557:6;14540:9;:13;14550:2;14540:13;;;;;;;;;;;;;;;;:23;;;;;;;:::i;:::-;;;;;;;;14600:2;14579:56;;14594:4;14579:56;;14584:8;14579:56;;;14604:6;14612:8;14622:12;14579:56;;;;;;;;:::i;:::-;;;;;;;;14665:2;14650:26;;14659:4;14650:26;;;14669:6;14650:26;;;;;;:::i;:::-;;;;;;;;14259:424;14072:611;;;;;;:::o;16820:699::-;17065:19;1176:42;17087:41;;;17129:2;1522:34;17087:79;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17065:101;;17203:1;17180:25;;:11;:25;;;17176:337;;17238:11;17221:44;;;17266:8;17276:4;17282:2;17286:6;17294:8;17304:12;17221:96;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17176:337;;;17338:19;17334:179;;;17383:15;:2;:13;;;:15::i;:::-;17382:16;:37;;;;17414:4;17402:17;;:2;:17;;;17382:37;17373:129;;;;;;;;;;;;:::i;:::-;;;;;;;;;17334:179;17176:337;17055:464;16820:699;;;;;;;:::o;12300:650::-;12538:1;12522:18;;:4;:18;;;;12514:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;12611:1;12597:16;;:2;:16;;;;12589:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;12661:16;12680:12;:10;:12::i;:::-;12661:31;;12703:69;12721:8;12731:4;12737:2;12741:6;12749:8;12759:12;12703:17;:69::i;:::-;12783:57;12789:8;12799:4;12805:2;12809:6;12817:8;12827:12;12783:5;:57::i;:::-;12851:92;12871:8;12881:4;12887:2;12891:6;12899:8;12909:12;12923:19;12851;:92::i;:::-;12504:446;12300:650;;;;;;:::o;13255:811::-;13435:1;13419:18;;:4;:18;;;;13411:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;13487:16;13506:12;:10;:12::i;:::-;13487:31;;13529:73;13547:8;13557:4;13571:1;13575:6;13583:4;13589:12;13529:17;:73::i;:::-;13613:56;13634:8;13644:4;13658:1;13662:6;13613:20;:56::i;:::-;13714:19;13736:9;:15;13746:4;13736:15;;;;;;;;;;;;;;;;13714:37;;13784:6;13769:11;:21;;13761:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;13896:6;13882:11;:20;13864:9;:15;13874:4;13864:15;;;;;;;;;;;;;;;:38;;;;13938:6;13922:12;;:22;;;;;;;:::i;:::-;;;;;;;;13977:4;13960:50;;13967:8;13960:50;;;13983:6;13991:4;13997:12;13960:50;;;;;;;;:::i;:::-;;;;;;;;14048:1;14025:34;;14034:4;14025:34;;;14052:6;14025:34;;;;;;:::i;:::-;;;;;;;;13401:665;;13255:811;;;;:::o;18147:147::-;;;;;:::o;7:114:9:-;74:6;108:5;102:12;92:22;;7:114;;;:::o;127:184::-;226:11;260:6;255:3;248:19;300:4;295:3;291:14;276:29;;127:184;;;;:::o;317:132::-;384:4;407:3;399:11;;437:4;432:3;428:14;420:22;;317:132;;;:::o;455:126::-;492:7;532:42;525:5;521:54;510:65;;455:126;;;:::o;587:96::-;624:7;653:24;671:5;653:24;:::i;:::-;642:35;;587:96;;;:::o;689:108::-;766:24;784:5;766:24;:::i;:::-;761:3;754:37;689:108;;:::o;803:179::-;872:10;893:46;935:3;927:6;893:46;:::i;:::-;971:4;966:3;962:14;948:28;;803:179;;;;:::o;988:113::-;1058:4;1090;1085:3;1081:14;1073:22;;988:113;;;:::o;1137:732::-;1256:3;1285:54;1333:5;1285:54;:::i;:::-;1355:86;1434:6;1429:3;1355:86;:::i;:::-;1348:93;;1465:56;1515:5;1465:56;:::i;:::-;1544:7;1575:1;1560:284;1585:6;1582:1;1579:13;1560:284;;;1661:6;1655:13;1688:63;1747:3;1732:13;1688:63;:::i;:::-;1681:70;;1774:60;1827:6;1774:60;:::i;:::-;1764:70;;1620:224;1607:1;1604;1600:9;1595:14;;1560:284;;;1564:14;1860:3;1853:10;;1261:608;;;1137:732;;;;:::o;1875:373::-;2018:4;2056:2;2045:9;2041:18;2033:26;;2105:9;2099:4;2095:20;2091:1;2080:9;2076:17;2069:47;2133:108;2236:4;2227:6;2133:108;:::i;:::-;2125:116;;1875:373;;;;:::o;2254:99::-;2306:6;2340:5;2334:12;2324:22;;2254:99;;;:::o;2359:169::-;2443:11;2477:6;2472:3;2465:19;2517:4;2512:3;2508:14;2493:29;;2359:169;;;;:::o;2534:307::-;2602:1;2612:113;2626:6;2623:1;2620:13;2612:113;;;2711:1;2706:3;2702:11;2696:18;2692:1;2687:3;2683:11;2676:39;2648:2;2645:1;2641:10;2636:15;;2612:113;;;2743:6;2740:1;2737:13;2734:101;;;2823:1;2814:6;2809:3;2805:16;2798:27;2734:101;2583:258;2534:307;;;:::o;2847:102::-;2888:6;2939:2;2935:7;2930:2;2923:5;2919:14;2915:28;2905:38;;2847:102;;;:::o;2955:364::-;3043:3;3071:39;3104:5;3071:39;:::i;:::-;3126:71;3190:6;3185:3;3126:71;:::i;:::-;3119:78;;3206:52;3251:6;3246:3;3239:4;3232:5;3228:16;3206:52;:::i;:::-;3283:29;3305:6;3283:29;:::i;:::-;3278:3;3274:39;3267:46;;3047:272;2955:364;;;;:::o;3325:313::-;3438:4;3476:2;3465:9;3461:18;3453:26;;3525:9;3519:4;3515:20;3511:1;3500:9;3496:17;3489:47;3553:78;3626:4;3617:6;3553:78;:::i;:::-;3545:86;;3325:313;;;;:::o;3644:75::-;3677:6;3710:2;3704:9;3694:19;;3644:75;:::o;3725:117::-;3834:1;3831;3824:12;3848:117;3957:1;3954;3947:12;3971:122;4044:24;4062:5;4044:24;:::i;:::-;4037:5;4034:35;4024:63;;4083:1;4080;4073:12;4024:63;3971:122;:::o;4099:139::-;4145:5;4183:6;4170:20;4161:29;;4199:33;4226:5;4199:33;:::i;:::-;4099:139;;;;:::o;4244:77::-;4281:7;4310:5;4299:16;;4244:77;;;:::o;4327:122::-;4400:24;4418:5;4400:24;:::i;:::-;4393:5;4390:35;4380:63;;4439:1;4436;4429:12;4380:63;4327:122;:::o;4455:139::-;4501:5;4539:6;4526:20;4517:29;;4555:33;4582:5;4555:33;:::i;:::-;4455:139;;;;:::o;4600:474::-;4668:6;4676;4725:2;4713:9;4704:7;4700:23;4696:32;4693:119;;;4731:79;;:::i;:::-;4693:119;4851:1;4876:53;4921:7;4912:6;4901:9;4897:22;4876:53;:::i;:::-;4866:63;;4822:117;4978:2;5004:53;5049:7;5040:6;5029:9;5025:22;5004:53;:::i;:::-;4994:63;;4949:118;4600:474;;;;;:::o;5080:90::-;5114:7;5157:5;5150:13;5143:21;5132:32;;5080:90;;;:::o;5176:109::-;5257:21;5272:5;5257:21;:::i;:::-;5252:3;5245:34;5176:109;;:::o;5291:210::-;5378:4;5416:2;5405:9;5401:18;5393:26;;5429:65;5491:1;5480:9;5476:17;5467:6;5429:65;:::i;:::-;5291:210;;;;:::o;5507:118::-;5594:24;5612:5;5594:24;:::i;:::-;5589:3;5582:37;5507:118;;:::o;5631:222::-;5724:4;5762:2;5751:9;5747:18;5739:26;;5775:71;5843:1;5832:9;5828:17;5819:6;5775:71;:::i;:::-;5631:222;;;;:::o;5859:619::-;5936:6;5944;5952;6001:2;5989:9;5980:7;5976:23;5972:32;5969:119;;;6007:79;;:::i;:::-;5969:119;6127:1;6152:53;6197:7;6188:6;6177:9;6173:22;6152:53;:::i;:::-;6142:63;;6098:117;6254:2;6280:53;6325:7;6316:6;6305:9;6301:22;6280:53;:::i;:::-;6270:63;;6225:118;6382:2;6408:53;6453:7;6444:6;6433:9;6429:22;6408:53;:::i;:::-;6398:63;;6353:118;5859:619;;;;;:::o;6484:86::-;6519:7;6559:4;6552:5;6548:16;6537:27;;6484:86;;;:::o;6576:112::-;6659:22;6675:5;6659:22;:::i;:::-;6654:3;6647:35;6576:112;;:::o;6694:214::-;6783:4;6821:2;6810:9;6806:18;6798:26;;6834:67;6898:1;6887:9;6883:17;6874:6;6834:67;:::i;:::-;6694:214;;;;:::o;6914:117::-;7023:1;7020;7013:12;7037:117;7146:1;7143;7136:12;7160:180;7208:77;7205:1;7198:88;7305:4;7302:1;7295:15;7329:4;7326:1;7319:15;7346:281;7429:27;7451:4;7429:27;:::i;:::-;7421:6;7417:40;7559:6;7547:10;7544:22;7523:18;7511:10;7508:34;7505:62;7502:88;;;7570:18;;:::i;:::-;7502:88;7610:10;7606:2;7599:22;7389:238;7346:281;;:::o;7633:129::-;7667:6;7694:20;;:::i;:::-;7684:30;;7723:33;7751:4;7743:6;7723:33;:::i;:::-;7633:129;;;:::o;7768:308::-;7830:4;7920:18;7912:6;7909:30;7906:56;;;7942:18;;:::i;:::-;7906:56;7980:29;8002:6;7980:29;:::i;:::-;7972:37;;8064:4;8058;8054:15;8046:23;;7768:308;;;:::o;8082:154::-;8166:6;8161:3;8156;8143:30;8228:1;8219:6;8214:3;8210:16;8203:27;8082:154;;;:::o;8242:412::-;8320:5;8345:66;8361:49;8403:6;8361:49;:::i;:::-;8345:66;:::i;:::-;8336:75;;8434:6;8427:5;8420:21;8472:4;8465:5;8461:16;8510:3;8501:6;8496:3;8492:16;8489:25;8486:112;;;8517:79;;:::i;:::-;8486:112;8607:41;8641:6;8636:3;8631;8607:41;:::i;:::-;8326:328;8242:412;;;;;:::o;8674:340::-;8730:5;8779:3;8772:4;8764:6;8760:17;8756:27;8746:122;;8787:79;;:::i;:::-;8746:122;8904:6;8891:20;8929:79;9004:3;8996:6;8989:4;8981:6;8977:17;8929:79;:::i;:::-;8920:88;;8736:278;8674:340;;;;:::o;9020:307::-;9081:4;9171:18;9163:6;9160:30;9157:56;;;9193:18;;:::i;:::-;9157:56;9231:29;9253:6;9231:29;:::i;:::-;9223:37;;9315:4;9309;9305:15;9297:23;;9020:307;;;:::o;9333:410::-;9410:5;9435:65;9451:48;9492:6;9451:48;:::i;:::-;9435:65;:::i;:::-;9426:74;;9523:6;9516:5;9509:21;9561:4;9554:5;9550:16;9599:3;9590:6;9585:3;9581:16;9578:25;9575:112;;;9606:79;;:::i;:::-;9575:112;9696:41;9730:6;9725:3;9720;9696:41;:::i;:::-;9416:327;9333:410;;;;;:::o;9762:338::-;9817:5;9866:3;9859:4;9851:6;9847:17;9843:27;9833:122;;9874:79;;:::i;:::-;9833:122;9991:6;9978:20;10016:78;10090:3;10082:6;10075:4;10067:6;10063:17;10016:78;:::i;:::-;10007:87;;9823:277;9762:338;;;;:::o;10106:1301::-;10220:6;10228;10236;10244;10293:3;10281:9;10272:7;10268:23;10264:33;10261:120;;;10300:79;;:::i;:::-;10261:120;10420:1;10445:53;10490:7;10481:6;10470:9;10466:22;10445:53;:::i;:::-;10435:63;;10391:117;10575:2;10564:9;10560:18;10547:32;10606:18;10598:6;10595:30;10592:117;;;10628:79;;:::i;:::-;10592:117;10733:63;10788:7;10779:6;10768:9;10764:22;10733:63;:::i;:::-;10723:73;;10518:288;10873:2;10862:9;10858:18;10845:32;10904:18;10896:6;10893:30;10890:117;;;10926:79;;:::i;:::-;10890:117;11031:62;11085:7;11076:6;11065:9;11061:22;11031:62;:::i;:::-;11021:72;;10816:287;11170:2;11159:9;11155:18;11142:32;11201:18;11193:6;11190:30;11187:117;;;11223:79;;:::i;:::-;11187:117;11328:62;11382:7;11373:6;11362:9;11358:22;11328:62;:::i;:::-;11318:72;;11113:287;10106:1301;;;;;;;:::o;11413:77::-;11450:7;11479:5;11468:16;;11413:77;;;:::o;11496:122::-;11569:24;11587:5;11569:24;:::i;:::-;11562:5;11559:35;11549:63;;11608:1;11605;11598:12;11549:63;11496:122;:::o;11624:139::-;11670:5;11708:6;11695:20;11686:29;;11724:33;11751:5;11724:33;:::i;:::-;11624:139;;;;:::o;11769:1413::-;11891:6;11899;11907;11915;11923;11931;11980:3;11968:9;11959:7;11955:23;11951:33;11948:120;;;11987:79;;:::i;:::-;11948:120;12107:1;12132:53;12177:7;12168:6;12157:9;12153:22;12132:53;:::i;:::-;12122:63;;12078:117;12234:2;12260:53;12305:7;12296:6;12285:9;12281:22;12260:53;:::i;:::-;12250:63;;12205:118;12362:2;12388:53;12433:7;12424:6;12413:9;12409:22;12388:53;:::i;:::-;12378:63;;12333:118;12490:2;12516:53;12561:7;12552:6;12541:9;12537:22;12516:53;:::i;:::-;12506:63;;12461:118;12646:3;12635:9;12631:19;12618:33;12678:18;12670:6;12667:30;12664:117;;;12700:79;;:::i;:::-;12664:117;12805:62;12859:7;12850:6;12839:9;12835:22;12805:62;:::i;:::-;12795:72;;12589:288;12944:3;12933:9;12929:19;12916:33;12976:18;12968:6;12965:30;12962:117;;;12998:79;;:::i;:::-;12962:117;13103:62;13157:7;13148:6;13137:9;13133:22;13103:62;:::i;:::-;13093:72;;12887:288;11769:1413;;;;;;;;:::o;13188:329::-;13247:6;13296:2;13284:9;13275:7;13271:23;13267:32;13264:119;;;13302:79;;:::i;:::-;13264:119;13422:1;13447:53;13492:7;13483:6;13472:9;13468:22;13447:53;:::i;:::-;13437:63;;13393:117;13188:329;;;;:::o;13523:1267::-;13636:6;13644;13652;13660;13668;13717:3;13705:9;13696:7;13692:23;13688:33;13685:120;;;13724:79;;:::i;:::-;13685:120;13844:1;13869:53;13914:7;13905:6;13894:9;13890:22;13869:53;:::i;:::-;13859:63;;13815:117;13971:2;13997:53;14042:7;14033:6;14022:9;14018:22;13997:53;:::i;:::-;13987:63;;13942:118;14099:2;14125:53;14170:7;14161:6;14150:9;14146:22;14125:53;:::i;:::-;14115:63;;14070:118;14255:2;14244:9;14240:18;14227:32;14286:18;14278:6;14275:30;14272:117;;;14308:79;;:::i;:::-;14272:117;14413:62;14467:7;14458:6;14447:9;14443:22;14413:62;:::i;:::-;14403:72;;14198:287;14552:3;14541:9;14537:19;14524:33;14584:18;14576:6;14573:30;14570:117;;;14606:79;;:::i;:::-;14570:117;14711:62;14765:7;14756:6;14745:9;14741:22;14711:62;:::i;:::-;14701:72;;14495:288;13523:1267;;;;;;;;:::o;14796:474::-;14864:6;14872;14921:2;14909:9;14900:7;14896:23;14892:32;14889:119;;;14927:79;;:::i;:::-;14889:119;15047:1;15072:53;15117:7;15108:6;15097:9;15093:22;15072:53;:::i;:::-;15062:63;;15018:117;15174:2;15200:53;15245:7;15236:6;15225:9;15221:22;15200:53;:::i;:::-;15190:63;;15145:118;14796:474;;;;;:::o;15276:1447::-;15399:6;15407;15415;15423;15431;15480:3;15468:9;15459:7;15455:23;15451:33;15448:120;;;15487:79;;:::i;:::-;15448:120;15607:1;15632:53;15677:7;15668:6;15657:9;15653:22;15632:53;:::i;:::-;15622:63;;15578:117;15734:2;15760:53;15805:7;15796:6;15785:9;15781:22;15760:53;:::i;:::-;15750:63;;15705:118;15890:2;15879:9;15875:18;15862:32;15921:18;15913:6;15910:30;15907:117;;;15943:79;;:::i;:::-;15907:117;16048:63;16103:7;16094:6;16083:9;16079:22;16048:63;:::i;:::-;16038:73;;15833:288;16188:2;16177:9;16173:18;16160:32;16219:18;16211:6;16208:30;16205:117;;;16241:79;;:::i;:::-;16205:117;16346:62;16400:7;16391:6;16380:9;16376:22;16346:62;:::i;:::-;16336:72;;16131:287;16485:3;16474:9;16470:19;16457:33;16517:18;16509:6;16506:30;16503:117;;;16539:79;;:::i;:::-;16503:117;16644:62;16698:7;16689:6;16678:9;16674:22;16644:62;:::i;:::-;16634:72;;16428:288;15276:1447;;;;;;;;:::o;16729:118::-;16816:24;16834:5;16816:24;:::i;:::-;16811:3;16804:37;16729:118;;:::o;16853:222::-;16946:4;16984:2;16973:9;16969:18;16961:26;;16997:71;17065:1;17054:9;17050:17;17041:6;16997:71;:::i;:::-;16853:222;;;;:::o;17081:619::-;17158:6;17166;17174;17223:2;17211:9;17202:7;17198:23;17194:32;17191:119;;;17229:79;;:::i;:::-;17191:119;17349:1;17374:53;17419:7;17410:6;17399:9;17395:22;17374:53;:::i;:::-;17364:63;;17320:117;17476:2;17502:53;17547:7;17538:6;17527:9;17523:22;17502:53;:::i;:::-;17492:63;;17447:118;17604:2;17630:53;17675:7;17666:6;17655:9;17651:22;17630:53;:::i;:::-;17620:63;;17575:118;17081:619;;;;;:::o;17706:654::-;17784:6;17792;17841:2;17829:9;17820:7;17816:23;17812:32;17809:119;;;17847:79;;:::i;:::-;17809:119;17967:1;17992:53;18037:7;18028:6;18017:9;18013:22;17992:53;:::i;:::-;17982:63;;17938:117;18122:2;18111:9;18107:18;18094:32;18153:18;18145:6;18142:30;18139:117;;;18175:79;;:::i;:::-;18139:117;18280:63;18335:7;18326:6;18315:9;18311:22;18280:63;:::i;:::-;18270:73;;18065:288;17706:654;;;;;:::o;18366:797::-;18452:6;18460;18468;18517:2;18505:9;18496:7;18492:23;18488:32;18485:119;;;18523:79;;:::i;:::-;18485:119;18643:1;18668:53;18713:7;18704:6;18693:9;18689:22;18668:53;:::i;:::-;18658:63;;18614:117;18770:2;18796:53;18841:7;18832:6;18821:9;18817:22;18796:53;:::i;:::-;18786:63;;18741:118;18926:2;18915:9;18911:18;18898:32;18957:18;18949:6;18946:30;18943:117;;;18979:79;;:::i;:::-;18943:117;19084:62;19138:7;19129:6;19118:9;19114:22;19084:62;:::i;:::-;19074:72;;18869:287;18366:797;;;;;:::o;19169:509::-;19238:6;19287:2;19275:9;19266:7;19262:23;19258:32;19255:119;;;19293:79;;:::i;:::-;19255:119;19441:1;19430:9;19426:17;19413:31;19471:18;19463:6;19460:30;19457:117;;;19493:79;;:::i;:::-;19457:117;19598:63;19653:7;19644:6;19633:9;19629:22;19598:63;:::i;:::-;19588:73;;19384:287;19169:509;;;;:::o;19684:60::-;19712:3;19733:5;19726:12;;19684:60;;;:::o;19750:142::-;19800:9;19833:53;19851:34;19860:24;19878:5;19860:24;:::i;:::-;19851:34;:::i;:::-;19833:53;:::i;:::-;19820:66;;19750:142;;;:::o;19898:126::-;19948:9;19981:37;20012:5;19981:37;:::i;:::-;19968:50;;19898:126;;;:::o;20030:145::-;20099:9;20132:37;20163:5;20132:37;:::i;:::-;20119:50;;20030:145;;;:::o;20181:169::-;20287:56;20337:5;20287:56;:::i;:::-;20282:3;20275:69;20181:169;;:::o;20356:260::-;20468:4;20506:2;20495:9;20491:18;20483:26;;20519:90;20606:1;20595:9;20591:17;20582:6;20519:90;:::i;:::-;20356:260;;;;:::o;20622:619::-;20699:6;20707;20715;20764:2;20752:9;20743:7;20739:23;20735:32;20732:119;;;20770:79;;:::i;:::-;20732:119;20890:1;20915:53;20960:7;20951:6;20940:9;20936:22;20915:53;:::i;:::-;20905:63;;20861:117;21017:2;21043:53;21088:7;21079:6;21068:9;21064:22;21043:53;:::i;:::-;21033:63;;20988:118;21145:2;21171:53;21216:7;21207:6;21196:9;21192:22;21171:53;:::i;:::-;21161:63;;21116:118;20622:619;;;;;:::o;21247:474::-;21315:6;21323;21372:2;21360:9;21351:7;21347:23;21343:32;21340:119;;;21378:79;;:::i;:::-;21340:119;21498:1;21523:53;21568:7;21559:6;21548:9;21544:22;21523:53;:::i;:::-;21513:63;;21469:117;21625:2;21651:53;21696:7;21687:6;21676:9;21672:22;21651:53;:::i;:::-;21641:63;;21596:118;21247:474;;;;;:::o;21727:1121::-;21831:6;21839;21847;21855;21904:3;21892:9;21883:7;21879:23;21875:33;21872:120;;;21911:79;;:::i;:::-;21872:120;22031:1;22056:53;22101:7;22092:6;22081:9;22077:22;22056:53;:::i;:::-;22046:63;;22002:117;22158:2;22184:53;22229:7;22220:6;22209:9;22205:22;22184:53;:::i;:::-;22174:63;;22129:118;22314:2;22303:9;22299:18;22286:32;22345:18;22337:6;22334:30;22331:117;;;22367:79;;:::i;:::-;22331:117;22472:62;22526:7;22517:6;22506:9;22502:22;22472:62;:::i;:::-;22462:72;;22257:287;22611:2;22600:9;22596:18;22583:32;22642:18;22634:6;22631:30;22628:117;;;22664:79;;:::i;:::-;22628:117;22769:62;22823:7;22814:6;22803:9;22799:22;22769:62;:::i;:::-;22759:72;;22554:287;21727:1121;;;;;;;:::o;22854:652::-;22931:6;22939;22988:2;22976:9;22967:7;22963:23;22959:32;22956:119;;;22994:79;;:::i;:::-;22956:119;23114:1;23139:53;23184:7;23175:6;23164:9;23160:22;23139:53;:::i;:::-;23129:63;;23085:117;23269:2;23258:9;23254:18;23241:32;23300:18;23292:6;23289:30;23286:117;;;23322:79;;:::i;:::-;23286:117;23427:62;23481:7;23472:6;23461:9;23457:22;23427:62;:::i;:::-;23417:72;;23212:287;22854:652;;;;;:::o;23512:180::-;23560:77;23557:1;23550:88;23657:4;23654:1;23647:15;23681:4;23678:1;23671:15;23698:320;23742:6;23779:1;23773:4;23769:12;23759:22;;23826:1;23820:4;23816:12;23847:18;23837:81;;23903:4;23895:6;23891:17;23881:27;;23837:81;23965:2;23957:6;23954:14;23934:18;23931:38;23928:84;;;23984:18;;:::i;:::-;23928:84;23749:269;23698:320;;;:::o;24024:223::-;24164:34;24160:1;24152:6;24148:14;24141:58;24233:6;24228:2;24220:6;24216:15;24209:31;24024:223;:::o;24253:366::-;24395:3;24416:67;24480:2;24475:3;24416:67;:::i;:::-;24409:74;;24492:93;24581:3;24492:93;:::i;:::-;24610:2;24605:3;24601:12;24594:19;;24253:366;;;:::o;24625:419::-;24791:4;24829:2;24818:9;24814:18;24806:26;;24878:9;24872:4;24868:20;24864:1;24853:9;24849:17;24842:47;24906:131;25032:4;24906:131;:::i;:::-;24898:139;;24625:419;;;:::o;25050:225::-;25190:34;25186:1;25178:6;25174:14;25167:58;25259:8;25254:2;25246:6;25242:15;25235:33;25050:225;:::o;25281:366::-;25423:3;25444:67;25508:2;25503:3;25444:67;:::i;:::-;25437:74;;25520:93;25609:3;25520:93;:::i;:::-;25638:2;25633:3;25629:12;25622:19;;25281:366;;;:::o;25653:419::-;25819:4;25857:2;25846:9;25842:18;25834:26;;25906:9;25900:4;25896:20;25892:1;25881:9;25877:17;25870:47;25934:131;26060:4;25934:131;:::i;:::-;25926:139;;25653:419;;;:::o;26078:228::-;26218:34;26214:1;26206:6;26202:14;26195:58;26287:11;26282:2;26274:6;26270:15;26263:36;26078:228;:::o;26312:366::-;26454:3;26475:67;26539:2;26534:3;26475:67;:::i;:::-;26468:74;;26551:93;26640:3;26551:93;:::i;:::-;26669:2;26664:3;26660:12;26653:19;;26312:366;;;:::o;26684:419::-;26850:4;26888:2;26877:9;26873:18;26865:26;;26937:9;26931:4;26927:20;26923:1;26912:9;26908:17;26901:47;26965:131;27091:4;26965:131;:::i;:::-;26957:139;;26684:419;;;:::o;27109:180::-;27157:77;27154:1;27147:88;27254:4;27251:1;27244:15;27278:4;27275:1;27268:15;27295:191;27335:4;27355:20;27373:1;27355:20;:::i;:::-;27350:25;;27389:20;27407:1;27389:20;:::i;:::-;27384:25;;27428:1;27425;27422:8;27419:34;;;27433:18;;:::i;:::-;27419:34;27478:1;27475;27471:9;27463:17;;27295:191;;;;:::o;27492:118::-;27579:24;27597:5;27579:24;:::i;:::-;27574:3;27567:37;27492:118;;:::o;27616:332::-;27737:4;27775:2;27764:9;27760:18;27752:26;;27788:71;27856:1;27845:9;27841:17;27832:6;27788:71;:::i;:::-;27869:72;27937:2;27926:9;27922:18;27913:6;27869:72;:::i;:::-;27616:332;;;;;:::o;27954:143::-;28011:5;28042:6;28036:13;28027:22;;28058:33;28085:5;28058:33;:::i;:::-;27954:143;;;;:::o;28103:351::-;28173:6;28222:2;28210:9;28201:7;28197:23;28193:32;28190:119;;;28228:79;;:::i;:::-;28190:119;28348:1;28373:64;28429:7;28420:6;28409:9;28405:22;28373:64;:::i;:::-;28363:74;;28319:128;28103:351;;;;:::o;28460:231::-;28600:34;28596:1;28588:6;28584:14;28577:58;28669:14;28664:2;28656:6;28652:15;28645:39;28460:231;:::o;28697:366::-;28839:3;28860:67;28924:2;28919:3;28860:67;:::i;:::-;28853:74;;28936:93;29025:3;28936:93;:::i;:::-;29054:2;29049:3;29045:12;29038:19;;28697:366;;;:::o;29069:419::-;29235:4;29273:2;29262:9;29258:18;29250:26;;29322:9;29316:4;29312:20;29308:1;29297:9;29293:17;29286:47;29350:131;29476:4;29350:131;:::i;:::-;29342:139;;29069:419;;;:::o;29494:143::-;29551:5;29582:6;29576:13;29567:22;;29598:33;29625:5;29598:33;:::i;:::-;29494:143;;;;:::o;29643:351::-;29713:6;29762:2;29750:9;29741:7;29737:23;29733:32;29730:119;;;29768:79;;:::i;:::-;29730:119;29888:1;29913:64;29969:7;29960:6;29949:9;29945:22;29913:64;:::i;:::-;29903:74;;29859:128;29643:351;;;;:::o;30000:174::-;30140:26;30136:1;30128:6;30124:14;30117:50;30000:174;:::o;30180:366::-;30322:3;30343:67;30407:2;30402:3;30343:67;:::i;:::-;30336:74;;30419:93;30508:3;30419:93;:::i;:::-;30537:2;30532:3;30528:12;30521:19;;30180:366;;;:::o;30552:419::-;30718:4;30756:2;30745:9;30741:18;30733:26;;30805:9;30799:4;30795:20;30791:1;30780:9;30776:17;30769:47;30833:131;30959:4;30833:131;:::i;:::-;30825:139;;30552:419;;;:::o;30977:171::-;31117:23;31113:1;31105:6;31101:14;31094:47;30977:171;:::o;31154:366::-;31296:3;31317:67;31381:2;31376:3;31317:67;:::i;:::-;31310:74;;31393:93;31482:3;31393:93;:::i;:::-;31511:2;31506:3;31502:12;31495:19;;31154:366;;;:::o;31526:419::-;31692:4;31730:2;31719:9;31715:18;31707:26;;31779:9;31773:4;31769:20;31765:1;31754:9;31750:17;31743:47;31807:131;31933:4;31807:131;:::i;:::-;31799:139;;31526:419;;;:::o;31951:180::-;32091:32;32087:1;32079:6;32075:14;32068:56;31951:180;:::o;32137:366::-;32279:3;32300:67;32364:2;32359:3;32300:67;:::i;:::-;32293:74;;32376:93;32465:3;32376:93;:::i;:::-;32494:2;32489:3;32485:12;32478:19;;32137:366;;;:::o;32509:419::-;32675:4;32713:2;32702:9;32698:18;32690:26;;32762:9;32756:4;32752:20;32748:1;32737:9;32733:17;32726:47;32790:131;32916:4;32790:131;:::i;:::-;32782:139;;32509:419;;;:::o;32934:553::-;33111:4;33149:3;33138:9;33134:19;33126:27;;33163:71;33231:1;33220:9;33216:17;33207:6;33163:71;:::i;:::-;33244:72;33312:2;33301:9;33297:18;33288:6;33244:72;:::i;:::-;33326;33394:2;33383:9;33379:18;33370:6;33326:72;:::i;:::-;33408;33476:2;33465:9;33461:18;33452:6;33408:72;:::i;:::-;32934:553;;;;;;;:::o;33493:305::-;33533:3;33552:20;33570:1;33552:20;:::i;:::-;33547:25;;33586:20;33604:1;33586:20;:::i;:::-;33581:25;;33740:1;33672:66;33668:74;33665:1;33662:81;33659:107;;;33746:18;;:::i;:::-;33659:107;33790:1;33787;33783:9;33776:16;;33493:305;;;;:::o;33804:164::-;33944:16;33940:1;33932:6;33928:14;33921:40;33804:164;:::o;33974:366::-;34116:3;34137:67;34201:2;34196:3;34137:67;:::i;:::-;34130:74;;34213:93;34302:3;34213:93;:::i;:::-;34331:2;34326:3;34322:12;34315:19;;33974:366;;;:::o;34346:419::-;34512:4;34550:2;34539:9;34535:18;34527:26;;34599:9;34593:4;34589:20;34585:1;34574:9;34570:17;34563:47;34627:131;34753:4;34627:131;:::i;:::-;34619:139;;34346:419;;;:::o;34771:230::-;34911:34;34907:1;34899:6;34895:14;34888:58;34980:13;34975:2;34967:6;34963:15;34956:38;34771:230;:::o;35007:366::-;35149:3;35170:67;35234:2;35229:3;35170:67;:::i;:::-;35163:74;;35246:93;35335:3;35246:93;:::i;:::-;35364:2;35359:3;35355:12;35348:19;;35007:366;;;:::o;35379:419::-;35545:4;35583:2;35572:9;35568:18;35560:26;;35632:9;35626:4;35622:20;35618:1;35607:9;35603:17;35596:47;35660:131;35786:4;35660:131;:::i;:::-;35652:139;;35379:419;;;:::o;35804:442::-;35953:4;35991:2;35980:9;35976:18;35968:26;;36004:71;36072:1;36061:9;36057:17;36048:6;36004:71;:::i;:::-;36085:72;36153:2;36142:9;36138:18;36129:6;36085:72;:::i;:::-;36167;36235:2;36224:9;36220:18;36211:6;36167:72;:::i;:::-;35804:442;;;;;;:::o;36252:223::-;36392:34;36388:1;36380:6;36376:14;36369:58;36461:6;36456:2;36448:6;36444:15;36437:31;36252:223;:::o;36481:366::-;36623:3;36644:67;36708:2;36703:3;36644:67;:::i;:::-;36637:74;;36720:93;36809:3;36720:93;:::i;:::-;36838:2;36833:3;36829:12;36822:19;;36481:366;;;:::o;36853:419::-;37019:4;37057:2;37046:9;37042:18;37034:26;;37106:9;37100:4;37096:20;37092:1;37081:9;37077:17;37070:47;37134:131;37260:4;37134:131;:::i;:::-;37126:139;;36853:419;;;:::o;37278:220::-;37418:34;37414:1;37406:6;37402:14;37395:58;37487:3;37482:2;37474:6;37470:15;37463:28;37278:220;:::o;37504:366::-;37646:3;37667:67;37731:2;37726:3;37667:67;:::i;:::-;37660:74;;37743:93;37832:3;37743:93;:::i;:::-;37861:2;37856:3;37852:12;37845:19;;37504:366;;;:::o;37876:419::-;38042:4;38080:2;38069:9;38065:18;38057:26;;38129:9;38123:4;38119:20;38115:1;38104:9;38100:17;38093:47;38157:131;38283:4;38157:131;:::i;:::-;38149:139;;37876:419;;;:::o;38301:224::-;38441:34;38437:1;38429:6;38425:14;38418:58;38510:7;38505:2;38497:6;38493:15;38486:32;38301:224;:::o;38531:366::-;38673:3;38694:67;38758:2;38753:3;38694:67;:::i;:::-;38687:74;;38770:93;38859:3;38770:93;:::i;:::-;38888:2;38883:3;38879:12;38872:19;;38531:366;;;:::o;38903:419::-;39069:4;39107:2;39096:9;39092:18;39084:26;;39156:9;39150:4;39146:20;39142:1;39131:9;39127:17;39120:47;39184:131;39310:4;39184:131;:::i;:::-;39176:139;;38903:419;;;:::o;39328:222::-;39468:34;39464:1;39456:6;39452:14;39445:58;39537:5;39532:2;39524:6;39520:15;39513:30;39328:222;:::o;39556:366::-;39698:3;39719:67;39783:2;39778:3;39719:67;:::i;:::-;39712:74;;39795:93;39884:3;39795:93;:::i;:::-;39913:2;39908:3;39904:12;39897:19;;39556:366;;;:::o;39928:419::-;40094:4;40132:2;40121:9;40117:18;40109:26;;40181:9;40175:4;40171:20;40167:1;40156:9;40152:17;40145:47;40209:131;40335:4;40209:131;:::i;:::-;40201:139;;39928:419;;;:::o;40353:98::-;40404:6;40438:5;40432:12;40422:22;;40353:98;;;:::o;40457:168::-;40540:11;40574:6;40569:3;40562:19;40614:4;40609:3;40605:14;40590:29;;40457:168;;;;:::o;40631:360::-;40717:3;40745:38;40777:5;40745:38;:::i;:::-;40799:70;40862:6;40857:3;40799:70;:::i;:::-;40792:77;;40878:52;40923:6;40918:3;40911:4;40904:5;40900:16;40878:52;:::i;:::-;40955:29;40977:6;40955:29;:::i;:::-;40950:3;40946:39;40939:46;;40721:270;40631:360;;;;:::o;40997:949::-;41266:4;41304:3;41293:9;41289:19;41281:27;;41318:71;41386:1;41375:9;41371:17;41362:6;41318:71;:::i;:::-;41399:72;41467:2;41456:9;41452:18;41443:6;41399:72;:::i;:::-;41481;41549:2;41538:9;41534:18;41525:6;41481:72;:::i;:::-;41563;41631:2;41620:9;41616:18;41607:6;41563:72;:::i;:::-;41683:9;41677:4;41673:20;41667:3;41656:9;41652:19;41645:49;41711:76;41782:4;41773:6;41711:76;:::i;:::-;41703:84;;41835:9;41829:4;41825:20;41819:3;41808:9;41804:19;41797:49;41863:76;41934:4;41925:6;41863:76;:::i;:::-;41855:84;;40997:949;;;;;;;;;:::o;41952:226::-;42092:34;42088:1;42080:6;42076:14;42069:58;42161:9;42156:2;42148:6;42144:15;42137:34;41952:226;:::o;42184:366::-;42326:3;42347:67;42411:2;42406:3;42347:67;:::i;:::-;42340:74;;42423:93;42512:3;42423:93;:::i;:::-;42541:2;42536:3;42532:12;42525:19;;42184:366;;;:::o;42556:419::-;42722:4;42760:2;42749:9;42745:18;42737:26;;42809:9;42803:4;42799:20;42795:1;42784:9;42780:17;42773:47;42837:131;42963:4;42837:131;:::i;:::-;42829:139;;42556:419;;;:::o;42981:616::-;43166:4;43204:2;43193:9;43189:18;43181:26;;43217:71;43285:1;43274:9;43270:17;43261:6;43217:71;:::i;:::-;43335:9;43329:4;43325:20;43320:2;43309:9;43305:18;43298:48;43363:76;43434:4;43425:6;43363:76;:::i;:::-;43355:84;;43486:9;43480:4;43476:20;43471:2;43460:9;43456:18;43449:48;43514:76;43585:4;43576:6;43514:76;:::i;:::-;43506:84;;42981:616;;;;;;:::o;43603:301::-;43743:34;43739:1;43731:6;43727:14;43720:58;43812:34;43807:2;43799:6;43795:15;43788:59;43881:15;43876:2;43868:6;43864:15;43857:40;43603:301;:::o;43910:366::-;44052:3;44073:67;44137:2;44132:3;44073:67;:::i;:::-;44066:74;;44149:93;44238:3;44149:93;:::i;:::-;44267:2;44262:3;44258:12;44251:19;;43910:366;;;:::o;44282:419::-;44448:4;44486:2;44475:9;44471:18;44463:26;;44535:9;44529:4;44525:20;44521:1;44510:9;44506:17;44499:47;44563:131;44689:4;44563:131;:::i;:::-;44555:139;;44282:419;;;:::o;44707:221::-;44847:34;44843:1;44835:6;44831:14;44824:58;44916:4;44911:2;44903:6;44899:15;44892:29;44707:221;:::o;44934:366::-;45076:3;45097:67;45161:2;45156:3;45097:67;:::i;:::-;45090:74;;45173:93;45262:3;45173:93;:::i;:::-;45291:2;45286:3;45282:12;45275:19;;44934:366;;;:::o;45306:419::-;45472:4;45510:2;45499:9;45495:18;45487:26;;45559:9;45553:4;45549:20;45545:1;45534:9;45530:17;45523:47;45587:131;45713:4;45587:131;:::i;:::-;45579:139;;45306:419;;;:::o;45731:182::-;45871:34;45867:1;45859:6;45855:14;45848:58;45731:182;:::o;45919:366::-;46061:3;46082:67;46146:2;46141:3;46082:67;:::i;:::-;46075:74;;46158:93;46247:3;46158:93;:::i;:::-;46276:2;46271:3;46267:12;46260:19;;45919:366;;;:::o;46291:419::-;46457:4;46495:2;46484:9;46480:18;46472:26;;46544:9;46538:4;46534:20;46530:1;46519:9;46515:17;46508:47;46572:131;46698:4;46572:131;:::i;:::-;46564:139;;46291:419;;;:::o;46716:221::-;46856:34;46852:1;46844:6;46840:14;46833:58;46925:4;46920:2;46912:6;46908:15;46901:29;46716:221;:::o;46943:366::-;47085:3;47106:67;47170:2;47165:3;47106:67;:::i;:::-;47099:74;;47182:93;47271:3;47182:93;:::i;:::-;47300:2;47295:3;47291:12;47284:19;;46943:366;;;:::o;47315:419::-;47481:4;47519:2;47508:9;47504:18;47496:26;;47568:9;47562:4;47558:20;47554:1;47543:9;47539:17;47532:47;47596:131;47722:4;47596:131;:::i;:::-;47588:139;;47315:419;;;:::o;47740:222::-;47880:34;47876:1;47868:6;47864:14;47857:58;47949:5;47944:2;47936:6;47932:15;47925:30;47740:222;:::o;47968:366::-;48110:3;48131:67;48195:2;48190:3;48131:67;:::i;:::-;48124:74;;48207:93;48296:3;48207:93;:::i;:::-;48325:2;48320:3;48316:12;48309:19;;47968:366;;;:::o;48340:419::-;48506:4;48544:2;48533:9;48529:18;48521:26;;48593:9;48587:4;48583:20;48579:1;48568:9;48564:17;48557:47;48621:131;48747:4;48621:131;:::i;:::-;48613:139;;48340:419;;;:::o

Swarm Source

ipfs://d8b96515f9fb0bfe3d9751968ebb1c42a45d8245099fd8e714ef170f6f70d328
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.