{
  "address": "0x1026cbed7b7E851426b959BC69dcC1bf5876512d",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_masterDeployer",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "name": "configAddress",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "_deployData",
          "type": "bytes"
        }
      ],
      "name": "deployPool",
      "outputs": [
        {
          "internalType": "address",
          "name": "pool",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "token0",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "token1",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "startIndex",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "endIndex",
          "type": "uint256"
        }
      ],
      "name": "getPools",
      "outputs": [
        {
          "internalType": "address[]",
          "name": "pairPools",
          "type": "address[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "masterDeployer",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "pools",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "token0",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "token1",
          "type": "address"
        }
      ],
      "name": "poolsCount",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "count",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "transactionHash": "0xc1a9c57ed9437b0d0c70ac87496931c1611bd681660ed6cd004a1c7f44927b94",
  "receipt": {
    "to": null,
    "from": "0x58B4B6951e9174F153635574076241315D7d3503",
    "contractAddress": "0x1026cbed7b7E851426b959BC69dcC1bf5876512d",
    "transactionIndex": 1,
    "gasUsed": "4412592",
    "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
    "blockHash": "0x32b3d2b082ee4b5385e1320aafff79f7a0440e76a9fa2030b141fb34d5fd66ca",
    "transactionHash": "0xc1a9c57ed9437b0d0c70ac87496931c1611bd681660ed6cd004a1c7f44927b94",
    "logs": [],
    "blockNumber": 5666359,
    "cumulativeGasUsed": "4543118",
    "status": 1,
    "byzantium": true
  },
  "args": [
    "0x1E2d3ba40F973135f397fF7f2Ec0d1cC835E8b73"
  ],
  "solcInputHash": "bc50caee4059efe4f07004e2e38237ac",
  "metadata": "{\"compiler\":{\"version\":\"0.8.7+commit.e28d00a7\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_masterDeployer\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"configAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_deployData\",\"type\":\"bytes\"}],\"name\":\"deployPool\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token0\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"token1\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"startIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"endIndex\",\"type\":\"uint256\"}],\"name\":\"getPools\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"pairPools\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"masterDeployer\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"pools\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token0\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"token1\",\"type\":\"address\"}],\"name\":\"poolsCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"count\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Mudit Gupta.\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Contract for deploying Trident exchange Constant Product Pool with configurations.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/pool/ConstantProductPoolFactory.sol\":\"ConstantProductPoolFactory\"},\"evmVersion\":\"london\",\"libraries\":{\":__CACHE_BREAKER__\":\"0x00000000d41867734bbee4c6863d9255b2b06ac1\"},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":99999},\"remappings\":[]},\"sources\":{\"contracts/interfaces/IBentoBoxMinimal.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n\\npragma solidity >=0.8.0;\\nimport \\\"../libraries/RebaseLibrary.sol\\\";\\n\\n/// @notice Minimal BentoBox vault interface.\\n/// @dev `token` is aliased as `address` from `IERC20` for simplicity.\\ninterface IBentoBoxMinimal {\\n    /// @notice Balance per ERC-20 token per account in shares.\\n    function balanceOf(address, address) external view returns (uint256);\\n\\n    /// @dev Helper function to represent an `amount` of `token` in shares.\\n    /// @param token The ERC-20 token.\\n    /// @param amount The `token` amount.\\n    /// @param roundUp If the result `share` should be rounded up.\\n    /// @return share The token amount represented in shares.\\n    function toShare(\\n        address token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share);\\n\\n    /// @dev Helper function to represent shares back into the `token` amount.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount of shares.\\n    /// @param roundUp If the result should be rounded up.\\n    /// @return amount The share amount back into native representation.\\n    function toAmount(\\n        address token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount);\\n\\n    /// @notice Registers this contract so that users can approve it for BentoBox.\\n    function registerProtocol() external;\\n\\n    /// @notice Deposit an amount of `token` represented in either `amount` or `share`.\\n    /// @param token_ The ERC-20 token to deposit.\\n    /// @param from which account to pull the tokens.\\n    /// @param to which account to push the tokens.\\n    /// @param amount Token amount in native representation to deposit.\\n    /// @param share Token amount represented in shares to deposit. Takes precedence over `amount`.\\n    /// @return amountOut The amount deposited.\\n    /// @return shareOut The deposited amount represented in shares.\\n    function deposit(\\n        address token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) external payable returns (uint256 amountOut, uint256 shareOut);\\n\\n    /// @notice Withdraws an amount of `token` from a user account.\\n    /// @param token_ The ERC-20 token to withdraw.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param amount of tokens. Either one of `amount` or `share` needs to be supplied.\\n    /// @param share Like above, but `share` takes precedence over `amount`.\\n    function withdraw(\\n        address token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) external returns (uint256 amountOut, uint256 shareOut);\\n\\n    /// @notice Transfer shares from a user account to another one.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param share The amount of `token` in shares.\\n    function transfer(\\n        address token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) external;\\n\\n    /// @dev Reads the Rebase `totals`from storage for a given token\\n    function totals(address token) external view returns (Rebase memory total);\\n}\\n\",\"keccak256\":\"0xe268448becc3d398726136d11325168c1c2973f1b5b8ba1a395f04d642b548fa\",\"license\":\"GPL-3.0-or-later\"},\"contracts/interfaces/IMasterDeployer.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n\\npragma solidity >=0.8.0;\\n\\n/// @notice Trident pool deployer interface.\\ninterface IMasterDeployer {\\n    function barFee() external view returns (uint256);\\n\\n    function barFeeTo() external view returns (address);\\n\\n    function bento() external view returns (address);\\n\\n    function migrator() external view returns (address);\\n\\n    function pools(address pool) external view returns (bool);\\n\\n    function deployPool(address factory, bytes calldata deployData) external returns (address);\\n}\\n\",\"keccak256\":\"0x91c23deb7e4372faa35a0ae4ef6ccd684049aea7b2c75cf63009b28591b91cbc\",\"license\":\"GPL-3.0-or-later\"},\"contracts/interfaces/IPool.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n\\npragma solidity >=0.5.0;\\npragma experimental ABIEncoderV2;\\n\\n/// @notice Trident pool interface.\\ninterface IPool {\\n    /// @notice Executes a swap from one token to another.\\n    /// @dev The input tokens must've already been sent to the pool.\\n    /// @param data ABI-encoded params that the pool requires.\\n    /// @return finalAmountOut The amount of output tokens that were sent to the user.\\n    function swap(bytes calldata data) external returns (uint256 finalAmountOut);\\n\\n    /// @notice Executes a swap from one token to another with a callback.\\n    /// @dev This function allows borrowing the output tokens and sending the input tokens in the callback.\\n    /// @param data ABI-encoded params that the pool requires.\\n    /// @return finalAmountOut The amount of output tokens that were sent to the user.\\n    function flashSwap(bytes calldata data) external returns (uint256 finalAmountOut);\\n\\n    /// @notice Mints liquidity tokens.\\n    /// @param data ABI-encoded params that the pool requires.\\n    /// @return liquidity The amount of liquidity tokens that were minted for the user.\\n    function mint(bytes calldata data) external returns (uint256 liquidity);\\n\\n    /// @notice Burns liquidity tokens.\\n    /// @dev The input LP tokens must've already been sent to the pool.\\n    /// @param data ABI-encoded params that the pool requires.\\n    /// @return withdrawnAmounts The amount of various output tokens that were sent to the user.\\n    function burn(bytes calldata data) external returns (TokenAmount[] memory withdrawnAmounts);\\n\\n    /// @notice Burns liquidity tokens for a single output token.\\n    /// @dev The input LP tokens must've already been sent to the pool.\\n    /// @param data ABI-encoded params that the pool requires.\\n    /// @return amountOut The amount of output tokens that were sent to the user.\\n    function burnSingle(bytes calldata data) external returns (uint256 amountOut);\\n\\n    /// @return A unique identifier for the pool type.\\n    function poolIdentifier() external pure returns (bytes32);\\n\\n    /// @return An array of tokens supported by the pool.\\n    function getAssets() external view returns (address[] memory);\\n\\n    /// @notice Simulates a trade and returns the expected output.\\n    /// @dev The pool does not need to include a trade simulator directly in itself - it can use a library.\\n    /// @param data ABI-encoded params that the pool requires.\\n    /// @return finalAmountOut The amount of output tokens that will be sent to the user if the trade is executed.\\n    function getAmountOut(bytes calldata data) external view returns (uint256 finalAmountOut);\\n\\n    /// @dev This event must be emitted on all swaps.\\n    event Swap(address indexed recipient, address indexed tokenIn, address indexed tokenOut, uint256 amountIn, uint256 amountOut);\\n\\n    /// @dev This struct frames output tokens for burns.\\n    struct TokenAmount {\\n        address token;\\n        uint256 amount;\\n    }\\n}\\n\",\"keccak256\":\"0x3abcaaaa6acccb46f162730c6405ea3de3e2a43b73a4f3d1f10368fb0b9204f8\",\"license\":\"GPL-3.0-or-later\"},\"contracts/interfaces/ITridentCallee.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n\\npragma solidity >=0.8.0;\\n\\n/// @notice Trident pool callback interface.\\ninterface ITridentCallee {\\n    function tridentSwapCallback(bytes calldata data) external;\\n\\n    function tridentMintCallback(bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x256e838362a3064201b37b3b7c08bc1421b173a6fea633176123f0b827b868c9\",\"license\":\"GPL-3.0-or-later\"},\"contracts/libraries/RebaseLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n\\npragma solidity ^0.8;\\n\\nstruct Rebase {\\n    uint128 elastic;\\n    uint128 base;\\n}\\n\\n/// @notice A rebasing library\\nlibrary RebaseLibrary {\\n    /// @notice Calculates the base value in relationship to `elastic` and `total`.\\n    function toBase(Rebase memory total, uint256 elastic) internal pure returns (uint256 base) {\\n        if (total.elastic == 0) {\\n            base = elastic;\\n        } else {\\n            base = (elastic * total.base) / total.elastic;\\n        }\\n    }\\n\\n    /// @notice Calculates the elastic value in relationship to `base` and `total`.\\n    function toElastic(Rebase memory total, uint256 base) internal pure returns (uint256 elastic) {\\n        if (total.base == 0) {\\n            elastic = base;\\n        } else {\\n            elastic = (base * total.elastic) / total.base;\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa83360497e7e2a04332211832a8ceb41ef0301892fcf1b17174d7d4466782d44\",\"license\":\"GPL-3.0-or-later\"},\"contracts/libraries/TridentMath.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n\\npragma solidity >=0.8.0;\\n\\n/// @notice Trident sqrt helper library.\\nlibrary TridentMath {\\n    /// @notice Calculate sqrt (x) rounding down, where `x` is unsigned 256-bit integer number.\\n    /// @dev Adapted from https://github.com/abdk-consulting/abdk-libraries-solidity/blob/master/ABDKMath64x64.sol, \\n    /// \\u00a9 2019 ABDK Consulting, License-Identifier: BSD-4-Clause.\\n    /// @param x Unsigned 256-bit integer number.\\n    /// @return result Sqrt result.\\n    function sqrt(uint256 x) internal pure returns (uint256 result) {\\n        unchecked {\\n            if (x == 0) result = 0;\\n            else {\\n                uint256 xx = x;\\n                uint256 r = 1;\\n                if (xx >= 0x100000000000000000000000000000000) {\\n                    xx >>= 128;\\n                    r <<= 64;\\n                }\\n                if (xx >= 0x10000000000000000) {\\n                    xx >>= 64;\\n                    r <<= 32;\\n                }\\n                if (xx >= 0x100000000) {\\n                    xx >>= 32;\\n                    r <<= 16;\\n                }\\n                if (xx >= 0x10000) {\\n                    xx >>= 16;\\n                    r <<= 8;\\n                }\\n                if (xx >= 0x100) {\\n                    xx >>= 8;\\n                    r <<= 4;\\n                }\\n                if (xx >= 0x10) {\\n                    xx >>= 4;\\n                    r <<= 2;\\n                }\\n                if (xx >= 0x8) {\\n                    r <<= 1;\\n                }\\n                r = (r + x / r) >> 1;\\n                r = (r + x / r) >> 1;\\n                r = (r + x / r) >> 1;\\n                r = (r + x / r) >> 1;\\n                r = (r + x / r) >> 1;\\n                r = (r + x / r) >> 1;\\n                r = (r + x / r) >> 1; // @dev Seven iterations should be enough.\\n                uint256 r1 = x / r;\\n                result = r < r1 ? r : r1;\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xccbada517ace78149a4602ce782e6faf408404ee300569b8adf76e0eb7f0dd3b\",\"license\":\"GPL-3.0-or-later\"},\"contracts/pool/ConstantProductPool.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n\\npragma solidity >=0.8.0;\\n\\nimport \\\"../interfaces/IBentoBoxMinimal.sol\\\";\\nimport \\\"../interfaces/IMasterDeployer.sol\\\";\\nimport \\\"../interfaces/IPool.sol\\\";\\nimport \\\"../interfaces/ITridentCallee.sol\\\";\\nimport \\\"../libraries/TridentMath.sol\\\";\\nimport \\\"./TridentERC20.sol\\\";\\n\\n/// @notice Trident exchange pool template with constant product formula for swapping between an ERC-20 token pair.\\n/// @dev The reserves are stored as bento shares.\\n///      The curve is applied to shares as well. This pool does not care about the underlying amounts.\\ncontract ConstantProductPool is IPool, TridentERC20 {\\n    event Mint(address indexed sender, uint256 amount0, uint256 amount1, address indexed recipient);\\n    event Burn(address indexed sender, uint256 amount0, uint256 amount1, address indexed recipient);\\n    event Sync(uint256 reserve0, uint256 reserve1);\\n\\n    uint256 internal constant MINIMUM_LIQUIDITY = 1000;\\n\\n    uint8 internal constant PRECISION = 112;\\n    uint256 internal constant MAX_FEE = 10000; // @dev 100%.\\n    uint256 internal constant MAX_FEE_SQUARE = 100000000;\\n    uint256 public immutable swapFee;\\n    uint256 internal immutable MAX_FEE_MINUS_SWAP_FEE;\\n\\n    address public immutable barFeeTo;\\n    IBentoBoxMinimal public immutable bento;\\n    IMasterDeployer public immutable masterDeployer;\\n    address public immutable token0;\\n    address public immutable token1;\\n\\n    uint256 public barFee;\\n    uint256 public price0CumulativeLast;\\n    uint256 public price1CumulativeLast;\\n    uint256 public kLast;\\n\\n    uint112 internal reserve0;\\n    uint112 internal reserve1;\\n    uint32 internal blockTimestampLast;\\n\\n    bytes32 public constant override poolIdentifier = \\\"Trident:ConstantProduct\\\";\\n\\n    uint256 internal unlocked;\\n    modifier lock() {\\n        require(unlocked == 1, \\\"LOCKED\\\");\\n        unlocked = 2;\\n        _;\\n        unlocked = 1;\\n    }\\n\\n    constructor(bytes memory _deployData, address _masterDeployer) {\\n        (address _token0, address _token1, uint256 _swapFee, bool _twapSupport) = abi.decode(\\n            _deployData,\\n            (address, address, uint256, bool)\\n        );\\n\\n        // @dev Factory ensures that the tokens are sorted.\\n        require(_token0 != address(0), \\\"ZERO_ADDRESS\\\");\\n        require(_token0 != _token1, \\\"IDENTICAL_ADDRESSES\\\");\\n        require(_token0 != address(this), \\\"INVALID_TOKEN\\\");\\n        require(_token1 != address(this), \\\"INVALID_TOKEN\\\");\\n        require(_swapFee <= MAX_FEE, \\\"INVALID_SWAP_FEE\\\");\\n\\n        token0 = _token0;\\n        token1 = _token1;\\n        swapFee = _swapFee;\\n        // @dev This is safe from underflow - `swapFee` cannot exceed `MAX_FEE` per previous check.\\n        unchecked {\\n            MAX_FEE_MINUS_SWAP_FEE = MAX_FEE - _swapFee;\\n        }\\n        barFee = IMasterDeployer(_masterDeployer).barFee();\\n        barFeeTo = IMasterDeployer(_masterDeployer).barFeeTo();\\n        bento = IBentoBoxMinimal(IMasterDeployer(_masterDeployer).bento());\\n        masterDeployer = IMasterDeployer(_masterDeployer);\\n        unlocked = 1;\\n        if (_twapSupport) blockTimestampLast = 1;\\n    }\\n\\n    /// @dev Mints LP tokens - should be called via the router after transferring `bento` tokens.\\n    /// The router must ensure that sufficient LP tokens are minted by using the return value.\\n    function mint(bytes calldata data) public override lock returns (uint256 liquidity) {\\n        address recipient = abi.decode(data, (address));\\n        (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast) = _getReserves();\\n        (uint256 balance0, uint256 balance1) = _balance();\\n\\n        uint256 computed = TridentMath.sqrt(balance0 * balance1);\\n        uint256 amount0 = balance0 - _reserve0;\\n        uint256 amount1 = balance1 - _reserve1;\\n\\n        (uint256 fee0, uint256 fee1) = _nonOptimalMintFee(amount0, amount1, _reserve0, _reserve1);\\n        _reserve0 += uint112(fee0);\\n        _reserve1 += uint112(fee1);\\n\\n        (uint256 _totalSupply, uint256 k) = _mintFee(_reserve0, _reserve1);\\n\\n        if (_totalSupply == 0) {\\n            require(amount0 > 0 && amount1 > 0, \\\"INVALID_AMOUNTS\\\");\\n            liquidity = computed - MINIMUM_LIQUIDITY;\\n            _mint(address(0), MINIMUM_LIQUIDITY);\\n        } else {\\n            uint256 kIncrease;\\n            unchecked {\\n                kIncrease = computed - k;\\n            }\\n            liquidity = (kIncrease * _totalSupply) / k;\\n        }\\n        require(liquidity != 0, \\\"INSUFFICIENT_LIQUIDITY_MINTED\\\");\\n        _mint(recipient, liquidity);\\n        _update(balance0, balance1, _reserve0, _reserve1, _blockTimestampLast);\\n        kLast = computed;\\n        emit Mint(msg.sender, amount0, amount1, recipient);\\n    }\\n\\n    /// @dev Burns LP tokens sent to this contract. The router must ensure that the user gets sufficient output tokens.\\n    function burn(bytes calldata data) public override lock returns (IPool.TokenAmount[] memory withdrawnAmounts) {\\n        (address recipient, bool unwrapBento) = abi.decode(data, (address, bool));\\n        (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast) = _getReserves();\\n        (uint256 balance0, uint256 balance1) = _balance();\\n        uint256 liquidity = balanceOf[address(this)];\\n\\n        (uint256 _totalSupply, ) = _mintFee(_reserve0, _reserve1);\\n\\n        uint256 amount0 = (liquidity * balance0) / _totalSupply;\\n        uint256 amount1 = (liquidity * balance1) / _totalSupply;\\n\\n        _burn(address(this), liquidity);\\n        _transfer(token0, amount0, recipient, unwrapBento);\\n        _transfer(token1, amount1, recipient, unwrapBento);\\n        // @dev This is safe from underflow - amounts are lesser figures derived from balances.\\n        unchecked {\\n            balance0 -= amount0;\\n            balance1 -= amount1;\\n        }\\n        _update(balance0, balance1, _reserve0, _reserve1, _blockTimestampLast);\\n        kLast = TridentMath.sqrt(balance0 * balance1);\\n\\n        withdrawnAmounts = new TokenAmount[](2);\\n        withdrawnAmounts[0] = TokenAmount({token: address(token0), amount: amount0});\\n        withdrawnAmounts[1] = TokenAmount({token: address(token1), amount: amount1});\\n        emit Burn(msg.sender, amount0, amount1, recipient);\\n    }\\n\\n    /// @dev Burns LP tokens sent to this contract and swaps one of the output tokens for another\\n    /// - i.e., the user gets a single token out by burning LP tokens.\\n    function burnSingle(bytes calldata data) public override lock returns (uint256 amountOut) {\\n        (address tokenOut, address recipient, bool unwrapBento) = abi.decode(data, (address, address, bool));\\n        (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast) = _getReserves();\\n        (uint256 balance0, uint256 balance1) = _balance();\\n        uint256 liquidity = balanceOf[address(this)];\\n\\n        (uint256 _totalSupply, ) = _mintFee(_reserve0, _reserve1);\\n\\n        uint256 amount0 = (liquidity * balance0) / _totalSupply;\\n        uint256 amount1 = (liquidity * balance1) / _totalSupply;\\n\\n        _burn(address(this), liquidity);\\n        kLast = TridentMath.sqrt((uint256(_reserve0) - amount0) * (uint256(_reserve1) - amount1));\\n\\n        // Swap one token for another\\n        unchecked {\\n            if (tokenOut == token1) {\\n                // @dev Swap `token0` for `token1`\\n                // - calculate `amountOut` as if the user first withdrew balanced liquidity and then swapped `token0` for `token1`.\\n                amount1 += _getAmountOut(amount0, _reserve0 - amount0, _reserve1 - amount1);\\n                _transfer(token1, amount1, recipient, unwrapBento);\\n                balance1 -= amount1;\\n                amountOut = amount1;\\n                amount0 = 0;\\n            } else {\\n                // @dev Swap `token1` for `token0`.\\n                require(tokenOut == token0, \\\"INVALID_OUTPUT_TOKEN\\\");\\n                amount0 += _getAmountOut(amount1, _reserve1 - amount1, _reserve0 - amount0);\\n                _transfer(token0, amount0, recipient, unwrapBento);\\n                balance0 -= amount0;\\n                amountOut = amount0;\\n                amount1 = 0;\\n            }\\n        }\\n        _update(balance0, balance1, _reserve0, _reserve1, _blockTimestampLast);\\n        emit Burn(msg.sender, amount0, amount1, recipient);\\n    }\\n\\n    /// @dev Swaps one token for another. The router must prefund this contract and ensure there isn't too much slippage.\\n    function swap(bytes calldata data) public override lock returns (uint256 amountOut) {\\n        (address tokenIn, address recipient, bool unwrapBento) = abi.decode(data, (address, address, bool));\\n        (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast) = _getReserves();\\n        require(_reserve0 > 0, \\\"POOL_UNINITIALIZED\\\");\\n        (uint256 balance0, uint256 balance1) = _balance();\\n        uint256 amountIn;\\n        address tokenOut;\\n        unchecked {\\n            if (tokenIn == token0) {\\n                tokenOut = token1;\\n                amountIn = balance0 - _reserve0;\\n                amountOut = _getAmountOut(amountIn, _reserve0, _reserve1);\\n                balance1 -= amountOut;\\n            } else {\\n                require(tokenIn == token1, \\\"INVALID_INPUT_TOKEN\\\");\\n                tokenOut = token0;\\n                amountIn = balance1 - reserve1;\\n                amountOut = _getAmountOut(amountIn, _reserve1, _reserve0);\\n                balance0 -= amountOut;\\n            }\\n        }\\n        _transfer(tokenOut, amountOut, recipient, unwrapBento);\\n        _update(balance0, balance1, _reserve0, _reserve1, _blockTimestampLast);\\n        emit Swap(recipient, tokenIn, tokenOut, amountIn, amountOut);\\n    }\\n\\n    /// @dev Swaps one token for another. The router must support swap callbacks and ensure there isn't too much slippage.\\n    function flashSwap(bytes calldata data) public override lock returns (uint256 amountOut) {\\n        (address tokenIn, address recipient, bool unwrapBento, uint256 amountIn, bytes memory context) = abi.decode(\\n            data,\\n            (address, address, bool, uint256, bytes)\\n        );\\n        (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast) = _getReserves();\\n        require(_reserve0 > 0, \\\"POOL_UNINITIALIZED\\\");\\n        unchecked {\\n            if (tokenIn == token0) {\\n                amountOut = _getAmountOut(amountIn, _reserve0, _reserve1);\\n                _transfer(token1, amountOut, recipient, unwrapBento);\\n                ITridentCallee(msg.sender).tridentSwapCallback(context);\\n                (uint256 balance0, uint256 balance1) = _balance();\\n                require(balance0 - _reserve0 >= amountIn, \\\"INSUFFICIENT_AMOUNT_IN\\\");\\n                _update(balance0, balance1, _reserve0, _reserve1, _blockTimestampLast);\\n                emit Swap(recipient, tokenIn, token1, amountIn, amountOut);\\n            } else {\\n                require(tokenIn == token1, \\\"INVALID_INPUT_TOKEN\\\");\\n                amountOut = _getAmountOut(amountIn, _reserve1, _reserve0);\\n                _transfer(token0, amountOut, recipient, unwrapBento);\\n                ITridentCallee(msg.sender).tridentSwapCallback(context);\\n                (uint256 balance0, uint256 balance1) = _balance();\\n                require(balance1 - _reserve1 >= amountIn, \\\"INSUFFICIENT_AMOUNT_IN\\\");\\n                _update(balance0, balance1, _reserve0, _reserve1, _blockTimestampLast);\\n                emit Swap(recipient, tokenIn, token0, amountIn, amountOut);\\n            }\\n        }\\n    }\\n\\n    /// @dev Updates `barFee` for Trident protocol.\\n    function updateBarFee() public {\\n        barFee = IMasterDeployer(masterDeployer).barFee();\\n    }\\n\\n    function _getReserves()\\n        internal\\n        view\\n        returns (\\n            uint112 _reserve0,\\n            uint112 _reserve1,\\n            uint32 _blockTimestampLast\\n        )\\n    {\\n        _reserve0 = reserve0;\\n        _reserve1 = reserve1;\\n        _blockTimestampLast = blockTimestampLast;\\n    }\\n\\n    function _balance() internal view returns (uint256 balance0, uint256 balance1) {\\n        balance0 = bento.balanceOf(token0, address(this));\\n        balance1 = bento.balanceOf(token1, address(this));\\n    }\\n\\n    function _update(\\n        uint256 balance0,\\n        uint256 balance1,\\n        uint112 _reserve0,\\n        uint112 _reserve1,\\n        uint32 _blockTimestampLast\\n    ) internal {\\n        require(balance0 <= type(uint112).max && balance1 <= type(uint112).max, \\\"OVERFLOW\\\");\\n        if (_blockTimestampLast == 0) {\\n            // @dev TWAP support is disabled for gas efficiency.\\n            reserve0 = uint112(balance0);\\n            reserve1 = uint112(balance1);\\n        } else {\\n            uint32 blockTimestamp = uint32(block.timestamp % 2**32);\\n            if (blockTimestamp != _blockTimestampLast && _reserve0 != 0 && _reserve1 != 0) {\\n                unchecked {\\n                    uint32 timeElapsed = blockTimestamp - _blockTimestampLast;\\n                    uint256 price0 = (uint256(_reserve1) << PRECISION) / _reserve0;\\n                    price0CumulativeLast += price0 * timeElapsed;\\n                    uint256 price1 = (uint256(_reserve0) << PRECISION) / _reserve1;\\n                    price1CumulativeLast += price1 * timeElapsed;\\n                }\\n            }\\n            reserve0 = uint112(balance0);\\n            reserve1 = uint112(balance1);\\n            blockTimestampLast = blockTimestamp;\\n        }\\n        emit Sync(balance0, balance1);\\n    }\\n\\n    function _mintFee(uint112 _reserve0, uint112 _reserve1) internal returns (uint256 _totalSupply, uint256 computed) {\\n        _totalSupply = totalSupply;\\n        uint256 _kLast = kLast;\\n        if (_kLast != 0) {\\n            computed = TridentMath.sqrt(uint256(_reserve0) * _reserve1);\\n            if (computed > _kLast) {\\n                // @dev `barFee` % of increase in liquidity.\\n                // It's going to be slightly less than `barFee` % in reality due to the math.\\n                uint256 liquidity = (_totalSupply * (computed - _kLast) * barFee) / computed / MAX_FEE;\\n                if (liquidity != 0) {\\n                    _mint(barFeeTo, liquidity);\\n                    _totalSupply += liquidity;\\n                }\\n            }\\n        }\\n    }\\n\\n    function _getAmountOut(\\n        uint256 amountIn,\\n        uint256 reserveAmountIn,\\n        uint256 reserveAmountOut\\n    ) internal view returns (uint256 amountOut) {\\n        uint256 amountInWithFee = amountIn * MAX_FEE_MINUS_SWAP_FEE;\\n        amountOut = (amountInWithFee * reserveAmountOut) / (reserveAmountIn * MAX_FEE + amountInWithFee);\\n    }\\n\\n    function _transfer(\\n        address token,\\n        uint256 shares,\\n        address to,\\n        bool unwrapBento\\n    ) internal {\\n        if (unwrapBento) {\\n            bento.withdraw(token, address(this), to, 0, shares);\\n        } else {\\n            bento.transfer(token, address(this), to, shares);\\n        }\\n    }\\n\\n    /// @dev This fee is charged to cover for `swapFee` when users add unbalanced liquidity.\\n    function _nonOptimalMintFee(\\n        uint256 _amount0,\\n        uint256 _amount1,\\n        uint256 _reserve0,\\n        uint256 _reserve1\\n    ) internal view returns (uint256 token0Fee, uint256 token1Fee) {\\n        if (_reserve0 == 0 || _reserve1 == 0) return (0, 0);\\n        uint256 amount1Optimal = (_amount0 * _reserve1) / _reserve0;\\n        if (amount1Optimal <= _amount1) {\\n            token1Fee = (swapFee * (_amount1 - amount1Optimal)) / (2 * MAX_FEE);\\n        } else {\\n            uint256 amount0Optimal = (_amount1 * _reserve0) / _reserve1;\\n            token0Fee = (swapFee * (_amount0 - amount0Optimal)) / (2 * MAX_FEE);\\n        }\\n    }\\n\\n    function getAssets() public view override returns (address[] memory assets) {\\n        assets = new address[](2);\\n        assets[0] = token0;\\n        assets[1] = token1;\\n    }\\n\\n    function getAmountOut(bytes calldata data) public view override returns (uint256 finalAmountOut) {\\n        (address tokenIn, uint256 amountIn) = abi.decode(data, (address, uint256));\\n        (uint112 _reserve0, uint112 _reserve1, ) = _getReserves();\\n        if (tokenIn == token0) {\\n            finalAmountOut = _getAmountOut(amountIn, _reserve0, _reserve1);\\n        } else {\\n            finalAmountOut = _getAmountOut(amountIn, _reserve1, _reserve0);\\n        }\\n    }\\n\\n    /// @dev returned values are in terms of BentoBox \\\"shares\\\".\\n    function getReserves()\\n        public\\n        view\\n        returns (\\n            uint112 _reserve0,\\n            uint112 _reserve1,\\n            uint32 _blockTimestampLast\\n        )\\n    {\\n        return _getReserves();\\n    }\\n\\n    /// @dev returned values are the native ERC20 token amounts.\\n    function getNativeReserves()\\n        public\\n        view\\n        returns (\\n            uint256 _nativeReserve0,\\n            uint256 _nativeReserve1,\\n            uint32 _blockTimestampLast\\n        )\\n    {\\n        (uint112 _reserve0, uint112 _reserve1, uint32 __blockTimestampLast) = _getReserves();\\n        _nativeReserve0 = bento.toAmount(token0, _reserve0, false);\\n        _nativeReserve1 = bento.toAmount(token1, _reserve1, false);\\n        _blockTimestampLast = __blockTimestampLast;\\n    }\\n}\\n\",\"keccak256\":\"0x670616ab620d4f2233143600da8bdcc9a8c897cc052cb8b466a4a72b19956be9\",\"license\":\"GPL-3.0-or-later\"},\"contracts/pool/ConstantProductPoolFactory.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n\\npragma solidity >=0.8.0;\\n\\nimport \\\"./ConstantProductPool.sol\\\";\\nimport \\\"./PoolDeployer.sol\\\";\\n\\n/// @notice Contract for deploying Trident exchange Constant Product Pool with configurations.\\n/// @author Mudit Gupta.\\ncontract ConstantProductPoolFactory is PoolDeployer {\\n    constructor(address _masterDeployer) PoolDeployer(_masterDeployer) {}\\n\\n    function deployPool(bytes memory _deployData) external returns (address pool) {\\n        (address tokenA, address tokenB, uint256 swapFee, bool twapSupport) = abi.decode(_deployData, (address, address, uint256, bool));\\n\\n        if (tokenA > tokenB) {\\n            (tokenA, tokenB) = (tokenB, tokenA);\\n        }\\n\\n        // @dev Strips any extra data.\\n        _deployData = abi.encode(tokenA, tokenB, swapFee, twapSupport);\\n\\n        address[] memory tokens = new address[](2);\\n        tokens[0] = tokenA;\\n        tokens[1] = tokenB;\\n\\n        // @dev Salt is not actually needed since `_deployData` is part of creationCode and already contains the salt.\\n        bytes32 salt = keccak256(_deployData);\\n        pool = address(new ConstantProductPool{salt: salt}(_deployData, masterDeployer));\\n        _registerPool(pool, tokens, salt);\\n    }\\n}\\n\",\"keccak256\":\"0x3deab7704b9619a914ae8b6c4b933392e1049a761457a06f61af3e2bbe3f97d1\",\"license\":\"GPL-3.0-or-later\"},\"contracts/pool/PoolDeployer.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n\\npragma solidity >=0.8.0;\\n\\n/// @notice Trident pool deployer for whitelisted template factories.\\n/// @author Mudit Gupta.\\nabstract contract PoolDeployer {\\n    address public immutable masterDeployer;\\n\\n    mapping(address => mapping(address => address[])) public pools;\\n    mapping(bytes32 => address) public configAddress;\\n\\n    modifier onlyMaster() {\\n        require(msg.sender == masterDeployer, \\\"UNAUTHORIZED_DEPLOYER\\\");\\n        _;\\n    }\\n\\n    constructor(address _masterDeployer) {\\n        require(_masterDeployer != address(0), \\\"ZERO_ADDRESS\\\");\\n        masterDeployer = _masterDeployer;\\n    }\\n\\n    function _registerPool(\\n        address pool,\\n        address[] memory tokens,\\n        bytes32 salt\\n    ) internal onlyMaster {\\n        // @dev Store the address of the deployed contract.\\n        configAddress[salt] = pool;\\n        // @dev Attacker used underflow, it was not very effective. poolimon!\\n        // null token array would cause deployment to fail via out of bounds memory axis/gas limit.\\n        unchecked {\\n            for (uint256 i; i < tokens.length - 1; i++) {\\n                require(tokens[i] < tokens[i + 1], \\\"INVALID_TOKEN_ORDER\\\");\\n                for (uint256 j = i + 1; j < tokens.length; j++) {\\n                    pools[tokens[i]][tokens[j]].push(pool);\\n                    pools[tokens[j]][tokens[i]].push(pool);\\n                }\\n            }\\n        }\\n    }\\n\\n    function poolsCount(address token0, address token1) external view returns (uint256 count) {\\n        count = pools[token0][token1].length;\\n    }\\n\\n    function getPools(\\n        address token0,\\n        address token1,\\n        uint256 startIndex,\\n        uint256 endIndex\\n    ) external view returns (address[] memory pairPools) {\\n        pairPools = new address[](endIndex - startIndex);\\n        for (uint256 i = 0; startIndex < endIndex; i++) {\\n            pairPools[i] = pools[token0][token1][startIndex];\\n            startIndex++;\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x6098ddd6290f3403f3dba736632d3841244663bec6ec5bb5e318b27fdb6e88f1\",\"license\":\"GPL-3.0-or-later\"},\"contracts/pool/TridentERC20.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n\\npragma solidity >=0.8.0;\\n\\n/// @notice Trident pool ERC-20 with EIP-2612 extension.\\n/// @author Adapted from RariCapital, https://github.com/Rari-Capital/solmate/blob/main/src/erc20/ERC20.sol,\\n/// License-Identifier: AGPL-3.0-only.\\nabstract contract TridentERC20 {\\n    event Transfer(address indexed sender, address indexed recipient, uint256 amount);\\n    event Approval(address indexed owner, address indexed spender, uint256 amount);\\n\\n    string public constant name = \\\"Sushi LP Token\\\";\\n    string public constant symbol = \\\"SLP\\\";\\n    uint8 public constant decimals = 18;\\n\\n    uint256 public totalSupply;\\n    /// @notice owner -> balance mapping.\\n    mapping(address => uint256) public balanceOf;\\n    /// @notice owner -> spender -> allowance mapping.\\n    mapping(address => mapping(address => uint256)) public allowance;\\n\\n    /// @notice Chain Id at this contract's deployment.\\n    uint256 internal immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n    /// @notice EIP-712 typehash for this contract's domain at deployment.\\n    bytes32 internal immutable _DOMAIN_SEPARATOR;\\n    /// @notice EIP-712 typehash for this contract's {permit} struct.\\n    bytes32 public constant PERMIT_TYPEHASH =\\n        keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n    /// @notice owner -> nonce mapping used in {permit}.\\n    mapping(address => uint256) public nonces;\\n\\n    constructor() {\\n        DOMAIN_SEPARATOR_CHAIN_ID = block.chainid;\\n        _DOMAIN_SEPARATOR = _calculateDomainSeparator();\\n    }\\n\\n    function _calculateDomainSeparator() internal view returns (bytes32 domainSeperator) {\\n        domainSeperator = keccak256(\\n            abi.encode(\\n                keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),\\n                keccak256(bytes(name)),\\n                keccak256(bytes(\\\"1\\\")),\\n                block.chainid,\\n                address(this)\\n            )\\n        );\\n    }\\n\\n    /// @notice EIP-712 typehash for this contract's domain.\\n    function DOMAIN_SEPARATOR() public view returns (bytes32 domainSeperator) {\\n        domainSeperator = block.chainid == DOMAIN_SEPARATOR_CHAIN_ID ? _DOMAIN_SEPARATOR : _calculateDomainSeparator();\\n    }\\n\\n    /// @notice Approves `amount` from `msg.sender` to be spent by `spender`.\\n    /// @param spender Address of the party that can pull tokens from `msg.sender`'s account.\\n    /// @param amount The maximum collective `amount` that `spender` can pull.\\n    /// @return (bool) Returns 'true' if succeeded.\\n    function approve(address spender, uint256 amount) external returns (bool) {\\n        allowance[msg.sender][spender] = amount;\\n        emit Approval(msg.sender, spender, amount);\\n        return true;\\n    }\\n\\n    /// @notice Transfers `amount` tokens from `msg.sender` to `recipient`.\\n    /// @param recipient The address to move tokens to.\\n    /// @param amount The token `amount` to move.\\n    /// @return (bool) Returns 'true' if succeeded.\\n    function transfer(address recipient, uint256 amount) external returns (bool) {\\n        balanceOf[msg.sender] -= amount;\\n        // @dev This is safe from overflow - the sum of all user\\n        // balances can't exceed 'type(uint256).max'.\\n        unchecked {\\n            balanceOf[recipient] += amount;\\n        }\\n        emit Transfer(msg.sender, recipient, amount);\\n        return true;\\n    }\\n\\n    /// @notice Transfers `amount` tokens from `sender` to `recipient`. Caller needs approval from `from`.\\n    /// @param sender Address to pull tokens `from`.\\n    /// @param recipient The address to move tokens to.\\n    /// @param amount The token `amount` to move.\\n    /// @return (bool) Returns 'true' if succeeded.\\n    function transferFrom(\\n        address sender,\\n        address recipient,\\n        uint256 amount\\n    ) external returns (bool) {\\n        if (allowance[sender][msg.sender] != type(uint256).max) {\\n            allowance[sender][msg.sender] -= amount;\\n        }\\n        balanceOf[sender] -= amount;\\n        // @dev This is safe from overflow - the sum of all user\\n        // balances can't exceed 'type(uint256).max'.\\n        unchecked {\\n            balanceOf[recipient] += amount;\\n        }\\n        emit Transfer(sender, recipient, amount);\\n        return true;\\n    }\\n\\n    /// @notice Triggers an approval from `owner` to `spender`.\\n    /// @param owner The address to approve from.\\n    /// @param spender The address to be approved.\\n    /// @param amount The number of tokens that are approved (2^256-1 means infinite).\\n    /// @param deadline The time at which to expire the signature.\\n    /// @param v The recovery byte of the signature.\\n    /// @param r Half of the ECDSA signature pair.\\n    /// @param s Half of the ECDSA signature pair.\\n    function permit(\\n        address owner,\\n        address spender,\\n        uint256 amount,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external {\\n        require(deadline >= block.timestamp, \\\"PERMIT_DEADLINE_EXPIRED\\\");\\n        bytes32 digest = keccak256(\\n            abi.encodePacked(\\n                \\\"\\\\x19\\\\x01\\\",\\n                DOMAIN_SEPARATOR(),\\n                keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, amount, nonces[owner]++, deadline))\\n            )\\n        );\\n        address recoveredAddress = ecrecover(digest, v, r, s);\\n        require(recoveredAddress != address(0) && recoveredAddress == owner, \\\"INVALID_PERMIT_SIGNATURE\\\");\\n        allowance[recoveredAddress][spender] = amount;\\n        emit Approval(owner, spender, amount);\\n    }\\n\\n    function _mint(address recipient, uint256 amount) internal {\\n        totalSupply += amount;\\n        // @dev This is safe from overflow - the sum of all user\\n        // balances can't exceed 'type(uint256).max'.\\n        unchecked {\\n            balanceOf[recipient] += amount;\\n        }\\n        emit Transfer(address(0), recipient, amount);\\n    }\\n\\n    function _burn(address sender, uint256 amount) internal {\\n        balanceOf[sender] -= amount;\\n        // @dev This is safe from underflow - users won't ever\\n        // have a balance larger than `totalSupply`.\\n        unchecked {\\n            totalSupply -= amount;\\n        }\\n        emit Transfer(sender, address(0), amount);\\n    }\\n}\\n\",\"keccak256\":\"0xb249a6d507f6911b7de4f9655a9736710fac9847982ad9afa18650db9a84794d\",\"license\":\"GPL-3.0-or-later\"}},\"version\":1}",
  "bytecode": "0x60a060405234801561001057600080fd5b5060405161507938038061507983398101604081905261002f9161008f565b806001600160a01b0381166100795760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b604482015260640160405180910390fd5b60601b6001600160601b031916608052506100bf565b6000602082840312156100a157600080fd5b81516001600160a01b03811681146100b857600080fd5b9392505050565b60805160601c614f8e6100eb6000396000818161015a0152818161038d01526105530152614f8e6000f3fe60806040523480156200001157600080fd5b50600436106200007b5760003560e01c806371a25812116200005657806371a25812146200012e578063cf58879a1462000154578063f6ab6d99146200017c57600080fd5b8063169c4cef146200008057806327c3cae114620000c15780635bc93d6c14620000d8575b600080fd5b6200009762000091366004620009af565b620001b5565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b62000097620000d236600462000a5a565b62000208565b6200011f620000e936600462000971565b73ffffffffffffffffffffffffffffffffffffffff91821660009081526020818152604080832093909416825291909152205490565b604051908152602001620000b8565b620001456200013f366004620009f5565b62000401565b604051620000b8919062000b33565b620000977f000000000000000000000000000000000000000000000000000000000000000081565b620000976200018d36600462000a40565b60016020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60006020528260005260406000206020528160005260406000208181548110620001de57600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16925083915050565b60008060008060008580602001905181019062000226919062000911565b93509350935093508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16111562000267579192915b6040805173ffffffffffffffffffffffffffffffffffffffff808716602083015285169181019190915260608101839052811515608082015260a001604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152600280845260608401909252975060009190816020016020820280368337019050509050848160008151811062000309576200030962000ca8565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505083816001815181106200035a576200035a62000ca8565b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101820152875190880120604051819089907f000000000000000000000000000000000000000000000000000000000000000090620003b89062000903565b620003c592919062000b8f565b8190604051809103906000f5905080158015620003e6573d6000803e3d6000fd5b509650620003f68783836200053b565b505050505050919050565b60606200040f838362000c23565b67ffffffffffffffff8111156200042a576200042a62000cd7565b60405190808252806020026020018201604052801562000454578160200160208202803683370190505b50905060005b82841015620005325773ffffffffffffffffffffffffffffffffffffffff808716600090815260208181526040808320938916835292905220805485908110620004a857620004a862000ca8565b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828281518110620004e857620004e862000ca8565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015283620005198162000c3d565b9450508080620005299062000c3d565b9150506200045a565b50949350505050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614620005e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f554e415554484f52495a45445f4445504c4f594552000000000000000000000060448201526064015b60405180910390fd5b600081815260016020526040812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86161790555b6001835103811015620008fd5782816001018151811062000652576200065262000ca8565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1683828151811062000685576200068562000ca8565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16106200070c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f494e56414c49445f544f4b454e5f4f52444552000000000000000000000000006044820152606401620005d7565b600181015b8351811015620008f35760008085848151811062000733576200073362000ca8565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008583815181106200078c576200078c62000ca8565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff90811683528282019390935260409091016000908120805460018101825590825291812090910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001692881692909217909155845181908690849081106200081b576200081b62000ca8565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085848151811062000874576200087462000ca8565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff908116835282820193909352604090910160009081208054600180820183559183529290912090910180547fffffffffffffffffffffffff000000000000000000000000000000000000000016928816929092179091550162000711565b506001016200062d565b50505050565b61422c8062000d2d83390190565b600080600080608085870312156200092857600080fd5b8451620009358162000d06565b6020860151909450620009488162000d06565b60408601516060870151919450925080151581146200096657600080fd5b939692955090935050565b600080604083850312156200098557600080fd5b8235620009928162000d06565b91506020830135620009a48162000d06565b809150509250929050565b600080600060608486031215620009c557600080fd5b8335620009d28162000d06565b92506020840135620009e48162000d06565b929592945050506040919091013590565b6000806000806080858703121562000a0c57600080fd5b843562000a198162000d06565b9350602085013562000a2b8162000d06565b93969395505050506040820135916060013590565b60006020828403121562000a5357600080fd5b5035919050565b60006020828403121562000a6d57600080fd5b813567ffffffffffffffff8082111562000a8657600080fd5b818401915084601f83011262000a9b57600080fd5b81358181111562000ab05762000ab062000cd7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171562000af95762000af962000cd7565b8160405282815287602084870101111562000b1357600080fd5b826020860160208301376000928101602001929092525095945050505050565b6020808252825182820181905260009190848201906040850190845b8181101562000b8357835173ffffffffffffffffffffffffffffffffffffffff168352928401929184019160010162000b4f565b50909695505050505050565b604081526000835180604084015260005b8181101562000bbf576020818701810151606086840101520162000ba0565b8181111562000bd2576000606083860101525b5073ffffffffffffffffffffffffffffffffffffffff93909316602083015250601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601606001919050565b60008282101562000c385762000c3862000c79565b500390565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562000c725762000c7262000c79565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff8116811462000d2957600080fd5b5056fe6101a06040523480156200001257600080fd5b506040516200422c3803806200422c833981016040819052620000359162000562565b4660805262000112604080518082018252600e81526d29bab9b434902628102a37b5b2b760911b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527fc2bf45081e840722410522aa366600d7fe4da5bfb5a5b417f4d5125b4ed180a4818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a0808301919091528351808303909101815260c0909101909252815191012090565b60a081815250506000806000808580602001905181019062000135919062000502565b929650909450925090506001600160a01b0384166200018a5760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b60448201526064015b60405180910390fd5b826001600160a01b0316846001600160a01b03161415620001ee5760405162461bcd60e51b815260206004820152601360248201527f4944454e544943414c5f41444452455353455300000000000000000000000000604482015260640162000181565b6001600160a01b038416301415620002395760405162461bcd60e51b815260206004820152600d60248201526c24a72b20a624a22faa27a5a2a760991b604482015260640162000181565b6001600160a01b038316301415620002845760405162461bcd60e51b815260206004820152600d60248201526c24a72b20a624a22faa27a5a2a760991b604482015260640162000181565b612710821115620002cb5760405162461bcd60e51b815260206004820152601060248201526f494e56414c49445f535741505f46454560801b604482015260640162000181565b6001600160601b0319606085811b82166101605284901b166101805260c082905261271082900360e052604080516360a56c0160e11b815290516001600160a01b0387169163c14ad802916004808301926020929190829003018186803b1580156200033657600080fd5b505afa1580156200034b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000371919062000653565b600481905550846001600160a01b0316630c0a0cd26040518163ffffffff1660e01b815260040160206040518083038186803b158015620003b157600080fd5b505afa158015620003c6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003ec9190620004db565b6001600160a01b0316610100816001600160a01b031660601b81525050846001600160a01b0316634da318276040518163ffffffff1660e01b815260040160206040518083038186803b1580156200044357600080fd5b505afa15801562000458573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200047e9190620004db565b6001600160601b0319606091821b8116610120529086901b166101405260016009558015620004bd57600880546001600160e01b0316600160e01b1790555b5050505050506200069c565b8051620004d68162000683565b919050565b600060208284031215620004ee57600080fd5b8151620004fb8162000683565b9392505050565b600080600080608085870312156200051957600080fd5b8451620005268162000683565b6020860151909450620005398162000683565b60408601516060870151919450925080151581146200055757600080fd5b939692955090935050565b600080604083850312156200057657600080fd5b82516001600160401b03808211156200058e57600080fd5b818501915085601f830112620005a357600080fd5b815181811115620005b857620005b86200066d565b604051601f8201601f19908116603f01168101908382118183101715620005e357620005e36200066d565b816040528281526020935088848487010111156200060057600080fd5b600091505b8282101562000624578482018401518183018501529083019062000605565b82821115620006365760008484830101525b955062000648915050858201620004c9565b925050509250929050565b6000602082840312156200066657600080fd5b5051919050565b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146200069957600080fd5b50565b60805160a05160c05160e0516101005160601c6101205160601c6101405160601c6101605160601c6101805160601c613a1b62000811600039600081816105d8015281816108300152818161095f01528181610a0d015281816110900152818161119801528181611599015281816116080152818161195f01528181611abe01528181612273015281816122fa0152612b4b015260008181610349015281816107ac01528181610af201528181610c21015281816110640152818161112f01528181611545015281816116e90152818161185901528181611a5001528181611f92015281816123330152818161241e0152612a610152600081816105b10152611e7a0152600081816103f5015281816118a6015281816119a7015281816128e5015281816129c101528181612a940152612b7c0152600081816102fd0152612f760152600061282301526000818161041c015281816132250152613290015260006113a80152600061127f0152613a1b6000f3fe608060405234801561001057600080fd5b50600436106102265760003560e01c806365dfc7671161012a578063a69840a8116100bd578063c14ad8021161008c578063d21220a711610071578063d21220a7146105d3578063d505accf146105fa578063dd62ed3e1461060d57600080fd5b8063c14ad802146105a3578063cf58879a146105ac57600080fd5b8063a69840a814610543578063a8f1f52e1461056a578063a9059cbb1461057d578063af8c09bf1461059057600080fd5b80637ba0e2e7116100f95780637ba0e2e7146104ca5780637ecebe00146104dd57806392bc3219146104fd57806395d89b411461050757600080fd5b806365dfc7671461046357806367e4ac2c1461048c57806370a08231146104a15780637464fc3d146104c157600080fd5b80632a07b6c7116101bd5780634da318271161018c5780635909c0d5116101715780635909c0d51461043e5780635a3d549314610447578063627dd56a1461045057600080fd5b80634da31827146103f057806354cf2aeb1461041757600080fd5b80632a07b6c71461038757806330adf81f146103a7578063313ce567146103ce5780633644e515146103e857600080fd5b80630c0a0cd2116101f95780630c0a0cd2146102f85780630dfe16811461034457806318160ddd1461036b57806323b872dd1461037457600080fd5b8063053da1c81461022b57806306fdde03146102515780630902f1ac1461029a578063095ea7b3146102d5575b600080fd5b61023e610239366004613619565b610638565b6040519081526020015b60405180910390f35b61028d6040518060400160405280600e81526020017f5375736869204c5020546f6b656e00000000000000000000000000000000000081525081565b60405161024891906137f2565b6102a2610cdd565b604080516dffffffffffffffffffffffffffff948516815293909216602084015263ffffffff1690820152606001610248565b6102e86102e33660046134fc565b610d46565b6040519015158152602001610248565b61031f7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610248565b61031f7f000000000000000000000000000000000000000000000000000000000000000081565b61023e60005481565b6102e8610382366004613561565b610dbf565b61039a610395366004613619565b610f0b565b604051610248919061378d565b61023e7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b6103d6601281565b60405160ff9091168152602001610248565b61023e61127b565b61031f7f000000000000000000000000000000000000000000000000000000000000000081565b61023e7f000000000000000000000000000000000000000000000000000000000000000081565b61023e60055481565b61023e60065481565b61023e61045e366004613619565b6113ca565b61046b6117ba565b60408051938452602084019290925263ffffffff1690820152606001610248565b610494611a2e565b6040516102489190613733565b61023e6104af36600461334d565b60016020526000908152604090205481565b61023e60075481565b61023e6104d8366004613619565b611b2d565b61023e6104eb36600461334d565b60036020526000908152604090205481565b610505611e78565b005b61028d6040518060400160405280600381526020017f534c50000000000000000000000000000000000000000000000000000000000081525081565b61023e7f54726964656e743a436f6e7374616e7450726f6475637400000000000000000081565b61023e610578366004613619565b611f1b565b6102e861058b3660046134fc565b61204e565b61023e61059e366004613619565b6120d3565b61023e60045481565b61031f7f000000000000000000000000000000000000000000000000000000000000000081565b61031f7f000000000000000000000000000000000000000000000000000000000000000081565b6105056106083660046135a2565b6124c9565b61023e61061b366004613528565b600260209081526000928352604080842090915290825290205481565b60006009546001146106ab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f4c4f434b4544000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b60026009556000808080806106c2878901896133b8565b94509450945094509450600080600061072a6008546dffffffffffffffffffffffffffff808216926e01000000000000000000000000000083049091169163ffffffff7c01000000000000000000000000000000000000000000000000000000009091041690565b9250925092506000836dffffffffffffffffffffffffffff16116107aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f504f4f4c5f554e494e495449414c495a4544000000000000000000000000000060448201526064016106a2565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161415610a0b5761082985846dffffffffffffffffffffffffffff16846dffffffffffffffffffffffffffff1661281b565b98506108577f00000000000000000000000000000000000000000000000000000000000000008a898961287e565b6040517fbd50c7b1000000000000000000000000000000000000000000000000000000008152339063bd50c7b1906108939087906004016137f2565b600060405180830381600087803b1580156108ad57600080fd5b505af11580156108c1573d6000803e3d6000fd5b505050506000806108d0612a24565b9150915086856dffffffffffffffffffffffffffff1683031015610950576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f494e53554646494349454e545f414d4f554e545f494e0000000000000000000060448201526064016106a2565b61095d8282878787612bfe565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fcd3829a3813dc3cdd188fd3d01dcf3268c16be2fdd2dd21d0665418816e460628a8f6040516109fc929190918252602082015260400190565b60405180910390a45050610cc9565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614610ac0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f494e56414c49445f494e5055545f544f4b454e0000000000000000000000000060448201526064016106a2565b610aeb85836dffffffffffffffffffffffffffff16856dffffffffffffffffffffffffffff1661281b565b9850610b197f00000000000000000000000000000000000000000000000000000000000000008a898961287e565b6040517fbd50c7b1000000000000000000000000000000000000000000000000000000008152339063bd50c7b190610b559087906004016137f2565b600060405180830381600087803b158015610b6f57600080fd5b505af1158015610b83573d6000803e3d6000fd5b50505050600080610b92612a24565b9150915086846dffffffffffffffffffffffffffff1682031015610c12576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f494e53554646494349454e545f414d4f554e545f494e0000000000000000000060448201526064016106a2565b610c1f8282878787612bfe565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fcd3829a3813dc3cdd188fd3d01dcf3268c16be2fdd2dd21d0665418816e460628a8f604051610cbe929190918252602082015260400190565b60405180910390a450505b505060016009555094979650505050505050565b6000806000610d3b6008546dffffffffffffffffffffffffffff808216926e01000000000000000000000000000083049091169163ffffffff7c01000000000000000000000000000000000000000000000000000000009091041690565b925092509250909192565b33600081815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610dae9086815260200190565b60405180910390a350600192915050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526002602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14610e5c5773ffffffffffffffffffffffffffffffffffffffff8416600090815260026020908152604080832033845290915281208054849290610e569084906138a0565b90915550505b73ffffffffffffffffffffffffffffffffffffffff841660009081526001602052604081208054849290610e919084906138a0565b909155505073ffffffffffffffffffffffffffffffffffffffff808416600081815260016020526040908190208054860190555190918616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610ef99086815260200190565b60405180910390a35060019392505050565b6060600954600114610f79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f4c4f434b4544000000000000000000000000000000000000000000000000000060448201526064016106a2565b6002600955600080610f8d848601866134c7565b915091506000806000610fef6008546dffffffffffffffffffffffffffff808216926e01000000000000000000000000000083049091169163ffffffff7c01000000000000000000000000000000000000000000000000000000009091041690565b925092509250600080611000612a24565b306000908152600160205260408120549294509092506110208787612ef2565b5090506000816110308685613863565b61103a919061384f565b90506000826110498686613863565b611053919061384f565b905061105f3085612fb2565b61108b7f0000000000000000000000000000000000000000000000000000000000000000838d8d61287e565b6110b77f0000000000000000000000000000000000000000000000000000000000000000828d8d61287e565b818603955080850394506110ce86868b8b8b612bfe565b6110e06110db8688613863565b613045565b6007556040805160028082526060820190925290816020015b60408051808201909152600080825260208201528152602001906001900390816110f9579050509b5060405180604001604052807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168152602001838152508c60008151811061118057611180613962565b602002602001018190525060405180604001604052807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168152602001828152508c6001815181106111e9576111e9613962565b60200260200101819052508a73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496848460405161125c929190918252602082015260400190565b60405180910390a35050600160095550979a9950505050505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000046146113a55750604080518082018252600e81527f5375736869204c5020546f6b656e00000000000000000000000000000000000060209182015281518083018352600181527f31000000000000000000000000000000000000000000000000000000000000009082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527fc2bf45081e840722410522aa366600d7fe4da5bfb5a5b417f4d5125b4ed180a4818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a0808301919091528351808303909101815260c0909101909252815191012090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6000600954600114611438576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f4c4f434b4544000000000000000000000000000000000000000000000000000060448201526064016106a2565b60026009556000808061144d85870187613371565b92509250925060008060006114b16008546dffffffffffffffffffffffffffff808216926e01000000000000000000000000000083049091169163ffffffff7c01000000000000000000000000000000000000000000000000000000009091041690565b9250925092506000836dffffffffffffffffffffffffffff1611611531576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f504f4f4c5f554e494e495449414c495a4544000000000000000000000000000060448201526064016106a2565b60008061153c612a24565b915091506000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff161415611606577f00000000000000000000000000000000000000000000000000000000000000009050866dffffffffffffffffffffffffffff16840391506115fa82886dffffffffffffffffffffffffffff16886dffffffffffffffffffffffffffff1661281b565b9a508a83039250611722565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16146116bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f494e56414c49445f494e5055545f544f4b454e0000000000000000000000000060448201526064016106a2565b50506008546dffffffffffffffffffffffffffff6e01000000000000000000000000000090910481168203907f00000000000000000000000000000000000000000000000000000000000000009061171a908390888116908a1661281b565b9a508a840393505b61172e818c8b8b61287e565b61173b8484898989612bfe565b8073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fcd3829a3813dc3cdd188fd3d01dcf3268c16be2fdd2dd21d0665418816e46062858f604051610cbe929190918252602082015260400190565b60008060008060008061181c6008546dffffffffffffffffffffffffffff808216926e01000000000000000000000000000083049091169163ffffffff7c01000000000000000000000000000000000000000000000000000000009091041690565b6040517f5662311800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526dffffffffffffffffffffffffffff851660248301526000604483015293965091945092507f00000000000000000000000000000000000000000000000000000000000000009091169063566231189060640160206040518083038186803b1580156118ea57600080fd5b505afa1580156118fe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611922919061368b565b6040517f5662311800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526dffffffffffffffffffffffffffff85166024830152600060448301529197507f00000000000000000000000000000000000000000000000000000000000000009091169063566231189060640160206040518083038186803b1580156119eb57600080fd5b505afa1580156119ff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a23919061368b565b959690945092505050565b60408051600280825260608083018452926020830190803683370190505090507f000000000000000000000000000000000000000000000000000000000000000081600081518110611a8257611a82613962565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611af057611af0613962565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505090565b6000600954600114611b9b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f4c4f434b4544000000000000000000000000000000000000000000000000000060448201526064016106a2565b60026009556000611bae8385018561334d565b90506000806000611c0e6008546dffffffffffffffffffffffffffff808216926e01000000000000000000000000000083049091169163ffffffff7c01000000000000000000000000000000000000000000000000000000009091041690565b925092509250600080611c1f612a24565b90925090506000611c336110db8385613863565b90506000611c516dffffffffffffffffffffffffffff8816856138a0565b90506000611c6f6dffffffffffffffffffffffffffff8816856138a0565b9050600080611ca084848c6dffffffffffffffffffffffffffff168c6dffffffffffffffffffffffffffff166131ca565b9092509050611caf828b613805565b9950611cbb818a613805565b9850600080611cca8c8c612ef2565b915091508160001415611d6d57600086118015611ce75750600085115b611d4d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f494e56414c49445f414d4f554e5453000000000000000000000000000000000060448201526064016106a2565b611d596103e8886138a0565b9d50611d6860006103e86132cd565b611d89565b80870381611d7b8483613863565b611d85919061384f565b9e50505b8d611df0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f494e53554646494349454e545f4c49515549444954595f4d494e54454400000060448201526064016106a2565b611dfa8d8f6132cd565b611e0789898e8e8e612bfe565b6007879055604080518781526020810187905273ffffffffffffffffffffffffffffffffffffffff8f169133917fdbba30eb0402b389513e87f51f4db2db80bed454384ec6925a24097c3548a02a910160405180910390a35050600160095550999c9b505050505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c14ad8026040518163ffffffff1660e01b815260040160206040518083038186803b158015611ede57600080fd5b505afa158015611ef2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f16919061368b565b600455565b60008080611f2b848601866134fc565b91509150600080611f8b6008546dffffffffffffffffffffffffffff808216926e01000000000000000000000000000083049091169163ffffffff7c01000000000000000000000000000000000000000000000000000000009091041690565b50915091507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156120165761200f83836dffffffffffffffffffffffffffff16836dffffffffffffffffffffffffffff1661281b565b9450612044565b61204183826dffffffffffffffffffffffffffff16846dffffffffffffffffffffffffffff1661281b565b94505b5050505092915050565b3360009081526001602052604081208054839190839061206f9084906138a0565b909155505073ffffffffffffffffffffffffffffffffffffffff8316600081815260016020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610dae9086815260200190565b6000600954600114612141576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f4c4f434b4544000000000000000000000000000000000000000000000000000060448201526064016106a2565b60026009556000808061215685870187613371565b92509250925060008060006121ba6008546dffffffffffffffffffffffffffff808216926e01000000000000000000000000000083049091169163ffffffff7c01000000000000000000000000000000000000000000000000000000009091041690565b9250925092506000806121cb612a24565b306000908152600160205260408120549294509092506121eb8787612ef2565b5090506000816121fb8685613863565b612205919061384f565b90506000826122148686613863565b61221e919061384f565b905061222a3085612fb2565b61226b612247826dffffffffffffffffffffffffffff8b166138a0565b612261846dffffffffffffffffffffffffffff8d166138a0565b6110db9190613863565b6007819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff161415612331576122f482838b6dffffffffffffffffffffffffffff1603838b6dffffffffffffffffffffffffffff160361281b565b016123217f0000000000000000000000000000000000000000000000000000000000000000828d8d61287e565b9b5050918a90039160008b612451565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff16146123e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f494e56414c49445f4f55545055545f544f4b454e00000000000000000000000060448201526064016106a2565b61241581828a6dffffffffffffffffffffffffffff1603848c6dffffffffffffffffffffffffffff160361281b565b820191506124457f0000000000000000000000000000000000000000000000000000000000000000838d8d61287e565b509a50928a9003928a60005b61245e86868b8b8b612bfe565b604080518381526020810183905273ffffffffffffffffffffffffffffffffffffffff8d169133917fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496910160405180910390a35050600160095550989b9a5050505050505050505050565b42841015612533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064016106a2565b600061253d61127b565b73ffffffffffffffffffffffffffffffffffffffff8916600090815260036020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9928c928c928c92909190612598836138b7565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810187905260e001604051602081830303815290604052805190602001206040516020016126399291907f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa1580156126c2573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81161580159061273d57508873ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b6127a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f494e56414c49445f5045524d49545f5349474e4154555245000000000000000060448201526064016106a2565b73ffffffffffffffffffffffffffffffffffffffff81811660009081526002602090815260408083208c8516808552908352928190208b9055518a815291928c16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050505050505050565b6000806128487f000000000000000000000000000000000000000000000000000000000000000086613863565b90508061285761271086613863565b6128619190613837565b61286b8483613863565b612875919061384f565b95945050505050565b8015612967576040517f97da6d3000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152306024830152838116604483015260006064830152608482018590527f000000000000000000000000000000000000000000000000000000000000000016906397da6d309060a4016040805180830381600087803b15801561292857600080fd5b505af115801561293c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061296091906136a4565b5050612a1e565b6040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301523060248301528381166044830152606482018590527f0000000000000000000000000000000000000000000000000000000000000000169063f18d03cc90608401600060405180830381600087803b158015612a0557600080fd5b505af1158015612a19573d6000803e3d6000fd5b505050505b50505050565b6040517ff7888aec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116600483015230602483015260009182917f0000000000000000000000000000000000000000000000000000000000000000169063f7888aec9060440160206040518083038186803b158015612ad657600080fd5b505afa158015612aea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b0e919061368b565b6040517ff7888aec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301523060248301529193507f00000000000000000000000000000000000000000000000000000000000000009091169063f7888aec9060440160206040518083038186803b158015612bc057600080fd5b505afa158015612bd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bf8919061368b565b90509091565b6dffffffffffffffffffffffffffff8511801590612c2a57506dffffffffffffffffffffffffffff8411155b612c90576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f4f564552464c4f5700000000000000000000000000000000000000000000000060448201526064016106a2565b63ffffffff8116612cf257600880546dffffffffffffffffffffffffffff8681166e010000000000000000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000090921690881617179055612eb2565b6000612d03640100000000426138f0565b90508163ffffffff168163ffffffff1614158015612d3057506dffffffffffffffffffffffffffff841615155b8015612d4b57506dffffffffffffffffffffffffffff831615155b15612e105781810360006dffffffffffffffffffffffffffff86167bffffffffffffffffffffffffffff0000000000000000000000000000607087901b1681612d9657612d96613933565b600580549290910463ffffffff851681029092019055905060006dffffffffffffffffffffffffffff8616607088901b7bffffffffffffffffffffffffffff00000000000000000000000000001681612df157612df1613933565b0490508263ffffffff1681026006600082825401925050819055505050505b6008805463ffffffff9092167c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff6dffffffffffffffffffffffffffff8881166e010000000000000000000000000000027fffffffff00000000000000000000000000000000000000000000000000000000909516908a161793909317929092169190911790555b60408051868152602081018690527fcf2aa50876cdfbb541206f89af0ee78d44a2abf8d328e37fa4917f982149848a910160405180910390a15050505050565b600080546007549091908015612faa57612f226110db6dffffffffffffffffffffffffffff808716908816613863565b915080821115612faa576000612710836004548486612f4191906138a0565b612f4b9088613863565b612f559190613863565b612f5f919061384f565b612f69919061384f565b90508015612fa857612f9b7f0000000000000000000000000000000000000000000000000000000000000000826132cd565b612fa58185613837565b93505b505b509250929050565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604081208054839290612fe79084906138a0565b909155505060008054829003815560405182815273ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b60008161305457506000919050565b816001700100000000000000000000000000000000821061307a5760809190911c9060401b5b6801000000000000000082106130955760409190911c9060201b5b64010000000082106130ac5760209190911c9060101b5b6201000082106130c15760109190911c9060081b5b61010082106130d55760089190911c9060041b5b601082106130e85760049190911c9060021b5b600882106130f45760011b5b600181858161310557613105613933565b048201901c9050600181858161311d5761311d613933565b048201901c9050600181858161313557613135613933565b048201901c9050600181858161314d5761314d613933565b048201901c9050600181858161316557613165613933565b048201901c9050600181858161317d5761317d613933565b048201901c9050600181858161319557613195613933565b048201901c905060008185816131ad576131ad613933565b0490508082106131bd57806131bf565b815b93505050505b919050565b6000808315806131d8575082155b156131e8575060009050806132c4565b6000846131f58589613863565b6131ff919061384f565b905085811161325a576132156127106002613863565b61321f82886138a0565b613249907f0000000000000000000000000000000000000000000000000000000000000000613863565b613253919061384f565b91506132c2565b6000846132678789613863565b613271919061384f565b90506132806127106002613863565b61328a828a6138a0565b6132b4907f0000000000000000000000000000000000000000000000000000000000000000613863565b6132be919061384f565b9350505b505b94509492505050565b806000808282546132de9190613837565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000818152600160209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101613039565b803580151581146131c557600080fd5b60006020828403121561335f57600080fd5b813561336a816139c0565b9392505050565b60008060006060848603121561338657600080fd5b8335613391816139c0565b925060208401356133a1816139c0565b91506133af6040850161333d565b90509250925092565b600080600080600060a086880312156133d057600080fd5b85356133db816139c0565b945060208601356133eb816139c0565b93506133f96040870161333d565b925060608601359150608086013567ffffffffffffffff8082111561341d57600080fd5b818801915088601f83011261343157600080fd5b81358181111561344357613443613991565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561348957613489613991565b816040528281528b60208487010111156134a257600080fd5b8260208601602083013760006020848301015280955050505050509295509295909350565b600080604083850312156134da57600080fd5b82356134e5816139c0565b91506134f36020840161333d565b90509250929050565b6000806040838503121561350f57600080fd5b823561351a816139c0565b946020939093013593505050565b6000806040838503121561353b57600080fd5b8235613546816139c0565b91506020830135613556816139c0565b809150509250929050565b60008060006060848603121561357657600080fd5b8335613581816139c0565b92506020840135613591816139c0565b929592945050506040919091013590565b600080600080600080600060e0888a0312156135bd57600080fd5b87356135c8816139c0565b965060208801356135d8816139c0565b95506040880135945060608801359350608088013560ff811681146135fc57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806020838503121561362c57600080fd5b823567ffffffffffffffff8082111561364457600080fd5b818501915085601f83011261365857600080fd5b81358181111561366757600080fd5b86602082850101111561367957600080fd5b60209290920196919550909350505050565b60006020828403121561369d57600080fd5b5051919050565b600080604083850312156136b757600080fd5b505080516020909101519092909150565b6000815180845260005b818110156136ee576020818501810151868301820152016136d2565b81811115613700576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020808252825182820181905260009190848201906040850190845b8181101561378157835173ffffffffffffffffffffffffffffffffffffffff168352928401929184019160010161374f565b50909695505050505050565b602080825282518282018190526000919060409081850190868401855b828110156137e5578151805173ffffffffffffffffffffffffffffffffffffffff1685528601518685015292840192908501906001016137aa565b5091979650505050505050565b60208152600061336a60208301846136c8565b60006dffffffffffffffffffffffffffff80831681851680830382111561382e5761382e613904565b01949350505050565b6000821982111561384a5761384a613904565b500190565b60008261385e5761385e613933565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561389b5761389b613904565b500290565b6000828210156138b2576138b2613904565b500390565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156138e9576138e9613904565b5060010190565b6000826138ff576138ff613933565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff811681146139e257600080fd5b5056fea264697066735822122095ef7b35415451049f03c2d4b54283445669b9dad9d53bd3650d64bc2644348a64736f6c63430008070033a264697066735822122072db117f10f003ee67deadac18ef81239c65a23b688eff88a05a787c11a43c2d64736f6c63430008070033",
  "deployedBytecode": "0x60806040523480156200001157600080fd5b50600436106200007b5760003560e01c806371a25812116200005657806371a25812146200012e578063cf58879a1462000154578063f6ab6d99146200017c57600080fd5b8063169c4cef146200008057806327c3cae114620000c15780635bc93d6c14620000d8575b600080fd5b6200009762000091366004620009af565b620001b5565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b62000097620000d236600462000a5a565b62000208565b6200011f620000e936600462000971565b73ffffffffffffffffffffffffffffffffffffffff91821660009081526020818152604080832093909416825291909152205490565b604051908152602001620000b8565b620001456200013f366004620009f5565b62000401565b604051620000b8919062000b33565b620000977f000000000000000000000000000000000000000000000000000000000000000081565b620000976200018d36600462000a40565b60016020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60006020528260005260406000206020528160005260406000208181548110620001de57600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16925083915050565b60008060008060008580602001905181019062000226919062000911565b93509350935093508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16111562000267579192915b6040805173ffffffffffffffffffffffffffffffffffffffff808716602083015285169181019190915260608101839052811515608082015260a001604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152600280845260608401909252975060009190816020016020820280368337019050509050848160008151811062000309576200030962000ca8565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505083816001815181106200035a576200035a62000ca8565b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101820152875190880120604051819089907f000000000000000000000000000000000000000000000000000000000000000090620003b89062000903565b620003c592919062000b8f565b8190604051809103906000f5905080158015620003e6573d6000803e3d6000fd5b509650620003f68783836200053b565b505050505050919050565b60606200040f838362000c23565b67ffffffffffffffff8111156200042a576200042a62000cd7565b60405190808252806020026020018201604052801562000454578160200160208202803683370190505b50905060005b82841015620005325773ffffffffffffffffffffffffffffffffffffffff808716600090815260208181526040808320938916835292905220805485908110620004a857620004a862000ca8565b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828281518110620004e857620004e862000ca8565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015283620005198162000c3d565b9450508080620005299062000c3d565b9150506200045a565b50949350505050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614620005e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f554e415554484f52495a45445f4445504c4f594552000000000000000000000060448201526064015b60405180910390fd5b600081815260016020526040812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86161790555b6001835103811015620008fd5782816001018151811062000652576200065262000ca8565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1683828151811062000685576200068562000ca8565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16106200070c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f494e56414c49445f544f4b454e5f4f52444552000000000000000000000000006044820152606401620005d7565b600181015b8351811015620008f35760008085848151811062000733576200073362000ca8565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008583815181106200078c576200078c62000ca8565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff90811683528282019390935260409091016000908120805460018101825590825291812090910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001692881692909217909155845181908690849081106200081b576200081b62000ca8565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085848151811062000874576200087462000ca8565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff908116835282820193909352604090910160009081208054600180820183559183529290912090910180547fffffffffffffffffffffffff000000000000000000000000000000000000000016928816929092179091550162000711565b506001016200062d565b50505050565b61422c8062000d2d83390190565b600080600080608085870312156200092857600080fd5b8451620009358162000d06565b6020860151909450620009488162000d06565b60408601516060870151919450925080151581146200096657600080fd5b939692955090935050565b600080604083850312156200098557600080fd5b8235620009928162000d06565b91506020830135620009a48162000d06565b809150509250929050565b600080600060608486031215620009c557600080fd5b8335620009d28162000d06565b92506020840135620009e48162000d06565b929592945050506040919091013590565b6000806000806080858703121562000a0c57600080fd5b843562000a198162000d06565b9350602085013562000a2b8162000d06565b93969395505050506040820135916060013590565b60006020828403121562000a5357600080fd5b5035919050565b60006020828403121562000a6d57600080fd5b813567ffffffffffffffff8082111562000a8657600080fd5b818401915084601f83011262000a9b57600080fd5b81358181111562000ab05762000ab062000cd7565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171562000af95762000af962000cd7565b8160405282815287602084870101111562000b1357600080fd5b826020860160208301376000928101602001929092525095945050505050565b6020808252825182820181905260009190848201906040850190845b8181101562000b8357835173ffffffffffffffffffffffffffffffffffffffff168352928401929184019160010162000b4f565b50909695505050505050565b604081526000835180604084015260005b8181101562000bbf576020818701810151606086840101520162000ba0565b8181111562000bd2576000606083860101525b5073ffffffffffffffffffffffffffffffffffffffff93909316602083015250601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601606001919050565b60008282101562000c385762000c3862000c79565b500390565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562000c725762000c7262000c79565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff8116811462000d2957600080fd5b5056fe6101a06040523480156200001257600080fd5b506040516200422c3803806200422c833981016040819052620000359162000562565b4660805262000112604080518082018252600e81526d29bab9b434902628102a37b5b2b760911b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527fc2bf45081e840722410522aa366600d7fe4da5bfb5a5b417f4d5125b4ed180a4818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a0808301919091528351808303909101815260c0909101909252815191012090565b60a081815250506000806000808580602001905181019062000135919062000502565b929650909450925090506001600160a01b0384166200018a5760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b60448201526064015b60405180910390fd5b826001600160a01b0316846001600160a01b03161415620001ee5760405162461bcd60e51b815260206004820152601360248201527f4944454e544943414c5f41444452455353455300000000000000000000000000604482015260640162000181565b6001600160a01b038416301415620002395760405162461bcd60e51b815260206004820152600d60248201526c24a72b20a624a22faa27a5a2a760991b604482015260640162000181565b6001600160a01b038316301415620002845760405162461bcd60e51b815260206004820152600d60248201526c24a72b20a624a22faa27a5a2a760991b604482015260640162000181565b612710821115620002cb5760405162461bcd60e51b815260206004820152601060248201526f494e56414c49445f535741505f46454560801b604482015260640162000181565b6001600160601b0319606085811b82166101605284901b166101805260c082905261271082900360e052604080516360a56c0160e11b815290516001600160a01b0387169163c14ad802916004808301926020929190829003018186803b1580156200033657600080fd5b505afa1580156200034b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000371919062000653565b600481905550846001600160a01b0316630c0a0cd26040518163ffffffff1660e01b815260040160206040518083038186803b158015620003b157600080fd5b505afa158015620003c6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003ec9190620004db565b6001600160a01b0316610100816001600160a01b031660601b81525050846001600160a01b0316634da318276040518163ffffffff1660e01b815260040160206040518083038186803b1580156200044357600080fd5b505afa15801562000458573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200047e9190620004db565b6001600160601b0319606091821b8116610120529086901b166101405260016009558015620004bd57600880546001600160e01b0316600160e01b1790555b5050505050506200069c565b8051620004d68162000683565b919050565b600060208284031215620004ee57600080fd5b8151620004fb8162000683565b9392505050565b600080600080608085870312156200051957600080fd5b8451620005268162000683565b6020860151909450620005398162000683565b60408601516060870151919450925080151581146200055757600080fd5b939692955090935050565b600080604083850312156200057657600080fd5b82516001600160401b03808211156200058e57600080fd5b818501915085601f830112620005a357600080fd5b815181811115620005b857620005b86200066d565b604051601f8201601f19908116603f01168101908382118183101715620005e357620005e36200066d565b816040528281526020935088848487010111156200060057600080fd5b600091505b8282101562000624578482018401518183018501529083019062000605565b82821115620006365760008484830101525b955062000648915050858201620004c9565b925050509250929050565b6000602082840312156200066657600080fd5b5051919050565b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146200069957600080fd5b50565b60805160a05160c05160e0516101005160601c6101205160601c6101405160601c6101605160601c6101805160601c613a1b62000811600039600081816105d8015281816108300152818161095f01528181610a0d015281816110900152818161119801528181611599015281816116080152818161195f01528181611abe01528181612273015281816122fa0152612b4b015260008181610349015281816107ac01528181610af201528181610c21015281816110640152818161112f01528181611545015281816116e90152818161185901528181611a5001528181611f92015281816123330152818161241e0152612a610152600081816105b10152611e7a0152600081816103f5015281816118a6015281816119a7015281816128e5015281816129c101528181612a940152612b7c0152600081816102fd0152612f760152600061282301526000818161041c015281816132250152613290015260006113a80152600061127f0152613a1b6000f3fe608060405234801561001057600080fd5b50600436106102265760003560e01c806365dfc7671161012a578063a69840a8116100bd578063c14ad8021161008c578063d21220a711610071578063d21220a7146105d3578063d505accf146105fa578063dd62ed3e1461060d57600080fd5b8063c14ad802146105a3578063cf58879a146105ac57600080fd5b8063a69840a814610543578063a8f1f52e1461056a578063a9059cbb1461057d578063af8c09bf1461059057600080fd5b80637ba0e2e7116100f95780637ba0e2e7146104ca5780637ecebe00146104dd57806392bc3219146104fd57806395d89b411461050757600080fd5b806365dfc7671461046357806367e4ac2c1461048c57806370a08231146104a15780637464fc3d146104c157600080fd5b80632a07b6c7116101bd5780634da318271161018c5780635909c0d5116101715780635909c0d51461043e5780635a3d549314610447578063627dd56a1461045057600080fd5b80634da31827146103f057806354cf2aeb1461041757600080fd5b80632a07b6c71461038757806330adf81f146103a7578063313ce567146103ce5780633644e515146103e857600080fd5b80630c0a0cd2116101f95780630c0a0cd2146102f85780630dfe16811461034457806318160ddd1461036b57806323b872dd1461037457600080fd5b8063053da1c81461022b57806306fdde03146102515780630902f1ac1461029a578063095ea7b3146102d5575b600080fd5b61023e610239366004613619565b610638565b6040519081526020015b60405180910390f35b61028d6040518060400160405280600e81526020017f5375736869204c5020546f6b656e00000000000000000000000000000000000081525081565b60405161024891906137f2565b6102a2610cdd565b604080516dffffffffffffffffffffffffffff948516815293909216602084015263ffffffff1690820152606001610248565b6102e86102e33660046134fc565b610d46565b6040519015158152602001610248565b61031f7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610248565b61031f7f000000000000000000000000000000000000000000000000000000000000000081565b61023e60005481565b6102e8610382366004613561565b610dbf565b61039a610395366004613619565b610f0b565b604051610248919061378d565b61023e7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b6103d6601281565b60405160ff9091168152602001610248565b61023e61127b565b61031f7f000000000000000000000000000000000000000000000000000000000000000081565b61023e7f000000000000000000000000000000000000000000000000000000000000000081565b61023e60055481565b61023e60065481565b61023e61045e366004613619565b6113ca565b61046b6117ba565b60408051938452602084019290925263ffffffff1690820152606001610248565b610494611a2e565b6040516102489190613733565b61023e6104af36600461334d565b60016020526000908152604090205481565b61023e60075481565b61023e6104d8366004613619565b611b2d565b61023e6104eb36600461334d565b60036020526000908152604090205481565b610505611e78565b005b61028d6040518060400160405280600381526020017f534c50000000000000000000000000000000000000000000000000000000000081525081565b61023e7f54726964656e743a436f6e7374616e7450726f6475637400000000000000000081565b61023e610578366004613619565b611f1b565b6102e861058b3660046134fc565b61204e565b61023e61059e366004613619565b6120d3565b61023e60045481565b61031f7f000000000000000000000000000000000000000000000000000000000000000081565b61031f7f000000000000000000000000000000000000000000000000000000000000000081565b6105056106083660046135a2565b6124c9565b61023e61061b366004613528565b600260209081526000928352604080842090915290825290205481565b60006009546001146106ab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f4c4f434b4544000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b60026009556000808080806106c2878901896133b8565b94509450945094509450600080600061072a6008546dffffffffffffffffffffffffffff808216926e01000000000000000000000000000083049091169163ffffffff7c01000000000000000000000000000000000000000000000000000000009091041690565b9250925092506000836dffffffffffffffffffffffffffff16116107aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f504f4f4c5f554e494e495449414c495a4544000000000000000000000000000060448201526064016106a2565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161415610a0b5761082985846dffffffffffffffffffffffffffff16846dffffffffffffffffffffffffffff1661281b565b98506108577f00000000000000000000000000000000000000000000000000000000000000008a898961287e565b6040517fbd50c7b1000000000000000000000000000000000000000000000000000000008152339063bd50c7b1906108939087906004016137f2565b600060405180830381600087803b1580156108ad57600080fd5b505af11580156108c1573d6000803e3d6000fd5b505050506000806108d0612a24565b9150915086856dffffffffffffffffffffffffffff1683031015610950576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f494e53554646494349454e545f414d4f554e545f494e0000000000000000000060448201526064016106a2565b61095d8282878787612bfe565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fcd3829a3813dc3cdd188fd3d01dcf3268c16be2fdd2dd21d0665418816e460628a8f6040516109fc929190918252602082015260400190565b60405180910390a45050610cc9565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614610ac0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f494e56414c49445f494e5055545f544f4b454e0000000000000000000000000060448201526064016106a2565b610aeb85836dffffffffffffffffffffffffffff16856dffffffffffffffffffffffffffff1661281b565b9850610b197f00000000000000000000000000000000000000000000000000000000000000008a898961287e565b6040517fbd50c7b1000000000000000000000000000000000000000000000000000000008152339063bd50c7b190610b559087906004016137f2565b600060405180830381600087803b158015610b6f57600080fd5b505af1158015610b83573d6000803e3d6000fd5b50505050600080610b92612a24565b9150915086846dffffffffffffffffffffffffffff1682031015610c12576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f494e53554646494349454e545f414d4f554e545f494e0000000000000000000060448201526064016106a2565b610c1f8282878787612bfe565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fcd3829a3813dc3cdd188fd3d01dcf3268c16be2fdd2dd21d0665418816e460628a8f604051610cbe929190918252602082015260400190565b60405180910390a450505b505060016009555094979650505050505050565b6000806000610d3b6008546dffffffffffffffffffffffffffff808216926e01000000000000000000000000000083049091169163ffffffff7c01000000000000000000000000000000000000000000000000000000009091041690565b925092509250909192565b33600081815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610dae9086815260200190565b60405180910390a350600192915050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526002602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14610e5c5773ffffffffffffffffffffffffffffffffffffffff8416600090815260026020908152604080832033845290915281208054849290610e569084906138a0565b90915550505b73ffffffffffffffffffffffffffffffffffffffff841660009081526001602052604081208054849290610e919084906138a0565b909155505073ffffffffffffffffffffffffffffffffffffffff808416600081815260016020526040908190208054860190555190918616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610ef99086815260200190565b60405180910390a35060019392505050565b6060600954600114610f79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f4c4f434b4544000000000000000000000000000000000000000000000000000060448201526064016106a2565b6002600955600080610f8d848601866134c7565b915091506000806000610fef6008546dffffffffffffffffffffffffffff808216926e01000000000000000000000000000083049091169163ffffffff7c01000000000000000000000000000000000000000000000000000000009091041690565b925092509250600080611000612a24565b306000908152600160205260408120549294509092506110208787612ef2565b5090506000816110308685613863565b61103a919061384f565b90506000826110498686613863565b611053919061384f565b905061105f3085612fb2565b61108b7f0000000000000000000000000000000000000000000000000000000000000000838d8d61287e565b6110b77f0000000000000000000000000000000000000000000000000000000000000000828d8d61287e565b818603955080850394506110ce86868b8b8b612bfe565b6110e06110db8688613863565b613045565b6007556040805160028082526060820190925290816020015b60408051808201909152600080825260208201528152602001906001900390816110f9579050509b5060405180604001604052807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168152602001838152508c60008151811061118057611180613962565b602002602001018190525060405180604001604052807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168152602001828152508c6001815181106111e9576111e9613962565b60200260200101819052508a73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496848460405161125c929190918252602082015260400190565b60405180910390a35050600160095550979a9950505050505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000046146113a55750604080518082018252600e81527f5375736869204c5020546f6b656e00000000000000000000000000000000000060209182015281518083018352600181527f31000000000000000000000000000000000000000000000000000000000000009082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527fc2bf45081e840722410522aa366600d7fe4da5bfb5a5b417f4d5125b4ed180a4818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a0808301919091528351808303909101815260c0909101909252815191012090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6000600954600114611438576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f4c4f434b4544000000000000000000000000000000000000000000000000000060448201526064016106a2565b60026009556000808061144d85870187613371565b92509250925060008060006114b16008546dffffffffffffffffffffffffffff808216926e01000000000000000000000000000083049091169163ffffffff7c01000000000000000000000000000000000000000000000000000000009091041690565b9250925092506000836dffffffffffffffffffffffffffff1611611531576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f504f4f4c5f554e494e495449414c495a4544000000000000000000000000000060448201526064016106a2565b60008061153c612a24565b915091506000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff161415611606577f00000000000000000000000000000000000000000000000000000000000000009050866dffffffffffffffffffffffffffff16840391506115fa82886dffffffffffffffffffffffffffff16886dffffffffffffffffffffffffffff1661281b565b9a508a83039250611722565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16146116bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f494e56414c49445f494e5055545f544f4b454e0000000000000000000000000060448201526064016106a2565b50506008546dffffffffffffffffffffffffffff6e01000000000000000000000000000090910481168203907f00000000000000000000000000000000000000000000000000000000000000009061171a908390888116908a1661281b565b9a508a840393505b61172e818c8b8b61287e565b61173b8484898989612bfe565b8073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fcd3829a3813dc3cdd188fd3d01dcf3268c16be2fdd2dd21d0665418816e46062858f604051610cbe929190918252602082015260400190565b60008060008060008061181c6008546dffffffffffffffffffffffffffff808216926e01000000000000000000000000000083049091169163ffffffff7c01000000000000000000000000000000000000000000000000000000009091041690565b6040517f5662311800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526dffffffffffffffffffffffffffff851660248301526000604483015293965091945092507f00000000000000000000000000000000000000000000000000000000000000009091169063566231189060640160206040518083038186803b1580156118ea57600080fd5b505afa1580156118fe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611922919061368b565b6040517f5662311800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526dffffffffffffffffffffffffffff85166024830152600060448301529197507f00000000000000000000000000000000000000000000000000000000000000009091169063566231189060640160206040518083038186803b1580156119eb57600080fd5b505afa1580156119ff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a23919061368b565b959690945092505050565b60408051600280825260608083018452926020830190803683370190505090507f000000000000000000000000000000000000000000000000000000000000000081600081518110611a8257611a82613962565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611af057611af0613962565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505090565b6000600954600114611b9b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f4c4f434b4544000000000000000000000000000000000000000000000000000060448201526064016106a2565b60026009556000611bae8385018561334d565b90506000806000611c0e6008546dffffffffffffffffffffffffffff808216926e01000000000000000000000000000083049091169163ffffffff7c01000000000000000000000000000000000000000000000000000000009091041690565b925092509250600080611c1f612a24565b90925090506000611c336110db8385613863565b90506000611c516dffffffffffffffffffffffffffff8816856138a0565b90506000611c6f6dffffffffffffffffffffffffffff8816856138a0565b9050600080611ca084848c6dffffffffffffffffffffffffffff168c6dffffffffffffffffffffffffffff166131ca565b9092509050611caf828b613805565b9950611cbb818a613805565b9850600080611cca8c8c612ef2565b915091508160001415611d6d57600086118015611ce75750600085115b611d4d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f494e56414c49445f414d4f554e5453000000000000000000000000000000000060448201526064016106a2565b611d596103e8886138a0565b9d50611d6860006103e86132cd565b611d89565b80870381611d7b8483613863565b611d85919061384f565b9e50505b8d611df0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f494e53554646494349454e545f4c49515549444954595f4d494e54454400000060448201526064016106a2565b611dfa8d8f6132cd565b611e0789898e8e8e612bfe565b6007879055604080518781526020810187905273ffffffffffffffffffffffffffffffffffffffff8f169133917fdbba30eb0402b389513e87f51f4db2db80bed454384ec6925a24097c3548a02a910160405180910390a35050600160095550999c9b505050505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c14ad8026040518163ffffffff1660e01b815260040160206040518083038186803b158015611ede57600080fd5b505afa158015611ef2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f16919061368b565b600455565b60008080611f2b848601866134fc565b91509150600080611f8b6008546dffffffffffffffffffffffffffff808216926e01000000000000000000000000000083049091169163ffffffff7c01000000000000000000000000000000000000000000000000000000009091041690565b50915091507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156120165761200f83836dffffffffffffffffffffffffffff16836dffffffffffffffffffffffffffff1661281b565b9450612044565b61204183826dffffffffffffffffffffffffffff16846dffffffffffffffffffffffffffff1661281b565b94505b5050505092915050565b3360009081526001602052604081208054839190839061206f9084906138a0565b909155505073ffffffffffffffffffffffffffffffffffffffff8316600081815260016020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610dae9086815260200190565b6000600954600114612141576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f4c4f434b4544000000000000000000000000000000000000000000000000000060448201526064016106a2565b60026009556000808061215685870187613371565b92509250925060008060006121ba6008546dffffffffffffffffffffffffffff808216926e01000000000000000000000000000083049091169163ffffffff7c01000000000000000000000000000000000000000000000000000000009091041690565b9250925092506000806121cb612a24565b306000908152600160205260408120549294509092506121eb8787612ef2565b5090506000816121fb8685613863565b612205919061384f565b90506000826122148686613863565b61221e919061384f565b905061222a3085612fb2565b61226b612247826dffffffffffffffffffffffffffff8b166138a0565b612261846dffffffffffffffffffffffffffff8d166138a0565b6110db9190613863565b6007819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff161415612331576122f482838b6dffffffffffffffffffffffffffff1603838b6dffffffffffffffffffffffffffff160361281b565b016123217f0000000000000000000000000000000000000000000000000000000000000000828d8d61287e565b9b5050918a90039160008b612451565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff16146123e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f494e56414c49445f4f55545055545f544f4b454e00000000000000000000000060448201526064016106a2565b61241581828a6dffffffffffffffffffffffffffff1603848c6dffffffffffffffffffffffffffff160361281b565b820191506124457f0000000000000000000000000000000000000000000000000000000000000000838d8d61287e565b509a50928a9003928a60005b61245e86868b8b8b612bfe565b604080518381526020810183905273ffffffffffffffffffffffffffffffffffffffff8d169133917fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496910160405180910390a35050600160095550989b9a5050505050505050505050565b42841015612533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064016106a2565b600061253d61127b565b73ffffffffffffffffffffffffffffffffffffffff8916600090815260036020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9928c928c928c92909190612598836138b7565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810187905260e001604051602081830303815290604052805190602001206040516020016126399291907f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa1580156126c2573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81161580159061273d57508873ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b6127a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f494e56414c49445f5045524d49545f5349474e4154555245000000000000000060448201526064016106a2565b73ffffffffffffffffffffffffffffffffffffffff81811660009081526002602090815260408083208c8516808552908352928190208b9055518a815291928c16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050505050505050565b6000806128487f000000000000000000000000000000000000000000000000000000000000000086613863565b90508061285761271086613863565b6128619190613837565b61286b8483613863565b612875919061384f565b95945050505050565b8015612967576040517f97da6d3000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152306024830152838116604483015260006064830152608482018590527f000000000000000000000000000000000000000000000000000000000000000016906397da6d309060a4016040805180830381600087803b15801561292857600080fd5b505af115801561293c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061296091906136a4565b5050612a1e565b6040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301523060248301528381166044830152606482018590527f0000000000000000000000000000000000000000000000000000000000000000169063f18d03cc90608401600060405180830381600087803b158015612a0557600080fd5b505af1158015612a19573d6000803e3d6000fd5b505050505b50505050565b6040517ff7888aec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116600483015230602483015260009182917f0000000000000000000000000000000000000000000000000000000000000000169063f7888aec9060440160206040518083038186803b158015612ad657600080fd5b505afa158015612aea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b0e919061368b565b6040517ff7888aec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301523060248301529193507f00000000000000000000000000000000000000000000000000000000000000009091169063f7888aec9060440160206040518083038186803b158015612bc057600080fd5b505afa158015612bd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bf8919061368b565b90509091565b6dffffffffffffffffffffffffffff8511801590612c2a57506dffffffffffffffffffffffffffff8411155b612c90576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f4f564552464c4f5700000000000000000000000000000000000000000000000060448201526064016106a2565b63ffffffff8116612cf257600880546dffffffffffffffffffffffffffff8681166e010000000000000000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000090921690881617179055612eb2565b6000612d03640100000000426138f0565b90508163ffffffff168163ffffffff1614158015612d3057506dffffffffffffffffffffffffffff841615155b8015612d4b57506dffffffffffffffffffffffffffff831615155b15612e105781810360006dffffffffffffffffffffffffffff86167bffffffffffffffffffffffffffff0000000000000000000000000000607087901b1681612d9657612d96613933565b600580549290910463ffffffff851681029092019055905060006dffffffffffffffffffffffffffff8616607088901b7bffffffffffffffffffffffffffff00000000000000000000000000001681612df157612df1613933565b0490508263ffffffff1681026006600082825401925050819055505050505b6008805463ffffffff9092167c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff6dffffffffffffffffffffffffffff8881166e010000000000000000000000000000027fffffffff00000000000000000000000000000000000000000000000000000000909516908a161793909317929092169190911790555b60408051868152602081018690527fcf2aa50876cdfbb541206f89af0ee78d44a2abf8d328e37fa4917f982149848a910160405180910390a15050505050565b600080546007549091908015612faa57612f226110db6dffffffffffffffffffffffffffff808716908816613863565b915080821115612faa576000612710836004548486612f4191906138a0565b612f4b9088613863565b612f559190613863565b612f5f919061384f565b612f69919061384f565b90508015612fa857612f9b7f0000000000000000000000000000000000000000000000000000000000000000826132cd565b612fa58185613837565b93505b505b509250929050565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604081208054839290612fe79084906138a0565b909155505060008054829003815560405182815273ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b60008161305457506000919050565b816001700100000000000000000000000000000000821061307a5760809190911c9060401b5b6801000000000000000082106130955760409190911c9060201b5b64010000000082106130ac5760209190911c9060101b5b6201000082106130c15760109190911c9060081b5b61010082106130d55760089190911c9060041b5b601082106130e85760049190911c9060021b5b600882106130f45760011b5b600181858161310557613105613933565b048201901c9050600181858161311d5761311d613933565b048201901c9050600181858161313557613135613933565b048201901c9050600181858161314d5761314d613933565b048201901c9050600181858161316557613165613933565b048201901c9050600181858161317d5761317d613933565b048201901c9050600181858161319557613195613933565b048201901c905060008185816131ad576131ad613933565b0490508082106131bd57806131bf565b815b93505050505b919050565b6000808315806131d8575082155b156131e8575060009050806132c4565b6000846131f58589613863565b6131ff919061384f565b905085811161325a576132156127106002613863565b61321f82886138a0565b613249907f0000000000000000000000000000000000000000000000000000000000000000613863565b613253919061384f565b91506132c2565b6000846132678789613863565b613271919061384f565b90506132806127106002613863565b61328a828a6138a0565b6132b4907f0000000000000000000000000000000000000000000000000000000000000000613863565b6132be919061384f565b9350505b505b94509492505050565b806000808282546132de9190613837565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000818152600160209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101613039565b803580151581146131c557600080fd5b60006020828403121561335f57600080fd5b813561336a816139c0565b9392505050565b60008060006060848603121561338657600080fd5b8335613391816139c0565b925060208401356133a1816139c0565b91506133af6040850161333d565b90509250925092565b600080600080600060a086880312156133d057600080fd5b85356133db816139c0565b945060208601356133eb816139c0565b93506133f96040870161333d565b925060608601359150608086013567ffffffffffffffff8082111561341d57600080fd5b818801915088601f83011261343157600080fd5b81358181111561344357613443613991565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561348957613489613991565b816040528281528b60208487010111156134a257600080fd5b8260208601602083013760006020848301015280955050505050509295509295909350565b600080604083850312156134da57600080fd5b82356134e5816139c0565b91506134f36020840161333d565b90509250929050565b6000806040838503121561350f57600080fd5b823561351a816139c0565b946020939093013593505050565b6000806040838503121561353b57600080fd5b8235613546816139c0565b91506020830135613556816139c0565b809150509250929050565b60008060006060848603121561357657600080fd5b8335613581816139c0565b92506020840135613591816139c0565b929592945050506040919091013590565b600080600080600080600060e0888a0312156135bd57600080fd5b87356135c8816139c0565b965060208801356135d8816139c0565b95506040880135945060608801359350608088013560ff811681146135fc57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806020838503121561362c57600080fd5b823567ffffffffffffffff8082111561364457600080fd5b818501915085601f83011261365857600080fd5b81358181111561366757600080fd5b86602082850101111561367957600080fd5b60209290920196919550909350505050565b60006020828403121561369d57600080fd5b5051919050565b600080604083850312156136b757600080fd5b505080516020909101519092909150565b6000815180845260005b818110156136ee576020818501810151868301820152016136d2565b81811115613700576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020808252825182820181905260009190848201906040850190845b8181101561378157835173ffffffffffffffffffffffffffffffffffffffff168352928401929184019160010161374f565b50909695505050505050565b602080825282518282018190526000919060409081850190868401855b828110156137e5578151805173ffffffffffffffffffffffffffffffffffffffff1685528601518685015292840192908501906001016137aa565b5091979650505050505050565b60208152600061336a60208301846136c8565b60006dffffffffffffffffffffffffffff80831681851680830382111561382e5761382e613904565b01949350505050565b6000821982111561384a5761384a613904565b500190565b60008261385e5761385e613933565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561389b5761389b613904565b500290565b6000828210156138b2576138b2613904565b500390565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156138e9576138e9613904565b5060010190565b6000826138ff576138ff613933565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff811681146139e257600080fd5b5056fea264697066735822122095ef7b35415451049f03c2d4b54283445669b9dad9d53bd3650d64bc2644348a64736f6c63430008070033a264697066735822122072db117f10f003ee67deadac18ef81239c65a23b688eff88a05a787c11a43c2d64736f6c63430008070033",
  "devdoc": {
    "author": "Mudit Gupta.",
    "kind": "dev",
    "methods": {},
    "version": 1
  },
  "userdoc": {
    "kind": "user",
    "methods": {},
    "notice": "Contract for deploying Trident exchange Constant Product Pool with configurations.",
    "version": 1
  },
  "storageLayout": {
    "storage": [
      {
        "astId": 10180,
        "contract": "contracts/pool/ConstantProductPoolFactory.sol:ConstantProductPoolFactory",
        "label": "pools",
        "offset": 0,
        "slot": "0",
        "type": "t_mapping(t_address,t_mapping(t_address,t_array(t_address)dyn_storage))"
      },
      {
        "astId": 10184,
        "contract": "contracts/pool/ConstantProductPoolFactory.sol:ConstantProductPoolFactory",
        "label": "configAddress",
        "offset": 0,
        "slot": "1",
        "type": "t_mapping(t_bytes32,t_address)"
      }
    ],
    "types": {
      "t_address": {
        "encoding": "inplace",
        "label": "address",
        "numberOfBytes": "20"
      },
      "t_array(t_address)dyn_storage": {
        "base": "t_address",
        "encoding": "dynamic_array",
        "label": "address[]",
        "numberOfBytes": "32"
      },
      "t_bytes32": {
        "encoding": "inplace",
        "label": "bytes32",
        "numberOfBytes": "32"
      },
      "t_mapping(t_address,t_array(t_address)dyn_storage)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => address[])",
        "numberOfBytes": "32",
        "value": "t_array(t_address)dyn_storage"
      },
      "t_mapping(t_address,t_mapping(t_address,t_array(t_address)dyn_storage))": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => mapping(address => address[]))",
        "numberOfBytes": "32",
        "value": "t_mapping(t_address,t_array(t_address)dyn_storage)"
      },
      "t_mapping(t_bytes32,t_address)": {
        "encoding": "mapping",
        "key": "t_bytes32",
        "label": "mapping(bytes32 => address)",
        "numberOfBytes": "32",
        "value": "t_address"
      }
    }
  }
}