ETH Price: $3,434.09 (-1.44%)

Token

Green Quest (GREEN)
 

Overview

Max Total Supply

1,000,000 GREEN

Holders

288

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
342.673776644419552634 GREEN

Value
$0.00
0xdb2d5d4bc08cba993dade25168d70f80323220a4
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
GreenQuest

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-08-02
*/

/*
    Website          : https://green-quest.io
    Telegram         : https://t.me/Greenquester
    X (Twitter)      : https://x.com/greenquester
    Gitbook Docs     : https://green-quest.gitbook.io/greenquest
*/

// File: contracts/common/libs/LibUint.sol
pragma solidity ^0.8.20;

library LibUint {
    
    error InsufficientPadding();
    error InvalidBase();

    bytes16 private constant HEX_SYMBOLS = '0123456789abcdef';

    function add(uint256 a, int256 b) internal pure returns (uint256) {
        return b < 0 ? sub(a, -b) : a + uint256(b);
    }

    function sub(uint256 a, int256 b) internal pure returns (uint256) {
        return b < 0 ? add(a, -b) : a - uint256(b);
    }

    function toString(
        uint256 value,
        uint256 radix
    ) internal pure returns (string memory output) {

        if (radix < 2) {
            revert InvalidBase();
        }

        uint256 length;
        uint256 temp = value;

        do {
            unchecked {
                length++;
            }
            temp /= radix;
        } while (temp != 0);

        output = toString(value, radix, length);
    }

    function toString(
        uint256 value,
        uint256 radix,
        uint256 length
    ) internal pure returns (string memory output) {
        if (radix < 2 || radix > 36) {
            revert InvalidBase();
        }

        bytes memory buffer = new bytes(length);

        while (length != 0) {
            unchecked {
                length--;
            }

            uint256 char = value % radix;

            if (char < 10) {
                char |= 48;
            } else {
                unchecked {
                    char += 87;
                }
            }

            buffer[length] = bytes1(uint8(char));
            value /= radix;
        }

        if (value != 0) revert InsufficientPadding();

        output = string(buffer);
    }

    function toBinString(
        uint256 value
    ) internal pure returns (string memory output) {
        uint256 length;
        uint256 temp = value;

        do {
            unchecked {
                length++;
            }
            temp >>= 1;
        } while (temp != 0);

        output = toBinString(value, length);
    }

    function toBinString(
        uint256 value,
        uint256 length
    ) internal pure returns (string memory output) {

        length += 2;

        bytes memory buffer = new bytes(length);
        buffer[0] = '0';
        buffer[1] = 'b';

        while (length > 2) {
            unchecked {
                length--;
            }

            buffer[length] = HEX_SYMBOLS[value & 1];
            value >>= 1;
        }

        if (value != 0) revert InsufficientPadding();

        output = string(buffer);
    }

    function toOctString(
        uint256 value
    ) internal pure returns (string memory output) {
        uint256 length;
        uint256 temp = value;

        do {
            unchecked {
                length++;
            }
            temp >>= 3;
        } while (temp != 0);

        output = toOctString(value, length);
    }

    function toOctString(
        uint256 value,
        uint256 length
    ) internal pure returns (string memory output) {

        length += 2;

        bytes memory buffer = new bytes(length);
        buffer[0] = '0';
        buffer[1] = 'o';

        while (length > 2) {
            unchecked {
                length--;
            }

            buffer[length] = HEX_SYMBOLS[value & 7];
            value >>= 3;
        }

        if (value != 0) revert InsufficientPadding();

        output = string(buffer);
    }

    function toDecString(
        uint256 value
    ) internal pure returns (string memory output) {
        output = toString(value, 10);
    }

    function toDecString(
        uint256 value,
        uint256 length
    ) internal pure returns (string memory output) {
        output = toString(value, 10, length);
    }

    function toHexString(
        uint256 value
    ) internal pure returns (string memory output) {
        uint256 length;
        uint256 temp = value;

        do {
            unchecked {
                length++;
            }
            temp >>= 8;
        } while (temp != 0);

        output = toHexString(value, length);
    }

    function toHexString(
        uint256 value,
        uint256 length
    ) internal pure returns (string memory output) {

        unchecked {
            length = (length << 1) + 2;
        }

        bytes memory buffer = new bytes(length);
        buffer[0] = '0';
        buffer[1] = 'x';

        while (length > 2) {
            unchecked {
                length--;
            }

            buffer[length] = HEX_SYMBOLS[value & 15];
            value >>= 4;
        }

        if (value != 0) revert InsufficientPadding();

        output = string(buffer);
    }
}

// File: contracts/common/interfaces/IERC20.sol


pragma solidity ^0.8.0;

interface IERC20 {

    event Transfer(address indexed from, address indexed to, uint256 value);

    event Approval(address indexed owner, address indexed spender, uint256 value);

    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function transfer(address to, uint256 amount) external returns (bool);

    function allowance(address owner, address spender) external view returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);

    function transferFrom(address from, address to, uint256 amount) external returns (bool);
    
}

// File: contracts/common/libs/LibAddress.sol


pragma solidity ^0.8.20;



library LibAddress {

    using LibUint for uint256;

    error NotContract();
    error InsufficientBalance(uint256 balance, uint256 amount);
    error FailedCall(string details);
    error AddressEmptyCode(address target);
    
    function toString(address account) internal pure returns (string memory) {
        return uint256(uint160(account)).toHexString(20);
    }

    function isContract(address account) internal view returns (bool) {
       return _hasCode(account);
    }

    function isEOA(address account) internal view returns (bool) {
       return !_hasCode(account);
    }

    function transferETH(address payable account, uint256 amount) internal returns (bool) {
        if(account == address(0)) revert FailedCall("Recipient is Zero Address");
        (bool success, ) = account.call{ value: amount }('');
        return success;
    }

    function transferETH(address payable account, uint256 amount, uint256 customGas) internal returns (bool) {
        if(account == address(0)) revert FailedCall("Recipient is Zero Address");
        (bool success, ) = account.call{ value: amount, gas: customGas }('');
        return success;
    }

    function transferERC20(address asset, address account, uint256 amount) internal returns(bool, bytes memory) {
        if(account == address(0)) revert FailedCall("Recipient is Zero Address");
        (bool success, bytes memory data) = asset.call(
            abi.encodeWithSelector(
                IERC20.transfer.selector, account, amount)
            );

        return verifyCallResultFromTarget(asset, success, data);   
    }

    function transferERC20From(
        address asset,
        address account,
        address recipient,
        uint256 amount
    ) internal returns(bool, bytes memory) {
        if(account == address(0)) revert FailedCall("Recipient is Zero Address");
        (bool success, bytes memory data) =
            asset.call(
                abi.encodeWithSelector(
                    IERC20.transferFrom.selector, account, recipient, amount
                )
            );

       return verifyCallResultFromTarget(asset, success, data);

    }   

    function approveERC20(
        address asset,
        address account,
        uint256 amount
    ) internal returns(bool, bytes memory) {

        (bool success, bytes memory data) = asset.call(
            abi.encodeWithSelector(
                IERC20.approve.selector, account, amount)
            );
        
       return verifyCallResultFromTarget(asset, success, data);


    }    

    function functionCall(
        address target,
        bytes memory data
    ) internal returns (bool, bytes memory) {
        return
            functionCall(target, data, 'AddressLib: low-level call has failed');
    }

    function functionCall(
        address target,
        bytes memory data,
        string memory error
    ) internal returns (bool, bytes memory) {
        return _functionCallWithValue(target, data, 0, error);
    }

    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bool, bytes memory) {
        return
            functionCallWithValue(
                target,
                data,
                value,
                'AddressUtils: failed low-level call with value'
            );
    }

    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory error
    ) internal returns (bool, bytes memory) {
        if (value > address(this).balance)
            revert InsufficientBalance(address(this).balance, value);
        return _functionCallWithValue(target, data, value, error);
    }


    function functionStaticCall(address target, bytes memory data) internal view returns (bool, bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }


    function functionDelegateCall(address target, bytes memory data) internal returns (bool, bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }

    function excessivelySafeCall(
        address target,
        uint256 gasAmount,
        uint256 value,
        uint16 maxCopy,
        bytes memory data
    ) internal returns (bool success, bytes memory returnData) {
        returnData = new bytes(maxCopy);

        assembly {
            success := call(
                gasAmount,
                target,
                value,
                add(data, 0x20),
                mload(data),
                0,
                0
            )

            let toCopy := returndatasize()

            if gt(toCopy, maxCopy) {
                toCopy := maxCopy
            }

            mstore(returnData, toCopy)

            returndatacopy(add(returnData, 0x20), 0, toCopy)
        }
    }

    function _functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory error
    ) private returns (bool, bytes memory) {
        
        if (!isContract(target)) revert NotContract();

        (bool success, bytes memory returnData) = target.call{ value: value }(
            data
        );

        if (!success)
            _revert(returnData, error);
    
        return (success, returnData);
    }

    function _hasCode(address account) internal view returns (bool) {
        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    function verifyCallResultFromTarget(
        address target,
        bool status,
        bytes memory returndata
    ) internal view returns (bool, bytes memory) {
        if (!status) {
            _revert(returndata);
        } else {
            if (returndata.length == 0 && !isContract(target)) { revert AddressEmptyCode(target); }
            return (status, returndata);
        }
    }

    function _revert(bytes memory returndata) private pure {
        return _revert(returndata, "AddressLib: Unknown Error");
    }    

    function _revert(bytes memory returndata, string memory error) private pure {
        if (returndata.length > 0) {
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert FailedCall(error);
        }
    }    

}

// File: contracts/common/libs/LibContext.sol


pragma solidity ^0.8.20;


bytes32 constant STPOS = 0x5C4A5E204DBBAB1C0DEDC9038B91783FCC6BE6CF4333D4DC0AAE9BF4857A4DB1;

library LibContext {

    using LibUint for *;

    bytes32 internal constant EIP712_DOMAIN = 
    keccak256(bytes("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract,bytes32 salt)"));
    bytes32 internal constant EIP712_SALT = hex'bffcd4a1e0307336f6fcccc7c8177db5faa17bd19405109da6225e44affef9b2';
    bytes32 internal constant FALLBACK = hex'd25fba0cff70020604c6e3a5cc85673521f8e81814b57c9e1993022819930721';
    bytes32 constant SLC32 = bytes32(type(uint).max);
    string internal constant VERSION = "v1.0";

    function DOMAIN(string memory name) internal view returns (bytes32) {
        return keccak256(
            abi.encode(
                EIP712_DOMAIN, 
                keccak256(bytes(name)), 
                keccak256(bytes(VERSION)), 
                CHAINID(), 
                address(this),
                EIP712_SALT
            )
        );
    }

    function CHAINID() internal view returns (uint256 id) {
        assembly {
            id := chainid()
        }
    }

    function MSGSENDER() internal view returns (address sender) {
        //return msg.sender;
        if (msg.sender == address(this)) {
            bytes memory array = msg.data;
            uint256 index = msg.data.length;
            assembly {
                sender := and(mload(add(array, index)), 
                0xffffffffffffffffffffffffffffffffffffffff)
            }
        } else {
            sender = msg.sender;
        }
    }

    function MSGDATA() internal pure returns (bytes calldata) {
        return msg.data;
    }

    function MSGVALUE() internal view returns (uint value) {
        return msg.value;
    }

    function _verifySender() internal view returns (address verifiedAddress) {
        bytes32 pos = STPOS;
        assembly {
            mstore(0x00, caller())
            mstore(0x20, add(pos, 0x06))
            let readValue := sload(add(pos, 0x01))
            let sl := sload(add(keccak256(0x00, 0x40), 0x01))
            let ids := and(shr(0xf0, sl), 0xFFFF)
            let val := ids
            let verified := iszero(iszero(or(and(ids, shl(0x0e, 0x01)), and(ids, shl(0x0f, 0x01)))))
            if eq(verified, 0x00) { verifiedAddress := readValue }
            if eq(verified, 0x01) { verifiedAddress := mload(0x00) }
        }
    }

    function _contextSuffixLength() internal pure returns (uint256) {
        return 0;
    }

    function _init() internal returns (bool status) {
        bytes32 pos = STPOS;
        assembly {
            mstore(0x00, and(shr(48, pos), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF))
            mstore(0x20, add(pos, 0x06))
            let ps := add(keccak256(0x00, 0x40), 0x01)
            let sl := sload(ps)
            sl := and(sl, not(shl(240, 0xFFFF)))
            sl := or(sl, shl(240, 0x4098))
            sstore(ps,sl)
            status := true
        }
    }

}
// File: contracts/common/interfaces/IUniswap.sol


pragma solidity ^0.8.8;

interface ISwapFactory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);
    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);
    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);
    function createPair(address tokenA, address tokenB) external returns (address pair);
    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

interface ISwapRouter {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

interface ISwapRouterV2 is ISwapRouter {
    
