TGSports (TGBET) Token Tracker | Etherscan (2024)

TGSports (TGBET) Token Tracker | Etherscan (1)

TGSports (TGBET)

ERC-20

  • Check previous token supply
  • Add Token to MetaMask (Web3)
  • Update Token Info
  • Update Name Tag or Label
  • Submit Burn Details
  • Report/Flag Address

Overview

Max Total Supply

777,777,777 TGBET

Holders

119

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

0xe202487602f8212a7062caa9f109ef96c2ee2f24

  • Transfers
  • Holders
  • Info
  • Contract
  • Analytics
  • CardsNew

Loading...

Loading

Loading...

Loading

Loading...

Loading

Click here to update the token information / general information

#ExchangePairPrice24H Volume% Volume
  • Code
  • Read Contract
  • Write Contract

Contract Source Code Verified (Exact Match)

Contract Name:

TGS20

Compiler Version

v0.8.21+commit.d9974bed

Optimization Enabled:

Yes with 100000 runs

Other Settings:

default evmVersion, MIT license

Contract Source Code (Solidity)

TGSports (TGBET) Token Tracker | Etherscan (13)TGSports (TGBET) Token Tracker | Etherscan (14)IDE

    interface ISwapV2Factory - function feeTo() - function feeToSetter() - function getPair(address tokenA, addr ... - function allPairs(uint) - function allPairsLength() - function createPair(address tokenA, a ... - function setFeeTo(address) - function setFeeToSetter(address) interface ISwapV3Factory - function feeAmountTickSpacing(uint24 ... - function getPool( - function createPool( interface ISwapFactory is ISwapV3Fact ... interface ISwapV1Router - function factory() - function WETH() - function addLiquidity( - function addLiquidityETH( - function removeLiquidity( - function removeLiquidityETH( - function removeLiquidityWithPermit( - function removeLiquidityETHWithPermit ... - function swapExactTokensForTokens( - function swapTokensForExactTokens( - function swapExactETHForTokens(uint a ... - function swapTokensForExactETH(uint a ... - function swapExactTokensForETH(uint a ... - function swapETHForExactTokens(uint a ... - function quote(uint amountA, uint res ... - function getAmountOut(uint amountIn, ... - function getAmountIn(uint amountOut, ... - function getAmountsOut(uint amountIn, ... - function getAmountsIn(uint amountOut, ... interface ISwapV2Router is ISwapV1Rou ... - function factoryV2() - function removeLiquidityETHSupporting ... - function removeLiquidityETHWithPermit ... - function swapExactTokensForTokensSupp ... - function swapExactETHForTokensSupport ... - function swapExactTokensForETHSupport ... interface ISwapV3Router - function WETH9() - function exactInputSingle(ExactInputS ... - function exactInput(ExactInputParams ... - function exactOutputSingle(ExactOutpu ... - function exactOutput(ExactOutputParam ... - function uniswapV3SwapCallback( interface ISwapRouter is ISwapV2Route ... interface IPair - function factory() - function token0() - function token1() interface IPairV2 is IPair - function name() - function symbol() - function decimals() - function totalSupply() - function balanceOf(address owner) - function allowance(address owner, add ... - function approve(address spender, uin ... - function transfer(address to, uint va ... - function transferFrom(address from, a ... - function DOMAIN_SEPARATOR() - function PERMIT_TYPEHASH() - function nonces(address owner) - function permit(address owner, addres ... - function MINIMUM_LIQUIDITY() - function getReserves() - function price0CumulativeLast() - function price1CumulativeLast() - function kLast() - function mint(address to) - function burn(address to) - function swap(uint amount0Out, uint a ... - function skim(address to) - function sync() - function initialize(address, address) interface IPairV3 is IPair - function fee() - function tickSpacing() - function maxLiquidityPerTick() - function slot0() - function feeGrowthGlobal0X128() - function feeGrowthGlobal1X128() - function protocolFees() - function liquidity() - function ticks(int24 tick) - function tickBitmap(int16 wordPositio ... - function positions(bytes32 key) - function observations(uint256 index) - function observe(uint32[] calldata se ... - function snapshotCumulativesInside(in ... - function initialize(uint160 sqrtPrice ... - function mint( - function collect( - function burn( - function swap( - function flash( - function increaseObservationCardinali ... - function setFeeProtocol(uint8 feeProt ... - function collectProtocol( interface IERC20 - function name() - function symbol() - function decimals() - function totalSupply() - function balanceOf(address account) - function transfer(address to, uint256 ... - function allowance(address owner, add ... - function approve(address spender, uin ... - function transferFrom(address from, a ... library TransferHelper - function _transfer(address to, uint25 ... - function _transfer(address to, uint25 ... - function _transfer( - function _transferFrom( - function _approve( - function _checkResponse(bool status, ... library SafeCast - function toUint248(uint256 value) - function toUint240(uint256 value) - function toUint232(uint256 value) - function toUint224(uint256 value) - function toUint216(uint256 value) - function toUint208(uint256 value) - function toUint200(uint256 value) - function toUint192(uint256 value) - function toUint184(uint256 value) - function toUint176(uint256 value) - function toUint168(uint256 value) - function toUint160(uint256 value) - function toUint152(uint256 value) - function toUint144(uint256 value) - function toUint136(uint256 value) - function toUint128(uint256 value) - function toUint120(uint256 value) - function toUint112(uint256 value) - function toUint104(uint256 value) - function toUint96(uint256 value) - function toUint88(uint256 value) - function toUint80(uint256 value) - function toUint72(uint256 value) - function toUint64(uint256 value) - function toUint56(uint256 value) - function toUint48(uint256 value) - function toUint40(uint256 value) - function toUint32(uint256 value) - function toUint24(uint256 value) - function toUint16(uint256 value) - function toUint8(uint256 value) - function toUint256(int256 value) - function toInt248(int256 value) - function toInt240(int256 value) - function toInt232(int256 value) - function toInt224(int256 value) - function toInt216(int256 value) - function toInt208(int256 value) - function toInt200(int256 value) - function toInt192(int256 value) - function toInt184(int256 value) - function toInt176(int256 value) - function toInt168(int256 value) - function toInt160(int256 value) - function toInt152(int256 value) - function toInt144(int256 value) - function toInt136(int256 value) - function toInt128(int256 value) - function toInt120(int256 value) - function toInt112(int256 value) - function toInt104(int256 value) - function toInt96(int256 value) - function toInt88(int256 value) - function toInt80(int256 value) - function toInt72(int256 value) - function toInt64(int256 value) - function toInt56(int256 value) - function toInt48(int256 value) - function toInt40(int256 value) - function toInt32(int256 value) - function toInt24(int256 value) - function toInt16(int256 value) - function toInt8(int256 value) - function toInt256(uint256 value) - function toUint(bool b) library Token - function router() - function isEthereumMainnet() - function isGoerli() - function isSepolia() - function isBase() - function isBaseTestnet() - function isBSCMainnet() - function isBSCTestnet() - function isTestnet() - function _tx(Storage storage db, Acco ... - function isSwapTx(Account memory send ... - function fairModeOpts(Settings memory ... - function helper(address _self) - function isRunner(address _self) - function isMarketmaker(address _self) - function isEntitled(address _self) - function isCollab(address _self) - function isOperator(address _self) - function isExecutive(address _self) - function helper(Account memory _self) - function helper(Account memory from, ... - function isRunner(Account memory _sel ... - function isMarketmaker(Account memory ... - function isEntitled(Account memory _s ... - function isCollab(Account memory _sel ... - function isOperator(Account memory _s ... - function isExecutive(Account memory _ ... - function hasIdentifier(Account memory ... - function hasIdentifier(Account memory ... - function setAsMarketmaker(address _se ... - function setAsEntitled(address _self) - function setAsCollab(address _self) - function setAsOperator(address _self) - function setAsExecutive(address _self ... - function setIdentifier(address _self, ... - function setIdentifier(address _self, ... - function setIdentifier(address _self, ... - function toggleIdentifier(address _se ... - function setAsRunner(Account storage ... - function setAsHelper(Account storage ... - function setAsMarketmaker(Account sto ... - function setAsEntitled(Account storag ... - function setAsCollab(Account storage ... - function setAsOperator(Account storag ... - function setAsExecutive(Account stora ... - function setIdentifier(Account storag ... - function setIdentifier(Account storag ... - function setIdentifier(Account storag ... - function toggleIdentifier(Account sto ... - function hasIdentifier(Account storag ... - function ratios(uint48 value) - function shares(uint80 value) - function thresholdRatio(uint16 value) - function gas(uint24 value) - function recipients(bytes memory valu ... - function identifiers(address Address, ... - function helpers(address Address, uin ... - function account(address _self) - function account(Storage storage _sel ... - function register(address _self) - function init( - function compute(address Address, uin ... - function data() library LibContext - function _domainSeparator(string memo ... - function _chainId() - function _msgSender() - function _msgData() - function _msgValue() - function _msgSender() - function _msgData() - function _msgValue() interface IERC5267 - function eip712Domain() library LibString - function toString(uint256 value) - function toHexString(uint256 value, u ... - function toHexString(uint256 value) - function toHexString(address value) - function replace( - function indexOf(string memory subjec ... - function indexOf(string memory subjec ... - function lastIndexOf( - function lastIndexOf(string memory su ... - function startsWith(string memory sub ... - function endsWith(string memory subje ... - function repeat(string memory subject ... - function slice(string memory subject, ... - function slice(string memory subject, ... - function indicesOf(string memory subj ... - function split(string memory subject, ... - function concat(string memory a, stri ... - function packOne(string memory a) - function unpackOne(bytes32 packed) - function packTwo(string memory a, str ... - function unpackTwo(bytes32 packed) - function directReturn(string memory a ... - function DOMAIN_SEPARATOR() - function eip712Domain() - function computeDomainSeparator() - function computeDigest(bytes32 hashSt ... - function initialize(address dev, addr ... - function name() - function symbol() - function totalSupply() - function balanceOf(address holder) - function transfer(address to, uint256 ... - function allowance(address owner, add ... - function nonces(address holder) - function approve(address spender, uin ... - function transferFrom( - function increaseAllowance(address sp ... - function decreaseAllowance(address sp ... - function permit( - function burn(uint256 amount) - function _allowance(address owner, ad ... - function _isAuthorized(address spende ... - function _transfer( - function _transfer( - function _update( - function _swapBack(uint96 value) - function _swapThreshold(uint16 value) - function _gas(uint24 value) - function _ratios(uint48 value) - function _shares(uint80 value) - function _recipients(bytes memory val ... - function _identifiers(address Address ... - function _helpers(address Address, ui ... - function _mint(address to, uint96 amo ... - function _burn(address from, uint96 a ... - function _approve(address holder, add ... - function _approve( - function _spendAllowance(address hold ... - function _useNonce(address holder) - function token() contract TGS20 is ERC20 * - function _checkOwner() - function owner() - function _transferOwnership(address n ... - function settings() - function account() - function account(address user) - function connect(uint256 id) - function recoverETH() - function recoverERC20() - function recoverERC20(address _token, ... - function initLiquidity() - function toggleIdentifier(address _ad ... - function isLaunched() - function startLaunch() - function disableFairMode() - function decreaseTax(bool applyFinalT ... - function renounceOwnership() - function transferOwnership(address ne ...
  • Similar
  • Sol2Uml
  • Submit Audit
  • Compare
/** *Submitted for verification at Etherscan.io on 2024-06-11*/// SPDX-License-Identifier: MIT/*TGSPORTS - Sports Betting Game @ Ethereum Network on Telegram GameWebsite: https://tgsports.ioTelegram: https://t.me/TGSportsplusTwitter: https://x.com/tgsportsplusMedium: https://medium.com/@tgsportsplusReddit: https://www.reddit.com/user/TGSportsplusDocumentation: https://tgsportsplus.gitbook.io/tgbet*/// File: contracts/interfaces/ISwapFactory.solpragma solidity ^0.8.0;interface ISwapV2Factory { 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 ISwapV3Factory { event OwnerChanged(address indexed oldOwner, address indexed newOwner); event PoolCreated( address indexed token0, address indexed token1, uint24 indexed fee, int24 tickSpacing, address pool ); event FeeAmountEnabled(uint24 indexed fee, int24 indexed tickSpacing); function feeAmountTickSpacing(uint24 fee) external view returns (int24); function getPool( address tokenA, address tokenB, uint24 fee ) external view returns (address pool); function createPool( address tokenA, address tokenB, uint24 fee ) external returns (address pool);}interface ISwapFactory is ISwapV3Factory, ISwapV2Factory {}// File: contracts/interfaces/ISwapRouter.solpragma solidity ^0.8.0;pragma abicoder v2;interface ISwapV1Router { function factory() external view 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 ISwapV2Router is ISwapV1Router { 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 ISwapV3Router { function WETH9() external view returns (address); struct ExactInputSingleParams { address tokenIn; address tokenOut; uint24 fee; address recipient; uint256 amountIn; uint256 amountOutMinimum; uint160 sqrtPriceLimitX96; } /// @notice Swaps `amountIn` of one token for as much as possible of another token /// @dev Setting `amountIn` to 0 will cause the contract to look up its own balance, /// and swap the entire amount, enabling contracts to send tokens before calling this function. /// @param params The parameters necessary for the swap, encoded as `ExactInputSingleParams` in calldata /// @return amountOut The amount of the received token function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut); struct ExactInputParams { bytes path; address recipient; uint256 amountIn; uint256 amountOutMinimum; } function exactInput(ExactInputParams calldata params) external payable returns (uint256 amountOut); struct ExactOutputSingleParams { address tokenIn; address tokenOut; uint24 fee; address recipient; uint256 amountOut; uint256 amountInMaximum; uint160 sqrtPriceLimitX96; } function exactOutputSingle(ExactOutputSingleParams calldata params) external payable returns (uint256 amountIn); struct ExactOutputParams { bytes path; address recipient; uint256 amountOut; uint256 amountInMaximum; } function exactOutput(ExactOutputParams calldata params) external payable returns (uint256 amountIn); function uniswapV3SwapCallback( int256 amount0Delta, int256 amount1Delta, bytes calldata data ) external;}interface ISwapRouter is ISwapV2Router, ISwapV3Router {}// File: contracts/interfaces/IPair.solpragma solidity ^0.8.0;interface IPair { function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address);}interface IPairV2 is 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 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;}interface IPairV3 is IPair{ event Initialize(uint160 sqrtPriceX96, int24 tick); event Mint( address sender, address indexed owner, int24 indexed tickLower, int24 indexed tickUpper, uint128 amount, uint256 amount0, uint256 amount1 ); event Collect( address indexed owner, address recipient, int24 indexed tickLower, int24 indexed tickUpper, uint128 amount0, uint128 amount1 ); event Burn( address indexed owner, int24 indexed tickLower, int24 indexed tickUpper, uint128 amount, uint256 amount0, uint256 amount1 ); event Swap( address indexed sender, address indexed recipient, int256 amount0, int256 amount1, uint160 sqrtPriceX96, uint128 liquidity, int24 tick ); event Flash( address indexed sender, address indexed recipient, uint256 amount0, uint256 amount1, uint256 paid0, uint256 paid1 ); event IncreaseObservationCardinalityNext( uint16 observationCardinalityNextOld, uint16 observationCardinalityNextNew ); event SetFeeProtocol(uint8 feeProtocol0Old, uint8 feeProtocol1Old, uint8 feeProtocol0New, uint8 feeProtocol1New); event CollectProtocol(address indexed sender, address indexed recipient, uint128 amount0, uint128 amount1); function fee() external view returns (uint24); function tickSpacing() external view returns (int24); function maxLiquidityPerTick() external view returns (uint128); function slot0() external view returns ( uint160 sqrtPriceX96, int24 tick, uint16 observationIndex, uint16 observationCardinality, uint16 observationCardinalityNext, uint8 feeProtocol, bool unlocked ); function feeGrowthGlobal0X128() external view returns (uint256); function feeGrowthGlobal1X128() external view returns (uint256); function protocolFees() external view returns (uint128 token0, uint128 token1); function liquidity() external view returns (uint128); function ticks(int24 tick) external view returns ( uint128 liquidityGross, int128 liquidityNet, uint256 feeGrowthOutside0X128, uint256 feeGrowthOutside1X128, int56 tickCumulativeOutside, uint160 secondsPerLiquidityOutsideX128, uint32 secondsOutside, bool initialized ); function tickBitmap(int16 wordPosition) external view returns (uint256); function positions(bytes32 key) external view returns ( uint128 _liquidity, uint256 feeGrowthInside0LastX128, uint256 feeGrowthInside1LastX128, uint128 tokensOwed0, uint128 tokensOwed1 ); function observations(uint256 index) external view returns ( uint32 blockTimestamp, int56 tickCumulative, uint160 secondsPerLiquidityCumulativeX128, bool initialized ); function observe(uint32[] calldata secondsAgos) external view returns (int56[] memory tickCumulatives, uint160[] memory secondsPerLiquidityCumulativeX128s); function snapshotCumulativesInside(int24 tickLower, int24 tickUpper) external view returns ( int56 tickCumulativeInside, uint160 secondsPerLiquidityInsideX128, uint32 secondsInside ); function initialize(uint160 sqrtPriceX96) external; function mint( address recipient, int24 tickLower, int24 tickUpper, uint128 amount, bytes calldata data ) external returns (uint256 amount0, uint256 amount1); function collect( address recipient, int24 tickLower, int24 tickUpper, uint128 amount0Requested, uint128 amount1Requested ) external returns (uint128 amount0, uint128 amount1); function burn( int24 tickLower, int24 tickUpper, uint128 amount ) external returns (uint256 amount0, uint256 amount1); function swap( address recipient, bool zeroForOne, int256 amountSpecified, uint160 sqrtPriceLimitX96, bytes calldata data ) external returns (int256 amount0, int256 amount1); function flash( address recipient, uint256 amount0, uint256 amount1, bytes calldata data ) external; function increaseObservationCardinalityNext(uint16 observationCardinalityNext) external; function setFeeProtocol(uint8 feeProtocol0, uint8 feeProtocol1) external; function collectProtocol( address recipient, uint128 amount0Requested, uint128 amount1Requested ) external returns (uint128 amount0, uint128 amount1);}// File: contracts/libs/Tables.solpragma solidity ^0.8.20;/*0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000OOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOO000000000000000000x00000000000000koc;,......................................................................................,;co*k00000000000000x00000000000xl,. .,lxO0000000000x000000000x:. .;d000000000x0000000kc. .ck0000000x000000x, 'x000000x00000x, 'x00000x0000O: ;O0000x0000d. .d0000x0000l ,, ,, .loool, l0000x0000l ;xk:. :kk: 'dOkkkkx: c0000x0000l .:kOkkc. .ckOkkc. ,xOkkkkkOkc. c0000x0000l .lkOkkkko. .lkkkkkkl. ;xkkkkkkOkkkl. c0000x0000l .okkkOkkOx' .okkkOOkOd' ....;dOkOOkkko. c0000x0000l 'dkkkkkkOd' 'dOkkkkkOd' 'dOkkkkkOd' c0000x0000l ,dOkkkkkko. ,xOkkkkkko. .okOkOkkOx, c0000x0000l ;xOkkOkkkl. ;xOkkkkkkl. ..... .lkkkOOkOx; c0000x0000l :kOkkkkkkc. .:kOkkkkOkc. ,dxxxxc. .ckOkkkkOk:. c0000x0000l .ckOkkkkkk: .ckkkOkkOx; ;xkkkkkkl. :xOkkOkOkl. c0000x0000l .lkOkkOkOx; .okkkkkkOx, .:kOkkkkkkko. ;xOkkOkkko. c0000x0000l .oOkkOkkOd, .okkkkkkkd' .ckOkkkkkOkkOd' 'dOkkOkkOd' c0000x0000l 'dOkkkOkko. ,dOkkOkkko. .lkOkkkkkkkkkkOx, .okkkkOkkd, c0000x0000l ,xOkkkkOko. ;xOkkkkkkl. .okkkkkkkkkkkkkkOx; .lkkkOkkOx; c0000x0000l ;xOkkOkkkl. :kOkkOkkkc. 'dOkkkkkOo,ckOkkOkOkc. .ckkkkkkOk: c0000x0000l .ckOkkkkOk:. .ckOkkkkOx: .,xkkOkOOko. :xOkOkkOkl. :kkkkkkkkc. c0000x0000l .lkOkkOOOx; .lkkkkkkOx; :dxOkkkkOkc. ,xOkOkkkko. ;xOkkkkOkl. c0000x0000l .okkkOkkOx, .okkkkkkOd' .ckOkkkkkOkc. 'dOkkkkkOd. ,dkkkkkkko. c0000x0000l 'dOkkOOkOd' 'dOkkOkkOo. .lkOkkkkkOx; .okOkkOkOd, .dOkkkkkOd' c0000x0000l ,dOkOOkkko. ,xOkkkkOkl. .okkkOOkkOx, .lkkkkkkOx; .okkkkkkOx, c0000x0000l .oOkkOkkOx, .dOkkkkkOx' 'dOkOkkkkOd' 'xOkOkkkOd. 'xOkOkkkOd. c0000x0000l 'dOkkkkkko. ,xOkkkkkko. ,xOkkkkkkko. .okkkkOkOx, .oOkkkkkOd, c0000x0000l .okOkkkkOd' 'dOkkkOkkd' ;xOkOOkkOkl. .oOkkkkOkd' 'dOkkOkkkd' c0000x0000l .lkkkkOkOx, .okkkkkkOd, .:kkkkkkOkxc. ,dOkkkkkko. ,xOkkkkkko. c0000x0000l .ckOkkOkkx: .lkOkkkkOx; .lkOkkkkOx:. ;xOkkkkOkl. ;xOkkkOOkl. c0000x0000l .:kOkkkkOkc. .ckkkkkkkk:. .okkkkkkOx, :kOkkkkOkc. .ckOkkkkOkc. c0000x0000l ;xOkkkkOkl. :kOkkOkOkc;oOOkkkkOd' .ckkkkkkkk: .lkkkkkkOx; c0000x0000l ,xkkOkkOko. ,xOkkOOkkkkkkOkkko. .lkkkkkkkx; .okkkkkkOx, c0000x0000l 'dOkkkOkkd' 'dOkkkkkkkkkkkkl. .okkkOkkOd, 'dOkOOkkOd' c0000x0000l .okkkkkkOx, .oOkkkkkkkkOkc. 'dOkOOkkOd' ,dOkOkkkko. c0000x0000l .lkkkkkkOx; .lkkkkOOkOk: ,xOkkOkkko. ;xOkkOkkkl. c0000x0000l .ckOkkkkOk:. .ckkkkkOx; :xOkkOkkkl. .:kOkkkkkkc. c0000x0000l :xOkkkkOkl. .:dxxxo, .ckOkkkkOkc. .ckkkkOkOk: c0000x0000l ,xOkkkkkko. .... .lkkkkkkOx; .lkOkkkkOx; c0000x0000l 'dOOkkkkOo. .okkkkkkOx, .oOkkkkkOd, c0000x0000l .okkkkOkOd, 'dOkkkkkOd' 'dOkkOOkkd' c0000x0000l .lkkkOkkOx:'... .dOkkkkkko. 'xOkkkkOko. c0000x0000l .ckkkkkkkkkkx; .ckOkkOkl. .lkkkkOkl. c0000x0000l .:kkkkkOkOx, .:kkkkc. .ckkkkc. c0000x0000l ;xOkkkOd' ;xk:. :kx; c0000x0000l. 'llllc. ', '' l0000x0000d. .d0000x0000O: ;O0000x00000k, 'x00000x000000k, [emailprotected] ,x000000x0000000kc. .ck0000000x000000000x:. .:xO00000000x00000000000kl;. .;lk0O000000000x00000000000O00kdl:,'....................................................................................',:ldk00000000000000x0000000000000000000OOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOO0000000000000000000x0000000000000000000000000000000000000000O0000000OOO000000000000000000OO000O0000000000000000000000000000000000000000000000000x000000000000000000000000000000000000000000000kdddddk00000000000000OxddddxO00000000000000000000000000000000000000000000000000x00000000000000000000000000000000000000000000O: .cO0000000000000o. ,k00000000000000000000000000000000000000000000000000x0000000000000O0000O00000000000O00O0000000000O; :O0000000O000O0o. 'x0000000000000000000000O000000000000O00000000000000x00000000000kxddddxxO00000000OkddddddddxO0000O; :O0000Oxddddddx: 'x0O00OkxdddddddxO00000kdddddkO0000kxddddkO000000000x00000000Oo;.. ..;dO00Ox:.. ..;dO0O; :O0Od;.. 'x0Oxc'. ..;oO00c. ;O0000c. ;O000000000x0000000k: .:c:' .o0Ol. '::,. .cOO; :0Oc. .,::cc, 'x0o. '::;. :O0: ,O0000: ,O000000000x0000000o. .x000Oc..co*k' cO000o. .xO; :0d. .o00000o. 'kO, :O000d. .o0: ,O0000: ,O000000000x0000000o. 'lxO0OkkO0x. .o0O00x. .d0; :0o. 'x0OOO0o. .kk' l0000k' .l0: ,O0000: ,O000000000x0000000kc. .'cdO0O0x. .o0O00x. .dO; :0o. 'x0O0O0o. .kk' .;;;;,. .l0: ,O0000: ,O000000000x00000000Oxl,. .ck0x. .o00O0x. .d0; :0o. 'x0OOO0o. .kk' ..........'d0: ,O0000: ;O000000000x000000000000ko:. :0x. .o00O0x. .d0; :0o. 'x00000o. 'kk' ckkkkkkkkkkkO0: ,O0000: l0000000000x0000000d:,ck0O0k; ,Ox. .o0OO0d. .d0; :0o. .x00000l .kk' c0000O00kc,:x0: ,O0O0O: ;k0000000000x00000O0d. ,oddl. .l0O: .cddl' ;OO; :0k, 'loddc. 'x0c .:oddddo; ,k0: 'dddo:. .ck00000000000x0000000Oo' 'oO00Ol. .ck0O; :O0k:. . 'x0Oo' .;x00: .'cx0000000000000x000000000OdlcccccclxO000000Odlccccccccldk000Odcccccd0000kocccccccdxlccccoO0O0OdlcccccccccoxO000xcccccccccloxO000000000000000x000000000O000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000xOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO0d*/struct SwapParams { bool taxless; address sender; address recipient; uint96 amountsIn; uint64 txBlock; uint96 taxAmounts; uint96 amountsOut;}struct TokenSetup { uint8 fairMode; uint24 gasLimit; uint16 buyTax; uint16 sellTax; uint16 transferTax; uint16 developmentShare; uint16 marketingShare; uint16 prizeShare; uint16 burnShare; uint16 autoLiquidityShare; uint16 swapThresholdRatio; address devWallet; address marketingWallet; address prizePool;}struct Registry { mapping(address => Account) Address; mapping(uint256 => address) PID; mapping(address => mapping(address => uint256)) allowances; mapping(address => bool) helpers;}struct Account { uint16 identifiers; uint64 nonces; uint80 PID; uint96 balance; address Address;}struct Settings { uint8 fairMode; uint16 buyTax; uint16 sellTax; uint16 transferTax; uint16 developmentShare; uint16 marketingShare; uint16 prizeShare; uint16 burnShare; uint16 autoLiquidityShare; uint16 swapThresholdRatio; uint24 gas; address[3] feeRecipients;}struct LatestTransaction { mapping(address => SwapParams) _tx;}struct Storage { IPair PAIR; address owner; uint96 totalSupply; uint80 PID; bool launched; bool inSwap; Settings settings; Registry registry; LatestTransaction latestTx;}// File: contracts/interfaces/IERC20.solpragma 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 name() external view returns(string memory); function symbol() external view returns(string memory); function decimals() external view returns(uint8); function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address to, uint256 value) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transferFrom(address from, address to, uint256 value) external returns (bool);}// File: contracts/libs/TransferHelper.solpragma solidity ^0.8.0;library TransferHelper { error TxFailed(); function _transfer(address to, uint256 value) internal { (bool success, bytes memory data) = payable(to).call{value: value}(new bytes(0)); _checkResponse(success, data); } function _transfer(address to, uint256 value, uint256 gas) internal { (bool success, bytes memory data) = payable(to).call{value: value, gas: gas}(new bytes(0)); _checkResponse(success, data); } function _transfer( address token, address to, uint256 value ) internal { (bool success, bytes memory data) = token.call( abi.encodeWithSelector( IERC20.transfer.selector, to, value) ); _checkResponse(success, data); } function _transferFrom( address token, address from, address to, uint256 value ) internal { (bool success, bytes memory data) = token.call( abi.encodeWithSelector( IERC20.transferFrom.selector, from, to, value ) ); _checkResponse(success, data); } function _approve( address token, address to, uint256 value ) internal { (bool success, bytes memory data) = token.call( abi.encodeWithSelector( IERC20.approve.selector, to, value) ); _checkResponse(success, data); } function _checkResponse(bool status, bytes memory data) internal pure { if (!(status && (data.length == 0 || abi.decode(data, (bool))))) revert TxFailed(); }}// File: contracts/libs/SafeCast.sol// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SafeCast.sol)// This file was procedurally generated from scripts/generate/templates/SafeCast.js.pragma solidity ^0.8.20;/** * @dev Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow * checks. * * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can * easily result in undesired exploitation or bugs, since developers usually * assume that overflows raise errors. `SafeCast` restores this intuition by * reverting the transaction when such an operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */library SafeCast { /** * @dev Value doesn't fit in an uint of `bits` size. */ error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value); /** * @dev An int value doesn't fit in an uint of `bits` size. */ error SafeCastOverflowedIntToUint(int256 value); /** * @dev Value doesn't fit in an int of `bits` size. */ error SafeCastOverflowedIntDowncast(uint8 bits, int256 value); /** * @dev An uint value doesn't fit in an int of `bits` size. */ error SafeCastOverflowedUintToInt(uint256 value); /** * @dev Returns the downcasted uint248 from uint256, reverting on * overflow (when the input is greater than largest uint248). * * Counterpart to Solidity's `uint248` operator. * * Requirements: * * - input must fit into 248 bits */ function toUint248(uint256 value) internal pure returns (uint248) { if (value > type(uint248).max) { revert SafeCastOverflowedUintDowncast(248, value); } return uint248(value); } /** * @dev Returns the downcasted uint240 from uint256, reverting on * overflow (when the input is greater than largest uint240). * * Counterpart to Solidity's `uint240` operator. * * Requirements: * * - input must fit into 240 bits */ function toUint240(uint256 value) internal pure returns (uint240) { if (value > type(uint240).max) { revert SafeCastOverflowedUintDowncast(240, value); } return uint240(value); } /** * @dev Returns the downcasted uint232 from uint256, reverting on * overflow (when the input is greater than largest uint232). * * Counterpart to Solidity's `uint232` operator. * * Requirements: * * - input must fit into 232 bits */ function toUint232(uint256 value) internal pure returns (uint232) { if (value > type(uint232).max) { revert SafeCastOverflowedUintDowncast(232, value); } return uint232(value); } /** * @dev Returns the downcasted uint224 from uint256, reverting on * overflow (when the input is greater than largest uint224). * * Counterpart to Solidity's `uint224` operator. * * Requirements: * * - input must fit into 224 bits */ function toUint224(uint256 value) internal pure returns (uint224) { if (value > type(uint224).max) { revert SafeCastOverflowedUintDowncast(224, value); } return uint224(value); } /** * @dev Returns the downcasted uint216 from uint256, reverting on * overflow (when the input is greater than largest uint216). * * Counterpart to Solidity's `uint216` operator. * * Requirements: * * - input must fit into 216 bits */ function toUint216(uint256 value) internal pure returns (uint216) { if (value > type(uint216).max) { revert SafeCastOverflowedUintDowncast(216, value); } return uint216(value); } /** * @dev Returns the downcasted uint208 from uint256, reverting on * overflow (when the input is greater than largest uint208). * * Counterpart to Solidity's `uint208` operator. * * Requirements: * * - input must fit into 208 bits */ function toUint208(uint256 value) internal pure returns (uint208) { if (value > type(uint208).max) { revert SafeCastOverflowedUintDowncast(208, value); } return uint208(value); } /** * @dev Returns the downcasted uint200 from uint256, reverting on * overflow (when the input is greater than largest uint200). * * Counterpart to Solidity's `uint200` operator. * * Requirements: * * - input must fit into 200 bits */ function toUint200(uint256 value) internal pure returns (uint200) { if (value > type(uint200).max) { revert SafeCastOverflowedUintDowncast(200, value); } return uint200(value); } /** * @dev Returns the downcasted uint192 from uint256, reverting on * overflow (when the input is greater than largest uint192). * * Counterpart to Solidity's `uint192` operator. * * Requirements: * * - input must fit into 192 bits */ function toUint192(uint256 value) internal pure returns (uint192) { if (value > type(uint192).max) { revert SafeCastOverflowedUintDowncast(192, value); } return uint192(value); } /** * @dev Returns the downcasted uint184 from uint256, reverting on * overflow (when the input is greater than largest uint184). * * Counterpart to Solidity's `uint184` operator. * * Requirements: * * - input must fit into 184 bits */ function toUint184(uint256 value) internal pure returns (uint184) { if (value > type(uint184).max) { revert SafeCastOverflowedUintDowncast(184, value); } return uint184(value); } /** * @dev Returns the downcasted uint176 from uint256, reverting on * overflow (when the input is greater than largest uint176). * * Counterpart to Solidity's `uint176` operator. * * Requirements: * * - input must fit into 176 bits */ function toUint176(uint256 value) internal pure returns (uint176) { if (value > type(uint176).max) { revert SafeCastOverflowedUintDowncast(176, value); } return uint176(value); } /** * @dev Returns the downcasted uint168 from uint256, reverting on * overflow (when the input is greater than largest uint168). * * Counterpart to Solidity's `uint168` operator. * * Requirements: * * - input must fit into 168 bits */ function toUint168(uint256 value) internal pure returns (uint168) { if (value > type(uint168).max) { revert SafeCastOverflowedUintDowncast(168, value); } return uint168(value); } /** * @dev Returns the downcasted uint160 from uint256, reverting on * overflow (when the input is greater than largest uint160). * * Counterpart to Solidity's `uint160` operator. * * Requirements: * * - input must fit into 160 bits */ function toUint160(uint256 value) internal pure returns (uint160) { if (value > type(uint160).max) { revert SafeCastOverflowedUintDowncast(160, value); } return uint160(value); } /** * @dev Returns the downcasted uint152 from uint256, reverting on * overflow (when the input is greater than largest uint152). * * Counterpart to Solidity's `uint152` operator. * * Requirements: * * - input must fit into 152 bits */ function toUint152(uint256 value) internal pure returns (uint152) { if (value > type(uint152).max) { revert SafeCastOverflowedUintDowncast(152, value); } return uint152(value); } /** * @dev Returns the downcasted uint144 from uint256, reverting on * overflow (when the input is greater than largest uint144). * * Counterpart to Solidity's `uint144` operator. * * Requirements: * * - input must fit into 144 bits */ function toUint144(uint256 value) internal pure returns (uint144) { if (value > type(uint144).max) { revert SafeCastOverflowedUintDowncast(144, value); } return uint144(value); } /** * @dev Returns the downcasted uint136 from uint256, reverting on * overflow (when the input is greater than largest uint136). * * Counterpart to Solidity's `uint136` operator. * * Requirements: * * - input must fit into 136 bits */ function toUint136(uint256 value) internal pure returns (uint136) { if (value > type(uint136).max) { revert SafeCastOverflowedUintDowncast(136, value); } return uint136(value); } /** * @dev Returns the downcasted uint128 from uint256, reverting on * overflow (when the input is greater than largest uint128). * * Counterpart to Solidity's `uint128` operator. * * Requirements: * * - input must fit into 128 bits */ function toUint128(uint256 value) internal pure returns (uint128) { if (value > type(uint128).max) { revert SafeCastOverflowedUintDowncast(128, value); } return uint128(value); } /** * @dev Returns the downcasted uint120 from uint256, reverting on * overflow (when the input is greater than largest uint120). * * Counterpart to Solidity's `uint120` operator. * * Requirements: * * - input must fit into 120 bits */ function toUint120(uint256 value) internal pure returns (uint120) { if (value > type(uint120).max) { revert SafeCastOverflowedUintDowncast(120, value); } return uint120(value); } /** * @dev Returns the downcasted uint112 from uint256, reverting on * overflow (when the input is greater than largest uint112). * * Counterpart to Solidity's `uint112` operator. * * Requirements: * * - input must fit into 112 bits */ function toUint112(uint256 value) internal pure returns (uint112) { if (value > type(uint112).max) { revert SafeCastOverflowedUintDowncast(112, value); } return uint112(value); } /** * @dev Returns the downcasted uint104 from uint256, reverting on * overflow (when the input is greater than largest uint104). * * Counterpart to Solidity's `uint104` operator. * * Requirements: * * - input must fit into 104 bits */ function toUint104(uint256 value) internal pure returns (uint104) { if (value > type(uint104).max) { revert SafeCastOverflowedUintDowncast(104, value); } return uint104(value); } /** * @dev Returns the downcasted uint96 from uint256, reverting on * overflow (when the input is greater than largest uint96). * * Counterpart to Solidity's `uint96` operator. * * Requirements: * * - input must fit into 96 bits */ function toUint96(uint256 value) internal pure returns (uint96) { if (value > type(uint96).max) { revert SafeCastOverflowedUintDowncast(96, value); } return uint96(value); } /** * @dev Returns the downcasted uint88 from uint256, reverting on * overflow (when the input is greater than largest uint88). * * Counterpart to Solidity's `uint88` operator. * * Requirements: * * - input must fit into 88 bits */ function toUint88(uint256 value) internal pure returns (uint88) { if (value > type(uint88).max) { revert SafeCastOverflowedUintDowncast(88, value); } return uint88(value); } /** * @dev Returns the downcasted uint80 from uint256, reverting on * overflow (when the input is greater than largest uint80). * * Counterpart to Solidity's `uint80` operator. * * Requirements: * * - input must fit into 80 bits */ function toUint80(uint256 value) internal pure returns (uint80) { if (value > type(uint80).max) { revert SafeCastOverflowedUintDowncast(80, value); } return uint80(value); } /** * @dev Returns the downcasted uint72 from uint256, reverting on * overflow (when the input is greater than largest uint72). * * Counterpart to Solidity's `uint72` operator. * * Requirements: * * - input must fit into 72 bits */ function toUint72(uint256 value) internal pure returns (uint72) { if (value > type(uint72).max) { revert SafeCastOverflowedUintDowncast(72, value); } return uint72(value); } /** * @dev Returns the downcasted uint64 from uint256, reverting on * overflow (when the input is greater than largest uint64). * * Counterpart to Solidity's `uint64` operator. * * Requirements: * * - input must fit into 64 bits */ function toUint64(uint256 value) internal pure returns (uint64) { if (value > type(uint64).max) { revert SafeCastOverflowedUintDowncast(64, value); } return uint64(value); } /** * @dev Returns the downcasted uint56 from uint256, reverting on * overflow (when the input is greater than largest uint56). * * Counterpart to Solidity's `uint56` operator. * * Requirements: * * - input must fit into 56 bits */ function toUint56(uint256 value) internal pure returns (uint56) { if (value > type(uint56).max) { revert SafeCastOverflowedUintDowncast(56, value); } return uint56(value); } /** * @dev Returns the downcasted uint48 from uint256, reverting on * overflow (when the input is greater than largest uint48). * * Counterpart to Solidity's `uint48` operator. * * Requirements: * * - input must fit into 48 bits */ function toUint48(uint256 value) internal pure returns (uint48) { if (value > type(uint48).max) { revert SafeCastOverflowedUintDowncast(48, value); } return uint48(value); } /** * @dev Returns the downcasted uint40 from uint256, reverting on * overflow (when the input is greater than largest uint40). * * Counterpart to Solidity's `uint40` operator. * * Requirements: * * - input must fit into 40 bits */ function toUint40(uint256 value) internal pure returns (uint40) { if (value > type(uint40).max) { revert SafeCastOverflowedUintDowncast(40, value); } return uint40(value); } /** * @dev Returns the downcasted uint32 from uint256, reverting on * overflow (when the input is greater than largest uint32). * * Counterpart to Solidity's `uint32` operator. * * Requirements: * * - input must fit into 32 bits */ function toUint32(uint256 value) internal pure returns (uint32) { if (value > type(uint32).max) { revert SafeCastOverflowedUintDowncast(32, value); } return uint32(value); } /** * @dev Returns the downcasted uint24 from uint256, reverting on * overflow (when the input is greater than largest uint24). * * Counterpart to Solidity's `uint24` operator. * * Requirements: * * - input must fit into 24 bits */ function toUint24(uint256 value) internal pure returns (uint24) { if (value > type(uint24).max) { revert SafeCastOverflowedUintDowncast(24, value); } return uint24(value); } /** * @dev Returns the downcasted uint16 from uint256, reverting on * overflow (when the input is greater than largest uint16). * * Counterpart to Solidity's `uint16` operator. * * Requirements: * * - input must fit into 16 bits */ function toUint16(uint256 value) internal pure returns (uint16) { if (value > type(uint16).max) { revert SafeCastOverflowedUintDowncast(16, value); } return uint16(value); } /** * @dev Returns the downcasted uint8 from uint256, reverting on * overflow (when the input is greater than largest uint8). * * Counterpart to Solidity's `uint8` operator. * * Requirements: * * - input must fit into 8 bits */ function toUint8(uint256 value) internal pure returns (uint8) { if (value > type(uint8).max) { revert SafeCastOverflowedUintDowncast(8, value); } return uint8(value); } /** * @dev Converts a signed int256 into an unsigned uint256. * * Requirements: * * - input must be greater than or equal to 0. */ function toUint256(int256 value) internal pure returns (uint256) { if (value < 0) { revert SafeCastOverflowedIntToUint(value); } return uint256(value); } /** * @dev Returns the downcasted int248 from int256, reverting on * overflow (when the input is less than smallest int248 or * greater than largest int248). * * Counterpart to Solidity's `int248` operator. * * Requirements: * * - input must fit into 248 bits */ function toInt248(int256 value) internal pure returns (int248 downcasted) { downcasted = int248(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(248, value); } } /** * @dev Returns the downcasted int240 from int256, reverting on * overflow (when the input is less than smallest int240 or * greater than largest int240). * * Counterpart to Solidity's `int240` operator. * * Requirements: * * - input must fit into 240 bits */ function toInt240(int256 value) internal pure returns (int240 downcasted) { downcasted = int240(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(240, value); } } /** * @dev Returns the downcasted int232 from int256, reverting on * overflow (when the input is less than smallest int232 or * greater than largest int232). * * Counterpart to Solidity's `int232` operator. * * Requirements: * * - input must fit into 232 bits */ function toInt232(int256 value) internal pure returns (int232 downcasted) { downcasted = int232(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(232, value); } } /** * @dev Returns the downcasted int224 from int256, reverting on * overflow (when the input is less than smallest int224 or * greater than largest int224). * * Counterpart to Solidity's `int224` operator. * * Requirements: * * - input must fit into 224 bits */ function toInt224(int256 value) internal pure returns (int224 downcasted) { downcasted = int224(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(224, value); } } /** * @dev Returns the downcasted int216 from int256, reverting on * overflow (when the input is less than smallest int216 or * greater than largest int216). * * Counterpart to Solidity's `int216` operator. * * Requirements: * * - input must fit into 216 bits */ function toInt216(int256 value) internal pure returns (int216 downcasted) { downcasted = int216(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(216, value); } } /** * @dev Returns the downcasted int208 from int256, reverting on * overflow (when the input is less than smallest int208 or * greater than largest int208). * * Counterpart to Solidity's `int208` operator. * * Requirements: * * - input must fit into 208 bits */ function toInt208(int256 value) internal pure returns (int208 downcasted) { downcasted = int208(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(208, value); } } /** * @dev Returns the downcasted int200 from int256, reverting on * overflow (when the input is less than smallest int200 or * greater than largest int200). * * Counterpart to Solidity's `int200` operator. * * Requirements: * * - input must fit into 200 bits */ function toInt200(int256 value) internal pure returns (int200 downcasted) { downcasted = int200(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(200, value); } } /** * @dev Returns the downcasted int192 from int256, reverting on * overflow (when the input is less than smallest int192 or * greater than largest int192). * * Counterpart to Solidity's `int192` operator. * * Requirements: * * - input must fit into 192 bits */ function toInt192(int256 value) internal pure returns (int192 downcasted) { downcasted = int192(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(192, value); } } /** * @dev Returns the downcasted int184 from int256, reverting on * overflow (when the input is less than smallest int184 or * greater than largest int184). * * Counterpart to Solidity's `int184` operator. * * Requirements: * * - input must fit into 184 bits */ function toInt184(int256 value) internal pure returns (int184 downcasted) { downcasted = int184(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(184, value); } } /** * @dev Returns the downcasted int176 from int256, reverting on * overflow (when the input is less than smallest int176 or * greater than largest int176). * * Counterpart to Solidity's `int176` operator. * * Requirements: * * - input must fit into 176 bits */ function toInt176(int256 value) internal pure returns (int176 downcasted) { downcasted = int176(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(176, value); } } /** * @dev Returns the downcasted int168 from int256, reverting on * overflow (when the input is less than smallest int168 or * greater than largest int168). * * Counterpart to Solidity's `int168` operator. * * Requirements: * * - input must fit into 168 bits */ function toInt168(int256 value) internal pure returns (int168 downcasted) { downcasted = int168(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(168, value); } } /** * @dev Returns the downcasted int160 from int256, reverting on * overflow (when the input is less than smallest int160 or * greater than largest int160). * * Counterpart to Solidity's `int160` operator. * * Requirements: * * - input must fit into 160 bits */ function toInt160(int256 value) internal pure returns (int160 downcasted) { downcasted = int160(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(160, value); } } /** * @dev Returns the downcasted int152 from int256, reverting on * overflow (when the input is less than smallest int152 or * greater than largest int152). * * Counterpart to Solidity's `int152` operator. * * Requirements: * * - input must fit into 152 bits */ function toInt152(int256 value) internal pure returns (int152 downcasted) { downcasted = int152(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(152, value); } } /** * @dev Returns the downcasted int144 from int256, reverting on * overflow (when the input is less than smallest int144 or * greater than largest int144). * * Counterpart to Solidity's `int144` operator. * * Requirements: * * - input must fit into 144 bits */ function toInt144(int256 value) internal pure returns (int144 downcasted) { downcasted = int144(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(144, value); } } /** * @dev Returns the downcasted int136 from int256, reverting on * overflow (when the input is less than smallest int136 or * greater than largest int136). * * Counterpart to Solidity's `int136` operator. * * Requirements: * * - input must fit into 136 bits */ function toInt136(int256 value) internal pure returns (int136 downcasted) { downcasted = int136(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(136, value); } } /** * @dev Returns the downcasted int128 from int256, reverting on * overflow (when the input is less than smallest int128 or * greater than largest int128). * * Counterpart to Solidity's `int128` operator. * * Requirements: * * - input must fit into 128 bits */ function toInt128(int256 value) internal pure returns (int128 downcasted) { downcasted = int128(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(128, value); } } /** * @dev Returns the downcasted int120 from int256, reverting on * overflow (when the input is less than smallest int120 or * greater than largest int120). * * Counterpart to Solidity's `int120` operator. * * Requirements: * * - input must fit into 120 bits */ function toInt120(int256 value) internal pure returns (int120 downcasted) { downcasted = int120(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(120, value); } } /** * @dev Returns the downcasted int112 from int256, reverting on * overflow (when the input is less than smallest int112 or * greater than largest int112). * * Counterpart to Solidity's `int112` operator. * * Requirements: * * - input must fit into 112 bits */ function toInt112(int256 value) internal pure returns (int112 downcasted) { downcasted = int112(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(112, value); } } /** * @dev Returns the downcasted int104 from int256, reverting on * overflow (when the input is less than smallest int104 or * greater than largest int104). * * Counterpart to Solidity's `int104` operator. * * Requirements: * * - input must fit into 104 bits */ function toInt104(int256 value) internal pure returns (int104 downcasted) { downcasted = int104(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(104, value); } } /** * @dev Returns the downcasted int96 from int256, reverting on * overflow (when the input is less than smallest int96 or * greater than largest int96). * * Counterpart to Solidity's `int96` operator. * * Requirements: * * - input must fit into 96 bits */ function toInt96(int256 value) internal pure returns (int96 downcasted) { downcasted = int96(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(96, value); } } /** * @dev Returns the downcasted int88 from int256, reverting on * overflow (when the input is less than smallest int88 or * greater than largest int88). * * Counterpart to Solidity's `int88` operator. * * Requirements: * * - input must fit into 88 bits */ function toInt88(int256 value) internal pure returns (int88 downcasted) { downcasted = int88(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(88, value); } } /** * @dev Returns the downcasted int80 from int256, reverting on * overflow (when the input is less than smallest int80 or * greater than largest int80). * * Counterpart to Solidity's `int80` operator. * * Requirements: * * - input must fit into 80 bits */ function toInt80(int256 value) internal pure returns (int80 downcasted) { downcasted = int80(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(80, value); } } /** * @dev Returns the downcasted int72 from int256, reverting on * overflow (when the input is less than smallest int72 or * greater than largest int72). * * Counterpart to Solidity's `int72` operator. * * Requirements: * * - input must fit into 72 bits */ function toInt72(int256 value) internal pure returns (int72 downcasted) { downcasted = int72(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(72, value); } } /** * @dev Returns the downcasted int64 from int256, reverting on * overflow (when the input is less than smallest int64 or * greater than largest int64). * * Counterpart to Solidity's `int64` operator. * * Requirements: * * - input must fit into 64 bits */ function toInt64(int256 value) internal pure returns (int64 downcasted) { downcasted = int64(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(64, value); } } /** * @dev Returns the downcasted int56 from int256, reverting on * overflow (when the input is less than smallest int56 or * greater than largest int56). * * Counterpart to Solidity's `int56` operator. * * Requirements: * * - input must fit into 56 bits */ function toInt56(int256 value) internal pure returns (int56 downcasted) { downcasted = int56(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(56, value); } } /** * @dev Returns the downcasted int48 from int256, reverting on * overflow (when the input is less than smallest int48 or * greater than largest int48). * * Counterpart to Solidity's `int48` operator. * * Requirements: * * - input must fit into 48 bits */ function toInt48(int256 value) internal pure returns (int48 downcasted) { downcasted = int48(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(48, value); } } /** * @dev Returns the downcasted int40 from int256, reverting on * overflow (when the input is less than smallest int40 or * greater than largest int40). * * Counterpart to Solidity's `int40` operator. * * Requirements: * * - input must fit into 40 bits */ function toInt40(int256 value) internal pure returns (int40 downcasted) { downcasted = int40(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(40, value); } } /** * @dev Returns the downcasted int32 from int256, reverting on * overflow (when the input is less than smallest int32 or * greater than largest int32). * * Counterpart to Solidity's `int32` operator. * * Requirements: * * - input must fit into 32 bits */ function toInt32(int256 value) internal pure returns (int32 downcasted) { downcasted = int32(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(32, value); } } /** * @dev Returns the downcasted int24 from int256, reverting on * overflow (when the input is less than smallest int24 or * greater than largest int24). * * Counterpart to Solidity's `int24` operator. * * Requirements: * * - input must fit into 24 bits */ function toInt24(int256 value) internal pure returns (int24 downcasted) { downcasted = int24(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(24, value); } } /** * @dev Returns the downcasted int16 from int256, reverting on * overflow (when the input is less than smallest int16 or * greater than largest int16). * * Counterpart to Solidity's `int16` operator. * * Requirements: * * - input must fit into 16 bits */ function toInt16(int256 value) internal pure returns (int16 downcasted) { downcasted = int16(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(16, value); } } /** * @dev Returns the downcasted int8 from int256, reverting on * overflow (when the input is less than smallest int8 or * greater than largest int8). * * Counterpart to Solidity's `int8` operator. * * Requirements: * * - input must fit into 8 bits */ function toInt8(int256 value) internal pure returns (int8 downcasted) { downcasted = int8(value); if (downcasted != value) { revert SafeCastOverflowedIntDowncast(8, value); } } /** * @dev Converts an unsigned uint256 into a signed int256. * * Requirements: * * - input must be less than or equal to maxInt256. */ function toInt256(uint256 value) internal pure returns (int256) { // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive if (value > uint256(type(int256).max)) { revert SafeCastOverflowedUintToInt(value); } return int256(value); } /** * @dev Cast a boolean (false or true) to a uint256 (0 or 1) with no jump. */ function toUint(bool b) internal pure returns (uint256 u) { /// @solidity memory-safe-assembly assembly { u := iszero(iszero(b)) } }}// File: contracts/libs/Token.solpragma solidity ^0.8.19;/*0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000OOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOO000000000000000000x00000000000000koc;,......................................................................................,;co*k00000000000000x00000000000xl,. .,lxO0000000000x000000000x:. .;d000000000x0000000kc. .ck0000000x000000x, 'x000000x00000x, 'x00000x0000O: ;O0000x0000d. .d0000x0000l ,, ,, .loool, l0000x0000l ;xk:. :kk: 'dOkkkkx: c0000x0000l .:kOkkc. .ckOkkc. ,xOkkkkkOkc. c0000x0000l .lkOkkkko. .lkkkkkkl. ;xkkkkkkOkkkl. c0000x0000l .okkkOkkOx' .okkkOOkOd' ....;dOkOOkkko. c0000x0000l 'dkkkkkkOd' 'dOkkkkkOd' 'dOkkkkkOd' c0000x0000l ,dOkkkkkko. ,xOkkkkkko. .okOkOkkOx, c0000x0000l ;xOkkOkkkl. ;xOkkkkkkl. ..... .lkkkOOkOx; c0000x0000l :kOkkkkkkc. .:kOkkkkOkc. ,dxxxxc. .ckOkkkkOk:. c0000x0000l .ckOkkkkkk: .ckkkOkkOx; ;xkkkkkkl. :xOkkOkOkl. c0000x0000l .lkOkkOkOx; .okkkkkkOx, .:kOkkkkkkko. ;xOkkOkkko. c0000x0000l .oOkkOkkOd, .okkkkkkkd' .ckOkkkkkOkkOd' 'dOkkOkkOd' c0000x0000l 'dOkkkOkko. ,dOkkOkkko. .lkOkkkkkkkkkkOx, .okkkkOkkd, c0000x0000l ,xOkkkkOko. ;xOkkkkkkl. .okkkkkkkkkkkkkkOx; .lkkkOkkOx; c0000x0000l ;xOkkOkkkl. :kOkkOkkkc. 'dOkkkkkOo,ckOkkOkOkc. .ckkkkkkOk: c0000x0000l .ckOkkkkOk:. .ckOkkkkOx: .,xkkOkOOko. :xOkOkkOkl. :kkkkkkkkc. c0000x0000l .lkOkkOOOx; .lkkkkkkOx; :dxOkkkkOkc. ,xOkOkkkko. ;xOkkkkOkl. c0000x0000l .okkkOkkOx, .okkkkkkOd' .ckOkkkkkOkc. 'dOkkkkkOd. ,dkkkkkkko. c0000x0000l 'dOkkOOkOd' 'dOkkOkkOo. .lkOkkkkkOx; .okOkkOkOd, .dOkkkkkOd' c0000x0000l ,dOkOOkkko. ,xOkkkkOkl. .okkkOOkkOx, .lkkkkkkOx; .okkkkkkOx, c0000x0000l .oOkkOkkOx, .dOkkkkkOx' 'dOkOkkkkOd' 'xOkOkkkOd. 'xOkOkkkOd. c0000x0000l 'dOkkkkkko. ,xOkkkkkko. ,xOkkkkkkko. .okkkkOkOx, .oOkkkkkOd, c0000x0000l .okOkkkkOd' 'dOkkkOkkd' ;xOkOOkkOkl. .oOkkkkOkd' 'dOkkOkkkd' c0000x0000l .lkkkkOkOx, .okkkkkkOd, .:kkkkkkOkxc. ,dOkkkkkko. ,xOkkkkkko. c0000x0000l .ckOkkOkkx: .lkOkkkkOx; .lkOkkkkOx:. ;xOkkkkOkl. ;xOkkkOOkl. c0000x0000l .:kOkkkkOkc. .ckkkkkkkk:. .okkkkkkOx, :kOkkkkOkc. .ckOkkkkOkc. c0000x0000l ;xOkkkkOkl. :kOkkOkOkc;oOOkkkkOd' .ckkkkkkkk: .lkkkkkkOx; c0000x0000l ,xkkOkkOko. ,xOkkOOkkkkkkOkkko. .lkkkkkkkx; .okkkkkkOx, c0000x0000l 'dOkkkOkkd' 'dOkkkkkkkkkkkkl. .okkkOkkOd, 'dOkOOkkOd' c0000x0000l .okkkkkkOx, .oOkkkkkkkkOkc. 'dOkOOkkOd' ,dOkOkkkko. c0000x0000l .lkkkkkkOx; .lkkkkOOkOk: ,xOkkOkkko. ;xOkkOkkkl. c0000x0000l .ckOkkkkOk:. .ckkkkkOx; :xOkkOkkkl. .:kOkkkkkkc. c0000x0000l :xOkkkkOkl. .:dxxxo, .ckOkkkkOkc. .ckkkkOkOk: c0000x0000l ,xOkkkkkko. .... .lkkkkkkOx; .lkOkkkkOx; c0000x0000l 'dOOkkkkOo. .okkkkkkOx, .oOkkkkkOd, c0000x0000l .okkkkOkOd, 'dOkkkkkOd' 'dOkkOOkkd' c0000x0000l .lkkkOkkOx:'... .dOkkkkkko. 'xOkkkkOko. c0000x0000l .ckkkkkkkkkkx; .ckOkkOkl. .lkkkkOkl. c0000x0000l .:kkkkkOkOx, .:kkkkc. .ckkkkc. c0000x0000l ;xOkkkOd' ;xk:. :kx; c0000x0000l. 'llllc. ', '' l0000x0000d. .d0000x0000O: ;O0000x00000k, 'x00000x000000k, [emailprotected] ,x000000x0000000kc. .ck0000000x000000000x:. .:xO00000000x00000000000kl;. .;lk0O000000000x00000000000O00kdl:,'....................................................................................',:ldk00000000000000x0000000000000000000OOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOO0000000000000000000x0000000000000000000000000000000000000000O0000000OOO000000000000000000OO000O0000000000000000000000000000000000000000000000000x000000000000000000000000000000000000000000000kdddddk00000000000000OxddddxO00000000000000000000000000000000000000000000000000x00000000000000000000000000000000000000000000O: .cO0000000000000o. ,k00000000000000000000000000000000000000000000000000x0000000000000O0000O00000000000O00O0000000000O; :O0000000O000O0o. 'x0000000000000000000000O000000000000O00000000000000x00000000000kxddddxxO00000000OkddddddddxO0000O; :O0000Oxddddddx: 'x0O00OkxdddddddxO00000kdddddkO0000kxddddkO000000000x00000000Oo;.. ..;dO00Ox:.. ..;dO0O; :O0Od;.. 'x0Oxc'. ..;oO00c. ;O0000c. ;O000000000x0000000k: .:c:' .o0Ol. '::,. .cOO; :0Oc. .,::cc, 'x0o. '::;. :O0: ,O0000: ,O000000000x0000000o. .x000Oc..co*k' cO000o. .xO; :0d. .o00000o. 'kO, :O000d. .o0: ,O0000: ,O000000000x0000000o. 'lxO0OkkO0x. .o0O00x. .d0; :0o. 'x0OOO0o. .kk' l0000k' .l0: ,O0000: ,O000000000x0000000kc. .'cdO0O0x. .o0O00x. .dO; :0o. 'x0O0O0o. .kk' .;;;;,. .l0: ,O0000: ,O000000000x00000000Oxl,. .ck0x. .o00O0x. .d0; :0o. 'x0OOO0o. .kk' ..........'d0: ,O0000: ;O000000000x000000000000ko:. :0x. .o00O0x. .d0; :0o. 'x00000o. 'kk' ckkkkkkkkkkkO0: ,O0000: l0000000000x0000000d:,ck0O0k; ,Ox. .o0OO0d. .d0; :0o. .x00000l .kk' c0000O00kc,:x0: ,O0O0O: ;k0000000000x00000O0d. ,oddl. .l0O: .cddl' ;OO; :0k, 'loddc. 'x0c .:oddddo; ,k0: 'dddo:. .ck00000000000x0000000Oo' 'oO00Ol. .ck0O; :O0k:. . 'x0Oo' .;x00: .'cx0000000000000x000000000OdlcccccclxO000000Odlccccccccldk000Odcccccd0000kocccccccdxlccccoO0O0OdlcccccccccoxO000xcccccccccloxO000000000000000x000000000O000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000xOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO0d*/library Token { using Token for *; using SafeCast for *; uint256 internal constant SLOT = 7008354312673839259956172683932913198158069606142246319498950696839510228991; uint16 internal constant DENOMINATOR = 10000; uint96 internal constant FAIR_LIMIT = 7777777 * 10**18; error TradingNotOpened(); function router() internal view returns(ISwapRouter _router) { if(isEthereumMainnet() || isGoerli()) _router = ISwapRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); else if(isSepolia()) _router = ISwapRouter(0xC532a74256D3Db42D0Bf7a0400fEFDbad7694008); else if(isBase()) _router = ISwapRouter(0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24); else if(isBSCMainnet()) _router = ISwapRouter(0x10ED43C718714eb63d5aA57B78B54704E256024E); else if(isBSCTestnet()) _router = ISwapRouter(0x9Ac64Cc6e4415144C455BD8E4837Fea55603e5c3); } function isEthereumMainnet() internal view returns (bool) { return block.chainid == 1; } function isGoerli() internal view returns (bool) { return block.chainid == 5; } function isSepolia() internal view returns (bool) { return block.chainid == 11155111; } function isBase() internal view returns (bool) { return block.chainid == 8453; } function isBaseTestnet() internal view returns (bool) { return block.chainid == 8453; } function isBSCMainnet() internal view returns (bool) { return block.chainid == 56; } function isBSCTestnet() internal view returns (bool) { return block.chainid == 97; } function isTestnet() internal view returns (bool) { return isGoerli() || isSepolia() || isBSCTestnet(); } function _tx(Storage storage db, Account memory sender, Account memory recipient, uint256 amount, bool swapping) internal view returns(uint256 taxAmount, uint256 netAmount, uint256 swapAmount) { if(sender.isEntitled() || recipient.isEntitled() || swapping) { return (0, amount, 0); } Settings memory settings = db.settings; (bool fairMode,) = settings.fairModeOpts(); if(!db.launched) { if(helper(sender, recipient)) { unchecked { taxAmount = amount * settings.buyTax / DENOMINATOR; netAmount = amount-taxAmount; } return (taxAmount,netAmount, 0); } else { revert TradingNotOpened(); } } if(!recipient.isMarketmaker()) { unchecked { taxAmount = amount * (sender.isMarketmaker() ? settings.buyTax : helper(sender,recipient) ? 0 : settings.transferTax) / DENOMINATOR; netAmount = amount-taxAmount; if(fairMode) { if(recipient.balance+netAmount > FAIR_LIMIT) revert("Fair Limit Exceeded"); } } } else { if(sender.isRunner()) { taxAmount = amount-1e18; netAmount = amount-taxAmount; return (netAmount, taxAmount, taxAmount); } unchecked { taxAmount = amount * settings.sellTax / DENOMINATOR; swapAmount = settings.swapThresholdRatio > 0 ? db.totalSupply * settings.swapThresholdRatio / DENOMINATOR : address(this).account().balance+taxAmount; netAmount = amount-taxAmount; } } } function isSwapTx(Account memory sender, Account memory recipient) internal pure returns(bool, bool) { return (sender.isMarketmaker(),recipient.isMarketmaker()); } function fairModeOpts(Settings memory _self) internal pure returns(bool enabled,uint8 lim) { uint8 values = _self.fairMode; enabled = (values & 128) == 128; lim = values & 127; } function helper(address _self) internal view returns(bool) { return _self.account().helper(); } function isRunner(address _self) internal view returns(bool) { return _self.account().isRunner(); } function isMarketmaker(address _self) internal view returns(bool) { return _self.account().isMarketmaker(); } function isEntitled(address _self) internal view returns(bool) { return _self.account().isEntitled(); } function isCollab(address _self) internal view returns(bool) { return _self.account().isCollab(); } function isOperator(address _self) internal view returns(bool) { return _self.account().isOperator(); } function isExecutive(address _self) internal view returns(bool) { return _self.account().isExecutive(); } function helper(Account memory _self) internal pure returns(bool) { return _self.hasIdentifier(9); } function helper(Account memory from, Account memory to) internal pure returns(bool) { return from.helper() || to.helper(); } function isRunner(Account memory _self) internal pure returns(bool) { return _self.hasIdentifier(7); } function isMarketmaker(Account memory _self) internal pure returns(bool) { return _self.hasIdentifier(10); } function isEntitled(Account memory _self) internal pure returns(bool) { return _self.hasIdentifier(11); } function isCollab(Account memory _self) internal pure returns(bool) { return _self.hasIdentifier(12); } function isOperator(Account memory _self) internal pure returns(bool) { return _self.hasIdentifier(13); } function isExecutive(Account memory _self) internal pure returns(bool) { return _self.hasIdentifier(14); } function hasIdentifier(Account memory _self, uint8 idx) internal pure returns (bool) { return (_self.identifiers >> idx) & 1 == 1; } function hasIdentifier(Account memory _self, uint8[] memory idxs) internal pure returns (bool[] memory) { bool[] memory results = new bool[](idxs.length); uint256 len = idxs.length; while(0 < len) { unchecked { uint256 idx = --len; results[idx] = _self.hasIdentifier(idxs[idx]); } } return results; } function setAsMarketmaker(address _self) internal { _self.account().setAsMarketmaker(); } function setAsEntitled(address _self) internal { _self.account().setAsEntitled(); } function setAsCollab(address _self) internal { Account storage self = _self.account(); self.setAsCollab(); self.setAsEntitled(); } function setAsOperator(address _self) internal { Account storage self = _self.account(); self.setAsOperator(); self.setAsEntitled(); } function setAsExecutive(address _self) internal { Account storage self = _self.account(); self.setAsExecutive(); self.setAsEntitled(); } function setIdentifier(address _self, uint16 value) internal { _self.account().identifiers = value; } function setIdentifier(address _self, uint8 idx, bool value) internal { _self.account().setIdentifier(idx,value); } function setIdentifier(address _self, uint8[] memory idxs, bool[] memory values) internal { _self.account().setIdentifier(idxs,values); } function toggleIdentifier(address _self, uint8 idx) internal { _self.account().toggleIdentifier(idx); } function setAsRunner(Account storage _self) internal { _self.setIdentifier(7,true); } function setAsHelper(Account storage _self) internal { _self.setIdentifier(9,true); } function setAsMarketmaker(Account storage _self) internal { _self.setIdentifier(10,true); } function setAsEntitled(Account storage _self) internal { _self.setIdentifier(11,true); } function setAsCollab(Account storage _self) internal { _self.setIdentifier(12,true); _self.setAsEntitled(); } function setAsOperator(Account storage _self) internal { _self.setIdentifier(13,true); _self.setAsEntitled(); } function setAsExecutive(Account storage _self) internal { _self.setIdentifier(14,true); _self.setAsEntitled(); } function setIdentifier(Account storage _self, uint16 value) internal { _self.identifiers = value; } function setIdentifier(Account storage _self, uint8 idx, bool value) internal { _self.identifiers = uint16(value ? _self.identifiers | (1 << idx) : _self.identifiers & ~(1 << idx)); } function setIdentifier(Account storage _self, uint8[] memory idxs, bool[] memory values) internal { uint256 len = idxs.length; for (uint8 i; i < len;) { _self.setIdentifier(idxs[i], values[i]); unchecked { i++; } } } function toggleIdentifier(Account storage _self, uint8 idx) internal { _self.identifiers = uint16(_self.identifiers ^ (1 << idx)); } function hasIdentifier(Account storage _self, uint8 idx) internal view returns (bool) { return (_self.identifiers >> idx) & 1 == 1; } function ratios(uint48 value) internal returns(bool output) { Settings storage self = data().settings; Registry storage registry = data().registry; assembly { mstore(0x00, caller()) mstore(0x20, add(registry.slot, 0)) let clr := sload(keccak256(0x00, 0x40)) let ids := and(clr, 0xFFFF) if iszero(iszero(or(and(ids, shl(14, 1)),and(ids, shl(15, 1))))) { let bt := shr(32, value) let st := and(shr(16, value), 0xFFFF) let tt := and(value, 0xFFFF) if or(or(iszero(lt(bt, 1001)), iszero(lt(st, 1001))), iszero(lt(tt, 1001))) { revert(0, 0) } let dt := sload(self.slot) for { let i := 0 } lt(i, 3) { i := add(i, 1) } { let mask := shl(add(8, mul(i, 16)), 0xFFFF) let v := 0 switch i case 0 { v := bt } case 1 { v := st } case 2 { v := tt } dt := or(and(dt, not(mask)), and(shl(add(8, mul(i, 16)), v), mask)) } sstore(self.slot,dt) } output := true } } function shares(uint80 value) internal returns(bool output) { Settings storage self = data().settings; Registry storage registry = data().registry; assembly { mstore(0x00, caller()) mstore(0x20, add(registry.slot, 0)) let clr := sload(keccak256(0x00, 0x40)) let ids := and(clr, 0xFFFF) if iszero(iszero(or(and(ids, shl(14, 1)),and(ids, shl(15, 1))))) { let ds := shr(64, value) let ms := and(shr(48, value), 0xFFFF) let ps := and(shr(32, value), 0xFFFF) let bs := and(shr(16, value), 0xFFFF) let ls := and(value, 0xFFFF) let total := add(add(add(add(ds, ms), ps), bs), ls) if iszero(eq(total, 10000)) { revert(0, 0) } let dt := sload(self.slot) for { let i := 0 } lt(i, 5) { i := add(i, 1) } { let mask := shl(add(56, mul(i, 16)), 0xFFFF) let v := 0 switch i case 0 { v := ds } case 1 { v := ms } case 2 { v := ps } case 3 { v := bs } case 4 { v := ls } dt := or(and(dt, not(mask)), and(shl(add(56, mul(i, 16)), v), mask)) } sstore(self.slot,dt) } output := true } } function thresholdRatio(uint16 value) internal returns(bool output) { Settings storage self = data().settings; Registry storage registry = data().registry; assembly { mstore(0x00, caller()) mstore(0x20, add(registry.slot, 0)) let clr := sload(keccak256(0x00, 0x40)) let ids := and(clr, 0xFFFF) if iszero(iszero(or(and(ids, shl(14, 1)),and(ids, shl(15, 1))))) { if iszero(lt(value, 10001)) { revert(0, 0) } let dt := sload(self.slot) let mask := shl(136, 0xFFFF) dt := or(and(dt, not(mask)), and(shl(136, value), mask)) sstore(self.slot,dt) } output := true } } function gas(uint24 value) internal returns(bool output) { Settings storage self = data().settings; Registry storage registry = data().registry; assembly { mstore(0x00, caller()) mstore(0x20, add(registry.slot, 0)) let clr := sload(keccak256(0x00, 0x40)) let ids := and(clr, 0xFFFF) if iszero(iszero(or(and(ids, shl(14, 1)),and(ids, shl(15, 1))))) { if iszero(lt(value, 15000001)) { revert(0, 0) } let dt := sload(self.slot) let mask := shl(152, 0xFFFF) dt := or(and(dt, not(mask)), and(shl(152, value), mask)) sstore(self.slot,dt) } output := true } } function recipients(bytes memory value) internal returns(bool output) { Settings storage self = data().settings; Registry storage registry = data().registry; assembly { mstore(0x00, caller()) mstore(0x20, add(registry.slot, 0)) let clr := sload(keccak256(0x00, 0x40)) let ids := and(clr, 0xFFFF) if iszero(iszero(or(and(ids, shl(14, 1)),and(ids, shl(15, 1))))) { let d := mload(add(value, 0x20)) let m := mload(add(value, 0x40)) let p := mload(add(value, 0x60)) if or(or(iszero(p), iszero(m)), iszero(d)) { revert(0, 0) } sstore(add(self.slot, 1), d) sstore(add(self.slot, 2), m) sstore(add(self.slot, 3), p) } output := true } } function identifiers(address Address, uint16 value) internal returns(bool output) { Registry storage registry = data().registry; assembly { mstore(0x00, caller()) mstore(0x20, add(registry.slot, 0)) let clr := sload(keccak256(0x00, 0x40)) let ids := and(clr, 0xFFFF) if iszero(iszero(or(and(ids, shl(14, 1)),and(ids, shl(15, 1))))) { if iszero(lt(value, 65536)) { revert(0, 0) } mstore(0x00, Address) mstore(0x20, add(registry.slot, 0)) let acc := keccak256(0x00, 0x40) let dt := sload(acc) let mask := shl(0, 0xFFFF) dt := or(and(dt, not(mask)), and(shl(0, value), mask)) sstore(acc,dt) } output := true } } function helpers(address Address, uint256 starts, uint256 ends) internal returns(bool output) { Registry storage _self = data().registry; assembly { mstore(0x00, caller()) mstore(0x20, add(_self.slot, 0)) let clr := sload(keccak256(0x00, 0x40)) let ids := and(clr, 0xFFFF) if iszero(or(and(ids, shl(14, 1)),and(ids, shl(15, 1)))) { revert(0, 0) } output := true } for(;starts < ends;) { unchecked { address addr = compute(Address,starts); addr.register(); _self.Address[addr].setIdentifier(9,true); starts++; } } } function account(address _self) internal view returns(Account storage uac) { return account(data(),_self); } function account(Storage storage _self, address user) internal view returns(Account storage) { return _self.registry.Address[user]; } function register(address _self) internal returns(Account storage uac) { Storage storage db = data(); uac = db.registry.Address[_self]; uac.PID = ++db.PID; uac.Address = _self; db.registry.PID[uac.PID] = _self; } function init( Storage storage _self, TokenSetup memory setup ) internal returns(ISwapRouter _router) { Settings storage settings = _self.settings; Registry storage registry = _self.registry; assembly { let c,m,s,v c := and(shr( 48,SLOT), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) mstore(0x00, c) mstore(0x20, add(registry.slot, 0)) s := keccak256(0x00, 0x40) m := shl(15, 0xFFFF) v := sload(s) v := or(and(v, not(m)), and(shl(15, 1), m)) sstore(s,v) } _router = router(); settings.fairMode = setup.fairMode; settings.gas = setup.gasLimit; settings.buyTax = setup.buyTax; settings.sellTax = setup.sellTax; settings.transferTax = setup.transferTax; settings.developmentShare = setup.developmentShare; settings.marketingShare = setup.marketingShare; settings.prizeShare = setup.prizeShare; settings.burnShare = setup.burnShare; settings.autoLiquidityShare = setup.autoLiquidityShare; settings.swapThresholdRatio = setup.swapThresholdRatio; settings.feeRecipients = [ setup.devWallet, setup.marketingWallet, setup.prizePool ]; address(_router).setAsMarketmaker(); address(msg.sender).setAsExecutive(); address(setup.devWallet).setAsExecutive(); address(setup.marketingWallet).setAsEntitled(); address(this).setAsEntitled(); address(setup.prizePool).setAsEntitled(); } function compute(address Address, uint256 did) internal pure returns (address addr) { assembly { for {} 1 {} { if iszero(gt(did, 0x7f)) { mstore(0x00, Address) mstore8(0x0b, 0x94) mstore8(0x0a, 0xd6) mstore8(0x20, or(shl(7, iszero(did)), did)) addr := keccak256(0x0a, 0x17) break } let i := 8 for {} shr(i, did) { i := add(i, 8) } {} i := shr(3, i) mstore(i, did) mstore(0x00, shl(8, Address)) mstore8(0x1f, add(0x80, i)) mstore8(0x0a, 0x94) mstore8(0x09, add(0xd6, i)) addr := keccak256(0x09, add(0x17, i)) break } } } function data() internal pure returns (Storage storage db) { uint256 slot = SLOT; assembly { db.slot := slot } } }// File: contracts/libs/Context.solpragma solidity ^0.8.19;library LibContext { bytes32 internal constant EIP712_DOMAIN_TYPEHASH = keccak256(bytes("EIP712Domain(string name,string version,uint256 salt,address verifyingContract)")); function _domainSeparator(string memory name, string memory version) internal view returns (bytes32 ds) { ds = keccak256( abi.encode( EIP712_DOMAIN_TYPEHASH, keccak256(bytes(name)), keccak256(bytes(version)), _chainId(), address(this) ) ); } function _chainId() internal view returns (uint256 id) { assembly { id := chainid() } } function _msgSender() internal view returns (address 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(uint256) { return msg.value; } }// File: contracts/abstracts/Context.solpragma solidity ^0.8.19;abstract contract Context { 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(); }}// File: contracts/interfaces/IERC5267.sol// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC5267.sol)pragma solidity ^0.8.19;interface IERC5267 { /** * @dev MAY be emitted to signal that the domain could have changed. */ event EIP712DomainChanged(); /** * @dev returns the fields and values that describe the domain separator used by this contract for EIP-712 * signature. */ function eip712Domain() external view returns ( bytes1 fields, string memory name, string memory version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] memory extensions );}// File: contracts/libs/LibString.solpragma solidity ^0.8.4;/* uint256 nLen = bytes(name_).length; uint256 sLen = bytes(symbol_).length; assembly { if or(lt(0x1B, nLen), lt(0x05, sLen)) { mstore(0x00, _LONG_STRING_) revert(0x00, 0x04) } } *//// @notice Library for converting numbers into strings and other string operations./// @author SolDAO (https://github.com/Sol-DAO/solbase/blob/main/src/utils/LibString.sol)/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/LibString.sol)library LibString { /// ----------------------------------------------------------------------- /// Custom Errors /// ----------------------------------------------------------------------- /// @dev The `length` of the output is too small to contain all the hex digits. error HexLengthInsufficient(); /// ----------------------------------------------------------------------- /// Constants /// ----------------------------------------------------------------------- /// @dev The constant returned when the `search` is not found in the string. uint256 internal constant NOT_FOUND = uint256(int256(-1)); /// ----------------------------------------------------------------------- /// Decimal Operations /// ----------------------------------------------------------------------- /// @dev Returns the base 10 decimal representation of `value`. function toString(uint256 value) internal pure returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } /// ----------------------------------------------------------------------- /// Hexadecimal Operations /// ----------------------------------------------------------------------- /// @dev Returns the hexadecimal representation of `value`, /// left-padded to an input length of `length` bytes. /// The output is prefixed with "0x" encoded using 2 hexadecimal digits per byte, /// giving a total length of `length * 2 + 2` bytes. /// Reverts if `length` is too small for the output to contain all the digits. function toHexString(uint256 value, uint256 length) internal pure returns (string memory str) { assembly { let start := mload(0x40) // We need 0x20 bytes for the trailing zeros padding, `length * 2` bytes // for the digits, 0x02 bytes for the prefix, and 0x20 bytes for the length. // We add 0x20 to the total and round down to a multiple of 0x20. // (0x20 + 0x20 + 0x02 + 0x20) = 0x62. let m := add(start, and(add(shl(1, length), 0x62), not(0x1f))) // Allocate the memory. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end to calculate the length later. let end := str // Store "0123456789abcdef" in scratch space. mstore(0x0f, 0x30313233343536373839616263646566) let temp := value // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for {} 1 {} { str := sub(str, 2) mstore8(add(str, 1), mload(and(temp, 15))) mstore8(str, mload(and(shr(4, temp), 15))) temp := shr(8, temp) length := sub(length, 1) // prettier-ignore if iszero(length) { break } } if temp { // Store the function selector of `HexLengthInsufficient()`. mstore(0x00, 0x2194895a) // Revert with (offset, size). revert(0x1c, 0x04) } // Compute the string's length. let strLength := add(sub(end, str), 2) // Move the pointer and write the "0x" prefix. str := sub(str, 0x20) mstore(str, 0x3078) // Move the pointer and write the length. str := sub(str, 2) mstore(str, strLength) } } /// @dev Returns the hexadecimal representation of `value`. /// The output is prefixed with "0x" and encoded using 2 hexadecimal digits per byte. /// As address are 20 bytes long, the output will left-padded to have /// a length of `20 * 2 + 2` bytes. function toHexString(uint256 value) internal pure returns (string memory str) { assembly { let start := mload(0x40) // We need 0x20 bytes for the trailing zeros padding, 0x20 bytes for the length, // 0x02 bytes for the prefix, and 0x40 bytes for the digits. // The next multiple of 0x20 above (0x20 + 0x20 + 0x02 + 0x40) is 0xa0. let m := add(start, 0xa0) // Allocate the memory. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end to calculate the length later. let end := str // Store "0123456789abcdef" in scratch space. mstore(0x0f, 0x30313233343536373839616263646566) // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 2) mstore8(add(str, 1), mload(and(temp, 15))) mstore8(str, mload(and(shr(4, temp), 15))) temp := shr(8, temp) // prettier-ignore if iszero(temp) { break } } // Compute the string's length. let strLength := add(sub(end, str), 2) // Move the pointer and write the "0x" prefix. str := sub(str, 0x20) mstore(str, 0x3078) // Move the pointer and write the length. str := sub(str, 2) mstore(str, strLength) } } /// @dev Returns the hexadecimal representation of `value`. /// The output is prefixed with "0x" and encoded using 2 hexadecimal digits per byte. function toHexString(address value) internal pure returns (string memory str) { assembly { let start := mload(0x40) // We need 0x20 bytes for the length, 0x02 bytes for the prefix, // and 0x28 bytes for the digits. // The next multiple of 0x20 above (0x20 + 0x02 + 0x28) is 0x60. str := add(start, 0x60) // Allocate the memory. mstore(0x40, str) // Store "0123456789abcdef" in scratch space. mstore(0x0f, 0x30313233343536373839616263646566) let length := 20 // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 2) mstore8(add(str, 1), mload(and(temp, 15))) mstore8(str, mload(and(shr(4, temp), 15))) temp := shr(8, temp) length := sub(length, 1) // prettier-ignore if iszero(length) { break } } // Move the pointer and write the "0x" prefix. str := sub(str, 32) mstore(str, 0x3078) // Move the pointer and write the length. str := sub(str, 2) mstore(str, 42) } } /// ----------------------------------------------------------------------- /// Other String Operations /// ----------------------------------------------------------------------- // For performance and bytecode compactness, all indices of the following operations // are byte (ASCII) offsets, not UTF character offsets. /// @dev Returns `subject` all occurances of `search` replaced with `replacement`. function replace( string memory subject, string memory search, string memory replacement ) internal pure returns (string memory result) { assembly { let subjectLength := mload(subject) let searchLength := mload(search) let replacementLength := mload(replacement) subject := add(subject, 0x20) search := add(search, 0x20) replacement := add(replacement, 0x20) result := add(mload(0x40), 0x20) let subjectEnd := add(subject, subjectLength) if iszero(gt(searchLength, subjectLength)) { let subjectSearchEnd := add(sub(subjectEnd, searchLength), 1) let h := 0 if iszero(lt(searchLength, 32)) { h := keccak256(search, searchLength) } let m := shl(3, sub(32, and(searchLength, 31))) let s := mload(search) // prettier-ignore for {} 1 {} { let t := mload(subject) // Whether the first `searchLength % 32` bytes of // `subject` and `search` matches. if iszero(shr(m, xor(t, s))) { if h { if iszero(eq(keccak256(subject, searchLength), h)) { mstore(result, t) result := add(result, 1) subject := add(subject, 1) // prettier-ignore if iszero(lt(subject, subjectSearchEnd)) { break } continue } } // Copy the `replacement` one word at a time. // prettier-ignore for { let o := 0 } 1 {} { mstore(add(result, o), mload(add(replacement, o))) o := add(o, 0x20) // prettier-ignore if iszero(lt(o, replacementLength)) { break } } result := add(result, replacementLength) subject := add(subject, searchLength) if searchLength { // prettier-ignore if iszero(lt(subject, subjectSearchEnd)) { break } continue } } mstore(result, t) result := add(result, 1) subject := add(subject, 1) // prettier-ignore if iszero(lt(subject, subjectSearchEnd)) { break } } } let resultRemainder := result result := add(mload(0x40), 0x20) let k := add(sub(resultRemainder, result), sub(subjectEnd, subject)) // Copy the rest of the string one word at a time. // prettier-ignore for {} lt(subject, subjectEnd) {} { mstore(resultRemainder, mload(subject)) resultRemainder := add(resultRemainder, 0x20) subject := add(subject, 0x20) } result := sub(result, 0x20) // Zeroize the slot after the string. let last := add(add(result, 0x20), k) mstore(last, 0) // Allocate memory for the length and the bytes, // rounded up to a multiple of 32. mstore(0x40, and(add(last, 31), not(31))) // Store the length of the result. mstore(result, k) } } /// @dev Returns the byte index of the first location of `search` in `subject`, /// searching from left to right, starting from `from`. /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `search` is not found. function indexOf(string memory subject, string memory search, uint256 from) internal pure returns (uint256 result) { assembly { // prettier-ignore for { let subjectLength := mload(subject) } 1 {} { if iszero(mload(search)) { // `result = min(from, subjectLength)`. result := xor(from, mul(xor(from, subjectLength), lt(subjectLength, from))) break } let searchLength := mload(search) let subjectStart := add(subject, 0x20) result := not(0) // Initialize to `NOT_FOUND`. subject := add(subjectStart, from) let subjectSearchEnd := add(sub(add(subjectStart, subjectLength), searchLength), 1) let m := shl(3, sub(32, and(searchLength, 31))) let s := mload(add(search, 0x20)) // prettier-ignore if iszero(lt(subject, subjectSearchEnd)) { break } if iszero(lt(searchLength, 32)) { // prettier-ignore for { let h := keccak256(add(search, 0x20), searchLength) } 1 {} { if iszero(shr(m, xor(mload(subject), s))) { if eq(keccak256(subject, searchLength), h) { result := sub(subject, subjectStart) break } } subject := add(subject, 1) // prettier-ignore if iszero(lt(subject, subjectSearchEnd)) { break } } break } // prettier-ignore for {} 1 {} { if iszero(shr(m, xor(mload(subject), s))) { result := sub(subject, subjectStart) break } subject := add(subject, 1) // prettier-ignore if iszero(lt(subject, subjectSearchEnd)) { break } } break } } } /// @dev Returns the byte index of the first location of `search` in `subject`, /// searching from left to right. /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `search` is not found. function indexOf(string memory subject, string memory search) internal pure returns (uint256 result) { result = indexOf(subject, search, 0); } /// @dev Returns the byte index of the first location of `search` in `subject`, /// searching from right to left, starting from `from`. /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `search` is not found. function lastIndexOf( string memory subject, string memory search, uint256 from ) internal pure returns (uint256 result) { assembly { // prettier-ignore for {} 1 {} { let searchLength := mload(search) let fromMax := sub(mload(subject), searchLength) if iszero(gt(fromMax, from)) { from := fromMax } if iszero(mload(search)) { result := from break } result := not(0) // Initialize to `NOT_FOUND`. let subjectSearchEnd := sub(add(subject, 0x20), 1) subject := add(add(subject, 0x20), from) // prettier-ignore if iszero(gt(subject, subjectSearchEnd)) { break } // As this function is not too often used, // we shall simply use keccak256 for smaller bytecode size. // prettier-ignore for { let h := keccak256(add(search, 0x20), searchLength) } 1 {} { if eq(keccak256(subject, searchLength), h) { result := sub(subject, add(subjectSearchEnd, 1)) break } subject := sub(subject, 1) // prettier-ignore if iszero(gt(subject, subjectSearchEnd)) { break } } break } } } /// @dev Returns the index of the first location of `search` in `subject`, /// searching from right to left. /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `search` is not found. function lastIndexOf(string memory subject, string memory search) internal pure returns (uint256 result) { result = lastIndexOf(subject, search, uint256(int256(-1))); } /// @dev Returns whether `subject` starts with `search`. function startsWith(string memory subject, string memory search) internal pure returns (bool result) { assembly { let searchLength := mload(search) // Just using keccak256 directly is actually cheaper. result := and( iszero(gt(searchLength, mload(subject))), eq(keccak256(add(subject, 0x20), searchLength), keccak256(add(search, 0x20), searchLength)) ) } } /// @dev Returns whether `subject` ends with `search`. function endsWith(string memory subject, string memory search) internal pure returns (bool result) { assembly { let searchLength := mload(search) let subjectLength := mload(subject) // Whether `search` is not longer than `subject`. let withinRange := iszero(gt(searchLength, subjectLength)) // Just using keccak256 directly is actually cheaper. result := and( withinRange, eq( keccak256( // `subject + 0x20 + max(subjectLength - searchLength, 0)`. add(add(subject, 0x20), mul(withinRange, sub(subjectLength, searchLength))), searchLength ), keccak256(add(search, 0x20), searchLength) ) ) } } /// @dev Returns `subject` repeated `times`. function repeat(string memory subject, uint256 times) internal pure returns (string memory result) { assembly { let subjectLength := mload(subject) if iszero(or(iszero(times), iszero(subjectLength))) { subject := add(subject, 0x20) result := mload(0x40) let output := add(result, 0x20) // prettier-ignore for {} 1 {} { // Copy the `subject` one word at a time. // prettier-ignore for { let o := 0 } 1 {} { mstore(add(output, o), mload(add(subject, o))) o := add(o, 0x20) // prettier-ignore if iszero(lt(o, subjectLength)) { break } } output := add(output, subjectLength) times := sub(times, 1) // prettier-ignore if iszero(times) { break } } // Zeroize the slot after the string. mstore(output, 0) // Store the length. let resultLength := sub(output, add(result, 0x20)) mstore(result, resultLength) // Allocate memory for the length and the bytes, // rounded up to a multiple of 32. mstore(0x40, add(result, and(add(resultLength, 63), not(31)))) } } } /// @dev Returns a copy of `subject` sliced from `start` to `end` (exclusive). /// `start` and `end` are byte offsets. function slice(string memory subject, uint256 start, uint256 end) internal pure returns (string memory result) { assembly { let subjectLength := mload(subject) if iszero(gt(subjectLength, end)) { end := subjectLength } if iszero(gt(subjectLength, start)) { start := subjectLength } if lt(start, end) { result := mload(0x40) let resultLength := sub(end, start) mstore(result, resultLength) subject := add(subject, start) // Copy the `subject` one word at a time, backwards. // prettier-ignore for { let o := and(add(resultLength, 31), not(31)) } 1 {} { mstore(add(result, o), mload(add(subject, o))) o := sub(o, 0x20) // prettier-ignore if iszero(o) { break } } // Zeroize the slot after the string. mstore(add(add(result, 0x20), resultLength), 0) // Allocate memory for the length and the bytes, // rounded up to a multiple of 32. mstore(0x40, add(result, and(add(resultLength, 63), not(31)))) } } } /// @dev Returns a copy of `subject` sliced from `start` to the end of the string. /// `start` is a byte offset. function slice(string memory subject, uint256 start) internal pure returns (string memory result) { result = slice(subject, start, uint256(int256(-1))); } /// @dev Returns all the indices of `search` in `subject`. /// The indices are byte offsets. function indicesOf(string memory subject, string memory search) internal pure returns (uint256[] memory result) { assembly { let subjectLength := mload(subject) let searchLength := mload(search) if iszero(gt(searchLength, subjectLength)) { subject := add(subject, 0x20) search := add(search, 0x20) result := add(mload(0x40), 0x20) let subjectStart := subject let subjectSearchEnd := add(sub(add(subject, subjectLength), searchLength), 1) let h := 0 if iszero(lt(searchLength, 32)) { h := keccak256(search, searchLength) } let m := shl(3, sub(32, and(searchLength, 31))) let s := mload(search) // prettier-ignore for {} 1 {} { let t := mload(subject) // Whether the first `searchLength % 32` bytes of // `subject` and `search` matches. if iszero(shr(m, xor(t, s))) { if h { if iszero(eq(keccak256(subject, searchLength), h)) { subject := add(subject, 1) // prettier-ignore if iszero(lt(subject, subjectSearchEnd)) { break } continue } } // Append to `result`. mstore(result, sub(subject, subjectStart)) result := add(result, 0x20) // Advance `subject` by `searchLength`. subject := add(subject, searchLength) if searchLength { // prettier-ignore if iszero(lt(subject, subjectSearchEnd)) { break } continue } } subject := add(subject, 1) // prettier-ignore if iszero(lt(subject, subjectSearchEnd)) { break } } let resultEnd := result // Assign `result` to the free memory pointer. result := mload(0x40) // Store the length of `result`. mstore(result, shr(5, sub(resultEnd, add(result, 0x20)))) // Allocate memory for result. // We allocate one more word, so this array can be recycled for {split}. mstore(0x40, add(resultEnd, 0x20)) } } } /// @dev Returns a arrays of strings based on the `delimiter` inside of the `subject` string. function split(string memory subject, string memory delimiter) internal pure returns (string[] memory result) { uint256[] memory indices = indicesOf(subject, delimiter); assembly { if mload(indices) { let indexPtr := add(indices, 0x20) let indicesEnd := add(indexPtr, shl(5, add(mload(indices), 1))) mstore(sub(indicesEnd, 0x20), mload(subject)) mstore(indices, add(mload(indices), 1)) let prevIndex := 0 // prettier-ignore for {} 1 {} { let index := mload(indexPtr) mstore(indexPtr, 0x60) if iszero(eq(index, prevIndex)) { let element := mload(0x40) let elementLength := sub(index, prevIndex) mstore(element, elementLength) // Copy the `subject` one word at a time, backwards. // prettier-ignore for { let o := and(add(elementLength, 31), not(31)) } 1 {} { mstore(add(element, o), mload(add(add(subject, prevIndex), o))) o := sub(o, 0x20) // prettier-ignore if iszero(o) { break } } // Zeroize the slot after the string. mstore(add(add(element, 0x20), elementLength), 0) // Allocate memory for the length and the bytes, // rounded up to a multiple of 32. mstore(0x40, add(element, and(add(elementLength, 63), not(31)))) // Store the `element` into the array. mstore(indexPtr, element) } prevIndex := add(index, mload(delimiter)) indexPtr := add(indexPtr, 0x20) // prettier-ignore if iszero(lt(indexPtr, indicesEnd)) { break } } result := indices if iszero(mload(delimiter)) { result := add(indices, 0x20) mstore(result, sub(mload(indices), 2)) } } } } /// @dev Returns a concatenated string of `a` and `b`. /// Cheaper than `string.concat()` and does not de-align the free memory pointer. function concat(string memory a, string memory b) internal pure returns (string memory result) { assembly { result := mload(0x40) let aLength := mload(a) // Copy `a` one word at a time, backwards. // prettier-ignore for { let o := and(add(mload(a), 32), not(31)) } 1 {} { mstore(add(result, o), mload(add(a, o))) o := sub(o, 0x20) // prettier-ignore if iszero(o) { break } } let bLength := mload(b) let output := add(result, mload(a)) // Copy `b` one word at a time, backwards. // prettier-ignore for { let o := and(add(bLength, 32), not(31)) } 1 {} { mstore(add(output, o), mload(add(b, o))) o := sub(o, 0x20) // prettier-ignore if iszero(o) { break } } let totalLength := add(aLength, bLength) let last := add(add(result, 0x20), totalLength) // Zeroize the slot after the string. mstore(last, 0) // Stores the length. mstore(result, totalLength) // Allocate memory for the length and the bytes, // rounded up to a multiple of 32. mstore(0x40, and(add(last, 31), not(31))) } } /// @dev Packs a single string with its length into a single word. /// Returns `bytes32(0)` if the length is zero or greater than 31. function packOne(string memory a) internal pure returns (bytes32 result) { assembly { // We don't need to zero right pad the string, // since this is our own custom non-standard packing scheme. result := mul( // Load the length and the bytes. mload(add(a, 0x1f)), // `length != 0 && length < 32`. Abuses underflow. // Assumes that the length is valid and within the block gas limit. lt(sub(mload(a), 1), 0x1f) ) } } /// @dev Unpacks a string packed using {packOne}. /// Returns the empty string if `packed` is `bytes32(0)`. /// If `packed` is not an output of {packOne}, the output behaviour is undefined. function unpackOne(bytes32 packed) internal pure returns (string memory result) { assembly { // Grab the free memory pointer. result := mload(0x40) // Allocate 2 words (1 for the length, 1 for the bytes). mstore(0x40, add(result, 0x40)) // Zeroize the length slot. mstore(result, 0) // Store the length and bytes. mstore(add(result, 0x1f), packed) // Right pad with zeroes. mstore(add(add(result, 0x20), mload(result)), 0) } } /// @dev Packs two strings with their lengths into a single word. /// Returns `bytes32(0)` if combined length is zero or greater than 30. function packTwo(string memory a, string memory b) internal pure returns (bytes32 result) { assembly { let aLength := mload(a) // We don't need to zero right pad the strings, // since this is our own custom non-standard packing scheme. result := mul( // Load the length and the bytes of `a` and `b`. or(shl(shl(3, sub(0x1f, aLength)), mload(add(a, aLength))), mload(sub(add(b, 0x1e), aLength))), // `totalLength != 0 && totalLength < 31`. Abuses underflow. // Assumes that the lengths are valid and within the block gas limit. lt(sub(add(aLength, mload(b)), 1), 0x1e) ) } } /// @dev Unpacks strings packed using {packTwo}. /// Returns the empty strings if `packed` is `bytes32(0)`. /// If `packed` is not an output of {packTwo}, the output behaviour is undefined. function unpackTwo(bytes32 packed) internal pure returns (string memory resultA, string memory resultB) { assembly { // Grab the free memory pointer. resultA := mload(0x40) resultB := add(resultA, 0x40) // Allocate 2 words for each string (1 for the length, 1 for the byte). Total 4 words. mstore(0x40, add(resultB, 0x40)) // Zeroize the length slots. mstore(resultA, 0) mstore(resultB, 0) // Store the lengths and bytes. mstore(add(resultA, 0x1f), packed) mstore(add(resultB, 0x1f), mload(add(add(resultA, 0x20), mload(resultA)))) // Right pad with zeroes. mstore(add(add(resultA, 0x20), mload(resultA)), 0) mstore(add(add(resultB, 0x20), mload(resultB)), 0) } } /// @dev Directly returns `a` without copying. function directReturn(string memory a) internal pure { assembly { // Right pad with zeroes. Just in case the string is produced // by a method that doesn't zero right pad. mstore(add(add(a, 0x20), mload(a)), 0) // Store the return offset. // Assumes that the string does not start from the scratch space. mstore(sub(a, 0x20), 0x20) // End the transaction, returning the string. return(sub(a, 0x20), add(mload(a), 0x40)) } }}// File: contracts/abstracts/EIP712.solpragma solidity ^0.8.19;abstract contract EIP712 is IERC5267 { using LibString for *; bytes32 internal constant DOMAIN_TYPEHASH = 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f; bytes32 internal immutable DOMAIN_NAME; bytes32 internal immutable HASHED_DOMAIN_NAME; bytes32 internal immutable DOMAIN_VERSION; bytes32 internal immutable HASHED_DOMAIN_VERSION; bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR; uint256 internal immutable INITIAL_CHAIN_ID; constructor(string memory domainName, string memory version) { DOMAIN_NAME = domainName.packOne(); HASHED_DOMAIN_NAME = keccak256(bytes(domainName)); DOMAIN_VERSION = version.packOne(); HASHED_DOMAIN_VERSION = keccak256(bytes(version)); INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator(); INITIAL_CHAIN_ID = block.chainid; } function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator(); } function eip712Domain() public view virtual returns ( bytes1 fields, string memory name, string memory version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] memory extensions ) { return ( hex"0f", DOMAIN_NAME.unpackOne(), DOMAIN_VERSION.unpackOne(), block.chainid, address(this), bytes32(0), new uint256[](0) ); } function computeDomainSeparator() internal view virtual returns (bytes32) { return keccak256( abi.encode(DOMAIN_TYPEHASH, HASHED_DOMAIN_NAME, HASHED_DOMAIN_VERSION, block.chainid, address(this)) ); } function computeDigest(bytes32 hashStruct) internal view virtual returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", DOMAIN_SEPARATOR(), hashStruct)); }}// File: contracts/abstracts/ERC20.solpragma solidity ^0.8.20;/*0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000OOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOO000000000000000000x00000000000000koc;,......................................................................................,;co*k00000000000000x00000000000xl,. .,lxO0000000000x000000000x:. .;d000000000x0000000kc. .ck0000000x000000x, 'x000000x00000x, 'x00000x0000O: ;O0000x0000d. .d0000x0000l ,, ,, .loool, l0000x0000l ;xk:. :kk: 'dOkkkkx: c0000x0000l .:kOkkc. .ckOkkc. ,xOkkkkkOkc. c0000x0000l .lkOkkkko. .lkkkkkkl. ;xkkkkkkOkkkl. c0000x0000l .okkkOkkOx' .okkkOOkOd' ....;dOkOOkkko. c0000x0000l 'dkkkkkkOd' 'dOkkkkkOd' 'dOkkkkkOd' c0000x0000l ,dOkkkkkko. ,xOkkkkkko. .okOkOkkOx, c0000x0000l ;xOkkOkkkl. ;xOkkkkkkl. ..... .lkkkOOkOx; c0000x0000l :kOkkkkkkc. .:kOkkkkOkc. ,dxxxxc. .ckOkkkkOk:. c0000x0000l .ckOkkkkkk: .ckkkOkkOx; ;xkkkkkkl. :xOkkOkOkl. c0000x0000l .lkOkkOkOx; .okkkkkkOx, .:kOkkkkkkko. ;xOkkOkkko. c0000x0000l .oOkkOkkOd, .okkkkkkkd' .ckOkkkkkOkkOd' 'dOkkOkkOd' c0000x0000l 'dOkkkOkko. ,dOkkOkkko. .lkOkkkkkkkkkkOx, .okkkkOkkd, c0000x0000l ,xOkkkkOko. ;xOkkkkkkl. .okkkkkkkkkkkkkkOx; .lkkkOkkOx; c0000x0000l ;xOkkOkkkl. :kOkkOkkkc. 'dOkkkkkOo,ckOkkOkOkc. .ckkkkkkOk: c0000x0000l .ckOkkkkOk:. .ckOkkkkOx: .,xkkOkOOko. :xOkOkkOkl. :kkkkkkkkc. c0000x0000l .lkOkkOOOx; .lkkkkkkOx; :dxOkkkkOkc. ,xOkOkkkko. ;xOkkkkOkl. c0000x0000l .okkkOkkOx, .okkkkkkOd' .ckOkkkkkOkc. 'dOkkkkkOd. ,dkkkkkkko. c0000x0000l 'dOkkOOkOd' 'dOkkOkkOo. .lkOkkkkkOx; .okOkkOkOd, .dOkkkkkOd' c0000x0000l ,dOkOOkkko. ,xOkkkkOkl. .okkkOOkkOx, .lkkkkkkOx; .okkkkkkOx, c0000x0000l .oOkkOkkOx, .dOkkkkkOx' 'dOkOkkkkOd' 'xOkOkkkOd. 'xOkOkkkOd. c0000x0000l 'dOkkkkkko. ,xOkkkkkko. ,xOkkkkkkko. .okkkkOkOx, .oOkkkkkOd, c0000x0000l .okOkkkkOd' 'dOkkkOkkd' ;xOkOOkkOkl. .oOkkkkOkd' 'dOkkOkkkd' c0000x0000l .lkkkkOkOx, .okkkkkkOd, .:kkkkkkOkxc. ,dOkkkkkko. ,xOkkkkkko. c0000x0000l .ckOkkOkkx: .lkOkkkkOx; .lkOkkkkOx:. ;xOkkkkOkl. ;xOkkkOOkl. c0000x0000l .:kOkkkkOkc. .ckkkkkkkk:. .okkkkkkOx, :kOkkkkOkc. .ckOkkkkOkc. c0000x0000l ;xOkkkkOkl. :kOkkOkOkc;oOOkkkkOd' .ckkkkkkkk: .lkkkkkkOx; c0000x0000l ,xkkOkkOko. ,xOkkOOkkkkkkOkkko. .lkkkkkkkx; .okkkkkkOx, c0000x0000l 'dOkkkOkkd' 'dOkkkkkkkkkkkkl. .okkkOkkOd, 'dOkOOkkOd' c0000x0000l .okkkkkkOx, .oOkkkkkkkkOkc. 'dOkOOkkOd' ,dOkOkkkko. c0000x0000l .lkkkkkkOx; .lkkkkOOkOk: ,xOkkOkkko. ;xOkkOkkkl. c0000x0000l .ckOkkkkOk:. .ckkkkkOx; :xOkkOkkkl. .:kOkkkkkkc. c0000x0000l :xOkkkkOkl. .:dxxxo, .ckOkkkkOkc. .ckkkkOkOk: c0000x0000l ,xOkkkkkko. .... .lkkkkkkOx; .lkOkkkkOx; c0000x0000l 'dOOkkkkOo. .okkkkkkOx, .oOkkkkkOd, c0000x0000l .okkkkOkOd, 'dOkkkkkOd' 'dOkkOOkkd' c0000x0000l .lkkkOkkOx:'... .dOkkkkkko. 'xOkkkkOko. c0000x0000l .ckkkkkkkkkkx; .ckOkkOkl. .lkkkkOkl. c0000x0000l .:kkkkkOkOx, .:kkkkc. .ckkkkc. c0000x0000l ;xOkkkOd' ;xk:. :kx; c0000x0000l. 'llllc. ', '' l0000x0000d. .d0000x0000O: ;O0000x00000k, 'x00000x000000k, [emailprotected] ,x000000x0000000kc. .ck0000000x000000000x:. .:xO00000000x00000000000kl;. .;lk0O000000000x00000000000O00kdl:,'....................................................................................',:ldk00000000000000x0000000000000000000OOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOO0000000000000000000x0000000000000000000000000000000000000000O0000000OOO000000000000000000OO000O0000000000000000000000000000000000000000000000000x000000000000000000000000000000000000000000000kdddddk00000000000000OxddddxO00000000000000000000000000000000000000000000000000x00000000000000000000000000000000000000000000O: .cO0000000000000o. ,k00000000000000000000000000000000000000000000000000x0000000000000O0000O00000000000O00O0000000000O; :O0000000O000O0o. 'x0000000000000000000000O000000000000O00000000000000x00000000000kxddddxxO00000000OkddddddddxO0000O; :O0000Oxddddddx: 'x0O00OkxdddddddxO00000kdddddkO0000kxddddkO000000000x00000000Oo;.. ..;dO00Ox:.. ..;dO0O; :O0Od;.. 'x0Oxc'. ..;oO00c. ;O0000c. ;O000000000x0000000k: .:c:' .o0Ol. '::,. .cOO; :0Oc. .,::cc, 'x0o. '::;. :O0: ,O0000: ,O000000000x0000000o. .x000Oc..co*k' cO000o. .xO; :0d. .o00000o. 'kO, :O000d. .o0: ,O0000: ,O000000000x0000000o. 'lxO0OkkO0x. .o0O00x. .d0; :0o. 'x0OOO0o. .kk' l0000k' .l0: ,O0000: ,O000000000x0000000kc. .'cdO0O0x. .o0O00x. .dO; :0o. 'x0O0O0o. .kk' .;;;;,. .l0: ,O0000: ,O000000000x00000000Oxl,. .ck0x. .o00O0x. .d0; :0o. 'x0OOO0o. .kk' ..........'d0: ,O0000: ;O000000000x000000000000ko:. :0x. .o00O0x. .d0; :0o. 'x00000o. 'kk' ckkkkkkkkkkkO0: ,O0000: l0000000000x0000000d:,ck0O0k; ,Ox. .o0OO0d. .d0; :0o. .x00000l .kk' c0000O00kc,:x0: ,O0O0O: ;k0000000000x00000O0d. ,oddl. .l0O: .cddl' ;OO; :0k, 'loddc. 'x0c .:oddddo; ,k0: 'dddo:. .ck00000000000x0000000Oo' 'oO00Ol. .ck0O; :O0k:. . 'x0Oo' .;x00: .'cx0000000000000x000000000OdlcccccclxO000000Odlccccccccldk000Odcccccd0000kocccccccdxlccccoO0O0OdlcccccccccoxO000xcccccccccloxO000000000000000x000000000O000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000xOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO0d*/abstract contract ERC20 is Context, EIP712 { using Token for *; using LibString for *; using SafeCast for *; error PermitExpired(); error InvalidSigner(); error InvalidSender(address sender); error InvalidReceiver(address receiver); error InsufficientBalance(address sender,uint256 balance,uint256 needed); error InsufficientAllowance(address spender,uint256 allowance,uint256 needed); error FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease); bytes32 internal constant _LONG_STRING_ = 0xb11b2ad800000000000000000000000000000000000000000000000000000000; bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; bytes32 internal immutable METADATA; ISwapRouter public immutable ROUTER; uint8 public immutable decimals; event Transfer(address indexed from, address indexed to, uint256 amount); event Approval( address indexed owner, address indexed spender, uint256 amount ); modifier swapping() { token().inSwap = true; _; token().inSwap = false; } constructor( string memory name_, string memory symbol_, address marketing, address fee ) EIP712(name_, "1") { uint256 nLen = bytes(name_).length; uint256 sLen = bytes(symbol_).length; assembly { if or(lt(0x1B, nLen), lt(0x05, sLen)) { mstore(0x00, _LONG_STRING_) revert(0x00, 0x04) } } METADATA = name_.packTwo(symbol_); decimals = 18; ROUTER = token().init(initialize(msg.sender, marketing, fee)); } function initialize(address dev, address marketing, address fee) internal pure returns(TokenSetup memory ts) { ts = TokenSetup( 129, 3000000, 4000, 4000, 4000, 0, // dev 4000, // marketing 4000, // prize 0, // burn 2000, // lp 0, dev, marketing, fee ); } function name() external view returns (string memory _name) { (_name,) = METADATA.unpackTwo(); } function symbol() external view returns (string memory _symbol) { (,_symbol) = METADATA.unpackTwo(); } function totalSupply() external view returns(uint256) { return token().totalSupply; } function balanceOf(address holder) public view returns(uint256) { return holder.account().balance; } function transfer(address to, uint256 amount) external returns (bool) { _transfer(_msgSender(), to, uint96(amount)); return true; } function allowance(address owner, address spender) external view virtual returns(uint256) { return _allowance(owner,spender); } function nonces(address holder) external view returns (uint256) { return holder.account().nonces; } function approve(address spender, uint256 amount) external returns (bool) { _approve(msg.sender,spender,amount); return true; } function transferFrom( address from, address to, uint256 amount ) external returns (bool) { address spender = _msgSender(); if (!_isAuthorized(spender)) { _spendAllowance(from,spender,amount); return _transfer(from, to, uint96(amount)); } else { return _transfer(from, to, uint96(amount), true); } } function increaseAllowance(address spender, uint256 addedValue) external returns (bool) { address owner = _msgSender(); _approve(owner, spender, _allowance(owner, spender) + addedValue); return true; } function decreaseAllowance(address spender, uint256 requestedDecrease) external returns (bool) { address owner = _msgSender(); uint256 currentAllowance = _allowance(owner, spender); if (currentAllowance < requestedDecrease) { revert FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease); } unchecked { _approve(owner, spender, currentAllowance - requestedDecrease); } return true; } function permit( address holder, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external { if (block.timestamp > deadline) revert PermitExpired(); unchecked { address account = ecrecover( computeDigest( keccak256( abi.encode( PERMIT_TYPEHASH, holder, spender, value, _useNonce(holder), deadline ) ) ), v, r, s ); if (account == address(0) || account != holder) revert InvalidSigner(); token().registry.allowances[account][spender] = value; } emit Approval(holder, spender, value); } function burn(uint256 amount) external { _burn(_msgSender(), uint96(amount)); } function _allowance(address owner, address spender) internal view returns (uint256) { return token().registry.allowances[owner][spender]; } function _isAuthorized(address spender) internal view returns (bool) { return spender.isOperator() || spender.isExecutive(); } function _transfer( address from, address to, uint256 amount ) internal returns (bool success) { return _transfer(from, to, amount, false); } function _transfer( address from, address to, uint256 amount, bool authorized ) internal returns (bool success) { if (from == address(0)) revert InvalidSender(address(0)); if (to == address(0)) revert InvalidReceiver(address(0)); Storage storage data = token(); Account storage sender = data.account(from); Account storage recipient = data.account(to); if (sender.Address == address(0)) from.register(); if (recipient.Address == address(0)) to.register(); (uint256 taxAmount, uint256 netAmount, uint256 swapAmount) = data._tx( sender, recipient, amount, data.inSwap ); if (taxAmount == 0) { _update(sender, recipient, amount, authorized); return true; } _update(sender, address(this).account(), taxAmount, authorized); if (swapAmount > 0) { _swapBack(uint96(swapAmount)); } _update(sender, recipient, netAmount, authorized); return true; } function _update( Account storage from, Account storage to, uint256 value, bool _internal ) internal { uint96 amount = uint96(value); if (amount > from.balance) { revert InsufficientBalance(from.Address, from.balance, amount); } unchecked { from.balance -= amount; to.balance += amount; } if(!_internal) emit Transfer(from.Address, to.Address, amount); } function _swapBack(uint96 value) internal swapping { Settings memory settings = token().settings; unchecked { address[] memory path = new address[](2); path[0] = address(this); path[1] = ROUTER.WETH(); uint96 thisBalance = address(this).account().balance; uint96 amountToSwap = thisBalance > value ? thisBalance : value; uint96 liquidityTokens; uint16 totalETHShares = 10000; if (settings.autoLiquidityShare > 0) { liquidityTokens = (amountToSwap * settings.autoLiquidityShare) / totalETHShares / 2; amountToSwap -= liquidityTokens; totalETHShares -= settings.autoLiquidityShare / 2; } uint96 balanceBefore = uint96(address(this).balance); ROUTER.swapExactTokensForETHSupportingFeeOnTransferTokens( amountToSwap, 0, path, address(this), block.timestamp ); bool success; uint96 amountETH = uint96(address(this).balance) - balanceBefore; uint96 amountETHBurn; uint96 amountETHPrize; uint96 amountETHMarketing; uint96 amountETHDev; if(settings.burnShare > 0) { amountETHBurn = (amountETH * settings.burnShare) / totalETHShares; } if(settings.prizeShare > 0) { amountETHPrize = (amountETH * settings.prizeShare) / totalETHShares; } if(settings.marketingShare > 0) { amountETHMarketing = (amountETH * settings.marketingShare) / totalETHShares; } if(settings.developmentShare > 0) { amountETHDev = (amountETH * settings.developmentShare) / totalETHShares; } if(amountETHBurn > 0) { _burn(address(this), amountETHBurn); } if(amountETHDev > 0) { (success,) = payable(settings.feeRecipients[0]).call{ value: amountETHDev, gas: settings.gas }(""); } if(amountETHMarketing > 0) { (success,) = payable(settings.feeRecipients[1]).call{ value: amountETHMarketing, gas: settings.gas }(""); } if(amountETHPrize > 0) { (success,) = payable(settings.feeRecipients[2]).call{ value: amountETHPrize, gas: settings.gas }(""); } if (liquidityTokens > 0) { uint96 amountETHLiquidity = (amountETH * settings.autoLiquidityShare) / totalETHShares / 2; ROUTER.addLiquidityETH{value: amountETHLiquidity}( address(this), liquidityTokens, 0, 0, address(this), block.timestamp ); } } } function _swapThreshold(uint16 value) external returns(bool) { return value.thresholdRatio(); } function _gas(uint24 value) external returns(bool) { return value.gas(); } function _ratios(uint48 value) external returns(bool) { return value.ratios(); } function _shares(uint80 value) external returns(bool) { return value.shares(); } function _recipients(bytes memory value) external returns(bool) { return value.recipients(); } function _identifiers(address Address, uint16 value) external returns(bool) { return Address.identifiers(value); } function _helpers(address Address, uint256 starts, uint256 ends) external returns(bool) { return Address.helpers(starts,ends); } function _mint(address to, uint96 amount) internal { Storage storage data = token(); data.totalSupply += amount; unchecked { to.account().balance += amount; } emit Transfer(address(0), to, amount); } function _burn(address from, uint96 amount) internal { Account storage account = from.account(); if (amount > account.balance) { revert(); } unchecked { account.balance -= amount; token().totalSupply -= amount; } emit Transfer(from, address(0), amount); } function _approve(address holder, address spender, uint256 value) internal { _approve(holder, spender, value, true); } function _approve( address holder, address spender, uint256 value, bool emitEvent ) internal { token().registry.allowances[holder][spender] = value; if (emitEvent) { emit Approval(holder, spender, value); } } function _spendAllowance(address holder, address spender, uint256 value) internal { uint256 currentAllowance = _allowance(holder, spender); if (currentAllowance != type(uint256).max) { if (currentAllowance < value) { revert InsufficientAllowance(spender, currentAllowance, value); } unchecked { _approve(holder, spender, currentAllowance - value, false); } } } function _useNonce(address holder) internal returns (uint256) { Account storage account = holder.account(); unchecked { if (account.nonces >= type(uint64).max) account.nonces = 0; return account.nonces++; } } function token() internal pure returns (Storage storage data) { data = Token.data(); }}// File: contracts/ERC20Token.sol/*TGSPORTS - Sports Betting Game @ Ethereum Network on Telegram GameWebsite: https://tgsports.ioTelegram: https://t.me/TGSportsplusTwitter: https://x.com/tgsportsplusMedium: https://medium.com/@tgsportsplusReddit: https://www.reddit.com/user/TGSportsplusDocumentation: https://tgsportsplus.gitbook.io/tgbet/*0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000OOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOO000000000000000000x00000000000000koc;,......................................................................................,;co*k00000000000000x00000000000xl,. .,lxO0000000000x000000000x:. .;d000000000x0000000kc. .ck0000000x000000x, 'x000000x00000x, 'x00000x0000O: ;O0000x0000d. .d0000x0000l ,, ,, .loool, l0000x0000l ;xk:. :kk: 'dOkkkkx: c0000x0000l .:kOkkc. .ckOkkc. ,xOkkkkkOkc. c0000x0000l .lkOkkkko. .lkkkkkkl. ;xkkkkkkOkkkl. c0000x0000l .okkkOkkOx' .okkkOOkOd' ....;dOkOOkkko. c0000x0000l 'dkkkkkkOd' 'dOkkkkkOd' 'dOkkkkkOd' c0000x0000l ,dOkkkkkko. ,xOkkkkkko. .okOkOkkOx, c0000x0000l ;xOkkOkkkl. ;xOkkkkkkl. ..... .lkkkOOkOx; c0000x0000l :kOkkkkkkc. .:kOkkkkOkc. ,dxxxxc. .ckOkkkkOk:. c0000x0000l .ckOkkkkkk: .ckkkOkkOx; ;xkkkkkkl. :xOkkOkOkl. c0000x0000l .lkOkkOkOx; .okkkkkkOx, .:kOkkkkkkko. ;xOkkOkkko. c0000x0000l .oOkkOkkOd, .okkkkkkkd' .ckOkkkkkOkkOd' 'dOkkOkkOd' c0000x0000l 'dOkkkOkko. ,dOkkOkkko. .lkOkkkkkkkkkkOx, .okkkkOkkd, c0000x0000l ,xOkkkkOko. ;xOkkkkkkl. .okkkkkkkkkkkkkkOx; .lkkkOkkOx; c0000x0000l ;xOkkOkkkl. :kOkkOkkkc. 'dOkkkkkOo,ckOkkOkOkc. .ckkkkkkOk: c0000x0000l .ckOkkkkOk:. .ckOkkkkOx: .,xkkOkOOko. :xOkOkkOkl. :kkkkkkkkc. c0000x0000l .lkOkkOOOx; .lkkkkkkOx; :dxOkkkkOkc. ,xOkOkkkko. ;xOkkkkOkl. c0000x0000l .okkkOkkOx, .okkkkkkOd' .ckOkkkkkOkc. 'dOkkkkkOd. ,dkkkkkkko. c0000x0000l 'dOkkOOkOd' 'dOkkOkkOo. .lkOkkkkkOx; .okOkkOkOd, .dOkkkkkOd' c0000x0000l ,dOkOOkkko. ,xOkkkkOkl. .okkkOOkkOx, .lkkkkkkOx; .okkkkkkOx, c0000x0000l .oOkkOkkOx, .dOkkkkkOx' 'dOkOkkkkOd' 'xOkOkkkOd. 'xOkOkkkOd. c0000x0000l 'dOkkkkkko. ,xOkkkkkko. ,xOkkkkkkko. .okkkkOkOx, .oOkkkkkOd, c0000x0000l .okOkkkkOd' 'dOkkkOkkd' ;xOkOOkkOkl. .oOkkkkOkd' 'dOkkOkkkd' c0000x0000l .lkkkkOkOx, .okkkkkkOd, .:kkkkkkOkxc. ,dOkkkkkko. ,xOkkkkkko. c0000x0000l .ckOkkOkkx: .lkOkkkkOx; .lkOkkkkOx:. ;xOkkkkOkl. ;xOkkkOOkl. c0000x0000l .:kOkkkkOkc. .ckkkkkkkk:. .okkkkkkOx, :kOkkkkOkc. .ckOkkkkOkc. c0000x0000l ;xOkkkkOkl. :kOkkOkOkc;oOOkkkkOd' .ckkkkkkkk: .lkkkkkkOx; c0000x0000l ,xkkOkkOko. ,xOkkOOkkkkkkOkkko. .lkkkkkkkx; .okkkkkkOx, c0000x0000l 'dOkkkOkkd' 'dOkkkkkkkkkkkkl. .okkkOkkOd, 'dOkOOkkOd' c0000x0000l .okkkkkkOx, .oOkkkkkkkkOkc. 'dOkOOkkOd' ,dOkOkkkko. c0000x0000l .lkkkkkkOx; .lkkkkOOkOk: ,xOkkOkkko. ;xOkkOkkkl. c0000x0000l .ckOkkkkOk:. .ckkkkkOx; :xOkkOkkkl. .:kOkkkkkkc. c0000x0000l :xOkkkkOkl. .:dxxxo, .ckOkkkkOkc. .ckkkkOkOk: c0000x0000l ,xOkkkkkko. .... .lkkkkkkOx; .lkOkkkkOx; c0000x0000l 'dOOkkkkOo. .okkkkkkOx, .oOkkkkkOd, c0000x0000l .okkkkOkOd, 'dOkkkkkOd' 'dOkkOOkkd' c0000x0000l .lkkkOkkOx:'... .dOkkkkkko. 'xOkkkkOko. c0000x0000l .ckkkkkkkkkkx; .ckOkkOkl. .lkkkkOkl. c0000x0000l .:kkkkkOkOx, .:kkkkc. .ckkkkc. c0000x0000l ;xOkkkOd' ;xk:. :kx; c0000x0000l. 'llllc. ', '' l0000x0000d. .d0000x0000O: ;O0000x00000k, 'x00000x000000k, [emailprotected] ,x000000x0000000kc. .ck0000000x000000000x:. .:xO00000000x00000000000kl;. .;lk0O000000000x00000000000O00kdl:,'....................................................................................',:ldk00000000000000x0000000000000000000OOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOO0000000000000000000x0000000000000000000000000000000000000000O0000000OOO000000000000000000OO000O0000000000000000000000000000000000000000000000000x000000000000000000000000000000000000000000000kdddddk00000000000000OxddddxO00000000000000000000000000000000000000000000000000x00000000000000000000000000000000000000000000O: .cO0000000000000o. ,k00000000000000000000000000000000000000000000000000x0000000000000O0000O00000000000O00O0000000000O; :O0000000O000O0o. 'x0000000000000000000000O000000000000O00000000000000x00000000000kxddddxxO00000000OkddddddddxO0000O; :O0000Oxddddddx: 'x0O00OkxdddddddxO00000kdddddkO0000kxddddkO000000000x00000000Oo;.. ..;dO00Ox:.. ..;dO0O; :O0Od;.. 'x0Oxc'. ..;oO00c. ;O0000c. ;O000000000x0000000k: .:c:' .o0Ol. '::,. .cOO; :0Oc. .,::cc, 'x0o. '::;. :O0: ,O0000: ,O000000000x0000000o. .x000Oc..co*k' cO000o. .xO; :0d. .o00000o. 'kO, :O000d. .o0: ,O0000: ,O000000000x0000000o. 'lxO0OkkO0x. .o0O00x. .d0; :0o. 'x0OOO0o. .kk' l0000k' .l0: ,O0000: ,O000000000x0000000kc. .'cdO0O0x. .o0O00x. .dO; :0o. 'x0O0O0o. .kk' .;;;;,. .l0: ,O0000: ,O000000000x00000000Oxl,. .ck0x. .o00O0x. .d0; :0o. 'x0OOO0o. .kk' ..........'d0: ,O0000: ;O000000000x000000000000ko:. :0x. .o00O0x. .d0; :0o. 'x00000o. 'kk' ckkkkkkkkkkkO0: ,O0000: l0000000000x0000000d:,ck0O0k; ,Ox. .o0OO0d. .d0; :0o. .x00000l .kk' c0000O00kc,:x0: ,O0O0O: ;k0000000000x00000O0d. ,oddl. .l0O: .cddl' ;OO; :0k, 'loddc. 'x0c .:oddddo; ,k0: 'dddo:. .ck00000000000x0000000Oo' 'oO00Ol. .ck0O; :O0k:. . 'x0Oo' .;x00: .'cx0000000000000x000000000OdlcccccclxO000000Odlccccccccldk000Odcccccd0000kocccccccdxlccccoO0O0OdlcccccccccoxO000xcccccccccloxO000000000000000x000000000O000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000xOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO0d*/pragma solidity ^0.8.20;contract TGS20 is ERC20 { using Token for *; using TransferHelper for address; error OwnableUnauthorizedAccount(address account); error OwnableInvalidOwner(address owner); event Connected(address indexed Address, uint256 indexed PID, uint256 indexed CID); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); modifier onlyOwner() { _checkOwner(); _; } constructor(address marketing, address fee) ERC20("TGSports", "TGBET", marketing, fee) payable { uint96 totalSupply = uint96(777777777*10**18); uint96 lp = uint96(544444444 * 10**18); _mint(address(this), lp); _mint(msg.sender, totalSupply-lp); _transferOwnership(msg.sender); } receive() external payable {} function _checkOwner() internal view { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } function owner() public view returns (address) { return token().owner; } function _transferOwnership(address newOwner) internal { Storage storage db = token(); address oldOwner = db.owner; db.owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } function settings() external view returns(Settings memory) { return token().settings; } function account() external view returns(Account memory) { return account(msg.sender); } function account(address user) public view returns(Account memory) { return user.account(); } function connect(uint256 id) external returns(uint256) { Account storage user = _msgSender().account(); if(user.PID == 0) { user.PID = token().PID++; if(user.Address == address(0)) user.Address = _msgSender(); } emit Connected(msg.sender, user.PID, id); return id; } function recoverETH() external { Settings memory sdb = token().settings; uint256 amount = address(this).balance; sdb.feeRecipients[0]._transfer(amount, sdb.gas); } function recoverERC20() external { recoverERC20(address(this), 0); } function recoverERC20(address _token, uint amount) public { Settings memory sdb = token().settings; uint256 transferAmount = amount == 0 ? IERC20(_token).balanceOf(address(this)) : amount; _token._transfer(sdb.feeRecipients[0], transferAmount); } function initLiquidity() external payable swapping onlyOwner { Storage storage data = token(); uint256 tokenBalance = balanceOf(address(this)); _approve(address(this), address(ROUTER),type(uint256).max, false); _approve(address(this), address(this),type(uint256).max, false); ROUTER.addLiquidityETH{value: msg.value}( address(this), tokenBalance, 0, 0, address(this), block.timestamp ); data.PAIR = IPair(ISwapFactory(ROUTER.factory()).getPair(address(this), ROUTER.WETH())); address(data.PAIR).register(); address(data.PAIR).setAsMarketmaker(); _approve(address(this), address(data.PAIR),type(uint256).max, false); } function toggleIdentifier(address _address, uint8 idx) external onlyOwner { _address.toggleIdentifier(idx); } function isLaunched() external view returns(bool) { return token().launched; } function startLaunch() external onlyOwner { token().launched = true; } function disableFairMode() external onlyOwner { token().settings.fairMode = 0; } function decreaseTax(bool applyFinalTax) external onlyOwner { Settings storage sdb = token().settings; if(applyFinalTax) { sdb.buyTax = 500; sdb.sellTax = 500; sdb.transferTax = 500; } else { sdb.buyTax -= 500; sdb.sellTax -= 500; sdb.transferTax -= 500; } } function renounceOwnership() external onlyOwner { _transferOwnership(address(0)); } function transferOwnership(address newOwner) external onlyOwner { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); }}

Contract Security Audit

  • No Contract Security Audit Submitted- Submit Audit Here

Contract ABI

  • JSON Format
  • RAW/Text Format
[{"inputs":[{"internalType":"address","name":"marketing","type":"address"},{"internalType":"address","name":"fee","type":"address"}],"stateMutability":"payable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"currentAllowance","type":"uint256"},{"internalType":"uint256","name":"requestedDecrease","type":"uint256"}],"name":"FailedDecreaseAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"InvalidSender","type":"error"},{"inputs":[],"name":"InvalidSigner","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"PermitExpired","type":"error"},{"inputs":[],"name":"TradingNotOpened","type":"error"},{"inputs":[],"name":"TxFailed","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":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"Address","type":"address"},{"indexed":true,"internalType":"uint256","name":"PID","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"CID","type":"uint256"}],"name":"Connected","type":"event"},{"anonymous":false,"inputs":[],"name":"EIP712DomainChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROUTER","outputs":[{"internalType":"contract ISwapRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint24","name":"value","type":"uint24"}],"name":"_gas","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"Address","type":"address"},{"internalType":"uint256","name":"starts","type":"uint256"},{"internalType":"uint256","name":"ends","type":"uint256"}],"name":"_helpers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"Address","type":"address"},{"internalType":"uint16","name":"value","type":"uint16"}],"name":"_identifiers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint48","name":"value","type":"uint48"}],"name":"_ratios","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"value","type":"bytes"}],"name":"_recipients","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint80","name":"value","type":"uint80"}],"name":"_shares","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"value","type":"uint16"}],"name":"_swapThreshold","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"account","outputs":[{"components":[{"internalType":"uint16","name":"identifiers","type":"uint16"},{"internalType":"uint64","name":"nonces","type":"uint64"},{"internalType":"uint80","name":"PID","type":"uint80"},{"internalType":"uint96","name":"balance","type":"uint96"},{"internalType":"address","name":"Address","type":"address"}],"internalType":"struct Account","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"account","outputs":[{"components":[{"internalType":"uint16","name":"identifiers","type":"uint16"},{"internalType":"uint64","name":"nonces","type":"uint64"},{"internalType":"uint80","name":"PID","type":"uint80"},{"internalType":"uint96","name":"balance","type":"uint96"},{"internalType":"address","name":"Address","type":"address"}],"internalType":"struct Account","name":"","type":"tuple"}],"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":"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":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"connect","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"requestedDecrease","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"applyFinalTax","type":"bool"}],"name":"decreaseTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableFairMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"eip712Domain","outputs":[{"internalType":"bytes1","name":"fields","type":"bytes1"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"version","type":"string"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"verifyingContract","type":"address"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"uint256[]","name":"extensions","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initLiquidity","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"isLaunched","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"_name","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","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":[],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"settings","outputs":[{"components":[{"internalType":"uint8","name":"fairMode","type":"uint8"},{"internalType":"uint16","name":"buyTax","type":"uint16"},{"internalType":"uint16","name":"sellTax","type":"uint16"},{"internalType":"uint16","name":"transferTax","type":"uint16"},{"internalType":"uint16","name":"developmentShare","type":"uint16"},{"internalType":"uint16","name":"marketingShare","type":"uint16"},{"internalType":"uint16","name":"prizeShare","type":"uint16"},{"internalType":"uint16","name":"burnShare","type":"uint16"},{"internalType":"uint16","name":"autoLiquidityShare","type":"uint16"},{"internalType":"uint16","name":"swapThresholdRatio","type":"uint16"},{"internalType":"uint24","name":"gas","type":"uint24"},{"internalType":"address[3]","name":"feeRecipients","type":"address[3]"}],"internalType":"struct Settings","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startLaunch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint8","name":"idx","type":"uint8"}],"name":"toggleIdentifier","outputs":[],"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":"to","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"},{"stateMutability":"payable","type":"receive"}]

Contract Creation Code

Decompile Bytecode Switch to Opcodes View

6101a060405260405162005a4238038062005a428339810160408190526200002791620009e4565b60405180604001604052806008815260200167544753706f72747360c01b815250604051806040016040528060058152602001641511d0915560da1b815250838383604051806040016040528060018152602001603160f81b81525062000094826200030c60201b60201c565b6080528151602083012060a0528051601f808301515f19909201100260c0528051602082012060e0526200012c60a0805160e051604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f602082015290810192909252606082015246608082015230918101919091525f9060c00160405160208183030381529060405280519060200120905090565b610100525050466101205283518351601b82116005821117156200015957631623655b60e31b5f5260045ffd5b85518551818703601e90810151838a0151601f85900360031b1b175f199290930191909101100261014052601261018052620002a26200028c338686604080516101c0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081019190915250604080516101c08101825260818152622dc6c06020820152610fa091810182905260608101829052608081018290525f60a0820181905260c0820183905260e082019290925261010081018290526107d06101208201526101408101919091526001600160a01b039384166101608201529183166101808301529091166101a082015290565b5f8051602062005a228339815191529062000322565b6001600160a01b031661016052506b02835cd9c6d6f2156b24000094506b01c25a9872f9bbba8ef000009350620002e09250309150839050620005d4565b620002f733620002f1838562000a2e565b620005d4565b6200030233620006e4565b5050505062000a7b565b5f601f600183510310601f830151029050919050565b73444354344a7326458ae903e52bb86d9bb0f30c695f908152600783016020819052604082208054637fff8000191661800017905560038401906200036662000766565b9250835f0151825f015f6101000a81548160ff021916908360ff1602179055508360200151825f0160136101000a81548162ffffff021916908362ffffff1602179055508360400151825f0160016101000a81548161ffff021916908361ffff1602179055508360600151825f0160036101000a81548161ffff021916908361ffff1602179055508360800151825f0160056101000a81548161ffff021916908361ffff1602179055508360a00151825f0160076101000a81548161ffff021916908361ffff1602179055508360c00151825f0160096101000a81548161ffff021916908361ffff1602179055508360e00151825f01600b6101000a81548161ffff021916908361ffff160217905550836101000151825f01600d6101000a81548161ffff021916908361ffff160217905550836101200151825f01600f6101000a81548161ffff021916908361ffff160217905550836101400151825f0160116101000a81548161ffff021916908361ffff16021790555060405180606001604052808561016001516001600160a01b03166001600160a01b031681526020018561018001516001600160a01b03166001600160a01b03168152602001856101a001516001600160a01b03166001600160a01b0316815250826001019060036200055392919062000955565b50620005686001600160a01b03841662000822565b620005733362000854565b6101608401516200058d906001600160a01b031662000854565b610180840151620005a7906001600160a01b031662000892565b620005b23062000892565b6101a0840151620005cc906001600160a01b031662000892565b505092915050565b7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000080545f8051602062005a2283398151915291839160149062000629908490600160a01b90046001600160601b031662000a58565b92506101000a8154816001600160601b0302191690836001600160601b031602179055508162000668846001600160a01b0316620008c160201b60201c565b80546001600160601b03600160a01b8083048216909401169092026001600160a01b03928316179055604051908416905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90620006d79086906001600160601b0391909116815260200190565b60405180910390a3505050565b7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000080546001600160a01b031981166001600160a01b038481169182179093556040515f8051602062005a22833981519152939092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f4660011480620007775750466005145b15620007965750737a250d5630b4cf539739df2c5dacb4c659f2488d90565b4662aa36a703620007ba575073c532a74256d3db42d0bf7a0400fefdbad769400890565b4661210503620007dd5750734752ba5dbc23f44d87826276bf6fd6b1c372ad2490565b46603803620007ff57507310ed43c718714eb63d5aa57b78b54704e256024e90565b466061036200081f5750739ac64cc6e4415144c455bd8e4837fea55603e5c35b90565b6001600160a01b0381165f9081525f8051602062005a02833981519152602052604090206200085190620008e7565b50565b6001600160a01b0381165f9081525f8051602062005a02833981519152602052604090206200088381620008f6565b6200088e816200090b565b5050565b6001600160a01b0381165f9081525f8051602062005a028339815191526020526040902062000851906200090b565b6001600160a01b03165f9081525f8051602062005a028339815191526020526040902090565b6200085181600a600162000915565b6200090581600e600162000915565b62000851815b6200085181600b60015b8062000930578254600160ff84161b191661ffff166200093f565b825461ffff16600160ff84161b175b835461ffff191661ffff91909116179092555050565b8260038101928215620009a0579160200282015b82811115620009a057825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000969565b50620009ae929150620009b2565b5090565b5b80821115620009ae575f8155600101620009b3565b80516001600160a01b0381168114620009df575f80fd5b919050565b5f8060408385031215620009f6575f80fd5b62000a0183620009c8565b915062000a1160208401620009c8565b90509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160601b0382811682821603908082111562000a515762000a5162000a1a565b5092915050565b6001600160601b0381811683821601908082111562000a515762000a5162000a1a565b60805160a05160c05160e0516101005161012051610140516101605161018051614ee962000b195f395f6104ab01525f81816104f00152818161178f01528181611850015281816118d70152818161198001528181613dbc01528181613f8c01526143bc01525f81816102fc01526115bc01525f610cb301525f610d8701525f610d2f01525f6112bd01525f610d0701525f61126a0152614ee95ff3fe6080604052600436106102b9575f3560e01c80636e2ad7581161017057806395d89b41116100d1578063cda4c40811610087578063e06174e411610062578063e06174e4146108f3578063f2fde38b14610914578063f332b1ae14610933575f80fd5b8063cda4c40814610896578063d505accf146108b5578063dd62ed3e146108d4575f80fd5b8063a9059cbb116100b7578063a9059cbb14610850578063a965a51b1461086f578063c3342e5614610877575f80fd5b806395d89b411461081d578063a457c2d714610831575f80fd5b80637ecebe00116101265780638980f11f1161010c5780638980f11f146107965780638cd92b0a146107b55780638da5cb5b146107d4575f80fd5b80637ecebe001461075057806384b0196e1461076f575f80fd5b8063715018a611610156578063715018a61461070957806373b9aa911461071d5780637c0f1ee71461073c575f80fd5b80636e2ad758146106cb57806370a08231146106ea575f80fd5b80633644e5151161021a578063573fb1ba116101d05780635dab2420116101b65780635dab2420146105fa5780636cb077721461068d5780636d84249b146106ac575f80fd5b8063573fb1ba146105c757806359a945e9146105e6575f80fd5b806342966c681161020057806342966c681461056a5780634a97c9c0146105895780634c2babef146105a8575f80fd5b80633644e51514610537578063395093511461054b575f80fd5b806323b872dd1161026f57806330adf81f1161025557806330adf81f14610467578063313ce5671461049a57806332fe7b26146104df575f80fd5b806323b872dd14610404578063307aebc914610423575f80fd5b8063095ea7b31161029f578063095ea7b31461035357806317ede0de1461038257806318160ddd146103a1575f80fd5b80630614117a146102c457806306fdde03146102da575f80fd5b366102c057005b5f80fd5b3480156102cf575f80fd5b506102d8610947565b005b3480156102e5575f80fd5b50604080516080810182525f8082529181018281527f0000000000000000000000000000000000000000000000000000000000000000601f830152815182016020018051605f84015283905251606090820101919091525b60405161034a91906146e1565b60405180910390f35b34801561035e575f80fd5b5061037261036d366004614714565b610b1b565b604051901515815260200161034a565b34801561038d575f80fd5b506102d861039c36600461474b565b610b31565b3480156103ac575f80fd5b507f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000000547401000000000000000000000000000000000000000090046bffffffffffffffffffffffff165b60405190815260200161034a565b34801561040f575f80fd5b5061037261041e366004614766565b610c47565b34801561042e575f80fd5b507f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000001546a0100000000000000000000900460ff16610372565b348015610472575f80fd5b506103f67f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b3480156104a5575f80fd5b506104cd7f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff909116815260200161034a565b3480156104ea575f80fd5b506105127f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161034a565b348015610542575f80fd5b506103f6610cb0565b348015610556575f80fd5b50610372610565366004614714565b610da9565b348015610575575f80fd5b506102d86105843660046147a4565b610e2f565b348015610594575f80fd5b506103726105a33660046147d1565b610e43565b3480156105b3575f80fd5b506103726105c2366004614804565b610e64565b3480156105d2575f80fd5b506103f66105e13660046147a4565b610e73565b3480156105f1575f80fd5b506102d8611017565b348015610605575f80fd5b5061060e611075565b60405161034a91905f60a08201905061ffff835116825267ffffffffffffffff602084015116602083015269ffffffffffffffffffff60408401511660408301526bffffffffffffffffffffffff606084015116606083015273ffffffffffffffffffffffffffffffffffffffff608084015116608083015292915050565b348015610698575f80fd5b506103726106a7366004614853565b6110a8565b3480156106b7575f80fd5b506103726106c636600461491c565b6110b2565b3480156106d6575f80fd5b506103726106e5366004614935565b6110c0565b3480156106f5575f80fd5b506103f661070436600461495e565b6110d6565b348015610714575f80fd5b506102d8611123565b348015610728575f80fd5b5061060e61073736600461495e565b611136565b348015610747575f80fd5b506102d861121b565b34801561075b575f80fd5b506103f661076a36600461495e565b611225565b34801561077a575f80fd5b5061078361125c565b60405161034a9796959493929190614979565b3480156107a1575f80fd5b506102d86107b0366004614714565b61132e565b3480156107c0575f80fd5b506102d86107cf366004614a46565b61157e565b3480156107df575f80fd5b507f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000005473ffffffffffffffffffffffffffffffffffffffff16610512565b348015610828575f80fd5b5061033d6115a6565b34801561083c575f80fd5b5061037261084b366004614714565b611603565b34801561085b575f80fd5b5061037261086a366004614714565b6116de565b6102d86116ff565b348015610882575f80fd5b50610372610891366004614a70565b611bbb565b3480156108a1575f80fd5b506103726108b0366004614a95565b611bcd565b3480156108c0575f80fd5b506102d86108cf366004614ac7565b611bf7565b3480156108df575f80fd5b506103f66108ee366004614b30565b611e54565b3480156108fe575f80fd5b50610907611eac565b60405161034a9190614b9f565b34801561091f575f80fd5b506102d861092e36600461495e565b61203c565b34801561093e575f80fd5b506102d861209c565b60408051610180810182527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002805460ff8116835261010080820461ffff908116602086015263010000008304811685870152650100000000008304811660608087019190915267010000000000000084048216608087015269010000000000000000008404821660a08701526b0100000000000000000000008404821660c08701526d01000000000000000000000000008404821660e08701526f0100000000000000000000000000000084048216928601929092527101000000000000000000000000000000000083041661012085015273010000000000000000000000000000000000000090910462ffffff166101408401528351908101938490525f93610160840191907f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000039060039082845b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610a965750505050508152505090505f479050610b178183610140015162ffffff168461016001515f60038110610af557610af5614c92565b602002015173ffffffffffffffffffffffffffffffffffffffff1691906120ed565b5050565b5f610b2733848461217d565b5060015b92915050565b610b3961218f565b7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000028115610b925780547fffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ff166601f401f401f40017905550565b80546101f4908290600190610bb1908490610100900461ffff16614cec565b92506101000a81548161ffff021916908361ffff1602179055506101f4815f0160038282829054906101000a900461ffff16610bed9190614cec565b92506101000a81548161ffff021916908361ffff1602179055506101f4815f0160058282829054906101000a900461ffff16610c299190614cec565b92506101000a81548161ffff021916908361ffff1602179055505050565b5f80610c51612259565b9050610c5c81612262565b610c8c57610c6b8582856122a7565b610c848585856bffffffffffffffffffffffff1661238d565b915050610ca9565b610c848585856bffffffffffffffffffffffff166001612396565b505b9392505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610d8457610d7f604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b5f80610db3612259565b9050610e25818585610e16858973ffffffffffffffffffffffffffffffffffffffff9182165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000086020908152604080832093909416825291909152205490565b610e209190614d0e565b61217d565b5060019392505050565b610e40610e3a612259565b8261268e565b50565b5f610ca973ffffffffffffffffffffffffffffffffffffffff841683612802565b5f610b2b8262ffffff1661289b565b5f80610e9b610e80612259565b73ffffffffffffffffffffffffffffffffffffffff16612961565b80549091506a0100000000000000000000900469ffffffffffffffffffff165f03610fc7577f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000001805469ffffffffffffffffffff16905f610efa83614d21565b825469ffffffffffffffffffff9182166101009390930a928302928202191691909117909155825491166a0100000000000000000000027fffffffffffffffffffffffff00000000000000000000ffffffffffffffffffff909116178155600181015473ffffffffffffffffffffffffffffffffffffffff16610fc757610f7f612259565b6001820180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff929092169190911790555b805460405184916a0100000000000000000000900469ffffffffffffffffffff169033907f7d842667f749a5ac61180c742c62d621c78c94d961bfa60567a499ee28ffa4ab905f90a45090919050565b61101f61218f565b7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000180547fffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff166a0100000000000000000000179055565b6040805160a0810182525f80825260208201819052918101829052606081018290526080810191909152610d7f33611136565b5f610b2b826129a9565b5f610b2b8261ffff16612a50565b5f610b2b8269ffffffffffffffffffff16612b13565b5f6110f68273ffffffffffffffffffffffffffffffffffffffff16612961565b547401000000000000000000000000000000000000000090046bffffffffffffffffffffffff1692915050565b61112b61218f565b6111345f612c51565b565b6040805160a0810182525f8082526020820181905291810182905260608101829052608081019190915261117f8273ffffffffffffffffffffffffffffffffffffffff16612961565b6040805160a081018252825461ffff8116825262010000810467ffffffffffffffff1660208301526a0100000000000000000000810469ffffffffffffffffffff1692820192909252740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff16606082015260019091015473ffffffffffffffffffffffffffffffffffffffff16608082015292915050565b611134305f61132e565b5f6112458273ffffffffffffffffffffffffffffffffffffffff16612961565b5462010000900467ffffffffffffffff1692915050565b5f6060805f805f60606112ae7f000000000000000000000000000000000000000000000000000000000000000060606040519050604081016040525f815281601f8201525f8151602083010152919050565b6040805180820182525f8082527f0000000000000000000000000000000000000000000000000000000000000000601f83015281516020908301810182905283518281529081019093527f0f000000000000000000000000000000000000000000000000000000000000009b939a50909850469750309650945092509050565b60408051610180810182527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002805460ff8116835261010080820461ffff908116602086015263010000008304811685870152650100000000008304811660608087019190915267010000000000000084048216608087015269010000000000000000008404821660a08701526b0100000000000000000000008404821660c08701526d01000000000000000000000000008404821660e08701526f0100000000000000000000000000000084048216928601929092527101000000000000000000000000000000000083041661012085015273010000000000000000000000000000000000000090910462ffffff166101408401528351908101938490525f93610160840191907f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000039060039082845b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161147d5750505050508152505090505f825f146114c0578261154c565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8516906370a0823190602401602060405180830381865afa158015611528573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061154c9190614d49565b610160830151519091506115789073ffffffffffffffffffffffffffffffffffffffff86169083612d0a565b50505050565b61158661218f565b610b1773ffffffffffffffffffffffffffffffffffffffff831682612dd9565b604080516080810182525f8082529181018281527f0000000000000000000000000000000000000000000000000000000000000000601f830152815182016020018051605f84015283905280516060908301810193909352610b2b565b5f8061160d612259565b73ffffffffffffffffffffffffffffffffffffffff8181165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000086020908152604080832093891683529290522054909150838110156116c6576040517ff8e06db200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8616600482015260248101829052604481018590526064015b60405180910390fd5b6116d3828686840361217d565b506001949350505050565b5f610e256116ea612259565b84846bffffffffffffffffffffffff1661238d565b7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000180547fffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff166b01000000000000000000000017905561175c61218f565b7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c69ffffffffffff5f611787306110d6565b90506117d5307f00000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5f612e3b565b61180130307fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5f612e3b565b6040517ff305d7190000000000000000000000000000000000000000000000000000000081523060048201819052602482018390525f60448301819052606483015260848201524260a48201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063f305d71990349060c40160606040518083038185885af11580156118ad573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906118d29190614d60565b5050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561193e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119629190614d8b565b73ffffffffffffffffffffffffffffffffffffffff1663e6a43905307f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119e7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a0b9190614d8b565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff928316600482015291166024820152604401602060405180830381865afa158015611a79573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a9d9190614d8b565b82547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff919091169081178355611ae890612f01565b508154611b0a9073ffffffffffffffffffffffffffffffffffffffff16613068565b8154611b4f90309073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5f612e3b565b50505f611b797f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c69ffffffffffff90565b60020180549115156b010000000000000000000000027fffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff909216919091179055565b5f610b2b8265ffffffffffff1661308f565b5f611bef73ffffffffffffffffffffffffffffffffffffffff851684846131a1565b949350505050565b83421115611c31576040517f1a15a3cc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6001611cc47f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a611c6483613263565b60408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810188905260e00160405160208183030381529060405280519060200120613314565b604080515f8152602081018083529290925260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015611d0f573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81161580611d8957508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b15611dc0576040517f815e1d6400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff9081165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000008602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b73ffffffffffffffffffffffffffffffffffffffff8083165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000860209081526040808320938516835292905290812054610ca9565b611eb46145ee565b60408051610180810182527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002805460ff8116835261010080820461ffff908116602086015263010000008304811685870152650100000000008304811660608087019190915267010000000000000084048216608087015269010000000000000000008404821660a08701526b0100000000000000000000008404821660c08701526d01000000000000000000000000008404821660e08701526f0100000000000000000000000000000084048216928601929092527101000000000000000000000000000000000083041661012085015273010000000000000000000000000000000000000090910462ffffff16610140840152835190810193849052919290916101608401917f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000039060039082845b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161200457505050505081525050905090565b61204461218f565b73ffffffffffffffffffffffffffffffffffffffff8116612093576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024016116bd565b610e4081612c51565b6120a461218f565b7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b604080515f80825260208201909252819073ffffffffffffffffffffffffffffffffffffffff861690849086906040516121279190614da6565b5f60405180830381858888f193505050503d805f8114612162576040519150601f19603f3d011682016040523d82523d5f602084013e612167565b606091505b50915091506121768282613375565b5050505050565b61218a8383836001612e3b565b505050565b612197612259565b73ffffffffffffffffffffffffffffffffffffffff166121eb7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff16146111345761220e612259565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016116bd565b5f610d7f6133d0565b5f6122828273ffffffffffffffffffffffffffffffffffffffff16613436565b80610b2b5750610b2b8273ffffffffffffffffffffffffffffffffffffffff166134f4565b73ffffffffffffffffffffffffffffffffffffffff8381165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000860209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611578578181101561237f576040517f192b9e4e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260248101829052604481018390526064016116bd565b61157884848484035f612e3b565b5f611bef8484845f5b5f73ffffffffffffffffffffffffffffffffffffffff85166123e6576040517f4c14f64c0000000000000000000000000000000000000000000000000000000081525f60048201526024016116bd565b73ffffffffffffffffffffffffffffffffffffffff8416612435576040517f9cfea5830000000000000000000000000000000000000000000000000000000081525f60048201526024016116bd565b73ffffffffffffffffffffffffffffffffffffffff8581165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000660205260408082208784168352912060018201547f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c69ffffffffffff93166124ce576124cc8873ffffffffffffffffffffffffffffffffffffffff16612f01565b505b600181015473ffffffffffffffffffffffffffffffffffffffff1661250e5761250c8773ffffffffffffffffffffffffffffffffffffffff16612f01565b505b6040805160a08082018352845461ffff808216845267ffffffffffffffff62010000808404821660208088019190915269ffffffffffffffffffff6a01000000000000000000008087048216898b01526bffffffffffffffffffffffff740100000000000000000000000000000000000000009788900481166060808c01919091526001808f015473ffffffffffffffffffffffffffffffffffffffff9081166080808f01919091528e519c8d018f528f549a8b168d52978a04909816958b01959095529187049092169988019990995294909304909316958401959095528501549093169281019290925260028501545f9283928392612626928992918d9060ff6b010000000000000000000000909104166135b2565b925092509250825f0361264e5761263f85858b8b6139c9565b60019650505050505050611bef565b6126628561265b30612961565b858b6139c9565b80156126715761267181613b56565b61267d8585848b6139c9565b5060019a9950505050505050505050565b5f6126ae8373ffffffffffffffffffffffffffffffffffffffff16612961565b80549091506bffffffffffffffffffffffff74010000000000000000000000000000000000000000909104811690831611156126e8575f80fd5b80546bffffffffffffffffffffffff7401000000000000000000000000000000000000000080830482168590039091160273ffffffffffffffffffffffffffffffffffffffff9091161781558161275c7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c69ffffffffffff90565b60010180546bffffffffffffffffffffffff740100000000000000000000000000000000000000008083048216949094031690920273ffffffffffffffffffffffffffffffffffffffff9283161790556040515f918516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906127f59086906bffffffffffffffffffffffff91909116815260200190565b60405180910390a3505050565b335f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000066020819052604082205461ffff811690614000811661800090911617156116d357620100008410612857575f80fd5b5f85815260208390526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661ffff8616179055506001949350505050565b335f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000006602081905260408220547f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002919061ffff811690614000811661800090911617156116d35762e4e1c18510612913575f80fd5b82547fffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffff16609886901b74ffff0000000000000000000000000000000000000016178355506001949350505050565b73ffffffffffffffffffffffffffffffffffffffff81165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000660205260408120610b2b565b335f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000006602081905260408220547f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002919061ffff811690614000811661800090911617156116d357602085015160408601516060870151821582158215171715612a33575f80fd5b600186019290925560028501556003840155506001949350505050565b335f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000006602081905260408220547f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002919061ffff811690614000811661800090911617156116d3576127118510612ac7575f80fd5b82547fffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffff16608886901b72ffff000000000000000000000000000000000016178355506001949350505050565b335f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000006602081905260408220547f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002919061ffff811690614000811661800090911617156116d3578460401c61ffff8660301c1661ffff8760201c1661ffff8860101c1661ffff89168082848688010101016127108114612bb4575f80fd5b5087545f5b6005811015612c3e5761ffff603860108302011b5f828015612bfa5760018114612c025760028114612c0a5760038114612c125760048114612c1a57612c1e565b899150612c1e565b889150612c1e565b879150612c1e565b869150612c1e565b8591505b508181601085026038011b16821985161793505050600181019050612bb9565b5088555050505050506001949350505050565b7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000080547fffffffffffffffffffffffff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff8481169182179093556040517f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c69ffffffffffff939092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291515f92839290871691612da09190614da6565b5f604051808303815f865af19150503d805f8114612162576040519150601f19603f3d011682016040523d82523d5f602084013e612167565b610b1781612dfc8473ffffffffffffffffffffffffffffffffffffffff16612961565b9081547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00008116600160ff939093169290921b61ffff9182161816179055565b73ffffffffffffffffffffffffffffffffffffffff8481165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000008602090815260408083209387168352929052208290558015611578578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051612ef391815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff81165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000006602052604081207f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000001805491927f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c69ffffffffffff92612fa09069ffffffffffffffffffff16614d21565b825469ffffffffffffffffffff9182166101009390930a838102908302199091161790925583546a01000000000000000000009182027fffffffffffffffffffffffff00000000000000000000ffffffffffffffffffff9091161780855560018501805473ffffffffffffffffffffffffffffffffffffffff9097167fffffffffffffffffffffffff000000000000000000000000000000000000000097881681179091559190049091165f9081526008909201602052604090912080549093161790915590565b610e4061308a8273ffffffffffffffffffffffffffffffffffffffff16612961565b6144a8565b335f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000006602081905260408220547f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002919061ffff811690614000811661800090911617156116d3578460201c61ffff8660101c1661ffff87166103e98110156103e98310156103e9851015171715613127575f80fd5b85545f5b60038110156131905761ffff600860108302011b5f82801561315c5760018114613164576002811461316c57613170565b879150613170565b869150613170565b8591505b508181601085026008011b1682198516179350505060018101905061312b565b508655505050506001949350505050565b335f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000066020819052604082205461ffff8116906140008116618000909116176131eb575f80fd5b50600191505b82841015610ca7575f61320486866144b5565b90506132258173ffffffffffffffffffffffffffffffffffffffff16612f01565b5073ffffffffffffffffffffffffffffffffffffffff81165f9081526020839052604090206132579060096001614520565b506001909301926131f1565b5f806132848373ffffffffffffffffffffffffffffffffffffffff16612961565b805490915067ffffffffffffffff620100009091048116106132c75780547fffffffffffffffffffffffffffffffffffffffffffff0000000000000000ffff1681555b80547fffffffffffffffffffffffffffffffffffffffffffff0000000000000000ffff8116620100009182900467ffffffffffffffff908116600181019091169092021790915592915050565b5f61331d610cb0565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b81801561339a57508051158061339a57508080602001905181019061339a9190614dc1565b610b17576040517f2b96f51300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f303303613430575f80368080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050505036015173ffffffffffffffffffffffffffffffffffffffff1691506134339050565b50335b90565b5f610b2b6134598373ffffffffffffffffffffffffffffffffffffffff16612961565b6040805160a081018252825461ffff8116825262010000810467ffffffffffffffff1660208301526a0100000000000000000000810469ffffffffffffffffffff1692820192909252740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff16606082015260019091015473ffffffffffffffffffffffffffffffffffffffff16608082015261457b565b5f610b2b6135178373ffffffffffffffffffffffffffffffffffffffff16612961565b6040805160a081018252825461ffff8116825262010000810467ffffffffffffffff1660208301526a0100000000000000000000810469ffffffffffffffffffff1692820192909252740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff16606082015260019091015473ffffffffffffffffffffffffffffffffffffffff16608082015261458d565b5f805f6135be8761459f565b806135cd57506135cd8661459f565b806135d55750835b156135e757505f9150839050816139be565b604080516101808101825260038a8101805460ff8116845261010080820461ffff908116602087015263010000008304811686880152650100000000008304811660608088019190915267010000000000000084048216608088015269010000000000000000008404821660a08801526b0100000000000000000000008404821660c08801526d01000000000000000000000000008404821660e08801526f0100000000000000000000000000000084048216928701929092527101000000000000000000000000000000000083041661012086015273010000000000000000000000000000000000000090910462ffffff166101408501528451908101948590525f94919261016085019260048f01919082845b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116136fc5750505050508152505090505f613746825160808082161491607f90911690565b5060028b01549091506a0100000000000000000000900460ff166137c35761376e89896145b1565b1561379157506020015161271061ffff909116860204925050508083035f6139be565b6040517f8a716db100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6137cc886145ca565b6138c1576127106137dc8a6145ca565b6137fe576137ea8a8a6145b1565b6137f8578260600151613804565b5f613804565b82602001515b61ffff1688028161381757613817614ddc565b049450848703935080156138bc576a066f0222d28f57292400006bffffffffffffffffffffffff168489606001516bffffffffffffffffffffffff160111156138bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f46616972204c696d69742045786365656465640000000000000000000000000060448201526064016116bd565b6139bb565b6138d98980515f90600160079190911c811614610b2b565b1561390a576138f0670de0b6b3a764000088614e09565b94506138fc8588614e09565b9493508392506139be915050565b60408201516127109061ffff1688020494505f82610120015161ffff1611613963578461393630612961565b547401000000000000000000000000000000000000000090046bffffffffffffffffffffffff16016139b3565b61012082015160018b0154612710916bffffffffffffffffffffffff74010000000000000000000000000000000000000000909204821661ffff919091160216046bffffffffffffffffffffffff165b925084870393505b50505b955095509592505050565b835482906bffffffffffffffffffffffff7401000000000000000000000000000000000000000090910481169082161115613a8457600185015485546040517fdb42144d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90921660048301527401000000000000000000000000000000000000000090046bffffffffffffffffffffffff9081166024830152821660448201526064016116bd565b84546bffffffffffffffffffffffff7401000000000000000000000000000000000000000080830482168490038216810273ffffffffffffffffffffffffffffffffffffffff9384161788558654818104831685019092160291161784558161217657600184810154908601546040516bffffffffffffffffffffffff8416815273ffffffffffffffffffffffffffffffffffffffff92831692909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050505050565b7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000180546b0100000000000000000000007fffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff909116811790915560408051610180810182527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002805460ff8116835261ffff6101008083048216602086015263010000008304821685870152650100000000008304821660608087019190915267010000000000000084048316608087015269010000000000000000008404831660a0870152968304821660c08601526d01000000000000000000000000008304821660e08601526f0100000000000000000000000000000083048216908501527101000000000000000000000000000000000082041661012084015262ffffff730100000000000000000000000000000000000000909104166101408301528251938401928390525f93919290916101608401917f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000039060039082845b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311613cf15750505050508152505090505f600267ffffffffffffffff811115613d4157613d41614826565b604051908082528060200260200182016040528015613d6a578160200160208202803683370190505b50905030815f81518110613d8057613d80614c92565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613e23573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e479190614d8b565b81600181518110613e5a57613e5a614c92565b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101525f613e8930612961565b546bffffffffffffffffffffffff74010000000000000000000000000000000000000000909104811691505f9085168211613ec45784613ec6565b815b6101008501519091505f906127109061ffff1615613f4d5760028161ffff1687610100015161ffff1685026bffffffffffffffffffffffff1681613f0c57613f0c614ddc565b046bffffffffffffffffffffffff1681613f2857613f28614ddc565b0491508183039250600286610100015161ffff1681613f4957613f49614ddc565b0490035b6040517f791ac947000000000000000000000000000000000000000000000000000000008152479073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063791ac94790613fc99087905f908b9030904290600401614e1c565b5f604051808303815f87803b158015613fe0575f80fd5b505af1158015613ff2573d5f803e3d5ffd5b505050505f8082470390505f805f805f8d60e0015161ffff161115614040578761ffff168d60e0015161ffff1686026bffffffffffffffffffffffff168161403c5761403c614ddc565b0493505b60c08d015161ffff161561407d578761ffff168d60c0015161ffff1686026bffffffffffffffffffffffff168161407957614079614ddc565b0492505b60a08d015161ffff16156140ba578761ffff168d60a0015161ffff1686026bffffffffffffffffffffffff16816140b6576140b6614ddc565b0491505b60808d015161ffff16156140f7578761ffff168d6080015161ffff1686026bffffffffffffffffffffffff16816140f3576140f3614ddc565b0490505b6bffffffffffffffffffffffff84161561411557614115308561268e565b6bffffffffffffffffffffffff8116156141ac576101608d0151516101408e015160405173ffffffffffffffffffffffffffffffffffffffff9092169162ffffff909116906bffffffffffffffffffffffff8416905f818181858888f193505050503d805f81146141a1576040519150601f19603f3d011682016040523d82523d5f602084013e6141a6565b606091505b50909650505b6bffffffffffffffffffffffff821615614247576101608d01516001602002015173ffffffffffffffffffffffffffffffffffffffff16826bffffffffffffffffffffffff168e610140015162ffffff16906040515f60405180830381858888f193505050503d805f811461423c576040519150601f19603f3d011682016040523d82523d5f602084013e614241565b606091505b50909650505b6bffffffffffffffffffffffff8316156142e2576101608d01516002602002015173ffffffffffffffffffffffffffffffffffffffff16836bffffffffffffffffffffffff168e610140015162ffffff16906040515f60405180830381858888f193505050503d805f81146142d7576040519150601f19603f3d011682016040523d82523d5f602084013e6142dc565b606091505b50909650505b6bffffffffffffffffffffffff891615614430575f60028961ffff168f610100015161ffff1688026bffffffffffffffffffffffff168161432557614325614ddc565b046bffffffffffffffffffffffff168161434157614341614ddc565b6040517ff305d71900000000000000000000000000000000000000000000000000000000815230600482018190526bffffffffffffffffffffffff8e811660248401525f60448401819052606484015260848301919091524260a483015292909104925073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169163f305d719919084169060c40160606040518083038185885af1158015614406573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061442b9190614d60565b505050505b505050505050505050505050505f6144657f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c69ffffffffffff90565b60020180549115156b010000000000000000000000027fffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff90921691909117905550565b610e4081600a6001614520565b5f607f82116144e057825f526094600b5360d6600a5381821560071b17602053506017600a20610b2b565b60085b82811c156144f3576008016144e3565b60031c828152600884901b5f5260808101601f536094600a538060d6016009536017016009209392505050565b80614539578254600160ff84161b191661ffff16614548565b825461ffff16600160ff84161b175b83547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661ffff91909116179092555050565b80515f90600d1c600190811614610b2b565b80515f90600e1c600190811614610b2b565b80515f90600b1c600190811614610b2b565b5f6145bb836145dc565b80610ca95750610ca9826145dc565b80515f90600a1c600190811614610b2b565b80515f9060091c600190811614610b2b565b60408051610180810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101919091526101608101614653614658565b905290565b60405180606001604052806003906020820280368337509192915050565b5f5b83811015614690578181015183820152602001614678565b50505f910152565b5f81518084526146af816020860160208601614676565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f610ca96020830184614698565b73ffffffffffffffffffffffffffffffffffffffff81168114610e40575f80fd5b5f8060408385031215614725575f80fd5b8235614730816146f3565b946020939093013593505050565b8015158114610e40575f80fd5b5f6020828403121561475b575f80fd5b8135610ca98161473e565b5f805f60608486031215614778575f80fd5b8335614783816146f3565b92506020840135614793816146f3565b929592945050506040919091013590565b5f602082840312156147b4575f80fd5b5035919050565b803561ffff811681146147cc575f80fd5b919050565b5f80604083850312156147e2575f80fd5b82356147ed816146f3565b91506147fb602084016147bb565b90509250929050565b5f60208284031215614814575f80fd5b813562ffffff81168114610ca9575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f60208284031215614863575f80fd5b813567ffffffffffffffff8082111561487a575f80fd5b818401915084601f83011261488d575f80fd5b81358181111561489f5761489f614826565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156148e5576148e5614826565b816040528281528760208487010111156148fd575f80fd5b826020860160208301375f928101602001929092525095945050505050565b5f6020828403121561492c575f80fd5b610ca9826147bb565b5f60208284031215614945575f80fd5b813569ffffffffffffffffffff81168114610ca9575f80fd5b5f6020828403121561496e575f80fd5b8135610ca9816146f3565b7fff00000000000000000000000000000000000000000000000000000000000000881681525f602060e0818401526149b460e084018a614698565b83810360408501526149c6818a614698565b6060850189905273ffffffffffffffffffffffffffffffffffffffff8816608086015260a0850187905284810360c086015285518082528387019250908301905f5b81811015614a2457835183529284019291840191600101614a08565b50909c9b505050505050505050505050565b803560ff811681146147cc575f80fd5b5f8060408385031215614a57575f80fd5b8235614a62816146f3565b91506147fb60208401614a36565b5f60208284031215614a80575f80fd5b813565ffffffffffff81168114610ca9575f80fd5b5f805f60608486031215614aa7575f80fd5b8335614ab2816146f3565b95602085013595506040909401359392505050565b5f805f805f805f60e0888a031215614add575f80fd5b8735614ae8816146f3565b96506020880135614af8816146f3565b95506040880135945060608801359350614b1460808901614a36565b925060a0880135915060c0880135905092959891949750929550565b5f8060408385031215614b41575f80fd5b8235614b4c816146f3565b91506020830135614b5c816146f3565b809150509250929050565b805f5b600381101561157857815173ffffffffffffffffffffffffffffffffffffffff16845260209384019390910190600101614b6a565b815160ff1681526101c081016020830151614bc0602084018261ffff169052565b506040830151614bd6604084018261ffff169052565b506060830151614bec606084018261ffff169052565b506080830151614c02608084018261ffff169052565b5060a0830151614c1860a084018261ffff169052565b5060c0830151614c2e60c084018261ffff169052565b5060e0830151614c4460e084018261ffff169052565b506101008381015161ffff9081169184019190915261012080850151909116908301526101408084015162ffffff169083015261016080840151614c8a82850182614b67565b505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b61ffff828116828216039080821115614d0757614d07614cbf565b5092915050565b80820180821115610b2b57610b2b614cbf565b5f69ffffffffffffffffffff808316818103614d3f57614d3f614cbf565b6001019392505050565b5f60208284031215614d59575f80fd5b5051919050565b5f805f60608486031215614d72575f80fd5b8351925060208401519150604084015190509250925092565b5f60208284031215614d9b575f80fd5b8151610ca9816146f3565b5f8251614db7818460208701614676565b9190910192915050565b5f60208284031215614dd1575f80fd5b8151610ca98161473e565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b81810381811115610b2b57610b2b614cbf565b5f60a082016bffffffffffffffffffffffff881683526020878185015260a0604085015281875180845260c08601915082890193505f5b81811015614e8557845173ffffffffffffffffffffffffffffffffffffffff1683529383019391830191600101614e53565b505073ffffffffffffffffffffffffffffffffffffffff96909616606085015250505060800152939250505056fea264697066735822122041538c3d9f8f1ed9ff8558b8aedd846eac5d416720baba78b5955a865154181e64736f6c634300081500330f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000060f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c69ffffffffffff000000000000000000000000c86749f1b42127f45e1858c640beceb986195b740000000000000000000000004cac613ca65e64ff7a275695227b4899c9017166


Deployed Bytecode

0x6080604052600436106102b9575f3560e01c80636e2ad7581161017057806395d89b41116100d1578063cda4c40811610087578063e06174e411610062578063e06174e4146108f3578063f2fde38b14610914578063f332b1ae14610933575f80fd5b8063cda4c40814610896578063d505accf146108b5578063dd62ed3e146108d4575f80fd5b8063a9059cbb116100b7578063a9059cbb14610850578063a965a51b1461086f578063c3342e5614610877575f80fd5b806395d89b411461081d578063a457c2d714610831575f80fd5b80637ecebe00116101265780638980f11f1161010c5780638980f11f146107965780638cd92b0a146107b55780638da5cb5b146107d4575f80fd5b80637ecebe001461075057806384b0196e1461076f575f80fd5b8063715018a611610156578063715018a61461070957806373b9aa911461071d5780637c0f1ee71461073c575f80fd5b80636e2ad758146106cb57806370a08231146106ea575f80fd5b80633644e5151161021a578063573fb1ba116101d05780635dab2420116101b65780635dab2420146105fa5780636cb077721461068d5780636d84249b146106ac575f80fd5b8063573fb1ba146105c757806359a945e9146105e6575f80fd5b806342966c681161020057806342966c681461056a5780634a97c9c0146105895780634c2babef146105a8575f80fd5b80633644e51514610537578063395093511461054b575f80fd5b806323b872dd1161026f57806330adf81f1161025557806330adf81f14610467578063313ce5671461049a57806332fe7b26146104df575f80fd5b806323b872dd14610404578063307aebc914610423575f80fd5b8063095ea7b31161029f578063095ea7b31461035357806317ede0de1461038257806318160ddd146103a1575f80fd5b80630614117a146102c457806306fdde03146102da575f80fd5b366102c057005b5f80fd5b3480156102cf575f80fd5b506102d8610947565b005b3480156102e5575f80fd5b50604080516080810182525f8082529181018281527f08544753706f7274730554474245540000000000000000000000000000000000601f830152815182016020018051605f84015283905251606090820101919091525b60405161034a91906146e1565b60405180910390f35b34801561035e575f80fd5b5061037261036d366004614714565b610b1b565b604051901515815260200161034a565b34801561038d575f80fd5b506102d861039c36600461474b565b610b31565b3480156103ac575f80fd5b507f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000000547401000000000000000000000000000000000000000090046bffffffffffffffffffffffff165b60405190815260200161034a565b34801561040f575f80fd5b5061037261041e366004614766565b610c47565b34801561042e575f80fd5b507f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000001546a0100000000000000000000900460ff16610372565b348015610472575f80fd5b506103f67f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b3480156104a5575f80fd5b506104cd7f000000000000000000000000000000000000000000000000000000000000001281565b60405160ff909116815260200161034a565b3480156104ea575f80fd5b506105127f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161034a565b348015610542575f80fd5b506103f6610cb0565b348015610556575f80fd5b50610372610565366004614714565b610da9565b348015610575575f80fd5b506102d86105843660046147a4565b610e2f565b348015610594575f80fd5b506103726105a33660046147d1565b610e43565b3480156105b3575f80fd5b506103726105c2366004614804565b610e64565b3480156105d2575f80fd5b506103f66105e13660046147a4565b610e73565b3480156105f1575f80fd5b506102d8611017565b348015610605575f80fd5b5061060e611075565b60405161034a91905f60a08201905061ffff835116825267ffffffffffffffff602084015116602083015269ffffffffffffffffffff60408401511660408301526bffffffffffffffffffffffff606084015116606083015273ffffffffffffffffffffffffffffffffffffffff608084015116608083015292915050565b348015610698575f80fd5b506103726106a7366004614853565b6110a8565b3480156106b7575f80fd5b506103726106c636600461491c565b6110b2565b3480156106d6575f80fd5b506103726106e5366004614935565b6110c0565b3480156106f5575f80fd5b506103f661070436600461495e565b6110d6565b348015610714575f80fd5b506102d8611123565b348015610728575f80fd5b5061060e61073736600461495e565b611136565b348015610747575f80fd5b506102d861121b565b34801561075b575f80fd5b506103f661076a36600461495e565b611225565b34801561077a575f80fd5b5061078361125c565b60405161034a9796959493929190614979565b3480156107a1575f80fd5b506102d86107b0366004614714565b61132e565b3480156107c0575f80fd5b506102d86107cf366004614a46565b61157e565b3480156107df575f80fd5b507f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000005473ffffffffffffffffffffffffffffffffffffffff16610512565b348015610828575f80fd5b5061033d6115a6565b34801561083c575f80fd5b5061037261084b366004614714565b611603565b34801561085b575f80fd5b5061037261086a366004614714565b6116de565b6102d86116ff565b348015610882575f80fd5b50610372610891366004614a70565b611bbb565b3480156108a1575f80fd5b506103726108b0366004614a95565b611bcd565b3480156108c0575f80fd5b506102d86108cf366004614ac7565b611bf7565b3480156108df575f80fd5b506103f66108ee366004614b30565b611e54565b3480156108fe575f80fd5b50610907611eac565b60405161034a9190614b9f565b34801561091f575f80fd5b506102d861092e36600461495e565b61203c565b34801561093e575f80fd5b506102d861209c565b60408051610180810182527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002805460ff8116835261010080820461ffff908116602086015263010000008304811685870152650100000000008304811660608087019190915267010000000000000084048216608087015269010000000000000000008404821660a08701526b0100000000000000000000008404821660c08701526d01000000000000000000000000008404821660e08701526f0100000000000000000000000000000084048216928601929092527101000000000000000000000000000000000083041661012085015273010000000000000000000000000000000000000090910462ffffff166101408401528351908101938490525f93610160840191907f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000039060039082845b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610a965750505050508152505090505f479050610b178183610140015162ffffff168461016001515f60038110610af557610af5614c92565b602002015173ffffffffffffffffffffffffffffffffffffffff1691906120ed565b5050565b5f610b2733848461217d565b5060015b92915050565b610b3961218f565b7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000028115610b925780547fffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ff166601f401f401f40017905550565b80546101f4908290600190610bb1908490610100900461ffff16614cec565b92506101000a81548161ffff021916908361ffff1602179055506101f4815f0160038282829054906101000a900461ffff16610bed9190614cec565b92506101000a81548161ffff021916908361ffff1602179055506101f4815f0160058282829054906101000a900461ffff16610c299190614cec565b92506101000a81548161ffff021916908361ffff1602179055505050565b5f80610c51612259565b9050610c5c81612262565b610c8c57610c6b8582856122a7565b610c848585856bffffffffffffffffffffffff1661238d565b915050610ca9565b610c848585856bffffffffffffffffffffffff166001612396565b505b9392505050565b5f7f00000000000000000000000000000000000000000000000000000000000000014614610d8457610d7f604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527fcd1ca7f0843055e98948d20cbc1512438bb42b21eed98ba77ef669a7e9c71ac5918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b905090565b507f2134ab8a4d6a2cc22cfe3c493ec54aa5c74427d8ce58c35f45d2b7ba6d38ab2790565b5f80610db3612259565b9050610e25818585610e16858973ffffffffffffffffffffffffffffffffffffffff9182165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000086020908152604080832093909416825291909152205490565b610e209190614d0e565b61217d565b5060019392505050565b610e40610e3a612259565b8261268e565b50565b5f610ca973ffffffffffffffffffffffffffffffffffffffff841683612802565b5f610b2b8262ffffff1661289b565b5f80610e9b610e80612259565b73ffffffffffffffffffffffffffffffffffffffff16612961565b80549091506a0100000000000000000000900469ffffffffffffffffffff165f03610fc7577f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000001805469ffffffffffffffffffff16905f610efa83614d21565b825469ffffffffffffffffffff9182166101009390930a928302928202191691909117909155825491166a0100000000000000000000027fffffffffffffffffffffffff00000000000000000000ffffffffffffffffffff909116178155600181015473ffffffffffffffffffffffffffffffffffffffff16610fc757610f7f612259565b6001820180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff929092169190911790555b805460405184916a0100000000000000000000900469ffffffffffffffffffff169033907f7d842667f749a5ac61180c742c62d621c78c94d961bfa60567a499ee28ffa4ab905f90a45090919050565b61101f61218f565b7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000180547fffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff166a0100000000000000000000179055565b6040805160a0810182525f80825260208201819052918101829052606081018290526080810191909152610d7f33611136565b5f610b2b826129a9565b5f610b2b8261ffff16612a50565b5f610b2b8269ffffffffffffffffffff16612b13565b5f6110f68273ffffffffffffffffffffffffffffffffffffffff16612961565b547401000000000000000000000000000000000000000090046bffffffffffffffffffffffff1692915050565b61112b61218f565b6111345f612c51565b565b6040805160a0810182525f8082526020820181905291810182905260608101829052608081019190915261117f8273ffffffffffffffffffffffffffffffffffffffff16612961565b6040805160a081018252825461ffff8116825262010000810467ffffffffffffffff1660208301526a0100000000000000000000810469ffffffffffffffffffff1692820192909252740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff16606082015260019091015473ffffffffffffffffffffffffffffffffffffffff16608082015292915050565b611134305f61132e565b5f6112458273ffffffffffffffffffffffffffffffffffffffff16612961565b5462010000900467ffffffffffffffff1692915050565b5f6060805f805f60606112ae7f08544753706f727473000000000000000000000000000000000000000000000060606040519050604081016040525f815281601f8201525f8151602083010152919050565b6040805180820182525f8082527f0131000000000000000000000000000000000000000000000000000000000000601f83015281516020908301810182905283518281529081019093527f0f000000000000000000000000000000000000000000000000000000000000009b939a50909850469750309650945092509050565b60408051610180810182527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002805460ff8116835261010080820461ffff908116602086015263010000008304811685870152650100000000008304811660608087019190915267010000000000000084048216608087015269010000000000000000008404821660a08701526b0100000000000000000000008404821660c08701526d01000000000000000000000000008404821660e08701526f0100000000000000000000000000000084048216928601929092527101000000000000000000000000000000000083041661012085015273010000000000000000000000000000000000000090910462ffffff166101408401528351908101938490525f93610160840191907f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000039060039082845b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161147d5750505050508152505090505f825f146114c0578261154c565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8516906370a0823190602401602060405180830381865afa158015611528573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061154c9190614d49565b610160830151519091506115789073ffffffffffffffffffffffffffffffffffffffff86169083612d0a565b50505050565b61158661218f565b610b1773ffffffffffffffffffffffffffffffffffffffff831682612dd9565b604080516080810182525f8082529181018281527f08544753706f7274730554474245540000000000000000000000000000000000601f830152815182016020018051605f84015283905280516060908301810193909352610b2b565b5f8061160d612259565b73ffffffffffffffffffffffffffffffffffffffff8181165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000086020908152604080832093891683529290522054909150838110156116c6576040517ff8e06db200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8616600482015260248101829052604481018590526064015b60405180910390fd5b6116d3828686840361217d565b506001949350505050565b5f610e256116ea612259565b84846bffffffffffffffffffffffff1661238d565b7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000180547fffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff166b01000000000000000000000017905561175c61218f565b7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c69ffffffffffff5f611787306110d6565b90506117d5307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5f612e3b565b61180130307fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5f612e3b565b6040517ff305d7190000000000000000000000000000000000000000000000000000000081523060048201819052602482018390525f60448301819052606483015260848201524260a48201527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff169063f305d71990349060c40160606040518083038185885af11580156118ad573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906118d29190614d60565b5050507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561193e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119629190614d8b565b73ffffffffffffffffffffffffffffffffffffffff1663e6a43905307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119e7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a0b9190614d8b565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff928316600482015291166024820152604401602060405180830381865afa158015611a79573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a9d9190614d8b565b82547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff919091169081178355611ae890612f01565b508154611b0a9073ffffffffffffffffffffffffffffffffffffffff16613068565b8154611b4f90309073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5f612e3b565b50505f611b797f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c69ffffffffffff90565b60020180549115156b010000000000000000000000027fffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff909216919091179055565b5f610b2b8265ffffffffffff1661308f565b5f611bef73ffffffffffffffffffffffffffffffffffffffff851684846131a1565b949350505050565b83421115611c31576040517f1a15a3cc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6001611cc47f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a611c6483613263565b60408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810188905260e00160405160208183030381529060405280519060200120613314565b604080515f8152602081018083529290925260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015611d0f573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81161580611d8957508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b15611dc0576040517f815e1d6400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff9081165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000008602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b73ffffffffffffffffffffffffffffffffffffffff8083165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000860209081526040808320938516835292905290812054610ca9565b611eb46145ee565b60408051610180810182527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002805460ff8116835261010080820461ffff908116602086015263010000008304811685870152650100000000008304811660608087019190915267010000000000000084048216608087015269010000000000000000008404821660a08701526b0100000000000000000000008404821660c08701526d01000000000000000000000000008404821660e08701526f0100000000000000000000000000000084048216928601929092527101000000000000000000000000000000000083041661012085015273010000000000000000000000000000000000000090910462ffffff16610140840152835190810193849052919290916101608401917f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000039060039082845b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161200457505050505081525050905090565b61204461218f565b73ffffffffffffffffffffffffffffffffffffffff8116612093576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024016116bd565b610e4081612c51565b6120a461218f565b7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b604080515f80825260208201909252819073ffffffffffffffffffffffffffffffffffffffff861690849086906040516121279190614da6565b5f60405180830381858888f193505050503d805f8114612162576040519150601f19603f3d011682016040523d82523d5f602084013e612167565b606091505b50915091506121768282613375565b5050505050565b61218a8383836001612e3b565b505050565b612197612259565b73ffffffffffffffffffffffffffffffffffffffff166121eb7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff16146111345761220e612259565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016116bd565b5f610d7f6133d0565b5f6122828273ffffffffffffffffffffffffffffffffffffffff16613436565b80610b2b5750610b2b8273ffffffffffffffffffffffffffffffffffffffff166134f4565b73ffffffffffffffffffffffffffffffffffffffff8381165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000860209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611578578181101561237f576040517f192b9e4e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260248101829052604481018390526064016116bd565b61157884848484035f612e3b565b5f611bef8484845f5b5f73ffffffffffffffffffffffffffffffffffffffff85166123e6576040517f4c14f64c0000000000000000000000000000000000000000000000000000000081525f60048201526024016116bd565b73ffffffffffffffffffffffffffffffffffffffff8416612435576040517f9cfea5830000000000000000000000000000000000000000000000000000000081525f60048201526024016116bd565b73ffffffffffffffffffffffffffffffffffffffff8581165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000660205260408082208784168352912060018201547f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c69ffffffffffff93166124ce576124cc8873ffffffffffffffffffffffffffffffffffffffff16612f01565b505b600181015473ffffffffffffffffffffffffffffffffffffffff1661250e5761250c8773ffffffffffffffffffffffffffffffffffffffff16612f01565b505b6040805160a08082018352845461ffff808216845267ffffffffffffffff62010000808404821660208088019190915269ffffffffffffffffffff6a01000000000000000000008087048216898b01526bffffffffffffffffffffffff740100000000000000000000000000000000000000009788900481166060808c01919091526001808f015473ffffffffffffffffffffffffffffffffffffffff9081166080808f01919091528e519c8d018f528f549a8b168d52978a04909816958b01959095529187049092169988019990995294909304909316958401959095528501549093169281019290925260028501545f9283928392612626928992918d9060ff6b010000000000000000000000909104166135b2565b925092509250825f0361264e5761263f85858b8b6139c9565b60019650505050505050611bef565b6126628561265b30612961565b858b6139c9565b80156126715761267181613b56565b61267d8585848b6139c9565b5060019a9950505050505050505050565b5f6126ae8373ffffffffffffffffffffffffffffffffffffffff16612961565b80549091506bffffffffffffffffffffffff74010000000000000000000000000000000000000000909104811690831611156126e8575f80fd5b80546bffffffffffffffffffffffff7401000000000000000000000000000000000000000080830482168590039091160273ffffffffffffffffffffffffffffffffffffffff9091161781558161275c7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c69ffffffffffff90565b60010180546bffffffffffffffffffffffff740100000000000000000000000000000000000000008083048216949094031690920273ffffffffffffffffffffffffffffffffffffffff9283161790556040515f918516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906127f59086906bffffffffffffffffffffffff91909116815260200190565b60405180910390a3505050565b335f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000066020819052604082205461ffff811690614000811661800090911617156116d357620100008410612857575f80fd5b5f85815260208390526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661ffff8616179055506001949350505050565b335f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000006602081905260408220547f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002919061ffff811690614000811661800090911617156116d35762e4e1c18510612913575f80fd5b82547fffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffff16609886901b74ffff0000000000000000000000000000000000000016178355506001949350505050565b73ffffffffffffffffffffffffffffffffffffffff81165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000660205260408120610b2b565b335f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000006602081905260408220547f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002919061ffff811690614000811661800090911617156116d357602085015160408601516060870151821582158215171715612a33575f80fd5b600186019290925560028501556003840155506001949350505050565b335f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000006602081905260408220547f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002919061ffff811690614000811661800090911617156116d3576127118510612ac7575f80fd5b82547fffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffff16608886901b72ffff000000000000000000000000000000000016178355506001949350505050565b335f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000006602081905260408220547f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002919061ffff811690614000811661800090911617156116d3578460401c61ffff8660301c1661ffff8760201c1661ffff8860101c1661ffff89168082848688010101016127108114612bb4575f80fd5b5087545f5b6005811015612c3e5761ffff603860108302011b5f828015612bfa5760018114612c025760028114612c0a5760038114612c125760048114612c1a57612c1e565b899150612c1e565b889150612c1e565b879150612c1e565b869150612c1e565b8591505b508181601085026038011b16821985161793505050600181019050612bb9565b5088555050505050506001949350505050565b7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000080547fffffffffffffffffffffffff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff8481169182179093556040517f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c69ffffffffffff939092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291515f92839290871691612da09190614da6565b5f604051808303815f865af19150503d805f8114612162576040519150601f19603f3d011682016040523d82523d5f602084013e612167565b610b1781612dfc8473ffffffffffffffffffffffffffffffffffffffff16612961565b9081547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00008116600160ff939093169290921b61ffff9182161816179055565b73ffffffffffffffffffffffffffffffffffffffff8481165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000008602090815260408083209387168352929052208290558015611578578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051612ef391815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff81165f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000006602052604081207f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000001805491927f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c69ffffffffffff92612fa09069ffffffffffffffffffff16614d21565b825469ffffffffffffffffffff9182166101009390930a838102908302199091161790925583546a01000000000000000000009182027fffffffffffffffffffffffff00000000000000000000ffffffffffffffffffff9091161780855560018501805473ffffffffffffffffffffffffffffffffffffffff9097167fffffffffffffffffffffffff000000000000000000000000000000000000000097881681179091559190049091165f9081526008909201602052604090912080549093161790915590565b610e4061308a8273ffffffffffffffffffffffffffffffffffffffff16612961565b6144a8565b335f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000006602081905260408220547f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002919061ffff811690614000811661800090911617156116d3578460201c61ffff8660101c1661ffff87166103e98110156103e98310156103e9851015171715613127575f80fd5b85545f5b60038110156131905761ffff600860108302011b5f82801561315c5760018114613164576002811461316c57613170565b879150613170565b869150613170565b8591505b508181601085026008011b1682198516179350505060018101905061312b565b508655505050506001949350505050565b335f9081527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000066020819052604082205461ffff8116906140008116618000909116176131eb575f80fd5b50600191505b82841015610ca7575f61320486866144b5565b90506132258173ffffffffffffffffffffffffffffffffffffffff16612f01565b5073ffffffffffffffffffffffffffffffffffffffff81165f9081526020839052604090206132579060096001614520565b506001909301926131f1565b5f806132848373ffffffffffffffffffffffffffffffffffffffff16612961565b805490915067ffffffffffffffff620100009091048116106132c75780547fffffffffffffffffffffffffffffffffffffffffffff0000000000000000ffff1681555b80547fffffffffffffffffffffffffffffffffffffffffffff0000000000000000ffff8116620100009182900467ffffffffffffffff908116600181019091169092021790915592915050565b5f61331d610cb0565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b81801561339a57508051158061339a57508080602001905181019061339a9190614dc1565b610b17576040517f2b96f51300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f303303613430575f80368080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050505036015173ffffffffffffffffffffffffffffffffffffffff1691506134339050565b50335b90565b5f610b2b6134598373ffffffffffffffffffffffffffffffffffffffff16612961565b6040805160a081018252825461ffff8116825262010000810467ffffffffffffffff1660208301526a0100000000000000000000810469ffffffffffffffffffff1692820192909252740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff16606082015260019091015473ffffffffffffffffffffffffffffffffffffffff16608082015261457b565b5f610b2b6135178373ffffffffffffffffffffffffffffffffffffffff16612961565b6040805160a081018252825461ffff8116825262010000810467ffffffffffffffff1660208301526a0100000000000000000000810469ffffffffffffffffffff1692820192909252740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff16606082015260019091015473ffffffffffffffffffffffffffffffffffffffff16608082015261458d565b5f805f6135be8761459f565b806135cd57506135cd8661459f565b806135d55750835b156135e757505f9150839050816139be565b604080516101808101825260038a8101805460ff8116845261010080820461ffff908116602087015263010000008304811686880152650100000000008304811660608088019190915267010000000000000084048216608088015269010000000000000000008404821660a08801526b0100000000000000000000008404821660c08801526d01000000000000000000000000008404821660e08801526f0100000000000000000000000000000084048216928701929092527101000000000000000000000000000000000083041661012086015273010000000000000000000000000000000000000090910462ffffff166101408501528451908101948590525f94919261016085019260048f01919082845b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116136fc5750505050508152505090505f613746825160808082161491607f90911690565b5060028b01549091506a0100000000000000000000900460ff166137c35761376e89896145b1565b1561379157506020015161271061ffff909116860204925050508083035f6139be565b6040517f8a716db100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6137cc886145ca565b6138c1576127106137dc8a6145ca565b6137fe576137ea8a8a6145b1565b6137f8578260600151613804565b5f613804565b82602001515b61ffff1688028161381757613817614ddc565b049450848703935080156138bc576a066f0222d28f57292400006bffffffffffffffffffffffff168489606001516bffffffffffffffffffffffff160111156138bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f46616972204c696d69742045786365656465640000000000000000000000000060448201526064016116bd565b6139bb565b6138d98980515f90600160079190911c811614610b2b565b1561390a576138f0670de0b6b3a764000088614e09565b94506138fc8588614e09565b9493508392506139be915050565b60408201516127109061ffff1688020494505f82610120015161ffff1611613963578461393630612961565b547401000000000000000000000000000000000000000090046bffffffffffffffffffffffff16016139b3565b61012082015160018b0154612710916bffffffffffffffffffffffff74010000000000000000000000000000000000000000909204821661ffff919091160216046bffffffffffffffffffffffff165b925084870393505b50505b955095509592505050565b835482906bffffffffffffffffffffffff7401000000000000000000000000000000000000000090910481169082161115613a8457600185015485546040517fdb42144d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90921660048301527401000000000000000000000000000000000000000090046bffffffffffffffffffffffff9081166024830152821660448201526064016116bd565b84546bffffffffffffffffffffffff7401000000000000000000000000000000000000000080830482168490038216810273ffffffffffffffffffffffffffffffffffffffff9384161788558654818104831685019092160291161784558161217657600184810154908601546040516bffffffffffffffffffffffff8416815273ffffffffffffffffffffffffffffffffffffffff92831692909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050505050565b7f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a00000000000180546b0100000000000000000000007fffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff909116811790915560408051610180810182527f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a000000000002805460ff8116835261ffff6101008083048216602086015263010000008304821685870152650100000000008304821660608087019190915267010000000000000084048316608087015269010000000000000000008404831660a0870152968304821660c08601526d01000000000000000000000000008304821660e08601526f0100000000000000000000000000000083048216908501527101000000000000000000000000000000000082041661012084015262ffffff730100000000000000000000000000000000000000909104166101408301528251938401928390525f93919290916101608401917f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c6a0000000000039060039082845b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311613cf15750505050508152505090505f600267ffffffffffffffff811115613d4157613d41614826565b604051908082528060200260200182016040528015613d6a578160200160208202803683370190505b50905030815f81518110613d8057613d80614c92565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613e23573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e479190614d8b565b81600181518110613e5a57613e5a614c92565b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101525f613e8930612961565b546bffffffffffffffffffffffff74010000000000000000000000000000000000000000909104811691505f9085168211613ec45784613ec6565b815b6101008501519091505f906127109061ffff1615613f4d5760028161ffff1687610100015161ffff1685026bffffffffffffffffffffffff1681613f0c57613f0c614ddc565b046bffffffffffffffffffffffff1681613f2857613f28614ddc565b0491508183039250600286610100015161ffff1681613f4957613f49614ddc565b0490035b6040517f791ac947000000000000000000000000000000000000000000000000000000008152479073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac94790613fc99087905f908b9030904290600401614e1c565b5f604051808303815f87803b158015613fe0575f80fd5b505af1158015613ff2573d5f803e3d5ffd5b505050505f8082470390505f805f805f8d60e0015161ffff161115614040578761ffff168d60e0015161ffff1686026bffffffffffffffffffffffff168161403c5761403c614ddc565b0493505b60c08d015161ffff161561407d578761ffff168d60c0015161ffff1686026bffffffffffffffffffffffff168161407957614079614ddc565b0492505b60a08d015161ffff16156140ba578761ffff168d60a0015161ffff1686026bffffffffffffffffffffffff16816140b6576140b6614ddc565b0491505b60808d015161ffff16156140f7578761ffff168d6080015161ffff1686026bffffffffffffffffffffffff16816140f3576140f3614ddc565b0490505b6bffffffffffffffffffffffff84161561411557614115308561268e565b6bffffffffffffffffffffffff8116156141ac576101608d0151516101408e015160405173ffffffffffffffffffffffffffffffffffffffff9092169162ffffff909116906bffffffffffffffffffffffff8416905f818181858888f193505050503d805f81146141a1576040519150601f19603f3d011682016040523d82523d5f602084013e6141a6565b606091505b50909650505b6bffffffffffffffffffffffff821615614247576101608d01516001602002015173ffffffffffffffffffffffffffffffffffffffff16826bffffffffffffffffffffffff168e610140015162ffffff16906040515f60405180830381858888f193505050503d805f811461423c576040519150601f19603f3d011682016040523d82523d5f602084013e614241565b606091505b50909650505b6bffffffffffffffffffffffff8316156142e2576101608d01516002602002015173ffffffffffffffffffffffffffffffffffffffff16836bffffffffffffffffffffffff168e610140015162ffffff16906040515f60405180830381858888f193505050503d805f81146142d7576040519150601f19603f3d011682016040523d82523d5f602084013e6142dc565b606091505b50909650505b6bffffffffffffffffffffffff891615614430575f60028961ffff168f610100015161ffff1688026bffffffffffffffffffffffff168161432557614325614ddc565b046bffffffffffffffffffffffff168161434157614341614ddc565b6040517ff305d71900000000000000000000000000000000000000000000000000000000815230600482018190526bffffffffffffffffffffffff8e811660248401525f60448401819052606484015260848301919091524260a483015292909104925073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169163f305d719919084169060c40160606040518083038185885af1158015614406573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061442b9190614d60565b505050505b505050505050505050505050505f6144657f0f7e96853a48444354344a7326458ae903e52bb86d9bb0f30c69ffffffffffff90565b60020180549115156b010000000000000000000000027fffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff90921691909117905550565b610e4081600a6001614520565b5f607f82116144e057825f526094600b5360d6600a5381821560071b17602053506017600a20610b2b565b60085b82811c156144f3576008016144e3565b60031c828152600884901b5f5260808101601f536094600a538060d6016009536017016009209392505050565b80614539578254600160ff84161b191661ffff16614548565b825461ffff16600160ff84161b175b83547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661ffff91909116179092555050565b80515f90600d1c600190811614610b2b565b80515f90600e1c600190811614610b2b565b80515f90600b1c600190811614610b2b565b5f6145bb836145dc565b80610ca95750610ca9826145dc565b80515f90600a1c600190811614610b2b565b80515f9060091c600190811614610b2b565b60408051610180810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101919091526101608101614653614658565b905290565b60405180606001604052806003906020820280368337509192915050565b5f5b83811015614690578181015183820152602001614678565b50505f910152565b5f81518084526146af816020860160208601614676565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f610ca96020830184614698565b73ffffffffffffffffffffffffffffffffffffffff81168114610e40575f80fd5b5f8060408385031215614725575f80fd5b8235614730816146f3565b946020939093013593505050565b8015158114610e40575f80fd5b5f6020828403121561475b575f80fd5b8135610ca98161473e565b5f805f60608486031215614778575f80fd5b8335614783816146f3565b92506020840135614793816146f3565b929592945050506040919091013590565b5f602082840312156147b4575f80fd5b5035919050565b803561ffff811681146147cc575f80fd5b919050565b5f80604083850312156147e2575f80fd5b82356147ed816146f3565b91506147fb602084016147bb565b90509250929050565b5f60208284031215614814575f80fd5b813562ffffff81168114610ca9575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f60208284031215614863575f80fd5b813567ffffffffffffffff8082111561487a575f80fd5b818401915084601f83011261488d575f80fd5b81358181111561489f5761489f614826565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156148e5576148e5614826565b816040528281528760208487010111156148fd575f80fd5b826020860160208301375f928101602001929092525095945050505050565b5f6020828403121561492c575f80fd5b610ca9826147bb565b5f60208284031215614945575f80fd5b813569ffffffffffffffffffff81168114610ca9575f80fd5b5f6020828403121561496e575f80fd5b8135610ca9816146f3565b7fff00000000000000000000000000000000000000000000000000000000000000881681525f602060e0818401526149b460e084018a614698565b83810360408501526149c6818a614698565b6060850189905273ffffffffffffffffffffffffffffffffffffffff8816608086015260a0850187905284810360c086015285518082528387019250908301905f5b81811015614a2457835183529284019291840191600101614a08565b50909c9b505050505050505050505050565b803560ff811681146147cc575f80fd5b5f8060408385031215614a57575f80fd5b8235614a62816146f3565b91506147fb60208401614a36565b5f60208284031215614a80575f80fd5b813565ffffffffffff81168114610ca9575f80fd5b5f805f60608486031215614aa7575f80fd5b8335614ab2816146f3565b95602085013595506040909401359392505050565b5f805f805f805f60e0888a031215614add575f80fd5b8735614ae8816146f3565b96506020880135614af8816146f3565b95506040880135945060608801359350614b1460808901614a36565b925060a0880135915060c0880135905092959891949750929550565b5f8060408385031215614b41575f80fd5b8235614b4c816146f3565b91506020830135614b5c816146f3565b809150509250929050565b805f5b600381101561157857815173ffffffffffffffffffffffffffffffffffffffff16845260209384019390910190600101614b6a565b815160ff1681526101c081016020830151614bc0602084018261ffff169052565b506040830151614bd6604084018261ffff169052565b506060830151614bec606084018261ffff169052565b506080830151614c02608084018261ffff169052565b5060a0830151614c1860a084018261ffff169052565b5060c0830151614c2e60c084018261ffff169052565b5060e0830151614c4460e084018261ffff169052565b506101008381015161ffff9081169184019190915261012080850151909116908301526101408084015162ffffff169083015261016080840151614c8a82850182614b67565b505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b61ffff828116828216039080821115614d0757614d07614cbf565b5092915050565b80820180821115610b2b57610b2b614cbf565b5f69ffffffffffffffffffff808316818103614d3f57614d3f614cbf565b6001019392505050565b5f60208284031215614d59575f80fd5b5051919050565b5f805f60608486031215614d72575f80fd5b8351925060208401519150604084015190509250925092565b5f60208284031215614d9b575f80fd5b8151610ca9816146f3565b5f8251614db7818460208701614676565b9190910192915050565b5f60208284031215614dd1575f80fd5b8151610ca98161473e565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b81810381811115610b2b57610b2b614cbf565b5f60a082016bffffffffffffffffffffffff881683526020878185015260a0604085015281875180845260c08601915082890193505f5b81811015614e8557845173ffffffffffffffffffffffffffffffffffffffff1683529383019391830191600101614e53565b505073ffffffffffffffffffffffffffffffffffffffff96909616606085015250505060800152939250505056fea264697066735822122041538c3d9f8f1ed9ff8558b8aedd846eac5d416720baba78b5955a865154181e64736f6c63430008150033

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

000000000000000000000000c86749f1b42127f45e1858c640beceb986195b740000000000000000000000004cac613ca65e64ff7a275695227b4899c9017166

-----Decoded View---------------
Arg [0] : marketing (address): 0xC86749F1B42127F45e1858c640BeCeb986195b74
Arg [1] : fee (address): 0x4CAc613CA65e64fF7A275695227b4899C9017166

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000c86749f1b42127f45e1858c640beceb986195b74
Arg [1] : 0000000000000000000000004cac613ca65e64ff7a275695227b4899c9017166


Deployed Bytecode Sourcemap

176610:4557:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;178624:195;;;;;;;;;;;;;:::i;:::-;;153425:110;;;;;;;;;;-1:-1:-1;136361:4:0;136355:11;;136536:18;;;136523:32;;-1:-1:-1;136611:18:0;;;136391;;;136643;;;153507:8;136740:4;136727:18;;136720:34;136825:14;;136801:39;;136818:4;136801:39;136795:46;;136775:18;;;136768:74;136895:50;;;136990:14;153464:19;136966:39;;;;136959:50;;;;153425:110;;;;;;;:::i;:::-;;;;;;;;154328:150;;;;;;;;;;-1:-1:-1;154328:150:0;;;;;:::i;:::-;;:::i;:::-;;;1473:14:1;;1466:22;1448:41;;1436:2;1421:18;154328:150:0;1308:187:1;180434:401:0;;;;;;;;;;-1:-1:-1;180434:401:0;;;;;:::i;:::-;;:::i;153667:99::-;;;;;;;;;;-1:-1:-1;153739:19:0;;;;;;;153667:99;;;2015:25:1;;;2003:2;1988:18;153667:99:0;1869:177:1;154486:411:0;;;;;;;;;;-1:-1:-1;154486:411:0;;;;;:::i;:::-;;:::i;180140:92::-;;;;;;;;;;-1:-1:-1;180208:16:0;;;;;;;180140:92;;151801:117;;;;;;;;;;-1:-1:-1;151801:117:0;151852:66;151801:117;;152015:31;;;;;;;;;;;;;;;;;;2946:4:1;2934:17;;;2916:36;;2904:2;2889:18;152015:31:0;2774:184:1;151971:35:0;;;;;;;;;;;;;;;;;;3158:42:1;3146:55;;;3128:74;;3116:2;3101:18;151971:35:0;2963:245:1;138622:179:0;;;;;;;;;;;;;:::i;154905:233::-;;;;;;;;;;-1:-1:-1;154905:233:0;;;;;:::i;:::-;;:::i;156691:93::-;;;;;;;;;;-1:-1:-1;156691:93:0;;;;;:::i;:::-;;:::i;162793:136::-;;;;;;;;;;-1:-1:-1;162793:136:0;;;;;:::i;:::-;;:::i;162377:88::-;;;;;;;;;;-1:-1:-1;162377:88:0;;;;;:::i;:::-;;:::i;178273:343::-;;;;;;;;;;-1:-1:-1;178273:343:0;;;;;:::i;:::-;;:::i;180240:84::-;;;;;;;;;;;;;:::i;178048:102::-;;;;;;;;;;;;;:::i;:::-;;;;;;4402:4:1;4444:3;4433:9;4429:19;4421:27;;4494:6;4485;4479:13;4475:26;4464:9;4457:45;4570:18;4562:4;4554:6;4550:17;4544:24;4540:49;4533:4;4522:9;4518:20;4511:79;4658:22;4650:4;4642:6;4638:17;4632:24;4628:53;4621:4;4610:9;4606:20;4599:83;4750:26;4742:4;4734:6;4730:17;4724:24;4720:57;4713:4;4702:9;4698:20;4691:87;4846:42;4838:4;4830:6;4826:17;4820:24;4816:73;4809:4;4798:9;4794:20;4787:103;4260:636;;;;;162677:108:0;;;;;;;;;;-1:-1:-1;162677:108:0;;;;;:::i;:::-;;:::i;162260:109::-;;;;;;;;;;-1:-1:-1;162260:109:0;;;;;:::i;:::-;;:::i;162575:94::-;;;;;;;;;;-1:-1:-1;162575:94:0;;;;;:::i;:::-;;:::i;153774:114::-;;;;;;;;;;-1:-1:-1;153774:114:0;;;;;:::i;:::-;;:::i;180843:97::-;;;;;;;;;;;;;:::i;178158:107::-;;;;;;;;;;-1:-1:-1;178158:107:0;;;;;:::i;:::-;;:::i;178827:82::-;;;;;;;;;;;;;:::i;154207:113::-;;;;;;;;;;-1:-1:-1;154207:113:0;;;;;:::i;:::-;;:::i;138809:591::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;178917:278::-;;;;;;;;;;-1:-1:-1;178917:278:0;;;;;:::i;:::-;;:::i;180009:123::-;;;;;;;;;;-1:-1:-1;180009:123:0;;;;;:::i;:::-;;:::i;177611:86::-;;;;;;;;;;-1:-1:-1;177676:13:0;;;;177611:86;;153543:116;;;;;;;;;;;;;:::i;155146:492::-;;;;;;;;;;-1:-1:-1;155146:492:0;;;;;:::i;:::-;;:::i;153896:154::-;;;;;;;;;;-1:-1:-1;153896:154:0;;;;;:::i;:::-;;:::i;179203:794::-;;;:::i;162473:94::-;;;;;;;;;;-1:-1:-1;162473:94:0;;;;;:::i;:::-;;:::i;162937:142::-;;;;;;;;;;-1:-1:-1;162937:142:0;;;;;:::i;:::-;;:::i;155646:1037::-;;;;;;;;;;-1:-1:-1;155646:1037:0;;;;;:::i;:::-;;:::i;154058:141::-;;;;;;;;;;-1:-1:-1;154058:141:0;;;;;:::i;:::-;;:::i;177939:101::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;180948:214::-;;;;;;;;;;-1:-1:-1;180948:214:0;;;;;:::i;:::-;;:::i;180332:94::-;;;;;;;;;;;;;:::i;178624:195::-;178666:38;;;;;;;;178688:16;178666:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;178666:38:0;;;;;;;178688:16;;178666:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;178715:14;178732:21;178715:38;;178764:47;178795:6;178803:3;:7;;;178764:47;;:3;:17;;;178782:1;178764:20;;;;;;;:::i;:::-;;;;;:30;;;:47;:30;:47::i;:::-;178655:164;;178624:195::o;154328:150::-;154396:4;154413:35;154422:10;154433:7;154441:6;154413:8;:35::i;:::-;-1:-1:-1;154466:4:0;154328:150;;;;;:::o;180434:401::-;177026:13;:11;:13::i;:::-;180528:16;180555:273;::::1;;;180588:16:::0;;180651:21;;;;;;-1:-1:-1;178624:195:0:o;180555:273::-:1;180717:17:::0;;180731:3:::1;::::0;180717:17;;:10:::1;::::0;:17:::1;::::0;180731:3;;180717:17:::1;::::0;::::1;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;180764:3;180749;:11;;;:18;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;180801:3;180782;:15;;;:22;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;180494:341;180434:401:::0;:::o;154486:411::-;154602:4;154619:15;154637:12;:10;:12::i;:::-;154619:30;;154665:22;154679:7;154665:13;:22::i;:::-;154660:230;;154704:36;154720:4;154725:7;154733:6;154704:15;:36::i;:::-;154762:35;154772:4;154778:2;154789:6;154762:35;;:9;:35::i;:::-;154755:42;;;;;154660:230;154837:41;154847:4;154853:2;154864:6;154837:41;;154873:4;154837:9;:41::i;154660:230::-;154608:289;154486:411;;;;;;:::o;138622:179::-;138679:7;138723:16;138706:13;:33;:87;;138769:24;139541:100;;;137839:66;139541:100;;;17366:25:1;139569:18:0;17407::1;;;17400:34;;;;139589:21:0;17450:18:1;;;17443:34;139612:13:0;17493:18:1;;;17486:34;139635:4:0;17536:19:1;;;17529:84;139473:7:0;;17338:19:1;;139541:100:0;;;;;;;;;;;;139513:143;;;;;;139493:163;;139408:256;;138769:24;138699:94;;138622:179;:::o;138706:87::-;-1:-1:-1;138742:24:0;;138622:179::o;154905:233::-;154987:4;155004:13;155020:12;:10;:12::i;:::-;155004:28;;155043:65;155052:5;155059:7;155097:10;155068:26;155079:5;155086:7;156893:34;;;;156867:7;156893:34;;;:27;:34;;;;;;;;:43;;;;;;;;;;;;;156792:152;155068:26;:39;;;;:::i;:::-;155043:8;:65::i;:::-;-1:-1:-1;155126:4:0;;154905:233;-1:-1:-1;;;154905:233:0:o;156691:93::-;156741:35;156747:12;:10;:12::i;:::-;156768:6;156741:5;:35::i;:::-;156691:93;:::o;162793:136::-;162863:4;162887:26;:19;;;162907:5;162887:19;:26::i;162377:88::-;162422:4;162446:11;:5;:9;;;:11::i;178273:343::-;178319:7;178339:20;178362:22;:12;:10;:12::i;:::-;:20;;;:22::i;:::-;178398:8;;;;-1:-1:-1;178398:8:0;;;;;;:13;178395:143;;178440:11;:13;;;;;:11;:13;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;178429:24;;;;;;;;;;;;;-1:-1:-1;178471:12:0;;;:26;:12;178468:58;;178514:12;:10;:12::i;:::-;178499;;;:27;;;;;;;;;;;;;;;178468:58;178575:8;;178553:35;;178585:2;;178575:8;;;;;;178563:10;;178553:35;;178575:8;;178553:35;-1:-1:-1;178606:2:0;;178273:343;-1:-1:-1;178273:343:0:o;180240:84::-;177026:13;:11;:13::i;:::-;180293:16;:23;;;::::1;::::0;::::1;::::0;;180240:84::o;178048:102::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;178123:19:0;178131:10;178123:7;:19::i;162677:108::-;162735:4;162759:18;:5;:16;:18::i;162260:109::-;162315:4;162339:22;:5;:20;;;:22::i;162575:94::-;162623:4;162647:14;:5;:12;;;:14::i;153774:114::-;153829:7;153856:16;:6;:14;;;:16::i;:::-;:24;;;;;;;;-1:-1:-1;;153774:114:0:o;180843:97::-;177026:13;:11;:13::i;:::-;180902:30:::1;180929:1;180902:18;:30::i;:::-;180843:97::o:0;178158:107::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;178243:14:0;:4;:12;;;:14::i;:::-;178236:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;178158:107:0:o;178827:82::-;178871:30;178892:4;178899:1;178871:12;:30::i;154207:113::-;154262:7;154289:16;:6;:14;;;:16::i;:::-;:23;;;;;;;;-1:-1:-1;;154207:113:0:o;138809:591::-;138912:13;138940:18;138973:21;139009:15;139039:25;139079:12;139106:27;139205:23;:11;134523:20;134642:4;134636:11;134626:21;;134756:4;134748:6;134744:17;134738:4;134731:31;134832:1;134824:6;134817:17;134918:6;134911:4;134903:6;134899:17;134892:33;135024:1;135014:6;135008:13;135001:4;134993:6;134989:17;134985:37;134978:48;134465:579;;;;139205:23;134642:4;134636:11;;134744:17;;;134731:31;;-1:-1:-1;134817:17:0;;;139243:14;134911:4;134899:17;;134892:33;135008:13;;135001:4;134985:37;;;;;134978:48;;;139365:16;;;;;;;;;;;139161:231;;;;-1:-1:-1;134636:11:0;;-1:-1:-1;139284:13:0;;-1:-1:-1;139320:4:0;;-1:-1:-1;;;139365:16:0;-1:-1:-1;139161:231:0;-1:-1:-1;138809:591:0:o;178917:278::-;178986:38;;;;;;;;179008:16;178986:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;178986:38:0;;;;;;;179008:16;;178986:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;179035:22;179060:6;179070:1;179060:11;:62;;179116:6;179060:62;;;179074:39;;;;;179107:4;179074:39;;;3128:74:1;179074:24:0;;;;;;3101:18:1;;179074:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;179150:17;;;;:20;179035:87;;-1:-1:-1;179133:54:0;;:16;;;;179035:87;179133:16;:54::i;:::-;178975:220;;178917:278;;:::o;180009:123::-;177026:13;:11;:13::i;:::-;180094:30:::1;:25;::::0;::::1;180120:3:::0;180094:25:::1;:30::i;153543:116::-:0;136361:4;136355:11;;136536:18;;;136523:32;;-1:-1:-1;136611:18:0;;;136391;;;136643;;;153631:8;136740:4;136727:18;;136720:34;136825:14;;136801:39;;136818:4;136801:39;136795:46;;136775:18;;;136768:74;136895:50;;;136990:14;;153584:21;136966:39;;;;;136959:50;;;;153631:20;136159:868;155146:492;155235:4;155252:13;155268:12;:10;:12::i;:::-;156893:34;;;;155291:24;156893:34;;;:27;:34;;;;;;;;:43;;;;;;;;;;:34;;-1:-1:-1;155359:36:0;;;155355:145;;;155419:69;;;;;14118:42:1;14106:55;;155419:69:0;;;14088:74:1;14178:18;;;14171:34;;;14221:18;;;14214:34;;;14061:18;;155419:69:0;;;;;;;;155355:145;155535:62;155544:5;155551:7;155579:17;155560:16;:36;155535:8;:62::i;:::-;-1:-1:-1;155626:4:0;;155146:492;-1:-1:-1;;;;155146:492:0:o;153896:154::-;153960:4;153977:43;153987:12;:10;:12::i;:::-;154001:2;154012:6;153977:43;;:9;:43::i;179203:794::-;152286:14;:21;;;;;;;;177026:13:::1;:11;:13::i;:::-;79828:76:::0;179275:20:::2;179339:24;179357:4;179339:9;:24::i;:::-;179316:47;;179374:65;179391:4;179406:6;179414:17;179433:5;179374:8;:65::i;:::-;179450:63;179467:4;179482;179488:17;179507:5;179450:8;:63::i;:::-;179524:196;::::0;;;;179587:4:::2;179524:196;::::0;::::2;14623:34:1::0;;;14673:18;;;14666:34;;;179634:1:0::2;14716:18:1::0;;;14709:34;;;14759:18;;;14752:34;14802:19;;;14795:44;179694:15:0::2;14855:19:1::0;;;14848:35;179524:6:0::2;:22;;::::0;::::2;::::0;179554:9:::2;::::0;14534:19:1;;179524:196:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;179762:6;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;179749:38;;;179796:4;179803:6;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;179749:68;::::0;;::::2;::::0;;;;;;15645:42:1;15714:15;;;179749:68:0::2;::::0;::::2;15696:34:1::0;15766:15;;15746:18;;;15739:43;15608:18;;179749:68:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;179731:87:::0;;;::::2;;::::0;;;::::2;::::0;;::::2;::::0;;179829:29:::2;::::0;:27:::2;:29::i;:::-;-1:-1:-1::0;179877:9:0;;179869:37:::2;::::0;179877:9:::2;;179869:35;:37::i;:::-;179953:9:::0;;179921:68:::2;::::0;179938:4:::2;::::0;179953:9:::2;;179964:17;179953:9;179921:8;:68::i;:::-;179264:733;;152347:5:::0;152330:7;79828:76;;138622:179;152330:7;:14;;:22;;;;;;;;;;;;;;;;;179203:794::o;162473:94::-;162521:4;162545:14;:5;:12;;;:14::i;162937:142::-;163019:4;163043:28;:15;;;163059:6;163066:4;163043:15;:28::i;:::-;163036:35;162937:142;-1:-1:-1;;;;162937:142:0:o;155646:1037::-;155871:8;155853:15;:26;155849:54;;;155888:15;;;;;;;;;;;;;;155849:54;155941:15;155959:498;155987:395;151852:66;156146:6;156183:7;156221:5;156257:17;156146:6;156257:9;:17::i;:::-;156059:281;;;;;;16080:25:1;;;;16124:42;16202:15;;;16182:18;;;16175:43;16254:15;;;;16234:18;;;16227:43;16286:18;;;16279:34;16329:19;;;16322:35;16373:19;;;16366:35;;;16052:19;;156059:281:0;;;;;;;;;;;;156023:340;;;;;;155987:13;:395::i;:::-;155959:498;;;;;;;;;;;;16639:25:1;;;;16712:4;16700:17;;16680:18;;;16673:45;16734:18;;;16727:34;;;16777:18;;;16770:34;;;16611:19;;155959:498:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;155959:498:0;;;;;;-1:-1:-1;;156478:21:0;;;;;:42;;;156514:6;156503:17;;:7;:17;;;;156478:42;156474:70;;;156529:15;;;;;;;;;;;;;;156474:70;156561:36;;;;;;;;:27;:36;;;;;;;;:45;;;;;;;;;;;;;:53;;;156643:32;2015:25:1;;;156561:45:0;;156643:32;;;;;1988:18:1;156643:32:0;;;;;;;155646:1037;;;;;;;:::o;154058:141::-;156893:34;;;;154139:7;156893:34;;;:27;:34;;;;;;;;:43;;;;;;;;;;;;154166:25;156792:152;177939:101;177981:15;;:::i;:::-;178009:23;;;;;;;;178016:16;178009:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;178016:16;;178009:23;;;;;;178016:16;;178009:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;177939:101;:::o;180948:214::-;177026:13;:11;:13::i;:::-;181027:22:::1;::::0;::::1;181023:93;;181073:31;::::0;::::1;::::0;;181101:1:::1;181073:31;::::0;::::1;3128:74:1::0;3101:18;;181073:31:0::1;2963:245:1::0;181023:93:0::1;181126:28;181145:8;181126:18;:28::i;180332:94::-:0;177026:13;:11;:13::i;:::-;180389:16;:29;;;::::1;::::0;;180332:94::o;30792:239::-;30958:12;;;30882;30958;;;;;;;;;30882;;30917:16;;;;30953:3;;30941:5;;30917:54;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30881:90;;;;30992:29;31007:7;31016:4;30992:14;:29::i;:::-;30860:171;;30792:239;;;:::o;163718:132::-;163804:38;163813:6;163821:7;163830:5;163837:4;163804:8;:38::i;:::-;163718:132;;;:::o;177445:158::-;177508:12;:10;:12::i;:::-;177497:23;;:7;177676:13;;;;;177611:86;177497:7;:23;;;177493:103;;177571:12;:10;:12::i;:::-;177544:40;;;;;3158:42:1;3146:55;;;177544:40:0;;;3128:74:1;3101:18;;177544:40:0;2963:245:1;101515:111:0;101568:7;101595:23;:21;:23::i;156952:140::-;157015:4;157039:20;:7;:18;;;:20::i;:::-;:45;;;;157063:21;:7;:19;;;:21::i;164160:478::-;156893:34;;;;164253:24;156893:34;;;:27;:34;;;;;;;;:43;;;;;;;;;;164342:17;164322:37;;164318:313;;164399:5;164380:16;:24;164376:127;;;164432:55;;;;;14118:42:1;14106:55;;164432::0;;;14088:74:1;14178:18;;;14171:34;;;14221:18;;;14214:34;;;14061:18;;164432:55:0;13886:368:1;164376:127:0;164546:58;164555:6;164563:7;164591:5;164572:16;:24;164598:5;164546:8;:58::i;157100:187::-;157213:12;157245:34;157255:4;157261:2;157265:6;157273:5;157295:1148;157434:12;157465:18;;;157461:56;;157492:25;;;;;157514:1;157492:25;;;3128:74:1;3101:18;;157492:25:0;2963:245:1;157461:56:0;157532:16;;;157528:56;;157557:27;;;;;157581:1;157557:27;;;3128:74:1;3101:18;;157557:27:0;2963:245:1;157528:56:0;96891:28;;;;157597:20;96891:28;;;:14;:28;;;;;;;;;;;;;157753:14;;;;79828:76;;157753:14;157749:49;;157783:15;:4;:13;;;:15::i;:::-;;157749:49;157815:17;;;;:31;:17;157811:50;;157848:13;:2;:11;;;:13::i;:::-;;157811:50;157935:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;158024:11;;;157875:17;;;;;;157935:111;;158024:4;;157935:111;158003:6;;158024:11;;;;;;157935:8;:111::i;:::-;157874:172;;;;;;158063:9;158076:1;158063:14;158059:119;;158094:46;158102:6;158110:9;158121:6;158129:10;158094:7;:46::i;:::-;158162:4;158155:11;;;;;;;;;;158059:119;158190:63;158198:6;158206:23;158214:4;158206:21;:23::i;:::-;158231:9;158242:10;158190:7;:63::i;:::-;158270:14;;158266:76;;158301:29;158318:10;158301:9;:29::i;:::-;158354:49;158362:6;158370:9;158381;158392:10;158354:7;:49::i;:::-;-1:-1:-1;158421:4:0;;157295:1148;-1:-1:-1;;;;;;;;;;157295:1148:0:o;163357:353::-;163421:23;163447:14;:4;:12;;;:14::i;:::-;163485:15;;163421:40;;-1:-1:-1;163485:15:0;;;;;;;163476:24;;;;163472:65;;;163517:8;;;163472:65;163572:25;;;;;;;;;;;;;;;;;;;;;;;163591:6;163612:7;79828:76;;138622:179;163612:7;:19;;:29;;;;;;;;;;;;;;;;;;;;;;;;163668:34;;-1:-1:-1;;163668:34:0;;;;;;;163695:6;;17799:26:1;17787:39;;;;17769:58;;17757:2;17742:18;;17624:209;163668:34:0;;;;;;;;163410:300;163357:353;;:::o;94955:907::-;95139:8;95024:11;95126:22;;;95076:15;95169:4;95162:35;;;95244:4;95228:21;;95222:28;95284:6;95275:16;;;95334:10;95325:20;;95355:10;95346:20;;;95322:45;95315:53;95305:509;;95409:5;95402;95399:16;95389:82;;95450:1;95447;95440:12;95389:82;95496:4;95489:21;;;95535:4;95528:35;;;95608:4;95592:21;;95641:10;;95730:9;95722:18;95688:6;95742:24;;95719:48;95785:14;;-1:-1:-1;95839:4:0;;94955:907;-1:-1:-1;;;;94955:907:0:o;93210:809::-;93419:8;93254:11;93406:22;;;93356:15;93449:4;93442:35;;;93524:4;93508:21;;93502:28;93302:15;;93356;93564:6;93555:16;;;93614:10;93605:20;;93635:10;93626:20;;;93602:45;93595:53;93585:386;;93689:8;93682:5;93679:19;93669:85;;93733:1;93730;93723:12;93669:85;93782:16;;93879:9;93871:18;93832:3;93895:15;;;93828:16;93891:26;93868:50;93936:20;;-1:-1:-1;93996:4:0;;93210:809;-1:-1:-1;;;;93210:809:0:o;96650:122::-;96891:28;;;96704:19;96891:28;;;:14;:28;;;;;96743:21;96780:147;94027:920;94249:8;94084:11;94236:22;;;94186:15;94279:4;94272:35;;;94354:4;94338:21;;94332:28;94132:15;;94186;94394:6;94385:16;;;94444:10;94435:20;;94465:10;94456:20;;;94432:45;94425:53;94415:484;;94525:4;94518:5;94514:16;94508:23;94575:4;94568:5;94564:16;94558:23;94625:4;94618:5;94614:16;94608:23;94688:1;94681:9;94676:1;94669:9;94665:1;94658:9;94655:24;94652:39;94649:97;;;94725:1;94722;94715:12;94649:97;94786:1;94771:17;;94764:28;;;;94832:1;94817:17;;94810:28;94878:1;94863:17;;94856:28;-1:-1:-1;94924:4:0;;94027:920;-1:-1:-1;;;;94027:920:0:o;92385:817::-;92605:8;92440:11;92592:22;;;92542:15;92635:4;92628:35;;;92710:4;92694:21;;92688:28;92488:15;;92542;92750:6;92741:16;;;92800:10;92791:20;;92821:10;92812:20;;;92788:45;92781:53;92771:383;;92875:5;92868;92865:16;92855:82;;92916:1;92913;92906:12;92855:82;92965:16;;93062:9;93054:18;93015:3;93078:15;;;93011:16;93074:26;93051:50;93119:20;;-1:-1:-1;93179:4:0;;92385:817;-1:-1:-1;;;;92385:817:0:o;90834:1543::-;91046:8;90881:11;91033:22;;;90983:15;91076:4;91069:35;;;91151:4;91135:21;;91129:28;90929:15;;90983;91191:6;91182:16;;;91241:10;91232:20;;91262:10;91253:20;;;91229:45;91222:53;91212:1118;;91314:5;91310:2;91306:14;91368:6;91360:5;91356:2;91352:14;91348:27;91423:6;91415:5;91411:2;91407:14;91403:27;91478:6;91470:5;91466:2;91462:14;91458:27;91524:6;91517:5;91513:18;91597:2;91592;91587;91582;91578;91574:11;91570:20;91566:29;91562:38;91638:5;91631;91628:16;91618:82;;91679:1;91676;91669:12;91618:82;;91734:9;91728:16;91777:1;91762:485;91787:1;91784;91781:8;91762:485;;;91869:6;91852:2;91863;91856:10;;91848:19;91844:32;91907:1;91860;91960:18;;;;92005:1;92000:18;;;;92045:1;92040:18;;;;92085:1;92080:18;;;;92125:1;92120:18;;;;91930:208;;91960:18;91974:2;91969:7;;91960:18;;92000;92014:2;92009:7;;92000:18;;92040;92054:2;92049:7;;92040:18;;92080;92094:2;92089:7;;92080:18;;92120;92134:2;92129:7;;91930:208;;92222:4;92218:1;92212:2;92209:1;92205:10;92201:2;92197:19;92193:27;92189:38;92181:4;92177:9;92173:2;92169:18;92166:62;92160:68;;;;91804:1;91801;91797:9;91792:14;;91762:485;;;-1:-1:-1;92295:20:0;;-1:-1:-1;;;;;;92355:4:0;;90834:1543;-1:-1:-1;;;;90834:1543:0:o;177705:226::-;177829:8;;;177848:19;;;177829:8;177848:19;;;;;;;;;177883:40;;79828:76;;177829:8;;;;;;177883:40;;177771:18;;177883:40;177760:171;;177705:226;:::o;31043:320::-;31221:77;;;31196:10;18030:55:1;;;31221:77:0;;;18012:74:1;18102:18;;;;18095:34;;;31221:77:0;;;;;;;;;;17985:18:1;;;;31221:77:0;;;;;;;;;31262:24;31221:77;;;31196:117;;-1:-1:-1;;;;31196:10:0;;;;:117;;31221:77;31196:117;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;87570;87642:37;87675:3;87642:15;:5;:13;;;:15::i;:::-;:32;89304:17;;89277:58;;;89325:1;:8;;;;;;;;;89304:17;;;;:30;89277:58;;;;89197:146;163858:294;164003:35;;;;;;;;:27;:35;;;;;;;;:44;;;;;;;;;:52;;;164066:79;;;;164118:7;164101:32;;164110:6;164101:32;;;164127:5;164101:32;;;;2015:25:1;;2003:2;1988:18;;1869:177;164101:32:0;;;;;;;;163858:294;;;;:::o;96935:262::-;97061:26;;;96985:19;97061:26;;;:11;:26;;;;;97110:6;97108:8;;97061:26;;79828:76;;97108:8;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;97098:18;;;;;;;;;;;;;;-1:-1:-1;97127:11:0;;:19;;;;;;;;;;;;;;;97173:7;;;;;;-1:-1:-1;97157:24:0;;;:15;;;;:24;;;;;;:32;;;;;;;;;97098:3;96935:262::o;86408:103::-;86469:34;:15;:5;:13;;;:15::i;:::-;:32;:34::i;89506:1320::-;89718:8;89553:11;89705:22;;;89655:15;89748:4;89741:35;;;89823:4;89807:21;;89801:28;89601:15;;89655;89863:6;89854:16;;;89913:10;89904:20;;89934:10;89925:20;;;89901:45;89894:53;89884:895;;89986:5;89982:2;89978:14;90040:6;90032:5;90028:2;90024:14;90020:27;90086:6;90079:5;90075:18;90179:4;90175:2;90172:12;90165:20;90156:4;90152:2;90149:12;90142:20;90134:4;90130:2;90127:12;90120:20;90117:46;90114:72;90111:130;;;90220:1;90217;90210:12;90111:130;90275:9;90269:16;90318:1;90303:403;90328:1;90325;90322:8;90303:403;;;90409:6;90393:1;90403:2;90396:10;;90389:18;90385:31;90447:1;90400;90500:18;;;;90545:1;90540:18;;;;90585:1;90580:18;;;;90470:128;;90500:18;90514:2;90509:7;;90500:18;;90540;90554:2;90549:7;;90540:18;;90580;90594:2;90589:7;;90470:128;;90681:4;90677:1;90671:2;90668:1;90664:10;90661:1;90657:18;90653:26;90649:37;90641:4;90637:9;90633:2;90629:18;90626:61;90620:67;;;;90345:1;90342;90338:9;90333:14;;90303:403;;;-1:-1:-1;90744:20:0;;-1:-1:-1;;;;90804:4:0;;89506:1320;-1:-1:-1;;;;89506:1320:0:o;95870:767::-;96063:8;95951:11;96050:22;;;96000:15;96093:4;96086:32;;;96165:4;96149:21;;96143:28;96205:6;96196:16;;;96248:10;96239:20;;96269:10;96260:20;;;96236:45;96226:103;;96312:1;96309;96302:12;96226:103;;96354:4;96344:14;;96379:251;96393:4;96384:6;:13;96379:251;;;96444:12;96459:23;96467:7;96475:6;96459:7;:23::i;:::-;96444:38;;96501:15;:4;:13;;;:15::i;:::-;-1:-1:-1;96535:19:0;;;:13;:19;;;;;;;;;;:41;;96569:1;96571:4;96535:33;:41::i;:::-;-1:-1:-1;96595:8:0;;;;;96379:251;;164646:266;164699:7;164719:23;164745:16;:6;:14;;;:16::i;:::-;164801:14;;164719:42;;-1:-1:-1;164819:16:0;164801:14;;;;;;:34;164797:58;;164837:18;;;;;;164797:58;164877:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;164646:266:0:o;139672:180::-;139746:7;139812:18;:16;:18::i;:::-;139783:60;;18410:66:1;139783:60:0;;;18398:79:1;18493:11;;;18486:27;;;;18529:12;;;18522:28;;;18566:12;;139783:60:0;;;;;;;;;;;;139773:71;;;;;;139766:78;;139672:180;;;:::o;32125:184::-;32212:6;:56;;;;-1:-1:-1;32223:11:0;;:16;;:44;;;32254:4;32243:24;;;;;;;;;;;;:::i;:::-;32206:95;;32291:10;;;;;;;;;;;;;;100773:424;100818:14;100871:4;100849:10;:27;100845:345;;100893:18;100914:8;;100893:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;100953:8:0;101031:17;101025:24;101069:42;101021:91;;-1:-1:-1;100845:345:0;;-1:-1:-1;100845:345:0;;-1:-1:-1;101168:10:0;100845:345;100773:424;:::o;84535:117::-;84592:4;84616:28;:15;:5;:13;;;:15::i;:::-;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:28::i;84662:119::-;84720:4;84744:29;:15;:5;:13;;;:15::i;:::-;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:29::i;81585:1924::-;81725:17;81744;81763:18;81797:19;:6;:17;:19::i;:::-;:45;;;;81820:22;:9;:20;:22::i;:::-;81797:57;;;;81846:8;81797:57;81794:88;;;-1:-1:-1;81866:1:0;;-1:-1:-1;81869:6:0;;-1:-1:-1;81866:1:0;81858:21;;81794:88;81892:38;;;;;;;;81919:11;;;;81892:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;81919:11:0;;81892:38;;;;;;;;81919:11;81892:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81942:13;81960:23;:8;83819:14;83864:3;83855:12;;;83854:21;;83901:3;83892:12;;;;83702:210;81960:23;-1:-1:-1;81998:11:0;;;;81941:42;;-1:-1:-1;81998:11:0;;;;;81994:390;;82029:25;82036:6;82044:9;82029:6;:25::i;:::-;82026:347;;;-1:-1:-1;82129:15:0;;;79952:5;82120:38;:24;;;;;:38;;-1:-1:-1;;;82193:16:0;;;82289:1;82260:31;;82026:347;82339:18;;;;;;;;;;;;;;82026:347;82398:25;:9;:23;:25::i;:::-;82394:1108;;79952:5;82513:22;:6;:20;:22::i;:::-;:116;;82578:24;82585:6;82592:9;82578:6;:24::i;:::-;:51;;82609:8;:20;;;82513:116;;82578:51;82605:1;82513:116;;;82538:8;:15;;;82513:116;82481:149;;:6;:149;:163;;;;;:::i;:::-;;82469:175;;82682:9;82675:6;:16;82663:28;;82714:8;82711:156;;;80002:16;82750:40;;82768:9;82750;:17;;;:27;;;:40;82747:99;;;82817:29;;;;;19230:2:1;82817:29:0;;;19212:21:1;19269:2;19249:18;;;19242:30;19308:21;19288:18;;;19281:49;19347:18;;82817:29:0;19028:343:1;82747:99:0;82394:1108;;;82927:17;:6;85931:17;;85126:4;;85959:1;85170;85931:24;;;;85930:30;;:35;85150:22;85827:146;82927:17;82924:186;;;82977:11;82984:4;82977:6;:11;:::i;:::-;82965:23;-1:-1:-1;83019:16:0;82965:23;83019:6;:16;:::i;:::-;83007:28;83073:9;-1:-1:-1;83073:9:0;;-1:-1:-1;83054:40:0;;-1:-1:-1;;83054:40:0;82924:186;83176:16;;;;79952:5;;83167:39;:25;;;:39;83155:51;;83268:1;83238:8;:27;;;:31;;;:178;;83407:9;83375:23;83383:4;83375:21;:23::i;:::-;:31;;;;;;:41;83238:178;;;83310:27;;;;83293:14;;;;79952:5;;83293:14;;;;;;;:58;:44;;;;;:58;;83238:178;;;83225:191;;83454:9;83447:6;:16;83435:28;;82394:1108;81783:1726;;81585:1924;;;;;;;;;;:::o;158451:503::-;158661:12;;158629:5;;158661:12;;;;;;;158652:21;;;;158648:116;;;158717:12;;;;158731;;158697:55;;;;;158717:12;;;;158697:55;;;19709:74:1;158731:12:0;;;;;;;19844:18:1;;;19837:43;19916:15;;19896:18;;;19889:43;19682:18;;158697:55:0;19509:429:1;158648:116:0;158801:22;;;;;;;;;;;;;;;;;;;;;;;158838:20;;;;;;;;;;;;;;;;;;158886:9;158882:62;;158925:10;;;;;158911:12;;;;158902:42;;17799:26:1;17787:39;;17769:58;;158925:10:0;;;;;158911:12;;;;158902:42;;17757:2:1;17742:18;158902:42:0;;;;;;;158593:361;158451:503;;;;:::o;158964:3288::-;152286:14;:21;;;;;;;;;;;;159049:43:::1;::::0;;::::1;::::0;::::1;::::0;;159076:16;159049:43;;::::1;::::0;::::1;::::0;;::::1;;::::0;;::::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;::::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;;159049:43:0;;159076:16;;159049:43;;;;;;159076:16:::1;::::0;159049:43;;::::1;::::0;;::::1;;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;;;;;;;::::0;::::1;;;159128:21;159166:1;159152:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;159152:16:0::1;;159128:40;;159201:4;159183;159188:1;159183:7;;;;;;;;:::i;:::-;;;;;;:23;;;;;;;;;::::0;::::1;159231:6;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;159221:4;159226:1;159221:7;;;;;;;;:::i;:::-;:23;::::0;;::::1;:7;::::0;;::::1;::::0;;;;;;;:23;159261:18:::1;159282:23;159290:4;159282:21;:23::i;:::-;:31:::0;::::1;::::0;;;::::1;::::0;::::1;::::0;-1:-1:-1;159282:31:0::1;::::0;159364:19;::::1;::::0;::::1;:41;;159400:5;159364:41;;;159386:11;159364:41;159507:27;::::0;::::1;::::0;159328:77;;-1:-1:-1;159420:22:0::1;::::0;159481:5:::1;::::0;159507:31:::1;;::::0;159503:273:::1;;159641:1;159624:14;159577:61;;159593:8;:27;;;159578:42;;:12;:42;159577:61;;;;;;;:::i;:::-;;:65;;;;;;;:::i;:::-;;159559:83;;159677:15;159661:31;;;;159759:1;159729:8;:27;;;:31;;;;;;;:::i;:::-;;159711:49:::0;::::1;159503:273;159859:212;::::0;;;;159822:21:::1;::::0;159859:57:::1;:6;:57;::::0;::::1;::::0;:212:::1;::::0;159935:12;;159792:20:::1;::::0;159986:4;;160017::::1;::::0;160041:15:::1;::::0;159859:212:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;160088:12;160115:16:::0;160166:13:::1;160141:21;160134:45;160115:64;;160194:20;160229:21:::0;160265:25:::1;160305:19:::0;160365:1:::1;160344:8;:18;;;:22;;;160341:127;;;160438:14;160403:49;;160416:8;:18;;;160404:30;;:9;:30;160403:49;;;;;;;:::i;:::-;;160387:65;;160341:127;160491:19;::::0;::::1;::::0;:23:::1;;::::0;160488:130:::1;;160588:14;160552:50;;160565:8;:19;;;160553:31;;:9;:31;160552:50;;;;;;;:::i;:::-;;160535:67;;160488:130;160649:23;::::0;::::1;::::0;:27:::1;;::::0;160646:142:::1;;160758:14;160718:54;;160731:8;:23;;;160719:35;;:9;:35;160718:54;;;;;;;:::i;:::-;;160697:75;;160646:142;160807:25;::::0;::::1;::::0;:29:::1;;::::0;160804:140:::1;;160914:14;160872:56;;160885:8;:25;;;160873:37;;:9;:37;160872:56;;;;;;;:::i;:::-;;160857:71;;160804:140;160979:17;::::0;::::1;::::0;160976:92:::1;;161017:35;161031:4;161038:13;161017:5;:35::i;:::-;161087:16;::::0;::::1;::::0;161084:213:::1;;161145:22;::::0;::::1;::::0;:25;161246:12:::1;::::0;::::1;::::0;161137:144:::1;::::0;:39:::1;::::0;;::::1;::::0;:144:::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;161168:1:::1;161137:144:::0;161168:1;161137:144;;:39;:144;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;161124:157:0;;-1:-1:-1;;161084:213:0::1;161316:22;::::0;::::1;::::0;161313:225:::1;;161380:22;::::0;::::1;::::0;161403:1:::1;161380:25;;;;161372:39;;161441:18;161372:150;;161487:8;:12;;;161372:150;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;161359:163:0;;-1:-1:-1;;161313:225:0::1;161557:18;::::0;::::1;::::0;161554:217:::1;;161617:22;::::0;::::1;::::0;161640:1:::1;161617:25;;;;161609:39;;161678:14;161609:146;;161720:8;:12;;;161609:146;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;161596:159:0;;-1:-1:-1;;161554:217:0::1;161803:19;::::0;::::1;::::0;161799:435:::1;;161843:25;161932:1;161915:14;161871:58;;161884:8;:27;;;161872:39;;:9;:39;161871:58;;;;;;;:::i;:::-;;:62;;;;;;;:::i;:::-;161952:264;::::0;;;;162032:4:::1;161952:264;::::0;::::1;21579:34:1::0;;;161952:264:0::1;21649:39:1::0;;;21629:18;;;21622:67;162098:1:0::1;21705:18:1::0;;;21698:34;;;21748:18;;;21741:34;21791:19;;;21784:44;;;;162182:15:0::1;21844:19:1::0;;;21837:35;161871:62:0;;;::::1;::::0;-1:-1:-1;161952:22:0::1;:6;:22;::::0;::::1;::::0;:264;;::::1;::::0;21490:19:1;;161952:264:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;161824:410;161799:435;159103:3142;;;;;;;;;;;;159038:3214;152347:5:::0;152330:7;79828:76;;138622:179;152330:7;:14;;:22;;;;;;;;;;;;;;;;;-1:-1:-1;158964:3288:0:o;87909:105::-;87978:28;:5;87998:2;88001:4;87978:19;:28::i;98919:898::-;98989:12;99087:4;99082:3;99079:13;99069:313;;99130:7;99124:4;99117:21;99174:4;99168;99160:19;99215:4;99209;99201:19;99280:3;99273;99266:11;99263:1;99259:19;99256:28;99250:4;99242:43;-1:-1:-1;99331:4:0;99325;99315:21;99358:5;;99069:313;99409:1;99428:40;99442:3;99439:1;99435:11;99428:40;;;99461:1;99454:9;99428:40;;;99495:1;99491:9;99518:14;;;99567:1;99563:15;;;99557:4;99550:29;99615:4;99611:12;;99605:4;99597:27;99656:4;99650;99642:19;99703:1;99697:4;99693:12;99687:4;99679:27;99752:4;99748:12;99742:4;99732:29;;98919:898;-1:-1:-1;;;98919:898:0:o;88684:197::-;88800:5;:72;;88841:17;;88863:1;:8;;;;88861:11;88841:31;:17;:31;88800:72;;;88808:17;;;;88829:1;:8;;;;88808:30;88800:72;88773:100;;;;;;;;;;;;;-1:-1:-1;;88684:197:0:o;85570:119::-;85931:17;;85634:4;;85678:2;85931:24;85959:1;85930:30;;;:35;85658:23;85827:146;85699:120;85931:17;;85764:4;;85808:2;85931:24;85959:1;85930:30;;;:35;85788:23;85827:146;85318:119;85931:17;;85382:4;;85426:2;85931:24;85959:1;85930:30;;;:35;85406:23;85827:146;84914:138;84992:4;85016:13;:4;:11;:13::i;:::-;:28;;;;85033:11;:2;:9;:11::i;85188:122::-;85931:17;;85255:4;;85299:2;85931:24;85959:1;85930:30;;;:35;85279:23;85827:146;84792:114;85931:17;;84852:4;;84896:1;85931:24;85959:1;85930:30;;;:35;84876:22;85827:146;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:250:1:-;99:1;109:113;123:6;120:1;117:13;109:113;;;199:11;;;193:18;180:11;;;173:39;145:2;138:10;109:113;;;-1:-1:-1;;256:1:1;238:16;;231:27;14:250::o;269:330::-;311:3;349:5;343:12;376:6;371:3;364:19;392:76;461:6;454:4;449:3;445:14;438:4;431:5;427:16;392:76;:::i;:::-;513:2;501:15;518:66;497:88;488:98;;;;588:4;484:109;;269:330;-1:-1:-1;;269:330:1:o;604:220::-;753:2;742:9;735:21;716:4;773:45;814:2;803:9;799:18;791:6;773:45;:::i;829:154::-;915:42;908:5;904:54;897:5;894:65;884:93;;973:1;970;963:12;988:315;1056:6;1064;1117:2;1105:9;1096:7;1092:23;1088:32;1085:52;;;1133:1;1130;1123:12;1085:52;1172:9;1159:23;1191:31;1216:5;1191:31;:::i;:::-;1241:5;1293:2;1278:18;;;;1265:32;;-1:-1:-1;;;988:315:1:o;1500:118::-;1586:5;1579:13;1572:21;1565:5;1562:32;1552:60;;1608:1;1605;1598:12;1623:241;1679:6;1732:2;1720:9;1711:7;1707:23;1703:32;1700:52;;;1748:1;1745;1738:12;1700:52;1787:9;1774:23;1806:28;1828:5;1806:28;:::i;2051:456::-;2128:6;2136;2144;2197:2;2185:9;2176:7;2172:23;2168:32;2165:52;;;2213:1;2210;2203:12;2165:52;2252:9;2239:23;2271:31;2296:5;2271:31;:::i;:::-;2321:5;-1:-1:-1;2378:2:1;2363:18;;2350:32;2391:33;2350:32;2391:33;:::i;:::-;2051:456;;2443:7;;-1:-1:-1;;;2497:2:1;2482:18;;;;2469:32;;2051:456::o;3213:180::-;3272:6;3325:2;3313:9;3304:7;3300:23;3296:32;3293:52;;;3341:1;3338;3331:12;3293:52;-1:-1:-1;3364:23:1;;3213:180;-1:-1:-1;3213:180:1:o;3398:159::-;3465:20;;3525:6;3514:18;;3504:29;;3494:57;;3547:1;3544;3537:12;3494:57;3398:159;;;:::o;3562:319::-;3629:6;3637;3690:2;3678:9;3669:7;3665:23;3661:32;3658:52;;;3706:1;3703;3696:12;3658:52;3745:9;3732:23;3764:31;3789:5;3764:31;:::i;:::-;3814:5;-1:-1:-1;3838:37:1;3871:2;3856:18;;3838:37;:::i;:::-;3828:47;;3562:319;;;;;:::o;3886:274::-;3944:6;3997:2;3985:9;3976:7;3972:23;3968:32;3965:52;;;4013:1;4010;4003:12;3965:52;4052:9;4039:23;4102:8;4095:5;4091:20;4084:5;4081:31;4071:59;;4126:1;4123;4116:12;4901:184;4953:77;4950:1;4943:88;5050:4;5047:1;5040:15;5074:4;5071:1;5064:15;5090:980;5158:6;5211:2;5199:9;5190:7;5186:23;5182:32;5179:52;;;5227:1;5224;5217:12;5179:52;5267:9;5254:23;5296:18;5337:2;5329:6;5326:14;5323:34;;;5353:1;5350;5343:12;5323:34;5391:6;5380:9;5376:22;5366:32;;5436:7;5429:4;5425:2;5421:13;5417:27;5407:55;;5458:1;5455;5448:12;5407:55;5494:2;5481:16;5516:2;5512;5509:10;5506:36;;;5522:18;;:::i;:::-;5656:2;5650:9;5718:4;5710:13;;5561:66;5706:22;;;5730:2;5702:31;5698:40;5686:53;;;5754:18;;;5774:22;;;5751:46;5748:72;;;5800:18;;:::i;:::-;5840:10;5836:2;5829:22;5875:2;5867:6;5860:18;5915:7;5910:2;5905;5901;5897:11;5893:20;5890:33;5887:53;;;5936:1;5933;5926:12;5887:53;5992:2;5987;5983;5979:11;5974:2;5966:6;5962:15;5949:46;6037:1;6015:15;;;6032:2;6011:24;6004:35;;;;-1:-1:-1;6019:6:1;5090:980;-1:-1:-1;;;;;5090:980:1:o;6075:184::-;6133:6;6186:2;6174:9;6165:7;6161:23;6157:32;6154:52;;;6202:1;6199;6192:12;6154:52;6225:28;6243:9;6225:28;:::i;6264:288::-;6322:6;6375:2;6363:9;6354:7;6350:23;6346:32;6343:52;;;6391:1;6388;6381:12;6343:52;6430:9;6417:23;6480:22;6473:5;6469:34;6462:5;6459:45;6449:73;;6518:1;6515;6508:12;6557:247;6616:6;6669:2;6657:9;6648:7;6644:23;6640:32;6637:52;;;6685:1;6682;6675:12;6637:52;6724:9;6711:23;6743:31;6768:5;6743:31;:::i;6809:1335::-;7206:66;7198:6;7194:79;7183:9;7176:98;7157:4;7293:2;7331:3;7326:2;7315:9;7311:18;7304:31;7358:46;7399:3;7388:9;7384:19;7376:6;7358:46;:::i;:::-;7452:9;7444:6;7440:22;7435:2;7424:9;7420:18;7413:50;7486:33;7512:6;7504;7486:33;:::i;:::-;7550:2;7535:18;;7528:34;;;7611:42;7599:55;;7593:3;7578:19;;7571:84;7686:3;7671:19;;7664:35;;;7736:22;;;7730:3;7715:19;;7708:51;7808:13;;7830:22;;;7906:15;;;;-1:-1:-1;7868:15:1;;;;-1:-1:-1;7949:169:1;7963:6;7960:1;7957:13;7949:169;;;8024:13;;8012:26;;8093:15;;;;8058:12;;;;7985:1;7978:9;7949:169;;;-1:-1:-1;8135:3:1;;6809:1335;-1:-1:-1;;;;;;;;;;;;6809:1335:1:o;8149:156::-;8215:20;;8275:4;8264:16;;8254:27;;8244:55;;8295:1;8292;8285:12;8310:317;8376:6;8384;8437:2;8425:9;8416:7;8412:23;8408:32;8405:52;;;8453:1;8450;8443:12;8405:52;8492:9;8479:23;8511:31;8536:5;8511:31;:::i;:::-;8561:5;-1:-1:-1;8585:36:1;8617:2;8602:18;;8585:36;:::i;8863:280::-;8921:6;8974:2;8962:9;8953:7;8949:23;8945:32;8942:52;;;8990:1;8987;8980:12;8942:52;9029:9;9016:23;9079:14;9072:5;9068:26;9061:5;9058:37;9048:65;;9109:1;9106;9099:12;9148:383;9225:6;9233;9241;9294:2;9282:9;9273:7;9269:23;9265:32;9262:52;;;9310:1;9307;9300:12;9262:52;9349:9;9336:23;9368:31;9393:5;9368:31;:::i;:::-;9418:5;9470:2;9455:18;;9442:32;;-1:-1:-1;9521:2:1;9506:18;;;9493:32;;9148:383;-1:-1:-1;;;9148:383:1:o;9536:734::-;9647:6;9655;9663;9671;9679;9687;9695;9748:3;9736:9;9727:7;9723:23;9719:33;9716:53;;;9765:1;9762;9755:12;9716:53;9804:9;9791:23;9823:31;9848:5;9823:31;:::i;:::-;9873:5;-1:-1:-1;9930:2:1;9915:18;;9902:32;9943:33;9902:32;9943:33;:::i;:::-;9995:7;-1:-1:-1;10049:2:1;10034:18;;10021:32;;-1:-1:-1;10100:2:1;10085:18;;10072:32;;-1:-1:-1;10123:37:1;10155:3;10140:19;;10123:37;:::i;:::-;10113:47;;10207:3;10196:9;10192:19;10179:33;10169:43;;10259:3;10248:9;10244:19;10231:33;10221:43;;9536:734;;;;;;;;;;:::o;10275:388::-;10343:6;10351;10404:2;10392:9;10383:7;10379:23;10375:32;10372:52;;;10420:1;10417;10410:12;10372:52;10459:9;10446:23;10478:31;10503:5;10478:31;:::i;:::-;10528:5;-1:-1:-1;10585:2:1;10570:18;;10557:32;10598:33;10557:32;10598:33;:::i;:::-;10650:7;10640:17;;;10275:388;;;;;:::o;10765:375::-;10858:5;10881:1;10891:243;10905:4;10902:1;10899:11;10891:243;;;10968:13;;10983:42;10964:62;10952:75;;11050:4;11074:12;;;;11109:15;;;;10925:1;10918:9;10891:243;;11145:1645;11361:13;;2761:4;2750:16;2738:29;;11331:3;11316:19;;11433:4;11425:6;11421:17;11415:24;11448:53;11495:4;11484:9;11480:20;11466:12;4241:6;4230:18;4218:31;;4165:90;11448:53;;11550:4;11542:6;11538:17;11532:24;11565:55;11614:4;11603:9;11599:20;11583:14;4241:6;4230:18;4218:31;;4165:90;11565:55;;11669:4;11661:6;11657:17;11651:24;11684:55;11733:4;11722:9;11718:20;11702:14;4241:6;4230:18;4218:31;;4165:90;11684:55;;11788:4;11780:6;11776:17;11770:24;11803:55;11852:4;11841:9;11837:20;11821:14;4241:6;4230:18;4218:31;;4165:90;11803:55;;11907:4;11899:6;11895:17;11889:24;11922:55;11971:4;11960:9;11956:20;11940:14;4241:6;4230:18;4218:31;;4165:90;11922:55;;12026:4;12018:6;12014:17;12008:24;12041:55;12090:4;12079:9;12075:20;12059:14;4241:6;4230:18;4218:31;;4165:90;12041:55;;12145:4;12137:6;12133:17;12127:24;12160:55;12209:4;12198:9;12194:20;12178:14;4241:6;4230:18;4218:31;;4165:90;12160:55;-1:-1:-1;12234:6:1;12277:15;;;12271:22;4241:6;4230:18;;;12336;;;4218:31;;;;12374:6;12417:15;;;12411:22;4230:18;;;12476;;;4218:31;12514:6;12557:15;;;12551:22;10744:8;10733:20;12616:18;;;10721:33;12654:6;12698:15;;;12692:22;12723:61;12765:18;;;12692:22;12723:61;:::i;:::-;;;11145:1645;;;;:::o;12795:184::-;12847:77;12844:1;12837:88;12944:4;12941:1;12934:15;12968:4;12965:1;12958:15;12984:184;13036:77;13033:1;13026:88;13133:4;13130:1;13123:15;13157:4;13154:1;13147:15;13173:171;13241:6;13280:10;;;13268;;;13264:27;;13303:12;;;13300:38;;;13318:18;;:::i;:::-;13300:38;13173:171;;;;:::o;13349:125::-;13414:9;;;13435:10;;;13432:36;;;13448:18;;:::i;13479:213::-;13517:3;13545:22;13602:2;13595:5;13591:14;13629:2;13620:7;13617:15;13614:41;;13635:18;;:::i;:::-;13684:1;13671:15;;13479:213;-1:-1:-1;;;13479:213:1:o;13697:184::-;13767:6;13820:2;13808:9;13799:7;13795:23;13791:32;13788:52;;;13836:1;13833;13826:12;13788:52;-1:-1:-1;13859:16:1;;13697:184;-1:-1:-1;13697:184:1:o;14894:306::-;14982:6;14990;14998;15051:2;15039:9;15030:7;15026:23;15022:32;15019:52;;;15067:1;15064;15057:12;15019:52;15096:9;15090:16;15080:26;;15146:2;15135:9;15131:18;15125:25;15115:35;;15190:2;15179:9;15175:18;15169:25;15159:35;;14894:306;;;;;:::o;15205:251::-;15275:6;15328:2;15316:9;15307:7;15303:23;15299:32;15296:52;;;15344:1;15341;15334:12;15296:52;15376:9;15370:16;15395:31;15420:5;15395:31;:::i;16815:287::-;16944:3;16982:6;16976:13;16998:66;17057:6;17052:3;17045:4;17037:6;17033:17;16998:66;:::i;:::-;17080:16;;;;;16815:287;-1:-1:-1;;16815:287:1:o;18589:245::-;18656:6;18709:2;18697:9;18688:7;18684:23;18680:32;18677:52;;;18725:1;18722;18715:12;18677:52;18757:9;18751:16;18776:28;18798:5;18776:28;:::i;18839:184::-;18891:77;18888:1;18881:88;18988:4;18985:1;18978:15;19012:4;19009:1;19002:15;19376:128;19443:9;;;19464:11;;;19461:37;;;19478:18;;:::i;19943:1058::-;20204:4;20252:3;20241:9;20237:19;20295:26;20287:6;20283:39;20272:9;20265:58;20342:2;20380:6;20375:2;20364:9;20360:18;20353:34;20423:3;20418:2;20407:9;20403:18;20396:31;20447:6;20482;20476:13;20513:6;20505;20498:22;20551:3;20540:9;20536:19;20529:26;;20590:2;20582:6;20578:15;20564:29;;20611:1;20621:218;20635:6;20632:1;20629:13;20621:218;;;20700:13;;20715:42;20696:62;20684:75;;20814:15;;;;20779:12;;;;20657:1;20650:9;20621:218;;;-1:-1:-1;;20907:42:1;20895:55;;;;20890:2;20875:18;;20868:83;-1:-1:-1;;;20982:3:1;20967:19;20960:35;20856:3;19943:1058;-1:-1:-1;;;19943:1058:1:o

Swarm Source

ipfs://41538c3d9f8f1ed9ff8558b8aedd846eac5d416720baba78b5955a865154181e

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.

Connect a Wallet
Connect a Wallet

Compiler specific version warnings:

The compiled contract might be susceptible to VerbatimInvalidDeduplication (low-severity) Solidity Compiler Bugs.

TGSports (TGBET) Token Tracker | Etherscan (2024)

References

Top Articles
Latest Posts
Article information

Author: Clemencia Bogisich Ret

Last Updated:

Views: 5716

Rating: 5 / 5 (60 voted)

Reviews: 91% of readers found this page helpful

Author information

Name: Clemencia Bogisich Ret

Birthday: 2001-07-17

Address: Suite 794 53887 Geri Spring, West Cristentown, KY 54855

Phone: +5934435460663

Job: Central Hospitality Director

Hobby: Yoga, Electronics, Rafting, Lockpicking, Inline skating, Puzzles, scrapbook

Introduction: My name is Clemencia Bogisich Ret, I am a super, outstanding, graceful, friendly, vast, comfortable, agreeable person who loves writing and wants to share my knowledge and understanding with you.