{
  "address": "0xb65Be5C721B6d6734825BA31526365b6697d9B71",
  "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": "0x8daa4150366aa12fdf91b763d11346a926b3d7af824f55bb3a43c1d0a2562846",
  "receipt": {
    "to": null,
    "from": "0x58B4B6951e9174F153635574076241315D7d3503",
    "contractAddress": "0xb65Be5C721B6d6734825BA31526365b6697d9B71",
    "transactionIndex": 0,
    "gasUsed": "4114782",
    "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
    "blockHash": "0x2c8a99ea6d3eb07c31061556c040685cd1005c08dffaea26500a72e95be480b6",
    "transactionHash": "0x8daa4150366aa12fdf91b763d11346a926b3d7af824f55bb3a43c1d0a2562846",
    "logs": [],
    "blockNumber": 5666364,
    "cumulativeGasUsed": "4114782",
    "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 Index Pool with configurations.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/pool/IndexPoolFactory.sol\":\"IndexPoolFactory\"},\"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/pool/IndexPool.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 \\\"./TridentERC20.sol\\\";\\n\\n/// @notice Trident exchange pool template with constant mean formula for swapping among an array of ERC-20 tokens.\\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 IndexPool is IPool, TridentERC20 {\\n    event Mint(address indexed sender, address tokenIn, uint256 amountIn, address indexed recipient);\\n    event Burn(address indexed sender, address tokenOut, uint256 amountOut, address indexed recipient);\\n\\n    uint256 public immutable swapFee;\\n\\n    address public immutable barFeeTo;\\n    IBentoBoxMinimal public immutable bento;\\n    IMasterDeployer public immutable masterDeployer;\\n\\n    uint256 internal constant BASE = 10**18;\\n    uint256 internal constant MIN_TOKENS = 2;\\n    uint256 internal constant MAX_TOKENS = 8;\\n    uint256 internal constant MIN_FEE = BASE / 10**6;\\n    uint256 internal constant MAX_FEE = BASE / 10;\\n    uint256 internal constant MIN_WEIGHT = BASE;\\n    uint256 internal constant MAX_WEIGHT = BASE * 50;\\n    uint256 internal constant MAX_TOTAL_WEIGHT = BASE * 50;\\n    uint256 internal constant MIN_BALANCE = BASE / 10**12;\\n    uint256 internal constant INIT_POOL_SUPPLY = BASE * 100;\\n    uint256 internal constant MIN_POW_BASE = 1;\\n    uint256 internal constant MAX_POW_BASE = (2 * BASE) - 1;\\n    uint256 internal constant POW_PRECISION = BASE / 10**10;\\n    uint256 internal constant MAX_IN_RATIO = BASE / 2;\\n    uint256 internal constant MAX_OUT_RATIO = (BASE / 3) + 1;\\n\\n    uint136 internal totalWeight;\\n    address[] internal tokens;\\n\\n    uint256 public barFee;\\n\\n    bytes32 public constant override poolIdentifier = \\\"Trident:Index\\\";\\n\\n    uint256 internal unlocked;\\n    modifier lock() {\\n        require(unlocked == 1, \\\"LOCKED\\\");\\n        unlocked = 2;\\n        _;\\n        unlocked = 1;\\n    }\\n\\n    mapping(address => Record) public records;\\n    struct Record {\\n        uint120 reserve;\\n        uint136 weight;\\n    }\\n\\n    constructor(bytes memory _deployData, address _masterDeployer) {\\n        (address[] memory _tokens, uint136[] memory _weights, uint256 _swapFee) = abi.decode(_deployData, (address[], uint136[], uint256));\\n        // @dev Factory ensures that the tokens are sorted.\\n        require(_tokens.length == _weights.length, \\\"INVALID_ARRAYS\\\");\\n        require(MIN_FEE <= _swapFee && _swapFee <= MAX_FEE, \\\"INVALID_SWAP_FEE\\\");\\n        require(MIN_TOKENS <= _tokens.length && _tokens.length <= MAX_TOKENS, \\\"INVALID_TOKENS_LENGTH\\\");\\n\\n        for (uint256 i = 0; i < _tokens.length; i++) {\\n            require(_tokens[i] != address(0), \\\"ZERO_ADDRESS\\\");\\n            require(MIN_WEIGHT <= _weights[i] && _weights[i] <= MAX_WEIGHT, \\\"INVALID_WEIGHT\\\");\\n            records[_tokens[i]] = Record({reserve: 0, weight: _weights[i]});\\n            tokens.push(_tokens[i]);\\n            totalWeight += _weights[i];\\n        }\\n\\n        require(totalWeight <= MAX_TOTAL_WEIGHT, \\\"MAX_TOTAL_WEIGHT\\\");\\n        // @dev This burns initial LP supply.\\n        _mint(address(0), INIT_POOL_SUPPLY);\\n\\n        swapFee = _swapFee;\\n        barFee = IMasterDeployer(_masterDeployer).barFee();\\n        barFeeTo = IMasterDeployer(_masterDeployer).barFeeTo();\\n        bento = IBentoBoxMinimal(IMasterDeployer(_masterDeployer).bento());\\n        masterDeployer = IMasterDeployer(_masterDeployer);\\n        unlocked = 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, uint256 toMint) = abi.decode(data, (address, uint256));\\n\\n        uint120 ratio = uint120(_div(toMint, totalSupply));\\n\\n        for (uint256 i = 0; i < tokens.length; i++) {\\n            address tokenIn = tokens[i];\\n            uint120 reserve = records[tokenIn].reserve;\\n            // @dev If token balance is '0', initialize with `ratio`.\\n            uint120 amountIn = reserve != 0 ? uint120(_mul(ratio, reserve)) : ratio;\\n            require(amountIn >= MIN_BALANCE, \\\"MIN_BALANCE\\\");\\n            // @dev Check Trident router has sent `amountIn` for skim into pool.\\n            unchecked {\\n                // @dev This is safe from overflow - only logged amounts handled.\\n                require(_balance(tokenIn) >= amountIn + reserve, \\\"NOT_RECEIVED\\\");\\n                records[tokenIn].reserve += amountIn;\\n            }\\n            emit Mint(msg.sender, tokenIn, amountIn, recipient);\\n        }\\n        _mint(recipient, toMint);\\n        liquidity = toMint;\\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, uint256 toBurn) = abi.decode(data, (address, bool, uint256));\\n\\n        uint256 ratio = _div(toBurn, totalSupply);\\n\\n        withdrawnAmounts = new TokenAmount[](tokens.length);\\n\\n        _burn(address(this), toBurn);\\n\\n        for (uint256 i = 0; i < tokens.length; i++) {\\n            address tokenOut = tokens[i];\\n            uint256 balance = records[tokenOut].reserve;\\n            uint120 amountOut = uint120(_mul(ratio, balance));\\n            require(amountOut != 0, \\\"ZERO_OUT\\\");\\n            // @dev This is safe from underflow - only logged amounts handled.\\n            unchecked {\\n                records[tokenOut].reserve -= amountOut;\\n            }\\n            _transfer(tokenOut, amountOut, recipient, unwrapBento);\\n            withdrawnAmounts[i] = TokenAmount({token: tokenOut, amount: amountOut});\\n            emit Burn(msg.sender, tokenOut, amountOut, recipient);\\n        }\\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, uint256 toBurn) = abi.decode(data, (address, address, bool, uint256));\\n\\n        Record storage outRecord = records[tokenOut];\\n\\n        amountOut = _computeSingleOutGivenPoolIn(outRecord.reserve, outRecord.weight, totalSupply, totalWeight, toBurn, swapFee);\\n\\n        require(amountOut <= _mul(outRecord.reserve, MAX_OUT_RATIO), \\\"MAX_OUT_RATIO\\\");\\n        // @dev This is safe from underflow - only logged amounts handled.\\n        unchecked {\\n            outRecord.reserve -= uint120(amountOut);\\n        }\\n        _burn(address(this), toBurn);\\n        _transfer(tokenOut, amountOut, recipient, unwrapBento);\\n        emit Burn(msg.sender, tokenOut, amountOut, 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 tokenOut, address recipient, bool unwrapBento, uint256 amountIn) = abi.decode(\\n            data,\\n            (address, address, address, bool, uint256)\\n        );\\n\\n        Record storage inRecord = records[tokenIn];\\n        Record storage outRecord = records[tokenOut];\\n\\n        require(amountIn <= _mul(inRecord.reserve, MAX_IN_RATIO), \\\"MAX_IN_RATIO\\\");\\n\\n        amountOut = _getAmountOut(amountIn, inRecord.reserve, inRecord.weight, outRecord.reserve, outRecord.weight);\\n        // @dev Check Trident router has sent `amountIn` for skim into pool.\\n        unchecked {\\n            // @dev This is safe from under/overflow - only logged amounts handled.\\n            require(_balance(tokenIn) >= amountIn + inRecord.reserve, \\\"NOT_RECEIVED\\\");\\n            inRecord.reserve += uint120(amountIn);\\n            outRecord.reserve -= uint120(amountOut);\\n        }\\n        _transfer(tokenOut, amountOut, recipient, unwrapBento);\\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 tokenOut, address recipient, bool unwrapBento, uint256 amountIn, bytes memory context) = abi.decode(\\n            data,\\n            (address, address, address, bool, uint256, bytes)\\n        );\\n\\n        Record storage inRecord = records[tokenIn];\\n        Record storage outRecord = records[tokenOut];\\n\\n        require(amountIn <= _mul(inRecord.reserve, MAX_IN_RATIO), \\\"MAX_IN_RATIO\\\");\\n\\n        amountOut = _getAmountOut(amountIn, inRecord.reserve, inRecord.weight, outRecord.reserve, outRecord.weight);\\n\\n        ITridentCallee(msg.sender).tridentSwapCallback(context);\\n        // @dev Check Trident router has sent `amountIn` for skim into pool.\\n        unchecked {\\n            // @dev This is safe from under/overflow - only logged amounts handled.\\n            require(_balance(tokenIn) >= amountIn + inRecord.reserve, \\\"NOT_RECEIVED\\\");\\n            inRecord.reserve += uint120(amountIn);\\n            outRecord.reserve -= uint120(amountOut);\\n        }\\n        _transfer(tokenOut, amountOut, recipient, unwrapBento);\\n        emit Swap(recipient, tokenIn, tokenOut, amountIn, amountOut);\\n    }\\n\\n    /// @dev Updates `barFee` for Trident protocol.\\n    function updateBarFee() public {\\n        barFee = IMasterDeployer(masterDeployer).barFee();\\n    }\\n\\n    function _balance(address token) internal view returns (uint256 balance) {\\n        balance = bento.balanceOf(token, address(this));\\n    }\\n\\n    function _getAmountOut(\\n        uint256 tokenInAmount,\\n        uint256 tokenInBalance,\\n        uint256 tokenInWeight,\\n        uint256 tokenOutBalance,\\n        uint256 tokenOutWeight\\n    ) internal view returns (uint256 amountOut) {\\n        uint256 weightRatio = _div(tokenInWeight, tokenOutWeight);\\n        // @dev This is safe from under/overflow - only logged amounts handled.\\n        unchecked {\\n            uint256 adjustedIn = _mul(tokenInAmount, (BASE - swapFee));\\n            uint256 a = _div(tokenInBalance, tokenInBalance + adjustedIn);\\n            uint256 b = _compute(a, weightRatio);\\n            uint256 c = BASE - b;\\n            amountOut = _mul(tokenOutBalance, c);\\n        }\\n    }\\n\\n    function _compute(uint256 base, uint256 exp) internal pure returns (uint256 output) {\\n        require(MIN_POW_BASE <= base && base <= MAX_POW_BASE, \\\"INVALID_BASE\\\");\\n\\n        uint256 whole = (exp / BASE) * BASE;\\n        uint256 remain = exp - whole;\\n        uint256 wholePow = _pow(base, whole / BASE);\\n\\n        if (remain == 0) output = wholePow;\\n\\n        uint256 partialResult = _powApprox(base, remain, POW_PRECISION);\\n        output = _mul(wholePow, partialResult);\\n    }\\n\\n    function _computeSingleOutGivenPoolIn(\\n        uint256 tokenOutBalance,\\n        uint256 tokenOutWeight,\\n        uint256 _totalSupply,\\n        uint256 _totalWeight,\\n        uint256 toBurn,\\n        uint256 _swapFee\\n    ) internal pure returns (uint256 amountOut) {\\n        uint256 normalizedWeight = _div(tokenOutWeight, _totalWeight);\\n        uint256 newPoolSupply = _totalSupply - toBurn;\\n        uint256 poolRatio = _div(newPoolSupply, _totalSupply);\\n        uint256 tokenOutRatio = _pow(poolRatio, _div(BASE, normalizedWeight));\\n        uint256 newBalanceOut = _mul(tokenOutRatio, tokenOutBalance);\\n        uint256 tokenAmountOutBeforeSwapFee = tokenOutBalance - newBalanceOut;\\n        uint256 zaz = (BASE - normalizedWeight) * _swapFee;\\n        amountOut = _mul(tokenAmountOutBeforeSwapFee, (BASE - zaz));\\n    }\\n\\n    function _pow(uint256 a, uint256 n) internal pure returns (uint256 output) {\\n        output = n % 2 != 0 ? a : BASE;\\n        for (n /= 2; n != 0; n /= 2) a = a * a;\\n        if (n % 2 != 0) output = output * a;\\n    }\\n\\n    function _powApprox(\\n        uint256 base,\\n        uint256 exp,\\n        uint256 precision\\n    ) internal pure returns (uint256 sum) {\\n        uint256 a = exp;\\n        (uint256 x, bool xneg) = _subFlag(base, BASE);\\n        uint256 term = BASE;\\n        sum = term;\\n        bool negative;\\n\\n        for (uint256 i = 1; term >= precision; i++) {\\n            uint256 bigK = i * BASE;\\n            (uint256 c, bool cneg) = _subFlag(a, (bigK - BASE));\\n            term = _mul(term, _mul(c, x));\\n            term = _div(term, bigK);\\n            if (term == 0) break;\\n            if (xneg) negative = !negative;\\n            if (cneg) negative = !negative;\\n            if (negative) {\\n                sum = sum - term;\\n            } else {\\n                sum = sum + term;\\n            }\\n        }\\n    }\\n\\n    function _subFlag(uint256 a, uint256 b) internal pure returns (uint256 difference, bool flag) {\\n        // @dev This is safe from underflow - if/else flow performs checks.\\n        unchecked {\\n            if (a >= b) {\\n                (difference, flag) = (a - b, false);\\n            } else {\\n                (difference, flag) = (b - a, true);\\n            }\\n        }\\n    }\\n\\n    function _mul(uint256 a, uint256 b) internal pure returns (uint256 c2) {\\n        uint256 c0 = a * b;\\n        uint256 c1 = c0 + (BASE / 2);\\n        c2 = c1 / BASE;\\n    }\\n\\n    function _div(uint256 a, uint256 b) internal pure returns (uint256 c2) {\\n        uint256 c0 = a * BASE;\\n        uint256 c1 = c0 + (b / 2);\\n        c2 = c1 / b;\\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    function getAssets() public view override returns (address[] memory assets) {\\n        assets = tokens;\\n    }\\n\\n    function getAmountOut(bytes calldata data) public view override returns (uint256 amountOut) {\\n        (uint256 tokenInAmount, uint256 tokenInBalance, uint256 tokenInWeight, uint256 tokenOutBalance, uint256 tokenOutWeight) = abi\\n            .decode(data, (uint256, uint256, uint256, uint256, uint256));\\n        amountOut = _getAmountOut(tokenInAmount, tokenInBalance, tokenInWeight, tokenOutBalance, tokenOutWeight);\\n    }\\n\\n    function getReservesAndWeights() public view returns (uint256[] memory reserves, uint136[] memory weights) {\\n        uint256 length = tokens.length;\\n        reserves = new uint256[](length);\\n        weights = new uint136[](length);\\n        // @dev This is safe from overflow - `tokens` `length` is bound to '8'.\\n        unchecked {\\n            for (uint256 i = 0; i < length; i++) {\\n                reserves[i] = records[tokens[i]].reserve;\\n                weights[i] = records[tokens[i]].weight;\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xaa7672db1bfed9ece585a974fa108e963aff08d6f0f786e68847758a63bcbdc1\",\"license\":\"GPL-3.0-or-later\"},\"contracts/pool/IndexPoolFactory.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\n\\npragma solidity >=0.8.0;\\n\\nimport \\\"./IndexPool.sol\\\";\\nimport \\\"./PoolDeployer.sol\\\";\\n\\n/// @notice Contract for deploying Trident exchange Index Pool with configurations.\\n/// @author Mudit Gupta\\ncontract IndexPoolFactory is PoolDeployer {\\n    constructor(address _masterDeployer) PoolDeployer(_masterDeployer) {}\\n\\n    function deployPool(bytes memory _deployData) external returns (address pool) {\\n        (address[] memory tokens, uint136[] memory weights, uint256 swapFee) = abi.decode(_deployData, (address[], uint136[], uint256));\\n\\n        // @dev Strips any extra data.\\n        _deployData = abi.encode(tokens, weights, swapFee);\\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 IndexPool{salt: salt}(_deployData, masterDeployer));\\n        _registerPool(pool, tokens, salt);\\n    }\\n}\\n\",\"keccak256\":\"0xa5db55c356f74a2a8f49db87470021fbdf3112712537d0c6b785d4ee8f2de9cd\",\"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": "0x60a060405234801561001057600080fd5b50604051614ad0380380614ad083398101604081905261002f9161008f565b806001600160a01b0381166100795760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b604482015260640160405180910390fd5b60601b6001600160601b031916608052506100bf565b6000602082840312156100a157600080fd5b81516001600160a01b03811681146100b857600080fd5b9392505050565b60805160601c6149e56100eb6000396000818161015a01528181610262015261042801526149e56000f3fe60806040523480156200001157600080fd5b50600436106200007b5760003560e01c806371a25812116200005657806371a25812146200012e578063cf58879a1462000154578063f6ab6d99146200017c57600080fd5b8063169c4cef146200008057806327c3cae114620000c15780635bc93d6c14620000d8575b600080fd5b6200009762000091366004620008bf565b620001b5565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b62000097620000d236600462000a4d565b62000208565b6200011f620000e936600462000881565b73ffffffffffffffffffffffffffffffffffffffff91821660009081526020818152604080832093909416825291909152205490565b604051908152602001620000b8565b620001456200013f36600462000905565b620002d6565b604051620000b8919062000b5c565b620000977f000000000000000000000000000000000000000000000000000000000000000081565b620000976200018d36600462000a33565b60016020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60006020528260005260406000206020528160005260406000208181548110620001de57600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16925083915050565b6000806000808480602001905181019062000224919062000950565b925092509250828282604051602001620002419392919062000b78565b604051602081830303815290604052945060008580519060200120905080867f00000000000000000000000000000000000000000000000000000000000000006040516200028f90620007d8565b6200029c92919062000bef565b8190604051809103906000f5905080158015620002bd573d6000803e3d6000fd5b509450620002cd85858362000410565b50505050919050565b6060620002e4838362000cfc565b67ffffffffffffffff811115620002ff57620002ff62000db0565b60405190808252806020026020018201604052801562000329578160200160208202803683370190505b50905060005b82841015620004075773ffffffffffffffffffffffffffffffffffffffff8087166000908152602081815260408083209389168352929052208054859081106200037d576200037d62000d81565b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828281518110620003bd57620003bd62000d81565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015283620003ee8162000d16565b9450508080620003fe9062000d16565b9150506200032f565b50949350505050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614620004b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f554e415554484f52495a45445f4445504c4f594552000000000000000000000060448201526064015b60405180910390fd5b600081815260016020526040812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86161790555b6001835103811015620007d25782816001018151811062000527576200052762000d81565b602002602001015173ffffffffffffffffffffffffffffffffffffffff168382815181106200055a576200055a62000d81565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1610620005e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f494e56414c49445f544f4b454e5f4f52444552000000000000000000000000006044820152606401620004ac565b600181015b8351811015620007c85760008085848151811062000608576200060862000d81565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085838151811062000661576200066162000d81565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff90811683528282019390935260409091016000908120805460018101825590825291812090910180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169288169290921790915584518190869084908110620006f057620006f062000d81565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085848151811062000749576200074962000d81565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff908116835282820193909352604090910160009081208054600180820183559183529290912090910180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169288169290921790915501620005e6565b5060010162000502565b50505050565b613baa8062000e0683390190565b600082601f830112620007f857600080fd5b81516020620008116200080b8362000cd5565b62000c83565b80838252828201915082860187848660051b89010111156200083257600080fd5b6000805b868110156200087357825170ffffffffffffffffffffffffffffffffff8116811462000860578283fd5b8552938501939185019160010162000836565b509198975050505050505050565b600080604083850312156200089557600080fd5b8235620008a28162000ddf565b91506020830135620008b48162000ddf565b809150509250929050565b600080600060608486031215620008d557600080fd5b8335620008e28162000ddf565b92506020840135620008f48162000ddf565b929592945050506040919091013590565b600080600080608085870312156200091c57600080fd5b8435620009298162000ddf565b935060208501356200093b8162000ddf565b93969395505050506040820135916060013590565b6000806000606084860312156200096657600080fd5b835167ffffffffffffffff808211156200097f57600080fd5b818601915086601f8301126200099457600080fd5b81516020620009a76200080b8362000cd5565b8083825282820191508286018b848660051b8901011115620009c857600080fd5b600096505b84871015620009f8578051620009e38162000ddf565b835260019690960195918301918301620009cd565b509189015191975090935050508082111562000a1357600080fd5b5062000a2286828701620007e6565b925050604084015190509250925092565b60006020828403121562000a4657600080fd5b5035919050565b6000602080838503121562000a6157600080fd5b823567ffffffffffffffff8082111562000a7a57600080fd5b818501915085601f83011262000a8f57600080fd5b81358181111562000aa45762000aa462000db0565b62000ad6847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160162000c83565b9150808252868482850101111562000aed57600080fd5b8084840185840137600090820190930192909252509392505050565b600081518084526020808501945080840160005b8381101562000b5157815173ffffffffffffffffffffffffffffffffffffffff168752958201959082019060010162000b1d565b509495945050505050565b60208152600062000b71602083018462000b09565b9392505050565b60608152600062000b8d606083018662000b09565b82810360208481019190915285518083528682019282019060005b8181101562000bd957845170ffffffffffffffffffffffffffffffffff168352938301939183019160010162000ba8565b5050809350505050826040830152949350505050565b604081526000835180604084015260005b8181101562000c1f576020818701810151606086840101520162000c00565b8181111562000c32576000606083860101525b5073ffffffffffffffffffffffffffffffffffffffff93909316602083015250601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601606001919050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171562000ccd5762000ccd62000db0565b604052919050565b600067ffffffffffffffff82111562000cf25762000cf262000db0565b5060051b60200190565b60008282101562000d115762000d1162000d52565b500390565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562000d4b5762000d4b62000d52565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff8116811462000e0257600080fd5b5056fe6101406040523480156200001257600080fd5b5060405162003baa38038062003baa833981016040819052620000359162000966565b4660805262000112604080518082018252600e81526d29bab9b434902628102a37b5b2b760911b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527fc2bf45081e840722410522aa366600d7fe4da5bfb5a5b417f4d5125b4ed180a4818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a0808301919091528351808303909101815260c0909101909252815191012090565b60a0818152505060008060008480602001905181019062000134919062000886565b9250925092508151835114620001825760405162461bcd60e51b815260206004820152600e60248201526d494e56414c49445f41525241595360901b60448201526064015b60405180910390fd5b806200019a620f4240670de0b6b3a764000062000af4565b11158015620001bd5750620001b9600a670de0b6b3a764000062000af4565b8111155b620001fe5760405162461bcd60e51b815260206004820152601060248201526f494e56414c49445f535741505f46454560801b604482015260640162000179565b82516002111580156200021357506008835111155b620002615760405162461bcd60e51b815260206004820152601560248201527f494e56414c49445f544f4b454e535f4c454e4754480000000000000000000000604482015260640162000179565b60005b83518110156200050a5760006001600160a01b03168482815181106200028e576200028e62000b6d565b60200260200101516001600160a01b03161415620002de5760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b604482015260640162000179565b828181518110620002f357620002f362000b6d565b60200260200101516001600160881b0316670de0b6b3a7640000111580156200035557506200032c670de0b6b3a7640000603262000b17565b83828151811062000341576200034162000b6d565b60200260200101516001600160881b031611155b620003945760405162461bcd60e51b815260206004820152600e60248201526d1253959053125117d5d15251d21560921b604482015260640162000179565b604051806040016040528060006001600160781b03168152602001848381518110620003c457620003c462000b6d565b60200260200101516001600160881b031681525060086000868481518110620003f157620003f162000b6d565b6020908102919091018101516001600160a01b0316825281810192909252604001600020825192909101516001600160881b0316600160781b026001600160781b03909216919091179055835160059085908390811062000456576200045662000b6d565b60209081029190910181015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b039092169190911790558251839082908110620004a857620004a862000b6d565b602090810291909101015160048054600090620004d09084906001600160881b031662000aab565b92506101000a8154816001600160881b0302191690836001600160881b031602179055508080620005019062000b39565b91505062000264565b5062000520670de0b6b3a7640000603262000b17565b6004546001600160881b031611156200056f5760405162461bcd60e51b815260206004820152601060248201526f13505617d513d5105317d5d15251d21560821b604482015260640162000179565b6200059060006200058a670de0b6b3a7640000606462000b17565b62000747565b8060c08181525050836001600160a01b031663c14ad8026040518163ffffffff1660e01b815260040160206040518083038186803b158015620005d257600080fd5b505afa158015620005e7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200060d919062000a38565b600681905550836001600160a01b0316630c0a0cd26040518163ffffffff1660e01b815260040160206040518083038186803b1580156200064d57600080fd5b505afa15801562000662573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000688919062000861565b6001600160a01b031660e0816001600160a01b031660601b81525050836001600160a01b0316634da318276040518163ffffffff1660e01b815260040160206040518083038186803b158015620006de57600080fd5b505afa158015620006f3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000719919062000861565b6001600160601b0319606091821b81166101005294901b90931661012052505060016007555062000b999050565b806000808282546200075a919062000ad9565b90915550506001600160a01b0382166000818152600160209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b80516001600160a01b0381168114620007cb57600080fd5b919050565b600082601f830112620007e257600080fd5b81516020620007fb620007f58362000a85565b62000a52565b80838252828201915082860187848660051b89010111156200081c57600080fd5b6000805b86811015620008535782516001600160881b038116811462000840578283fd5b8552938501939185019160010162000820565b509198975050505050505050565b6000602082840312156200087457600080fd5b6200087f82620007b3565b9392505050565b6000806000606084860312156200089c57600080fd5b83516001600160401b0380821115620008b457600080fd5b818601915086601f830112620008c957600080fd5b81516020620008dc620007f58362000a85565b8083825282820191508286018b848660051b8901011115620008fd57600080fd5b600096505b848710156200092b576200091681620007b3565b83526001969096019591830191830162000902565b50918901519197509093505050808211156200094657600080fd5b506200095586828701620007d0565b925050604084015190509250925092565b600080604083850312156200097a57600080fd5b82516001600160401b03808211156200099257600080fd5b818501915085601f830112620009a757600080fd5b815181811115620009bc57620009bc62000b83565b60209150620009d4601f8201601f1916830162000a52565b8181528783838601011115620009e957600080fd5b60005b8281101562000a09578481018401518282018501528301620009ec565b8281111562000a1b5760008484840101525b50945062000a2d9050858201620007b3565b925050509250929050565b60006020828403121562000a4b57600080fd5b5051919050565b604051601f8201601f191681016001600160401b038111828210171562000a7d5762000a7d62000b83565b604052919050565b60006001600160401b0382111562000aa15762000aa162000b83565b5060051b60200190565b60006001600160881b0382811684821680830382111562000ad05762000ad062000b57565b01949350505050565b6000821982111562000aef5762000aef62000b57565b500190565b60008262000b1257634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161562000b345762000b3462000b57565b500290565b600060001982141562000b505762000b5062000b57565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b60805160a05160c05160e05160601c6101005160601c6101205160601c612f8e62000c1c6000396000818161055c01526118870152600081816103ce015281816120db015281816121be015261229a0152600061026b0152600081816103f501528181611ae5015261201a01526000610fd801526000610eaf0152612f8e6000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c806367e4ac2c11610104578063a69840a8116100a2578063c14ad80211610071578063c14ad8021461054e578063cf58879a14610557578063d505accf1461057e578063dd62ed3e1461059157600080fd5b8063a69840a8146104ee578063a8f1f52e14610515578063a9059cbb14610528578063af8c09bf1461053b57600080fd5b80637ecebe00116100de5780637ecebe00146104725780638ae454411461049257806392bc3219146104a857806395d89b41146104b257600080fd5b806367e4ac2c1461042a57806370a082311461043f5780637ba0e2e71461045f57600080fd5b806330adf81f11610171578063469e90671161014b578063469e9067146103375780634da31827146103c957806354cf2aeb146103f0578063627dd56a1461041757600080fd5b806330adf81f146102ee578063313ce567146103155780633644e5151461032f57600080fd5b80630c0a0cd2116101ad5780630c0a0cd21461026657806318160ddd146102b257806323b872dd146102bb5780632a07b6c7146102ce57600080fd5b8063053da1c8146101d457806306fdde03146101fa578063095ea7b314610243575b600080fd5b6101e76101e2366004612af5565b6105bc565b6040519081526020015b60405180910390f35b6102366040518060400160405280600e81526020017f5375736869204c5020546f6b656e00000000000000000000000000000000000081525081565b6040516101f19190612d97565b6102566102513660046129d8565b610964565b60405190151581526020016101f1565b61028d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101f1565b6101e760005481565b6102566102c9366004612a3d565b6109de565b6102e16102dc366004612af5565b610b2a565b6040516101f19190612ca4565b6101e77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b61031d601281565b60405160ff90911681526020016101f1565b6101e7610eab565b6103906103453660046127ac565b6008602052600090815260409020546effffffffffffffffffffffffffffff8116906f01000000000000000000000000000000900470ffffffffffffffffffffffffffffffffff1682565b604080516effffffffffffffffffffffffffffff909316835270ffffffffffffffffffffffffffffffffff9091166020830152016101f1565b61028d7f000000000000000000000000000000000000000000000000000000000000000081565b6101e77f000000000000000000000000000000000000000000000000000000000000000081565b6101e7610425366004612af5565b610ffa565b610432611324565b6040516101f19190612c4a565b6101e761044d3660046127ac565b60016020526000908152604090205481565b6101e761046d366004612af5565b611393565b6101e76104803660046127ac565b60036020526000908152604090205481565b61049a6116b5565b6040516101f1929190612d09565b6104b0611885565b005b6102366040518060400160405280600381526020017f534c50000000000000000000000000000000000000000000000000000000000081525081565b6101e77f54726964656e743a496e6465780000000000000000000000000000000000000081565b6101e7610523366004612af5565b611928565b6102566105363660046129d8565b61195e565b6101e7610549366004612af5565b6119e3565b6101e760065481565b61028d7f000000000000000000000000000000000000000000000000000000000000000081565b6104b061058c366004612a7e565b611c66565b6101e761059f366004612a04565b600260209081526000928352604080842090915290825290205481565b600060075460011461062f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f4c4f434b4544000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b600260075560008080808080610647888a018a61282b565b73ffffffffffffffffffffffffffffffffffffffff808716600090815260086020526040808220928816825290208154979d50959b5093995091975095509350916106b5906effffffffffffffffffffffffffffff166106b06002670de0b6b3a7640000612dc2565b611fb8565b84111561071e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4d41585f494e5f524154494f00000000000000000000000000000000000000006044820152606401610626565b815481546107749186916effffffffffffffffffffffffffffff8083169270ffffffffffffffffffffffffffffffffff6f0100000000000000000000000000000091829004811693928316929190910416612003565b6040517fbd50c7b1000000000000000000000000000000000000000000000000000000008152909950339063bd50c7b1906107b3908690600401612d97565b600060405180830381600087803b1580156107cd57600080fd5b505af11580156107e1573d6000803e3d6000fd5b505083546effffffffffffffffffffffffffffff168601915061080590508961208d565b101561086d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4e4f545f524543454956454400000000000000000000000000000000000000006044820152606401610626565b81546effffffffffffffffffffffffffffff808216860181167fffffffffffffffffffffffffffffffffff00000000000000000000000000000092831617845582548082168c900390911691161781556108c9878a8888612157565b8673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fcd3829a3813dc3cdd188fd3d01dcf3268c16be2fdd2dd21d0665418816e46062878d604051610948929190918252602082015260400190565b60405180910390a4505060016007555094979650505050505050565b33600081815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906109cc9086815260200190565b60405180910390a35060015b92915050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526002602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14610a7b5773ffffffffffffffffffffffffffffffffffffffff8416600090815260026020908152604080832033845290915281208054849290610a75908490612e13565b90915550505b73ffffffffffffffffffffffffffffffffffffffff841660009081526001602052604081208054849290610ab0908490612e13565b909155505073ffffffffffffffffffffffffffffffffffffffff808416600081815260016020526040908190208054860190555190918616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610b189086815260200190565b60405180910390a35060019392505050565b6060600754600114610b98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f4c4f434b454400000000000000000000000000000000000000000000000000006044820152606401610626565b600260075560008080610bad8587018761299a565b9250925092506000610bc1826000546122fd565b60055490915067ffffffffffffffff811115610bdf57610bdf612f04565b604051908082528060200260200182016040528015610c2457816020015b6040805180820190915260008082526020820152815260200190600190039081610bfd5790505b509450610c313083612337565b60005b600554811015610e9a57600060058281548110610c5357610c53612ed5565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16808352600890915260408220549092506effffffffffffffffffffffffffffff1690610ca38583611fb8565b90506effffffffffffffffffffffffffffff8116610d1d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f5a45524f5f4f55540000000000000000000000000000000000000000000000006044820152606401610626565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260086020526040902080547fffffffffffffffffffffffffffffffffff00000000000000000000000000000081166effffffffffffffffffffffffffffff918216849003821617909155610d9290849083168a8a612157565b60405180604001604052808473ffffffffffffffffffffffffffffffffffffffff168152602001826effffffffffffffffffffffffffffff16815250898581518110610de057610de0612ed5565b60200260200101819052508773ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f3dd1df88dc92e2788892542d81f999d720a44b4c127065d45c128f4f59fdc3738584604051610e7c92919073ffffffffffffffffffffffffffffffffffffffff9290921682526effffffffffffffffffffffffffffff16602082015260400190565b60405180910390a35050508080610e9290612e2a565b915050610c34565b505060016007555091949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610fd55750604080518082018252600e81527f5375736869204c5020546f6b656e00000000000000000000000000000000000060209182015281518083018352600181527f31000000000000000000000000000000000000000000000000000000000000009082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527fc2bf45081e840722410522aa366600d7fe4da5bfb5a5b417f4d5125b4ed180a4818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a0808301919091528351808303909101815260c0909101909252815191012090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6000600754600114611068576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f4c4f434b454400000000000000000000000000000000000000000000000000006044820152606401610626565b600260075560008080808061107f878901896127c9565b73ffffffffffffffffffffffffffffffffffffffff808616600090815260086020526040808220928716825290208154969b509499509297509095509350916110e6906effffffffffffffffffffffffffffff166106b06002670de0b6b3a7640000612dc2565b83111561114f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4d41585f494e5f524154494f00000000000000000000000000000000000000006044820152606401610626565b815481546111a59185916effffffffffffffffffffffffffffff8083169270ffffffffffffffffffffffffffffffffff6f0100000000000000000000000000000091829004811693928316929190910416612003565b82549098506effffffffffffffffffffffffffffff1683016111c68861208d565b101561122e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4e4f545f524543454956454400000000000000000000000000000000000000006044820152606401610626565b81546effffffffffffffffffffffffffffff808216850181167fffffffffffffffffffffffffffffffffff00000000000000000000000000000092831617845582548082168b9003909116911617815561128a86898787612157565b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fcd3829a3813dc3cdd188fd3d01dcf3268c16be2fdd2dd21d0665418816e46062868c604051611309929190918252602082015260400190565b60405180910390a45050600160075550939695505050505050565b6060600580548060200260200160405190810160405280929190818152602001828054801561138957602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161135e575b5050505050905090565b6000600754600114611401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f4c4f434b454400000000000000000000000000000000000000000000000000006044820152606401610626565b6002600755600080611415848601866129d8565b915091506000611427826000546122fd565b905060005b60055481101561169c5760006005828154811061144b5761144b612ed5565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16808352600890915260408220549092506effffffffffffffffffffffffffffff16908161149c57846114c8565b6114c8856effffffffffffffffffffffffffffff16836effffffffffffffffffffffffffffff16611fb8565b90506114e164e8d4a51000670de0b6b3a7640000612dc2565b816effffffffffffffffffffffffffffff16101561155b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f4d494e5f42414c414e43450000000000000000000000000000000000000000006044820152606401610626565b8181016effffffffffffffffffffffffffffff166115788461208d565b10156115e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4e4f545f524543454956454400000000000000000000000000000000000000006044820152606401610626565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526008602090815260409182902080547fffffffffffffffffffffffffffffffffff00000000000000000000000000000081166effffffffffffffffffffffffffffff918216880182161790915582519384528516908301529189169133917ff9403b28cc8805935e0ce6943ed646d5fde3d1e14f6b398e85bfa2851d1b85f7910160405180910390a3505050808061169490612e2a565b91505061142c565b506116a783836123ca565b506001600755949350505050565b60055460609081908067ffffffffffffffff8111156116d6576116d6612f04565b6040519080825280602002602001820160405280156116ff578160200160208202803683370190505b5092508067ffffffffffffffff81111561171b5761171b612f04565b604051908082528060200260200182016040528015611744578160200160208202803683370190505b50915060005b8181101561187f57600860006005838154811061176957611769612ed5565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205484516effffffffffffffffffffffffffffff909116908590839081106117c3576117c3612ed5565b60200260200101818152505060086000600583815481106117e6576117e6612ed5565b60009182526020808320919091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205483516f0100000000000000000000000000000090910470ffffffffffffffffffffffffffffffffff169084908390811061185557611855612ed5565b70ffffffffffffffffffffffffffffffffff9092166020928302919091019091015260010161174a565b50509091565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c14ad8026040518163ffffffff1660e01b815260040160206040518083038186803b1580156118eb57600080fd5b505afa1580156118ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119239190612b67565b600655565b6000808080808061193b87890189612ba4565b945094509450945094506119528585858585612003565b98975050505050505050565b3360009081526001602052604081208054839190839061197f908490612e13565b909155505073ffffffffffffffffffffffffffffffffffffffff8316600081815260016020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906109cc9086815260200190565b6000600754600114611a51576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f4c4f434b454400000000000000000000000000000000000000000000000000006044820152606401610626565b60026007556000808080611a678688018861294b565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260086020526040812080549154600454969a509498509296509094509092611b09926effffffffffffffffffffffffffffff83169270ffffffffffffffffffffffffffffffffff6f0100000000000000000000000000000090910481169216867f000000000000000000000000000000000000000000000000000000000000000061243a565b8154909650611b41906effffffffffffffffffffffffffffff16611b366003670de0b6b3a7640000612dc2565b6106b0906001612daa565b861115611baa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4d41585f4f55545f524154494f000000000000000000000000000000000000006044820152606401610626565b80546effffffffffffffffffffffffffffff808216889003167fffffffffffffffffffffffffffffffffff000000000000000000000000000000909116178155611bf43083612337565b611c0085878686612157565b6040805173ffffffffffffffffffffffffffffffffffffffff87811682526020820189905286169133917f3dd1df88dc92e2788892542d81f999d720a44b4c127065d45c128f4f59fdc373910160405180910390a3505060016007555091949350505050565b42841015611cd0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5045524d49545f444541444c494e455f455850495245440000000000000000006044820152606401610626565b6000611cda610eab565b73ffffffffffffffffffffffffffffffffffffffff8916600090815260036020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9928c928c928c92909190611d3583612e2a565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810187905260e00160405160208183030381529060405280519060200120604051602001611dd69291907f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015611e5f573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590611eda57508873ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611f40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f494e56414c49445f5045524d49545f5349474e415455524500000000000000006044820152606401610626565b73ffffffffffffffffffffffffffffffffffffffff81811660009081526002602090815260408083208c8516808552908352928190208b9055518a815291928c16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050505050505050565b600080611fc58385612dd6565b90506000611fdc6002670de0b6b3a7640000612dc2565b611fe69083612daa565b9050611ffa670de0b6b3a764000082612dc2565b95945050505050565b60008061201085846122fd565b90506000612048887f0000000000000000000000000000000000000000000000000000000000000000670de0b6b3a764000003611fb8565b9050600061205888838a016122fd565b9050600061206682856124e9565b9050670de0b6b3a764000081900361207e8882611fb8565b9b9a5050505050505050505050565b6040517ff7888aec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301523060248301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063f7888aec9060440160206040518083038186803b15801561211f57600080fd5b505afa158015612133573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d89190612b67565b8015612240576040517f97da6d3000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152306024830152838116604483015260006064830152608482018590527f000000000000000000000000000000000000000000000000000000000000000016906397da6d309060a4016040805180830381600087803b15801561220157600080fd5b505af1158015612215573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122399190612b80565b50506122f7565b6040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301523060248301528381166044830152606482018590527f0000000000000000000000000000000000000000000000000000000000000000169063f18d03cc90608401600060405180830381600087803b1580156122de57600080fd5b505af11580156122f2573d6000803e3d6000fd5b505050505b50505050565b600080612312670de0b6b3a764000085612dd6565b90506000612321600285612dc2565b61232b9083612daa565b9050611ffa8482612dc2565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600160205260408120805483929061236c908490612e13565b909155505060008054829003815560405182815273ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b806000808282546123db9190612daa565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000818152600160209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016123be565b60008061244787866122fd565b905060006124558588612e13565b9050600061246382896122fd565b905060006124828261247d670de0b6b3a7640000876122fd565b61260c565b90506000612490828d611fb8565b9050600061249e828e612e13565b90506000886124b588670de0b6b3a7640000612e13565b6124bf9190612dd6565b90506124d7826106b083670de0b6b3a7640000612e13565b9e9d5050505050505050505050505050565b60008260011115801561251a5750600161250c670de0b6b3a76400006002612dd6565b6125169190612e13565b8311155b612580576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f494e56414c49445f4241534500000000000000000000000000000000000000006044820152606401610626565b6000670de0b6b3a76400006125958185612dc2565b61259f9190612dd6565b905060006125ad8285612e13565b905060006125c78661247d670de0b6b3a764000086612dc2565b9050816125d2578093505b60006125f587846125f06402540be400670de0b6b3a7640000612dc2565b612682565b90506126018282611fb8565b979650505050505050565b6000612619600283612e63565b61262b57670de0b6b3a764000061262d565b825b905061263a600283612dc2565b91505b81156126615761264d8380612dd6565b925061265a600283612dc2565b915061263d565b61266c600283612e63565b156109d85761267b8382612dd6565b9392505050565b600082818061269987670de0b6b3a7640000612772565b670de0b6b3a76400009550909250905083600060015b8783106127655760006126ca670de0b6b3a764000083612dd6565b90506000806126ea896126e5670de0b6b3a764000086612e13565b612772565b915091506126fc866106b0848b611fb8565b955061270886846122fd565b95508561271757505050612765565b8615612721579315935b801561272b579315935b84156127425761273b868b612e13565b995061274f565b61274c868b612daa565b99505b505050808061275d90612e2a565b9150506126af565b5050505050509392505050565b6000808284106127885750508082036000612790565b505081810360015b9250929050565b803580151581146127a757600080fd5b919050565b6000602082840312156127be57600080fd5b813561267b81612f33565b600080600080600060a086880312156127e157600080fd5b85356127ec81612f33565b945060208601356127fc81612f33565b9350604086013561280c81612f33565b925061281a60608701612797565b949793965091946080013592915050565b60008060008060008060c0878903121561284457600080fd5b863561284f81612f33565b9550602087013561285f81612f33565b9450604087013561286f81612f33565b935061287d60608801612797565b92506080870135915060a087013567ffffffffffffffff808211156128a157600080fd5b818901915089601f8301126128b557600080fd5b8135818111156128c7576128c7612f04565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561290d5761290d612f04565b816040528281528c602084870101111561292657600080fd5b8260208601602083013760006020848301015280955050505050509295509295509295565b6000806000806080858703121561296157600080fd5b843561296c81612f33565b9350602085013561297c81612f33565b925061298a60408601612797565b9396929550929360600135925050565b6000806000606084860312156129af57600080fd5b83356129ba81612f33565b92506129c860208501612797565b9150604084013590509250925092565b600080604083850312156129eb57600080fd5b82356129f681612f33565b946020939093013593505050565b60008060408385031215612a1757600080fd5b8235612a2281612f33565b91506020830135612a3281612f33565b809150509250929050565b600080600060608486031215612a5257600080fd5b8335612a5d81612f33565b92506020840135612a6d81612f33565b929592945050506040919091013590565b600080600080600080600060e0888a031215612a9957600080fd5b8735612aa481612f33565b96506020880135612ab481612f33565b95506040880135945060608801359350608088013560ff81168114612ad857600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060208385031215612b0857600080fd5b823567ffffffffffffffff80821115612b2057600080fd5b818501915085601f830112612b3457600080fd5b813581811115612b4357600080fd5b866020828501011115612b5557600080fd5b60209290920196919550909350505050565b600060208284031215612b7957600080fd5b5051919050565b60008060408385031215612b9357600080fd5b505080516020909101519092909150565b600080600080600060a08688031215612bbc57600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b6000815180845260005b81811015612c0557602081850181015186830182015201612be9565b81811115612c17576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020808252825182820181905260009190848201906040850190845b81811015612c9857835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101612c66565b50909695505050505050565b602080825282518282018190526000919060409081850190868401855b82811015612cfc578151805173ffffffffffffffffffffffffffffffffffffffff168552860151868501529284019290850190600101612cc1565b5091979650505050505050565b604080825283519082018190526000906020906060840190828701845b82811015612d4257815184529284019290840190600101612d26565b5050508381038285015284518082528583019183019060005b81811015612d8a57835170ffffffffffffffffffffffffffffffffff1683529284019291840191600101612d5b565b5090979650505050505050565b60208152600061267b6020830184612bdf565b60008219821115612dbd57612dbd612e77565b500190565b600082612dd157612dd1612ea6565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612e0e57612e0e612e77565b500290565b600082821015612e2557612e25612e77565b500390565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612e5c57612e5c612e77565b5060010190565b600082612e7257612e72612ea6565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81168114612f5557600080fd5b5056fea26469706673582212205271e0253dde9e5e2708240f7032e3d543271dd7cc2ce12273d694543231414664736f6c63430008070033a2646970667358221220526af8b4caa6232b2683b9de603e458babe506bac818a111516c77dea570feaf64736f6c63430008070033",
  "deployedBytecode": "0x60806040523480156200001157600080fd5b50600436106200007b5760003560e01c806371a25812116200005657806371a25812146200012e578063cf58879a1462000154578063f6ab6d99146200017c57600080fd5b8063169c4cef146200008057806327c3cae114620000c15780635bc93d6c14620000d8575b600080fd5b6200009762000091366004620008bf565b620001b5565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b62000097620000d236600462000a4d565b62000208565b6200011f620000e936600462000881565b73ffffffffffffffffffffffffffffffffffffffff91821660009081526020818152604080832093909416825291909152205490565b604051908152602001620000b8565b620001456200013f36600462000905565b620002d6565b604051620000b8919062000b5c565b620000977f000000000000000000000000000000000000000000000000000000000000000081565b620000976200018d36600462000a33565b60016020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60006020528260005260406000206020528160005260406000208181548110620001de57600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16925083915050565b6000806000808480602001905181019062000224919062000950565b925092509250828282604051602001620002419392919062000b78565b604051602081830303815290604052945060008580519060200120905080867f00000000000000000000000000000000000000000000000000000000000000006040516200028f90620007d8565b6200029c92919062000bef565b8190604051809103906000f5905080158015620002bd573d6000803e3d6000fd5b509450620002cd85858362000410565b50505050919050565b6060620002e4838362000cfc565b67ffffffffffffffff811115620002ff57620002ff62000db0565b60405190808252806020026020018201604052801562000329578160200160208202803683370190505b50905060005b82841015620004075773ffffffffffffffffffffffffffffffffffffffff8087166000908152602081815260408083209389168352929052208054859081106200037d576200037d62000d81565b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828281518110620003bd57620003bd62000d81565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015283620003ee8162000d16565b9450508080620003fe9062000d16565b9150506200032f565b50949350505050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614620004b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f554e415554484f52495a45445f4445504c4f594552000000000000000000000060448201526064015b60405180910390fd5b600081815260016020526040812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86161790555b6001835103811015620007d25782816001018151811062000527576200052762000d81565b602002602001015173ffffffffffffffffffffffffffffffffffffffff168382815181106200055a576200055a62000d81565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1610620005e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f494e56414c49445f544f4b454e5f4f52444552000000000000000000000000006044820152606401620004ac565b600181015b8351811015620007c85760008085848151811062000608576200060862000d81565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085838151811062000661576200066162000d81565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff90811683528282019390935260409091016000908120805460018101825590825291812090910180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169288169290921790915584518190869084908110620006f057620006f062000d81565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085848151811062000749576200074962000d81565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff908116835282820193909352604090910160009081208054600180820183559183529290912090910180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169288169290921790915501620005e6565b5060010162000502565b50505050565b613baa8062000e0683390190565b600082601f830112620007f857600080fd5b81516020620008116200080b8362000cd5565b62000c83565b80838252828201915082860187848660051b89010111156200083257600080fd5b6000805b868110156200087357825170ffffffffffffffffffffffffffffffffff8116811462000860578283fd5b8552938501939185019160010162000836565b509198975050505050505050565b600080604083850312156200089557600080fd5b8235620008a28162000ddf565b91506020830135620008b48162000ddf565b809150509250929050565b600080600060608486031215620008d557600080fd5b8335620008e28162000ddf565b92506020840135620008f48162000ddf565b929592945050506040919091013590565b600080600080608085870312156200091c57600080fd5b8435620009298162000ddf565b935060208501356200093b8162000ddf565b93969395505050506040820135916060013590565b6000806000606084860312156200096657600080fd5b835167ffffffffffffffff808211156200097f57600080fd5b818601915086601f8301126200099457600080fd5b81516020620009a76200080b8362000cd5565b8083825282820191508286018b848660051b8901011115620009c857600080fd5b600096505b84871015620009f8578051620009e38162000ddf565b835260019690960195918301918301620009cd565b509189015191975090935050508082111562000a1357600080fd5b5062000a2286828701620007e6565b925050604084015190509250925092565b60006020828403121562000a4657600080fd5b5035919050565b6000602080838503121562000a6157600080fd5b823567ffffffffffffffff8082111562000a7a57600080fd5b818501915085601f83011262000a8f57600080fd5b81358181111562000aa45762000aa462000db0565b62000ad6847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160162000c83565b9150808252868482850101111562000aed57600080fd5b8084840185840137600090820190930192909252509392505050565b600081518084526020808501945080840160005b8381101562000b5157815173ffffffffffffffffffffffffffffffffffffffff168752958201959082019060010162000b1d565b509495945050505050565b60208152600062000b71602083018462000b09565b9392505050565b60608152600062000b8d606083018662000b09565b82810360208481019190915285518083528682019282019060005b8181101562000bd957845170ffffffffffffffffffffffffffffffffff168352938301939183019160010162000ba8565b5050809350505050826040830152949350505050565b604081526000835180604084015260005b8181101562000c1f576020818701810151606086840101520162000c00565b8181111562000c32576000606083860101525b5073ffffffffffffffffffffffffffffffffffffffff93909316602083015250601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601606001919050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171562000ccd5762000ccd62000db0565b604052919050565b600067ffffffffffffffff82111562000cf25762000cf262000db0565b5060051b60200190565b60008282101562000d115762000d1162000d52565b500390565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562000d4b5762000d4b62000d52565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff8116811462000e0257600080fd5b5056fe6101406040523480156200001257600080fd5b5060405162003baa38038062003baa833981016040819052620000359162000966565b4660805262000112604080518082018252600e81526d29bab9b434902628102a37b5b2b760911b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527fc2bf45081e840722410522aa366600d7fe4da5bfb5a5b417f4d5125b4ed180a4818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a0808301919091528351808303909101815260c0909101909252815191012090565b60a0818152505060008060008480602001905181019062000134919062000886565b9250925092508151835114620001825760405162461bcd60e51b815260206004820152600e60248201526d494e56414c49445f41525241595360901b60448201526064015b60405180910390fd5b806200019a620f4240670de0b6b3a764000062000af4565b11158015620001bd5750620001b9600a670de0b6b3a764000062000af4565b8111155b620001fe5760405162461bcd60e51b815260206004820152601060248201526f494e56414c49445f535741505f46454560801b604482015260640162000179565b82516002111580156200021357506008835111155b620002615760405162461bcd60e51b815260206004820152601560248201527f494e56414c49445f544f4b454e535f4c454e4754480000000000000000000000604482015260640162000179565b60005b83518110156200050a5760006001600160a01b03168482815181106200028e576200028e62000b6d565b60200260200101516001600160a01b03161415620002de5760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b604482015260640162000179565b828181518110620002f357620002f362000b6d565b60200260200101516001600160881b0316670de0b6b3a7640000111580156200035557506200032c670de0b6b3a7640000603262000b17565b83828151811062000341576200034162000b6d565b60200260200101516001600160881b031611155b620003945760405162461bcd60e51b815260206004820152600e60248201526d1253959053125117d5d15251d21560921b604482015260640162000179565b604051806040016040528060006001600160781b03168152602001848381518110620003c457620003c462000b6d565b60200260200101516001600160881b031681525060086000868481518110620003f157620003f162000b6d565b6020908102919091018101516001600160a01b0316825281810192909252604001600020825192909101516001600160881b0316600160781b026001600160781b03909216919091179055835160059085908390811062000456576200045662000b6d565b60209081029190910181015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b039092169190911790558251839082908110620004a857620004a862000b6d565b602090810291909101015160048054600090620004d09084906001600160881b031662000aab565b92506101000a8154816001600160881b0302191690836001600160881b031602179055508080620005019062000b39565b91505062000264565b5062000520670de0b6b3a7640000603262000b17565b6004546001600160881b031611156200056f5760405162461bcd60e51b815260206004820152601060248201526f13505617d513d5105317d5d15251d21560821b604482015260640162000179565b6200059060006200058a670de0b6b3a7640000606462000b17565b62000747565b8060c08181525050836001600160a01b031663c14ad8026040518163ffffffff1660e01b815260040160206040518083038186803b158015620005d257600080fd5b505afa158015620005e7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200060d919062000a38565b600681905550836001600160a01b0316630c0a0cd26040518163ffffffff1660e01b815260040160206040518083038186803b1580156200064d57600080fd5b505afa15801562000662573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000688919062000861565b6001600160a01b031660e0816001600160a01b031660601b81525050836001600160a01b0316634da318276040518163ffffffff1660e01b815260040160206040518083038186803b158015620006de57600080fd5b505afa158015620006f3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000719919062000861565b6001600160601b0319606091821b81166101005294901b90931661012052505060016007555062000b999050565b806000808282546200075a919062000ad9565b90915550506001600160a01b0382166000818152600160209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b80516001600160a01b0381168114620007cb57600080fd5b919050565b600082601f830112620007e257600080fd5b81516020620007fb620007f58362000a85565b62000a52565b80838252828201915082860187848660051b89010111156200081c57600080fd5b6000805b86811015620008535782516001600160881b038116811462000840578283fd5b8552938501939185019160010162000820565b509198975050505050505050565b6000602082840312156200087457600080fd5b6200087f82620007b3565b9392505050565b6000806000606084860312156200089c57600080fd5b83516001600160401b0380821115620008b457600080fd5b818601915086601f830112620008c957600080fd5b81516020620008dc620007f58362000a85565b8083825282820191508286018b848660051b8901011115620008fd57600080fd5b600096505b848710156200092b576200091681620007b3565b83526001969096019591830191830162000902565b50918901519197509093505050808211156200094657600080fd5b506200095586828701620007d0565b925050604084015190509250925092565b600080604083850312156200097a57600080fd5b82516001600160401b03808211156200099257600080fd5b818501915085601f830112620009a757600080fd5b815181811115620009bc57620009bc62000b83565b60209150620009d4601f8201601f1916830162000a52565b8181528783838601011115620009e957600080fd5b60005b8281101562000a09578481018401518282018501528301620009ec565b8281111562000a1b5760008484840101525b50945062000a2d9050858201620007b3565b925050509250929050565b60006020828403121562000a4b57600080fd5b5051919050565b604051601f8201601f191681016001600160401b038111828210171562000a7d5762000a7d62000b83565b604052919050565b60006001600160401b0382111562000aa15762000aa162000b83565b5060051b60200190565b60006001600160881b0382811684821680830382111562000ad05762000ad062000b57565b01949350505050565b6000821982111562000aef5762000aef62000b57565b500190565b60008262000b1257634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161562000b345762000b3462000b57565b500290565b600060001982141562000b505762000b5062000b57565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b60805160a05160c05160e05160601c6101005160601c6101205160601c612f8e62000c1c6000396000818161055c01526118870152600081816103ce015281816120db015281816121be015261229a0152600061026b0152600081816103f501528181611ae5015261201a01526000610fd801526000610eaf0152612f8e6000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c806367e4ac2c11610104578063a69840a8116100a2578063c14ad80211610071578063c14ad8021461054e578063cf58879a14610557578063d505accf1461057e578063dd62ed3e1461059157600080fd5b8063a69840a8146104ee578063a8f1f52e14610515578063a9059cbb14610528578063af8c09bf1461053b57600080fd5b80637ecebe00116100de5780637ecebe00146104725780638ae454411461049257806392bc3219146104a857806395d89b41146104b257600080fd5b806367e4ac2c1461042a57806370a082311461043f5780637ba0e2e71461045f57600080fd5b806330adf81f11610171578063469e90671161014b578063469e9067146103375780634da31827146103c957806354cf2aeb146103f0578063627dd56a1461041757600080fd5b806330adf81f146102ee578063313ce567146103155780633644e5151461032f57600080fd5b80630c0a0cd2116101ad5780630c0a0cd21461026657806318160ddd146102b257806323b872dd146102bb5780632a07b6c7146102ce57600080fd5b8063053da1c8146101d457806306fdde03146101fa578063095ea7b314610243575b600080fd5b6101e76101e2366004612af5565b6105bc565b6040519081526020015b60405180910390f35b6102366040518060400160405280600e81526020017f5375736869204c5020546f6b656e00000000000000000000000000000000000081525081565b6040516101f19190612d97565b6102566102513660046129d8565b610964565b60405190151581526020016101f1565b61028d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101f1565b6101e760005481565b6102566102c9366004612a3d565b6109de565b6102e16102dc366004612af5565b610b2a565b6040516101f19190612ca4565b6101e77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b61031d601281565b60405160ff90911681526020016101f1565b6101e7610eab565b6103906103453660046127ac565b6008602052600090815260409020546effffffffffffffffffffffffffffff8116906f01000000000000000000000000000000900470ffffffffffffffffffffffffffffffffff1682565b604080516effffffffffffffffffffffffffffff909316835270ffffffffffffffffffffffffffffffffff9091166020830152016101f1565b61028d7f000000000000000000000000000000000000000000000000000000000000000081565b6101e77f000000000000000000000000000000000000000000000000000000000000000081565b6101e7610425366004612af5565b610ffa565b610432611324565b6040516101f19190612c4a565b6101e761044d3660046127ac565b60016020526000908152604090205481565b6101e761046d366004612af5565b611393565b6101e76104803660046127ac565b60036020526000908152604090205481565b61049a6116b5565b6040516101f1929190612d09565b6104b0611885565b005b6102366040518060400160405280600381526020017f534c50000000000000000000000000000000000000000000000000000000000081525081565b6101e77f54726964656e743a496e6465780000000000000000000000000000000000000081565b6101e7610523366004612af5565b611928565b6102566105363660046129d8565b61195e565b6101e7610549366004612af5565b6119e3565b6101e760065481565b61028d7f000000000000000000000000000000000000000000000000000000000000000081565b6104b061058c366004612a7e565b611c66565b6101e761059f366004612a04565b600260209081526000928352604080842090915290825290205481565b600060075460011461062f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f4c4f434b4544000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b600260075560008080808080610647888a018a61282b565b73ffffffffffffffffffffffffffffffffffffffff808716600090815260086020526040808220928816825290208154979d50959b5093995091975095509350916106b5906effffffffffffffffffffffffffffff166106b06002670de0b6b3a7640000612dc2565b611fb8565b84111561071e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4d41585f494e5f524154494f00000000000000000000000000000000000000006044820152606401610626565b815481546107749186916effffffffffffffffffffffffffffff8083169270ffffffffffffffffffffffffffffffffff6f0100000000000000000000000000000091829004811693928316929190910416612003565b6040517fbd50c7b1000000000000000000000000000000000000000000000000000000008152909950339063bd50c7b1906107b3908690600401612d97565b600060405180830381600087803b1580156107cd57600080fd5b505af11580156107e1573d6000803e3d6000fd5b505083546effffffffffffffffffffffffffffff168601915061080590508961208d565b101561086d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4e4f545f524543454956454400000000000000000000000000000000000000006044820152606401610626565b81546effffffffffffffffffffffffffffff808216860181167fffffffffffffffffffffffffffffffffff00000000000000000000000000000092831617845582548082168c900390911691161781556108c9878a8888612157565b8673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fcd3829a3813dc3cdd188fd3d01dcf3268c16be2fdd2dd21d0665418816e46062878d604051610948929190918252602082015260400190565b60405180910390a4505060016007555094979650505050505050565b33600081815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906109cc9086815260200190565b60405180910390a35060015b92915050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526002602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14610a7b5773ffffffffffffffffffffffffffffffffffffffff8416600090815260026020908152604080832033845290915281208054849290610a75908490612e13565b90915550505b73ffffffffffffffffffffffffffffffffffffffff841660009081526001602052604081208054849290610ab0908490612e13565b909155505073ffffffffffffffffffffffffffffffffffffffff808416600081815260016020526040908190208054860190555190918616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610b189086815260200190565b60405180910390a35060019392505050565b6060600754600114610b98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f4c4f434b454400000000000000000000000000000000000000000000000000006044820152606401610626565b600260075560008080610bad8587018761299a565b9250925092506000610bc1826000546122fd565b60055490915067ffffffffffffffff811115610bdf57610bdf612f04565b604051908082528060200260200182016040528015610c2457816020015b6040805180820190915260008082526020820152815260200190600190039081610bfd5790505b509450610c313083612337565b60005b600554811015610e9a57600060058281548110610c5357610c53612ed5565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16808352600890915260408220549092506effffffffffffffffffffffffffffff1690610ca38583611fb8565b90506effffffffffffffffffffffffffffff8116610d1d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f5a45524f5f4f55540000000000000000000000000000000000000000000000006044820152606401610626565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260086020526040902080547fffffffffffffffffffffffffffffffffff00000000000000000000000000000081166effffffffffffffffffffffffffffff918216849003821617909155610d9290849083168a8a612157565b60405180604001604052808473ffffffffffffffffffffffffffffffffffffffff168152602001826effffffffffffffffffffffffffffff16815250898581518110610de057610de0612ed5565b60200260200101819052508773ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f3dd1df88dc92e2788892542d81f999d720a44b4c127065d45c128f4f59fdc3738584604051610e7c92919073ffffffffffffffffffffffffffffffffffffffff9290921682526effffffffffffffffffffffffffffff16602082015260400190565b60405180910390a35050508080610e9290612e2a565b915050610c34565b505060016007555091949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610fd55750604080518082018252600e81527f5375736869204c5020546f6b656e00000000000000000000000000000000000060209182015281518083018352600181527f31000000000000000000000000000000000000000000000000000000000000009082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527fc2bf45081e840722410522aa366600d7fe4da5bfb5a5b417f4d5125b4ed180a4818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a0808301919091528351808303909101815260c0909101909252815191012090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6000600754600114611068576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f4c4f434b454400000000000000000000000000000000000000000000000000006044820152606401610626565b600260075560008080808061107f878901896127c9565b73ffffffffffffffffffffffffffffffffffffffff808616600090815260086020526040808220928716825290208154969b509499509297509095509350916110e6906effffffffffffffffffffffffffffff166106b06002670de0b6b3a7640000612dc2565b83111561114f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4d41585f494e5f524154494f00000000000000000000000000000000000000006044820152606401610626565b815481546111a59185916effffffffffffffffffffffffffffff8083169270ffffffffffffffffffffffffffffffffff6f0100000000000000000000000000000091829004811693928316929190910416612003565b82549098506effffffffffffffffffffffffffffff1683016111c68861208d565b101561122e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4e4f545f524543454956454400000000000000000000000000000000000000006044820152606401610626565b81546effffffffffffffffffffffffffffff808216850181167fffffffffffffffffffffffffffffffffff00000000000000000000000000000092831617845582548082168b9003909116911617815561128a86898787612157565b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fcd3829a3813dc3cdd188fd3d01dcf3268c16be2fdd2dd21d0665418816e46062868c604051611309929190918252602082015260400190565b60405180910390a45050600160075550939695505050505050565b6060600580548060200260200160405190810160405280929190818152602001828054801561138957602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161135e575b5050505050905090565b6000600754600114611401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f4c4f434b454400000000000000000000000000000000000000000000000000006044820152606401610626565b6002600755600080611415848601866129d8565b915091506000611427826000546122fd565b905060005b60055481101561169c5760006005828154811061144b5761144b612ed5565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16808352600890915260408220549092506effffffffffffffffffffffffffffff16908161149c57846114c8565b6114c8856effffffffffffffffffffffffffffff16836effffffffffffffffffffffffffffff16611fb8565b90506114e164e8d4a51000670de0b6b3a7640000612dc2565b816effffffffffffffffffffffffffffff16101561155b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f4d494e5f42414c414e43450000000000000000000000000000000000000000006044820152606401610626565b8181016effffffffffffffffffffffffffffff166115788461208d565b10156115e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4e4f545f524543454956454400000000000000000000000000000000000000006044820152606401610626565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526008602090815260409182902080547fffffffffffffffffffffffffffffffffff00000000000000000000000000000081166effffffffffffffffffffffffffffff918216880182161790915582519384528516908301529189169133917ff9403b28cc8805935e0ce6943ed646d5fde3d1e14f6b398e85bfa2851d1b85f7910160405180910390a3505050808061169490612e2a565b91505061142c565b506116a783836123ca565b506001600755949350505050565b60055460609081908067ffffffffffffffff8111156116d6576116d6612f04565b6040519080825280602002602001820160405280156116ff578160200160208202803683370190505b5092508067ffffffffffffffff81111561171b5761171b612f04565b604051908082528060200260200182016040528015611744578160200160208202803683370190505b50915060005b8181101561187f57600860006005838154811061176957611769612ed5565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205484516effffffffffffffffffffffffffffff909116908590839081106117c3576117c3612ed5565b60200260200101818152505060086000600583815481106117e6576117e6612ed5565b60009182526020808320919091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205483516f0100000000000000000000000000000090910470ffffffffffffffffffffffffffffffffff169084908390811061185557611855612ed5565b70ffffffffffffffffffffffffffffffffff9092166020928302919091019091015260010161174a565b50509091565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c14ad8026040518163ffffffff1660e01b815260040160206040518083038186803b1580156118eb57600080fd5b505afa1580156118ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119239190612b67565b600655565b6000808080808061193b87890189612ba4565b945094509450945094506119528585858585612003565b98975050505050505050565b3360009081526001602052604081208054839190839061197f908490612e13565b909155505073ffffffffffffffffffffffffffffffffffffffff8316600081815260016020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906109cc9086815260200190565b6000600754600114611a51576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f4c4f434b454400000000000000000000000000000000000000000000000000006044820152606401610626565b60026007556000808080611a678688018861294b565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260086020526040812080549154600454969a509498509296509094509092611b09926effffffffffffffffffffffffffffff83169270ffffffffffffffffffffffffffffffffff6f0100000000000000000000000000000090910481169216867f000000000000000000000000000000000000000000000000000000000000000061243a565b8154909650611b41906effffffffffffffffffffffffffffff16611b366003670de0b6b3a7640000612dc2565b6106b0906001612daa565b861115611baa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4d41585f4f55545f524154494f000000000000000000000000000000000000006044820152606401610626565b80546effffffffffffffffffffffffffffff808216889003167fffffffffffffffffffffffffffffffffff000000000000000000000000000000909116178155611bf43083612337565b611c0085878686612157565b6040805173ffffffffffffffffffffffffffffffffffffffff87811682526020820189905286169133917f3dd1df88dc92e2788892542d81f999d720a44b4c127065d45c128f4f59fdc373910160405180910390a3505060016007555091949350505050565b42841015611cd0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5045524d49545f444541444c494e455f455850495245440000000000000000006044820152606401610626565b6000611cda610eab565b73ffffffffffffffffffffffffffffffffffffffff8916600090815260036020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9928c928c928c92909190611d3583612e2a565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810187905260e00160405160208183030381529060405280519060200120604051602001611dd69291907f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015611e5f573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590611eda57508873ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611f40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f494e56414c49445f5045524d49545f5349474e415455524500000000000000006044820152606401610626565b73ffffffffffffffffffffffffffffffffffffffff81811660009081526002602090815260408083208c8516808552908352928190208b9055518a815291928c16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050505050505050565b600080611fc58385612dd6565b90506000611fdc6002670de0b6b3a7640000612dc2565b611fe69083612daa565b9050611ffa670de0b6b3a764000082612dc2565b95945050505050565b60008061201085846122fd565b90506000612048887f0000000000000000000000000000000000000000000000000000000000000000670de0b6b3a764000003611fb8565b9050600061205888838a016122fd565b9050600061206682856124e9565b9050670de0b6b3a764000081900361207e8882611fb8565b9b9a5050505050505050505050565b6040517ff7888aec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301523060248301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063f7888aec9060440160206040518083038186803b15801561211f57600080fd5b505afa158015612133573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d89190612b67565b8015612240576040517f97da6d3000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152306024830152838116604483015260006064830152608482018590527f000000000000000000000000000000000000000000000000000000000000000016906397da6d309060a4016040805180830381600087803b15801561220157600080fd5b505af1158015612215573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122399190612b80565b50506122f7565b6040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301523060248301528381166044830152606482018590527f0000000000000000000000000000000000000000000000000000000000000000169063f18d03cc90608401600060405180830381600087803b1580156122de57600080fd5b505af11580156122f2573d6000803e3d6000fd5b505050505b50505050565b600080612312670de0b6b3a764000085612dd6565b90506000612321600285612dc2565b61232b9083612daa565b9050611ffa8482612dc2565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600160205260408120805483929061236c908490612e13565b909155505060008054829003815560405182815273ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b806000808282546123db9190612daa565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000818152600160209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016123be565b60008061244787866122fd565b905060006124558588612e13565b9050600061246382896122fd565b905060006124828261247d670de0b6b3a7640000876122fd565b61260c565b90506000612490828d611fb8565b9050600061249e828e612e13565b90506000886124b588670de0b6b3a7640000612e13565b6124bf9190612dd6565b90506124d7826106b083670de0b6b3a7640000612e13565b9e9d5050505050505050505050505050565b60008260011115801561251a5750600161250c670de0b6b3a76400006002612dd6565b6125169190612e13565b8311155b612580576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f494e56414c49445f4241534500000000000000000000000000000000000000006044820152606401610626565b6000670de0b6b3a76400006125958185612dc2565b61259f9190612dd6565b905060006125ad8285612e13565b905060006125c78661247d670de0b6b3a764000086612dc2565b9050816125d2578093505b60006125f587846125f06402540be400670de0b6b3a7640000612dc2565b612682565b90506126018282611fb8565b979650505050505050565b6000612619600283612e63565b61262b57670de0b6b3a764000061262d565b825b905061263a600283612dc2565b91505b81156126615761264d8380612dd6565b925061265a600283612dc2565b915061263d565b61266c600283612e63565b156109d85761267b8382612dd6565b9392505050565b600082818061269987670de0b6b3a7640000612772565b670de0b6b3a76400009550909250905083600060015b8783106127655760006126ca670de0b6b3a764000083612dd6565b90506000806126ea896126e5670de0b6b3a764000086612e13565b612772565b915091506126fc866106b0848b611fb8565b955061270886846122fd565b95508561271757505050612765565b8615612721579315935b801561272b579315935b84156127425761273b868b612e13565b995061274f565b61274c868b612daa565b99505b505050808061275d90612e2a565b9150506126af565b5050505050509392505050565b6000808284106127885750508082036000612790565b505081810360015b9250929050565b803580151581146127a757600080fd5b919050565b6000602082840312156127be57600080fd5b813561267b81612f33565b600080600080600060a086880312156127e157600080fd5b85356127ec81612f33565b945060208601356127fc81612f33565b9350604086013561280c81612f33565b925061281a60608701612797565b949793965091946080013592915050565b60008060008060008060c0878903121561284457600080fd5b863561284f81612f33565b9550602087013561285f81612f33565b9450604087013561286f81612f33565b935061287d60608801612797565b92506080870135915060a087013567ffffffffffffffff808211156128a157600080fd5b818901915089601f8301126128b557600080fd5b8135818111156128c7576128c7612f04565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561290d5761290d612f04565b816040528281528c602084870101111561292657600080fd5b8260208601602083013760006020848301015280955050505050509295509295509295565b6000806000806080858703121561296157600080fd5b843561296c81612f33565b9350602085013561297c81612f33565b925061298a60408601612797565b9396929550929360600135925050565b6000806000606084860312156129af57600080fd5b83356129ba81612f33565b92506129c860208501612797565b9150604084013590509250925092565b600080604083850312156129eb57600080fd5b82356129f681612f33565b946020939093013593505050565b60008060408385031215612a1757600080fd5b8235612a2281612f33565b91506020830135612a3281612f33565b809150509250929050565b600080600060608486031215612a5257600080fd5b8335612a5d81612f33565b92506020840135612a6d81612f33565b929592945050506040919091013590565b600080600080600080600060e0888a031215612a9957600080fd5b8735612aa481612f33565b96506020880135612ab481612f33565b95506040880135945060608801359350608088013560ff81168114612ad857600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060208385031215612b0857600080fd5b823567ffffffffffffffff80821115612b2057600080fd5b818501915085601f830112612b3457600080fd5b813581811115612b4357600080fd5b866020828501011115612b5557600080fd5b60209290920196919550909350505050565b600060208284031215612b7957600080fd5b5051919050565b60008060408385031215612b9357600080fd5b505080516020909101519092909150565b600080600080600060a08688031215612bbc57600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b6000815180845260005b81811015612c0557602081850181015186830182015201612be9565b81811115612c17576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020808252825182820181905260009190848201906040850190845b81811015612c9857835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101612c66565b50909695505050505050565b602080825282518282018190526000919060409081850190868401855b82811015612cfc578151805173ffffffffffffffffffffffffffffffffffffffff168552860151868501529284019290850190600101612cc1565b5091979650505050505050565b604080825283519082018190526000906020906060840190828701845b82811015612d4257815184529284019290840190600101612d26565b5050508381038285015284518082528583019183019060005b81811015612d8a57835170ffffffffffffffffffffffffffffffffff1683529284019291840191600101612d5b565b5090979650505050505050565b60208152600061267b6020830184612bdf565b60008219821115612dbd57612dbd612e77565b500190565b600082612dd157612dd1612ea6565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612e0e57612e0e612e77565b500290565b600082821015612e2557612e25612e77565b500390565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612e5c57612e5c612e77565b5060010190565b600082612e7257612e72612ea6565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81168114612f5557600080fd5b5056fea26469706673582212205271e0253dde9e5e2708240f7032e3d543271dd7cc2ce12273d694543231414664736f6c63430008070033a2646970667358221220526af8b4caa6232b2683b9de603e458babe506bac818a111516c77dea570feaf64736f6c63430008070033",
  "devdoc": {
    "author": "Mudit Gupta",
    "kind": "dev",
    "methods": {},
    "version": 1
  },
  "userdoc": {
    "kind": "user",
    "methods": {},
    "notice": "Contract for deploying Trident exchange Index Pool with configurations.",
    "version": 1
  },
  "storageLayout": {
    "storage": [
      {
        "astId": 10180,
        "contract": "contracts/pool/IndexPoolFactory.sol:IndexPoolFactory",
        "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/IndexPoolFactory.sol:IndexPoolFactory",
        "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"
      }
    }
  }
}