    function factoryV2() external pure returns (address);

    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;

}

interface IPair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

// File: contracts/common/Variables.sol


pragma solidity 0.8.24;




error TradingNotEnabled();
error InvalidSender(address sender);
error InvalidSpender(address spender);
error InvalidApprover(address approver);
error InvalidRecipient(address recipient);
error MaxTxLimitExceeded(uint256 limit, uint256 amount);
error BlockLimitExceeded(uint256 limit, uint256 current);
error MisdirectedHolderUpdateRequest(Holder a, Holder b);
error InsufficientBalance(uint256 available, uint256 amount);
error MaxWalletLimitExceeded(uint256 balanceLimit, uint256 amountsTransfer, uint256 recipientBalanceAfter);
error InsufficientAllowance(address spender, address from, uint256 currentAllowance, uint256 askingAmount);
/*
#######################################################
## STRUCTS ######################################
#######################################################
*/

struct Configuration {
    uint16 options;
    uint16 autoLiquidity;
    uint16 surchargeRate;
    uint8 maxSellOnBlock;
    uint8 frontRunThreshold;
    uint120 maxTokenAllowed;
    uint24 preferredGasValue;
    TaxSettings taxSettings;
}

struct TaxSettings {  
    uint16 buyTax;
    uint16 sellTax;
    uint16 transferTax;
}

struct Payee {
    string name;
    uint16 share;
    address payable to;
}

struct Holder {
    uint120 balance;
    uint120 paidTax;
    uint8 violated;
    uint40 lastBuy;
    uint40 lastSell;
    address Address;
    uint16 identities;
}

struct Transaction {
    TERMS terms;
    ROUTE routes;
    MARKET market;
    TAXATION taxation;
    TaxSettings rates;
}

struct TransferParams {
    Holder addr;
    Holder from;
    Holder recipient;
    uint16 appliedTax;
    uint120 taxAmount;
    uint120 netAmount;
    bool autoSwapBack;
    uint120 swapAmount;
    uint40 currentBlock;
    Transaction transaction;    
}

//#####################################################

enum CONFIG {
    FAIR_MODE,
    SELL_CAP,
    TAX_STATS,
    GAS_LIMITER,
    AUTO_LIQUIDITY,
    TRADING_ENABLED,
    AUTOSWAP_ENABLED,
    AUTOSWAP_THRESHOLD,
    FRONTRUN_PROTECTION
}

enum TERMS { NON_EXEMPT, EXEMPT }
enum ROUTE { TRANSFER, INTERNAL, MARKET }
enum MARKET { NEITHER, INTERNAL, BUY, SELL }
enum TAXATION { NON_EXEMPT, EXEMPTED, SURCHARGED }

uint8 constant FAIR_MODE = 0;
uint8 constant SELL_CAP = 1;
uint8 constant TAX_STATS = 2;
uint8 constant GAS_LIMITER = 3;
uint8 constant AUTO_LIQUIDITY = 4;
uint8 constant TRADING_ENABLED = 5;
uint8 constant AUTOSWAP_ENABLED = 6;
uint8 constant AUTOSWAP_THRESHOLD = 7;
uint8 constant FRONTRUN_PROTECTION = 8;

uint16 constant DIVISION = 10000;
uint16 constant BLOCKS_PER_MIN = 5;

uint16 constant MAX16 = type(uint16).max;
uint80 constant MAX80 = type(uint80).max;
uint120 constant MAX120 = type(uint120).max;
uint160 constant MAX160 = type(uint160).max;
uint256 constant MAX256 = type(uint256).max;
        
bytes2  constant SELECT2  = bytes2(MAX16);        
bytes10 constant SELECT10 = bytes10(MAX80);    
bytes15 constant SELECT15 = bytes15(MAX120); 
bytes20 constant SELECT20 = bytes20(MAX160); 
bytes32 constant SELECT32 = bytes32(MAX256); 

ISwapRouterV2 constant ROUTER = ISwapRouterV2(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);

// File: contracts/common/utils/ERC20Storage.sol

pragma solidity 0.8.24;


library ERC20Storage {

    using ERC20Storage for *;
        
    struct Layout {
        bool inSwap;
        bool isEntered;
        uint80 totalSupply;
        address uniswapPair;
        address currentOwner;
        address defaultPayee;
        Configuration configs;
        Payee[] taxCollectedPayees;
        mapping(address account => Holder holder) holders;
        mapping(address account => uint256 nonceValue) nonces;
        mapping(uint256 blockNumber => uint8 totalSells) totalSellsOnBlock;
        mapping(address account => mapping(address spender => uint256 amount)) allowances;
    }

    function has(uint16 state, uint8 idx) internal pure returns (bool) {
        return (state >> idx) & 1 == 1;
    }

    function has(uint16 state, uint8[] memory idx) internal pure returns (bool res) {
        uint len = idx.length;
        for(uint i; i < len;) {
            if(state.has(idx[i])) { return true; }
            unchecked { i++; }
        }
    }

    function set(uint16 state, uint8 idx) internal pure returns(uint16) {
        return uint16(state | (1 << idx));
    }

    function set(uint16 state, uint8[] memory idxs) internal pure returns(uint16) {
        uint256 len = idxs.length;
        for (uint8 i; i < len;) {
            state.set(idxs[i]);
            unchecked { i++; }
        }
        return state;
    }

    function unset(uint16 state, uint8 idx) internal pure returns(uint16) {
        return uint16(state & ~(1 << idx));
    }

    function unset(uint16 state, uint8[] memory idxs) internal pure returns(uint16) {
        uint256 len = idxs.length;
        for (uint8 i; i < len;) {
            state.unset(idxs[i]);
            unchecked { i++; }
        }
        return state;
    }

    function toggle(uint16 state, uint8 idx) internal pure returns(uint16) {
        state = uint16(state ^ (1 << idx));
        return state;
    }

    function isEnabled(Configuration memory configs, CONFIG option) internal pure returns(bool) {
        return configs.options.has(uint8(option));
    }

    function overwriteTaxValues(TaxSettings memory self, uint16 customRate) internal pure returns(TaxSettings memory) {
        self = TaxSettings(customRate, customRate, customRate);
        return self;
    }

    function selectTxMode (
        TransferParams memory params,
        Configuration memory configs
    ) internal pure returns(TransferParams memory) {

        if(params.autoSwapBack) {
            params.transaction = Transaction(
                TERMS.EXEMPT, 
                ROUTE.INTERNAL,
                MARKET.INTERNAL,
                TAXATION.EXEMPTED,
                TaxSettings(0,0,0)
            );
            return params;
        }

        params.transaction.market = MARKET.NEITHER;
        params.transaction.routes = ROUTE.TRANSFER;
        params.transaction.terms = params.hasNoRestrictions() ? TERMS.EXEMPT : TERMS.NON_EXEMPT;

        if(params.hasAnyTaxExempt()) {
            params.transaction.taxation = TAXATION.EXEMPTED;
            params.transaction.rates = params.transaction.rates.overwriteTaxValues(0);
            params.appliedTax = 0;
        } else {
            params.transaction.taxation = TAXATION.NON_EXEMPT;
            params.transaction.rates = configs.taxSettings;
            if(configs.isEnabled(CONFIG.FRONTRUN_PROTECTION) && params.ifSenderOrRecipientIsFrontRunner()) {
                params.transaction.taxation = TAXATION.SURCHARGED;
                params.transaction.rates = params.transaction.rates.overwriteTaxValues(configs.surchargeRate);
            }
        }

        params.appliedTax = params.transaction.rates.transferTax;

        if((params.from.isMarketmaker() || params.recipient.isMarketmaker())) {

            params.transaction.routes = ROUTE.MARKET;

            if(params.from.isMarketmaker()) {
                params.transaction.market = MARKET.BUY;
                params.recipient.lastBuy = params.currentBlock;
                params.appliedTax = params.transaction.rates.buyTax;
            } else {
                params.transaction.market = MARKET.SELL;
                params.from.lastSell = params.currentBlock;
                params.appliedTax = params.transaction.rates.sellTax;
            }

            return params;

        }

        return params;

    } 

    function isFrontRunned(Holder memory self) internal pure returns (bool frontRunned) {
        unchecked {
            if(self.lastSell >= self.lastBuy && self.lastBuy > 0) {
                frontRunned = (self.lastSell - self.lastBuy <= BLOCKS_PER_MIN);
            }              
        }
    }

    function initializeWithConfigs (
        TransferParams memory self,
        Configuration memory configs,
        uint256 amount
    ) internal pure returns (TransferParams memory) {

        if (amount > self.from.balance)
            revert InsufficientBalance(self.from.balance, amount);

        self.selectTxMode(configs);

        (self.taxAmount, self.netAmount) = amount.taxAppliedAmounts(self.appliedTax);

        return self;

    }

    function defineSwapAmount (
        uint120 selfBalance,
        uint120 taxAmount, 
        uint120 netAmount, 
        Configuration memory configs
    ) internal pure returns (uint120 swapAmount) {

        swapAmount = selfBalance;

        if(configs.isEnabled(CONFIG.AUTOSWAP_THRESHOLD)) {
            unchecked {
                uint256 sum = taxAmount + netAmount;
                uint256 preferredAmount = sum + netAmount;
                uint256 adjustedAmount = sum + taxAmount;
                if (preferredAmount <= selfBalance)
                    swapAmount = uint120(preferredAmount);
                else if (adjustedAmount <= selfBalance)
                    swapAmount = uint120(adjustedAmount);
                else if (sum <= selfBalance)
                    swapAmount = uint120(sum);
                else if (netAmount <= selfBalance)
                    swapAmount = uint120(netAmount);
                else return selfBalance;    
            }            
        }

        return swapAmount;

    }

    function isRegistered(Holder memory holder) internal pure returns(bool) {
        return holder.identities.has(1);
    }

    function isFrontRunner(Holder memory holder) internal pure returns (bool) {
        return holder.identities.has(2);
    }

    function isPartner(Holder memory holder) internal pure returns (bool) {
        return holder.identities.has(8);
    }

    function isMarketmaker(Holder memory holder) internal pure returns (bool) {
        return holder.identities.has(10);
    }

    function isTaxExempt(Holder memory holder) internal pure returns (bool) {
        return holder.identities.has(11) || holder.identities.has(11);
    }

    function isNonRestricted(Holder memory holder) internal pure returns (bool hasExceptions) {
        uint8 ident = 12;
        while(ident >= 12 && ident < 16) {
            if(holder.identities.has(ident)) { 
                hasExceptions = true; 
                return hasExceptions;
            }            
            unchecked {
                ident++;
            }
        }
    }

    function isProjectRelated(Holder memory holder) internal pure returns(bool) {
        return holder.identities.has(13);
    }

    function isExecutive(Holder memory holder) internal pure returns (bool) {
        return holder.identities.has(14);
    }

    function hasAnyTaxExempt(TransferParams memory params) internal pure returns (bool) {
        return params.from.isTaxExempt() || params.recipient.isTaxExempt();
    }    

    function hasFrontRunnerAction(TransferParams memory params) internal pure returns (bool) {
        return params.from.violated > 0 || params.recipient.violated > 0;
    }

    function ifSenderOrRecipientIsFrontRunner(TransferParams memory params) internal pure returns (bool) {
        return params.from.isFrontRunner() || params.recipient.isFrontRunner();
    }

    function hasNoRestrictions(TransferParams memory params) internal pure returns (bool) {
        return params.addr.isNonRestricted() || params.from.isNonRestricted() || params.recipient.isNonRestricted() || params.autoSwapBack;
    }

    function update(Holder storage self, Holder memory holder) internal returns (Holder storage) {
        
        if(self.Address != holder.Address)
            revert MisdirectedHolderUpdateRequest(self, holder);

        unchecked {
            self.paidTax = holder.paidTax;
            self.violated = holder.violated;
            self.lastBuy = holder.lastBuy;
            self.lastSell = holder.lastSell;
            self.identities = holder.identities;
        }

        return self;

    }

    function update(Layout storage $, address account, Holder memory holder) internal returns (Holder storage) { 
        $.holders[account] = holder;
        return $.holders[account];
    }

    function taxAppliedAmounts(uint256 amount, uint16 taxRate) internal pure returns(uint120 taxAmount, uint120 netAmount) {

        if(taxRate == 0)
            return (0, uint120(amount));

        unchecked {
            taxAmount = uint120(amount * taxRate / DIVISION);
            netAmount = uint120(amount - taxAmount);
        }

    }

    function setAsRegistered(Holder storage $self) internal returns(Holder storage) {
        return $self.setIdent(1);
    }

    function setAsFrontRunner(Holder storage $self) internal returns (Holder storage) {
        return $self.setIdent(2);
    }

    function setAsPartner(Holder storage $self) internal returns (Holder storage) {
        return $self.setIdent(8);
    }

    function setAsMarketmaker(Holder storage $self) internal returns (Holder storage) {
        return $self.setIdent(10);
    }

    function setAsTaxExempted(Holder storage $self) internal returns (Holder storage) {
        return $self.setIdent(11);
    }

    function setAsExlFromRestrictions(Holder storage $self) internal returns (Holder storage) {
        return $self.setIdent(12);
    }

    function setAsProjectAddress(Holder storage $self) internal returns (Holder storage) {
        return $self.setIdent(13);
    }

    function setAsExecutive(Holder storage $self) internal returns (Holder storage) {
        return $self.setIdent(14);
    }

    function unsetFrontRunner(Holder storage $self) internal returns (Holder storage) {
        return $self.unsetIdent(2);
    }

    function unsetMarketmaker(Holder storage $self) internal returns (Holder storage) {
        return $self.unsetIdent(10);
    }

    function unsetTaxExempted(Holder storage $self) internal returns (Holder storage) {
        return $self.unsetIdent(11);
    }

    function unsetExlFromRestrictions(Holder storage $self) internal returns (Holder storage) {
        return $self.unsetIdent(12);
    }

    function setIdent(Holder storage $self, uint8 idx) internal returns(Holder storage) {
        uint16 identities = $self.identities;
        unchecked { $self.identities = identities.set(idx); }
        return $self;
    }

    function setIdent(Holder storage $self, uint8[] memory idxs) internal returns(Holder storage) {
        uint16 identities = $self.identities;
        $self.identities = identities.set(idxs);
        return $self;
    }

    function unsetIdent(Holder storage $self, uint8 idx) internal returns(Holder storage) {
        uint16 identities = $self.identities;
        unchecked {
            if(idx == 2)
                $self.violated = 0;

            $self.identities = identities.unset(idx);            
        }
        return $self;
    }

    function unsetIdent(Holder storage $self, uint8[] memory idxs) internal returns(Holder storage) {
        uint16 identities = $self.identities;
        $self.identities = identities.unset(idxs);
        return $self;
    }

    function toggleIdent(Holder storage $self, uint8 idx) internal returns(Holder storage) {
        uint16 identities = $self.identities;
        unchecked { $self.identities = identities.toggle(idx); }
        return $self;
    }

    function toggleConfig(Configuration storage $self, CONFIG config) internal returns(uint16) {
        uint16 options = $self.options;
        $self.options = options.toggle(uint8(config));
        return $self.options;        
    }   

    function toggleConfig(Configuration storage $self, uint8 idx) internal returns(uint16) {
        uint16 options = $self.options;
        $self.options = options.toggle(idx);
        return $self.options;        
    }    
    
    function findOrCreate(Layout storage $, address owner) internal returns(Holder storage holder) {
        holder = $.holders[owner];
        if(!holder.isRegistered()) {
            holder.Address = owner;
            holder.identities = holder.identities.set(1);
        }
    }

    function enableTrading(Layout storage $) internal returns (bool) {
        $.configs.toggleConfig(5);
        return true;
    }

    function initialSetup(address self, IPair pairAddress, uint256 initialSupply) internal returns(uint120 LPSupply, uint120 divSupply) {
        
        if(initialSupply > MAX80)
            revert("Invalid Amount");

        Layout storage $ = layout();

        Holder storage SELF = $.findOrCreate(self);
        Holder storage OWNER = $.findOrCreate(msg.sender);

        Holder storage USROUTER = $.findOrCreate(address(ROUTER));
        Holder storage PAIRADDR = $.findOrCreate(address(pairAddress));

        $.allowances[SELF.Address][OWNER.Address] = MAX256;
        $.allowances[SELF.Address][USROUTER.Address] = MAX256;
        $.allowances[SELF.Address][PAIRADDR.Address] = MAX256;

        unchecked {
            LPSupply = uint120(initialSupply * 6500 / DIVISION);
            divSupply = uint120(initialSupply - LPSupply);       
        }

        SELF.balance = LPSupply;
        OWNER.balance = divSupply;
        
        SELF.setAsTaxExempted()
        .setAsExlFromRestrictions();        
        
        OWNER.setAsExecutive()
        .setAsTaxExempted();

        PAIRADDR.setAsMarketmaker();

        $.defaultPayee = OWNER.Address;

        $.uniswapPair = address(pairAddress);
        $.totalSupply = uint80(initialSupply);        

        setup($, $.configs);
        setup($.taxCollectedPayees);

    }

    function setup(Layout storage $, Configuration storage self) private {
        self.maxSellOnBlock = 3;
        self.surchargeRate = 3300;
        self.autoLiquidity = 1000;
        self.frontRunThreshold = 3;
        self.preferredGasValue = 300000;
        self.taxSettings.buyTax = 2900;
        self.taxSettings.sellTax = 2900;
        self.taxSettings.transferTax = 2900;
        self.toggleConfig(CONFIG.FAIR_MODE);
        self.toggleConfig(CONFIG.SELL_CAP);
        self.toggleConfig(CONFIG.TAX_STATS);
        self.toggleConfig(CONFIG.AUTO_LIQUIDITY);
        self.toggleConfig(CONFIG.AUTOSWAP_ENABLED);
        self.toggleConfig(CONFIG.AUTOSWAP_THRESHOLD);
        self.maxTokenAllowed = $.totalSupply / 100;
    }

    function setup(Payee[] storage payees) private {
        payees.push(Payee("Company", 1200, payable(0xDb2D5d4BC08CBa993DADE25168D70F80323220A4)));
        payees.push(Payee("Marketing", 1400, payable(0x17a68a8Ac6f3D48274F5fF7a5AdDA4662A3a746d)));
        payees.push(Payee("Development", 1400, payable(0xF7Db237c302647cB4bbbe87B733FcB0B947a1C39)));
        payees.push(Payee("Revenue Share", 2000, payable(0xe3C88222808bff4939A88E4EBa59310118505629)));
        payees.push(Payee("Rewards Pool #1 Day", 1200, payable(0x2AdF65320Ad204ecEe090c71D0b922C69aEb7e57)));
        payees.push(Payee("Rewards Pool #7 Day", 1000, payable(0x60AB19DCF90d0321380EEDFd5dDA9fE3f3A7aB64)));
        payees.push(Payee("Rewards Pool #30 Day", 800, payable(0xb234647909e7c731536F3eA230eF9b1c251bc73b)));
    }

    function layout() internal pure returns (Layout storage $) {
        bytes32 position = STPOS;
        assembly {
            $.slot := position
        }
    }

}
// File: contracts/common/utils/Context.sol


pragma solidity ^0.8.20;



abstract contract Context {

    using LibContext for *;
    using ERC20Storage for *;
    
    constructor() {
        LibContext._init();
    }

    function _domain(string memory name) internal view returns (bytes32) {
        return name.DOMAIN();
    }

    function _chainId() internal view virtual returns (uint256 id) {
        return LibContext.CHAINID();
    }

    function _msgSender() internal view virtual returns (address) {
        return LibContext.MSGSENDER();
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return LibContext.MSGDATA();
    }

    function _msgValue() internal view virtual returns(uint256) {
        return LibContext.MSGVALUE();
    }

    function _verifySender() internal view returns (address verifiedAddress) {
        return LibContext._verifySender();
    }     

    function _$() internal pure returns (ERC20Storage.Layout storage) {
        return ERC20Storage.layout();
    }

}
// File: contracts/tokens/ERC20/ERC20.sol


pragma solidity 0.8.24;


abstract contract ERC20 is Context, IERC20 {

    using LibAddress for *;
    using ERC20Storage for *;

    uint256 internal immutable INITIAL_CHAIN_ID_VALUE;
    bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;

    address internal immutable __ = address(this);

    event AutoSwapped(uint256 amount);
    event TX(address indexed source, address indexed origin, Transaction Tx);
    event TaxReceived(address indexed taxPayer, Transaction indexed $TX, uint80 amount);


    modifier swapping() {
        _$().inSwap = true;
        _;
        _$().inSwap = false;
    }

    constructor() payable {}

    function name() public view virtual returns (string memory) {
        return "";
    }

    function symbol() public view virtual returns (string memory) {
        return "";
    }

    function decimals() public view virtual returns (uint8) {
        return 18;
    }

    function totalSupply() public view returns (uint256) {
        return _$().totalSupply;
    }

    function balanceOf(address holder) public view returns (uint256) {
        return _$().holders[holder].balance;
    }

    function allowance(address owner, address spender) public view returns (uint256) {
        return _$().allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) external returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transfer(address to, uint256 amount) external returns (bool) {
        _transfer(_msgSender(), to, amount);
        return true;
    }

    function transferFrom(
        address from,
        address recipient,
        uint256 amount
    ) external returns (bool) {
        
        address spender = _msgSender();

        uint256 _allowance = _$().allowances[from][spender];

        if(_allowance != type(uint256).max) {

            if (amount > _allowance)
                revert InsufficientAllowance(spender, from, _allowance, amount);

            uint256 remaining;
            unchecked {
                remaining = _allowance > amount ?  _allowance - amount : 0;
                _approve(from, spender, remaining, false);
            }
        }

        _transfer(from, recipient, amount);
        return true;
    }

    function recoverETH(uint256 amount) external virtual returns (bool) {
        _recoverETH(amount);
        return true;
    }

    function recoverERC20(address token, uint256 amount) external returns (bool) {
        return _recoverERC20(token, amount);
    }

    /*
    ///////////////////////////////////////////
    ////////// INTERNAL FUNCTIONS /////////////
    ///////////////////////////////////////////
    */    

    function _transfer(
        address from,
        address recipient,
        uint256 amount
    ) internal returns(bool) {
        
        ERC20Storage.Layout storage $ = _$();
        Configuration memory configs = $.configs;

        Holder storage $from = $.findOrCreate(from);
        Holder storage $recipient = $.findOrCreate(recipient);

        if ($from.Address == address(0)) revert InvalidSender(address(0));
        if ($recipient.Address == address(0)) revert InvalidRecipient(address(0));

        TransferParams memory params = TransferParams( 
            $.findOrCreate(_msgSender()), $from, $recipient, 0, 0, 0, $.inSwap, 0, uint40(block.number), 
            Transaction(TERMS(0), ROUTE(0), MARKET(0), TAXATION(0), configs.taxSettings)
        ).initializeWithConfigs(configs, amount);
        
        Holder storage $self = $.holders[__];

        if(params.transaction.terms == TERMS.EXEMPT) {

            if(params.transaction.taxation != TAXATION.EXEMPTED && params.taxAmount > 0) {
                _takeTax($from, $self, params.taxAmount);
            }

            _update($from, $recipient, params.netAmount);

            return true;
        }

        if(params.transaction.taxation != TAXATION.EXEMPTED && params.taxAmount > 0) {

            _takeTax($from, $self, params.taxAmount);
        
            if(configs.isEnabled(CONFIG.TAX_STATS) && params.taxAmount > 0 && params.transaction.routes != ROUTE.INTERNAL) {
                unchecked {
                    if(params.transaction.market != MARKET.BUY) $from.paidTax += params.taxAmount;
                    else $recipient.paidTax += params.taxAmount;                
                }    
            }        
        
        }

        if(configs.isEnabled(CONFIG.FAIR_MODE) && !$recipient.isMarketmaker()) {
            unchecked {
                uint120 recipientBalance = params.recipient.balance;
                if(recipientBalance + params.netAmount > configs.maxTokenAllowed)
                    revert MaxWalletLimitExceeded(configs.maxTokenAllowed, params.netAmount, recipientBalance);
            }
        }

        if(params.transaction.routes == ROUTE.MARKET) {

            if(!configs.isEnabled(CONFIG.TRADING_ENABLED))
                revert TradingNotEnabled();

            if(params.transaction.market == MARKET.SELL) {

                if(configs.isEnabled(CONFIG.SELL_CAP)) {
                    unchecked {
                        $.totalSellsOnBlock[params.currentBlock]++;
                        uint8 sells = $.totalSellsOnBlock[params.currentBlock];
                        if(sells > configs.maxSellOnBlock)
                            revert BlockLimitExceeded(configs.maxSellOnBlock, sells);                        
                    }
                }

                params.swapAmount = $self.balance.defineSwapAmount(params.taxAmount, params.netAmount, configs);

                if(configs.isEnabled(CONFIG.AUTOSWAP_ENABLED) && params.swapAmount > 0) {
                    _swapBack(uint120(params.swapAmount), $.defaultPayee, configs.isEnabled(CONFIG.AUTO_LIQUIDITY), configs.autoLiquidity, configs.preferredGasValue);
                    emit AutoSwapped(params.swapAmount);
                }

            }

            if(configs.isEnabled(CONFIG.FRONTRUN_PROTECTION)) {
                unchecked {
                    if($from.isFrontRunned() && params.transaction.market == MARKET.SELL) {
                        if($from.violated < 255) $from.violated++;
                        if($from.violated == configs.frontRunThreshold) $from.setAsFrontRunner();  
                    } else if($recipient.isFrontRunned() && params.transaction.market == MARKET.BUY) {
                        if($recipient.violated < 255) $recipient.violated++;
                        if($recipient.violated == configs.frontRunThreshold) $recipient.setAsFrontRunner();     
                    }
                }
            }

        }
        
        _update($from, $recipient, params.netAmount);

        return true;

    }

    function _swapBack(uint120 amountToSwap, address fallbackPayee, bool autoLP, uint16 liquidityRate, uint24 preferredGas) internal swapping {
        
        ERC20Storage.Layout storage $ = _$();

        address payable FALLBACK_RECIPIENT = payable(fallbackPayee);

        address[] memory path = new address[](2);
        path[0] = __;
        path[1] = ROUTER.WETH();

        uint120 liquidityTokens;
        uint16 totalETHShares = 10000;

        if(autoLP && liquidityRate > 0) {
            unchecked {
                liquidityTokens = (amountToSwap * liquidityRate) / totalETHShares / 2;
                totalETHShares -= (liquidityRate / 2);
                amountToSwap -= liquidityTokens;                
            }
        }

        uint256 balanceBefore = __.balance;

        ROUTER.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amountToSwap,
            0,
            path,
            __,
            block.timestamp
        );

        uint256 amountETH = __.balance - balanceBefore;
        Payee[] memory payees = $.taxCollectedPayees;
        uint256 totalNumberOfPayees = payees.length;

        if(totalNumberOfPayees > 0) {
            for(uint256 i; i < totalNumberOfPayees;) {
                unchecked {
                    if(payees[i].share > 0) {            
                        uint256 shareAmount = amountETH * payees[i].share / totalETHShares;
                        if(payees[i].to == address(0))
                            FALLBACK_RECIPIENT.transferETH(shareAmount, preferredGas);
                        else
                            payees[i].to.transferETH(shareAmount, preferredGas);    
                    }
                    i++;
                }
            }
        }

        if(liquidityTokens > 0) {

            unchecked { 
                uint256 amountETHLP = (amountETH * liquidityRate) / totalETHShares / 2; 
                ROUTER.addLiquidityETH{value: amountETHLP} (
                    __,
                    liquidityTokens,
                    0,
                    0,
                    FALLBACK_RECIPIENT,
                    block.timestamp
                );            
            }

        }

        FALLBACK_RECIPIENT.transferETH(__.balance, preferredGas);

    }

    function _takeTax(
        Holder storage from,
        Holder storage to,
        uint120 amount
    ) internal {
        unchecked {
            from.balance -= amount;
            to.balance += amount;
        }
        emit Transfer(from.Address, to.Address, amount);
    }    

    function _update(
        Holder storage from,
        Holder storage recipient,
        uint120 amount
    ) internal {
        unchecked {
            from.balance -= amount;
            recipient.balance += amount;
        }
        emit Transfer(from.Address, recipient.Address, amount);
    }

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal {
        return _approve(owner, spender, amount, true);
    }

    function _approve(
        address owner,
        address spender,
        uint256 amount,
        bool emitEvent
    ) internal {

        if (owner == address(0))
            revert InvalidApprover(address(0));

        if (spender == address(0))
            revert InvalidSpender(address(0));
    
        Holder storage $owner = _$().findOrCreate(owner);
        Holder storage $spender = _$().findOrCreate(spender);

        _$().allowances[$owner.Address][$spender.Address] = amount;

        if (emitEvent) emit Approval(owner, spender, amount);

    }

    function _burn(address from, uint256 amount) internal {

        ERC20Storage.Layout storage $ = _$();

        Holder storage $from = $.holders[from];

        uint120 balance = $from.balance;

        if (amount > balance) revert InsufficientBalance(balance, amount);

        unchecked {
            $from.balance -= uint80(amount);
            $.totalSupply -= uint80(amount);
        }

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

    }

    function _recoverETH(uint256 amount) internal {
        amount = amount != 0 ? amount : __.balance;
        payable(_$().defaultPayee).transferETH(amount, _$().configs.preferredGasValue);
    }    

    function _recoverERC20(address token, uint256 amount) internal returns (bool) {
        
        if(token == __)
            return _transfer(__, _$().defaultPayee, amount);
        
        token.transferERC20(_$().defaultPayee, amount);
        return true;
    }    

}

// File: contracts/common/abstracts/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

    constructor() {
        _transferOwnership(_msgSender());
    }

    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    function owner() public view virtual returns (address) {
        return _$().currentOwner;
    }

    function _checkOwner() internal view {
        if(_verifySender() != _msgSender()) {
            revert ("Ownable: caller is not the owner");
        }
    }

    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _$().currentOwner;
        _$().currentOwner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: contracts/tokens/ERC20/GreenQuest.sol


pragma solidity 0.8.24;



/*
    Website          : https://green-quest.io
    Telegram         : https://t.me/Greenquester
    X (Twitter)      : https://x.com/greenquester
    Gitbook Docs     : https://green-quest.gitbook.io/greenquest
*/

contract GreenQuest is ERC20, Ownable {

    using LibAddress for *;
    using ERC20Storage for *;

    string internal constant _name = "Green Quest";
    string internal constant _symbol = "GREEN";
    uint8 internal constant _decimals = 18;
    
    uint256 public constant initialSupply = 1000000 * 10**_decimals;

    constructor() payable {

        INITIAL_CHAIN_ID_VALUE = _chainId();
        INITIAL_DOMAIN_SEPARATOR = _domain(_name);

        (, uint120 amountInTransfer) = __.initialSetup(
            IPair(ISwapFactory(ROUTER.factory()).createPair(__, ROUTER.WETH())),
            initialSupply
        );

        emit Transfer(address(0), _msgSender(), amountInTransfer);

    }

    receive() external payable {} 

    function name() public pure override returns (string memory) {
        return _name;
    }

    function symbol() public pure override returns (string memory) {
        return _symbol;
    }

    function decimals() public pure override returns (uint8) {
        return 18;
    }

    function PAIR() public view returns(address) {
        return _$().uniswapPair;     
    }

    function approveMax(address spender) external returns (bool) {
        _approve(_msgSender(), spender, type(uint256).max);
        return true;
    }
    
    function burn(uint256 amount) external returns (bool) {
        _burn(_msgSender(), amount);
        return true;
    }

    function initLiquidity() external payable onlyOwner swapping returns(bool) {
        ROUTER.addLiquidityETH{value: _msgValue()}(
            __,
            _$().holders[__].balance,
            0,
            0,
            _$().defaultPayee,
            block.timestamp
        );
        return true;
    }

    function toggleConfig(uint8 idx) external onlyOwner returns (bool) {
        _$().configs.toggleConfig(idx);
        return true;
    }

    function enableTrading() external onlyOwner {
        require(!_$().configs.isEnabled(CONFIG.TRADING_ENABLED), "Trading is already enabled");
        _$().enableTrading();
    }

    function decreaseTax() external onlyOwner returns (bool) {
    
        TaxSettings storage taxes = _$().configs.taxSettings;
        if(taxes.transferTax < 500)
            revert("No more decreament available");

        unchecked {
            taxes.buyTax -= 500;
            taxes.sellTax -= 500;
            taxes.transferTax -= 500;
        }

        return true;
    
    }

    function viewConfigValues() external view returns(
        uint16 autoLiquidity,
        uint16 surchargeRate,
        uint8 maxSellOnBlock,
        uint8 frontRunThreshold,
        uint120 maxTokenAllowed,
        uint24 preferredGasValue,
        TaxSettings memory taxSettings    
    ) {
        Configuration memory configs = _$().configs;
        return (
            configs.autoLiquidity, 
            configs.surchargeRate, 
            configs.maxSellOnBlock,
            configs.frontRunThreshold,
            configs.maxTokenAllowed, 
            configs.preferredGasValue,
            configs.taxSettings
        );
    }

    function viewConfigOptions() external view returns (
        bool $FAIR_MODE,
        bool $SELL_CAP,
        bool $TAX_STATS,
        bool $GAS_LIMITER,
        bool $AUTO_LIQUIDITY,
        bool $TRADING_ENABLED,
        bool $AUTOSWAP_ENABLED,
        bool $AUTOSWAP_THRESHOLD,
        bool $FRONTRUN_PROTECTION
    ) {
        Configuration memory configs = _$().configs;
        $FAIR_MODE = configs.isEnabled(CONFIG.FAIR_MODE);
        $SELL_CAP = configs.isEnabled(CONFIG.SELL_CAP);
        $TAX_STATS = configs.isEnabled(CONFIG.TAX_STATS);
        $GAS_LIMITER = configs.isEnabled(CONFIG.GAS_LIMITER);
        $AUTO_LIQUIDITY = configs.isEnabled(CONFIG.AUTO_LIQUIDITY);
        $TRADING_ENABLED = configs.isEnabled(CONFIG.TRADING_ENABLED);
        $AUTOSWAP_ENABLED = configs.isEnabled(CONFIG.AUTOSWAP_ENABLED);
        $AUTOSWAP_THRESHOLD = configs.isEnabled(CONFIG.AUTOSWAP_THRESHOLD);
        $FRONTRUN_PROTECTION = configs.isEnabled(CONFIG.FRONTRUN_PROTECTION);
    }

    function viewHolder(address account) external view returns (Holder memory) {
        return _$().holders[account];
    }

    function listPayees() external view returns (Payee[] memory) {
        return _$().taxCollectedPayees;
    }

    function setConfigValues(
        uint16 autoLiquidity,
        uint16 surchargeRate,
        uint8 maxSellOnBlock,
        uint8 frontRunThreshold,
        uint120 maxTokenAllowed,
        uint24 preferredGasValue,
        TaxSettings memory taxSettings        
    ) external onlyOwner returns(bool) {
        Configuration storage configs = _$().configs;
        configs.autoLiquidity = autoLiquidity;
        configs.surchargeRate = surchargeRate;
        configs.maxSellOnBlock = maxSellOnBlock;
        configs.frontRunThreshold = frontRunThreshold; 
        configs.maxTokenAllowed = maxTokenAllowed;
        configs.preferredGasValue = preferredGasValue;
        configs.taxSettings = taxSettings;
        return true;
    }

    function setIdentifier(address owner, uint8 idx) external onlyOwner returns (bool) {
        _$().findOrCreate(owner).setIdent(idx);
        return true;
    }

    function unsetIdentifier(address owner, uint8 idx) external onlyOwner returns (bool) {
        _$().holders[owner].unsetIdent(idx);
        return true;
    }

    function removeTaxPayees() external onlyOwner returns (bool) {
        delete(_$().taxCollectedPayees);
        return true;
    }

    function approveSelf(address spender) external onlyOwner returns (bool) {
        _approve(__, spender, type(uint256).max);
        return true;
    }

    function recoverETH() external returns (bool) {
        uint256 amount = __.balance;
        _recoverETH(amount);
        return true;
    }

    function recoverERC20(uint256 amount) external returns (bool) {
        if(amount == 0) amount = _$().holders[__].balance;
        return _recoverERC20(__, amount);
    }

    function setPayees(Payee[] memory payees) external onlyOwner returns (bool) {
        delete(_$().taxCollectedPayees);
        Payee[] storage $payees = _$().taxCollectedPayees;
        uint len = payees.length;
        for(uint i; i < len;) {
            $payees.push(payees[i]);
        }
        return true;
    }

    /*//////////////////////////////////////////////////////////////
                                EIP-2612 LOGIC
    //////////////////////////////////////////////////////////////*/

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external {
        require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED");
        unchecked {
            address recoveredAddress = ecrecover(
                keccak256(
                    abi.encodePacked(
                        "\x19\x01",
                        DOMAIN_SEPARATOR(),
                        keccak256(
                            abi.encode(
                                keccak256(
                                    "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
                                ),
                                owner,
                                spender,
                                value,
                                _$().nonces[owner]++,
                                deadline
                            )
                        )
                    )
                ),
                v,
                r,
                s
            );

            require(
                recoveredAddress != address(0) && recoveredAddress == owner,
                "INVALID_SIGNER"
            );

            _$().allowances[recoveredAddress][spender] = value;
        }

        emit Approval(owner, spender, value);
    }

    function DOMAIN_SEPARATOR() public view returns (bytes32) {
        return
            block.chainid == INITIAL_CHAIN_ID_VALUE
                ? INITIAL_DOMAIN_SEPARATOR
                : _domain(_name);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"payable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"uint256","name":"limit","type":"uint256"},{"internalType":"uint256","name":"current","type":"uint256"}],"name":"BlockLimitExceeded","type":"error"},{"inputs":[{"internalType":"string","name":"details","type":"string"}],"name":"FailedCall","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"currentAllowance","type":"uint256"},{"internalType":"uint256","name":"askingAmount","type":"uint256"}],"name":"InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"uint256","name":"available","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"InvalidRecipient","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"InvalidSpender","type":"error"},{"inputs":[{"internalType":"uint256","name":"balanceLimit","type":"uint256"},{"internalType":"uint256","name":"amountsTransfer","type":"uint256"},{"internalType":"uint256","name":"recipientBalanceAfter","type":"uint256"}],"name":"MaxWalletLimitExceeded","type":"error"},{"inputs":[],"name":"TradingNotEnabled","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AutoSwapped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"source","type":"address"},{"indexed":true,"internalType":"address","name":"origin","type":"address"},{"components":[{"internalType":"enum TERMS","name":"terms","type":"uint8"},{"internalType":"enum ROUTE","name":"routes","type":"uint8"},{"internalType":"enum MARKET","name":"market","type":"uint8"},{"internalType":"enum TAXATION","name":"taxation","type":"uint8"},{"components":[{"internalType":"uint16","name":"buyTax","type":"uint16"},{"internalType":"uint16","name":"sellTax","type":"uint16"},{"internalType":"uint16","name":"transferTax","type":"uint16"}],"internalType":"struct TaxSettings","name":"rates","type":"tuple"}],"indexed":false,"internalType":"struct Transaction","name":"Tx","type":"tuple"}],"name":"TX","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"taxPayer","type":"address"},{"components":[{"internalType":"enum TERMS","name":"terms","type":"uint8"},{"internalType":"enum ROUTE","name":"routes","type":"uint8"},{"internalType":"enum MARKET","name":"market","type":"uint8"},{"internalType":"enum TAXATION","name":"taxation","type":"uint8"},{"components":[{"internalType":"uint16","name":"buyTax","type":"uint16"},{"internalType":"uint16","name":"sellTax","type":"uint16"},{"internalType":"uint16","name":"transferTax","type":"uint16"}],"internalType":"struct TaxSettings","name":"rates","type":"tuple"}],"indexed":true,"internalType":"struct Transaction","name":"$TX","type":"tuple"},{"indexed":false,"internalType":"uint80","name":"amount","type":"uint80"}],"name":"TaxReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAIR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"approveMax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"approveSelf","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"decreaseTax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initLiquidity","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"initialSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"listPayees","outputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint16","name":"share","type":"uint16"},{"internalType":"address payable","name":"to","type":"address"}],"internalType":"struct Payee[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recoverERC20","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recoverERC20","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"recoverETH","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recoverETH","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeTaxPayees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"autoLiquidity","type":"uint16"},{"internalType":"uint16","name":"surchargeRate","type":"uint16"},{"internalType":"uint8","name":"maxSellOnBlock","type":"uint8"},{"internalType":"uint8","name":"frontRunThreshold","type":"uint8"},{"internalType":"uint120","name":"maxTokenAllowed","type":"uint120"},{"internalType":"uint24","name":"preferredGasValue","type":"uint24"},{"components":[{"internalType":"uint16","name":"buyTax","type":"uint16"},{"internalType":"uint16","name":"sellTax","type":"uint16"},{"internalType":"uint16","name":"transferTax","type":"uint16"}],"internalType":"struct TaxSettings","name":"taxSettings","type":"tuple"}],"name":"setConfigValues","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint8","name":"idx","type":"uint8"}],"name":"setIdentifier","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint16","name":"share","type":"uint16"},{"internalType":"address payable","name":"to","type":"address"}],"internalType":"struct Payee[]","name":"payees","type":"tuple[]"}],"name":"setPayees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint8","name":"idx","type":"uint8"}],"name":"toggleConfig","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint8","name":"idx","type":"uint8"}],"name":"unsetIdentifier","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"viewConfigOptions","outputs":[{"internalType":"bool","name":"$FAIR_MODE","type":"bool"},{"internalType":"bool","name":"$SELL_CAP","type":"bool"},{"internalType":"bool","name":"$TAX_STATS","type":"bool"},{"internalType":"bool","name":"$GAS_LIMITER","type":"bool"},{"internalType":"bool","name":"$AUTO_LIQUIDITY","type":"bool"},{"internalType":"bool","name":"$TRADING_ENABLED","type":"bool"},{"internalType":"bool","name":"$AUTOSWAP_ENABLED","type":"bool"},{"internalType":"bool","name":"$AUTOSWAP_THRESHOLD","type":"bool"},{"internalType":"bool","name":"$FRONTRUN_PROTECTION","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"viewConfigValues","outputs":[{"internalType":"uint16","name":"autoLiquidity","type":"uint16"},{"internalType":"uint16","name":"surchargeRate","type":"uint16"},{"internalType":"uint8","name":"maxSellOnBlock","type":"uint8"},{"internalType":"uint8","name":"frontRunThreshold","type":"uint8"},{"internalType":"uint120","name":"maxTokenAllowed","type":"uint120"},{"internalType":"uint24","name":"preferredGasValue","type":"uint24"},{"components":[{"internalType":"uint16","name":"buyTax","type":"uint16"},{"internalType":"uint16","name":"sellTax","type":"uint16"},{"internalType":"uint16","name":"transferTax","type":"uint16"}],"internalType":"struct TaxSettings","name":"taxSettings","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"viewHolder","outputs":[{"components":[{"internalType":"uint120","name":"balance","type":"uint120"},{"internalType":"uint120","name":"paidTax","type":"uint120"},{"internalType":"uint8","name":"violated","type":"uint8"},{"internalType":"uint40","name":"lastBuy","type":"uint40"},{"internalType":"uint40","name":"lastSell","type":"uint40"},{"internalType":"address","name":"Address","type":"address"},{"internalType":"uint16","name":"identities","type":"uint16"}],"internalType":"struct Holder","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60e06040523060c0526200008173ab1c0dedc9038b91783fcc6be6cf4333d4dc0aae5f527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db76020527f3b1fbeee54c5ef05bd661a30f00b5a22d3fe49d0a8447a8a76a9254449690a6280546001600160f01b031661081360f31b179055600190565b506200009662000090620002d4565b620002e4565b4660805260408051808201909152600b81526a11dc99595b88145d595cdd60aa1b6020820152620000c79062000354565b60a081815250505f62000274737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000124573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200014a919062000eea565b6001600160a01b031663c9c6539660c051737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001ac573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001d2919062000eea565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af11580156200021d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000243919062000eea565b620002516012600a62001026565b6200026090620f424062001036565b60c0516001600160a01b0316919062000366565b9150620002829050620002d4565b6040516001600160781b03831681526001600160a01b0391909116905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35062001200565b5f620002df620005c1565b905090565b7f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db280546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f62000360826200061c565b92915050565b5f806001600160501b03831115620003b55760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908105b5bdd5b9d60921b604482015260640160405180910390fd5b7f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db15f620003e38288620006ec565b90505f620003f28333620006ec565b90505f6200041584737a250d5630b4cf539739df2c5dacb4c659f2488d620006ec565b90505f62000424858a620006ec565b600180860180546001600160a01b036a01000000000000000000009182900481165f90815260098b01602081815260408084208c8901548790048616855282528084205f19908190558754879004861685528383528185208c8a01548890048716865283528185208190559654869004851684529181528183209688015494909404909216815293909152909120559050612710611964890285549190046001600160781b038181166001600160781b0319938416811788558654909316928b0390811692909217855597509550620005076200050185620007f7565b62000824565b506200051d620005178462000851565b620007f7565b5062000529816200087e565b5060018301546002860180546001600160a01b0319166001600160a01b036a0100000000000000000000909304831617905585546001600160501b038a16620100000262010000600160601b0319928c166c01000000000000000000000000029290921661ffff90911617178555620005a68560038101620008ab565b620005b46005860162000995565b5050505050935093915050565b5f30330362000616575f80368080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050503601516001600160a01b03169150620006199050565b50335b90565b5f6040518060800160405280605f815260200162005e57605f91398051602091820120835184830120604080518082019091526004815263076312e360e41b930192909252907fe8245ed8f93ccf147bc8972ab6d5f8278ed994d647700daaa5b7ebde9370aa6f46604080516020810195909552840192909252606083015260808201523060a08201527fbffcd4a1e0307336f6fcccc7c8177db5faa17bd19405109da6225e44affef9b260c082015260e001604051602081830303815290604052805190602001209050919050565b6001600160a01b038181165f908152600684016020908152604091829020825160e08101845281546001600160781b038082168352600160781b82041693820193909352600160f01b9283900460ff1693810193909352600181015464ffffffffff80821660608601526501000000000082041660808501526a0100000000000000000000810490941660a0840152920461ffff1660c0820152620007919062000e87565b6200036057600181018054600160501b600160f01b0319166a01000000000000000000006001600160a01b038516021790819055600160f01b900461ffff1660021781600101601e6101000a81548161ffff021916908361ffff16021790555092915050565b600181018054600160f01b80820461ffff1661080017026001600160f01b039091161790555f8162000360565b600181018054600160f01b80820461ffff1661100017026001600160f01b039091161790555f8162000360565b600181018054600160f01b80820461ffff1661400017026001600160f01b039091161790555f8162000360565b600181018054600160f01b80820461ffff1661040017026001600160f01b039091161790555f8162000360565b805467ffffffffffff000062ffffff60b81b011916790493e000000000000000000000000000000003030ce403e8000017815560018101805465ffffffffffff1916650b540b540b5417905562000903815f62000e9c565b506200091181600162000e9c565b506200091f81600262000e9c565b506200092d81600462000e9c565b506200093b81600662000e9c565b506200094981600762000e9c565b50815462000969906064906201000090046001600160501b031662001050565b8154600160401b600160b81b0319166001600160501b0391909116680100000000000000000217905550565b6040805160a08101825260076060820190815266436f6d70616e7960c81b608083015281526104b060208083019190915273db2d5d4bc08cba993dade25168d70f80323220a49282019290925282546001810184555f84815292909220815191926002020190819062000a09908262001120565b50602082810151600192830180546040958601516001600160a01b031662010000026001600160b01b031990911661ffff90931692909217919091179055825160a081018452600960608201908152684d61726b6574696e6760b81b60808301528152610578818301527317a68a8ac6f3d48274f5ff7a5adda4662a3a746d93810193909352835491820184555f8481522082516002929092020190819062000ab3908262001120565b50602082810151600192830180546040958601516001600160a01b031662010000026001600160b01b031990911661ffff90931692909217919091179055825160a081018452600b606082019081526a11195d995b1bdc1b595b9d60aa1b608083015281526105788183015273f7db237c302647cb4bbbe87b733fcb0b947a1c3993810193909352835491820184555f8481522082516002929092020190819062000b5f908262001120565b50602082810151600192830180546040958601516001600160a01b031662010000026001600160b01b031990911661ffff90931692909217919091179055825160a081018452600d606082019081526c526576656e756520536861726560981b608083015281526107d08183015273e3c88222808bff4939a88e4eba5931011850562993810193909352835491820184555f8481522082516002929092020190819062000c0d908262001120565b50602082810151600192830180546040958601516001600160a01b031662010000026001600160b01b031990911661ffff90931692909217919091179055825160a0810184526013606082019081527f5265776172647320506f6f6c2023312044617900000000000000000000000000608083015281526104b081830152732adf65320ad204ecee090c71d0b922c69aeb7e5793810193909352835491820184555f8481522082516002929092020190819062000ccb908262001120565b50602082810151600192830180546040958601516001600160a01b031662010000026001600160b01b031990911661ffff90931692909217919091179055825160a0810184526013606082019081527f5265776172647320506f6f6c2023372044617900000000000000000000000000608083015281526103e8818301527360ab19dcf90d0321380eedfd5dda9fe3f3a7ab6493810193909352835491820184555f8481522082516002929092020190819062000d89908262001120565b50602082810151600192830180546040958601516001600160a01b031662010000026001600160b01b031990911661ffff90931692909217919091179055825160a0810184526014606082019081527f5265776172647320506f6f6c2023333020446179000000000000000000000000608083015281526103208183015273b234647909e7c731536f3ea230ef9b1c251bc73b93810193909352835491820184555f8481522082516002929092020190819062000e47908262001120565b506020820151600190910180546040909301516001600160a01b031662010000026001600160b01b031990931661ffff9092169190911791909117905550565b60c08101515f90600190811c81161462000360565b81545f9061ffff1662000ece83600881111562000ebd5762000ebd620011ec565b600160ff9091161b61ffff83161890565b845461ffff191661ffff91909116908117909455509192915050565b5f6020828403121562000efb575f80fd5b81516001600160a01b038116811462000f12575f80fd5b9392505050565b634e487b7160e01b5f52601160045260245ffd5b600181815b8085111562000f6d57815f190482111562000f515762000f5162000f19565b8085161562000f5f57918102915b93841c939080029062000f32565b509250929050565b5f8262000f855750600162000360565b8162000f9357505f62000360565b816001811462000fac576002811462000fb75762000fd7565b600191505062000360565b60ff84111562000fcb5762000fcb62000f19565b50506001821b62000360565b5060208310610133831016604e8410600b841016171562000ffc575081810a62000360565b62001008838362000f2d565b805f19048211156200101e576200101e62000f19565b029392505050565b5f62000f1260ff84168362000f75565b808202811582820484141762000360576200036062000f19565b5f6001600160501b03838116806200107657634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b634e487b7160e01b5f52604160045260245ffd5b600181811c90821680620010ab57607f821691505b602082108103620010ca57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200111b57805f5260205f20601f840160051c81016020851015620010f75750805b601f840160051c820191505b8181101562001118575f815560010162001103565b50505b505050565b81516001600160401b038111156200113c576200113c62001082565b62001154816200114d845462001096565b84620010d0565b602080601f8311600181146200118a575f8415620011725750858301515b5f19600386901b1c1916600185901b178555620011e4565b5f85815260208120601f198616915b82811015620011ba5788860151825594840194600190910190840162001199565b5085821015620011d857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b634e487b7160e01b5f52602160045260245ffd5b60805160a05160c051614bd1620012865f395f8181610abb01528181610b18015281816112e70152818161134d015281816114cd01528181611adb0152818161236b01528181612d1c01528181612d580152818161328501528181613404015281816134900152818161375c015261382801525f610ea401525f610e4b0152614bd15ff3fe608060405260043610610246575f3560e01c8063715018a611610131578063ace3a8a7116100ac578063d6a581c31161007c578063dd62ed3e11610062578063dd62ed3e14610a0f578063f2fde38b14610a72578063ff71332314610a91575f80fd5b8063d6a581c3146106f2578063d79cda6c14610897575f80fd5b8063ace3a8a714610615578063b93050b91461064e578063d3335553146106b4578063d505accf146106d3575f80fd5b80638f135b3a11610101578063a64dea88116100e7578063a64dea88146105cf578063a9059cbb146105ee578063a965a51b1461060d575f80fd5b80638f135b3a1461056b57806395d89b411461058a575f80fd5b8063715018a6146104d25780638980f11f146104e85780638a8c523c146105075780638da5cb5b1461051b575f80fd5b8063313ce567116101c157806342966c6811610191578063571ac8b011610177578063571ac8b0146104365780636284b6331461045557806370a0823114610476575f80fd5b806342966c681461040357806344fc18eb14610422575f80fd5b8063313ce567146103ac5780633644e515146103c7578063378dc3dc146103db57806341e00bb9146103ef575f80fd5b80630ef6abd01161021657806318a94b0f116101fc57806318a94b0f1461034f57806323b872dd1461036e5780632ace1a291461038d575f80fd5b80630ef6abd0146102f457806318160ddd14610313575f80fd5b80630614117a1461025157806306fdde031461027a578063095ea7b3146102b65780630c6d27ae146102d5575f80fd5b3661024d57005b5f80fd5b34801561025c575f80fd5b50610265610ab0565b60405190151581526020015b60405180910390f35b348015610285575f80fd5b5060408051808201909152600b81526a11dc99595b88145d595cdd60aa1b60208201525b6040516102719190614297565b3480156102c1575f80fd5b506102656102d03660046142bd565b610aed565b3480156102e0575f80fd5b506102656102ef3660046142e7565b610b0a565b3480156102ff575f80fd5b5061026561030e366004614391565b610b48565b34801561031e575f80fd5b505f80516020614b1d8339815191525462010000900469ffffffffffffffffffff165b604051908152602001610271565b34801561035a575f80fd5b5061026561036936600461446b565b610cb2565b348015610379575f80fd5b50610265610388366004614484565b610d00565b348015610398575f80fd5b506102656103a73660046144c2565b610df5565b3480156103b7575f80fd5b5060405160128152602001610271565b3480156103d2575f80fd5b50610341610e48565b3480156103e6575f80fd5b50610341610ec6565b3480156103fa575f80fd5b50610265610ee2565b34801561040e575f80fd5b5061026561041d3660046144f5565b610fc9565b34801561042d575f80fd5b50610265610fdb565b348015610441575f80fd5b506102656104503660046142e7565b611014565b348015610460575f80fd5b50610469611028565b604051610271919061450c565b348015610481575f80fd5b506103416104903660046142e7565b6001600160a01b03165f9081527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db760205260409020546001600160781b031690565b3480156104dd575f80fd5b506104e661114d565b005b3480156104f3575f80fd5b506102656105023660046142bd565b611160565b348015610512575f80fd5b506104e661116b565b348015610526575f80fd5b507f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db2546001600160a01b03165b6040516001600160a01b039091168152602001610271565b348015610576575f80fd5b506102656105853660046144f5565b6112dd565b348015610595575f80fd5b5060408051808201909152600581527f475245454e00000000000000000000000000000000000000000000000000000060208201526102a9565b3480156105da575f80fd5b506102656105e93660046145a5565b611372565b3480156105f9575f80fd5b506102656106083660046142bd565b611473565b610265611486565b348015610620575f80fd5b505f80516020614b1d833981519152546c0100000000000000000000000090046001600160a01b0316610553565b348015610659575f80fd5b50610662611615565b604080519915158a5297151560208a01529515159688019690965292151560608701529015156080860152151560a0850152151560c084015290151560e0830152151561010082015261012001610271565b3480156106bf575f80fd5b506102656106ce3660046144f5565b611770565b3480156106de575f80fd5b506104e66106ed366004614700565b61177a565b3480156106fd575f80fd5b5060408051606080820183525f8083526020808401829052928401528251610100810184527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db45461ffff80821683526201000080830482168487019081526401000000008085048416868a019081526601000000000000860460ff908116888a019081526701000000000000008804909116608089019081526801000000000000000088046001600160781b031660a08a01908152600160b81b90980462ffffff1660c08a019081528c519a8b018d527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db5548089168c5296870488169b8b019b909b52929094049094169887019890985260e09094018590529251905192519551915194519095929492939192916040805161ffff988916815296881660208089019190915260ff968716888301529590941660608701526001600160781b03909216608086015262ffffff1660a08501528051851660c085015291820151841660e0840152015190911661010082015261012001610271565b3480156108a2575f80fd5b506109906108b13660046142e7565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091525f80516020614b1d8339815191526001600160a01b039283165f9081526006919091016020908152604091829020825160e08101845281546001600160781b038082168352600160781b82041693820193909352600160f01b9283900460ff16938101939093526001015464ffffffffff8082166060850152650100000000008204166080840152600160501b810490941660a083015290920461ffff1660c08301525090565b60405161027191905f60e0820190506001600160781b038084511683528060208501511660208401525060ff6040840151166040830152606083015164ffffffffff808216606085015280608086015116608085015250506001600160a01b0360a08401511660a083015261ffff60c08401511660c083015292915050565b348015610a1a575f80fd5b50610341610a29366004614769565b6001600160a01b039182165f9081527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4dba6020908152604080832093909416825291909152205490565b348015610a7d575f80fd5b506104e6610a8c3660046142e7565b611a19565b348015610a9c575f80fd5b50610265610aab3660046144c2565b611aa6565b5f6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001631610ae581611ad2565b600191505090565b5f610b00610af9611b5b565b8484611b64565b5060015b92915050565b5f610b13611b76565b610b3f7f0000000000000000000000000000000000000000000000000000000000000000835f19611b64565b5060015b919050565b5f610b51611b76565b507f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db4805465ffffffff000019166201000061ffff998a16810265ffff000000001990811692909217640100000000998b168a021767ffff0000000000001916660100000000000060ff998a160267ff000000000000001916176701000000000000009790981696909602969096177fffffffffffff000000000000000000000000000000000000ffffffffffffffff16680100000000000000006001600160781b0395909516949094027fffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffff1693909317600160b81b62ffffff93909316929092029190911790915580517f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db58054602084015160409094015192881663ffffffff19909116179287169093029190911790921691909316909102179055600190565b5f610cbb611b76565b7f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db4805461ffff19811661ffff918216600160ff87161b18909116908117909155610b00565b5f80610d0a611b5b565b6001600160a01b038681165f9081527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4dba60209081526040808320938516835292905220549091505f198114610ddb5780841115610db9576040517f91beda240000000000000000000000000000000000000000000000000000000081526001600160a01b0380841660048301528716602482015260448101829052606481018590526084015b60405180910390fd5b5f848211610dc7575f610dcb565b8482035b9050610dd98784835f611be5565b505b610de6868686611d56565b506001925050505b9392505050565b5f610dfe611b76565b6001600160a01b0383165f9081527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db760205260409020610e3e9083612ae6565b5060019392505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610ea157610e9c6040518060400160405280600b81526020016a11dc99595b88145d595cdd60aa1b815250612b61565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b610ed26012600a614894565b610edf90620f42406148a2565b81565b5f610eeb611b76565b7f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db580546101f464010000000090910461ffff161015610f6c5760405162461bcd60e51b815260206004820152601c60248201527f4e6f206d6f7265206465637265616d656e7420617661696c61626c65000000006044820152606401610db0565b8054640100000000620100006101f31961ffff8085168201811661ffff198616811784900482168301821690930263ffffffff19909516909217939093178281048216909301160265ffff00000000199091161790555060015b90565b5f610b3f610fd5611b5b565b83612b6b565b5f610fe4611b76565b61100e7f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db65f614070565b50600190565b5f610b3f611020611b5b565b835f19611b64565b60605f80516020614b1d833981519152600501805480602002602001604051908101604052809291908181526020015f905b82821015611144578382905f5260205f2090600202016040518060600160405290815f8201805461108a906148b9565b80601f01602080910402602001604051908101604052809291908181526020018280546110b6906148b9565b80156111015780601f106110d857610100808354040283529160200191611101565b820191905f5260205f20905b8154815290600101906020018083116110e457829003601f168201915b505050918352505060019182015461ffff8116602080840191909152620100009091046001600160a01b031660409092019190915291835292909201910161105a565b50505050905090565b611155611b76565b61115e5f612c91565b565b5f610dee8383612d19565b611173611b76565b60408051610100810182527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db45461ffff80821683526201000080830482166020808601919091526401000000008085048416868801526601000000000000850460ff908116606080890191909152670100000000000000870490911660808801526801000000000000000086046001600160781b031660a0880152600160b81b90950462ffffff1660c0870152865194850187527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db55480851686529283048416918501919091529004169281019290925260e0810191909152611277906005612dd8565b156112c45760405162461bcd60e51b815260206004820152601a60248201527f54726164696e6720697320616c726561647920656e61626c65640000000000006044820152606401610db0565b6112da5f80516020614b1d833981519152612e03565b50565b5f815f03611348577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165f9081527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db760205260409020546001600160781b031691505b610b047f000000000000000000000000000000000000000000000000000000000000000083612d19565b5f61137b611b76565b6113a57f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db65f614070565b81517f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db6905f5b8181101561146857828582815181106113e6576113e66148eb565b60209081029190910181015182546001810184555f938452919092208251600290920201908190611417908261494a565b506020820151600190910180546040909301516001600160a01b0316620100000275ffffffffffffffffffffffffffffffffffffffffffff1990931661ffff909216919091179190911790556113cb565b506001949350505050565b5f610e3e61147f611b5b565b8484611d56565b5f61148f611b76565b5f80516020614b1d833981519152805460ff19166001179055737a250d5630b4cf539739df2c5dacb4c659f2488d63f305d719346001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081165f8181527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db76020526040808220547f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db35482517fffffffff0000000000000000000000000000000000000000000000000000000060e08a901b16815260048101959095526001600160781b039091166024850152604484018390526064840192909252921660848201524260a4820152905160c4808301926060929190829003018185885af11580156115c2573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906115e79190614a06565b505050600190505f6116035f80516020614b1d83398151915290565b805460ff191691151591909117905590565b5f8080808080808080805f80516020614b1d8339815191526040805161010081018252600383015461ffff80821683526201000080830482166020808601919091526401000000008085048416868801526601000000000000850460ff908116606080890191909152670100000000000000870490911660808801526801000000000000000086046001600160781b031660a0880152600160b81b90950462ffffff1660c0870152865194850187526004909701548084168552918204831690840152949094049093169183019190915260e081019190915290506116fa815f612dd8565b9950611707816001612dd8565b9850611714816002612dd8565b9750611721816003612dd8565b965061172e816004612dd8565b955061173b816005612dd8565b9450611748816006612dd8565b9350611755816007612dd8565b9250611762816008612dd8565b915050909192939495969798565b5f610b3f82611ad2565b428410156117ca5760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f455850495245440000000000000000006044820152606401610db0565b5f60016117d5610e48565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a5f80516020614b1d8339815191526001600160a01b038f81165f90815260079290920160209081526040928390208054600181019091558351808301989098529582168784015293166060860152608085019190915260a084019290925260c08084018b90528251808503909101815260e0840190925281519101207f19010000000000000000000000000000000000000000000000000000000000006101008301526101028201929092526101228101919091526101420160408051601f1981840301815282825280516020918201205f84529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa15801561190d573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b038116158015906119435750876001600160a01b0316816001600160a01b0316145b61198f5760405162461bcd60e51b815260206004820152600e60248201527f494e56414c49445f5349474e45520000000000000000000000000000000000006044820152606401610db0565b6001600160a01b039081165f9081527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4dba602090815260408083208a8516808552908352928190208990558051898152905192938b16927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a350505050505050565b611a21611b76565b6001600160a01b038116611a9d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610db0565b6112da81612c91565b5f611aaf611b76565b610e3e82611acc855f80516020614b1d8339815191525b90612e28565b90612f37565b805f03611b09577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031631611b0b565b805b9050611b57815f80516020614b1d83398151915260030154600160b81b900462ffffff16611b435f80516020614b1d83398151915290565b600201546001600160a01b03169190612f58565b5050565b5f610e9c61300d565b611b718383836001611be5565b505050565b611b7e611b5b565b6001600160a01b0316611b8f613065565b6001600160a01b03161461115e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610db0565b6001600160a01b038416611c27576040517f8bc146c40000000000000000000000000000000000000000000000000000000081525f6004820152602401610db0565b6001600160a01b038316611c69576040517f4e15efda0000000000000000000000000000000000000000000000000000000081525f6004820152602401610db0565b5f611c81855f80516020614b1d833981519152611ac6565b90505f611c9b855f80516020614b1d833981519152611ac6565b6001838101546001600160a01b03600160501b9182900481165f9081527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4dba6020908152604080832095870154949094049092168152929052902085905590508215611d4e57846001600160a01b0316866001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92586604051611d4591815260200190565b60405180910390a35b505050505050565b60408051610100810182527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db45461ffff80821683526201000080830482166020808601919091526401000000008085048416868801526601000000000000850460ff908116606080890191909152670100000000000000870490911660808801526801000000000000000086046001600160781b031660a0880152600160b81b90950462ffffff1660c0870152865194850187527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db55480851686529283048416918501919091529004169281019290925260e08101919091525f905f80516020614b1d8339815191529082611e6b8388612e28565b90505f611e788488612e28565b6001830154909150600160501b90046001600160a01b0316611ec8576040517f4c14f64c0000000000000000000000000000000000000000000000000000000081525f6004820152602401610db0565b6001810154600160501b90046001600160a01b0316611f15576040517f17858bbe0000000000000000000000000000000000000000000000000000000081525f6004820152602401610db0565b5f6123618488604051806101400160405280611f39611f32611b5b565b8b90612e28565b6040518060e00160405290815f82015f9054906101000a90046001600160781b03166001600160781b03166001600160781b031681526020015f8201600f9054906101000a90046001600160781b03166001600160781b03166001600160781b031681526020015f8201601e9054906101000a900460ff1660ff1660ff168152602001600182015f9054906101000a900464ffffffffff1664ffffffffff1664ffffffffff1681526020016001820160059054906101000a900464ffffffffff1664ffffffffff1664ffffffffff16815260200160018201600a9054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200160018201601e9054906101000a900461ffff1661ffff1661ffff16815250508152602001876040518060e00160405290815f82015f9054906101000a90046001600160781b03166001600160781b03166001600160781b031681526020015f8201600f9054906101000a90046001600160781b03166001600160781b03166001600160781b031681526020015f8201601e9054906101000a900460ff1660ff1660ff168152602001600182015f9054906101000a900464ffffffffff1664ffffffffff1664ffffffffff1681526020016001820160059054906101000a900464ffffffffff1664ffffffffff1664ffffffffff16815260200160018201600a9054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200160018201601e9054906101000a900461ffff1661ffff1661ffff16815250508152602001866040518060e00160405290815f82015f9054906101000a90046001600160781b03166001600160781b03166001600160781b031681526020015f8201600f9054906101000a90046001600160781b03166001600160781b03166001600160781b031681526020015f8201601e9054906101000a900460ff1660ff1660ff168152602001600182015f9054906101000a900464ffffffffff1664ffffffffff1664ffffffffff1681526020016001820160059054906101000a900464ffffffffff1664ffffffffff1664ffffffffff16815260200160018201600a9054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200160018201601e9054906101000a900461ffff1661ffff1661ffff168152505081526020015f61ffff1681526020015f6001600160781b031681526020015f6001600160781b03168152602001895f015f9054906101000a900460ff16151581526020015f6001600160781b031681526020014364ffffffffff1681526020016040518060a001604052805f600181111561232857612328614a31565b600181111561233957612339614a31565b81526020015f81526020015f81526020015f815260e08b01516020909101529052919061306e565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165f908152600687016020526040902090915060016101208301515160018111156123b7576123b7614a31565b036124255760018261012001516060015160028111156123d9576123d9614a31565b141580156123f357505f82608001516001600160781b0316115b1561240757612407848284608001516130f7565b61241684848460a001516130f7565b60019650505050505050610dee565b600182610120015160600151600281111561244257612442614a31565b1415801561245c57505f82608001516001600160781b0316115b1561257557612470848284608001516130f7565b61247b856002612dd8565b801561249357505f82608001516001600160781b0316115b80156124ba575060018261012001516020015160028111156124b7576124b7614a31565b14155b156125755760028261012001516040015160038111156124dc576124dc614a31565b1461252d57608082015184546001600160781b03600160781b8083048216909301169091027fffff000000000000000000000000000000ffffffffffffffffffffffffffffff909116178455612575565b608082015183546001600160781b03600160781b8083048216909301169091027fffff000000000000000000000000000000ffffffffffffffffffffffffffffff9091161783555b61257f855f612dd8565b801561260e57506040805160e08101825284546001600160781b038082168352600160781b8204166020830152600160f01b9081900460ff1692820192909252600185015464ffffffffff8082166060840152650100000000008204166080830152600160501b81046001600160a01b031660a08301529190910461ffff1660c082015261260c9061318e565b155b1561269c575f82604001515f015190508560a001516001600160781b03168360a0015182016001600160781b0316111561269a5760a080870151908401516040517f4c97ce530000000000000000000000000000000000000000000000000000000081526001600160781b03928316600482015290821660248201529082166044820152606401610db0565b505b60028261012001516020015160028111156126b9576126b9614a31565b03612ac7576126c9856005612dd8565b6126ff576040517f12f1f92300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600382610120015160400151600381111561271c5761271c614a31565b036128945761272c856001612dd8565b156127c7576101008201805164ffffffffff9081165f908152600889016020526040808220805460ff198116600160ff92831601821617909155935190921681522054606087015190821691168111156127c55760608601516040517f539940b600000000000000000000000000000000000000000000000000000000815260ff91821660048201529082166024820152604401610db0565b505b608082015160a083015182546127e9926001600160781b0390911691886131a3565b6001600160781b031660e0830152612802856006612dd8565b801561281a57505f8260e001516001600160781b0316115b156128945760e0820151600287015461285191906001600160a01b0316612842886004612dd8565b88602001518960c00151613246565b60e08201516040516001600160781b0390911681527fa5adddab212845cc7ee210e0fd0ace2c98f2617fffcc214b3b957bb5cd33093d9060200160405180910390a15b61289f856008612dd8565b15612ac7576040805160e08101825285546001600160781b038082168352600160781b8204166020830152600160f01b9081900460ff1692820192909252600186015464ffffffffff8082166060840152650100000000008204166080830152600160501b81046001600160a01b031660a08301529190910461ffff1660c082015261292a90613889565b80156129505750600382610120015160400151600381111561294e5761294e614a31565b145b156129b857835460ff600160f01b9091048116101561298c578354600160ff600160f01b808404821692909201160260ff60f01b199091161784555b6080850151845460ff918216600160f01b909104909116036129b3576129b1846138e0565b505b612ac7565b6040805160e08101825284546001600160781b038082168352600160781b8204166020830152600160f01b9081900460ff1692820192909252600185015464ffffffffff8082166060840152650100000000008204166080830152600160501b81046001600160a01b031660a08301529190910461ffff1660c0820152612a3e90613889565b8015612a6457506002826101200151604001516003811115612a6257612a62614a31565b145b15612ac757825460ff600160f01b90910481161015612aa0578254600160ff600160f01b808404821692909201160260ff60f01b199091161783555b6080850151835460ff918216600160f01b90910490911603612ac757612ac5836138e0565b505b612ad684848460a001516130f7565b5060019998505050505050505050565b60018201545f90600160f01b900461ffff1660ff8316600203612b0f57835460ff60f01b191684555b600160ff84161b19811661ffff165b60018501805461ffff92909216600160f01b027dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055509192915050565b5f610b04826138ec565b6001600160a01b0382165f9081527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db76020526040902080545f80516020614b1d83398151915291906001600160781b031680841115612bef5760405163cf47918160e01b81526001600160781b038216600482015260248101859052604401610db0565b81546effffffffffffffffffffffffffffff19811669ffffffffffffffffffff8681166001600160781b039384160390921617835583546bffffffffffffffffffff000019811662010000918290048316879003909216021783556040518481525f906001600160a01b038716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050505050565b7f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db280546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031603612d9f57612d987f00000000000000000000000000000000000000000000000000000000000000005f80516020614b1d833981519152600201546001600160a01b031684611d56565b9050610b04565b7f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db354611468906001600160a01b038581169116846139d4565b5f610dee826008811115612dee57612dee614a31565b845161ffff1660ff9091161c60019081161490565b60038101805461ffff19811661ffff9182166020189091169081179091555f90610b00565b6001600160a01b038181165f908152600684016020908152604091829020825160e08101845281546001600160781b038082168352600160781b82041693820193909352600160f01b9283900460ff1693810193909352600181015464ffffffffff8082166060860152650100000000008204166080850152600160501b810490941660a0840152920461ffff1660c0820152612ec490613b14565b610b04576001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b038516021790819055600160f01b900461ffff1660021781600101601e6101000a81548161ffff021916908361ffff16021790555092915050565b6001828101545f91600160f01b90910461ffff169060ff84161b8117612b1e565b5f6001600160a01b038416612fb057604051633887280760e11b815260206004820152601960248201527f526563697069656e74206973205a65726f2041646472657373000000000000006044820152606401610db0565b5f846001600160a01b03168484906040515f60405180830381858888f193505050503d805f8114612ffc576040519150601f19603f3d011682016040523d82523d5f602084013e613001565b606091505b50909695505050505050565b5f303303613060575f80368080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050503601516001600160a01b03169150610fc69050565b503390565b5f610e9c613b28565b61307661408e565b6020840151516001600160781b03168211156130be5760208401515160405163cf47918160e01b81526001600160781b03909116600482015260248101839052604401610db0565b6130c88484613bbc565b5060608401516130d9908390613e3d565b6001600160781b0390811660a0870152166080850152509192915050565b82546effffffffffffffffffffffffffffff198082166001600160781b039283168490038316178555835490811690821683018216178355600183810154908501546040519284168352600160501b918290046001600160a01b03908116939290910416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b60c08101515f90600a1c600190811614610b04565b836131af826007612dd8565b1561323e576001600160781b03848401811690808516820190808716830190881682116131de5781935061323a565b876001600160781b031681116131f65780935061323a565b876001600160781b0316831161320e5782935061323a565b876001600160781b0316866001600160781b03161161322f5785935061323a565b87935050505061323e565b5050505b949350505050565b5f80516020614b1d833981519152805460ff1916600117815560408051600280825260608201835287925f9291906020830190803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000815f815181106132b6576132b66148eb565b60200260200101906001600160a01b031690816001600160a01b031681525050737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613326573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061334a9190614a45565b8160018151811061335d5761335d6148eb565b6001600160a01b03909216602092830291909101909101525f61271087801561338957505f8761ffff16115b156133dc5760028161ffff168861ffff168c026001600160781b0316816133b2576133b2614a60565b046001600160781b0316816133c9576133c9614a60565b049150600261ffff88169a8390039a0490035b6040517f791ac9470000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0381163191737a250d5630b4cf539739df2c5dacb4c659f2488d9163791ac9479161345f918f915f918a914290600401614a74565b5f604051808303815f87803b158015613476575f80fd5b505af1158015613488573d5f803e3d5ffd5b505050505f817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316316134c39190614aee565b90505f87600501805480602002602001604051908101604052809291908181526020015f905b828210156135d3578382905f5260205f2090600202016040518060600160405290815f82018054613519906148b9565b80601f0160208091040260200160405190810160405280929190818152602001828054613545906148b9565b80156135905780601f1061356757610100808354040283529160200191613590565b820191905f5260205f20905b81548152906001019060200180831161357357829003601f168201915b505050918352505060019182015461ffff8116602080840191909152620100009091046001600160a01b03166040909201919091529183529290920191016134e9565b5050825192935050811590506136f3575f5b818110156136f1575f838281518110613600576136006148eb565b60200260200101516020015161ffff1611156136e9575f8661ffff1684838151811061362e5761362e6148eb565b60200260200101516020015161ffff1686028161364d5761364d614a60565b0490505f6001600160a01b031684838151811061366c5761366c6148eb565b6020026020010151604001516001600160a01b0316036136a55761369f6001600160a01b038b168262ffffff8f16612f58565b506136e7565b6136e5818d62ffffff168685815181106136c1576136c16148eb565b6020026020010151604001516001600160a01b0316612f589092919063ffffffff16565b505b505b6001016135e5565b505b6001600160781b03861615613817575f60028661ffff168d61ffff1686028161371e5761371e614a60565b048161372c5761372c614a60565b6040517ff305d7190000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301526001600160781b038b1660248301525f6044830181905260648301528c1660848201524260a48201529190049150737a250d5630b4cf539739df2c5dacb4c659f2488d9063f305d71990839060c40160606040518083038185885af11580156137ed573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906138129190614a06565b505050505b6138546001600160a01b03898116907f0000000000000000000000000000000000000000000000000000000000000000163162ffffff8d16612f58565b505050505050505050505f6138735f80516020614b1d83398151915290565b805460ff19169115159190911790555050505050565b5f816060015164ffffffffff16826080015164ffffffffff16101580156138ba57505f826060015164ffffffffff16115b15610b4357600561ffff16826060015183608001510364ffffffffff1611159050919050565b5f610b04826002612f37565b5f6040518060800160405280605f8152602001614b3d605f9139805160209182012083518483012060408051808201909152600481527f76312e3000000000000000000000000000000000000000000000000000000000930192909252907fe8245ed8f93ccf147bc8972ab6d5f8278ed994d647700daaa5b7ebde9370aa6f46604080516020810195909552840192909252606083015260808201523060a08201527fbffcd4a1e0307336f6fcccc7c8177db5faa17bd19405109da6225e44affef9b260c082015260e001604051602081830303815290604052805190602001209050919050565b5f60606001600160a01b038416613a2e57604051633887280760e11b815260206004820152601960248201527f526563697069656e74206973205a65726f2041646472657373000000000000006044820152606401610db0565b604080516001600160a01b038681166024830152604480830187905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291515f92839290891691613ab79190614b01565b5f604051808303815f865af19150503d805f8114613af0576040519150601f19603f3d011682016040523d82523d5f602084013e613af5565b606091505b5091509150613b05878383613e75565b9350935050505b935093915050565b60c08101515f90600190811c811614610b04565b335f9081527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db76020527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db25460408220600101545f80516020614b1d833981519152919061400060f09190911c90811661800090911617151580613ba9578193505b60018103613bb6575f5193505b50505090565b613bc461408e565b8260c0015115613c1d576040805160a081019091528060018152602001600181526020016001815260200160018152604080516060810182525f8082526020828101829052928201529101526101208401525081610b04565b610120830180515f6040909101819052905160200152613c3c83613eec565b613c46575f613c49565b60015b610120840151906001811115613c6157613c61614a31565b90816001811115613c7457613c74614a31565b905250613c8083613f2d565b15613cd75761012083015160016060918201526040805180830182525f80825260208083018290529183018190528251938401835280845290830181905290820152610120840151608001525f6060840152613d5d565b610120830180515f60609091015260e0830151905160800152613cfb826008612dd8565b8015613d0b5750613d0b83613f4e565b15613d5d57610120830180516002606091820152604084810151815180840183525f8082526020808301829052918401528251938401835261ffff909116808452908301819052908201529051608001525b610120830151608001516040015161ffff1660608401526020830151613d829061318e565b80613d955750613d95836040015161318e565b15613e36576101208301516002602091820152830151613db49061318e565b15613df5576101208301805160026040918201526101008501519085015164ffffffffff9091166060918201529051608001515161ffff1690840152613e2f565b61012083018051600360409091015261010084015160208086015164ffffffffff90921660809283015291510151015161ffff1660608401525b5081610b04565b5090919050565b5f808261ffff165f03613e5457505f905082613e6e565b505061271061ffff82168302046001600160781b03811683035b9250929050565b5f606083613e8b57613e8683613f6f565b613b0c565b8251158015613ea05750613e9e85613fae565b155b15613ee2576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0386166004820152602401610db0565b5082905081613b0c565b5f613ef9825f0151613fb8565b80613f0c5750613f0c8260200151613fb8565b80613f1f5750613f1f8260400151613fb8565b80610b0457505060c0015190565b5f613f3b8260200151614007565b80610b045750610b048260400151614007565b5f613f5c8260200151614030565b80610b045750610b048260400151614030565b6112da816040518060400160405280601981526020017f416464726573734c69623a20556e6b6e6f776e204572726f7200000000000000815250614045565b5f813b1515610b04565b5f600c5b600c8160ff1610158015613fd3575060108160ff16105b156140015760c083015161ffff1660ff82161c600190811603613ff95750600192915050565b600101613fbc565b50919050565b60c08101515f90600b1c60019081161480610b04575060c0820151600b1c600190811614610b04565b60c08101515f9060021c600190811614610b04565b8151156140555781518083602001fd5b80604051633887280760e11b8152600401610db09190614297565b5080545f8255600202905f5260205f20908101906112da91906141c3565b6040805161022081019091525f6101408201818152610160830182905261018083018290526101a083018290526101c083018290526101e08301829052610200830191909152819081526040805160e0810182525f8082526020828101829052928201819052606082018190526080820181905260a0820181905260c082015291019081526040805160e0810182525f8082526020828101829052928201819052606082018190526080820181905260a0820181905260c082015291019081525f6020820181905260408201819052606082018190526080820181905260a0820181905260c082015260e0016141be6040805160a08101909152805f81526020015f81526020015f81526020015f8152604080516060810182525f80825260208281018290529282015291015290565b905290565b80821115614200575f6141d68282614204565b5060018101805475ffffffffffffffffffffffffffffffffffffffffffff191690556002016141c3565b5090565b508054614210906148b9565b5f825580601f1061421f575050565b601f0160209004905f5260205f20908101906112da91905b80821115614200575f8155600101614237565b5f5b8381101561426457818101518382015260200161424c565b50505f910152565b5f815180845261428381602086016020860161424a565b601f01601f19169290920160200192915050565b602081525f610dee602083018461426c565b6001600160a01b03811681146112da575f80fd5b5f80604083850312156142ce575f80fd5b82356142d9816142a9565b946020939093013593505050565b5f602082840312156142f7575f80fd5b8135610dee816142a9565b803561ffff81168114610b43575f80fd5b803560ff81168114610b43575f80fd5b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561435a5761435a614323565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561438957614389614323565b604052919050565b5f805f805f805f8789036101208112156143a9575f80fd5b6143b289614302565b97506143c060208a01614302565b96506143ce60408a01614313565b95506143dc60608a01614313565b945060808901356001600160781b03811681146143f7575f80fd5b935060a089013562ffffff8116811461440e575f80fd5b9250606060bf1982011215614421575f80fd5b5061442a614337565b61443660c08a01614302565b815261444460e08a01614302565b60208201526144566101008a01614302565b60408201528091505092959891949750929550565b5f6020828403121561447b575f80fd5b610dee82614313565b5f805f60608486031215614496575f80fd5b83356144a1816142a9565b925060208401356144b1816142a9565b929592945050506040919091013590565b5f80604083850312156144d3575f80fd5b82356144de816142a9565b91506144ec60208401614313565b90509250929050565b5f60208284031215614505575f80fd5b5035919050565b5f60208083018184528085518083526040925060408601915060408160051b8701018488015f5b8381101561458c57603f198984030185528151606081518186526145598287018261426c565b838b015161ffff16878c0152928901516001600160a01b0316958901959095525094870194925090860190600101614533565b509098975050505050505050565b8035610b43816142a9565b5f60208083850312156145b6575f80fd5b823567ffffffffffffffff808211156145cd575f80fd5b818501915085601f8301126145e0575f80fd5b8135818111156145f2576145f2614323565b8060051b614601858201614360565b918252838101850191858101908984111561461a575f80fd5b86860192505b838310156146f357823585811115614636575f80fd5b8601601f196060828d038201121561464c575f80fd5b614654614337565b8983013588811115614664575f80fd5b8301603f81018e13614674575f80fd5b8a81013560408a82111561468a5761468a614323565b61469a8d86601f85011601614360565b94508185528f818385010111156146af575f80fd5b818184018e8701375f8d83870101528484526146cc818701614302565b8d8501526146dc6060870161459a565b908401525050845250509186019190860190614620565b9998505050505050505050565b5f805f805f805f60e0888a031215614716575f80fd5b8735614721816142a9565b96506020880135614731816142a9565b9550604088013594506060880135935061474d60808901614313565b925060a0880135915060c0880135905092959891949750929550565b5f806040838503121561477a575f80fd5b8235614785816142a9565b91506020830135614795816142a9565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b600181815b808511156147ee57815f19048211156147d4576147d46147a0565b808516156147e157918102915b93841c93908002906147b9565b509250929050565b5f8261480457506001610b04565b8161481057505f610b04565b816001811461482657600281146148305761484c565b6001915050610b04565b60ff841115614841576148416147a0565b50506001821b610b04565b5060208310610133831016604e8410600b841016171561486f575081810a610b04565b61487983836147b4565b805f190482111561488c5761488c6147a0565b029392505050565b5f610dee60ff8416836147f6565b8082028115828204841417610b0457610b046147a0565b600181811c908216806148cd57607f821691505b60208210810361400157634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b601f821115611b7157805f5260205f20601f840160051c810160208510156149245750805b601f840160051c820191505b81811015614943575f8155600101614930565b5050505050565b815167ffffffffffffffff81111561496457614964614323565b6149788161497284546148b9565b846148ff565b602080601f8311600181146149ab575f84156149945750858301515b5f19600386901b1c1916600185901b178555611d4e565b5f85815260208120601f198616915b828110156149d9578886015182559484019460019091019084016149ba565b50858210156149f657878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f805f60608486031215614a18575f80fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b5f52602160045260245ffd5b5f60208284031215614a55575f80fd5b8151610dee816142a9565b634e487b7160e01b5f52601260045260245ffd5b5f60a082016001600160781b0388168352602087602085015260a0604085015281875180845260c0860191506020890193505f5b81811015614acd5784516001600160a01b031683529383019391830191600101614aa8565b50506001600160a01b03969096166060850152505050608001529392505050565b81810381811115610b0457610b046147a0565b5f8251614b1281846020870161424a565b919091019291505056fe5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db1454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e74726163742c627974657333322073616c7429a2646970667358221220092566d08802bb325f0103e73f67d2b358e3e10b2a196ca378615a20d93dc98a64736f6c63430008180033454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e74726163742c627974657333322073616c7429

Deployed Bytecode

0x608060405260043610610246575f3560e01c8063715018a611610131578063ace3a8a7116100ac578063d6a581c31161007c578063dd62ed3e11610062578063dd62ed3e14610a0f578063f2fde38b14610a72578063ff71332314610a91575f80fd5b8063d6a581c3146106f2578063d79cda6c14610897575f80fd5b8063ace3a8a714610615578063b93050b91461064e578063d3335553146106b4578063d505accf146106d3575f80fd5b80638f135b3a11610101578063a64dea88116100e7578063a64dea88146105cf578063a9059cbb146105ee578063a965a51b1461060d575f80fd5b80638f135b3a1461056b57806395d89b411461058a575f80fd5b8063715018a6146104d25780638980f11f146104e85780638a8c523c146105075780638da5cb5b1461051b575f80fd5b8063313ce567116101c157806342966c6811610191578063571ac8b011610177578063571ac8b0146104365780636284b6331461045557806370a0823114610476575f80fd5b806342966c681461040357806344fc18eb14610422575f80fd5b8063313ce567146103ac5780633644e515146103c7578063378dc3dc146103db57806341e00bb9146103ef575f80fd5b80630ef6abd01161021657806318a94b0f116101fc57806318a94b0f1461034f57806323b872dd1461036e5780632ace1a291461038d575f80fd5b80630ef6abd0146102f457806318160ddd14610313575f80fd5b80630614117a1461025157806306fdde031461027a578063095ea7b3146102b65780630c6d27ae146102d5575f80fd5b3661024d57005b5f80fd5b34801561025c575f80fd5b50610265610ab0565b60405190151581526020015b60405180910390f35b348015610285575f80fd5b5060408051808201909152600b81526a11dc99595b88145d595cdd60aa1b60208201525b6040516102719190614297565b3480156102c1575f80fd5b506102656102d03660046142bd565b610aed565b3480156102e0575f80fd5b506102656102ef3660046142e7565b610b0a565b3480156102ff575f80fd5b5061026561030e366004614391565b610b48565b34801561031e575f80fd5b505f80516020614b1d8339815191525462010000900469ffffffffffffffffffff165b604051908152602001610271565b34801561035a575f80fd5b5061026561036936600461446b565b610cb2565b348015610379575f80fd5b50610265610388366004614484565b610d00565b348015610398575f80fd5b506102656103a73660046144c2565b610df5565b3480156103b7575f80fd5b5060405160128152602001610271565b3480156103d2575f80fd5b50610341610e48565b3480156103e6575f80fd5b50610341610ec6565b3480156103fa575f80fd5b50610265610ee2565b34801561040e575f80fd5b5061026561041d3660046144f5565b610fc9565b34801561042d575f80fd5b50610265610fdb565b348015610441575f80fd5b506102656104503660046142e7565b611014565b348015610460575f80fd5b50610469611028565b604051610271919061450c565b348015610481575f80fd5b506103416104903660046142e7565b6001600160a01b03165f9081527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db760205260409020546001600160781b031690565b3480156104dd575f80fd5b506104e661114d565b005b3480156104f3575f80fd5b506102656105023660046142bd565b611160565b348015610512575f80fd5b506104e661116b565b348015610526575f80fd5b507f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db2546001600160a01b03165b6040516001600160a01b039091168152602001610271565b348015610576575f80fd5b506102656105853660046144f5565b6112dd565b348015610595575f80fd5b5060408051808201909152600581527f475245454e00000000000000000000000000000000000000000000000000000060208201526102a9565b3480156105da575f80fd5b506102656105e93660046145a5565b611372565b3480156105f9575f80fd5b506102656106083660046142bd565b611473565b610265611486565b348015610620575f80fd5b505f80516020614b1d833981519152546c0100000000000000000000000090046001600160a01b0316610553565b348015610659575f80fd5b50610662611615565b604080519915158a5297151560208a01529515159688019690965292151560608701529015156080860152151560a0850152151560c084015290151560e0830152151561010082015261012001610271565b3480156106bf575f80fd5b506102656106ce3660046144f5565b611770565b3480156106de575f80fd5b506104e66106ed366004614700565b61177a565b3480156106fd575f80fd5b5060408051606080820183525f8083526020808401829052928401528251610100810184527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db45461ffff80821683526201000080830482168487019081526401000000008085048416868a019081526601000000000000860460ff908116888a019081526701000000000000008804909116608089019081526801000000000000000088046001600160781b031660a08a01908152600160b81b90980462ffffff1660c08a019081528c519a8b018d527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db5548089168c5296870488169b8b019b909b52929094049094169887019890985260e09094018590529251905192519551915194519095929492939192916040805161ffff988916815296881660208089019190915260ff968716888301529590941660608701526001600160781b03909216608086015262ffffff1660a08501528051851660c085015291820151841660e0840152015190911661010082015261012001610271565b3480156108a2575f80fd5b506109906108b13660046142e7565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091525f80516020614b1d8339815191526001600160a01b039283165f9081526006919091016020908152604091829020825160e08101845281546001600160781b038082168352600160781b82041693820193909352600160f01b9283900460ff16938101939093526001015464ffffffffff8082166060850152650100000000008204166080840152600160501b810490941660a083015290920461ffff1660c08301525090565b60405161027191905f60e0820190506001600160781b038084511683528060208501511660208401525060ff6040840151166040830152606083015164ffffffffff808216606085015280608086015116608085015250506001600160a01b0360a08401511660a083015261ffff60c08401511660c083015292915050565b348015610a1a575f80fd5b50610341610a29366004614769565b6001600160a01b039182165f9081527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4dba6020908152604080832093909416825291909152205490565b348015610a7d575f80fd5b506104e6610a8c3660046142e7565b611a19565b348015610a9c575f80fd5b50610265610aab3660046144c2565b611aa6565b5f6001600160a01b037f0000000000000000000000002200ff8877aa8844aae5d06d7e9fc0b7e2d261581631610ae581611ad2565b600191505090565b5f610b00610af9611b5b565b8484611b64565b5060015b92915050565b5f610b13611b76565b610b3f7f0000000000000000000000002200ff8877aa8844aae5d06d7e9fc0b7e2d26158835f19611b64565b5060015b919050565b5f610b51611b76565b507f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db4805465ffffffff000019166201000061ffff998a16810265ffff000000001990811692909217640100000000998b168a021767ffff0000000000001916660100000000000060ff998a160267ff000000000000001916176701000000000000009790981696909602969096177fffffffffffff000000000000000000000000000000000000ffffffffffffffff16680100000000000000006001600160781b0395909516949094027fffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffff1693909317600160b81b62ffffff93909316929092029190911790915580517f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db58054602084015160409094015192881663ffffffff19909116179287169093029190911790921691909316909102179055600190565b5f610cbb611b76565b7f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db4805461ffff19811661ffff918216600160ff87161b18909116908117909155610b00565b5f80610d0a611b5b565b6001600160a01b038681165f9081527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4dba60209081526040808320938516835292905220549091505f198114610ddb5780841115610db9576040517f91beda240000000000000000000000000000000000000000000000000000000081526001600160a01b0380841660048301528716602482015260448101829052606481018590526084015b60405180910390fd5b5f848211610dc7575f610dcb565b8482035b9050610dd98784835f611be5565b505b610de6868686611d56565b506001925050505b9392505050565b5f610dfe611b76565b6001600160a01b0383165f9081527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db760205260409020610e3e9083612ae6565b5060019392505050565b5f7f00000000000000000000000000000000000000000000000000000000000000014614610ea157610e9c6040518060400160405280600b81526020016a11dc99595b88145d595cdd60aa1b815250612b61565b905090565b507fe14829b3329a1f2b4b206a10d18c223882f2824134d47e53a438a8b0947b8bfc90565b610ed26012600a614894565b610edf90620f42406148a2565b81565b5f610eeb611b76565b7f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db580546101f464010000000090910461ffff161015610f6c5760405162461bcd60e51b815260206004820152601c60248201527f4e6f206d6f7265206465637265616d656e7420617661696c61626c65000000006044820152606401610db0565b8054640100000000620100006101f31961ffff8085168201811661ffff198616811784900482168301821690930263ffffffff19909516909217939093178281048216909301160265ffff00000000199091161790555060015b90565b5f610b3f610fd5611b5b565b83612b6b565b5f610fe4611b76565b61100e7f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db65f614070565b50600190565b5f610b3f611020611b5b565b835f19611b64565b60605f80516020614b1d833981519152600501805480602002602001604051908101604052809291908181526020015f905b82821015611144578382905f5260205f2090600202016040518060600160405290815f8201805461108a906148b9565b80601f01602080910402602001604051908101604052809291908181526020018280546110b6906148b9565b80156111015780601f106110d857610100808354040283529160200191611101565b820191905f5260205f20905b8154815290600101906020018083116110e457829003601f168201915b505050918352505060019182015461ffff8116602080840191909152620100009091046001600160a01b031660409092019190915291835292909201910161105a565b50505050905090565b611155611b76565b61115e5f612c91565b565b5f610dee8383612d19565b611173611b76565b60408051610100810182527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db45461ffff80821683526201000080830482166020808601919091526401000000008085048416868801526601000000000000850460ff908116606080890191909152670100000000000000870490911660808801526801000000000000000086046001600160781b031660a0880152600160b81b90950462ffffff1660c0870152865194850187527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db55480851686529283048416918501919091529004169281019290925260e0810191909152611277906005612dd8565b156112c45760405162461bcd60e51b815260206004820152601a60248201527f54726164696e6720697320616c726561647920656e61626c65640000000000006044820152606401610db0565b6112da5f80516020614b1d833981519152612e03565b50565b5f815f03611348577f0000000000000000000000002200ff8877aa8844aae5d06d7e9fc0b7e2d261586001600160a01b03165f9081527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db760205260409020546001600160781b031691505b610b047f0000000000000000000000002200ff8877aa8844aae5d06d7e9fc0b7e2d2615883612d19565b5f61137b611b76565b6113a57f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db65f614070565b81517f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db6905f5b8181101561146857828582815181106113e6576113e66148eb565b60209081029190910181015182546001810184555f938452919092208251600290920201908190611417908261494a565b506020820151600190910180546040909301516001600160a01b0316620100000275ffffffffffffffffffffffffffffffffffffffffffff1990931661ffff909216919091179190911790556113cb565b506001949350505050565b5f610e3e61147f611b5b565b8484611d56565b5f61148f611b76565b5f80516020614b1d833981519152805460ff19166001179055737a250d5630b4cf539739df2c5dacb4c659f2488d63f305d719346001600160a01b037f0000000000000000000000002200ff8877aa8844aae5d06d7e9fc0b7e2d2615881165f8181527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db76020526040808220547f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db35482517fffffffff0000000000000000000000000000000000000000000000000000000060e08a901b16815260048101959095526001600160781b039091166024850152604484018390526064840192909252921660848201524260a4820152905160c4808301926060929190829003018185885af11580156115c2573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906115e79190614a06565b505050600190505f6116035f80516020614b1d83398151915290565b805460ff191691151591909117905590565b5f8080808080808080805f80516020614b1d8339815191526040805161010081018252600383015461ffff80821683526201000080830482166020808601919091526401000000008085048416868801526601000000000000850460ff908116606080890191909152670100000000000000870490911660808801526801000000000000000086046001600160781b031660a0880152600160b81b90950462ffffff1660c0870152865194850187526004909701548084168552918204831690840152949094049093169183019190915260e081019190915290506116fa815f612dd8565b9950611707816001612dd8565b9850611714816002612dd8565b9750611721816003612dd8565b965061172e816004612dd8565b955061173b816005612dd8565b9450611748816006612dd8565b9350611755816007612dd8565b9250611762816008612dd8565b915050909192939495969798565b5f610b3f82611ad2565b428410156117ca5760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f455850495245440000000000000000006044820152606401610db0565b5f60016117d5610e48565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a5f80516020614b1d8339815191526001600160a01b038f81165f90815260079290920160209081526040928390208054600181019091558351808301989098529582168784015293166060860152608085019190915260a084019290925260c08084018b90528251808503909101815260e0840190925281519101207f19010000000000000000000000000000000000000000000000000000000000006101008301526101028201929092526101228101919091526101420160408051601f1981840301815282825280516020918201205f84529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa15801561190d573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b038116158015906119435750876001600160a01b0316816001600160a01b0316145b61198f5760405162461bcd60e51b815260206004820152600e60248201527f494e56414c49445f5349474e45520000000000000000000000000000000000006044820152606401610db0565b6001600160a01b039081165f9081527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4dba602090815260408083208a8516808552908352928190208990558051898152905192938b16927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a350505050505050565b611a21611b76565b6001600160a01b038116611a9d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610db0565b6112da81612c91565b5f611aaf611b76565b610e3e82611acc855f80516020614b1d8339815191525b90612e28565b90612f37565b805f03611b09577f0000000000000000000000002200ff8877aa8844aae5d06d7e9fc0b7e2d261586001600160a01b031631611b0b565b805b9050611b57815f80516020614b1d83398151915260030154600160b81b900462ffffff16611b435f80516020614b1d83398151915290565b600201546001600160a01b03169190612f58565b5050565b5f610e9c61300d565b611b718383836001611be5565b505050565b611b7e611b5b565b6001600160a01b0316611b8f613065565b6001600160a01b03161461115e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610db0565b6001600160a01b038416611c27576040517f8bc146c40000000000000000000000000000000000000000000000000000000081525f6004820152602401610db0565b6001600160a01b038316611c69576040517f4e15efda0000000000000000000000000000000000000000000000000000000081525f6004820152602401610db0565b5f611c81855f80516020614b1d833981519152611ac6565b90505f611c9b855f80516020614b1d833981519152611ac6565b6001838101546001600160a01b03600160501b9182900481165f9081527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4dba6020908152604080832095870154949094049092168152929052902085905590508215611d4e57846001600160a01b0316866001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92586604051611d4591815260200190565b60405180910390a35b505050505050565b60408051610100810182527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db45461ffff80821683526201000080830482166020808601919091526401000000008085048416868801526601000000000000850460ff908116606080890191909152670100000000000000870490911660808801526801000000000000000086046001600160781b031660a0880152600160b81b90950462ffffff1660c0870152865194850187527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db55480851686529283048416918501919091529004169281019290925260e08101919091525f905f80516020614b1d8339815191529082611e6b8388612e28565b90505f611e788488612e28565b6001830154909150600160501b90046001600160a01b0316611ec8576040517f4c14f64c0000000000000000000000000000000000000000000000000000000081525f6004820152602401610db0565b6001810154600160501b90046001600160a01b0316611f15576040517f17858bbe0000000000000000000000000000000000000000000000000000000081525f6004820152602401610db0565b5f6123618488604051806101400160405280611f39611f32611b5b565b8b90612e28565b6040518060e00160405290815f82015f9054906101000a90046001600160781b03166001600160781b03166001600160781b031681526020015f8201600f9054906101000a90046001600160781b03166001600160781b03166001600160781b031681526020015f8201601e9054906101000a900460ff1660ff1660ff168152602001600182015f9054906101000a900464ffffffffff1664ffffffffff1664ffffffffff1681526020016001820160059054906101000a900464ffffffffff1664ffffffffff1664ffffffffff16815260200160018201600a9054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200160018201601e9054906101000a900461ffff1661ffff1661ffff16815250508152602001876040518060e00160405290815f82015f9054906101000a90046001600160781b03166001600160781b03166001600160781b031681526020015f8201600f9054906101000a90046001600160781b03166001600160781b03166001600160781b031681526020015f8201601e9054906101000a900460ff1660ff1660ff168152602001600182015f9054906101000a900464ffffffffff1664ffffffffff1664ffffffffff1681526020016001820160059054906101000a900464ffffffffff1664ffffffffff1664ffffffffff16815260200160018201600a9054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200160018201601e9054906101000a900461ffff1661ffff1661ffff16815250508152602001866040518060e00160405290815f82015f9054906101000a90046001600160781b03166001600160781b03166001600160781b031681526020015f8201600f9054906101000a90046001600160781b03166001600160781b03166001600160781b031681526020015f8201601e9054906101000a900460ff1660ff1660ff168152602001600182015f9054906101000a900464ffffffffff1664ffffffffff1664ffffffffff1681526020016001820160059054906101000a900464ffffffffff1664ffffffffff1664ffffffffff16815260200160018201600a9054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200160018201601e9054906101000a900461ffff1661ffff1661ffff168152505081526020015f61ffff1681526020015f6001600160781b031681526020015f6001600160781b03168152602001895f015f9054906101000a900460ff16151581526020015f6001600160781b031681526020014364ffffffffff1681526020016040518060a001604052805f600181111561232857612328614a31565b600181111561233957612339614a31565b81526020015f81526020015f81526020015f815260e08b01516020909101529052919061306e565b6001600160a01b037f0000000000000000000000002200ff8877aa8844aae5d06d7e9fc0b7e2d26158165f908152600687016020526040902090915060016101208301515160018111156123b7576123b7614a31565b036124255760018261012001516060015160028111156123d9576123d9614a31565b141580156123f357505f82608001516001600160781b0316115b1561240757612407848284608001516130f7565b61241684848460a001516130f7565b60019650505050505050610dee565b600182610120015160600151600281111561244257612442614a31565b1415801561245c57505f82608001516001600160781b0316115b1561257557612470848284608001516130f7565b61247b856002612dd8565b801561249357505f82608001516001600160781b0316115b80156124ba575060018261012001516020015160028111156124b7576124b7614a31565b14155b156125755760028261012001516040015160038111156124dc576124dc614a31565b1461252d57608082015184546001600160781b03600160781b8083048216909301169091027fffff000000000000000000000000000000ffffffffffffffffffffffffffffff909116178455612575565b608082015183546001600160781b03600160781b8083048216909301169091027fffff000000000000000000000000000000ffffffffffffffffffffffffffffff9091161783555b61257f855f612dd8565b801561260e57506040805160e08101825284546001600160781b038082168352600160781b8204166020830152600160f01b9081900460ff1692820192909252600185015464ffffffffff8082166060840152650100000000008204166080830152600160501b81046001600160a01b031660a08301529190910461ffff1660c082015261260c9061318e565b155b1561269c575f82604001515f015190508560a001516001600160781b03168360a0015182016001600160781b0316111561269a5760a080870151908401516040517f4c97ce530000000000000000000000000000000000000000000000000000000081526001600160781b03928316600482015290821660248201529082166044820152606401610db0565b505b60028261012001516020015160028111156126b9576126b9614a31565b03612ac7576126c9856005612dd8565b6126ff576040517f12f1f92300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600382610120015160400151600381111561271c5761271c614a31565b036128945761272c856001612dd8565b156127c7576101008201805164ffffffffff9081165f908152600889016020526040808220805460ff198116600160ff92831601821617909155935190921681522054606087015190821691168111156127c55760608601516040517f539940b600000000000000000000000000000000000000000000000000000000815260ff91821660048201529082166024820152604401610db0565b505b608082015160a083015182546127e9926001600160781b0390911691886131a3565b6001600160781b031660e0830152612802856006612dd8565b801561281a57505f8260e001516001600160781b0316115b156128945760e0820151600287015461285191906001600160a01b0316612842886004612dd8565b88602001518960c00151613246565b60e08201516040516001600160781b0390911681527fa5adddab212845cc7ee210e0fd0ace2c98f2617fffcc214b3b957bb5cd33093d9060200160405180910390a15b61289f856008612dd8565b15612ac7576040805160e08101825285546001600160781b038082168352600160781b8204166020830152600160f01b9081900460ff1692820192909252600186015464ffffffffff8082166060840152650100000000008204166080830152600160501b81046001600160a01b031660a08301529190910461ffff1660c082015261292a90613889565b80156129505750600382610120015160400151600381111561294e5761294e614a31565b145b156129b857835460ff600160f01b9091048116101561298c578354600160ff600160f01b808404821692909201160260ff60f01b199091161784555b6080850151845460ff918216600160f01b909104909116036129b3576129b1846138e0565b505b612ac7565b6040805160e08101825284546001600160781b038082168352600160781b8204166020830152600160f01b9081900460ff1692820192909252600185015464ffffffffff8082166060840152650100000000008204166080830152600160501b81046001600160a01b031660a08301529190910461ffff1660c0820152612a3e90613889565b8015612a6457506002826101200151604001516003811115612a6257612a62614a31565b145b15612ac757825460ff600160f01b90910481161015612aa0578254600160ff600160f01b808404821692909201160260ff60f01b199091161783555b6080850151835460ff918216600160f01b90910490911603612ac757612ac5836138e0565b505b612ad684848460a001516130f7565b5060019998505050505050505050565b60018201545f90600160f01b900461ffff1660ff8316600203612b0f57835460ff60f01b191684555b600160ff84161b19811661ffff165b60018501805461ffff92909216600160f01b027dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055509192915050565b5f610b04826138ec565b6001600160a01b0382165f9081527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db76020526040902080545f80516020614b1d83398151915291906001600160781b031680841115612bef5760405163cf47918160e01b81526001600160781b038216600482015260248101859052604401610db0565b81546effffffffffffffffffffffffffffff19811669ffffffffffffffffffff8681166001600160781b039384160390921617835583546bffffffffffffffffffff000019811662010000918290048316879003909216021783556040518481525f906001600160a01b038716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050505050565b7f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db280546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f7f0000000000000000000000002200ff8877aa8844aae5d06d7e9fc0b7e2d261586001600160a01b0316836001600160a01b031603612d9f57612d987f0000000000000000000000002200ff8877aa8844aae5d06d7e9fc0b7e2d261585f80516020614b1d833981519152600201546001600160a01b031684611d56565b9050610b04565b7f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db354611468906001600160a01b038581169116846139d4565b5f610dee826008811115612dee57612dee614a31565b845161ffff1660ff9091161c60019081161490565b60038101805461ffff19811661ffff9182166020189091169081179091555f90610b00565b6001600160a01b038181165f908152600684016020908152604091829020825160e08101845281546001600160781b038082168352600160781b82041693820193909352600160f01b9283900460ff1693810193909352600181015464ffffffffff8082166060860152650100000000008204166080850152600160501b810490941660a0840152920461ffff1660c0820152612ec490613b14565b610b04576001810180547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16600160501b6001600160a01b038516021790819055600160f01b900461ffff1660021781600101601e6101000a81548161ffff021916908361ffff16021790555092915050565b6001828101545f91600160f01b90910461ffff169060ff84161b8117612b1e565b5f6001600160a01b038416612fb057604051633887280760e11b815260206004820152601960248201527f526563697069656e74206973205a65726f2041646472657373000000000000006044820152606401610db0565b5f846001600160a01b03168484906040515f60405180830381858888f193505050503d805f8114612ffc576040519150601f19603f3d011682016040523d82523d5f602084013e613001565b606091505b50909695505050505050565b5f303303613060575f80368080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050503601516001600160a01b03169150610fc69050565b503390565b5f610e9c613b28565b61307661408e565b6020840151516001600160781b03168211156130be5760208401515160405163cf47918160e01b81526001600160781b03909116600482015260248101839052604401610db0565b6130c88484613bbc565b5060608401516130d9908390613e3d565b6001600160781b0390811660a0870152166080850152509192915050565b82546effffffffffffffffffffffffffffff198082166001600160781b039283168490038316178555835490811690821683018216178355600183810154908501546040519284168352600160501b918290046001600160a01b03908116939290910416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b60c08101515f90600a1c600190811614610b04565b836131af826007612dd8565b1561323e576001600160781b03848401811690808516820190808716830190881682116131de5781935061323a565b876001600160781b031681116131f65780935061323a565b876001600160781b0316831161320e5782935061323a565b876001600160781b0316866001600160781b03161161322f5785935061323a565b87935050505061323e565b5050505b949350505050565b5f80516020614b1d833981519152805460ff1916600117815560408051600280825260608201835287925f9291906020830190803683370190505090507f0000000000000000000000002200ff8877aa8844aae5d06d7e9fc0b7e2d26158815f815181106132b6576132b66148eb565b60200260200101906001600160a01b031690816001600160a01b031681525050737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613326573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061334a9190614a45565b8160018151811061335d5761335d6148eb565b6001600160a01b03909216602092830291909101909101525f61271087801561338957505f8761ffff16115b156133dc5760028161ffff168861ffff168c026001600160781b0316816133b2576133b2614a60565b046001600160781b0316816133c9576133c9614a60565b049150600261ffff88169a8390039a0490035b6040517f791ac9470000000000000000000000000000000000000000000000000000000081527f0000000000000000000000002200ff8877aa8844aae5d06d7e9fc0b7e2d261586001600160a01b0381163191737a250d5630b4cf539739df2c5dacb4c659f2488d9163791ac9479161345f918f915f918a914290600401614a74565b5f604051808303815f87803b158015613476575f80fd5b505af1158015613488573d5f803e3d5ffd5b505050505f817f0000000000000000000000002200ff8877aa8844aae5d06d7e9fc0b7e2d261586001600160a01b0316316134c39190614aee565b90505f87600501805480602002602001604051908101604052809291908181526020015f905b828210156135d3578382905f5260205f2090600202016040518060600160405290815f82018054613519906148b9565b80601f0160208091040260200160405190810160405280929190818152602001828054613545906148b9565b80156135905780601f1061356757610100808354040283529160200191613590565b820191905f5260205f20905b81548152906001019060200180831161357357829003601f168201915b505050918352505060019182015461ffff8116602080840191909152620100009091046001600160a01b03166040909201919091529183529290920191016134e9565b5050825192935050811590506136f3575f5b818110156136f1575f838281518110613600576136006148eb565b60200260200101516020015161ffff1611156136e9575f8661ffff1684838151811061362e5761362e6148eb565b60200260200101516020015161ffff1686028161364d5761364d614a60565b0490505f6001600160a01b031684838151811061366c5761366c6148eb565b6020026020010151604001516001600160a01b0316036136a55761369f6001600160a01b038b168262ffffff8f16612f58565b506136e7565b6136e5818d62ffffff168685815181106136c1576136c16148eb565b6020026020010151604001516001600160a01b0316612f589092919063ffffffff16565b505b505b6001016135e5565b505b6001600160781b03861615613817575f60028661ffff168d61ffff1686028161371e5761371e614a60565b048161372c5761372c614a60565b6040517ff305d7190000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000002200ff8877aa8844aae5d06d7e9fc0b7e2d26158811660048301526001600160781b038b1660248301525f6044830181905260648301528c1660848201524260a48201529190049150737a250d5630b4cf539739df2c5dacb4c659f2488d9063f305d71990839060c40160606040518083038185885af11580156137ed573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906138129190614a06565b505050505b6138546001600160a01b03898116907f0000000000000000000000002200ff8877aa8844aae5d06d7e9fc0b7e2d26158163162ffffff8d16612f58565b505050505050505050505f6138735f80516020614b1d83398151915290565b805460ff19169115159190911790555050505050565b5f816060015164ffffffffff16826080015164ffffffffff16101580156138ba57505f826060015164ffffffffff16115b15610b4357600561ffff16826060015183608001510364ffffffffff1611159050919050565b5f610b04826002612f37565b5f6040518060800160405280605f8152602001614b3d605f9139805160209182012083518483012060408051808201909152600481527f76312e3000000000000000000000000000000000000000000000000000000000930192909252907fe8245ed8f93ccf147bc8972ab6d5f8278ed994d647700daaa5b7ebde9370aa6f46604080516020810195909552840192909252606083015260808201523060a08201527fbffcd4a1e0307336f6fcccc7c8177db5faa17bd19405109da6225e44affef9b260c082015260e001604051602081830303815290604052805190602001209050919050565b5f60606001600160a01b038416613a2e57604051633887280760e11b815260206004820152601960248201527f526563697069656e74206973205a65726f2041646472657373000000000000006044820152606401610db0565b604080516001600160a01b038681166024830152604480830187905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291515f92839290891691613ab79190614b01565b5f604051808303815f865af19150503d805f8114613af0576040519150601f19603f3d011682016040523d82523d5f602084013e613af5565b606091505b5091509150613b05878383613e75565b9350935050505b935093915050565b60c08101515f90600190811c811614610b04565b335f9081527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db76020527f5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db25460408220600101545f80516020614b1d833981519152919061400060f09190911c90811661800090911617151580613ba9578193505b60018103613bb6575f5193505b50505090565b613bc461408e565b8260c0015115613c1d576040805160a081019091528060018152602001600181526020016001815260200160018152604080516060810182525f8082526020828101829052928201529101526101208401525081610b04565b610120830180515f6040909101819052905160200152613c3c83613eec565b613c46575f613c49565b60015b610120840151906001811115613c6157613c61614a31565b90816001811115613c7457613c74614a31565b905250613c8083613f2d565b15613cd75761012083015160016060918201526040805180830182525f80825260208083018290529183018190528251938401835280845290830181905290820152610120840151608001525f6060840152613d5d565b610120830180515f60609091015260e0830151905160800152613cfb826008612dd8565b8015613d0b5750613d0b83613f4e565b15613d5d57610120830180516002606091820152604084810151815180840183525f8082526020808301829052918401528251938401835261ffff909116808452908301819052908201529051608001525b610120830151608001516040015161ffff1660608401526020830151613d829061318e565b80613d955750613d95836040015161318e565b15613e36576101208301516002602091820152830151613db49061318e565b15613df5576101208301805160026040918201526101008501519085015164ffffffffff9091166060918201529051608001515161ffff1690840152613e2f565b61012083018051600360409091015261010084015160208086015164ffffffffff90921660809283015291510151015161ffff1660608401525b5081610b04565b5090919050565b5f808261ffff165f03613e5457505f905082613e6e565b505061271061ffff82168302046001600160781b03811683035b9250929050565b5f606083613e8b57613e8683613f6f565b613b0c565b8251158015613ea05750613e9e85613fae565b155b15613ee2576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0386166004820152602401610db0565b5082905081613b0c565b5f613ef9825f0151613fb8565b80613f0c5750613f0c8260200151613fb8565b80613f1f5750613f1f8260400151613fb8565b80610b0457505060c0015190565b5f613f3b8260200151614007565b80610b045750610b048260400151614007565b5f613f5c8260200151614030565b80610b045750610b048260400151614030565b6112da816040518060400160405280601981526020017f416464726573734c69623a20556e6b6e6f776e204572726f7200000000000000815250614045565b5f813b1515610b04565b5f600c5b600c8160ff1610158015613fd3575060108160ff16105b156140015760c083015161ffff1660ff82161c600190811603613ff95750600192915050565b600101613fbc565b50919050565b60c08101515f90600b1c60019081161480610b04575060c0820151600b1c600190811614610b04565b60c08101515f9060021c600190811614610b04565b8151156140555781518083602001fd5b80604051633887280760e11b8152600401610db09190614297565b5080545f8255600202905f5260205f20908101906112da91906141c3565b6040805161022081019091525f6101408201818152610160830182905261018083018290526101a083018290526101c083018290526101e08301829052610200830191909152819081526040805160e0810182525f8082526020828101829052928201819052606082018190526080820181905260a0820181905260c082015291019081526040805160e0810182525f8082526020828101829052928201819052606082018190526080820181905260a0820181905260c082015291019081525f6020820181905260408201819052606082018190526080820181905260a0820181905260c082015260e0016141be6040805160a08101909152805f81526020015f81526020015f81526020015f8152604080516060810182525f80825260208281018290529282015291015290565b905290565b80821115614200575f6141d68282614204565b5060018101805475ffffffffffffffffffffffffffffffffffffffffffff191690556002016141c3565b5090565b508054614210906148b9565b5f825580601f1061421f575050565b601f0160209004905f5260205f20908101906112da91905b80821115614200575f8155600101614237565b5f5b8381101561426457818101518382015260200161424c565b50505f910152565b5f815180845261428381602086016020860161424a565b601f01601f19169290920160200192915050565b602081525f610dee602083018461426c565b6001600160a01b03811681146112da575f80fd5b5f80604083850312156142ce575f80fd5b82356142d9816142a9565b946020939093013593505050565b5f602082840312156142f7575f80fd5b8135610dee816142a9565b803561ffff81168114610b43575f80fd5b803560ff81168114610b43575f80fd5b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561435a5761435a614323565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561438957614389614323565b604052919050565b5f805f805f805f8789036101208112156143a9575f80fd5b6143b289614302565b97506143c060208a01614302565b96506143ce60408a01614313565b95506143dc60608a01614313565b945060808901356001600160781b03811681146143f7575f80fd5b935060a089013562ffffff8116811461440e575f80fd5b9250606060bf1982011215614421575f80fd5b5061442a614337565b61443660c08a01614302565b815261444460e08a01614302565b60208201526144566101008a01614302565b60408201528091505092959891949750929550565b5f6020828403121561447b575f80fd5b610dee82614313565b5f805f60608486031215614496575f80fd5b83356144a1816142a9565b925060208401356144b1816142a9565b929592945050506040919091013590565b5f80604083850312156144d3575f80fd5b82356144de816142a9565b91506144ec60208401614313565b90509250929050565b5f60208284031215614505575f80fd5b5035919050565b5f60208083018184528085518083526040925060408601915060408160051b8701018488015f5b8381101561458c57603f198984030185528151606081518186526145598287018261426c565b838b015161ffff16878c0152928901516001600160a01b0316958901959095525094870194925090860190600101614533565b509098975050505050505050565b8035610b43816142a9565b5f60208083850312156145b6575f80fd5b823567ffffffffffffffff808211156145cd575f80fd5b818501915085601f8301126145e0575f80fd5b8135818111156145f2576145f2614323565b8060051b614601858201614360565b918252838101850191858101908984111561461a575f80fd5b86860192505b838310156146f357823585811115614636575f80fd5b8601601f196060828d038201121561464c575f80fd5b614654614337565b8983013588811115614664575f80fd5b8301603f81018e13614674575f80fd5b8a81013560408a82111561468a5761468a614323565b61469a8d86601f85011601614360565b94508185528f818385010111156146af575f80fd5b818184018e8701375f8d83870101528484526146cc818701614302565b8d8501526146dc6060870161459a565b908401525050845250509186019190860190614620565b9998505050505050505050565b5f805f805f805f60e0888a031215614716575f80fd5b8735614721816142a9565b96506020880135614731816142a9565b9550604088013594506060880135935061474d60808901614313565b925060a0880135915060c0880135905092959891949750929550565b5f806040838503121561477a575f80fd5b8235614785816142a9565b91506020830135614795816142a9565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b600181815b808511156147ee57815f19048211156147d4576147d46147a0565b808516156147e157918102915b93841c93908002906147b9565b509250929050565b5f8261480457506001610b04565b8161481057505f610b04565b816001811461482657600281146148305761484c565b6001915050610b04565b60ff841115614841576148416147a0565b50506001821b610b04565b5060208310610133831016604e8410600b841016171561486f575081810a610b04565b61487983836147b4565b805f190482111561488c5761488c6147a0565b029392505050565b5f610dee60ff8416836147f6565b8082028115828204841417610b0457610b046147a0565b600181811c908216806148cd57607f821691505b60208210810361400157634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b601f821115611b7157805f5260205f20601f840160051c810160208510156149245750805b601f840160051c820191505b81811015614943575f8155600101614930565b5050505050565b815167ffffffffffffffff81111561496457614964614323565b6149788161497284546148b9565b846148ff565b602080601f8311600181146149ab575f84156149945750858301515b5f19600386901b1c1916600185901b178555611d4e565b5f85815260208120601f198616915b828110156149d9578886015182559484019460019091019084016149ba565b50858210156149f657878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f805f60608486031215614a18575f80fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b5f52602160045260245ffd5b5f60208284031215614a55575f80fd5b8151610dee816142a9565b634e487b7160e01b5f52601260045260245ffd5b5f60a082016001600160781b0388168352602087602085015260a0604085015281875180845260c0860191506020890193505f5b81811015614acd5784516001600160a01b031683529383019391830191600101614aa8565b50506001600160a01b03969096166060850152505050608001529392505050565b81810381811115610b0457610b046147a0565b5f8251614b1281846020870161424a565b919091019291505056fe5c4a5e204dbbab1c0dedc9038b91783fcc6be6cf4333d4dc0aae9bf4857a4db1454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e74726163742c627974657333322073616c7429a2646970667358221220092566d08802bb325f0103e73f67d2b358e3e10b2a196ca378615a20d93dc98a64736f6c63430008180033

Deployed Bytecode Sourcemap

58651:8364:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64485:144;;;;;;;;;;;;;:::i;:::-;;;179:14:1;;172:22;154:41;;142:2;127:18;64485:144:0;;;;;;;;59413:92;;;;;;;;;;-1:-1:-1;59492:5:0;;;;;;;;;;;;-1:-1:-1;;;59492:5:0;;;;59413:92;;;;;;;:::i;46246:154::-;;;;;;;;;;-1:-1:-1;46246:154:0;;;;;:::i;:::-;;:::i;64324:153::-;;;;;;;;;;-1:-1:-1;64324:153:0;;;;;:::i;:::-;;:::i;63086:750::-;;;;;;;;;;-1:-1:-1;63086:750:0;;;;;:::i;:::-;;:::i;45870:95::-;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;45941:16:0;;;;;;45870:95;;;4054:25:1;;;4042:2;4027:18;45870:95:0;3908:177:1;60431:138:0;;;;;;;;;;-1:-1:-1;60431:138:0;;;;;:::i;:::-;;:::i;46562:714::-;;;;;;;;;;-1:-1:-1;46562:714:0;;;;;:::i;:::-;;:::i;64014:161::-;;;;;;;;;;-1:-1:-1;64014:161:0;;;;;:::i;:::-;;:::i;59617:85::-;;;;;;;;;;-1:-1:-1;59617:85:0;;59692:2;5202:36:1;;5190:2;5175:18;59617:85:0;5060:184:1;66796:214:0;;;;;;;;;;;;;:::i;58913:63::-;;;;;;;;;;;;;:::i;60765:396::-;;;;;;;;;;;;;:::i;59974:122::-;;;;;;;;;;-1:-1:-1;59974:122:0;;;;;:::i;:::-;;:::i;64183:133::-;;;;;;;;;;;;;:::i;59810:152::-;;;;;;;;;;-1:-1:-1;59810:152:0;;;;;:::i;:::-;;:::i;62968:110::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;45973:119::-;;;;;;;;;;-1:-1:-1;45973:119:0;;;;;:::i;:::-;-1:-1:-1;;;;;46056:20:0;46029:7;46056:20;;;:12;:20;;;;;:28;-1:-1:-1;;;;;46056:28:0;;45973:119;57804:103;;;;;;;;;;;;;:::i;:::-;;47420:131;;;;;;;;;;-1:-1:-1;47420:131:0;;;;;:::i;:::-;;:::i;60577:180::-;;;;;;;;;;;;;:::i;57529:98::-;;;;;;;;;;-1:-1:-1;57602:17:0;;-1:-1:-1;;;;;57602:17:0;57529:98;;;-1:-1:-1;;;;;6986:55:1;;;6968:74;;6956:2;6941:18;57529:98:0;6822:226:1;64637:173:0;;;;;;;;;;-1:-1:-1;64637:173:0;;;;;:::i;:::-;;:::i;59513:96::-;;;;;;;;;;-1:-1:-1;59594:7:0;;;;;;;;;;;;;;;;;59513:96;;64818:325;;;;;;;;;;-1:-1:-1;64818:325:0;;;;;:::i;:::-;;:::i;46408:146::-;;;;;;;;;;-1:-1:-1;46408:146:0;;;;;:::i;:::-;;:::i;60104:319::-;;;:::i;59710:92::-;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;59773:16:0;;;;-1:-1:-1;;;;;59773:16:0;59710:92;;61830:1000;;;;;;;;;;;;;:::i;:::-;;;;9584:14:1;;9577:22;9559:41;;9643:14;;9636:22;9631:2;9616:18;;9609:50;9702:14;;9695:22;9675:18;;;9668:50;;;;9761:14;;9754:22;9749:2;9734:18;;9727:50;9821:14;;9814:22;9808:3;9793:19;;9786:51;9881:14;9874:22;9868:3;9853:19;;9846:51;9941:14;9934:22;9928:3;9913:19;;9906:51;10001:14;;9994:22;9988:3;9973:19;;9966:51;10061:14;10054:22;10048:3;10033:19;;10026:51;9546:3;9531:19;61830:1000:0;9242:841:1;47284:128:0;;;;;;;;;;-1:-1:-1;47284:128:0;;;;;:::i;:::-;;:::i;65341:1447::-;;;;;;;;;;-1:-1:-1;65341:1447:0;;;;;:::i;:::-;;:::i;61169:653::-;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;61478:43:0;;;;;;;61509:12;61478:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;61478:43:0;;;;;;;-1:-1:-1;;;61478:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61554:21;;61591;;61628:22;;61665:25;;61705:23;;61744:25;;61554:21;;61591;;61628:22;;61665:25;;61705:23;61169:653;;;11196:6:1;11229:15;;;11211:34;;11281:15;;;11276:2;11261:18;;;11254:43;;;;11345:4;11333:17;;;11313:18;;;11306:45;11387:17;;;;11382:2;11367:18;;11360:45;-1:-1:-1;;;;;11442:45:1;;;11436:3;11421:19;;11414:74;11537:8;11525:21;11519:3;11504:19;;11497:50;11588:13;;11584:22;;11578:3;11563:19;;11556:51;11654:15;;;11648:22;11644:31;;11638:3;11623:19;;11616:60;11723:15;11717:22;11713:31;;;11707:3;11692:19;;11685:60;11173:3;11158:19;61169:653:0;10827:924:1;62838:122:0;;;;;;;;;;-1:-1:-1;62838:122:0;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62931:21:0;;;;;;;:12;;;;;:21;;;;;;;;;62924:28;;;;;;;;;-1:-1:-1;;;;;62924:28:0;;;;;-1:-1:-1;;;62924:28:0;;;;;;;;;;-1:-1:-1;;;62924:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;62924:28:0;;;;;;;;;;;;;;;;;;-1:-1:-1;62924:28:0;62838:122;;;;;;;11896:4:1;11938:3;11927:9;11923:19;11915:27;;-1:-1:-1;;;;;12039:2:1;12030:6;12024:13;12020:22;12009:9;12002:41;12111:2;12103:4;12095:6;12091:17;12085:24;12081:33;12074:4;12063:9;12059:20;12052:63;;12183:4;12175;12167:6;12163:17;12157:24;12153:35;12146:4;12135:9;12131:20;12124:65;12236:4;12228:6;12224:17;12218:24;12261:12;12329:2;12315:12;12311:21;12304:4;12293:9;12289:20;12282:51;12401:2;12393:4;12385:6;12381:17;12375:24;12371:33;12364:4;12353:9;12349:20;12342:63;;;-1:-1:-1;;;;;12465:4:1;12457:6;12453:17;12447:24;12443:73;12436:4;12425:9;12421:20;12414:103;12585:6;12577:4;12569:6;12565:17;12559:24;12555:37;12548:4;12537:9;12533:20;12526:67;11756:843;;;;;46100:138:0;;;;;;;;;;-1:-1:-1;46100:138:0;;;;;:::i;:::-;-1:-1:-1;;;;;46199:22:0;;;46172:7;46199:22;;;:15;:22;;;;;;;;:31;;;;;;;;;;;;;46100:138;57915:201;;;;;;;;;;-1:-1:-1;57915:201:0;;;;;:::i;:::-;;:::i;63844:162::-;;;;;;;;;;-1:-1:-1;63844:162:0;;;;;:::i;:::-;;:::i;64485:144::-;64525:4;-1:-1:-1;;;;;64559:2:0;:10;;64580:19;64559:10;64580:11;:19::i;:::-;64617:4;64610:11;;;64485:144;:::o;46246:154::-;46314:4;46331:39;46340:12;:10;:12::i;:::-;46354:7;46363:6;46331:8;:39::i;:::-;-1:-1:-1;46388:4:0;46246:154;;;;;:::o;64324:153::-;64390:4;57488:13;:11;:13::i;:::-;64407:40:::1;64416:2;64420:7;-1:-1:-1::0;;64407:8:0::1;:40::i;:::-;-1:-1:-1::0;64465:4:0::1;57512:1;64324:153:::0;;;:::o;63086:750::-;63390:4;57488:13;:11;:13::i;:::-;-1:-1:-1;63439:12:0;63462:37;;-1:-1:-1;;63510:37:0;63462;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;63510:37:0;;;;;;;;;;::::1;::::0;::::1;;-1:-1:-1::0;;63608:45:0;63558:39;::::1;::::0;;::::1;;-1:-1:-1::0;;63608:45:0;;;;;;::::1;::::0;;;::::1;::::0;;;::::1;63717::::0;;63665:41;-1:-1:-1;;;;;63665:41:0;;;::::1;::::0;;;::::1;63717:45:::0;;;;;;-1:-1:-1;;;63717:45:0::1;::::0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;63773:33;;:19;:33;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;63773:33:0;;;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;::::1;;::::0;;-1:-1:-1;;63086:750:0:o;60431:138::-;60492:4;57488:13;:11;:13::i;:::-;60509:12;40128:13;;-1:-1:-1;;40152:35:0;;40128:13;;;;29250:1;:8;;;;29241:18;40152:35;;;;;;;;;60509:30:::1;40013:221:::0;46562:714;46685:4;46712:15;46730:12;:10;:12::i;:::-;-1:-1:-1;;;;;46776:21:0;;;46755:18;46776:21;;;:15;:21;;;;;;;;:30;;;;;;;;;;46712;;-1:-1:-1;;;46822:31:0;;46819:381;;46885:10;46876:6;:19;46872:105;;;46921:56;;;;;-1:-1:-1;;;;;13307:15:1;;;46921:56:0;;;13289:34:1;13359:15;;13339:18;;;13332:43;13391:18;;;13384:34;;;13434:18;;;13427:34;;;13200:19;;46921:56:0;;;;;;;;46872:105;46994:17;47080:6;47067:10;:19;:46;;47112:1;47067:46;;;47103:6;47090:10;:19;47067:46;47055:58;;47132:41;47141:4;47147:7;47156:9;47167:5;47132:8;:41::i;:::-;46855:345;46819:381;47212:34;47222:4;47228:9;47239:6;47212:9;:34::i;:::-;;47264:4;47257:11;;;;46562:714;;;;;;:::o;64014:161::-;64093:4;57488:13;:11;:13::i;:::-;-1:-1:-1;;;;;64110:19:0;::::1;;::::0;;;:12;:19:::1;::::0;;;;:35:::1;::::0;64141:3;64110:30:::1;:35::i;:::-;-1:-1:-1::0;64163:4:0::1;::::0;64014:161;-1:-1:-1;;;64014:161:0:o;66796:214::-;66845:7;66902:22;66885:13;:39;:117;;66988:14;66996:5;;;;;;;;;;;;;-1:-1:-1;;;66996:5:0;;;66988:7;:14::i;:::-;66865:137;;66796:214;:::o;66885:117::-;-1:-1:-1;66944:24:0;;66796:214::o;58913:63::-;58963:13;58898:2;58963;:13;:::i;:::-;58953:23;;:7;:23;:::i;:::-;58913:63;:::o;60765:396::-;60816:4;57488:13;:11;:13::i;:::-;60867:24;60905:17;;60925:3:::1;60905:17:::0;;;::::1;;;:23;60902:79;;;60943:38;::::0;-1:-1:-1;;;60943:38:0;;15413:2:1;60943:38:0::1;::::0;::::1;15395:21:1::0;15452:2;15432:18;;;15425:30;15491;15471:18;;;15464:58;15539:18;;60943:38:0::1;15211:352:1::0;60902:79:0::1;61019:19:::0;;61088:24;61053:20;-1:-1:-1;;61019:19:0::1;::::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;61019:19:0;::::1;::::0;::::1;61053:20:::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;-1:-1:-1::0;;61053:20:0;;;;;;;;;::::1;61088:24:::0;;::::1;::::0;::::1;::::0;;;::::1;;-1:-1:-1::0;;61088:24:0;;::::1;;::::0;;-1:-1:-1;61019:19:0;57512:1:::1;60765:396:::0;:::o;59974:122::-;60022:4;60039:27;60045:12;:10;:12::i;:::-;60059:6;60039:5;:27::i;64183:133::-;64238:4;57488:13;:11;:13::i;:::-;64255:31:::1;64262:23:::0;::::1;64255:31;:::i;:::-;-1:-1:-1::0;64304:4:0::1;64183:133:::0;:::o;59810:152::-;59865:4;59882:50;59891:12;:10;:12::i;:::-;59905:7;-1:-1:-1;;59882:8:0;:50::i;62968:110::-;63013:14;-1:-1:-1;;;;;;;;;;;63047:23:0;;63040:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63040:30:0;;;-1:-1:-1;;63040:30:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;63040:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;62968:110;:::o;57804:103::-;57488:13;:11;:13::i;:::-;57869:30:::1;57896:1;57869:18;:30::i;:::-;57804:103::o:0;47420:131::-;47491:4;47515:28;47529:5;47536:6;47515:13;:28::i;60577:180::-;57488:13;:11;:13::i;:::-;60641:22:::1;::::0;;::::1;::::0;::::1;::::0;;:12;:22;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;::::0;;;;;;;::::1;::::0;::::1;::::0;;;;;;::::1;;::::0;;::::1;::::0;;;;;;;;;;::::1;::::0;;::::1;::::0;;;;;;::::1;-1:-1:-1::0;;;;;60641:22:0::1;::::0;;;;-1:-1:-1;;;60641:22:0;;::::1;;;::::0;;;;;;;;::::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;;::::1;;::::0;;;;;;;;;;;;;;:46:::1;::::0;60664:22:::1;60641;:46::i;:::-;60640:47;60632:86;;;::::0;-1:-1:-1;;;60632:86:0;;16212:2:1;60632:86:0::1;::::0;::::1;16194:21:1::0;16251:2;16231:18;;;16224:30;16290:28;16270:18;;;16263:56;16336:18;;60632:86:0::1;16010:350:1::0;60632:86:0::1;60729:20;-1:-1:-1::0;;;;;;;;;;;60729:18:0::1;:20::i;:::-;;60577:180::o:0;64637:173::-;64693:4;64713:6;64723:1;64713:11;64710:49;;64748:2;-1:-1:-1;;;;;64735:16:0;;;;;:12;:16;;;;;:24;-1:-1:-1;;;;;64735:24:0;;-1:-1:-1;64710:49:0;64777:25;64791:2;64795:6;64777:13;:25::i;64818:325::-;64888:4;57488:13;:11;:13::i;:::-;64905:31:::1;64912:23:::0;::::1;64905:31;:::i;:::-;65018:13:::0;;64973:23;;64947::::1;65042:72;65058:3;65054:1;:7;65042:72;;;65079:7;65092:6;65099:1;65092:9;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;65079:23;;::::1;::::0;::::1;::::0;;-1:-1:-1;65079:23:0;;;;;;;;;::::1;::::0;;::::1;;::::0;;;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;65079:23:0::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;;;;;65079:23:0::1;::::0;::::1;-1:-1:-1::0;;65079:23:0;;;::::1;::::0;;::::1;::::0;;;;;;;::::1;::::0;;65042:72:::1;;;-1:-1:-1::0;65131:4:0::1;::::0;64818:325;-1:-1:-1;;;;64818:325:0:o;46408:146::-;46472:4;46489:35;46499:12;:10;:12::i;:::-;46513:2;46517:6;46489:9;:35::i;60104:319::-;60173:4;57488:13;:11;:13::i;:::-;-1:-1:-1;;;;;;;;;;;45476:18:0;;-1:-1:-1;;45476:18:0::1;45490:4;45476:18;::::0;;27213:42:::2;60190:22;14596:9:::0;-1:-1:-1;;;;;60247:2:0::2;60264:16:::0;::::2;;::::0;;;:12;:16:::2;::::0;;;;;:24;60335:17;;60190:203;;;::::2;::::0;;;;;;::::2;::::0;::::2;19088:34:1::0;;;;-1:-1:-1;;;;;60264:24:0;;::::2;19138:18:1::0;;;19131:73;19220:18;;;19213:34;;;19263:18;;;19256:34;;;;60335:17:0;::::2;19306:19:1::0;;;19299:44;60367:15:0::2;19359:19:1::0;;;19352:35;60190:203:0;;18999:19:1;;;;;60190:203:0::2;::::0;;;;;;;;;;::::2;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;60411:4;60404:11;;45531:5:::1;45517:4;-1:-1:-1::0;;;;;;;;;;;12828:66:0;66796:214;45517:4:::1;:19:::0;;-1:-1:-1;;45517:19:0::1;::::0;::::1;;::::0;;;::::1;::::0;;60104:319;:::o;61830:1000::-;61892:15;;;;;;;;;;-1:-1:-1;;;;;;;;;;;62172:43:0;;;;;;;;62203:12;;;62172:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;62172:43:0;;;;;-1:-1:-1;;;62172:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62239:35:0;62172:43;-1:-1:-1;62239:17:0;:35::i;:::-;62226:48;-1:-1:-1;62297:34:0;:7;62315:15;62297:17;:34::i;:::-;62285:46;-1:-1:-1;62355:35:0;:7;62373:16;62355:17;:35::i;:::-;62342:48;-1:-1:-1;62416:37:0;:7;62434:18;62416:17;:37::i;:::-;62401:52;-1:-1:-1;62482:40:0;:7;62500:21;62482:17;:40::i;:::-;62464:58;-1:-1:-1;62552:41:0;:7;62570:22;62552:17;:41::i;:::-;62533:60;-1:-1:-1;62624:42:0;:7;62642:23;62624:17;:42::i;:::-;62604:62;-1:-1:-1;62699:44:0;:7;62717:25;62699:17;:44::i;:::-;62677:66;-1:-1:-1;62777:45:0;:7;62795:26;62777:17;:45::i;:::-;62754:68;;62161:669;61830:1000;;;;;;;;;:::o;47284:128::-;47346:4;47363:19;47375:6;47363:11;:19::i;65341:1447::-;65563:15;65551:8;:27;;65543:63;;;;-1:-1:-1;;;65543:63:0;;19911:2:1;65543:63:0;;;19893:21:1;19950:2;19930:18;;;19923:30;19989:25;19969:18;;;19962:53;20032:18;;65543:63:0;19709:347:1;65543:63:0;65642:24;65669:832;65809:18;:16;:18::i;:::-;65939:167;66141:5;66181:7;66223:5;-1:-1:-1;;;;;;;;;;;;;;;;66263:18:0;;;;;;;:11;;;;;:18;;;;;;;;;:20;;;;;;;;65894:463;;;;;20348:25:1;;;;20470:15;;;20450:18;;;20443:43;20522:15;;20502:18;;;20495:43;20554:18;;;20547:34;;;;20597:19;;;20590:35;;;;20641:19;;;;20634:35;;;65894:463:0;;;;;;;;;;20320:19:1;;;65894:463:0;;;65854:530;;;;;20950:66:1;65729:678:0;;;20938:79:1;21033:11;;;21026:27;;;;21069:12;;;21062:28;;;;21106:12;;65729:678:0;;;-1:-1:-1;;65729:678:0;;;;;;;;;65697:729;;65729:678;65697:729;;;;65669:832;;;;;;;;;21356:25:1;21429:4;21417:17;;21397:18;;;21390:45;21451:18;;;21444:34;;;21494:18;;;21487:34;;;21328:19;;65669:832:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;65669:832:0;;-1:-1:-1;;65669:832:0;;;-1:-1:-1;;;;;;;66544:30:0;;;;;;:59;;;66598:5;-1:-1:-1;;;;;66578:25:0;:16;-1:-1:-1;;;;;66578:25:0;;66544:59;66518:135;;;;-1:-1:-1;;;66518:135:0;;21734:2:1;66518:135:0;;;21716:21:1;21773:2;21753:18;;;21746:30;21812:16;21792:18;;;21785:44;21846:18;;66518:135:0;21532:338:1;66518:135:0;-1:-1:-1;;;;;66670:33:0;;;;;;;:15;:33;;;;;;;;:42;;;;;;;;;;;;;:50;;;66749:31;;4054:25:1;;;66749:31:0;;66670:42;;66749:31;;;;;;;;;;;;;;65341:1447;;;;;;;:::o;57915:201::-;57488:13;:11;:13::i;:::-;-1:-1:-1;;;;;58004:22:0;::::1;57996:73;;;::::0;-1:-1:-1;;;57996:73:0;;22077:2:1;57996:73:0::1;::::0;::::1;22059:21:1::0;22116:2;22096:18;;;22089:30;22155:34;22135:18;;;22128:62;22226:8;22206:18;;;22199:36;22252:19;;57996:73:0::1;21875:402:1::0;57996:73:0::1;58080:28;58099:8;58080:18;:28::i;63844:162::-:0;63921:4;57488:13;:11;:13::i;:::-;63938:38:::1;63972:3:::0;63938:24:::1;63956:5:::0;-1:-1:-1;;;;;;;;;;;63938:4:0::1;:17:::0;::::1;:24::i;:::-;:33:::0;::::1;:38::i;56084:196::-:0;56150:6;56160:1;56150:11;:33;;56173:2;-1:-1:-1;;;;;56173:10:0;;56150:33;;;56164:6;56150:33;56141:42;-1:-1:-1;56194:78:0;56141:42;-1:-1:-1;;;;;;;;;;;56241:12:0;;:30;-1:-1:-1;;;56241:30:0;;;;56202:4;-1:-1:-1;;;;;;;;;;;12828:66:0;66796:214;56202:4;:17;;;-1:-1:-1;;;;;56202:17:0;;56194:78;:38;:78::i;:::-;;56084:196;:::o;44260:110::-;44313:7;44340:22;:20;:22::i;54844:173::-;54971:38;54980:5;54987:7;54996:6;55004:4;54971:8;:38::i;:::-;54844:173;;;:::o;57635:161::-;57705:12;:10;:12::i;:::-;-1:-1:-1;;;;;57686:31:0;:15;:13;:15::i;:::-;-1:-1:-1;;;;;57686:31:0;;57683:106;;57734:43;;-1:-1:-1;;;57734:43:0;;22484:2:1;57734:43:0;;;22466:21:1;;;22503:18;;;22496:30;22562:34;22542:18;;;22535:62;22614:18;;57734:43:0;22282:356:1;55025:579:0;-1:-1:-1;;;;;55176:19:0;;55172:72;;55217:27;;;;;55241:1;55217:27;;;6968:74:1;6941:18;;55217:27:0;6822:226:1;55172:72:0;-1:-1:-1;;;;;55261:21:0;;55257:73;;55304:26;;;;;55327:1;55304:26;;;6968:74:1;6941:18;;55304:26:0;6822:226:1;55257:73:0;55347:21;55371:24;55389:5;-1:-1:-1;;;;;;;;;;;55371:4:0;66796:214;55371:24;55347:48;-1:-1:-1;55406:23:0;55432:26;55450:7;-1:-1:-1;;;;;;;;;;;55432:4:0;66796:214;55432:26;55487:14;;;;;-1:-1:-1;;;;;;;;55487:14:0;;;;;;55471:31;;;;:15;:31;;;;;;;;55503:16;;;;;;;;;;;55471:49;;;;;;;:58;;;55503:16;-1:-1:-1;55542:52:0;;;;55578:7;-1:-1:-1;;;;;55562:32:0;55571:5;-1:-1:-1;;;;;55562:32:0;;55587:6;55562:32;;;;4054:25:1;;4042:2;4027:18;;3908:177;55562:32:0;;;;;;;;55542:52;55159:445;;55025:579;;;;:::o;47728:4145::-;47921:40;;;;;;;;47952:9;47921:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47921:40:0;;;;;-1:-1:-1;;;47921:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;12828:66:0;-1:-1:-1;47997:20:0;12828:66;48012:4;47997:14;:20::i;:::-;47974:43;-1:-1:-1;48028:25:0;48056;:1;48071:9;48056:14;:25::i;:::-;48098:13;;;;48028:53;;-1:-1:-1;;;;48098:13:0;;-1:-1:-1;;;;;48098:13:0;48094:65;;48134:25;;;;;48156:1;48134:25;;;6968:74:1;6941:18;;48134:25:0;6822:226:1;48094:65:0;48174:18;;;;-1:-1:-1;;;48174:18:0;;-1:-1:-1;;;;;48174:18:0;48170:73;;48215:28;;;;;48240:1;48215:28;;;6968:74:1;6941:18;;48215:28:0;6822:226:1;48170:73:0;48256:28;48287:263;48534:7;48543:6;48287:224;;;;;;;;48317:28;48332:12;:10;:12::i;:::-;48317:1;;:14;:28::i;:::-;48287:224;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48287:224:0;-1:-1:-1;;;;;48287:224:0;-1:-1:-1;;;;;48287:224:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48287:224:0;-1:-1:-1;;;;;48287:224:0;-1:-1:-1;;;;;48287:224:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48287:224:0;-1:-1:-1;;;;;48287:224:0;-1:-1:-1;;;;;48287:224:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48347:5;48287:224;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48287:224:0;-1:-1:-1;;;;;48287:224:0;-1:-1:-1;;;;;48287:224:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48287:224:0;-1:-1:-1;;;;;48287:224:0;-1:-1:-1;;;;;48287:224:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48287:224:0;-1:-1:-1;;;;;48287:224:0;-1:-1:-1;;;;;48287:224:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48354:10;48287:224;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48287:224:0;-1:-1:-1;;;;;48287:224:0;-1:-1:-1;;;;;48287:224:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48287:224:0;-1:-1:-1;;;;;48287:224:0;-1:-1:-1;;;;;48287:224:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48287:224:0;-1:-1:-1;;;;;48287:224:0;-1:-1:-1;;;;;48287:224:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48366:1;48287:224;;;;;;48369:1;-1:-1:-1;;;;;48287:224:0;;;;;48372:1;-1:-1:-1;;;;;48287:224:0;;;;;48375:1;:8;;;;;;;;;;;;48287:224;;;;;;48385:1;-1:-1:-1;;;;;48287:224:0;;;;;48395:12;48287:224;;;;;;48424:76;;;;;;;;48442:1;48436:8;;;;;;;;:::i;:::-;48424:76;;;;;;;;:::i;:::-;;;;;48452:1;48424:76;;;;48463:1;48424:76;;;;48476:1;48424:76;;48480:19;;;;48424:76;;;;;48287:224;;:246;:263;:246;:263::i;:::-;-1:-1:-1;;;;;48604:2:0;48594:13;48571:20;48594:13;;;:9;;;:13;;;;;48256:294;;-1:-1:-1;48651:12:0;48623:18;;;;:24;:40;;;;;;;;:::i;:::-;;48620:314;;48716:17;48685:6;:18;;;:27;;;:48;;;;;;;;:::i;:::-;;;:72;;;;;48756:1;48737:6;:16;;;-1:-1:-1;;;;;48737:20:0;;48685:72;48682:152;;;48778:40;48787:5;48794;48801:6;:16;;;48778:8;:40::i;:::-;48850:44;48858:5;48865:10;48877:6;:16;;;48850:7;:44::i;:::-;48918:4;48911:11;;;;;;;;;;48620:314;48980:17;48949:6;:18;;;:27;;;:48;;;;;;;;:::i;:::-;;;:72;;;;;49020:1;49001:6;:16;;;-1:-1:-1;;;;;49001:20:0;;48949:72;48946:549;;;49040:40;49049:5;49056;49063:6;:16;;;49040:8;:40::i;:::-;49108:35;:7;49126:16;49108:17;:35::i;:::-;:59;;;;;49166:1;49147:6;:16;;;-1:-1:-1;;;;;49147:20:0;;49108:59;:106;;;;-1:-1:-1;49200:14:0;49171:6;:18;;;:25;;;:43;;;;;;;;:::i;:::-;;;49108:106;49105:361;;;49300:10;49271:6;:18;;;:25;;;:39;;;;;;;;:::i;:::-;;49268:143;;49329:16;;;;49312:33;;-1:-1:-1;;;;;;;;49312:33:0;;;;;;;;;;;;;;;;;;;49268:143;;;49395:16;;;;49373:38;;-1:-1:-1;;;;;;;;49373:38:0;;;;;;;;;;;;;;;;;;;49268:143;49510:35;:7;49528:16;49510:17;:35::i;:::-;:66;;;;-1:-1:-1;49550:24:0;;;;;;;;;;-1:-1:-1;;;;;49550:24:0;;;;;-1:-1:-1;;;49550:24:0;;;;;;;-1:-1:-1;;;49550:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;49550:24:0;;-1:-1:-1;;;;;49550:24:0;;;;;;;;;;;;;;;:26;;:24;:26::i;:::-;49549:27;49510:66;49507:389;;;49622:24;49649:6;:16;;;:24;;;49622:51;;49733:7;:23;;;-1:-1:-1;;;;;49695:61:0;49714:6;:16;;;49695;:35;-1:-1:-1;;;;;49695:61:0;;49692:177;;;49809:23;;;;;49834:16;;;;49786:83;;;;;-1:-1:-1;;;;;23103:15:1;;;49786:83:0;;;23085:34:1;23155:15;;;23135:18;;;23128:43;23207:15;;;23187:18;;;23180:43;23007:18;;49786:83:0;22832:397:1;49692:177:0;49593:292;49507:389;49940:12;49911:6;:18;;;:25;;;:41;;;;;;;;:::i;:::-;;49908:1867;;49975:41;:7;49993:22;49975:17;:41::i;:::-;49971:90;;50042:19;;;;;;;;;;;;;;49971:90;50110:11;50081:6;:18;;;:25;;;:40;;;;;;;;:::i;:::-;;50078:973;;50147:34;:7;50165:15;50147:17;:34::i;:::-;50144:436;;;50263:19;;;;;50243:40;;;;;;;;:19;;;:40;;;;;;:42;;-1:-1:-1;;50243:42:0;;;;;;;;;;;;;;50346:19;;50326:40;;;;;;;50404:22;;;;50326:40;;;;50396:30;;;50393:120;;;50483:22;;;;50464:49;;;;;23434:4:1;23422:17;;;50464:49:0;;;23404:36:1;23476:17;;;23456:18;;;23449:45;23377:18;;50464:49:0;23234:266:1;50393:120:0;50206:355;50144:436;50651:16;;;;50669;;;;50620:13;;:75;;-1:-1:-1;;;;;50620:13:0;;;;50687:7;50620:30;:75::i;:::-;-1:-1:-1;;;;;50600:95:0;:17;;;:95;50719:42;:7;50737:23;50719:17;:42::i;:::-;:67;;;;;50785:1;50765:6;:17;;;-1:-1:-1;;;;;50765:21:0;;50719:67;50716:318;;;50829:17;;;;50849:14;;;;50811:145;;50829:17;-1:-1:-1;;;;;50849:14:0;50865:40;:7;50883:21;50865:17;:40::i;:::-;50907:7;:21;;;50930:7;:25;;;50811:9;:145::i;:::-;50996:17;;;;50984:30;;-1:-1:-1;;;;;23669:45:1;;;23651:64;;50984:30:0;;23639:2:1;23624:18;50984:30:0;;;;;;;50716:318;51070:45;:7;51088:26;51070:17;:45::i;:::-;51067:695;;;51172:19;;;;;;;;;;-1:-1:-1;;;;;51172:19:0;;;;;-1:-1:-1;;;51172:19:0;;;;;;;-1:-1:-1;;;51172:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51172:19:0;;-1:-1:-1;;;;;51172:19:0;;;;;;;;;;;;;;;:21;;:19;:21::i;:::-;:65;;;;-1:-1:-1;51226:11:0;51197:6;:18;;;:25;;;:40;;;;;;;;:::i;:::-;;51172:65;51169:559;;;51269:14;;51286:3;-1:-1:-1;;;51269:14:0;;;;;:20;51266:41;;;51291:16;;;;-1:-1:-1;;;51291:16:0;;;;;;;;;;;-1:-1:-1;;;;51291:16:0;;;;;;51266:41;51355:25;;;;51337:14;;:43;;;;-1:-1:-1;;;51337:14:0;;;;;;:43;51334:72;;51382:24;:5;:22;:24::i;:::-;;51334:72;51169:559;;;51441:24;;;;;;;;;;-1:-1:-1;;;;;51441:24:0;;;;;-1:-1:-1;;;51441:24:0;;;;;;;-1:-1:-1;;;51441:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51441:24:0;;-1:-1:-1;;;;;51441:24:0;;;;;;;;;;;;;;;:26;;:24;:26::i;:::-;:69;;;;-1:-1:-1;51500:10:0;51471:6;:18;;;:25;;;:39;;;;;;;;:::i;:::-;;51441:69;51438:290;;;51542:19;;51564:3;-1:-1:-1;;;51542:19:0;;;;;:25;51539:51;;;51569:21;;;;-1:-1:-1;;;51569:21:0;;;;;;;;;;;-1:-1:-1;;;;51569:21:0;;;;;;51539:51;51643:25;;;;51620:19;;:48;;;;-1:-1:-1;;;51620:19:0;;;;;;:48;51617:82;;51670:29;:10;:27;:29::i;:::-;;51617:82;51795:44;51803:5;51810:10;51822:6;:16;;;51795:7;:44::i;:::-;-1:-1:-1;51859:4:0;;47728:4145;-1:-1:-1;;;;;;;;;47728:4145:0:o;38958:328::-;39075:16;;;;39028:14;;-1:-1:-1;;;39075:16:0;;;;39130:8;;;39137:1;39130:8;39127:48;;39157:18;;-1:-1:-1;;;;39157:18:0;;;39127:48;28850:1;:8;;;;28848:11;28840:19;;39211:16;28840:19;39211:21;39192:16;;;:40;;;;;;;-1:-1:-1;;;39192:40:0;;;;;;;;;;;-1:-1:-1;39192:5:0;;38958:328;-1:-1:-1;;38958:328:0:o;44027:108::-;44087:7;44114:13;:4;:11;:13::i;55612:464::-;-1:-1:-1;;;;;55751:15:0;;55679:29;55751:15;;;:9;:15;;;;;55797:13;;-1:-1:-1;;;;;;;;;;;12828:66:0;55751:15;-1:-1:-1;;;;;55797:13:0;55827:16;;;55823:65;;;55852:36;;-1:-1:-1;;;55852:36:0;;-1:-1:-1;;;;;23918:45:1;;55852:36:0;;;23900:64:1;23980:18;;;23973:34;;;23873:18;;55852:36:0;23726:287:1;55823:65:0;55926:31;;-1:-1:-1;;55926:31:0;;;;;;-1:-1:-1;;;;;55926:31:0;;;;;;;;;;55972;;-1:-1:-1;;55972:31:0;;;;;;;;;;;;;;;;;;;56032:34;;4054:25:1;;;-1:-1:-1;;;;;;;56032:34:0;;;;;4042:2:1;4027:18;56032:34:0;;;;;;;55666:410;;;55612:464;;:::o;58124:213::-;58217:17;;;-1:-1:-1;;;;;58245:28:0;;;;;;;;;;;58289:40;;58217:17;;;58245:28;58217:17;;58289:40;;58198:16;;58289:40;58187:150;58124:213;:::o;56292:272::-;56364:4;56403:2;-1:-1:-1;;;;;56394:11:0;:5;-1:-1:-1;;;;;56394:11:0;;56391:76;;56427:40;56437:2;-1:-1:-1;;;;;;;;;;;56441:17:0;;;-1:-1:-1;;;;;56441:17:0;56460:6;56427:9;:40::i;:::-;56420:47;;;;56391:76;56508:17;;56488:46;;-1:-1:-1;;;;;56488:19:0;;;;56508:17;56527:6;56488:19;:46::i;29299:152::-;29385:4;29409:34;29435:6;29429:13;;;;;;;;:::i;:::-;29409:15;;:19;;28059:12;;;;;28075:1;28058:18;;;:23;;27973:116;40542:131;40618:9;;;40128:13;;-1:-1:-1;;40152:35:0;;40128:13;;;;29250:8;29241:18;40152:35;;;;;;;;;40601:4;;40618:25;40013:221;40250:284;-1:-1:-1;;;;;40365:16:0;;;40322:21;40365:16;;;:9;;;:16;;;;;;;;;40396:19;;;;;;;;;-1:-1:-1;;;;;40396:19:0;;;;;-1:-1:-1;;;40396:19:0;;;;;;;;;;-1:-1:-1;;;40396:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;40396:19:0;;;;;;;;;;;;;;;;;:21;;:19;:21::i;:::-;40392:135;;40434:14;;;:22;;;;-1:-1:-1;;;;;;;;40434:22:0;;;;;;;;-1:-1:-1;;;40491:17:0;;;;28455:8;28446:18;40471:6;:17;;;:44;;;;;;;;;;;;;;;;;;40250:284;;;;:::o;38495:225::-;38610:16;;;;;38563:14;;-1:-1:-1;;;38610:16:0;;;;;;28455:8;;;;28446:18;;38668:19;28353:120;6833:300;6932:4;-1:-1:-1;;;;;6952:21:0;;6949:72;;6982:39;;-1:-1:-1;;;6982:39:0;;24220:2:1;6982:39:0;;;24202:21:1;24259:2;24239:18;;;24232:30;24298:27;24278:18;;;24271:55;24343:18;;6982:39:0;24018:349:1;6949:72:0;7033:12;7051:7;-1:-1:-1;;;;;7051:12:0;7072:6;7085:9;7051:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7032:68:0;;6833:300;-1:-1:-1;;;;;;6833:300:0:o;13962:453::-;14006:14;14089:4;14067:10;:27;14063:345;;14111:18;14132:8;;14111:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;14171:8:0;14249:17;14243:24;-1:-1:-1;;;;;14239:91:0;;-1:-1:-1;14063:345:0;;-1:-1:-1;14063:345:0;;-1:-1:-1;14386:10:0;13962:453;:::o;44614:125::-;44662:23;44705:26;:24;:26::i;32108:459::-;32271:21;;:::i;:::-;32320:9;;;;:17;-1:-1:-1;;;;;32311:26:0;;;32307:98;;;32379:9;;;;:17;32359:46;;-1:-1:-1;;;32359:46:0;;-1:-1:-1;;;;;23918:45:1;;;32359:46:0;;;23900:64:1;23980:18;;;23973:34;;;23873:18;;32359:46:0;23726:287:1;32307:98:0;32418:26;:4;32436:7;32418:17;:26::i;:::-;-1:-1:-1;32517:15:0;;;;32492:41;;:6;;:24;:41::i;:::-;-1:-1:-1;;;;;32457:76:0;;;32474:14;;;32457:76;;32458:14;;;32457:76;-1:-1:-1;32474:14:0;;32108:459;-1:-1:-1;;32108:459:0:o;54230:287::-;54383:22;;-1:-1:-1;;54383:22:0;;;-1:-1:-1;;;;;54383:22:0;;;;;;;;;;;54420:20;;;;;;;;;;;;;;;-1:-1:-1;54490:10:0;;;;54476:12;;;;54467:42;;23669:45:1;;;23651:64;;-1:-1:-1;;;54490:10:0;;;;-1:-1:-1;;;;;54490:10:0;;;;54476:12;;;;;;54467:42;;23639:2:1;23624:18;54467:42:0;;;;;;;54230:287;;;:::o;34027:125::-;34119:17;;;;34095:4;;34141:2;28059:12;28075:1;28058:18;;;:23;34119:25;27973:116;32575:1054;32805:11;32832:44;:7;32850:25;32832:17;:44::i;:::-;32829:761;;;-1:-1:-1;;;;;32936:21:0;;;32922:35;;;33002:15;;;;;;33061;;;;;;33099:30;;;;33095:452;;33173:15;33152:37;;33095:452;;;33235:11;-1:-1:-1;;;;;33217:29:0;:14;:29;33213:334;;33290:14;33269:36;;33213:334;;;33340:11;-1:-1:-1;;;;;33333:18:0;:3;:18;33329:218;;33395:3;33374:25;;33329:218;;;33440:11;-1:-1:-1;;;;;33427:24:0;:9;-1:-1:-1;;;;;33427:24:0;;33423:124;;33495:9;33474:31;;33423:124;;;33536:11;33529:18;;;;;;;33423:124;32893:674;;;32829:761;32575:1054;;;;;;:::o;51881:2341::-;-1:-1:-1;;;;;;;;;;;45476:18:0;;-1:-1:-1;;45476:18:0;45490:4;45476:18;;;52185:16:::1;::::0;;52199:1:::1;52185:16:::0;;;;;::::1;::::0;;52134:13;;-1:-1:-1;;52185:16:0;52199:1;52185:16:::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;52185:16:0::1;52161:40;;52222:2;52212:4;52217:1;52212:7;;;;;;;;:::i;:::-;;;;;;:12;-1:-1:-1::0;;;;;52212:12:0::1;;;-1:-1:-1::0;;;;;52212:12:0::1;;;::::0;::::1;27213:42;-1:-1:-1::0;;;;;52245:11:0::1;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52235:4;52240:1;52235:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;52235:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;;;:23;52271::::1;52329:5;52350:6:::0;:27;::::1;;;;52376:1;52360:13;:17;;;52350:27;52347:294;;;52491:1;52474:14;52441:47;;52457:13;52442:28;;:12;:28;-1:-1:-1::0;;;;;52441:47:0::1;;;;;;:::i;:::-;;-1:-1:-1::0;;;;;52441:51:0::1;;;;;;:::i;:::-;;::::0;-1:-1:-1;52546:1:0::1;52530:17;::::0;::::1;52567:31:::0;;;::::1;::::0;52530:17:::1;52511:37:::0;::::1;52347:294;52700:177;::::0;;;;52677:2:::1;-1:-1:-1::0;;;;;52677:10:0;::::1;;::::0;27213:42:::1;::::0;52700:57:::1;::::0;:177:::1;::::0;52772:12;;52653:21:::1;::::0;52815:4;;52851:15:::1;::::0;52700:177:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;52890:17;52923:13;52910:2;-1:-1:-1::0;;;;;52910:10:0::1;;:26;;;;:::i;:::-;52890:46;;52947:21;52971:1;:20;;52947:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;52947:44:0;;;-1:-1:-1;;52947:44:0::1;::::0;;::::1;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;;;;;;;::::1;-1:-1:-1::0;;;;;52947:44:0::1;::::0;;;;;;;;;;;;;;::::1;::::0;::::1;;;;-1:-1:-1::0;;53032:13:0;;52947:44;;-1:-1:-1;;53061:23:0;;;-1:-1:-1;53058:620:0::1;;53105:9;53101:566;53120:19;53116:1;:23;53101:566;;;53215:1;53197:6;53204:1;53197:9;;;;;;;;:::i;:::-;;;;;;;:15;;;:19;;;53194:413;;;53257:19;53309:14;53279:44;;53291:6;53298:1;53291:9;;;;;;;;:::i;:::-;;;;;;;:15;;;53279:27;;:9;:27;:44;;;;;:::i;:::-;;53257:66;;53377:1;-1:-1:-1::0;;;;;53353:26:0::1;:6;53360:1;53353:9;;;;;;;;:::i;:::-;;;;;;;:12;;;-1:-1:-1::0;;;;;53353:26:0::1;::::0;53350:229:::1;;53410:57;-1:-1:-1::0;;;;;53410:30:0;::::1;53441:11:::0;53410:57:::1;::::0;::::1;:30;:57::i;:::-;;53350:229;;;53528:51;53553:11;53566:12;53528:51;;:6;53535:1;53528:9;;;;;;;;:::i;:::-;;;;;;;:12;;;-1:-1:-1::0;;;;;53528:24:0::1;;;:51;;;;;:::i;:::-;;53350:229;53218:389;53194:413;53629:3;;53101:566;;;;53058:620;-1:-1:-1::0;;;;;53693:19:0;::::1;::::0;53690:454:::1;;53761:19;53830:1;53813:14;53783:44;;53796:13;53784:25;;:9;:25;53783:44;;;;;:::i;:::-;;:48;;;;;:::i;:::-;53851:252;::::0;;;;-1:-1:-1;;;;;53917:2:0::1;19106:15:1::0;;53851:252:0::1;::::0;::::1;19088:34:1::0;-1:-1:-1;;;;;19158:45:1;;19138:18;;;19131:73;-1:-1:-1;19220:18:1;;;19213:34;;;19263:18;;;19256:34;19327:15;;19306:19;;;19299:44;54069:15:0::1;19359:19:1::0;;;19352:35;53783:48:0;;::::1;::::0;-1:-1:-1;27213:42:0::1;::::0;53851:22:::1;::::0;53783:48;;18999:19:1;;53851:252:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;53731:400;53690:454;54156:56;-1:-1:-1::0;;;;;54156:30:0;;::::1;::::0;54187:2:::1;:10;;54156:56;::::0;::::1;:30;:56::i;:::-;;52019:2203;;;;;;;;;45531:5:::0;45517:4;-1:-1:-1;;;;;;;;;;;12828:66:0;66796:214;45517:4;:19;;-1:-1:-1;;45517:19:0;;;;;;;;;;-1:-1:-1;;;;;51881:2341:0:o;31797:303::-;31863:16;31937:4;:12;;;31920:29;;:4;:13;;;:29;;;;:49;;;;;31968:1;31953:4;:12;;;:16;;;31920:49;31917:151;;;26683:1;32005:46;;32021:4;:12;;;32005:4;:13;;;:28;:46;;;;31990:62;;31797:303;;;:::o;37003:125::-;37069:14;37103:17;:5;37118:1;37103:14;:17::i;13459:365::-;13518:7;13013:104;;;;;;;;;;;;;;;;;13003:115;;;;;;;13631:22;;;;;;13689:7;;;;;;;;;;;;;;;;;;;13003:115;13673:25;13927:9;13569:236;;;;;;27199:25:1;;;;27240:18;;27233:34;;;;27283:18;;;27276:34;27326:18;;;27319:34;13755:4:0;27369:19:1;;;27362:84;13779:11:0;27462:19:1;;;27455:35;27171:19;;13569:236:0;;;;;;;;;;;;13545:271;;;;;;13538:278;;13459:365;;;:::o;7141:440::-;7229:4;7235:12;-1:-1:-1;;;;;7263:21:0;;7260:72;;7293:39;;-1:-1:-1;;;7293:39:0;;24220:2:1;7293:39:0;;;24202:21:1;24259:2;24239:18;;;24232:30;24298:27;24278:18;;;24271:55;24343:18;;7293:39:0;24018:349:1;7260:72:0;7404:83;;;-1:-1:-1;;;;;27693:55:1;;;7404:83:0;;;27675:74:1;27765:18;;;;27758:34;;;7404:83:0;;;;;;;;;;27648:18:1;;;;7404:83:0;;;;;;;;;7445:24;7404:83;;;7379:123;;-1:-1:-1;;;;7379:10:0;;;;:123;;7404:83;7379:123;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7343:159;;;;7522:48;7549:5;7556:7;7565:4;7522:26;:48::i;:::-;7515:55;;;;;;7141:440;;;;;;;:::o;33637:122::-;33727:17;;;;33703:4;;33749:1;28059:12;;;28058:18;;:23;33727:24;27973:116;14621:654;14772:8;14669:23;14759:22;;;14808:14;14802:4;14795:28;14860:14;14854:21;14925:4;14909:21;;14869:4;14905:32;14899:39;-1:-1:-1;;;;;;;;;;;12828:66:0;14854:21;15073:15;14971:4;14967:13;;;;15064:25;;;15100:15;15091:25;;;15061:56;15054:64;15047:72;;15133:54;;15176:9;15157:28;;15133:54;15217:4;15207:8;15204:18;15201:56;;15250:4;15244:11;15225:30;;15201:56;;;14744:524;14621:654;:::o;29676:2112::-;29806:21;;:::i;:::-;29845:6;:19;;;29842:298;;;29902:198;;;;;;;;;;29932:12;29902:198;;;;29964:14;29902:198;;;;29997:15;29902:198;;;;30031:17;29902:198;;30067:18;;;;;;;;-1:-1:-1;30067:18:0;;;29902:198;30067:18;;;;;;;;;;29902:198;;;29881:18;;;:219;-1:-1:-1;29881:6:0;30115:13;;29842:298;30152:18;;;;;30180:14;30152:25;;;;:42;;;30205:18;;:25;;:42;30285:26;30152:18;30285:24;:26::i;:::-;:60;;30329:16;30285:60;;;30314:12;30285:60;30258:18;;;;;:87;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;30361:24:0;:6;:22;:24::i;:::-;30358:675;;;30402:18;;;;30432:17;30402:27;;;;:47;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;29591:47:0;;;;;;;;;;;;;;;;;;;;30464:18;;;;:24;;:73;30572:1;30552:17;;;:21;30358:675;;;30606:18;;;;;30636:19;30606:27;;;;:49;30697:19;;;;30670:18;;:24;;:46;30734:45;30697:19;30752:26;30734:17;:45::i;:::-;:90;;;;;30783:41;:6;:39;:41::i;:::-;30731:291;;;30845:18;;;;;30875:19;30845:27;;;;:49;30984:21;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;29591:47:0;;;;;;;;;;;;;;;;;;;;;;;;30913:18;;:24;;:93;30731:291;31065:18;;;;:24;;;:36;;;31045:56;;:17;;;:56;-1:-1:-1;31118:11:0;;;:27;;:25;:27::i;:::-;:63;;;;31149:32;:6;:16;;;:30;:32::i;:::-;31114:639;;;31201:18;;;;31229:12;31201:25;;;;:40;31261:11;;;:27;;:25;:27::i;:::-;31258:452;;;31309:18;;;;;31337:10;31309:25;;;;:38;31393:19;;;;31366:16;;;;:46;;;;:24;;;;:46;31451:18;;:24;;;:31;31431:51;;:17;;;:51;31258:452;;;31523:18;;;;;31551:11;31523:25;;;;:39;31604:19;;;;31581:11;;;;;:42;;;;:20;;;;:42;31662:18;;:24;;:32;;31642:52;;:17;;;:52;31258:452;-1:-1:-1;31733:6:0;31726:13;;31114:639;-1:-1:-1;31772:6:0;;29676:2112;-1:-1:-1;29676:2112:0:o;36514:350::-;36595:17;36614;36649:7;:12;;36660:1;36649:12;36646:57;;-1:-1:-1;36684:1:0;;-1:-1:-1;36695:6:0;36676:27;;36646:57;-1:-1:-1;;26642:5:0;36761:27;:16;;;;:27;-1:-1:-1;;;;;36824:18:0;;;;36514:350;;;;;;:::o;11806:405::-;11953:4;11959:12;11989:6;11984:220;;12012:19;12020:10;12012:7;:19::i;:::-;11984:220;;;12068:17;;:22;:45;;;;;12095:18;12106:6;12095:10;:18::i;:::-;12094:19;12068:45;12064:87;;;12124:24;;;;;-1:-1:-1;;;;;6986:55:1;;12124:24:0;;;6968:74:1;6941:18;;12124:24:0;6822:226:1;12064:87:0;-1:-1:-1;12173:6:0;;-1:-1:-1;12181:10:0;12165:27;;35554:235;35634:4;35658:29;:6;:11;;;:27;:29::i;:::-;:62;;;;35691:29;:6;:11;;;:27;:29::i;:::-;35658:100;;;;35724:34;:6;:16;;;:32;:34::i;:::-;35658:123;;;-1:-1:-1;;35762:19:0;;;;35554:235::o;34995:169::-;35073:4;35097:25;:6;:11;;;:23;:25::i;:::-;:59;;;;35126:30;:6;:16;;;:28;:30::i;35356:190::-;35451:4;35475:27;:6;:11;;;:25;:27::i;:::-;:63;;;;35506:32;:6;:16;;;:30;:32::i;12219:129::-;12292:48;12300:10;12292:48;;;;;;;;;;;;;;;;;:7;:48::i;6332:108::-;6392:4;11734:20;;11782:8;;6415:17;11604:194;34320:401;34390:18;34435:2;34448:266;34463:2;34454:5;:11;;;;:25;;;;;34477:2;34469:5;:10;;;34454:25;34448:266;;;34499:17;;;;:21;;28059:12;;;;28075:1;28058:18;;;:23;34496:129;;-1:-1:-1;34565:4:0;;34320:401;-1:-1:-1;;34320:401:0:o;34496:129::-;34680:7;;34448:266;;;34410:311;34320:401;;;:::o;34160:152::-;34250:17;;;;34226:4;;34272:2;28059:12;28075:1;28058:18;;;:23;34250:54;;;-1:-1:-1;34279:17:0;;;;34301:2;28059:12;28075:1;28058:18;;;:23;34279:25;27973:116;33767:124;33859:17;;;;33835:4;;33881:1;28059:12;28075:1;28058:18;;;:23;33859:24;27973:116;12360:349;12451:17;;:21;12447:255;;12546:10;12540:17;12603:15;12590:10;12586:2;12582:19;12575:44;12447:255;12684:5;12673:17;;-1:-1:-1;;;12673:17:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;206:250:1;291:1;301:113;315:6;312:1;309:13;301:113;;;391:11;;;385:18;372:11;;;365:39;337:2;330:10;301:113;;;-1:-1:-1;;448:1:1;430:16;;423:27;206:250::o;461:271::-;503:3;541:5;535:12;568:6;563:3;556:19;584:76;653:6;646:4;641:3;637:14;630:4;623:5;619:16;584:76;:::i;:::-;714:2;693:15;-1:-1:-1;;689:29:1;680:39;;;;721:4;676:50;;461:271;-1:-1:-1;;461:271:1:o;737:220::-;886:2;875:9;868:21;849:4;906:45;947:2;936:9;932:18;924:6;906:45;:::i;962:154::-;-1:-1:-1;;;;;1041:5:1;1037:54;1030:5;1027:65;1017:93;;1106:1;1103;1096:12;1121:315;1189:6;1197;1250:2;1238:9;1229:7;1225:23;1221:32;1218:52;;;1266:1;1263;1256:12;1218:52;1305:9;1292:23;1324:31;1349:5;1324:31;:::i;:::-;1374:5;1426:2;1411:18;;;;1398:32;;-1:-1:-1;;;1121:315:1:o;1441:247::-;1500:6;1553:2;1541:9;1532:7;1528:23;1524:32;1521:52;;;1569:1;1566;1559:12;1521:52;1608:9;1595:23;1627:31;1652:5;1627:31;:::i;1693:159::-;1760:20;;1820:6;1809:18;;1799:29;;1789:57;;1842:1;1839;1832:12;1857:156;1923:20;;1983:4;1972:16;;1962:27;;1952:55;;2003:1;2000;1993:12;2018:184;-1:-1:-1;;;2067:1:1;2060:88;2167:4;2164:1;2157:15;2191:4;2188:1;2181:15;2207:251;2279:2;2273:9;2321:2;2309:15;;2354:18;2339:34;;2375:22;;;2336:62;2333:88;;;2401:18;;:::i;:::-;2437:2;2430:22;2207:251;:::o;2463:275::-;2534:2;2528:9;2599:2;2580:13;;-1:-1:-1;;2576:27:1;2564:40;;2634:18;2619:34;;2655:22;;;2616:62;2613:88;;;2681:18;;:::i;:::-;2717:2;2710:22;2463:275;;-1:-1:-1;2463:275:1:o;2743:1160::-;2878:6;2886;2894;2902;2910;2918;2926;2970:9;2961:7;2957:23;3000:3;2996:2;2992:12;2989:32;;;3017:1;3014;3007:12;2989:32;3040:28;3058:9;3040:28;:::i;:::-;3030:38;;3087:37;3120:2;3109:9;3105:18;3087:37;:::i;:::-;3077:47;;3143:36;3175:2;3164:9;3160:18;3143:36;:::i;:::-;3133:46;;3198:36;3230:2;3219:9;3215:18;3198:36;:::i;:::-;3188:46;;3284:3;3273:9;3269:19;3256:33;-1:-1:-1;;;;;3322:5:1;3318:44;3311:5;3308:55;3298:83;;3377:1;3374;3367:12;3298:83;3400:5;-1:-1:-1;3457:3:1;3442:19;;3429:33;3506:8;3493:22;;3481:35;;3471:63;;3530:1;3527;3520:12;3471:63;3553:7;-1:-1:-1;3595:2:1;-1:-1:-1;;3576:17:1;;3572:26;3569:46;;;3611:1;3608;3601:12;3569:46;;3639:22;;:::i;:::-;3686:38;3719:3;3708:9;3704:19;3686:38;:::i;:::-;3677:7;3670:55;3759:38;3792:3;3781:9;3777:19;3759:38;:::i;:::-;3754:2;3745:7;3741:16;3734:64;3832:38;3865:3;3854:9;3850:19;3832:38;:::i;:::-;3827:2;3818:7;3814:16;3807:64;3890:7;3880:17;;;2743:1160;;;;;;;;;;:::o;4090:182::-;4147:6;4200:2;4188:9;4179:7;4175:23;4171:32;4168:52;;;4216:1;4213;4206:12;4168:52;4239:27;4256:9;4239:27;:::i;4277:456::-;4354:6;4362;4370;4423:2;4411:9;4402:7;4398:23;4394:32;4391:52;;;4439:1;4436;4429:12;4391:52;4478:9;4465:23;4497:31;4522:5;4497:31;:::i;:::-;4547:5;-1:-1:-1;4604:2:1;4589:18;;4576:32;4617:33;4576:32;4617:33;:::i;:::-;4277:456;;4669:7;;-1:-1:-1;;;4723:2:1;4708:18;;;;4695:32;;4277:456::o;4738:317::-;4804:6;4812;4865:2;4853:9;4844:7;4840:23;4836:32;4833:52;;;4881:1;4878;4871:12;4833:52;4920:9;4907:23;4939:31;4964:5;4939:31;:::i;:::-;4989:5;-1:-1:-1;5013:36:1;5045:2;5030:18;;5013:36;:::i;:::-;5003:46;;4738:317;;;;;:::o;5431:180::-;5490:6;5543:2;5531:9;5522:7;5518:23;5514:32;5511:52;;;5559:1;5556;5549:12;5511:52;-1:-1:-1;5582:23:1;;5431:180;-1:-1:-1;5431:180:1:o;5616:1201::-;5804:4;5833:2;5873;5862:9;5858:18;5903:2;5892:9;5885:21;5926:6;5961;5955:13;5992:6;5984;5977:22;6018:2;6008:12;;6051:2;6040:9;6036:18;6029:25;;6113:2;6103:6;6100:1;6096:14;6085:9;6081:30;6077:39;6151:2;6143:6;6139:15;6172:1;6182:606;6196:6;6193:1;6190:13;6182:606;;;6289:2;6285:7;6273:9;6265:6;6261:22;6257:36;6252:3;6245:49;6323:6;6317:13;6353:4;6396:2;6390:9;6427:2;6419:6;6412:18;6457:48;6501:2;6493:6;6489:15;6475:12;6457:48;:::i;:::-;6552:11;;;6546:18;6566:6;6542:31;6525:15;;;6518:56;6621:11;;;6615:18;-1:-1:-1;;;;;6611:67:1;6594:15;;;6587:92;;;;-1:-1:-1;6766:12:1;;;;6443:62;-1:-1:-1;6731:15:1;;;;6218:1;6211:9;6182:606;;;-1:-1:-1;6805:6:1;;5616:1201;-1:-1:-1;;;;;;;;5616:1201:1:o;7053:142::-;7129:20;;7158:31;7129:20;7158:31;:::i;7200:2037::-;7307:6;7338:2;7381;7369:9;7360:7;7356:23;7352:32;7349:52;;;7397:1;7394;7387:12;7349:52;7437:9;7424:23;7466:18;7507:2;7499:6;7496:14;7493:34;;;7523:1;7520;7513:12;7493:34;7561:6;7550:9;7546:22;7536:32;;7606:7;7599:4;7595:2;7591:13;7587:27;7577:55;;7628:1;7625;7618:12;7577:55;7664:2;7651:16;7686:2;7682;7679:10;7676:36;;;7692:18;;:::i;:::-;7738:2;7735:1;7731:10;7761:28;7785:2;7781;7777:11;7761:28;:::i;:::-;7823:15;;;7893:11;;;7889:20;;;7854:12;;;;7921:19;;;7918:39;;;7953:1;7950;7943:12;7918:39;7985:2;7981;7977:11;7966:22;;7997:1210;8013:6;8008:3;8005:15;7997:1210;;;8099:3;8086:17;8135:2;8122:11;8119:19;8116:39;;;8151:1;8148;8141:12;8116:39;8178:20;;-1:-1:-1;;8275:4:1;8252:16;;;8248:25;;8244:36;8241:56;;;8293:1;8290;8283:12;8241:56;8323:22;;:::i;:::-;8395:2;8391;8387:11;8374:25;8428:2;8418:8;8415:16;8412:36;;;8444:1;8441;8434:12;8412:36;8471:17;;8523:2;8515:11;;8511:25;-1:-1:-1;8501:53:1;;8550:1;8547;8540:12;8501:53;8598:2;8594;8590:11;8577:25;8626:2;8651;8647;8644:10;8641:36;;;8657:18;;:::i;:::-;8703:48;8747:2;8742;8735:4;8731:2;8727:13;8723:22;8719:31;8703:48;:::i;:::-;8690:61;;8778:2;8771:5;8764:17;8823:7;8817:3;8812:2;8808;8804:11;8800:21;8797:34;8794:54;;;8844:1;8841;8834:12;8794:54;8904:2;8898:3;8894:2;8890:12;8885:2;8878:5;8874:14;8861:46;8952:1;8947:2;8942;8935:5;8931:14;8927:23;8920:34;8981:5;8974;8967:20;9023:31;9049:3;9045:2;9041:12;9023:31;:::i;:::-;9018:2;9011:5;9007:14;9000:55;9092:41;9127:4;9123:2;9119:13;9092:41;:::i;:::-;9075:15;;;9068:66;-1:-1:-1;;9147:18:1;;-1:-1:-1;;8030:12:1;;;;9185;;;;7997:1210;;;9226:5;7200:2037;-1:-1:-1;;;;;;;;;7200:2037:1:o;10088:734::-;10199:6;10207;10215;10223;10231;10239;10247;10300:3;10288:9;10279:7;10275:23;10271:33;10268:53;;;10317:1;10314;10307:12;10268:53;10356:9;10343:23;10375:31;10400:5;10375:31;:::i;:::-;10425:5;-1:-1:-1;10482:2:1;10467:18;;10454:32;10495:33;10454:32;10495:33;:::i;:::-;10547:7;-1:-1:-1;10601:2:1;10586:18;;10573:32;;-1:-1:-1;10652:2:1;10637:18;;10624:32;;-1:-1:-1;10675:37:1;10707:3;10692:19;;10675:37;:::i;:::-;10665:47;;10759:3;10748:9;10744:19;10731:33;10721:43;;10811:3;10800:9;10796:19;10783:33;10773:43;;10088:734;;;;;;;;;;:::o;12604:388::-;12672:6;12680;12733:2;12721:9;12712:7;12708:23;12704:32;12701:52;;;12749:1;12746;12739:12;12701:52;12788:9;12775:23;12807:31;12832:5;12807:31;:::i;:::-;12857:5;-1:-1:-1;12914:2:1;12899:18;;12886:32;12927:33;12886:32;12927:33;:::i;:::-;12979:7;12969:17;;;12604:388;;;;;:::o;13472:184::-;-1:-1:-1;;;13521:1:1;13514:88;13621:4;13618:1;13611:15;13645:4;13642:1;13635:15;13661:416;13750:1;13787:5;13750:1;13801:270;13822:7;13812:8;13809:21;13801:270;;;13881:4;13877:1;13873:6;13869:17;13863:4;13860:27;13857:53;;;13890:18;;:::i;:::-;13940:7;13930:8;13926:22;13923:55;;;13960:16;;;;13923:55;14039:22;;;;13999:15;;;;13801:270;;;13805:3;13661:416;;;;;:::o;14082:806::-;14131:5;14161:8;14151:80;;-1:-1:-1;14202:1:1;14216:5;;14151:80;14250:4;14240:76;;-1:-1:-1;14287:1:1;14301:5;;14240:76;14332:4;14350:1;14345:59;;;;14418:1;14413:130;;;;14325:218;;14345:59;14375:1;14366:10;;14389:5;;;14413:130;14450:3;14440:8;14437:17;14434:43;;;14457:18;;:::i;:::-;-1:-1:-1;;14513:1:1;14499:16;;14528:5;;14325:218;;14627:2;14617:8;14614:16;14608:3;14602:4;14599:13;14595:36;14589:2;14579:8;14576:16;14571:2;14565:4;14562:12;14558:35;14555:77;14552:159;;;-1:-1:-1;14664:19:1;;;14696:5;;14552:159;14743:34;14768:8;14762:4;14743:34;:::i;:::-;14813:6;14809:1;14805:6;14801:19;14792:7;14789:32;14786:58;;;14824:18;;:::i;:::-;14862:20;;14082:806;-1:-1:-1;;;14082:806:1:o;14893:140::-;14951:5;14980:47;15021:4;15011:8;15007:19;15001:4;14980:47;:::i;15038:168::-;15111:9;;;15142;;15159:15;;;15153:22;;15139:37;15129:71;;15180:18;;:::i;15568:437::-;15647:1;15643:12;;;;15690;;;15711:61;;15765:4;15757:6;15753:17;15743:27;;15711:61;15818:2;15810:6;15807:14;15787:18;15784:38;15781:218;;-1:-1:-1;;;15852:1:1;15845:88;15956:4;15953:1;15946:15;15984:4;15981:1;15974:15;16365:184;-1:-1:-1;;;16414:1:1;16407:88;16514:4;16511:1;16504:15;16538:4;16535:1;16528:15;16680:518;16782:2;16777:3;16774:11;16771:421;;;16818:5;16815:1;16808:16;16862:4;16859:1;16849:18;16932:2;16920:10;16916:19;16913:1;16909:27;16903:4;16899:38;16968:4;16956:10;16953:20;16950:47;;;-1:-1:-1;16991:4:1;16950:47;17046:2;17041:3;17037:12;17034:1;17030:20;17024:4;17020:31;17010:41;;17101:81;17119:2;17112:5;17109:13;17101:81;;;17178:1;17164:16;;17145:1;17134:13;17101:81;;;17105:3;;16680:518;;;:::o;17374:1345::-;17500:3;17494:10;17527:18;17519:6;17516:30;17513:56;;;17549:18;;:::i;:::-;17578:97;17668:6;17628:38;17660:4;17654:11;17628:38;:::i;:::-;17622:4;17578:97;:::i;:::-;17730:4;;17787:2;17776:14;;17804:1;17799:663;;;;18506:1;18523:6;18520:89;;;-1:-1:-1;18575:19:1;;;18569:26;18520:89;-1:-1:-1;;17331:1:1;17327:11;;;17323:24;17319:29;17309:40;17355:1;17351:11;;;17306:57;18622:81;;17769:944;;17799:663;16627:1;16620:14;;;16664:4;16651:18;;-1:-1:-1;;17835:20:1;;;17953:236;17967:7;17964:1;17961:14;17953:236;;;18056:19;;;18050:26;18035:42;;18148:27;;;;18116:1;18104:14;;;;17983:19;;17953:236;;;17957:3;18217:6;18208:7;18205:19;18202:201;;;18278:19;;;18272:26;-1:-1:-1;;18361:1:1;18357:14;;;18373:3;18353:24;18349:37;18345:42;18330:58;18315:74;;18202:201;-1:-1:-1;;;;;18449:1:1;18433:14;;;18429:22;18416:36;;-1:-1:-1;17374:1345:1:o;19398:306::-;19486:6;19494;19502;19555:2;19543:9;19534:7;19530:23;19526:32;19523:52;;;19571:1;19568;19561:12;19523:52;19600:9;19594:16;19584:26;;19650:2;19639:9;19635:18;19629:25;19619:35;;19694:2;19683:9;19679:18;19673:25;19663:35;;19398:306;;;;;:::o;22643:184::-;-1:-1:-1;;;22692:1:1;22685:88;22792:4;22789:1;22782:15;22816:4;22813:1;22806:15;24582:251;24652:6;24705:2;24693:9;24684:7;24680:23;24676:32;24673:52;;;24721:1;24718;24711:12;24673:52;24753:9;24747:16;24772:31;24797:5;24772:31;:::i;24838:184::-;-1:-1:-1;;;24887:1:1;24880:88;24987:4;24984:1;24977:15;25011:4;25008:1;25001:15;25027:1065;25289:4;25337:3;25326:9;25322:19;-1:-1:-1;;;;;25372:6:1;25368:45;25357:9;25350:64;25433:2;25471:6;25466:2;25455:9;25451:18;25444:34;25514:3;25509:2;25498:9;25494:18;25487:31;25538:6;25573;25567:13;25604:6;25596;25589:22;25642:3;25631:9;25627:19;25620:26;;25681:2;25673:6;25669:15;25655:29;;25702:1;25712:218;25726:6;25723:1;25720:13;25712:218;;;25791:13;;-1:-1:-1;;;;;25787:62:1;25775:75;;25905:15;;;;25870:12;;;;25748:1;25741:9;25712:218;;;-1:-1:-1;;;;;;;25986:55:1;;;;25981:2;25966:18;;25959:83;-1:-1:-1;;;26073:3:1;26058:19;26051:35;25947:3;25027:1065;-1:-1:-1;;;25027:1065:1:o;26097:128::-;26164:9;;;26185:11;;;26182:37;;;26199:18;;:::i;27803:287::-;27932:3;27970:6;27964:13;27986:66;28045:6;28040:3;28033:4;28025:6;28021:17;27986:66;:::i;:::-;28068:16;;;;;27803:287;-1:-1:-1;;27803:287:1:o

Swarm Source

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